-export([start_link/2,
start/2,
stop/1,
- closed_connection/3,
- get_user_and_encoding/3]).
+ closed_connection/3]).
%% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
-include("ejabberd.hrl").
-include("jlib.hrl").
--define(DEFAULT_IRC_ENCODING, "koi8-r").
-
-record(irc_connection, {jid_server_host, pid}).
-record(irc_custom, {us_host, data}).
--record(state, {host, server_host, access}).
+-record(state, {host, server_host, default_encoding, access}).
-define(PROCNAME, ejabberd_mod_irc).
MyHost = gen_mod:get_opt(host, Opts, "irc." ++ Host),
update_table(MyHost),
Access = gen_mod:get_opt(access, Opts, all),
+ DefaultEncoding = gen_mod:get_opt(default_encoding, Opts, "koi8-r"),
catch ets:new(irc_connection, [named_table,
public,
{keypos, #irc_connection.jid_server_host}]),
ejabberd_router:register_route(MyHost),
{ok, #state{host = MyHost,
server_host = Host,
+ default_encoding = DefaultEncoding,
access = Access}}.
%%--------------------------------------------------------------------
handle_info({route, From, To, Packet},
#state{host = Host,
server_host = ServerHost,
+ default_encoding = DefEnc,
access = Access} = State) ->
- case catch do_route(Host, ServerHost, Access, From, To, Packet) of
+ case catch do_route(Host, ServerHost, Access, From, To, Packet, DefEnc) of
{'EXIT', Reason} ->
?ERROR_MSG("~p", [Reason]);
_ ->
supervisor:terminate_child(ejabberd_sup, Proc),
supervisor:delete_child(ejabberd_sup, Proc).
-do_route(Host, ServerHost, Access, From, To, Packet) ->
+do_route(Host, ServerHost, Access, From, To, Packet, DefEnc) ->
case acl:match_rule(Host, Access, From) of
allow ->
- do_route1(Host, ServerHost, From, To, Packet);
+ do_route1(Host, ServerHost, From, To, Packet, DefEnc);
_ ->
{xmlelement, _Name, Attrs, _Els} = Packet,
Lang = xml:get_attr_s("xml:lang", Attrs),
ejabberd_router:route(To, From, Err)
end.
-do_route1(Host, ServerHost, From, To, Packet) ->
+do_route1(Host, ServerHost, From, To, Packet, DefEnc) ->
#jid{user = ChanServ, resource = Resource} = To,
{xmlelement, _Name, Attrs, _Els} = Packet,
case ChanServ of
From,
jlib:iq_to_xml(Res));
#iq{xmlns = ?NS_REGISTER} = IQ ->
- process_register(Host, From, To, IQ);
+ process_register(Host, From, To, DefEnc, IQ);
#iq{type = get, xmlns = ?NS_VCARD = XMLNS,
lang = Lang} = IQ ->
Res = IQ#iq{type = result,
[] ->
io:format("open new connection~n"),
{Username, Encoding} = get_user_and_encoding(
- Host, From, Server),
+ Host, From, Server, DefEnc),
{ok, Pid} = mod_irc_connection:start(
From, Host, ServerHost, Server,
Username, Encoding),
[{xmlcdata, translate:translate(Lang, "ejabberd IRC module\n"
"Copyright (c) 2003-2006 Alexey Shchepin")}]}].
-process_register(Host, From, To, #iq{} = IQ) ->
- case catch process_irc_register(Host, From, To, IQ) of
+process_register(Host, From, To, DefEnc, #iq{} = IQ) ->
+ case catch process_irc_register(Host, From, To, DefEnc, IQ) of
{'EXIT', Reason} ->
?ERROR_MSG("~p", [Reason]);
ResIQ ->
find_xdata_el1([_ | Els]) ->
find_xdata_el1(Els).
-process_irc_register(Host, From, To,
+process_irc_register(Host, From, To, DefEnc,
#iq{type = Type, xmlns = XMLNS,
lang = Lang, sub_el = SubEl} = IQ) ->
case Type of
get ->
Node =
string:tokens(xml:get_tag_attr_s("node", SubEl), "/"),
- case get_form(Host, From, Node, Lang) of
+ case get_form(Host, From, Node, Lang ,DefEnc) of
{result, Res} ->
IQ#iq{type = result,
sub_el = [{xmlelement, "query",
-get_form(Host, From, [], Lang) ->
+get_form(Host, From, [], Lang, DefEnc) ->
#jid{user = User, server = Server,
luser = LUser, lserver = LServer} = From,
US = {LUser, LServer},
"for IRC servers, fill this list with values "
"in format '{\"irc server\", \"encoding\"}'. "
"By default this service use \"~s\" encoding."),
- [?DEFAULT_IRC_ENCODING]))}]}]},
+ [DefEnc]))}]}]},
{xmlelement, "field", [{"type", "fixed"}],
[{xmlelement, "value", [],
[{xmlcdata,
]}]}
end;
-get_form(_Host, _, _, Lang) ->
+get_form(_Host, _, _, Lang, _) ->
{error, ?ERR_SERVICE_UNAVAILABLE}.
{error, ?ERR_SERVICE_UNAVAILABLE}.
-get_user_and_encoding(Host, From, IRCServer) ->
+get_user_and_encoding(Host, From, IRCServer, DefEnc) ->
#jid{user = User, server = Server,
luser = LUser, lserver = LServer} = From,
US = {LUser, LServer},
case catch mnesia:dirty_read({irc_custom, {US, Host}}) of
{'EXIT', Reason} ->
- {User, ?DEFAULT_IRC_ENCODING};
+ {User, DefEnc};
[] ->
- {User, ?DEFAULT_IRC_ENCODING};
+ {User, DefEnc};
[#irc_custom{data = Data}] ->
{xml:get_attr_s(username, Data),
case xml:get_attr_s(IRCServer, xml:get_attr_s(encodings, Data)) of
- "" -> ?DEFAULT_IRC_ENCODING;
+ "" -> DefEnc;
E -> E
end}
end.