Changeset

9237:b86c2e135797

MUC: Add support for storing additional data with MUC affiliations XEP-0045 registration provides examples of registering a nickname and various other details. This also allows modules to store arbitrary private data about an affiliated entity.
author Matthew Wild <mwild1@gmail.com>
date Mon, 03 Sep 2018 12:18:13 +0100
parents 9236:83375ec33619
children 9238:0c1a1172d942
files plugins/muc/mod_muc.lua plugins/muc/muc.lib.lua
diffstat 2 files changed, 16 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/plugins/muc/mod_muc.lua	Sat Sep 01 00:45:51 2018 +0200
+++ b/plugins/muc/mod_muc.lua	Mon Sep 03 12:18:13 2018 +0100
@@ -107,9 +107,9 @@
 	end
 
 	local _set_affiliation = room_mt.set_affiliation;
-	function room_mt:set_affiliation(actor, jid, affiliation, reason)
+	function room_mt:set_affiliation(actor, jid, affiliation, reason, data)
 		if affiliation ~= "owner" and is_admin(jid) then return nil, "modify", "not-acceptable"; end
-		return _set_affiliation(self, actor, jid, affiliation, reason);
+		return _set_affiliation(self, actor, jid, affiliation, reason, data);
 	end
 end
 
--- a/plugins/muc/muc.lib.lua	Sat Sep 01 00:45:51 2018 +0200
+++ b/plugins/muc/muc.lib.lua	Mon Sep 03 12:18:13 2018 +0100
@@ -1198,7 +1198,8 @@
 	end
 end
 
-function room_mt:set_affiliation(actor, jid, affiliation, reason)
+function room_mt:set_affiliation(actor, jid, affiliation, reason, data)
+	module:log("debug", "data is %s", tostring(data));
 	if not actor then return nil, "modify", "not-acceptable"; end;
 
 	local node, host, resource = jid_split(jid);
@@ -1240,6 +1241,13 @@
 
 	-- Set in 'database'
 	self._affiliations[jid] = affiliation;
+	if not affiliation or data == false or (data ~= nil and next(data) == nil) then
+		module:log("debug", "Clearing affiliation data for %s", jid);
+		self._affiliation_data[jid] = nil;
+	elseif data then
+		module:log("debug", "Updating affiliation data for %s", jid);
+		self._affiliation_data[jid] = data;
+	end
 
 	-- Update roles
 	local role = self:get_default_role(affiliation);
@@ -1297,6 +1305,7 @@
 		affiliation = affiliation or "none";
 		reason = reason;
 		previous_affiliation = target_affiliation;
+		data = data and data or nil; -- coerce false to nil
 		in_room = next(occupants_updated) ~= nil;
 	});
 
@@ -1369,6 +1378,7 @@
 		_occupants = {};
 		_data = config or {};
 		_affiliations = {};
+		_affiliation_data = {};
 	}, room_mt);
 end
 
@@ -1389,6 +1399,7 @@
 			jid = self.jid;
 			_data = self._data;
 			_affiliations = self._affiliations;
+			_affiliation_data = self._affiliation_data;
 		};
 	end
 	if live then
@@ -1426,6 +1437,8 @@
 	local occupants = {};
 	local room_name, room_host = jid_split(room_jid);
 
+	room._affiliation_data = frozen._affiliation_data;
+
 	if frozen.jid and frozen._affiliations then
 		room._affiliations = frozen._affiliations;
 	else