mod_spox 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (145) hide show
  1. data/CHANGELOG +31 -1
  2. data/LICENSE +674 -0
  3. data/README.rdoc +73 -0
  4. data/bin/mod_spox +28 -28
  5. data/data/mod_spox/extras/AOLSpeak.rb +2 -3
  6. data/data/mod_spox/extras/AutoKick.rb +10 -23
  7. data/data/mod_spox/extras/AutoMode.rb +12 -23
  8. data/data/mod_spox/extras/Bash.rb +55 -0
  9. data/data/mod_spox/extras/Bouncer.rb +85 -57
  10. data/data/mod_spox/extras/Bullshit.rb +1 -1
  11. data/data/mod_spox/extras/Bytes.rb +1 -2
  12. data/data/mod_spox/extras/Confess.rb +27 -29
  13. data/data/mod_spox/extras/DCC.rb +11 -20
  14. data/data/mod_spox/extras/DevWatch.rb +21 -23
  15. data/data/mod_spox/extras/DownForEveryoneOrJustMe.rb +47 -0
  16. data/data/mod_spox/extras/EightBall.rb +1 -1
  17. data/data/mod_spox/extras/FML.rb +35 -0
  18. data/data/mod_spox/extras/Headers.rb +31 -50
  19. data/data/mod_spox/extras/Karma.rb +81 -29
  20. data/data/mod_spox/extras/Logger.rb +2 -2
  21. data/data/mod_spox/extras/LolSpeak.rb +1 -2
  22. data/data/mod_spox/extras/PhpCli.rb +138 -8
  23. data/data/mod_spox/extras/PhpFuncLookup.rb +20 -23
  24. data/data/mod_spox/extras/Pinger.rb +1 -1
  25. data/data/mod_spox/extras/Quotes.rb +8 -10
  26. data/data/mod_spox/extras/RegexTracker.rb +2 -4
  27. data/data/mod_spox/extras/Roulette.rb +20 -27
  28. data/data/mod_spox/extras/RubyCli.rb +93 -0
  29. data/data/mod_spox/extras/Search.rb +17 -3
  30. data/data/mod_spox/extras/Seen.rb +150 -0
  31. data/data/mod_spox/extras/SlashdotHeadlineGenerator.rb +500 -0
  32. data/data/mod_spox/extras/Talk.rb +2 -4
  33. data/data/mod_spox/extras/Topten.rb +10 -12
  34. data/data/mod_spox/extras/TracTicket.rb +3 -5
  35. data/data/mod_spox/extras/Translate.rb +20 -22
  36. data/data/mod_spox/extras/Twitter.rb +118 -33
  37. data/data/mod_spox/extras/UrbanDictionary.rb +8 -17
  38. data/data/mod_spox/extras/Weather.rb +1 -2
  39. data/data/mod_spox/plugins/Authenticator.rb +93 -98
  40. data/data/mod_spox/plugins/Banner.rb +26 -56
  41. data/data/mod_spox/plugins/Helper.rb +5 -6
  42. data/data/mod_spox/plugins/Initializer.rb +4 -14
  43. data/data/mod_spox/plugins/Joiner.rb +1 -1
  44. data/data/mod_spox/plugins/Nicker.rb +13 -0
  45. data/data/mod_spox/plugins/Parter.rb +2 -2
  46. data/data/mod_spox/plugins/Permissions.rb +60 -0
  47. data/data/mod_spox/plugins/PluginLoader.rb +7 -12
  48. data/data/mod_spox/plugins/Ponger.rb +51 -0
  49. data/data/mod_spox/plugins/Quitter.rb +1 -2
  50. data/data/mod_spox/plugins/Servers.rb +57 -0
  51. data/data/mod_spox/plugins/Status.rb +3 -2
  52. data/data/mod_spox/plugins/Triggers.rb +9 -9
  53. data/lib/mod_spox/Bot.rb +109 -33
  54. data/lib/mod_spox/BotConfig.rb +2 -2
  55. data/lib/mod_spox/ConfigurationWizard.rb +12 -12
  56. data/lib/mod_spox/Database.rb +1 -4
  57. data/lib/mod_spox/Exceptions.rb +26 -0
  58. data/lib/mod_spox/Helpers.rb +29 -68
  59. data/lib/mod_spox/Loader.rb +23 -24
  60. data/lib/mod_spox/Logger.rb +19 -17
  61. data/lib/mod_spox/MessageFactory.rb +50 -24
  62. data/lib/mod_spox/Pipeline.rb +21 -7
  63. data/lib/mod_spox/Plugin.rb +27 -3
  64. data/lib/mod_spox/PluginManager.rb +28 -15
  65. data/lib/mod_spox/PriorityQueue.rb +69 -0
  66. data/lib/mod_spox/Socket.rb +93 -51
  67. data/lib/mod_spox/Sockets.rb +76 -63
  68. data/lib/mod_spox/Timer.rb +21 -141
  69. data/lib/mod_spox/Version.rb +14 -0
  70. data/lib/mod_spox/handlers/BadNick.rb +1 -1
  71. data/lib/mod_spox/handlers/Bounce.rb +5 -5
  72. data/lib/mod_spox/handlers/Created.rb +13 -5
  73. data/lib/mod_spox/handlers/Handler.rb +12 -3
  74. data/lib/mod_spox/handlers/Invite.rb +14 -8
  75. data/lib/mod_spox/handlers/Join.rb +24 -20
  76. data/lib/mod_spox/handlers/Kick.rb +22 -13
  77. data/lib/mod_spox/handlers/Mode.rb +42 -36
  78. data/lib/mod_spox/handlers/Motd.rb +4 -0
  79. data/lib/mod_spox/handlers/Names.rb +66 -39
  80. data/lib/mod_spox/handlers/Nick.rb +20 -14
  81. data/lib/mod_spox/handlers/Part.rb +25 -8
  82. data/lib/mod_spox/handlers/Ping.rb +11 -5
  83. data/lib/mod_spox/handlers/Pong.rb +9 -5
  84. data/lib/mod_spox/handlers/Privmsg.rb +25 -17
  85. data/lib/mod_spox/handlers/Quit.rb +13 -8
  86. data/lib/mod_spox/handlers/Topic.rb +4 -0
  87. data/lib/mod_spox/handlers/Welcome.rb +16 -24
  88. data/lib/mod_spox/handlers/Who.rb +64 -48
  89. data/lib/mod_spox/handlers/Whois.rb +92 -60
  90. data/lib/mod_spox/messages/incoming/Nick.rb +2 -2
  91. data/lib/mod_spox/messages/incoming/Privmsg.rb +1 -1
  92. data/lib/mod_spox/messages/incoming/Whois.rb +1 -0
  93. data/lib/mod_spox/messages/internal/EstablishConnection.rb +1 -1
  94. data/lib/mod_spox/messages/internal/PluginsReady.rb +10 -0
  95. data/lib/mod_spox/messages/internal/QueueSocket.rb +8 -0
  96. data/lib/mod_spox/messages/internal/Reconnect.rb +8 -0
  97. data/lib/mod_spox/messages/internal/UnqueueSocket.rb +8 -0
  98. data/lib/mod_spox/migrations/002_persistent_sigs.rb +14 -0
  99. data/lib/mod_spox/migrations/003_auth_restructure.rb +31 -0
  100. data/lib/mod_spox/migrations/004_mode_index_fix.rb +18 -0
  101. data/lib/mod_spox/migrations/005_nick_mode_nopark.rb +18 -0
  102. data/lib/mod_spox/models/Auth.rb +16 -46
  103. data/lib/mod_spox/models/AuthMask.rb +13 -0
  104. data/lib/mod_spox/models/Channel.rb +46 -27
  105. data/lib/mod_spox/models/Config.rb +10 -19
  106. data/lib/mod_spox/models/Group.rb +20 -8
  107. data/lib/mod_spox/models/Models.rb +1 -1
  108. data/lib/mod_spox/models/Nick.rb +105 -113
  109. data/lib/mod_spox/models/NickMode.rb +23 -9
  110. data/lib/mod_spox/models/Server.rb +12 -1
  111. data/lib/mod_spox/models/Setting.rb +12 -16
  112. data/lib/mod_spox/models/Signature.rb +28 -8
  113. data/tests/BotHolder.rb +24 -0
  114. data/tests/handlers/tc_BadNick.rb +21 -0
  115. data/tests/handlers/tc_Created.rb +24 -0
  116. data/tests/handlers/tc_Invite.rb +50 -0
  117. data/tests/handlers/tc_Join.rb +33 -0
  118. data/tests/handlers/tc_Kick.rb +32 -0
  119. data/tests/handlers/tc_Mode.rb +85 -0
  120. data/tests/handlers/tc_Names.rb +35 -0
  121. data/tests/handlers/tc_Nick.rb +55 -0
  122. data/tests/handlers/tc_Part.rb +44 -0
  123. data/tests/handlers/tc_Ping.rb +40 -0
  124. data/tests/handlers/tc_Pong.rb +28 -0
  125. data/tests/handlers/tc_Privmsg.rb +85 -0
  126. data/tests/handlers/tc_Quit.rb +40 -0
  127. data/tests/handlers/tc_Who.rb +50 -0
  128. data/tests/handlers/tc_Whois.rb +61 -0
  129. data/tests/models/tc_Auth.rb +34 -0
  130. data/tests/models/tc_Channel.rb +52 -0
  131. data/tests/models/tc_Config.rb +19 -0
  132. data/tests/models/tc_Nick.rb +142 -0
  133. data/tests/models/tc_NickMode.rb +40 -0
  134. data/tests/models/tc_Setting.rb +21 -0
  135. data/tests/models/tc_Signature.rb +14 -0
  136. data/tests/run_tests.rb +4 -0
  137. metadata +284 -212
  138. data/README +0 -36
  139. data/lib/mod_spox/Cache.rb +0 -57
  140. data/lib/mod_spox/Monitors.rb +0 -84
  141. data/lib/mod_spox/Pool.rb +0 -164
  142. data/lib/mod_spox/models/AuthGroup.rb +0 -16
  143. data/lib/mod_spox/models/ChannelMode.rb +0 -14
  144. data/lib/mod_spox/models/NickChannel.rb +0 -45
  145. data/lib/mod_spox/models/NickGroup.rb +0 -16
@@ -5,15 +5,32 @@ module ModSpox
5
5
  def initialize(handlers)
6
6
  handlers[:PART] = self
7
7
  end
8
+
9
+ # :mod_spox!~mod_spox@host PART #m :
10
+ # :guy2net!~guy2net@92-239-14-145.cable.ubr15.haye.blueyonder.co.uk PART #php
11
+
8
12
  def process(string)
9
- if(string =~ /^:(\S+) PART (\S+) (.*)$/)
10
- channel = find_model($2)
11
- nick = find_model($1.gsub(/!.+$/, ''))
12
- channel.nick_remove(nick)
13
- return Messages::Incoming::Part.new(string, channel, nick, $3)
14
- else
15
- Logger.warn('Failed to parse PART message')
16
- return nil
13
+ string = string.dup
14
+ orig = string.dup
15
+ begin
16
+ string.slice!(0)
17
+ nick = find_model(string.slice!(0..string.index('!')-1))
18
+ 2.times{ string.slice!(0..string.index(' ')) }
19
+ unless(string.index(' ').nil?)
20
+ channel = find_model(string.slice!(0..string.index(' ')-1))
21
+ string.slice!(0..string.index(':'))
22
+ else
23
+ channel = find_model(string)
24
+ string = ''
25
+ end
26
+ channel.remove_nick(nick)
27
+ nick.visible = false if nick.channels.empty?
28
+ nick.save_changes
29
+ channel.save_changes
30
+ return Messages::Incoming::Part.new(orig, channel, nick, string)
31
+ rescue Object => boom
32
+ Logger.error("Failed to parse PART message: #{orig}")
33
+ raise boom
17
34
  end
18
35
  end
19
36
  end
@@ -6,11 +6,17 @@ module ModSpox
6
6
  handlers[:PING] = self
7
7
  end
8
8
  def process(string)
9
- if(string =~ /^PING\s:(.+)$/)
10
- return Messages::Incoming::Ping.new(string, $1, nil)
11
- else
12
- Logger.warn('Failed to match PING message')
13
- return nil
9
+ orig = string.dup
10
+ string = string.dup
11
+ begin
12
+ string.slice!(0) if string[0] == ':'
13
+ server = string[0..string.index(' ')-1]
14
+ message = string[string.index(':')+1..string.size]
15
+ server = message.dup if server == 'PING'
16
+ return Messages::Incoming::Ping.new(orig, server, message)
17
+ rescue Object => boom
18
+ Logger.error("Failed to parse PING message: #{string}")
19
+ raise boom
14
20
  end
15
21
  end
16
22
  end
@@ -6,11 +6,15 @@ module ModSpox
6
6
  handlers[:PONG] = self
7
7
  end
8
8
  def process(string)
9
- if(string =~ /^:\S+\sPONG\s(\S+)\s:(.+)$/)
10
- return Messages::Incoming::Pong.new(string, $1, $2)
11
- else
12
- Logger.warn('Failed to parse PONG message')
13
- return nil
9
+ orig = string.dup
10
+ string = string.dup
11
+ begin
12
+ a = string.slice!(string.rindex(':')+1, string.size)
13
+ string.slice!(-2..string.size)
14
+ return Messages::Incoming::Pong.new(orig, string.slice(string.rindex(' ')+1..string.size), a)
15
+ rescue Object => boom
16
+ Logger.error("Failed to parse PONG message: #{orig}")
17
+ raise boom
14
18
  end
15
19
  end
16
20
  end
@@ -5,24 +5,32 @@ module ModSpox
5
5
  def initialize(handlers)
6
6
  handlers[:PRIVMSG] = self
7
7
  end
8
-
8
+
9
+ # :spox!~spox@host PRIVMSG #m :foobar
9
10
  def process(string)
10
- if(string =~ /^:(\S+)\sPRIVMSG\s(\S+)\s:(.+)$/)
11
- message = $3
12
- target = find_model($2)
13
- base_source = $1
14
- source = find_model(base_source.gsub(/!.+$/, ''))
15
- if(base_source =~ /!(.+)@(.+)$/)
16
- source.username = $1
17
- source.address = $2
18
- source.source = base_source
19
- source.save_changes
20
- end
21
- Models::NickChannel.find_or_create(:channel_id => target.pk, :nick_id => source.pk) if target.is_a?(ModSpox::Models::Channel)
22
- return Messages::Incoming::Privmsg.new(string, source, target, message)
23
- else
24
- Logger.warn('Failed to match PRIVMSG message')
25
- return nil
11
+ orig = string.dup
12
+ string = string.dup
13
+ begin
14
+ string.slice!(0)
15
+ base_source = string.slice!(0..string.index(' ')-1)
16
+ orig_source = base_source.dup
17
+ string.slice!(0..string.index(' ',3))
18
+ target = find_model(string.slice!(0..string.index(' ')-1))
19
+ string.slice!(0..string.index(':'))
20
+ string.strip!
21
+ source = find_model(base_source.slice!(0..base_source.index('!')-1))
22
+ base_source.slice!(0)
23
+ source.username = base_source.slice!(0..base_source.index('@')-1)
24
+ base_source.slice!(0)
25
+ source.address = base_source.strip
26
+ source.source = orig_source
27
+ source.save_changes
28
+ source.add_channel(target) if target.is_a?(Models::Channel)
29
+ return Messages::Incoming::Privmsg.new(orig, source, target, string)
30
+ rescue Object => boom
31
+ Logger.warn("Failed to parse PRIVMSG message: #{orig}")
32
+ Logger.warn("Reason for PRIVMSG failure: #{boom}")
33
+ raise boom
26
34
  end
27
35
  end
28
36
  end
@@ -5,17 +5,22 @@ module ModSpox
5
5
  def initialize(handlers)
6
6
  handlers[:QUIT] = self
7
7
  end
8
+
9
+ #:spox!~spox@host QUIT :Ping timeout
8
10
  def process(string)
9
- if(string =~ /^:(\S+)\sQUIT\s:(.+)$/)
10
- reason = $2
11
- nick = find_model($1.gsub(/!.+$/, ''))
12
- nick.clear_channels
11
+ orig = string.dup
12
+ string = string.dup
13
+ begin
14
+ string.slice!(0)
15
+ nick = find_model(string.slice!(0..string.index('!')-1))
16
+ string.slice!(0..string.index(':'))
17
+ nick.remove_all_channels
13
18
  nick.visible = false
14
19
  nick.save
15
- return Messages::Incoming::Quit.new(string, nick, reason)
16
- else
17
- Logger.warn('Failed to parse KICK message')
18
- return nil
20
+ return Messages::Incoming::Quit.new(orig, nick, string)
21
+ rescue Object => boom
22
+ Logger.error("Failed to parse QUIT message: #{orig}")
23
+ raise boom
19
24
  end
20
25
  end
21
26
  end
@@ -8,6 +8,10 @@ module ModSpox
8
8
  handlers[RPL_TOPICINFO] = self
9
9
  @topics = Hash.new
10
10
  end
11
+
12
+ #:irc.host 332 spox #mod_spox : the topic is here
13
+ #:irc.host 333 spox #mod_spox spox 1232126516
14
+
11
15
  def process(string)
12
16
  if(string =~ /#{RPL_TOPIC}.+?(\S+)\s:(.+)$/)
13
17
  channel = find_model($1)
@@ -5,31 +5,23 @@ module ModSpox
5
5
  def initialize(handlers)
6
6
  handlers[RPL_WELCOME] = self
7
7
  end
8
-
8
+ # >> :holmes.freenode.net 001 spax :Welcome to the freenode IRC Network spax
9
9
  def process(string)
10
- if(string =~ /:(\S+)\s(\S+).+?(\S+)$/)
11
- server = $1
12
- message = $2
13
- userstring = $3
14
- if(userstring =~ /^(.+?)!(.+?)@(.+?)$/)
15
- Models::Nick.filter(:botnick => true).each{|n| n.botnick = false; n.save}
16
- nick = $1
17
- username = $2
18
- hostname = $3
19
- nick = Models::Nick.locate(nick)
20
- nick.botnick = true
21
- nick.username = username
22
- nick.address = hostname
23
- nick.source = userstring
24
- nick.save
25
- return Messages::Incoming::Welcome.new(string, server, message, nick, username, hostname)
26
- else
27
- Logger.warn('Failed to match user string in welcome message')
28
- return nil
29
- end
30
- else
31
- Logger.warn('Failed to match welcome message')
32
- return nil
10
+ parse = string.dup
11
+ begin
12
+ parse.slice!(0)
13
+ server = parse.slice!(0..parse.index(' ')-1)
14
+ 2.times{parse.slice!(0..parse.index(' '))}
15
+ nick = parse.slice!(0..parse.index(' ')-1)
16
+ parse.slice!(0..parse.index(':'))
17
+ nick = Models::Nick.find_or_create(:nick => nick)
18
+ nick.botnick = true
19
+ nick.visible = true
20
+ nick.save
21
+ return Messages::Incoming::Welcome.new(string, server, parse, nick, nil, nil)
22
+ rescue Object => boom
23
+ Logger.warn("Failed to parse welcome message: #{string}")
24
+ raise boom
33
25
  end
34
26
  end
35
27
  end
@@ -1,4 +1,4 @@
1
- ['mod_spox/handlers/Handler', 'mod_spox/Monitors'].each{|f|require f}
1
+ ['mod_spox/handlers/Handler'].each{|f|require f}
2
2
 
3
3
  module ModSpox
4
4
  module Handlers
@@ -9,56 +9,72 @@ module ModSpox
9
9
  @cache = Hash.new
10
10
  @raw_cache = Hash.new
11
11
  end
12
-
12
+ # :host 352 spox #mod_spox ~pizza_ 12.229.112.195 punch.va.us.dal.net pizza_ H@ :5 pizza_
13
13
  def process(string)
14
- if(string =~ /#{RPL_WHOREPLY}\s\S+\s(\S+|\*|\*\s\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s:(\d)\s(.+)$/)
15
- # Items matched are as follows:
16
- # 1: location
17
- # 2: username
18
- # 3: host
19
- # 4: server
20
- # 5: nick
21
- # 6: info
22
- # 7: hops
23
- # 8: realname
24
- location = $1 == '*' ? nil : $1
25
- info = $6
26
- nick = find_model($5)
27
- nick.username = $2
28
- nick.address = $3
29
- nick.real_name = $8
30
- nick.connected_to = $4
31
- nick.away = info =~ /G/ ? true : false
32
- nick.visible = true
33
- nick.save_changes
34
- key = location.nil? ? nick.nick : location
35
- @cache[key] = Array.new unless @cache[key]
36
- @cache[key] << nick
37
- @raw_cache[key] = Array.new unless @raw_cache[key]
38
- @raw_cache[key] << string
39
- unless(location.nil?)
40
- channel = find_model(location)
41
- Models::NickChannel.find_or_create(:channel_id => channel.pk, :nick_id => nick.pk)
42
- if(info.include?('+'))
43
- Models::NickMode.find_or_create(:channel_id => channel.pk, :nick_id => nick.pk, :mode => 'v')
44
- elsif(info.include?('@'))
45
- Models::NickMode.find_or_create(:channel_id => channel.pk, :nick_id => nick.pk, :mode => 'o')
46
- else
47
- Models::NickMode.filter(:channel_id => channel.pk, :nick_id => nick.pk).each{|m| m.destroy}
14
+ string = string.dup
15
+ orig = string.dup
16
+ begin
17
+ until(string.slice(0..RPL_WHOREPLY.size-1) == RPL_WHOREPLY || string.slice(0..RPL_ENDOFWHO.size-1) == RPL_ENDOFWHO)
18
+ string.slice!(0..string.index(' '))
19
+ end
20
+ if(string.slice(0..RPL_WHOREPLY.size-1) == RPL_WHOREPLY)
21
+ 2.times{string.slice!(0..string.index(' '))}
22
+ location = string.slice!(0..string.index(' ')-1)
23
+ string.slice!(0)
24
+ username = string.slice!(0..string.index(' ')-1)
25
+ string.slice!(0)
26
+ host = string.slice!(0..string.index(' ')-1)
27
+ string.slice!(0)
28
+ server = string.slice!(0..string.index(' ')-1)
29
+ string.slice!(0)
30
+ nick = find_model(string.slice!(0..string.index(' ')-1))
31
+ string.slice!(0)
32
+ info = string.slice!(0..string.index(' ')-1)
33
+ string.slice!(0..string.index(':'))
34
+ hops = string.slice!(0..string.index(' ')-1)
35
+ string.slice!(0)
36
+ realname = string
37
+ location = nil if location == '*'
38
+ nick.username = username
39
+ nick.address = location
40
+ nick.real_name = realname
41
+ nick.connected_to = server
42
+ nick.away = !info.index('G').nil?
43
+ nick.add_channel(find_model(location)) unless location.nil?
44
+ nick.save_changes
45
+ key = location.nil? ? nick.nick : location
46
+ @cache[key] = Array.new unless @cache[key]
47
+ @cache[key] << nick
48
+ @raw_cache[key] = Array.new unless @raw_cache[key]
49
+ @raw_cache[key] << orig
50
+ unless(location.nil?)
51
+ channel = find_model(location)
52
+ channel.add_nick(nick)
53
+ if(info.include?('+'))
54
+ m = Models::NickMode.find_or_create(:channel_id => channel.pk, :nick_id => nick.pk)
55
+ m.set_mode('v')
56
+ elsif(info.include?('@'))
57
+ m = Models::NickMode.find_or_create(:channel_id => channel.pk, :nick_id => nick.pk)
58
+ m.set_mode('o')
59
+ else
60
+ m = Models::NickMode.find_or_create(:channel_id => channel.pk, :nick_id => nick.pk)
61
+ m.clear_modes
62
+ end
48
63
  end
64
+ return nil
65
+ else
66
+ 2.times{string.slice!(0..string.index(' '))}
67
+ location = string.slice!(0..string.index(' ')-1)
68
+ loc = find_model(location)
69
+ @raw_cache[location] << orig
70
+ message = Messages::Incoming::Who.new(@raw_cache[location].join("\n"), loc, @cache[location])
71
+ @raw_cache.delete(location)
72
+ @cache.delete(location)
73
+ return message
49
74
  end
50
- return nil
51
- elsif(string =~ /#{RPL_ENDOFWHO}\s\S+\s(\S+)\s/)
52
- location = $1
53
- loc = find_model(location)
54
- @raw_cache[location] << string
55
- message = Messages::Incoming::Who.new(@raw_cache[location].join("\n"), loc, @cache[location])
56
- @raw_cache.delete(location)
57
- @cache.delete(location)
58
- return message
59
- else
60
- Logger.warn('Failed to match RPL_WHO type message')
61
- return nil
75
+ rescue Object => boom
76
+ Logger.error("Failed to match WHO type message: #{orig}")
77
+ raise boom
62
78
  end
63
79
  end
64
80
 
@@ -15,70 +15,102 @@ module ModSpox
15
15
  end
16
16
 
17
17
  def process(string)
18
- if(string =~ /#{RPL_WHOISUSER}\s\S+\s(\S+)\s(\S+)\s(\S+)\s\*\s:(.+)$/)
19
- key = $1
20
- nick = find_model($1)
21
- nick.username = $2
22
- nick.address = $3
23
- nick.real_name = $4
24
- nick.save_changes
25
- @cache[$1] = Messages::Incoming::Whois.new(nick)
26
- @cache[$1].raw_push(string)
27
- return nil
28
- elsif(string =~ /#{RPL_WHOISCHANNELS}\s\S+\s(\S+)\s:(.+)$/)
29
- nick = $1
30
- @cache[nick] = Messages::Incoming::Whois.new(find_model(nick)) unless @cache[nick]
31
- @cache[$1].raw_push(string)
32
- $2.split(/\s/).each{|chan|
33
- channel = find_model(chan.gsub(/^[@\+]/, ''))
34
- @cache[nick].channels_push(channel)
35
- if(chan[0].chr == '@')
36
- Models::NickMode.find_or_create(:nick_id => @cache[nick].nick.pk, :mode => 'o', :channel_id => channel.pk)
37
- elsif(chan[0].chr == '+')
38
- Models::NickMode.find_or_create(:nick_id => @cache[nick].nick.pk, :mode => 'v', :channel_id => channel.pk)
18
+ orig = string.dup
19
+ string = string.dup
20
+ begin
21
+ until(string.slice(0..string.index(' ')-1) == RPL_WHOISUSER ||
22
+ string.slice(0..string.index(' ')-1) == RPL_WHOISSERVER ||
23
+ string.slice(0..string.index(' ')-1) == RPL_WHOISOPERATOR ||
24
+ string.slice(0..string.index(' ')-1) == RPL_WHOISIDLE ||
25
+ string.slice(0..string.index(' ')-1) == RPL_WHOISCHANNELS ||
26
+ string.slice(0..string.index(' ')-1) == RPL_WHOISIDENTIFIED ||
27
+ string.slice(0..string.index(' ')-1) == RPL_ENDOFWHOIS)
28
+ string.slice!(0..string.index(' '))
29
+ end
30
+ case string.slice!(0..string.index(' ')-1)
31
+ when RPL_WHOISUSER
32
+ string.slice!(0)
33
+ string.slice!(0..string.index(' '))
34
+ nick = find_model(string.slice!(0..string.index(' ')-1))
35
+ string.slice!(0)
36
+ nick.username = string.slice!(0..string.index(' ')-1)
37
+ string.slice!(0)
38
+ nick.address = string.slice!(0..string.index(' ')-1)
39
+ string.slice!(0..string.index(':'))
40
+ nick.real_name = string
41
+ nick.save_changes
42
+ @cache[nick.nick] = Messages::Incoming::Whois.new(nick)
43
+ @cache[nick.nick].raw_push(orig)
44
+ when RPL_WHOISCHANNELS
45
+ 2.times{string.slice!(0..string.index(' '))}
46
+ nick = find_model(string.slice!(0..string.index(' ')-1))
47
+ @cache[nick.nick] = Messages::Incoming::Whois.new(nick) unless @cache[nick.nick]
48
+ string.slice!(0..string.index(':'))
49
+ string.split.each do |c|
50
+ channel = find_model(['@','+'].include?(c.slice(0)) ? c.slice(1..c.size) : c)
51
+ channel.add_nick(nick)
52
+ @cache[nick.nick].channels_push(channel)
53
+ if(c[0].chr == '@')
54
+ m = Models::NickMode.find_or_create(:nick_id => nick.pk, :channel_id => channel.pk)
55
+ m.set_mode('o')
56
+ elsif(c[0].chr == '+')
57
+ m = Models::NickMode.find_or_create(:nick_id => nick.pk, :channel_id => channel.pk)
58
+ m.set_mode('v')
59
+ else
60
+ m = Models::NickMode.find_or_create(:nick_id => nick.pk, :channel_id => channel.pk)
61
+ m.clear_modes
62
+ end
63
+ end
64
+ @cache[nick.nick].raw_push(orig)
65
+ when RPL_WHOISSERVER
66
+ 2.times{string.slice!(0..string.index(' '))}
67
+ nick = find_model(string.slice!(0..string.index(' ')-1))
68
+ string.slice!(0)
69
+ @cache[nick.nick] = Messages::Incoming::Whois.new(nick) unless @cache[nick.nick]
70
+ nick.connected_to = string.slice!(0..string.index(' ')-1)
71
+ nick.save_changes
72
+ @cache[nick.nick].raw_push(orig)
73
+ when RPL_WHOISIDENTIFIED
74
+ 2.times{string.slice!(0..string.index(' '))}
75
+ nick = find_model(string.slice!(0..string.index(' ')-1))
76
+ @cache[nick.nick] = Messages::Incoming::Whois.new(nick) unless @cache[nick.nick]
77
+ nick.auth.services_identified = true
78
+ @cache[nick.nick].raw_push(orig)
79
+ when RPL_WHOISIDLE
80
+ 2.times{string.slice!(0..string.index(' '))}
81
+ nick = find_model(string.slice!(0..string.index(' ')-1))
82
+ string.slice!(0)
83
+ @cache[nick.nick] = Messages::Incoming::Whois.new(nick) unless @cache[nick.nick]
84
+ nick.seconds_idle = string.slice!(0..string.index(' ')-1).to_i
85
+ string.slice!(0)
86
+ nick.connected_at = Time.at(string.slice!(0..string.index(' ')-1).to_i)
87
+ nick.save_changes
88
+ @cache[nick.nick].raw_push(orig)
89
+ when RPL_WHOISOPERATOR
90
+ 2.times{string.slice!(0..string.index(' '))}
91
+ nick = find_model(string.slice!(0..string.index(' ')-1))
92
+ string.slice!(0)
93
+ @cache[nick.nick] = Messages::Incoming::Whois.new(nick) unless @cache[nick.nick]
94
+ @cache[nick.nick].raw_push(orig)
95
+ when RPL_ENDOFWHOIS
96
+ 2.times{string.slice!(0..string.index(' '))}
97
+ nick = find_model(string.slice!(0..string.index(' ')-1))
98
+ @cache[nick.nick] = Messages::Incoming::Whois.new(nick) unless @cache[nick.nick]
99
+ @cache[nick.nick].raw_push(orig)
100
+ message = @cache[nick.nick]
101
+ message.lock
102
+ @cache.delete(nick.nick)
103
+ return message
39
104
  else
40
- Models::NickMode.filter(:nick_id => @cache[nick].nick.pk, :channel_id => channel.pk).each{|m| m.destroy}
41
- end
42
- }
43
- return nil
44
- elsif(string =~ /#{RPL_WHOISSERVER}\s\S+\s(\S+)\s(\S+)\s:(.+)$/)
45
- nick = $1
46
- @cache[nick] = Messages::Incoming::Whois.new(find_model(nick)) unless @cache[nick]
47
- @cache[nick].nick.connected_to = $2
48
- @cache[nick].raw_push(string)
49
- return nil
50
- elsif(string =~ /#{RPL_WHOISIDENTIFIED}\s\S+\s(\S+)\s/)
51
- nick = $1
52
- @cache[nick] = Messages::Incoming::Whois.new(find_model(nick)) unless @cache[nick]
53
- @cache[nick].nick.auth.services_identified = true
54
- @cache[nick].raw_push(string)
55
- return nil
56
- elsif(string =~ /#{RPL_WHOISIDLE}\s\S+\s(\S+)\s(\d+)\s(\d+)\s:(.+?),(.+?)/)
57
- nick = $1
58
- @cache[nick] = Messages::Incoming::Whois.new(find_model(nick)) unless @cache[nick]
59
- @cache[nick].nick.seconds_idle = $2.to_i
60
- @cache[nick].nick.connected_at = Time.at($3.to_i)
61
- @cache[nick].raw_push(string)
62
- return nil
63
- elsif(string =~ /#{RPL_WHOISOPERATOR}\s\S+\s(\S+)/)
64
- nick = $1
65
- @cache[nick] = Messages::Incoming::Whois.new(find_model(nick)) unless @cache[nick]
66
- @cache[nick].raw_push(string)
67
- return nil
68
- elsif(string =~ /#{RPL_ENDOFWHOIS}\s\S+\s(\S+)\s:/)
69
- nick = $1
70
- @cache[nick] = Messages::Incoming::Whois.new(find_model(nick)) unless @cache[nick]
71
- @cache[nick].raw_push(string)
72
- message = @cache[nick]
73
- message.lock
74
- @cache[nick].nick.save
75
- @cache.delete(nick)
76
- return message
77
- else
78
- Logger.warn('Failed to parse WHOIS type reply')
105
+ Logger.error("Failed to parse WHOIS type reply. Unknown part found: #{orig}")
106
+ end
79
107
  return nil
108
+ rescue Object => boom
109
+ Logger.error("Failed to parse WHOIS type reply: #{orig}")
110
+ raise boom
80
111
  end
81
112
  end
113
+
82
114
  end
83
115
  end
84
116
  end