plugins/version.lua

1
local verse = require "verse";
2
 
3
local xmlns_version = "jabber:iq:version";
4
 
5
local function set_version(self, version_info)
6
	self.name = version_info.name;
7
	self.version = version_info.version;
8
	self.platform = version_info.platform;
9
end
10
 
11
function verse.plugins.version(stream)
12
	stream.version = { set = set_version };
13
	stream:hook("iq/"..xmlns_version, function (stanza)
14
		if stanza.attr.type ~= "get" then return; end
15
		local reply = verse.reply(stanza)
16
			:tag("query", { xmlns = xmlns_version });
17
		if stream.version.name then
18
			reply:tag("name"):text(tostring(stream.version.name)):up();
19
		end
20
		if stream.version.version then
21
			reply:tag("version"):text(tostring(stream.version.version)):up()
22
		end
23
		if stream.version.platform then
24
			reply:tag("os"):text(stream.version.platform);
25
		end
26
		stream:send(reply);
27
		return true;
28
	end);
29
 
30
	function stream:query_version(target_jid, callback)
31
		callback = callback or function (version) return self:event("version/response", version); end
32
		self:send_iq(verse.iq({ type = "get", to = target_jid })
33
			:tag("query", { xmlns = xmlns_version }),
34
			function (reply)
35
				if reply.attr.type == "result" then
36
					local query = reply:get_child("query", xmlns_version);
37
					local name = query and query:get_child_text("name");
38
					local version = query and query:get_child_text("version");
39
					local os = query and query:get_child_text("os");
40
					callback({
41
						name = name;
42
						version = version;
43
						platform = os;
44
						});
45
				else
46
					local type, condition, text = reply:get_error();
47
					callback({
48
						error = true;
49
						condition = condition;
50
						text = text;
51
						type = type;
52
						});
53
				end
54
			end);
55
	end
56
	return true;
57
end