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; |