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