rbot 0.9.9 → 0.9.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/AUTHORS +8 -0
- data/ChangeLog +51 -0
- data/INSTALL +4 -0
- data/README +1 -0
- data/REQUIREMENTS +11 -0
- data/TODO +2 -0
- data/bin/rbot +21 -2
- data/data/rbot/languages/german.lang +4 -1
- data/data/rbot/languages/russian.lang +75 -0
- data/data/rbot/plugins/autoop.rb +42 -51
- data/data/rbot/plugins/bans.rb +205 -0
- data/data/rbot/plugins/bash.rb +56 -0
- data/data/rbot/plugins/chucknorris.rb +74 -0
- data/data/rbot/plugins/chucknorris.yml.gz +0 -0
- data/data/rbot/plugins/deepthoughts.rb +95 -0
- data/data/rbot/plugins/demauro.rb +95 -0
- data/data/rbot/plugins/digg.rb +51 -0
- data/data/rbot/plugins/figlet.rb +24 -0
- data/data/rbot/plugins/forecast.rb +133 -0
- data/data/rbot/plugins/freshmeat.rb +13 -7
- data/data/rbot/plugins/google.rb +2 -0
- data/data/rbot/plugins/grouphug.rb +36 -0
- data/data/rbot/plugins/imdb.rb +92 -0
- data/data/rbot/plugins/insult.rb +8 -1
- data/data/rbot/plugins/iplookup.rb +227 -0
- data/data/rbot/plugins/karma.rb +2 -2
- data/data/rbot/plugins/keywords.rb +470 -0
- data/data/rbot/plugins/lart.rb +132 -146
- data/data/rbot/plugins/lastfm.rb +25 -0
- data/data/rbot/plugins/markov.rb +204 -0
- data/data/rbot/plugins/math.rb +5 -1
- data/data/rbot/plugins/nickserv.rb +71 -11
- data/data/rbot/plugins/opme.rb +19 -19
- data/data/rbot/plugins/quakeauth.rb +2 -2
- data/data/rbot/plugins/quotes.rb +40 -25
- data/data/rbot/plugins/remind.rb +1 -1
- data/data/rbot/plugins/rot13.rb +2 -2
- data/data/rbot/plugins/roulette.rb +49 -15
- data/data/rbot/plugins/rss.rb +585 -0
- data/data/rbot/plugins/rubyurl.rb +39 -0
- data/data/rbot/plugins/seen.rb +2 -1
- data/data/rbot/plugins/slashdot.rb +5 -5
- data/data/rbot/plugins/spell.rb +5 -0
- data/data/rbot/plugins/theyfightcrime.rb +121 -0
- data/data/rbot/plugins/threat.rb +55 -0
- data/data/rbot/plugins/tinyurl.rb +39 -0
- data/data/rbot/plugins/topic.rb +204 -0
- data/data/rbot/plugins/urban.rb +71 -0
- data/data/rbot/plugins/url.rb +399 -4
- data/data/rbot/plugins/wow.rb +123 -0
- data/data/rbot/plugins/wserver.rb +1 -1
- data/data/rbot/templates/levels.rbot +2 -0
- data/lib/rbot/auth.rb +207 -96
- data/lib/rbot/channel.rb +5 -5
- data/lib/rbot/config.rb +125 -24
- data/lib/rbot/dbhash.rb +87 -21
- data/lib/rbot/httputil.rb +181 -13
- data/lib/rbot/ircbot.rb +525 -179
- data/lib/rbot/ircsocket.rb +330 -54
- data/lib/rbot/message.rb +66 -23
- data/lib/rbot/messagemapper.rb +25 -17
- data/lib/rbot/plugins.rb +244 -115
- data/lib/rbot/post-clean.rb +1 -0
- data/lib/rbot/{post-install.rb → post-config.rb} +1 -1
- data/lib/rbot/rbotconfig.rb +29 -14
- data/lib/rbot/registry.rb +111 -72
- data/lib/rbot/rfc2812.rb +208 -197
- data/lib/rbot/timer.rb +4 -0
- data/lib/rbot/utils.rb +2 -2
- metadata +127 -104
- data/data/rbot/plugins/rss.rb.disabled +0 -414
- data/lib/rbot/keywords.rb +0 -433
@@ -0,0 +1 @@
|
|
1
|
+
File.unlink("pkgconfig.rb") if FileTest.exist?("pkgconfig.rb")
|
data/lib/rbot/rbotconfig.rb
CHANGED
@@ -1,22 +1,37 @@
|
|
1
1
|
module Irc
|
2
2
|
module Config
|
3
3
|
@@datadir = nil
|
4
|
+
|
5
|
+
# first try for the default path to the data dir
|
6
|
+
defaultdir = File.expand_path(File.dirname($0) + '/../data')
|
7
|
+
|
8
|
+
if File.directory? "#{defaultdir}/rbot"
|
9
|
+
@@datadir = "#{defaultdir}/rbot"
|
10
|
+
end
|
11
|
+
|
4
12
|
# setup pkg-based configuration - i.e. where were we installed to, where
|
5
13
|
# are our data files, etc.
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
if @@datadir.nil?
|
15
|
+
begin
|
16
|
+
debug "trying to load rubygems"
|
17
|
+
require 'rubygems'
|
18
|
+
debug "loaded rubygems, looking for rbot-#$version"
|
19
|
+
if $version =~ /(.*)-svn\Z/
|
20
|
+
version = $1
|
21
|
+
else
|
22
|
+
version = $version
|
23
|
+
end
|
24
|
+
gemname, gem = Gem.source_index.find{|name, spec| spec.name == 'rbot' && spec.version.version == version}
|
25
|
+
debug "got gem #{gem}"
|
26
|
+
if gem && path = gem.full_gem_path
|
27
|
+
debug "installed via rubygems to #{path}"
|
28
|
+
@@datadir = "#{path}/data/rbot"
|
29
|
+
else
|
30
|
+
debug "not installed via rubygems"
|
31
|
+
end
|
32
|
+
rescue LoadError,NameError,NoMethodError
|
33
|
+
debug "no rubygems installed"
|
17
34
|
end
|
18
|
-
rescue LoadError
|
19
|
-
debug "no rubygems installed"
|
20
35
|
end
|
21
36
|
|
22
37
|
if @@datadir.nil?
|
@@ -24,7 +39,7 @@ module Irc
|
|
24
39
|
require 'rbot/pkgconfig'
|
25
40
|
@@datadir = PKGConfig::DATADIR
|
26
41
|
rescue LoadError
|
27
|
-
|
42
|
+
error "fatal - no way to determine data dir"
|
28
43
|
exit 2
|
29
44
|
end
|
30
45
|
end
|
data/lib/rbot/registry.rb
CHANGED
@@ -2,19 +2,13 @@ require 'rbot/dbhash'
|
|
2
2
|
|
3
3
|
module Irc
|
4
4
|
|
5
|
-
# this is
|
6
|
-
#
|
7
|
-
# the DBHash.
|
5
|
+
# this class is now used purely for upgrading from prior versions of rbot
|
6
|
+
# the new registry is split into multiple DBHash objects, one per plugin
|
8
7
|
class BotRegistry
|
9
8
|
def initialize(bot)
|
10
9
|
@bot = bot
|
11
10
|
upgrade_data
|
12
|
-
|
13
|
-
end
|
14
|
-
|
15
|
-
# delegation hack
|
16
|
-
def method_missing(method, *args, &block)
|
17
|
-
@db.send(method, *args, &block)
|
11
|
+
upgrade_data2
|
18
12
|
end
|
19
13
|
|
20
14
|
# check for older versions of rbot with data formats that require updating
|
@@ -22,24 +16,64 @@ module Irc
|
|
22
16
|
# work with is @bot.botclass.
|
23
17
|
def upgrade_data
|
24
18
|
if File.exist?("#{@bot.botclass}/registry.db")
|
25
|
-
|
26
|
-
old = BDB::Hash.open
|
27
|
-
"r+", 0600
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
0600, "set_pagesize" => 1024,
|
32
|
-
"set_cachesize" => [0, 32 * 1024, 0]
|
19
|
+
log "upgrading old-style (rbot 0.9.5 or earlier) plugin registry to new format"
|
20
|
+
old = BDB::Hash.open("#{@bot.botclass}/registry.db", nil,
|
21
|
+
"r+", 0600)
|
22
|
+
new = BDB::CIBtree.open("#{@bot.botclass}/plugin_registry.db", nil,
|
23
|
+
BDB::CREATE | BDB::EXCL,
|
24
|
+
0600)
|
33
25
|
old.each {|k,v|
|
34
26
|
new[k] = v
|
35
27
|
}
|
36
28
|
old.close
|
37
29
|
new.close
|
38
|
-
File.
|
30
|
+
File.rename("#{@bot.botclass}/registry.db", "#{@bot.botclass}/registry.db.old")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def upgrade_data2
|
35
|
+
if File.exist?("#{@bot.botclass}/plugin_registry.db")
|
36
|
+
Dir.mkdir("#{@bot.botclass}/registry") unless File.exist?("#{@bot.botclass}/registry")
|
37
|
+
env = BDB::Env.open("#{@bot.botclass}", BDB::INIT_TRANSACTION | BDB::CREATE | BDB::RECOVER )
|
38
|
+
dbs = Hash.new
|
39
|
+
log "upgrading previous (rbot 0.9.9 or earlier) plugin registry to new split format"
|
40
|
+
old = BDB::CIBtree.open("#{@bot.botclass}/plugin_registry.db", nil,
|
41
|
+
"r+", 0600, "env" => env)
|
42
|
+
old.each {|k,v|
|
43
|
+
prefix,key = k.split("/", 2)
|
44
|
+
prefix.downcase!
|
45
|
+
# subregistries were split with a +, now they are in separate folders
|
46
|
+
if prefix.gsub!(/\+/, "/")
|
47
|
+
# Ok, this code needs to be put in the db opening routines
|
48
|
+
dirs = File.dirname("#{@bot.botclass}/registry/#{prefix}.db").split("/")
|
49
|
+
dirs.length.times { |i|
|
50
|
+
dir = dirs[0,i+1].join("/")+"/"
|
51
|
+
unless File.exist?(dir)
|
52
|
+
log "creating subregistry directory #{dir}"
|
53
|
+
Dir.mkdir(dir)
|
54
|
+
end
|
55
|
+
}
|
56
|
+
end
|
57
|
+
unless dbs.has_key?(prefix)
|
58
|
+
log "creating db #{@bot.botclass}/registry/#{prefix}.db"
|
59
|
+
dbs[prefix] = BDB::CIBtree.open("#{@bot.botclass}/registry/#{prefix}.db",
|
60
|
+
nil, BDB::CREATE | BDB::EXCL,
|
61
|
+
0600, "env" => env)
|
62
|
+
end
|
63
|
+
dbs[prefix][key] = v
|
64
|
+
}
|
65
|
+
old.close
|
66
|
+
File.rename("#{@bot.botclass}/plugin_registry.db", "#{@bot.botclass}/plugin_registry.db.old")
|
67
|
+
dbs.each {|k,v|
|
68
|
+
log "closing db #{k}"
|
69
|
+
v.close
|
70
|
+
}
|
71
|
+
env.close
|
39
72
|
end
|
40
73
|
end
|
41
74
|
end
|
42
75
|
|
76
|
+
|
43
77
|
# This class provides persistent storage for plugins via a hash interface.
|
44
78
|
# The default mode is an object store, so you can store ruby objects and
|
45
79
|
# reference them with hash keys. This is because the default store/restore
|
@@ -54,7 +88,7 @@ module Irc
|
|
54
88
|
# blah = @registry[:blah]
|
55
89
|
# The registry can of course be used to store simple strings, fixnums, etc as
|
56
90
|
# well, and should be useful to store or cache plugin data or dynamic plugin
|
57
|
-
# configuration.
|
91
|
+
# configuration.
|
58
92
|
#
|
59
93
|
# WARNING:
|
60
94
|
# in object store mode, don't make the mistake of treating it like a live
|
@@ -86,19 +120,29 @@ module Irc
|
|
86
120
|
class BotRegistryAccessor
|
87
121
|
# plugins don't call this - a BotRegistryAccessor is created for them and
|
88
122
|
# is accessible via @registry.
|
89
|
-
def initialize(bot,
|
123
|
+
def initialize(bot, name)
|
90
124
|
@bot = bot
|
91
|
-
@
|
92
|
-
|
93
|
-
|
125
|
+
@name = name.downcase
|
126
|
+
dirs = File.dirname("#{@bot.botclass}/registry/#{@name}").split("/")
|
127
|
+
dirs.length.times { |i|
|
128
|
+
dir = dirs[0,i+1].join("/")+"/"
|
129
|
+
unless File.exist?(dir)
|
130
|
+
debug "creating subregistry directory #{dir}"
|
131
|
+
Dir.mkdir(dir)
|
132
|
+
end
|
133
|
+
}
|
134
|
+
@registry = DBTree.new bot, "registry/#{@name}"
|
94
135
|
@default = nil
|
95
|
-
# debug "initializing registry accessor with
|
136
|
+
# debug "initializing registry accessor with name #{@name}"
|
96
137
|
end
|
97
138
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
139
|
+
def flush
|
140
|
+
@registry.flush
|
141
|
+
@registry.sync
|
142
|
+
end
|
143
|
+
|
144
|
+
def close
|
145
|
+
@registry.close
|
102
146
|
end
|
103
147
|
|
104
148
|
# convert value to string form for storing in the registry
|
@@ -120,13 +164,28 @@ module Irc
|
|
120
164
|
# val
|
121
165
|
# end
|
122
166
|
def restore(val)
|
123
|
-
|
167
|
+
begin
|
168
|
+
Marshal.restore(val)
|
169
|
+
rescue Exception => e
|
170
|
+
warning "failed to restore marshal data for #{val.inspect}, falling back to default"
|
171
|
+
debug e.inspect
|
172
|
+
debug e.backtrace.join("\n")
|
173
|
+
if @default != nil
|
174
|
+
begin
|
175
|
+
return Marshal.restore(@default)
|
176
|
+
rescue
|
177
|
+
return nil
|
178
|
+
end
|
179
|
+
else
|
180
|
+
return nil
|
181
|
+
end
|
182
|
+
end
|
124
183
|
end
|
125
184
|
|
126
185
|
# lookup a key in the registry
|
127
186
|
def [](key)
|
128
|
-
if @registry.has_key?(
|
129
|
-
return restore(@registry[
|
187
|
+
if @registry.has_key?(key)
|
188
|
+
return restore(@registry[key])
|
130
189
|
elsif @default != nil
|
131
190
|
return restore(@default)
|
132
191
|
else
|
@@ -136,7 +195,7 @@ module Irc
|
|
136
195
|
|
137
196
|
# set a key in the registry
|
138
197
|
def []=(key,value)
|
139
|
-
@registry[
|
198
|
+
@registry[key] = store(value)
|
140
199
|
end
|
141
200
|
|
142
201
|
# set the default value for registry lookups, if the key sought is not
|
@@ -148,42 +207,36 @@ module Irc
|
|
148
207
|
# just like Hash#each
|
149
208
|
def each(&block)
|
150
209
|
@registry.each {|key,value|
|
151
|
-
|
152
|
-
block.call(key, restore(value))
|
153
|
-
end
|
210
|
+
block.call(key, restore(value))
|
154
211
|
}
|
155
212
|
end
|
156
|
-
|
213
|
+
|
157
214
|
# just like Hash#each_key
|
158
215
|
def each_key(&block)
|
159
216
|
@registry.each {|key, value|
|
160
|
-
|
161
|
-
block.call(key)
|
162
|
-
end
|
217
|
+
block.call(key)
|
163
218
|
}
|
164
219
|
end
|
165
|
-
|
220
|
+
|
166
221
|
# just like Hash#each_value
|
167
222
|
def each_value(&block)
|
168
223
|
@registry.each {|key, value|
|
169
|
-
|
170
|
-
block.call(restore(value))
|
171
|
-
end
|
224
|
+
block.call(restore(value))
|
172
225
|
}
|
173
226
|
end
|
174
227
|
|
175
228
|
# just like Hash#has_key?
|
176
229
|
def has_key?(key)
|
177
|
-
return @registry.has_key?(
|
230
|
+
return @registry.has_key?(key)
|
178
231
|
end
|
179
232
|
alias include? has_key?
|
180
233
|
alias member? has_key?
|
181
234
|
|
182
235
|
# just like Hash#has_both?
|
183
236
|
def has_both?(key, value)
|
184
|
-
return @registry.has_both?(
|
237
|
+
return @registry.has_both?(key, store(value))
|
185
238
|
end
|
186
|
-
|
239
|
+
|
187
240
|
# just like Hash#has_value?
|
188
241
|
def has_value?(value)
|
189
242
|
return @registry.has_value?(store(value))
|
@@ -192,58 +245,44 @@ module Irc
|
|
192
245
|
# just like Hash#index?
|
193
246
|
def index(value)
|
194
247
|
ind = @registry.index(store(value))
|
195
|
-
if ind
|
248
|
+
if ind
|
196
249
|
return ind
|
197
250
|
else
|
198
251
|
return nil
|
199
252
|
end
|
200
253
|
end
|
201
|
-
|
254
|
+
|
202
255
|
# delete a key from the registry
|
203
256
|
def delete(key)
|
204
|
-
return @registry.delete(
|
257
|
+
return @registry.delete(key)
|
205
258
|
end
|
206
259
|
|
207
260
|
# returns a list of your keys
|
208
261
|
def keys
|
209
|
-
return @registry.keys
|
210
|
-
if key.gsub!(/^#{Regexp.escape(@prefix)}/, "")
|
211
|
-
key
|
212
|
-
else
|
213
|
-
nil
|
214
|
-
end
|
215
|
-
}.compact
|
262
|
+
return @registry.keys
|
216
263
|
end
|
217
264
|
|
218
265
|
# Return an array of all associations [key, value] in your namespace
|
219
266
|
def to_a
|
220
267
|
ret = Array.new
|
221
268
|
@registry.each {|key, value|
|
222
|
-
|
223
|
-
ret << [key, restore(value)]
|
224
|
-
end
|
269
|
+
ret << [key, restore(value)]
|
225
270
|
}
|
226
271
|
return ret
|
227
272
|
end
|
228
|
-
|
273
|
+
|
229
274
|
# Return an hash of all associations {key => value} in your namespace
|
230
275
|
def to_hash
|
231
276
|
ret = Hash.new
|
232
277
|
@registry.each {|key, value|
|
233
|
-
|
234
|
-
ret[key] = restore(value)
|
235
|
-
end
|
278
|
+
ret[key] = restore(value)
|
236
279
|
}
|
237
280
|
return ret
|
238
281
|
end
|
239
282
|
|
240
283
|
# empties the registry (restricted to your namespace)
|
241
284
|
def clear
|
242
|
-
@registry.
|
243
|
-
if key =~ /^#{Regexp.escape(@prefix)}/
|
244
|
-
@registry.delete(key)
|
245
|
-
end
|
246
|
-
}
|
285
|
+
@registry.clear
|
247
286
|
end
|
248
287
|
alias truncate clear
|
249
288
|
|
@@ -256,16 +295,16 @@ module Irc
|
|
256
295
|
return ret
|
257
296
|
end
|
258
297
|
|
298
|
+
def sub_registry(prefix)
|
299
|
+
return BotRegistryAccessor.new(@bot, @name + "/" + prefix)
|
300
|
+
end
|
301
|
+
|
259
302
|
# returns the number of keys in your registry namespace
|
260
303
|
def length
|
261
304
|
self.keys.length
|
262
305
|
end
|
263
306
|
alias size length
|
264
307
|
|
265
|
-
def flush
|
266
|
-
@registry.flush
|
267
|
-
end
|
268
|
-
|
269
308
|
end
|
270
309
|
|
271
310
|
end
|
data/lib/rbot/rfc2812.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Irc
|
2
2
|
# RFC 2812 Internet Relay Chat: Client Protocol
|
3
|
-
#
|
3
|
+
#
|
4
4
|
RPL_WELCOME=001
|
5
5
|
# "Welcome to the Internet Relay Network
|
6
6
|
# <nick>!<user>@<host>"
|
@@ -11,53 +11,53 @@ module Irc
|
|
11
11
|
RPL_MYINFO=004
|
12
12
|
# "<servername> <version> <available user modes>
|
13
13
|
# <available channel modes>"
|
14
|
-
#
|
14
|
+
#
|
15
15
|
# - The server sends Replies 001 to 004 to a user upon
|
16
16
|
# successful registration.
|
17
|
-
#
|
17
|
+
#
|
18
18
|
# RPL_BOUNCE=005
|
19
19
|
# # "Try server <server name>, port <port number>"
|
20
20
|
RPL_ISUPPORT=005
|
21
21
|
# "005 nick PREFIX=(ov)@+ CHANTYPES=#& :are supported by this server"
|
22
|
-
#
|
22
|
+
#
|
23
23
|
# - Sent by the server to a user to suggest an alternative
|
24
24
|
# server. This is often used when the connection is
|
25
25
|
# refused because the server is already full.
|
26
|
-
#
|
26
|
+
#
|
27
27
|
RPL_USERHOST=302
|
28
28
|
# ":*1<reply> *( " " <reply> )"
|
29
|
-
#
|
29
|
+
#
|
30
30
|
# - Reply format used by USERHOST to list replies to
|
31
31
|
# the query list. The reply string is composed as
|
32
32
|
# follows:
|
33
|
-
#
|
33
|
+
#
|
34
34
|
# reply = nickname [ "*" ] "=" ( "+" / "-" ) hostname
|
35
|
-
#
|
35
|
+
#
|
36
36
|
# The '*' indicates whether the client has registered
|
37
37
|
# as an Operator. The '-' or '+' characters represent
|
38
38
|
# whether the client has set an AWAY message or not
|
39
39
|
# respectively.
|
40
|
-
#
|
40
|
+
#
|
41
41
|
RPL_ISON=303
|
42
42
|
# ":*1<nick> *( " " <nick> )"
|
43
|
-
#
|
43
|
+
#
|
44
44
|
# - Reply format used by ISON to list replies to the
|
45
45
|
# query list.
|
46
|
-
#
|
46
|
+
#
|
47
47
|
RPL_AWAY=301
|
48
48
|
# "<nick> :<away message>"
|
49
49
|
RPL_UNAWAY=305
|
50
50
|
# ":You are no longer marked as being away"
|
51
51
|
RPL_NOWAWAY=306
|
52
52
|
# ":You have been marked as being away"
|
53
|
-
#
|
53
|
+
#
|
54
54
|
# - These replies are used with the AWAY command (if
|
55
55
|
# allowed). RPL_AWAY is sent to any client sending a
|
56
56
|
# PRIVMSG to a client which is away. RPL_AWAY is only
|
57
57
|
# sent by the server to which the client is connected.
|
58
58
|
# Replies RPL_UNAWAY and RPL_NOWAWAY are sent when the
|
59
59
|
# client removes and sets an AWAY message.
|
60
|
-
#
|
60
|
+
#
|
61
61
|
RPL_WHOISUSER=311
|
62
62
|
# "<nick> <user> <host> * :<real name>"
|
63
63
|
RPL_WHOISSERVER=312
|
@@ -70,7 +70,7 @@ module Irc
|
|
70
70
|
# "<nick> :End of WHOIS list"
|
71
71
|
RPL_WHOISCHANNELS=319
|
72
72
|
# "<nick> :*( ( "@" / "+" ) <channel> " " )"
|
73
|
-
#
|
73
|
+
#
|
74
74
|
# - Replies 311 - 313, 317 - 319 are all replies
|
75
75
|
# generated in response to a WHOIS message. Given that
|
76
76
|
# there are enough parameters present, the answering
|
@@ -85,107 +85,107 @@ module Irc
|
|
85
85
|
# has been granted permission to speak on a moderated
|
86
86
|
# channel. The RPL_ENDOFWHOIS reply is used to mark
|
87
87
|
# the end of processing a WHOIS message.
|
88
|
-
#
|
88
|
+
#
|
89
89
|
RPL_WHOWASUSER=314
|
90
90
|
# "<nick> <user> <host> * :<real name>"
|
91
91
|
RPL_ENDOFWHOWAS=369
|
92
92
|
# "<nick> :End of WHOWAS"
|
93
|
-
#
|
93
|
+
#
|
94
94
|
# - When replying to a WHOWAS message, a server MUST use
|
95
95
|
# the replies RPL_WHOWASUSER, RPL_WHOISSERVER or
|
96
96
|
# ERR_WASNOSUCHNICK for each nickname in the presented
|
97
97
|
# list. At the end of all reply batches, there MUST
|
98
98
|
# be RPL_ENDOFWHOWAS (even if there was only one reply
|
99
99
|
# and it was an error).
|
100
|
-
#
|
100
|
+
#
|
101
101
|
RPL_LISTSTART=321
|
102
102
|
# Obsolete. Not used.
|
103
|
-
#
|
103
|
+
#
|
104
104
|
RPL_LIST=322
|
105
105
|
# "<channel> <# visible> :<topic>"
|
106
106
|
RPL_LISTEND=323
|
107
107
|
# ":End of LIST"
|
108
|
-
#
|
108
|
+
#
|
109
109
|
# - Replies RPL_LIST, RPL_LISTEND mark the actual replies
|
110
110
|
# with data and end of the server's response to a LIST
|
111
111
|
# command. If there are no channels available to return,
|
112
112
|
# only the end reply MUST be sent.
|
113
|
-
#
|
113
|
+
#
|
114
114
|
RPL_UNIQOPIS=325
|
115
115
|
# "<channel> <nickname>"
|
116
|
-
#
|
116
|
+
#
|
117
117
|
RPL_CHANNELMODEIS=324
|
118
118
|
# "<channel> <mode> <mode params>"
|
119
|
-
#
|
119
|
+
#
|
120
120
|
RPL_NOTOPIC=331
|
121
121
|
# "<channel> :No topic is set"
|
122
122
|
RPL_TOPIC=332
|
123
123
|
# "<channel> :<topic>"
|
124
|
-
#
|
124
|
+
#
|
125
125
|
# - When sending a TOPIC message to determine the
|
126
126
|
# channel topic, one of two replies is sent. If
|
127
127
|
# the topic is set, RPL_TOPIC is sent back else
|
128
128
|
# RPL_NOTOPIC.
|
129
|
-
#
|
129
|
+
#
|
130
130
|
RPL_TOPIC_INFO=333
|
131
131
|
# <channel> <set by> <unixtime>
|
132
132
|
RPL_INVITING=341
|
133
133
|
# "<channel> <nick>"
|
134
|
-
#
|
134
|
+
#
|
135
135
|
# - Returned by the server to indicate that the
|
136
136
|
# attempted INVITE message was successful and is
|
137
137
|
# being passed onto the end client.
|
138
|
-
#
|
138
|
+
#
|
139
139
|
RPL_SUMMONING=342
|
140
140
|
# "<user> :Summoning user to IRC"
|
141
|
-
#
|
141
|
+
#
|
142
142
|
# - Returned by a server answering a SUMMON message to
|
143
143
|
# indicate that it is summoning that user.
|
144
|
-
#
|
144
|
+
#
|
145
145
|
RPL_INVITELIST=346
|
146
146
|
# "<channel> <invitemask>"
|
147
147
|
RPL_ENDOFINVITELIST=347
|
148
148
|
# "<channel> :End of channel invite list"
|
149
|
-
#
|
149
|
+
#
|
150
150
|
# - When listing the 'invitations masks' for a given channel,
|
151
151
|
# a server is required to send the list back using the
|
152
152
|
# RPL_INVITELIST and RPL_ENDOFINVITELIST messages. A
|
153
153
|
# separate RPL_INVITELIST is sent for each active mask.
|
154
154
|
# After the masks have been listed (or if none present) a
|
155
155
|
# RPL_ENDOFINVITELIST MUST be sent.
|
156
|
-
#
|
156
|
+
#
|
157
157
|
RPL_EXCEPTLIST=348
|
158
158
|
# "<channel> <exceptionmask>"
|
159
159
|
RPL_ENDOFEXCEPTLIST=349
|
160
160
|
# "<channel> :End of channel exception list"
|
161
|
-
#
|
161
|
+
#
|
162
162
|
# - When listing the 'exception masks' for a given channel,
|
163
163
|
# a server is required to send the list back using the
|
164
164
|
# RPL_EXCEPTLIST and RPL_ENDOFEXCEPTLIST messages. A
|
165
165
|
# separate RPL_EXCEPTLIST is sent for each active mask.
|
166
166
|
# After the masks have been listed (or if none present)
|
167
167
|
# a RPL_ENDOFEXCEPTLIST MUST be sent.
|
168
|
-
#
|
168
|
+
#
|
169
169
|
RPL_VERSION=351
|
170
170
|
# "<version>.<debuglevel> <server> :<comments>"
|
171
|
-
#
|
171
|
+
#
|
172
172
|
# - Reply by the server showing its version details.
|
173
173
|
# The <version> is the version of the software being
|
174
174
|
# used (including any patchlevel revisions) and the
|
175
175
|
# <debuglevel> is used to indicate if the server is
|
176
176
|
# running in "debug mode".
|
177
|
-
#
|
177
|
+
#
|
178
178
|
# The "comments" field may contain any comments about
|
179
179
|
# the version or further version details.
|
180
|
-
#
|
180
|
+
#
|
181
181
|
RPL_WHOREPLY=352
|
182
182
|
# "<channel> <user> <host> <server> <nick>
|
183
183
|
# ( "H" / "G" > ["*"] [ ( "@" / "+" ) ]
|
184
184
|
# :<hopcount> <real name>"
|
185
|
-
#
|
185
|
+
#
|
186
186
|
RPL_ENDOFWHO=315
|
187
187
|
# "<name> :End of WHO list"
|
188
|
-
#
|
188
|
+
#
|
189
189
|
# - The RPL_WHOREPLY and RPL_ENDOFWHO pair are used
|
190
190
|
# to answer a WHO message. The RPL_WHOREPLY is only
|
191
191
|
# sent if there is an appropriate match to the WHO
|
@@ -193,16 +193,16 @@ module Irc
|
|
193
193
|
# with a WHO message, a RPL_ENDOFWHO MUST be sent
|
194
194
|
# after processing each list item with <name> being
|
195
195
|
# the item.
|
196
|
-
#
|
196
|
+
#
|
197
197
|
RPL_NAMREPLY=353
|
198
198
|
# "( "=" / "*" / "@" ) <channel>
|
199
199
|
# :[ "@" / "+" ] <nick> *( " " [ "@" / "+" ] <nick> )
|
200
200
|
# - "@" is used for secret channels, "*" for private
|
201
201
|
# channels, and "=" for others (public channels).
|
202
|
-
#
|
202
|
+
#
|
203
203
|
RPL_ENDOFNAMES=366
|
204
204
|
# "<channel> :End of NAMES list"
|
205
|
-
#
|
205
|
+
#
|
206
206
|
# - To reply to a NAMES message, a reply pair consisting
|
207
207
|
# of RPL_NAMREPLY and RPL_ENDOFNAMES is sent by the
|
208
208
|
# server back to the client. If there is no channel
|
@@ -212,81 +212,81 @@ module Irc
|
|
212
212
|
# channels and contents are sent back in a series of
|
213
213
|
# RPL_NAMEREPLY messages with a RPL_ENDOFNAMES to mark
|
214
214
|
# the end.
|
215
|
-
#
|
215
|
+
#
|
216
216
|
RPL_LINKS=364
|
217
217
|
# "<mask> <server> :<hopcount> <server info>"
|
218
218
|
RPL_ENDOFLINKS=365
|
219
219
|
# "<mask> :End of LINKS list"
|
220
|
-
#
|
220
|
+
#
|
221
221
|
# - In replying to the LINKS message, a server MUST send
|
222
222
|
# replies back using the RPL_LINKS numeric and mark the
|
223
223
|
# end of the list using an RPL_ENDOFLINKS reply.
|
224
|
-
#
|
224
|
+
#
|
225
225
|
RPL_BANLIST=367
|
226
226
|
# "<channel> <banmask>"
|
227
227
|
RPL_ENDOFBANLIST=368
|
228
228
|
# "<channel> :End of channel ban list"
|
229
|
-
#
|
229
|
+
#
|
230
230
|
# - When listing the active 'bans' for a given channel,
|
231
231
|
# a server is required to send the list back using the
|
232
232
|
# RPL_BANLIST and RPL_ENDOFBANLIST messages. A separate
|
233
233
|
# RPL_BANLIST is sent for each active banmask. After the
|
234
234
|
# banmasks have been listed (or if none present) a
|
235
235
|
# RPL_ENDOFBANLIST MUST be sent.
|
236
|
-
#
|
236
|
+
#
|
237
237
|
RPL_INFO=371
|
238
238
|
# ":<string>"
|
239
239
|
RPL_ENDOFINFO=374
|
240
240
|
# ":End of INFO list"
|
241
|
-
#
|
241
|
+
#
|
242
242
|
# - A server responding to an INFO message is required to
|
243
243
|
# send all its 'info' in a series of RPL_INFO messages
|
244
244
|
# with a RPL_ENDOFINFO reply to indicate the end of the
|
245
245
|
# replies.
|
246
|
-
#
|
246
|
+
#
|
247
247
|
RPL_MOTDSTART=375
|
248
248
|
# ":- <server> Message of the day - "
|
249
249
|
RPL_MOTD=372
|
250
250
|
# ":- <text>"
|
251
251
|
RPL_ENDOFMOTD=376
|
252
252
|
# ":End of MOTD command"
|
253
|
-
#
|
253
|
+
#
|
254
254
|
# - When responding to the MOTD message and the MOTD file
|
255
255
|
# is found, the file is displayed line by line, with
|
256
256
|
# each line no longer than 80 characters, using
|
257
257
|
# RPL_MOTD format replies. These MUST be surrounded
|
258
258
|
# by a RPL_MOTDSTART (before the RPL_MOTDs) and an
|
259
259
|
# RPL_ENDOFMOTD (after).
|
260
|
-
#
|
260
|
+
#
|
261
261
|
RPL_YOUREOPER=381
|
262
262
|
# ":You are now an IRC operator"
|
263
|
-
#
|
263
|
+
#
|
264
264
|
# - RPL_YOUREOPER is sent back to a client which has
|
265
265
|
# just successfully issued an OPER message and gained
|
266
266
|
# operator status.
|
267
|
-
#
|
267
|
+
#
|
268
268
|
RPL_REHASHING=382
|
269
269
|
# "<config file> :Rehashing"
|
270
|
-
#
|
270
|
+
#
|
271
271
|
# - If the REHASH option is used and an operator sends
|
272
272
|
# a REHASH message, an RPL_REHASHING is sent back to
|
273
273
|
# the operator.
|
274
|
-
#
|
274
|
+
#
|
275
275
|
RPL_YOURESERVICE=383
|
276
276
|
# "You are service <servicename>"
|
277
|
-
#
|
277
|
+
#
|
278
278
|
# - Sent by the server to a service upon successful
|
279
279
|
# registration.
|
280
|
-
#
|
280
|
+
#
|
281
281
|
RPL_TIME=391
|
282
282
|
# "<server> :<string showing server's local time>"
|
283
|
-
#
|
283
|
+
#
|
284
284
|
# - When replying to the TIME message, a server MUST send
|
285
285
|
# the reply using the RPL_TIME format above. The string
|
286
286
|
# showing the time need only contain the correct day and
|
287
287
|
# time there. There is no further requirement for the
|
288
288
|
# time string.
|
289
|
-
#
|
289
|
+
#
|
290
290
|
RPL_USERSSTART=392
|
291
291
|
# ":UserID Terminal Host"
|
292
292
|
RPL_USERS=393
|
@@ -295,14 +295,14 @@ module Irc
|
|
295
295
|
# ":End of users"
|
296
296
|
RPL_NOUSERS=395
|
297
297
|
# ":Nobody logged in"
|
298
|
-
#
|
298
|
+
#
|
299
299
|
# - If the USERS message is handled by a server, the
|
300
300
|
# replies RPL_USERSTART, RPL_USERS, RPL_ENDOFUSERS and
|
301
301
|
# RPL_NOUSERS are used. RPL_USERSSTART MUST be sent
|
302
302
|
# first, following by either a sequence of RPL_USERS
|
303
303
|
# or a single RPL_NOUSER. Following this is
|
304
304
|
# RPL_ENDOFUSERS.
|
305
|
-
#
|
305
|
+
#
|
306
306
|
RPL_TRACELINK=200
|
307
307
|
# "Link <version & debug level> <destination>
|
308
308
|
# <next server> V<protocol version>
|
@@ -333,7 +333,7 @@ module Irc
|
|
333
333
|
# "File <logfile> <debug level>"
|
334
334
|
RPL_TRACEEND=262
|
335
335
|
# "<server name> <version & debug level> :End of TRACE"
|
336
|
-
#
|
336
|
+
#
|
337
337
|
# - The RPL_TRACE* are all returned by the server in
|
338
338
|
# response to the TRACE message. How many are
|
339
339
|
# returned is dependent on the TRACE message and
|
@@ -350,12 +350,12 @@ module Irc
|
|
350
350
|
# response to a TRACE command traversing the IRC
|
351
351
|
# network should reflect the actual connectivity of
|
352
352
|
# the servers themselves along that path.
|
353
|
-
#
|
353
|
+
#
|
354
354
|
# RPL_TRACENEWTYPE is to be used for any connection
|
355
355
|
# which does not fit in the other categories but is
|
356
356
|
# being displayed anyway.
|
357
357
|
# RPL_TRACEEND is sent to indicate the end of the list.
|
358
|
-
#
|
358
|
+
#
|
359
359
|
RPL_LOCALUSERS=265
|
360
360
|
# ":Current local users: 3 Max: 4"
|
361
361
|
RPL_GLOBALUSERS=266
|
@@ -367,7 +367,7 @@ module Irc
|
|
367
367
|
# "<linkname> <sendq> <sent messages>
|
368
368
|
# <sent Kbytes> <received messages>
|
369
369
|
# <received Kbytes> <time open>"
|
370
|
-
#
|
370
|
+
#
|
371
371
|
# - reports statistics on a connection. <linkname>
|
372
372
|
# identifies the particular connection, <sendq> is
|
373
373
|
# the amount of data that is queued and waiting to be
|
@@ -378,45 +378,45 @@ module Irc
|
|
378
378
|
# Kbytes> for received data, respectively. <time
|
379
379
|
# open> indicates how long ago the connection was
|
380
380
|
# opened, in seconds.
|
381
|
-
#
|
381
|
+
#
|
382
382
|
RPL_STATSCOMMANDS=212
|
383
383
|
# "<command> <count> <byte count> <remote count>"
|
384
|
-
#
|
384
|
+
#
|
385
385
|
# - reports statistics on commands usage.
|
386
|
-
#
|
386
|
+
#
|
387
387
|
RPL_ENDOFSTATS=219
|
388
388
|
# "<stats letter> :End of STATS report"
|
389
|
-
#
|
389
|
+
#
|
390
390
|
RPL_STATSUPTIME=242
|
391
391
|
# ":Server Up %d days %d:%02d:%02d"
|
392
|
-
#
|
392
|
+
#
|
393
393
|
# - reports the server uptime.
|
394
|
-
#
|
394
|
+
#
|
395
395
|
RPL_STATSOLINE=243
|
396
396
|
# "O <hostmask> * <name>"
|
397
|
-
#
|
397
|
+
#
|
398
398
|
# - reports the allowed hosts from where user may become IRC
|
399
399
|
# operators.
|
400
|
-
#
|
400
|
+
#
|
401
401
|
RPL_UMODEIS=221
|
402
402
|
# "<user mode string>"
|
403
|
-
#
|
403
|
+
#
|
404
404
|
# - To answer a query about a client's own mode,
|
405
405
|
# RPL_UMODEIS is sent back.
|
406
|
-
#
|
406
|
+
#
|
407
407
|
RPL_SERVLIST=234
|
408
408
|
# "<name> <server> <mask> <type> <hopcount> <info>"
|
409
|
-
#
|
409
|
+
#
|
410
410
|
RPL_SERVLISTEND=235
|
411
411
|
# "<mask> <type> :End of service listing"
|
412
|
-
#
|
412
|
+
#
|
413
413
|
# - When listing services in reply to a SERVLIST message,
|
414
414
|
# a server is required to send the list back using the
|
415
415
|
# RPL_SERVLIST and RPL_SERVLISTEND messages. A separate
|
416
416
|
# RPL_SERVLIST is sent for each service. After the
|
417
417
|
# services have been listed (or if none present) a
|
418
418
|
# RPL_SERVLISTEND MUST be sent.
|
419
|
-
#
|
419
|
+
#
|
420
420
|
RPL_LUSERCLIENT=251
|
421
421
|
# ":There are <integer> users and <integer>
|
422
422
|
# services on <integer> servers"
|
@@ -429,7 +429,7 @@ module Irc
|
|
429
429
|
RPL_LUSERME=255
|
430
430
|
# ":I have <integer> clients and <integer>
|
431
431
|
# servers"
|
432
|
-
#
|
432
|
+
#
|
433
433
|
# - In processing an LUSERS message, the server
|
434
434
|
# sends a set of replies from RPL_LUSERCLIENT,
|
435
435
|
# RPL_LUSEROP, RPL_USERUNKNOWN,
|
@@ -438,7 +438,7 @@ module Irc
|
|
438
438
|
# RPL_LUSERCLIENT and RPL_LUSERME. The other
|
439
439
|
# replies are only sent back if a non-zero count
|
440
440
|
# is found for them.
|
441
|
-
#
|
441
|
+
#
|
442
442
|
RPL_ADMINME=256
|
443
443
|
# "<server> :Administrative info"
|
444
444
|
RPL_ADMINLOC1=257
|
@@ -447,7 +447,7 @@ module Irc
|
|
447
447
|
# ":<admin info>"
|
448
448
|
RPL_ADMINEMAIL=259
|
449
449
|
# ":<admin info>"
|
450
|
-
#
|
450
|
+
#
|
451
451
|
# - When replying to an ADMIN message, a server
|
452
452
|
# is expected to use replies RPL_ADMINME
|
453
453
|
# through to RPL_ADMINEMAIL and provide a text
|
@@ -458,82 +458,82 @@ module Irc
|
|
458
458
|
# and finally the administrative contact for the
|
459
459
|
# server (an email address here is REQUIRED)
|
460
460
|
# in RPL_ADMINEMAIL.
|
461
|
-
#
|
461
|
+
#
|
462
462
|
RPL_TRYAGAIN=263
|
463
463
|
# "<command> :Please wait a while and try again."
|
464
|
-
#
|
464
|
+
#
|
465
465
|
# - When a server drops a command without processing it,
|
466
466
|
# it MUST use the reply RPL_TRYAGAIN to inform the
|
467
467
|
# originating client.
|
468
|
-
#
|
468
|
+
#
|
469
469
|
# 5.2 Error Replies
|
470
|
-
#
|
470
|
+
#
|
471
471
|
# Error replies are found in the range from 400 to 599.
|
472
|
-
#
|
472
|
+
#
|
473
473
|
ERR_NOSUCHNICK=401
|
474
474
|
# "<nickname> :No such nick/channel"
|
475
|
-
#
|
475
|
+
#
|
476
476
|
# - Used to indicate the nickname parameter supplied to a
|
477
477
|
# command is currently unused.
|
478
|
-
#
|
478
|
+
#
|
479
479
|
ERR_NOSUCHSERVER=402
|
480
480
|
# "<server name> :No such server"
|
481
|
-
#
|
481
|
+
#
|
482
482
|
# - Used to indicate the server name given currently
|
483
483
|
# does not exist.
|
484
|
-
#
|
484
|
+
#
|
485
485
|
ERR_NOSUCHCHANNEL=403
|
486
486
|
# "<channel name> :No such channel"
|
487
|
-
#
|
487
|
+
#
|
488
488
|
# - Used to indicate the given channel name is invalid.
|
489
|
-
#
|
489
|
+
#
|
490
490
|
ERR_CANNOTSENDTOCHAN=404
|
491
491
|
# "<channel name> :Cannot send to channel"
|
492
|
-
#
|
492
|
+
#
|
493
493
|
# - Sent to a user who is either (a) not on a channel
|
494
494
|
# which is mode +n or (b) not a chanop (or mode +v) on
|
495
495
|
# a channel which has mode +m set or where the user is
|
496
496
|
# banned and is trying to send a PRIVMSG message to
|
497
497
|
# that channel.
|
498
|
-
#
|
498
|
+
#
|
499
499
|
ERR_TOOMANYCHANNELS=405
|
500
500
|
# "<channel name> :You have joined too many channels"
|
501
|
-
#
|
501
|
+
#
|
502
502
|
# - Sent to a user when they have joined the maximum
|
503
503
|
# number of allowed channels and they try to join
|
504
504
|
# another channel.
|
505
|
-
#
|
505
|
+
#
|
506
506
|
ERR_WASNOSUCHNICK=406
|
507
507
|
# "<nickname> :There was no such nickname"
|
508
|
-
#
|
508
|
+
#
|
509
509
|
# - Returned by WHOWAS to indicate there is no history
|
510
510
|
# information for that nickname.
|
511
|
-
#
|
511
|
+
#
|
512
512
|
ERR_TOOMANYTARGETS=407
|
513
513
|
# "<target> :<error code> recipients. <abort message>"
|
514
|
-
#
|
514
|
+
#
|
515
515
|
# - Returned to a client which is attempting to send a
|
516
516
|
# PRIVMSG/NOTICE using the user@host destination format
|
517
517
|
# and for a user@host which has several occurrences.
|
518
|
-
#
|
518
|
+
#
|
519
519
|
# - Returned to a client which trying to send a
|
520
520
|
# PRIVMSG/NOTICE to too many recipients.
|
521
|
-
#
|
521
|
+
#
|
522
522
|
# - Returned to a client which is attempting to JOIN a safe
|
523
523
|
# channel using the shortname when there are more than one
|
524
524
|
# such channel.
|
525
|
-
#
|
525
|
+
#
|
526
526
|
ERR_NOSUCHSERVICE=408
|
527
527
|
# "<service name> :No such service"
|
528
|
-
#
|
528
|
+
#
|
529
529
|
# - Returned to a client which is attempting to send a SQUERY
|
530
530
|
# to a service which does not exist.
|
531
|
-
#
|
531
|
+
#
|
532
532
|
ERR_NOORIGIN=409
|
533
533
|
# ":No origin specified"
|
534
|
-
#
|
534
|
+
#
|
535
535
|
# - PING or PONG message missing the originator parameter.
|
536
|
-
#
|
536
|
+
#
|
537
537
|
ERR_NORECIPIENT=411
|
538
538
|
# ":No recipient given (<command>)"
|
539
539
|
ERR_NOTEXTTOSEND=412
|
@@ -544,161 +544,161 @@ module Irc
|
|
544
544
|
# "<mask> :Wildcard in toplevel domain"
|
545
545
|
ERR_BADMASK=415
|
546
546
|
# "<mask> :Bad Server/host mask"
|
547
|
-
#
|
547
|
+
#
|
548
548
|
# - 412 - 415 are returned by PRIVMSG to indicate that
|
549
549
|
# the message wasn't delivered for some reason.
|
550
550
|
# ERR_NOTOPLEVEL and ERR_WILDTOPLEVEL are errors that
|
551
551
|
# are returned when an invalid use of
|
552
552
|
# "PRIVMSG $<server>" or "PRIVMSG #<host>" is attempted.
|
553
|
-
#
|
553
|
+
#
|
554
554
|
ERR_UNKNOWNCOMMAND=421
|
555
555
|
# "<command> :Unknown command"
|
556
|
-
#
|
556
|
+
#
|
557
557
|
# - Returned to a registered client to indicate that the
|
558
558
|
# command sent is unknown by the server.
|
559
|
-
#
|
559
|
+
#
|
560
560
|
ERR_NOMOTD=422
|
561
561
|
# ":MOTD File is missing"
|
562
|
-
#
|
562
|
+
#
|
563
563
|
# - Server's MOTD file could not be opened by the server.
|
564
|
-
#
|
564
|
+
#
|
565
565
|
ERR_NOADMININFO=423
|
566
566
|
# "<server> :No administrative info available"
|
567
|
-
#
|
567
|
+
#
|
568
568
|
# - Returned by a server in response to an ADMIN message
|
569
569
|
# when there is an error in finding the appropriate
|
570
570
|
# information.
|
571
|
-
#
|
571
|
+
#
|
572
572
|
ERR_FILEERROR=424
|
573
573
|
# ":File error doing <file op> on <file>"
|
574
|
-
#
|
574
|
+
#
|
575
575
|
# - Generic error message used to report a failed file
|
576
576
|
# operation during the processing of a message.
|
577
|
-
#
|
577
|
+
#
|
578
578
|
ERR_NONICKNAMEGIVEN=431
|
579
579
|
# ":No nickname given"
|
580
|
-
#
|
580
|
+
#
|
581
581
|
# - Returned when a nickname parameter expected for a
|
582
582
|
# command and isn't found.
|
583
|
-
#
|
583
|
+
#
|
584
584
|
ERR_ERRONEUSNICKNAME=432
|
585
585
|
# "<nick> :Erroneous nickname"
|
586
|
-
#
|
586
|
+
#
|
587
587
|
# - Returned after receiving a NICK message which contains
|
588
588
|
# characters which do not fall in the defined set. See
|
589
589
|
# section 2.3.1 for details on valid nicknames.
|
590
|
-
#
|
590
|
+
#
|
591
591
|
ERR_NICKNAMEINUSE=433
|
592
592
|
# "<nick> :Nickname is already in use"
|
593
|
-
#
|
593
|
+
#
|
594
594
|
# - Returned when a NICK message is processed that results
|
595
595
|
# in an attempt to change to a currently existing
|
596
596
|
# nickname.
|
597
|
-
#
|
597
|
+
#
|
598
598
|
ERR_NICKCOLLISION=436
|
599
599
|
# "<nick> :Nickname collision KILL from <user>@<host>"
|
600
|
-
#
|
600
|
+
#
|
601
601
|
# - Returned by a server to a client when it detects a
|
602
602
|
# nickname collision (registered of a NICK that
|
603
603
|
# already exists by another server).
|
604
|
-
#
|
604
|
+
#
|
605
605
|
ERR_UNAVAILRESOURCE=437
|
606
606
|
# "<nick/channel> :Nick/channel is temporarily unavailable"
|
607
|
-
#
|
607
|
+
#
|
608
608
|
# - Returned by a server to a user trying to join a channel
|
609
609
|
# currently blocked by the channel delay mechanism.
|
610
|
-
#
|
610
|
+
#
|
611
611
|
# - Returned by a server to a user trying to change nickname
|
612
612
|
# when the desired nickname is blocked by the nick delay
|
613
613
|
# mechanism.
|
614
|
-
#
|
614
|
+
#
|
615
615
|
ERR_USERNOTINCHANNEL=441
|
616
616
|
# "<nick> <channel> :They aren't on that channel"
|
617
|
-
#
|
617
|
+
#
|
618
618
|
# - Returned by the server to indicate that the target
|
619
619
|
# user of the command is not on the given channel.
|
620
|
-
#
|
620
|
+
#
|
621
621
|
ERR_NOTONCHANNEL=442
|
622
622
|
# "<channel> :You're not on that channel"
|
623
|
-
#
|
623
|
+
#
|
624
624
|
# - Returned by the server whenever a client tries to
|
625
625
|
# perform a channel affecting command for which the
|
626
626
|
# client isn't a member.
|
627
|
-
#
|
627
|
+
#
|
628
628
|
ERR_USERONCHANNEL=443
|
629
629
|
# "<user> <channel> :is already on channel"
|
630
|
-
#
|
630
|
+
#
|
631
631
|
# - Returned when a client tries to invite a user to a
|
632
632
|
# channel they are already on.
|
633
|
-
#
|
633
|
+
#
|
634
634
|
ERR_NOLOGIN=444
|
635
635
|
# "<user> :User not logged in"
|
636
|
-
#
|
636
|
+
#
|
637
637
|
# - Returned by the summon after a SUMMON command for a
|
638
638
|
# user was unable to be performed since they were not
|
639
639
|
# logged in.
|
640
|
-
#
|
641
|
-
#
|
640
|
+
#
|
641
|
+
#
|
642
642
|
ERR_SUMMONDISABLED=445
|
643
643
|
# ":SUMMON has been disabled"
|
644
|
-
#
|
644
|
+
#
|
645
645
|
# - Returned as a response to the SUMMON command. MUST be
|
646
646
|
# returned by any server which doesn't implement it.
|
647
|
-
#
|
647
|
+
#
|
648
648
|
ERR_USERSDISABLED=446
|
649
649
|
# ":USERS has been disabled"
|
650
|
-
#
|
650
|
+
#
|
651
651
|
# - Returned as a response to the USERS command. MUST be
|
652
652
|
# returned by any server which does not implement it.
|
653
|
-
#
|
653
|
+
#
|
654
654
|
ERR_NOTREGISTERED=451
|
655
655
|
# ":You have not registered"
|
656
|
-
#
|
656
|
+
#
|
657
657
|
# - Returned by the server to indicate that the client
|
658
658
|
# MUST be registered before the server will allow it
|
659
659
|
# to be parsed in detail.
|
660
|
-
#
|
660
|
+
#
|
661
661
|
ERR_NEEDMOREPARAMS=461
|
662
662
|
# "<command> :Not enough parameters"
|
663
|
-
#
|
663
|
+
#
|
664
664
|
# - Returned by the server by numerous commands to
|
665
665
|
# indicate to the client that it didn't supply enough
|
666
666
|
# parameters.
|
667
|
-
#
|
667
|
+
#
|
668
668
|
ERR_ALREADYREGISTRED=462
|
669
669
|
# ":Unauthorized command (already registered)"
|
670
|
-
#
|
670
|
+
#
|
671
671
|
# - Returned by the server to any link which tries to
|
672
672
|
# change part of the registered details (such as
|
673
673
|
# password or user details from second USER message).
|
674
|
-
#
|
674
|
+
#
|
675
675
|
ERR_NOPERMFORHOST=463
|
676
676
|
# ":Your host isn't among the privileged"
|
677
|
-
#
|
677
|
+
#
|
678
678
|
# - Returned to a client which attempts to register with
|
679
679
|
# a server which does not been setup to allow
|
680
680
|
# connections from the host the attempted connection
|
681
681
|
# is tried.
|
682
|
-
#
|
682
|
+
#
|
683
683
|
ERR_PASSWDMISMATCH=464
|
684
684
|
# ":Password incorrect"
|
685
|
-
#
|
685
|
+
#
|
686
686
|
# - Returned to indicate a failed attempt at registering
|
687
687
|
# a connection for which a password was required and
|
688
688
|
# was either not given or incorrect.
|
689
|
-
#
|
689
|
+
#
|
690
690
|
ERR_YOUREBANNEDCREEP=465
|
691
691
|
# ":You are banned from this server"
|
692
|
-
#
|
692
|
+
#
|
693
693
|
# - Returned after an attempt to connect and register
|
694
694
|
# yourself with a server which has been setup to
|
695
695
|
# explicitly deny connections to you.
|
696
|
-
#
|
696
|
+
#
|
697
697
|
ERR_YOUWILLBEBANNED=466
|
698
|
-
#
|
698
|
+
#
|
699
699
|
# - Sent by a server to a user to inform that access to the
|
700
700
|
# server will soon be denied.
|
701
|
-
#
|
701
|
+
#
|
702
702
|
ERR_KEYSET=467
|
703
703
|
# "<channel> :Channel key already set"
|
704
704
|
ERR_CHANNELISFULL=471
|
@@ -717,99 +717,100 @@ module Irc
|
|
717
717
|
# "<channel> :Channel doesn't support modes"
|
718
718
|
ERR_BANLISTFULL=478
|
719
719
|
# "<channel> <char> :Channel list is full"
|
720
|
-
#
|
720
|
+
#
|
721
721
|
ERR_NOPRIVILEGES=481
|
722
722
|
# ":Permission Denied- You're not an IRC operator"
|
723
|
-
#
|
723
|
+
#
|
724
724
|
# - Any command requiring operator privileges to operate
|
725
725
|
# MUST return this error to indicate the attempt was
|
726
726
|
# unsuccessful.
|
727
|
-
#
|
727
|
+
#
|
728
728
|
ERR_CHANOPRIVSNEEDED=482
|
729
729
|
# "<channel> :You're not channel operator"
|
730
|
-
#
|
730
|
+
#
|
731
731
|
# - Any command requiring 'chanop' privileges (such as
|
732
732
|
# MODE messages) MUST return this error if the client
|
733
733
|
# making the attempt is not a chanop on the specified
|
734
734
|
# channel.
|
735
|
-
#
|
736
|
-
#
|
735
|
+
#
|
736
|
+
#
|
737
737
|
ERR_CANTKILLSERVER=483
|
738
738
|
# ":You can't kill a server!"
|
739
|
-
#
|
739
|
+
#
|
740
740
|
# - Any attempts to use the KILL command on a server
|
741
741
|
# are to be refused and this error returned directly
|
742
742
|
# to the client.
|
743
|
-
#
|
743
|
+
#
|
744
744
|
ERR_RESTRICTED=484
|
745
745
|
# ":Your connection is restricted!"
|
746
|
-
#
|
746
|
+
#
|
747
747
|
# - Sent by the server to a user upon connection to indicate
|
748
748
|
# the restricted nature of the connection (user mode "+r").
|
749
|
-
#
|
749
|
+
#
|
750
750
|
ERR_UNIQOPPRIVSNEEDED=485
|
751
751
|
# ":You're not the original channel operator"
|
752
|
-
#
|
752
|
+
#
|
753
753
|
# - Any MODE requiring "channel creator" privileges MUST
|
754
754
|
# return this error if the client making the attempt is not
|
755
755
|
# a chanop on the specified channel.
|
756
|
-
#
|
756
|
+
#
|
757
757
|
ERR_NOOPERHOST=491
|
758
758
|
# ":No O-lines for your host"
|
759
|
-
#
|
759
|
+
#
|
760
760
|
# - If a client sends an OPER message and the server has
|
761
761
|
# not been configured to allow connections from the
|
762
762
|
# client's host as an operator, this error MUST be
|
763
763
|
# returned.
|
764
|
-
#
|
764
|
+
#
|
765
765
|
ERR_UMODEUNKNOWNFLAG=501
|
766
766
|
# ":Unknown MODE flag"
|
767
|
-
#
|
767
|
+
#
|
768
768
|
# - Returned by the server to indicate that a MODE
|
769
769
|
# message was sent with a nickname parameter and that
|
770
770
|
# the a mode flag sent was not recognized.
|
771
|
-
#
|
771
|
+
#
|
772
772
|
ERR_USERSDONTMATCH=502
|
773
773
|
# ":Cannot change mode for other users"
|
774
|
-
#
|
774
|
+
#
|
775
775
|
# - Error sent to any user trying to view or change the
|
776
776
|
# user mode for a user other than themselves.
|
777
|
-
#
|
777
|
+
#
|
778
778
|
# 5.3 Reserved numerics
|
779
|
-
#
|
779
|
+
#
|
780
780
|
# These numerics are not described above since they fall into one of
|
781
781
|
# the following categories:
|
782
|
-
#
|
782
|
+
#
|
783
783
|
# 1. no longer in use;
|
784
|
-
#
|
784
|
+
#
|
785
785
|
# 2. reserved for future planned use;
|
786
|
-
#
|
786
|
+
#
|
787
787
|
# 3. in current use but are part of a non-generic 'feature' of
|
788
788
|
# the current IRC server.
|
789
|
-
RPL_SERVICEINFO=231
|
789
|
+
RPL_SERVICEINFO=231
|
790
790
|
RPL_ENDOFSERVICES=232
|
791
791
|
RPL_SERVICE=233
|
792
|
-
RPL_NONE=300
|
792
|
+
RPL_NONE=300
|
793
793
|
RPL_WHOISCHANOP=316
|
794
|
-
RPL_KILLDONE=361
|
794
|
+
RPL_KILLDONE=361
|
795
795
|
RPL_CLOSING=362
|
796
|
-
RPL_CLOSEEND=363
|
796
|
+
RPL_CLOSEEND=363
|
797
797
|
RPL_INFOSTART=373
|
798
798
|
RPL_MYPORTIS=384
|
799
|
-
RPL_STATSCLINE=213
|
799
|
+
RPL_STATSCLINE=213
|
800
800
|
RPL_STATSNLINE=214
|
801
|
-
RPL_STATSILINE=215
|
801
|
+
RPL_STATSILINE=215
|
802
802
|
RPL_STATSKLINE=216
|
803
803
|
RPL_STATSQLINE=217
|
804
804
|
RPL_STATSYLINE=218
|
805
|
-
RPL_STATSVLINE=240
|
805
|
+
RPL_STATSVLINE=240
|
806
806
|
RPL_STATSLLINE=241
|
807
|
-
RPL_STATSHLINE=244
|
807
|
+
RPL_STATSHLINE=244
|
808
808
|
RPL_STATSSLINE=244
|
809
|
-
RPL_STATSPING=246
|
809
|
+
RPL_STATSPING=246
|
810
810
|
RPL_STATSBLINE=247
|
811
811
|
ERR_NOSERVICEHOST=492
|
812
|
-
|
812
|
+
RPL_DATASTR=290
|
813
|
+
|
813
814
|
# implements RFC 2812 and prior IRC RFCs.
|
814
815
|
# clients register handler proc{}s for different server events and IrcClient
|
815
816
|
# handles dispatch
|
@@ -819,7 +820,7 @@ module Irc
|
|
819
820
|
@handlers = Hash.new
|
820
821
|
@users = Array.new
|
821
822
|
end
|
822
|
-
|
823
|
+
|
823
824
|
# key:: server event to handle
|
824
825
|
# value:: proc object called when event occurs
|
825
826
|
# set a handler for a server event
|
@@ -854,26 +855,26 @@ module Irc
|
|
854
855
|
def []=(key, value)
|
855
856
|
@handlers[key] = value
|
856
857
|
end
|
857
|
-
|
858
|
+
|
858
859
|
# key:: event name
|
859
860
|
# remove a handler for a server event
|
860
861
|
def deletehandler(key)
|
861
862
|
@handlers.delete(key)
|
862
863
|
end
|
863
|
-
|
864
|
+
|
864
865
|
# takes a server string, checks for PING, PRIVMSG, NOTIFY, etc, and parses
|
865
866
|
# numeric server replies, calling the appropriate handler for each, and
|
866
867
|
# sending it a hash containing the data from the server
|
867
868
|
def process(serverstring)
|
868
869
|
data = Hash.new
|
869
870
|
data[:serverstring] = serverstring
|
870
|
-
|
871
|
+
|
871
872
|
unless serverstring =~ /^(:(\S+)\s)?(\S+)(\s(.*))?/
|
872
|
-
|
873
|
+
raise "Unparseable Server Message!!!: #{serverstring}"
|
873
874
|
end
|
874
|
-
|
875
|
+
|
875
876
|
prefix, command, params = $2, $3, $5
|
876
|
-
|
877
|
+
|
877
878
|
if prefix != nil
|
878
879
|
data[:source] = prefix
|
879
880
|
if prefix =~ /^(\S+)!(\S+)$/
|
@@ -885,11 +886,14 @@ module Irc
|
|
885
886
|
# split parameters in an array
|
886
887
|
argv = []
|
887
888
|
params.scan(/(?!:)(\S+)|:(.*)/) { argv << ($1 || $2) } if params
|
888
|
-
|
889
|
+
|
889
890
|
case command
|
890
891
|
when 'PING'
|
891
892
|
data[:pingid] = argv[0]
|
892
893
|
handle(:ping, data)
|
894
|
+
when 'PONG'
|
895
|
+
data[:pingid] = argv[0]
|
896
|
+
handle(:pong, data)
|
893
897
|
when /^(\d+)$/ # numeric server message
|
894
898
|
num=command.to_i
|
895
899
|
case num
|
@@ -952,10 +956,14 @@ module Irc
|
|
952
956
|
# TOPICLEN=450 KICKLEN=450 CHANNELLEN=30 KEYLEN=23 CHANTYPES=#
|
953
957
|
# PREFIX=(ov)@+ CASEMAPPING=ascii CAPAB IRCD=dancer :are available
|
954
958
|
# on this server"
|
955
|
-
#
|
956
|
-
argv.each {|a|
|
959
|
+
#
|
960
|
+
argv[0,argv.length-1].each {|a|
|
957
961
|
if a =~ /^(.*)=(.*)$/
|
958
962
|
data[$1.downcase.to_sym] = $2
|
963
|
+
debug "server's #{$1.downcase.to_sym} is #{$2}"
|
964
|
+
else
|
965
|
+
data[a.downcase.to_sym] = true
|
966
|
+
debug "server supports #{a.downcase.to_sym}"
|
959
967
|
end
|
960
968
|
}
|
961
969
|
handle(:isupport, data)
|
@@ -1027,6 +1035,9 @@ module Irc
|
|
1027
1035
|
when RPL_ENDOFMOTD
|
1028
1036
|
data[:motd] = @motd
|
1029
1037
|
handle(:motd, data)
|
1038
|
+
when RPL_DATASTR
|
1039
|
+
data[:text] = argv[1]
|
1040
|
+
handle(:datastr, data)
|
1030
1041
|
else
|
1031
1042
|
handle(:unknown, data)
|
1032
1043
|
end
|
@@ -1038,9 +1049,9 @@ module Irc
|
|
1038
1049
|
data[:target] = argv[0]
|
1039
1050
|
data[:message] = argv[1]
|
1040
1051
|
handle(:privmsg, data)
|
1041
|
-
|
1052
|
+
|
1042
1053
|
# Now we split it
|
1043
|
-
if(data[:target] =~ /^
|
1054
|
+
if(data[:target] =~ /^[#&!+].*/)
|
1044
1055
|
handle(:public, data)
|
1045
1056
|
else
|
1046
1057
|
handle(:msg, data)
|
@@ -1091,7 +1102,7 @@ module Irc
|
|
1091
1102
|
end
|
1092
1103
|
|
1093
1104
|
private
|
1094
|
-
|
1105
|
+
|
1095
1106
|
# key:: server event name
|
1096
1107
|
# data:: hash containing data about the event, passed to the proc
|
1097
1108
|
# call client's proc for an event, if they set one as a handler
|