From 6b6973b0a3766f2f651cae3f5a567b6625cd935c Mon Sep 17 00:00:00 2001 From: Waqas Hussain Date: Sun, 23 Nov 2008 03:32:20 +0500 Subject: Added discohelper --- util/discohelper.lua | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 util/discohelper.lua (limited to 'util/discohelper.lua') diff --git a/util/discohelper.lua b/util/discohelper.lua new file mode 100644 index 00000000..4ac8f227 --- /dev/null +++ b/util/discohelper.lua @@ -0,0 +1,79 @@ + +local t_insert = table.insert; +local jid_split = require "util.jid".split; +local ipairs = ipairs; +local st = require "util.stanza"; + +module "discohelper"; + +local function addDiscoItemsHandler(self, jid, func) + if self.item_handlers[jid] then + t_insert(self.item_handlers[jid], func); + else + self.item_handlers[jid] = {func}; + end +end + +local function addDiscoInfoHandler(self, jid, func) + if self.info_handlers[jid] then + t_insert(self.info_handlers[jid], func); + else + self.info_handlers[jid] = {func}; + end +end + +local function handle(self, stanza) + if stanza.name == "iq" and stanza.tags[1].name == "query" then + local query = stanza.tags[1]; + local to = stanza.attr.to; + local from = stanza.attr.from + local node = query.attr.node or ""; + local to_node, to_host = jid_split(to); + + local reply = st.reply(stanza):query(query.attr.xmlns); + local handlers; + if query.attr.xmlns == "http://jabber.org/protocol/disco#info" then -- select handler set + handlers = self.info_handlers; + elseif query.attr.xmlns == "http://jabber.org/protocol/disco#items" then + handlers = self.item_handlers; + end + local handler = handlers[to]; -- get the handler + if not handler then -- if not found then use default handler + if to_node then + handler = handlers["*defaultnode"]; + else + handler = handlers["*defaulthost"]; + end + end + local found; -- to keep track of any handlers found + if handler then + for _, h in ipairs(handler) do + if h(reply, to, from, node) then found = true; end + end + end + if to_node then -- handlers which get called always + handler = handlers["*node"]; + else + handler = handlers["*host"]; + end + if handler then -- call always called handler + for _, h in ipairs(handler) do + if h(reply, to, from, node) then found = true; end + end + end + if found then return reply; end -- return the reply if there was one + return st.error_reply(stanza, "cancel", "service-unavailable"); + end +end + +function new() + return { + item_handlers = {}; + info_handlers = {}; + addDiscoItemsHandler = addDiscoItemsHandler; + addDiscoInfoHandler = addDiscoInfoHandler; + handle = handle; + }; +end + +return _M; -- cgit v1.2.3