Diff

mod_muc_webchat_url/mod_muc_webchat_url.lua @ 3672:b8bcea17ccd6

mod_muc_webchat_url: Advertise the URL to a webchat in disco#info
author Kim Alvefur <zash@zash.se>
date Tue, 17 Sep 2019 17:12:59 +0200
parent 3546:ef5d52ca31bb
child 3673:11ebf1da416b
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_muc_webchat_url/mod_muc_webchat_url.lua	Tue Sep 17 17:12:59 2019 +0200
@@ -0,0 +1,61 @@
+local jid_split = require "util.jid".split;
+module:depends"muc";
+
+local webchat_baseurl = module:get_option_string("muc_webchat_baseurl", nil);
+
+local function get_webchat_url(room)
+	local webchat_url = room._data.webchat_url;
+	if webchat_url then -- explicitly configured
+		return webchat_url;
+	end
+	if not webchat_baseurl then
+		-- no template
+		return nil;
+	end
+	if room:get_hidden() or room:get_members_only() or room:get_password() then
+		-- not a public room
+		return nil;
+	end
+	return (webchat_baseurl:gsub("{(%w+)}", {
+			jid = room.jid,
+			node = select(1, jid_split(room.jid)),
+			host = select(2, jid_split(room.jid)),
+		}));
+end
+
+module:hook("muc-config-form", function(event)
+	local room, form = event.room, event.form;
+	table.insert(form, {
+		name = "muc#roomconfig_webchat_url",
+		type = "text-single",
+		label = "URL where this room can be joined",
+		value = get_webchat_url(room),
+	});
+end);
+
+module:hook("muc-config-submitted", function(event)
+	local room, fields, changed = event.room, event.fields, event.changed;
+	local new = fields["muc#roomconfig_webchat_url"];
+	if new ~= room._data.webchat_url then
+		room._data.webchat_url = new;
+		if type(changed) == "table" then
+			changed["muc#roomconfig_webchat_url"] = true;
+		else
+			event.changed = true;
+		end
+	end
+end);
+
+module:hook("muc-disco#info", function (event)
+	local room, form, formdata = event.room, event.form, event.formdata;
+
+	local webchat_url = get_webchat_url(room);
+	if not webchat_url or webchat_url == "" then
+		return;
+	end
+	table.insert(form, {
+		name = "muc#roominfo_webchat_url",
+	});
+	formdata["muc#roominfo_webchat_url"] = webchat_url;
+end);
+