Software /
code /
prosody
Comparison
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 |
comparison
equal
deleted
inserted
replaced
6304:ace08821e4ee | 6305:38d82f8ead25 |
---|---|
11 local xmlns_pubsub_owner = "http://jabber.org/protocol/pubsub#owner"; | 11 local xmlns_pubsub_owner = "http://jabber.org/protocol/pubsub#owner"; |
12 | 12 |
13 local lib_pubsub = module:require "pubsub"; | 13 local lib_pubsub = module:require "pubsub"; |
14 local handlers = lib_pubsub.handlers; | 14 local handlers = lib_pubsub.handlers; |
15 local pubsub_error_reply = lib_pubsub.pubsub_error_reply; | 15 local pubsub_error_reply = lib_pubsub.pubsub_error_reply; |
16 | |
17 local empty_set = set_new(); | |
16 | 18 |
17 local services = {}; | 19 local services = {}; |
18 local recipients = {}; | 20 local recipients = {}; |
19 local hash_map = {}; | 21 local hash_map = {}; |
20 | 22 |
220 end | 222 end |
221 end | 223 end |
222 | 224 |
223 local function update_subscriptions(recipient, service_name, nodes) | 225 local function update_subscriptions(recipient, service_name, nodes) |
224 local service = get_pep_service(service_name); | 226 local service = get_pep_service(service_name); |
225 | 227 nodes = nodes or empty_set; |
226 recipients[service_name] = recipients[service_name] or {}; | 228 |
227 nodes = nodes or set_new(); | 229 local service_recipients = recipients[service_name]; |
228 local old = recipients[service_name][recipient]; | 230 if not service_recipients then |
229 | 231 service_recipients = {}; |
230 if old and type(old) == table then | 232 recipients[service_name] = service_recipients; |
231 for node in pairs((old - nodes):items()) do | 233 end |
232 service:remove_subscription(node, recipient, recipient); | 234 |
233 end | 235 local current = service_recipients[recipient]; |
234 end | 236 if not current or type(current) ~= "table" then |
235 | 237 current = empty_set; |
236 for node in nodes:items() do | 238 end |
239 | |
240 if (current == empty_set or current:empty()) and (nodes == empty_set or nodes:empty()) then | |
241 return; | |
242 end | |
243 | |
244 for node in current - nodes do | |
245 service:remove_subscription(node, recipient, recipient); | |
246 end | |
247 | |
248 for node in nodes - current do | |
237 service:add_subscription(node, recipient, recipient); | 249 service:add_subscription(node, recipient, recipient); |
238 resend_last_item(recipient, node, service); | 250 resend_last_item(recipient, node, service); |
239 end | 251 end |
240 recipients[service_name][recipient] = nodes; | 252 |
253 if nodes == empty_set or nodes:empty() then | |
254 nodes = nil; | |
255 end | |
256 | |
257 service_recipients[recipient] = nodes; | |
241 end | 258 end |
242 | 259 |
243 module:hook("presence/bare", function(event) | 260 module:hook("presence/bare", function(event) |
244 -- inbound presence to bare JID recieved | 261 -- inbound presence to bare JID recieved |
245 local origin, stanza = event.origin, event.stanza; | 262 local origin, stanza = event.origin, event.stanza; |