mod_mam: Break out routines for converting prefs between XML and our internal representation into a library
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_mam/mamprefsxml.lib.lua Sat Aug 10 20:38:25 2013 +0200
@@ -0,0 +1,60 @@
+-- XEP-0313: Message Archive Management for Prosody
+-- Copyright (C) 2011-2013 Kim Alvefur
+--
+-- This file is MIT/X11 licensed.
+
+local st = require"util.stanza";
+local xmlns_mam = "urn:xmpp:mam:tmp";
+
+local global_default_policy = module:get_option("default_archive_policy", false);
+
+local default_attrs = {
+ always = true, [true] = "always",
+ never = false, [false] = "never",
+ roster = "roster",
+}
+
+local function tostanza(prefs)
+ local default = prefs[false];
+ default = default ~= nil and default_attrs[default] or global_default_policy;
+ local prefstanza = st.stanza("prefs", { xmlns = xmlns_mam, default = default });
+ local always = st.stanza("always");
+ local never = st.stanza("never");
+ for jid, choice in pairs(prefs) do
+ if jid then
+ (choice and always or never):tag("jid"):text(jid):up();
+ end
+ end
+ prefstanza:add_child(always):add_child(never);
+ return prefstanza;
+end
+local function fromstanza(prefstanza)
+ local prefs = {};
+ local default = prefstanza.attr.default;
+ if default then
+ prefs[false] = default_attrs[default];
+ end
+
+ local always = prefstanza:get_child("always");
+ if always then
+ for rule in always:childtags("jid") do
+ local jid = rule:get_text();
+ prefs[jid] = true;
+ end
+ end
+
+ local never = prefstanza:get_child("never");
+ if never then
+ for rule in never:childtags("jid") do
+ local jid = rule:get_text();
+ prefs[jid] = false;
+ end
+ end
+
+ return prefs;
+end
+
+return {
+ tostanza = tostanza;
+ fromstanza = fromstanza;
+}
--- a/mod_mam/mod_mam.lua Sat Aug 10 17:32:28 2013 +0200
+++ b/mod_mam/mod_mam.lua Sat Aug 10 20:38:25 2013 +0200
@@ -10,7 +10,9 @@
local st = require "util.stanza";
local rsm = module:require "rsm";
local prefs = module:require"mamprefs";
+local prefsxml = module:require"mamprefsxml";
local set_prefs, get_prefs = prefs.set, prefs.get;
+local prefs_to_stanza, prefs_from_stanza = prefsxml.tostanza, prefsxml.fromstanza;
local jid_bare = require "util.jid".bare;
local jid_split = require "util.jid".split;
local jid_prep = require "util.jid".prep;
@@ -47,51 +49,17 @@
local origin, stanza = event.origin, event.stanza;
local user = origin.username;
if stanza.attr.type == "get" then
- local prefs = get_prefs(user);
- local default = prefs[false];
- default = default ~= nil and default_attrs[default] or global_default_policy;
- local reply = st.reply(stanza):tag("prefs", { xmlns = xmlns_mam, default = default })
- local always = st.stanza("always");
- local never = st.stanza("never");
- for k,v in pairs(prefs) do
- if k then
- (v and always or never):tag("jid"):text(k):up();
- end
- end
- reply:add_child(always):add_child(never);
- origin.send(reply);
- return true
+ local prefs = prefs_to_stanza(get_prefs(user));
+ local reply = st.reply(stanza):add_child(prefs);
+ return origin.send(reply);
else -- type == "set"
- local prefs = {};
local new_prefs = stanza:get_child("prefs", xmlns_mam);
- local new_default = new_prefs.attr.default;
- if new_default then
- prefs[false] = default_attrs[new_default];
- end
-
- local always = new_prefs:get_child("always");
- if always then
- for rule in always:childtags("jid") do
- local jid = rule:get_text();
- prefs[jid] = true;
- end
- end
-
- local never = new_prefs:get_child("never");
- if never then
- for rule in never:childtags("jid") do
- local jid = rule:get_text();
- prefs[jid] = false;
- end
- end
-
+ local prefs = prefs_from_stanza(new_prefs);
local ok, err = set_prefs(user, prefs);
if not ok then
- origin.send(st.error_reply(stanza, "cancel", "internal-server-error", "Error storing preferences: "..tostring(err)));
- else
- origin.send(st.reply(stanza));
+ return origin.send(st.error_reply(stanza, "cancel", "internal-server-error", "Error storing preferences: "..tostring(err)));
end
- return true
+ return origin.send(st.reply(stanza));
end
end);