summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHolger Weiss <holger@zedat.fu-berlin.de>2017-12-05 23:10:12 +0100
committerChristophe Romain <christophe.romain@process-one.net>2017-12-12 12:21:33 +0100
commit03246f5ff411bafbdf1633b285b7849eef8cd3d1 (patch)
tree9026925ce7a38719e76b65c3f2e21e8443d10c44 /src
parentMerge pull request #2160 from weiss/publish-options (diff)
mod_pubsub: Send last items on initial presence
Wait until we got initial presence from the client before sending the last items of nodes the JID is subscribed to. Closes #2132.
Diffstat (limited to 'src')
-rw-r--r--src/mod_pubsub.erl22
1 files changed, 13 insertions, 9 deletions
diff --git a/src/mod_pubsub.erl b/src/mod_pubsub.erl
index d3f82c99..efa22305 100644
--- a/src/mod_pubsub.erl
+++ b/src/mod_pubsub.erl
@@ -52,7 +52,7 @@
%% exports for hooks
-export([presence_probe/3, caps_add/3, caps_update/3,
in_subscription/6, out_subscription/4,
- on_user_online/1, on_user_offline/2, remove_user/2,
+ on_self_presence/1, on_user_offline/2, remove_user/2,
disco_local_identity/5, disco_local_features/5,
disco_local_items/5, disco_sm_identity/5,
disco_sm_features/5, disco_sm_items/5,
@@ -296,8 +296,8 @@ init([ServerHost, Opts]) ->
?MODULE, process_commands, IQDisc),
Plugins
end, Hosts),
- ejabberd_hooks:add(c2s_session_opened, ServerHost,
- ?MODULE, on_user_online, 75),
+ ejabberd_hooks:add(c2s_self_presence, ServerHost,
+ ?MODULE, on_self_presence, 75),
ejabberd_hooks:add(c2s_terminated, ServerHost,
?MODULE, on_user_offline, 75),
ejabberd_hooks:add(disco_local_identity, ServerHost,
@@ -579,11 +579,15 @@ presence_probe(_From, _To, _Pid) ->
%% ignore presence_probe from remote contacts, those are handled via caps_add
ok.
--spec on_user_online(ejabberd_c2s:state()) -> ejabberd_c2s:state().
-on_user_online(C2SState) ->
- JID = maps:get(jid, C2SState),
+-spec on_self_presence({presence(), ejabberd_c2s:state()})
+ -> {presence(), ejabberd_c2s:state()}.
+on_self_presence({_, #{pres_last := _}} = Acc) -> % Just a presence update.
+ Acc;
+on_self_presence({#presence{type = available}, #{jid := JID}} = Acc) ->
send_last_items(JID),
- C2SState.
+ Acc;
+on_self_presence(Acc) ->
+ Acc.
-spec on_user_offline(ejabberd_c2s:state(), atom()) -> ejabberd_c2s:state().
on_user_offline(#{jid := JID} = C2SState, _Reason) ->
@@ -769,8 +773,8 @@ terminate(_Reason,
false ->
ok
end,
- ejabberd_hooks:delete(c2s_session_opened, ServerHost,
- ?MODULE, on_user_online, 75),
+ ejabberd_hooks:delete(c2s_self_presence, ServerHost,
+ ?MODULE, on_self_presence, 75),
ejabberd_hooks:delete(c2s_terminated, ServerHost,
?MODULE, on_user_offline, 75),
ejabberd_hooks:delete(disco_local_identity, ServerHost,