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
parents
children 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);