Merge with 0.4
[prosody.git] / core / modulemanager.lua
index 5afe31440cb4395add4355b8f0a6bc151196df94..cc48c2f6776ed58cfa29bbdc9408d770a99b01de 100644 (file)
@@ -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);