3
-include_lib("eunit/include/eunit.hrl").
4
-export([match_channels/2, answer/2, answer/3]).
7
match_channels(_Message, any) ->
9
match_channels(_Message, [any|_]) ->
11
match_channels(#message{for_mup=true, target=Target,
12
server=#server{name=ServerName}},
13
[{ServerName, Target}|_ChannelsSpec]) ->
15
match_channels(#message{for_mup=true, mup_nick=MupNick, target=MupNick},
16
[private|_ChannelsSpec])
17
when MupNick =/= undefined ->
19
match_channels(#message{for_mup=true, mup_nick=MupNick, target=MupNick,
20
server=#server{name=ServerName}},
21
[{ServerName, private}|_ChannelsSpec])
22
when MupNick =/= undefined ->
24
match_channels(#message{for_mup=true, server=#server{name=ServerName}},
25
[{ServerName, any}|_ChannelsSpec]) ->
27
match_channels(Message, [{ServerName, [Item|Items]}|ChannelsSpec]) ->
28
match_channels(Message, [{ServerName, Item}])
30
match_channels(Message, [{ServerName, Items}|ChannelsSpec]);
31
match_channels(Message, [_ChannelSpec|ChannelsSpec]) ->
32
match_channels(Message, ChannelsSpec);
33
match_channels(_Message, _ChannelsSpec) ->
37
match_channels_test_() ->
39
match_channels(#message{}, any)),
41
match_channels(#message{}, [one, any, two])),
43
match_channels(#message{server=#server{name=freenode},
44
for_mup=false, target="#channel"},
45
[{freenode, "#channel"}])),
47
match_channels(#message{server=#server{name=freenode},
48
for_mup=true, target="#channel"},
49
[{otherserver, "#channel"}])),
51
match_channels(#message{server=#server{name=freenode},
52
for_mup=true, target="#channel"},
53
[{freenode, "#otherchannel"}])),
55
match_channels(#message{server=#server{name=freenode},
56
for_mup=true, target="#channel"},
57
[{freenode, "#channel"}])),
59
match_channels(#message{server=#server{name=freenode},
60
for_mup=true, target="#channel"},
61
[{foo, "#bar"}, {freenode, "#channel"}])),
63
match_channels(#message{server=#server{name=freenode},
64
for_mup=false, target="#channel"},
65
[{foo, "#bar"}, {freenode, any}])),
67
match_channels(#message{server=#server{name=freenode},
68
for_mup=true, target="#channel"},
69
[{foo, "#bar"}, {otherserver, any}])),
71
match_channels(#message{server=#server{name=freenode},
72
for_mup=true, target="#channel"},
73
[{foo, "#bar"}, {freenode, any}])),
75
match_channels(#message{server=#server{name=freenode},
76
for_mup=true, target="mupnick",
77
mup_nick="differentnick"},
78
[{foo, "#bar"}, private])),
80
match_channels(#message{server=#server{name=freenode},
82
[{foo, "#bar"}, private])),
84
match_channels(#message{server=#server{name=freenode},
85
for_mup=false, target="mupnick",
87
[{foo, "#bar"}, private])),
89
match_channels(#message{server=#server{name=freenode},
90
for_mup=true, target="mupnick",
92
[{foo, "#bar"}, private])),
94
match_channels(#message{server=#server{name=freenode},
95
for_mup=true, target="mupnick",
97
[{foo, "#bar"}, {diffserver, private}])),
99
match_channels(#message{server=#server{name=freenode},
101
[{foo, "#bar"}, {freenode, private}])),
103
match_channels(#message{server=#server{name=freenode},
104
for_mup=false, target="mupnick",
106
[{foo, "#bar"}, {freenode, private}])),
108
match_channels(#message{server=#server{name=freenode},
109
for_mup=true, target="mupnick",
111
[{foo, "#bar"}, {freenode, private}])),
113
match_channels(#message{server=#server{name=freenode},
114
for_mup=true, target="mupnick",
116
[foo, {freenode, [bar, "#otherchannel"]}])),
118
match_channels(#message{server=#server{name=freenode},
119
for_mup=true, target="mupnick",
121
[foo, {freenode, [bar, private]}])),
123
match_channels(#message{server=#server{name=freenode},
124
for_mup=true, target="#channel"},
125
[foo, {freenode, [bar, "#otherchannel"]}])),
127
match_channels(#message{server=#server{name=freenode},
128
for_mup=true, target="#channel"},
129
[foo, {freenode, [bar, "#channel"]}])),
131
match_channels(#message{server=#server{name=freenode},
132
for_mup=true, target="#channel"},
133
[{foo, [bar]}, {freenode, "#otherchannel"}])),
135
match_channels(#message{server=#server{name=freenode},
136
for_mup=true, target="#channel"},
137
[{foo, [bar]}, {freenode, "#channel"}]))
141
answer(Message, Text) ->
142
answer(Message, Text, []).
144
answer(Message, Text, Options) ->
145
{ok, Pid} = mup_server_sup:find_server(Message#message.server),
146
Notice = mup_util:option(notice, Options, false),
147
Action = mup_util:option(action, Options, false),
148
Indirect = mup_util:option(indirect, Options, false),
149
Private = Message#message.target == Message#message.mup_nick,
157
Private and Action ->
158
Data = io_lib:fwrite("PRIVMSG ~s :~cACTION ~s~c",
159
[Message#message.nick, 1, Text, 1]);
161
Data = io_lib:fwrite("~s ~s :~s",
162
[Command, Message#message.nick, Text]);
164
Data = io_lib:fwrite("PRIVMSG ~s :~cACTION ~s~c",
165
[Message#message.target, 1, Text, 1]);
166
Indirect or Notice ->
167
Data = io_lib:fwrite("~s ~s :~s",
168
[Command, Message#message.target, Text]);
170
Data = io_lib:fwrite("PRIVMSG ~s :~s: ~s",
171
[Message#message.target,
172
Message#message.nick, Text])
174
mup_server:send(Pid, lists:flatten(Data)).
177
mup_server_test_() ->
180
{ok, ConfigPid} = mup_config:start_link(),
181
{ok, ServerSupPid} = mup_server_sup:start_link(),
182
{ok, PluginSupPid} = mup_plugin_sup:start_link(),
183
{ConfigPid, ServerSupPid, PluginSupPid}
185
fun ({ConfigPid, ServerSupPid, PluginSupPid}) ->
186
mup_util:sync_stop(ConfigPid),
187
mup_util:sync_stop(ServerSupPid),
188
mup_util:sync_stop(PluginSupPid)
190
[fun answer_on_channel_subtest/0,
191
fun answer_on_channel_indirectly_subtest/0,
192
fun answer_on_channel_with_notice_subtest/0,
193
fun answer_on_channel_with_action_subtest/0,
194
fun answer_privately_subtest/0,
195
fun answer_privately_indirectly_subtest/0,
196
fun answer_privately_with_notice_subtest/0,
197
fun answer_privately_with_action_subtest/0]}.
199
answer_on_channel_subtest() ->
200
Server = #server{name=example,
201
options=[{host, "irc.example.com"},
203
{network_module, mock_tcp}]},
204
mup_config:add_term(Server),
205
{ok, _Pid} = mup_server_sup:start_server(example),
206
mup_server:mock_until_connected(),
207
mup_message:answer(#message{server=Server, nick="bob", target="#channel"},
209
?assertEqual({mock_tcp, send, the_socket, "PRIVMSG #channel :bob: Hi!\r\n"},
213
answer_on_channel_indirectly_subtest() ->
214
Server = #server{name=example,
215
options=[{host, "irc.example.com"},
217
{network_module, mock_tcp}]},
218
mup_config:add_term(Server),
219
{ok, _Pid} = mup_server_sup:start_server(example),
220
mup_server:mock_until_connected(),
221
mup_message:answer(#message{server=Server, nick="bob", target="#channel"},
223
?assertEqual({mock_tcp, send, the_socket, "PRIVMSG #channel :Hi!\r\n"},
227
answer_on_channel_with_notice_subtest() ->
228
Server = #server{name=example,
229
options=[{host, "irc.example.com"},
231
{network_module, mock_tcp}]},
232
mup_config:add_term(Server),
233
{ok, _Pid} = mup_server_sup:start_server(example),
234
mup_server:mock_until_connected(),
235
mup_message:answer(#message{server=Server, nick="bob", target="#channel"},
237
?assertEqual({mock_tcp, send, the_socket, "NOTICE #channel :Hi!\r\n"},
241
answer_on_channel_with_action_subtest() ->
242
Server = #server{name=example,
243
options=[{host, "irc.example.com"},
245
{network_module, mock_tcp}]},
246
mup_config:add_term(Server),
247
{ok, _Pid} = mup_server_sup:start_server(example),
248
mup_server:mock_until_connected(),
249
mup_message:answer(#message{server=Server, nick="bob", target="#channel"},
251
?assertEqual({mock_tcp, send, the_socket,
252
lists:flatten(["PRIVMSG #channel :", 1, "ACTION Hi!", 1,
257
answer_privately_subtest() ->
258
Server = #server{name=example,
259
options=[{host, "irc.example.com"},
261
{network_module, mock_tcp}]},
262
mup_config:add_term(Server),
263
{ok, _Pid} = mup_server_sup:start_server(example),
264
mup_server:mock_until_connected(),
265
mup_message:answer(#message{server=Server, nick="bob", target="mup",
268
?assertEqual({mock_tcp, send, the_socket, "PRIVMSG bob :Hi!\r\n"},
272
answer_privately_indirectly_subtest() ->
273
Server = #server{name=example,
274
options=[{host, "irc.example.com"},
276
{network_module, mock_tcp}]},
277
mup_config:add_term(Server),
278
{ok, _Pid} = mup_server_sup:start_server(example),
279
mup_server:mock_until_connected(),
280
mup_message:answer(#message{server=Server, nick="bob", target="mup",
283
?assertEqual({mock_tcp, send, the_socket, "PRIVMSG bob :Hi!\r\n"},
287
answer_privately_with_notice_subtest() ->
288
Server = #server{name=example,
289
options=[{host, "irc.example.com"},
291
{network_module, mock_tcp}]},
292
mup_config:add_term(Server),
293
{ok, _Pid} = mup_server_sup:start_server(example),
294
mup_server:mock_until_connected(),
295
mup_message:answer(#message{server=Server, nick="bob", target="mup",
298
?assertEqual({mock_tcp, send, the_socket, "NOTICE bob :Hi!\r\n"},
302
answer_privately_with_action_subtest() ->
303
Server = #server{name=example,
304
options=[{host, "irc.example.com"},
306
{network_module, mock_tcp}]},
307
mup_config:add_term(Server),
308
{ok, _Pid} = mup_server_sup:start_server(example),
309
mup_server:mock_until_connected(),
310
mup_message:answer(#message{server=Server, nick="bob", target="mup",
313
?assertEqual({mock_tcp, send, the_socket,
314
lists:flatten(["PRIVMSG bob :", 1, "ACTION Hi!", 1, "\r\n"])},