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,122 @@
1
+ require 'mod_spox/messages/outgoing/ChannelMode'
2
+ class AutoMode < ModSpox::Plugin
3
+
4
+ include Models
5
+
6
+ def initialize(pipeline)
7
+ super
8
+ @admin = Group.find_or_create(:name => 'moder')
9
+ @user = Group.find_or_create(:name => 'modee')
10
+ add_sig(:sig => 'addop (\S+)', :method => :addop, :group => @admin, :desc => 'Add a nick to the auto op list', :req => 'public', :params => [:nick])
11
+ add_sig(:sig => 'addvoice (\S+)', :method => :addvoice, :group => @admin, :desc => 'Add a nick to the auto voice list', :req => 'public', :params => [:nick])
12
+ add_sig(:sig => 'op', :method => :op, :group => @user, :desc => 'Instruct bot to give you operator status', :req => 'public')
13
+ add_sig(:sig => 'voice', :method => :voice, :group => @user, :desc => 'Instruct bot to give you voice status', :req => 'public')
14
+ add_sig(:sig => 'automode list (\S+)', :method => :list, :group => @admin, :desc => 'Show list of current auto-modes for channel', :params => [:channel])
15
+ add_sig(:sig => 'delmode (\S+)', :method => :remove, :group => @admin, :desc => 'Remove nick from any auto-modes in channel', :req => 'public', :params => [:nick])
16
+ ModeRecord.create_table unless ModeRecord.table_exists?
17
+ @pipeline.hook(self, :check_join, :Incoming_Join)
18
+ end
19
+
20
+ def addop(m, p)
21
+ nick = Helpers.find_model(p[:nick], false)
22
+ if(nick.is_a?(Nick))
23
+ ModeRecord.find_or_create(:nick_id => nick.pk, :channel_id => m.target.pk, :voice => false)
24
+ add_modee(nick)
25
+ reply m.replyto, "#{nick.nick} has been added to the auto-op list"
26
+ else
27
+ reply m.replyto, "\2Error:\2 Failed to find record of: #{p[:nick]}"
28
+ end
29
+ end
30
+
31
+ def addvoice(m, p)
32
+ nick = Helpers.find_model(p[:nick], false)
33
+ if(nick.is_a?(Nick))
34
+ ModeRecord.find_or_create(:nick_id => nick.pk, :channel_id => m.target.pk, :voice => true)
35
+ add_modee(nick)
36
+ reply m.replyto, "#{nick.nick} has been added to the auto-voice list"
37
+ else
38
+ reply m.replyto, "\2Error:\2 Failed to find record of: #{p[:nick]}"
39
+ end
40
+ end
41
+
42
+ def op(m, p)
43
+ record = ModeRecord.filter(:nick_id => m.source.pk, :channel_id => m.target.pk).first
44
+ if(record && !record.voice)
45
+ @pipeline << Messages::Outgoing::ChannelMode.new(m.target, '+o', m.source.nick) if me.is_op?(m.target)
46
+ else
47
+ reply m.replyto, "\2Error:\2 You are not listed on the auto-op list"
48
+ end
49
+ end
50
+
51
+ def voice(m, p)
52
+ ModeRecord.filter(:nick_id => m.source.pk, :channel_id => m.target.pk).each do |record|
53
+ @pipeline << Messages::Outgoing::ChannelMode.new(m.target, '+v', m.source.nick) if me.is_op?(m.target) && record.voice
54
+ end
55
+ end
56
+
57
+ def list(m, p)
58
+ channel = Helpers.find_model(p[:channel], false)
59
+ if(channel.is_a?(Channel))
60
+ records = ModeRecord.filter(:channel_id => channel.pk)
61
+ if(records.count > 0)
62
+ reply m.replyto, "\2Auto-Mode Listing:\2"
63
+ sleep(0.01)
64
+ records.each do |record|
65
+ reply m.replyto, "#{record.nick.nick} \2->\2 #{record.voice == false ? "op" : "voice"}"
66
+ end
67
+ else
68
+ reply m.replyto, "\2Warning:\2 No users found in auto-mode list"
69
+ end
70
+ else
71
+ reply m.replyto, "\2Error:\2 Failed to find channel: #{p[:channel]}"
72
+ end
73
+ end
74
+
75
+ def remove(m, p)
76
+ nick = Helpers.find_model(p[:nick], false)
77
+ if(nick.is_a?(Nick))
78
+ ModeRecord.filter(:channel_id => m.target.pk, :nick_id => nick.pk).destroy
79
+ remove_modee(nick)
80
+ reply m.replyto, "All auto-modes for user: #{p[:nick]} have been removed"
81
+ else
82
+ reply m.replyto, "\2Error:\2 Failed to find nick: #{p[:nick]}"
83
+ end
84
+ end
85
+
86
+ def check_join(m)
87
+ return unless me.is_op?(m.channel)
88
+ matches = ModeRecord.filter(:nick_id => m.nick.pk, :channel_id => m.channel.pk)
89
+ if(matches.count > 0)
90
+ matches.each do |record|
91
+ mode = record.voice ? '+v' : '+o'
92
+ @pipeline << Messages::Outgoing::ChannelMode.new(m.channel, mode, m.nick.nick)
93
+ end
94
+ end
95
+ end
96
+
97
+ def add_modee(nick)
98
+ modee = Group.find_or_create(:name => 'modee')
99
+ nick.group = modee
100
+ end
101
+
102
+ def remove_modee(nick)
103
+ modee = Group.find_or_create(:name => 'modee')
104
+ if(ModeRecord.filter(:nick_id => nick.pk).count < 1)
105
+ nick.remove_group(modee)
106
+ end
107
+ end
108
+
109
+ class ModeRecord < Sequel::Model
110
+ set_schema do
111
+ primary_key :id
112
+ boolean :voice, :null => false, :default => true
113
+ foreign_key :nick_id, :table => :nicks, :null => false
114
+ foreign_key :channel_id, :table => :channels, :null => false
115
+ index [:nick_id, :channel_id, :voice], :unique => true
116
+ end
117
+
118
+ many_to_one :channel, :class => ModSpox::Models::Channel
119
+ many_to_one :nick, :class => ModSpox::Models::Nick
120
+ end
121
+
122
+ end
@@ -0,0 +1,37 @@
1
+ require 'mod_spox/messages/outgoing/Join'
2
+
3
+ class AutoRejoin < ModSpox::Plugin
4
+
5
+ def initialize(pipeline)
6
+ super
7
+ @pipeline.hook(self, :check_kick, :Incoming_Kick)
8
+ @pipeline.hook(self, :check_join, :Incoming_Join)
9
+ @pipeline.hook(self, :check_part, :Incoming_Part)
10
+ @pipeline.hook(self, :do_joins, :Incoming_Welcome)
11
+ end
12
+
13
+ def check_kick(message)
14
+ if(message.kickee == me)
15
+ @pipeline << Messages::Outgoing::Join.new(message.channel)
16
+ end
17
+ end
18
+
19
+ def check_join(m)
20
+ if(m.nick == me)
21
+ m.channel.update(:autojoin => true)
22
+ end
23
+ end
24
+
25
+ def check_part(m)
26
+ if(m.nick == me)
27
+ m.channel.update(:autojoin => false)
28
+ end
29
+ end
30
+
31
+ def do_joins(m)
32
+ Models::Channel.filter(:autojoin => true).each do |channel|
33
+ @pipeline << Messages::Outgoing::Join.new(channel)
34
+ end
35
+ end
36
+
37
+ end
@@ -0,0 +1,55 @@
1
+ # ex: set ts=4 et:
2
+ require "net/http"
3
+ require "cgi"
4
+
5
+ # bash.org quote plugin
6
+ # by pizza
7
+
8
+ class Bash < ModSpox::Plugin
9
+
10
+ def initialize(pipeline)
11
+ super
12
+ add_sig(:sig => 'bash( (top|latest|#\d+))?', :method => :random, :desc => 'Bash quote fetcher', :params => [:wspace, :cmd])
13
+ @site = 'http://bash.org/'
14
+ end
15
+
16
+ def random(m, params)
17
+ begin
18
+ u = @site + '?top'
19
+ if 'latest' == params[:cmd]
20
+ u = @site + '?latest'
21
+ elsif /^#(\d+)$/.match(params[:cmd])
22
+ u = @site + '?' + $1
23
+ end
24
+ reply m.replyto, get_text(u)
25
+ rescue Object => boom
26
+ error m.replyto, "Failed to fetch. #{boom}"
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ def get_text(url)
33
+ begin
34
+ data = Net::HTTP.get_response(URI.parse(url)).body
35
+ # parse individual entries, they have a "qt" section within "quote"
36
+ m = data.scan(/<p class="qt">(.*?)<\/p>/m)
37
+ raise 'No quotes found' unless m.length > 0
38
+ if m.length > 1
39
+ m = m.delete_if{|x| x[0].length > 200 }
40
+ raise 'Only overly long quotes found' unless m.length > 0
41
+ end
42
+ i = rand(m.length) # NOTE: this works fine for individuals, since rand(1) is always 0
43
+ n = m[i][0].gsub(/<[^<]+>/, '') # select a random quote
44
+ o = Helpers.convert_entities(n) # unescape html entities
45
+ p = o.gsub("\r\n", " ").strip # replace newlines with spaces and trim
46
+ q = p.gsub(/(<([^>]+)>(?:[^<]+))<\2>/){ $1 } # replace duplicated name tags; condense lines
47
+ r = q.gsub(/\s{2,}/, ' ') # condense spaces
48
+ return r
49
+ rescue Object => boom
50
+ Logger.error(boom)
51
+ raise boom
52
+ end
53
+ end
54
+ end
55
+
@@ -0,0 +1,220 @@
1
+ require 'openssl'
2
+
3
+ class Bouncer < ModSpox::Plugin
4
+
5
+ def initialize(pipeline)
6
+ super
7
+ bounce = Group.find_or_create(:name => 'bouncer')
8
+ add_sig(:sig => 'bouncer port( (\d+))?', :method => :port, :group => bounce, :desc => 'Show or set bouncer port',
9
+ :params => [:port])
10
+ add_sig(:sig => 'bouncer (start|stop|restart)', :method => :do_service, :group => bounce, :desc => 'Start, stop, or restart bouncer')
11
+ add_sig(:sig => 'bouncer status', :method => :status, :group => bounce, :desc => 'Show current bouncer status')
12
+ add_sig(:sig => 'bouncer disconnect', :method => :disconnect, :group => bounce, :desc => 'Disconnect all connected clients')
13
+ add_sig(:sig => 'bouncer clients'< :method => :clients, :group => bounce, :desc => 'List clients connected to bouncer')
14
+ @pipeline.hook(self, :get_msgs, :Incoming)
15
+ @listener = nil
16
+ @clients = []
17
+ @socket = nil
18
+ @processor = nil
19
+ @to_server = Queue.new
20
+ start_listener if Models::Config.filter(:name => 'bouncer_port').count > 0
21
+ end
22
+
23
+ def get_msgs(message)
24
+ unless(@clients.empty?)
25
+ Logger.info("Bouncer has #{@clients.size} clients to send a message to")
26
+ @clients.each do |client|
27
+ begin
28
+ output = message.raw_content.is_a?(Array) ? message.raw_content.join("\n") : message.raw_content + "\n"
29
+ client[:connection].puts(output)
30
+ rescue Object => boom
31
+ Logger.warn("Bouncer encountered unexpected error. Disconnecting client. #{boom}")
32
+ client[:thread].kill if client[:thread].alive?
33
+ @clients.delete(client)
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ def port(m, params)
40
+ if(params[:port])
41
+ if(Models::Config.filter(:name => 'bouncer_port').count > 0)
42
+ reply m.replyto, "Bouncer port is set to: #{Models::Config.filter(:name => 'bouncer_port').first.value
43
+ else
44
+ error m.replyo, 'No port has been set for bouncer'
45
+ end
46
+ else
47
+ parmas[:port].strip!
48
+ c = Models::Config.find_or_create(:name => 'bouncer_port')
49
+ c.value = params[:port]
50
+ c.save
51
+ information m.replyto, "Bouncer port is not set to: #{params[:port]}"
52
+ end
53
+ end
54
+
55
+ def do_service(m, params)
56
+ begin
57
+ case params[:action]
58
+ when 'start'
59
+ if(listening?)
60
+ error m.replyto, 'Bouncer is already running'
61
+ else
62
+ start_listener
63
+ information m.replyto, 'Bouncer has been started'
64
+ end
65
+ when 'stop'
66
+ if(listening?)
67
+ stop_listener
68
+ information m.replyto, 'Bouncer has been stopped'
69
+ else
70
+ error m.replyto, 'Bouncer is not currently running'
71
+ end
72
+ when 'restart'
73
+ stop_listener
74
+ start_listener
75
+ information m.replyto, 'Bouncer has been restarted'
76
+ end
77
+ rescue Object => boom
78
+ error m.replyto, "Error was encountered during #{params[:action]} process. (#{boom})"
79
+ end
80
+ end
81
+
82
+ def disconnect(m, params)
83
+ unless(@clients.empty?)
84
+ @clients.each do |client|
85
+ client[:connection].close unless client[:connection].closed?
86
+ @clients.delete(client)
87
+ end
88
+ information m.replyto, 'All clients have been disconnected'
89
+ else
90
+ warning m.replyto, 'No clients are connected to bouncer'
91
+ end
92
+ end
93
+
94
+ def status(m, params)
95
+ warning m.replyto, 'not implemented'
96
+ end
97
+
98
+ private
99
+
100
+ def start_listener
101
+ port = Models::Config.filter(:name => 'bouncer_port').first
102
+ raise 'Port has not been set' unless port
103
+ port = port.value.to_i
104
+ @socket = OpenSSL::SSL::SSLServer.new(port)
105
+ @listener = Thread.new do
106
+ until(@socket.closed?)
107
+ begin
108
+ new_con = @socket.accept_nonblock
109
+ add_client(new_con)
110
+ rescue Errno::EAGAIN, Errno::EWOULDBLOCK, Errno::ECONNABORTED, Errno::EPROTO, Errno::EINTR
111
+ IO.select([@socket])
112
+ retry
113
+ rescue Object => boom
114
+ Logger.warn "Bouncer listener encountered an error: #{boom}"
115
+ end
116
+ end
117
+ end
118
+ end
119
+
120
+ def add_client
121
+ end
122
+
123
+ class Bouncer < ModSpox::Plugin
124
+
125
+ def status(message, params)
126
+ end
127
+
128
+ private
129
+
130
+ def start_listener
131
+ port = Config[:bouncer_port]
132
+ if(port)
133
+ @socket = TCPServer.new(port)
134
+ @listener = Thread.new do
135
+ until(@socket.closed?)
136
+ begin
137
+ new_con = @socket.accept_nonblock
138
+ Logger.info("BOUNCER: New connection established on bouncer")
139
+ @clients << {
140
+ :connection => new_con,
141
+ :thread => Thread.new(new_con) do | con |
142
+ begin
143
+ Logger.info("CONNECTION: #{con}")
144
+ until(con.closed?)
145
+ Logger.info("WAITING FOR STUFF ON :#{con}")
146
+ Kernel.select([con], nil, nil, nil)
147
+ Logger.info("Woken up and ready to read")
148
+ string = con.gets
149
+ Logger.info("BOUNCER GOT MESSAGE: #{string}")
150
+ if(string.empty?)
151
+ raise Exception.new("EMPTY STRING")
152
+ else
153
+ @to_server << {:message => string, :socket => con}
154
+ end
155
+ end
156
+ rescue Object => boom
157
+ Logger.warn("THREAD BOUNCER ERROR: #{boom}")
158
+ end
159
+ end
160
+ }
161
+ rescue Errno::EAGAIN, Errno::EWOULDBLOCK, Errno::ECONNABORTED, Errno::EPROTO, Errno::EINTR
162
+ IO.select([@socket])
163
+ retry
164
+ end
165
+ end
166
+ @listener = nil
167
+ end
168
+ start_processor
169
+ else
170
+ Logger.warn("Error: Bouncer was not started. Failed to find set port number")
171
+ end
172
+ end
173
+
174
+ def stop_listener
175
+ @socket.close
176
+ @listener.kill unless @listener.nil?
177
+ @listener = nil
178
+ @to_server.clear
179
+ @processor.kill if !@processor.nil? && @processor.alive?
180
+ @processor = nil
181
+ end
182
+
183
+ def start_processor
184
+ @processor.kill if !@processor.nil? && @processor.alive?
185
+ @processor = Thread.new do
186
+ begin
187
+ while(@listener) do
188
+ info = @to_server.pop
189
+ Logger.info("Processing message: #{info[:message]}")
190
+ if(info[:message] =~ /^USER\s/i)
191
+ initialize_connection(info[:socket])
192
+ else
193
+ @pipeline << Messages::Outgoing::Raw.new(info[:message])
194
+ end
195
+ end
196
+ rescue Object => boom
197
+ Logger.warn("BOUNCER ERROR: #{boom}")
198
+ unless(@clients.empty?)
199
+ @clients.each do |socket|
200
+ socket[:connection].close
201
+ @clients.delete(socket)
202
+ end
203
+ end
204
+ end
205
+ end
206
+ end
207
+
208
+ def listening?
209
+ return !@listener.nil?
210
+ end
211
+
212
+ def initialize_connection(connection)
213
+ # send channel info and such to client
214
+ connection.puts(":localhost 001 #{me.nick} :Welcome to the network #{me.source}\n")
215
+ Models::Channel.filter(:parked => true).each do |channel|
216
+ connection.puts(":#{me.source} JOIN :#{channel.name}\n")
217
+ end
218
+ end
219
+
220
+ end
@@ -0,0 +1,19 @@
1
+ # ex: set ts=4 et:
2
+ # rip-off of Dack's Web Economy Bullshit Generator (http://dack.com/web/bullshit.html)
3
+ # Copyright 2007 Ryan "pizza" Flynn
4
+ # Ported 2008 spox
5
+
6
+ class Bullshit < ModSpox::Plugin
7
+ include ModSpox::Models
8
+ def initialize(pipeline)
9
+ super(pipeline)
10
+ add_sig(:sig => 'bullshit', :method => :bullshit, :desc => 'Web economy bullshit generator')
11
+ @bs = [[ "aggregate","architect","benchmark","brand","cultivate","deliver","deploy","disintermediate","drive","e-enable","embrace","empower","enable","engage","engineer","enhance","envisioneer","evolve","expedite","exploit","extend","facilitate","generate","grow","harness","implement","incentivize","incubate","innovate","integrate","iterate","leverage","matrix","maximize","mesh","monetize","morph","optimize","orchestrate","productize","recontextualize","redefine","reintermediate","reinvent","repurpose","revolutionize","scale","seize","strategize","streamline","syndicate","synergize","synthesize","target","transform","transition","unleash","utilize","visualize","whiteboard" ],
12
+ [ "24/365","24/7","B2B","B2C","back-end","best-of-breed","bleeding-edge","bricks-and-clicks","clicks-and-mortar","collaborative","compelling","cross-platform","cross-media","customized","cutting-edge","distributed","dot-com","dynamic","e-business","efficient","end-to-end","enterprise","extensible","frictionless","front-end","global","granular","holistic","impactful","innovative","integrated","interactive","intuitive","killer","leading-edge","magnetic","mission-critical","next-generation","one-to-one","open-source","out-of-the-box","plug-and-play","proactive","real-time","revolutionary","rich","robust","scalable","seamless","sexy","sticky","strategic","synergistic","transparent","turn-key","ubiquitous","user-centric","value-added","vertical","viral","virtual","visionary","web-enabled","wireless","world-class" ],
13
+ [ "action-items","applications","architectures","bandwidth","channels","communities","content","convergence","deliverables","e-business","e-commerce","e-markets","e-services","e-tailers","experiences","eyeballs","functionalities","infomediaries","infrastructures","initiatives","interfaces","markets","methodologies","metrics","mindshare","models","networks","niches","paradigms","partnerships","platforms","portals","relationships","ROI","synergies","web-readiness","schemas","solutions","supply-chains","systems","technologies","users","vortals","web services" ]]
14
+ end
15
+
16
+ def bullshit(message, params)
17
+ reply(message.replyto, @bs[0][rand(@bs[0].length)] + " " + @bs[1][rand(@bs[1].length)] + " " + @bs[2][rand(@bs[2].length)])
18
+ end
19
+ end
@@ -0,0 +1,11 @@
1
+ class Bytes < ModSpox::Plugin
2
+ include Models
3
+ def initialize(args)
4
+ super
5
+ add_sig(:sig => 'bytes (\d+)', :method => :convert, :desc => 'Convert bytes to human readable string', :params => [:bytes])
6
+ end
7
+
8
+ def convert(message, params)
9
+ reply message.replyto, "#{params[:bytes]} is roughly #{Helpers.format_size(params[:bytes].to_i)}"
10
+ end
11
+ end