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,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,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,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
|
data/populate_gemspec.rb
ADDED
@@ -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
|