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