Mercurial > prosody-hg
comparison plugins/muc/mod_muc.lua @ 7371:d5ba0dec0c95
MUC: Cache public rooms and their names to speed up disco#items
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Mon, 18 Apr 2016 19:19:33 +0200 |
| parents | 0ebc7ff1fff5 |
| children | b2d7e04eb922 |
comparison
equal
deleted
inserted
replaced
| 7370:0ebc7ff1fff5 | 7371:d5ba0dec0c95 |
|---|---|
| 93 | 93 |
| 94 local persistent_rooms_storage = module:open_store("persistent"); | 94 local persistent_rooms_storage = module:open_store("persistent"); |
| 95 local persistent_rooms = module:open_store("persistent", "map"); | 95 local persistent_rooms = module:open_store("persistent", "map"); |
| 96 local room_configs = module:open_store("config"); | 96 local room_configs = module:open_store("config"); |
| 97 | 97 |
| 98 local room_items_cache = {}; | |
| 99 | |
| 98 local function room_save(room, forced) | 100 local function room_save(room, forced) |
| 99 local node = jid_split(room.jid); | 101 local node = jid_split(room.jid); |
| 100 local is_persistent = persistent.get(room); | 102 local is_persistent = persistent.get(room); |
| 103 room_items_cache[room.jid] = room:get_public() and room:get_name() or nil; | |
| 101 if is_persistent or forced then | 104 if is_persistent or forced then |
| 102 persistent_rooms:set(nil, room.jid, true); | 105 persistent_rooms:set(nil, room.jid, true); |
| 103 local data = room:freeze(forced); | 106 local data = room:freeze(forced); |
| 104 return room_configs:set(node, data); | 107 return room_configs:set(node, data); |
| 105 else | 108 else |
| 145 | 148 |
| 146 function delete_room(room) | 149 function delete_room(room) |
| 147 module:log("debug", "Deleting %s", room); | 150 module:log("debug", "Deleting %s", room); |
| 148 room_configs:set(jid_split(room.jid), nil); | 151 room_configs:set(jid_split(room.jid), nil); |
| 149 persistent_rooms:set(nil, room.jid, nil); | 152 persistent_rooms:set(nil, room.jid, nil); |
| 153 room_items_cache[room.jid] = nil; | |
| 150 end | 154 end |
| 151 | 155 |
| 152 function module.unload() | 156 function module.unload() |
| 153 for room in rooms:values() do | 157 for room in rooms:values() do |
| 154 room:save(true); | 158 room:save(true); |
| 189 end | 193 end |
| 190 | 194 |
| 191 module:hook("host-disco-items", function(event) | 195 module:hook("host-disco-items", function(event) |
| 192 local reply = event.reply; | 196 local reply = event.reply; |
| 193 module:log("debug", "host-disco-items called"); | 197 module:log("debug", "host-disco-items called"); |
| 194 for room in each_room() do | 198 if next(room_items_cache) ~= nil then |
| 195 if not room:get_hidden() then | 199 for jid, room_name in pairs(room_items_cache) do |
| 196 reply:tag("item", {jid=room.jid, name=room:get_name()}):up(); | 200 reply:tag("item", { jid = jid, name = room_name }):up(); |
| 201 end | |
| 202 else | |
| 203 for room in each_room() do | |
| 204 if not room:get_hidden() then | |
| 205 local jid, room_name = room.jid, room:get_name(); | |
| 206 room_items_cache[jid] = name; | |
| 207 reply:tag("item", { jid = jid, name = room_name }):up(); | |
| 208 end | |
| 197 end | 209 end |
| 198 end | 210 end |
| 199 end); | 211 end); |
| 200 | 212 |
| 201 module:hook("muc-room-pre-create", function(event) | 213 module:hook("muc-room-pre-create", function(event) |
