net-yail 1.4.6 → 1.5.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/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
|