]> granicus.if.org Git - ejabberd/commitdiff
avoid sending duplicated events
authorChristophe Romain <christophe.romain@process-one.net>
Mon, 5 May 2014 15:35:38 +0000 (17:35 +0200)
committerChristophe Romain <christophe.romain@process-one.net>
Mon, 5 May 2014 15:53:50 +0000 (17:53 +0200)
src/mod_pubsub.erl
src/mod_pubsub_odbc.erl

index 1d8bd143c1833b3810ed1467b4d9fd2bc15fa5f1..d1d75de8ff8db4a931b35829aee8ba2e112b5b9e 100644 (file)
@@ -827,7 +827,7 @@ send_loop(State) ->
                                                      end;
                                                  (_) -> ok
                                              end,
-                                             Subscriptions)
+                                             lists:usort(Subscriptions))
                        end,
                        State#state.plugins),
          if not State#state.ignore_pep_from_offline ->
@@ -1166,22 +1166,21 @@ disco_items(Host, Node, From) ->
 %% presence hooks handling functions
 %%
 
-caps_update(#jid{luser = U, lserver = S, lresource = R} = From, To, _Features) ->
-    Pid = ejabberd_sm:get_session_pid(U, S, R),
-    presence_probe(From, To, Pid).
-
-presence_probe(#jid{luser = User, lserver = Server, lresource = Resource} = JID,
-  JID, Pid) ->
-    presence(Server, {presence, JID, Pid}),
-    presence(Server, {presence, User, Server, [Resource], JID});
-presence_probe(#jid{luser = User, lserver = Server},
-  #jid{luser = User, lserver = Server}, _Pid) ->
-    %% ignore presence_probe from other ressources for the current user
-    %% this way, we do not send duplicated last items if user already connected with other clients
+caps_update(#jid{luser = U, lserver = S, lresource = R}, #jid{lserver = Host} = JID, _Features)
+       when Host =/= S ->
+    presence(Host, {presence, U, S, [R], JID});
+caps_update(From, To, _Feature) ->
+    ok.
+
+presence_probe(#jid{luser = U, lserver = S, lresource = R} = JID, JID, Pid) ->
+    presence(S, {presence, JID, Pid}),
+    presence(S, {presence, U, S, [R], JID});
+presence_probe(#jid{luser = U, lserver = S}, #jid{luser = U, lserver = S}, _Pid) ->
+    %% ignore presence_probe from my other ressources
+    %% to not get duplicated last items
     ok;
-presence_probe(#jid{luser = User, lserver = Server, lresource = Resource},
-  #jid{lserver = Host} = JID, _Pid) ->
-    presence(Host, {presence, User, Server, [Resource], JID}).
+presence_probe(#jid{luser = U, lserver = S, lresource = R} = From, #jid{lserver = Host} = JID, _Pid) ->
+    presence(Host, {presence, U, S, [R], JID}).
 
 presence(ServerHost, Presence) ->
     SendLoop = case
index 498c81bd38213fda11a499a9461cacd2906b9d5a..9e98e740d18b5b7008fa3e64cdd8dfa178745130 100644 (file)
@@ -475,7 +475,7 @@ send_loop(State) ->
                                                      end;
                                                  (_) -> ok
                                              end,
-                                             Subscriptions)
+                                             lists:usort(Subscriptions))
                        end,
                        State#state.plugins),
          if not State#state.ignore_pep_from_offline ->
@@ -817,22 +817,21 @@ disco_items(Host, Node, From) ->
 %% presence hooks handling functions
 %%
 
-caps_update(#jid{luser = U, lserver = S, lresource = R} = From, To, _Features) ->
-    Pid = ejabberd_sm:get_session_pid(U, S, R),
-    presence_probe(From, To, Pid).
-
-presence_probe(#jid{luser = User, lserver = Server, lresource = Resource} = JID,
-  JID, Pid) ->
-    presence(Server, {presence, JID, Pid}),
-    presence(Server, {presence, User, Server, [Resource], JID});
-presence_probe(#jid{luser = User, lserver = Server},
-  #jid{luser = User, lserver = Server}, _Pid) ->
-    %% ignore presence_probe from other ressources for the current user
-    %% this way, we do not send duplicated last items if user already connected with other clients
+caps_update(#jid{luser = U, lserver = S, lresource = R}, #jid{lserver = Host} = JID, _Features)
+       when Host =/= S ->
+    presence(Host, {presence, U, S, [R], JID});
+caps_update(From, To, _Feature) ->
+    ok.
+
+presence_probe(#jid{luser = U, lserver = S, lresource = R} = JID, JID, Pid) ->
+    presence(S, {presence, JID, Pid}),
+    presence(S, {presence, U, S, [R], JID});
+presence_probe(#jid{luser = U, lserver = S}, #jid{luser = U, lserver = S}, _Pid) ->
+    %% ignore presence_probe from my other ressources
+    %% to not get duplicated last items
     ok;
-presence_probe(#jid{luser = User, lserver = Server, lresource = Resource},
-  #jid{lserver = Host} = JID, _Pid) ->
-    presence(Host, {presence, User, Server, [Resource], JID}).
+presence_probe(#jid{luser = U, lserver = S, lresource = R} = From, #jid{lserver = Host} = JID, _Pid) ->
+    presence(Host, {presence, U, S, [R], JID}).
 
 presence(ServerHost, Presence) ->
     SendLoop = case