Mercurial > prosody-modules
changeset 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 |
parents | 0227fb4d1b40 |
children | 7cd3b7ec59e9 |
files | mod_muc_offline_delivery/.mod_muc_offline_delivery.lua.swp mod_muc_offline_delivery/README.md mod_muc_offline_delivery/mod_muc_offline_delivery.lua |
diffstat | 3 files changed, 77 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_muc_offline_delivery/README.md Fri Jan 15 18:57:12 2021 +0000 @@ -0,0 +1,42 @@ +--- +labels: +- 'Stage-Alpha' +summary: 'Support for sending MUC messages to offline users' +... + +Introduction +============ + +This module implements support for sending messages in a MUC to affiliated users +who are not in the room. This is a custom extension by Tigase to allow push notifications +from MUCs to users who are not currently connected. + +It is planned that this will evolve to a XEP in the near future. + +The protocol is described below. It is implemented in the Siskin client for iOS. + +Details +======= + +Add to modules_enabled under your MUC component (i.e. **not** the global modules_enabled +list). There are no configuration options. + +Compatibility +============= + +Requires Prosody trunk (0.12) for the API introduced in commit 336cba957c88. + +Protocol +======== + +To enable this feature, a client must fetch the registration form from a MUC, +as per XEP-0045. The form will include the usual field for nickname (this is +required), and also a boolean field named `{http://tigase.org/protocol/muc}offline`. + +Submit the form with that field set to true, and the MUC will forward messages +to your bare JID when you are not connected to the room. Two things to note: + +1. This will achieve nothing unless your server is capable of handling these + messages correctly. +2. Messages are only sent when you are not in the room. This includes other + resources of the same account.
--- /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);