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,55 @@
1
+ require 'soap/wsdlDriver'
2
+
3
+ class UrbanDictionary < ModSpox::Plugin
4
+
5
+ include Messages::Outgoing
6
+ include Models
7
+
8
+ def initialize(pipeline)
9
+ super(pipeline)
10
+ add_sig(:sig => 'udefine (?!key)((\d+ )?(.+))', :method => :define, :desc => 'Find the definition of a word or phrase', :params => [:fullmatch, :number, :term])
11
+ add_sig(:sig => 'udefine key (.+)', :method => :key, :group => Models::Group.filter(:name => 'admin').first, :desc => 'Set API key', :params => [:key])
12
+ end
13
+
14
+ def define(message, params)
15
+ key = Config.val(:urban_key)
16
+ if(key)
17
+ site = 'http://api.urbandictionary.com/soap?wsdl'
18
+ result = params[:number] ? params[:number].to_i - 1 : 0
19
+ begin
20
+ proxy = SOAP::WSDLDriverFactory.new(site).create_rpc_driver
21
+ #udict = SOAP::RPC::Driver.new(site, 'urn:UrbanSearch')
22
+ #udict.add_method('lookup', 'key', 'term')
23
+ defs = proxy.lookup(key, params[:term])
24
+ #defs = udict.lookup(key, params[:term])
25
+ output = []
26
+ if defs.size < result + 1
27
+ reply message.replyto, "Error: Definition number #{result+1} for term: #{params[:term]} not found."
28
+ else
29
+ defin = defs[result].definition.length > 390 ? defs[result].definition.slice(0..390) + " *[CUT]*" : defs[result].definition
30
+ exp = defs[result].example.length > 390 ? defs[result].example.slice(0..390) + " *[CUT]*" : defs[result].example
31
+ output << "Definition for \2#{defs[result].word}:\2"
32
+ output << Helpers.convert_entities(defin.gsub(/[\r\n\s]+/, ' '))
33
+ output << "\2Example usage:\2 #{Helpers.convert_entities(exp.gsub(/[\r\n\s]+/, ' '))}" if exp.length > 0
34
+ reply message.replyto, output
35
+ end
36
+ rescue Timeout::Error
37
+ reply message.replyto, "Failed to establish connection to server."
38
+ rescue Object => boom
39
+ reply message.replyto, "Unexpected error encountered: #{boom}"
40
+ end
41
+ else
42
+ reply message.replyto, "\2Error:\2 No valid key available for dictionary"
43
+ end
44
+ end
45
+
46
+ def key(message, params)
47
+ if(message.is_public?)
48
+ reply message.replyto, 'I don\'t set keys in public'
49
+ else
50
+ Config.set(:urban_key, params[:key])
51
+ reply message.replyto, 'Urban Dictionary API key has been set.'
52
+ end
53
+ end
54
+
55
+ end
@@ -0,0 +1,55 @@
1
+ class Weather < ModSpox::Plugin
2
+
3
+ include Models
4
+
5
+ def initialize(pipeline)
6
+ super
7
+ add_sig(:sig => 'weather (\d+)', :method => :weather, :desc => 'Show weather for given zipcode', :params => [:zipcode])
8
+ end
9
+
10
+ def weather(message, params)
11
+ connection = Net::HTTP.new('www.weather.com', 80)
12
+ response = connection.request_get("/weather/local/#{params[:zipcode]}?lswe=96094&lwsa=WeatherLocalUndeclared&from=whatwhere", nil)
13
+ begin
14
+ response.value
15
+ page = response.body.gsub(/[\r\n]/, ' ')
16
+ if page =~ /R for (.+?) \(.+?>([0-9]+)&.+?Like<BR> ([0-9]+)&.+?UV In.+?TextA">(.+?)\s*<.+?Wind.+?TextA">(.+?)\s*<.+?idity.+?TextA">(.+?)\s*<.+?ssure.+?TextA">(.+?)\s*<.+?oint.+?TextA">(.+?)\s*<.+?bility.+?TextA">(.+?)\s*</
17
+ location = $1
18
+ curtemp = $2
19
+ feeltemp = $3
20
+ uv = $4
21
+ wind = $5
22
+ humid = $6
23
+ pressure = $7
24
+ dewpoint = $8
25
+ visibility = $9
26
+ future = Array.new
27
+ i = 0
28
+ page.scan(/.+?ialLink11"><B>(.+?)</).each{|match| future.push(match[0])}
29
+ page.scan(/font.+?lueFont10">([^<].+?)<\/nobr>/).each{|match|
30
+ future[i] << "|#{match[0].gsub(/<.+?>/, '').gsub(/&.+?;/, '').gsub(/\s+/, ' ')}"
31
+ i += 1
32
+ }
33
+ i = 0
34
+ for item in future do
35
+ if item =~ /^([^\|]+)\|(.+)$/
36
+ future[i] = "\2#{$1}:\2 #{$2}"
37
+ else
38
+ future.delete_at(i)
39
+ end
40
+ i += 1
41
+ end
42
+ output = ["Weather for: \2#{location}\2"]
43
+ output << "Current Temp: #{curtemp} - Feels like: #{feeltemp}"
44
+ output << "[UV Index: #{uv.gsub(/&.+?;/, '')}][Wind: #{wind.gsub(/&.+?;/, '')}][Humidity: #{humid.gsub(/&.+?;/, '')}][Pressure: #{pressure.gsub(/&.+?;/, '')}][Dew Point: #{dewpoint.gsub(/&.+?;/, '')}][Visibility: #{visibility.gsub(/&.+?;/, '')}]"
45
+ output << future.values_at(0..2).join(' ')
46
+ reply message.replyto, output
47
+ else
48
+ reply message.replyto, "Failed to retrieve weather data."
49
+ end
50
+ rescue Object => boom
51
+ reply message.replyto, "Error: Received invalid response from server"
52
+ end
53
+ end
54
+
55
+ end
@@ -0,0 +1,289 @@
1
+ require 'mod_spox/messages/outgoing/Raw'
2
+ require 'mod_spox/messages/internal/TimerAdd'
3
+
4
+ class Authenticator < ModSpox::Plugin
5
+ def initialize(pipeline)
6
+ super(pipeline)
7
+ group = Models::Group.filter(:name => 'admin').first
8
+ add_sig(:sig => 'auth (\S+)', :method => :authenticate, :desc => 'Authenticate with bot using a password', :params => [:password])
9
+ add_sig(:sig => 'ident', :method => :do_ident, :desc => 'Instructs the bot to check your NickServ status')
10
+ add_sig(:sig => 'auth mask add (\S+) (\S+)', :method => :add_mask, :group => group, :desc => 'Add authentication mask and set initial group', :params => [:mask, :group])
11
+ add_sig(:sig => 'auth mask set (\d+) (.+)', :method => :set_mask_groups, :group => group, :desc => 'Set groups for the given mask', :params => [:id, :groups])
12
+ add_sig(:sig => 'auth mask unset (\d+) (.+)', :method => :del_mask_groups, :group => group, :desc => 'Remove groups for the given mask', :params => [:id, :groups])
13
+ add_sig(:sig => 'auth mask remove (\d+)', :method => :remove_mask, :group => group, :desc => 'Remove authentication mask', :params => [:id])
14
+ add_sig(:sig => 'auth mask list', :method => :list_mask, :group => group, :desc => 'List all available authentication masks')
15
+ add_sig(:sig => 'auth nick ident (\S+) (true|false)', :method => :nick_ident, :group => group, :desc => 'Allow authentication to nicks identified to NickServ', :params => [:nick, :ident])
16
+ add_sig(:sig => 'auth nick password (\S+) (\S+)', :method => :nick_pass, :group => group, :desc => 'Set authentication password for nick', :params => [:nick, :password])
17
+ add_sig(:sig => 'auth nick clear password (\S+)', :method => :clear_pass, :group => group, :desc => 'Clear nicks authentication password', :params => [:nick])
18
+ add_sig(:sig => 'auth nick info (\S+)', :method => :nick_info, :group => group, :desc => 'Return authentication information about given nick', :params => [:nick])
19
+ add_sig(:sig => 'auth nick set (\S+) (\S+)', :method => :set_nick, :group => group, :desc => 'Set the group for a given nick', :params => [:nick, :group])
20
+ add_sig(:sig => 'auth nick unset (\S+) (\S+)', :method => :unset_nick, :group => group, :desc => 'Unset the group for a given nick', :params => [:nick, :group])
21
+ add_sig(:sig => 'auth group list', :method => :list_groups, :group => group, :desc => 'List available authentication groups')
22
+ add_sig(:sig => 'auth group info (\S+)', :method => :group_info, :group => group, :desc => 'List members of given group', :params => [:group])
23
+ add_sig(:sig => 'groups', :method => :show_groups, :desc => 'Show user groups they are currently a member of')
24
+ @nickserv_nicks = []
25
+ @nickserv_cache = []
26
+ populate_nickserv
27
+ @pipeline.hook(self, :check_join, :Incoming_Join)
28
+ @pipeline.hook(self, :check_nicks, :Incoming_Who)
29
+ @pipeline.hook(self, :check_nicks, :Incoming_Names)
30
+ @pipeline.hook(self, :check_notice, :Incoming_Notice)
31
+ end
32
+
33
+ # message:: ModSpox::Messages::Incoming::Privmsg
34
+ # params:: Signature parameters
35
+ # Authenticate a user by password
36
+ def authenticate(message, params)
37
+ return unless message.is_private?
38
+ if(message.is_private? && message.source.auth.check_password(params[:password]))
39
+ information message.replyto, 'Authentication was successful'
40
+ else
41
+ error message.replyto, 'Authentication failed'
42
+ end
43
+ end
44
+
45
+ # message:: ModSpox::Messages::Incoming::Privmsg
46
+ # params:: Signature parameters
47
+ # Add an authentication mask
48
+ def add_mask(message, params)
49
+ begin
50
+ group = Models::Group.filter(:name => params[:group]).first
51
+ raise Exception.new("Failed to find group") unless group
52
+ a = Models::AuthMask.find_or_create(:mask => Regexp.new(params[:mask]).source)
53
+ a.add_group(group)
54
+ a.save
55
+ information message.replyto, 'Mask has been successfully added to authentication table'
56
+ rescue Object => boom
57
+ error message.replyto, "Authentication failed to add mask. Reason: #{boom}"
58
+ end
59
+ end
60
+
61
+ # message:: ModSpox::Messages::Incoming::Privmsg
62
+ # params:: Signature parameters
63
+ # Add an authentication group to a given mask
64
+ def set_mask_groups(message, params)
65
+ auth = Models::AuthMask[params[:id].to_i]
66
+ if(auth)
67
+ params[:groups].split(/\s/).each do |g|
68
+ group = Models::Group.filter(:name => g).first
69
+ auth.add_group(group) if group
70
+ end
71
+ information message.replyto, "Mask groups have been updated"
72
+ else
73
+ error message.replyto, "Failed to find mask with ID: #{params[:id]}"
74
+ end
75
+ end
76
+
77
+ # message:: ModSpox::Messages::Incoming::Privmsg
78
+ # params:: Signature parameters
79
+ # Remove an authentication group from a given mask
80
+ def del_mask_groups(message, params)
81
+ auth = Models::AuthMask[params[:id].to_i]
82
+ if(auth)
83
+ params[:groups].split(/\s/).each do |g|
84
+ group = Models::Group.filter(:name => g).first
85
+ auth.remove_group(group) if group
86
+ end
87
+ information message.replyto, "Mask groups have been updated"
88
+ else
89
+ error message.replyto, "Failed to find mask with ID: #{params[:id]}"
90
+ end
91
+ end
92
+
93
+ # message:: ModSpox::Messages::Incoming::Privmsg
94
+ # params:: Signature parameters
95
+ # List all authentication masks
96
+ def list_mask(message, params)
97
+ output = ["\2Authentication Mask Listing:\2"]
98
+ Models::AuthMask.all.each do |a|
99
+ groups = []
100
+ a.groups.each{|g| groups << g.name}
101
+ output << "\2ID:\2 #{a.pk}: \2mask:\2 #{a.mask} \2groups:\2 #{groups.join(', ')}"
102
+ end
103
+ reply message.replyto, output
104
+ end
105
+
106
+ # message:: ModSpox::Messages::Incoming::Privmsg
107
+ # params:: Signature parameters
108
+ # Remove given authentication mask
109
+ def remove_mask(message, params)
110
+ auth = Models::AuthMask[params[:id].to_i]
111
+ if(auth)
112
+ auth.destroy
113
+ information message.replyto, "Authentication mask with ID #{params[:id]} was deleted"
114
+ else
115
+ error message.replyto, "\2Failed\2: Could not find an authentication mask with ID: #{params[:id]}"
116
+ end
117
+ end
118
+
119
+ # message:: ModSpox::Messages::Incoming::Privmsg
120
+ # params:: Signature parameters
121
+ # Set nick authentication by NickServ
122
+ def nick_ident(message, params)
123
+ nick = Models::Nick.locate(params[:nick])
124
+ if(params[:ident] == 'true')
125
+ nick.auth.update(:services => true)
126
+ else
127
+ nick.auth.update(:services => false)
128
+ end
129
+ populate_nickserv
130
+ information message.replyto, "Nick #{params[:nick]} has been updated. Services for authentication has been set to #{params[:ident]}"
131
+ end
132
+
133
+
134
+ # message:: ModSpox::Messages::Incoming::Privmsg
135
+ # params:: Signature parameters
136
+ # Set password for given nick
137
+ def nick_pass(message, params)
138
+ nick = Models::Nick.locate(params[:nick])
139
+ nick.auth.password = params[:password]
140
+ information message.replyto, "Nick #{params[:nick]} has been updated. Password has been set."
141
+ end
142
+
143
+ # message:: ModSpox::Messages::Incoming::Privmsg
144
+ # params:: Signature parameters
145
+ # Clear password field for given nick
146
+ def clear_pass(message, params)
147
+ nick = Models::Nick.locate(params[:nick])
148
+ nick.auth.password = nil
149
+ nick.auth.save
150
+ information message.replyto, "Nick #{params[:nick]} has been updated. Password has been unset."
151
+ end
152
+
153
+ # message:: ModSpox::Messages::Incoming::Privmsg
154
+ # params:: Signature parameters
155
+ # Display info for given nick
156
+ def nick_info(message, params)
157
+ nick = Helpers.find_model(params[:nick], false)
158
+ if(nick)
159
+ info = []
160
+ info << "\2INFO [#{nick.nick}]:\2"
161
+ groups = []
162
+ nick.auth.groups.each do |ag|
163
+ groups << ag.name
164
+ end
165
+ info << "Groups: #{groups.uniq.sort.join(', ')}."
166
+ nick.auth.password.nil? || nick.auth.password.empty? ? info << 'Password has not been set.' : info << 'Password has been set.'
167
+ nick.auth.services ? info << 'Nickserv ident is enabled.' : info << 'Nickserv ident is disabled.'
168
+ information message.replyto, "#{info.join(' ')}"
169
+ else
170
+ error message.replyto, "I have no record of nick: #{params[:nick]}"
171
+ end
172
+ end
173
+
174
+ def show_groups(message, params)
175
+ groups = message.source.auth_groups.map{|g| g.name}
176
+ if(groups.nil? || groups.empty?)
177
+ reply message.replyto, "You are not currently a member of any groups"
178
+ else
179
+ reply message.replyto, "\2Groups (#{message.source.nick}):\2 #{groups.sort.join(', ')}"
180
+ end
181
+ end
182
+
183
+ # message:: ModSpox::Messages::Incoming::Privmsg
184
+ # params:: Signature parameters
185
+ # Add given nick to authentication group
186
+ def set_nick(message, params)
187
+ group = Models::Group.filter(:name => params[:group]).first
188
+ nick = Models::Nick.locate(params[:nick])
189
+ if(group)
190
+ nick.auth.add_group(group)
191
+ information message.replyto, "Nick #{params[:nick]} has been added to the group: #{params[:group]}"
192
+ else
193
+ error message.replyto, "Failed to find authentication group: #{params[:group]}"
194
+ end
195
+ end
196
+
197
+ # message:: ModSpox::Messages::Incoming::Privmsg
198
+ # params:: Signature parameters
199
+ # Remove given nick from authenticationg group
200
+ def unset_nick(message, params)
201
+ group = Models::Group.filter(:name => params[:group]).first
202
+ nick = Helpers.find_model(params[:nick], false)
203
+ if(group && nick)
204
+ nick.auth.remove_group(group)
205
+ information message.replyto, "Removed #{params[:nick]} from the #{params[:group]} authentication group."
206
+ else
207
+ error message.replyto, "Failed to find nick: #{params[:nick]}" unless nick
208
+ error message.replyto, "Failed to find group: #{params[:group]}" unless group
209
+ end
210
+ end
211
+
212
+ # message:: ModSpox::Messages::Incoming::Privmsg
213
+ # params:: Signature parameters
214
+ # Send WHOIS for nick
215
+ def do_ident(message, params)
216
+ message.source.check_masks
217
+ check_nickserv(message.source, true)
218
+ #@pipeline << Messages::Outgoing::Whois.new(message.source.nick)
219
+ end
220
+
221
+ # message:: ModSpox::Messages::Incoming::Privmsg
222
+ # params:: Signature parameters
223
+ # Display all available authentication groups
224
+ def list_groups(message, params)
225
+ groups = Models::Group.all.map{|g| g.name}
226
+ information message.replyto, "\2Groups:\2 #{groups.sort.join(', ')}"
227
+ end
228
+
229
+ # message:: ModSpox::Messages::Incoming::Privmsg
230
+ # params:: Signature parameters
231
+ # Display info about given group
232
+ def group_info(message, params)
233
+ group = Models::Group.filter(:name => params[:group]).first
234
+ if(group)
235
+ nicks = []
236
+ group.auths.each{|a| nicks << a.nick.nick}
237
+ masks = []
238
+ group.auth_masks.each{|a| masks << a.map}
239
+ output = []
240
+ output << "\2Nicks:\2 #{nicks.join(', ')}" if nicks.size > 0
241
+ output << "\2Masks:\2 #{masks.join(' | ')}" if masks.size > 0
242
+ information message.replyto, "\2Group #{params[:group]}:\2 #{output.join('. ')}"
243
+ else
244
+ error message.replyto, "Failed to find group named: #{params[:group]}"
245
+ end
246
+ end
247
+
248
+ def check_notice(m)
249
+ if(m.source.is_a?(Models::Nick) && m.source.nick.downcase == 'nickserv' && m.source.host == 'dal.net')
250
+ message = m.message.dup
251
+ nick = message.slice!(0..message.index(' ')-1)
252
+ message.slice!(0)
253
+ message.slice!(0..message.index(' '))
254
+ setting = message.to_i
255
+ if(setting == 3)
256
+ user = Helpers.find_model(nick)
257
+ user.auth.services_identified = true
258
+ Logger.info("User has been authenticated through NickServ services. (#{user.nick})")
259
+ end
260
+ end
261
+ end
262
+
263
+ # Populates array with nicks that authenticate by nickserv
264
+ def populate_nickserv
265
+ @nickserv_nicks.clear
266
+ Models::Auth.filter('services = ?', true).each do |auth|
267
+ @nickserv_nicks << auth.nick.nick.downcase
268
+ end
269
+ end
270
+
271
+ def check_nickserv(nick, force=false)
272
+ populate_nickserv if @nickserv_nicks.empty?
273
+ if(@nickserv_nicks.include?(nick.nick.downcase))
274
+ if(force || (!nick.auth.authed && !@nickserv_cache.include?(nick.nick.downcase)))
275
+ @nickserv_cache << nick.nick.downcase unless @nickserv_cache.include?(nick.nick.downcase)
276
+ @pipeline << Messages::Outgoing::Raw.new("nickserv ACC #{nick.nick}")
277
+ end
278
+ end
279
+ end
280
+
281
+ def check_join(message)
282
+ check_nickserv(message.nick) unless message.nick == me
283
+ end
284
+
285
+ def check_nicks(message)
286
+ @pipeline << Messages::Internal::TimerAdd.new(self, 20, nil, true){ message.nicks.each{|nick| check_nickserv(nick) } }
287
+ end
288
+
289
+ end