Comparison

mod_throttle_presence/mod_throttle_presence.lua @ 1485:d8c50448d0e7

mod_throttle_presence: Remove timer support, depend on mod_csi to enable/disable. Untested, but the previous version was definitely broken anyway.
author Matthew Wild <mwild1@gmail.com>
date Fri, 15 Aug 2014 19:46:44 +0100
parent 162:fe9c4daee076
child 1488:ba97f9be4f76
comparison
equal deleted inserted replaced
1484:53a3a19d6093 1485:d8c50448d0e7
1 local add_filter = require "util.filters".add_filter; 1 local filters = require "util.filters";
2 local add_task = require "util.timer".add_task; 2 local st = require "util.stanza";
3 3
4 local buffer_seconds = module:get_option_number("flush_presence_seconds"); 4 module:depends("csi");
5 5
6 local function throttle_session(data) 6 local function presence_filter(stanza, session)
7 local session = data.session; 7 local buffer = session.presence_buffer;
8 local buffer, flushing = {}, false; 8 local from = stanza.attr.from;
9 local timer_active = false; 9 if stanza.name ~= "presence" or (stanza.attr.type and stanza.attr.type ~= "unavailable") then
10 local function flush_buffer() 10 local cached_presence = buffer[stanza.attr.from];
11 module:log("debug", "Flushing buffer for %s", session.full_jid); 11 if cached_presence then
12 flushing = true; 12 module:log("debug", "Important stanza for %s from %s, flushing presence", session.full_jid, from);
13 for jid, presence in pairs(buffer) do 13 session.send(cached_presence);
14 session.send(presence); 14 buffer[stanza.attr.from] = nil;
15 end 15 end
16 flushing = false; 16 else
17 module:log("debug", "Buffering presence stanza from %s to %s", stanza.attr.from, session.full_jid);
18 session.buffer[stanza.attr.from] = st.clone(stanza);
19 return nil; -- Drop this stanza (we've stored it for later)
17 end 20 end
18 local function throttle_presence(stanza) 21 return stanza;
19 if stanza.name ~= "presence" or (stanza.attr.type and stanza.attr.type ~= "unavailable") then
20 module:log("debug", "Non-presence stanza for %s: %s", session.full_jid, tostring(stanza));
21 flush_buffer();
22 elseif not flushing then
23 module:log("debug", "Buffering presence stanza from %s to %s", stanza.attr.from, session.full_jid);
24 buffer[stanza.attr.from] = stanza;
25 if not timer_active and buffer_seconds then
26 timer_active = true;
27 add_task(buffer_seconds, flush_buffer);
28 end
29 return nil; -- Drop this stanza (we've stored it for later)
30 end
31 return stanza;
32 end
33 add_filter(session, "stanzas/out", throttle_presence);
34 end 22 end
35 23
24 local function throttle_session(event)
25 local session = event.session;
26 if session.presence_buffer then return; end
27 module:log("debug", "Suppressing presence updates to %s", session.full_jid);
28 session.presence_buffer = {};
29 filters.add_filter(session, "stanzas/out", presence_filter);
30 end
36 31
37 module:hook("resource-bind", throttle_session); 32 local function restore_session(event)
33 local session = event.session;
34 if not session.presence_buffer then return; end
35 filters.remove_filter(session, "stanzas/out", presence_filter);
36 module:log("debug", "Flushing buffer for %s", session.full_jid);
37 for jid, presence in pairs(session.presence_buffer) do
38 session.send(presence);
39 end
40 session.presence_buffer = nil;
41 end
42
43 module:hook("csi-client-inactive", throttle_session);
44 module:hook("csi-client-active", restore_session);