Mercurial > prosody-modules
comparison 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 |
comparison
equal
deleted
inserted
replaced
1134:0664f8b783fd | 1135:0d6ab5e4bc30 |
---|---|
8 local xmlns_forward = "urn:xmpp:forward:0"; | 8 local xmlns_forward = "urn:xmpp:forward:0"; |
9 | 9 |
10 local st = require "util.stanza"; | 10 local st = require "util.stanza"; |
11 local rsm = module:require "rsm"; | 11 local rsm = module:require "rsm"; |
12 local prefs = module:require"mamprefs"; | 12 local prefs = module:require"mamprefs"; |
13 local prefsxml = module:require"mamprefsxml"; | |
13 local set_prefs, get_prefs = prefs.set, prefs.get; | 14 local set_prefs, get_prefs = prefs.set, prefs.get; |
15 local prefs_to_stanza, prefs_from_stanza = prefsxml.tostanza, prefsxml.fromstanza; | |
14 local jid_bare = require "util.jid".bare; | 16 local jid_bare = require "util.jid".bare; |
15 local jid_split = require "util.jid".split; | 17 local jid_split = require "util.jid".split; |
16 local jid_prep = require "util.jid".prep; | 18 local jid_prep = require "util.jid".prep; |
17 local host = module.host; | 19 local host = module.host; |
18 | 20 |
45 -- Handle prefs. | 47 -- Handle prefs. |
46 module:hook("iq/self/"..xmlns_mam..":prefs", function(event) | 48 module:hook("iq/self/"..xmlns_mam..":prefs", function(event) |
47 local origin, stanza = event.origin, event.stanza; | 49 local origin, stanza = event.origin, event.stanza; |
48 local user = origin.username; | 50 local user = origin.username; |
49 if stanza.attr.type == "get" then | 51 if stanza.attr.type == "get" then |
50 local prefs = get_prefs(user); | 52 local prefs = prefs_to_stanza(get_prefs(user)); |
51 local default = prefs[false]; | 53 local reply = st.reply(stanza):add_child(prefs); |
52 default = default ~= nil and default_attrs[default] or global_default_policy; | 54 return origin.send(reply); |
53 local reply = st.reply(stanza):tag("prefs", { xmlns = xmlns_mam, default = default }) | |
54 local always = st.stanza("always"); | |
55 local never = st.stanza("never"); | |
56 for k,v in pairs(prefs) do | |
57 if k then | |
58 (v and always or never):tag("jid"):text(k):up(); | |
59 end | |
60 end | |
61 reply:add_child(always):add_child(never); | |
62 origin.send(reply); | |
63 return true | |
64 else -- type == "set" | 55 else -- type == "set" |
65 local prefs = {}; | |
66 local new_prefs = stanza:get_child("prefs", xmlns_mam); | 56 local new_prefs = stanza:get_child("prefs", xmlns_mam); |
67 local new_default = new_prefs.attr.default; | 57 local prefs = prefs_from_stanza(new_prefs); |
68 if new_default then | |
69 prefs[false] = default_attrs[new_default]; | |
70 end | |
71 | |
72 local always = new_prefs:get_child("always"); | |
73 if always then | |
74 for rule in always:childtags("jid") do | |
75 local jid = rule:get_text(); | |
76 prefs[jid] = true; | |
77 end | |
78 end | |
79 | |
80 local never = new_prefs:get_child("never"); | |
81 if never then | |
82 for rule in never:childtags("jid") do | |
83 local jid = rule:get_text(); | |
84 prefs[jid] = false; | |
85 end | |
86 end | |
87 | |
88 local ok, err = set_prefs(user, prefs); | 58 local ok, err = set_prefs(user, prefs); |
89 if not ok then | 59 if not ok then |
90 origin.send(st.error_reply(stanza, "cancel", "internal-server-error", "Error storing preferences: "..tostring(err))); | 60 return origin.send(st.error_reply(stanza, "cancel", "internal-server-error", "Error storing preferences: "..tostring(err))); |
91 else | 61 end |
92 origin.send(st.reply(stanza)); | 62 return origin.send(st.reply(stanza)); |
93 end | |
94 return true | |
95 end | 63 end |
96 end); | 64 end); |
97 | 65 |
98 -- Handle archive queries | 66 -- Handle archive queries |
99 module:hook("iq-get/self/"..xmlns_mam..":query", function(event) | 67 module:hook("iq-get/self/"..xmlns_mam..":query", function(event) |