mod_presence: Re-probe for contacts presence after outgoing 'subscribed' (fixes ...
[prosody.git] / plugins / mod_presence.lua
index 20d0adf0504182e32ac7b28dfd33c1bc033a0acd..a5b4f282a4da5635cedf7b81f7e86ac5c9bc17de 100644 (file)
@@ -9,7 +9,7 @@
 local log = module._log;
 
 local require = require;
-local pairs, ipairs = pairs, ipairs;
+local pairs = pairs;
 local t_concat, t_insert = table.concat, table.insert;
 local s_find = string.find;
 local tonumber = tonumber;
@@ -18,7 +18,10 @@ local core_post_stanza = prosody.core_post_stanza;
 local st = require "util.stanza";
 local jid_split = require "util.jid".split;
 local jid_bare = require "util.jid".bare;
-local hosts = hosts;
+local datetime = require "util.datetime";
+local hosts = prosody.hosts;
+local bare_sessions = prosody.bare_sessions;
+local full_sessions = prosody.full_sessions;
 local NULL = {};
 
 local rostermanager = require "core.rostermanager";
@@ -135,6 +138,7 @@ function handle_normal_presence(origin, stanza)
                end
        else
                origin.presence = stanza;
+               stanza:tag("delay", { xmlns = "urn:xmpp:delay", from = host, stamp = datetime.datetime() }):up();
                if origin.priority ~= priority then
                        origin.priority = priority;
                        recalc_resource_map(user);
@@ -197,6 +201,7 @@ function handle_outbound_presence_subscriptions_and_probes(origin, stanza, from_
                end
                core_post_stanza(origin, stanza);
                send_presence_of_available_resources(node, host, to_bare, origin);
+               core_post_stanza(origin, st.presence({ type = "probe", from = from_bare, to = to_bare }));
        elseif stanza.attr.type == "unsubscribed" then
                -- 1. send unavailable
                -- 2. route stanza
@@ -342,7 +347,7 @@ module:hook("presence/full", function(data)
 end);
 module:hook("presence/host", function(data)
        -- inbound presence to the host
-       local origin, stanza = data.origin, data.stanza;
+       local stanza = data.stanza;
        
        local from_bare = jid_bare(stanza.attr.from);
        local t = stanza.attr.type;