diff options
Diffstat (limited to 'src/mod_irc/mod_irc.erl')
-rw-r--r-- | src/mod_irc/mod_irc.erl | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/src/mod_irc/mod_irc.erl b/src/mod_irc/mod_irc.erl new file mode 100644 index 00000000..12a540ab --- /dev/null +++ b/src/mod_irc/mod_irc.erl @@ -0,0 +1,93 @@ +%%%---------------------------------------------------------------------- +%%% File : mod_irc.erl +%%% Author : Alexey Shchepin <alexey@sevcom.net> +%%% Purpose : IRC transport +%%% Created : 15 Feb 2003 by Alexey Shchepin <alexey@sevcom.net> +%%% Id : $Id$ +%%%---------------------------------------------------------------------- + +-module(mod_irc). +-author('alexey@sevcom.net'). +-vsn('$Revision$ '). + +-behaviour(gen_mod). + +-export([start/1, init/1, stop/0]). + +-include("ejabberd.hrl"). + +-record(irc_connection, {userserver, pid}). + +start(Opts) -> + iconv:start(), + Host = gen_mod:get_opt(host, Opts, "irc." ++ ?MYNAME), + register(ejabberd_mod_irc, spawn(?MODULE, init, [Host])). + +init(Host) -> + catch ets:new(irc_connection, [named_table, + public, + {keypos, #irc_connection.userserver}]), + ejabberd_router:register_route(Host), + loop(Host). + +loop(Host) -> + receive + {route, From, To, Packet} -> + case catch do_route(Host, From, To, Packet) of + {'EXIT', Reason} -> + ?ERROR_MSG("~p", [Reason]); + _ -> + ok + end, + loop(Host); + stop -> + ejabberd_router:unregister_global_route(Host), + ok; + _ -> + loop(Host) + end. + + +do_route(Host, From, To, Packet) -> + {ChanServ, _, Resource} = To, + case ChanServ of + "" -> + % TODO + Err = jlib:make_error_reply(Packet, "406", "Not Acceptable"), + ejabberd_router:route(To, From, Err); + _ -> + case string:tokens(ChanServ, "%") of + [[_ | _] = Channel, [_ | _] = Server] -> + case ets:lookup(irc_connection, {From, Server}) of + [] -> + io:format("open new connection~n"), + {ok, Pid} = mod_irc_connection:start( + From, Host, Server), + ets:insert( + irc_connection, + #irc_connection{userserver = {From, Server}, + pid = Pid}), + mod_irc_connection:route( + Pid, Channel, Resource, Packet), + ok; + [R] -> + Pid = R#irc_connection.pid, + io:format("send to process ~p~n", + [Pid]), + mod_irc_connection:route( + Pid, Channel, Resource, Packet), + ok + end; + _ -> + Err = jlib:make_error_reply( + Packet, "406", "Not Acceptable"), + ejabberd_router:route(To, From, Err) + end + end. + + + + +stop() -> + ejabberd_mod_irc ! stop, + ok. |