Comparison

plugins/muc/mod_muc.lua @ 6109:566aba0482b6

plugins/muc/mod_muc: Refactor to use new methods available
author daurnimator <quae@daurnimator.com>
date Tue, 18 Mar 2014 18:55:52 -0400
parent 6091:3a1c39b31497
child 6110:d007b3c49078
comparison
equal deleted inserted replaced
6108:aae7bc9d6e93 6109:566aba0482b6
104 end 104 end
105 module:fire_event("muc-room-created", { room = room }); 105 module:fire_event("muc-room-created", { room = room });
106 return room; 106 return room;
107 end 107 end
108 108
109 function forget_room(jid)
110 rooms[jid] = nil;
111 end
112
113 function get_room_from_jid(room_jid)
114 return rooms[room_jid]
115 end
116
109 local persistent_errors = false; 117 local persistent_errors = false;
110 for jid in pairs(persistent_rooms) do 118 for jid in pairs(persistent_rooms) do
111 local node = jid_split(jid); 119 local node = jid_split(jid);
112 local data = room_configs:get(node); 120 local data = room_configs:get(node);
113 if data then 121 if data then
123 if persistent_errors then persistent_rooms_storage:set(nil, persistent_rooms); end 131 if persistent_errors then persistent_rooms_storage:set(nil, persistent_rooms); end
124 132
125 local host_room = muc_new_room(muc_host); 133 local host_room = muc_new_room(muc_host);
126 host_room.route_stanza = room_route_stanza; 134 host_room.route_stanza = room_route_stanza;
127 host_room.save = room_save; 135 host_room.save = room_save;
136 rooms[muc_host] = host_room;
128 137
129 module:hook("host-disco-items", function(event) 138 module:hook("host-disco-items", function(event)
130 local reply = event.reply; 139 local reply = event.reply;
131 module:log("debug", "host-disco-items called"); 140 module:log("debug", "host-disco-items called");
132 for jid, room in pairs(rooms) do 141 for jid, room in pairs(rooms) do
134 reply:tag("item", {jid=jid, name=room:get_name()}):up(); 143 reply:tag("item", {jid=jid, name=room:get_name()}):up();
135 end 144 end
136 end 145 end
137 end); 146 end);
138 147
139 function stanza_handler(event) 148 module:hook("muc-room-destroyed",function(event)
149 local room = event.room
150 forget_room(room.jid)
151 end)
152
153 module:hook("muc-occupant-left",function(event)
154 local room = event.room
155 if not next(room._occupants) and not persistent_rooms[room.jid] then -- empty, non-persistent room
156 module:fire_event("muc-room-destroyed", { room = room });
157 end
158 end);
159
160 -- Watch presence to create rooms
161 local function attempt_room_creation(event)
140 local origin, stanza = event.origin, event.stanza; 162 local origin, stanza = event.origin, event.stanza;
141 local bare = jid_bare(stanza.attr.to); 163 local room_jid = jid_bare(stanza.attr.to);
142 local room = rooms[bare]; 164 if stanza.attr.type == nil and
143 if not room then 165 get_room_from_jid(room_jid) == nil and
144 if stanza.name ~= "presence" then 166 (
145 origin.send(st.error_reply(stanza, "cancel", "item-not-found")); 167 not(restrict_room_creation) or
168 is_admin(stanza.attr.from) or
169 (
170 restrict_room_creation == "local" and
171 select(2, jid_split(stanza.attr.from)) == module.host:gsub("^[^%.]+%.", "")
172 )
173 ) then
174 create_room(room_jid);
175 end
176 end
177 module:hook("presence/full", attempt_room_creation, -1)
178 module:hook("presence/bare", attempt_room_creation, -1)
179 module:hook("presence/host", attempt_room_creation, -1)
180
181 for event_name, method in pairs {
182 -- Normal room interactions
183 ["iq-get/bare/http://jabber.org/protocol/disco#info:query"] = "handle_disco_info_get_query" ;
184 ["iq-get/bare/http://jabber.org/protocol/disco#items:query"] = "handle_disco_items_get_query" ;
185 ["iq-set/bare/http://jabber.org/protocol/muc#admin:item"] = "handle_admin_item_set_command" ;
186 ["iq-get/bare/http://jabber.org/protocol/muc#admin:item"] = "handle_admin_item_get_command" ;
187 ["iq-set/bare/http://jabber.org/protocol/muc#owner:query"] = "handle_owner_query_set_to_room" ;
188 ["iq-get/bare/http://jabber.org/protocol/muc#owner:query"] = "handle_owner_query_get_to_room" ;
189 ["message/bare"] = "handle_message_to_room" ;
190 ["presence/bare"] = "handle_presence_to_room" ;
191 -- Host room
192 ["iq-get/host/http://jabber.org/protocol/disco#info:query"] = "handle_disco_info_get_query" ;
193 ["iq-get/host/http://jabber.org/protocol/disco#items:query"] = "handle_disco_items_get_query" ;
194 ["iq-set/host/http://jabber.org/protocol/muc#admin:item"] = "handle_admin_item_set_command" ;
195 ["iq-get/host/http://jabber.org/protocol/muc#admin:item"] = "handle_admin_item_get_command" ;
196 ["iq-set/host/http://jabber.org/protocol/muc#owner:query"] = "handle_owner_query_set_to_room" ;
197 ["iq-get/host/http://jabber.org/protocol/muc#owner:query"] = "handle_owner_query_get_to_room" ;
198 ["message/host"] = "handle_message_to_room" ;
199 ["presence/host"] = "handle_presence_to_room" ;
200 -- Direct to occupant (normal rooms and host room)
201 ["presence/full"] = "handle_presence_to_occupant" ;
202 ["iq/full"] = "handle_iq_to_occupant" ;
203 ["message/full"] = "handle_message_to_occupant" ;
204 } do
205 module:hook(event_name, function (event)
206 local origin, stanza = event.origin, event.stanza;
207 local room = get_room_from_jid(jid_bare(stanza.attr.to))
208 if room == nil then
209 origin.send(st.error_reply(stanza, "cancel", "not-allowed"));
146 return true; 210 return true;
147 end 211 end
148 if not(restrict_room_creation) or 212 return room[method](room, origin, stanza);
149 is_admin(stanza.attr.from) or 213 end, -2)
150 (restrict_room_creation == "local" and select(2, jid_split(stanza.attr.from)) == module.host:gsub("^[^%.]+%.", "")) then 214 end
151 room = create_room(bare); 215
152 end
153 end
154 if room then
155 room:handle_stanza(origin, stanza);
156 if not next(room._occupants) and not persistent_rooms[room.jid] then -- empty, non-persistent room
157 module:fire_event("muc-room-destroyed", { room = room });
158 rooms[bare] = nil; -- discard room
159 end
160 else
161 origin.send(st.error_reply(stanza, "cancel", "not-allowed"));
162 end
163 return true;
164 end
165 module:hook("iq/bare", stanza_handler, -1);
166 module:hook("message/bare", stanza_handler, -1);
167 module:hook("presence/bare", stanza_handler, -1);
168 module:hook("iq/full", stanza_handler, -1);
169 module:hook("message/full", stanza_handler, -1);
170 module:hook("presence/full", stanza_handler, -1);
171
172 local function handle_to_domain(event)
173 local origin, stanza = event.origin, event.stanza;
174 local type = stanza.attr.type;
175 if type == "error" then return; end
176 host_room:handle_stanza(origin, stanza);
177 -- origin.send(st.error_reply(stanza, "cancel", "service-unavailable", "The muc server doesn't deal with messages and presence directed at it"));
178 return true;
179 end
180 module:hook("message/host", handle_to_domain, -1);
181 module:hook("presence/host", handle_to_domain, -1);
182 216
183 hosts[module.host].send = function(stanza) -- FIXME do a generic fix 217 hosts[module.host].send = function(stanza) -- FIXME do a generic fix
184 if stanza.attr.type == "result" or stanza.attr.type == "error" then 218 if stanza.attr.type == "result" or stanza.attr.type == "error" then
185 module:send(stanza); 219 module:send(stanza);
186 else error("component.send only supports result and error stanzas at the moment"); end 220 else error("component.send only supports result and error stanzas at the moment"); end