Diff

plugins/archive.lua @ 273:c5b7a4c717a6

plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
author Kim Alvefur <zash@zash.se>
date Fri, 06 Jan 2012 16:54:10 +0100
child 275:c077b20ad59f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/archive.lua	Fri Jan 06 16:54:10 2012 +0100
@@ -0,0 +1,44 @@
+local xmlns_mam = "urn:xmpp:mam:tmp"
+local uuid = require "util.uuid".generate;
+
+function verse.plugins.archive(stream)
+	function stream:query_archive(where, query_params, callback)
+		local queryid = uuid();
+		local query_st = verse.iq{ type="get", to=where }
+			:tag("query", { xmlns = xmlns_mam, queryid = queryid });
+
+		local params = { "with", "start", "end" };
+		local query_params = query_params or {};
+		for i=1,#params do
+			local k = params[i];
+			if query_params[k] then
+				query_st:tag(k):text(query_params[k]);
+			end
+		end
+
+		local results = {};
+		local function handle_archived_message(message)
+			local result_tag = message:get_child("result", xmlns_mam);
+			if result_tag and result_tag.attr.queryid == queryid then
+				local forwarded = message:get_child("forwarded", "urn:xmpp:forward:0");
+
+				local delay = forwarded:get_child("delay", "urn:xmpp:delay");
+				local stamp = delay and delay.attr.stamp or nil;
+
+				local message = forwarded:get_child("message", "jabber:client")
+
+				results[#results+1] = { stamp = stamp, message = message };
+				return true
+			end
+		end
+
+		self:hook("message", handle_archived_message, 1);
+		self:send_iq(query_st, function(reply)
+			self:unhook("message", handle_archived_message);
+			callback(reply.attr.type == "result" and #results, results);
+			return true
+		end);
+	end
+
+	--TODO Settings
+end