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,23 @@
1
+ require 'mod_spox/messages/outgoing/Join'
2
+ require 'mod_spox/messages/outgoing/Who'
3
+
4
+ class Joiner < ModSpox::Plugin
5
+ def initialize(pipeline)
6
+ super(pipeline)
7
+ admin = Models::Group.filter(:name => 'admin').first
8
+ add_sig(:sig => 'join (\S+)', :method => :join, :group => admin, :params => [:channel])
9
+ @pipeline.hook(self, :send_who, :Incoming_Join)
10
+ end
11
+
12
+ # message:: ModSpox::Messages::Incoming::Privmsg
13
+ # Join the given channel
14
+ def join(message, params)
15
+ @pipeline << Messages::Outgoing::Join.new(params[:channel])
16
+ end
17
+
18
+ # message:: ModSpox::Messages::Incoming::Join
19
+ # Send a WHO request for channel on join
20
+ def send_who(message)
21
+ @pipeline << ModSpox::Messages::Outgoing::Who.new(message.channel.name) if message.nick == me
22
+ end
23
+ end
@@ -0,0 +1,14 @@
1
+ require 'mod_spox/messages/outgoing/Nick'
2
+ class Nicker < ModSpox::Plugin
3
+ def initialize(pipeline)
4
+ super(pipeline)
5
+ admin = Models::Group.filter(:name => 'admin').first
6
+ add_sig(:sig => 'nick (\S+)', :method => :change_nick, :group => admin, :params => [:nick])
7
+ end
8
+
9
+ # message:: ModSpox::Messages::Incoming::Privmsg
10
+ # Join the given channel
11
+ def change_nick(message, params)
12
+ @pipeline << Messages::Outgoing::Nick.new(params[:nick])
13
+ end
14
+ end
@@ -0,0 +1,23 @@
1
+ require 'mod_spox/messages/outgoing/Part'
2
+ class Parter < ModSpox::Plugin
3
+
4
+ def initialize(pipeline)
5
+ super(pipeline)
6
+ admin = Models::Group.filter(:name => 'admin').first
7
+ add_sig(:sig => 'part (\S+)', :method => :part, :group => admin, :params => [:channel])
8
+ add_sig(:sig => 'part', :method => :direct_part, :group => admin)
9
+ end
10
+
11
+ # message:: ModSpox::Messages::Incoming::Privmsg
12
+ # Bot will part from given channel
13
+ def part(message, params)
14
+ @pipeline << Messages::Outgoing::Part.new(params[:channel])
15
+ end
16
+
17
+ # message:: ModSpox::Messages::Incoming::Privmsg
18
+ # Bot will part from channel command is issued within
19
+ def direct_part(message, params)
20
+ @pipeline << Messages::Outgoing::Part.new(message.target)
21
+ end
22
+
23
+ end
@@ -0,0 +1,60 @@
1
+ class Permissions < ModSpox::Plugin
2
+
3
+ def initialize(pipe)
4
+ super
5
+ admin = Models::Group.find_or_create(:name => 'admin')
6
+ add_sig(:sig => 'perm (\S+)', :group => admin, :method => :show_perm, :desc => 'Display permissions for plugin', :params => [:plugin])
7
+ add_sig(:sig => 'perm (\d+) (\S+)', :group => admin, :method => :set_perm, :desc => 'Sets permission for signature with given ID', :params => [:id, :group])
8
+ add_sig(:sig => 'group add (\S+)', :group => admin, :method => :add_group, :desc => 'Add a new authentication group', :params => [:group])
9
+ add_sig(:sig => 'invalid', :group => admin, :method => :invalid, :desc => 'foobar')
10
+ end
11
+
12
+ def show_perm(m, params)
13
+ output = ["Permissions for signatures owned by \2#{params[:plugin]}\2"]
14
+ Models::Signature.filter(:plugin => params[:plugin]).each do |s|
15
+ g = s.group
16
+ output << "[#{s.pk}] \2#{g.is_a?(Models::Group) ? g.name : 'unset'}\2 - #{s.signature} - #{s.description}"
17
+ end
18
+ if(output.size > 1)
19
+ reply m.replyto, output
20
+ else
21
+ error m.replyto, "Failed to locate signatures for given plugin: #{params[:plugin]}"
22
+ end
23
+ end
24
+
25
+ def set_perm(m, params)
26
+ s = Models::Signature[params[:id].to_i]
27
+ if(s)
28
+ if(params[:group] == 'none')
29
+ g = true
30
+ else
31
+ g = Models::Group.filter(:name => params[:group]).first
32
+ end
33
+ if(g)
34
+ s.group_id = g.is_a?(Models::Group) ? g.pk : nil
35
+ s.save
36
+ information m.replyto, "Signature with ID #{s.pk} has been updated to group: #{g.is_a?(Models::Group) ? g.name : 'unset'}"
37
+ else
38
+ error m.replyto, "Group name is invalid. If it is a new group, add it first. (#{params[:group]})"
39
+ end
40
+ else
41
+ error m.replyto, "Failed to find signature with ID: #{params[:id]}"
42
+ end
43
+ end
44
+
45
+ def add_group(m, params)
46
+ begin
47
+ raise 'Invalid group name: none' if params[:group] == 'none'
48
+ Models::Group.find_or_create(:name => params[:group])
49
+ information m.replyto, "New group \2#{params[:group]}\2 is now available"
50
+ rescue Object => boom
51
+ error m.replyto, "Unknown error when adding new group: #{params[:group]}"
52
+ end
53
+ end
54
+
55
+ def invalid(m, params)
56
+ Models::Signature.dataset.update(:enabled => false)
57
+ information m.replyto, 'ok'
58
+ end
59
+
60
+ end
@@ -0,0 +1,180 @@
1
+ ['mod_spox/messages/outgoing/Privmsg',
2
+ 'mod_spox/messages/internal/PluginLoadRequest',
3
+ 'mod_spox/messages/internal/PluginUnloadRequest',
4
+ 'mod_spox/messages/internal/PluginReload',
5
+ 'mod_spox/messages/internal/PluginModuleRequest'].each{|f|require f}
6
+ class PluginLoader < ModSpox::Plugin
7
+
8
+ def initialize(pipeline)
9
+ super(pipeline)
10
+ admin = Models::Group.filter(:name => 'admin').first
11
+ add_sig(:sig => 'plugins available', :method => :available_plugins, :group => admin, :desc => 'List all available plugins')
12
+ add_sig(:sig => 'plugins loaded', :method => :loaded_plugins, :group => admin, :desc => 'List all plugins currently loaded')
13
+ add_sig(:sig => 'plugins load (\S+)', :method => :load_plugin, :group => admin, :desc => 'Load the given plugin', :params => [:plugin])
14
+ add_sig(:sig => 'plugins unload (\S+)', :method => :unload_plugin, :group => admin, :desc => 'Unload given plugin', :params => [:plugin])
15
+ add_sig(:sig => 'plugins reload ?(\S+)?', :method => :reload_plugin, :group => admin, :desc => 'Reload single plugin or all plugins if names not provided', :params => [:plugin])
16
+ @pipeline.hook(self, :get_module, :Internal_PluginModuleResponse)
17
+ @plugins_mod = nil
18
+ end
19
+
20
+ # message:: ModSpox::Messages::Incoming::Privmsg
21
+ # params:: matching signature params
22
+ # Output currently available plugins for loading
23
+ def available_plugins(message, params)
24
+ output = ["\2Currently available plugins:\2"]
25
+ find_plugins.each_pair do | plugin, path |
26
+ output << "\2#{plugin}:\2 #{path}"
27
+ end
28
+ reply message.replyto, output
29
+ end
30
+
31
+ # message:: ModSpox::Messages::Incoming::Privmsg
32
+ # params:: matching signature params
33
+ # Output currently loaded plugins
34
+ def loaded_plugins(message, params)
35
+ @pipeline << Messages::Outgoing::Privmsg.new(message.replyto, "\2Currently loaded plugins:\2 #{plugin_list.join(', ')}")
36
+ end
37
+ # message:: ModSpox::Messages::Incoming::Privmsg
38
+ # params:: matching signature params
39
+ # Load the given plugin
40
+ def load_plugin(message, params)
41
+ plugins = find_plugins
42
+ if(plugins.has_key?(params[:plugin].to_sym))
43
+ name = plugin_discovery(BotConfig[:pluginextraspath]).keys.include?(params[:plugin].to_sym) ? nil : "#{params[:plugin]}.rb"
44
+ @pipeline << Messages::Internal::PluginLoadRequest.new(self, plugins[params[:plugin].to_sym], name)
45
+ @pipeline << Messages::Outgoing::Privmsg.new(message.replyto, "Okay")
46
+ else
47
+ @pipeline << Messages::Outgoing::Privmsg.new(message.replyto, "Failed to find plugin: #{params[:plugin]}")
48
+ end
49
+ end
50
+
51
+ # message:: ModSpox::Messages::Incoming::Privmsg
52
+ # params:: matching signature params
53
+ # Unload the given plugin
54
+ def unload_plugin(message, params)
55
+ path = loaded_path(params[:plugin].to_sym)
56
+ unless(path.nil?)
57
+ name = plugin_discovery(BotConfig[:pluginextraspath]).keys.include?(params[:plugin].to_sym) ? nil : ".#{params[:plugin]}.rb"
58
+ @pipeline << Messages::Internal::PluginUnloadRequest.new(self, path, name)
59
+ @pipeline << Messages::Outgoing::Privmsg.new(message.replyto, "Okay")
60
+ else
61
+ @pipeline << Messages::Outgoing::Privmsg.new(message.replyto, "Failed to find loaded plugin named: #{params[:plugin]}")
62
+ end
63
+ end
64
+
65
+ # message:: ModSpox::Messages::Incoming::Privmsg
66
+ # params:: matching signature params
67
+ # Reloads plugins
68
+ def reload_plugin(message, params)
69
+ if(params[:plugin])
70
+ users = plugin_discovery(BotConfig[:userpluginpath])
71
+ extras = plugin_discovery(BotConfig[:pluginextraspath])
72
+ fresh = nil
73
+ stale = nil
74
+ users.each_pair{|name, path| stale = path if name == params[:plugin]}
75
+ extras.each_pair{|name, path| fresh = path if name == params[:plugin]}
76
+ if(fresh && stale)
77
+ @pipeline << Messages::Internal::PluginReload.new(fresh, stale)
78
+ reply message.replyto, "Reloading #{params[:plugin]}"
79
+ else
80
+ reply message.replyto, "\2Error:\2 Failed to find new and stale versions of: #{params[:plugin]}"
81
+ end
82
+ else
83
+ @pipeline << Messages::Internal::PluginReload.new
84
+ @pipeline << Messages::Outgoing::Privmsg.new(message.replyto, 'Full plugin reload requested')
85
+ end
86
+ end
87
+
88
+ # message:: ModSpox::Messages::Internal::PluginModuleResponse
89
+ # Receives the plugins module
90
+ def get_module(message)
91
+ @plugins_mod = message.module
92
+ end
93
+
94
+ # Upgrades extra plugins to latest version
95
+ def extras_upgrade
96
+ Logger.info("Starting plugin upgrade to current version: #{ModSpox.botversion}")
97
+ extras = plugin_discovery(BotConfig[:pluginextraspath])
98
+ pl = plugin_list
99
+ extras.keys.each{|d| extras.delete(d) unless pl.include?(d)}
100
+ extras.keys.each do |plugin|
101
+ path = loaded_path(plugin)
102
+ @pipeline << Messages::Internal::PluginUnloadRequest.new(self, path, plugin)
103
+ end
104
+ Logger.info('Waiting for plugins to complete unloading...')
105
+ sleep(3)
106
+ Logger.info('Loading active plugins back into the bot')
107
+ extras.each do |name, path|
108
+ @pipeline << Messages::Internal::PluginLoadRequest.new(self, path)
109
+ end
110
+ Logger.info("Plugin upgrade is now complete. Upgraded to version: #{ModSpox.botversion}")
111
+ end
112
+
113
+ private
114
+
115
+ # Returns the list of currently loaded plugins
116
+ def plugin_list
117
+ plug = []
118
+ @pipeline << Messages::Internal::PluginModuleRequest.new(self)
119
+ sleep(0.01) while @plugins_mod.nil?
120
+ @plugins_mod.constants.sort.each do |const|
121
+ klass = @plugins_mod.const_get(const)
122
+ if(klass < Plugin)
123
+ plug << const
124
+ end
125
+ end
126
+ @plugins_mod = nil
127
+ return plug
128
+ end
129
+
130
+ # Finds available plugins for loading
131
+ def find_plugins
132
+ users = plugin_discovery(BotConfig[:userpluginpath])
133
+ extras = plugin_discovery(BotConfig[:pluginextraspath])
134
+ plugins = users.merge(extras)
135
+ plugin_list.each do |name|
136
+ plugins.delete(name) if plugins.has_key?(name)
137
+ end
138
+ return plugins
139
+ end
140
+
141
+ # path:: path to directory
142
+ # Discovers any plugins within the files in the given path
143
+ def plugin_discovery(path)
144
+ plugins = Hash.new
145
+ Dir.new(path).each do |file|
146
+ begin
147
+ next unless file =~ /\.rb$/
148
+ sandbox = Module.new
149
+ sandbox.module_eval(IO.readlines("#{path}/#{file}").join("\n"))
150
+ sandbox.constants.each do |const|
151
+ klass = sandbox.const_get(const)
152
+ plugins[const.to_sym] = "#{path}/#{file}" if klass < Plugin
153
+ end
154
+ rescue Object => boom
155
+ Logger.warn("Failed to parse file: #{path}/#{file}. Reason: #{boom}\n#{boom.backtrace.join("\n")}")
156
+ next
157
+ end
158
+ end
159
+ return plugins
160
+ end
161
+
162
+ # name:: plugin name
163
+ # Returns the file path the given plugin originated from
164
+ def loaded_path(name)
165
+ Dir.new(BotConfig[:userpluginpath]).each do |file|
166
+ begin
167
+ next unless file =~ /\.rb$/
168
+ sandbox = Module.new
169
+ sandbox.module_eval(IO.readlines("#{BotConfig[:userpluginpath]}/#{file}").join("\n"))
170
+ sandbox.constants.each do |const|
171
+ return "#{BotConfig[:userpluginpath]}/#{file}" if const == name
172
+ end
173
+ rescue Object => boom
174
+ Logger.warn("Failed to load file: #{file}. Reason: #{boom}")
175
+ end
176
+ end
177
+ return nil
178
+ end
179
+
180
+ end
@@ -0,0 +1,70 @@
1
+ require 'mod_spox/messages/outgoing/Pong'
2
+ require 'mod_spox/messages/outgoing/Ping'
3
+ require 'mod_spox/messages/internal/Reconnect'
4
+ require 'mod_spox/messages/internal/TimerAdd'
5
+
6
+ class Ponger < ModSpox::Plugin
7
+
8
+ def initialize(pipeline)
9
+ super(pipeline)
10
+ @lag = nil
11
+ @last = nil
12
+ @attempts = 0
13
+ add_sig(:sig => 'lag', :method => :print_lag, :desc => 'Shows bot\'s current lag to server')
14
+ @pipeline.hook(self, :ping, :Incoming_Ping)
15
+ @pipeline.hook(self, :get_lag_pong, :Incoming_Pong)
16
+ @lock = Mutex.new
17
+ @pipeline.hook(self, :check_start_ponger, :Internal_PluginsReady)
18
+ @running = false
19
+ send_lag_ping
20
+ end
21
+
22
+ # message:: ModSpox::Messages::Incoming::Ping
23
+ # Sends responding pongs to server pings
24
+ def ping(message)
25
+ @pipeline << Messages::Outgoing::Pong.new(message.server, message.string)
26
+ end
27
+
28
+ def send_lag_ping
29
+ if(@attempts > 5)
30
+ @pipeline << Messages::Internal::Reconnect.new
31
+ @lag = nil
32
+ @last = nil
33
+ @attempts = 0
34
+ else
35
+ t = Time.now
36
+ @last = t.to_f.to_s
37
+ @pipeline << Messages::Outgoing::Ping.new("#{@last}")
38
+ @attempts += 1
39
+ end
40
+ end
41
+
42
+ def get_lag_pong(m)
43
+ @lock.synchronize do
44
+ t = m.string.to_f
45
+ return unless m.string == @last
46
+ @lag = Time.now.to_f - t
47
+ @last = nil
48
+ @attempts = 0
49
+ end
50
+ end
51
+
52
+ def print_lag(m, params)
53
+ if(@lag.nil?)
54
+ warning m.replyto, 'Lag time currently unavailable'
55
+ else
56
+ information m.replyto, "Current lag time: #{sprintf('%0.4f', @lag)} seconds"
57
+ end
58
+ end
59
+
60
+ def start_ponger(m)
61
+ @running = true
62
+ send_lag_ping
63
+ @pipeline << Messages::Internal::TimerAdd.new(self, 60){ send_lag_ping }
64
+ end
65
+
66
+ def check_start_ponger(m)
67
+ @pipeline << Messages::Internal::TimerAdd.new(self, 30, nil, true){ @lock.synchronize{start_ponger(nil) unless @running} }
68
+ end
69
+
70
+ end
@@ -0,0 +1,52 @@
1
+ class PoolConfig < ModSpox::Plugin
2
+
3
+ def initialize(args)
4
+ super
5
+ group = Group.find_or_create(:name => 'admin')
6
+ add_sig(:sig => 'pool max workers(\s(\d+))?', :method => :max_workers, :group => group,
7
+ :desc => 'Show/set max number of worker threads', :params => [:max])
8
+ add_sig(:sig => 'pool worker timeout(\s(\d+))?', :method => :max_timeout, :group => group,
9
+ :desc => 'Show/set max worker timeout', :params => [:max])
10
+ add_sig(:sig => 'pool workers total', :method => :workers_total, :group => group,
11
+ :desc => 'Show current number of workers in pool')
12
+ end
13
+
14
+ def max_workers(message, params)
15
+ if(params[:max].nil?)
16
+ reply message.replyto, "Maximum number of worker threads allowed in pool: #{Pool.workers_max}"
17
+ else
18
+ params[:max] = params[:max].strip.to_i
19
+ if(params[:max] > 0)
20
+ config = Config.find_or_create(:name => 'pool_workers_min')
21
+ config.value = params[:max]
22
+ config.save
23
+ Pool.workers_max = params[:max]
24
+ reply message.replyto, "\2Thread Pool Update:\2 Number of worker threads updated to: #{params[:max]}"
25
+ else
26
+ reply message.replyto, "\2Error:\2 You must have at least one worker thread"
27
+ end
28
+ end
29
+ end
30
+
31
+ def max_timeout(message, params)
32
+ if(params[:max].nil?)
33
+ reply message.replyto, "Maximum number of seconds threads allowed per task: #{Pool.worker_timeout == 0 ? 'no limit' : Pool.worker_timeout}"
34
+ else
35
+ params[:max] = params[:max].strip.to_i
36
+ if(params[:max] >= 0)
37
+ config = Config.find_or_create(:name => 'pool_timeout')
38
+ config.value = params[:max]
39
+ config.save
40
+ Pool.worker_timeout = params[:max]
41
+ reply message.replyto, "\2Thread Pool Update:\2 Worker processing timeout updated to: #{params[:max]} seconds"
42
+ else
43
+ reply message.replyto, "\2Error:\2 Threads are not able to finish executing before they start"
44
+ end
45
+ end
46
+ end
47
+
48
+ def workers_total(message, params)
49
+ reply message.replyto, "Current number of worker threads in pool: #{Pool.workers}"
50
+ end
51
+
52
+ end
@@ -0,0 +1,15 @@
1
+ require 'mod_spox/messages/internal/HaltBot'
2
+
3
+ class Quitter < ModSpox::Plugin
4
+
5
+ def initialize(pipeline)
6
+ super(pipeline)
7
+ add_sig(:sig => 'quit(\s.+)?', :method => :quit, :group => Models::Group.filter(:name => 'admin').first, :params => [:channel, :message])
8
+ end
9
+
10
+ # message:: ModSpox::Messages::Incoming::Privmsg
11
+ # Instructs the bot to shutdown
12
+ def quit(message, params)
13
+ @pipeline << Messages::Internal::HaltBot.new
14
+ end
15
+ end
@@ -0,0 +1,57 @@
1
+ class Servers < ModSpox::Plugin
2
+ def initialize(pipeline)
3
+ super
4
+ admin = Models::Group.find_or_create(:name => 'admin')
5
+ add_sig(:sig => 'servers list', :method => :list, :group => admin, :desc => 'Show server list')
6
+ add_sig(:sig => 'servers add (\S+) (\d+)( \d+)?', :method => :add, :group => admin, :desc => 'Add server to list', :params => [:server, :port, :prio])
7
+ add_sig(:sig => 'servers del (\d+)', :method => :remove, :group => admin, :desc => 'Remove server from list', :params => [:id])
8
+ add_sig(:sig => 'servers prio (\d+) (\+|\-|\d+)', :method => :prio, :group => admin, :desc => 'Prioritize server', :params => [:id, :move])
9
+ end
10
+
11
+ def list(m, params)
12
+ output = ["\2Server list:\2"]
13
+ Models::Server.reverse_order(:priority).each do |s|
14
+ output << "\2[#{s.id}]\2 #{s.host}:#{s.port} \2Priority:\2 #{s.priority}"
15
+ end
16
+ reply m.replyto, output
17
+ end
18
+
19
+ def add(m, params)
20
+ begin
21
+ s = Models::Server.new(:host => params[:server], :port => params[:port].to_i)
22
+ s.priority = params[:prio].to_i if params[:prio]
23
+ s.save
24
+ information m.replyto, "New server has been added: #{params[:server]}:#{params[:port]}"
25
+ rescue Object => boom
26
+ error m.replyto, "Failed to add new server. Reason: #{boom}"
27
+ end
28
+ end
29
+
30
+ def remove(m, params)
31
+ begin
32
+ raise "List must contain one server" unless Models::Server.count > 1
33
+ Models::Server[params[:id].to_i].destroy
34
+ information m.replyto, 'Server has been removed'
35
+ rescue Object => boom
36
+ error m.replyto, "Failed to remove server. Reason: #{boom}"
37
+ end
38
+ end
39
+
40
+ def prio(m, params)
41
+ begin
42
+ s = Models::Server[params[:id].to_i]
43
+ if(params[:move] == '+')
44
+ s.priority += 1
45
+ elsif(params[:move] == '-')
46
+ s.priority -= 1 if s.priority > 0
47
+ else
48
+ s.priority = params[:move].to_i
49
+ end
50
+ s.save_changes
51
+ information m.replyto, 'Server priority has been updated.'
52
+ rescue Object => boom
53
+ error m.replyto, "Failed to update priority. Reason: #{boom}"
54
+ end
55
+ end
56
+
57
+ end
@@ -0,0 +1,31 @@
1
+ require 'mod_spox/messages/internal/StatusRequest'
2
+
3
+ class Status < ModSpox::Plugin
4
+
5
+ def initialize(pipeline)
6
+ super
7
+ add_sig(:sig => 'status', :method => :status, :desc => 'Show current status')
8
+ add_sig(:sig => 'version', :method => :version, :desc => 'Show version information')
9
+ add_sig(:sig => 'VERSION', :method => :version, :desc => 'Show version information')
10
+ @pipeline.hook(self, :get_status, :Internal_StatusResponse)
11
+ @resp = []
12
+ end
13
+
14
+ def status(m, pa)
15
+ @resp << m.replyto
16
+ @pipeline << Messages::Internal::StatusRequest.new(self)
17
+ end
18
+
19
+ def version(message, params)
20
+ reply message.replyto, "mod_spox IRC bot - Version: \2#{ModSpox.botversion}\2 (#{ModSpox.botcodename}) [http://modspox.rubyforge.org]"
21
+ end
22
+
23
+ def get_status(m)
24
+ @resp.uniq!
25
+ @resp.each do |c|
26
+ reply c, "\2Status:\2 \2Uptime:\2 #{m.status[:uptime]} \2Plugins:\2 #{m.status[:plugins]} loaded \2Socket Connected:\2 #{m.status[:socket_connect].strftime("%Y/%m/%d-%H:%M:%S")} \2Lines sent:\2 #{m.status[:sent]} \2Lines Received:\2 #{m.status[:received]}"
27
+ @resp.delete(c)
28
+ end
29
+ end
30
+
31
+ end
@@ -0,0 +1,85 @@
1
+ require 'mod_spox/messages/internal/TriggersUpdate'
2
+ require 'mod_spox/messages/outgoing/Privmsg'
3
+
4
+ class Triggers < ModSpox::Plugin
5
+
6
+ include Messages::Outgoing
7
+
8
+ def initialize(pipeline)
9
+ super(pipeline)
10
+ admin = Models::Group.filter(:name => 'admin').first
11
+ add_sig(:sig => 'triggers active', :method => :active, :group => admin, :desc => 'List all currently active triggers')
12
+ add_sig(:sig => 'triggers list', :method => :list, :group => admin, :desc => 'List all triggers and their current status')
13
+ add_sig(:sig => 'triggers add (\S+)', :method => :add, :group => admin, :desc => 'Add a new trigger and activate it', :params => [:trigger])
14
+ add_sig(:sig => 'triggers remove (\d+)', :method => :remove, :group => admin, :desc => 'Remove trigger', :params => [:id])
15
+ add_sig(:sig => 'triggers activate (\d+)', :method => :activate, :group => admin, :desc => 'Activate the trigger', :params => [:id])
16
+ add_sig(:sig => 'triggers deactivate (\d+)', :method => :deactivate, :group => admin, :desc => 'Deactivate the trigger', :params => [:id])
17
+ end
18
+
19
+ def active(message, params)
20
+ triggers = Models::Trigger.filter(:active => true)
21
+ if(triggers)
22
+ output = ["\2Currently active triggers:\2"]
23
+ triggers.each do |t|
24
+ output << "#{t.pk}: #{t.trigger}"
25
+ end
26
+ reply message.replyto, output
27
+ else
28
+ @pipeline << Privmsg.new(message.replyto, 'No triggers are currently active')
29
+ end
30
+ end
31
+
32
+ def list(message, params)
33
+ triggers = Models::Trigger.all
34
+ if(triggers)
35
+ output = ["\2Trigger listing:\2"]
36
+ triggers.each do |t|
37
+ output << "#{t.pk}: #{t.trigger} -> \2#{t.active ? "activated" : "not activated"}\2"
38
+ end
39
+ reply message.replyto, output
40
+ else
41
+ @pipeline << Privmsg.new(message.replyto, 'No triggers found')
42
+ end
43
+ end
44
+
45
+ def add(message, params)
46
+ Models::Trigger.find_or_create(:trigger => params[:trigger]).update(:active => true)
47
+ @pipeline << Privmsg.new(message.replyto, "Trigger #{params[:trigger]} is now active")
48
+ @pipeline << Messages::Internal::TriggersUpdate.new
49
+ end
50
+
51
+ def remove(message, params)
52
+ trigger = Models::Trigger[params[:id]]
53
+ if(trigger)
54
+ trig = trigger.trigger
55
+ trigger.destroy
56
+ @pipeline << Privmsg.new(message.replyto, "Trigger #{trig} has been removed")
57
+ @pipeline << Messages::Internal::TriggersUpdate.new
58
+ else
59
+ @pipeline << Privmsg.new(message.replyto, "Failed to find trigger with ID: #{params[:id]}")
60
+ end
61
+ end
62
+
63
+ def activate(message, params)
64
+ trigger = Models::Trigger[params[:id]]
65
+ if(trigger)
66
+ trigger.update(:active => true)
67
+ @pipeline << Privmsg.new(message.replyto, "Trigger #{trigger.trigger} has been activated")
68
+ @pipeline << Messages::Internal::TriggersUpdate.new
69
+ else
70
+ @pipeline << Privmsg.new(message.replyto, "Failed to find trigger with ID: #{params[:id]}")
71
+ end
72
+ end
73
+
74
+ def deactivate(message, params)
75
+ trigger = Models::Trigger[params[:id]]
76
+ if(trigger)
77
+ trigger.update(:active => false)
78
+ @pipeline << Privmsg.new(message.replyto, "Trigger #{trigger.trigger} has been deactivated")
79
+ @pipeline << Messages::Internal::TriggersUpdate.new
80
+ else
81
+ @pipeline << Privmsg.new(message.replyto, "Failed to find trigger with ID: #{params[:id]}")
82
+ end
83
+ end
84
+
85
+ end
@@ -0,0 +1,51 @@
1
+ require 'mod_spox/Exceptions'
2
+
3
+ module ModSpox
4
+
5
+ class BaseConfig
6
+
7
+ # file_path:: path to configuration file
8
+ # Creates new BaseConfig
9
+ def initialize(file_path)
10
+ @config = Hash.new
11
+ @file_path = file_path
12
+ parse_configuration
13
+ end
14
+
15
+ # name:: key of config item wanted
16
+ # Provides access to configuration data
17
+ def [](name)
18
+ name = name.to_sym unless name.is_a?(Symbol)
19
+ raise Exceptions::UnknownKey.new("Configuration has no value named: #{name.to_s}") unless @config.has_key?(name)
20
+ return @config[name]
21
+ end
22
+
23
+ def []=(key, value)
24
+ key = key.to_sym unless key.is_a?(Symbol)
25
+ @config[key] = value
26
+ write_configuration
27
+ end
28
+
29
+ # Parses the configuration file into a usable Hash
30
+ def parse_configuration
31
+ return unless File.exists?(BotConfig[:userconfigpath])
32
+ IO.readlines(BotConfig[:userconfigpath]).each{|line|
33
+ if(line =~ /^(\S+)\s*=\s*(\S*)\s*$/)
34
+ @config[$1.to_sym] = $2
35
+ end
36
+ }
37
+ end
38
+
39
+ # Writes the configuration file out to the provided file_path
40
+ # during initialization
41
+ def write_configuration
42
+ file = File.open(BotConfig[:userconfigpath], 'w')
43
+ @config.each_pair{|k,v|
44
+ file.puts("#{k.to_s}=#{v}")
45
+ }
46
+ file.close
47
+ end
48
+
49
+ end
50
+
51
+ end