Software /
code /
verse
Diff
plugins/carbons.lua @ 224:7fc17e40fbaf
plugins.carbons: Add, implements Message Carbons (XEP 280)
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Wed, 02 Nov 2011 01:17:54 +0100 |
child | 250:a5ac643a7fd6 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/carbons.lua Wed Nov 02 01:17:54 2011 +0100 @@ -0,0 +1,58 @@ +local xmlns_carbons = "urn:xmpp:carbons:1"; +local xmlns_forward = "urn:xmpp:forward:0"; +local os_date = os.date; +local datetime = function(t) return os_date("!%Y-%m-%dT%H:%M:%SZ", t); end + +-- TODO Check disco for support + +function verse.plugins.carbons(stream) + local carbons = {}; + carbons.enabled = false; + stream.carbons = carbons; + + function carbons:enable(callback) + stream:send_iq(verse.iq{type="set"} + :tag("enable", { xmlns = xmlns_carbons }) + , function(result) + local success = result.attr.type == "result"; + if success then + carbons.enabled = true; + end + if callback then + callback(success); + end + end or nil); + end + + function carbons:disable(callback) + stream:send_iq(verse.iq{type="set"} + :tag("disable", { xmlns = xmlns_carbons }) + , function(result) + local success = result.attr.type == "result"; + if success then + carbons.enabled = false; + end + if callback then + callback(success); + end + end or nil); + end + + stream:hook("message", function(stanza) + stream:debug(stanza); + local fwd = stanza:get_child("forwarded", xmlns_forward); + if fwd then + local carbon_dir = fwd:get_child(nil, xmlns_carbons); + carbon_dir = carbon_dir and carbon_dir.name; + if carbon_dir then + local fwd_stanza = fwd:get_child("message", "jabber:client"); + assert(fwd_stanza, "No stanza included.\n"..tostring(stanza).."\n--\n"..tostring(fwd_stanza)); + return stream:event("carbon", { + dir = carbon_dir, + stanza = fwd_stanza, + timestamp = nil or datetime(), -- TODO check for delay tag + }); + end + end + end, 1); +end