Annotate

plugins/archive.lua @ 445:b119dc4d8bc2

plugins.smacks: Don't warn about zero stanzas acked It's only if the count somehow goes backwards that something is really wrong. An ack for zero stanzas is fine and we don't need to do anything.
author Kim Alvefur <zash@zash.se>
date Thu, 10 Jun 2021 11:58:23 +0200
parent 428:bde804b01f28
child 457:73d4eb93657b
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";
409
171c4a8cc3de plugins.archive: Update to XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 380
diff changeset
7 local xmlns_mam = "urn:xmpp:mam:2"
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;
353
8cd05c3d0f1f plugins.archive: Update to MAM version 0.3
Kim Alvefur <zash@zash.se>
parents: 345
diff changeset
13 local dataform = require"util.dataforms".new;
304
e09ae2395d41 squishy, plugins.archive: Fetch RSM lib from prosody-modules and use.
Kim Alvefur <zash@zash.se>
parents: 303
diff changeset
14 local rsm = require "util.rsm";
e09ae2395d41 squishy, plugins.archive: Fetch RSM lib from prosody-modules and use.
Kim Alvefur <zash@zash.se>
parents: 303
diff changeset
15 local NULL = {};
273
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
16
353
8cd05c3d0f1f plugins.archive: Update to MAM version 0.3
Kim Alvefur <zash@zash.se>
parents: 345
diff changeset
17 local query_form = dataform {
8cd05c3d0f1f plugins.archive: Update to MAM version 0.3
Kim Alvefur <zash@zash.se>
parents: 345
diff changeset
18 { name = "FORM_TYPE"; type = "hidden"; value = xmlns_mam; };
8cd05c3d0f1f plugins.archive: Update to MAM version 0.3
Kim Alvefur <zash@zash.se>
parents: 345
diff changeset
19 { name = "with"; type = "jid-single"; };
8cd05c3d0f1f plugins.archive: Update to MAM version 0.3
Kim Alvefur <zash@zash.se>
parents: 345
diff changeset
20 { name = "start"; type = "text-single" };
8cd05c3d0f1f plugins.archive: Update to MAM version 0.3
Kim Alvefur <zash@zash.se>
parents: 345
diff changeset
21 { name = "end"; type = "text-single"; };
8cd05c3d0f1f plugins.archive: Update to MAM version 0.3
Kim Alvefur <zash@zash.se>
parents: 345
diff changeset
22 };
8cd05c3d0f1f plugins.archive: Update to MAM version 0.3
Kim Alvefur <zash@zash.se>
parents: 345
diff changeset
23
273
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
24 function verse.plugins.archive(stream)
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
25 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
26 local queryid = uuid();
353
8cd05c3d0f1f plugins.archive: Update to MAM version 0.3
Kim Alvefur <zash@zash.se>
parents: 345
diff changeset
27 local query_st = st.iq{ type="set", to = where }
273
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
28 :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
29
380
0891b4e27766 Discard trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 353
diff changeset
30
303
0dda04d5eb84 plugins.archive: Treat query params correctly
Kim Alvefur <zash@zash.se>
parents: 297
diff changeset
31 local qstart, qend = tonumber(query_params["start"]), tonumber(query_params["end"]);
353
8cd05c3d0f1f plugins.archive: Update to MAM version 0.3
Kim Alvefur <zash@zash.se>
parents: 345
diff changeset
32 query_params["start"] = qstart and datetime(qstart);
8cd05c3d0f1f plugins.archive: Update to MAM version 0.3
Kim Alvefur <zash@zash.se>
parents: 345
diff changeset
33 query_params["end"] = qend and datetime(qend);
304
e09ae2395d41 squishy, plugins.archive: Fetch RSM lib from prosody-modules and use.
Kim Alvefur <zash@zash.se>
parents: 303
diff changeset
34
353
8cd05c3d0f1f plugins.archive: Update to MAM version 0.3
Kim Alvefur <zash@zash.se>
parents: 345
diff changeset
35 query_st:add_child(query_form:form(query_params, "submit"));
8cd05c3d0f1f plugins.archive: Update to MAM version 0.3
Kim Alvefur <zash@zash.se>
parents: 345
diff changeset
36 -- query_st:up();
305
4a0206505b9d plugins.archive: Don't modify the query params table
Kim Alvefur <zash@zash.se>
parents: 304
diff changeset
37 query_st:add_child(rsm.generate(query_params));
273
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
38
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
39 local results = {};
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
40 local function handle_archived_message(message)
353
8cd05c3d0f1f plugins.archive: Update to MAM version 0.3
Kim Alvefur <zash@zash.se>
parents: 345
diff changeset
41
273
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
42 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
43 if result_tag and result_tag.attr.queryid == queryid then
345
266a96ae4c0d plugins.archive: Update for MAM 0.2
Kim Alvefur <zash@zash.se>
parents: 305
diff changeset
44 local forwarded = result_tag: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
45
296
78ddfd30c74e plugins.archive: Collect the archive id
Kim Alvefur <zash@zash.se>
parents: 295
diff changeset
46 local id = result_tag.attr.id;
295
5f7203bf1dae plugins.archive: Move namespaces to the top
Kim Alvefur <zash@zash.se>
parents: 294
diff changeset
47 local delay = forwarded:get_child("delay", xmlns_delay);
297
447dffdaf46c plugins.archive: Parse the timestamp
Kim Alvefur <zash@zash.se>
parents: 296
diff changeset
48 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
49
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
50 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
51
296
78ddfd30c74e plugins.archive: Collect the archive id
Kim Alvefur <zash@zash.se>
parents: 295
diff changeset
52 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
53 return true
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
54 end
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
55 end
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
56
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
57 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
58 self:send_iq(query_st, function(reply)
409
171c4a8cc3de plugins.archive: Update to XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 380
diff changeset
59 self:unhook("message", handle_archived_message);
353
8cd05c3d0f1f plugins.archive: Update to MAM version 0.3
Kim Alvefur <zash@zash.se>
parents: 345
diff changeset
60 if reply.attr.type == "error" then
8cd05c3d0f1f plugins.archive: Update to MAM version 0.3
Kim Alvefur <zash@zash.se>
parents: 345
diff changeset
61 self:warn(table.concat({reply:get_error()}, " "))
8cd05c3d0f1f plugins.archive: Update to MAM version 0.3
Kim Alvefur <zash@zash.se>
parents: 345
diff changeset
62 callback(false, reply:get_error())
409
171c4a8cc3de plugins.archive: Update to XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 380
diff changeset
63 return true;
353
8cd05c3d0f1f plugins.archive: Update to MAM version 0.3
Kim Alvefur <zash@zash.se>
parents: 345
diff changeset
64 end
428
bde804b01f28 Fix typos (thanks Link Mauve and codespell)
Kim Alvefur <zash@zash.se>
parents: 427
diff changeset
65 local finished = reply:get_child("fin", xmlns_mam)
bde804b01f28 Fix typos (thanks Link Mauve and codespell)
Kim Alvefur <zash@zash.se>
parents: 427
diff changeset
66 if finished then
bde804b01f28 Fix typos (thanks Link Mauve and codespell)
Kim Alvefur <zash@zash.se>
parents: 427
diff changeset
67 local rset = rsm.get(finished);
409
171c4a8cc3de plugins.archive: Update to XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 380
diff changeset
68 for k,v in pairs(rset or NULL) do results[k]=v; end
171c4a8cc3de plugins.archive: Update to XEP-0313 v0.6
Kim Alvefur <zash@zash.se>
parents: 380
diff changeset
69 end
413
41c67bf8c010 plugins.archive: Call callback even f there were no <fin> element
Kim Alvefur <zash@zash.se>
parents: 412
diff changeset
70 callback(results);
41c67bf8c010 plugins.archive: Call callback even f there were no <fin> element
Kim Alvefur <zash@zash.se>
parents: 412
diff changeset
71 return true
273
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
72 end);
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
73 end
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
74
294
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
75 local default_attrs = {
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
76 always = true, [true] = "always",
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
77 never = false, [false] = "never",
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
78 roster = "roster",
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
79 }
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 function prefs_decode(stanza) -- from XML
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
82 local prefs = {};
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
83 local default = stanza.attr.default;
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
84
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
85 if default then
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
86 prefs[false] = default_attrs[default];
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
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
89 local always = stanza:get_child("always");
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
90 if always then
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
91 for rule in always:childtags("jid") do
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
92 local jid = rule:get_text();
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
93 prefs[jid] = true;
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
94 end
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
95 end
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
96
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
97 local never = stanza:get_child("never");
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
98 if never then
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
99 for rule in never:childtags("jid") do
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
100 local jid = rule:get_text();
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
101 prefs[jid] = false;
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 end
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
104 return prefs;
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
105 end
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
106
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
107 local function prefs_encode(prefs) -- into XML
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
108 local default
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
109 default, prefs[false] = prefs[false], nil;
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
110 if default ~= nil then
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
111 default = default_attrs[default];
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
112 end
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
113 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
114 local always = st.stanza("always");
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
115 local never = st.stanza("never");
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
116 for k,v in pairs(prefs) do
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
117 (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
118 end
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
119 return reply:add_child(always):add_child(never);
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
120 end
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
121
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
122 function stream:archive_prefs_get(callback)
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
123 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
124 function(result)
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
125 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
126 local prefs = prefs_decode(result.tags[1]);
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
127 callback(prefs, result);
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
128 else
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
129 callback(nil, result);
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
130 end
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
131 end);
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
132 end
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
133
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
134 function stream:archive_prefs_set(prefs, callback)
ac039aa3a4ef plugins.archive: Implement archiving preferences
Kim Alvefur <zash@zash.se>
parents: 293
diff changeset
135 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
136 end
273
c5b7a4c717a6 plugins.archive: Experimental implementation of the Message Archive Management ProtoXEP
Kim Alvefur <zash@zash.se>
parents:
diff changeset
137 end