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,65 @@
1
+ require 'digest/sha1'
2
+ require 'mod_spox/models/Group'
3
+ require 'mod_spox/models/Nick'
4
+ module ModSpox
5
+ module Models
6
+ # Attributes provided by model:
7
+ # password:: Password to autenticate against
8
+ # services:: Authentication by nickserv
9
+ # mask:: Mask to authenticate source against
10
+ # authed:: Nick has authenticated
11
+ class Auth < Sequel::Model
12
+
13
+ many_to_many :groups, :join_table => :auth_groups, :class => 'ModSpox::Models::Group'
14
+ many_to_one :nick, :class => 'ModSpox::Models::Nick'
15
+
16
+ # Clear relations before destroying
17
+ def before_destroy
18
+ remove_all_groups
19
+ end
20
+
21
+ # Is nick authed using services
22
+ def services
23
+ s = values[:services]
24
+ if(s == 0 || s == '0' || !s)
25
+ return false
26
+ else
27
+ return true
28
+ end
29
+ end
30
+
31
+ # Set services (nickserv) identification
32
+ def services_identified=(val)
33
+ if(val && services)
34
+ update(:authed => true)
35
+ else
36
+ update(:authed => false)
37
+ end
38
+ end
39
+
40
+ # pass:: password to compare
41
+ # Check and authenticate against password
42
+ def check_password(pass)
43
+ if(Digest::SHA1.hexdigest(pass) == password)
44
+ update(:authed => true)
45
+ return true
46
+ else
47
+ return false
48
+ end
49
+ end
50
+
51
+ def password=(pass)
52
+ pass = pass.nil? ? nil : Digest::SHA1.hexdigest(pass)
53
+ super(pass)
54
+ end
55
+
56
+ # source:: source to apply mask to
57
+ # Check and authenticate by mask against source
58
+ def check_mask(source)
59
+ authed = true if source =~ /^#{mask}$/
60
+ end
61
+
62
+ end
63
+
64
+ end
65
+ end
@@ -0,0 +1,13 @@
1
+ require 'mod_spox/models/Nick'
2
+ require 'mod_spox/models/Group'
3
+ module ModSpox
4
+ module Models
5
+
6
+ class AuthMask < Sequel::Model
7
+
8
+ many_to_many :nicks, :join_table => :auth_masks_nicks, :class => 'ModSpox::Models::Nick'
9
+ many_to_many :groups, :join_table => :auth_masks_groups, :class => 'ModSpox::Models::Group'
10
+
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,89 @@
1
+ require 'mod_spox/models/Nick'
2
+ require 'mod_spox/models/NickMode'
3
+
4
+ module ModSpox
5
+ module Models
6
+
7
+ # Attributes provided by model:
8
+ # name:: Channel name
9
+ # password:: Channel password
10
+ # autojoin:: Set bot to autojoin this channel
11
+ # topic:: Channel topic
12
+ # quiet:: Silence the bot in this channel
13
+ # parked:: Bot is currently in this channel
14
+ class Channel < Sequel::Model
15
+
16
+ many_to_many :nicks, :join_table => :nick_channels, :class => 'ModSpox::Models::Nick'
17
+ one_to_many :nick_modes, :class => 'ModSpox::Models::NickMode'
18
+
19
+ # chan_name:: string
20
+ # set channel name after downcase
21
+ def name=(chan_name)
22
+ chan_name.downcase!
23
+ super(chan_name)
24
+ end
25
+
26
+ def Channel.find_or_create(args)
27
+ args[:name].downcase! if args[:name]
28
+ super(args)
29
+ end
30
+
31
+ def Channel.filter(args)
32
+ args[:name].downcase! if args[:name]
33
+ super(args)
34
+ end
35
+
36
+ def Channel.locate(string, create = true)
37
+ string.downcase!
38
+ chan = Channel.filter(:name => string).first
39
+ if(!chan && create)
40
+ chan = Channel.find_or_create(:name => string)
41
+ end
42
+ return chan
43
+ end
44
+
45
+ # m:: single character mode
46
+ # returns if mode is currently set for
47
+ # channel
48
+ def set?(m)
49
+ return mode.nil? ? false : !mode.index(m).nil?
50
+ end
51
+
52
+ # m:: single character mode
53
+ # set a mode for the channel
54
+ # TODO: add some type checks
55
+ def set_mode(m)
56
+ update(:mode => "#{values[:mode]}#{m}") if values[:mode].nil? || values[:mode].index(m).nil?
57
+ end
58
+
59
+ # m:: single character mode
60
+ # unset a mode for the channel
61
+ def unset_mode(m)
62
+ update(:mode => values[:mode].gsub(m, ''))
63
+ end
64
+
65
+ def clear_modes
66
+ update(:mode => '')
67
+ end
68
+
69
+ # Removes all nicks from this channel
70
+ def clear_nicks
71
+ remove_all_nicks
72
+ end
73
+
74
+ def add_nick(n)
75
+ unless(nicks_dataset.filter(:nick_id => n.pk).count > 0)
76
+ super(n)
77
+ end
78
+ end
79
+
80
+ def remove_nick(n)
81
+ if(nicks_dataset.filter(:nick_id => n.pk).count > 0)
82
+ super(n)
83
+ end
84
+ end
85
+
86
+ end
87
+
88
+ end
89
+ end
@@ -0,0 +1,30 @@
1
+ module ModSpox
2
+ module Models
3
+ # Attributes provided by model:
4
+ # name:: name of the config item
5
+ # value:: value of the config item
6
+ #
7
+ # It is important to note this model is for storing configuration
8
+ # values only. It will only store strings, not complex objects. If
9
+ # you need to store an object, use the Setting model.
10
+ # TODO: find and remove any [] usage
11
+ class Config < Sequel::Model
12
+
13
+ def name=(config_name)
14
+ config_name.downcase!
15
+ super(config_name)
16
+ end
17
+
18
+ def Config.val(sym)
19
+ s = Config.filter(:name => "#{sym}").first
20
+ return s ? s.value : nil
21
+ end
22
+
23
+ def Config.set(sym, value)
24
+ s = Config.find_or_create(:name => "#{sym}")
25
+ s.value = value
26
+ s.save
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,30 @@
1
+ require 'mod_spox/models/Auth'
2
+ require 'mod_spox/models/Signature'
3
+
4
+ module ModSpox
5
+ module Models
6
+
7
+ class Group < Sequel::Model
8
+
9
+ many_to_many :auth_masks, :join_table => :auth_masks_groups, :class => 'ModSpox::Models::AuthMask'
10
+ many_to_many :auths, :join_table => :auth_groups, :class => 'ModSpox::Models::Auth'
11
+ one_to_many :signature, :class => 'ModSpox::Models::Signature'
12
+
13
+ def Group.filter(args={})
14
+ args[:name].downcase! if args.has_key?(:name)
15
+ super(args)
16
+ end
17
+
18
+ def Group.find_or_create(args={})
19
+ args[:name].downcase! if args.has_key?(:name)
20
+ super(args)
21
+ end
22
+
23
+ def name=(group_name)
24
+ group_name.downcase!
25
+ super(group_name)
26
+ end
27
+
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,4 @@
1
+ # Quick loader for all models
2
+ Dir.new(File.dirname(__FILE__)).each do |f|
3
+ require File.dirname(__FILE__) + '/' + f if f =~ /\.rb$/
4
+ end
@@ -0,0 +1,195 @@
1
+ require 'socket'
2
+ require 'mod_spox/models/Auth'
3
+ require 'mod_spox/models/Channel'
4
+ require 'mod_spox/models/NickMode'
5
+ require 'mod_spox/models/AuthMask'
6
+
7
+
8
+
9
+ module ModSpox
10
+ module Models
11
+ # Attributes provided by model:
12
+ # nick:: nick string
13
+ # username:: username of the user
14
+ # real_name:: real name of the user
15
+ # address:: ip of the user
16
+ # host:: hostname/ip of the user
17
+ # source:: full source string of the user
18
+ # connected_at:: time user connected
19
+ # connected_to:: server user connected to
20
+ # seconds_idle:: seconds user has been idle
21
+ # visible:: can the bot see the user (is in a channel the bot is parked)
22
+ # away:: is nick away
23
+ # botnick:: is the nick of the bot
24
+
25
+ class Nick < Sequel::Model
26
+
27
+ one_to_many :auths, :one_to_one => true, :class => 'ModSpox::Models::Auth'
28
+ many_to_many :channels, :join_table => :nick_channels, :class => 'ModSpox::Models::Channel'
29
+ one_to_many :modes, :class => 'ModSpox::Models::NickMode'
30
+ many_to_many :auth_masks, :join_table => :auth_masks_nicks, :class => 'ModSpox::Models::AuthMask'
31
+
32
+ # nick_name:: nick of user
33
+ # override to downcase nick
34
+ def nick=(nick_name)
35
+ nick_name.downcase!
36
+ super(nick_name)
37
+ end
38
+
39
+ def Nick.find_or_create(args)
40
+ args[:nick].downcase! if args[:nick]
41
+ super(args)
42
+ end
43
+
44
+ def Nick.filter(args)
45
+ args[:nick].downcase! if args[:nick]
46
+ super(args)
47
+ end
48
+
49
+ def Nick.locate(string, create = true)
50
+ nick = nil
51
+ string.downcase!
52
+ nick = Nick.filter(:nick => string).first
53
+ if(!nick && create)
54
+ nick = Nick.find_or_create(:nick => string)
55
+ end
56
+ return nick
57
+ end
58
+
59
+ # addr: users address
60
+ # make sure everything is set properly
61
+ # when the address is set
62
+ def address=(addr)
63
+ return if (!values[:address].nil? && !values[:host].nil?) && (values[:address] == addr || values[:host] == addr)
64
+ oldaddress = values[:address]
65
+ begin
66
+ info = Object::Socket.getaddrinfo(address, nil)
67
+ addr = info[0][3]
68
+ update :host => info[0][2]
69
+ super(addr)
70
+ rescue Object => boom
71
+ super(addr)
72
+ update :host => address
73
+ ensure
74
+ if values[:address] != oldaddress
75
+ auth.update(:authed => false)
76
+ end
77
+ end
78
+ end
79
+
80
+ # val:: bool
81
+ # sets if nick is currently visible. if
82
+ # not all relating information is cleared
83
+ def visible=(val)
84
+ unless(val)
85
+ update :username => nil
86
+ update :real_name => nil
87
+ update :address => nil
88
+ update :source => nil
89
+ update :connected_at => nil
90
+ update :connected_to => nil
91
+ update :seconds_idle => nil
92
+ update :away => false
93
+ remove_all_channels
94
+ auth.update(:authed => false)
95
+ end
96
+ super(val)
97
+ end
98
+
99
+ # Auth model associated with nick
100
+ def auth
101
+ if(auths.empty?)
102
+ a = Auth.find_or_create(:nick_id => pk)
103
+ add_auth(a)
104
+ end
105
+ auths[0].refresh
106
+ return auths[0]
107
+ end
108
+
109
+ # AuthGroups nick is authed to
110
+ def auth_groups
111
+ g = (auth.groups.empty? || !auth.authed) ? [] : auth.groups
112
+ unless(auth_masks.empty?)
113
+ auth_masks.each{|am| g += am.groups}
114
+ end
115
+ return g
116
+ end
117
+
118
+ # Checks nick's source against available
119
+ # authentication masks
120
+ def check_masks
121
+ AuthMask.all.each do |am|
122
+ add_auth_mask(am) if source =~ /#{am.mask}/ && !auth_masks.include?(am)
123
+ end
124
+ end
125
+
126
+ # group:: Models::Group
127
+ # Return if nick is member of given group
128
+ def in_group?(group)
129
+ group = Group.filter(:name => group).first if group.is_a?(String)
130
+ return group.nil? ? false : auth_groups.include?(group)
131
+ end
132
+
133
+ # Modes associated with this nick
134
+ def nick_modes
135
+ modes
136
+ end
137
+
138
+ # Remove all channels
139
+ def clear_channels
140
+ remove_all_channels
141
+ visible = false
142
+ end
143
+
144
+ # channel:: Models::Channel
145
+ # Return if nick is operator in given channel
146
+ def is_op?(channel)
147
+ raise Exceptions::NotInChannel.new(channel) unless channels_dataset.filter(:channel_id => channel.pk).count > 0
148
+ m = NickMode.filter(:nick_id => pk, :channel_id => channel.pk).first
149
+ return m ? m.set?('o') : false
150
+ end
151
+
152
+ # channel:: Models::Channel
153
+ # Return if nick is voiced in given channel
154
+ def is_voice?(channel)
155
+ raise Exceptions::NotInChannel.new(channel) unless channels_dataset.filter(:channel_id => channel.pk).count > 0
156
+ m = NickMode.filter(:nick_id => pk, :channel_id => channel.pk).first
157
+ return m ? m.set?('v') : false
158
+ end
159
+
160
+ def set_mode(m)
161
+ m.each_char do |c|
162
+ update(:mode => "#{mode}#{c}") if mode.index(c).nil?
163
+ end
164
+ end
165
+
166
+ def unset_mode(m)
167
+ m.each_char do |c|
168
+ update(:mode => mode.gsub(c,'')) unless mode.index(c).nil?
169
+ end
170
+ end
171
+
172
+ def mode_set?(m)
173
+ return !mode.index(m).nil?
174
+ end
175
+
176
+ def add_channel(c)
177
+ unless(channels_dataset.filter(:channel_id => c.pk).count > 0)
178
+ super(c)
179
+ end
180
+ end
181
+
182
+ def remove_channel(c)
183
+ if(channels_dataset.filter(:channel_id => c.pk).count > 0)
184
+ super(c)
185
+ end
186
+ end
187
+
188
+ # TODO: rewrite this to work
189
+ def Nick.transfer_groups(old_nick, new_nick)
190
+ # do nothing
191
+ end
192
+
193
+ end
194
+ end
195
+ end
@@ -0,0 +1,32 @@
1
+ require 'mod_spox/models/Nick'
2
+ require 'mod_spox/models/Channel'
3
+ module ModSpox
4
+ module Models
5
+
6
+ class NickMode < Sequel::Model
7
+ many_to_one :nick, :class => 'ModSpox::Models::Nick'
8
+ many_to_one :channel, :class => 'ModSpox::Models::Channel'
9
+
10
+ # m:: mode character
11
+ # add a mode for a nick channel combo
12
+ def set_mode(m)
13
+ update(:mode => "#{values[:mode]}#{m}") if values[:mode].nil? || values[:mode].index(m).nil?
14
+ end
15
+
16
+ # m:: mode character
17
+ # remove a mode for a nick channel combo
18
+ def unset_mode(m)
19
+ update(:mode => values[:mode].gsub(m, ''))
20
+ end
21
+
22
+ def set?(m)
23
+ return mode.nil? ? false : !mode.index(m).nil?
24
+ end
25
+
26
+ # clear all modes for a nick channel combo
27
+ def clear_modes
28
+ update(:mode => '')
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,27 @@
1
+ module ModSpox
2
+ module Models
3
+ # Attributes provided by model:
4
+ # host:: hostname of server
5
+ # port:: port to connect to
6
+ # priority:: priority of this entry (higher number == greater priority)
7
+ # connected:: bot is connected to this server
8
+ class Server < Sequel::Model
9
+
10
+ def Server.filter(args={})
11
+ args[:host].downcase! if args.has_key?(:host)
12
+ super(args)
13
+ end
14
+
15
+ def Server.find_or_create(args={})
16
+ args[:host].downcase! if args.has_key?(:host)
17
+ super(args)
18
+ end
19
+
20
+ def host=(host_name)
21
+ host_name.downcase!
22
+ super(host_name)
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,52 @@
1
+ module ModSpox
2
+ module Models
3
+ # Attributes provided by model:
4
+ # name:: name of the setting
5
+ # value:: value of the setting
6
+ #
7
+ # This model can be used to store complex objects. These objects are dumped
8
+ # and stored for later retrieval
9
+ # TODO: remove [] from any usage
10
+ class Setting < Sequel::Model
11
+
12
+ #serialize(:value, :format => :marshal)
13
+
14
+ def find_or_create(args)
15
+ args[:name].downcase! if args[:name]
16
+ super(args)
17
+ end
18
+
19
+ def filter(args)
20
+ args[:name].downcase! if args[:name]
21
+ super(args)
22
+ end
23
+
24
+ def name=(setting_name)
25
+ setting_name.downcase!
26
+ super(setting_name)
27
+ end
28
+
29
+ def value=(val)
30
+ val = [Marshal.dump(val.dup)].pack('m')
31
+ super(val)
32
+ end
33
+
34
+ def value
35
+ return values[:value] ? Marshal.load(values[:value].unpack('m')[0]) : nil
36
+ end
37
+
38
+ def Setting.set(sym, value)
39
+ sym = sym.to_s.downcase
40
+ s = Setting.find_or_create(:name => "#{sym}")
41
+ s.value = value
42
+ s.save
43
+ end
44
+
45
+ def Setting.val(sym)
46
+ sym = sym.to_s.downcase
47
+ s = Setting.filter(:name => "#{sym}").first
48
+ return s ? s.value : nil
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,52 @@
1
+ require 'mod_spox/models/Group'
2
+
3
+ module ModSpox
4
+ module Models
5
+ # Attributes provided by model:
6
+ # signature:: regex signature
7
+ # params:: Array of parameters to match in signature
8
+ # method:: method to call when matched
9
+ # plugin:: plugin to call when matched
10
+ # description:: description of trigger
11
+ class Signature < Sequel::Model
12
+
13
+ many_to_one :group, :class => 'ModSpox::Models::Group'
14
+
15
+ def params=(prms)
16
+ raise Exceptions::InvalidType.new('Parameter names must be provided in an array') unless prms.nil? || prms.kind_of?(Array)
17
+ prms = prms.join('|') unless prms.nil?
18
+ super(prms)
19
+ end
20
+
21
+ def params
22
+ return values[:params].nil? ? [] : values[:params].split('|')
23
+ end
24
+
25
+ def signature=(v)
26
+ v = [Marshal.dump(v)].pack('m')
27
+ super(v)
28
+ end
29
+
30
+ def signature
31
+ values[:signature] ? Marshal.load(values[:signature].unpack('m')[0]) : nil
32
+ end
33
+
34
+ def Signature.find_or_create(args)
35
+ t = nil
36
+ if(args.has_key?(:signature) && args.has_key?(:params) && args.has_key?(:method) && args.has_key?(:plugin))
37
+ args[:params] = [] if args[:params].nil?
38
+ Signature.filter(:method => args[:method], :plugin => args[:plugin], :params => args[:params].join('|')).each do |s|
39
+ t = s if s.signature == args[:signature]
40
+ end
41
+ args[:params] = nil if args[:params].empty?
42
+ end
43
+ unless(t)
44
+ t = create(args)
45
+ end
46
+ t.update(:enabled => true)
47
+ return t
48
+ end
49
+
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,9 @@
1
+ module ModSpox
2
+ module Models
3
+ # Attributes provided by model:
4
+ # trigger:: trigger to match
5
+ # active:: trigger is active
6
+ class Trigger < Sequel::Model
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,49 @@
1
+ module ModSpox
2
+
3
+ RFC = {
4
+ # basic
5
+ :INVITE => {:value => :INVITE, :handlers => ['Invite']},
6
+ :JOIN => {:value => :JOIN, :handlers => ['Join']},
7
+ :KICK => {:value => :KICK, :handlers => ['Kick']},
8
+ :MODE => {:value => :MODE, :handlers => ['Mode']},
9
+ :NICK => {:value => :NICK, :handlers => ['Nick']},
10
+ :NOTICE => {:value => :NOTICE, :handlers => ['Notice']},
11
+ :PART => {:value => :PART, :handlers => ['Part']},
12
+ :PING => {:value => :PING, :handlers => ['Ping']},
13
+ :PONG => {:value => :PONG, :handlers => ['Pong']},
14
+ :PRIVMSG => {:value => :PRIVMSG, :handlers => ['Privmsg']},
15
+ :QUIT => {:value => :QUIT, :handlers => ['Quit']},
16
+ #client server messages#
17
+ :RPL_WELCOME => {:value => '001', :handlers => ['Welcome']},
18
+ :RPL_YOURHOST => {:value => '002'},
19
+ :RPL_CREATED => {:value => '003', :handlers => ['Created']},
20
+ :RPL_MYINFO => {:value => '004', :handlers => ['MyInfo']},
21
+ :RPL_BOUNCE => {:value => '005', :handlers => ['Bounce']},
22
+ #response replies#
23
+ :RPL_WHOISIDENTIFIED => {:value => '307', :handlers => ['Whois']},
24
+ :RPL_WHOISUSER => {:value => '311', :handlers => ['Whois']},
25
+ :RPL_WHOISSERVER => {:value => '312', :handlers => ['Whois']},
26
+ :RPL_WHOISOPERATOR => {:value => '313', :handlers => ['Whois']},
27
+ :RPL_WHOISIDLE => {:value => '317', :handlers => ['Whois']},
28
+ :RPL_ENDOFWHOIS => {:value => '318', :handlers => ['Whois']},
29
+ :RPL_WHOISCHANNELS => {:value => '319', :handlers => ['Whois']},
30
+ :RPL_NOTOPIC => {:value => '331', :handlers => ['Topic']},
31
+ :RPL_TOPIC => {:value => '332', :handlers => ['Topic']},
32
+ :RPL_TOPICINFO => {:value => '333', :handlers => ['Topic']},
33
+ :RPL_WHOREPLY => {:value => '352', :handlers => ['Who']},
34
+ :RPL_ENDOFWHO => {:value => '315', :handlers => ['Who']},
35
+ :RPL_NAMREPLY => {:value => '353', :handlers => ['Names']},
36
+ :RPL_ENDOFNAMES => {:value => '366', :handlers => ['Names']},
37
+ :RPL_MOTDSTART => {:value => '375', :handlers => ['Motd']},
38
+ :RPL_MOTD => {:value => '372', :handlers => ['Motd']},
39
+ :RPL_ENDOFMOTD => {:value => '376', :handlers => ['Motd']},
40
+ :RPL_LUSERCLIENT => {:value => '251', :handlers => ['LuserClient']},
41
+ :RPL_LUSEROP => {:value => '252', :handlers => ['LuserOp']},
42
+ :RPL_LUSERUNKNOWN => {:value => '253', :handlers => ['LuserUnknown']},
43
+ :RPL_LUSERCHANNELS => {:value => '254', :handlers => ['LuserChannels']},
44
+ :RPL_LUSERME => {:value => '255', :handlers => ['LuserMe']},
45
+ :ERR_ERRONEOUSNICKNAME => {:value => '432', :handlers => ['BadNick']},
46
+ :ERR_NICKNAMEINUSE => {:value => '433', :handlers => ['NickInUse']}
47
+ }
48
+ # i feel kinda dirty after that, but hey, lets keep things interesting!
49
+ end
@@ -0,0 +1,15 @@
1
+ skip = %w(gemspec$ gem$ Rakefile populate_gemspec.rb)
2
+ files = `git ls-files`.split("\n").sort
3
+ files.each{|f| skip.each{|s| if(f =~ /#{s}/);files.delete(f);next;end;}}
4
+
5
+ spec = File.open('mod_spox.gemspec', 'r')
6
+ contents = spec.readlines
7
+ spec.close
8
+ contents.each do |line|
9
+ if(line =~ /^\s+s\.files\s+=\s(.+)$/)
10
+ line.gsub!($1, files.to_s)
11
+ end
12
+ end
13
+ spec = File.open('mod_spox.gemspec', 'w')
14
+ spec.write(contents.join)
15
+ spec.close