cinch 0.3.5 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +20 -0
- data/README.md +192 -0
- data/Rakefile +53 -43
- data/examples/basic/autovoice.rb +32 -0
- data/examples/basic/google.rb +35 -0
- data/examples/basic/hello.rb +15 -0
- data/examples/basic/join_part.rb +38 -0
- data/examples/basic/memo.rb +39 -0
- data/examples/basic/msg.rb +16 -0
- data/examples/basic/seen.rb +36 -0
- data/examples/basic/urban_dict.rb +35 -0
- data/examples/basic/url_shorten.rb +35 -0
- data/examples/plugins/autovoice.rb +40 -0
- data/examples/plugins/custom_prefix.rb +23 -0
- data/examples/plugins/google.rb +37 -0
- data/examples/plugins/hello.rb +22 -0
- data/examples/plugins/join_part.rb +42 -0
- data/examples/plugins/memo.rb +50 -0
- data/examples/plugins/msg.rb +22 -0
- data/examples/plugins/multiple_matches.rb +41 -0
- data/examples/plugins/seen.rb +45 -0
- data/examples/plugins/urban_dict.rb +30 -0
- data/examples/plugins/url_shorten.rb +32 -0
- data/lib/cinch.rb +7 -20
- data/lib/cinch/ban.rb +41 -0
- data/lib/cinch/bot.rb +479 -0
- data/lib/cinch/callback.rb +11 -0
- data/lib/cinch/channel.rb +419 -0
- data/lib/cinch/constants.rb +369 -0
- data/lib/cinch/exceptions.rb +25 -0
- data/lib/cinch/helpers.rb +21 -0
- data/lib/cinch/irc.rb +344 -38
- data/lib/cinch/isupport.rb +96 -0
- data/lib/cinch/logger/formatted_logger.rb +80 -0
- data/lib/cinch/logger/logger.rb +44 -0
- data/lib/cinch/logger/null_logger.rb +18 -0
- data/lib/cinch/mask.rb +46 -0
- data/lib/cinch/message.rb +183 -0
- data/lib/cinch/message_queue.rb +62 -0
- data/lib/cinch/plugin.rb +205 -0
- data/lib/cinch/rubyext/infinity.rb +1 -0
- data/lib/cinch/rubyext/module.rb +18 -0
- data/lib/cinch/rubyext/queue.rb +19 -0
- data/lib/cinch/rubyext/string.rb +24 -0
- data/lib/cinch/syncable.rb +55 -0
- data/lib/cinch/user.rb +325 -0
- data/spec/bot_spec.rb +5 -0
- data/spec/channel_spec.rb +5 -0
- data/spec/cinch_spec.rb +5 -0
- data/spec/irc_spec.rb +5 -0
- data/spec/message_spec.rb +5 -0
- data/spec/plugin_spec.rb +5 -0
- data/spec/{helper.rb → spec_helper.rb} +0 -0
- data/spec/user_spec.rb +5 -0
- metadata +69 -51
- data/README.rdoc +0 -195
- data/examples/autovoice.rb +0 -32
- data/examples/custom_patterns.rb +0 -19
- data/examples/custom_prefix.rb +0 -25
- data/examples/google.rb +0 -31
- data/examples/hello.rb +0 -13
- data/examples/join_part.rb +0 -26
- data/examples/memo.rb +0 -40
- data/examples/msg.rb +0 -14
- data/examples/named-param-types.rb +0 -19
- data/examples/seen.rb +0 -41
- data/examples/urban_dict.rb +0 -31
- data/examples/url_shorten.rb +0 -34
- data/lib/cinch/base.rb +0 -368
- data/lib/cinch/irc/message.rb +0 -135
- data/lib/cinch/irc/parser.rb +0 -141
- data/lib/cinch/irc/socket.rb +0 -329
- data/lib/cinch/names.rb +0 -54
- data/lib/cinch/rules.rb +0 -171
- data/spec/base_spec.rb +0 -94
- data/spec/irc/helper.rb +0 -8
- data/spec/irc/message_spec.rb +0 -61
- data/spec/irc/parser_spec.rb +0 -103
- data/spec/irc/socket_spec.rb +0 -90
- data/spec/names_spec.rb +0 -393
- data/spec/options_spec.rb +0 -45
- data/spec/rules_spec.rb +0 -109
@@ -0,0 +1,419 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require "set"
|
3
|
+
|
4
|
+
module Cinch
|
5
|
+
class Channel
|
6
|
+
include Syncable
|
7
|
+
@channels = {}
|
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
|
+
def find_ensured(name, bot)
|
17
|
+
downcased_name = name.irc_downcase(bot.irc.isupport["CASEMAPPING"])
|
18
|
+
@channels[downcased_name] ||= new(name, bot)
|
19
|
+
@channels[downcased_name]
|
20
|
+
end
|
21
|
+
|
22
|
+
# Finds a channel.
|
23
|
+
#
|
24
|
+
# @param [String] name name of a channel
|
25
|
+
# @return [Channel, nil]
|
26
|
+
def find(name)
|
27
|
+
@channels[name]
|
28
|
+
end
|
29
|
+
|
30
|
+
# @return [Array<Channel>] Returns all channels
|
31
|
+
def all
|
32
|
+
@channels.values
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# @return [Bot]
|
37
|
+
attr_reader :bot
|
38
|
+
|
39
|
+
# @return [String]
|
40
|
+
attr_reader :name
|
41
|
+
|
42
|
+
# @return [Array<User>]
|
43
|
+
attr_reader :users
|
44
|
+
synced_attr_reader :users
|
45
|
+
|
46
|
+
# @return [String]
|
47
|
+
attr_accessor :topic
|
48
|
+
synced_attr_reader :topic
|
49
|
+
|
50
|
+
# @return [Array<Ban>]
|
51
|
+
attr_reader :bans
|
52
|
+
synced_attr_reader :bans
|
53
|
+
|
54
|
+
# @return [Array<String>]
|
55
|
+
attr_reader :modes
|
56
|
+
synced_attr_reader :modes
|
57
|
+
def initialize(name, bot)
|
58
|
+
@bot = bot
|
59
|
+
@name = name
|
60
|
+
@users = {}
|
61
|
+
@bans = []
|
62
|
+
|
63
|
+
@modes = {}
|
64
|
+
# TODO raise if not a channel
|
65
|
+
|
66
|
+
@topic = nil
|
67
|
+
|
68
|
+
@in_channel = false
|
69
|
+
|
70
|
+
@synced_attributes = Set.new
|
71
|
+
@when_requesting_synced_attribute = lambda {|attr|
|
72
|
+
unless @in_channel
|
73
|
+
unsync(attr)
|
74
|
+
case attr
|
75
|
+
when :users
|
76
|
+
@bot.raw "NAMES #@name"
|
77
|
+
when :topic
|
78
|
+
@bot.raw "TOPIC #@name"
|
79
|
+
when :bans
|
80
|
+
@bot.raw "MODE #@name +b"
|
81
|
+
when :modes
|
82
|
+
@bot.raw "MODE #@name"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
}
|
86
|
+
end
|
87
|
+
|
88
|
+
attr_accessor :limit
|
89
|
+
# @return [Number]
|
90
|
+
def limit
|
91
|
+
@modes["l"].to_i
|
92
|
+
end
|
93
|
+
|
94
|
+
def limit=(val)
|
95
|
+
if val == -1 or val.nil?
|
96
|
+
mode "-l"
|
97
|
+
else
|
98
|
+
mode "+l #{val}"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
# @return [Boolean] true if the channel is secret (+s)
|
103
|
+
attr_accessor :secret
|
104
|
+
undef_method "secret"
|
105
|
+
undef_method "secret="
|
106
|
+
def secret
|
107
|
+
@modes["s"]
|
108
|
+
end
|
109
|
+
alias_method :secret?, :secret
|
110
|
+
|
111
|
+
def secret=(bool)
|
112
|
+
if bool
|
113
|
+
mode "+s"
|
114
|
+
else
|
115
|
+
mode "-s"
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
# @return [Boolean] true if the channel is moderated (only users
|
120
|
+
# with +o and +v are able to send messages)
|
121
|
+
attr_accessor :moderated
|
122
|
+
undef_method "moderated"
|
123
|
+
undef_method "moderated="
|
124
|
+
def moderated
|
125
|
+
@modes["m"]
|
126
|
+
end
|
127
|
+
alias_method :moderated?, :moderated
|
128
|
+
|
129
|
+
def moderated=(val)
|
130
|
+
if bool
|
131
|
+
mode "+m"
|
132
|
+
else
|
133
|
+
mode "-m"
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
# @return [Boolean] true if the channel is invite only (+i)
|
138
|
+
attr_accessor :invite_only
|
139
|
+
undef_method "invite_only"
|
140
|
+
undef_method "invite_only="
|
141
|
+
def invite_only
|
142
|
+
@modes["i"]
|
143
|
+
end
|
144
|
+
alias_method :invite_only?, :invite_only
|
145
|
+
|
146
|
+
def invite_only=(bool)
|
147
|
+
if bool
|
148
|
+
mode "+i"
|
149
|
+
else
|
150
|
+
mode "-i"
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
# @return [String, nil]
|
155
|
+
attr_accessor :key
|
156
|
+
undef_method "key"
|
157
|
+
undef_method "key="
|
158
|
+
def key
|
159
|
+
@modes["k"]
|
160
|
+
end
|
161
|
+
|
162
|
+
def key=(new_key)
|
163
|
+
if new_key.nil?
|
164
|
+
mode "-k #{key}"
|
165
|
+
else
|
166
|
+
mode "+k #{new_key}"
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
# Sets or unsets modes. Most of the time you won't need this but
|
171
|
+
# use setter methods like {Channel#invite_only=}.
|
172
|
+
#
|
173
|
+
# @param [String] s a mode string
|
174
|
+
# @return [void]
|
175
|
+
# @example
|
176
|
+
# channel.mode "+n"
|
177
|
+
def mode(s)
|
178
|
+
@bot.raw "MODE #@name #{s}"
|
179
|
+
end
|
180
|
+
|
181
|
+
# @api private
|
182
|
+
# @return [void]
|
183
|
+
def sync_modes(all = true)
|
184
|
+
unsync :users
|
185
|
+
unsync :bans
|
186
|
+
unsync :modes
|
187
|
+
@bot.raw "NAMES #@name" if all
|
188
|
+
@bot.raw "MODE #@name +b" # bans
|
189
|
+
@bot.raw "MODE #@name"
|
190
|
+
end
|
191
|
+
|
192
|
+
# @return [Boolean] true if `user` is opped in the channel
|
193
|
+
def opped?(user)
|
194
|
+
user = User.find_ensured(user, @bot) unless user.is_a?(User)
|
195
|
+
@users[user] == "@"
|
196
|
+
end
|
197
|
+
|
198
|
+
# @return [Boolean] true if `user` is voiced in the channel
|
199
|
+
def voiced?(user)
|
200
|
+
user = User.find_ensured(user, @bot) unless user.is_a?(User)
|
201
|
+
@users[user] == "+"
|
202
|
+
end
|
203
|
+
|
204
|
+
# Bans someone from the channel.
|
205
|
+
#
|
206
|
+
# @param [Ban, Mask, User, String] target the mask to ban
|
207
|
+
# @return [Mask] the mask used for banning
|
208
|
+
def ban(target)
|
209
|
+
mask = Mask.from(target)
|
210
|
+
|
211
|
+
@bot.raw "MODE #@name +b #{mask}"
|
212
|
+
mask
|
213
|
+
end
|
214
|
+
|
215
|
+
# Unbans someone from the channel.
|
216
|
+
#
|
217
|
+
# @param [Ban, Mask, User, String] target the mask to unban
|
218
|
+
# @return [Mask] the mask used for unbanning
|
219
|
+
def unban(target)
|
220
|
+
mask = Mask.from(target)
|
221
|
+
|
222
|
+
@bot.raw "MODE #@name -b #{mask}"
|
223
|
+
mask
|
224
|
+
end
|
225
|
+
|
226
|
+
# @param [String, User] user the user to op
|
227
|
+
# @return [void]
|
228
|
+
def op(user)
|
229
|
+
@bot.raw "MODE #@name +o #{user}"
|
230
|
+
end
|
231
|
+
|
232
|
+
# @param [String, User] user the user to deop
|
233
|
+
# @return [void]
|
234
|
+
def deop(user)
|
235
|
+
@bot.raw "MODE #@name -o #{user}"
|
236
|
+
end
|
237
|
+
|
238
|
+
# @param [String, User] user the user to voice
|
239
|
+
# @return [void]
|
240
|
+
def voice(user)
|
241
|
+
@bot.raw "MODE #@name +v #{user}"
|
242
|
+
end
|
243
|
+
|
244
|
+
# @param [String, User] user the user to devoice
|
245
|
+
# @return [void]
|
246
|
+
def devoice(user)
|
247
|
+
@bot.raw "MODE #@name -v #{user}"
|
248
|
+
end
|
249
|
+
|
250
|
+
# @api private
|
251
|
+
# @return [void]
|
252
|
+
def add_user(user, mode = nil)
|
253
|
+
@in_channel = true if user == @bot
|
254
|
+
@users[user] = mode # TODO can a user have more than one mode?
|
255
|
+
end
|
256
|
+
|
257
|
+
# @api private
|
258
|
+
# @return [void]
|
259
|
+
def remove_user(user)
|
260
|
+
@in_channel = false if user == @bot
|
261
|
+
@users.delete(user)
|
262
|
+
end
|
263
|
+
|
264
|
+
# Removes all users
|
265
|
+
#
|
266
|
+
# @api private
|
267
|
+
# @return [void]
|
268
|
+
def clear_users
|
269
|
+
@users.clear
|
270
|
+
end
|
271
|
+
|
272
|
+
# Send a message to the channel.
|
273
|
+
#
|
274
|
+
# @param [String] message the message
|
275
|
+
# @return [void]
|
276
|
+
# @see #safe_send
|
277
|
+
def send(message)
|
278
|
+
@bot.msg(@name, message)
|
279
|
+
end
|
280
|
+
alias_method :privmsg, :send
|
281
|
+
alias_method :msg, :send
|
282
|
+
|
283
|
+
# Send a message to the channel, but remove any non-printable
|
284
|
+
# characters. The purpose of this method is to send text from
|
285
|
+
# untrusted sources, like other users or feeds.
|
286
|
+
#
|
287
|
+
# Note: this will **break** any mIRC color codes embedded in the
|
288
|
+
# string.
|
289
|
+
#
|
290
|
+
# @param (see #send)
|
291
|
+
# @return (see #send)
|
292
|
+
# @see #send
|
293
|
+
# @todo Handle mIRC color codes more gracefully.
|
294
|
+
def safe_send(message)
|
295
|
+
@bot.safe_msg(@name, message)
|
296
|
+
end
|
297
|
+
alias_method :safe_privmsg, :safe_send
|
298
|
+
alias_method :safe_msg, :safe_send
|
299
|
+
|
300
|
+
|
301
|
+
|
302
|
+
# Send a CTCP to the channel.
|
303
|
+
#
|
304
|
+
# @param [String] message the ctcp message
|
305
|
+
# @return [void]
|
306
|
+
def ctcp(message)
|
307
|
+
send "\001#{message}\001"
|
308
|
+
end
|
309
|
+
|
310
|
+
# Invoke an action (/me) in the channel.
|
311
|
+
#
|
312
|
+
# @param [String] message the message
|
313
|
+
# @return [void]
|
314
|
+
# @see #safe_action
|
315
|
+
def action(message)
|
316
|
+
@bot.action(@name, message)
|
317
|
+
end
|
318
|
+
|
319
|
+
# Invoke an action (/me) in the channel but remove any
|
320
|
+
# non-printable characters. The purpose of this method is to send
|
321
|
+
# text from untrusted sources, like other users or feeds.
|
322
|
+
#
|
323
|
+
# Note: this will **break** any mIRC color codes embedded in the
|
324
|
+
# string.
|
325
|
+
#
|
326
|
+
# @param (see #action)
|
327
|
+
# @return (see #action)
|
328
|
+
# @see #action
|
329
|
+
# @todo Handle mIRC color codes more gracefully.
|
330
|
+
def safe_action(message)
|
331
|
+
@bot.safe_action(@name, message)
|
332
|
+
end
|
333
|
+
|
334
|
+
|
335
|
+
# Invites a user to the channel.
|
336
|
+
#
|
337
|
+
# @param [String, User] user the user to invite
|
338
|
+
# @return [void]
|
339
|
+
def invite(user)
|
340
|
+
@bot.raw("INVITE #{user} #@name")
|
341
|
+
end
|
342
|
+
|
343
|
+
# Sets the topic.
|
344
|
+
#
|
345
|
+
# @param [String] new_topic the new topic
|
346
|
+
# @raise [Exceptions::TopicTooLong]
|
347
|
+
def topic=(new_topic)
|
348
|
+
if new_topic.size > @bot.irc.isupport["TOPICLEN"] && @bot.strict?
|
349
|
+
raise Exceptions::TopicTooLong, new_topic
|
350
|
+
end
|
351
|
+
|
352
|
+
@bot.raw "TOPIC #@name :#{new_topic}"
|
353
|
+
end
|
354
|
+
|
355
|
+
# Kicks a user from the channel.
|
356
|
+
#
|
357
|
+
# @param [String, User] user the user to kick
|
358
|
+
# @param [String] a reason for the kick
|
359
|
+
# @raise [Exceptions::KickReasonTooLong]
|
360
|
+
# @return [void]
|
361
|
+
def kick(user, reason = nil)
|
362
|
+
if reason.to_s.size > @bot.irc.isupport["KICKLEN"] && @bot.strict?
|
363
|
+
raise Exceptions::KickReasonTooLong, reason
|
364
|
+
end
|
365
|
+
|
366
|
+
@bot.raw("KICK #@name #{user} :#{reason}")
|
367
|
+
end
|
368
|
+
|
369
|
+
# Invites a user to the channel.
|
370
|
+
#
|
371
|
+
# @param [String, User] user the user to invite
|
372
|
+
# @return [void]
|
373
|
+
def invite(user)
|
374
|
+
@bot.raw "INVITE #{user} #@name"
|
375
|
+
end
|
376
|
+
|
377
|
+
# Causes the bot to part from the channel.
|
378
|
+
#
|
379
|
+
# @param [String] message the part message.
|
380
|
+
# @return [void]
|
381
|
+
def part(message = nil)
|
382
|
+
@bot.raw "PART #@name :#{message}"
|
383
|
+
end
|
384
|
+
|
385
|
+
# Joins the channel
|
386
|
+
#
|
387
|
+
# @param [String] key the channel key, if any. If none is
|
388
|
+
# specified but @key is set, @key will be used
|
389
|
+
# @return [void]
|
390
|
+
def join(key = nil)
|
391
|
+
if key.nil? and self.key != true
|
392
|
+
key = self.key
|
393
|
+
end
|
394
|
+
@bot.raw "JOIN #{[@name, key].compact.join(" ")}"
|
395
|
+
end
|
396
|
+
|
397
|
+
# @return [Boolean]
|
398
|
+
def ==(other)
|
399
|
+
@name == other.to_s
|
400
|
+
end
|
401
|
+
alias_method :eql?, "=="
|
402
|
+
|
403
|
+
# @return [Fixnum]
|
404
|
+
def hash
|
405
|
+
@name.hash
|
406
|
+
end
|
407
|
+
|
408
|
+
# @return [String]
|
409
|
+
def to_s
|
410
|
+
@name
|
411
|
+
end
|
412
|
+
alias_method :to_str, :to_s
|
413
|
+
|
414
|
+
# @return [String]
|
415
|
+
def inspect
|
416
|
+
"#<Channel name=#{@name.inspect}>"
|
417
|
+
end
|
418
|
+
end
|
419
|
+
end
|
@@ -0,0 +1,369 @@
|
|
1
|
+
module Cinch
|
2
|
+
# Used to indicate the nickname parameter supplied to a command is
|
3
|
+
# currently unused.
|
4
|
+
ERR_NOSUCHNICK = 401
|
5
|
+
|
6
|
+
# Used to indicate the server name given currently doesn't exist.
|
7
|
+
ERR_NOSUCHSERVER = 402
|
8
|
+
|
9
|
+
# Used to indicate the given channel name is invalid.
|
10
|
+
ERR_NOSUCHCHANNEL = 403
|
11
|
+
|
12
|
+
# Sent to a user who is either
|
13
|
+
# - not on a channel which is mode +n
|
14
|
+
# - not a chanop (or mode +v) on a channel which has mode +m set
|
15
|
+
# and is trying to send a PRIVMSG message to that channel.
|
16
|
+
ERR_CANNOTSENDTOCHAN = 404
|
17
|
+
|
18
|
+
# Sent to a user when they have joined the maximum number of allowed
|
19
|
+
# channels and they try to join another channel.
|
20
|
+
ERR_TOOMANYCHANNELS = 405
|
21
|
+
|
22
|
+
# Returned by WHOWAS to indicate there is no history information for
|
23
|
+
# that nickname.
|
24
|
+
ERR_WASNOSUCHNICK = 406
|
25
|
+
|
26
|
+
# Returned to a client which is attempting to send PRIVMSG/NOTICE
|
27
|
+
# using the user@host destination format and for a user@host which has
|
28
|
+
# several occurrences.
|
29
|
+
ERR_TOOMANYTARGETS = 407
|
30
|
+
|
31
|
+
# PING or PONG message missing the originator parameter which is
|
32
|
+
# required since these commands must work without valid prefixes.
|
33
|
+
ERR_NOORIGIN = 409
|
34
|
+
ERR_NORECIPIENT = 411
|
35
|
+
ERR_NOTEXTTOSEND = 412
|
36
|
+
ERR_NOTOPLEVEL = 413
|
37
|
+
|
38
|
+
# 412 - 414 are returned by PRIVMSG to indicate that the message
|
39
|
+
# wasn't delivered for some reason. ERR_NOTOPLEVEL and
|
40
|
+
# ERR_WILDTOPLEVEL are errors that are returned when an invalid use of
|
41
|
+
# "PRIVMSG $<server>" or "PRIVMSG #<host>" is attempted.
|
42
|
+
ERR_WILDTOPLEVEL = 414
|
43
|
+
|
44
|
+
# Returned to a registered client to indicate that the command sent is
|
45
|
+
# unknown by the server.
|
46
|
+
ERR_UNKNOWNCOMMAND = 421
|
47
|
+
|
48
|
+
# Server's MOTD file could not be opened by the server.
|
49
|
+
ERR_NOMOTD = 422
|
50
|
+
|
51
|
+
# Returned by a server in response to an ADMIN message when there is
|
52
|
+
# an error in finding the appropriate information.
|
53
|
+
ERR_NOADMININFO = 423
|
54
|
+
|
55
|
+
# Generic error message used to report a failed file operation during
|
56
|
+
# the processing of a message.
|
57
|
+
ERR_FILEERROR = 424
|
58
|
+
|
59
|
+
# Returned when a nickname parameter expected for a command and isn't
|
60
|
+
# found.
|
61
|
+
ERR_NONICKNAMEGIVEN = 431
|
62
|
+
|
63
|
+
# Returned after receiving a NICK message which contains characters
|
64
|
+
# which do not fall in the defined set.
|
65
|
+
ERR_ERRONEUSNICKNAME = 432
|
66
|
+
|
67
|
+
# Returned when a NICK message is processed that results in an attempt
|
68
|
+
# to change to a currently existing nickname.
|
69
|
+
ERR_NICKNAMEINUSE = 433
|
70
|
+
|
71
|
+
# Returned by a server to a client when it detects a nickname
|
72
|
+
# collision (registered of a NICK that already exists by another
|
73
|
+
# server).
|
74
|
+
ERR_NICKCOLLISION = 436
|
75
|
+
|
76
|
+
# Returned by the server to indicate that the target user of the
|
77
|
+
# command is not on the given channel.
|
78
|
+
ERR_USERNOTINCHANNEL = 441
|
79
|
+
|
80
|
+
# Returned by the server whenever a client tries to perform a channel
|
81
|
+
# effecting command for which the client isn't a member.
|
82
|
+
ERR_NOTONCHANNEL = 442
|
83
|
+
|
84
|
+
# Returned when a client tries to invite a user to a channel they are
|
85
|
+
# already on.
|
86
|
+
ERR_USERONCHANNEL = 443
|
87
|
+
|
88
|
+
# Returned by the summon after a SUMMON command for a user was unable
|
89
|
+
# to be performed since they were not logged in.
|
90
|
+
ERR_NOLOGIN = 444
|
91
|
+
|
92
|
+
# Returned as a response to the SUMMON command. Must be returned by
|
93
|
+
# any server which does not implement it.
|
94
|
+
ERR_SUMMONDISABLED = 445
|
95
|
+
|
96
|
+
# Returned as a response to the USERS command. Must be returned by any
|
97
|
+
# server which does not implement it.
|
98
|
+
ERR_USERSDISABLED = 446
|
99
|
+
|
100
|
+
# Returned by the server to indicate that the client must be
|
101
|
+
# registered before the server will allow it to be parsed in detail.
|
102
|
+
ERR_NOTREGISTERED = 451
|
103
|
+
|
104
|
+
# Returned by the server by numerous commands to indicate to the
|
105
|
+
# client that it didn't supply enough parameters.
|
106
|
+
ERR_NEEDMOREPARAMS = 461
|
107
|
+
|
108
|
+
# Returned by the server to any link which tries to change part of the
|
109
|
+
# registered details (such as password or user details from second
|
110
|
+
# USER message).
|
111
|
+
ERR_ALREADYREGISTRED = 462
|
112
|
+
|
113
|
+
# Returned to a client which attempts to register with a server which
|
114
|
+
# does not been setup to allow connections from the host the attempted
|
115
|
+
# connection is tried.
|
116
|
+
ERR_NOPERMFORHOST = 463
|
117
|
+
|
118
|
+
# Returned to indicate a failed attempt at registering a connection
|
119
|
+
# for which a password was required and was either not given or
|
120
|
+
# incorrect.
|
121
|
+
ERR_PASSWDMISMATCH = 464
|
122
|
+
|
123
|
+
# Returned after an attempt to connect and register yourself with a
|
124
|
+
# server which has been setup to explicitly deny connections to you.
|
125
|
+
ERR_YOUREBANNEDCREEP = 465
|
126
|
+
ERR_KEYSET = 467
|
127
|
+
ERR_CHANNELISFULL = 471
|
128
|
+
ERR_UNKNOWNMODE = 472
|
129
|
+
ERR_INVITEONLYCHAN = 473
|
130
|
+
ERR_BANNEDFROMCHAN = 474
|
131
|
+
ERR_BADCHANNELKEY = 475
|
132
|
+
|
133
|
+
# Any command requiring operator privileges to operate must return
|
134
|
+
# this error to indicate the attempt was unsuccessful.
|
135
|
+
ERR_NOPRIVILEGES = 481
|
136
|
+
|
137
|
+
# Any command requiring 'chanop' privileges (such as MODE messages)
|
138
|
+
# must return this error if the client making the attempt is not a
|
139
|
+
# chanop on the specified channel.
|
140
|
+
ERR_CHANOPRIVSNEEDED = 482
|
141
|
+
|
142
|
+
# Any attempts to use the KILL command on a server are to be refused
|
143
|
+
# and this error returned directly to the client.
|
144
|
+
ERR_CANTKILLSERVER = 483
|
145
|
+
|
146
|
+
# If a client sends an OPER message and the server has not been
|
147
|
+
# configured to allow connections from the client's host as an
|
148
|
+
# operator, this error must be returned.
|
149
|
+
ERR_NOOPERHOST = 491
|
150
|
+
|
151
|
+
# Returned by the server to indicate that a MODE message was sent with
|
152
|
+
# a nickname parameter and that the a mode flag sent was not
|
153
|
+
# recognized.
|
154
|
+
ERR_UMODEUNKNOWNFLAG = 501
|
155
|
+
|
156
|
+
# Error sent to any user trying to view or change the user mode for a
|
157
|
+
# user other than themselves.
|
158
|
+
ERR_USERSDONTMATCH = 502
|
159
|
+
RPL_NONE = 300
|
160
|
+
|
161
|
+
# Reply format used by USERHOST to list replies to the query list.
|
162
|
+
RPL_USERHOST = 302
|
163
|
+
|
164
|
+
# Reply format used by ISON to list replies to the query list.
|
165
|
+
RPL_ISON = 303
|
166
|
+
|
167
|
+
# RPL_AWAY is sent to any client sending a PRIVMSG to a client which
|
168
|
+
# is away. RPL_AWAY is only sent by the server to which the client is
|
169
|
+
# connected.
|
170
|
+
RPL_AWAY = 301
|
171
|
+
|
172
|
+
# Replies RPL_UNAWAY and RPL_NOWAWAY are sent when the client removes
|
173
|
+
# and sets an AWAY message
|
174
|
+
RPL_UNAWAY = 305
|
175
|
+
|
176
|
+
# Replies RPL_UNAWAY and RPL_NOWAWAY are sent when the client removes
|
177
|
+
# and sets an AWAY message
|
178
|
+
RPL_NOWAWAY = 306
|
179
|
+
RPL_WHOISUSER = 311
|
180
|
+
RPL_WHOISSERVER = 312
|
181
|
+
RPL_WHOISOPERATOR = 313
|
182
|
+
RPL_WHOISIDLE = 317
|
183
|
+
RPL_ENDOFWHOIS = 318
|
184
|
+
|
185
|
+
# Replies 311 - 313, 317 - 319 are all replies generated in response
|
186
|
+
# to a WHOIS message. Given that there are enough parameters present,
|
187
|
+
# the answering server must either formulate a reply out of the above
|
188
|
+
# numerics (if the query nick is found) or return an error reply. The
|
189
|
+
# '*' in RPL_WHOISUSER is there as the literal character and not as a
|
190
|
+
# wild card. For each reply set, only RPL_WHOISCHANNELS may appear
|
191
|
+
# more than once (for long lists of channel names). The '@' and '+'
|
192
|
+
# characters next to the channel name indicate whether a client is a
|
193
|
+
# channel operator or has been granted permission to speak on a
|
194
|
+
# moderated channel. The RPL_ENDOFWHOIS reply is used to mark the end
|
195
|
+
# of processing a WHOIS message.
|
196
|
+
RPL_WHOISCHANNELS = 319
|
197
|
+
RPL_WHOWASUSER = 314
|
198
|
+
|
199
|
+
# When replying to a WHOWAS message, a server must use the replies
|
200
|
+
# RPL_WHOWASUSER, RPL_WHOISSERVER or ERR_WASNOSUCHNICK for each
|
201
|
+
# nickname in the presented list. At the end of all reply batches,
|
202
|
+
# there must be RPL_ENDOFWHOWAS (even if there was only one reply and
|
203
|
+
# it was an error).
|
204
|
+
RPL_ENDOFWHOWAS = 369
|
205
|
+
RPL_LISTSTART = 321
|
206
|
+
RPL_LIST = 322
|
207
|
+
|
208
|
+
# Replies RPL_LISTSTART, RPL_LIST, RPL_LISTEND mark the start, actual
|
209
|
+
# replies with data and end of the server's response to a LIST
|
210
|
+
# command. If there are no channels available to return, only the
|
211
|
+
# start and end reply must be sent.
|
212
|
+
RPL_LISTEND = 323
|
213
|
+
RPL_CHANNELMODEIS = 324
|
214
|
+
RPL_NOTOPIC = 331
|
215
|
+
|
216
|
+
# When sending a TOPIC message to determine the channel topic, one of
|
217
|
+
# two replies is sent. If the topic is set, RPL_TOPIC is sent back
|
218
|
+
# else RPL_NOTOPIC.
|
219
|
+
RPL_TOPIC = 332
|
220
|
+
|
221
|
+
# Returned by the server to indicate that the attempted INVITE message
|
222
|
+
# was successful and is being passed onto the end client.
|
223
|
+
RPL_INVITING = 341
|
224
|
+
|
225
|
+
# Returned by a server answering a SUMMON message to indicate that it
|
226
|
+
# is summoning that user.
|
227
|
+
RPL_SUMMONING = 342
|
228
|
+
|
229
|
+
# Reply by the server showing its version details. The <version>
|
230
|
+
# is the version of the software being used (including any patchlevel
|
231
|
+
# revisions) and the <debuglevel> is used to indicate if the
|
232
|
+
# server is running in "debug mode".<BR> The "comments" field may
|
233
|
+
# contain any comments about the version or further version details.
|
234
|
+
RPL_VERSION = 351
|
235
|
+
RPL_WHOREPLY = 352
|
236
|
+
|
237
|
+
# The RPL_WHOREPLY and RPL_ENDOFWHO pair are used to answer a WHO
|
238
|
+
# message. The RPL_WHOREPLY is only sent if there is an appropriate
|
239
|
+
# match to the WHO query. If there is a list of parameters supplied
|
240
|
+
# with a WHO message, a RPL_ENDOFWHO must be sent after processing
|
241
|
+
# each list item with <name> being the item.
|
242
|
+
RPL_ENDOFWHO = 315
|
243
|
+
RPL_NAMREPLY = 353
|
244
|
+
RPL_NAMEREPLY = RPL_NAMREPLY
|
245
|
+
|
246
|
+
# To reply to a NAMES message, a reply pair consisting of RPL_NAMREPLY
|
247
|
+
# and RPL_ENDOFNAMES is sent by the server back to the client. If
|
248
|
+
# there is no channel found as in the query, then only RPL_ENDOFNAMES
|
249
|
+
# is returned. The exception to this is when a NAMES message is sent
|
250
|
+
# with no parameters and all visible channels and contents are sent
|
251
|
+
# back in a series of RPL_NAMEREPLY messages with a RPL_ENDOFNAMES to
|
252
|
+
# mark the end.
|
253
|
+
RPL_ENDOFNAMES = 366
|
254
|
+
RPL_LINKS = 364
|
255
|
+
|
256
|
+
# In replying to the LINKS message, a server must send replies back
|
257
|
+
# using the RPL_LINKS numeric and mark the end of the list using an
|
258
|
+
# RPL_ENDOFLINKS reply.
|
259
|
+
RPL_ENDOFLINKS = 365
|
260
|
+
RPL_BANLIST = 367
|
261
|
+
|
262
|
+
# When listing the active 'bans' for a given channel, a server is
|
263
|
+
# required to send the list back using the RPL_BANLIST and
|
264
|
+
# RPL_ENDOFBANLIST messages. A separate RPL_BANLIST is sent for each
|
265
|
+
# active banid. After the banids have been listed (or if none present)
|
266
|
+
# a RPL_ENDOFBANLIST must be sent.
|
267
|
+
RPL_ENDOFBANLIST = 368
|
268
|
+
RPL_INFO = 371
|
269
|
+
|
270
|
+
# A server responding to an INFO message is required to send all its
|
271
|
+
# 'info' in a series of RPL_INFO messages with a RPL_ENDOFINFO reply
|
272
|
+
# to indicate the end of the replies.
|
273
|
+
RPL_ENDOFINFO = 374
|
274
|
+
RPL_MOTDSTART = 375
|
275
|
+
RPL_MOTD = 372
|
276
|
+
|
277
|
+
# When responding to the MOTD message and the MOTD file is found, the
|
278
|
+
# file is displayed line by line, with each line no longer than 80
|
279
|
+
# characters, using RPL_MOTD format replies. These should be
|
280
|
+
# surrounded by a RPL_MOTDSTART (before the RPL_MOTDs) and an
|
281
|
+
# RPL_ENDOFMOTD (after).
|
282
|
+
RPL_ENDOFMOTD = 376
|
283
|
+
|
284
|
+
# RPL_YOUREOPER is sent back to a client which has just successfully
|
285
|
+
# issued an OPER message and gained operator status.
|
286
|
+
RPL_YOUREOPER = 381
|
287
|
+
|
288
|
+
# If the REHASH option is used and an operator sends a REHASH message,
|
289
|
+
# an RPL_REHASHING is sent back to the operator.
|
290
|
+
RPL_REHASHING = 382
|
291
|
+
|
292
|
+
# When replying to the TIME message, a server must send the reply
|
293
|
+
# using the RPL_TIME format above. The string showing the time need
|
294
|
+
# only contain the correct day and time there. There is no further
|
295
|
+
# requirement for the time string.
|
296
|
+
RPL_TIME = 391
|
297
|
+
RPL_USERSSTART = 392
|
298
|
+
RPL_USERS = 393
|
299
|
+
RPL_ENDOFUSERS = 394
|
300
|
+
|
301
|
+
# If the USERS message is handled by a server, the replies
|
302
|
+
# RPL_USERSTART, RPL_USERS, RPL_ENDOFUSERS and RPL_NOUSERS are used.
|
303
|
+
# RPL_USERSSTART must be sent first, following by either a sequence of
|
304
|
+
# RPL_USERS or a single RPL_NOUSER. Following this is RPL_ENDOFUSERS.
|
305
|
+
RPL_NOUSERS = 395
|
306
|
+
RPL_TRACELINK = 200
|
307
|
+
RPL_TRACECONNECTING = 201
|
308
|
+
RPL_TRACEHANDSHAKE = 202
|
309
|
+
RPL_TRACEUNKNOWN = 203
|
310
|
+
RPL_TRACEOPERATOR = 204
|
311
|
+
RPL_TRACEUSER = 205
|
312
|
+
RPL_TRACESERVER = 206
|
313
|
+
RPL_TRACENEWTYPE = 208
|
314
|
+
|
315
|
+
# The RPL_TRACE* are all returned by the server in response to the
|
316
|
+
# TRACE message. How many are returned is dependent on the the TRACE
|
317
|
+
# message and whether it was sent by an operator or not. There is no
|
318
|
+
# predefined order for which occurs first. Replies RPL_TRACEUNKNOWN,
|
319
|
+
# RPL_TRACECONNECTING and RPL_TRACEHANDSHAKE are all used for
|
320
|
+
# connections which have not been fully established and are either
|
321
|
+
# unknown, still attempting to connect or in the process of completing
|
322
|
+
# the 'server handshake'. RPL_TRACELINK is sent by any server which
|
323
|
+
# handles a TRACE message and has to pass it on to another server. The
|
324
|
+
# list of RPL_TRACELINKs sent in response to a TRACE command
|
325
|
+
# traversing the IRC network should reflect the actual connectivity of
|
326
|
+
# the servers themselves along that path. RPL_TRACENEWTYPE is to be
|
327
|
+
# used for any connection which does not fit in the other categories
|
328
|
+
# but is being displayed anyway.
|
329
|
+
RPL_TRACELOG = 261
|
330
|
+
RPL_STATSLINKINFO = 211
|
331
|
+
RPL_STATSCOMMANDS = 212
|
332
|
+
RPL_STATSCLINE = 213
|
333
|
+
RPL_STATSNLINE = 214
|
334
|
+
RPL_STATSILINE = 215
|
335
|
+
RPL_STATSKLINE = 216
|
336
|
+
RPL_STATSYLINE = 218
|
337
|
+
RPL_ENDOFSTATS = 219
|
338
|
+
RPL_STATSLLINE = 241
|
339
|
+
RPL_STATSUPTIME = 242
|
340
|
+
RPL_STATSOLINE = 243
|
341
|
+
RPL_STATSHLINE = 244
|
342
|
+
|
343
|
+
# To answer a query about a client's own mode, RPL_UMODEIS is sent
|
344
|
+
# back.
|
345
|
+
RPL_UMODEIS = 221
|
346
|
+
RPL_LUSERCLIENT = 251
|
347
|
+
RPL_LUSEROP = 252
|
348
|
+
RPL_LUSERUNKNOWN = 253
|
349
|
+
RPL_LUSERCHANNELS = 254
|
350
|
+
|
351
|
+
# In processing an LUSERS message, the server sends a set of replies
|
352
|
+
# from RPL_LUSERCLIENT, RPL_LUSEROP, RPL_USERUNKNOWN,
|
353
|
+
# RPL_LUSERCHANNELS and RPL_LUSERME. When replying, a server must send
|
354
|
+
# back RPL_LUSERCLIENT and RPL_LUSERME. The other replies are only
|
355
|
+
# sent back if a non-zero count is found for them.
|
356
|
+
RPL_LUSERME = 255
|
357
|
+
RPL_ADMINME = 256
|
358
|
+
RPL_ADMINLOC1 = 257
|
359
|
+
RPL_ADMINLOC2 = 258
|
360
|
+
|
361
|
+
# When replying to an ADMIN message, a server is expected to use
|
362
|
+
# replies RLP_ADMINME through to RPL_ADMINEMAIL and provide a text
|
363
|
+
# message with each. For RPL_ADMINLOC1 a description of what city,
|
364
|
+
# state and country the server is in is expected, followed by details
|
365
|
+
# of the university and department (RPL_ADMINLOC2) and finally the
|
366
|
+
# administrative contact for the server (an email address here is
|
367
|
+
# required) in RPL_ADMINEMAIL.
|
368
|
+
RPL_ADMINEMAIL = 259
|
369
|
+
end
|