annotate mod_archive/mod_archive.lua @ 233:4ff8068b4d94

mod_archive: fixed some serious bugs.
author shinysky<shinysky1986(AT)gmail.com>
date Wed, 04 Aug 2010 12:36:27 +0800
parents 0b9e8721b9c2
children d900be0dee3e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
157
86c28405c5da initial commitment of mod_archive
shinysky<shinysky1986(AT)gmail.com>
parents:
diff changeset
1 -- Prosody IM
159
9a37898f4f7c mod_archive: Added features: Determining Server Support & Determining Preferences
shinysky<shinysky1986(AT)gmail.com>
parents: 157
diff changeset
2 -- Copyright (C) 2010 Dai Zhiwei
157
86c28405c5da initial commitment of mod_archive
shinysky<shinysky1986(AT)gmail.com>
parents:
diff changeset
3 --
86c28405c5da initial commitment of mod_archive
shinysky<shinysky1986(AT)gmail.com>
parents:
diff changeset
4 -- This project is MIT/X11 licensed. Please see the
86c28405c5da initial commitment of mod_archive
shinysky<shinysky1986(AT)gmail.com>
parents:
diff changeset
5 -- COPYING file in the source package for more information.
86c28405c5da initial commitment of mod_archive
shinysky<shinysky1986(AT)gmail.com>
parents:
diff changeset
6 --
86c28405c5da initial commitment of mod_archive
shinysky<shinysky1986(AT)gmail.com>
parents:
diff changeset
7
86c28405c5da initial commitment of mod_archive
shinysky<shinysky1986(AT)gmail.com>
parents:
diff changeset
8 local st = require "util.stanza";
165
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
9 local dm = require "util.datamanager";
178
62f47a93b5b7 mod_archive: Now we can archive messages, even though not in organized way.
shinysky<shinysky1986(AT)gmail.com>
parents: 172
diff changeset
10 local jid = require "util.jid";
193
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
11 local datetime = require "util.datetime";
165
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
12
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
13 local PREFS_DIR = "archive_prefs";
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
14 local ARCHIVE_DIR = "archive";
198
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
15 local xmlns_rsm = "http://jabber.org/protocol/rsm";
210
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
16 local DEFAULT_MAX = 100;
157
86c28405c5da initial commitment of mod_archive
shinysky<shinysky1986(AT)gmail.com>
parents:
diff changeset
17
221
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
18 local FORCE_ARCHIVING = false;
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
19 local AUTO_ARCHIVING_ENABLED = true;
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
20
222
6e6a08b0531a mod_archive: minor fix.
shinysky<shinysky1986(AT)gmail.com>
parents: 221
diff changeset
21 local HOST = 'localhost';
6e6a08b0531a mod_archive: minor fix.
shinysky<shinysky1986(AT)gmail.com>
parents: 221
diff changeset
22
157
86c28405c5da initial commitment of mod_archive
shinysky<shinysky1986(AT)gmail.com>
parents:
diff changeset
23 module:add_feature("urn:xmpp:archive");
159
9a37898f4f7c mod_archive: Added features: Determining Server Support & Determining Preferences
shinysky<shinysky1986(AT)gmail.com>
parents: 157
diff changeset
24 module:add_feature("urn:xmpp:archive:auto");
9a37898f4f7c mod_archive: Added features: Determining Server Support & Determining Preferences
shinysky<shinysky1986(AT)gmail.com>
parents: 157
diff changeset
25 module:add_feature("urn:xmpp:archive:manage");
9a37898f4f7c mod_archive: Added features: Determining Server Support & Determining Preferences
shinysky<shinysky1986(AT)gmail.com>
parents: 157
diff changeset
26 module:add_feature("urn:xmpp:archive:manual");
9a37898f4f7c mod_archive: Added features: Determining Server Support & Determining Preferences
shinysky<shinysky1986(AT)gmail.com>
parents: 157
diff changeset
27 module:add_feature("urn:xmpp:archive:pref");
195
4d9ed6374a1f mod_archive: XEP-0059: Result Set Management - Limiting the Number of Items; Paging Forwards Through a Result Set; Getting the Item Count
shinysky<shinysky1986(AT)gmail.com>
parents: 193
diff changeset
28 module:add_feature("http://jabber.org/protocol/rsm");
157
86c28405c5da initial commitment of mod_archive
shinysky<shinysky1986(AT)gmail.com>
parents:
diff changeset
29
165
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
30 ------------------------------------------------------------
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
31 -- Utils
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
32 ------------------------------------------------------------
182
43d9e0944276 mod_archive: now auto archiving is almost done.
shinysky<shinysky1986(AT)gmail.com>
parents: 178
diff changeset
33 local function load_prefs(node, host)
43d9e0944276 mod_archive: now auto archiving is almost done.
shinysky<shinysky1986(AT)gmail.com>
parents: 178
diff changeset
34 return st.deserialize(dm.load(node, host, PREFS_DIR));
43d9e0944276 mod_archive: now auto archiving is almost done.
shinysky<shinysky1986(AT)gmail.com>
parents: 178
diff changeset
35 end
43d9e0944276 mod_archive: now auto archiving is almost done.
shinysky<shinysky1986(AT)gmail.com>
parents: 178
diff changeset
36
43d9e0944276 mod_archive: now auto archiving is almost done.
shinysky<shinysky1986(AT)gmail.com>
parents: 178
diff changeset
37 local function store_prefs(data, node, host)
43d9e0944276 mod_archive: now auto archiving is almost done.
shinysky<shinysky1986(AT)gmail.com>
parents: 178
diff changeset
38 dm.store(node, host, PREFS_DIR, st.preserialize(data));
165
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
39 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
40
225
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
41 local function os_date()
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
42 return os.date("!*t");
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
43 end
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
44
233
4ff8068b4d94 mod_archive: fixed some serious bugs.
shinysky<shinysky1986(AT)gmail.com>
parents: 230
diff changeset
45 local function date_time(localtime)
4ff8068b4d94 mod_archive: fixed some serious bugs.
shinysky<shinysky1986(AT)gmail.com>
parents: 230
diff changeset
46 return datetime.datetime(localtime);
4ff8068b4d94 mod_archive: fixed some serious bugs.
shinysky<shinysky1986(AT)gmail.com>
parents: 230
diff changeset
47 end
4ff8068b4d94 mod_archive: fixed some serious bugs.
shinysky<shinysky1986(AT)gmail.com>
parents: 230
diff changeset
48
4ff8068b4d94 mod_archive: fixed some serious bugs.
shinysky<shinysky1986(AT)gmail.com>
parents: 230
diff changeset
49 local function date_format(s)
4ff8068b4d94 mod_archive: fixed some serious bugs.
shinysky<shinysky1986(AT)gmail.com>
parents: 230
diff changeset
50 return os.date("%Y-%m-%dT%H:%M:%SZ", s);
193
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
51 end
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
52
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
53 local function date_parse(s)
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
54 local year, month, day, hour, min, sec = s:match("(....)-?(..)-?(..)T(..):(..):(..)Z");
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
55 return os.time({year=year, month=month, day=day, hour=hour, min=min, sec=sec});
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
56 end
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
57
230
0b9e8721b9c2 mod_archive: make sure result set are sorted in chronological order.
shinysky<shinysky1986(AT)gmail.com>
parents: 228
diff changeset
58 local function list_reverse(list)
0b9e8721b9c2 mod_archive: make sure result set are sorted in chronological order.
shinysky<shinysky1986(AT)gmail.com>
parents: 228
diff changeset
59 local t, n = {}, #list
0b9e8721b9c2 mod_archive: make sure result set are sorted in chronological order.
shinysky<shinysky1986(AT)gmail.com>
parents: 228
diff changeset
60 for i = 1, n do t[i] = list[n-i+1] end -- reverse
0b9e8721b9c2 mod_archive: make sure result set are sorted in chronological order.
shinysky<shinysky1986(AT)gmail.com>
parents: 228
diff changeset
61 for i = 1, n do list[i] = t[i] end -- copy back
0b9e8721b9c2 mod_archive: make sure result set are sorted in chronological order.
shinysky<shinysky1986(AT)gmail.com>
parents: 228
diff changeset
62 end
0b9e8721b9c2 mod_archive: make sure result set are sorted in chronological order.
shinysky<shinysky1986(AT)gmail.com>
parents: 228
diff changeset
63
225
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
64 -- local function list_push(node, host, collection)
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
65 -- local data = dm.list_load(node, host, ARCHIVE_DIR);
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
66 -- if data then
233
4ff8068b4d94 mod_archive: fixed some serious bugs.
shinysky<shinysky1986(AT)gmail.com>
parents: 230
diff changeset
67 -- table.insert(data, 1, collection);
225
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
68 -- dm.list_store(node, host, ARCHIVE_DIR, st.preserialize(data));
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
69 -- else
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
70 -- dm.list_append(node, host, ARCHIVE_DIR, st.preserialize(collection));
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
71 -- end
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
72 -- end
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
73
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
74 local function list_insert(node, host, collection)
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
75 local data = dm.list_load(node, host, ARCHIVE_DIR);
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
76 if data then
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
77 local s, e = 1, #data;
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
78 while true do
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
79 local c = st.deserialize(data[s]);
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
80 if collection.attr["start"] >= c.attr["start"] then
233
4ff8068b4d94 mod_archive: fixed some serious bugs.
shinysky<shinysky1986(AT)gmail.com>
parents: 230
diff changeset
81 table.insert(data, s, collection);
225
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
82 break;
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
83 end
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
84 c = st.deserialize(data[e]);
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
85 if collection.attr["start"] <= c.attr["start"] then
233
4ff8068b4d94 mod_archive: fixed some serious bugs.
shinysky<shinysky1986(AT)gmail.com>
parents: 230
diff changeset
86 table.insert(data, e+1, collection);
225
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
87 break;
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
88 end
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
89 local m = math.floor((s + e) / 2);
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
90 c = st.deserialize(data[m]);
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
91 if collection.attr["start"] > c.attr["start"] then
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
92 e = m - 1;
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
93 elseif collection.attr["start"] < c.attr["start"] then
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
94 s = m + 1;
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
95 else
233
4ff8068b4d94 mod_archive: fixed some serious bugs.
shinysky<shinysky1986(AT)gmail.com>
parents: 230
diff changeset
96 table.insert(data, m, collection);
225
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
97 break;
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
98 end
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
99 end
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
100 dm.list_store(node, host, ARCHIVE_DIR, st.preserialize(data));
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
101 else
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
102 dm.list_append(node, host, ARCHIVE_DIR, st.preserialize(collection));
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
103 end
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
104 end
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
105
182
43d9e0944276 mod_archive: now auto archiving is almost done.
shinysky<shinysky1986(AT)gmail.com>
parents: 178
diff changeset
106 local function store_msg(msg, node, host, isfrom)
43d9e0944276 mod_archive: now auto archiving is almost done.
shinysky<shinysky1986(AT)gmail.com>
parents: 178
diff changeset
107 local body = msg:child_with_name("body");
43d9e0944276 mod_archive: now auto archiving is almost done.
shinysky<shinysky1986(AT)gmail.com>
parents: 178
diff changeset
108 local thread = msg:child_with_name("thread");
43d9e0944276 mod_archive: now auto archiving is almost done.
shinysky<shinysky1986(AT)gmail.com>
parents: 178
diff changeset
109 local data = dm.list_load(node, host, ARCHIVE_DIR);
225
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
110 local tag = isfrom and "from" or "to";
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
111 local with = isfrom and msg.attr.to or msg.attr.from;
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
112 local utc = os_date();
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
113 local utc_secs = os.time(utc);
233
4ff8068b4d94 mod_archive: fixed some serious bugs.
shinysky<shinysky1986(AT)gmail.com>
parents: 230
diff changeset
114 local utc_datetime = date_format(utc_secs);
182
43d9e0944276 mod_archive: now auto archiving is almost done.
shinysky<shinysky1986(AT)gmail.com>
parents: 178
diff changeset
115 if data then
230
0b9e8721b9c2 mod_archive: make sure result set are sorted in chronological order.
shinysky<shinysky1986(AT)gmail.com>
parents: 228
diff changeset
116 -- The collection list are in REVERSE chronological order
225
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
117 for k, v in ipairs(data) do
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
118 local collection = st.deserialize(v);
226
7fe326037070 mod_archive: exit for loop as soon as possible.
shinysky<shinysky1986(AT)gmail.com>
parents: 225
diff changeset
119 local do_save = function()
225
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
120 local dt = 1;
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
121 for i = #collection, 1, -1 do
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
122 local s = collection[i].attr["utc_secs"];
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
123 if s then
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
124 dt = os.difftime(utc_secs, tonumber(s));
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
125 break;
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
126 end
223
de71a52fc63a mod_archive: Mapping an message to some collection based on timestamp
shinysky<shinysky1986(AT)gmail.com>
parents: 222
diff changeset
127 end
225
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
128 collection:tag(tag, {secs=dt, utc_secs=utc_secs}):add_child(body);
182
43d9e0944276 mod_archive: now auto archiving is almost done.
shinysky<shinysky1986(AT)gmail.com>
parents: 178
diff changeset
129 local ver = tonumber(collection.attr["version"]) + 1;
43d9e0944276 mod_archive: now auto archiving is almost done.
shinysky<shinysky1986(AT)gmail.com>
parents: 178
diff changeset
130 collection.attr["version"] = tostring(ver);
225
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
131 collection.attr["access"] = utc_datetime;
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
132 data[k] = collection;
182
43d9e0944276 mod_archive: now auto archiving is almost done.
shinysky<shinysky1986(AT)gmail.com>
parents: 178
diff changeset
133 dm.list_store(node, host, ARCHIVE_DIR, st.preserialize(data));
226
7fe326037070 mod_archive: exit for loop as soon as possible.
shinysky<shinysky1986(AT)gmail.com>
parents: 225
diff changeset
134 end
7fe326037070 mod_archive: exit for loop as soon as possible.
shinysky<shinysky1986(AT)gmail.com>
parents: 225
diff changeset
135 if thread then
7fe326037070 mod_archive: exit for loop as soon as possible.
shinysky<shinysky1986(AT)gmail.com>
parents: 225
diff changeset
136 if collection.attr["thread"] == thread:get_text() then
7fe326037070 mod_archive: exit for loop as soon as possible.
shinysky<shinysky1986(AT)gmail.com>
parents: 225
diff changeset
137 do_save();
7fe326037070 mod_archive: exit for loop as soon as possible.
shinysky<shinysky1986(AT)gmail.com>
parents: 225
diff changeset
138 return;
7fe326037070 mod_archive: exit for loop as soon as possible.
shinysky<shinysky1986(AT)gmail.com>
parents: 225
diff changeset
139 end
7fe326037070 mod_archive: exit for loop as soon as possible.
shinysky<shinysky1986(AT)gmail.com>
parents: 225
diff changeset
140 else
7fe326037070 mod_archive: exit for loop as soon as possible.
shinysky<shinysky1986(AT)gmail.com>
parents: 225
diff changeset
141 local dt = os.difftime(utc_secs, date_parse(collection.attr["start"]));
7fe326037070 mod_archive: exit for loop as soon as possible.
shinysky<shinysky1986(AT)gmail.com>
parents: 225
diff changeset
142 if dt >= 14400 then break end
233
4ff8068b4d94 mod_archive: fixed some serious bugs.
shinysky<shinysky1986(AT)gmail.com>
parents: 230
diff changeset
143 if collection.attr["with"] == with then -- JID matching?
226
7fe326037070 mod_archive: exit for loop as soon as possible.
shinysky<shinysky1986(AT)gmail.com>
parents: 225
diff changeset
144 do_save();
7fe326037070 mod_archive: exit for loop as soon as possible.
shinysky<shinysky1986(AT)gmail.com>
parents: 225
diff changeset
145 return;
7fe326037070 mod_archive: exit for loop as soon as possible.
shinysky<shinysky1986(AT)gmail.com>
parents: 225
diff changeset
146 end
182
43d9e0944276 mod_archive: now auto archiving is almost done.
shinysky<shinysky1986(AT)gmail.com>
parents: 178
diff changeset
147 end
43d9e0944276 mod_archive: now auto archiving is almost done.
shinysky<shinysky1986(AT)gmail.com>
parents: 178
diff changeset
148 end
43d9e0944276 mod_archive: now auto archiving is almost done.
shinysky<shinysky1986(AT)gmail.com>
parents: 178
diff changeset
149 end
43d9e0944276 mod_archive: now auto archiving is almost done.
shinysky<shinysky1986(AT)gmail.com>
parents: 178
diff changeset
150 -- not found, create new collection
225
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
151 local collection = st.stanza('chat', {with=with, start=utc_datetime, thread=thread and thread:get_text() or nil, version='0', access=utc_datetime});
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
152 collection:tag(tag, {secs='0', utc_secs=utc_secs}):add_child(body);
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
153 list_insert(node, host, collection);
178
62f47a93b5b7 mod_archive: Now we can archive messages, even though not in organized way.
shinysky<shinysky1986(AT)gmail.com>
parents: 172
diff changeset
154 end
62f47a93b5b7 mod_archive: Now we can archive messages, even though not in organized way.
shinysky<shinysky1986(AT)gmail.com>
parents: 172
diff changeset
155
187
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
156 local function save_result(collection)
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
157 local save = st.stanza('save', {xmlns='urn:xmpp:archive'});
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
158 local chat = st.stanza('chat', collection.attr);
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
159 save:add_child(chat);
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
160 return save;
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
161 end
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
162
195
4d9ed6374a1f mod_archive: XEP-0059: Result Set Management - Limiting the Number of Items; Paging Forwards Through a Result Set; Getting the Item Count
shinysky<shinysky1986(AT)gmail.com>
parents: 193
diff changeset
163 local function gen_uid(c)
4d9ed6374a1f mod_archive: XEP-0059: Result Set Management - Limiting the Number of Items; Paging Forwards Through a Result Set; Getting the Item Count
shinysky<shinysky1986(AT)gmail.com>
parents: 193
diff changeset
164 return c.attr["start"] .. c.attr["with"];
4d9ed6374a1f mod_archive: XEP-0059: Result Set Management - Limiting the Number of Items; Paging Forwards Through a Result Set; Getting the Item Count
shinysky<shinysky1986(AT)gmail.com>
parents: 193
diff changeset
165 end
4d9ed6374a1f mod_archive: XEP-0059: Result Set Management - Limiting the Number of Items; Paging Forwards Through a Result Set; Getting the Item Count
shinysky<shinysky1986(AT)gmail.com>
parents: 193
diff changeset
166
221
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
167 local function tobool(s)
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
168 if not s then return nil; end
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
169 s = s:lower();
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
170 if s == 'true' or s == '1' then
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
171 return true;
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
172 elseif s == 'false' or s == '0' then
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
173 return false;
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
174 else
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
175 return nil;
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
176 end
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
177 end
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
178
165
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
179 ------------------------------------------------------------
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
180 -- Preferences
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
181 ------------------------------------------------------------
157
86c28405c5da initial commitment of mod_archive
shinysky<shinysky1986(AT)gmail.com>
parents:
diff changeset
182 local function preferences_handler(event)
165
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
183 local origin, stanza = event.origin, event.stanza;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
184 module:log("debug", "-- Enter preferences_handler()");
159
9a37898f4f7c mod_archive: Added features: Determining Server Support & Determining Preferences
shinysky<shinysky1986(AT)gmail.com>
parents: 157
diff changeset
185 module:log("debug", "-- pref:\n%s", tostring(stanza));
165
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
186 if stanza.attr.type == "get" then
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
187 local data = load_prefs(origin.username, origin.host);
159
9a37898f4f7c mod_archive: Added features: Determining Server Support & Determining Preferences
shinysky<shinysky1986(AT)gmail.com>
parents: 157
diff changeset
188 if data then
9a37898f4f7c mod_archive: Added features: Determining Server Support & Determining Preferences
shinysky<shinysky1986(AT)gmail.com>
parents: 157
diff changeset
189 origin.send(st.reply(stanza):add_child(data));
9a37898f4f7c mod_archive: Added features: Determining Server Support & Determining Preferences
shinysky<shinysky1986(AT)gmail.com>
parents: 157
diff changeset
190 else
9a37898f4f7c mod_archive: Added features: Determining Server Support & Determining Preferences
shinysky<shinysky1986(AT)gmail.com>
parents: 157
diff changeset
191 local reply = st.reply(stanza):tag('pref', {xmlns='urn:xmpp:archive'});
9a37898f4f7c mod_archive: Added features: Determining Server Support & Determining Preferences
shinysky<shinysky1986(AT)gmail.com>
parents: 157
diff changeset
192 reply:tag('default', {otr='concede', save='false', unset='true'}):up();
9a37898f4f7c mod_archive: Added features: Determining Server Support & Determining Preferences
shinysky<shinysky1986(AT)gmail.com>
parents: 157
diff changeset
193 reply:tag('method', {type='auto', use='concede'}):up();
9a37898f4f7c mod_archive: Added features: Determining Server Support & Determining Preferences
shinysky<shinysky1986(AT)gmail.com>
parents: 157
diff changeset
194 reply:tag('method', {type='local', use='concede'}):up();
9a37898f4f7c mod_archive: Added features: Determining Server Support & Determining Preferences
shinysky<shinysky1986(AT)gmail.com>
parents: 157
diff changeset
195 reply:tag('method', {type='manual', use='concede'}):up();
9a37898f4f7c mod_archive: Added features: Determining Server Support & Determining Preferences
shinysky<shinysky1986(AT)gmail.com>
parents: 157
diff changeset
196 reply:tag('auto', {save='false'}):up();
9a37898f4f7c mod_archive: Added features: Determining Server Support & Determining Preferences
shinysky<shinysky1986(AT)gmail.com>
parents: 157
diff changeset
197 origin.send(reply);
9a37898f4f7c mod_archive: Added features: Determining Server Support & Determining Preferences
shinysky<shinysky1986(AT)gmail.com>
parents: 157
diff changeset
198 end
9a37898f4f7c mod_archive: Added features: Determining Server Support & Determining Preferences
shinysky<shinysky1986(AT)gmail.com>
parents: 157
diff changeset
199 elseif stanza.attr.type == "set" then
165
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
200 local node, host = origin.username, origin.host;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
201 local data = load_prefs(node, host);
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
202 if not data then
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
203 data = st.stanza('pref', {xmlns='urn:xmpp:archive'});
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
204 data:tag('default', {otr='concede', save='false'}):up();
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
205 data:tag('method', {type='auto', use='concede'}):up();
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
206 data:tag('method', {type='local', use='concede'}):up();
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
207 data:tag('method', {type='manual', use='concede'}):up();
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
208 data:tag('auto', {save='false'}):up();
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
209 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
210 local elem = stanza.tags[1].tags[1]; -- iq:pref:xxx
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
211 if not elem then return false end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
212 -- "default" | "item" | "session" | "method"
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
213 elem.attr["xmlns"] = nil; -- TODO why there is an extra xmlns attr?
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
214 if elem.name == "default" then
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
215 local setting = data:child_with_name(elem.name)
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
216 for k, v in pairs(elem.attr) do
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
217 setting.attr[k] = v;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
218 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
219 -- setting.attr["unset"] = nil
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
220 elseif elem.name == "item" then
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
221 local found = false;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
222 for child in data:children() do
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
223 if child.name == elem.name and child.attr["jid"] == elem.attr["jid"] then
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
224 for k, v in pairs(elem.attr) do
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
225 child.attr[k] = v;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
226 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
227 found = true;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
228 break;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
229 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
230 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
231 if not found then
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
232 data:tag(elem.name, elem.attr):up();
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
233 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
234 elseif elem.name == "session" then
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
235 local found = false;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
236 for child in data:children() do
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
237 if child.name == elem.name and child.attr["thread"] == elem.attr["thread"] then
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
238 for k, v in pairs(elem.attr) do
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
239 child.attr[k] = v;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
240 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
241 found = true;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
242 break;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
243 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
244 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
245 if not found then
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
246 data:tag(elem.name, elem.attr):up();
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
247 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
248 elseif elem.name == "method" then
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
249 local newpref = stanza.tags[1]; -- iq:pref
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
250 for _, e in ipairs(newpref.tags) do
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
251 -- if e.name ~= "method" then continue end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
252 local found = false;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
253 for child in data:children() do
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
254 if child.name == "method" and child.attr["type"] == e.attr["type"] then
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
255 child.attr["use"] = e.attr["use"];
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
256 found = true;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
257 break;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
258 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
259 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
260 if not found then
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
261 data:tag(e.name, e.attr):up();
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
262 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
263 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
264 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
265 store_prefs(data, node, host);
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
266 origin.send(st.reply(stanza));
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
267 local user = bare_sessions[node.."@"..host];
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
268 local push = st.iq({type="set"});
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
269 push = push:tag('pref', {xmlns='urn:xmpp:archive'});
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
270 if elem.name == "method" then
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
271 for child in data:children() do
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
272 if child.name == "method" then
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
273 push:add_child(child);
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
274 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
275 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
276 else
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
277 push:add_child(elem);
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
278 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
279 push = push:up();
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
280 for _, res in pairs(user and user.sessions or NULL) do -- broadcast to all resources
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
281 if res.presence then -- to resource
172
ac826882a8cf mod_archive: The element auto MAY include a 'scope' attribute; Added message hook.
shinysky<shinysky1986(AT)gmail.com>
parents: 165
diff changeset
282 push.attr.to = res.full_jid;
165
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
283 res.send(push);
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
284 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
285 end
159
9a37898f4f7c mod_archive: Added features: Determining Server Support & Determining Preferences
shinysky<shinysky1986(AT)gmail.com>
parents: 157
diff changeset
286 end
9a37898f4f7c mod_archive: Added features: Determining Server Support & Determining Preferences
shinysky<shinysky1986(AT)gmail.com>
parents: 157
diff changeset
287 return true;
9a37898f4f7c mod_archive: Added features: Determining Server Support & Determining Preferences
shinysky<shinysky1986(AT)gmail.com>
parents: 157
diff changeset
288 end
9a37898f4f7c mod_archive: Added features: Determining Server Support & Determining Preferences
shinysky<shinysky1986(AT)gmail.com>
parents: 157
diff changeset
289
9a37898f4f7c mod_archive: Added features: Determining Server Support & Determining Preferences
shinysky<shinysky1986(AT)gmail.com>
parents: 157
diff changeset
290 local function itemremove_handler(event)
193
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
291 -- TODO use 'assert' to check incoming stanza?
187
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
292 -- or use pcall() to catch exceptions?
165
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
293 local origin, stanza = event.origin, event.stanza;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
294 if stanza.attr.type ~= "set" then
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
295 return false;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
296 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
297 local elem = stanza.tags[1].tags[1];
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
298 if not elem or elem.name ~= "item" then
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
299 return false;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
300 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
301 local node, host = origin.username, origin.host;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
302 local data = load_prefs(node, host);
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
303 if not data then
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
304 return false;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
305 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
306 for i, child in ipairs(data) do
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
307 if child.name == "item" and child.attr["jid"] == elem.attr["jid"] then
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
308 table.remove(data, i)
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
309 break;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
310 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
311 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
312 store_prefs(data, node, host);
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
313 origin.send(st.reply(stanza));
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
314 return true;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
315 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
316
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
317 local function sessionremove_handler(event)
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
318 local origin, stanza = event.origin, event.stanza;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
319 if stanza.attr.type ~= "set" then
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
320 return false;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
321 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
322 local elem = stanza.tags[1].tags[1];
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
323 if not elem or elem.name ~= "session" then
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
324 return false;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
325 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
326 local node, host = origin.username, origin.host;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
327 local data = load_prefs(node, host);
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
328 if not data then
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
329 return false;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
330 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
331 for i, child in ipairs(data) do
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
332 if child.name == "session" and child.attr["thread"] == elem.attr["thread"] then
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
333 table.remove(data, i)
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
334 break;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
335 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
336 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
337 store_prefs(data, node, host);
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
338 origin.send(st.reply(stanza));
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
339 return true;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
340 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
341
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
342 local function auto_handler(event)
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
343 -- event.origin.send(st.error_reply(event.stanza, "cancel", "feature-not-implemented"));
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
344 local origin, stanza = event.origin, event.stanza;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
345 if stanza.attr.type ~= "set" then
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
346 return false;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
347 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
348 local elem = stanza.tags[1];
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
349 local node, host = origin.username, origin.host;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
350 local data = load_prefs(node, host);
226
7fe326037070 mod_archive: exit for loop as soon as possible.
shinysky<shinysky1986(AT)gmail.com>
parents: 225
diff changeset
351 if not data then -- TODO create new pref?
165
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
352 return false;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
353 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
354 local setting = data:child_with_name(elem.name)
172
ac826882a8cf mod_archive: The element auto MAY include a 'scope' attribute; Added message hook.
shinysky<shinysky1986(AT)gmail.com>
parents: 165
diff changeset
355 for k, v in pairs(elem.attr) do
ac826882a8cf mod_archive: The element auto MAY include a 'scope' attribute; Added message hook.
shinysky<shinysky1986(AT)gmail.com>
parents: 165
diff changeset
356 setting.attr[k] = v;
ac826882a8cf mod_archive: The element auto MAY include a 'scope' attribute; Added message hook.
shinysky<shinysky1986(AT)gmail.com>
parents: 165
diff changeset
357 end
165
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
358 store_prefs(data, node, host);
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
359 origin.send(st.reply(stanza));
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
360 return true;
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
361 end
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
362
193
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
363 ------------------------------------------------------------
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
364 -- Manual Archiving
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
365 ------------------------------------------------------------
159
9a37898f4f7c mod_archive: Added features: Determining Server Support & Determining Preferences
shinysky<shinysky1986(AT)gmail.com>
parents: 157
diff changeset
366 local function save_handler(event)
187
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
367 local origin, stanza = event.origin, event.stanza;
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
368 if stanza.attr.type ~= "set" then
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
369 return false;
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
370 end
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
371 local elem = stanza.tags[1].tags[1];
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
372 if not elem or elem.name ~= "chat" then
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
373 return false;
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
374 end
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
375 local node, host = origin.username, origin.host;
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
376 local data = dm.list_load(node, host, ARCHIVE_DIR);
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
377 if data then
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
378 for k, v in ipairs(data) do
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
379 local collection = st.deserialize(v);
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
380 if collection.attr["with"] == elem.attr["with"]
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
381 and collection.attr["start"] == elem.attr["start"] then
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
382 -- TODO check if there're duplicates
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
383 for newchild in elem:children() do
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
384 if type(newchild) == "table" then
188
5e8ea3733dc6 mod_archive: there can be only one note/previous/next/x element in a collection.
shinysky<shinysky1986(AT)gmail.com>
parents: 187
diff changeset
385 if newchild.name == "from" or newchild.name == "to" then
5e8ea3733dc6 mod_archive: there can be only one note/previous/next/x element in a collection.
shinysky<shinysky1986(AT)gmail.com>
parents: 187
diff changeset
386 collection:add_child(newchild);
193
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
387 elseif newchild.name == "note" or newchild.name == "previous"
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
388 or newchild.name == "next" or newchild.name == "x" then
188
5e8ea3733dc6 mod_archive: there can be only one note/previous/next/x element in a collection.
shinysky<shinysky1986(AT)gmail.com>
parents: 187
diff changeset
389 local found = false;
5e8ea3733dc6 mod_archive: there can be only one note/previous/next/x element in a collection.
shinysky<shinysky1986(AT)gmail.com>
parents: 187
diff changeset
390 for i, c in ipairs(collection) do
5e8ea3733dc6 mod_archive: there can be only one note/previous/next/x element in a collection.
shinysky<shinysky1986(AT)gmail.com>
parents: 187
diff changeset
391 if c.name == newchild.name then
5e8ea3733dc6 mod_archive: there can be only one note/previous/next/x element in a collection.
shinysky<shinysky1986(AT)gmail.com>
parents: 187
diff changeset
392 found = true;
5e8ea3733dc6 mod_archive: there can be only one note/previous/next/x element in a collection.
shinysky<shinysky1986(AT)gmail.com>
parents: 187
diff changeset
393 collection[i] = newchild;
5e8ea3733dc6 mod_archive: there can be only one note/previous/next/x element in a collection.
shinysky<shinysky1986(AT)gmail.com>
parents: 187
diff changeset
394 break;
5e8ea3733dc6 mod_archive: there can be only one note/previous/next/x element in a collection.
shinysky<shinysky1986(AT)gmail.com>
parents: 187
diff changeset
395 end
5e8ea3733dc6 mod_archive: there can be only one note/previous/next/x element in a collection.
shinysky<shinysky1986(AT)gmail.com>
parents: 187
diff changeset
396 end
5e8ea3733dc6 mod_archive: there can be only one note/previous/next/x element in a collection.
shinysky<shinysky1986(AT)gmail.com>
parents: 187
diff changeset
397 if not found then
5e8ea3733dc6 mod_archive: there can be only one note/previous/next/x element in a collection.
shinysky<shinysky1986(AT)gmail.com>
parents: 187
diff changeset
398 collection:add_child(newchild);
5e8ea3733dc6 mod_archive: there can be only one note/previous/next/x element in a collection.
shinysky<shinysky1986(AT)gmail.com>
parents: 187
diff changeset
399 end
5e8ea3733dc6 mod_archive: there can be only one note/previous/next/x element in a collection.
shinysky<shinysky1986(AT)gmail.com>
parents: 187
diff changeset
400 end
187
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
401 end
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
402 end
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
403 local ver = tonumber(collection.attr["version"]) + 1;
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
404 collection.attr["version"] = tostring(ver);
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
405 collection.attr["subject"] = elem.attr["subject"];
225
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
406 collection.attr["access"] = date_time();
187
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
407 origin.send(st.reply(stanza):add_child(save_result(collection)));
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
408 data[k] = collection;
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
409 dm.list_store(node, host, ARCHIVE_DIR, st.preserialize(data));
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
410 return true;
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
411 end
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
412 end
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
413 end
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
414 -- not found, create new collection
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
415 elem.attr["version"] = "0";
225
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
416 elem.attr["access"] = date_time();
187
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
417 origin.send(st.reply(stanza):add_child(save_result(elem)));
188
5e8ea3733dc6 mod_archive: there can be only one note/previous/next/x element in a collection.
shinysky<shinysky1986(AT)gmail.com>
parents: 187
diff changeset
418 -- TODO check if elem is valid(?)
225
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
419 list_insert(node, host, elem);
187
670c99e96c52 mod_archive: first commit for manual archiving, need polishing
shinysky<shinysky1986(AT)gmail.com>
parents: 182
diff changeset
420 -- TODO unsuccessful reply
157
86c28405c5da initial commitment of mod_archive
shinysky<shinysky1986(AT)gmail.com>
parents:
diff changeset
421 return true;
86c28405c5da initial commitment of mod_archive
shinysky<shinysky1986(AT)gmail.com>
parents:
diff changeset
422 end
86c28405c5da initial commitment of mod_archive
shinysky<shinysky1986(AT)gmail.com>
parents:
diff changeset
423
178
62f47a93b5b7 mod_archive: Now we can archive messages, even though not in organized way.
shinysky<shinysky1986(AT)gmail.com>
parents: 172
diff changeset
424 ------------------------------------------------------------
193
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
425 -- Archive Management
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
426 ------------------------------------------------------------
233
4ff8068b4d94 mod_archive: fixed some serious bugs.
shinysky<shinysky1986(AT)gmail.com>
parents: 230
diff changeset
427 local function match_jid(rule, id)
4ff8068b4d94 mod_archive: fixed some serious bugs.
shinysky<shinysky1986(AT)gmail.com>
parents: 230
diff changeset
428 return not rule or jid.compare(id, rule);
193
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
429 end
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
430
228
56103bdb068c mod_archive: refactor
shinysky<shinysky1986(AT)gmail.com>
parents: 226
diff changeset
431 local function is_earlier(start, coll_start)
193
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
432 return not start or start <= coll_start;
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
433 end
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
434
228
56103bdb068c mod_archive: refactor
shinysky<shinysky1986(AT)gmail.com>
parents: 226
diff changeset
435 local function is_later(endtime, coll_start)
193
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
436 return not endtime or endtime >= coll_start;
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
437 end
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
438
196
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
439 local function find_coll(resset, uid)
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
440 for i, c in ipairs(resset) do
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
441 if gen_uid(c) == uid then
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
442 return i;
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
443 end
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
444 end
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
445 return nil;
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
446 end
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
447
193
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
448 local function list_handler(event)
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
449 local origin, stanza = event.origin, event.stanza;
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
450 local node, host = origin.username, origin.host;
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
451 local data = dm.list_load(node, host, ARCHIVE_DIR);
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
452 local elem = stanza.tags[1];
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
453 local resset = {}
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
454 if data then
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
455 for k, v in ipairs(data) do
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
456 local collection = st.deserialize(v);
209
254c13e049f7 mod_archive: added a 'access' attribute to the chat element, representing the time last accessed.
shinysky<shinysky1986(AT)gmail.com>
parents: 199
diff changeset
457 if collection[1] then -- has children(not deleted)
228
56103bdb068c mod_archive: refactor
shinysky<shinysky1986(AT)gmail.com>
parents: 226
diff changeset
458 local res = match_jid(elem.attr["with"], collection.attr["with"]);
56103bdb068c mod_archive: refactor
shinysky<shinysky1986(AT)gmail.com>
parents: 226
diff changeset
459 res = res and is_earlier(elem.attr["start"], collection.attr["start"]);
56103bdb068c mod_archive: refactor
shinysky<shinysky1986(AT)gmail.com>
parents: 226
diff changeset
460 res = res and is_later(elem.attr["end"], collection.attr["start"]);
209
254c13e049f7 mod_archive: added a 'access' attribute to the chat element, representing the time last accessed.
shinysky<shinysky1986(AT)gmail.com>
parents: 199
diff changeset
461 if res then
254c13e049f7 mod_archive: added a 'access' attribute to the chat element, representing the time last accessed.
shinysky<shinysky1986(AT)gmail.com>
parents: 199
diff changeset
462 table.insert(resset, collection);
254c13e049f7 mod_archive: added a 'access' attribute to the chat element, representing the time last accessed.
shinysky<shinysky1986(AT)gmail.com>
parents: 199
diff changeset
463 end
193
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
464 end
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
465 end
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
466 end
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
467 local reply = st.reply(stanza):tag('list', {xmlns='urn:xmpp:archive'});
196
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
468 local count = table.getn(resset);
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
469 if count > 0 then
230
0b9e8721b9c2 mod_archive: make sure result set are sorted in chronological order.
shinysky<shinysky1986(AT)gmail.com>
parents: 228
diff changeset
470 list_reverse(resset);
195
4d9ed6374a1f mod_archive: XEP-0059: Result Set Management - Limiting the Number of Items; Paging Forwards Through a Result Set; Getting the Item Count
shinysky<shinysky1986(AT)gmail.com>
parents: 193
diff changeset
471 local max = elem.tags[1]:child_with_name("max");
4d9ed6374a1f mod_archive: XEP-0059: Result Set Management - Limiting the Number of Items; Paging Forwards Through a Result Set; Getting the Item Count
shinysky<shinysky1986(AT)gmail.com>
parents: 193
diff changeset
472 if max then
210
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
473 max = tonumber(max:get_text()) or DEFAULT_MAX;
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
474 else max = DEFAULT_MAX; end
195
4d9ed6374a1f mod_archive: XEP-0059: Result Set Management - Limiting the Number of Items; Paging Forwards Through a Result Set; Getting the Item Count
shinysky<shinysky1986(AT)gmail.com>
parents: 193
diff changeset
475 local after = elem.tags[1]:child_with_name("after");
196
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
476 local before = elem.tags[1]:child_with_name("before");
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
477 local index = elem.tags[1]:child_with_name("index");
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
478 local s, e = 1, 1+max;
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
479 if after then
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
480 after = after:get_text();
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
481 s = find_coll(resset, after);
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
482 if not s then -- not found
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
483 origin.send(st.error_reply(stanza, "cancel", "item-not-found"));
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
484 return true;
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
485 end
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
486 s = s + 1;
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
487 e = s + max;
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
488 elseif before then
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
489 before = before:get_text();
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
490 if not before or before == '' then -- the last page
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
491 e = count + 1;
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
492 s = e - max;
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
493 else
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
494 e = find_coll(resset, before);
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
495 if not e then -- not found
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
496 origin.send(st.error_reply(stanza, "cancel", "item-not-found"));
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
497 return true;
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
498 end
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
499 s = e - max;
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
500 end
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
501 elseif index then
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
502 s = tonumber(index:get_text()) + 1; -- 0-based
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
503 e = s + max;
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
504 end
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
505 if s < 1 then s = 1; end
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
506 if e > count + 1 then e = count + 1; end
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
507 for i = s, e-1 do
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
508 reply:add_child(st.stanza('chat', resset[i].attr));
193
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
509 end
198
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
510 local set = st.stanza('set', {xmlns = xmlns_rsm});
196
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
511 if s <= e-1 then
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
512 set:tag('first', {index=s-1}):text(gen_uid(resset[s])):up()
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
513 :tag('last'):text(gen_uid(resset[e-1])):up();
195
4d9ed6374a1f mod_archive: XEP-0059: Result Set Management - Limiting the Number of Items; Paging Forwards Through a Result Set; Getting the Item Count
shinysky<shinysky1986(AT)gmail.com>
parents: 193
diff changeset
514 end
196
a1c2677257da mod_archive: XEP-0059 Result Set Management for Retrieving a List of Collections is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 195
diff changeset
515 set:tag('count'):text(tostring(count)):up();
195
4d9ed6374a1f mod_archive: XEP-0059: Result Set Management - Limiting the Number of Items; Paging Forwards Through a Result Set; Getting the Item Count
shinysky<shinysky1986(AT)gmail.com>
parents: 193
diff changeset
516 reply:add_child(set);
193
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
517 end
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
518 origin.send(reply);
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
519 return true;
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
520 end
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
521
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
522 local function retrieve_handler(event)
198
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
523 local origin, stanza = event.origin, event.stanza;
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
524 local node, host = origin.username, origin.host;
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
525 local data = dm.list_load(node, host, ARCHIVE_DIR);
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
526 local elem = stanza.tags[1];
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
527 local collection = nil;
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
528 if data then
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
529 for k, v in ipairs(data) do
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
530 local c = st.deserialize(v);
209
254c13e049f7 mod_archive: added a 'access' attribute to the chat element, representing the time last accessed.
shinysky<shinysky1986(AT)gmail.com>
parents: 199
diff changeset
531 if c[1] -- not deleted
254c13e049f7 mod_archive: added a 'access' attribute to the chat element, representing the time last accessed.
shinysky<shinysky1986(AT)gmail.com>
parents: 199
diff changeset
532 and c.attr["with"] == elem.attr["with"]
198
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
533 and c.attr["start"] == elem.attr["start"] then
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
534 collection = c;
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
535 break;
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
536 end
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
537 end
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
538 end
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
539 if not collection then
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
540 -- TODO code=404
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
541 origin.send(st.error_reply(stanza, "cancel", "item-not-found"));
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
542 return true;
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
543 end
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
544 local resset = {}
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
545 for i, e in ipairs(collection) do
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
546 if e.name == "from" or e.name == "to" then
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
547 table.insert(resset, e);
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
548 end
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
549 end
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
550 collection.attr['xmlns'] = 'urn:xmpp:archive';
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
551 local reply = st.reply(stanza):tag('chat', collection.attr);
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
552 local count = table.getn(resset);
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
553 if count > 0 then
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
554 local max = elem.tags[1]:child_with_name("max");
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
555 if max then
210
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
556 max = tonumber(max:get_text()) or DEFAULT_MAX;
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
557 else max = DEFAULT_MAX; end
198
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
558 local after = elem.tags[1]:child_with_name("after");
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
559 local before = elem.tags[1]:child_with_name("before");
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
560 local index = elem.tags[1]:child_with_name("index");
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
561 local s, e = 1, 1+max;
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
562 if after then
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
563 after = tonumber(after:get_text());
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
564 if not after or after < 1 or after > count then -- not found
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
565 origin.send(st.error_reply(stanza, "cancel", "item-not-found"));
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
566 return true;
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
567 end
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
568 s = after + 1;
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
569 e = s + max;
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
570 elseif before then
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
571 before = tonumber(before:get_text());
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
572 if not before then -- the last page
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
573 e = count + 1;
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
574 s = e - max;
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
575 elseif before < 1 or before > count then
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
576 origin.send(st.error_reply(stanza, "cancel", "item-not-found"));
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
577 return true;
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
578 else
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
579 e = before;
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
580 s = e - max;
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
581 end
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
582 elseif index then
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
583 s = tonumber(index:get_text()) + 1; -- 0-based
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
584 e = s + max;
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
585 end
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
586 if s < 1 then s = 1; end
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
587 if e > count + 1 then e = count + 1; end
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
588 for i = s, e-1 do
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
589 reply:add_child(resset[i]);
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
590 end
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
591 local set = st.stanza('set', {xmlns = xmlns_rsm});
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
592 if s <= e-1 then
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
593 set:tag('first', {index=s-1}):text(tostring(s)):up()
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
594 :tag('last'):text(tostring(e-1)):up();
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
595 end
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
596 set:tag('count'):text(tostring(count)):up();
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
597 reply:add_child(set);
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
598 end
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
599 origin.send(reply);
193
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
600 return true;
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
601 end
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
602
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
603 local function remove_handler(event)
199
27b8a7482149 mod_archive: '7.3 Removing a Collection' is DONE, so '7. Archive Management' is DONE.
shinysky<shinysky1986(AT)gmail.com>
parents: 198
diff changeset
604 local origin, stanza = event.origin, event.stanza;
27b8a7482149 mod_archive: '7.3 Removing a Collection' is DONE, so '7. Archive Management' is DONE.
shinysky<shinysky1986(AT)gmail.com>
parents: 198
diff changeset
605 local node, host = origin.username, origin.host;
27b8a7482149 mod_archive: '7.3 Removing a Collection' is DONE, so '7. Archive Management' is DONE.
shinysky<shinysky1986(AT)gmail.com>
parents: 198
diff changeset
606 local data = dm.list_load(node, host, ARCHIVE_DIR);
27b8a7482149 mod_archive: '7.3 Removing a Collection' is DONE, so '7. Archive Management' is DONE.
shinysky<shinysky1986(AT)gmail.com>
parents: 198
diff changeset
607 local elem = stanza.tags[1];
27b8a7482149 mod_archive: '7.3 Removing a Collection' is DONE, so '7. Archive Management' is DONE.
shinysky<shinysky1986(AT)gmail.com>
parents: 198
diff changeset
608 if data then
27b8a7482149 mod_archive: '7.3 Removing a Collection' is DONE, so '7. Archive Management' is DONE.
shinysky<shinysky1986(AT)gmail.com>
parents: 198
diff changeset
609 local count = table.getn(data);
27b8a7482149 mod_archive: '7.3 Removing a Collection' is DONE, so '7. Archive Management' is DONE.
shinysky<shinysky1986(AT)gmail.com>
parents: 198
diff changeset
610 local found = false;
27b8a7482149 mod_archive: '7.3 Removing a Collection' is DONE, so '7. Archive Management' is DONE.
shinysky<shinysky1986(AT)gmail.com>
parents: 198
diff changeset
611 for i = count, 1, -1 do
27b8a7482149 mod_archive: '7.3 Removing a Collection' is DONE, so '7. Archive Management' is DONE.
shinysky<shinysky1986(AT)gmail.com>
parents: 198
diff changeset
612 local collection = st.deserialize(data[i]);
209
254c13e049f7 mod_archive: added a 'access' attribute to the chat element, representing the time last accessed.
shinysky<shinysky1986(AT)gmail.com>
parents: 199
diff changeset
613 if collection[1] then -- has children(not deleted)
228
56103bdb068c mod_archive: refactor
shinysky<shinysky1986(AT)gmail.com>
parents: 226
diff changeset
614 local res = match_jid(elem.attr["with"], collection.attr["with"]);
56103bdb068c mod_archive: refactor
shinysky<shinysky1986(AT)gmail.com>
parents: 226
diff changeset
615 res = res and is_earlier(elem.attr["start"], collection.attr["start"]);
56103bdb068c mod_archive: refactor
shinysky<shinysky1986(AT)gmail.com>
parents: 226
diff changeset
616 res = res and is_later(elem.attr["end"], collection.attr["start"]);
209
254c13e049f7 mod_archive: added a 'access' attribute to the chat element, representing the time last accessed.
shinysky<shinysky1986(AT)gmail.com>
parents: 199
diff changeset
617 if res then
254c13e049f7 mod_archive: added a 'access' attribute to the chat element, representing the time last accessed.
shinysky<shinysky1986(AT)gmail.com>
parents: 199
diff changeset
618 -- table.remove(data, i);
254c13e049f7 mod_archive: added a 'access' attribute to the chat element, representing the time last accessed.
shinysky<shinysky1986(AT)gmail.com>
parents: 199
diff changeset
619 local temp = st.stanza('chat', collection.attr);
225
95d4d53f09a1 mod_archive: keep collections in REVERSE chronological order(not tested).
shinysky<shinysky1986(AT)gmail.com>
parents: 224
diff changeset
620 temp.attr["access"] = date_time();
209
254c13e049f7 mod_archive: added a 'access' attribute to the chat element, representing the time last accessed.
shinysky<shinysky1986(AT)gmail.com>
parents: 199
diff changeset
621 data[i] = temp;
254c13e049f7 mod_archive: added a 'access' attribute to the chat element, representing the time last accessed.
shinysky<shinysky1986(AT)gmail.com>
parents: 199
diff changeset
622 found = true;
254c13e049f7 mod_archive: added a 'access' attribute to the chat element, representing the time last accessed.
shinysky<shinysky1986(AT)gmail.com>
parents: 199
diff changeset
623 end
199
27b8a7482149 mod_archive: '7.3 Removing a Collection' is DONE, so '7. Archive Management' is DONE.
shinysky<shinysky1986(AT)gmail.com>
parents: 198
diff changeset
624 end
27b8a7482149 mod_archive: '7.3 Removing a Collection' is DONE, so '7. Archive Management' is DONE.
shinysky<shinysky1986(AT)gmail.com>
parents: 198
diff changeset
625 end
27b8a7482149 mod_archive: '7.3 Removing a Collection' is DONE, so '7. Archive Management' is DONE.
shinysky<shinysky1986(AT)gmail.com>
parents: 198
diff changeset
626 if found then
27b8a7482149 mod_archive: '7.3 Removing a Collection' is DONE, so '7. Archive Management' is DONE.
shinysky<shinysky1986(AT)gmail.com>
parents: 198
diff changeset
627 dm.list_store(node, host, ARCHIVE_DIR, st.preserialize(data));
27b8a7482149 mod_archive: '7.3 Removing a Collection' is DONE, so '7. Archive Management' is DONE.
shinysky<shinysky1986(AT)gmail.com>
parents: 198
diff changeset
628 else
27b8a7482149 mod_archive: '7.3 Removing a Collection' is DONE, so '7. Archive Management' is DONE.
shinysky<shinysky1986(AT)gmail.com>
parents: 198
diff changeset
629 origin.send(st.error_reply(stanza, "cancel", "item-not-found"));
27b8a7482149 mod_archive: '7.3 Removing a Collection' is DONE, so '7. Archive Management' is DONE.
shinysky<shinysky1986(AT)gmail.com>
parents: 198
diff changeset
630 return true;
27b8a7482149 mod_archive: '7.3 Removing a Collection' is DONE, so '7. Archive Management' is DONE.
shinysky<shinysky1986(AT)gmail.com>
parents: 198
diff changeset
631 end
27b8a7482149 mod_archive: '7.3 Removing a Collection' is DONE, so '7. Archive Management' is DONE.
shinysky<shinysky1986(AT)gmail.com>
parents: 198
diff changeset
632 end
27b8a7482149 mod_archive: '7.3 Removing a Collection' is DONE, so '7. Archive Management' is DONE.
shinysky<shinysky1986(AT)gmail.com>
parents: 198
diff changeset
633 origin.send(st.reply(stanza));
193
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
634 return true;
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
635 end
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
636
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
637 ------------------------------------------------------------
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
638 -- Replication
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
639 ------------------------------------------------------------
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
640 local function modified_handler(event)
210
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
641 local origin, stanza = event.origin, event.stanza;
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
642 local node, host = origin.username, origin.host;
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
643 local data = dm.list_load(node, host, ARCHIVE_DIR);
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
644 local elem = stanza.tags[1];
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
645 local resset = {}
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
646 if data then
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
647 for k, v in ipairs(data) do
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
648 local collection = st.deserialize(v);
228
56103bdb068c mod_archive: refactor
shinysky<shinysky1986(AT)gmail.com>
parents: 226
diff changeset
649 local res = is_earlier(elem.attr["start"], collection.attr["access"]);
210
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
650 if res then
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
651 table.insert(resset, collection);
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
652 end
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
653 end
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
654 end
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
655 local reply = st.reply(stanza):tag('modified', {xmlns='urn:xmpp:archive'});
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
656 local count = table.getn(resset);
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
657 if count > 0 then
230
0b9e8721b9c2 mod_archive: make sure result set are sorted in chronological order.
shinysky<shinysky1986(AT)gmail.com>
parents: 228
diff changeset
658 list_reverse(resset);
210
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
659 local max = elem.tags[1]:child_with_name("max");
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
660 if max then
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
661 max = tonumber(max:get_text()) or DEFAULT_MAX;
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
662 else max = DEFAULT_MAX; end
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
663 local after = elem.tags[1]:child_with_name("after");
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
664 local before = elem.tags[1]:child_with_name("before");
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
665 local index = elem.tags[1]:child_with_name("index");
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
666 local s, e = 1, 1+max;
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
667 if after then
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
668 after = after:get_text();
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
669 s = find_coll(resset, after);
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
670 if not s then -- not found
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
671 origin.send(st.error_reply(stanza, "cancel", "item-not-found"));
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
672 return true;
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
673 end
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
674 s = s + 1;
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
675 e = s + max;
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
676 elseif before then
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
677 before = before:get_text();
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
678 if not before or before == '' then -- the last page
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
679 e = count + 1;
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
680 s = e - max;
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
681 else
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
682 e = find_coll(resset, before);
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
683 if not e then -- not found
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
684 origin.send(st.error_reply(stanza, "cancel", "item-not-found"));
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
685 return true;
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
686 end
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
687 s = e - max;
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
688 end
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
689 elseif index then
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
690 s = tonumber(index:get_text()) + 1; -- 0-based
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
691 e = s + max;
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
692 end
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
693 if s < 1 then s = 1; end
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
694 if e > count + 1 then e = count + 1; end
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
695 for i = s, e-1 do
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
696 if resset[i][1] then
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
697 reply:add_child(st.stanza('changed', resset[i].attr));
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
698 else
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
699 reply:add_child(st.stanza('removed', resset[i].attr));
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
700 end
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
701 end
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
702 local set = st.stanza('set', {xmlns = xmlns_rsm});
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
703 if s <= e-1 then
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
704 set:tag('first', {index=s-1}):text(gen_uid(resset[s])):up()
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
705 :tag('last'):text(gen_uid(resset[e-1])):up();
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
706 end
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
707 set:tag('count'):text(tostring(count)):up();
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
708 reply:add_child(set);
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
709 end
2d63d50d9713 mod_archive: Replication is done!
shinysky<shinysky1986(AT)gmail.com>
parents: 209
diff changeset
710 origin.send(reply);
193
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
711 return true;
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
712 end
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
713
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
714 ------------------------------------------------------------
178
62f47a93b5b7 mod_archive: Now we can archive messages, even though not in organized way.
shinysky<shinysky1986(AT)gmail.com>
parents: 172
diff changeset
715 -- Message Handler
62f47a93b5b7 mod_archive: Now we can archive messages, even though not in organized way.
shinysky<shinysky1986(AT)gmail.com>
parents: 172
diff changeset
716 ------------------------------------------------------------
221
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
717 local function find_pref(pref, name, k, v, exactmatch)
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
718 for i, child in ipairs(pref) do
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
719 if child.name == name then
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
720 if k and v then
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
721 if exactmatch and child.attr[k] == v then
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
722 return child;
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
723 elseif not exactmatch then
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
724 if tobool(child.attr['exactmatch']) then
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
725 if child.attr[k] == v then
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
726 return child;
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
727 end
228
56103bdb068c mod_archive: refactor
shinysky<shinysky1986(AT)gmail.com>
parents: 226
diff changeset
728 elseif match_jid(child.attr[k], v) then
221
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
729 return child;
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
730 end
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
731 end
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
732 else
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
733 return child;
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
734 end
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
735 end
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
736 end
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
737 return nil;
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
738 end
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
739
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
740 local function apply_pref(node, host, jid, thread)
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
741 if FORCE_ARCHIVING then return true; end
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
742
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
743 local pref = load_prefs(node, host);
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
744 if not pref then
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
745 return AUTO_ARCHIVING_ENABLED;
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
746 end
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
747 local auto = pref:child_with_name('auto');
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
748 if not tobool(auto.attr['save']) then
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
749 return false;
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
750 end
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
751 if thread then
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
752 local child = find_pref(pref, 'session', 'thread', thread, true);
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
753 if child then
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
754 return tobool(child.attr['save']) ~= false;
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
755 end
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
756 end
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
757 local child = find_pref(pref, 'item', 'jid', jid, false); -- JID Matching
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
758 if child then
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
759 return tobool(child.attr['save']) ~= false;
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
760 end
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
761 local default = pref:child_with_name('default');
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
762 if default then
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
763 return tobool(default.attr['save']) ~= false;
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
764 end
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
765 return AUTO_ARCHIVING_ENABLED;
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
766 end
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
767
172
ac826882a8cf mod_archive: The element auto MAY include a 'scope' attribute; Added message hook.
shinysky<shinysky1986(AT)gmail.com>
parents: 165
diff changeset
768 local function msg_handler(data)
ac826882a8cf mod_archive: The element auto MAY include a 'scope' attribute; Added message hook.
shinysky<shinysky1986(AT)gmail.com>
parents: 165
diff changeset
769 module:log("debug", "-- Enter msg_handler()");
ac826882a8cf mod_archive: The element auto MAY include a 'scope' attribute; Added message hook.
shinysky<shinysky1986(AT)gmail.com>
parents: 165
diff changeset
770 local origin, stanza = data.origin, data.stanza;
178
62f47a93b5b7 mod_archive: Now we can archive messages, even though not in organized way.
shinysky<shinysky1986(AT)gmail.com>
parents: 172
diff changeset
771 local body = stanza:child_with_name("body");
182
43d9e0944276 mod_archive: now auto archiving is almost done.
shinysky<shinysky1986(AT)gmail.com>
parents: 178
diff changeset
772 local thread = stanza:child_with_name("thread");
178
62f47a93b5b7 mod_archive: Now we can archive messages, even though not in organized way.
shinysky<shinysky1986(AT)gmail.com>
parents: 172
diff changeset
773 if body then
221
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
774 local from_node, from_host = jid.split(stanza.attr.from);
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
775 local to_node, to_host = jid.split(stanza.attr.to);
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
776 -- FIXME only archive messages of users on this host
222
6e6a08b0531a mod_archive: minor fix.
shinysky<shinysky1986(AT)gmail.com>
parents: 221
diff changeset
777 if from_host == HOST and apply_pref(from_node, from_host, stanza.attr.to, thread) then
221
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
778 store_msg(stanza, from_node, from_host, true);
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
779 end
222
6e6a08b0531a mod_archive: minor fix.
shinysky<shinysky1986(AT)gmail.com>
parents: 221
diff changeset
780 if to_host == HOST and apply_pref(to_node, to_host, stanza.attr.from, thread) then
221
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
781 store_msg(stanza, to_node, to_host, false);
178
62f47a93b5b7 mod_archive: Now we can archive messages, even though not in organized way.
shinysky<shinysky1986(AT)gmail.com>
parents: 172
diff changeset
782 end
62f47a93b5b7 mod_archive: Now we can archive messages, even though not in organized way.
shinysky<shinysky1986(AT)gmail.com>
parents: 172
diff changeset
783 end
221
1861290055c0 mod_archive: interpret preferences when do auto archiving.
shinysky<shinysky1986(AT)gmail.com>
parents: 210
diff changeset
784
172
ac826882a8cf mod_archive: The element auto MAY include a 'scope' attribute; Added message hook.
shinysky<shinysky1986(AT)gmail.com>
parents: 165
diff changeset
785 return nil;
ac826882a8cf mod_archive: The element auto MAY include a 'scope' attribute; Added message hook.
shinysky<shinysky1986(AT)gmail.com>
parents: 165
diff changeset
786 end
ac826882a8cf mod_archive: The element auto MAY include a 'scope' attribute; Added message hook.
shinysky<shinysky1986(AT)gmail.com>
parents: 165
diff changeset
787
193
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
788 -- Preferences
157
86c28405c5da initial commitment of mod_archive
shinysky<shinysky1986(AT)gmail.com>
parents:
diff changeset
789 module:hook("iq/self/urn:xmpp:archive:pref", preferences_handler);
165
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
790 module:hook("iq/self/urn:xmpp:archive:itemremove", itemremove_handler);
fd8d76daad97 mod_archive: preference handling is done.
shinysky<shinysky1986(AT)gmail.com>
parents: 159
diff changeset
791 module:hook("iq/self/urn:xmpp:archive:sessionremove", sessionremove_handler);
159
9a37898f4f7c mod_archive: Added features: Determining Server Support & Determining Preferences
shinysky<shinysky1986(AT)gmail.com>
parents: 157
diff changeset
792 module:hook("iq/self/urn:xmpp:archive:auto", auto_handler);
193
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
793 -- Manual archiving
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
794 module:hook("iq/self/urn:xmpp:archive:save", save_handler);
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
795 -- Archive management
159
9a37898f4f7c mod_archive: Added features: Determining Server Support & Determining Preferences
shinysky<shinysky1986(AT)gmail.com>
parents: 157
diff changeset
796 module:hook("iq/self/urn:xmpp:archive:list", list_handler);
193
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
797 module:hook("iq/self/urn:xmpp:archive:retrieve", retrieve_handler);
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
798 module:hook("iq/self/urn:xmpp:archive:remove", remove_handler);
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
799 -- Replication
159
9a37898f4f7c mod_archive: Added features: Determining Server Support & Determining Preferences
shinysky<shinysky1986(AT)gmail.com>
parents: 157
diff changeset
800 module:hook("iq/self/urn:xmpp:archive:modified", modified_handler);
157
86c28405c5da initial commitment of mod_archive
shinysky<shinysky1986(AT)gmail.com>
parents:
diff changeset
801
172
ac826882a8cf mod_archive: The element auto MAY include a 'scope' attribute; Added message hook.
shinysky<shinysky1986(AT)gmail.com>
parents: 165
diff changeset
802 module:hook("message/full", msg_handler, 10);
ac826882a8cf mod_archive: The element auto MAY include a 'scope' attribute; Added message hook.
shinysky<shinysky1986(AT)gmail.com>
parents: 165
diff changeset
803 module:hook("message/bare", msg_handler, 10);
ac826882a8cf mod_archive: The element auto MAY include a 'scope' attribute; Added message hook.
shinysky<shinysky1986(AT)gmail.com>
parents: 165
diff changeset
804
193
18a0e5c0bb62 mod_archive: Archive Management - Retrieving a List of Collections
shinysky<shinysky1986(AT)gmail.com>
parents: 188
diff changeset
805 -- FIXME sort collections
198
a3b5810de3e4 mod_archive: XEP-0059 Result Set Management for Retrieving a Collection is DONE
shinysky<shinysky1986(AT)gmail.com>
parents: 196
diff changeset
806 -- TODO exactmatch
199
27b8a7482149 mod_archive: '7.3 Removing a Collection' is DONE, so '7. Archive Management' is DONE.
shinysky<shinysky1986(AT)gmail.com>
parents: 198
diff changeset
807 -- TODO <item/> JID match
27b8a7482149 mod_archive: '7.3 Removing a Collection' is DONE, so '7. Archive Management' is DONE.
shinysky<shinysky1986(AT)gmail.com>
parents: 198
diff changeset
808 -- TODO 'open attr' in removing a collection