spox-mod_spox 0.3.1

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 (268) hide show
  1. data/CHANGELOG +174 -0
  2. data/INSTALL +15 -0
  3. data/LICENSE +674 -0
  4. data/README.rdoc +73 -0
  5. data/bin/mod_spox +112 -0
  6. data/data/mod_spox/extras/AOLSpeak.rb +257 -0
  7. data/data/mod_spox/extras/AutoKick.rb +152 -0
  8. data/data/mod_spox/extras/AutoMode.rb +122 -0
  9. data/data/mod_spox/extras/AutoRejoin.rb +37 -0
  10. data/data/mod_spox/extras/Bash.rb +55 -0
  11. data/data/mod_spox/extras/Bouncer.rb +220 -0
  12. data/data/mod_spox/extras/Bullshit.rb +19 -0
  13. data/data/mod_spox/extras/Bytes.rb +11 -0
  14. data/data/mod_spox/extras/Confess.rb +244 -0
  15. data/data/mod_spox/extras/DCC.rb +182 -0
  16. data/data/mod_spox/extras/DevWatch.rb +153 -0
  17. data/data/mod_spox/extras/DownForEveryoneOrJustMe.rb +47 -0
  18. data/data/mod_spox/extras/EightBall.rb +33 -0
  19. data/data/mod_spox/extras/FML.rb +35 -0
  20. data/data/mod_spox/extras/FloodKicker.rb +129 -0
  21. data/data/mod_spox/extras/Fortune.rb +76 -0
  22. data/data/mod_spox/extras/GoogleIt.rb +13 -0
  23. data/data/mod_spox/extras/Headers.rb +59 -0
  24. data/data/mod_spox/extras/Karma.rb +302 -0
  25. data/data/mod_spox/extras/Locator.rb +44 -0
  26. data/data/mod_spox/extras/Logger.rb +182 -0
  27. data/data/mod_spox/extras/LolSpeak.rb +21 -0
  28. data/data/mod_spox/extras/NickServ.rb +84 -0
  29. data/data/mod_spox/extras/PhpCli.rb +308 -0
  30. data/data/mod_spox/extras/PhpFuncLookup.rb +297 -0
  31. data/data/mod_spox/extras/Pinger.rb +11 -0
  32. data/data/mod_spox/extras/Quotes.rb +79 -0
  33. data/data/mod_spox/extras/RegexTracker.rb +158 -0
  34. data/data/mod_spox/extras/Roulette.rb +267 -0
  35. data/data/mod_spox/extras/RubyCli.rb +93 -0
  36. data/data/mod_spox/extras/Search.rb +49 -0
  37. data/data/mod_spox/extras/Seen.rb +150 -0
  38. data/data/mod_spox/extras/Slashdot.rb +35 -0
  39. data/data/mod_spox/extras/SlashdotHeadlineGenerator.rb +500 -0
  40. data/data/mod_spox/extras/Talk.rb +32 -0
  41. data/data/mod_spox/extras/Topten.rb +103 -0
  42. data/data/mod_spox/extras/TracTicket.rb +66 -0
  43. data/data/mod_spox/extras/Translate.rb +132 -0
  44. data/data/mod_spox/extras/Twitter.rb +458 -0
  45. data/data/mod_spox/extras/UrbanDictionary.rb +55 -0
  46. data/data/mod_spox/extras/Weather.rb +55 -0
  47. data/data/mod_spox/plugins/Authenticator.rb +289 -0
  48. data/data/mod_spox/plugins/Banner.rb +585 -0
  49. data/data/mod_spox/plugins/BotNick.rb +18 -0
  50. data/data/mod_spox/plugins/Helper.rb +49 -0
  51. data/data/mod_spox/plugins/Initializer.rb +35 -0
  52. data/data/mod_spox/plugins/Joiner.rb +23 -0
  53. data/data/mod_spox/plugins/Nicker.rb +14 -0
  54. data/data/mod_spox/plugins/Parter.rb +23 -0
  55. data/data/mod_spox/plugins/Permissions.rb +60 -0
  56. data/data/mod_spox/plugins/PluginLoader.rb +180 -0
  57. data/data/mod_spox/plugins/Ponger.rb +70 -0
  58. data/data/mod_spox/plugins/PoolConfig.rb +52 -0
  59. data/data/mod_spox/plugins/Quitter.rb +15 -0
  60. data/data/mod_spox/plugins/Servers.rb +57 -0
  61. data/data/mod_spox/plugins/Status.rb +31 -0
  62. data/data/mod_spox/plugins/Triggers.rb +85 -0
  63. data/lib/mod_spox/BaseConfig.rb +51 -0
  64. data/lib/mod_spox/Bot.rb +604 -0
  65. data/lib/mod_spox/BotConfig.rb +65 -0
  66. data/lib/mod_spox/ConfigurationWizard.rb +180 -0
  67. data/lib/mod_spox/Database.rb +51 -0
  68. data/lib/mod_spox/Exceptions.rb +84 -0
  69. data/lib/mod_spox/Helpers.rb +122 -0
  70. data/lib/mod_spox/Loader.rb +60 -0
  71. data/lib/mod_spox/Logger.rb +37 -0
  72. data/lib/mod_spox/MessageFactory.rb +112 -0
  73. data/lib/mod_spox/Pipeline.rb +207 -0
  74. data/lib/mod_spox/Plugin.rb +97 -0
  75. data/lib/mod_spox/PluginHolder.rb +22 -0
  76. data/lib/mod_spox/PluginManager.rb +257 -0
  77. data/lib/mod_spox/PriorityQueue.rb +69 -0
  78. data/lib/mod_spox/Socket.rb +201 -0
  79. data/lib/mod_spox/Sockets.rb +226 -0
  80. data/lib/mod_spox/Timer.rb +60 -0
  81. data/lib/mod_spox/Version.rb +14 -0
  82. data/lib/mod_spox/handlers/BadNick.rb +19 -0
  83. data/lib/mod_spox/handlers/Bounce.rb +24 -0
  84. data/lib/mod_spox/handlers/Created.rb +27 -0
  85. data/lib/mod_spox/handlers/Handler.rb +39 -0
  86. data/lib/mod_spox/handlers/Invite.rb +28 -0
  87. data/lib/mod_spox/handlers/Join.rb +38 -0
  88. data/lib/mod_spox/handlers/Kick.rb +36 -0
  89. data/lib/mod_spox/handlers/LuserChannels.rb +19 -0
  90. data/lib/mod_spox/handlers/LuserClient.rb +18 -0
  91. data/lib/mod_spox/handlers/LuserMe.rb +16 -0
  92. data/lib/mod_spox/handlers/LuserOp.rb +19 -0
  93. data/lib/mod_spox/handlers/LuserUnknown.rb +19 -0
  94. data/lib/mod_spox/handlers/Mode.rb +62 -0
  95. data/lib/mod_spox/handlers/Motd.rb +38 -0
  96. data/lib/mod_spox/handlers/MyInfo.rb +24 -0
  97. data/lib/mod_spox/handlers/Names.rb +86 -0
  98. data/lib/mod_spox/handlers/Nick.rb +50 -0
  99. data/lib/mod_spox/handlers/NickInUse.rb +19 -0
  100. data/lib/mod_spox/handlers/Notice.rb +35 -0
  101. data/lib/mod_spox/handlers/Part.rb +39 -0
  102. data/lib/mod_spox/handlers/Ping.rb +25 -0
  103. data/lib/mod_spox/handlers/Pong.rb +23 -0
  104. data/lib/mod_spox/handlers/Privmsg.rb +39 -0
  105. data/lib/mod_spox/handlers/Quit.rb +29 -0
  106. data/lib/mod_spox/handlers/Topic.rb +38 -0
  107. data/lib/mod_spox/handlers/Welcome.rb +30 -0
  108. data/lib/mod_spox/handlers/Who.rb +83 -0
  109. data/lib/mod_spox/handlers/Whois.rb +117 -0
  110. data/lib/mod_spox/handlers/YourHost.rb +20 -0
  111. data/lib/mod_spox/messages/Messages.rb +6 -0
  112. data/lib/mod_spox/messages/incoming/BadNick.rb +16 -0
  113. data/lib/mod_spox/messages/incoming/Bounce.rb +18 -0
  114. data/lib/mod_spox/messages/incoming/Created.rb +15 -0
  115. data/lib/mod_spox/messages/incoming/Invite.rb +21 -0
  116. data/lib/mod_spox/messages/incoming/Join.rb +19 -0
  117. data/lib/mod_spox/messages/incoming/Kick.rb +26 -0
  118. data/lib/mod_spox/messages/incoming/LuserChannels.rb +15 -0
  119. data/lib/mod_spox/messages/incoming/LuserClient.rb +24 -0
  120. data/lib/mod_spox/messages/incoming/LuserMe.rb +18 -0
  121. data/lib/mod_spox/messages/incoming/LuserOp.rb +15 -0
  122. data/lib/mod_spox/messages/incoming/LuserUnknown.rb +15 -0
  123. data/lib/mod_spox/messages/incoming/Message.rb +22 -0
  124. data/lib/mod_spox/messages/incoming/Mode.rb +42 -0
  125. data/lib/mod_spox/messages/incoming/Motd.rb +18 -0
  126. data/lib/mod_spox/messages/incoming/MyInfo.rb +24 -0
  127. data/lib/mod_spox/messages/incoming/Names.rb +24 -0
  128. data/lib/mod_spox/messages/incoming/Nick.rb +26 -0
  129. data/lib/mod_spox/messages/incoming/NickInUse.rb +15 -0
  130. data/lib/mod_spox/messages/incoming/Notice.rb +9 -0
  131. data/lib/mod_spox/messages/incoming/Part.rb +21 -0
  132. data/lib/mod_spox/messages/incoming/Ping.rb +18 -0
  133. data/lib/mod_spox/messages/incoming/Pong.rb +9 -0
  134. data/lib/mod_spox/messages/incoming/Privmsg.rb +90 -0
  135. data/lib/mod_spox/messages/incoming/Quit.rb +18 -0
  136. data/lib/mod_spox/messages/incoming/Topic.rb +21 -0
  137. data/lib/mod_spox/messages/incoming/TopicInfo.rb +21 -0
  138. data/lib/mod_spox/messages/incoming/Welcome.rb +27 -0
  139. data/lib/mod_spox/messages/incoming/Who.rb +18 -0
  140. data/lib/mod_spox/messages/incoming/Whois.rb +49 -0
  141. data/lib/mod_spox/messages/incoming/YourHost.rb +18 -0
  142. data/lib/mod_spox/messages/internal/BotInitialized.rb +11 -0
  143. data/lib/mod_spox/messages/internal/ChangeNick.rb +15 -0
  144. data/lib/mod_spox/messages/internal/Connected.rb +20 -0
  145. data/lib/mod_spox/messages/internal/ConnectionFailed.rb +23 -0
  146. data/lib/mod_spox/messages/internal/DCCListener.rb +12 -0
  147. data/lib/mod_spox/messages/internal/DCCRequest.rb +12 -0
  148. data/lib/mod_spox/messages/internal/DCCSocket.rb +19 -0
  149. data/lib/mod_spox/messages/internal/Disconnected.rb +8 -0
  150. data/lib/mod_spox/messages/internal/Disconnecting.rb +8 -0
  151. data/lib/mod_spox/messages/internal/EstablishConnection.rb +22 -0
  152. data/lib/mod_spox/messages/internal/HaltBot.rb +8 -0
  153. data/lib/mod_spox/messages/internal/NickRequest.rb +9 -0
  154. data/lib/mod_spox/messages/internal/NickResponse.rb +15 -0
  155. data/lib/mod_spox/messages/internal/PluginLoadRequest.rb +21 -0
  156. data/lib/mod_spox/messages/internal/PluginLoadResponse.rb +17 -0
  157. data/lib/mod_spox/messages/internal/PluginModuleRequest.rb +14 -0
  158. data/lib/mod_spox/messages/internal/PluginModuleResponse.rb +18 -0
  159. data/lib/mod_spox/messages/internal/PluginReload.rb +18 -0
  160. data/lib/mod_spox/messages/internal/PluginRequest.rb +18 -0
  161. data/lib/mod_spox/messages/internal/PluginResponse.rb +21 -0
  162. data/lib/mod_spox/messages/internal/PluginUnloadRequest.rb +9 -0
  163. data/lib/mod_spox/messages/internal/PluginUnloadResponse.rb +9 -0
  164. data/lib/mod_spox/messages/internal/PluginsReady.rb +10 -0
  165. data/lib/mod_spox/messages/internal/QueueSocket.rb +8 -0
  166. data/lib/mod_spox/messages/internal/Reconnect.rb +8 -0
  167. data/lib/mod_spox/messages/internal/Request.rb +15 -0
  168. data/lib/mod_spox/messages/internal/Response.rb +15 -0
  169. data/lib/mod_spox/messages/internal/Shutdown.rb +8 -0
  170. data/lib/mod_spox/messages/internal/SignaturesUpdate.rb +8 -0
  171. data/lib/mod_spox/messages/internal/StatusRequest.rb +10 -0
  172. data/lib/mod_spox/messages/internal/StatusResponse.rb +18 -0
  173. data/lib/mod_spox/messages/internal/TimerAdd.rb +36 -0
  174. data/lib/mod_spox/messages/internal/TimerClear.rb +16 -0
  175. data/lib/mod_spox/messages/internal/TimerRemove.rb +23 -0
  176. data/lib/mod_spox/messages/internal/TimerResponse.rb +34 -0
  177. data/lib/mod_spox/messages/internal/TriggersUpdate.rb +8 -0
  178. data/lib/mod_spox/messages/internal/UnqueueSocket.rb +8 -0
  179. data/lib/mod_spox/messages/outgoing/Admin.rb +15 -0
  180. data/lib/mod_spox/messages/outgoing/Away.rb +11 -0
  181. data/lib/mod_spox/messages/outgoing/ChannelMode.rb +25 -0
  182. data/lib/mod_spox/messages/outgoing/Connect.rb +24 -0
  183. data/lib/mod_spox/messages/outgoing/Die.rb +9 -0
  184. data/lib/mod_spox/messages/outgoing/Info.rb +15 -0
  185. data/lib/mod_spox/messages/outgoing/Invite.rb +19 -0
  186. data/lib/mod_spox/messages/outgoing/Ison.rb +15 -0
  187. data/lib/mod_spox/messages/outgoing/Join.rb +19 -0
  188. data/lib/mod_spox/messages/outgoing/Kick.rb +23 -0
  189. data/lib/mod_spox/messages/outgoing/Kill.rb +19 -0
  190. data/lib/mod_spox/messages/outgoing/Links.rb +19 -0
  191. data/lib/mod_spox/messages/outgoing/List.rb +19 -0
  192. data/lib/mod_spox/messages/outgoing/Lusers.rb +19 -0
  193. data/lib/mod_spox/messages/outgoing/Motd.rb +16 -0
  194. data/lib/mod_spox/messages/outgoing/Names.rb +20 -0
  195. data/lib/mod_spox/messages/outgoing/Nick.rb +16 -0
  196. data/lib/mod_spox/messages/outgoing/Notice.rb +12 -0
  197. data/lib/mod_spox/messages/outgoing/Oper.rb +19 -0
  198. data/lib/mod_spox/messages/outgoing/Part.rb +19 -0
  199. data/lib/mod_spox/messages/outgoing/Pass.rb +16 -0
  200. data/lib/mod_spox/messages/outgoing/Ping.rb +11 -0
  201. data/lib/mod_spox/messages/outgoing/Pong.rb +17 -0
  202. data/lib/mod_spox/messages/outgoing/Privmsg.rb +43 -0
  203. data/lib/mod_spox/messages/outgoing/Quit.rb +11 -0
  204. data/lib/mod_spox/messages/outgoing/Raw.rb +16 -0
  205. data/lib/mod_spox/messages/outgoing/Rehash.rb +9 -0
  206. data/lib/mod_spox/messages/outgoing/Restart.rb +9 -0
  207. data/lib/mod_spox/messages/outgoing/ServList.rb +19 -0
  208. data/lib/mod_spox/messages/outgoing/Simple.rb +12 -0
  209. data/lib/mod_spox/messages/outgoing/Squery.rb +19 -0
  210. data/lib/mod_spox/messages/outgoing/Squit.rb +19 -0
  211. data/lib/mod_spox/messages/outgoing/Stats.rb +18 -0
  212. data/lib/mod_spox/messages/outgoing/Summon.rb +23 -0
  213. data/lib/mod_spox/messages/outgoing/Time.rb +15 -0
  214. data/lib/mod_spox/messages/outgoing/Topic.rb +19 -0
  215. data/lib/mod_spox/messages/outgoing/Trace.rb +15 -0
  216. data/lib/mod_spox/messages/outgoing/Unaway.rb +9 -0
  217. data/lib/mod_spox/messages/outgoing/User.rb +23 -0
  218. data/lib/mod_spox/messages/outgoing/UserHost.rb +15 -0
  219. data/lib/mod_spox/messages/outgoing/UserMode.rb +19 -0
  220. data/lib/mod_spox/messages/outgoing/Users.rb +15 -0
  221. data/lib/mod_spox/messages/outgoing/Version.rb +16 -0
  222. data/lib/mod_spox/messages/outgoing/Who.rb +23 -0
  223. data/lib/mod_spox/messages/outgoing/WhoWas.rb +23 -0
  224. data/lib/mod_spox/messages/outgoing/Whois.rb +19 -0
  225. data/lib/mod_spox/migrations/001_initialize_models.rb +115 -0
  226. data/lib/mod_spox/migrations/002_persistent_sigs.rb +14 -0
  227. data/lib/mod_spox/migrations/003_auth_restructure.rb +31 -0
  228. data/lib/mod_spox/migrations/004_mode_index_fix.rb +18 -0
  229. data/lib/mod_spox/migrations/005_nick_mode_nopark.rb +18 -0
  230. data/lib/mod_spox/models/Auth.rb +65 -0
  231. data/lib/mod_spox/models/AuthMask.rb +13 -0
  232. data/lib/mod_spox/models/Channel.rb +89 -0
  233. data/lib/mod_spox/models/Config.rb +30 -0
  234. data/lib/mod_spox/models/Group.rb +30 -0
  235. data/lib/mod_spox/models/Models.rb +4 -0
  236. data/lib/mod_spox/models/Nick.rb +195 -0
  237. data/lib/mod_spox/models/NickMode.rb +32 -0
  238. data/lib/mod_spox/models/Server.rb +27 -0
  239. data/lib/mod_spox/models/Setting.rb +52 -0
  240. data/lib/mod_spox/models/Signature.rb +52 -0
  241. data/lib/mod_spox/models/Trigger.rb +9 -0
  242. data/lib/mod_spox/rfc2812.rb +49 -0
  243. data/populate_gemspec.rb +15 -0
  244. data/tests/BotHolder.rb +24 -0
  245. data/tests/handlers/tc_BadNick.rb +21 -0
  246. data/tests/handlers/tc_Created.rb +24 -0
  247. data/tests/handlers/tc_Invite.rb +50 -0
  248. data/tests/handlers/tc_Join.rb +33 -0
  249. data/tests/handlers/tc_Kick.rb +32 -0
  250. data/tests/handlers/tc_Mode.rb +85 -0
  251. data/tests/handlers/tc_Names.rb +35 -0
  252. data/tests/handlers/tc_Nick.rb +55 -0
  253. data/tests/handlers/tc_Part.rb +44 -0
  254. data/tests/handlers/tc_Ping.rb +40 -0
  255. data/tests/handlers/tc_Pong.rb +28 -0
  256. data/tests/handlers/tc_Privmsg.rb +85 -0
  257. data/tests/handlers/tc_Quit.rb +40 -0
  258. data/tests/handlers/tc_Who.rb +50 -0
  259. data/tests/handlers/tc_Whois.rb +61 -0
  260. data/tests/models/tc_Auth.rb +39 -0
  261. data/tests/models/tc_Channel.rb +52 -0
  262. data/tests/models/tc_Config.rb +19 -0
  263. data/tests/models/tc_Nick.rb +144 -0
  264. data/tests/models/tc_NickMode.rb +40 -0
  265. data/tests/models/tc_Setting.rb +21 -0
  266. data/tests/models/tc_Signature.rb +14 -0
  267. data/tests/run_tests.rb +6 -0
  268. metadata +362 -0
@@ -0,0 +1,36 @@
1
+ require 'mod_spox/handlers/Handler'
2
+ require 'mod_spox/messages/incoming/Kick'
3
+ module ModSpox
4
+ module Handlers
5
+ class Kick < Handler
6
+ def initialize(handlers)
7
+ handlers[:KICK] = self
8
+ end
9
+ # :spax!~spox@host KICK #m spox :foo
10
+ def process(string)
11
+ orig = string.dup
12
+ string = string.dup
13
+ begin
14
+ string.slice!(0)
15
+ source = string.slice!(0..string.index(' ')-1)
16
+ 2.times{string.slice!(0..string.index(' '))}
17
+ channel = string.slice!(0..string.index(' ')-1)
18
+ string.slice!(0)
19
+ kickee = string.slice!(0..string.index(' ')-1)
20
+ string.slice!(0..string.index(':'))
21
+ kicker = find_model(source[0..source.index('!')-1])
22
+ channel = find_model(channel)
23
+ kickee = find_model(kickee)
24
+ channel.remove_nick(kickee)
25
+ kickee.visible = false if kickee.channels.empty?
26
+ kickee.save_changes
27
+ channel.save_changes
28
+ return Messages::Incoming::Kick.new(orig, channel, kicker, kickee, string)
29
+ rescue Object => boom
30
+ Logger.warn("Failed to parse KICK message: #{orig}")
31
+ raise Exceptions::GeneralException.new(boom)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,19 @@
1
+ require 'mod_spox/handlers/Handler'
2
+ require 'mod_spox/messages/incoming/LuserChannels'
3
+ module ModSpox
4
+ module Handlers
5
+ class LuserChannels < Handler
6
+ def initialize(handlers)
7
+ handlers[RFC[:RPL_LUSERCHANNELS][:value]] = self
8
+ end
9
+ def process(string)
10
+ if(string =~ /(\d+)\s:channels/)
11
+ return Messages::Incoming::LuserChannels.new(string, $1.to_i)
12
+ else
13
+ Logger.warn('Failed to match RPL_LUSERCHANNELS message')
14
+ return nil
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,18 @@
1
+ require 'mod_spox/handlers/Handler'
2
+ require 'mod_spox/messages/incoming/LuserClient'
3
+ module ModSpox
4
+ module Handlers
5
+ class LuserClient < Handler
6
+ def initialize(handlers)
7
+ handlers[RFC[:RPL_LUSERCLIENT][:value]] = self
8
+ end
9
+ def process(string)
10
+ users = string =~ /(\d+) users/ ? $1 : 0
11
+ invis = string =~ /(\d+) invisible/ ? $1 : 0
12
+ servs = string =~ /(\d+) servers/ ? $1 : 0
13
+ services = string =~ /(\d+) services/ ? $1 : 0
14
+ return Messages::Incoming::LuserClient.new(string, users, invis, servs, services)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,16 @@
1
+ require 'mod_spox/handlers/Handler'
2
+ require 'mod_spox/messages/incoming/LuserMe'
3
+ module ModSpox
4
+ module Handlers
5
+ class LuserMe < Handler
6
+ def initialize(handlers)
7
+ handlers[RFC[:RPL_LUSERME][:value]] = self
8
+ end
9
+ def process(string)
10
+ clients = string =~ /(\d+) clients/ ? $1.to_i : 0
11
+ servers = string =~ /(\d+) server/ ? $1.to_i : 0
12
+ return Messages::Incoming::LuserMe.new(string, clients, servers)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,19 @@
1
+ require 'mod_spox/handlers/Handler'
2
+ require 'mod_spox/messages/incoming/LuserOp'
3
+ module ModSpox
4
+ module Handlers
5
+ class LuserOp < Handler
6
+ def initialize(handlers)
7
+ handlers[RFC[:RPL_LUSEROP][:value]] = self
8
+ end
9
+ def process(string)
10
+ if(string =~ /(\d+) :.*?\s*[oO]perators/)
11
+ return Messages::Incoming::LuserOp.new(string, $1.to_i)
12
+ else
13
+ Logger.warn('Failed to match RPL_LUSEROP message')
14
+ return nil
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ require 'mod_spox/handlers/Handler'
2
+ require 'mod_spox/messages/incoming/LuserUnknown'
3
+ module ModSpox
4
+ module Handlers
5
+ class LuserUnknown < Handler
6
+ def initialize(handlers)
7
+ handlers[RFC[:RPL_LUSERUNKNOWN][:value]] = self
8
+ end
9
+ def process(string)
10
+ if(string =~ /(\d+) :.*[Uu]nknown/)
11
+ return Messages::Incoming::LuserUnknown.new(string, $1.to_i)
12
+ else
13
+ Logger.warn('Failed to match RPL_LUSERUNKNOWN message')
14
+ return nil
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,62 @@
1
+ require 'mod_spox/handlers/Handler'
2
+ require 'mod_spox/messages/incoming/Mode'
3
+ module ModSpox
4
+ module Handlers
5
+ class Mode < Handler
6
+ def initialize(handlers)
7
+ handlers[:MODE] = self
8
+ end
9
+
10
+ # :spax!~spox@host MODE #m +o spax
11
+ # :spax MODE spax :+iw
12
+ def process(string)
13
+ orig = string.dup
14
+ string = string.dup
15
+ begin
16
+ string.slice!(0)
17
+ if(string.index('!').nil?) # looks like self mode
18
+ source = find_model(string.slice!(0..string.index(' ')-1))
19
+ 2.times{string.slice!(0..string.index(' '))}
20
+ target = find_model(string.slice!(0..string.index(' ')-1))
21
+ string.slice!(0..string.index(':'))
22
+ action = string.slice!(0)
23
+ action == '+' ? target.set_mode(string) : target.unset_mode(string)
24
+ return Messages::Incoming::Mode.new(orig, "#{action}#{string}", source, target, nil)
25
+ else
26
+ source = find_model(string.slice!(0..string.index('!')-1))
27
+ 2.times{string.slice!(0..string.index(' '))}
28
+ channel = find_model(string.slice!(0..string.index(' ')-1))
29
+ string.slice!(0)
30
+ modes = string.index(' ').nil? ? string.dup : string.slice!(0..string.index(' ')-1)
31
+ string[0] == ' ' ? string.slice!(0) : string = ''
32
+ action = modes.slice!(0)
33
+ if(string.size > 0) #nick modes
34
+ nicks = []
35
+ string.split.each do |n|
36
+ ni = find_model(n)
37
+ ni.add_channel(channel)
38
+ nicks << ni
39
+ end
40
+ i = 0
41
+ modes.each_char do |m|
42
+ nm = Models::NickMode.find_or_create(:channel_id => channel.pk, :nick_id => nicks[i].pk)
43
+ action == '+' ? nm.set_mode(m) : nm.unset_mode(m)
44
+ i += 1
45
+ end
46
+ nicks = nicks[0] if nicks.size == 1
47
+ return Messages::Incoming::Mode.new(orig, "#{action}#{modes}", source, nicks, channel)
48
+ else #channel modes
49
+ modes.each_char do |m|
50
+ action == '+' ? channel.set_mode(m) : channel.unset_mode(c)
51
+ end
52
+ return Messages::Incoming::Mode.new(orig, "#{action}#{modes}", source, nil, channel)
53
+ end
54
+ end
55
+ rescue Object => boom
56
+ Logger.warn("Failed to parse MODE message: #{orig}")
57
+ raise Exceptions::GeneralException.new(boom)
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,38 @@
1
+ require 'mod_spox/handlers/Handler'
2
+ require 'mod_spox/messages/incoming/Motd'
3
+ module ModSpox
4
+ module Handlers
5
+ class Motd < Handler
6
+ def initialize(handlers)
7
+ handlers[RFC[:RPL_MOTDSTART][:value]] = self
8
+ handlers[RFC[:RPL_MOTD][:value]] = self
9
+ handlers[RFC[:RPL_ENDOFMOTD][:value]] = self
10
+ @motds = Hash.new
11
+ @raw = Hash.new
12
+ end
13
+ def process(string)
14
+ if(string =~ /^:(\S+) #{RFC[:RPL_MOTDSTART][:value]}.*?:-\s?(\S+)/)
15
+ @motds[$1] = Array.new
16
+ @raw[$1] = [string]
17
+ return nil
18
+ elsif(string =~ /^:(\S+) #{RFC[:RPL_MOTD][:value]}.*?:-\s?(.+)$/)
19
+ @motds[$1] ||= []
20
+ @raw[$1] ||= []
21
+ @motds[$1] << $2
22
+ @raw[$1] << string
23
+ return nil
24
+ elsif(string =~ /^:(\S+) #{RFC[:RPL_ENDOFMOTD][:value]}/)
25
+ @raw[$1] ||= []
26
+ @motds[$1] ||= []
27
+ @raw[$1] << string
28
+ message = Messages::Incoming::Motd.new(@raw[$1].join("\n"), @motds[$1].join("\n"), $1)
29
+ @motds.delete($1)
30
+ @raw.delete($1)
31
+ return message
32
+ else
33
+ return nil
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,24 @@
1
+ require 'mod_spox/handlers/Handler'
2
+ require 'mod_spox/messages/incoming/MyInfo'
3
+ module ModSpox
4
+ module Handlers
5
+ class MyInfo < Handler
6
+ def initialize(handlers)
7
+ handlers[RFC[:RPL_MYINFO][:value]] = self
8
+ end
9
+
10
+ def process(string)
11
+ if(string =~ /^:\S+ \S+ \S+ (\S+) (\S+) (\S+) (\S+)/)
12
+ servername = $1
13
+ version = $2
14
+ usermodes = $3
15
+ channelmodes = $4
16
+ return Messages::Incoming::MyInfo.new(string, servername, version, usermodes, channelmodes)
17
+ else
18
+ Logger.warn('Failed to match My Info message')
19
+ return nil
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,86 @@
1
+ require 'mod_spox/handlers/Handler'
2
+ require 'mod_spox/messages/incoming/Names'
3
+ module ModSpox
4
+ module Handlers
5
+ class Names < Handler
6
+ def initialize(handlers)
7
+ handlers[RFC[:RPL_NAMREPLY][:value]] = self
8
+ handlers[RFC[:RPL_ENDOFNAMES][:value]] = self
9
+ @names = Hash.new
10
+ @raw = Hash.new
11
+ end
12
+
13
+ def process(string)
14
+ orig = string.dup
15
+ string = string.dup
16
+ begin
17
+ string.slice!(0..string.index(' '))
18
+ type = string.slice!(0..string.index(' ')-1)
19
+ if(type == RFC[:RPL_NAMREPLY][:value])
20
+ 3.times{ string.slice!(0..string.index(' ')) }
21
+ chan = string.slice!(0..string.index(' ')-1)
22
+ string.slice!(0..string.index(':'))
23
+ @names[chan] = Array.new unless @names[chan]
24
+ @raw[chan] = Array.new unless @raw[chan]
25
+ @raw[chan] << orig
26
+ @names[chan] += string.split
27
+ return nil
28
+ else
29
+ 2.times{ string.slice!(0..string.index(' ')) }
30
+ chan = string.slice!(0..string.index(' ')-1)
31
+ channel = find_model(chan)
32
+ @raw[chan] << orig if @raw[chan]
33
+ nicks = Array.new
34
+ ops = Array.new
35
+ voice = Array.new
36
+ raw = @raw[chan].dup if @raw[chan]
37
+ @names[chan] = [] unless @names[chan].is_a?(Array)
38
+ @names[chan].each do |n|
39
+ nick = Models::Nick.find_or_create(:nick => n.gsub(/^[@+]/, ''))
40
+ nick.visible = true
41
+ nicks << nick
42
+ if(n[0] == '@')
43
+ ops << nick
44
+ m = Models::NickMode.find_or_create(:nick_id => nick.pk, :channel_id => channel.pk)
45
+ m.set_mode('o')
46
+ elsif(n[0] == '+')
47
+ voice << nick
48
+ m = Models::NickMode.find_or_create(:nick_id => nick.pk, :channel_id => channel.pk)
49
+ m.set_mode('v')
50
+ else
51
+ m = Models::NickMode.find_or_create(:nick_id => nick.pk, :channel_id => channel.pk)
52
+ m.clear_modes
53
+ end
54
+ nick.add_channel(channel)
55
+ nick.refresh
56
+ channel.refresh
57
+ end
58
+ check_visibility(nicks, channel)
59
+ @names.delete(chan)
60
+ @raw.delete(chan)
61
+ return Messages::Incoming::Names.new(raw, channel, nicks, ops, voice)
62
+ end
63
+ rescue Object => boom
64
+ Logger.error("Failed to parse NAMES message: #{orig}")
65
+ raise Exceptions::GeneralException.new(boom)
66
+ end
67
+ end
68
+
69
+ # nicks:: list of nicks in channel
70
+ # channel:: channel nicks are in
71
+ # Remove visibility from any nicks that aren't really
72
+ # in the channel
73
+ def check_visibility(nicks, channel)
74
+ channel.nicks.each do |nick|
75
+ unless(nicks.include?(nick))
76
+ channel.remove_nick(nick)
77
+ unless(nick.botnick)
78
+ nick.refresh
79
+ nick.update(:visible => false) if (Models::Nick.filter(:botnick => true).first.channels & nick.channels).empty?
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,50 @@
1
+ require 'mod_spox/handlers/Handler'
2
+ require 'mod_spox/messages/incoming/Nick'
3
+ module ModSpox
4
+ module Handlers
5
+ class Nick < Handler
6
+ def initialize(handlers)
7
+ handlers[:NICK] = self
8
+ end
9
+ # :spox!~spox@some.random.host NICK :flock_of_deer
10
+ def process(string)
11
+ orig = string.dup
12
+ string = string.dup
13
+ begin
14
+ string.slice!(0)
15
+ old_nick = find_model(string.slice!(0..string.index('!')-1))
16
+ string.slice!(0..string.index(':'))
17
+ new_nick = find_model(string)
18
+ old_nick.channels.each do |channel|
19
+ channel.remove_nick(old_nick)
20
+ channel.add_nick(new_nick)
21
+ m = Models::NickMode.filter(:nick_id => old_nick.pk, :channel_id => channel.pk).first
22
+ if(m)
23
+ m.nick_id = new_nick.pk
24
+ m.save
25
+ end
26
+ end
27
+ new_nick.username = old_nick.username
28
+ new_nick.address = old_nick.address
29
+ new_nick.real_name = old_nick.real_name
30
+ new_nick.connected_to = old_nick.connected_to
31
+ new_nick.away = old_nick.away
32
+ new_nick.visible = true
33
+ new_nick.save_changes
34
+ old_nick.visible = false
35
+ old_nick.remove_all_channels
36
+ if(old_nick.botnick == true)
37
+ old_nick.botnick = false
38
+ new_nick.botnick = true
39
+ end
40
+ new_nick.save
41
+ old_nick.save
42
+ return Messages::Incoming::Nick.new(orig, old_nick, new_nick)
43
+ rescue Object => boom
44
+ Logger.error("Failed to parse NICK message: #{orig}")
45
+ raise Exceptions::GeneralException.new(boom)
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,19 @@
1
+ require 'mod_spox/handlers/Handler'
2
+ require 'mod_spox/messages/incoming/NickInUse'
3
+ module ModSpox
4
+ module Handlers
5
+ class NickInUse < Handler
6
+ def initialize(handlers)
7
+ handlers[RFC[:ERR_NICKNAMEINUSE][:value]] = self
8
+ end
9
+ def process(string)
10
+ if(string =~ /#{RFC[:ERR_NICKNAMEINUSE][:value]}\s\S+\s(\S+)\s:/)
11
+ return Messages::Incoming::NickInUse.new(string, $1)
12
+ else
13
+ Logger.warn('Failed to parse ERR_NICKNAMEINUSE message')
14
+ return nil
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,35 @@
1
+ require 'mod_spox/handlers/Handler'
2
+ require 'mod_spox/messages/incoming/Notice'
3
+ module ModSpox
4
+ module Handlers
5
+ class Notice < Handler
6
+ def initialize(handlers)
7
+ handlers[:NOTICE] = self
8
+ end
9
+
10
+ def process(string)
11
+ if(string =~ /:(\S+)\sNOTICE\s(\S+)\s:(.+)$/)
12
+ base_source = $1
13
+ target = $2
14
+ message = $3
15
+ if(base_source =~ /\!/)
16
+ source = find_model(base_source.gsub(/!.+$/, ''))
17
+ if(base_source =~ /!(.+)@(.+)$/)
18
+ source.username == $1
19
+ source.address = $2
20
+ source.source = base_source
21
+ source.save_changes
22
+ end
23
+ target = find_model(target)
24
+ else
25
+ source = base_source
26
+ end
27
+ return Messages::Incoming::Notice.new(string, source, target, message)
28
+ else
29
+ Logger.warn('Failed to match NOTICE message')
30
+ return nil
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,39 @@
1
+ require 'mod_spox/handlers/Handler'
2
+ require 'mod_spox/messages/incoming/Part'
3
+ module ModSpox
4
+ module Handlers
5
+ class Part < Handler
6
+ def initialize(handlers)
7
+ handlers[:PART] = self
8
+ end
9
+
10
+ # :mod_spox!~mod_spox@host PART #m :
11
+ # :guy2net!~guy2net@92-239-14-145.cable.ubr15.haye.blueyonder.co.uk PART #php
12
+
13
+ def process(string)
14
+ string = string.dup
15
+ orig = string.dup
16
+ begin
17
+ string.slice!(0)
18
+ nick = find_model(string.slice!(0..string.index('!')-1))
19
+ 2.times{ string.slice!(0..string.index(' ')) }
20
+ unless(string.index(' ').nil?)
21
+ channel = find_model(string.slice!(0..string.index(' ')-1))
22
+ string.slice!(0..string.index(':'))
23
+ else
24
+ channel = find_model(string)
25
+ string = ''
26
+ end
27
+ channel.remove_nick(nick)
28
+ nick.visible = false if nick.channels.empty?
29
+ nick.save_changes
30
+ channel.save_changes
31
+ return Messages::Incoming::Part.new(orig, channel, nick, string)
32
+ rescue Object => boom
33
+ Logger.error("Failed to parse PART message: #{orig}")
34
+ raise Exceptions::GeneralException.new(boom)
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,25 @@
1
+ require 'mod_spox/handlers/Handler'
2
+ require 'mod_spox/messages/incoming/Ping'
3
+ module ModSpox
4
+ module Handlers
5
+ class Ping < Handler
6
+ def initialize(handlers)
7
+ handlers[:PING] = self
8
+ end
9
+ def process(string)
10
+ orig = string.dup
11
+ string = string.dup
12
+ begin
13
+ string.slice!(0) if string[0] == ':'
14
+ server = string[0..string.index(' ')-1]
15
+ message = string[string.index(':')+1..string.size]
16
+ server = message.dup if server == 'PING'
17
+ return Messages::Incoming::Ping.new(orig, server, message)
18
+ rescue Object => boom
19
+ Logger.error("Failed to parse PING message: #{string}")
20
+ raise Exceptions::GeneralException.new(boom)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,23 @@
1
+ require 'mod_spox/handlers/Handler'
2
+ require 'mod_spox/messages/incoming/Pong'
3
+ module ModSpox
4
+ module Handlers
5
+ class Pong < Handler
6
+ def initialize(handlers)
7
+ handlers[:PONG] = self
8
+ end
9
+ def process(string)
10
+ orig = string.dup
11
+ string = string.dup
12
+ begin
13
+ a = string.slice!(string.rindex(':')+1, string.size)
14
+ string.slice!(-2..string.size)
15
+ return Messages::Incoming::Pong.new(orig, string.slice(string.rindex(' ')+1..string.size), a)
16
+ rescue Object => boom
17
+ Logger.error("Failed to parse PONG message: #{orig}")
18
+ raise Exceptions::GeneralException.new(boom)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,39 @@
1
+ require 'mod_spox/handlers/Handler'
2
+ require 'mod_spox/messages/incoming/Privmsg'
3
+ module ModSpox
4
+ module Handlers
5
+ class Privmsg < Handler
6
+ def initialize(handlers)
7
+ handlers[:PRIVMSG] = self
8
+ end
9
+
10
+ # :spox!~spox@host PRIVMSG #m :foobar
11
+ def process(string)
12
+ orig = string.dup
13
+ string = string.dup
14
+ begin
15
+ string.slice!(0)
16
+ base_source = string.slice!(0..string.index(' ')-1)
17
+ orig_source = base_source.dup
18
+ string.slice!(0..string.index(' ',3))
19
+ target = find_model(string.slice!(0..string.index(' ')-1))
20
+ string.slice!(0..string.index(':'))
21
+ string.strip!
22
+ source = find_model(base_source.slice!(0..base_source.index('!')-1))
23
+ base_source.slice!(0)
24
+ source.username = base_source.slice!(0..base_source.index('@')-1)
25
+ base_source.slice!(0)
26
+ source.address = base_source.strip
27
+ source.source = orig_source
28
+ source.save_changes
29
+ source.add_channel(target) if target.is_a?(Models::Channel)
30
+ return Messages::Incoming::Privmsg.new(orig, source, target, string)
31
+ rescue Object => boom
32
+ Logger.warn("Failed to parse PRIVMSG message: #{orig}")
33
+ Logger.warn("Reason for PRIVMSG failure: #{boom}")
34
+ raise Exceptions::GeneralException.new(boom)
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,29 @@
1
+ require 'mod_spox/handlers/Handler'
2
+ require 'mod_spox/messages/incoming/Quit'
3
+ module ModSpox
4
+ module Handlers
5
+ class Quit < Handler
6
+ def initialize(handlers)
7
+ handlers[:QUIT] = self
8
+ end
9
+
10
+ #:spox!~spox@host QUIT :Ping timeout
11
+ def process(string)
12
+ orig = string.dup
13
+ string = string.dup
14
+ begin
15
+ string.slice!(0)
16
+ nick = find_model(string.slice!(0..string.index('!')-1))
17
+ string.slice!(0..string.index(':'))
18
+ nick.remove_all_channels
19
+ nick.visible = false
20
+ nick.save
21
+ return Messages::Incoming::Quit.new(orig, nick, string)
22
+ rescue Object => boom
23
+ Logger.error("Failed to parse QUIT message: #{orig}")
24
+ raise Exceptions::GeneralException.new(boom)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,38 @@
1
+ require 'mod_spox/handlers/Handler'
2
+ require 'mod_spox/messages/incoming/Topic'
3
+ require 'mod_spox/messages/incoming/TopicInfo'
4
+ module ModSpox
5
+ module Handlers
6
+ class Topic < Handler
7
+ def initialize(handlers)
8
+ handlers[RFC[:RPL_TOPIC][:value]] = self
9
+ handlers[RFC[:RPL_NOTOPIC][:value]] = self
10
+ handlers[RFC[:RPL_TOPICINFO][:value]] = self
11
+ @topics = Hash.new
12
+ end
13
+
14
+ #:irc.host 332 spox #mod_spox : the topic is here
15
+ #:irc.host 333 spox #mod_spox spox 1232126516
16
+
17
+ def process(string)
18
+ if(string =~ /#{RFC[:RPL_TOPIC][:value]}.+?(\S+)\s:(.+)$/)
19
+ channel = find_model($1)
20
+ channel.update(:topic => $2)
21
+ return Messages::Incoming::Topic.new(string, channel, $2)
22
+ elsif(string =~ /#{RFC[:RPL_NOTOPIC][:value]}.+?(\S+)\s:/)
23
+ channel = find_model($1)
24
+ return Messages::Incoming::Topic.new(string, channel, nil)
25
+ elsif(string =~ /#{RFC[:RPL_TOPICINFO][:value]}\s\S+\s(\S+)\s(\S+)\s(.+)$/)
26
+ channel = find_model($1)
27
+ nick = find_model($1)
28
+ time = Time.at($3.to_i)
29
+ return Messages::Incoming::TopicInfo.new(string, channel, nick, time)
30
+ else
31
+ Logger.warn('Failed to parse TOPIC type string')
32
+ return nil
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+