Comparison

plugins/mod_pep.lua @ 10045:6714578cfd6e 0.11

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.
author Kim Alvefur <zash@zash.se>
date Mon, 10 Jun 2019 12:58:00 +0200
parent 10036:045209b41b3a
child 10046:0bc291a5734a
child 10520:225fade2ab4d
comparison
equal deleted inserted replaced
10038:7dd0dddd8e02 10045:6714578cfd6e
88 }; 88 };
89 end 89 end
90 return data, err; 90 return data, err;
91 end 91 end
92 function store:set(node, data) 92 function store:set(node, data)
93 if data then
94 -- Save the data without subscriptions
95 local subscribers = {};
96 for jid, sub in pairs(data.subscribers) do
97 if type(sub) ~= "table" or not sub.presence then
98 subscribers[jid] = sub;
99 end
100 end
101 data = {
102 name = data.name;
103 config = data.config;
104 affiliations = data.affiliations;
105 subscribers = subscribers;
106 };
107 end
93 return node_config:set(username, node, data); 108 return node_config:set(username, node, data);
94 end 109 end
95 function store:users() 110 function store:users()
96 return pairs(known_nodes:get(username) or {}); 111 return pairs(known_nodes:get(username) or {});
97 end 112 end
134 item:maptags(function () return nil; end); 149 item:maptags(function () return nil; end);
135 end 150 end
136 end 151 end
137 message:add_child(item); 152 message:add_child(item);
138 end 153 end
139
140 local broadcast_to = {};
141 for jid in pairs(jids) do 154 for jid in pairs(jids) do
142 broadcast_to[jid] = true;
143 end
144
145 local service_recipients = recipients[username];
146 if service_recipients then
147 local service = services[username];
148 for recipient, nodes in pairs(service_recipients) do
149 if nodes:contains(node) and service:may(node, recipient, "subscribe") then
150 broadcast_to[recipient] = true;
151 end
152 end
153 end
154
155 for jid in pairs(broadcast_to) do
156 module:log("debug", "Sending notification to %s from %s: %s", jid, user_bare, tostring(item)); 155 module:log("debug", "Sending notification to %s from %s: %s", jid, user_bare, tostring(item));
157 message.attr.to = jid; 156 message.attr.to = jid;
158 module:send(message); 157 module:send(message);
159 end 158 end
160 end 159 end
161 return simple_broadcast; 160 return simple_broadcast;
162 end 161 end
163 162
163 local function on_node_creation(event)
164 local service = event.service;
165 local node = event.node;
166 local username = service.config.pep_username;
167
168 local service_recipients = recipients[username];
169 if not service_recipients then return; end
170
171 for recipient, nodes in pairs(service_recipients) do
172 if nodes:contains(node) then
173 service:add_subscription(node, recipient, recipient, { presence = true });
174 end
175 end
176 end
164 177
165 function get_pep_service(username) 178 function get_pep_service(username)
166 module:log("debug", "get_pep_service(%q)", username); 179 module:log("debug", "get_pep_service(%q)", username);
167 local user_bare = jid_join(username, host); 180 local user_bare = jid_join(username, host);
168 local service = services[username]; 181 local service = services[username];
218 services[username] = service; 231 services[username] = service;
219 module:add_item("pep-service", { service = service, jid = user_bare }); 232 module:add_item("pep-service", { service = service, jid = user_bare });
220 return service; 233 return service;
221 end 234 end
222 235
236 module:hook("item-added/pep-service", function (event)
237 local service = event.item.service;
238 module:hook_object_event(service.events, "node-created", on_node_creation);
239 end);
223 240
224 function handle_pubsub_iq(event) 241 function handle_pubsub_iq(event)
225 local origin, stanza = event.origin, event.stanza; 242 local origin, stanza = event.origin, event.stanza;
226 local service_name = origin.username; 243 local service_name = origin.username;
227 if stanza.attr.to ~= nil then 244 if stanza.attr.to ~= nil then
284 if (current == empty_set or current:empty()) and (nodes == empty_set or nodes:empty()) then 301 if (current == empty_set or current:empty()) and (nodes == empty_set or nodes:empty()) then
285 return; 302 return;
286 end 303 end
287 304
288 local service = get_pep_service(service_name); 305 local service = get_pep_service(service_name);
306 for node in current - nodes do
307 service:remove_subscription(node, recipient, recipient);
308 end
289 309
290 for node in nodes - current do 310 for node in nodes - current do
291 if service:may(node, recipient, "subscribe") then 311 if service:add_subscription(node, recipient, recipient, { presence = true }) then
292 resend_last_item(recipient, node, service); 312 resend_last_item(recipient, node, service);
293 end 313 end
294 end 314 end
295 315
296 if nodes == empty_set or nodes:empty() then 316 if nodes == empty_set or nodes:empty() then