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