view mod_muc_hats_api/mod_muc_hats_api.lua @ 5518:d87d0e4a8516

mod_http_oauth2: Validate the OpenID 'prompt' parameter Without support for affecting the login and consent procedure, it seems sensible to inform the client that they can't change anything with this parameter.
author Kim Alvefur <zash@zash.se>
date Mon, 05 Jun 2023 22:19:17 +0200
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