]> granicus.if.org Git - ejabberd/commitdiff
mod_pubsub: Send last items on initial presence
authorHolger Weiss <holger@zedat.fu-berlin.de>
Tue, 5 Dec 2017 22:10:12 +0000 (23:10 +0100)
committerChristophe Romain <christophe.romain@process-one.net>
Tue, 12 Dec 2017 11:21:33 +0000 (12:21 +0100)
Wait until we got initial presence from the client before sending the
last items of nodes the JID is subscribed to.

Closes #2132.

src/mod_pubsub.erl

index d3f82c990276d32f636d5df45adf3615e6479586..efa22305cf8032307b34226c3039f4fb7a6387e9 100644 (file)
@@ -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,