mod_pubsub: Build disco#info based on the methods provided by the pubsub service object. Add public set_service() method to change the service object used by the module.

Tue, 21 Dec 2010 04:06:36 +0000

author
Matthew Wild <mwild1@gmail.com>
date
Tue, 21 Dec 2010 04:06:36 +0000
changeset 3914
f10282c2e410
parent 3913
e748d29b18d6
child 3915
e24fcbb01fb6

mod_pubsub: Build disco#info based on the methods provided by the pubsub service object. Add public set_service() method to change the service object used by the module.

plugins/mod_pubsub.lua file | annotate | diff | comparison | revisions
--- a/plugins/mod_pubsub.lua	Tue Dec 21 03:30:18 2010 +0000
+++ b/plugins/mod_pubsub.lua	Tue Dec 21 04:06:36 2010 +0000
@@ -9,6 +9,9 @@
 local xmlns_pubsub_errors = "http://jabber.org/protocol/pubsub#errors";
 local xmlns_pubsub_event = "http://jabber.org/protocol/pubsub#event";
 
+local autocreate_on_publish = module:get_option_boolean("autocreate_on_publish", false);
+local autocreate_on_subscribe = module:get_option_boolean("autocreate_on_subscribe", false);
+
 local service;
 
 local handlers = {};
@@ -177,9 +180,36 @@
 
 module:hook("iq/host/http://jabber.org/protocol/pubsub:pubsub", handle_pubsub_iq);
 
-local disco_info = st.stanza("query", { xmlns = "http://jabber.org/protocol/disco#info" })
-	:tag("identity", { category = "pubsub", type = "service" }):up()
-	:tag("feature", { var = "http://jabber.org/protocol/pubsub" }):up();
+local disco_info;
+
+local feature_map = {
+	create = { "create-nodes", autocreate_on_publish and "instant-nodes", "item-ids" };
+	retract = { "delete-items", "retract-items" };
+	publish = { "publish" };
+	get_items = { "retrieve-items" };
+};
+
+local function add_disco_features_from_service(disco, service)
+	for method, features in pairs(feature_map) do
+		if service[method] then
+			for _, feature in ipairs(feature_map) do
+				disco:tag("feature", { var = xmlns_pubsub.."#"..feature }):up();
+			end
+		end
+	end
+	for affiliation in pairs(service.config.capabilities) do
+		if affiliation ~= "none" and affiliation ~= "owner" then
+			disco:tag("feature", { var = xmlns_pubsub.."#"..affiliation.."-affiliation" }):up();
+		end
+	end
+end
+
+local function build_disco_info(service)
+	disco_info = st.stanza("query", { xmlns = "http://jabber.org/protocol/disco#info" })
+		:tag("identity", { category = "pubsub", type = "service" }):up()
+		:tag("feature", { var = "http://jabber.org/protocol/pubsub" }):up();
+	add_disco_features_from_service(disco_info, service);
+end
 
 module:hook("iq-get/host/http://jabber.org/protocol/disco#info:query", function (event)
 	event.origin.send(st.reply(event.stanza):add_child(disco_info));
@@ -208,7 +238,21 @@
 	end
 end
 
-service = pubsub.new({
+function set_service(new_service)
+	service = new_service;
+	module.environment.service = service;
+	disco_info = build_disco_info(service);
+end
+
+function module.save()
+	return { service = service };
+end
+
+function module.restore(data)
+	set_service(data.service);
+end
+
+set_service(pubsub.new({
 	capabilities = {
 		none = {
 			create = false;
@@ -253,22 +297,12 @@
 		};
 	};
 	
-	autocreate_on_publish = module:get_option_boolean("autocreate_on_publish");
-	autocreate_on_subscribe = module:get_option_boolean("autocreate_on_subscribe");
+	autocreate_on_publish = autocreate_on_publish;
+	autocreate_on_subscribe = autocreate_on_subscribe;
 	
 	broadcaster = simple_broadcast;
 	get_affiliation = get_affiliation;
 	jids_equal = function (jid1, jid2)
 		return jid_bare(jid1) == jid_bare(jid2);
 	end;
-});
-module.environment.service = service;
-
-function module.save()
-	return { service = service };
-end
-
-function module.restore(data)
-	service = data.service;
-	module.environment.service = service;
-end
+}));

mercurial