mod_spox 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +2 -0
- data/INSTALL +9 -0
- data/README +33 -0
- data/bin/mod_spox +60 -0
- data/data/mod_spox/extras/Tester.rb +14 -0
- data/data/mod_spox/plugins/Authenticator.rb +245 -0
- data/data/mod_spox/plugins/BotNick.rb +18 -0
- data/data/mod_spox/plugins/Initializer.rb +41 -0
- data/data/mod_spox/plugins/Joiner.rb +13 -0
- data/data/mod_spox/plugins/Parter.rb +22 -0
- data/data/mod_spox/plugins/PluginLoader.rb +136 -0
- data/data/mod_spox/plugins/Ponger.rb +14 -0
- data/data/mod_spox/plugins/Quitter.rb +14 -0
- data/lib/mod_spox/Action.rb +73 -0
- data/lib/mod_spox/BaseConfig.rb +48 -0
- data/lib/mod_spox/Bot.rb +472 -0
- data/lib/mod_spox/BotConfig.rb +54 -0
- data/lib/mod_spox/ConfigurationWizard.rb +178 -0
- data/lib/mod_spox/Database.rb +25 -0
- data/lib/mod_spox/Exceptions.rb +35 -0
- data/lib/mod_spox/Helpers.rb +35 -0
- data/lib/mod_spox/Loader.rb +79 -0
- data/lib/mod_spox/Logger.rb +31 -0
- data/lib/mod_spox/MessageFactory.rb +73 -0
- data/lib/mod_spox/Monitors.rb +59 -0
- data/lib/mod_spox/Pipeline.rb +148 -0
- data/lib/mod_spox/Plugin.rb +18 -0
- data/lib/mod_spox/PluginManager.rb +105 -0
- data/lib/mod_spox/Pool.rb +50 -0
- data/lib/mod_spox/Socket.rb +171 -0
- data/lib/mod_spox/Timer.rb +138 -0
- data/lib/mod_spox/handlers/BadNick.rb +16 -0
- data/lib/mod_spox/handlers/Bounce.rb +15 -0
- data/lib/mod_spox/handlers/Created.rb +16 -0
- data/lib/mod_spox/handlers/Handler.rb +31 -0
- data/lib/mod_spox/handlers/Invite.rb +19 -0
- data/lib/mod_spox/handlers/Join.rb +30 -0
- data/lib/mod_spox/handlers/Kick.rb +24 -0
- data/lib/mod_spox/handlers/LuserChannels.rb +16 -0
- data/lib/mod_spox/handlers/LuserClient.rb +16 -0
- data/lib/mod_spox/handlers/LuserMe.rb +14 -0
- data/lib/mod_spox/handlers/LuserOp.rb +16 -0
- data/lib/mod_spox/handlers/LuserUnknown.rb +16 -0
- data/lib/mod_spox/handlers/Mode.rb +47 -0
- data/lib/mod_spox/handlers/Motd.rb +30 -0
- data/lib/mod_spox/handlers/MyInfo.rb +21 -0
- data/lib/mod_spox/handlers/Names.rb +54 -0
- data/lib/mod_spox/handlers/Nick.rb +24 -0
- data/lib/mod_spox/handlers/NickInUse.rb +16 -0
- data/lib/mod_spox/handlers/Notice.rb +32 -0
- data/lib/mod_spox/handlers/Part.rb +19 -0
- data/lib/mod_spox/handlers/Ping.rb +16 -0
- data/lib/mod_spox/handlers/Pong.rb +16 -0
- data/lib/mod_spox/handlers/Privmsg.rb +27 -0
- data/lib/mod_spox/handlers/Quit.rb +21 -0
- data/lib/mod_spox/handlers/Topic.rb +29 -0
- data/lib/mod_spox/handlers/Welcome.rb +34 -0
- data/lib/mod_spox/handlers/Who.rb +60 -0
- data/lib/mod_spox/handlers/Whois.rb +63 -0
- data/lib/mod_spox/handlers/YourHost.rb +17 -0
- data/lib/mod_spox/messages/incoming/BadNick.rb +15 -0
- data/lib/mod_spox/messages/incoming/Bounce.rb +17 -0
- data/lib/mod_spox/messages/incoming/Created.rb +14 -0
- data/lib/mod_spox/messages/incoming/Invite.rb +20 -0
- data/lib/mod_spox/messages/incoming/Join.rb +18 -0
- data/lib/mod_spox/messages/incoming/Kick.rb +25 -0
- data/lib/mod_spox/messages/incoming/LuserChannels.rb +14 -0
- data/lib/mod_spox/messages/incoming/LuserClient.rb +23 -0
- data/lib/mod_spox/messages/incoming/LuserMe.rb +17 -0
- data/lib/mod_spox/messages/incoming/LuserOp.rb +14 -0
- data/lib/mod_spox/messages/incoming/LuserUnknown.rb +14 -0
- data/lib/mod_spox/messages/incoming/Message.rb +22 -0
- data/lib/mod_spox/messages/incoming/Mode.rb +41 -0
- data/lib/mod_spox/messages/incoming/Motd.rb +17 -0
- data/lib/mod_spox/messages/incoming/MyInfo.rb +23 -0
- data/lib/mod_spox/messages/incoming/Names.rb +23 -0
- data/lib/mod_spox/messages/incoming/Nick.rb +25 -0
- data/lib/mod_spox/messages/incoming/NickInUse.rb +14 -0
- data/lib/mod_spox/messages/incoming/Notice.rb +8 -0
- data/lib/mod_spox/messages/incoming/Part.rb +20 -0
- data/lib/mod_spox/messages/incoming/Ping.rb +17 -0
- data/lib/mod_spox/messages/incoming/Pong.rb +8 -0
- data/lib/mod_spox/messages/incoming/Privmsg.rb +64 -0
- data/lib/mod_spox/messages/incoming/Quit.rb +17 -0
- data/lib/mod_spox/messages/incoming/Topic.rb +20 -0
- data/lib/mod_spox/messages/incoming/TopicInfo.rb +20 -0
- data/lib/mod_spox/messages/incoming/Welcome.rb +26 -0
- data/lib/mod_spox/messages/incoming/Who.rb +17 -0
- data/lib/mod_spox/messages/incoming/Whois.rb +47 -0
- data/lib/mod_spox/messages/incoming/YourHost.rb +17 -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/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 +8 -0
- data/lib/mod_spox/messages/internal/NickResponse.rb +14 -0
- data/lib/mod_spox/messages/internal/PluginLoadRequest.rb +20 -0
- data/lib/mod_spox/messages/internal/PluginLoadResponse.rb +16 -0
- data/lib/mod_spox/messages/internal/PluginModuleRequest.rb +13 -0
- data/lib/mod_spox/messages/internal/PluginModuleResponse.rb +17 -0
- data/lib/mod_spox/messages/internal/PluginReload.rb +8 -0
- data/lib/mod_spox/messages/internal/PluginRequest.rb +17 -0
- data/lib/mod_spox/messages/internal/PluginResponse.rb +20 -0
- data/lib/mod_spox/messages/internal/PluginUnloadRequest.rb +8 -0
- data/lib/mod_spox/messages/internal/PluginUnloadResponse.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 +9 -0
- data/lib/mod_spox/messages/internal/StatusResponse.rb +17 -0
- data/lib/mod_spox/messages/internal/TimerAdd.rb +27 -0
- data/lib/mod_spox/messages/internal/TimerClear.rb +8 -0
- data/lib/mod_spox/messages/internal/TimerRemove.rb +15 -0
- data/lib/mod_spox/messages/internal/TimerResponse.rb +26 -0
- data/lib/mod_spox/messages/internal/TriggersUpdate.rb +8 -0
- data/lib/mod_spox/messages/outgoing/Admin.rb +15 -0
- data/lib/mod_spox/messages/outgoing/Away.rb +10 -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 +11 -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 +10 -0
- data/lib/mod_spox/messages/outgoing/Pong.rb +17 -0
- data/lib/mod_spox/messages/outgoing/Privmsg.rb +19 -0
- data/lib/mod_spox/messages/outgoing/Quit.rb +10 -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 +19 -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/migration/001_create_auths.rb +13 -0
- data/lib/mod_spox/migration/001_create_channel.rb +13 -0
- data/lib/mod_spox/migration/001_create_channel_modes.rb +13 -0
- data/lib/mod_spox/migration/001_create_config.rb +13 -0
- data/lib/mod_spox/migration/001_create_nick_channels.rb +13 -0
- data/lib/mod_spox/migration/001_create_nick_modes.rb +13 -0
- data/lib/mod_spox/migration/001_create_nicks.rb +13 -0
- data/lib/mod_spox/migration/001_create_servers.rb +13 -0
- data/lib/mod_spox/migration/001_create_settings.rb +13 -0
- data/lib/mod_spox/migration/001_create_signatures.rb +13 -0
- data/lib/mod_spox/migration/001_create_triggers.rb +13 -0
- data/lib/mod_spox/models/Auth.rb +79 -0
- data/lib/mod_spox/models/AuthGroup.rb +15 -0
- data/lib/mod_spox/models/Channel.rb +47 -0
- data/lib/mod_spox/models/ChannelMode.rb +14 -0
- data/lib/mod_spox/models/Config.rb +31 -0
- data/lib/mod_spox/models/Group.rb +13 -0
- data/lib/mod_spox/models/Nick.rb +110 -0
- data/lib/mod_spox/models/NickChannel.rb +43 -0
- data/lib/mod_spox/models/NickMode.rb +18 -0
- data/lib/mod_spox/models/Server.rb +12 -0
- data/lib/mod_spox/models/Setting.rb +40 -0
- data/lib/mod_spox/models/Signature.rb +30 -0
- data/lib/mod_spox/models/Trigger.rb +9 -0
- data/lib/mod_spox/rfc2812.rb +171 -0
- metadata +261 -0
@@ -0,0 +1,31 @@
|
|
1
|
+
module ModSpox
|
2
|
+
module Handlers
|
3
|
+
|
4
|
+
class Handler
|
5
|
+
|
6
|
+
def process(data)
|
7
|
+
raise Exceptions::NotImplemented.new('Method has not been implemented')
|
8
|
+
end
|
9
|
+
|
10
|
+
protected
|
11
|
+
|
12
|
+
def find_model(string)
|
13
|
+
if(string =~ /^[A-Za-z\|\\\{\}\[\]\^`~_\-]+$/)
|
14
|
+
Logger.log("Model: #{string} -> Nick")
|
15
|
+
return Models::Nick.find_or_create(:nick => string)
|
16
|
+
elsif(string =~ /^[&#+!]/)
|
17
|
+
Logger.log("Model: #{string} -> Channel")
|
18
|
+
return Models::Channel.find_or_create(:name => string)
|
19
|
+
elsif(model = Models::Server.filter(:host => string, :connected => true).first)
|
20
|
+
Logger.log("Model: #{string} -> Server")
|
21
|
+
return model
|
22
|
+
else
|
23
|
+
Logger.log("FAIL Model: #{string} -> No match")
|
24
|
+
return string
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module ModSpox
|
2
|
+
module Handlers
|
3
|
+
class Invite < Handler
|
4
|
+
def initialize(handlers)
|
5
|
+
handlers[:INVITE] = self
|
6
|
+
end
|
7
|
+
def process(string)
|
8
|
+
if(string =~ /^(.+?)!.*?INVITE\s(\S+)\s(.+)$/)
|
9
|
+
source = find_model($1)
|
10
|
+
target = find_model($2)
|
11
|
+
channel = find_model($3)
|
12
|
+
return Messages::Incoming::Invite(string, source, target, channel)
|
13
|
+
else
|
14
|
+
Logger.log('Failed to parse INVITE message')
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module ModSpox
|
2
|
+
module Handlers
|
3
|
+
class Join < Handler
|
4
|
+
def initialize(handlers)
|
5
|
+
handlers[:JOIN] = self
|
6
|
+
end
|
7
|
+
def process(string)
|
8
|
+
if(string =~ /^:(\S+)\sJOIN :(\S+)$/)
|
9
|
+
source = $1
|
10
|
+
chan = $2
|
11
|
+
if(source =~ /^(.+?)!(.+?)@(.+)$/)
|
12
|
+
nick = find_model($1)
|
13
|
+
nick.username = $2
|
14
|
+
nick.address = $3
|
15
|
+
nick.source = source
|
16
|
+
nick.visible = true
|
17
|
+
nick.save
|
18
|
+
channel = find_model(chan)
|
19
|
+
channel.nick_add(nick)
|
20
|
+
return Messages::Incoming::Join.new(string, channel, nick)
|
21
|
+
else
|
22
|
+
Logger.log('Failed to parse source on JOIN message')
|
23
|
+
end
|
24
|
+
else
|
25
|
+
Logger.log('Failed to parse JOIN message')
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module ModSpox
|
2
|
+
module Handlers
|
3
|
+
class Kick < Handler
|
4
|
+
def initialize(handlers)
|
5
|
+
handlers[:KICK] = self
|
6
|
+
end
|
7
|
+
def process(string)
|
8
|
+
if(string =~ /^:(\S+)\sKICK\s(\S+)\s(\S+)\s:(.+)$/)
|
9
|
+
source = $1
|
10
|
+
chan = $2
|
11
|
+
kicked = $3
|
12
|
+
reason = $4
|
13
|
+
kicker = find_model(source.gsub(/!.+$/, ''))
|
14
|
+
channel = find_model(chan)
|
15
|
+
kickee = find_model(kicked)
|
16
|
+
channel.nick_remove(kickee)
|
17
|
+
return Messages::Incoming::Kick(string, channel, kicker, kickee, reason)
|
18
|
+
else
|
19
|
+
Logger.log('Failed to process KICK message')
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module ModSpox
|
2
|
+
module Handlers
|
3
|
+
class LuserChannels < Handler
|
4
|
+
def initialize(handlers)
|
5
|
+
handlers[RPL_LUSERCHANNELS] = self
|
6
|
+
end
|
7
|
+
def process(string)
|
8
|
+
if(string =~ /(\d+)\s:channels/)
|
9
|
+
return Messages::Incoming::LuserChannels.new(string, $1.to_i)
|
10
|
+
else
|
11
|
+
Logger.log('Failed to match RPL_LUSERCHANNELS message')
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module ModSpox
|
2
|
+
module Handlers
|
3
|
+
class LuserClient < Handler
|
4
|
+
def initialize(handlers)
|
5
|
+
handlers[RPL_LUSERCLIENT] = self
|
6
|
+
end
|
7
|
+
def process(string)
|
8
|
+
users = string =~ /(\d+) users/ ? $1 : 0
|
9
|
+
invis = string =~ /(\d+) invisible/ ? $1 : 0
|
10
|
+
servs = string =~ /(\d+) servers/ ? $1 : 0
|
11
|
+
services = string =~ /(\d+) services/ ? $1 : 0
|
12
|
+
return Messages::Incoming::LuserClient.new(string, users, invis, servs, services)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module ModSpox
|
2
|
+
module Handlers
|
3
|
+
class LuserMe < Handler
|
4
|
+
def initialize(handlers)
|
5
|
+
handlers[RPL_LUSERME] = self
|
6
|
+
end
|
7
|
+
def process(string)
|
8
|
+
clients = string =~ /(\d+) clients/ ? $1.to_i : 0
|
9
|
+
servers = string =~ /(\d+) server/ ? $1.to_i : 0
|
10
|
+
return Messages::Incoming::LuserMe.new(string, clients, servers)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module ModSpox
|
2
|
+
module Handlers
|
3
|
+
class LuserOp < Handler
|
4
|
+
def initialize(handlers)
|
5
|
+
handlers[RPL_LUSEROP] = self
|
6
|
+
end
|
7
|
+
def process(string)
|
8
|
+
if(string =~ /(\d+) :.*?\s*[oO]perators/)
|
9
|
+
return Messages::Incoming::LuserOp(string, $1.to_i)
|
10
|
+
else
|
11
|
+
Logger.log('Failed to match RPL_LUSEROP message')
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module ModSpox
|
2
|
+
module Handlers
|
3
|
+
class LuserUnknown < Handler
|
4
|
+
def initialize(handlers)
|
5
|
+
handlers[RPL_LUSERUNKNOWN] = self
|
6
|
+
end
|
7
|
+
def process(string)
|
8
|
+
if(string =~ /(\d+) :.*[Uu]nknown/)
|
9
|
+
return Messages::Incoming::LuserUnknown(string, $1.to_i)
|
10
|
+
else
|
11
|
+
Logger.log('Failed to match RPL_LUSERUNKNOWN message')
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module ModSpox
|
2
|
+
module Handlers
|
3
|
+
class Mode < Handler
|
4
|
+
def initialize(handlers)
|
5
|
+
handlers[:MODE] = self
|
6
|
+
end
|
7
|
+
|
8
|
+
def process(string)
|
9
|
+
if(string =~ /^:([^!]+)!.+?MODE\s(\S+)\s(\S+)$/) # this is for modes applied to the channel
|
10
|
+
source = find_model($1)
|
11
|
+
channel = find_model($2)
|
12
|
+
full_mode = $3
|
13
|
+
action = full_mode[0].chr
|
14
|
+
full_mode.slice(0).each_char{|c|
|
15
|
+
Models::ChannelMode.find_or_create(:channel_id => channel.pk, :mode => c) if action == '+'
|
16
|
+
if(action == '-' && model = Models::ChannelMode.filter(:channel_id => channel.pk, :mode => c).first)
|
17
|
+
model.destroy!
|
18
|
+
end
|
19
|
+
}
|
20
|
+
return Messages::Incoming::Mode.new(string, full_mode, source, nil, channel)
|
21
|
+
elsif(string =~ /^:([^!]+)!.+MODE\s(\S+)\s(.+)$/) # this is for modes applied to nick
|
22
|
+
# implement later #
|
23
|
+
elsif(string =~ /^:([^!]+)!.+MODE\s(\S+)\s(\S+)\s(.+)$/)
|
24
|
+
source = find_model($1)
|
25
|
+
channel = find_model($2)
|
26
|
+
full_modes = $3
|
27
|
+
targets = $4
|
28
|
+
action = full_mode[0].chr
|
29
|
+
nicks = Array.new
|
30
|
+
full_mode.slice(0).length.times{|i|
|
31
|
+
nick = find_model(targets.scan(/\S+/)[i])
|
32
|
+
nicks << nick
|
33
|
+
mode = full_mode[i + 1].chr
|
34
|
+
Models::NickMode.find_or_create(:channel_id => channel.pk, :nick_id => nick.pk, :mode => mode) if action == '+'
|
35
|
+
if(action == '-' && model = Models::NickMode.filter(:channel_id => channel.pk, :nick_id => nick.pk, :mode => mode).first)
|
36
|
+
model.destroy!
|
37
|
+
end
|
38
|
+
}
|
39
|
+
nicks = nicks[0] if nicks.size == 1
|
40
|
+
return Messages::Incoming::Mode.new(string, full_mode, source, nicks, channel)
|
41
|
+
else
|
42
|
+
Logger.log('Failed to parse MODE message')
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module ModSpox
|
2
|
+
module Handlers
|
3
|
+
class Motd < Handler
|
4
|
+
def initialize(handlers)
|
5
|
+
handlers[RPL_MOTDSTART] = self
|
6
|
+
handlers[RPL_MOTD] = self
|
7
|
+
handlers[RPL_ENDOFMOTD] = self
|
8
|
+
@motds = Hash.new
|
9
|
+
@raw = Hash.new
|
10
|
+
end
|
11
|
+
def process(string)
|
12
|
+
if(string =~ /^:(\S+) #{RPL_MOTDSTART.to_s}.*?:-\s?(\S+)/)
|
13
|
+
@motds[$1] = Array.new
|
14
|
+
@raw[$1] = [string]
|
15
|
+
return
|
16
|
+
elsif(string =~ /^:(\S+) #{RPL_MOTD.to_s}.*?:-\s?(.+)$/)
|
17
|
+
@motds[$1] << $2
|
18
|
+
@raw[$1] << string
|
19
|
+
return
|
20
|
+
elsif(string =~ /^:(\S+) #{RPL_ENDOFMOTD.to_s}/)
|
21
|
+
@raw[$1] << string
|
22
|
+
message = Messages::Incoming::Motd.new(@raw[$1].join("\n"), @motds[$1].join("\n"), $1)
|
23
|
+
@motds.delete($1)
|
24
|
+
@raw.delete($1)
|
25
|
+
return message
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module ModSpox
|
2
|
+
module Handlers
|
3
|
+
class MyInfo < Handler
|
4
|
+
def initialize(handlers)
|
5
|
+
handlers[RPL_MYINFO] = self
|
6
|
+
end
|
7
|
+
|
8
|
+
def process(string)
|
9
|
+
if(string =~ /^:\S+ \S+ \S+ (\S+) (\S+) (\S+) (\S+)/)
|
10
|
+
servername = $1
|
11
|
+
version = $2
|
12
|
+
usermodes = $3
|
13
|
+
channelmodes = $4
|
14
|
+
return Messages::Incoming::MyInfo.new(string, servername, version, usermodes, channelmodes)
|
15
|
+
else
|
16
|
+
Logger.log('Failed to match My Info message')
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module ModSpox
|
2
|
+
module Handlers
|
3
|
+
class Names < Handler
|
4
|
+
def initialize(handlers)
|
5
|
+
handlers[RPL_NAMREPLY] = self
|
6
|
+
handlers[RPL_ENDOFNAMES] = self
|
7
|
+
@names = Hash.new
|
8
|
+
@raw = Hash.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def process(string)
|
12
|
+
if(string =~ /#{RPL_NAMREPLY}.*?(\S+) :(.+)$/)
|
13
|
+
chan = $1
|
14
|
+
nicks = $2
|
15
|
+
@names[chan] = Array.new unless @names[chan]
|
16
|
+
if(@raw[chan])
|
17
|
+
@raw[chan] << string
|
18
|
+
else
|
19
|
+
@raw[chan] = [string]
|
20
|
+
end
|
21
|
+
@names[chan] += nicks.split(' ')
|
22
|
+
return nil
|
23
|
+
elsif(string =~ /#{RPL_ENDOFNAMES}.*?(\S+) :/)
|
24
|
+
chan = $1
|
25
|
+
@raw[chan] << string
|
26
|
+
channel = find_model(chan)
|
27
|
+
nicks = Array.new
|
28
|
+
ops = Array.new
|
29
|
+
voice = Array.new
|
30
|
+
raw = @raw[chan].join(' ')
|
31
|
+
@names[chan].each{|n|
|
32
|
+
nick = Models::Nick.find_or_create(:nick => n.gsub(/^[@+]/, ''))
|
33
|
+
nicks << nick
|
34
|
+
if(n[0].chr == '@')
|
35
|
+
ops << nick
|
36
|
+
Models::NickMode.find_or_create(:nick_id => nick.pk, :channel_id => channel.pk, :mode => 'o')
|
37
|
+
elsif(n[0].chr == '+')
|
38
|
+
voice << nick
|
39
|
+
Models::NickMode.find_or_create(:nick_id => nick.pk, :channel_id => channel.pk, :mode => 'v')
|
40
|
+
else
|
41
|
+
Models::NickMode.filter(:nick_id => nick.pk, :channel_id => channel.pk).each{|m|
|
42
|
+
m.destroy
|
43
|
+
}
|
44
|
+
end
|
45
|
+
channel.nick_add(nick)
|
46
|
+
}
|
47
|
+
@names.delete(chan)
|
48
|
+
@raw.delete(chan)
|
49
|
+
return Messages::Incoming::Names.new(raw, channel, nicks, ops, voice)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module ModSpox
|
2
|
+
module Handlers
|
3
|
+
class Nick < Handler
|
4
|
+
def initialize(handlers)
|
5
|
+
handlers[:NICK] = self
|
6
|
+
end
|
7
|
+
def process(string)
|
8
|
+
if(string =~ /^:([^!]+)!\S+\sNICK\s:(.+)$/)
|
9
|
+
old_nick = find_model($1)
|
10
|
+
new_nick = find_model($2)
|
11
|
+
if(old_nick.botnick == true)
|
12
|
+
old_nick.botnick = false
|
13
|
+
old_nick.save
|
14
|
+
new_nick.botnick = true
|
15
|
+
new_nick.save
|
16
|
+
end
|
17
|
+
return Messages::Incoming::Nick.new(string, old_nick, new_nick)
|
18
|
+
else
|
19
|
+
Logger.log('Failed to parse NICK message')
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module ModSpox
|
2
|
+
module Handlers
|
3
|
+
class NickInUse < Handler
|
4
|
+
def initialize(handlers)
|
5
|
+
handlers[:RPL_NICKNAMEINUSE] = self
|
6
|
+
end
|
7
|
+
def process(string)
|
8
|
+
if(string =~ /#{RPL_NICKNAMEINUSE}\s\S+\s(\S+)\s:/)
|
9
|
+
return Messages::Incoming::NickInUse.new(string, $1)
|
10
|
+
else
|
11
|
+
Logger.log('Failed to parse RPL_NICKNAMEINUSE message')
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module ModSpox
|
2
|
+
module Handlers
|
3
|
+
class Notice < Handler
|
4
|
+
def initialize(handlers)
|
5
|
+
handlers[:NOTICE] = self
|
6
|
+
end
|
7
|
+
|
8
|
+
def process(string)
|
9
|
+
if(string =~ /:(\S+)\sNOTICE\s(\S+)\s:(.+)$/)
|
10
|
+
base_source = $1
|
11
|
+
target = $2
|
12
|
+
message = $3
|
13
|
+
if(base_source =~ /\!/)
|
14
|
+
source = find_model(base_source.gsub(/!.+$/, ''))
|
15
|
+
if(base_source =~ /!(.+)@(.+)$/)
|
16
|
+
source.username = $1
|
17
|
+
source.address = $2
|
18
|
+
source.source = base_source
|
19
|
+
source.save
|
20
|
+
end
|
21
|
+
target = find_model(target)
|
22
|
+
else
|
23
|
+
source = base_source
|
24
|
+
end
|
25
|
+
return Messages::Incoming::Notice.new(string, source, target, message)
|
26
|
+
else
|
27
|
+
Logger.log('Failed to match NOTICE message')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module ModSpox
|
2
|
+
module Handlers
|
3
|
+
class Part < Handler
|
4
|
+
def initialize(handlers)
|
5
|
+
handlers[:PART] = self
|
6
|
+
end
|
7
|
+
def process(string)
|
8
|
+
if(string =~ /^:(\S+) PART (\S+) :(.*)$/)
|
9
|
+
channel = find_model($2)
|
10
|
+
nick = find_model($1.gsub(/!.+$/, ''))
|
11
|
+
channel.nick_remove(nick)
|
12
|
+
return Messages::Incoming::Part.new(string, channel, nick, $3)
|
13
|
+
else
|
14
|
+
Logger.log('Failed to parse PART message')
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module ModSpox
|
2
|
+
module Handlers
|
3
|
+
class Ping < Handler
|
4
|
+
def initialize(handlers)
|
5
|
+
handlers[:PING] = self
|
6
|
+
end
|
7
|
+
def process(string)
|
8
|
+
if(string =~ /^PING\s:(.+)$/)
|
9
|
+
return Messages::Incoming::Ping.new(string, $1, nil)
|
10
|
+
else
|
11
|
+
Logger.log('Failed to match PING message')
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module ModSpox
|
2
|
+
module Handlers
|
3
|
+
class Pong < Handler
|
4
|
+
def initialize(handlers)
|
5
|
+
handlers[:PONG] = self
|
6
|
+
end
|
7
|
+
def process(string)
|
8
|
+
if(string =~ /^:\S+\sPONG\s(\S+)\s:(.+)$/)
|
9
|
+
return Messages::Incoming::Pong.new(string, $1, $2)
|
10
|
+
else
|
11
|
+
Logger.log('Failed to parse PONG message')
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module ModSpox
|
2
|
+
module Handlers
|
3
|
+
class Privmsg < Handler
|
4
|
+
def initialize(handlers)
|
5
|
+
handlers[:PRIVMSG] = self
|
6
|
+
end
|
7
|
+
|
8
|
+
def process(string)
|
9
|
+
if(string =~ /^:(\S+)\sPRIVMSG\s(\S+)\s:(.+)$/)
|
10
|
+
message = $3
|
11
|
+
target = find_model($2)
|
12
|
+
base_source = $1
|
13
|
+
source = find_model(base_source.gsub(/!.+$/, ''))
|
14
|
+
if(base_source =~ /!(.+)@(.+)$/)
|
15
|
+
source.username = $1
|
16
|
+
source.address = $2
|
17
|
+
source.source = base_source
|
18
|
+
source.save
|
19
|
+
end
|
20
|
+
return Messages::Incoming::Privmsg.new(string, source, target, message)
|
21
|
+
else
|
22
|
+
Logger.log('Failed to match PRIVMSG message')
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module ModSpox
|
2
|
+
module Handlers
|
3
|
+
class Quit < Handler
|
4
|
+
def initialize(handlers)
|
5
|
+
handlers[:QUIT] = self
|
6
|
+
end
|
7
|
+
def process(string)
|
8
|
+
if(string =~ /^:(\S+)\sQUIT\s:(.+)$/)
|
9
|
+
reason = $2
|
10
|
+
nick = find_model($1.gsub(/!.+$/, ''))
|
11
|
+
nick.clear_channels
|
12
|
+
nick.visible = false
|
13
|
+
nick.save
|
14
|
+
return Messages::Incoming::Quit.new(string, nick, reason)
|
15
|
+
else
|
16
|
+
Logger.log('Failed to parse KICK message')
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module ModSpox
|
2
|
+
module Handlers
|
3
|
+
class Topic < Handler
|
4
|
+
def initialize(handlers)
|
5
|
+
handlers[RPL_TOPIC] = self
|
6
|
+
handlers[RPL_NOTOPIC] = self
|
7
|
+
handlers[RPL_TOPICINFO] = self
|
8
|
+
@topics = Hash.new
|
9
|
+
end
|
10
|
+
def process(string)
|
11
|
+
if(string =~ /#{RPL_TOPIC}.+?(\S+)\s:(.+)$/)
|
12
|
+
channel = find_model($1)
|
13
|
+
return Messages::Incoming::Topic.new(string, channel, $2)
|
14
|
+
elsif(string =~ /#{RPL_NOTOPIC}.+?(\S+)\s:/)
|
15
|
+
channel = find_model($1)
|
16
|
+
return Messages::Incoming::Topic.new(string, channel, nil)
|
17
|
+
elsif(string =~ /#{RPL_TOPICINFO}\s\S+\s(\S+)\s(\S+)\s(.+)$/)
|
18
|
+
channel = find_model($1)
|
19
|
+
nick = find_model($1)
|
20
|
+
time = Time.at($3.to_i)
|
21
|
+
return Messages::Incoming::TopicInfo.new(string, channel, nick, time)
|
22
|
+
else
|
23
|
+
Logger.log('Failed to parse TOPIC type string')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module ModSpox
|
2
|
+
module Handlers
|
3
|
+
class Welcome < Handler
|
4
|
+
def initialize(handlers)
|
5
|
+
handlers[RPL_WELCOME] = self
|
6
|
+
end
|
7
|
+
|
8
|
+
def process(string)
|
9
|
+
if(string =~ /:(\S+)\s(\S+).+?(\S+)$/)
|
10
|
+
server = $1
|
11
|
+
message = $2
|
12
|
+
userstring = $3
|
13
|
+
if(userstring =~ /^(.+?)!(.+?)@(.+?)$/)
|
14
|
+
Models::Nick.filter(:botnick => true).each{|n| n.botnick = false; n.save}
|
15
|
+
nick = $1
|
16
|
+
username = $2
|
17
|
+
hostname = $3
|
18
|
+
nick = Models::Nick.find_or_create(:nick => nick)
|
19
|
+
nick.botnick = true
|
20
|
+
nick.username = username
|
21
|
+
nick.address = hostname
|
22
|
+
nick.source = userstring
|
23
|
+
nick.save
|
24
|
+
return Messages::Incoming::Welcome.new(string, server, message, nick, username, hostname)
|
25
|
+
else
|
26
|
+
Logger.log('Failed to match user string in welcome message')
|
27
|
+
end
|
28
|
+
else
|
29
|
+
Logger.log('Failed to match welcome message')
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module ModSpox
|
2
|
+
module Handlers
|
3
|
+
class Who < Handler
|
4
|
+
def initialize(handlers)
|
5
|
+
handlers[RPL_WHOREPLY] = self
|
6
|
+
handlers[RPL_ENDOFWHO] = self
|
7
|
+
@cache = Hash.new
|
8
|
+
@raw_cache = Hash.new
|
9
|
+
end
|
10
|
+
def process(string)
|
11
|
+
if(string =~ /#{RPL_WHOREPLY}\s\S+\s(\S+|\*|\*\s\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)\s:(\d)\s(.+)$/)
|
12
|
+
# Items matched are as follows:
|
13
|
+
# 1: location
|
14
|
+
# 2: username
|
15
|
+
# 3: host
|
16
|
+
# 4: server
|
17
|
+
# 5: nick
|
18
|
+
# 6: info
|
19
|
+
# 7: hops
|
20
|
+
# 8: realname
|
21
|
+
location = $1 unless location.include?('*')
|
22
|
+
location = $5 if location == '*'
|
23
|
+
location = $1.gsub(/\*\s/, '') if location.include?('* ')
|
24
|
+
info = $6
|
25
|
+
nick = find_model($5)
|
26
|
+
nick.username = $2
|
27
|
+
nick.address = $3
|
28
|
+
nick.real_name = $8
|
29
|
+
nick.connected_to = $4
|
30
|
+
nick.away = info =~ /G/ ? true : false
|
31
|
+
nick.save
|
32
|
+
@cache[location] = Array.new unless @cache[location]
|
33
|
+
@cache[location] << nick
|
34
|
+
@raw_cache[location] = Array.new unless @raw_cache[location]
|
35
|
+
@raw_cache[location] << string
|
36
|
+
if(location[0].chr !~ /[A-Za-z]/)
|
37
|
+
channel = find_model(location)
|
38
|
+
if(info.include?('+'))
|
39
|
+
Models::NickMode.find_or_create(:channel_id => channel.pk, :nick_id => nick.pk, :mode => 'v')
|
40
|
+
elsif(info.include?('@'))
|
41
|
+
Models::NickMode.find_or_create(:channel_id => channel.pk, :nick_id => nick.pk, :mode => 'o')
|
42
|
+
else
|
43
|
+
Models::NickMode.filter(:channel_id => channel.pk, :nick_id => nick.pk).each{|m| m.destroy}
|
44
|
+
end
|
45
|
+
end
|
46
|
+
elsif(string =~ /#{RPL_ENDWHO}\s\S+\s(\S+)\s/)
|
47
|
+
location = $1
|
48
|
+
loc = find_model(location)
|
49
|
+
@raw_cache[location] << string
|
50
|
+
message = Messages::Incoming::Who.new(@raw_cache.join("\n"), loc, @cache[location])
|
51
|
+
@raw_cache.delete(location)
|
52
|
+
@cache.delete(location)
|
53
|
+
return message
|
54
|
+
else
|
55
|
+
Logger.log('Failed to match RPL_WHO type message')
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|