net-yail 1.4.6 → 1.5.1
Sign up to get free protection for your applications and to get access to all the features.
- data/examples/logger/logger_bot.rb +20 -21
- data/examples/loudbot/bot_runner.rb +114 -0
- data/examples/loudbot/loudbot.rb +87 -0
- data/examples/loudbot/shuffle.rb +17 -0
- data/examples/simple/dumbbot.rb +9 -4
- data/lib/net/yail.rb +437 -383
- data/lib/net/yail/default_events.rb +5 -163
- data/lib/net/yail/event.rb +65 -50
- data/lib/net/yail/irc_bot.rb +7 -7
- data/lib/net/yail/legacy_events.rb +214 -0
- data/lib/net/yail/magic_events.rb +31 -27
- data/lib/net/yail/output_api.rb +82 -262
- data/lib/net/yail/report_events.rb +173 -0
- data/lib/net/yail/yail-version.rb +1 -1
- data/tests/mock_irc.rb +13 -3
- data/tests/tc_event.rb +28 -28
- data/tests/tc_yail.rb +93 -32
- metadata +21 -11
- data/YAIL-RDOC +0 -51
@@ -0,0 +1,173 @@
|
|
1
|
+
module Net
|
2
|
+
module IRCEvents
|
3
|
+
|
4
|
+
# This is the module for reporting a bunch of crap, included basically for legacy compatibility
|
5
|
+
# and bots that need to be easy to use / debug right off the bat
|
6
|
+
module Reports
|
7
|
+
# Set up reporting filters - allows users who want it to keep reporting in their app relatively
|
8
|
+
# easily while getting rid of it for everybody else
|
9
|
+
def setup_reporting(yail)
|
10
|
+
@yail = yail
|
11
|
+
|
12
|
+
incoming_reporting = [
|
13
|
+
:msg, :act, :notice, :ctcp, :ctcpreply, :mode, :join, :part, :kick,
|
14
|
+
:quit, :nick, :welcome, :bannedfromchan, :badchannelkey, :channelurl, :topic,
|
15
|
+
:topicinfo, :endofnames, :motd, :motdstart, :endofmotd, :invite
|
16
|
+
]
|
17
|
+
for event in incoming_reporting
|
18
|
+
yail.after_filter(:"incoming_#{event}", self.method(:"r_#{event}") )
|
19
|
+
end
|
20
|
+
|
21
|
+
outgoing_reporting = [
|
22
|
+
:msg, :act, :ctcp, :ctcpreply, :notice
|
23
|
+
]
|
24
|
+
for event in outgoing_reporting
|
25
|
+
yail.after_filter(:"outgoing_#{event}", self.method(:"r_out_#{event}") )
|
26
|
+
end
|
27
|
+
|
28
|
+
generic_out_report = [
|
29
|
+
:join, :mode, :part, :quit, :nick, :user, :pass, :oper, :topic, :names, :list, :invite, :kick
|
30
|
+
]
|
31
|
+
for event in generic_out_report
|
32
|
+
yail.after_filter(:"outgoing_#{event}", self.method(:r_out_generic))
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
def r_msg(event)
|
38
|
+
report "{%s} <%s> %s" % [event.target || event.channel, event.nick, event.message]
|
39
|
+
end
|
40
|
+
|
41
|
+
def r_act(event)
|
42
|
+
report "{%s} * %s %s" % [event.target || event.channel, event.nick, event.message]
|
43
|
+
end
|
44
|
+
|
45
|
+
def r_notice(event)
|
46
|
+
nick = event.server? ? '' : event.nick
|
47
|
+
report "{%s} -%s- %s" % [event.target || event.channel, nick, event.message]
|
48
|
+
end
|
49
|
+
|
50
|
+
def r_ctcp(event)
|
51
|
+
report "{%s} [%s %s]" % [event.target || event.channel, event.nick, event.message]
|
52
|
+
end
|
53
|
+
|
54
|
+
def r_ctcpreply(event)
|
55
|
+
report "{%s} [Reply: %s %s]" % [event.target || event.channel, event.nick, event.message]
|
56
|
+
end
|
57
|
+
|
58
|
+
def r_mode(event)
|
59
|
+
report "{%s} %s sets mode %s %s" % [event.channel, event.from, event.message, event.targets.join(' ')]
|
60
|
+
end
|
61
|
+
|
62
|
+
def r_join(event)
|
63
|
+
report "{#{event.channel}} #{event.nick} joins"
|
64
|
+
end
|
65
|
+
|
66
|
+
def r_part(event)
|
67
|
+
report "{#{event.channel}} #{event.nick} parts (#{event.message})"
|
68
|
+
end
|
69
|
+
|
70
|
+
def r_kick(event)
|
71
|
+
report "{#{event.channel}} #{event.nick} kicked #{event.target} (#{event.message})"
|
72
|
+
end
|
73
|
+
|
74
|
+
def r_quit(event)
|
75
|
+
report "#{event.nick} quit (#{event.message})"
|
76
|
+
end
|
77
|
+
|
78
|
+
# Incoming invitation
|
79
|
+
def r_invite(event)
|
80
|
+
report "[#{event.nick}] INVITE to #{event.target}"
|
81
|
+
end
|
82
|
+
|
83
|
+
# Reports nick change unless nickname is us - we check nickname here since
|
84
|
+
# the magic method changes @yail.me to the new nickname.
|
85
|
+
def r_nick(event)
|
86
|
+
report "#{event.nick} changed nick to #{event.message}" unless event.nick == @yail.me
|
87
|
+
end
|
88
|
+
|
89
|
+
def r_bannedfromchan(event)
|
90
|
+
event.message =~ /^(\S*) :Cannot join channel/
|
91
|
+
report "Banned from channel #{$1}"
|
92
|
+
end
|
93
|
+
|
94
|
+
def r_badchannelkey(event)
|
95
|
+
event.message =~ /^(\S*) :Cannot join channel/
|
96
|
+
report "Bad channel key (password) for #{$1}"
|
97
|
+
end
|
98
|
+
|
99
|
+
def r_welcome(event)
|
100
|
+
report "*** Logged in as #{@yail.me}. ***"
|
101
|
+
end
|
102
|
+
|
103
|
+
# Channel URL
|
104
|
+
def r_channelurl(event)
|
105
|
+
event.message =~ /^(\S+) :?(.+)$/
|
106
|
+
report "{#{$1}} URL is #{$2}"
|
107
|
+
end
|
108
|
+
|
109
|
+
# Channel topic
|
110
|
+
def r_topic(event)
|
111
|
+
event.message =~ /^(\S+) :?(.+)$/
|
112
|
+
report "{#{$1}} Topic is: #{$2}"
|
113
|
+
end
|
114
|
+
|
115
|
+
# Channel topic setter
|
116
|
+
def r_topicinfo(event)
|
117
|
+
event.message =~ /^(\S+) (\S+) (\d+)$/
|
118
|
+
report "{#{$1}} Topic set by #{$2} on #{Time.at($3.to_i).asctime}"
|
119
|
+
end
|
120
|
+
|
121
|
+
# End of names
|
122
|
+
def r_endofnames(event)
|
123
|
+
event.message =~ /^(\S+)/
|
124
|
+
report "{#{$1}} Nickname list complete"
|
125
|
+
end
|
126
|
+
|
127
|
+
# MOTD line
|
128
|
+
def r_motd(event)
|
129
|
+
event.message =~ /^:?(.+)$/
|
130
|
+
report "*MOTD* #{$1}"
|
131
|
+
end
|
132
|
+
|
133
|
+
# Beginning of MOTD
|
134
|
+
def r_motdstart(event)
|
135
|
+
event.message =~ /^:?(.+)$/
|
136
|
+
report "*MOTD* #{$1}"
|
137
|
+
end
|
138
|
+
|
139
|
+
# End of MOTD
|
140
|
+
def r_endofmotd(event)
|
141
|
+
report "*MOTD* End of MOTD"
|
142
|
+
end
|
143
|
+
|
144
|
+
# Sent a privmsg (non-ctcp)
|
145
|
+
def r_out_msg(event)
|
146
|
+
report "{#{event.target}} <#{@yail.me}> #{event.message}"
|
147
|
+
end
|
148
|
+
|
149
|
+
# Sent a ctcp
|
150
|
+
def r_out_ctcp(event)
|
151
|
+
report "{#{event.target}} [#{@yail.me} #{event.message}]"
|
152
|
+
end
|
153
|
+
|
154
|
+
# Sent ctcp action
|
155
|
+
def r_out_act(event)
|
156
|
+
report "{#{event.target}} <#{@yail.me}> #{event.message}"
|
157
|
+
end
|
158
|
+
|
159
|
+
def r_out_notice(event)
|
160
|
+
report "{#{event.target}} -#{@yail.me}- #{event.message}"
|
161
|
+
end
|
162
|
+
|
163
|
+
def r_out_ctcpreply(event)
|
164
|
+
report "{#{event.target}} [Reply: #{@yail.me} #{event.message}]"
|
165
|
+
end
|
166
|
+
|
167
|
+
def r_out_generic(event)
|
168
|
+
report "bot: #{event.inspect}"
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
end
|
173
|
+
end
|
data/tests/mock_irc.rb
CHANGED
@@ -71,13 +71,14 @@ class MockIRC
|
|
71
71
|
|
72
72
|
when /^NICK/ then handle_nick(cmd)
|
73
73
|
when /^JOIN/ then handle_join(cmd)
|
74
|
+
when /^MODE/ then handle_mode(cmd)
|
74
75
|
end
|
75
76
|
end
|
76
77
|
|
77
78
|
# Handles a connection command (USER) or errors
|
78
79
|
def handle_connected(cmd)
|
79
80
|
if cmd =~ /^USER (\S+) (\S+) (\S+) :(.*)$/
|
80
|
-
add_output "NOTICE AUTH :*** Looking up your hostname..."
|
81
|
+
add_output ":#{SERVER} NOTICE AUTH :*** Looking up your hostname..."
|
81
82
|
@connected = true
|
82
83
|
return
|
83
84
|
end
|
@@ -85,6 +86,14 @@ class MockIRC
|
|
85
86
|
add_output ":#{SERVER} ERROR :You need to authenticate or something"
|
86
87
|
end
|
87
88
|
|
89
|
+
# Dumb handling of a MODE command
|
90
|
+
def handle_mode(cmd)
|
91
|
+
# Eventually this could be used to make really interesting mode messages
|
92
|
+
cmd =~ /^MODE(\s+\S+)?(\s+\S+)?(\s+\S+)?$/
|
93
|
+
|
94
|
+
add_output ":#{@nick}!#{USERHOST} MODE#{$2}#{$3}"
|
95
|
+
end
|
96
|
+
|
88
97
|
# Handles a NICK request, but no error if no nick set - not sure what a real server does here
|
89
98
|
def handle_nick(cmd)
|
90
99
|
unless cmd =~ /^NICK :(.*)$/
|
@@ -102,7 +111,8 @@ class MockIRC
|
|
102
111
|
@nick = nick
|
103
112
|
|
104
113
|
unless @logged_in
|
105
|
-
add_output "
|
114
|
+
add_output "NOTICE AUTH :*** Looking up your hostname",
|
115
|
+
":#{SERVER} NOTICE #{@nick} :*** You are exempt from user limits. congrats.",
|
106
116
|
":#{SERVER} 001 #{@nick} :Welcome to the Fakey-fake Internet Relay Chat Network #{@nick}",
|
107
117
|
":#{SERVER} 002 #{@nick} :Your host is #{SERVER}[0.0.0.0/6667], running version mock-irc-1.7.7",
|
108
118
|
":#{SERVER} 003 #{@nick} :This server was created Nov 21 2009 at 21:20:48",
|
@@ -135,7 +145,7 @@ class MockIRC
|
|
135
145
|
channel = $1
|
136
146
|
pass = $2
|
137
147
|
if "#banned" == channel
|
138
|
-
add_output ":#{SERVER} 474
|
148
|
+
add_output ":#{SERVER} 474 #{@nick} #{channel}:Cannot join channel (+b)"
|
139
149
|
return
|
140
150
|
end
|
141
151
|
|
data/tests/tc_event.rb
CHANGED
@@ -7,7 +7,7 @@ class MessageParserEventTest < Test::Unit::TestCase
|
|
7
7
|
# Simplest test case, I think
|
8
8
|
def test_ping
|
9
9
|
event = Net::YAIL::IncomingEvent.parse("PING :nerdbucket.com")
|
10
|
-
assert_equal 'nerdbucket.com', event.
|
10
|
+
assert_equal 'nerdbucket.com', event.message
|
11
11
|
assert_equal :incoming_ping, event.type
|
12
12
|
assert !event.respond_to?(:servername)
|
13
13
|
assert !event.respond_to?(:nick)
|
@@ -20,7 +20,7 @@ class MessageParserEventTest < Test::Unit::TestCase
|
|
20
20
|
event = Net::YAIL::IncomingEvent.parse(":Dude!dude@nerdbucket.com TOPIC #nerdtalk :31 August 2010 \357\277\275 Foo.")
|
21
21
|
assert_equal :incoming_topic_change, event.type
|
22
22
|
assert_equal 'Dude', event.nick
|
23
|
-
assert_equal "31 August 2010 \357\277\275 Foo.", event.
|
23
|
+
assert_equal "31 August 2010 \357\277\275 Foo.", event.message
|
24
24
|
assert_equal '#nerdtalk', event.channel
|
25
25
|
assert_equal 'Dude!dude@nerdbucket.com', event.fullname
|
26
26
|
end
|
@@ -34,13 +34,13 @@ class MessageParserEventTest < Test::Unit::TestCase
|
|
34
34
|
assert_equal 'jeremy', event.msg.user
|
35
35
|
assert_equal 'nerdbucket.com', event.msg.host
|
36
36
|
assert_equal 'Nerdmaster!jeremy@nerdbucket.com', event.fullname
|
37
|
-
assert_equal 'Nerdmaster
|
37
|
+
assert_equal 'Nerdmaster', event.from
|
38
38
|
assert !event.server?
|
39
39
|
assert_equal 'PRIVMSG', event.msg.command
|
40
40
|
assert_equal :incoming_msg, event.type
|
41
41
|
assert_equal 'Nerdminion', event.target
|
42
42
|
assert_equal true, event.pm?
|
43
|
-
assert_equal 'Do my bidding!!', event.
|
43
|
+
assert_equal 'Do my bidding!!', event.message
|
44
44
|
|
45
45
|
# CTCP to user
|
46
46
|
event = Net::YAIL::IncomingEvent.parse(":Nerdmaster!jeremy@nerdbucket.com PRIVMSG Nerdminion :\001FOO is to bar as BAZ is to...?\001")
|
@@ -49,9 +49,9 @@ class MessageParserEventTest < Test::Unit::TestCase
|
|
49
49
|
assert_nil event.channel
|
50
50
|
assert_equal 'Nerdminion', event.target
|
51
51
|
assert_equal true, event.pm?
|
52
|
-
assert_equal 'FOO is to bar as BAZ is to...?', event.
|
52
|
+
assert_equal 'FOO is to bar as BAZ is to...?', event.message
|
53
53
|
assert_equal :incoming_msg, event.parent.type
|
54
|
-
assert_equal "\001FOO is to bar as BAZ is to...?\001", event.parent.
|
54
|
+
assert_equal "\001FOO is to bar as BAZ is to...?\001", event.parent.message
|
55
55
|
assert_nil event.parent.parent
|
56
56
|
|
57
57
|
# Action to channel
|
@@ -60,11 +60,11 @@ class MessageParserEventTest < Test::Unit::TestCase
|
|
60
60
|
assert_equal :incoming_act, event.type
|
61
61
|
assert_equal '#bottest', event.channel
|
62
62
|
assert_equal false, event.pm?
|
63
|
-
assert_equal 'gives Towelie a joint', event.
|
63
|
+
assert_equal 'gives Towelie a joint', event.message
|
64
64
|
assert_equal :incoming_ctcp, event.parent.type
|
65
|
-
assert_equal "ACTION gives Towelie a joint", event.parent.
|
65
|
+
assert_equal "ACTION gives Towelie a joint", event.parent.message
|
66
66
|
assert_equal :incoming_msg, event.parent.parent.type
|
67
|
-
assert_equal "\001ACTION gives Towelie a joint\001", event.parent.parent.
|
67
|
+
assert_equal "\001ACTION gives Towelie a joint\001", event.parent.parent.message
|
68
68
|
assert_nil event.parent.parent.parent
|
69
69
|
|
70
70
|
# PM to channel with less common prefix
|
@@ -77,8 +77,8 @@ class MessageParserEventTest < Test::Unit::TestCase
|
|
77
77
|
# Quick test of a numeric message I've ACTUALLY SEEN!!
|
78
78
|
def test_numeric
|
79
79
|
event = Net::YAIL::IncomingEvent.parse(':nerdbucket.com 266 Nerdmaster :Current global users: 22 Max: 33')
|
80
|
-
assert_equal 'Current global users: 22 Max: 33', event.
|
81
|
-
assert_equal :
|
80
|
+
assert_equal 'Current global users: 22 Max: 33', event.message
|
81
|
+
assert_equal :incoming_numeric_266, event.type
|
82
82
|
assert_equal 'nerdbucket.com', event.servername
|
83
83
|
assert_equal 'nerdbucket.com', event.from
|
84
84
|
assert_equal 'Nerdmaster', event.target
|
@@ -93,8 +93,8 @@ class MessageParserEventTest < Test::Unit::TestCase
|
|
93
93
|
|
94
94
|
# Numeric with multiple args
|
95
95
|
event = Net::YAIL::IncomingEvent.parse(':someserver.co.uk.fn.bb 366 Towelie #bottest :End of /NAMES list.')
|
96
|
-
assert_equal :
|
97
|
-
assert_equal '#bottest End of /NAMES list.', event.
|
96
|
+
assert_equal :incoming_numeric_366, event.type
|
97
|
+
assert_equal '#bottest End of /NAMES list.', event.message
|
98
98
|
assert_equal ['#bottest', 'End of /NAMES list.'], event.parameters
|
99
99
|
|
100
100
|
# First param in the message params list should still be nick
|
@@ -106,7 +106,7 @@ class MessageParserEventTest < Test::Unit::TestCase
|
|
106
106
|
"\0031,8TuTTi AnCoRa In PRoVa..\0034M\00307w\00308a\00303H\00311u\0031 \0031,9PrEpArAtE Le RiChIeStE PeR Il RiCoVeRo a ViTa\0030,13PoStI " +
|
107
107
|
"LiBeRi!!\0031,4!PaZZi Da STaRe InSiEmE. :\336")
|
108
108
|
assert_equal 'irc.somehost.xx', event.from
|
109
|
-
assert_equal :
|
109
|
+
assert_equal :incoming_numeric_322, event.type
|
110
110
|
assert_equal :incoming_numeric, event.parent.type
|
111
111
|
assert_equal 'user', event.target
|
112
112
|
assert_equal ['#CrAzY_MaNiCoMiCuM', '12'], event.parameters[0..1]
|
@@ -114,7 +114,7 @@ class MessageParserEventTest < Test::Unit::TestCase
|
|
114
114
|
assert_equal "#CrAzY_MaNiCoMiCuM 12 [+ntr] \253'\002\0033,3 \0030 I \0030,0 \0034T \0034,4 \0031A \0031,1\0038\273\0031,9 OrA NuOvO " +
|
115
115
|
"ErOtIcI Su FFTXL\0030,13 #CrAzY_MaNiCoMiCuM:\0032,4 QuI ReGnAnO PeR OrA I + PaZZi DeL WeB, \0031,8TuTTi AnCoRa In PRoVa..\0034M" +
|
116
116
|
"\00307w\00308a\00303H\00311u\0031 \0031,9PrEpArAtE Le RiChIeStE PeR Il RiCoVeRo a ViTa\0030,13PoStI LiBeRi!!\0031,4!PaZZi Da " +
|
117
|
-
"STaRe InSiEmE. :\336", event.
|
117
|
+
"STaRe InSiEmE. :\336", event.message
|
118
118
|
end
|
119
119
|
|
120
120
|
# Test an invite
|
@@ -137,7 +137,7 @@ class MessageParserEventTest < Test::Unit::TestCase
|
|
137
137
|
event = Net::YAIL::IncomingEvent.parse(':Nerdminion!minion@nerdbucket.com PART #nerd-talk :No, YOU GO TO HELL')
|
138
138
|
assert_equal '#nerd-talk', event.channel
|
139
139
|
assert_equal 'Nerdminion', event.nick
|
140
|
-
assert_equal 'No, YOU GO TO HELL', event.
|
140
|
+
assert_equal 'No, YOU GO TO HELL', event.message
|
141
141
|
assert_equal :incoming_part, event.type
|
142
142
|
end
|
143
143
|
|
@@ -147,14 +147,14 @@ class MessageParserEventTest < Test::Unit::TestCase
|
|
147
147
|
assert_equal 'Nerdminion', event.target
|
148
148
|
assert_equal 'Nerdmaster', event.nick
|
149
149
|
assert_equal :incoming_kick, event.type
|
150
|
-
assert_equal %q|You can't quit! You're FIRED!|, event.
|
150
|
+
assert_equal %q|You can't quit! You're FIRED!|, event.message
|
151
151
|
end
|
152
152
|
|
153
153
|
def test_quit
|
154
154
|
event = Net::YAIL::IncomingEvent.parse(':TheTowel!ce611d7b0@nerdbucket.com QUIT :Bye bye')
|
155
155
|
assert_equal 'TheTowel', event.nick
|
156
156
|
assert_equal :incoming_quit, event.type
|
157
|
-
assert_equal 'Bye bye', event.
|
157
|
+
assert_equal 'Bye bye', event.message
|
158
158
|
end
|
159
159
|
|
160
160
|
def test_nick
|
@@ -163,7 +163,7 @@ class MessageParserEventTest < Test::Unit::TestCase
|
|
163
163
|
event = Net::YAIL::IncomingEvent.parse(':[|\|1]!~nerdmaste@nerd.nerdbucket.com NICK :Deadnerd')
|
164
164
|
assert_equal '[|\|1]', event.nick
|
165
165
|
assert_equal :incoming_nick, event.type
|
166
|
-
assert_equal 'Deadnerd', event.
|
166
|
+
assert_equal 'Deadnerd', event.message
|
167
167
|
end
|
168
168
|
|
169
169
|
# Test some notice stuff
|
@@ -176,7 +176,7 @@ class MessageParserEventTest < Test::Unit::TestCase
|
|
176
176
|
assert_equal 'Nerdminion', event.target
|
177
177
|
assert !event.respond_to?(:nick)
|
178
178
|
assert !event.respond_to?(:fullname)
|
179
|
-
assert_equal 'You suck. A lot.', event.
|
179
|
+
assert_equal 'You suck. A lot.', event.message
|
180
180
|
|
181
181
|
# This CTCP message...
|
182
182
|
# ":Nerdmaster!jeremy@nerdbucket.com PRIVMSG Nerdminion \001USERINFO\001"
|
@@ -187,8 +187,8 @@ class MessageParserEventTest < Test::Unit::TestCase
|
|
187
187
|
assert_equal 'Nerdmaster', event.target
|
188
188
|
assert_equal 'Nerdminion', event.nick
|
189
189
|
assert_equal 'Nerdminion!minion@nerdbucket.com', event.fullname
|
190
|
-
assert_equal 'Nerdminion
|
191
|
-
assert_equal 'USERINFO :Minion of the nerd', event.
|
190
|
+
assert_equal 'Nerdminion', event.from
|
191
|
+
assert_equal 'USERINFO :Minion of the nerd', event.message
|
192
192
|
|
193
193
|
# Channel-wide notice
|
194
194
|
event = Net::YAIL::IncomingEvent.parse(":Nerdmaster!jeremy@nerdbucket.com NOTICE #channel-ten-news :Tonight's late-breaking story...")
|
@@ -198,7 +198,7 @@ class MessageParserEventTest < Test::Unit::TestCase
|
|
198
198
|
assert_equal '#channel-ten-news', event.channel
|
199
199
|
assert_nil event.target
|
200
200
|
assert_equal 'Nerdmaster!jeremy@nerdbucket.com', event.fullname
|
201
|
-
assert_equal %q|Tonight's late-breaking story...|, event.
|
201
|
+
assert_equal %q|Tonight's late-breaking story...|, event.message
|
202
202
|
end
|
203
203
|
|
204
204
|
def test_modes
|
@@ -208,7 +208,7 @@ class MessageParserEventTest < Test::Unit::TestCase
|
|
208
208
|
assert_equal :incoming_mode, event.type
|
209
209
|
assert_equal '#bots', event.channel
|
210
210
|
assert_equal ['Towelie', 'Doogles!*@*'], event.targets
|
211
|
-
assert_equal '+ob', event.
|
211
|
+
assert_equal '+ob', event.message
|
212
212
|
|
213
213
|
# Newly-created channels do this
|
214
214
|
event = Net::YAIL::IncomingEvent.parse(':nerdbucket.com MODE #bots +nt')
|
@@ -222,14 +222,14 @@ class MessageParserEventTest < Test::Unit::TestCase
|
|
222
222
|
assert_equal :incoming_mode, event.type
|
223
223
|
assert_equal '#bots', event.channel
|
224
224
|
assert_equal ['Doogles!*@*', 'Towelie', 'Nerdmaster'], event.targets
|
225
|
-
assert_equal '-bivv', event.
|
225
|
+
assert_equal '-bivv', event.message
|
226
226
|
|
227
227
|
event = Net::YAIL::IncomingEvent.parse(":Nerdmaster!jeremy@nerdbucket.com MODE #bots +m")
|
228
228
|
assert_equal 'Nerdmaster', event.nick
|
229
229
|
assert_equal :incoming_mode, event.type
|
230
230
|
assert_equal '#bots', event.channel
|
231
231
|
assert_equal [], event.targets
|
232
|
-
assert_equal '+m', event.
|
232
|
+
assert_equal '+m', event.message
|
233
233
|
|
234
234
|
# TODO: This is even worse than above - this is a pretty specific message (setting channel key
|
235
235
|
# to 'foo'), but has to be parsed in a pretty absurd way to get that info.
|
@@ -238,13 +238,13 @@ class MessageParserEventTest < Test::Unit::TestCase
|
|
238
238
|
assert_equal :incoming_mode, event.type
|
239
239
|
assert_equal '#bots', event.channel
|
240
240
|
assert_equal ['foo'], event.targets
|
241
|
-
assert_equal '+k', event.
|
241
|
+
assert_equal '+k', event.message
|
242
242
|
end
|
243
243
|
|
244
244
|
# Simple test of error event
|
245
245
|
def test_error
|
246
246
|
event = Net::YAIL::IncomingEvent.parse 'ERROR :Closing Link: nerdbucket.com (Quit: Terminated by user)'
|
247
247
|
assert_equal :incoming_error, event.type
|
248
|
-
assert_equal 'Closing Link: nerdbucket.com (Quit: Terminated by user)', event.
|
248
|
+
assert_equal 'Closing Link: nerdbucket.com (Quit: Terminated by user)', event.message
|
249
249
|
end
|
250
250
|
end
|
data/tests/tc_yail.rb
CHANGED
@@ -19,24 +19,25 @@ class YailSessionTest < Test::Unit::TestCase
|
|
19
19
|
# Sets up all our handlers the legacy way - allows testing that things work as they used to
|
20
20
|
def setup_legacy_handling
|
21
21
|
###
|
22
|
-
# Simple counters for basic testing of successful handler registration
|
22
|
+
# Simple counters for basic testing of successful handler registration - note that all handlers
|
23
|
+
# must add "; false" to the end to avoid stopping the built-in handlers
|
23
24
|
###
|
24
25
|
|
25
26
|
@msg = Hash.new(0)
|
26
|
-
@yail.prepend_handler(:incoming_welcome) { |
|
27
|
-
@yail.prepend_handler(:incoming_endofmotd) { |
|
28
|
-
@yail.prepend_handler(:incoming_notice) { |f, actor, target,
|
29
|
-
@yail.prepend_handler(:incoming_nick) { |f, actor, nick|
|
30
|
-
@yail.prepend_handler(:incoming_bannedfromchan) { |
|
31
|
-
@yail.prepend_handler(:incoming_join) { |f, actor, target|
|
32
|
-
@yail.prepend_handler(:incoming_mode) { |f, actor, target, modes, objects|
|
33
|
-
@yail.prepend_handler(:incoming_msg) { |f, actor, target,
|
34
|
-
@yail.prepend_handler(:incoming_act) { |f, actor, target,
|
35
|
-
@yail.prepend_handler(:incoming_ctcp) { |f, actor, target,
|
36
|
-
@yail.prepend_handler(:incoming_ping) { |
|
37
|
-
@yail.prepend_handler(:incoming_quit) { |f, actor,
|
38
|
-
@yail.prepend_handler(:outgoing_mode) { |target, modes, objects|
|
39
|
-
@yail.prepend_handler(:outgoing_join) { |channel, pass|
|
27
|
+
@yail.prepend_handler(:incoming_welcome) { |message, args| @msg[:welcome] += 1; false }
|
28
|
+
@yail.prepend_handler(:incoming_endofmotd) { |message, args| @msg[:endofmotd] += 1; false }
|
29
|
+
@yail.prepend_handler(:incoming_notice) { |f, actor, target, message| @msg[:notice] += 1; false }
|
30
|
+
@yail.prepend_handler(:incoming_nick) { |f, actor, nick| @msg[:nick] += 1; false }
|
31
|
+
@yail.prepend_handler(:incoming_bannedfromchan) { |message, args| @msg[:bannedfromchan] += 1; false }
|
32
|
+
@yail.prepend_handler(:incoming_join) { |f, actor, target| @msg[:join] += 1; false }
|
33
|
+
@yail.prepend_handler(:incoming_mode) { |f, actor, target, modes, objects| @msg[:mode] += 1; false }
|
34
|
+
@yail.prepend_handler(:incoming_msg) { |f, actor, target, message| @msg[:msg] += 1; false }
|
35
|
+
@yail.prepend_handler(:incoming_act) { |f, actor, target, message| @msg[:act] += 1; false }
|
36
|
+
@yail.prepend_handler(:incoming_ctcp) { |f, actor, target, message| @msg[:ctcp] += 1; false }
|
37
|
+
@yail.prepend_handler(:incoming_ping) { |message| @msg[:ping] += 1; false }
|
38
|
+
@yail.prepend_handler(:incoming_quit) { |f, actor, message| @msg[:quit] += 1; false }
|
39
|
+
@yail.prepend_handler(:outgoing_mode) { |target, modes, objects| @msg[:o_mode] += 1; false }
|
40
|
+
@yail.prepend_handler(:outgoing_join) { |channel, pass| @msg[:o_join] += 1; false }
|
40
41
|
|
41
42
|
###
|
42
43
|
# More complex handlers to test parsing of messages
|
@@ -50,16 +51,68 @@ class YailSessionTest < Test::Unit::TestCase
|
|
50
51
|
|
51
52
|
# Gotta store extra info on notices to test event parsing
|
52
53
|
@notices = []
|
53
|
-
@yail.prepend_handler(:incoming_notice) do |f, actor, target,
|
54
|
-
@notices.push({:
|
54
|
+
@yail.prepend_handler(:incoming_notice) do |f, actor, target, message|
|
55
|
+
@notices.push({:from => f, :nick => actor, :target => target, :message => message})
|
56
|
+
end
|
57
|
+
|
58
|
+
@yail.prepend_handler(:incoming_ping) { |message| @ping_message = message; false }
|
59
|
+
@yail.prepend_handler(:incoming_quit) { |f, actor, message| @quit = {:full => f, :nick => actor, :message => message}; false }
|
60
|
+
@yail.prepend_handler(:outgoing_join) { |channel, pass| @out_join = {:channel => channel, :password => pass}; false }
|
61
|
+
@yail.prepend_handler(:incoming_msg) { |f, actor, channel, message| @privmsg = {:channel => channel, :nick => actor, :message => message}; false }
|
62
|
+
@yail.prepend_handler(:incoming_ctcp) { |f, actor, channel, message| @ctcp = {:channel => channel, :nick => actor, :message => message}; false }
|
63
|
+
@yail.prepend_handler(:incoming_act) { |f, actor, channel, message| @act = {:channel => channel, :nick => actor, :message => message}; false }
|
64
|
+
end
|
65
|
+
|
66
|
+
# "New" handlers are set up (the 1.5+ way of doing things) here to perform tests in common with
|
67
|
+
# legacy. Note that because handlers are different, we have to use filtering for things like the
|
68
|
+
# welcome message, otherwise we don't let YAIL do its default stuff.
|
69
|
+
def setup_new_handlers
|
70
|
+
###
|
71
|
+
# Simple counters for basic testing of successful handler registration
|
72
|
+
###
|
73
|
+
|
74
|
+
@msg = Hash.new(0)
|
75
|
+
@yail.heard_welcome { @msg[:welcome] += 1 }
|
76
|
+
@yail.heard_endofmotd { @msg[:endofmotd] += 1 }
|
77
|
+
@yail.heard_notice { @msg[:notice] += 1 }
|
78
|
+
@yail.heard_nick { @msg[:nick] += 1 }
|
79
|
+
@yail.heard_bannedfromchan { @msg[:bannedfromchan] += 1 }
|
80
|
+
@yail.heard_join { @msg[:join] += 1 }
|
81
|
+
@yail.heard_mode { @msg[:mode] += 1 }
|
82
|
+
@yail.heard_msg { @msg[:msg] += 1 }
|
83
|
+
@yail.heard_act { @msg[:act] += 1 }
|
84
|
+
@yail.heard_ctcp { @msg[:ctcp] += 1 }
|
85
|
+
@yail.heard_ping { @msg[:ping] += 1 }
|
86
|
+
@yail.heard_quit { @msg[:quit] += 1 }
|
87
|
+
@yail.said_mode { @msg[:o_mode] += 1 }
|
88
|
+
@yail.said_join { @msg[:o_join] += 1 }
|
89
|
+
|
90
|
+
###
|
91
|
+
# More complex handlers to test parsing of messages
|
92
|
+
###
|
93
|
+
|
94
|
+
# Channels list helps us test joins
|
95
|
+
@channels = []
|
96
|
+
@yail.on_join do |event|
|
97
|
+
@channels.push(event.channel) if @yail.me == event.nick
|
98
|
+
end
|
99
|
+
|
100
|
+
# Gotta store extra info on notices to test event parsing
|
101
|
+
@notices = []
|
102
|
+
@yail.on_notice do |event|
|
103
|
+
# Notices are tricky - we have to check server? and pm? to mimic legacy handler info
|
104
|
+
notice = {:from => event.from, :message => event.message}
|
105
|
+
notice[:nick] = event.server? ? "" : event.nick
|
106
|
+
notice[:target] = event.pm? ? event.target : event.channel
|
107
|
+
@notices.push notice
|
55
108
|
end
|
56
109
|
|
57
|
-
@yail.
|
58
|
-
@yail.
|
59
|
-
@yail.
|
60
|
-
@yail.
|
61
|
-
@yail.
|
62
|
-
@yail.
|
110
|
+
@yail.heard_ping { |event| @ping_message = event.message }
|
111
|
+
@yail.on_quit { |event| @quit = {:full => event.fullname, :nick => event.nick, :message => event.message} }
|
112
|
+
@yail.saying_join { |event| @out_join = {:channel => event.channel, :password => event.password} }
|
113
|
+
@yail.on_msg { |event| @privmsg = {:channel => event.channel, :nick => event.nick, :message => event.message} }
|
114
|
+
@yail.on_ctcp { |event| @ctcp = {:channel => event.channel, :nick => event.nick, :message => event.message} }
|
115
|
+
@yail.on_act { |event| @act = {:channel => event.channel, :nick => event.nick, :message => event.message} }
|
63
116
|
end
|
64
117
|
|
65
118
|
# Waits until the mock IRC reports it has no more output - i.e., we've read everything available
|
@@ -82,6 +135,14 @@ class YailSessionTest < Test::Unit::TestCase
|
|
82
135
|
common_tests
|
83
136
|
end
|
84
137
|
|
138
|
+
# Exact same tests as above - just verifying functionality is the same as it was in legacy
|
139
|
+
def test_new
|
140
|
+
setup_new_handlers
|
141
|
+
wait_for_irc
|
142
|
+
|
143
|
+
common_tests
|
144
|
+
end
|
145
|
+
|
85
146
|
# Resets the messages hash, mocks the IRC server to send string to us, waits for the response, yields to the block
|
86
147
|
def mock_message(string)
|
87
148
|
@msg = Hash.new(0)
|
@@ -102,12 +163,12 @@ class YailSessionTest < Test::Unit::TestCase
|
|
102
163
|
assert_equal 3, @msg[:notice]
|
103
164
|
|
104
165
|
# Intense notice test - make sure all events were properly translated
|
105
|
-
assert_equal ['fakeirc.org', 'fakeirc.org'
|
166
|
+
assert_equal ['fakeirc.org', nil, 'fakeirc.org'], @notices.collect {|n| n[:from]}
|
106
167
|
assert_equal ['', '', ''], @notices.collect {|n| n[:nick]}
|
107
|
-
assert_equal ['AUTH', '
|
108
|
-
assert_match %r|looking up your host|i, @notices[
|
109
|
-
assert_match %r|
|
110
|
-
assert_match %r|
|
168
|
+
assert_equal ['AUTH', 'AUTH', 'Bot'], @notices.collect {|n| n[:target]}
|
169
|
+
assert_match %r|looking up your host|i, @notices.first[:message]
|
170
|
+
assert_match %r|looking up your host|i, @notices[1][:message]
|
171
|
+
assert_match %r|you are exempt|i, @notices.last[:message]
|
111
172
|
|
112
173
|
# Test magic methods that set up the bot
|
113
174
|
assert_equal "Bot", @yail.me, "Should have set @yail.me automatically on welcome handler"
|
@@ -141,7 +202,7 @@ class YailSessionTest < Test::Unit::TestCase
|
|
141
202
|
|
142
203
|
assert_equal "Nerdmaster", @privmsg[:nick]
|
143
204
|
assert_equal "#foosball", @privmsg[:channel]
|
144
|
-
assert_equal "#{@yail.me}: Welcome!", @privmsg[:
|
205
|
+
assert_equal "#{@yail.me}: Welcome!", @privmsg[:message]
|
145
206
|
end
|
146
207
|
|
147
208
|
# CTCP
|
@@ -152,7 +213,7 @@ class YailSessionTest < Test::Unit::TestCase
|
|
152
213
|
|
153
214
|
assert_equal "Nerdmaster", @ctcp[:nick]
|
154
215
|
assert_equal "#foosball", @ctcp[:channel]
|
155
|
-
assert_equal "CTCP THING", @ctcp[:
|
216
|
+
assert_equal "CTCP THING", @ctcp[:message]
|
156
217
|
end
|
157
218
|
|
158
219
|
# ACT
|
@@ -163,7 +224,7 @@ class YailSessionTest < Test::Unit::TestCase
|
|
163
224
|
|
164
225
|
assert_equal "Nerdmaster", @act[:nick]
|
165
226
|
assert_equal "#foosball", @act[:channel]
|
166
|
-
assert_equal "vomits on you", @act[:
|
227
|
+
assert_equal "vomits on you", @act[:message]
|
167
228
|
end
|
168
229
|
|
169
230
|
# PING
|
@@ -177,7 +238,7 @@ class YailSessionTest < Test::Unit::TestCase
|
|
177
238
|
assert_equal 1, @msg[:quit]
|
178
239
|
assert_equal 'Nerdmaster!nerd@nerdbucket.com', @quit[:full]
|
179
240
|
assert_equal 'Nerdmaster', @quit[:nick]
|
180
|
-
assert_equal 'Quit: Bye byes', @quit[:
|
241
|
+
assert_equal 'Quit: Bye byes', @quit[:message]
|
181
242
|
end
|
182
243
|
end
|
183
244
|
end
|