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)