diff options
Diffstat (limited to 'src/mod_muc_room.erl')
-rw-r--r-- | src/mod_muc_room.erl | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index 8521238e8..6e83a374f 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; @@ -1235,7 +1241,7 @@ get_error_condition(undefined) -> -spec get_error_text(stanza_error()) -> binary(). get_error_text(#stanza_error{text = Txt}) -> - xmpp:get_text([Txt]). + xmpp:get_text(Txt). -spec make_reason(stanza(), jid(), state(), binary()) -> binary(). make_reason(Packet, From, StateData, Reason1) -> @@ -1254,8 +1260,16 @@ expulse_participant(Packet, From, StateData, Reason1) -> LJID = jid:tolower(From), {ok, #user{nick = Nick}} = (?DICT):find(LJID, StateData#state.users), case (?DICT):find(Nick, StateData#state.nicks) of - {ok, [_, _ | _]} -> ok; - _ -> send_new_presence(From, NewState, StateData) + {ok, [_, _ | _]} -> + Aff = get_affiliation(From, StateData), + Item = #muc_item{affiliation = Aff, role = none, jid = From}, + Pres = xmpp:set_subtag( + Packet, #muc_user{items = [Item], + status_codes = [110]}), + send_wrapped(jid:replace_resource(StateData#state.jid, Nick), + From, Pres, ?NS_MUCSUB_NODES_PRESENCE, StateData); + _ -> + send_new_presence(From, NewState, StateData) end, remove_online_user(From, NewState). @@ -1869,11 +1883,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 +2079,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). |