summaryrefslogtreecommitdiff
path: root/src/mod_irc/mod_irc.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/mod_irc/mod_irc.erl')
-rw-r--r--src/mod_irc/mod_irc.erl93
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.