view mod_muc_webchat_url/mod_muc_webchat_url.lua @ 4203:c4002aae4ad3

mod_s2s_keepalive: Use timestamp as iq @id RFC 6120 implies that the id attribute must be unique within a stream. This should fix problems with remote servers that enforce uniqueness and don't answer duplicated ids. If it doesn't do that, then at least you can get a guesstimate at round-trip time from the difference between the result iq stanza and the timestamp it was logged without having to go look for when it was sent, or needing to keep state.
author Kim Alvefur <zash@zash.se>
date Wed, 14 Oct 2020 18:02:10 +0200
parents 776ff0875e35
children dcafddc31b1c
line wrap: on
line source

local jid_split = require "util.jid".split;
module:depends"muc";

local webchat_baseurl = module:get_option_string("muc_webchat_baseurl", nil);

local function get_default_url(room)
	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

local function get_webchat_url(room)
	local webchat_url = room._data.webchat_url;
	if webchat_url then -- explicitly configured
		return webchat_url;
	end
	return get_default_url(room);
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 ~= get_webchat_url(room) then
		if new == get_default_url(room) then
			room._data.webchat_url = nil;
		else
			room._data.webchat_url = new;
		end
		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);