summaryrefslogtreecommitdiff
path: root/src/mod_muc/mod_muc_room.erl
diff options
context:
space:
mode:
authorBadlop <badlop@process-one.net>2011-08-23 21:53:30 +0200
committerBadlop <badlop@process-one.net>2011-08-23 21:53:30 +0200
commit9a190f3bc4141dd2c9a7cc2dbc2846ef40d4561c (patch)
tree88d33b5e0eab6d34b8a3ab6d70dbd959b6a02e91 /src/mod_muc/mod_muc_room.erl
parentDon't send unavailable presence when leaving occupant has other nicks in the ... (diff)
Send private messages to all the sessions with same nick (EJAB-305)
Diffstat (limited to 'src/mod_muc/mod_muc_room.erl')
-rw-r--r--src/mod_muc/mod_muc_room.erl25
1 files changed, 17 insertions, 8 deletions
diff --git a/src/mod_muc/mod_muc_room.erl b/src/mod_muc/mod_muc_room.erl
index e7a9ba71..efd8e917 100644
--- a/src/mod_muc/mod_muc_room.erl
+++ b/src/mod_muc/mod_muc_room.erl
@@ -426,14 +426,14 @@ normal_state({route, From, ToNick,
ToNick),
From, Err);
_ ->
- ToJID = find_jid_by_nick(ToNick, StateData),
+ ToJIDs = find_jids_by_nick(ToNick, StateData),
SrcIsVisitor = is_visitor(From, StateData),
- DstIsModerator = is_moderator(ToJID, StateData),
+ DstIsModerator = is_moderator(hd(ToJIDs), StateData),
PmFromVisitors = (StateData#state.config)#config.allow_private_messages_from_visitors,
if SrcIsVisitor == false;
PmFromVisitors == anyone;
(PmFromVisitors == moderators) and (DstIsModerator) ->
- case ToJID of
+ case ToJIDs of
false ->
ErrText = "Recipient is not in the conference room",
Err = jlib:make_error_reply(
@@ -447,11 +447,8 @@ normal_state({route, From, ToNick,
{ok, #user{nick = FromNick}} =
?DICT:find(jlib:jid_tolower(From),
StateData#state.users),
- ejabberd_router:route(
- jlib:jid_replace_resource(
- StateData#state.jid,
- FromNick),
- ToJID, Packet)
+ FromNickJID = jlib:jid_replace_resource(StateData#state.jid, FromNick),
+ [ejabberd_router:route(FromNickJID, ToJID, Packet) || ToJID <- ToJIDs]
end;
true ->
ErrText = "It is not allowed to send private messages",
@@ -1548,6 +1545,18 @@ add_user_presence_un(JID, Presence, StateData) ->
StateData#state{users = Users}.
+%% Find and return a list of the full JIDs of the users of Nick.
+%% Return jid record.
+find_jids_by_nick(Nick, StateData) ->
+ case ?DICT:find(Nick, StateData#state.nicks) of
+ {ok, [User]} ->
+ [jlib:make_jid(User)];
+ {ok, Users} ->
+ [jlib:make_jid(LJID) || LJID <- Users];
+ error ->
+ false
+ end.
+
%% Find and return the full JID of the user of Nick with
%% highest-priority presence. Return jid record.
find_jid_by_nick(Nick, StateData) ->