diff options
author | Kim Alvefur <zash@zash.se> | 2019-06-10 12:58:00 +0200 |
---|---|---|
committer | Kim Alvefur <zash@zash.se> | 2019-06-10 12:58:00 +0200 |
commit | efcd7d69026afe4a90e27c94a697644d57c5f764 (patch) | |
tree | 3bea2f1c0d44fe76b9ffcad1a12d34ea64335c05 /plugins | |
parent | d324c430553c7470211b44cb5f3e9cded7c53228 (diff) | |
download | prosody-efcd7d69026afe4a90e27c94a697644d57c5f764.tar.gz prosody-efcd7d69026afe4a90e27c94a697644d57c5f764.zip |
mod_pep: Revert 045209b41b3a, caused a regression
Adding in all presence based subscriptions in the broadcaster caused
resend_last_item() to unintentionally send out more notifications than
it should have.
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/mod_pep.lua | 54 |
1 files changed, 37 insertions, 17 deletions
diff --git a/plugins/mod_pep.lua b/plugins/mod_pep.lua index f60f84c9..7a4aac2b 100644 --- a/plugins/mod_pep.lua +++ b/plugins/mod_pep.lua @@ -90,6 +90,21 @@ local function nodestore(username) return data, err; end function store:set(node, data) + if data then + -- Save the data without subscriptions + local subscribers = {}; + for jid, sub in pairs(data.subscribers) do + if type(sub) ~= "table" or not sub.presence then + subscribers[jid] = sub; + end + end + data = { + name = data.name; + config = data.config; + affiliations = data.affiliations; + subscribers = subscribers; + }; + end return node_config:set(username, node, data); end function store:users() @@ -136,23 +151,7 @@ local function get_broadcaster(username) end message:add_child(item); end - - local broadcast_to = {}; for jid in pairs(jids) do - broadcast_to[jid] = true; - end - - local service_recipients = recipients[username]; - if service_recipients then - local service = services[username]; - for recipient, nodes in pairs(service_recipients) do - if nodes:contains(node) and service:may(node, recipient, "subscribe") then - broadcast_to[recipient] = true; - end - end - end - - for jid in pairs(broadcast_to) do module:log("debug", "Sending notification to %s from %s: %s", jid, user_bare, tostring(item)); message.attr.to = jid; module:send(message); @@ -161,6 +160,20 @@ local function get_broadcaster(username) return simple_broadcast; end +local function on_node_creation(event) + local service = event.service; + local node = event.node; + local username = service.config.pep_username; + + local service_recipients = recipients[username]; + if not service_recipients then return; end + + for recipient, nodes in pairs(service_recipients) do + if nodes:contains(node) then + service:add_subscription(node, recipient, recipient, { presence = true }); + end + end +end function get_pep_service(username) module:log("debug", "get_pep_service(%q)", username); @@ -220,6 +233,10 @@ function get_pep_service(username) return service; end +module:hook("item-added/pep-service", function (event) + local service = event.item.service; + module:hook_object_event(service.events, "node-created", on_node_creation); +end); function handle_pubsub_iq(event) local origin, stanza = event.origin, event.stanza; @@ -286,9 +303,12 @@ local function update_subscriptions(recipient, service_name, nodes) end local service = get_pep_service(service_name); + for node in current - nodes do + service:remove_subscription(node, recipient, recipient); + end for node in nodes - current do - if service:may(node, recipient, "subscribe") then + if service:add_subscription(node, recipient, recipient, { presence = true }) then resend_last_item(recipient, node, service); end end |