-
Notifications
You must be signed in to change notification settings - Fork 125
/
ircBotCore.proto
85 lines (76 loc) · 2.52 KB
/
ircBotCore.proto
1
2
3
4
5
6
7
8
9
10
11
12
13
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
% vim: syntax=erlang
%
% Copyright © 2011, 2012 MLstate
%
% This file is part of Opa.
%
% Opa is free software: you can redistribute it and/or modify it under the
% terms of the GNU Affero General Public License, version 3, as published by
% the Free Software Foundation.
%
% Opa is distributed in the hope that it will be useful, but WITHOUT ANY
% WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
% FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for
% more details.
%
% You should have received a copy of the GNU Affero General Public License
% along with Opa. If not, see <http://www.gnu.org/licenses/>.
%
-generate client
-protocol IRC
-debugvar PROTOCOL_DEBUG
-include "ocamllib/libirc/ircMessages.proto"
-type irc = {
username:string;
realname:string;
nickname:string;
password:string;
server:string;
channel:string;
callback: Scheduler.connection_info -> unit;
onreceive: Scheduler.connection_info -> string -> string -> string -> unit
}
-type payload = unit
-type rt_proto = {
rt_backtrace: bool;
rt_block_size: int;
rt_payload: payload;
rt_server_write_timeout: Time.t
}
-type runtime = {rt_proto: rt_proto}
+open_connection(irc:irc):
send (Pass irc.password);
send (Nick irc.nickname);
send (User (irc.username, "localhost", irc.server, irc.realname));
read_welcome_messages(irc)
read_welcome_messages(irc):
receive
| Sns (_, "376", _) -> join_channels(irc)
| Sns (_, "422", _) -> join_channels(irc)
| _ -> read_welcome_messages(irc)
join_channels(irc):
send(Join (irc.channel, ""));
read_channels(irc)
read_channels(irc):
receive
| Sns (_, "366", _) ->
% When we receive the end-of-the-NAMES command signal, we
% can call the callback and let the outer application do its
% own business with the connection.
{{ Scheduler.push sched (fun () -> irc.callback conn) }}
read_channels(irc)
| SrvPrivmsg (_, _, "!botquit") ->
% This might be subject to deletion in the near future since
% the outer application has no (clean) means of knowing
% whether the connection is still alive.
quit()
| SrvPrivmsg (header, dest, msg) ->
{{ Scheduler.push sched (fun () -> (irc.onreceive conn header dest msg)) }}
read_channels(irc)
| Ping msg ->
send (Pong msg);
read_channels(irc)
| _ -> read_channels(irc)
quit():
send(Quit);
-!-