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,585 @@
1
+ ['mod_spox/messages/outgoing/ChannelMode',
2
+ 'mod_spox/messages/outgoing/Kick',
3
+ 'mod_spox/messages/internal/TimerAdd',
4
+ 'mod_spox/messages/outgoing/Invite'].each{|f| require f}
5
+
6
+ class Banner < ModSpox::Plugin
7
+
8
+ include Models
9
+ include Messages::Outgoing
10
+
11
+ def initialize(pipeline)
12
+ super
13
+ admin = Group.find_or_create(:name => 'banner')
14
+ add_sig(:sig => 'ban (\S+)', :method => :default_ban, :group => admin, :desc => 'Kickban given nick from current channel', :params => [:nick])
15
+ add_sig(:sig => 'ban (\S+) (\S+)', :method => :channel_ban, :group => admin, :desc => 'Kickban given nick from given channel', :params => [:nick, :channel])
16
+ add_sig(:sig => 'ban (\S+) (\S+) (\d+) ?(.+)?', :method => :full_ban, :group => admin, :desc => 'Kickban given nick from given channel for given number of seconds', :params => [:nick, :channel, :time, :message])
17
+ add_sig(:sig => 'banmask (\S+) (\S+) (\d+) ?(.+)?', :method => :message_mask_ban, :group => admin, :desc => 'Kickban given mask from given channel for given number of seconds providing an optional message', :params => [:mask, :channel, :time, :message])
18
+ add_sig(:sig => 'banmask list', :method => :mask_list, :group => admin, :desc => 'List all currently active banmasks')
19
+ add_sig(:sig => 'banmask remove (\d+)', :method => :mask_remove, :group => admin, :desc => 'Remove a currently enabled ban mask', :params => [:id])
20
+ add_sig(:sig => 'banlist', :method => :ban_list, :group => admin, :desc => 'List all currently active bans generated from the bot')
21
+ add_sig(:sig => 'banlist remove (\d+)', :method => :ban_remove, :group => admin, :desc => 'Remove a current ban', :params => [:id])
22
+ add_sig(:sig => 'exempt mode ([ov]) ?(\S+)?', :method => :exempt_mode, :group => admin, :desc => 'Exempt given modes from kick. Apply to all channels if one is not provided', :params => [:mode, :channel])
23
+ add_sig(:sig => 'exempt nick (\S+) ?(\S+)?', :method => :exempt_nick, :group => admin, :desc => 'Exempt a nick from kicks globally or per channel', :params => [:nick, :channel])
24
+ add_sig(:sig => 'exempt source (\S+)', :method => :exempt_source, :group => admin, :desc => 'Exempt a source from kicks globally or per channel', :params => [:source, :channel])
25
+ add_sig(:sig => 'exempt list (nick|mode|source)', :method => :exempt_list, :group => admin, :desc => 'List current exemptions of given type', :params => [:type])
26
+ add_sig(:sig => 'exempt remove (nick|mode|source) (\d+)', :method => :exempt_remove, :group => admin, :desc => 'Remove exemption from given type', :params => [:type, :id])
27
+ @pipeline.hook(self, :mode_check, :Incoming_Mode)
28
+ @pipeline.hook(self, :join_check, :Incoming_Join)
29
+ @pipeline.hook(self, :who_check, :Incoming_Who)
30
+ @pipeline.hook(self, :process_ban, :Banner_Ban)
31
+ BanRecord.create_table unless BanRecord.table_exists?
32
+ BanMask.create_table unless BanMask.table_exists?
33
+ BanNickExempt.create_table unless BanNickExempt.table_exists?
34
+ BanModeExempt.create_table unless BanModeExempt.table_exists?
35
+ BanSourceExempt.create_table unless BanSourceExempt.table_exists?
36
+ load_timer
37
+ @time = Object::Time.now
38
+ end
39
+
40
+ def destroy
41
+ reset_time
42
+ end
43
+
44
+ def process_ban(message)
45
+ ban(message.nick, message.channel, message.time, message.message, message.invite?, message.display_time?)
46
+ end
47
+
48
+ def reset_time
49
+ elapsed = Object::Time.now.to_i - @time.to_i
50
+ BanRecord.filter('remaining > 0').update("remaining = remaining - #{elapsed}")
51
+ BanMask.filter('bantime > 0').update("bantime = bantime - #{elapsed}")
52
+ @time = Object::Time.now
53
+ end
54
+
55
+ # message:: ModSpox::Messages::Incoming::Privmsg
56
+ # params:: parameters
57
+ # Perform a simple ban with default values
58
+ def default_ban(message, params)
59
+ params[:time] = 86400
60
+ params[:channel] = message.target.name
61
+ full_ban(message, params)
62
+ end
63
+
64
+ # message:: ModSpox::Messages::Incoming::Privmsg
65
+ # params:: parameters
66
+ # Ban given nick in given channel
67
+ def channel_ban(message, params)
68
+ params[:time] = 86400
69
+ full_ban(message, params)
70
+ end
71
+
72
+ # message:: ModSpox::Messages::Incoming::Privmsg
73
+ # params:: parameters
74
+ # Ban nick in given channel for given time providing given message
75
+ def full_ban(message, params)
76
+ nick = Helpers.find_model(params[:nick], false)
77
+ channel = Channel.locate(params[:channel])
78
+ if(!me.is_op?(channel))
79
+ reply(message.replyto, "Error: I'm not a channel operator")
80
+ elsif(!nick)
81
+ reply(message.replyto, "#{message.source.nick}: Failed to find nick #{params[:nick]}")
82
+ elsif(!channel)
83
+ reply(message.replyto, "#{message.source.nick}: Failed to find channel #{params[:channel]}")
84
+ else
85
+ ban(nick, channel, params[:time], params[:message])
86
+ end
87
+ end
88
+
89
+ # nick:: ModSpox::Models::Nick to ban
90
+ # channel:: ModSpox::Models::Channel to ban nick from
91
+ # time:: number of seconds ban should last
92
+ # reason:: reason for the ban
93
+ # invite:: invite nick back to channel when ban expires
94
+ # show_time:: show ban time in kick message
95
+ def ban(nick, channel, time, reason, invite=false, show_time=true)
96
+ raise Exceptions::InvalidType.new("Nick given is not a nick model") unless nick.is_a?(Models::Nick)
97
+ raise Exceptions::InvalidType.new("Channel given is not a channel model") unless channel.is_a?(Models::Channel)
98
+ if(!me.is_op?(channel))
99
+ raise NotOperator.new("I am not an operator in #{channel.name}")
100
+ elsif(!nick.channels.include?(channel))
101
+ raise NotInChannel.new("#{nick.nick} is not in channel: #{channel.name}")
102
+ elsif(check_exempt(nick, channel))
103
+ raise BanExemption.new("This nick is exempt from bans: #{nick.nick}")
104
+ else
105
+ reset_time
106
+ mask = nick.address.nil? || nick.address.empty? ? "#{nick.nick}!*@*" : "*!*@#{nick.address}"
107
+ record = BanRecord.filter(:nick_id => nick.pk, :channel_id => channel.pk, :mask => mask, :removed => false).first
108
+ if(record)
109
+ record.bantime = record.bantime + time.to_i
110
+ record.remaining = record.remaining + time.to_i
111
+ record.save
112
+ else
113
+ record = BanRecord.new(:nick_id => nick.pk, :bantime => time.to_i, :remaining => time.to_i,
114
+ :invite => invite, :channel_id => channel.pk, :mask => mask)
115
+ record.save
116
+ end
117
+ @pipeline << Messages::Internal::TimerAdd.new(self, record.remaining, nil, true){ clear_record(record.pk, record.remaining) }
118
+ reset_time
119
+ message = reason ? reason : 'no soup for you!'
120
+ message = "#{message} (Duration: #{Helpers.format_seconds(time.to_i)})" if show_time
121
+ @pipeline << ChannelMode.new(channel, '+b', mask)
122
+ @pipeline << Kick.new(nick, channel, message)
123
+ end
124
+ end
125
+
126
+ # mask:: mask to match against source (Regexp)
127
+ # channel:: ModSpox::Models::Channel to ban from
128
+ # message:: kick message
129
+ # time:: time ban on mask should stay in place
130
+ # Bans all users who's source matches the given mask
131
+ def mask_ban(mask, channel, message, time)
132
+ raise NotInChannel.new("I am not in channel: #{channel.name}") unless me.channels.include?(channel)
133
+ reset_time
134
+ record = BanMask.new(:mask => mask, :channel_id => channel.pk, :message => message, :bantime => time.to_i, :stamp => Object::Time.now)
135
+ record.save
136
+ check_masks
137
+ @pipeline << Messages::Internal::TimerAdd.new(self, record.bantime, nil, true){ record.destroy }
138
+ reset_time
139
+ end
140
+
141
+ # message:: ModSpox::Messages::Incoming::Privmsg
142
+ # params:: parameters
143
+ # Set a ban on any nick with a source match given regex
144
+ def message_mask_ban(message, params)
145
+ channel = params[:channel] ? Channel.filter(:name => params[:channel]).first : message.target
146
+ if(channel)
147
+ begin
148
+ mask_ban(params[:mask], channel, params[:message], params[:time])
149
+ reply(message.replyto, "Okay")
150
+ rescue Object => boom
151
+ reply(message.replyto, "Error: Failed to ban mask. Reason: #{boom}")
152
+ Logger.warn("ERROR: #{boom} #{boom.backtrace.join("\n")}")
153
+ end
154
+ else
155
+ reply(message.replyto, "Error: No record of channel: #{params[:channel]}")
156
+ end
157
+ end
158
+
159
+ # message:: ModSpox::Messages::Incoming::Privmsg
160
+ # params:: parameters
161
+ # List all ban masks
162
+ def mask_list(message, params)
163
+ if(BanMask.all.size > 0)
164
+ reply(message.replyto, "Masks currently banned:")
165
+ BanMask.all.each do |mask|
166
+ reply(message.replyto, "\2ID:\2 #{mask.pk} \2Mask:\2 #{mask.mask} \2Time:\2 #{Helpers.format_seconds(mask.bantime.to_i - (Object::Time.now.to_i - @time.to_i))} \2Channel:\2 #{mask.channel.name}")
167
+ end
168
+ else
169
+ reply(message.replyto, "No ban masks currently enabled")
170
+ end
171
+ end
172
+
173
+ # message:: ModSpox::Messages::Incoming::Privmsg
174
+ # params:: parameters
175
+ # Remove ban mask with given ID
176
+ def mask_remove(message, params)
177
+ mask = BanMask[params[:id].to_i]
178
+ if(mask)
179
+ mask.destroy
180
+ reply(message.replyto, 'Okay')
181
+ else
182
+ reply(message.replyto, "\2Error:\2 Failed to find ban mask with ID: #{params[:id]}")
183
+ end
184
+ end
185
+
186
+ # message:: ModSpox::Messages::Incoming::Privmsg
187
+ # params:: parameters
188
+ # List all currently active bans originating from the bot
189
+ def ban_list(message, params)
190
+ set = BanRecord.filter(:removed => false)
191
+ if(set.count > 0)
192
+ reply(message.replyto, "Currently active bans:")
193
+ set.each do |record|
194
+ remains = record.remaining.to_i - (Object::Time.now.to_i - @time.to_i)
195
+ remains = 0 unless remains > 0
196
+ reply(message.replyto, "\2ID:\2 #{record.pk} \2Nick:\2 #{record.nick.nick} \2Channel:\2 #{record.channel.name} \2Initial time:\2 #{Helpers.format_seconds(record.bantime.to_i)} \2Time remaining:\2 #{Helpers.format_seconds(remains)}")
197
+ end
198
+ else
199
+ reply(message.replyto, "No bans currently active")
200
+ end
201
+ end
202
+
203
+ # message:: ModSpox::Messages::Incoming::Privmsg
204
+ # params:: parameters
205
+ # Remove given ban
206
+ def ban_remove(message, params)
207
+ record = BanRecord[params[:id].to_i]
208
+ if(record)
209
+ clear_record(record.pk, nil)
210
+ else
211
+ reply(message.replyto, "\2Error:\2 Failed to find ban record with ID: #{params[:id]}")
212
+ end
213
+ end
214
+
215
+ # Check all enabled ban masks and ban any matches found
216
+ def check_masks
217
+ masks = BanMask.map_masks
218
+ masks.keys.each do |channel_name|
219
+ channel = Channel.filter(:name => channel_name).first
220
+ if(me.is_op?(channel))
221
+ channel.nicks.each do |nick|
222
+ match = nil
223
+ masks[channel.name].each do |mask|
224
+ if(nick.source =~ /#{mask[:mask]}/)
225
+ match = mask if match.nil? || mask[:bantime].to_i > match[:bantime].to_i
226
+ end
227
+ end
228
+ unless match.nil?
229
+ begin
230
+ ban(nick, channel, match[:bantime], match[:message])
231
+ rescue Object => boom
232
+ Logger.warn("Mask based ban failed. Reason: #{boom}")
233
+ end
234
+ end
235
+ end
236
+ else
237
+ Logger.info("Ban masks will not be processed due to lack of operator status")
238
+ end
239
+ end
240
+ end
241
+
242
+ # nick:: ModSpox::Models::Nick
243
+ # channel:: ModSpox::Models::Channel
244
+ # Check if the nick in the channel matches any ban masks
245
+ def mask_check(nick, channel)
246
+ return unless me.is_op?(channel)
247
+ match = nil
248
+ BanMask.filter(:channel_id => channel.pk).each do |bm|
249
+ if(nick.source =~ /#{bm.mask}/)
250
+ match = bm if match.nil? || match.bantime < bm.bantime
251
+ end
252
+ end
253
+ unless(match.nil?)
254
+ begin
255
+ ban(nick, channel, match.bantime, match.message)
256
+ rescue Object => boom
257
+ Logger.warn("Mask based ban failed. Reason: #{boom}")
258
+ end
259
+ end
260
+ end
261
+
262
+ # message:: ModSpox::Messages::Incoming::Mode
263
+ # Check for mode changes. Remove pending ban removals if
264
+ # done manually
265
+ def mode_check(message)
266
+ if(message.target.is_a?(String) && message.source != me)
267
+ if(message.mode == '-b')
268
+ BanRecord.filter(:mask => message.target, :channel_id => message.channel.pk).each do |match|
269
+ match.remaining = 0
270
+ match.removed = true
271
+ match.save
272
+ end
273
+ end
274
+ end
275
+ if(message.target == me && message.mode == '+o')
276
+ check_masks
277
+ BanRecord.filter('remaining < 1 AND removed = ?', false).each do |record|
278
+ clear_record(record.pk, nil)
279
+ end
280
+ end
281
+ end
282
+
283
+ # message:: ModSpox::Messages::Incoming::Join
284
+ # Check is nick is banned
285
+ def join_check(message)
286
+ mask_check(message.nick, message.channel)
287
+ end
288
+
289
+ # message:: ModSpox::Messages::Incoming::Who
290
+ # Check if we updated any addresses
291
+ def who_check(message)
292
+ check_masks
293
+ end
294
+
295
+ def load_timer
296
+ BanRecord.filter('removed = ? AND remaining > 0', false).each do |record|
297
+ @pipeline << Messages::Internal::TimerAdd.new(self, record.remaining, nil, true){ clear_record(record.pk, record.remaining) }
298
+ end
299
+ BanMask.filter('bantime > 0').each do |record|
300
+ @pipeline << Messages::Internal::TimerAdd.new(self, record.bantime, nil, true){ record.destroy }
301
+ end
302
+ end
303
+
304
+ def clear_record(id, slept=nil)
305
+ record = BanRecord[id]
306
+ return if !record || record.removed
307
+ if(!slept.nil? && (record.remaining - slept).to_i > 0)
308
+ record.remaining = record.remaining - slept
309
+ else
310
+ record.remaining = 0
311
+ if(me.is_op?(record.channel))
312
+ @pipeline << ChannelMode.new(record.channel, '-b', record.mask)
313
+ record.removed = true
314
+ @pipeline << Invite.new(record.nick, record.channel) if record.invite
315
+ end
316
+ end
317
+ record.save
318
+ end
319
+
320
+ # message:: ModSpox::Messages::Incoming::Privmsg
321
+ # params:: parameters
322
+ # Add ban exemption for a given mode
323
+ def exempt_mode(message, params)
324
+ response = nil
325
+ if(params[:channel])
326
+ channel = Helpers.find_model(params[:channel])
327
+ if(channel.is_a?(Models::Channel))
328
+ BanModeExempt.find_or_create(:channel_id => channel.pk, :mode => params[:mode])
329
+ response = 'Mode exemption has been added'
330
+ else
331
+ response = "Failed to find given channel: #{params[:channel]}"
332
+ end
333
+ else
334
+ BanModeExempt.find_or_create(:channel_id => nil, :mode => params[:mode])
335
+ response = 'Mode exemption has been added'
336
+ end
337
+ reply message.replyto, response
338
+ end
339
+
340
+ # message:: ModSpox::Messages::Incoming::Privmsg
341
+ # params:: parameters
342
+ # Add ban exemption for a given nick
343
+ def exempt_nick(message, params)
344
+ response = ''
345
+ nick = Helpers.find_model(params[:nick])
346
+ unless(nick.is_a?(Models::Nick))
347
+ reply message.replyto, "\2Error:\2 Failed to find record of: #{params[:nick]}"
348
+ return
349
+ end
350
+ channel = params[:channel] ? Helpers.find_model(params[:channel]) : nil
351
+ if(channel)
352
+ if(channel.is_a?(Models::Channel))
353
+ BanNickExempt.find_or_create(:channel_id => channel.pk, :nick_id => nick.pk)
354
+ response = "Nick exemption for \2#{params[:nick]}\2 has been added to channel: \2#{params[:channel]}\2"
355
+ else
356
+ response = "Failed to find given channel: #{params[:channel]}"
357
+ end
358
+ else
359
+ BanNickExempt.find_or_create(:nick_id => nick.pk)
360
+ response = "Nick exemption for \2#{params[:nick]}\2 has been added for all channels"
361
+ end
362
+ reply message.replyto, response
363
+ end
364
+
365
+ # message:: ModSpox::Messages::Incoming::Privmsg
366
+ # params:: parameters
367
+ # Add ban exemption for sources matching a given mask
368
+ def exempt_source(message, params)
369
+ channel = params[:channel] ? Helpers.find_model(params[:channel]) : nil
370
+ response = ''
371
+ if(channel)
372
+ if(channel.is_a?(Models::Channel))
373
+ BanSourceExempt.find_or_create(:channel_id => channel.pk, :source => params[:source])
374
+ reponse = "Added exempt source: #{params[:source]} to channel: #{params[:channel]}"
375
+ else
376
+ response = "Failed to find given channel: #{params[:channel]}"
377
+ end
378
+ else
379
+ BanSourceExempt.find_or_create(:channel_id => nil, :source => params[:source])
380
+ response = "Added global exemption for source: #{params[:source]}"
381
+ end
382
+ reply message.replyto, response
383
+ end
384
+
385
+ # message:: ModSpox::Messages::Incoming::Privmsg
386
+ # params:: parameters
387
+ # List given type of current ban exemptions
388
+ def exempt_list(message, params)
389
+ output = []
390
+ if(params[:type] == 'nick')
391
+ output << 'Current nick exemptions:'
392
+ BanNickExempt.all.each do |record|
393
+ if(record.channel)
394
+ output << "\2#{record.pk}:\2 \2#{record.nick.nick}\2 is exempt in \2#{record.channel.name}\2"
395
+ else
396
+ output << "\2#{record.pk}:\2 \2#{record.nick.nick}\2 is exempt in \2all\2 channels"
397
+ end
398
+ end
399
+ elsif(params[:type] == 'mode')
400
+ output << 'Current mode exemptions:'
401
+ BanModeExempt.all.each do |record|
402
+ mode = record.mode == 'o' ? 'operator' : 'voice'
403
+ if(record.channel)
404
+ output << "\2#{record.pk}:\2 mode: \2#{mode}\2 is exempt in \2#{record.channel.name}\2"
405
+ else
406
+ output << "\2#{record.pk}:\2 mode: \2#{mode}\2 is exempt in \2all\2 channels"
407
+ end
408
+ end
409
+ elsif(params[:type] == 'source')
410
+ output << 'Current source exemptions:'
411
+ BanSourceExempt.all.each do |record|
412
+ if(record.channel)
413
+ output << "\2#{record.pk}:\2 sources matching: #{record.source} are exempt in \2#{record.channel.name}\2"
414
+ else
415
+ output << "\2#{record.pk}:\2 sources matching: #{record.source} are exempt in \2all\2 channels"
416
+ end
417
+ end
418
+ end
419
+ reply message.replyto, output
420
+ end
421
+
422
+ # message:: ModSpox::Messages::Incoming::Privmsg
423
+ # params:: parameters
424
+ # Remove given exemption from given list
425
+ def exempt_remove(message, params)
426
+ response = 'Exemption has been removed'
427
+ record = nil
428
+ case params[:type]
429
+ when 'nick'
430
+ record = BanNickExempt[params[:id].to_i]
431
+ when 'mode'
432
+ record = BanModeExempt[params[:id].to_i]
433
+ when 'source'
434
+ record = BanSourceExempt[params[:id].to_i]
435
+ end
436
+ if(record)
437
+ record.destroy
438
+ else
439
+ response = "Failed to find exemption of type: #{params[:type]} with ID: #{params[:id]}"
440
+ end
441
+ reply message.replyto, response
442
+ end
443
+
444
+ # nick:: ModSpox::Models::Nick
445
+ # channel:: ModSpox::Models::Channel
446
+ # Check if nick is currently exempt from bans
447
+ def check_exempt(nick, channel)
448
+ return true unless BanNickExempt.filter('nick_id = ? AND (channel_id = ? OR channel_id is null)', nick.pk, channel.pk).first.nil?
449
+ return true if !BanModeExempt.filter("mode = 'o' AND (channel_id = ? OR channel_id is null)", channel.pk).first.nil? && nick.is_op?(channel)
450
+ return true if !BanModeExempt.filter("mode = 'v' AND (channel_id = ? OR channel_id is null)", channel.pk).first.nil? && nick.is_voice?(channel)
451
+ BanSourceExempt.filter('channel_id = ? OR channel_id is null', channel.pk).each do |record|
452
+ regex = Regexp.new(record.source)
453
+ return true unless regex.match(nick.source).nil?
454
+ end
455
+ return false
456
+ end
457
+
458
+ class BanRecord < Sequel::Model
459
+ set_schema do
460
+ primary_key :id
461
+ timestamp :stamp, :null => false
462
+ integer :bantime, :null => false, :default => 1
463
+ integer :remaining, :null => false, :default => 1
464
+ varchar :mask, :null => false
465
+ boolean :invite, :null => false, :default => false
466
+ boolean :removed, :null => false, :default => false
467
+ foreign_key :channel_id, :null => false, :table => :channels, :key => :id
468
+ foreign_key :nick_id, :null => false, :table => :nicks, :key => :id
469
+ end
470
+
471
+ many_to_one :channel, :class => ModSpox::Models::Channel
472
+ many_to_one :nick, :class => ModSpox::Models::Nick
473
+
474
+ def before_create
475
+ update(:stamp => Object::Time.now)
476
+ end
477
+ end
478
+
479
+ class BanMask < Sequel::Model
480
+ set_schema do
481
+ primary_key :id
482
+ varchar :mask, :unique => true, :null => false
483
+ timestamp :stamp, :null => false
484
+ integer :bantime, :null => false, :default => 1
485
+ text :message
486
+ foreign_key :channel_id, :null => false, :table => :channels, :key => :id
487
+ end
488
+
489
+ many_to_one :channel, :class => ModSpox::Models::Channel
490
+
491
+ def self.map_masks
492
+ masks = {}
493
+ BanMask.all.each do |mask|
494
+ Logger.info("Processing mask for channel: #{mask.channel.name}")
495
+ masks[mask.channel.name] = [] unless masks.has_key?(mask.channel.name)
496
+ masks[mask.channel.name] << {:mask => mask.mask, :message => mask.message, :bantime => mask.bantime, :channel => mask.channel}
497
+ end
498
+ return masks
499
+ end
500
+ end
501
+
502
+ class BanNickExempt < Sequel::Model
503
+ set_schema do
504
+ primary_key :id
505
+ foreign_key :nick_id, :table => :nicks, :null => false, :key => :id
506
+ foreign_key :channel_id, :table => :channels, :key => :id
507
+ end
508
+
509
+ many_to_one :nick, :class => ModSpox::Models::Nick
510
+ many_to_one :channel, :class => ModSpox::Models::Channel
511
+ end
512
+
513
+ class BanSourceExempt < Sequel::Model
514
+ set_schema do
515
+ primary_key :id
516
+ varchar :source, :null => false
517
+ foreign_key :channel_id, :table => :channels, :key => :id
518
+ end
519
+
520
+ many_to_one :channel, :class => ModSpox::Models::Channel
521
+
522
+ def mask
523
+ return values[:source] ? Marshal.load(values[:source].unpack('m')[0]) : nil
524
+ end
525
+
526
+ def mask=(val)
527
+ update(:source => [Marshal.dump(val)].pack('m'))
528
+ end
529
+
530
+ end
531
+
532
+ class BanModeExempt < Sequel::Model
533
+ set_schema do
534
+ primary_key :id
535
+ varchar :mode, :null => false
536
+ foreign_key :channel_id, :table => :channels, :key => :id
537
+ index [:channel_id, :mode]
538
+ end
539
+
540
+ many_to_one :channel, :class => ModSpox::Models::Channel
541
+ end
542
+
543
+ class NotOperator < Exceptions::BotException
544
+ end
545
+
546
+ class NotInChannel < Exceptions::BotException
547
+ end
548
+
549
+ class BanExemption < Exceptions::BotException
550
+ end
551
+
552
+ class Ban
553
+ # Nick to be kicked
554
+ attr_reader :nick
555
+ # Channel to be kicked from
556
+ attr_reader :channel
557
+ # Type of ban: :ban, :kick, :kickban
558
+ attr_reader :type
559
+ # Ban time (0 for no ban)
560
+ attr_reader :time
561
+ # Message to display in kick
562
+ attr_reader :message
563
+ def initialize(nick, channel, type=:kickban, message=nil, time=30, invite=false, display_time=false)
564
+ @nick = nick
565
+ @channel = channel
566
+ raise ModSpox::Exceptions::InvalidType.new('Ban requires a valid type (:ban, :kick, :kickban)') unless [:kick, :ban, :kickban].include?(type)
567
+ @type = type
568
+ @time = time.to_i
569
+ @message = message
570
+ @display_time = display_time ? true : false
571
+ @invite = invite ? true : false
572
+ end
573
+
574
+ # Display ban time in kick message
575
+ def display_time?
576
+ return @display_time
577
+ end
578
+
579
+ # Invite user to channel after ban expiration
580
+ def invite?
581
+ return @invite
582
+ end
583
+ end
584
+
585
+ end
@@ -0,0 +1,18 @@
1
+ class BotNick < ModSpox::Plugin
2
+
3
+ def initialize(pipeline)
4
+ super(pipeline)
5
+ @pipeline.hook(self, :shutdown, :Internal_Shutdown)
6
+ end
7
+
8
+ def shutdown(message)
9
+ clear_nicks
10
+ end
11
+
12
+ private
13
+
14
+ def clear_nicks
15
+ Models::Nick.filter(:botnick => true).each{|nick| nick.botnick = false; nick.save}
16
+ end
17
+
18
+ end
@@ -0,0 +1,49 @@
1
+ class Helper < ModSpox::Plugin
2
+
3
+ include Models
4
+
5
+ def initialize(pipeline)
6
+ super(pipeline)
7
+ add_sig(:sig => 'help', :method => :default_help, :desc => 'Display default help information')
8
+ add_sig(:sig => 'help (\S+)', :method => :plugin_help, :desc => 'Display help information from given plugin', :params => [:plugin])
9
+ end
10
+
11
+ def default_help(message, params)
12
+ plugins = Signature.select(:plugin).map(:plugin)
13
+ plugins.uniq!
14
+ reply message.replyto, "Plugins currently available for help: #{plugins.sort.join(', ')}"
15
+ reply message.replyto, "Request help on a plugin: #{Models::Trigger.filter(:active => true).first.trigger}help Plugin"
16
+ end
17
+
18
+ def plugin_help(message, params)
19
+ sigs = []
20
+ Signature.all.each{|s| sigs << s if s.plugin.downcase == params[:plugin].downcase}
21
+ if(sigs.size > 0)
22
+ output = []
23
+ output << "Available triggers for plugin: \2#{params[:plugin]}\2"
24
+ sigs.each do |sig|
25
+ help = []
26
+ help << "\2Pattern:\2 #{sig.signature}"
27
+ help << "\2Parameters:\2 [#{sig.params.join(' | ')}]" if sig.params
28
+ help << "\2Auth Group:\2 #{Group[sig.group_id].name}" if sig.group_id
29
+ help << "\2Description:\2 #{sig.description}" if sig.description
30
+ help << "\2Requirement:\2 #{['public', 'private'].include?(sig.requirement) ? sig.requirement : 'both'}"
31
+ output << help.join(' ')
32
+ end
33
+ if(message.is_dcc?)
34
+ reply message.replyto, output
35
+ else
36
+ reply message.source, output
37
+ end
38
+ else
39
+ Signature.all.each{|s| sigs << s.plugin if /#{s.signature.gsub(/(\s|\().*$/, '')}/ =~ params[:plugin]}
40
+ if(sigs.count > 0)
41
+ sigs.uniq!
42
+ reply message.replyto, "Possible plugin matches for \2#{params[:plugin]}\2: #{sigs.sort.join(', ')}"
43
+ else
44
+ reply message.replyto, "\2Error:\2 No triggers found for plugin named: #{params[:plugin]}"
45
+ end
46
+ end
47
+ end
48
+
49
+ end
@@ -0,0 +1,35 @@
1
+ ['mod_spox/messages/internal/EstablishConnection',
2
+ 'mod_spox/messages/internal/Reconnect',
3
+ 'mod_spox/messages/outgoing/Nick',
4
+ 'mod_spox/messages/outgoing/User'].each{|f| require f}
5
+ class Initializer < ModSpox::Plugin
6
+
7
+ def initialize(pipeline)
8
+ super(pipeline)
9
+ @pipeline.hook(self, :connect, :Internal_BotInitialized)
10
+ @pipeline.hook(self, :send_info, :Internal_Connected)
11
+ @pipeline.hook(self, :reconnect, :Internal_ConnectionFailed)
12
+ @pipeline.hook(self, :reconnect, :Internal_Disconnected)
13
+ @servers = Array.new
14
+ end
15
+
16
+ # message:: ModSpox::Messages::Internal::BotInitialized
17
+ # Instructs bot to connect to server
18
+ def connect(message)
19
+ @pipeline << Messages::Internal::EstablishConnection.new
20
+ end
21
+
22
+ # message:: ModSpox::Messages::Internal::Connected
23
+ # Send bot information to server when connection is established
24
+ def send_info(message)
25
+ @pipeline << Messages::Outgoing::Nick.new(Models::Config.val(:bot_nick))
26
+ @pipeline << Messages::Outgoing::User.new(Models::Config.val(:bot_username), Models::Config.val(:bot_realname), 8)
27
+ end
28
+
29
+ # message:: ModSpox::Messages::Internal::ConnectionFailed or ModSpox::Messages::Internal::Disconnected
30
+ # Reconnect to server on disconnection or connection failure
31
+ def reconnect(message)
32
+ @pipeline << Messages::Internal::Reconnect.new
33
+ end
34
+
35
+ end