--- /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
+