-local function _add_handler(module, origin_type, tag, xmlns, handler)
- local handlers = stanza_handlers:get(module.host, origin_type, tag, xmlns);
- local msg = (tag == "iq") and "namespace" or "payload namespace";
- if not handlers then
- stanza_handlers:add(module.host, origin_type, tag, xmlns, handler);
- handler_info[handler] = module;
- handler_table:add(module.host, module.name, {module.host, origin_type, tag, xmlns});
- --module:log("debug", "I now handle tag '%s' [%s] with %s '%s'", tag, origin_type, msg, xmlns);
- else
- module:log("warn", "I wanted to handle tag '%s' [%s] with %s '%s' but mod_%s already handles that", tag, origin_type, msg, xmlns, handler_info[handlers[1]].module.name);
- end
-end
-
-function api:add_handler(origin_type, tag, xmlns, handler)
- if not (origin_type and tag and xmlns and handler) then return false; end
- if type(origin_type) == "table" then
- for _, origin_type in ipairs(origin_type) do
- _add_handler(self, origin_type, tag, xmlns, handler);
- end
- else
- _add_handler(self, origin_type, tag, xmlns, handler);
- end
-end
-function api:add_iq_handler(origin_type, xmlns, handler)
- self:add_handler(origin_type, "iq", xmlns, handler);
-end
-
-addDiscoInfoHandler("*host", function(reply, to, from, node)
- if #node == 0 then
- local done = {};
- for module, identities in pairs(identities_table:get(to) or NULL) do -- for each module
- for identity, attr in pairs(identities) do
- if not done[identity] then
- reply:tag("identity", attr):up(); -- TODO cache
- done[identity] = true;
- end
- end
- end
- for module, identities in pairs(identities_table:get("*") or NULL) do -- for each module
- for identity, attr in pairs(identities) do
- if not done[identity] then
- reply:tag("identity", attr):up(); -- TODO cache
- done[identity] = true;
- end
- end
- end
- for module, features in pairs(features_table:get(to) 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
- 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);
-