summaryrefslogtreecommitdiff
path: root/src/mod_muc/mod_muc_room.erl
diff options
context:
space:
mode:
authorAlexey Shchepin <alexey@process-one.net>2003-05-14 19:58:05 +0000
committerAlexey Shchepin <alexey@process-one.net>2003-05-14 19:58:05 +0000
commit2d3aa901a9f1d4bd523f47e682e64c5feb8cf7c2 (patch)
treeed35fc7074bc73c7dea8241e7f91d3c8375074b1 /src/mod_muc/mod_muc_room.erl
parent* src/ejabberd_s2s_out.erl: Fixed error replies, added timeouts (diff)
* src/mod_muc/mod_muc_room.erl: Remove user from room on receiving
of message or presence error from him SVN Revision: 108
Diffstat (limited to '')
-rw-r--r--src/mod_muc/mod_muc_room.erl102
1 files changed, 76 insertions, 26 deletions
diff --git a/src/mod_muc/mod_muc_room.erl b/src/mod_muc/mod_muc_room.erl
index 39cf4a0e..33d82447 100644
--- a/src/mod_muc/mod_muc_room.erl
+++ b/src/mod_muc/mod_muc_room.erl
@@ -189,7 +189,20 @@ normal_state({route, From, "",
{next_state, normal_state, StateData}
end;
"error" ->
- {next_state, normal_state, StateData};
+ case is_user_online(From, StateData) of
+ true ->
+ NewState =
+ add_user_presence_un(
+ From,
+ {xmlelement, "presence",
+ [{"type", "unavailable"}], []},
+ StateData),
+ send_new_presence(From, NewState),
+ {next_state, normal_state,
+ remove_online_user(From, NewState)};
+ _ ->
+ {next_state, normal_state, StateData}
+ end;
Type when (Type == "") or (Type == "normal") ->
case check_invitation(From, Els, StateData) of
error ->
@@ -296,8 +309,20 @@ normal_state({route, From, Nick,
_ ->
StateData
end;
- "error" -> % TODO
- StateData;
+ "error" ->
+ case is_user_online(From, StateData) of
+ true ->
+ NewState =
+ add_user_presence_un(
+ From,
+ {xmlelement, "presence",
+ [{"type", "unavailable"}], []},
+ StateData),
+ send_new_presence(From, NewState),
+ remove_online_user(From, NewState);
+ _ ->
+ StateData
+ end;
"" ->
case is_user_online(From, StateData) of
true ->
@@ -388,31 +413,56 @@ normal_state({route, From, Nick,
normal_state({route, From, ToNick,
{xmlelement, "message", Attrs, Els} = Packet},
StateData) ->
- case (StateData#state.config)#config.allow_private_messages
- andalso is_user_online(From, StateData) of
- true ->
- case find_jid_by_nick(ToNick, StateData) of
- false ->
- Err = jlib:make_error_reply(
- Packet, ?ERR_JID_NOT_FOUND),
- ejabberd_router:route(
- {StateData#state.room, StateData#state.host, ToNick},
- From, Err);
- ToJID ->
- {ok, #user{nick = FromNick}} =
- ?DICT:find(jlib:jid_tolower(From),
- StateData#state.users),
- ejabberd_router:route(
- {StateData#state.room, StateData#state.host, FromNick},
- ToJID, Packet)
+ case xml:get_attr_s("type", Attrs) of
+ "error" ->
+ case is_user_online(From, StateData) of
+ true ->
+ NewState =
+ add_user_presence_un(
+ From,
+ {xmlelement, "presence",
+ [{"type", "unavailable"}], []},
+ StateData),
+ send_new_presence(From, NewState),
+ {next_state, normal_state,
+ remove_online_user(From, NewState)};
+ _ ->
+ {next_state, normal_state, StateData}
end;
_ ->
- Err = jlib:make_error_reply(
- Packet, ?ERR_NOT_ALLOWED),
- ejabberd_router:route(
- {StateData#state.room, StateData#state.host, ToNick}, From, Err)
- end,
- {next_state, normal_state, StateData};
+ case (StateData#state.config)#config.allow_private_messages
+ andalso is_user_online(From, StateData) of
+ true ->
+ case find_jid_by_nick(ToNick, StateData) of
+ false ->
+ Err = jlib:make_error_reply(
+ Packet, ?ERR_JID_NOT_FOUND),
+ ejabberd_router:route(
+ {StateData#state.room,
+ StateData#state.host,
+ ToNick},
+ From, Err);
+ ToJID ->
+ {ok, #user{nick = FromNick}} =
+ ?DICT:find(jlib:jid_tolower(From),
+ StateData#state.users),
+ ejabberd_router:route(
+ {StateData#state.room,
+ StateData#state.host,
+ FromNick},
+ ToJID, Packet)
+ end,
+ {next_state, normal_state, StateData};
+ _ ->
+ Err = jlib:make_error_reply(
+ Packet, ?ERR_NOT_ALLOWED),
+ ejabberd_router:route(
+ {StateData#state.room,
+ StateData#state.host,
+ ToNick}, From, Err),
+ {next_state, normal_state, StateData}
+ end
+ end;
normal_state({route, From, ToNick,
{xmlelement, "iq", Attrs, Els} = Packet},