plugins/muc/muc.lib.lua
changeset 7418 cbb05b454c13
parent 7417 1b62c89014c4
child 7419 c33a1d6da016
equal deleted inserted replaced
7417:1b62c89014c4 7418:cbb05b454c13
  1302 		_affiliations = {};
  1302 		_affiliations = {};
  1303 	}, room_mt);
  1303 	}, room_mt);
  1304 end
  1304 end
  1305 
  1305 
  1306 function room_mt:freeze(live)
  1306 function room_mt:freeze(live)
  1307 	local frozen = {
  1307 	local frozen, state = {
  1308 		_jid = self.jid;
  1308 		_jid = self.jid;
  1309 		_data = self._data;
  1309 		_data = self._data;
  1310 	};
  1310 	};
  1311 	for user, affiliation in pairs(self._affiliations) do
  1311 	for user, affiliation in pairs(self._affiliations) do
  1312 		frozen[user] = affiliation;
  1312 		frozen[user] = affiliation;
  1313 	end
  1313 	end
  1314 	if live then
  1314 	if live then
       
  1315 		state = {};
  1315 		for nick, occupant in self:each_occupant() do
  1316 		for nick, occupant in self:each_occupant() do
  1316 			frozen[nick] = {
  1317 			state[nick] = {
  1317 				bare_jid = occupant.bare_jid;
  1318 				bare_jid = occupant.bare_jid;
  1318 				role = occupant.role;
  1319 				role = occupant.role;
  1319 				jid = occupant.jid;
  1320 				jid = occupant.jid;
  1320 			}
  1321 			}
  1321 			for jid, presence in occupant:each_session() do
  1322 			for jid, presence in occupant:each_session() do
  1322 				frozen[jid] = st.preserialize(presence);
  1323 				state[jid] = st.preserialize(presence);
  1323 			end
  1324 			end
  1324 		end
  1325 		end
  1325 		local history = self._history;
  1326 		local history = self._history;
  1326 		if history then
  1327 		if history then
  1327 			frozen._last_message = st.preserialize(history[#history].stanza);
  1328 			state._last_message = st.preserialize(history[#history].stanza);
  1328 			frozen._last_message_at = history[#history].timestamp;
  1329 			state._last_message_at = history[#history].timestamp;
  1329 		end
  1330 		end
  1330 	end
  1331 	end
  1331 	return frozen;
  1332 	return frozen, state;
  1332 end
  1333 end
  1333 
  1334 
  1334 function _M.restore_room(frozen)
  1335 function _M.restore_room(frozen, state)
  1335 	-- COMPAT
  1336 	-- COMPAT
  1336 	if frozen.jid and frozen._affiliations then
  1337 	if frozen.jid and frozen._affiliations then
  1337 		local room = _M.new_room(frozen.jid, frozen._data);
  1338 		local room = _M.new_room(frozen.jid, frozen._data);
  1338 		room._affiliations = frozen._affiliations;
  1339 		room._affiliations = frozen._affiliations;
  1339 		return room;
  1340 		return room;
  1352 	local occupants = {};
  1353 	local occupants = {};
  1353 	local occupant_sessions = {};
  1354 	local occupant_sessions = {};
  1354 	local room_name, room_host = jid_split(room_jid);
  1355 	local room_name, room_host = jid_split(room_jid);
  1355 	for jid, data in pairs(frozen) do
  1356 	for jid, data in pairs(frozen) do
  1356 		local node, host, resource = jid_split(jid);
  1357 		local node, host, resource = jid_split(jid);
       
  1358 		if host:sub(1,1) ~= "_" and not resource and type(data) == "string" then
       
  1359 			-- bare jid: affiliation
       
  1360 			room._affiliations[jid] = data;
       
  1361 		end
       
  1362 	end
       
  1363 	for jid, data in pairs(state or frozen) do
       
  1364 		local node, host, resource = jid_split(jid);
  1357 		if node or host:sub(1,1) ~= "_" then
  1365 		if node or host:sub(1,1) ~= "_" then
  1358 			if not resource and type(data) == "string" then
  1366 			if host == room_host and node == room_name and resource and type(data) == "table" then
  1359 				-- bare jid: affiliation
       
  1360 				room._affiliations[jid] = data;
       
  1361 			elseif host == room_host and node == room_name and resource and type(data) == "table" then
       
  1362 				-- full room jid: bare real jid and role
  1367 				-- full room jid: bare real jid and role
  1363 				local bare_jid = data.bare_jid;
  1368 				local bare_jid = data.bare_jid;
  1364 				local	occupant = occupant_lib.new(bare_jid, jid);
  1369 				local	occupant = occupant_lib.new(bare_jid, jid);
  1365 				occupant.jid = data.jid;
  1370 				occupant.jid = data.jid;
  1366 				occupant.role = data.role;
  1371 				occupant.role = data.role;