mirror of
https://github.com/processone/ejabberd.git
synced 2024-11-20 16:15:59 +01:00
Merge pull request #335 from weiss/avoid-carbon-dups
Avoid duplicates of carbon copies
This commit is contained in:
commit
25e5253f33
@ -167,6 +167,10 @@ remove_connection(User, Server, Resource, _Status)->
|
||||
send_copies(JID, To, Packet, Direction)->
|
||||
{U, S, R} = jlib:jid_tolower(JID),
|
||||
PrioRes = ejabberd_sm:get_user_present_resources(U, S),
|
||||
{MaxPrio, MaxRes} = case catch lists:max(PrioRes) of
|
||||
{Prio, Res} -> {Prio, Res};
|
||||
_ -> {0, undefined}
|
||||
end,
|
||||
|
||||
IsBareTo = case {Direction, To} of
|
||||
{received, #jid{lresource = <<>>}} -> true;
|
||||
@ -180,15 +184,19 @@ send_copies(JID, To, Packet, Direction)->
|
||||
end,
|
||||
%% list of JIDs that should receive a carbon copy of this message (excluding the
|
||||
%% receiver(s) of the original message
|
||||
TargetJIDs = if IsBareTo ->
|
||||
MaxPrio = case catch lists:max(PrioRes) of
|
||||
{Prio, _Res} -> Prio;
|
||||
_ -> 0
|
||||
end,
|
||||
TargetJIDs = case {IsBareTo, R} of
|
||||
{true, MaxRes} ->
|
||||
OrigTo = fun(Res) -> lists:member({MaxPrio, Res}, PrioRes) end,
|
||||
[ {jlib:make_jid({U, S, CCRes}), CC_Version}
|
||||
|| {CCRes, CC_Version} <- list(U, S), not OrigTo(CCRes) ];
|
||||
true ->
|
||||
{true, _} ->
|
||||
%% The message was sent to our bare JID, and we currently have
|
||||
%% multiple resources with the same highest priority, so the session
|
||||
%% manager routes the message to each of them. We create carbon
|
||||
%% copies only from one of those resources (the one where R equals
|
||||
%% MaxRes) in order to avoid duplicates.
|
||||
[];
|
||||
{false, _} ->
|
||||
[ {jlib:make_jid({U, S, CCRes}), CC_Version}
|
||||
|| {CCRes, CC_Version} <- list(U, S), CCRes /= R ]
|
||||
%TargetJIDs = lists:delete(JID, [ jlib:make_jid({U, S, CCRes}) || CCRes <- list(U, S) ]),
|
||||
|
Loading…
Reference in New Issue
Block a user