view mod_muc_hats_api/mod_muc_hats_api.lua @ 5255:001c8fdc91a4

mod_http_oauth2: Add support for the "openid" scope This "openid" scope is there to signal access to the userinfo endpoint, which is needed for OIDC support. We don't actually check this later because the userinfo endpoint only returns info embedded in the token itself, but in the future we may want to check this more carefully.
author Kim Alvefur <zash@zash.se>
date Thu, 16 Mar 2023 17:06:35 +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