Comparison

plugins/muc/mod_muc.lua @ 5691:18a115beeebe

mod_muc: Utilize mod_disco, instead of reimplementing disco handling
author Florian Zeitz <florob@babelmonkeys.de>
date Wed, 05 Jun 2013 00:04:44 +0200
parent 5659:9f9de8078164
child 5692:24e7e58155d8
comparison
equal deleted inserted replaced
5690:630e7224a65f 5691:18a115beeebe
37 local persistent_rooms = persistent_rooms_storage:get() or {}; 37 local persistent_rooms = persistent_rooms_storage:get() or {};
38 local room_configs = module:open_store("config"); 38 local room_configs = module:open_store("config");
39 39
40 -- Configurable options 40 -- Configurable options
41 muclib.set_max_history_length(module:get_option_number("max_history_messages")); 41 muclib.set_max_history_length(module:get_option_number("max_history_messages"));
42
43 module:depends("disco");
44 module:add_identity("conference", "text", muc_name);
45 module:add_feature("http://jabber.org/protocol/muc");
42 46
43 local function is_admin(jid) 47 local function is_admin(jid)
44 return um_is_admin(jid, module.host); 48 return um_is_admin(jid, module.host);
45 end 49 end
46 50
105 109
106 local host_room = muc_new_room(muc_host); 110 local host_room = muc_new_room(muc_host);
107 host_room.route_stanza = room_route_stanza; 111 host_room.route_stanza = room_route_stanza;
108 host_room.save = room_save; 112 host_room.save = room_save;
109 113
110 local function get_disco_info(stanza) 114 module:hook("host-disco-items", function(event)
111 return st.iq({type='result', id=stanza.attr.id, from=muc_host, to=stanza.attr.from}):query("http://jabber.org/protocol/disco#info") 115 local reply = event.reply;
112 :tag("identity", {category='conference', type='text', name=muc_name}):up() 116 module:log("debug", "host-disco-items called");
113 :tag("feature", {var="http://jabber.org/protocol/muc"}); -- TODO cache disco reply
114 end
115 local function get_disco_items(stanza)
116 local reply = st.iq({type='result', id=stanza.attr.id, from=muc_host, to=stanza.attr.from}):query("http://jabber.org/protocol/disco#items");
117 for jid, room in pairs(rooms) do 117 for jid, room in pairs(rooms) do
118 if not room:get_hidden() then 118 if not room:get_hidden() then
119 reply:tag("item", {jid=jid, name=room:get_name()}):up(); 119 reply:tag("item", {jid=jid, name=room:get_name()}):up();
120 end 120 end
121 end 121 end
122 return reply; -- TODO cache disco reply 122 end);
123 end
124 123
125 local function handle_to_domain(event) 124 local function handle_to_domain(event)
126 local origin, stanza = event.origin, event.stanza; 125 local origin, stanza = event.origin, event.stanza;
127 local type = stanza.attr.type; 126 local type = stanza.attr.type;
128 if type == "error" or type == "result" then return; end 127 if type == "error" or type == "result" then return; end
129 if stanza.name == "iq" and type == "get" then 128 if stanza.name == "iq" and type == "get" then
130 local xmlns = stanza.tags[1].attr.xmlns; 129 local xmlns = stanza.tags[1].attr.xmlns;
131 local node = stanza.tags[1].attr.node; 130 local node = stanza.tags[1].attr.node;
132 if xmlns == "http://jabber.org/protocol/disco#info" and not node then 131 if xmlns == "http://jabber.org/protocol/muc#unique" then
133 origin.send(get_disco_info(stanza));
134 elseif xmlns == "http://jabber.org/protocol/disco#items" and not node then
135 origin.send(get_disco_items(stanza));
136 elseif xmlns == "http://jabber.org/protocol/muc#unique" then
137 origin.send(st.reply(stanza):tag("unique", {xmlns = xmlns}):text(uuid_gen())); -- FIXME Random UUIDs can theoretically have collisions 132 origin.send(st.reply(stanza):tag("unique", {xmlns = xmlns}):text(uuid_gen())); -- FIXME Random UUIDs can theoretically have collisions
138 else 133 else
139 origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); -- TODO disco/etc 134 origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); -- TODO disco/etc
140 end 135 end
141 else 136 else