diff mod_mam/mod_mam.lua @ 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 2345a30dd8b4
children d055c44a7f61
line wrap: on
line diff
--- 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);