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;
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) ]),