aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBadlop <badlop@process-one.net>2018-08-10 17:46:47 +0200
committerBadlop <badlop@process-one.net>2018-08-13 12:52:33 +0200
commit8f0e066135c72b2ee100e5ba5292718183e2738d (patch)
tree4f02a3d9ced7d36e2b0a57640153271a1be187fb /src
parentRemove num_active_users as it uses calls to last_activity mnesia table (#2448) (diff)
In response with list of room subscriptions include also events (#2272)
Diffstat (limited to 'src')
-rw-r--r--src/mod_muc.erl11
-rw-r--r--src/mod_muc_room.erl15
-rw-r--r--src/mod_muc_sql.erl4
3 files changed, 18 insertions, 12 deletions
diff --git a/src/mod_muc.erl b/src/mod_muc.erl
index 6b53e38d9..3024400ac 100644
--- a/src/mod_muc.erl
+++ b/src/mod_muc.erl
@@ -106,7 +106,7 @@
-callback unregister_online_user(binary(), ljid(), binary(), binary()) -> any().
-callback count_online_rooms_by_user(binary(), binary(), binary()) -> non_neg_integer().
-callback get_online_rooms_by_user(binary(), binary(), binary()) -> [{binary(), binary()}].
--callback get_subscribed_rooms(binary(), binary(), jid()) -> [ljid()] | [].
+-callback get_subscribed_rooms(binary(), binary(), jid()) -> [{ljid(), [binary()]}] | [].
%%====================================================================
%% API
@@ -614,8 +614,8 @@ process_mucsub(#iq{type = get, from = From, to = To,
sub_els = [#muc_subscriptions{}]} = IQ) ->
Host = To#jid.lserver,
ServerHost = ejabberd_router:host_of_route(Host),
- RoomJIDs = get_subscribed_rooms(ServerHost, Host, From),
- xmpp:make_iq_result(IQ, #muc_subscriptions{list = RoomJIDs});
+ Subs = get_subscribed_rooms(ServerHost, Host, From),
+ xmpp:make_iq_result(IQ, #muc_subscriptions{list = Subs});
process_mucsub(#iq{lang = Lang} = IQ) ->
Txt = <<"No module is handling this query">>,
xmpp:make_error(IQ, xmpp:err_service_unavailable(Txt, Lang)).
@@ -745,14 +745,15 @@ get_subscribed_rooms(ServerHost, Host, From) ->
lists:flatmap(
fun({Name, _, Pid}) ->
case p1_fsm:sync_send_all_state_event(Pid, {is_subscribed, BareFrom}) of
- true -> [jid:make(Name, Host)];
+ {true, Nodes} ->
+ [#muc_subscription{jid = jid:make(Name, Host), events = Nodes}];
false -> []
end;
(_) ->
[]
end, Rooms);
V ->
- V
+ [#muc_subscription{jid = Jid, events = Nodes} || {Jid, Nodes} <- V]
end.
get_nick(ServerHost, Host, From) ->
diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl
index 33c58e416..88bf4f099 100644
--- a/src/mod_muc_room.erl
+++ b/src/mod_muc_room.erl
@@ -586,7 +586,12 @@ handle_sync_event({muc_unsubscribe, From}, _From, StateName, StateData) ->
{reply, {error, get_error_text(Err)}, StateName, StateData}
end;
handle_sync_event({is_subscribed, From}, _From, StateName, StateData) ->
- IsSubs = ?DICT:is_key(jid:split(From), StateData#state.subscribers),
+ IsSubs = case (?DICT):find(jid:split(From), StateData#state.subscribers) of
+ {ok, #subscriber{nodes = Nodes}} ->
+ {true, Nodes};
+ error ->
+ false
+ end,
{reply, IsSubs, StateName, StateData};
handle_sync_event(_Event, _From, StateName,
StateData) ->
@@ -4090,11 +4095,11 @@ process_iq_mucsub(From, #iq{type = get, lang = Lang,
FAffiliation = get_affiliation(From, StateData),
FRole = get_role(From, StateData),
if FRole == moderator; FAffiliation == owner; FAffiliation == admin ->
- JIDs = dict:fold(
- fun(_, #subscriber{jid = J}, Acc) ->
- [J|Acc]
+ Subs = dict:fold(
+ fun(_, #subscriber{jid = J, nodes = Nodes}, Acc) ->
+ [#muc_subscription{jid = J, events = Nodes}|Acc]
end, [], StateData#state.subscribers),
- {result, #muc_subscriptions{list = JIDs}, StateData};
+ {result, #muc_subscriptions{list = Subs}, StateData};
true ->
Txt = <<"Moderator privileges required">>,
{error, xmpp:err_forbidden(Txt, Lang)}
diff --git a/src/mod_muc_sql.erl b/src/mod_muc_sql.erl
index d078b64f1..e92b4bc54 100644
--- a/src/mod_muc_sql.erl
+++ b/src/mod_muc_sql.erl
@@ -411,10 +411,10 @@ get_subscribed_rooms(LServer, Host, Jid) ->
JidS = jid:encode(Jid),
case catch ejabberd_sql:sql_query(
LServer,
- ?SQL("select @(room)s from muc_room_subscribers where jid=%(JidS)s"
+ ?SQL("select @(room)s, @(nodes)s from muc_room_subscribers where jid=%(JidS)s"
" and host=%(Host)s")) of
{selected, Subs} ->
- [jid:make(Room, Host, <<>>) || {Room} <- Subs];
+ [{jid:make(Room, Host, <<>>), ejabberd_sql:decode_term(Nodes)} || {Room, Nodes} <- Subs];
_Error ->
[]
end.