Skip to content
This repository
tag: v214
Fetching contributors…

Cannot retrieve contributors at this time

file 80 lines (71 sloc) 2.303 kb
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
% vim: syntax=erlang

%
% Copyright © 2011 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 "libirc/ircMessages.proto"

-type irc = {
    username:string;
    realname:string;
    nickname:string;
    password:string;
    server:string;
    channel:string;
    callback: Scheduler.connection_info -> 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)
        | _ -> 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()
        | Ping msg ->
            send (Pong msg);
            read_channels(irc)
        | _ -> read_channels(irc)

quit():
    send(Quit);
    -!-
Something went wrong with that request. Please try again.