view mod_muc_hats_api/mod_muc_hats_api.lua @ 4433:0e3f5f70a51d

mod_auth_ccert/README: Add certificate purpose conifg to example Thanks debacle By default Prosody validates all client certificates as if they were server certificates, for historical reasons, from a time when you couldn't get certificates with the client purpose.
author Kim Alvefur <zash@zash.se>
date Sat, 06 Feb 2021 22:15:08 +0100
parents 1f90e333b1d8
children
line wrap: on
line source

local mod_muc = module:depends("muc");

function add_user_hat(user_jid, room_jid, hat_id, attachment)
	local room = mod_muc.get_room_from_jid(room_jid);
	if not room then
		return nil, "item-not-found", "no such room";
	end
	local user_aff = room:get_affiliation(user_jid);
	if not user_aff then
		return nil, "item-not-found", "user not affiliated with room";
	end
	local aff_data = room:get_affiliation_data(user_jid) or {};
	local hats = aff_data.hats;
	if not hats then
		hats = {};
		aff_data.hats = hats;
	end

	hats[hat_id] = {
		active = attachment.active;
		required = attachment.required;
		title = attachment.title;
	};

	local ok, err = room:set_affiliation(true, user_jid, user_aff, nil, aff_data);
	if not ok then
		return nil, err;
	end
	return true;
end

function remove_user_hat(user_jid, room_jid, hat_id)
	local room = mod_muc.get_room_from_jid(room_jid);
	if not room then
		return nil, "item-not-found", "no such room";
	end
	local user_aff = room:get_affiliation(user_jid);
	if not user_aff then
		return nil, "item-not-found", "user not affiliated with room";
	end
	local aff_data = room:get_affiliation_data(user_jid);
	local hats = aff_data and aff_data.hats;
	if not hats then
		return true;
	end

	hats[hat_id] = nil;

	local ok, err = room:set_affiliation(true, user_jid, user_aff, nil, aff_data);
	if not ok then
		return nil, err;
	end
	return true;
end

function set_user_hats(user_jid, room_jid, new_hats)
	local room = mod_muc.get_room_from_jid(room_jid);
	if not room then
		return nil, "item-not-found", "no such room";
	end
	local user_aff = room:get_affiliation(user_jid);
	if not user_aff then
		return nil, "item-not-found", "user not affiliated with room";
	end
	local aff_data = room:get_affiliation_data(user_jid) or {};

	aff_data.hats = new_hats;

	local ok, err = room:set_affiliation(true, user_jid, user_aff, nil, aff_data);
	if not ok then
		return nil, err;
	end
	return true;
end