Class: Cinch::Channel
- Defined in:
- lib/cinch/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 Cinch::ChannelList#find_ensured instead.
Returns a new instance of Channel.
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 96 |
# File 'lib/cinch/channel.rb', line 50 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)
31 32 33 |
# File 'lib/cinch/channel.rb', line 31 def bans @bans end |
#invite_only ⇒ Boolean Also known as: invite_only?
14 15 16 |
# File 'lib/cinch/channel.rb', line 14 def invite_only @invite_only end |
#key ⇒ String?
14 15 16 |
# File 'lib/cinch/channel.rb', line 14 def key @key end |
#limit ⇒ Integer
14 15 16 |
# File 'lib/cinch/channel.rb', line 14 def limit @limit end |
#moderated ⇒ Boolean Also known as: moderated?
14 15 16 |
# File 'lib/cinch/channel.rb', line 14 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.
45 46 47 |
# File 'lib/cinch/channel.rb', line 45 def modes @modes end |
#owners ⇒ Array<User> (readonly)
Only some networks implement this
Returns all channel owners.
36 37 38 |
# File 'lib/cinch/channel.rb', line 36 def owners @owners end |
#secret ⇒ Boolean Also known as: secret?
14 15 16 |
# File 'lib/cinch/channel.rb', line 14 def secret @secret end |
#topic ⇒ String
27 28 29 |
# File 'lib/cinch/channel.rb', line 27 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.
387 388 389 390 391 |
# File 'lib/cinch/channel.rb', line 387 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.
149 150 151 |
# File 'lib/cinch/channel.rb', line 149 def admins @users.select { |_user, modes| modes.include?("a") }.keys end |
#ban(target) ⇒ Mask
Bans someone from the channel.
252 253 254 255 256 257 |
# File 'lib/cinch/channel.rb', line 252 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
404 405 406 |
# File 'lib/cinch/channel.rb', line 404 def clear_users @users.clear end |
#deop(user)
This method returns an undefined value.
Deops a user.
283 284 285 |
# File 'lib/cinch/channel.rb', line 283 def deop(user) @bot.irc.send "MODE #{@name} -o #{user}" end |
#devoice(user)
This method returns an undefined value.
Devoices a user.
299 300 301 |
# File 'lib/cinch/channel.rb', line 299 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.
116 117 118 |
# File 'lib/cinch/channel.rb', line 116 def half_opped?(user) @users[User(user)].include? "h" end |
#half_ops ⇒ Array<User>
Returns All half-ops in the channel.
137 138 139 |
# File 'lib/cinch/channel.rb', line 137 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.
104 105 106 |
# File 'lib/cinch/channel.rb', line 104 def has_user?(user) @users.key?(User(user)) end |
#hash ⇒ Fixnum
438 439 440 |
# File 'lib/cinch/channel.rb', line 438 def hash @name.hash end |
#inspect ⇒ String
458 459 460 |
# File 'lib/cinch/channel.rb', line 458 def inspect "#<Channel name=#{@name.inspect}>" end |
#invite(user)
This method returns an undefined value.
Invites a user to the channel.
307 308 309 |
# File 'lib/cinch/channel.rb', line 307 def invite(user) @bot.irc.send("INVITE #{user} #{@name}") end |
#join(key = nil)
This method returns an undefined value.
Joins the channel
378 379 380 381 |
# File 'lib/cinch/channel.rb', line 378 def join(key = nil) key = self.key if key.nil? && (self.key != true) @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.
331 332 333 334 335 336 337 |
# File 'lib/cinch/channel.rb', line 331 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=.
361 362 363 |
# File 'lib/cinch/channel.rb', line 361 def mode(s) @bot.irc.send "MODE #{@name} #{s}" end |
#op(user)
This method returns an undefined value.
Ops a user.
275 276 277 |
# File 'lib/cinch/channel.rb', line 275 def op(user) @bot.irc.send "MODE #{@name} +o #{user}" end |
#opped?(user) ⇒ Boolean
Returns true if user
is opped in the channel.
110 111 112 |
# File 'lib/cinch/channel.rb', line 110 def opped?(user) @users[User(user)].include? "o" end |
#ops ⇒ Array<User>
Returns All ops in the channel.
131 132 133 |
# File 'lib/cinch/channel.rb', line 131 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.
369 370 371 |
# File 'lib/cinch/channel.rb', line 369 def part( = nil) @bot.irc.send "PART #{@name} :#{message}" 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.
350 351 352 |
# File 'lib/cinch/channel.rb', line 350 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.
395 396 397 398 |
# File 'lib/cinch/channel.rb', line 395 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.
410 411 412 413 414 415 416 417 418 419 |
# File 'lib/cinch/channel.rb', line 410 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 = Cinch::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.
225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 |
# File 'lib/cinch/channel.rb', line 225 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.
446 447 448 |
# File 'lib/cinch/channel.rb', line 446 def to_s @name end |
#unban(target) ⇒ Mask
Unbans someone from the channel.
264 265 266 267 268 269 |
# File 'lib/cinch/channel.rb', line 264 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.
291 292 293 |
# File 'lib/cinch/channel.rb', line 291 def voice(user) @bot.irc.send "MODE #{@name} +v #{user}" end |
#voiced ⇒ Array<User>
Returns All voiced users in the channel.
143 144 145 |
# File 'lib/cinch/channel.rb', line 143 def voiced @users.select { |_user, modes| modes.include?("v") }.keys end |
#voiced?(user) ⇒ Boolean
Returns true if user
is voiced in the channel.
122 123 124 |
# File 'lib/cinch/channel.rb', line 122 def voiced?(user) @users[User(user)].include? "v" end |