view plugins/muc/vcard.lib.lua @ 13752:49bbdc22846d 13.0

certmanager: Add more debug logging around cert indexing Currently it's not obvious which directories have been indexed (especially when the resulting index is empty), or why certain files have been skipped.
author Matthew Wild <mwild1@gmail.com>
date Mon, 24 Feb 2025 17:48:58 +0000
parents 31f8fd2bcab9
children f4e16e6265e6
line wrap: on
line source

local mod_vcard = module:depends("vcard");

local jid = require "prosody.util.jid";
local st = require "prosody.util.stanza";

-- This must be the same event that mod_vcard hooks
local vcard_event = "iq/bare/vcard-temp:vCard";
local advertise_hashes = module:get_option("muc_avatar_advertise_hashes");

--luacheck: ignore 113/get_room_from_jid

local function get_avatar_hash(room)
	if room.avatar_hash then return room.avatar_hash; end

	local room_node = jid.split(room.jid);
	local hash = mod_vcard.get_avatar_hash(room_node);
	room.avatar_hash = hash;

	return hash;
end

local function send_avatar_hash(room, to)
	local hash = get_avatar_hash(room);
	if not hash and to then return; end -- Don't announce when no avatar

	local presence_vcard = st.presence({to = to, from = room.jid})
		:tag("x", { xmlns = "vcard-temp:x:update" })
			:tag("photo"):text(hash):up();

	if to == nil then
		if not advertise_hashes or advertise_hashes == "presence" then
			room:broadcast_message(presence_vcard);
		end
		if not advertise_hashes or advertise_hashes == "message" then
			room:broadcast_message(st.message({ from = room.jid, type = "groupchat" })
				:tag("x", { xmlns = "http://jabber.org/protocol/muc#user" })
					:tag("status", { code = "104" }));
		end

	else
		module:send(presence_vcard);
	end
end

module:hook(vcard_event, function (event)
	local stanza = event.stanza;
	local to = stanza.attr.to;

	if stanza.attr.type ~= "set" then
		return;
	end

	local room = get_room_from_jid(to);
	if not room then
		return;
	end

	local sender_affiliation = room:get_affiliation(stanza.attr.from);
	if sender_affiliation == "owner" then
		event.allow_vcard_modification = true;
	end
end, 10);

if advertise_hashes ~= "none" then
	module:hook("muc-occupant-joined", function (event)
		send_avatar_hash(event.room, event.stanza.attr.from);
	end);
	module:hook("vcard-updated", function (event)
		local room = get_room_from_jid(event.stanza.attr.to);
		send_avatar_hash(room, nil);
	end);
end

module:hook("muc-disco#info", function (event)
	event.reply:tag("feature", { var = "vcard-temp" }):up();

	table.insert(event.form, {
			name = "muc#roominfo_avatarhash",
			type = "text-multi",
		});
	event.formdata["muc#roominfo_avatarhash"] = get_avatar_hash(event.room);
end);