Class: Cakewalk::Channel
- Defined in:
- lib/cakewalk/channel.rb
Overview
Instance Attribute Summary collapse
-
#bans ⇒ Array<Ban>
readonly
All active bans.
-
#invite_only ⇒ Boolean
(also: #invite_only?)
True if the channel is invite only (+i).
-
#key ⇒ String?
The channel’s key (aka password).
-
#limit ⇒ Integer
The maximum number of allowed users in the channel.
-
#moderated ⇒ Boolean
(also: #moderated?)
True if the channel is moderated.
-
#modes ⇒ Hash{String => Object}
readonly
This attribute describes all modes set in the channel.
-
#owners ⇒ Array<User>
readonly
All channel owners.
-
#secret ⇒ Boolean
(also: #secret?)
True if the channel is secret (+s).
-
#topic ⇒ String
The channel’s topic.
-
#users ⇒ Hash{User => Array<String}>
readonly
Users are represented by a Hash, mapping individual users to an array of modes (e.g. “o” for opped).
Attributes inherited from Target
Checks collapse
-
#half_opped?(user) ⇒ Boolean
True if
user
is half-opped in the channel. -
#has_user?(user) ⇒ Boolean
Check if a user is in the channel.
-
#opped?(user) ⇒ Boolean
True if
user
is opped in the channel. -
#voiced?(user) ⇒ Boolean
True if
user
is voiced in the channel.
User groups collapse
-
#admins ⇒ Array<User>
All admins in the channel.
-
#half_ops ⇒ Array<User>
All half-ops in the channel.
-
#ops ⇒ Array<User>
All ops in the channel.
-
#voiced ⇒ Array<User>
All voiced users in the channel.
Channel Manipulation collapse
-
#ban(target) ⇒ Mask
Bans someone from the channel.
-
#deop(user)
Deops a user.
-
#devoice(user)
Devoices a user.
-
#invite(user)
Invites a user to the channel.
-
#join(key = nil)
Joins the channel.
-
#kick(user, reason = nil)
Kicks a user from the channel.
-
#mode(s)
Sets or unsets modes.
-
#op(user)
Ops a user.
-
#part(message = nil)
Causes the bot to part from the channel.
-
#remove(user, reason = nil)
Removes a user from the channel.
-
#unban(target) ⇒ Mask
Unbans someone from the channel.
-
#voice(user)
Voices a user.
Instance Method Summary collapse
-
#add_user(user, modes = []) ⇒ User
private
The added user.
-
#clear_users
private
Removes all users.
-
#hash ⇒ Fixnum
-
#initialize(name, bot) ⇒ Channel
constructor
A new instance of Channel.
-
#inspect ⇒ String
-
#remove_user(user) ⇒ User?
private
The removed user.
-
#send(text, notice = false) ⇒ Object
(also: #msg, #privmsg)
-
#sync_modes
private
-
#to_s ⇒ String
(also: #to_str)
Methods included from Helpers
#Channel, #Format, #Sanitize, #Target, #Timer, #Unformat, #User, #debug, #error, #exception, #fatal, #incoming, #info, #log, #outgoing, #rescue_exception, sanitize, #warn
Methods included from Syncable
#attr, #attribute_synced?, #mark_as_synced, #sync, #unsync, #unsync_all, #wait_until_synced
Methods inherited from Target
#<=>, #action, #concretize, #ctcp, #eql?, #notice, #safe_action, #safe_notice, #safe_privmsg, #safe_send
Constructor Details
#initialize(name, bot) ⇒ Channel
Generally, you shouldn’t initialize new instances of this class. Use Cakewalk::ChannelList#find_ensured instead.
Returns a new instance of Channel.
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
# File 'lib/cakewalk/channel.rb', line 49 def initialize(name, bot) @bot = bot @name = name @users = Hash.new {|h, k| h[k] = []} @bans = [] @owners = [] @modes = {} # TODO raise if not a channel @topic = nil @in_channel = false @synced_attributes = Set.new @when_requesting_synced_attribute = lambda {|attr| if @in_channel && attr == :topic && !attribute_synced?(:topic) # Even if we are in the channel, if there's no topic set, # the attribute won't be synchronised yet. Explicitly # request the topic. @bot.irc.send "TOPIC #@name" next end unless @in_channel unsync(attr) case attr when :users @bot.irc.send "NAMES #@name" when :topic @bot.irc.send "TOPIC #@name" when :bans @bot.irc.send "MODE #@name +b" when :owners if @bot.irc.network.owner_list_mode @bot.irc.send "MODE #@name +#{@bot.irc.network.owner_list_mode}" else # the current IRCd does not support channel owners, so # just mark the empty array as synced mark_as_synced(:owners) end when :modes @bot.irc.send "MODE #@name" end end } end |
Instance Attribute Details
#bans ⇒ Array<Ban> (readonly)
Returns all active bans.
30 31 32 |
# File 'lib/cakewalk/channel.rb', line 30 def bans @bans end |
#invite_only ⇒ Boolean Also known as: invite_only?
Returns true if the channel is invite only (+i).
13 14 15 |
# File 'lib/cakewalk/channel.rb', line 13 def invite_only @invite_only end |
#key ⇒ String?
Returns The channel’s key (aka password).
13 14 15 |
# File 'lib/cakewalk/channel.rb', line 13 def key @key end |
#limit ⇒ Integer
Returns The maximum number of allowed users in the channel. 0 if unlimited.
13 14 15 |
# File 'lib/cakewalk/channel.rb', line 13 def limit @limit end |
#moderated ⇒ Boolean Also known as: moderated?
Returns true if the channel is moderated.
13 14 15 |
# File 'lib/cakewalk/channel.rb', line 13 def moderated @moderated end |
#modes ⇒ Hash{String => Object} (readonly)
This attribute describes all modes set in the channel. They’re represented as a Hash, mapping the mode (e.g. “i”, “k”, …) to either a value in the case of modes that take an option (e.g. “k” for the channel key) or true.
44 45 46 |
# File 'lib/cakewalk/channel.rb', line 44 def modes @modes end |
#owners ⇒ Array<User> (readonly)
Only some networks implement this
Returns all channel owners.
35 36 37 |
# File 'lib/cakewalk/channel.rb', line 35 def owners @owners end |
#secret ⇒ Boolean Also known as: secret?
Returns true if the channel is secret (+s).
13 14 15 |
# File 'lib/cakewalk/channel.rb', line 13 def secret @secret end |
#topic ⇒ String
Returns the channel’s topic.
26 27 28 |
# File 'lib/cakewalk/channel.rb', line 26 def topic @topic end |
Instance Method Details
#add_user(user, modes = []) ⇒ User
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns The added user.
388 389 390 391 392 |
# File 'lib/cakewalk/channel.rb', line 388 def add_user(user, modes = []) @in_channel = true if user == @bot @users[user] = modes user end |
#admins ⇒ Array<User>
Returns All admins in the channel.
148 149 150 |
# File 'lib/cakewalk/channel.rb', line 148 def admins @users.select {|user, modes| modes.include?("a")}.keys end |
#ban(target) ⇒ Mask
Bans someone from the channel.
251 252 253 254 255 256 |
# File 'lib/cakewalk/channel.rb', line 251 def ban(target) mask = Mask.from(target) @bot.irc.send "MODE #@name +b #{mask}" mask end |
#clear_users
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
This method returns an undefined value.
Removes all users
405 406 407 |
# File 'lib/cakewalk/channel.rb', line 405 def clear_users @users.clear end |
#deop(user)
This method returns an undefined value.
Deops a user.
282 283 284 |
# File 'lib/cakewalk/channel.rb', line 282 def deop(user) @bot.irc.send "MODE #@name -o #{user}" end |
#devoice(user)
This method returns an undefined value.
Devoices a user.
298 299 300 |
# File 'lib/cakewalk/channel.rb', line 298 def devoice(user) @bot.irc.send "MODE #@name -v #{user}" end |
#half_opped?(user) ⇒ Boolean
Returns true if user
is half-opped in the channel.
115 116 117 |
# File 'lib/cakewalk/channel.rb', line 115 def half_opped?(user) @users[User(user)].include? "h" end |
#half_ops ⇒ Array<User>
Returns All half-ops in the channel.
136 137 138 |
# File 'lib/cakewalk/channel.rb', line 136 def half_ops @users.select {|user, modes| modes.include?("h")}.keys end |
#has_user?(user) ⇒ Boolean
Returns Check if a user is in the channel.
103 104 105 |
# File 'lib/cakewalk/channel.rb', line 103 def has_user?(user) @users.has_key?(User(user)) end |
#hash ⇒ Fixnum
439 440 441 |
# File 'lib/cakewalk/channel.rb', line 439 def hash @name.hash end |
#inspect ⇒ String
459 460 461 |
# File 'lib/cakewalk/channel.rb', line 459 def inspect "#<Channel name=#{@name.inspect}>" end |
#invite(user)
This method returns an undefined value.
Invites a user to the channel.
306 307 308 |
# File 'lib/cakewalk/channel.rb', line 306 def invite(user) @bot.irc.send("INVITE #{user} #@name") end |
#join(key = nil)
This method returns an undefined value.
Joins the channel
377 378 379 380 381 382 |
# File 'lib/cakewalk/channel.rb', line 377 def join(key = nil) if key.nil? and self.key != true key = self.key end @bot.irc.send "JOIN #{[@name, key].compact.join(" ")}" end |
#kick(user, reason = nil)
This method returns an undefined value.
Kicks a user from the channel.
330 331 332 333 334 335 336 |
# File 'lib/cakewalk/channel.rb', line 330 def kick(user, reason = nil) if reason.to_s.size > @bot.irc.isupport["KICKLEN"] && @bot.strict? raise Exceptions::KickReasonTooLong, reason end @bot.irc.send("KICK #@name #{user} :#{reason}") end |
#mode(s)
This method returns an undefined value.
Sets or unsets modes. Most of the time you won’t need this but use setter methods like #invite_only=.
360 361 362 |
# File 'lib/cakewalk/channel.rb', line 360 def mode(s) @bot.irc.send "MODE #@name #{s}" end |
#op(user)
This method returns an undefined value.
Ops a user.
274 275 276 |
# File 'lib/cakewalk/channel.rb', line 274 def op(user) @bot.irc.send "MODE #@name +o #{user}" end |
#opped?(user) ⇒ Boolean
Returns true if user
is opped in the channel.
109 110 111 |
# File 'lib/cakewalk/channel.rb', line 109 def opped?(user) @users[User(user)].include? "o" end |
#ops ⇒ Array<User>
Returns All ops in the channel.
130 131 132 |
# File 'lib/cakewalk/channel.rb', line 130 def ops @users.select {|user, modes| modes.include?("o")}.keys end |
#part(message = nil)
This method returns an undefined value.
Causes the bot to part from the channel.
368 369 370 |
# File 'lib/cakewalk/channel.rb', line 368 def part( = nil) @bot.irc.send "PART #@name :#{}" end |
#remove(user, reason = nil)
This method returns an undefined value.
Removes a user from the channel.
This uses the REMOVE command, which is a non-standardized extension. Unlike a kick, it makes a user part. This prevents auto-rejoin scripts from firing and might also be perceived as less aggressive by some. Not all IRC networks support this command.
349 350 351 |
# File 'lib/cakewalk/channel.rb', line 349 def remove(user, reason = nil) @bot.irc.send("REMOVE #@name #{user} :#{reason}") end |
#remove_user(user) ⇒ User?
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns The removed user.
396 397 398 399 |
# File 'lib/cakewalk/channel.rb', line 396 def remove_user(user) @in_channel = false if user == @bot @users.delete(user) end |
#send(text, notice = false) ⇒ Object Also known as: msg, privmsg
The aliases msg
and privmsg
are deprecated and will be
removed in a future version.
411 412 413 414 415 416 417 418 419 420 |
# File 'lib/cakewalk/channel.rb', line 411 def send(text, notice = false) # TODO deprecate 'notice' argument text = text.to_s if @modes["c"] # Remove all formatting and colors if the channel doesn't # allow colors. text = Cakewalk::Formatting.unformat(text) end super(text, notice) end |
#sync_modes
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
This method returns an undefined value.
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 |
# File 'lib/cakewalk/channel.rb', line 224 def sync_modes unsync :users unsync :bans unsync :modes unsync :owners if @bot.irc.isupport["WHOX"] @bot.irc.send "WHO #@name %acfhnru" else @bot.irc.send "WHO #@name" end @bot.irc.send "MODE #@name +b" # bans @bot.irc.send "MODE #@name" if @bot.irc.network.owner_list_mode @bot.irc.send "MODE #@name +#{@bot.irc.network.owner_list_mode}" else mark_as_synced :owners end end |
#to_s ⇒ String Also known as: to_str
The alias to_str
is deprecated and will be removed in a
future version. Channel objects should not be treated like
strings.
447 448 449 |
# File 'lib/cakewalk/channel.rb', line 447 def to_s @name end |
#unban(target) ⇒ Mask
Unbans someone from the channel.
263 264 265 266 267 268 |
# File 'lib/cakewalk/channel.rb', line 263 def unban(target) mask = Mask.from(target) @bot.irc.send "MODE #@name -b #{mask}" mask end |
#voice(user)
This method returns an undefined value.
Voices a user.
290 291 292 |
# File 'lib/cakewalk/channel.rb', line 290 def voice(user) @bot.irc.send "MODE #@name +v #{user}" end |
#voiced ⇒ Array<User>
Returns All voiced users in the channel.
142 143 144 |
# File 'lib/cakewalk/channel.rb', line 142 def voiced @users.select {|user, modes| modes.include?("v")}.keys end |
#voiced?(user) ⇒ Boolean
Returns true if user
is voiced in the channel.
121 122 123 |
# File 'lib/cakewalk/channel.rb', line 121 def voiced?(user) @users[User(user)].include? "v" end |