mod_muc_hats_api/mod_muc_hats_api.lua
changeset 3951 1f90e333b1d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_muc_hats_api/mod_muc_hats_api.lua	Thu Mar 19 14:39:14 2020 +0000
@@ -0,0 +1,75 @@
+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
+