Software /
code /
prosody-modules
Diff
mod_muc_offline_delivery/mod_muc_offline_delivery.lua @ 4339:3b7847c9bd26
mod_muc_deliver_offline: New module for delivery of MUC messages to offline users
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Fri, 15 Jan 2021 18:57:12 +0000 |
child | 4768:8bd36bba2292 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_muc_offline_delivery/mod_muc_offline_delivery.lua Fri Jan 15 18:57:12 2021 +0000 @@ -0,0 +1,35 @@ +local st = require "util.stanza"; + +module:add_item("muc-registration-field", { + name = "{http://tigase.org/protocol/muc}offline"; + type = "boolean"; + label = "Receive messages while not connected to the room"; + value = false; +}); + +module:hook("muc-registration-submitted", function (event) + local deliver_offline = event.submitted_data["{http://tigase.org/protocol/muc}offline"] or nil; + event.affiliation_data.offline_delivery = deliver_offline; +end); + +module:hook("muc-add-history", function (event) + module:log("debug", "Broadcasting message to offline occupants..."); + local sent = 0; + local room = event.room; + for jid, affiliation, data in room:each_affiliation() do --luacheck: ignore 213/affiliation + local reserved_nickname = data and data.reserved_nickname; + module:log("debug", "Affiliated: %s, %s: %s", jid, reserved_nickname, data and data.offline_delivery); + if reserved_nickname and data.offline_delivery then + local is_absent = not room:get_occupant_by_nick(room.jid.."/"..reserved_nickname); + if is_absent then + local msg = st.clone(event.stanza); + msg.attr.to = jid; + module:send(msg); + sent = sent + 1; + end + end + end + if sent > 0 then + module:log("debug", "Sent message to %d offline occupants", sent); + end +end);