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