mod_spox 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +31 -1
- data/LICENSE +674 -0
- data/README.rdoc +73 -0
- data/bin/mod_spox +28 -28
- data/data/mod_spox/extras/AOLSpeak.rb +2 -3
- data/data/mod_spox/extras/AutoKick.rb +10 -23
- data/data/mod_spox/extras/AutoMode.rb +12 -23
- data/data/mod_spox/extras/Bash.rb +55 -0
- data/data/mod_spox/extras/Bouncer.rb +85 -57
- data/data/mod_spox/extras/Bullshit.rb +1 -1
- data/data/mod_spox/extras/Bytes.rb +1 -2
- data/data/mod_spox/extras/Confess.rb +27 -29
- data/data/mod_spox/extras/DCC.rb +11 -20
- data/data/mod_spox/extras/DevWatch.rb +21 -23
- data/data/mod_spox/extras/DownForEveryoneOrJustMe.rb +47 -0
- data/data/mod_spox/extras/EightBall.rb +1 -1
- data/data/mod_spox/extras/FML.rb +35 -0
- data/data/mod_spox/extras/Headers.rb +31 -50
- data/data/mod_spox/extras/Karma.rb +81 -29
- data/data/mod_spox/extras/Logger.rb +2 -2
- data/data/mod_spox/extras/LolSpeak.rb +1 -2
- data/data/mod_spox/extras/PhpCli.rb +138 -8
- data/data/mod_spox/extras/PhpFuncLookup.rb +20 -23
- data/data/mod_spox/extras/Pinger.rb +1 -1
- data/data/mod_spox/extras/Quotes.rb +8 -10
- data/data/mod_spox/extras/RegexTracker.rb +2 -4
- data/data/mod_spox/extras/Roulette.rb +20 -27
- data/data/mod_spox/extras/RubyCli.rb +93 -0
- data/data/mod_spox/extras/Search.rb +17 -3
- data/data/mod_spox/extras/Seen.rb +150 -0
- data/data/mod_spox/extras/SlashdotHeadlineGenerator.rb +500 -0
- data/data/mod_spox/extras/Talk.rb +2 -4
- data/data/mod_spox/extras/Topten.rb +10 -12
- data/data/mod_spox/extras/TracTicket.rb +3 -5
- data/data/mod_spox/extras/Translate.rb +20 -22
- data/data/mod_spox/extras/Twitter.rb +118 -33
- data/data/mod_spox/extras/UrbanDictionary.rb +8 -17
- data/data/mod_spox/extras/Weather.rb +1 -2
- data/data/mod_spox/plugins/Authenticator.rb +93 -98
- data/data/mod_spox/plugins/Banner.rb +26 -56
- data/data/mod_spox/plugins/Helper.rb +5 -6
- data/data/mod_spox/plugins/Initializer.rb +4 -14
- data/data/mod_spox/plugins/Joiner.rb +1 -1
- data/data/mod_spox/plugins/Nicker.rb +13 -0
- data/data/mod_spox/plugins/Parter.rb +2 -2
- data/data/mod_spox/plugins/Permissions.rb +60 -0
- data/data/mod_spox/plugins/PluginLoader.rb +7 -12
- data/data/mod_spox/plugins/Ponger.rb +51 -0
- data/data/mod_spox/plugins/Quitter.rb +1 -2
- data/data/mod_spox/plugins/Servers.rb +57 -0
- data/data/mod_spox/plugins/Status.rb +3 -2
- data/data/mod_spox/plugins/Triggers.rb +9 -9
- data/lib/mod_spox/Bot.rb +109 -33
- data/lib/mod_spox/BotConfig.rb +2 -2
- data/lib/mod_spox/ConfigurationWizard.rb +12 -12
- data/lib/mod_spox/Database.rb +1 -4
- data/lib/mod_spox/Exceptions.rb +26 -0
- data/lib/mod_spox/Helpers.rb +29 -68
- data/lib/mod_spox/Loader.rb +23 -24
- data/lib/mod_spox/Logger.rb +19 -17
- data/lib/mod_spox/MessageFactory.rb +50 -24
- data/lib/mod_spox/Pipeline.rb +21 -7
- data/lib/mod_spox/Plugin.rb +27 -3
- data/lib/mod_spox/PluginManager.rb +28 -15
- data/lib/mod_spox/PriorityQueue.rb +69 -0
- data/lib/mod_spox/Socket.rb +93 -51
- data/lib/mod_spox/Sockets.rb +76 -63
- data/lib/mod_spox/Timer.rb +21 -141
- data/lib/mod_spox/Version.rb +14 -0
- data/lib/mod_spox/handlers/BadNick.rb +1 -1
- data/lib/mod_spox/handlers/Bounce.rb +5 -5
- data/lib/mod_spox/handlers/Created.rb +13 -5
- data/lib/mod_spox/handlers/Handler.rb +12 -3
- data/lib/mod_spox/handlers/Invite.rb +14 -8
- data/lib/mod_spox/handlers/Join.rb +24 -20
- data/lib/mod_spox/handlers/Kick.rb +22 -13
- data/lib/mod_spox/handlers/Mode.rb +42 -36
- data/lib/mod_spox/handlers/Motd.rb +4 -0
- data/lib/mod_spox/handlers/Names.rb +66 -39
- data/lib/mod_spox/handlers/Nick.rb +20 -14
- data/lib/mod_spox/handlers/Part.rb +25 -8
- data/lib/mod_spox/handlers/Ping.rb +11 -5
- data/lib/mod_spox/handlers/Pong.rb +9 -5
- data/lib/mod_spox/handlers/Privmsg.rb +25 -17
- data/lib/mod_spox/handlers/Quit.rb +13 -8
- data/lib/mod_spox/handlers/Topic.rb +4 -0
- data/lib/mod_spox/handlers/Welcome.rb +16 -24
- data/lib/mod_spox/handlers/Who.rb +64 -48
- data/lib/mod_spox/handlers/Whois.rb +92 -60
- data/lib/mod_spox/messages/incoming/Nick.rb +2 -2
- data/lib/mod_spox/messages/incoming/Privmsg.rb +1 -1
- data/lib/mod_spox/messages/incoming/Whois.rb +1 -0
- data/lib/mod_spox/messages/internal/EstablishConnection.rb +1 -1
- 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/UnqueueSocket.rb +8 -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 +16 -46
- data/lib/mod_spox/models/AuthMask.rb +13 -0
- data/lib/mod_spox/models/Channel.rb +46 -27
- data/lib/mod_spox/models/Config.rb +10 -19
- data/lib/mod_spox/models/Group.rb +20 -8
- data/lib/mod_spox/models/Models.rb +1 -1
- data/lib/mod_spox/models/Nick.rb +105 -113
- data/lib/mod_spox/models/NickMode.rb +23 -9
- data/lib/mod_spox/models/Server.rb +12 -1
- data/lib/mod_spox/models/Setting.rb +12 -16
- data/lib/mod_spox/models/Signature.rb +28 -8
- 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 +34 -0
- data/tests/models/tc_Channel.rb +52 -0
- data/tests/models/tc_Config.rb +19 -0
- data/tests/models/tc_Nick.rb +142 -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 +4 -0
- metadata +284 -212
- data/README +0 -36
- data/lib/mod_spox/Cache.rb +0 -57
- data/lib/mod_spox/Monitors.rb +0 -84
- data/lib/mod_spox/Pool.rb +0 -164
- data/lib/mod_spox/models/AuthGroup.rb +0 -16
- data/lib/mod_spox/models/ChannelMode.rb +0 -14
- data/lib/mod_spox/models/NickChannel.rb +0 -45
- data/lib/mod_spox/models/NickGroup.rb +0 -16
@@ -5,15 +5,32 @@ module ModSpox
|
|
5
5
|
def initialize(handlers)
|
6
6
|
handlers[:PART] = self
|
7
7
|
end
|
8
|
+
|
9
|
+
# :mod_spox!~mod_spox@host PART #m :
|
10
|
+
# :guy2net!~guy2net@92-239-14-145.cable.ubr15.haye.blueyonder.co.uk PART #php
|
11
|
+
|
8
12
|
def process(string)
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
string = string.dup
|
14
|
+
orig = string.dup
|
15
|
+
begin
|
16
|
+
string.slice!(0)
|
17
|
+
nick = find_model(string.slice!(0..string.index('!')-1))
|
18
|
+
2.times{ string.slice!(0..string.index(' ')) }
|
19
|
+
unless(string.index(' ').nil?)
|
20
|
+
channel = find_model(string.slice!(0..string.index(' ')-1))
|
21
|
+
string.slice!(0..string.index(':'))
|
22
|
+
else
|
23
|
+
channel = find_model(string)
|
24
|
+
string = ''
|
25
|
+
end
|
26
|
+
channel.remove_nick(nick)
|
27
|
+
nick.visible = false if nick.channels.empty?
|
28
|
+
nick.save_changes
|
29
|
+
channel.save_changes
|
30
|
+
return Messages::Incoming::Part.new(orig, channel, nick, string)
|
31
|
+
rescue Object => boom
|
32
|
+
Logger.error("Failed to parse PART message: #{orig}")
|
33
|
+
raise boom
|
17
34
|
end
|
18
35
|
end
|
19
36
|
end
|
@@ -6,11 +6,17 @@ module ModSpox
|
|
6
6
|
handlers[:PING] = self
|
7
7
|
end
|
8
8
|
def process(string)
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
orig = string.dup
|
10
|
+
string = string.dup
|
11
|
+
begin
|
12
|
+
string.slice!(0) if string[0] == ':'
|
13
|
+
server = string[0..string.index(' ')-1]
|
14
|
+
message = string[string.index(':')+1..string.size]
|
15
|
+
server = message.dup if server == 'PING'
|
16
|
+
return Messages::Incoming::Ping.new(orig, server, message)
|
17
|
+
rescue Object => boom
|
18
|
+
Logger.error("Failed to parse PING message: #{string}")
|
19
|
+
raise boom
|
14
20
|
end
|
15
21
|
end
|
16
22
|
end
|
@@ -6,11 +6,15 @@ module ModSpox
|
|
6
6
|
handlers[:PONG] = self
|
7
7
|
end
|
8
8
|
def process(string)
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
orig = string.dup
|
10
|
+
string = string.dup
|
11
|
+
begin
|
12
|
+
a = string.slice!(string.rindex(':')+1, string.size)
|
13
|
+
string.slice!(-2..string.size)
|
14
|
+
return Messages::Incoming::Pong.new(orig, string.slice(string.rindex(' ')+1..string.size), a)
|
15
|
+
rescue Object => boom
|
16
|
+
Logger.error("Failed to parse PONG message: #{orig}")
|
17
|
+
raise boom
|
14
18
|
end
|
15
19
|
end
|
16
20
|
end
|
@@ -5,24 +5,32 @@ module ModSpox
|
|
5
5
|
def initialize(handlers)
|
6
6
|
handlers[:PRIVMSG] = self
|
7
7
|
end
|
8
|
-
|
8
|
+
|
9
|
+
# :spox!~spox@host PRIVMSG #m :foobar
|
9
10
|
def process(string)
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
11
|
+
orig = string.dup
|
12
|
+
string = string.dup
|
13
|
+
begin
|
14
|
+
string.slice!(0)
|
15
|
+
base_source = string.slice!(0..string.index(' ')-1)
|
16
|
+
orig_source = base_source.dup
|
17
|
+
string.slice!(0..string.index(' ',3))
|
18
|
+
target = find_model(string.slice!(0..string.index(' ')-1))
|
19
|
+
string.slice!(0..string.index(':'))
|
20
|
+
string.strip!
|
21
|
+
source = find_model(base_source.slice!(0..base_source.index('!')-1))
|
22
|
+
base_source.slice!(0)
|
23
|
+
source.username = base_source.slice!(0..base_source.index('@')-1)
|
24
|
+
base_source.slice!(0)
|
25
|
+
source.address = base_source.strip
|
26
|
+
source.source = orig_source
|
27
|
+
source.save_changes
|
28
|
+
source.add_channel(target) if target.is_a?(Models::Channel)
|
29
|
+
return Messages::Incoming::Privmsg.new(orig, source, target, string)
|
30
|
+
rescue Object => boom
|
31
|
+
Logger.warn("Failed to parse PRIVMSG message: #{orig}")
|
32
|
+
Logger.warn("Reason for PRIVMSG failure: #{boom}")
|
33
|
+
raise boom
|
26
34
|
end
|
27
35
|
end
|
28
36
|
end
|
@@ -5,17 +5,22 @@ module ModSpox
|
|
5
5
|
def initialize(handlers)
|
6
6
|
handlers[:QUIT] = self
|
7
7
|
end
|
8
|
+
|
9
|
+
#:spox!~spox@host QUIT :Ping timeout
|
8
10
|
def process(string)
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
11
|
+
orig = string.dup
|
12
|
+
string = string.dup
|
13
|
+
begin
|
14
|
+
string.slice!(0)
|
15
|
+
nick = find_model(string.slice!(0..string.index('!')-1))
|
16
|
+
string.slice!(0..string.index(':'))
|
17
|
+
nick.remove_all_channels
|
13
18
|
nick.visible = false
|
14
19
|
nick.save
|
15
|
-
return Messages::Incoming::Quit.new(
|
16
|
-
|
17
|
-
Logger.
|
18
|
-
|
20
|
+
return Messages::Incoming::Quit.new(orig, nick, string)
|
21
|
+
rescue Object => boom
|
22
|
+
Logger.error("Failed to parse QUIT message: #{orig}")
|
23
|
+
raise boom
|
19
24
|
end
|
20
25
|
end
|
21
26
|
end
|
@@ -8,6 +8,10 @@ module ModSpox
|
|
8
8
|
handlers[RPL_TOPICINFO] = self
|
9
9
|
@topics = Hash.new
|
10
10
|
end
|
11
|
+
|
12
|
+
#:irc.host 332 spox #mod_spox : the topic is here
|
13
|
+
#:irc.host 333 spox #mod_spox spox 1232126516
|
14
|
+
|
11
15
|
def process(string)
|
12
16
|
if(string =~ /#{RPL_TOPIC}.+?(\S+)\s:(.+)$/)
|
13
17
|
channel = find_model($1)
|
@@ -5,31 +5,23 @@ module ModSpox
|
|
5
5
|
def initialize(handlers)
|
6
6
|
handlers[RPL_WELCOME] = self
|
7
7
|
end
|
8
|
-
|
8
|
+
# >> :holmes.freenode.net 001 spax :Welcome to the freenode IRC Network spax
|
9
9
|
def process(string)
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
return Messages::Incoming::Welcome.new(string, server, message, nick, username, hostname)
|
26
|
-
else
|
27
|
-
Logger.warn('Failed to match user string in welcome message')
|
28
|
-
return nil
|
29
|
-
end
|
30
|
-
else
|
31
|
-
Logger.warn('Failed to match welcome message')
|
32
|
-
return nil
|
10
|
+
parse = string.dup
|
11
|
+
begin
|
12
|
+
parse.slice!(0)
|
13
|
+
server = parse.slice!(0..parse.index(' ')-1)
|
14
|
+
2.times{parse.slice!(0..parse.index(' '))}
|
15
|
+
nick = parse.slice!(0..parse.index(' ')-1)
|
16
|
+
parse.slice!(0..parse.index(':'))
|
17
|
+
nick = Models::Nick.find_or_create(:nick => nick)
|
18
|
+
nick.botnick = true
|
19
|
+
nick.visible = true
|
20
|
+
nick.save
|
21
|
+
return Messages::Incoming::Welcome.new(string, server, parse, nick, nil, nil)
|
22
|
+
rescue Object => boom
|
23
|
+
Logger.warn("Failed to parse welcome message: #{string}")
|
24
|
+
raise boom
|
33
25
|
end
|
34
26
|
end
|
35
27
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
['mod_spox/handlers/Handler'
|
1
|
+
['mod_spox/handlers/Handler'].each{|f|require f}
|
2
2
|
|
3
3
|
module ModSpox
|
4
4
|
module Handlers
|
@@ -9,56 +9,72 @@ module ModSpox
|
|
9
9
|
@cache = Hash.new
|
10
10
|
@raw_cache = Hash.new
|
11
11
|
end
|
12
|
-
|
12
|
+
# :host 352 spox #mod_spox ~pizza_ 12.229.112.195 punch.va.us.dal.net pizza_ H@ :5 pizza_
|
13
13
|
def process(string)
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
14
|
+
string = string.dup
|
15
|
+
orig = string.dup
|
16
|
+
begin
|
17
|
+
until(string.slice(0..RPL_WHOREPLY.size-1) == RPL_WHOREPLY || string.slice(0..RPL_ENDOFWHO.size-1) == RPL_ENDOFWHO)
|
18
|
+
string.slice!(0..string.index(' '))
|
19
|
+
end
|
20
|
+
if(string.slice(0..RPL_WHOREPLY.size-1) == RPL_WHOREPLY)
|
21
|
+
2.times{string.slice!(0..string.index(' '))}
|
22
|
+
location = string.slice!(0..string.index(' ')-1)
|
23
|
+
string.slice!(0)
|
24
|
+
username = string.slice!(0..string.index(' ')-1)
|
25
|
+
string.slice!(0)
|
26
|
+
host = string.slice!(0..string.index(' ')-1)
|
27
|
+
string.slice!(0)
|
28
|
+
server = string.slice!(0..string.index(' ')-1)
|
29
|
+
string.slice!(0)
|
30
|
+
nick = find_model(string.slice!(0..string.index(' ')-1))
|
31
|
+
string.slice!(0)
|
32
|
+
info = string.slice!(0..string.index(' ')-1)
|
33
|
+
string.slice!(0..string.index(':'))
|
34
|
+
hops = string.slice!(0..string.index(' ')-1)
|
35
|
+
string.slice!(0)
|
36
|
+
realname = string
|
37
|
+
location = nil if location == '*'
|
38
|
+
nick.username = username
|
39
|
+
nick.address = location
|
40
|
+
nick.real_name = realname
|
41
|
+
nick.connected_to = server
|
42
|
+
nick.away = !info.index('G').nil?
|
43
|
+
nick.add_channel(find_model(location)) unless location.nil?
|
44
|
+
nick.save_changes
|
45
|
+
key = location.nil? ? nick.nick : location
|
46
|
+
@cache[key] = Array.new unless @cache[key]
|
47
|
+
@cache[key] << nick
|
48
|
+
@raw_cache[key] = Array.new unless @raw_cache[key]
|
49
|
+
@raw_cache[key] << orig
|
50
|
+
unless(location.nil?)
|
51
|
+
channel = find_model(location)
|
52
|
+
channel.add_nick(nick)
|
53
|
+
if(info.include?('+'))
|
54
|
+
m = Models::NickMode.find_or_create(:channel_id => channel.pk, :nick_id => nick.pk)
|
55
|
+
m.set_mode('v')
|
56
|
+
elsif(info.include?('@'))
|
57
|
+
m = Models::NickMode.find_or_create(:channel_id => channel.pk, :nick_id => nick.pk)
|
58
|
+
m.set_mode('o')
|
59
|
+
else
|
60
|
+
m = Models::NickMode.find_or_create(:channel_id => channel.pk, :nick_id => nick.pk)
|
61
|
+
m.clear_modes
|
62
|
+
end
|
48
63
|
end
|
64
|
+
return nil
|
65
|
+
else
|
66
|
+
2.times{string.slice!(0..string.index(' '))}
|
67
|
+
location = string.slice!(0..string.index(' ')-1)
|
68
|
+
loc = find_model(location)
|
69
|
+
@raw_cache[location] << orig
|
70
|
+
message = Messages::Incoming::Who.new(@raw_cache[location].join("\n"), loc, @cache[location])
|
71
|
+
@raw_cache.delete(location)
|
72
|
+
@cache.delete(location)
|
73
|
+
return message
|
49
74
|
end
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
loc = find_model(location)
|
54
|
-
@raw_cache[location] << string
|
55
|
-
message = Messages::Incoming::Who.new(@raw_cache[location].join("\n"), loc, @cache[location])
|
56
|
-
@raw_cache.delete(location)
|
57
|
-
@cache.delete(location)
|
58
|
-
return message
|
59
|
-
else
|
60
|
-
Logger.warn('Failed to match RPL_WHO type message')
|
61
|
-
return nil
|
75
|
+
rescue Object => boom
|
76
|
+
Logger.error("Failed to match WHO type message: #{orig}")
|
77
|
+
raise boom
|
62
78
|
end
|
63
79
|
end
|
64
80
|
|
@@ -15,70 +15,102 @@ module ModSpox
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def process(string)
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
18
|
+
orig = string.dup
|
19
|
+
string = string.dup
|
20
|
+
begin
|
21
|
+
until(string.slice(0..string.index(' ')-1) == RPL_WHOISUSER ||
|
22
|
+
string.slice(0..string.index(' ')-1) == RPL_WHOISSERVER ||
|
23
|
+
string.slice(0..string.index(' ')-1) == RPL_WHOISOPERATOR ||
|
24
|
+
string.slice(0..string.index(' ')-1) == RPL_WHOISIDLE ||
|
25
|
+
string.slice(0..string.index(' ')-1) == RPL_WHOISCHANNELS ||
|
26
|
+
string.slice(0..string.index(' ')-1) == RPL_WHOISIDENTIFIED ||
|
27
|
+
string.slice(0..string.index(' ')-1) == RPL_ENDOFWHOIS)
|
28
|
+
string.slice!(0..string.index(' '))
|
29
|
+
end
|
30
|
+
case string.slice!(0..string.index(' ')-1)
|
31
|
+
when RPL_WHOISUSER
|
32
|
+
string.slice!(0)
|
33
|
+
string.slice!(0..string.index(' '))
|
34
|
+
nick = find_model(string.slice!(0..string.index(' ')-1))
|
35
|
+
string.slice!(0)
|
36
|
+
nick.username = string.slice!(0..string.index(' ')-1)
|
37
|
+
string.slice!(0)
|
38
|
+
nick.address = string.slice!(0..string.index(' ')-1)
|
39
|
+
string.slice!(0..string.index(':'))
|
40
|
+
nick.real_name = string
|
41
|
+
nick.save_changes
|
42
|
+
@cache[nick.nick] = Messages::Incoming::Whois.new(nick)
|
43
|
+
@cache[nick.nick].raw_push(orig)
|
44
|
+
when RPL_WHOISCHANNELS
|
45
|
+
2.times{string.slice!(0..string.index(' '))}
|
46
|
+
nick = find_model(string.slice!(0..string.index(' ')-1))
|
47
|
+
@cache[nick.nick] = Messages::Incoming::Whois.new(nick) unless @cache[nick.nick]
|
48
|
+
string.slice!(0..string.index(':'))
|
49
|
+
string.split.each do |c|
|
50
|
+
channel = find_model(['@','+'].include?(c.slice(0)) ? c.slice(1..c.size) : c)
|
51
|
+
channel.add_nick(nick)
|
52
|
+
@cache[nick.nick].channels_push(channel)
|
53
|
+
if(c[0].chr == '@')
|
54
|
+
m = Models::NickMode.find_or_create(:nick_id => nick.pk, :channel_id => channel.pk)
|
55
|
+
m.set_mode('o')
|
56
|
+
elsif(c[0].chr == '+')
|
57
|
+
m = Models::NickMode.find_or_create(:nick_id => nick.pk, :channel_id => channel.pk)
|
58
|
+
m.set_mode('v')
|
59
|
+
else
|
60
|
+
m = Models::NickMode.find_or_create(:nick_id => nick.pk, :channel_id => channel.pk)
|
61
|
+
m.clear_modes
|
62
|
+
end
|
63
|
+
end
|
64
|
+
@cache[nick.nick].raw_push(orig)
|
65
|
+
when RPL_WHOISSERVER
|
66
|
+
2.times{string.slice!(0..string.index(' '))}
|
67
|
+
nick = find_model(string.slice!(0..string.index(' ')-1))
|
68
|
+
string.slice!(0)
|
69
|
+
@cache[nick.nick] = Messages::Incoming::Whois.new(nick) unless @cache[nick.nick]
|
70
|
+
nick.connected_to = string.slice!(0..string.index(' ')-1)
|
71
|
+
nick.save_changes
|
72
|
+
@cache[nick.nick].raw_push(orig)
|
73
|
+
when RPL_WHOISIDENTIFIED
|
74
|
+
2.times{string.slice!(0..string.index(' '))}
|
75
|
+
nick = find_model(string.slice!(0..string.index(' ')-1))
|
76
|
+
@cache[nick.nick] = Messages::Incoming::Whois.new(nick) unless @cache[nick.nick]
|
77
|
+
nick.auth.services_identified = true
|
78
|
+
@cache[nick.nick].raw_push(orig)
|
79
|
+
when RPL_WHOISIDLE
|
80
|
+
2.times{string.slice!(0..string.index(' '))}
|
81
|
+
nick = find_model(string.slice!(0..string.index(' ')-1))
|
82
|
+
string.slice!(0)
|
83
|
+
@cache[nick.nick] = Messages::Incoming::Whois.new(nick) unless @cache[nick.nick]
|
84
|
+
nick.seconds_idle = string.slice!(0..string.index(' ')-1).to_i
|
85
|
+
string.slice!(0)
|
86
|
+
nick.connected_at = Time.at(string.slice!(0..string.index(' ')-1).to_i)
|
87
|
+
nick.save_changes
|
88
|
+
@cache[nick.nick].raw_push(orig)
|
89
|
+
when RPL_WHOISOPERATOR
|
90
|
+
2.times{string.slice!(0..string.index(' '))}
|
91
|
+
nick = find_model(string.slice!(0..string.index(' ')-1))
|
92
|
+
string.slice!(0)
|
93
|
+
@cache[nick.nick] = Messages::Incoming::Whois.new(nick) unless @cache[nick.nick]
|
94
|
+
@cache[nick.nick].raw_push(orig)
|
95
|
+
when RPL_ENDOFWHOIS
|
96
|
+
2.times{string.slice!(0..string.index(' '))}
|
97
|
+
nick = find_model(string.slice!(0..string.index(' ')-1))
|
98
|
+
@cache[nick.nick] = Messages::Incoming::Whois.new(nick) unless @cache[nick.nick]
|
99
|
+
@cache[nick.nick].raw_push(orig)
|
100
|
+
message = @cache[nick.nick]
|
101
|
+
message.lock
|
102
|
+
@cache.delete(nick.nick)
|
103
|
+
return message
|
39
104
|
else
|
40
|
-
|
41
|
-
|
42
|
-
}
|
43
|
-
return nil
|
44
|
-
elsif(string =~ /#{RPL_WHOISSERVER}\s\S+\s(\S+)\s(\S+)\s:(.+)$/)
|
45
|
-
nick = $1
|
46
|
-
@cache[nick] = Messages::Incoming::Whois.new(find_model(nick)) unless @cache[nick]
|
47
|
-
@cache[nick].nick.connected_to = $2
|
48
|
-
@cache[nick].raw_push(string)
|
49
|
-
return nil
|
50
|
-
elsif(string =~ /#{RPL_WHOISIDENTIFIED}\s\S+\s(\S+)\s/)
|
51
|
-
nick = $1
|
52
|
-
@cache[nick] = Messages::Incoming::Whois.new(find_model(nick)) unless @cache[nick]
|
53
|
-
@cache[nick].nick.auth.services_identified = true
|
54
|
-
@cache[nick].raw_push(string)
|
55
|
-
return nil
|
56
|
-
elsif(string =~ /#{RPL_WHOISIDLE}\s\S+\s(\S+)\s(\d+)\s(\d+)\s:(.+?),(.+?)/)
|
57
|
-
nick = $1
|
58
|
-
@cache[nick] = Messages::Incoming::Whois.new(find_model(nick)) unless @cache[nick]
|
59
|
-
@cache[nick].nick.seconds_idle = $2.to_i
|
60
|
-
@cache[nick].nick.connected_at = Time.at($3.to_i)
|
61
|
-
@cache[nick].raw_push(string)
|
62
|
-
return nil
|
63
|
-
elsif(string =~ /#{RPL_WHOISOPERATOR}\s\S+\s(\S+)/)
|
64
|
-
nick = $1
|
65
|
-
@cache[nick] = Messages::Incoming::Whois.new(find_model(nick)) unless @cache[nick]
|
66
|
-
@cache[nick].raw_push(string)
|
67
|
-
return nil
|
68
|
-
elsif(string =~ /#{RPL_ENDOFWHOIS}\s\S+\s(\S+)\s:/)
|
69
|
-
nick = $1
|
70
|
-
@cache[nick] = Messages::Incoming::Whois.new(find_model(nick)) unless @cache[nick]
|
71
|
-
@cache[nick].raw_push(string)
|
72
|
-
message = @cache[nick]
|
73
|
-
message.lock
|
74
|
-
@cache[nick].nick.save
|
75
|
-
@cache.delete(nick)
|
76
|
-
return message
|
77
|
-
else
|
78
|
-
Logger.warn('Failed to parse WHOIS type reply')
|
105
|
+
Logger.error("Failed to parse WHOIS type reply. Unknown part found: #{orig}")
|
106
|
+
end
|
79
107
|
return nil
|
108
|
+
rescue Object => boom
|
109
|
+
Logger.error("Failed to parse WHOIS type reply: #{orig}")
|
110
|
+
raise boom
|
80
111
|
end
|
81
112
|
end
|
113
|
+
|
82
114
|
end
|
83
115
|
end
|
84
116
|
end
|