Annotate

plugins/archive.lua @ 303:0dda04d5eb84

plugins.archive: Treat query params correctly
author Kim Alvefur <zash@zash.se>
date Fri, 08 Jun 2012 06:44:20 +0200
parent 297:447dffdaf46c
child 304:e09ae2395d41
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
291
b78137f5118e plugins.archive: Add a header comment
Kim Alvefur <zash@zash.se>
parents: 275
diff changeset
1 -- This implements XEP-0313: Message Archive Management
b78137f5118e plugins.archive: Add a header comment
Kim Alvefur <zash@zash.se>
parents: 275
diff changeset
2 -- http://xmpp.org/extensions/xep-0313.html
b78137f5118e plugins.archive: Add a header comment
Kim Alvefur <zash@zash.se>
parents: 275
diff changeset
3 -- (ie not XEP-0136)
b78137f5118e plugins.archive: Add a header comment
Kim Alvefur <zash@zash.se>
parents: 275
diff changeset
4
292
b674f5ca85d4 plugins.archive: Add local verse
Kim Alvefur <zash@zash.se>
parents: 291
diff changeset
5 local verse = require "verse";
293
65fb9ae79014 plugins.archive: Import util.stanza directly and use it
Kim Alvefur <zash@zash.se>
parents: 292
diff changeset
6 local st = require "util.stanza";
273
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
7 local xmlns_mam = "urn:xmpp:mam:tmp"
295
5f7203bf1dae plugins.archive: Move namespaces to the top
Kim Alvefur <zash@zash.se>
parents: 294
diff changeset
8 local xmlns_forward = "urn:xmpp:forward:0";
5f7203bf1dae plugins.archive: Move namespaces to the top
Kim Alvefur <zash@zash.se>
parents: 294
diff changeset
9 local xmlns_delay = "urn:xmpp:delay";
273
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
10 local uuid = require "util.uuid".generate;
297
447dffdaf46c plugins.archive: Parse the timestamp
Kim Alvefur <zash@zash.se>
parents: 296
diff changeset
11 local parse_datetime = require "util.datetime".parse;
303
0dda04d5eb84 plugins.archive: Treat query params correctly
Kim Alvefur <zash@zash.se>
parents: 297
diff changeset
12 local datetime = require "util.datetime".datetime;
0dda04d5eb84 plugins.archive: Treat query params correctly
Kim Alvefur <zash@zash.se>
parents: 297
diff changeset
13 local tonumber = tonumber;
273
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
14
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
15 function verse.plugins.archive(stream)
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
16 function stream:query_archive(where, query_params, callback)
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
17 local queryid = uuid();
293
65fb9ae79014 plugins.archive: Import util.stanza directly and use it
Kim Alvefur <zash@zash.se>
parents: 292
diff changeset
18 local query_st = st.iq{ type="get", to = where }
273
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
19 :tag("query", { xmlns = xmlns_mam, queryid = queryid });
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
20
303
0dda04d5eb84 plugins.archive: Treat query params correctly
Kim Alvefur <zash@zash.se>
parents: 297
diff changeset
21 local qwith = query_params["with"];
0dda04d5eb84 plugins.archive: Treat query params correctly
Kim Alvefur <zash@zash.se>
parents: 297
diff changeset
22 if qwith then
0dda04d5eb84 plugins.archive: Treat query params correctly
Kim Alvefur <zash@zash.se>
parents: 297
diff changeset
23 query_st:tag("with"):text(qwith):up();
0dda04d5eb84 plugins.archive: Treat query params correctly
Kim Alvefur <zash@zash.se>
parents: 297
diff changeset
24 end
0dda04d5eb84 plugins.archive: Treat query params correctly
Kim Alvefur <zash@zash.se>
parents: 297
diff changeset
25
0dda04d5eb84 plugins.archive: Treat query params correctly
Kim Alvefur <zash@zash.se>
parents: 297
diff changeset
26 local qstart, qend = tonumber(query_params["start"]), tonumber(query_params["end"]);
0dda04d5eb84 plugins.archive: Treat query params correctly
Kim Alvefur <zash@zash.se>
parents: 297
diff changeset
27 if qstart then
0dda04d5eb84 plugins.archive: Treat query params correctly
Kim Alvefur <zash@zash.se>
parents: 297
diff changeset
28 query_st:tag("start"):text(datetime(qstart)):up();
0dda04d5eb84 plugins.archive: Treat query params correctly
Kim Alvefur <zash@zash.se>
parents: 297
diff changeset
29 end
0dda04d5eb84 plugins.archive: Treat query params correctly
Kim Alvefur <zash@zash.se>
parents: 297
diff changeset
30 if qend then
0dda04d5eb84 plugins.archive: Treat query params correctly
Kim Alvefur <zash@zash.se>
parents: 297
diff changeset
31 query_st:tag("end"):text(datetime(qend)):up();
273
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
32 end
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
33
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
34 local results = {};
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
35 local function handle_archived_message(message)
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
36 local result_tag = message:get_child("result", xmlns_mam);
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
37 if result_tag and result_tag.attr.queryid == queryid then
295
5f7203bf1dae plugins.archive: Move namespaces to the top
Kim Alvefur <zash@zash.se>
parents: 294
diff changeset
38 local forwarded = message:get_child("forwarded", xmlns_forward);
273
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
39
296
78ddfd30c74e plugins.archive: Collect the archive id
Kim Alvefur <zash@zash.se>
parents: 295
diff changeset
40 local id = result_tag.attr.id;
295
5f7203bf1dae plugins.archive: Move namespaces to the top
Kim Alvefur <zash@zash.se>
parents: 294
diff changeset
41 local delay = forwarded:get_child("delay", xmlns_delay);
297
447dffdaf46c plugins.archive: Parse the timestamp
Kim Alvefur <zash@zash.se>
parents: 296
diff changeset
42 local stamp = delay and parse_datetime(delay.attr.stamp) or nil;
273
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
43
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
44 local message = forwarded:get_child("message", "jabber:client")
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
45
296
78ddfd30c74e plugins.archive: Collect the archive id
Kim Alvefur <zash@zash.se>
parents: 295
diff changeset
46 results[#results+1] = { id = id, stamp = stamp, message = message };
273
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
47 return true
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
48 end
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
49 end
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
50
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
51 self:hook("message", handle_archived_message, 1);
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
52 self:send_iq(query_st, function(reply)
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
53 self:unhook("message", handle_archived_message);
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
54 callback(reply.attr.type == "result" and #results, results);
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
55 return true
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
56 end);
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
57 end
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
58
294
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
59 local default_attrs = {
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
60 always = true, [true] = "always",
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
61 never = false, [false] = "never",
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
62 roster = "roster",
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
63 }
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
64
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
65 local function prefs_decode(stanza) -- from XML
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
66 local prefs = {};
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
67 local default = stanza.attr.default;
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
68
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
69 if default then
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
70 prefs[false] = default_attrs[default];
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
71 end
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
72
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
73 local always = stanza:get_child("always");
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
74 if always then
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
75 for rule in always:childtags("jid") do
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
76 local jid = rule:get_text();
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
77 prefs[jid] = true;
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
78 end
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
79 end
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
80
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
81 local never = stanza:get_child("never");
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
82 if never then
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
83 for rule in never:childtags("jid") do
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
84 local jid = rule:get_text();
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
85 prefs[jid] = false;
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
86 end
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
87 end
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
88 return prefs;
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
89 end
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
90
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
91 local function prefs_encode(prefs) -- into XML
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
92 local default
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
93 default, prefs[false] = prefs[false], nil;
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
94 if default ~= nil then
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
95 default = default_attrs[default];
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
96 end
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
97 local reply = st.stanza("prefs", { xmlns = xmlns_mam, default = default })
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
98 local always = st.stanza("always");
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
99 local never = st.stanza("never");
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
100 for k,v in pairs(prefs) do
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
101 (v and always or never):tag("jid"):text(k):up();
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
102 end
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
103 return reply:add_child(always):add_child(never);
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
104 end
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
105
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
106 function stream:archive_prefs_get(callback)
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
107 self:send_iq(st.iq{ type="get" }:tag("prefs", { xmlns = xmlns_mam }),
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
108 function(result)
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
109 if result and result.attr.type == "result" and result.tags[1] then
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
110 local prefs = prefs_decode(result.tags[1]);
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
111 callback(prefs, result);
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
112 else
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
113 callback(nil, result);
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
114 end
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
115 end);
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
116 end
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
117
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
118 function stream:archive_prefs_set(prefs, callback)
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
119 self:send_iq(st.iq{ type="set" }:add_child(prefs_encode(prefs)), callback);
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
120 end
273
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
121 end