Comparison

plugins/muc/muc.lib.lua @ 1754:67b66eec9777

MUC: Added support for room configuration forms, persistence and hidden rooms.
author Waqas Hussain <waqas20@gmail.com>
date Mon, 07 Sep 2009 20:51:59 +0500
parent 1753:a84901db4085
child 1755:1614e8e62ad5
comparison
equal deleted inserted replaced
1753:a84901db4085 1754:67b66eec9777
188 local function room_get_disco_items(self, stanza) end 188 local function room_get_disco_items(self, stanza) end
189 function room_mt:set_subject(current_nick, subject) 189 function room_mt:set_subject(current_nick, subject)
190 -- TODO check nick's authority 190 -- TODO check nick's authority
191 if subject == "" then subject = nil; end 191 if subject == "" then subject = nil; end
192 self._data['subject'] = subject; 192 self._data['subject'] = subject;
193 if self.save then self:save(); end
193 local msg = st.message({type='groupchat', from=current_nick}) 194 local msg = st.message({type='groupchat', from=current_nick})
194 :tag('subject'):text(subject):up(); 195 :tag('subject'):text(subject):up();
195 self:broadcast_message(msg, false); 196 self:broadcast_message(msg, false);
196 return true; 197 return true;
197 end 198 end
302 stanza.attr.to, stanza.attr.from = jid, current_nick; 303 stanza.attr.to, stanza.attr.from = jid, current_nick;
303 self:route_stanza(stanza); 304 self:route_stanza(stanza);
304 elseif type ~= "error" and type ~= "result" then -- recipient not in room 305 elseif type ~= "error" and type ~= "result" then -- recipient not in room
305 origin.send(st.error_reply(stanza, "cancel", "item-not-found", "Recipient not in room")); 306 origin.send(st.error_reply(stanza, "cancel", "item-not-found", "Recipient not in room"));
306 end 307 end
308 end
309 end
310
311 function room_mt:handle_form(origin, stanza)
312 if self:get_affiliation(stanza.attr.from) ~= "owner" then origin.send(st.error_reply(nil, "auth", "forbidden")); return; end
313 if stanza.attr.type == "get" then
314 local title = "Configuration for "..self.jid;
315 origin.send(st.reply(stanza):query("http://jabber.org/protocol/muc#owner")
316 :tag("x", {xmlns='jabber:x:data', type='form'})
317 :tag("title"):text(title):up()
318 :tag("instructions"):text(title):up()
319 :tag("field", {type='hidden', var='FORM_TYPE'}):tag("value"):text("http://jabber.org/protocol/muc#roomconfig"):up():up()
320 :tag("field", {type='boolean', label='Make Room Persistent?', var='muc#roomconfig_persistentroom'})
321 :tag("value"):text(self._data.persistent and "1" or "0"):up()
322 :up()
323 :tag("field", {type='boolean', label='Make Room Publicly Searchable?', var='muc#roomconfig_publicroom'})
324 :tag("value"):text(self._data.hidden and "0" or "1"):up()
325 :up()
326 );
327 elseif stanza.attr.type == "set" then
328 local query = stanza.tags[1];
329 local form;
330 for _, tag in ipairs(query.tags) do if tag.name == "x" and tag.attr.xmlns == "jabber:x:data" then form = tag; break; end end
331 if not form then origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); return; end
332 if form.attr.type == "cancel" then origin.send(st.reply(stanza)); return; end
333 if form.attr.type ~= "submit" then origin.send(st.error_reply(stanza, "cancel", "bad-request")); return; end
334 local fields = {};
335 for _, field in pairs(form.tags) do
336 if field.name == "field" and field.attr.var and field.tags[1].name == "value" and #field.tags[1].tags == 0 then
337 fields[field.attr.var] = field.tags[1][1] or "";
338 end
339 end
340 if fields.FORM_TYPE ~= "http://jabber.org/protocol/muc#roomconfig" then origin.send(st.error_reply(stanza, "cancel", "bad-request")); return; end
341
342 local persistent = fields['muc#roomconfig_persistentroom'];
343 if persistent == "0" or persistent == "false" then persistent = nil; elseif persistent == "1" or persistent == "true" then persistent = true;
344 else origin.send(st.error_reply(stanza, "cancel", "bad-request")); return; end
345 self._data.persistent = persistent;
346 module:log("debug", "persistent=%s", tostring(persistent));
347
348 local public = fields['muc#roomconfig_publicroom'];
349 if public == "0" or public == "false" then public = nil; elseif public == "1" or public == "true" then public = true;
350 else origin.send(st.error_reply(stanza, "cancel", "bad-request")); return; end
351 self._data.hidden = not public and true or nil;
352
353 if self.save then self:save(true); end
354 origin.send(st.reply(stanza));
307 end 355 end
308 end 356 end
309 357
310 function room_mt:handle_to_room(origin, stanza) -- presence changes and groupchat messages, along with disco/etc 358 function room_mt:handle_to_room(origin, stanza) -- presence changes and groupchat messages, along with disco/etc
311 local type = stanza.attr.type; 359 local type = stanza.attr.type;
371 end 419 end
372 end 420 end
373 elseif type == "set" or type == "get" then 421 elseif type == "set" or type == "get" then
374 origin.send(st.error_reply(stanza, "cancel", "bad-request")); 422 origin.send(st.error_reply(stanza, "cancel", "bad-request"));
375 end 423 end
424 elseif xmlns == "http://jabber.org/protocol/muc#owner" and (type == "get" or type == "set") and stanza.tags[1].name == "query" then
425 self:handle_form(origin, stanza);
426 elseif type == "set" or type == "get" then
427 origin.send(st.error_reply(stanza, "cancel", "service-unavailable"));
376 end 428 end
377 elseif stanza.name == "message" and type == "groupchat" then 429 elseif stanza.name == "message" and type == "groupchat" then
378 local from, to = stanza.attr.from, stanza.attr.to; 430 local from, to = stanza.attr.from, stanza.attr.to;
379 local room = jid_bare(to); 431 local room = jid_bare(to);
380 local current_nick = self._jid_nick[from]; 432 local current_nick = self._jid_nick[from];
472 p.attr.to = jid; 524 p.attr.to = jid;
473 self:route_stanza(p); 525 self:route_stanza(p);
474 end 526 end
475 end 527 end
476 end 528 end
529 if room.save then room:save(); end
477 if callback then callback(); end 530 if callback then callback(); end
478 for _, nick in ipairs(modified_nicks) do 531 for _, nick in ipairs(modified_nicks) do
479 p.attr.from = nick; 532 p.attr.from = nick;
480 self:broadcast_except_nick(p, nick); 533 self:broadcast_except_nick(p, nick);
481 end 534 end