mod_pubsub_feeds: Track latest timestamp seen in feeds instead of last poll
This should ensure that an entry that has a publish timestmap after the
previously oldest post, but before the time of the last poll check, is
published to the node.
Previously if an entry would be skipped if it was published at 13:00
with a timestamp of 12:30, where the last poll was at 12:45.
For feeds that lack a timestamp, it now looks for the first post that is
not published, assuming that the feed is in reverse chronological order,
then iterates back up from there.
local st = require"util.stanza";
local jid_split = require "util.jid".split;
local jid_bare = require "util.jid".bare;
local is_contact_subscribed = require "core.rostermanager".is_contact_subscribed;
local uuid_generate = require "util.uuid".generate;
local set = require "util.set";
local recently_queried = set.new();
local version_id = uuid_generate();
local disco_id = uuid_generate();
module:hook("iq-result/host/" .. version_id, function (event)
module:log("info", "Stranger " .. event.stanza.attr.from .. " version: " .. tostring(event.stanza));
return true;
end);
module:hook("iq-result/host/" .. disco_id, function (event)
module:log("info", "Stranger " .. event.stanza.attr.from .. " disco: " .. tostring(event.stanza));
return true;
end);
function check_subscribed(event)
local stanza = event.stanza;
local local_user_jid = stanza.attr.to;
local to_user, to_host, to_resource = jid_split(local_user_jid);
local stranger_jid = stanza.attr.from;
if recently_queried:contains(stranger_jid) then
module:log("debug", "Not re-poking " .. stranger_jid);
return nil;
end
local from_jid = jid_bare(stranger_jid);
if to_user and not is_contact_subscribed(to_user, to_host, from_jid) then
if to_resource and stanza.attr.type == "groupchat" then
return nil;
end
recently_queried:add(stranger_jid);
module:send(st.iq({ type = "get", to = stranger_jid, from = to_host, id = version_id }):query("jabber:iq:version"));
module:send(st.iq({ type = "get", to = stranger_jid, from = to_host, id = disco_id }):query("http://jabber.org/protocol/disco#info"));
end
return nil;
end
module:hook("message/bare", check_subscribed, 225);
module:hook("message/full", check_subscribed, 225);
-- Not hooking iqs, as that could turn into infinite loops!