summaryrefslogtreecommitdiff
path: root/src/mod_irc_connection.erl
diff options
context:
space:
mode:
authorBadlop <badlop@process-one.net>2015-12-21 16:19:24 +0100
committerBadlop <badlop@process-one.net>2015-12-21 16:20:20 +0100
commit88c9991f908314ecd9fbbacea42f994dfc0bf5b8 (patch)
tree60069bfe9ee77762d5ebc7f6d4129079a4be5fcd /src/mod_irc_connection.erl
parentSupport presence_broadcast in default_room_options mod_muc option (diff)
Adding WEBIRC, custom realname & ident, ISO-8859-15 (thanks to iwalkalone69)(#877)
Diffstat (limited to 'src/mod_irc_connection.erl')
-rw-r--r--src/mod_irc_connection.erl30
1 files changed, 21 insertions, 9 deletions
diff --git a/src/mod_irc_connection.erl b/src/mod_irc_connection.erl
index 5c8597f2..eed7006c 100644
--- a/src/mod_irc_connection.erl
+++ b/src/mod_irc_connection.erl
@@ -30,7 +30,7 @@
-behaviour(gen_fsm).
%% External exports
--export([start_link/8, start/9, route_chan/4,
+-export([start_link/12, start/13, route_chan/4,
route_nick/3]).
%% gen_fsm callbacks
@@ -55,9 +55,13 @@
user = #jid{} :: jid(),
host = <<"">> :: binary(),
server = <<"">> :: binary(),
+ remoteAddr = <<"">> :: binary(),
+ ident = <<"">> :: binary(),
+ realname = <<"">> :: binary(),
nick = <<"">> :: binary(),
channels = dict:new() :: ?TDICT,
nickchannel :: binary(),
+ webirc_password :: binary(),
mod = mod_irc :: atom(),
inbuf = <<"">> :: binary(),
outbuf = <<"">> :: binary()}).
@@ -78,18 +82,18 @@
-endif.
start(From, Host, ServerHost, Server, Username,
- Encoding, Port, Password, Mod) ->
+ Encoding, Port, Password, Ident, RemoteAddr, RealName, WebircPassword, Mod) ->
Supervisor = gen_mod:get_module_proc(ServerHost,
ejabberd_mod_irc_sup),
supervisor:start_child(Supervisor,
[From, Host, Server, Username, Encoding, Port,
- Password, Mod]).
+ Password, Ident, RemoteAddr, RealName, WebircPassword, Mod]).
start_link(From, Host, Server, Username, Encoding, Port,
- Password, Mod) ->
+ Password, Ident, RemoteAddr, RealName, WebircPassword, Mod) ->
gen_fsm:start_link(?MODULE,
[From, Host, Server, Username, Encoding, Port, Password,
- Mod],
+ Ident, RemoteAddr, RealName, WebircPassword, Mod],
?FSMOPTS).
%%%----------------------------------------------------------------------
@@ -104,13 +108,14 @@ start_link(From, Host, Server, Username, Encoding, Port,
%% {stop, StopReason}
%%----------------------------------------------------------------------
init([From, Host, Server, Username, Encoding, Port,
- Password, Mod]) ->
+ Password, Ident, RemoteAddr, RealName, WebircPassword, Mod]) ->
gen_fsm:send_event(self(), init),
{ok, open_socket,
#state{queue = queue:new(), mod = Mod,
encoding = Encoding, port = Port, password = Password,
user = From, nick = Username, host = Host,
- server = Server}}.
+ server = Server, ident = Ident, realname = RealName,
+ remoteAddr = RemoteAddr, webirc_password = WebircPassword }}.
%%----------------------------------------------------------------------
%% Func: StateName/2
@@ -122,6 +127,10 @@ open_socket(init, StateData) ->
Addr = StateData#state.server,
Port = StateData#state.port,
?DEBUG("Connecting with IPv6 to ~s:~p", [Addr, Port]),
+ From = StateData#state.user,
+ #jid{user = JidUser, server = JidServer, resource = JidResource} = From,
+ UserIP = ejabberd_sm:get_user_ip(JidUser, JidServer, JidResource),
+ UserIPStr = inet_parse:ntoa(element(1, UserIP)),
Connect6 = gen_tcp:connect(binary_to_list(Addr), Port,
[inet6, binary, {packet, 0}]),
Connect = case Connect6 of
@@ -136,6 +145,8 @@ open_socket(init, StateData) ->
case Connect of
{ok, Socket} ->
NewStateData = StateData#state{socket = Socket},
+ send_text(NewStateData,
+ io_lib:format("WEBIRC ~s ~s ~s ~s\r\n", [StateData#state.webirc_password, JidResource, UserIPStr, UserIPStr])),
if StateData#state.password /= <<"">> ->
send_text(NewStateData,
io_lib:format("PASS ~s\r\n",
@@ -146,9 +157,10 @@ open_socket(init, StateData) ->
io_lib:format("NICK ~s\r\n", [StateData#state.nick])),
send_text(NewStateData,
io_lib:format("USER ~s ~s ~s :~s\r\n",
- [StateData#state.nick, StateData#state.nick,
+ [StateData#state.ident,
+ StateData#state.nick,
StateData#state.host,
- StateData#state.nick])),
+ StateData#state.realname])),
{next_state, wait_for_registration, NewStateData};
{error, Reason} ->
?DEBUG("connect return ~p~n", [Reason]),