annotate mod_archive/mod_archive.lua @ 632:dcb8e7d2c711

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