X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=core%2Fmodulemanager.lua;h=cc48c2f6776ed58cfa29bbdc9408d770a99b01de;hb=43e6f37e8a0300929a4623f1a61c2d0ee2b24d5e;hp=5afe31440cb4395add4355b8f0a6bc151196df94;hpb=1552206d5c540734f05cf90fa3a124940568196b;p=prosody.git diff --git a/core/modulemanager.lua b/core/modulemanager.lua index 5afe3144..cc48c2f6 100644 --- a/core/modulemanager.lua +++ b/core/modulemanager.lua @@ -1,4 +1,4 @@ --- Prosody IM v0.3 +-- Prosody IM v0.4 -- Copyright (C) 2008-2009 Matthew Wild -- Copyright (C) 2008-2009 Waqas Hussain -- @@ -123,6 +123,10 @@ function load(host, module_name, config) -- Use modified host, if the module set one modulemap[api_instance.host][module_name] = pluginenv; + if api_instance.host == "*" and host ~= "*" then + api_instance:set_global(); + end + return true; end @@ -204,7 +208,7 @@ function handle_stanza(host, origin, stanza) local name, xmlns, origin_type = stanza.name, stanza.attr.xmlns, origin.type; if name == "iq" and xmlns == "jabber:client" then if stanza.attr.type == "get" or stanza.attr.type == "set" then - xmlns = stanza.tags[1].attr.xmlns; + xmlns = stanza.tags[1].attr.xmlns or "jabber:client"; log("debug", "Stanza of type %s from %s has xmlns: %s", name, origin_type, xmlns); else log("debug", "Discarding %s from %s of type: %s", name, origin_type, stanza.attr.type); @@ -212,6 +216,7 @@ function handle_stanza(host, origin, stanza) end end local handlers = stanza_handlers:get(host, origin_type, name, xmlns); + if not handlers then handlers = stanza_handlers:get("*", origin_type, name, xmlns); end if handlers then log("debug", "Passing stanza to mod_%s", handler_info[handlers[1]].name); (handlers[1])(origin, stanza); @@ -259,6 +264,10 @@ end function api:set_global() self.host = "*"; + -- Update the logger + local _log = logger.init("mod_"..self.name); + self.log = function (self, ...) return _log(...); end; + self._log = _log; end local function _add_handler(module, origin_type, tag, xmlns, handler) @@ -299,6 +308,14 @@ addDiscoInfoHandler("*host", function(reply, to, from, node) end end end + for module, features in pairs(features_table:get("*") or NULL) do -- for each module + for feature in pairs(features) do + if not done[feature] then + reply:tag("feature", {var = feature}):up(); -- TODO cache + done[feature] = true; + end + end + end return next(done) ~= nil; end end);