mod_mam/mod_mam.lua
changeset 1593 3e4d15ae2133
parent 1587 3ac2b835c7b3
--- a/mod_mam/mod_mam.lua	Tue Jan 20 11:02:14 2015 +0000
+++ b/mod_mam/mod_mam.lua	Sun Jan 25 13:04:02 2015 +0100
@@ -3,7 +3,7 @@
 --
 -- This file is MIT/X11 licensed.
 
-local xmlns_mam     = "urn:xmpp:mam:0";
+local xmlns_mam     = "urn:xmpp:mam:0"; -- Version 0.3
 local xmlns_delay   = "urn:xmpp:delay";
 local xmlns_forward = "urn:xmpp:forward:0";
 
@@ -35,6 +35,8 @@
 	global_default_policy = module:get_option_boolean("default_archive_policy", global_default_policy);
 end
 
+local measure_query_time = module:measure("query", "times");
+
 local archive_store = "archive2";
 local archive = module:open_store(archive_store, "archive");
 if not archive or archive.name == "null" then
@@ -115,6 +117,7 @@
 	local before, after = qset and qset.before, qset and qset.after;
 	if type(before) ~= "string" then before = nil; end
 
+	local query_completed = measure_query_time();
 
 	-- Load all the data!
 	local data, err = archive:find(origin.username, {
@@ -131,7 +134,7 @@
 	end
 	local count = err;
 
-	origin.send(st.reply(stanza))
+	origin.send(st.reply(stanza)); -- Remove in next MAM version
 	local msg_reply_attr = { to = stanza.attr.from, from = stanza.attr.to };
 
 	-- Wrap it in stuff and deliver
@@ -156,11 +159,18 @@
 	-- That's all folks!
 	module:log("debug", "Archive query %s completed", tostring(qid));
 
+	query_completed();
+
 	if reverse then first, last = last, first; end
 	return origin.send(st.message(msg_reply_attr)
 		:tag("fin", { xmlns = xmlns_mam, queryid = qid })
 			:add_child(rsm.generate {
 				first = first, last = last, count = count }));
+	--[[ Next MAM version
+	return origin.send(st.reply(stanza)
+		:query(xmlns_mam):add_child(rsm.generate {
+			first = first, last = last, count = count }));
+	--]]
 end);
 
 local function has_in_roster(user, who)
@@ -240,3 +250,101 @@
 
 module:add_feature(xmlns_mam);
 
+
+module:depends"adhoc";
+local dataforms_new = require "util.dataforms".new;
+local jid_split = require "util.jid".split;
+local t_insert = table.insert;
+local prefs = module:require"mod_mam/mamprefs";
+local set_prefs, get_prefs = prefs.set, prefs.get;
+
+local mam_prefs_form = dataforms_new{
+	title = "Archive preferences";
+	--instructions = "";
+	{
+		name = "default",
+		label = "Default storage policy",
+		type = "list-single",
+		value = {
+			{ value = "always", label = "Always", default = global_default_policy == true },
+			{ value = "never", label = "Never", default = global_default_policy == false },
+			{ value = "roster", label = "Roster", default = global_default_policy == "roster" },
+		},
+	};
+	{
+		name = "always",
+		label = "Always store messages to/from",
+		type = "jid-multi"
+	};
+	{
+		name = "never",
+		label = "Never store messages to/from",
+		type = "jid-multi"
+	};
+};
+
+local host = module.host;
+
+local default_attrs = {
+	always = true, [true] = "always",
+	never = false, [false] = "never",
+	roster = "roster",
+}
+
+local function mam_prefs_handler(self, data, state)
+	local username = jid_split(data.from);
+	if data.action == "cancel" then
+		return { status = "canceled" };
+	end
+
+	if state == nil then
+		local prefs = get_prefs(username);
+		local values = {
+			default = {
+				{ value = "always", label = "Always" };
+				{ value = "never", label = "Never" };
+				{ value = "roster", label = "Roster" };
+			};
+			always = {};
+			never = {};
+		};
+
+		for jid, p in pairs(prefs) do
+			if jid then
+				t_insert(values[p and "always" or "never"], jid);
+
+			elseif p == true then -- Yes, this is ugly.  FIXME later.
+				values.default[1].default = true;
+			elseif p == false then
+				values.default[2].default = true;
+			elseif p == "roster" then
+				values.default[3].default = true;
+			end
+		end
+		return { status = "executing", actions  = { "complete" }, form = { layout = mam_prefs_form, values = values } }, true;
+	else
+		local fields = mam_prefs_form:data(data.form);
+
+		local default, always, never = fields.default, fields.always, fields.never;
+		local prefs = {};
+		if default then
+			prefs[false] = default_attrs[default];
+		end
+		if always then
+			for i=1,#always do
+				prefs[always[i]] = true;
+			end
+		end
+		if never then
+			for i=1,#never do
+				prefs[never[i]] = false;
+			end
+		end
+
+		set_prefs(username, prefs);
+
+		return { status = "completed" }
+	end
+end
+
+module:provides("adhoc", module:require"adhoc".new("Archive settings", "urn:xmpp:mam#configure", mam_prefs_handler, "local_user"));