Software /
code /
prosody
Changeset
10036:045209b41b3a 0.11
mod_pep: Handle presence based subscription outside of util.pubsub (fixes #1372)
Subscriptions were updated for each incoming presence stanza from
contacts. Each subscription change triggered a configuration save, which
would filter out the presence based subscriptions and usually end up
replacing the existing data with identical data. With many subscribed
nodes this adds up to a fair bit of IO bound work that is avoided by
keeping them separate.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Thu, 30 May 2019 15:16:56 +0200 |
parents | 10029:2c8f674b9243 |
children | 10037:e01f38acde74 10038:7dd0dddd8e02 |
files | plugins/mod_pep.lua |
diffstat | 1 files changed, 17 insertions(+), 37 deletions(-) [+] |
line wrap: on
line diff
--- a/plugins/mod_pep.lua Mon May 27 19:00:34 2019 +0200 +++ b/plugins/mod_pep.lua Thu May 30 15:16:56 2019 +0200 @@ -90,21 +90,6 @@ 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() @@ -151,7 +136,23 @@ 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); @@ -160,20 +161,6 @@ 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); @@ -233,10 +220,6 @@ 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; @@ -303,12 +286,9 @@ 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:add_subscription(node, recipient, recipient, { presence = true }) then + if service:may(node, recipient, "subscribe") then resend_last_item(recipient, node, service); end end