mod_spox 0.2.0 → 0.3.0

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 (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