# HG changeset patch # User Kim Alvefur # Date 1376159905 -7200 # Node ID 0d6ab5e4bc30b6075548cd543cd9ea6c9e914c50 # Parent 0664f8b783fd6692faaff1957ab7ae9d628546e9 mod_mam: Break out routines for converting prefs between XML and our internal representation into a library diff -r 0664f8b783fd -r 0d6ab5e4bc30 mod_mam/mamprefsxml.lib.lua --- /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; +} diff -r 0664f8b783fd -r 0d6ab5e4bc30 mod_mam/mod_mam.lua --- 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);