From 2d3aa901a9f1d4bd523f47e682e64c5feb8cf7c2 Mon Sep 17 00:00:00 2001 From: Alexey Shchepin Date: Wed, 14 May 2003 19:58:05 +0000 Subject: [PATCH] * src/mod_muc/mod_muc_room.erl: Remove user from room on receiving of message or presence error from him SVN Revision: 108 --- ChangeLog | 5 ++ src/mod_muc/mod_muc_room.erl | 102 ++++++++++++++++++++++++++--------- 2 files changed, 81 insertions(+), 26 deletions(-) diff --git a/ChangeLog b/ChangeLog index 268f18d4c..a3c7f3245 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2003-05-14 Alexey Shchepin + + * src/mod_muc/mod_muc_room.erl: Remove user from room on receiving + of message or presence error from him + 2003-05-12 Alexey Shchepin * src/ejabberd_s2s_out.erl: Fixed error replies, added timeouts diff --git a/src/mod_muc/mod_muc_room.erl b/src/mod_muc/mod_muc_room.erl index 39cf4a0e9..33d824474 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},