cinch 1.1.3 → 2.0.0.pre.1
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +1 -0
- data/README.md +3 -3
- data/docs/bot_options.md +435 -0
- data/docs/changes.md +440 -0
- data/docs/common_mistakes.md +35 -0
- data/docs/common_tasks.md +47 -0
- data/docs/encodings.md +67 -0
- data/docs/events.md +272 -0
- data/docs/logging.md +5 -0
- data/docs/migrating.md +267 -0
- data/docs/readme.md +18 -0
- data/examples/plugins/custom_prefix.rb +1 -1
- data/examples/plugins/dice_roll.rb +38 -0
- data/examples/plugins/lambdas.rb +1 -1
- data/examples/plugins/memo.rb +16 -10
- data/examples/plugins/url_shorten.rb +1 -0
- data/lib/cinch.rb +5 -60
- data/lib/cinch/ban.rb +13 -7
- data/lib/cinch/bot.rb +228 -403
- data/lib/cinch/{cache_manager.rb → cached_list.rb} +5 -1
- data/lib/cinch/callback.rb +3 -0
- data/lib/cinch/channel.rb +119 -195
- data/lib/cinch/{channel_manager.rb → channel_list.rb} +6 -3
- data/lib/cinch/configuration.rb +73 -0
- data/lib/cinch/configuration/bot.rb +47 -0
- data/lib/cinch/configuration/dcc.rb +16 -0
- data/lib/cinch/configuration/plugins.rb +41 -0
- data/lib/cinch/configuration/sasl.rb +17 -0
- data/lib/cinch/configuration/ssl.rb +19 -0
- data/lib/cinch/configuration/storage.rb +37 -0
- data/lib/cinch/configuration/timeouts.rb +14 -0
- data/lib/cinch/constants.rb +531 -369
- data/lib/cinch/dcc.rb +12 -0
- data/lib/cinch/dcc/dccable_object.rb +37 -0
- data/lib/cinch/dcc/incoming.rb +1 -0
- data/lib/cinch/dcc/incoming/send.rb +131 -0
- data/lib/cinch/dcc/outgoing.rb +1 -0
- data/lib/cinch/dcc/outgoing/send.rb +115 -0
- data/lib/cinch/exceptions.rb +8 -1
- data/lib/cinch/formatting.rb +106 -0
- data/lib/cinch/handler.rb +104 -0
- data/lib/cinch/handler_list.rb +86 -0
- data/lib/cinch/helpers.rb +167 -10
- data/lib/cinch/irc.rb +525 -110
- data/lib/cinch/isupport.rb +11 -9
- data/lib/cinch/logger.rb +168 -0
- data/lib/cinch/logger/formatted_logger.rb +72 -55
- data/lib/cinch/logger/zcbot_logger.rb +9 -24
- data/lib/cinch/logger_list.rb +62 -0
- data/lib/cinch/mask.rb +19 -10
- data/lib/cinch/message.rb +94 -28
- data/lib/cinch/message_queue.rb +70 -28
- data/lib/cinch/mode_parser.rb +6 -1
- data/lib/cinch/network.rb +104 -0
- data/lib/cinch/{rubyext/queue.rb → open_ended_queue.rb} +8 -1
- data/lib/cinch/pattern.rb +24 -4
- data/lib/cinch/plugin.rb +352 -177
- data/lib/cinch/plugin_list.rb +35 -0
- data/lib/cinch/rubyext/float.rb +3 -0
- data/lib/cinch/rubyext/module.rb +7 -0
- data/lib/cinch/rubyext/string.rb +9 -0
- data/lib/cinch/sasl.rb +34 -0
- data/lib/cinch/sasl/dh_blowfish.rb +71 -0
- data/lib/cinch/sasl/diffie_hellman.rb +47 -0
- data/lib/cinch/sasl/mechanism.rb +6 -0
- data/lib/cinch/sasl/plain.rb +26 -0
- data/lib/cinch/storage.rb +62 -0
- data/lib/cinch/storage/null.rb +12 -0
- data/lib/cinch/storage/yaml.rb +96 -0
- data/lib/cinch/syncable.rb +13 -1
- data/lib/cinch/target.rb +144 -0
- data/lib/cinch/timer.rb +145 -0
- data/lib/cinch/user.rb +169 -225
- data/lib/cinch/{user_manager.rb → user_list.rb} +7 -2
- data/lib/cinch/utilities/deprecation.rb +12 -0
- data/lib/cinch/utilities/encoding.rb +54 -0
- data/lib/cinch/utilities/kernel.rb +13 -0
- data/lib/cinch/utilities/string.rb +13 -0
- data/lib/cinch/version.rb +4 -0
- metadata +88 -47
- data/lib/cinch/logger/logger.rb +0 -44
- data/lib/cinch/logger/null_logger.rb +0 -18
- data/lib/cinch/rubyext/infinity.rb +0 -1
data/lib/cinch/callback.rb
CHANGED
data/lib/cinch/channel.rb
CHANGED
@@ -1,62 +1,24 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
require "set"
|
3
|
+
require "cinch/target"
|
3
4
|
|
4
5
|
module Cinch
|
5
|
-
|
6
|
+
# @attr limit
|
7
|
+
# @attr secret
|
8
|
+
# @attr moderated
|
9
|
+
# @attr invite_only
|
10
|
+
# @attr key
|
11
|
+
#
|
12
|
+
# @version 2.0.0
|
13
|
+
class Channel < Target
|
6
14
|
include Syncable
|
7
|
-
|
8
|
-
|
9
|
-
class << self
|
10
|
-
# Finds or creates a channel.
|
11
|
-
#
|
12
|
-
# @param [String] name name of a channel
|
13
|
-
# @param [Bot] bot a bot
|
14
|
-
# @return [Channel]
|
15
|
-
# @see Bot#Channel
|
16
|
-
# @deprecated See {Bot#channel_manager} and {ChannelManager#find_ensured} instead
|
17
|
-
# @note This method does not work properly if running more than one bot
|
18
|
-
# @note This method will be removed in Cinch 2.0.0
|
19
|
-
def find_ensured(name, bot)
|
20
|
-
$stderr.puts "Deprecation warning: Beginning with version 1.1.0, Channel.find_ensured should not be used anymore."
|
21
|
-
puts caller
|
22
|
-
|
23
|
-
downcased_name = name.irc_downcase(bot.irc.isupport["CASEMAPPING"])
|
24
|
-
@channels[downcased_name] ||= bot.channel_manager.find_ensured(name)
|
25
|
-
end
|
26
|
-
|
27
|
-
# Finds a channel.
|
28
|
-
#
|
29
|
-
# @param [String] name name of a channel
|
30
|
-
# @return [Channel, nil]
|
31
|
-
# @deprecated See {Bot#channel_manager} and {ChannelManager#find} instead
|
32
|
-
# @note This method does not work properly if running more than one bot
|
33
|
-
# @note This method will be removed in Cinch 2.0.0
|
34
|
-
def find(name)
|
35
|
-
$stderr.puts "Deprecation warning: Beginning with version 1.1.0, Channel.find should not be used anymore."
|
36
|
-
puts caller
|
37
|
-
|
38
|
-
@channels[name]
|
39
|
-
end
|
40
|
-
|
41
|
-
# @return [Array<Channel>] Returns all channels
|
42
|
-
# @deprecated See {Bot#channel_manager} and {CacheManager#each} instead
|
43
|
-
# @note This method does not work properly if running more than one bot
|
44
|
-
# @note This method will be removed in Cinch 2.0.0
|
45
|
-
def all
|
46
|
-
$stderr.puts "Deprecation warning: Beginning with version 1.1.0, User.all should not be used anymore."
|
47
|
-
puts caller
|
48
|
-
|
49
|
-
@channels.values
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
# @return [Bot]
|
54
|
-
attr_reader :bot
|
55
|
-
|
56
|
-
# @return [String] the channel's name
|
57
|
-
attr_reader :name
|
15
|
+
include Helpers
|
58
16
|
|
59
|
-
#
|
17
|
+
# Users are represented by a Hash, mapping individual users to an
|
18
|
+
# array of modes (e.g. "o" for opped).
|
19
|
+
#
|
20
|
+
# @return [Hash<User => Array<String>>] all users in the channel
|
21
|
+
# @version 1.1.0
|
60
22
|
attr_reader :users
|
61
23
|
synced_attr_reader :users
|
62
24
|
|
@@ -68,6 +30,16 @@ module Cinch
|
|
68
30
|
attr_reader :bans
|
69
31
|
synced_attr_reader :bans
|
70
32
|
|
33
|
+
# @return [Array<User>] all channel owners
|
34
|
+
# @note Only some networks implement this
|
35
|
+
attr_reader :owners
|
36
|
+
synced_attr_reader :owners
|
37
|
+
|
38
|
+
# This attribute describes all modes set in the channel. They're
|
39
|
+
# represented as a Hash, mapping the mode (e.g. "i", "k", …) to
|
40
|
+
# either a value in the case of modes that take an option (e.g.
|
41
|
+
# "k" for the channel key) or true.
|
42
|
+
#
|
71
43
|
# @return [Hash<String => Object>]
|
72
44
|
attr_reader :modes
|
73
45
|
synced_attr_reader :modes
|
@@ -76,6 +48,7 @@ module Cinch
|
|
76
48
|
@name = name
|
77
49
|
@users = Hash.new {|h,k| h[k] = []}
|
78
50
|
@bans = []
|
51
|
+
@owners = []
|
79
52
|
|
80
53
|
@modes = {}
|
81
54
|
# TODO raise if not a channel
|
@@ -90,13 +63,21 @@ module Cinch
|
|
90
63
|
unsync(attr)
|
91
64
|
case attr
|
92
65
|
when :users
|
93
|
-
@bot.
|
66
|
+
@bot.irc.send "NAMES #@name"
|
94
67
|
when :topic
|
95
|
-
@bot.
|
68
|
+
@bot.irc.send "TOPIC #@name"
|
96
69
|
when :bans
|
97
|
-
@bot.
|
70
|
+
@bot.irc.send "MODE #@name +b"
|
71
|
+
when :owners
|
72
|
+
if @bot.irc.network.owner_list_mode
|
73
|
+
@bot.irc.send "MODE #@name +#{@bot.irc.network.owner_list_mode}"
|
74
|
+
else
|
75
|
+
# the current IRCd does not support channel owners, so
|
76
|
+
# just mark the empty array as synced
|
77
|
+
mark_as_synced(:owners)
|
78
|
+
end
|
98
79
|
when :modes
|
99
|
-
@bot.
|
80
|
+
@bot.irc.send "MODE #@name"
|
100
81
|
end
|
101
82
|
end
|
102
83
|
}
|
@@ -106,37 +87,60 @@ module Cinch
|
|
106
87
|
|
107
88
|
# @param [User, String] user An {User}-object or a nickname
|
108
89
|
# @return [Boolean] Check if a user is in the channel
|
90
|
+
# @since 1.1.0
|
91
|
+
# @version 1.1.2
|
109
92
|
def has_user?(user)
|
110
|
-
|
111
|
-
@users.has_key?(user)
|
93
|
+
@users.has_key?(User(user))
|
112
94
|
end
|
113
95
|
|
114
|
-
|
115
96
|
# @return [Boolean] true if `user` is opped in the channel
|
97
|
+
# @since 1.1.0
|
116
98
|
def opped?(user)
|
117
|
-
|
118
|
-
@users[user].include? "o"
|
99
|
+
@users[User(user)].include? "o"
|
119
100
|
end
|
120
101
|
|
121
102
|
# @return [Boolean] true if `user` is half-opped in the channel
|
103
|
+
# @since 1.1.0
|
122
104
|
def half_opped?(user)
|
123
|
-
|
124
|
-
@users[user].include? "h"
|
105
|
+
@users[User(user)].include? "h"
|
125
106
|
end
|
126
107
|
|
127
108
|
# @return [Boolean] true if `user` is voiced in the channel
|
109
|
+
# @since 1.1.0
|
128
110
|
def voiced?(user)
|
129
|
-
|
130
|
-
|
111
|
+
@users[User(user)].include? "v"
|
112
|
+
end
|
113
|
+
|
114
|
+
# @endgroup
|
115
|
+
|
116
|
+
# @group User groups
|
117
|
+
# @return [Array<User>] All ops in the channel
|
118
|
+
# @since 2.0.0
|
119
|
+
def ops
|
120
|
+
@users.select {|user, modes| modes.include?("o")}.keys
|
131
121
|
end
|
132
122
|
|
123
|
+
# @return [Array<User>] All half-ops in the channel
|
124
|
+
# @since 2.0.0
|
125
|
+
def half_ops
|
126
|
+
@users.select {|user, modes| modes.include?("h")}.keys
|
127
|
+
end
|
128
|
+
|
129
|
+
# @return [Array<User>] All voiced users in the channel
|
130
|
+
# @since 2.0.0
|
131
|
+
def voiced
|
132
|
+
@users.select {|user, modes| modes.include?("v")}.keys
|
133
|
+
end
|
134
|
+
|
135
|
+
# @return [Array<User>] All admins in the channel
|
136
|
+
# @since 2.0.0
|
137
|
+
def admins
|
138
|
+
@users.select {|user, modes| modes.include?("a")}.keys
|
139
|
+
end
|
133
140
|
# @endgroup
|
134
141
|
|
135
142
|
# @return [Number] The maximum number of allowed users in the
|
136
143
|
# channel. 0 if unlimited.
|
137
|
-
attr_accessor :limit
|
138
|
-
undef_method "limit"
|
139
|
-
undef_method "limit="
|
140
144
|
def limit
|
141
145
|
@modes["l"].to_i
|
142
146
|
end
|
@@ -150,9 +154,6 @@ module Cinch
|
|
150
154
|
end
|
151
155
|
|
152
156
|
# @return [Boolean] true if the channel is secret (+s)
|
153
|
-
attr_accessor :secret
|
154
|
-
undef_method "secret"
|
155
|
-
undef_method "secret="
|
156
157
|
def secret
|
157
158
|
@modes["s"]
|
158
159
|
end
|
@@ -166,17 +167,13 @@ module Cinch
|
|
166
167
|
end
|
167
168
|
end
|
168
169
|
|
169
|
-
# @return [Boolean] true if the channel is moderated
|
170
|
-
# with +o and +v are able to send messages)
|
171
|
-
attr_accessor :moderated
|
172
|
-
undef_method "moderated"
|
173
|
-
undef_method "moderated="
|
170
|
+
# @return [Boolean] true if the channel is moderated
|
174
171
|
def moderated
|
175
172
|
@modes["m"]
|
176
173
|
end
|
177
174
|
alias_method :moderated?, :moderated
|
178
175
|
|
179
|
-
def moderated=(
|
176
|
+
def moderated=(bool)
|
180
177
|
if bool
|
181
178
|
mode "+m"
|
182
179
|
else
|
@@ -185,9 +182,6 @@ module Cinch
|
|
185
182
|
end
|
186
183
|
|
187
184
|
# @return [Boolean] true if the channel is invite only (+i)
|
188
|
-
attr_accessor :invite_only
|
189
|
-
undef_method "invite_only"
|
190
|
-
undef_method "invite_only="
|
191
185
|
def invite_only
|
192
186
|
@modes["i"]
|
193
187
|
end
|
@@ -202,9 +196,6 @@ module Cinch
|
|
202
196
|
end
|
203
197
|
|
204
198
|
# @return [String, nil] The channel's key (aka password)
|
205
|
-
attr_accessor :key
|
206
|
-
undef_method "key"
|
207
|
-
undef_method "key="
|
208
199
|
def key
|
209
200
|
@modes["k"]
|
210
201
|
end
|
@@ -219,61 +210,82 @@ module Cinch
|
|
219
210
|
|
220
211
|
# @api private
|
221
212
|
# @return [void]
|
222
|
-
def sync_modes
|
213
|
+
def sync_modes
|
223
214
|
unsync :users
|
224
215
|
unsync :bans
|
225
216
|
unsync :modes
|
226
|
-
|
227
|
-
|
228
|
-
@bot.
|
217
|
+
unsync :owners
|
218
|
+
|
219
|
+
if @bot.irc.isupport["WHOX"]
|
220
|
+
@bot.irc.send "WHO #@name %acfhnru"
|
221
|
+
else
|
222
|
+
@bot.irc.send "WHO #@name"
|
223
|
+
end
|
224
|
+
@bot.irc.send "MODE #@name +b" # bans
|
225
|
+
@bot.irc.send "MODE #@name"
|
226
|
+
if @bot.irc.network.owner_list_mode
|
227
|
+
@bot.irc.send "MODE #@name +#{@bot.irc.network.owner_list_mode}"
|
228
|
+
else
|
229
|
+
mark_as_synced :owners
|
230
|
+
end
|
229
231
|
end
|
230
232
|
|
231
233
|
# @group Channel Manipulation
|
232
234
|
|
233
235
|
# Bans someone from the channel.
|
234
236
|
#
|
235
|
-
# @param [
|
237
|
+
# @param [Mask, String, #mask] target the mask, or an object having a mask, to ban
|
236
238
|
# @return [Mask] the mask used for banning
|
239
|
+
# @see #unban #unban for unbanning users
|
237
240
|
def ban(target)
|
238
241
|
mask = Mask.from(target)
|
239
242
|
|
240
|
-
@bot.
|
243
|
+
@bot.irc.send "MODE #@name +b #{mask}"
|
241
244
|
mask
|
242
245
|
end
|
243
246
|
|
244
247
|
# Unbans someone from the channel.
|
245
248
|
#
|
246
|
-
# @param [
|
249
|
+
# @param [Mask, String, #mask] target the mask to unban
|
247
250
|
# @return [Mask] the mask used for unbanning
|
251
|
+
# @see #ban #ban for banning users
|
248
252
|
def unban(target)
|
249
253
|
mask = Mask.from(target)
|
250
254
|
|
251
|
-
@bot.
|
255
|
+
@bot.irc.send "MODE #@name -b #{mask}"
|
252
256
|
mask
|
253
257
|
end
|
254
258
|
|
259
|
+
# Ops a user.
|
260
|
+
#
|
255
261
|
# @param [String, User] user the user to op
|
256
262
|
# @return [void]
|
257
263
|
def op(user)
|
258
|
-
@bot.
|
264
|
+
@bot.irc.send "MODE #@name +o #{user}"
|
259
265
|
end
|
260
266
|
|
267
|
+
# Deops a user.
|
268
|
+
#
|
261
269
|
# @param [String, User] user the user to deop
|
262
270
|
# @return [void]
|
263
271
|
def deop(user)
|
264
|
-
@bot.
|
272
|
+
@bot.irc.send "MODE #@name -o #{user}"
|
265
273
|
end
|
266
274
|
|
275
|
+
# Voices a user.
|
276
|
+
#
|
267
277
|
# @param [String, User] user the user to voice
|
268
278
|
# @return [void]
|
269
279
|
def voice(user)
|
270
|
-
@bot.
|
280
|
+
@bot.irc.send "MODE #@name +v #{user}"
|
271
281
|
end
|
272
282
|
|
283
|
+
# Devoices a user.
|
284
|
+
#
|
273
285
|
# @param [String, User] user the user to devoice
|
274
286
|
# @return [void]
|
275
287
|
def devoice(user)
|
276
|
-
@bot.
|
288
|
+
@bot.irc.send "MODE #@name -v #{user}"
|
277
289
|
end
|
278
290
|
|
279
291
|
# Invites a user to the channel.
|
@@ -281,19 +293,20 @@ module Cinch
|
|
281
293
|
# @param [String, User] user the user to invite
|
282
294
|
# @return [void]
|
283
295
|
def invite(user)
|
284
|
-
@bot.
|
296
|
+
@bot.irc.send("INVITE #{user} #@name")
|
285
297
|
end
|
286
298
|
|
287
299
|
# Sets the topic.
|
288
300
|
#
|
289
301
|
# @param [String] new_topic the new topic
|
290
|
-
# @raise [Exceptions::TopicTooLong]
|
302
|
+
# @raise [Exceptions::TopicTooLong] Raised if the bot is operating
|
303
|
+
# in {Bot#strict? strict mode} and when the new topic is too long.
|
291
304
|
def topic=(new_topic)
|
292
305
|
if new_topic.size > @bot.irc.isupport["TOPICLEN"] && @bot.strict?
|
293
306
|
raise Exceptions::TopicTooLong, new_topic
|
294
307
|
end
|
295
308
|
|
296
|
-
@bot.
|
309
|
+
@bot.irc.send "TOPIC #@name :#{new_topic}"
|
297
310
|
end
|
298
311
|
|
299
312
|
# Kicks a user from the channel.
|
@@ -307,7 +320,7 @@ module Cinch
|
|
307
320
|
raise Exceptions::KickReasonTooLong, reason
|
308
321
|
end
|
309
322
|
|
310
|
-
@bot.
|
323
|
+
@bot.irc.send("KICK #@name #{user} :#{reason}")
|
311
324
|
end
|
312
325
|
|
313
326
|
# Sets or unsets modes. Most of the time you won't need this but
|
@@ -318,7 +331,7 @@ module Cinch
|
|
318
331
|
# @example
|
319
332
|
# channel.mode "+n"
|
320
333
|
def mode(s)
|
321
|
-
@bot.
|
334
|
+
@bot.irc.send "MODE #@name #{s}"
|
322
335
|
end
|
323
336
|
|
324
337
|
# Causes the bot to part from the channel.
|
@@ -326,7 +339,7 @@ module Cinch
|
|
326
339
|
# @param [String] message the part message.
|
327
340
|
# @return [void]
|
328
341
|
def part(message = nil)
|
329
|
-
@bot.
|
342
|
+
@bot.irc.send "PART #@name :#{message}"
|
330
343
|
end
|
331
344
|
|
332
345
|
# Joins the channel
|
@@ -338,20 +351,21 @@ module Cinch
|
|
338
351
|
if key.nil? and self.key != true
|
339
352
|
key = self.key
|
340
353
|
end
|
341
|
-
@bot.
|
354
|
+
@bot.irc.send "JOIN #{[@name, key].compact.join(" ")}"
|
342
355
|
end
|
343
356
|
|
344
357
|
# @endgroup
|
345
358
|
|
346
359
|
# @api private
|
347
|
-
# @return [
|
360
|
+
# @return [User] The added user
|
348
361
|
def add_user(user, modes = [])
|
349
362
|
@in_channel = true if user == @bot
|
350
363
|
@users[user] = modes
|
364
|
+
user
|
351
365
|
end
|
352
366
|
|
353
367
|
# @api private
|
354
|
-
# @return [
|
368
|
+
# @return [User, nil] The removed user
|
355
369
|
def remove_user(user)
|
356
370
|
@in_channel = false if user == @bot
|
357
371
|
@users.delete(user)
|
@@ -365,96 +379,6 @@ module Cinch
|
|
365
379
|
@users.clear
|
366
380
|
end
|
367
381
|
|
368
|
-
# @group Sending messages
|
369
|
-
|
370
|
-
# Send a message to the channel.
|
371
|
-
#
|
372
|
-
# @param [String] message the message
|
373
|
-
# @return [void]
|
374
|
-
# @see #safe_send
|
375
|
-
def send(message)
|
376
|
-
@bot.msg(@name, message)
|
377
|
-
end
|
378
|
-
alias_method :privmsg, :send
|
379
|
-
alias_method :msg, :send
|
380
|
-
|
381
|
-
# Send a notice to the channel.
|
382
|
-
#
|
383
|
-
# @param [String] message the message
|
384
|
-
# @return [void]
|
385
|
-
def notice(message)
|
386
|
-
@bot.notice(@name, message)
|
387
|
-
end
|
388
|
-
|
389
|
-
# Like {#safe_send} but for notices.
|
390
|
-
#
|
391
|
-
# @param (see #safe_send)
|
392
|
-
# @return (see #safe_send)
|
393
|
-
# @see #safe_send
|
394
|
-
# @todo (see #safe_send)
|
395
|
-
def safe_notice(message)
|
396
|
-
@bot.safe_notice(@name, message)
|
397
|
-
end
|
398
|
-
|
399
|
-
# Send a message to the channel, but remove any non-printable
|
400
|
-
# characters. The purpose of this method is to send text from
|
401
|
-
# untrusted sources, like other users or feeds.
|
402
|
-
#
|
403
|
-
# Note: this will **break** any mIRC color codes embedded in the
|
404
|
-
# string.
|
405
|
-
#
|
406
|
-
# @param (see #send)
|
407
|
-
# @return (see #send)
|
408
|
-
# @see #send
|
409
|
-
# @todo Handle mIRC color codes more gracefully.
|
410
|
-
def safe_send(message)
|
411
|
-
@bot.safe_msg(@name, message)
|
412
|
-
end
|
413
|
-
alias_method :safe_privmsg, :safe_send
|
414
|
-
alias_method :safe_msg, :safe_send
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
# Send a CTCP to the channel.
|
419
|
-
#
|
420
|
-
# @param [String] message the ctcp message
|
421
|
-
# @return [void]
|
422
|
-
def ctcp(message)
|
423
|
-
send "\001#{message}\001"
|
424
|
-
end
|
425
|
-
|
426
|
-
# Invoke an action (/me) in the channel.
|
427
|
-
#
|
428
|
-
# @param [String] message the message
|
429
|
-
# @return [void]
|
430
|
-
# @see #safe_action
|
431
|
-
def action(message)
|
432
|
-
@bot.action(@name, message)
|
433
|
-
end
|
434
|
-
|
435
|
-
# Invoke an action (/me) in the channel but remove any
|
436
|
-
# non-printable characters. The purpose of this method is to send
|
437
|
-
# text from untrusted sources, like other users or feeds.
|
438
|
-
#
|
439
|
-
# Note: this will **break** any mIRC color codes embedded in the
|
440
|
-
# string.
|
441
|
-
#
|
442
|
-
# @param (see #action)
|
443
|
-
# @return (see #action)
|
444
|
-
# @see #action
|
445
|
-
# @todo Handle mIRC color codes more gracefully.
|
446
|
-
def safe_action(message)
|
447
|
-
@bot.safe_action(@name, message)
|
448
|
-
end
|
449
|
-
|
450
|
-
# @endgroup
|
451
|
-
|
452
|
-
# @return [Boolean]
|
453
|
-
def ==(other)
|
454
|
-
@name == other.to_s
|
455
|
-
end
|
456
|
-
alias_method :eql?, "=="
|
457
|
-
|
458
382
|
# @return [Fixnum]
|
459
383
|
def hash
|
460
384
|
@name.hash
|