Changeset

167:a2ae7a9d360f

plugins.disco: Automatically insert caps into outgoing presence, and re-send last global presence with new caps when features change
author Matthew Wild <mwild1@gmail.com>
date Wed, 15 Dec 2010 14:56:10 +0000
parents 166:3499b4ea3277
children 168:7285e04a4797
files plugins/disco.lua
diffstat 1 files changed, 29 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/plugins/disco.lua	Wed Dec 15 14:52:37 2010 +0000
+++ b/plugins/disco.lua	Wed Dec 15 14:56:10 2010 +0000
@@ -30,6 +30,8 @@
 	stream.caps = {}
 	stream.caps.node = 'http://code.matthewwild.co.uk/verse/'
 
+	local _resend_presence; -- Forward declaration of a function
+
 	local function cmp_identity(item1, item2)
 		if item1.category < item2.category then
 			return true;
@@ -87,13 +89,15 @@
 	})
 	
 	function stream:add_disco_feature(feature)
-		table.insert(self.disco.info.features, {var=feature});		
+		table.insert(self.disco.info.features, {var=feature});
+		_resend_presence();
 	end
 	
 	function stream:remove_disco_feature(feature)
 		for idx, disco_feature in ipairs(self.disco.info.features) do
 			if disco_feature.var == feature then
 				table.remove(self.disco.info.features, idx);
+				_resend_presence();
 				return true;
 			end
 		end
@@ -370,6 +374,30 @@
 		end);
 		return true;
 	end, 5);
+	
+	local last_presence; -- Cache to re-send with updated caps
+	
+	stream:hook("presence-out", function (presence)
+		if not presence:get_child("c", xmlns_caps) then
+			presence:reset():add_child(stream:caps()):reset();
+		end
+		if not presence.attr.to then
+			last_presence = presence; -- Cache non-directed presence
+		end
+	end);
+	
+	local function update_caps(tag)
+		if tag.name == "c" and tag.attr.xmlns == xmlns_caps then
+			return stream:caps();
+		end
+	end
+	
+	function _resend_presence() -- Local via forward declaration
+		if last_presence then
+			last_presence = last_presence:maptags(update_caps);
+			stream:send(last_presence);
+		end
+	end
 end
 
 -- end of disco.lua