view mod_muc_gateway_optimize/mod_muc_gateway_optimize.lua @ 6214:cc5c0f1dc89b

mod_muc_anonymize_moderation_actions: Fix mentioning Virtualhost for MUC, Compatibility section and License. diff --git a/mod_muc_anonymize_moderation_actions/README.md b/mod_muc_anonymize_moderation_actions/README.md --- a/mod_muc_anonymize_moderation_actions/README.md +++ b/mod_muc_anonymize_moderation_actions/README.md @@ -1,8 +1,10 @@ -<!-- -SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/> -SPDX-License-Identifier: AGPL-3.0-only ---> -# mod_muc_anonymize_moderation_actions +--- +labels: +- 'Stage-Alpha' +summary: Anonymize moderator actions for participants +--- + +## Introduction This modules allows to anonymize affiliation and role changes in MUC rooms. @@ -11,13 +13,10 @@ When the feature is enabled, when a mode This is particularly usefull to prevent some revenge when a moderator bans someone. -This module is under AGPL-3.0 license. - -It was tested on Prosody 0.12.x. ## Configuration -Just enable the module on your MUC VirtualHost. +Just enable the module on your MUC Component. The feature will be accessible throught the room configuration form. You can tweak the position of the settings in the MUC configuration form using `anonymize_moderation_actions_form_position`. @@ -26,7 +25,20 @@ This value will be passed as priority fo By default, the field will be between muc#roomconfig_changesubject and muc#roomconfig_moderatedroom (default value is `78`). ``` lua -VirtualHost "muc.example.com" +Component "muc.example.com" "muc" modules_enabled = { "muc_anonymize_moderation_actions" } anonymize_moderation_actions_form_position = 96 ``` + +## Compatibility + + ------ ---------------------- + trunk Works as of 25-05-12 + 0.13 Works + 0.12 Works + ------ ---------------------- + +### License + +SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/> +SPDX-License-Identifier: AGPL-3.0-only
author Menel <menel@snikket.de>
date Mon, 12 May 2025 10:42:26 +0200
parents 23c4c61a1068
children
line wrap: on
line source

local jid = require("util.jid")
local mod_muc = module:depends("muc")

local gateway_hosts = module:get_option_array("gateway_hosts", {})

function optimize(remote_host, event)
	local stanza = event.stanza
	module:log("debug", "optimize presence event destined for " .. remote_host)

	local muc_x = stanza:get_child("x", "http://jabber.org/protocol/muc#user")
	if muc_x then
		for status in muc_x:childtags("status") do
			if status.attr.status == "110" then
				module:log("debug", "optimize delivering 110")
				-- Always deliver self-presence
				return
			end
		end
	end

	local bare_jid = jid.bare(stanza.attr.to)
	local room = mod_muc.get_room_from_jid(jid.bare(stanza.attr.from))
	if not room then return end
	for nick, occupant in room:each_occupant() do
		local occupant_host = jid.host(occupant.bare_jid)
		if occupant_host == remote_host then
			-- This is the "first" occupant from the host
			-- which is the only one we will route non-110
			-- presence to
			if occupant.bare_jid == bare_jid then
				module:log("debug", "optimize found first occupant, so route")
				return
			else
				module:log("debug", "optimize found non-first occupant, so drop")
				return true
			end
		end
	end
	-- If we get here we found no occupants for this host
	module:log("debug", "optimize found no occupants for host " .. remote_host)
end

-- Note this will only affect gateways over s2s for now
module:hook("route/remote", function (event)
	if event.stanza.name ~= "presence" then
		return
	end

	local remote_host = jid.host(event.stanza.attr.to)
	for _, gateway_host in pairs(gateway_hosts) do
		if remote_host == gateway_host then
			return optimize(remote_host, event)
		end
	end
end, 1000)