mod_extdisco/mod_extdisco.lua
changeset 1593 3e4d15ae2133
parent 281 e5c16c87383c
--- a/mod_extdisco/mod_extdisco.lua	Tue Jan 20 11:02:14 2015 +0000
+++ b/mod_extdisco/mod_extdisco.lua	Sun Jan 25 13:04:02 2015 +0100
@@ -1,20 +1,28 @@
+local moduleapi = require"core.moduleapi";
 local st = require "util.stanza";
-
-local services = module:get_option("external_services");
+local array = require"util.array";
 
 local xmlns_extdisco = "urn:xmpp:extdisco:1";
 
 module:add_feature(xmlns_extdisco);
 
+function moduleapi:add_external_service(info)
+	return self:add_item("external_service", info);
+end
+
 module:hook("iq-get/host/"..xmlns_extdisco..":services", function (event)
 	local origin, stanza = event.origin, event.stanza;
 	local service = stanza:get_child("service", xmlns_extdisco);
 	local service_type = service and service.attr.type;
-	local reply = st.reply(stanza);
-	for host, service_info in pairs(services) do
+	local reply = st.reply(stanza):tag("services", {xmlns = xmlns_extdisco});
+	local services = array():append(module:get_host_items("external_services"));
+	local event = { services = services, origin = origin, type = service_type };
+	module:fire_event("external-service-discovery", event);
+	for i = 1, #services do
+		local service_info = services[i];
 		if not(service_type) or service_info.type == service_type then
 			reply:tag("service", {
-				host = host;
+				host = service_info.host;
 				port = service_info.port;
 				transport = service_info.transport;
 				type = service_info.type;
@@ -27,6 +35,20 @@
 	return true;
 end);
 
+function module.load()
+	local services = module:get_option("external_services");
+	for host, service_info in pairs(services) do
+		module:add_external_service {
+			host = host,
+			port = service_info.port;
+			transport = service_info.transport;
+			type = service_info.type;
+			username = service_info.username;
+			password = service_info.password;
+		}
+	end
+end
+
 module:hook("iq-get/host/"..xmlns_extdisco..":credentials", function (event)
 	local origin, stanza = event.origin, event.stanza;
 	local credentials = stanza:get_child("credentials", xmlns_extdisco);
@@ -35,7 +57,7 @@
 		origin.send(st.error_reply(stanza, "cancel", "bad-request", "No host specified"));
 		return true;
 	end
-	local service_info = services[host];
+	local service_info = module:fire_event("external-services-credentials") or services[host];
 	if not service_info then
 		origin.send(st.error_reply(stanza, "cancel", "item-not-found", "No such service known"));
 		return true;
@@ -50,3 +72,4 @@
 	origin.send(reply);
 	return true;
 end);
+