Software /
code /
prosody
Comparison
plugins/muc/mod_muc.lua @ 9050:f5c43e829d93
MUC: Add new iteration methods, all_rooms/live_rooms to eventually replace each_room
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Tue, 17 Jul 2018 10:29:16 +0100 |
parent | 9049:5870a0a6d4b6 |
child | 9051:68386f7b9fc9 |
comparison
equal
deleted
inserted
replaced
9049:5870a0a6d4b6 | 9050:f5c43e829d93 |
---|---|
11 -- create_room(jid) -> room | 11 -- create_room(jid) -> room |
12 -- track_room(room) | 12 -- track_room(room) |
13 -- delete_room(room) | 13 -- delete_room(room) |
14 -- forget_room(room) | 14 -- forget_room(room) |
15 -- get_room_from_jid(jid) -> room | 15 -- get_room_from_jid(jid) -> room |
16 -- each_room(live_only) -> () -> room | 16 -- each_room(live_only) -> () -> room [DEPRECATED] |
17 -- all_rooms() -> room | |
18 -- live_rooms() -> room | |
17 -- shutdown_component() | 19 -- shutdown_component() |
18 | 20 |
19 if module:get_host_type() ~= "component" then | 21 if module:get_host_type() ~= "component" then |
20 error("MUC should be loaded as a component, please see https://prosody.im/doc/components", 0); | 22 error("MUC should be loaded as a component, please see https://prosody.im/doc/components", 0); |
21 end | 23 end |
218 persistent_rooms:set(nil, room.jid, nil); | 220 persistent_rooms:set(nil, room.jid, nil); |
219 room_items_cache[room.jid] = nil; | 221 room_items_cache[room.jid] = nil; |
220 end | 222 end |
221 | 223 |
222 function module.unload() | 224 function module.unload() |
223 for room in rooms:values() do | 225 for room in live_rooms() do |
224 room:save(nil, true); | 226 room:save(nil, true); |
225 forget_room(room); | 227 forget_room(room); |
226 end | 228 end |
227 end | 229 end |
228 | 230 |
247 room = room; | 249 room = room; |
248 }); | 250 }); |
249 return track_room(room); | 251 return track_room(room); |
250 end | 252 end |
251 | 253 |
252 function each_room(live_only) | 254 function all_rooms() |
253 if live_only then | |
254 return rooms:values(); | |
255 end | |
256 return coroutine.wrap(function () | 255 return coroutine.wrap(function () |
257 local seen = {}; -- Don't iterate over persistent rooms twice | 256 local seen = {}; -- Don't iterate over persistent rooms twice |
258 for room in rooms:values() do | 257 for room in live_rooms() do |
259 coroutine.yield(room); | 258 coroutine.yield(room); |
260 seen[room.jid] = true; | 259 seen[room.jid] = true; |
261 end | 260 end |
262 local all_persistent_rooms, err = persistent_rooms_storage:get(nil); | 261 local all_persistent_rooms, err = persistent_rooms_storage:get(nil); |
263 if not all_persistent_rooms then | 262 if not all_persistent_rooms then |
278 end | 277 end |
279 end | 278 end |
280 end); | 279 end); |
281 end | 280 end |
282 | 281 |
282 function live_rooms() | |
283 return rooms:values(); | |
284 end | |
285 | |
286 function each_room(live_only) | |
287 if live_only then | |
288 return live_rooms(); | |
289 end | |
290 return all_rooms(); | |
291 end | |
292 | |
283 module:hook("host-disco-items", function(event) | 293 module:hook("host-disco-items", function(event) |
284 local reply = event.reply; | 294 local reply = event.reply; |
285 module:log("debug", "host-disco-items called"); | 295 module:log("debug", "host-disco-items called"); |
286 if next(room_items_cache) ~= nil then | 296 if next(room_items_cache) ~= nil then |
287 for jid, room_name in pairs(room_items_cache) do | 297 for jid, room_name in pairs(room_items_cache) do |
288 reply:tag("item", { jid = jid, name = room_name }):up(); | 298 reply:tag("item", { jid = jid, name = room_name }):up(); |
289 end | 299 end |
290 else | 300 else |
291 for room in each_room() do | 301 for room in all_rooms() do |
292 if not room:get_hidden() then | 302 if not room:get_hidden() then |
293 local jid, room_name = room.jid, room:get_name(); | 303 local jid, room_name = room.jid, room:get_name(); |
294 room_items_cache[jid] = room_name; | 304 room_items_cache[jid] = room_name; |
295 reply:tag("item", { jid = jid, name = room_name }):up(); | 305 reply:tag("item", { jid = jid, name = room_name }):up(); |
296 end | 306 end |
431 return room[method](room, origin, stanza); | 441 return room[method](room, origin, stanza); |
432 end, -2) | 442 end, -2) |
433 end | 443 end |
434 | 444 |
435 function shutdown_component() | 445 function shutdown_component() |
436 for room in each_room(true) do | 446 for room in live_rooms() do |
437 room:save(nil, true); | 447 room:save(nil, true); |
438 end | 448 end |
439 end | 449 end |
440 module:hook_global("server-stopping", shutdown_component, -300); | 450 module:hook_global("server-stopping", shutdown_component, -300); |
441 | 451 |
454 { name = "FORM_TYPE", type = "hidden", value = "http://prosody.im/protocol/muc#destroy" }; | 464 { name = "FORM_TYPE", type = "hidden", value = "http://prosody.im/protocol/muc#destroy" }; |
455 { name = "rooms", type = "list-multi", required = true, label = "Rooms to destroy:"}; | 465 { name = "rooms", type = "list-multi", required = true, label = "Rooms to destroy:"}; |
456 }; | 466 }; |
457 | 467 |
458 local destroy_rooms_handler = adhoc_initial(destroy_rooms_layout, function() | 468 local destroy_rooms_handler = adhoc_initial(destroy_rooms_layout, function() |
459 return { rooms = array.collect(each_room()):pluck("jid"):sort(); }; | 469 return { rooms = array.collect(all_rooms()):pluck("jid"):sort(); }; |
460 end, function(fields, errors) | 470 end, function(fields, errors) |
461 if errors then | 471 if errors then |
462 local errmsg = {}; | 472 local errmsg = {}; |
463 for field, err in pairs(errors) do | 473 for field, err in pairs(errors) do |
464 errmsg[#errmsg + 1] = field .. ": " .. err; | 474 errmsg[#errmsg + 1] = field .. ": " .. err; |