Class: Cinch::Channel

Inherits:
Target
  • Object
show all
Includes:
Helpers, Syncable
Defined in:
lib/cinch/channel.rb

Overview

Version:

  • 2.0.0

Instance Attribute Summary collapse

Attributes inherited from Target

#bot, #name

Checks collapse

User groups collapse

Channel Manipulation collapse

Instance Method Summary collapse

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

Note:

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

#bansArray<Ban> (readonly)



31
32
33
# File 'lib/cinch/channel.rb', line 31

def bans
  @bans
end

#invite_onlyBoolean Also known as: invite_only?



14
15
16
# File 'lib/cinch/channel.rb', line 14

def invite_only
  @invite_only
end

#keyString?



14
15
16
# File 'lib/cinch/channel.rb', line 14

def key
  @key
end

#limitInteger



14
15
16
# File 'lib/cinch/channel.rb', line 14

def limit
  @limit
end

#moderatedBoolean Also known as: moderated?



14
15
16
# File 'lib/cinch/channel.rb', line 14

def moderated
  @moderated
end

#modesHash{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

#ownersArray<User> (readonly)

Note:

Only some networks implement this

Returns all channel owners.



36
37
38
# File 'lib/cinch/channel.rb', line 36

def owners
  @owners
end

#secretBoolean Also known as: secret?



14
15
16
# File 'lib/cinch/channel.rb', line 14

def secret
  @secret
end

#topicString



27
28
29
# File 'lib/cinch/channel.rb', line 27

def topic
  @topic
end

#usersHash{User => Array<String}> (readonly)

Users are represented by a Hash, mapping individual users to an array of modes (e.g. “o” for opped).

Version:

  • 1.1.0



23
24
25
# File 'lib/cinch/channel.rb', line 23

def users
  @users
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

#adminsArray<User>

Returns All admins in the channel.

Since:

  • 2.0.0



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.

Since:

  • 1.1.0



116
117
118
# File 'lib/cinch/channel.rb', line 116

def half_opped?(user)
  @users[User(user)].include? "h"
end

#half_opsArray<User>

Returns All half-ops in the channel.

Since:

  • 2.0.0



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.

Since:

  • 1.1.0

Version:

  • 1.1.2



104
105
106
# File 'lib/cinch/channel.rb', line 104

def has_user?(user)
  @users.key?(User(user))
end

#hashFixnum



438
439
440
# File 'lib/cinch/channel.rb', line 438

def hash
  @name.hash
end

#inspectString



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=.

Examples:

channel.mode "+n"


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.

Since:

  • 1.1.0



110
111
112
# File 'lib/cinch/channel.rb', line 110

def opped?(user)
  @users[User(user)].include? "o"
end

#opsArray<User>

Returns All ops in the channel.

Since:

  • 2.0.0



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(message = 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

Note:

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_sString Also known as: to_str

Note:

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

#voicedArray<User>

Returns All voiced users in the channel.

Since:

  • 2.0.0



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.

Since:

  • 1.1.0



122
123
124
# File 'lib/cinch/channel.rb', line 122

def voiced?(user)
  @users[User(user)].include? "v"
end