view mod_map/mod_map.lua @ 3581:dbc67120097f

mod_http_muc_log: Document optimization for storage modules lacking :dates API
author Kim Alvefur <zash@zash.se>
date Sun, 05 May 2019 14:05:00 +0200
parents 262e68821f3f
children 30743ae1fe1a
line wrap: on
line source


local st = require "util.stanza";
local jid_bare = require "util.jid".bare;
local rsm = require "util.rsm";
local dataform = require "util.dataforms".new;

local archive = module:open_store("archive", "archive");

local query_form = dataform {
	{ name = "with"; type = "jid-single"; };
	{ name = "start"; type = "text-single" };
	{ name = "end"; type = "text-single"; };
};

if not archive.summary then
	module:log("error", "The archive:summary() API is not supported by %s", archive._provided_by);
	return
end

module:hook("iq-get/self/xmpp:prosody.im/mod_map:summary", function(event)
	local origin, stanza = event.origin, event.stanza;

	local query = stanza.tags[1];

	-- Search query parameters
	local qwith, qstart, qend;
	local form = query:get_child("x", "jabber:x:data");
	if form then
		local err;
		form, err = query_form:data(form);
		if err then
			origin.send(st.error_reply(stanza, "modify", "bad-request", select(2, next(err))));
			return true;
		end
		qwith, qstart, qend = form["with"], form["start"], form["end"];
		qwith = qwith and jid_bare(qwith); -- dataforms does jidprep
	end

	local qset = rsm.get(query);
	local qmax = qset and qset.max;
	local before, after = qset and qset.before, qset and qset.after;
	if type(before) ~= "string" then before = nil; end

	local summary = archive:summary(origin.username, {
		start = qstart; ["end"] = qend; -- Time range
		with = qwith;
		limit = qmax;
		before = before; after = after;
	});
	if not summary then
		module:send(st.error_reply(stanza, "wait", "internal-server-error"));
		return true;
	end

	local reply = st.reply(stanza);
	reply:tag("summary", { xmlns = "xmpp:prosody.im/mod_map" });
	for jid, count in pairs(summary) do
		reply:tag("item", { jid = jid });
		if type(count) == "number" then
			reply:text_tag("count", ("%d"):format(count));
		end
		reply:up();
	end

	module:send(reply);
	return true;
end);