Software /
code /
prosody
Comparison
plugins/muc/mod_muc.lua @ 6238:b2b523d21891
plugins/muc/mod_muc: Move room persistence to own block
author | daurnimator <quae@daurnimator.com> |
---|---|
date | Tue, 29 Apr 2014 14:24:50 -0400 |
parent | 6237:a58685df9d16 |
child | 6239:a791dd781238 |
comparison
equal
deleted
inserted
replaced
6237:a58685df9d16 | 6238:b2b523d21891 |
---|---|
22 end | 22 end |
23 | 23 |
24 local muclib = module:require "muc"; | 24 local muclib = module:require "muc"; |
25 local muc_new_room = muclib.new_room; | 25 local muc_new_room = muclib.new_room; |
26 room_mt = muclib.room_mt; -- Yes, global. | 26 room_mt = muclib.room_mt; -- Yes, global. |
27 local persistent = module:require "muc/persistent"; | |
28 local jid_split = require "util.jid".split; | 27 local jid_split = require "util.jid".split; |
29 local jid_bare = require "util.jid".bare; | 28 local jid_bare = require "util.jid".bare; |
30 local st = require "util.stanza"; | 29 local st = require "util.stanza"; |
31 local um_is_admin = require "core.usermanager".is_admin; | 30 local um_is_admin = require "core.usermanager".is_admin; |
32 local hosts = prosody.hosts; | 31 local hosts = prosody.hosts; |
33 | 32 |
34 rooms = {}; | 33 rooms = {}; |
35 local rooms = rooms; | 34 local rooms = rooms; |
36 local persistent_rooms_storage = module:open_store("persistent"); | |
37 local persistent_rooms = persistent_rooms_storage:get() or {}; | |
38 local room_configs = module:open_store("config"); | |
39 | 35 |
40 -- Configurable options | 36 -- Configurable options |
41 muclib.set_max_history_length(module:get_option_number("max_history_messages")); | 37 muclib.set_max_history_length(module:get_option_number("max_history_messages")); |
42 | 38 |
43 module:depends("disco"); | 39 module:depends("disco"); |
62 if is_admin(jid) then return nil, "modify", "not-acceptable"; end | 58 if is_admin(jid) then return nil, "modify", "not-acceptable"; end |
63 return _set_affiliation(self, actor, jid, ...); | 59 return _set_affiliation(self, actor, jid, ...); |
64 end | 60 end |
65 end | 61 end |
66 | 62 |
67 local function room_save(room, forced) | |
68 local node = jid_split(room.jid); | |
69 local is_persistent = persistent.get(room); | |
70 persistent_rooms[room.jid] = is_persistent; | |
71 if is_persistent then | |
72 local history = room._data.history; | |
73 room._data.history = nil; | |
74 local data = { | |
75 jid = room.jid; | |
76 _data = room._data; | |
77 _affiliations = room._affiliations; | |
78 }; | |
79 room_configs:set(node, data); | |
80 room._data.history = history; | |
81 elseif forced then | |
82 room_configs:set(node, nil); | |
83 if not next(room._occupants) then -- Room empty | |
84 rooms[room.jid] = nil; | |
85 end | |
86 end | |
87 if forced then persistent_rooms_storage:set(nil, persistent_rooms); end | |
88 end | |
89 | |
90 function create_room(jid) | 63 function create_room(jid) |
91 local room = muc_new_room(jid); | 64 local room = muc_new_room(jid); |
92 room.save = room_save; | |
93 rooms[jid] = room; | 65 rooms[jid] = room; |
94 module:fire_event("muc-room-created", { room = room }); | 66 module:fire_event("muc-room-created", { room = room }); |
95 return room; | 67 return room; |
96 end | 68 end |
97 | 69 |
101 | 73 |
102 function get_room_from_jid(room_jid) | 74 function get_room_from_jid(room_jid) |
103 return rooms[room_jid] | 75 return rooms[room_jid] |
104 end | 76 end |
105 | 77 |
106 local persistent_errors = false; | 78 do -- Persistent rooms |
107 for jid in pairs(persistent_rooms) do | 79 local persistent = module:require "muc/persistent"; |
108 local node = jid_split(jid); | 80 local persistent_rooms_storage = module:open_store("persistent"); |
109 local data = room_configs:get(node); | 81 local persistent_rooms = persistent_rooms_storage:get() or {}; |
110 if data then | 82 local room_configs = module:open_store("config"); |
111 local room = create_room(jid); | 83 |
112 room._data = data._data; | 84 local function room_save(room, forced) |
113 room._affiliations = data._affiliations; | 85 local node = jid_split(room.jid); |
114 else -- missing room data | 86 local is_persistent = persistent.get(room); |
115 persistent_rooms[jid] = nil; | 87 persistent_rooms[room.jid] = is_persistent; |
116 module:log("error", "Missing data for room '%s', removing from persistent room list", jid); | 88 if is_persistent then |
117 persistent_errors = true; | 89 local history = room._data.history; |
118 end | 90 room._data.history = nil; |
119 end | 91 local data = { |
120 if persistent_errors then persistent_rooms_storage:set(nil, persistent_rooms); end | 92 jid = room.jid; |
93 _data = room._data; | |
94 _affiliations = room._affiliations; | |
95 }; | |
96 room_configs:set(node, data); | |
97 room._data.history = history; | |
98 elseif forced then | |
99 room_configs:set(node, nil); | |
100 if not next(room._occupants) then -- Room empty | |
101 rooms[room.jid] = nil; | |
102 end | |
103 end | |
104 if forced then persistent_rooms_storage:set(nil, persistent_rooms); end | |
105 end | |
106 | |
107 -- When room is created, over-ride 'save' method | |
108 module:hook("muc-room-created", function(event) | |
109 event.room.save = room_save; | |
110 end); | |
111 | |
112 -- Automatically destroy empty non-persistent rooms | |
113 module:hook("muc-occupant-left",function(event) | |
114 local room = event.room | |
115 if not room:has_occupant() and not persistent.get(room) then -- empty, non-persistent room | |
116 module:fire_event("muc-room-destroyed", { room = room }); | |
117 end | |
118 end); | |
119 | |
120 local persistent_errors = false; | |
121 for jid in pairs(persistent_rooms) do | |
122 local node = jid_split(jid); | |
123 local data = room_configs:get(node); | |
124 if data then | |
125 local room = create_room(jid); | |
126 room._data = data._data; | |
127 room._affiliations = data._affiliations; | |
128 else -- missing room data | |
129 persistent_rooms[jid] = nil; | |
130 module:log("error", "Missing data for room '%s', removing from persistent room list", jid); | |
131 persistent_errors = true; | |
132 end | |
133 end | |
134 if persistent_errors then persistent_rooms_storage:set(nil, persistent_rooms); end | |
135 end | |
121 | 136 |
122 module:hook("host-disco-items", function(event) | 137 module:hook("host-disco-items", function(event) |
123 local reply = event.reply; | 138 local reply = event.reply; |
124 module:log("debug", "host-disco-items called"); | 139 module:log("debug", "host-disco-items called"); |
125 for jid, room in pairs(rooms) do | 140 for jid, room in pairs(rooms) do |
131 | 146 |
132 module:hook("muc-room-destroyed",function(event) | 147 module:hook("muc-room-destroyed",function(event) |
133 local room = event.room | 148 local room = event.room |
134 forget_room(room.jid) | 149 forget_room(room.jid) |
135 end) | 150 end) |
136 | |
137 module:hook("muc-occupant-left",function(event) | |
138 local room = event.room | |
139 if not room:has_occupant() and not persistent.get(room) then -- empty, non-persistent room | |
140 module:fire_event("muc-room-destroyed", { room = room }); | |
141 end | |
142 end); | |
143 | 151 |
144 -- Watch presence to create rooms | 152 -- Watch presence to create rooms |
145 local function attempt_room_creation(event) | 153 local function attempt_room_creation(event) |
146 local origin, stanza = event.origin, event.stanza; | 154 local origin, stanza = event.origin, event.stanza; |
147 local room_jid = jid_bare(stanza.attr.to); | 155 local room_jid = jid_bare(stanza.attr.to); |