diff options
author | Badlop <badlop@process-one.net> | 2008-02-09 10:38:47 +0000 |
---|---|---|
committer | Badlop <badlop@process-one.net> | 2008-02-09 10:38:47 +0000 |
commit | a90606b104b16b1e760f5ef7b61d907b7e67bb91 (patch) | |
tree | eb7adbb928eafa5d89ff67e7dbcb3c2ac106ef93 /src | |
parent | * src/ejabberd.cfg.example: Document options to SQL keep alive (diff) |
* src/mod_muc/mod_muc_room.erl: Include the error condition in the
presence status when kicking a participant due to an error
stanza (EJAB-496)
SVN Revision: 1179
Diffstat (limited to 'src')
-rw-r--r-- | src/mod_muc/mod_muc_room.erl | 61 |
1 files changed, 36 insertions, 25 deletions
diff --git a/src/mod_muc/mod_muc_room.erl b/src/mod_muc/mod_muc_room.erl index 0102ba03c..0f7073632 100644 --- a/src/mod_muc/mod_muc_room.erl +++ b/src/mod_muc/mod_muc_room.erl @@ -294,18 +294,11 @@ normal_state({route, From, "", "error" -> case is_user_online(From, StateData) of true -> - NewState = - add_user_presence_un( - From, - {xmlelement, "presence", - [{"type", "unavailable"}], - [{xmlelement, "status", [], - [{xmlcdata, - "This participant sent a bad error message to the room."}]}]}, - StateData), - send_new_presence(From, NewState), - {next_state, normal_state, - remove_online_user(From, NewState)}; + ErrorText = "This participant is kicked from the room because " + "he sent an error message", + NewState = expulse_participant(Packet, From, StateData, + translate:translate(Lang, ErrorText)), + {next_state, normal_state, NewState}; _ -> {next_state, normal_state, StateData} end; @@ -902,16 +895,10 @@ process_presence(From, Nick, {xmlelement, "presence", Attrs, _Els} = Packet, "error" -> case is_user_online(From, StateData) of true -> - NewState = - add_user_presence_un( - From, - {xmlelement, "presence", - [{"type", "unavailable"}], - [{xmlelement, "status", [], - [{xmlcdata, "This participant sent a bad error presence."}]}]}, - StateData), - send_new_presence(From, NewState), - remove_online_user(From, NewState); + ErrorText = "This participant is kicked from the room because " + "he sent an error presence", + expulse_participant(Packet, From, StateData, + translate:translate(Lang, ErrorText)); _ -> StateData end; @@ -1040,9 +1027,7 @@ decide_fate_message(_, _, _, _) -> %% that the sender is a dead participant. %% If so, return true to kick the participant. check_error_kick(Packet) -> - {xmlelement, _, _, EEls} = xml:get_subtag(Packet, "error"), - [{xmlelement, Name, _, _}] = xml:remove_cdata(EEls), - case Name of + case get_error_condition(Packet) of "gone" -> true; "internal-server-error" -> true; "item-not-found" -> true; @@ -1055,6 +1040,32 @@ check_error_kick(Packet) -> _ -> false end. +get_error_condition(Packet) -> + case catch get_error_condition2(Packet) of + {condition, ErrorCondition} -> + ErrorCondition; + {'EXIT', Error} -> + "badformed error stanza" + end. +get_error_condition2(Packet) -> + {xmlelement, _, _, EEls} = xml:get_subtag(Packet, "error"), + [Condition] = [Name || {xmlelement, Name, [{"xmlns", ?NS_STANZAS}], []} <- EEls], + {condition, Condition}. + +expulse_participant(Packet, From, StateData, Reason1) -> + ErrorCondition = get_error_condition(Packet), + Reason2 = io_lib:format(Reason1 ++ ": " ++ "~s", [ErrorCondition]), + NewState = add_user_presence_un( + From, + {xmlelement, "presence", + [{"type", "unavailable"}], + [{xmlelement, "status", [], + [{xmlcdata, Reason2}] + }]}, + StateData), + send_new_presence(From, NewState), + remove_online_user(From, NewState). + set_affiliation(JID, Affiliation, StateData) -> LJID = jlib:jid_remove_resource(jlib:jid_tolower(JID)), |