mirror of
https://github.com/processone/ejabberd
synced 2025-10-03 09:49:18 +02:00
* src/mod_irc/: Still not completed...
SVN Revision: 75
This commit is contained in:
parent
a28f723243
commit
1e1f02db98
4 changed files with 101 additions and 33 deletions
|
@ -1,3 +1,7 @@
|
||||||
|
2003-02-17 Alexey Shchepin <alexey@sevcom.net>
|
||||||
|
|
||||||
|
* src/mod_irc/: Still not completed...
|
||||||
|
|
||||||
2003-02-16 Alexey Shchepin <alexey@sevcom.net>
|
2003-02-16 Alexey Shchepin <alexey@sevcom.net>
|
||||||
|
|
||||||
* src/mod_irc/: New IRC transport (not completed yet)
|
* src/mod_irc/: New IRC transport (not completed yet)
|
||||||
|
|
|
@ -34,9 +34,9 @@
|
||||||
{normal, all}]}.
|
{normal, all}]}.
|
||||||
|
|
||||||
|
|
||||||
{host, "e.localhost"}.
|
{host, "localhost"}.
|
||||||
|
|
||||||
{listen, [{5522, ejabberd_c2s, start, [{access, c2s},
|
{listen, [{5222, ejabberd_c2s, start, [{access, c2s},
|
||||||
{shaper, c2s_shaper}]},
|
{shaper, c2s_shaper}]},
|
||||||
%{5523, ejabberd_c2s, start,
|
%{5523, ejabberd_c2s, start,
|
||||||
% [{access, c2s}, {ssl, [{certfile, "./ssl.pem"}]}]},
|
% [{access, c2s}, {ssl, [{certfile, "./ssl.pem"}]}]},
|
||||||
|
@ -46,7 +46,7 @@
|
||||||
]}.
|
]}.
|
||||||
|
|
||||||
% This value (5569) is only for debugging, must be 5269
|
% This value (5569) is only for debugging, must be 5269
|
||||||
{outgoing_s2s_port, 5569}.
|
{outgoing_s2s_port, 5269}.
|
||||||
|
|
||||||
{modules, [
|
{modules, [
|
||||||
{mod_register, []},
|
{mod_register, []},
|
||||||
|
@ -56,7 +56,7 @@
|
||||||
{mod_stats, []},
|
{mod_stats, []},
|
||||||
{mod_vcard, []},
|
{mod_vcard, []},
|
||||||
{mod_offline, []},
|
{mod_offline, []},
|
||||||
{mod_echo, [{host, "echo.e.localhost"}]},
|
{mod_echo, [{host, "echo.localhost"}]},
|
||||||
{mod_private, []},
|
{mod_private, []},
|
||||||
{mod_irc, []},
|
{mod_irc, []},
|
||||||
{mod_time, [{iqdisc, no_queue}]},
|
{mod_time, [{iqdisc, no_queue}]},
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
|
|
||||||
-behaviour(gen_mod).
|
-behaviour(gen_mod).
|
||||||
|
|
||||||
-export([start/1, init/1, stop/0]).
|
-export([start/1, init/1, stop/0, closed_conection/2]).
|
||||||
|
|
||||||
-include("ejabberd.hrl").
|
-include("ejabberd.hrl").
|
||||||
|
|
||||||
|
@ -91,3 +91,7 @@ do_route(Host, From, To, Packet) ->
|
||||||
stop() ->
|
stop() ->
|
||||||
ejabberd_mod_irc ! stop,
|
ejabberd_mod_irc ! stop,
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
|
closed_conection(From, Server) ->
|
||||||
|
ets:delete(irc_connection, {From, Server}).
|
||||||
|
|
||||||
|
|
|
@ -29,8 +29,11 @@
|
||||||
-include("ejabberd.hrl").
|
-include("ejabberd.hrl").
|
||||||
-include("namespaces.hrl").
|
-include("namespaces.hrl").
|
||||||
|
|
||||||
|
-define(SETS, gb_sets).
|
||||||
|
|
||||||
-record(state, {socket, receiver, queue,
|
-record(state, {socket, receiver, queue,
|
||||||
user, myname, server, nick,
|
user, myname, server, nick,
|
||||||
|
channels = ?SETS:new(),
|
||||||
inbuf = "", outbuf = ""}).
|
inbuf = "", outbuf = ""}).
|
||||||
|
|
||||||
-define(IRC_ENCODING, "koi8-r").
|
-define(IRC_ENCODING, "koi8-r").
|
||||||
|
@ -176,15 +179,24 @@ handle_info({route, Channel, Resource, {xmlelement, "presence", Attrs, Els}},
|
||||||
NewStateData =
|
NewStateData =
|
||||||
case xml:get_attr_s("type", Attrs) of
|
case xml:get_attr_s("type", Attrs) of
|
||||||
"unavailable" ->
|
"unavailable" ->
|
||||||
?SEND(io_lib:format("PART #~s\r\n", [Channel]));
|
S1 = ?SEND(io_lib:format("PART #~s\r\n", [Channel])),
|
||||||
|
S1#state{channels =
|
||||||
|
remove_element(Channel, S1#state.channels)};
|
||||||
"subscribe" -> StateData;
|
"subscribe" -> StateData;
|
||||||
"subscribed" -> StateData;
|
"subscribed" -> StateData;
|
||||||
"unsubscribe" -> StateData;
|
"unsubscribe" -> StateData;
|
||||||
"unsubscribed" -> StateData;
|
"unsubscribed" -> StateData;
|
||||||
_ ->
|
_ ->
|
||||||
?SEND(io_lib:format("JOIN #~s\r\n", [Channel]))
|
S1 = ?SEND(io_lib:format("JOIN #~s\r\n", [Channel])),
|
||||||
|
S1#state{channels =
|
||||||
|
?SETS:add_element(Channel, S1#state.channels)}
|
||||||
end,
|
end,
|
||||||
{next_state, StateName, NewStateData};
|
case ?SETS:is_empty(NewStateData#state.channels) of
|
||||||
|
true ->
|
||||||
|
{stop, normal, NewStateData};
|
||||||
|
_ ->
|
||||||
|
{next_state, StateName, NewStateData}
|
||||||
|
end;
|
||||||
|
|
||||||
handle_info({route, Channel, Resource,
|
handle_info({route, Channel, Resource,
|
||||||
{xmlelement, "message", Attrs, Els} = El},
|
{xmlelement, "message", Attrs, Els} = El},
|
||||||
|
@ -213,33 +225,44 @@ handle_info({ircstring, [$P, $I, $N, $G, $ | ID]}, StateName, StateData) ->
|
||||||
|
|
||||||
handle_info({ircstring, [$: | String]}, StateName, StateData) ->
|
handle_info({ircstring, [$: | String]}, StateName, StateData) ->
|
||||||
Words = string:tokens(String, " "),
|
Words = string:tokens(String, " "),
|
||||||
case Words of
|
|
||||||
[_, "353" | Items] ->
|
|
||||||
process_channel_list(StateData, Items);
|
|
||||||
[From, "PRIVMSG", [$# | Chan] | _] ->
|
|
||||||
process_privmsg(StateData, Chan, From, String);
|
|
||||||
[From, "PART", [$# | Chan] | _] ->
|
|
||||||
process_part(StateData, Chan, From, String);
|
|
||||||
[From, "JOIN", Chan | _] ->
|
|
||||||
process_join(StateData, Chan, From, String);
|
|
||||||
[From, "MODE", [$# | Chan], "+o", Nick | _] ->
|
|
||||||
process_mode_o(StateData, Chan, From, Nick,
|
|
||||||
"admin", "moderator");
|
|
||||||
[From, "MODE", [$# | Chan], "-o", Nick | _] ->
|
|
||||||
process_mode_o(StateData, Chan, From, Nick,
|
|
||||||
"member", "participant");
|
|
||||||
_ ->
|
|
||||||
io:format("unknown irc command '~s'~n", [String])
|
|
||||||
end,
|
|
||||||
NewStateData =
|
NewStateData =
|
||||||
|
case Words of
|
||||||
|
[_, "353" | Items] ->
|
||||||
|
process_channel_list(StateData, Items),
|
||||||
|
StateData;
|
||||||
|
[From, "PRIVMSG", [$# | Chan] | _] ->
|
||||||
|
process_privmsg(StateData, Chan, From, String),
|
||||||
|
StateData;
|
||||||
|
[From, "PART", [$# | Chan] | _] ->
|
||||||
|
process_part(StateData, Chan, From, String),
|
||||||
|
StateData;
|
||||||
|
[From, "JOIN", Chan | _] ->
|
||||||
|
process_join(StateData, Chan, From, String),
|
||||||
|
StateData;
|
||||||
|
[From, "MODE", [$# | Chan], "+o", Nick | _] ->
|
||||||
|
process_mode_o(StateData, Chan, From, Nick,
|
||||||
|
"admin", "moderator"),
|
||||||
|
StateData;
|
||||||
|
[From, "MODE", [$# | Chan], "-o", Nick | _] ->
|
||||||
|
process_mode_o(StateData, Chan, From, Nick,
|
||||||
|
"member", "participant"),
|
||||||
|
StateData;
|
||||||
|
[From, "KICK", [$# | Chan], Nick | _] ->
|
||||||
|
process_kick(StateData, Chan, From, Nick),
|
||||||
|
StateData;
|
||||||
|
_ ->
|
||||||
|
io:format("unknown irc command '~s'~n", [String]),
|
||||||
|
StateData
|
||||||
|
end,
|
||||||
|
NewStateData1 =
|
||||||
case StateData#state.outbuf of
|
case StateData#state.outbuf of
|
||||||
"" ->
|
"" ->
|
||||||
StateData;
|
NewStateData;
|
||||||
Data ->
|
Data ->
|
||||||
send_text(StateData#state.socket, Data),
|
send_text(NewStateData#state.socket, Data),
|
||||||
StateData#state{outbuf = ""}
|
NewStateData#state{outbuf = ""}
|
||||||
end,
|
end,
|
||||||
{next_state, stream_established, NewStateData};
|
{next_state, stream_established, NewStateData1};
|
||||||
|
|
||||||
|
|
||||||
handle_info({ircstring, String}, StateName, StateData) ->
|
handle_info({ircstring, String}, StateName, StateData) ->
|
||||||
|
@ -278,8 +301,8 @@ handle_info({tcp_error, Socket, Reason}, StateName, StateData) ->
|
||||||
%% Returns: any
|
%% Returns: any
|
||||||
%%----------------------------------------------------------------------
|
%%----------------------------------------------------------------------
|
||||||
terminate(Reason, StateName, StateData) ->
|
terminate(Reason, StateName, StateData) ->
|
||||||
ejabberd_mod_irc ! {closed_conection, {StateData#state.user,
|
mod_irc:closed_conection(StateData#state.user,
|
||||||
StateData#state.server}},
|
StateData#state.server),
|
||||||
case StateData#state.socket of
|
case StateData#state.socket of
|
||||||
undefined ->
|
undefined ->
|
||||||
ok;
|
ok;
|
||||||
|
@ -394,11 +417,27 @@ process_channel_list_user(StateData, Chan, User) ->
|
||||||
process_privmsg(StateData, Chan, From, String) ->
|
process_privmsg(StateData, Chan, From, String) ->
|
||||||
[FromUser | _] = string:tokens(From, "!"),
|
[FromUser | _] = string:tokens(From, "!"),
|
||||||
Msg = lists:last(string:tokens(String, ":")),
|
Msg = lists:last(string:tokens(String, ":")),
|
||||||
|
Msg1 = case Msg of
|
||||||
|
[1, $A, $C, $T, $I, $O, $N, $ | Rest] ->
|
||||||
|
"/me " ++ Rest;
|
||||||
|
_ ->
|
||||||
|
Msg
|
||||||
|
end,
|
||||||
|
Msg2 = lists:filter(
|
||||||
|
fun(C) ->
|
||||||
|
if (C < 32) and
|
||||||
|
(C /= 9) and
|
||||||
|
(C /= 10) and
|
||||||
|
(C /= 13) ->
|
||||||
|
false;
|
||||||
|
true -> true
|
||||||
|
end
|
||||||
|
end, Msg1),
|
||||||
ejabberd_router:route({lists:concat([Chan, "%", StateData#state.server]),
|
ejabberd_router:route({lists:concat([Chan, "%", StateData#state.server]),
|
||||||
StateData#state.myname, FromUser},
|
StateData#state.myname, FromUser},
|
||||||
StateData#state.user,
|
StateData#state.user,
|
||||||
{xmlelement, "message", [{"type", "groupchat"}],
|
{xmlelement, "message", [{"type", "groupchat"}],
|
||||||
[{xmlelement, "body", [], [{xmlcdata, Msg}]}]}).
|
[{xmlelement, "body", [], [{xmlcdata, Msg2}]}]}).
|
||||||
|
|
||||||
process_part(StateData, Chan, From, String) ->
|
process_part(StateData, Chan, From, String) ->
|
||||||
[FromUser | _] = string:tokens(From, "!"),
|
[FromUser | _] = string:tokens(From, "!"),
|
||||||
|
@ -440,4 +479,25 @@ process_mode_o(StateData, Chan, From, Nick, Affiliation, Role) ->
|
||||||
{"role", Role}],
|
{"role", Role}],
|
||||||
[]}]}]}).
|
[]}]}]}).
|
||||||
|
|
||||||
|
process_kick(StateData, Chan, From, Nick) ->
|
||||||
|
%Msg = lists:last(string:tokens(String, ":")),
|
||||||
|
ejabberd_router:route({lists:concat([Chan, "%", StateData#state.server]),
|
||||||
|
StateData#state.myname, Nick},
|
||||||
|
StateData#state.user,
|
||||||
|
{xmlelement, "presence", [{"type", "unavailable"}],
|
||||||
|
[{xmlelement, "x", [{"xmlns", ?NS_MUC_USER}],
|
||||||
|
[{xmlelement, "item",
|
||||||
|
[{"affiliation", "none"},
|
||||||
|
{"role", "none"}],
|
||||||
|
[]},
|
||||||
|
{xmlelement, "status", [{"code", "307"}], []}
|
||||||
|
]}]}).
|
||||||
|
|
||||||
|
|
||||||
|
remove_element(E, Set) ->
|
||||||
|
case ?SETS:is_element(E, Set) of
|
||||||
|
true ->
|
||||||
|
?SETS:del_element(E, Set);
|
||||||
|
_ ->
|
||||||
|
Set
|
||||||
|
end.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue