konn-rupircd 0.6.2 → 0.6.3

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.
Files changed (5) hide show
  1. data/VERSION +1 -1
  2. data/ircd.rb +1 -1
  3. data/lib/rupircd/server.rb +499 -427
  4. data/rupircd.gemspec +2 -2
  5. metadata +2 -2
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.6.2
1
+ 0.6.3
data/ircd.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  =begin
2
2
  = rupircd -- Ruby Pseudo IRC Deamon
3
3
 
4
- ver 0.5b1 2007-05-18T22:30:56+09:00
4
+ ver 0.6.3 2009-08-12T22:52:27+09:00
5
5
 
6
6
  Copyright (c) 2007 konn <banzaida_at_jcom_dot_home_dot_ne_dot_jp>
7
7
 
@@ -22,6 +22,8 @@ require 'rupircd/charcode'
22
22
  require 'rupircd/conf'
23
23
 
24
24
  module IRCd
25
+ VERSION = "0.6.2"
26
+
25
27
  class IRCServer < WEBrick::GenericServer
26
28
  include Utils
27
29
  include Reply
@@ -29,6 +31,19 @@ class IRCServer < WEBrick::GenericServer
29
31
 
30
32
  include MonitorMixin
31
33
 
34
+ class <<self
35
+ def define_oper_command(mtd, &pr)
36
+ define_method(mtd){|usr, param|
37
+ if usr.operator || usr.local_operator
38
+ instance_eval(&pr)
39
+ else
40
+ send_server_message(usr, "481", "Permission Denied - You're not an IRC operator")
41
+ end
42
+ }
43
+ end
44
+ end
45
+
46
+
32
47
  def initialize(fconf, *args)
33
48
  @_init_args = [fconf, *args]
34
49
  @fconf = fconf
@@ -144,6 +159,32 @@ class IRCServer < WEBrick::GenericServer
144
159
  user.socket.close unless user.socket.closed?
145
160
  end
146
161
 
162
+ def recv_message(user, line)
163
+ line.chomp!
164
+ return if line.empty?
165
+ begin
166
+ msg = Message.parse(line)
167
+ params = msg.params
168
+ @used[msg.command.upcase][0] += 1
169
+ mtd = "on_" + msg.command.downcase
170
+ if respond_to?(mtd)
171
+ __send__(mtd, user, params)
172
+ else
173
+ raise UnknownCommand.new(msg.command)
174
+ end
175
+ rescue NotEnoughParameter => e
176
+ send_server_message(user, "461", msg.command, "Not enough parameters")
177
+ rescue UnknownCommand => e
178
+ send_server_message(user, "421", e.cmd, "Unknown command")
179
+ rescue
180
+ puts $!, $@
181
+ end
182
+ end
183
+
184
+ def on_motd(user, params)
185
+ print_motd(user)
186
+ end
187
+
147
188
  def print_motd(user)
148
189
  send_server_message(user, "375", "- #{config[:ServerName]} Message of the day - ")
149
190
  config[:Motd].each_line{|line|
@@ -153,463 +194,494 @@ class IRCServer < WEBrick::GenericServer
153
194
  send_server_message(user, "376", "End of MOTD command")
154
195
  end
155
196
 
156
- def oper_proc(usr, &pr)
157
- if usr.operator || usr.local_operator
158
- pr.call(usr)
197
+ def on_lusers(user, params)
198
+ send_server_message(user, "251", "There are #{@users.size} users and 0 services on 1 servers")
199
+ unless @operators.empty?
200
+ send_server_message(user, "252", @operators.size, "operator(s) online")
201
+ end
202
+ unless @channels.empty?
203
+ send_server_message(user, "254", @channels.size, "channels formed")
204
+ end
205
+ send_server_message(user, "255", "I have #{@users.size} clients and 0 servers")
206
+ end
207
+
208
+ def on_oper(user, params)
209
+ raise NotEnoughParameter if params.size < 2
210
+ nick, pass = params
211
+ unless opdic = config.fetch(:Opers,{}).find{|k, v| k =~ nick}
212
+ send_server_message(user, "491", "No O-lines for your host")
213
+ return
214
+ end
215
+ if Digest::MD5.hexdigest(pass) == opdic[1]
216
+ user.operator = true
217
+ user.local_operator = true
218
+ @operators.push user
219
+ send_server_message(user, "381", "You are now an IRC operator")
159
220
  else
160
- send_server_message(usr, "481", "Permission Denied - You're not an IRC operator")
221
+ send_server_message(user, "464", "Password incorrect")
161
222
  end
162
223
  end
163
224
 
164
- def recv_message(user, line)
165
- line.chomp!
166
- return if line.empty?
167
- begin
168
- msg = Message.parse(line)
169
- params = msg.params
170
- @used[msg.command.upcase][0] += 1
171
- case msg
172
- when MOTD
173
- print_motd(user)
174
- when LUSERS
175
- send_server_message(user, "251", "There are #{@users.size} users and 0 services on 1 servers")
176
- unless @operators.empty?
177
- send_server_message(user, "252", @operators.size, "operator(s) online")
178
- end
179
- unless @channels.empty?
180
- send_server_message(user, "254", @channels.size, "channels formed")
181
- end
182
- send_server_message(user, "255", "I have #{@users.size} clients and 0 servers")
183
- when OPER
184
- raise NotEnoughParameter if params.size < 2
185
- nick, pass = params
186
- unless opdic = config.fetch(:Opers,{}).find{|k, v| k =~ nick}
187
- send_server_message(user, "491", "No O-lines for your host")
188
- return
189
- end
190
- if Digest::MD5.hexdigest(pass) == opdic[1]
191
- user.operator = true
192
- user.local_operator = true
193
- @operators.push user
194
- send_server_message(user, "381", "You are now an IRC operator")
195
- else
196
- send_server_message(user, "464", "Password incorrect")
197
- end
198
- when CLOSE
199
- @users.synchronize do
200
- oper_proc(user) do
201
- @users.each{|s| unregister(s) }
202
- end
203
- end
204
- when DIE
205
- oper_proc(user) do
206
- shutdown
207
- exit!
208
- end
209
- when REHASH
210
- oper_proc(user) do |usr|
211
- cnf = @fconf.load
212
- if Hash === cnf
213
- config.replace(cnf)
214
- send_server_message(usr, "382", "#{@fconf.path} :Rehashing")
215
- else
216
- raise "Invalid Conf file"
217
- end
218
- end
219
- when RESTART
220
- oper_proc(user) do |usr|
221
- @users.each{|s| unregister(s) }
222
- init
223
- end
224
- when VERSION
225
- send_server_message(user, "351", "rupircd-01b.0 #{config[:ServerName]} :Ruby Pseudo IRCD 0.1b")
226
- when STATS
227
- if params.empty?
228
- raise NotEnoughParameter
229
- return
230
- end
231
- c = params[0][0]
232
- case c
233
- when ?l
234
-
235
- when ?m
236
- @used.each_pair{|cmd, val|
237
- send_server_message(user, "212", cmd, val[0])
238
- }
239
- when ?o
240
-
241
- when ?u
242
- vs = Time.now.to_i - @started.to_i
243
- days = vs / (3600*24)
244
- vs -= days * 3600 * 24
245
- hours = vs / 3600
246
- vs -= hours * 3600
247
- minutes = vs/60
248
- vs -= minutes * 60
249
- send_server_message(user, "242", format("Server Up %d days %d:%02d:%02d",days,hours,minutes,vs))
250
- end
251
- send_server_message(user, "219", c.chr, "End of STATS report")
252
- when JOIN
253
- if params[0] == "0"
254
- user.joined_channels.each{|ch|
255
- channel(ch).part(user, "")
256
- }
257
- user.joined_channels = []
258
- else
259
- chs = params[0].split(",")
260
- keys = msg.params[1].split(",") if params.size >= 2
261
- keys ||= []
262
- chs.each_with_index{|ch, i|
263
- unless channame?(ch)
264
- send_server_message(user, "403", ch, "No such channel")
265
- next
266
- end
267
-
268
- chclass = case ch
269
- when /^\+/
270
- NoModeChannel
271
- when /^#/
272
- Channel
273
- when /^!#/
274
- SafeChannel
275
- end
276
- unless @channels.has_key?(ch.downcase)
277
- set_channel(ch, chclass.new(self, user, ch) )
278
- handle_reply(user, channel(ch).join(user, keys[i]))
279
- else
280
- rpl = channel(ch).join(user, keys[i])
281
- handle_reply(user, rpl)
282
- end
283
- }
284
- end
285
- when PART
286
- ch, msg = params
287
- msg ||= ""
288
- chs = ch.split(",")
289
- chs.each{|chname|
290
- ch = channel(chname)
291
- ch.part(user, msg)
292
- if ch.members.empty?
293
- @channels.delete(chname.downcase)
294
- end
295
- user.joined_channels.delete(ch)
296
- }
297
- when PING
298
- send_client_message(user, config[:ServerName], PONG, config[:ServerName], *params)
299
- when INFO
300
- config[:Info].each_line{|line|
301
- line.chomp!
302
- send_server_message(user, "371", line)
303
- }
304
- send_server_message(user, "374", "End of INFO list")
305
- when LINKS
306
- send_server_message(user, "365")
307
- when TIME
308
- send_server_message(user, "391", config[:ServerName], Time.now.to_s)
309
- when PONG
310
- @ping_threads[user].kill
311
- start_ping(user)
312
- when INVITE
313
- if params.size < 2
314
- raise NotEnoughParameter
315
- else
316
- who, to = params
317
- if target = @users.find{|v| v.nick == who}
318
- if target.away?
319
- msg = target.away
320
- send_server_message(user, "301", who, msg)
321
- return
322
- end
323
- if ch = channel(to)
324
- handle_reply(user, ch.invite(user, target))
325
- else
326
- send_server_message(user, "401", who, "No such nick/channel")
327
- end
328
- else
329
- send_server_message(user, "401", who, "No such nick/channel")
330
- end
331
- end
332
- when LIST
333
- if params.empty?
334
- chs = @channels.find_all{|k, v| v.visible?(nil)}
335
- chs.each{|k, v|
336
- case (tpc = v.get_topic(user, true))[0]
337
- when "331"
338
- tpc = ""
339
- else
340
- tpc = tpc[-1]
341
- end
342
- send_server_message(user, "322", k, v.members.size.to_s, tpc)
343
- }
344
- else
345
- chs = params[0].split(",").find_all{|name| channel(name) && channel(n).visible?(user)}
346
- chs.each{|k|
347
- v = channel(k)
348
- uss = v.members.find_all{|m| !m.invisible}
349
- case (tpc = v.get_topic(user, true))[0]
350
- when "331"
351
- tpc = ""
352
- else
353
- tpc = tpc[-1]
354
- end
355
- send_server_message(user, "322", k, v.members.size.to_s, tpc)
356
- }
357
- end
358
- send_server_message(user, "323", "End of LIST")
359
- when TOPIC
360
- chn, topic = params
361
- unless ch = channel(chn)
362
- send_server_message(user, "403", chn, "No such channel")
363
- return
364
- end
365
- if params.size < 1
366
- raise NotEnoughParameter
367
- elsif params.size == 1
368
- send_server_message(user, *ch.get_topic(user))
369
- else
370
- handle_reply(user, ch.set_topic(user, topic))
371
- end
372
- when PRIVMSG
373
- if params.size < 2
374
- raise NotEnoughParameter
225
+ define_oper_command :on_close do |user, params|
226
+ @users.synchronize do
227
+ @users.each{|s| unregister(s) }
228
+ end
229
+ end
230
+
231
+ define_oper_command :on_die do |usr, params|
232
+ shutdown
233
+ exit!
234
+ end
235
+
236
+ define_oper_command :on_rehash do |usr, params|
237
+ cnf = @fconf.load
238
+
239
+ if Hash === cnf
240
+ config.replace(cnf)
241
+ send_server_message(usr, "382", "#{@fconf.path} :Rehashing")
242
+ else
243
+ raise "Invalid Conf file"
244
+ end
245
+ end
246
+
247
+ define_oper_command :on_restart do |usr, params|
248
+ @users.each{|s| unregister(s) }
249
+ init
250
+ end
251
+
252
+ def on_version(user, params)
253
+ send_server_message(user, "351", "rupircd-#{VERSION} #{config[:ServerName]} :Ruby Pseudo IRCD 0.1b")
254
+ end
255
+
256
+ def on_stats(user, params)
257
+ if params.empty?
258
+ raise NotEnoughParameter
259
+ return
260
+ end
261
+ c = params[0][0]
262
+ case c
263
+ when ?l
264
+
265
+ when ?m
266
+ @used.each_pair{|cmd, val|
267
+ send_server_message(user, "212", cmd, val[0])
268
+ }
269
+ when ?o
270
+
271
+ when ?u
272
+ vs = Time.now.to_i - @started.to_i
273
+ days = vs / (3600*24)
274
+ vs -= days * 3600 * 24
275
+ hours = vs / 3600
276
+ vs -= hours * 3600
277
+ minutes = vs/60
278
+ vs -= minutes * 60
279
+ send_server_message(user, "242", format("Server Up %d days %d:%02d:%02d",days,hours,minutes,vs))
280
+ end
281
+ send_server_message(user, "219", c.chr, "End of STATS report")
282
+ end
283
+
284
+ def on_join(user, params)
285
+ if params[0] == "0"
286
+ user.joined_channels.each{|ch|
287
+ channel(ch).part(user, "")
288
+ }
289
+ user.joined_channels = []
290
+ else
291
+ chs = params[0].split(",")
292
+ keys = params[1].split(",") if params.size >= 2
293
+ keys ||= []
294
+ chs.each_with_index{|ch, i|
295
+ unless channame?(ch)
296
+ send_server_message(user, "403", ch, "No such channel")
297
+ next
375
298
  end
376
- to, msg = params
377
- if ch = channel(to)
378
- if msg.empty?
379
- send_server_message(user, "412", "No text to send")
380
- else
381
- handle_reply(user, ch.privmsg(user, msg))
382
- end
383
- elsif who = @users.find{|v| v.nick == to}
384
- if who.away?
385
- away = who.away
386
- send_server_message(user, "301", to, away)
387
- else
388
- send_client_message(who, user, PRIVMSG, who.nick, msg)
389
- end
390
- else
391
- send_server_message(user, "401", to, "No such nick/channel")
299
+
300
+ chclass = case ch
301
+ when /^\+/
302
+ NoModeChannel
303
+ when /^#/
304
+ Channel
305
+ when /^!#/
306
+ SafeChannel
392
307
  end
393
- when NAMES
394
- if params.size < 1
395
- raise NotEnoughParameter
308
+ unless @channels.has_key?(ch.downcase)
309
+ set_channel(ch, chclass.new(self, user, ch) )
310
+ handle_reply(user, channel(ch).join(user, keys[i]))
396
311
  else
397
- chs = params[0].split(",")
398
- chs.each{|ch|
399
- handle_reply(user, channel(ch).names(user))
400
- }
312
+ rpl = channel(ch).join(user, keys[i])
313
+ handle_reply(user, rpl)
401
314
  end
402
- when NOTICE
403
- if params.size < 2
404
- raise NotEnoughParameter
315
+ }
316
+ end
317
+ end
318
+
319
+ def on_part(user, params)
320
+ ch, msg = params
321
+ msg ||= ""
322
+ chs = ch.split(",")
323
+ chs.each{|chname|
324
+ ch = channel(chname)
325
+ ch.part(user, msg)
326
+ if ch.members.empty?
327
+ @channels.delete(chname.downcase)
328
+ end
329
+ user.joined_channels.delete(ch)
330
+ }
331
+ end
332
+
333
+ def on_ping(user, params)
334
+ send_client_message(user, config[:ServerName], PONG, config[:ServerName], *params)
335
+ end
336
+
337
+ def on_info(user, params)
338
+ config[:Info].each_line{|line|
339
+ line.chomp!
340
+ send_server_message(user, "371", line)
341
+ }
342
+ send_server_message(user, "374", "End of INFO list")
343
+ end
344
+
345
+ def on_links(user, params)
346
+ send_server_message(user, "365")
347
+ end
348
+
349
+ def on_time(user, params)
350
+ send_server_message(user, "391", config[:ServerName], Time.now.to_s)
351
+ end
352
+
353
+ def on_pong(user, params)
354
+ @ping_threads[user].kill
355
+ start_ping(user)
356
+ end
357
+
358
+ def on_invite(user, params)
359
+ if params.size < 2
360
+ raise NotEnoughParameter
361
+ else
362
+ who, to = params
363
+ if target = @users.find{|v| v.nick == who}
364
+ if target.away?
365
+ msg = target.away
366
+ send_server_message(user, "301", who, msg)
405
367
  return
406
368
  end
407
- to, msg = params
408
369
  if ch = channel(to)
409
- if msg.empty?
410
- send_server_message(user, "412", "No text to send")
411
- else
412
- handle_reply(user, ch.notice(user, msg))
413
- end
414
- elsif who = @users.find{|v| v.nick == to}
415
- send_client_message(who, user, NOTICE, user.nick, msg)
370
+ handle_reply(user, ch.invite(user, target))
416
371
  else
417
- send_server_message(user, "401", to, "No such nick/channel")
372
+ send_server_message(user, "401", who, "No such nick/channel")
418
373
  end
419
- when AWAY
420
- if params.empty? || params[0].empty?
421
- user.away = ""
422
- send_server_message(user, "305", "You are no longer marked as being away")
374
+ else
375
+ send_server_message(user, "401", who, "No such nick/channel")
376
+ end
377
+ end
378
+ end
379
+
380
+ def on_list(user, params)
381
+ if params.empty?
382
+ chs = @channels.find_all{|k, v| v.visible?(nil)}
383
+ chs.each{|k, v|
384
+ case (tpc = v.get_topic(user, true))[0]
385
+ when "331"
386
+ tpc = ""
423
387
  else
424
- user.away = params.shift
425
- send_server_message(user, "306", "You have been marked as being away")
426
- end
427
- when MODE
428
- if params.size < 1
429
- raise NotEnoughParameter
430
- return
388
+ tpc = tpc[-1]
431
389
  end
432
- to = params.shift
433
- if ch = channel(to)
434
- handle_reply(user, ch.handle_mode(user, params))
435
- elsif who = @users.find{|v| v.nick == to}
436
- if who == user
437
- if params.empty?
438
- send_server_message(user, "221", who.get_mode_flags)
439
- else
440
- rls = who.set_flags(params[0])
441
- send_client_message(user, user, MODE, user.nick, rls.join(" "))
442
- end
443
- else
444
- send_server_message(user, "502", "Cannot change mode for other users")
445
- end
390
+ send_server_message(user, "322", k, v.members.size.to_s, tpc)
391
+ }
392
+ else
393
+ chs = params[0].split(",").find_all{|name| channel(name) && channel(n).visible?(user)}
394
+ chs.each{|k|
395
+ v = channel(k)
396
+ uss = v.members.find_all{|m| !m.invisible}
397
+ case (tpc = v.get_topic(user, true))[0]
398
+ when "331"
399
+ tpc = ""
446
400
  else
447
- send_server_message(user, "401", to, "No such nick/channel")
401
+ tpc = tpc[-1]
448
402
  end
449
- when NICK
403
+ send_server_message(user, "322", k, v.members.size.to_s, tpc)
404
+ }
405
+ end
406
+ send_server_message(user, "323", "End of LIST")
407
+ end
408
+
409
+ def on_topic(user, params)
410
+ chn, topic = params
411
+ unless ch = channel(chn)
412
+ send_server_message(user, "403", chn, "No such channel")
413
+ return
414
+ end
415
+ if params.size < 1
416
+ raise NotEnoughParameter
417
+ elsif params.size == 1
418
+ send_server_message(user, *ch.get_topic(user))
419
+ else
420
+ handle_reply(user, ch.set_topic(user, topic))
421
+ end
422
+ end
423
+
424
+ def on_privmsg(user, params)
425
+ if params.size < 2
426
+ raise NotEnoughParameter
427
+ end
428
+ to, msg = params
429
+ if ch = channel(to)
430
+ if msg.empty?
431
+ send_server_message(user, "412", "No text to send")
432
+ else
433
+ handle_reply(user, ch.privmsg(user, msg))
434
+ end
435
+ elsif who = @users.find{|v| v.nick == to}
436
+ if who.away?
437
+ away = who.away
438
+ send_server_message(user, "301", to, away)
439
+ else
440
+ send_client_message(who, user, PRIVMSG, who.nick, msg)
441
+ end
442
+ else
443
+ send_server_message(user, "401", to, "No such nick/channel")
444
+ end
445
+ end
446
+
447
+ def on_names(user, params)
448
+ if params.size < 1
449
+ raise NotEnoughParameter
450
+ else
451
+ chs = params[0].split(",")
452
+ chs.each{|ch|
453
+ handle_reply(user, channel(ch).names(user))
454
+ }
455
+ end
456
+ end
457
+
458
+ def on_notice(user, params)
459
+ if params.size < 2
460
+ raise NotEnoughParameter
461
+ return
462
+ end
463
+ to, msg = params
464
+ if ch = channel(to)
465
+ if msg.empty?
466
+ send_server_message(user, "412", "No text to send")
467
+ else
468
+ handle_reply(user, ch.notice(user, msg))
469
+ end
470
+ elsif who = @users.find{|v| v.nick == to}
471
+ send_client_message(who, user, NOTICE, user.nick, msg)
472
+ else
473
+ send_server_message(user, "401", to, "No such nick/channel")
474
+ end
475
+ end
476
+
477
+ def on_away(user, params)
478
+ if params.empty? || params[0].empty?
479
+ user.away = ""
480
+ send_server_message(user, "305", "You are no longer marked as being away")
481
+ else
482
+ user.away = params.shift
483
+ send_server_message(user, "306", "You have been marked as being away")
484
+ end
485
+ end
486
+
487
+ def on_mode(user, params)
488
+ if params.size < 1
489
+ raise NotEnoughParameter
490
+ return
491
+ end
492
+ to = params.shift
493
+ if ch = channel(to)
494
+ handle_reply(user, ch.handle_mode(user, params))
495
+ elsif who = @users.find{|v| v.nick == to}
496
+ if who == user
450
497
  if params.empty?
451
- send_server_message(user, "431", "No nickname given")
498
+ send_server_message(user, "221", who.get_mode_flags)
452
499
  else
453
- nick = params[0]
454
- if nick == "0"
455
- nick = user.identifier.to_s
456
- elsif !correct_nick?(nick)
457
- send_server_message(user, "432", nick, "Erroneous nickname")
458
- return
459
- end
460
- if us = user_from_nick(nick)
461
- return if us == user
462
- send_server_message(user, "433", nick, "Nickname is already in use")
463
- elsif user.restriction
464
- send_server_message(user, "484", "Your connection is restricted!")
465
- else
466
- send_client_message(user, user, NICK, nick)
467
- sent = []
468
- user.joined_channels.each{|ch|
469
- ch.members.each{|mem|
470
- if !sent.include?(mem) && mem != user
471
- sent << mem
472
- send_client_message(mem, user, NICK, nick)
473
- end
474
- }
475
- }
476
- @old_nicks[nick].unshift user.to_a
477
- user.nick = nick
478
- end
500
+ rls = who.set_flags(params[0])
501
+ send_client_message(user, user, MODE, user.nick, rls.join(" "))
479
502
  end
480
- when USER, PASS
481
- puts_socket(user, ERR_ALREADYREGISTRED.new(config[:ServerName], "462", [user.nick, "Unauthorized command (already registered)"]))
482
- when WHOIS
483
- raise NotEnoughParameter if params.empty?
484
- params[0].split(",").each{|mask|
485
- reg = mask_to_regex(mask)
486
- matched = @users.find_all{|usr| usr.nick =~ reg}
487
- if matched.empty?
488
- send_server_message(user, "401", mask, "No such nick/channel")
489
- else
490
- matched.each{|target|
491
- sc = target.socket
492
- send_server_message(user, "311", target.nick, target.user, target.host, "*", target.real)
493
- send_server_message(user, "312", target.nick, config[:ServerName], "this server.")
494
- send_server_message(user, "313", target.nick, "is an IRC operator") if @operators.include?(target)
495
- chs = []
496
- target.joined_channels.each{|ch|
497
- if ch.visible?(user)
498
- pr = ""
499
- if ch.mode.op?(target)
500
- pr = "@"
501
- else ch.mode.voiced?(target)
502
- pr = "+"
503
- end
504
- chs << pr+ch.name
505
- end
506
- }
507
- send_server_message(user, "319", target.nick, chs.join(" "))
508
- if target.away?
509
- away = target.away
510
- send_server_message(user, "301", target.nick, away)
503
+ else
504
+ send_server_message(user, "502", "Cannot change mode for other users")
505
+ end
506
+ else
507
+ send_server_message(user, "401", to, "No such nick/channel")
508
+ end
509
+ end
510
+
511
+ def on_nick(user, params)
512
+ if params.empty?
513
+ send_server_message(user, "431", "No nickname given")
514
+ else
515
+ nick = params[0]
516
+ if nick == "0"
517
+ nick = user.identifier.to_s
518
+ elsif !correct_nick?(nick)
519
+ send_server_message(user, "432", nick, "Erroneous nickname")
520
+ return
521
+ end
522
+ if us = user_from_nick(nick)
523
+ return if us == user
524
+ send_server_message(user, "433", nick, "Nickname is already in use")
525
+ elsif user.restriction
526
+ send_server_message(user, "484", "Your connection is restricted!")
527
+ else
528
+ send_client_message(user, user, NICK, nick)
529
+ sent = []
530
+ user.joined_channels.each{|ch|
531
+ ch.members.each{|mem|
532
+ if !sent.include?(mem) && mem != user
533
+ sent << mem
534
+ send_client_message(mem, user, NICK, nick)
535
+ end
536
+ }
537
+ }
538
+ @old_nicks[nick].unshift user.to_a
539
+ user.nick = nick
540
+ end
541
+ end
542
+ end
543
+
544
+ def on_user(user, params)
545
+ puts_socket(user, ERR_ALREADYREGISTRED.new(config[:ServerName], "462", [user.nick, "Unauthorized command (already registered)"]))
546
+ end
547
+
548
+ def on_pass(user, params)
549
+ puts_socket(user, ERR_ALREADYREGISTRED.new(config[:ServerName], "462", [user.nick, "Unauthorized command (already registered)"]))
550
+ end
551
+
552
+ def on_whois(user, params)
553
+ raise NotEnoughParameter if params.empty?
554
+ params[0].split(",").each{|mask|
555
+ reg = mask_to_regex(mask)
556
+ matched = @users.find_all{|usr| usr.nick =~ reg}
557
+ if matched.empty?
558
+ send_server_message(user, "401", mask, "No such nick/channel")
559
+ else
560
+ matched.each{|target|
561
+ sc = target.socket
562
+ send_server_message(user, "311", target.nick, target.user, target.host, "*", target.real)
563
+ send_server_message(user, "312", target.nick, config[:ServerName], "this server.")
564
+ send_server_message(user, "313", target.nick, "is an IRC operator") if @operators.include?(target)
565
+ chs = []
566
+ target.joined_channels.each{|ch|
567
+ if ch.visible?(user)
568
+ pr = ""
569
+ if ch.mode.op?(target)
570
+ pr = "@"
571
+ else ch.mode.voiced?(target)
572
+ pr = "+"
511
573
  end
512
- send_server_message(user, "318", target.nick, "End of WHOIS list")
513
- }
574
+ chs << pr+ch.name
575
+ end
576
+ }
577
+ send_server_message(user, "319", target.nick, chs.join(" "))
578
+ if target.away?
579
+ away = target.away
580
+ send_server_message(user, "301", target.nick, away)
514
581
  end
582
+ send_server_message(user, "318", target.nick, "End of WHOIS list")
583
+ }
584
+ end
585
+ }
586
+ end
587
+
588
+ def on_whowas(user, params)
589
+ raise NotEnoughParameter if params.empty?
590
+ params[0].split(",").each{|nick|
591
+ if @users.any?{|us| us.nick == nick}
592
+ send_server_message(user, "312", nick, config[:ServerName], "this server.")
593
+ elsif @old_nicks[nick].empty?
594
+ send_server_message(user, "406", nick, "There was no such nickname")
595
+ else
596
+ @old_nicks[nick].each{|nms|
597
+ send_server_message(user, "314", *nms)
515
598
  }
516
- when WHOWAS
517
- raise NotEnoughParameter if params.empty?
518
- params[0].split(",").each{|nick|
519
- if @users.any?{|us| us.nick == nick}
520
- send_server_message(user, "312", nick, config[:ServerName], "this server.")
521
- elsif @old_nicks[nick].empty?
522
- send_server_message(user, "406", nick, "There was no such nickname")
599
+ end
600
+ send_server_message(user, "369", nick, "End of WHOWAS")
601
+ }
602
+ end
603
+
604
+ def on_who(user, params)
605
+ raise NotEnoughParameter if params.empty?
606
+ mask = mask_to_regex(params[0])
607
+ chs = @channels.find_all{|name, ch| name =~ mask && ch.visible?(user)}
608
+ unless chs.empty?
609
+ chs.each{|name, ch|
610
+ ch.members.each{|usr|
611
+ sym = usr.away? ? "G" : "H"
612
+ sym += @operators.include?(usr) ? "*" : ""
613
+ sym += ch.mode.op?(usr) ? "@" : (ch.mode.voiced?(usr) ? "+" : "")
614
+ send_server_message(user, "352", usr.name, usr.user, usr.host, config[:ServerName], usr.nick, sym, "0 #{real}")
615
+ }
616
+ send_server_message(user, "315", name, "End of WHO list")
617
+ }
618
+ else
619
+ usrs = @users.find_all{|us| us.nick =~ mask || us.user =~ mask || us.host =~ mask}
620
+ usrs.each{|usr|
621
+ send_server_message(user, "352", "*", usr.user, usr.host, config[:ServerName], usr.nick, "H", "0 #{usr.real}")
622
+ send_server_message(user, "315", usr.nick, "End of WHO list")
623
+ }
624
+ end
625
+ end
626
+
627
+ def on_kick(user, params)
628
+ raise NotEnoughParameter if params.size < 2
629
+ chs = params[0].split(",")
630
+ whos = params[1].split(",")
631
+ msg = params[2].to_s
632
+ if chs.size == 1
633
+ if ch = channel(chs[0])
634
+ whos.each{|who|
635
+ if usr = @users.find{|us|us.nick==who}
636
+ handle_reply user, ch.kick(usr, user, msg)
523
637
  else
524
- @old_nicks[nick].each{|nms|
525
- send_server_message(user, "314", *nms)
526
- }
638
+ send_server_message(user, "401", who, "No such nick/channel")
527
639
  end
528
- send_server_message(user, "369", nick, "End of WHOWAS")
529
640
  }
530
- when WHO
531
- raise NotEnoughParameter if params.empty?
532
- mask = mask_to_regex(params[0])
533
- chs = @channels.find_all{|name, ch| name =~ mask && ch.visible?(user)}
534
- unless chs.empty?
535
- chs.each{|name, ch|
536
- ch.members.each{|usr|
537
- sym = usr.away? ? "G" : "H"
538
- sym += @operators.include?(usr) ? "*" : ""
539
- sym += ch.mode.op?(usr) ? "@" : (ch.mode.voiced?(usr) ? "+" : "")
540
- send_server_message(user, "352", usr.name, usr.user, usr.host, config[:ServerName], usr.nick, sym, "0 #{real}")
541
- }
542
- send_server_message(user, "315", name, "End of WHO list")
543
- }
544
- else
545
- usrs = @users.find_all{|us| us.nick =~ mask || us.user =~ mask || us.host =~ mask}
546
- usrs.each{|usr|
547
- send_server_message(user, "352", "*", usr.user, usr.host, config[:ServerName], usr.nick, "H", "0 #{usr.real}")
548
- send_server_message(user, "315", usr.nick, "End of WHO list")
549
- }
550
- end
551
- when KICK
552
- raise NotEnoughParameter if params.size < 2
553
- chs = params[0].split(",")
554
- whos = params[1].split(",")
555
- msg = params[2].to_s
556
- if chs.size == 1
557
- if ch = channel(chs[0])
558
- whos.each{|who|
559
- if usr = @users.find{|us|us.nick==who}
560
- handle_reply user, ch.kick(usr, user, msg)
561
- else
562
- send_server_message(user, "401", who, "No such nick/channel")
563
- end
564
- }
641
+ else
642
+ send_server_message(user, "403", chs[0], "No such channel")
643
+ end
644
+ elsif chs.size == whos.size
645
+ chs.each_with_index{|chn, i|
646
+ if chn = channel(chn)
647
+ if usr = user_from_nick[whos[i]]
648
+ handle_reply user, ch.kick(usr, user, msg)
565
649
  else
566
- send_server_message(user, "403", chs[0], "No such channel")
650
+ send_server_message(user, "401", whos[i], "No such nick/channel")
567
651
  end
568
- elsif chs.size == whos.size
569
- chs.each_with_index{|chn, i|
570
- if chn = channel(chn)
571
- if usr = user_from_nick[whos[i]]
572
- handle_reply user, ch.kick(usr, user, msg)
573
- else
574
- send_server_message(user, "401", whos[i], "No such nick/channel")
575
- end
576
- else
577
- send_server_message(user, "403", chn, "No such channel")
578
- end
579
- }
652
+ else
653
+ send_server_message(user, "403", chn, "No such channel")
580
654
  end
581
- when ISON
582
- raise NotEnoughParameter if params.empty?
583
- a = params.find_all{|nick| @users.any?{|us| us.nick == nick}}
584
- send_server_message(user, "303", a.join(" "))
585
- when USERHOST
586
- raise NotEnoughParameter if params.empty?
587
- targs = params[0..4]
588
- targs.map!{|nick|
589
- if tg = @users.find{|u| u.nick == nick}
590
- suf = @operators.include?(tg.socket) ? "*" : ""
591
- pre = tg.away? ? "-" : "+"
592
- usr = tg.user
593
- host = tg.host
594
- nick + suf + "=" + pre + usr + "@" + host + " "
595
- else
596
- ""
597
- end
598
- }
599
- send_server_message(user, "302", targs.join(" "))
600
- when QUIT
601
- send_client_message(user, nil, ERROR, "Closing", "Link:", "#{user.nick}[#{user.user}@#{user.host}]", %Q!("#{params[0]}")!)
602
- unregister(user, params[0])
655
+ }
656
+ end
657
+ end
658
+
659
+ def on_ison(user, params)
660
+ raise NotEnoughParameter if params.empty?
661
+ a = params.find_all{|nick| @users.any?{|us| us.nick == nick}}
662
+ send_server_message(user, "303", a.join(" "))
663
+ end
664
+
665
+ def on_userhost(user, params)
666
+ raise NotEnoughParameter if params.empty?
667
+ targs = params[0..4]
668
+ targs.map!{|nick|
669
+ if tg = @users.find{|u| u.nick == nick}
670
+ suf = @operators.include?(tg.socket) ? "*" : ""
671
+ pre = tg.away? ? "-" : "+"
672
+ usr = tg.user
673
+ host = tg.host
674
+ nick + suf + "=" + pre + usr + "@" + host + " "
603
675
  else
604
- raise UnknownCommand.new(msg.command)
676
+ ""
605
677
  end
606
- rescue NotEnoughParameter => e
607
- send_server_message(user, "461", msg.command, "Not enough parameters")
608
- rescue UnknownCommand => e
609
- send_server_message(user, "421", e.cmd, "Unknown command")
610
- rescue
611
- puts $!, $@
612
- end
678
+ }
679
+ send_server_message(user, "302", targs.join(" "))
680
+ end
681
+
682
+ def on_quit(user, params)
683
+ send_client_message(user, nil, ERROR, "Closing", "Link:", "#{user.nick}[#{user.user}@#{user.host}]", %Q!("#{params[0]}")!)
684
+ unregister(user, params[0])
613
685
  end
614
686
 
615
687
  def handle_reply(user, rpl)
@@ -674,4 +746,4 @@ class IRCServer < WEBrick::GenericServer
674
746
  end
675
747
 
676
748
  end
677
- end
749
+ end
data/rupircd.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{rupircd}
8
- s.version = "0.6.2"
8
+ s.version = "0.6.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["konn"]
12
- s.date = %q{2009-08-12}
12
+ s.date = %q{2009-08-13}
13
13
  s.description = %q{rupircd is a light IRC daemon written in 100% pure ruby.}
14
14
  s.email = %q{mr_konn[at]jcom[dot]home[dot]ne[dot]jp}
15
15
  s.executables = ["mkpassword", "rupircd"]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: konn-rupircd
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.6.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - konn
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-08-12 00:00:00 -07:00
12
+ date: 2009-08-13 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15