249 end |
249 end |
250 room_miss(); |
250 room_miss(); |
251 return restore_room(room_jid); |
251 return restore_room(room_jid); |
252 end |
252 end |
253 |
253 |
254 function create_room(room_jid, config) |
254 local function set_room_defaults(room, lang) |
255 local exists = get_room_from_jid(room_jid); |
|
256 if exists then |
|
257 return nil, "room-exists"; |
|
258 end |
|
259 local room = muclib.new_room(room_jid, config); |
|
260 module:fire_event("muc-room-created", { |
|
261 room = room; |
|
262 }); |
|
263 return track_room(room); |
|
264 end |
|
265 |
|
266 function all_rooms() |
|
267 return coroutine.wrap(function () |
|
268 local seen = {}; -- Don't iterate over persistent rooms twice |
|
269 for room in live_rooms() do |
|
270 coroutine.yield(room); |
|
271 seen[room.jid] = true; |
|
272 end |
|
273 local all_persistent_rooms, err = persistent_rooms_storage:get(nil); |
|
274 if not all_persistent_rooms then |
|
275 if err then |
|
276 module:log("error", "Error loading list of persistent rooms, only rooms live in memory were iterated over"); |
|
277 module:log("debug", "%s", debug.traceback(err)); |
|
278 end |
|
279 return nil; |
|
280 end |
|
281 for room_jid in pairs(all_persistent_rooms) do |
|
282 if not seen[room_jid] then |
|
283 local room = restore_room(room_jid); |
|
284 if room then |
|
285 coroutine.yield(room); |
|
286 else |
|
287 module:log("error", "Missing data for room '%s', omitting from iteration", room_jid); |
|
288 end |
|
289 end |
|
290 end |
|
291 end); |
|
292 end |
|
293 |
|
294 function live_rooms() |
|
295 return rooms:values(); |
|
296 end |
|
297 |
|
298 function each_room(live_only) |
|
299 if live_only then |
|
300 return live_rooms(); |
|
301 end |
|
302 return all_rooms(); |
|
303 end |
|
304 |
|
305 module:hook("host-disco-items", function(event) |
|
306 local reply = event.reply; |
|
307 module:log("debug", "host-disco-items called"); |
|
308 if next(room_items_cache) ~= nil then |
|
309 for jid, room_name in pairs(room_items_cache) do |
|
310 reply:tag("item", { jid = jid, name = room_name }):up(); |
|
311 end |
|
312 else |
|
313 for room in all_rooms() do |
|
314 if not room:get_hidden() then |
|
315 local jid, room_name = room.jid, room:get_name(); |
|
316 room_items_cache[jid] = room_name; |
|
317 reply:tag("item", { jid = jid, name = room_name }):up(); |
|
318 end |
|
319 end |
|
320 end |
|
321 end); |
|
322 |
|
323 module:hook("muc-room-pre-create", function (event) |
|
324 local room = event.room; |
|
325 room:set_public(module:get_option_boolean("muc_room_default_public", false)); |
255 room:set_public(module:get_option_boolean("muc_room_default_public", false)); |
326 room:set_persistent(module:get_option_boolean("muc_room_default_persistent", room:get_persistent())); |
256 room:set_persistent(module:get_option_boolean("muc_room_default_persistent", room:get_persistent())); |
327 room:set_members_only(module:get_option_boolean("muc_room_default_members_only", room:get_members_only())); |
257 room:set_members_only(module:get_option_boolean("muc_room_default_members_only", room:get_members_only())); |
328 room:set_allow_member_invites(module:get_option_boolean("muc_room_default_allow_member_invites", |
258 room:set_allow_member_invites(module:get_option_boolean("muc_room_default_allow_member_invites", |
329 room:get_allow_member_invites())); |
259 room:get_allow_member_invites())); |
330 room:set_moderated(module:get_option_boolean("muc_room_default_moderated", room:get_moderated())); |
260 room:set_moderated(module:get_option_boolean("muc_room_default_moderated", room:get_moderated())); |
331 room:set_whois(module:get_option_boolean("muc_room_default_public_jids", |
261 room:set_whois(module:get_option_boolean("muc_room_default_public_jids", |
332 room:get_whois() == "anyone") and "anyone" or "moderators"); |
262 room:get_whois() == "anyone") and "anyone" or "moderators"); |
333 room:set_changesubject(module:get_option_boolean("muc_room_default_change_subject", room:get_changesubject())); |
263 room:set_changesubject(module:get_option_boolean("muc_room_default_change_subject", room:get_changesubject())); |
334 room:set_historylength(module:get_option_number("muc_room_default_history_length", room:get_historylength())); |
264 room:set_historylength(module:get_option_number("muc_room_default_history_length", room:get_historylength())); |
335 room:set_language(event.stanza.attr["xml:lang"] or module:get_option_string("muc_room_default_language")); |
265 room:set_language(lang or module:get_option_string("muc_room_default_language")); |
|
266 end |
|
267 |
|
268 function create_room(room_jid, config) |
|
269 local exists = get_room_from_jid(room_jid); |
|
270 if exists then |
|
271 return nil, "room-exists"; |
|
272 end |
|
273 local room = muclib.new_room(room_jid, config); |
|
274 if not config then |
|
275 set_room_defaults(room); |
|
276 end |
|
277 module:fire_event("muc-room-created", { |
|
278 room = room; |
|
279 }); |
|
280 return track_room(room); |
|
281 end |
|
282 |
|
283 function all_rooms() |
|
284 return coroutine.wrap(function () |
|
285 local seen = {}; -- Don't iterate over persistent rooms twice |
|
286 for room in live_rooms() do |
|
287 coroutine.yield(room); |
|
288 seen[room.jid] = true; |
|
289 end |
|
290 local all_persistent_rooms, err = persistent_rooms_storage:get(nil); |
|
291 if not all_persistent_rooms then |
|
292 if err then |
|
293 module:log("error", "Error loading list of persistent rooms, only rooms live in memory were iterated over"); |
|
294 module:log("debug", "%s", debug.traceback(err)); |
|
295 end |
|
296 return nil; |
|
297 end |
|
298 for room_jid in pairs(all_persistent_rooms) do |
|
299 if not seen[room_jid] then |
|
300 local room = restore_room(room_jid); |
|
301 if room then |
|
302 coroutine.yield(room); |
|
303 else |
|
304 module:log("error", "Missing data for room '%s', omitting from iteration", room_jid); |
|
305 end |
|
306 end |
|
307 end |
|
308 end); |
|
309 end |
|
310 |
|
311 function live_rooms() |
|
312 return rooms:values(); |
|
313 end |
|
314 |
|
315 function each_room(live_only) |
|
316 if live_only then |
|
317 return live_rooms(); |
|
318 end |
|
319 return all_rooms(); |
|
320 end |
|
321 |
|
322 module:hook("host-disco-items", function(event) |
|
323 local reply = event.reply; |
|
324 module:log("debug", "host-disco-items called"); |
|
325 if next(room_items_cache) ~= nil then |
|
326 for jid, room_name in pairs(room_items_cache) do |
|
327 reply:tag("item", { jid = jid, name = room_name }):up(); |
|
328 end |
|
329 else |
|
330 for room in all_rooms() do |
|
331 if not room:get_hidden() then |
|
332 local jid, room_name = room.jid, room:get_name(); |
|
333 room_items_cache[jid] = room_name; |
|
334 reply:tag("item", { jid = jid, name = room_name }):up(); |
|
335 end |
|
336 end |
|
337 end |
|
338 end); |
|
339 |
|
340 module:hook("muc-room-pre-create", function (event) |
|
341 set_room_defaults(event.room, event.stanza.attr["xml:lang"]); |
336 end, 1); |
342 end, 1); |
337 |
343 |
338 module:hook("muc-room-pre-create", function(event) |
344 module:hook("muc-room-pre-create", function(event) |
339 local origin, stanza = event.origin, event.stanza; |
345 local origin, stanza = event.origin, event.stanza; |
340 if not track_room(event.room) then |
346 if not track_room(event.room) then |