Software /
code /
prosody-modules
File
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 |
line wrap: on
line source
local filters = require "util.filters"; local st = require "util.stanza"; module:depends("csi"); local function presence_filter(stanza, session) local buffer = session.presence_buffer; local from = stanza.attr.from; if stanza.name ~= "presence" or (stanza.attr.type and stanza.attr.type ~= "unavailable") then local cached_presence = buffer[stanza.attr.from]; if cached_presence then module:log("debug", "Important stanza for %s from %s, flushing presence", session.full_jid, from); session.send(cached_presence); buffer[stanza.attr.from] = nil; end else module:log("debug", "Buffering presence stanza from %s to %s", stanza.attr.from, session.full_jid); session.buffer[stanza.attr.from] = st.clone(stanza); return nil; -- Drop this stanza (we've stored it for later) end return stanza; end local function throttle_session(event) local session = event.session; if session.presence_buffer then return; end module:log("debug", "Suppressing presence updates to %s", session.full_jid); session.presence_buffer = {}; filters.add_filter(session, "stanzas/out", presence_filter); end local function restore_session(event) local session = event.session; if not session.presence_buffer then return; end filters.remove_filter(session, "stanzas/out", presence_filter); module:log("debug", "Flushing buffer for %s", session.full_jid); for jid, presence in pairs(session.presence_buffer) do session.send(presence); end session.presence_buffer = nil; end module:hook("csi-client-inactive", throttle_session); module:hook("csi-client-active", restore_session);