Software /
code /
prosody
Diff
plugins/mod_pep_plus.lua @ 6305:38d82f8ead25
mod_pep_plus: Only broadcast newly added subscriptions
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Tue, 08 Jul 2014 07:32:45 +0200 |
parent | 6264:12a083299bb7 |
child | 6432:388786af0dd2 |
line wrap: on
line diff
--- a/plugins/mod_pep_plus.lua Fri Jul 04 23:05:27 2014 +0200 +++ b/plugins/mod_pep_plus.lua Tue Jul 08 07:32:45 2014 +0200 @@ -14,6 +14,8 @@ local handlers = lib_pubsub.handlers; local pubsub_error_reply = lib_pubsub.pubsub_error_reply; +local empty_set = set_new(); + local services = {}; local recipients = {}; local hash_map = {}; @@ -222,22 +224,37 @@ local function update_subscriptions(recipient, service_name, nodes) local service = get_pep_service(service_name); - - recipients[service_name] = recipients[service_name] or {}; - nodes = nodes or set_new(); - local old = recipients[service_name][recipient]; + nodes = nodes or empty_set; - if old and type(old) == table then - for node in pairs((old - nodes):items()) do - service:remove_subscription(node, recipient, recipient); - end + local service_recipients = recipients[service_name]; + if not service_recipients then + service_recipients = {}; + recipients[service_name] = service_recipients; end - for node in nodes:items() do + local current = service_recipients[recipient]; + if not current or type(current) ~= "table" then + current = empty_set; + end + + if (current == empty_set or current:empty()) and (nodes == empty_set or nodes:empty()) then + return; + end + + for node in current - nodes do + service:remove_subscription(node, recipient, recipient); + end + + for node in nodes - current do service:add_subscription(node, recipient, recipient); resend_last_item(recipient, node, service); end - recipients[service_name][recipient] = nodes; + + if nodes == empty_set or nodes:empty() then + nodes = nil; + end + + service_recipients[recipient] = nodes; end module:hook("presence/bare", function(event)