view mod_muc_webchat_url/mod_muc_webchat_url.lua @ 5787:e79f9dec35c0

mod_c2s_conn_throttle: Reduce log level from error->info Our general policy is that "error" should never be triggerable by remote entities, and that it is always about something that requires admin intervention. This satisfies neither condition. The "warn" level can be used for unexpected events/behaviour triggered by remote entities, and this could qualify. However I don't think failed auth attempts are unexpected enough. I selected "info" because it is what is also used for other notable session lifecycle events.
author Matthew Wild <mwild1@gmail.com>
date Thu, 07 Dec 2023 15:46:50 +0000
parents dcafddc31b1c
children
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",
		datatype = "xs:anyURI",
		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);