--- 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"));