| 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 |