diff options
author | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2017-10-09 17:59:22 +0300 |
---|---|---|
committer | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2017-10-09 17:59:22 +0300 |
commit | a6e5a5ca9a3f3635e81da6dedfb168508bdb71b4 (patch) | |
tree | 983d6c75f8274f4afb613faf87fbcc7f5682944e /src/mod_muc_room.erl | |
parent | Update Russian translation (diff) |
Resend presences and history if presence possesses <x/> MUC element
Behave according to the new rule from XEP-0045, section 7.2.2:
> When a MUC service receives an <x/> tagged join stanza from an
> already-joined client (as identified by the client's full JID),
> the service should assume that the client lost its synchronization,
> and therefore it SHOULD send exactly the same stanzas to the client
> as if it actually just joined the MUC.
Diffstat (limited to 'src/mod_muc_room.erl')
-rw-r--r-- | src/mod_muc_room.erl | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index 8521238e..e06c2068 100644 --- a/src/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -1014,7 +1014,13 @@ do_process_presence(Nick, #presence{from = From, type = available, lang = Lang} From, Packet, StateData), NewState = add_user_presence(From, Stanza, StateData), - send_new_presence(From, NewState, StateData), + case xmpp:has_subtag(Packet, #muc{}) of + true -> + send_initial_presences_and_messages( + From, Nick, Packet, NewState, StateData); + false -> + send_new_presence(From, NewState, StateData) + end, NewState end end; @@ -1869,11 +1875,8 @@ add_new_user(From, Nick, Packet, StateData) -> From, Packet, add_online_user(From, Nick, Role, StateData)), - send_existing_presences(From, NewState), - send_initial_presence(From, NewState, StateData), - History = get_history(Nick, Packet, NewState), - send_history(From, History, NewState), - send_subject(From, StateData), + send_initial_presences_and_messages( + From, Nick, Packet, NewState, StateData), NewState; true -> set_subscriber(From, Nick, Nodes, StateData) @@ -2068,6 +2071,15 @@ presence_broadcast_allowed(JID, StateData) -> Role = get_role(JID, StateData), lists:member(Role, (StateData#state.config)#config.presence_broadcast). +-spec send_initial_presences_and_messages( + jid(), binary(), presence(), state(), state()) -> ok. +send_initial_presences_and_messages(From, Nick, Presence, NewState, OldState) -> + send_existing_presences(From, NewState), + send_initial_presence(From, NewState, OldState), + History = get_history(Nick, Presence, NewState), + send_history(From, History, NewState), + send_subject(From, OldState). + -spec send_initial_presence(jid(), state(), state()) -> ok. send_initial_presence(NJID, StateData, OldStateData) -> send_new_presence1(NJID, <<"">>, true, StateData, OldStateData). |