Changeset

1135:0d6ab5e4bc30

mod_mam: Break out routines for converting prefs between XML and our internal representation into a library
author Kim Alvefur <zash@zash.se>
date Sat, 10 Aug 2013 20:38:25 +0200
parents 1134:0664f8b783fd
children 1136:a6d4508f7f28
files mod_mam/mamprefsxml.lib.lua mod_mam/mod_mam.lua
diffstat 2 files changed, 68 insertions(+), 40 deletions(-) [+]
line wrap: on
line diff
--- /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);