Changeset

27:a4a6a33a34c1

Add 'version' plugin to handle and generate version requests
author Matthew Wild <mwild1@gmail.com>
date Wed, 09 Dec 2009 13:55:58 +0000
parents 26:6c5fab6c11cf
children 28:afe9e6d6c87a
files plugins/version.lua
diffstat 1 files changed, 53 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/version.lua	Wed Dec 09 13:55:58 2009 +0000
@@ -0,0 +1,53 @@
+local xmlns_version = "jabber:iq:version";
+
+local function set_version(version_info)
+	self.name = version_info.name;
+	self.version = version_info.version;
+	self.platform = version_info.platform;
+end
+
+function verse.plugins.version(stream)
+	stream.version = { set = set_version };
+	stream:hook("iq/"..xmlns_version, function (event)
+		if event.stanza.attr.type ~= "get" then return; end
+		local reply = verse.reply(event.stanza)
+			:tag("query", { xmlns = xmlns_version });
+		if stream.version.name then
+			reply:tag("name"):text(tostring(stream.version.name)):up();
+		end
+		if stream.version.version then
+			reply:tag("version"):text(tostring(stream.version.version)):up()
+		end
+		if stream.version.platform then
+			reply:tag("os"):text(stream.version.platform);
+		end
+	end);
+	
+	function stream:query_version(target_jid, callback)
+		callback = callback or function (version) return stream:event("version/response", version); end
+		stream:send_iq(verse.iq({ type = "get", to = target_jid })
+			:tag("query", { xmlns = xmlns_version }), 
+			function (reply)
+				local query = reply:get_child("query", xmlns_version);
+				if query then
+					local name = query:get_child("name");
+					local version = query:get_child("version");
+					local os = query:get_child("os");
+					callback({
+						name = name and name:get_text() or nil;
+						version = version and version:get_text() or nil;
+						platform = os and os:get_text() or nil;
+						});
+				else
+					local type, condition, text = reply:get_error();
+					callback({
+						error = true;
+						condition = condition;
+						text = text;
+						type = type;
+						});
+				end
+			end);
+	end
+
+end