Software / code / prosody-modules
Comparison
mod_throttle_presence/mod_throttle_presence.lua @ 162:fe9c4daee076
mod_throttle_presence: Buffer up presence for up to flush_presence_seconds and send latest presence stanzas for each contact at once
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Thu, 03 Jun 2010 03:02:33 +0100 |
| child | 1485:d8c50448d0e7 |
comparison
equal
deleted
inserted
replaced
| 161:fda7faee7677 | 162:fe9c4daee076 |
|---|---|
| 1 local add_filter = require "util.filters".add_filter; | |
| 2 local add_task = require "util.timer".add_task; | |
| 3 | |
| 4 local buffer_seconds = module:get_option_number("flush_presence_seconds"); | |
| 5 | |
| 6 local function throttle_session(data) | |
| 7 local session = data.session; | |
| 8 local buffer, flushing = {}, false; | |
| 9 local timer_active = false; | |
| 10 local function flush_buffer() | |
| 11 module:log("debug", "Flushing buffer for %s", session.full_jid); | |
| 12 flushing = true; | |
| 13 for jid, presence in pairs(buffer) do | |
| 14 session.send(presence); | |
| 15 end | |
| 16 flushing = false; | |
| 17 end | |
| 18 local function throttle_presence(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 | |
| 35 | |
| 36 | |
| 37 module:hook("resource-bind", throttle_session); |