Annotate

plugins/mod_muc_mam.lua @ 10585:2d8535338099

mod_muc_mam: Measure how long a cleanup run takes (like mod_mam)
author Kim Alvefur <zash@zash.se>
date Sat, 04 Jan 2020 14:05:10 +0100
parent 10568:b6f93babebe8
child 10671:5e1384298e97
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1 -- XEP-0313: Message Archive Management for Prosody MUC
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
2 -- Copyright (C) 2011-2017 Kim Alvefur
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
3 --
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4 -- This file is MIT/X11 licensed.
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
5
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
6 if module:get_host_type() ~= "component" then
9872
e1d68f32ce29 mod_muc_mam: Set error status if loaded on incorrect host type
Matthew Wild <mwild1@gmail.com>
parents: 9845
diff changeset
7 module:log_status("error", "mod_%s should be loaded only on a MUC component, not normal hosts", module.name);
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
8 return;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
9 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
10
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
11 local xmlns_mam = "urn:xmpp:mam:2";
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
12 local xmlns_delay = "urn:xmpp:delay";
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
13 local xmlns_forward = "urn:xmpp:forward:0";
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
14 local xmlns_st_id = "urn:xmpp:sid:0";
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
15 local xmlns_muc_user = "http://jabber.org/protocol/muc#user";
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
16 local muc_form_enable = "muc#roomconfig_enablearchiving"
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
17
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
18 local st = require "util.stanza";
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
19 local rsm = require "util.rsm";
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
20 local jid_bare = require "util.jid".bare;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
21 local jid_split = require "util.jid".split;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
22 local jid_prep = require "util.jid".prep;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
23 local dataform = require "util.dataforms".new;
9844
3de80fc511ab mod_muc_mam: Validate that the FORM_TYPE of a query is as expected
Kim Alvefur <zash@zash.se>
parents: 9552
diff changeset
24 local get_form_type = require "util.dataforms".get_type;
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
25
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
26 local mod_muc = module:depends"muc";
8723
f3bdb20214ab mod_muc_mam: Remove 0.10 compat code
Kim Alvefur <zash@zash.se>
parents: 8722
diff changeset
27 local get_room_from_jid = mod_muc.get_room_from_jid;
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
28
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
29 local is_stanza = st.is_stanza;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
30 local tostring = tostring;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
31 local time_now = os.time;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
32 local m_min = math.min;
9880
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
33 local timestamp, timestamp_parse, datestamp = import( "util.datetime", "datetime", "parse", "date");
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
34 local default_max_items, max_max_items = 20, module:get_option_number("max_archive_query_results", 50);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
35
10000
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
36 local cleanup_after = module:get_option_string("muc_log_expires_after", "1w");
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
37 local cleanup_interval = module:get_option_number("muc_log_cleanup_interval", 4 * 60 * 60);
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
38
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
39 local default_history_length = 20;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
40 local max_history_length = module:get_option_number("max_history_messages", math.huge);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
41
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
42 local function get_historylength(room)
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
43 return math.min(room._data.history_length or default_history_length, max_history_length);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
44 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
45
9880
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
46 function schedule_cleanup()
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
47 -- replaced by non-noop later if cleanup is enabled
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
48 end
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
49
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
50 local log_all_rooms = module:get_option_boolean("muc_log_all_rooms", false);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
51 local log_by_default = module:get_option_boolean("muc_log_by_default", true);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
52
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
53 local archive_store = "muc_log";
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
54 local archive = module:open_store(archive_store, "archive");
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
55
10000
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
56 local archive_item_limit = module:get_option_number("storage_archive_item_limit", archive.caps and archive.caps.quota or 1000);
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
57
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
58 if archive.name == "null" or not archive.find then
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
59 if not archive.find then
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
60 module:log("error", "Attempt to open archive storage returned a driver without archive API support");
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
61 module:log("error", "mod_%s does not support archiving",
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
62 archive._provided_by or archive.name and "storage_"..archive.name.."(?)" or "<unknown>");
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
63 else
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
64 module:log("error", "Attempt to open archive storage returned null driver");
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
65 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
66 module:log("info", "See https://prosody.im/doc/storage and https://prosody.im/doc/archiving for more information");
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
67 return false;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
68 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
69
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
70 local function archiving_enabled(room)
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
71 if log_all_rooms then
10000
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
72 module:log("debug", "Archiving all rooms");
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
73 return true;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
74 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
75 local enabled = room._data.archiving;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
76 if enabled == nil then
10000
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
77 module:log("debug", "Default is %s (for %s)", log_by_default, room.jid);
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
78 return log_by_default;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
79 end
10000
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
80 module:log("debug", "Logging in room %s is %s", room.jid, enabled);
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
81 return enabled;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
82 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
83
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
84 if not log_all_rooms then
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
85 module:hook("muc-config-form", function(event)
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
86 local room, form = event.room, event.form;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
87 table.insert(form,
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
88 {
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
89 name = muc_form_enable,
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
90 type = "boolean",
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
91 label = "Enable archiving?",
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
92 value = archiving_enabled(room),
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
93 }
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
94 );
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
95 end);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
96
8723
f3bdb20214ab mod_muc_mam: Remove 0.10 compat code
Kim Alvefur <zash@zash.se>
parents: 8722
diff changeset
97 module:hook("muc-config-submitted/"..muc_form_enable, function(event)
f3bdb20214ab mod_muc_mam: Remove 0.10 compat code
Kim Alvefur <zash@zash.se>
parents: 8722
diff changeset
98 event.room._data.archiving = event.value;
8832
a9c3b15b9d37 mod_muc_mam: Set status code 170/171 on archiving configuration change
Kim Alvefur <zash@zash.se>
parents: 8786
diff changeset
99 event.status_codes[event.value and "170" or "171"] = true;
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
100 end);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
101 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
102
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
103 -- Note: We ignore the 'with' field as this is internally used for stanza types
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
104 local query_form = dataform {
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
105 { name = "FORM_TYPE"; type = "hidden"; value = xmlns_mam; };
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
106 { name = "with"; type = "jid-single"; };
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
107 { name = "start"; type = "text-single" };
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
108 { name = "end"; type = "text-single"; };
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
109 };
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
110
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
111 -- Serve form
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
112 module:hook("iq-get/bare/"..xmlns_mam..":query", function(event)
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
113 local origin, stanza = event.origin, event.stanza;
9552
87e25d352de3 mod_muc_mam: Fix missing form container element
Kim Alvefur <zash@zash.se>
parents: 9001
diff changeset
114 origin.send(st.reply(stanza):tag("query", { xmlns = xmlns_mam }):add_child(query_form:form()));
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
115 return true;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
116 end);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
117
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
118 -- Handle archive queries
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
119 module:hook("iq-set/bare/"..xmlns_mam..":query", function(event)
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
120 local origin, stanza = event.origin, event.stanza;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
121 local room_jid = stanza.attr.to;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
122 local room_node = jid_split(room_jid);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
123 local orig_from = stanza.attr.from;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
124 local query = stanza.tags[1];
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
125
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
126 local room = get_room_from_jid(room_jid);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
127 if not room then
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
128 origin.send(st.error_reply(stanza, "cancel", "item-not-found"))
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
129 return true;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
130 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
131 local from = jid_bare(orig_from);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
132
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
133 -- Banned or not a member of a members-only room?
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
134 local from_affiliation = room:get_affiliation(from);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
135 if from_affiliation == "outcast" -- banned
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
136 or room:get_members_only() and not from_affiliation then -- members-only, not a member
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
137 origin.send(st.error_reply(stanza, "auth", "forbidden"))
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
138 return true;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
139 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
140
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
141 local qid = query.attr.queryid;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
142
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
143 -- Search query parameters
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
144 local qstart, qend;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
145 local form = query:get_child("x", "jabber:x:data");
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
146 if form then
9844
3de80fc511ab mod_muc_mam: Validate that the FORM_TYPE of a query is as expected
Kim Alvefur <zash@zash.se>
parents: 9552
diff changeset
147 local form_type, err = get_form_type(form);
10558
40c2500208f4 mod_muc_mam: Handle form identification error (e.g. not a form at all)
Kim Alvefur <zash@zash.se>
parents: 10415
diff changeset
148 if not form_type then
40c2500208f4 mod_muc_mam: Handle form identification error (e.g. not a form at all)
Kim Alvefur <zash@zash.se>
parents: 10415
diff changeset
149 origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid dataform: "..err));
40c2500208f4 mod_muc_mam: Handle form identification error (e.g. not a form at all)
Kim Alvefur <zash@zash.se>
parents: 10415
diff changeset
150 return true;
40c2500208f4 mod_muc_mam: Handle form identification error (e.g. not a form at all)
Kim Alvefur <zash@zash.se>
parents: 10415
diff changeset
151 elseif form_type ~= xmlns_mam then
9844
3de80fc511ab mod_muc_mam: Validate that the FORM_TYPE of a query is as expected
Kim Alvefur <zash@zash.se>
parents: 9552
diff changeset
152 origin.send(st.error_reply(stanza, "modify", "bad-request", "Unexpected FORM_TYPE, expected '"..xmlns_mam.."'"));
3de80fc511ab mod_muc_mam: Validate that the FORM_TYPE of a query is as expected
Kim Alvefur <zash@zash.se>
parents: 9552
diff changeset
153 return true;
3de80fc511ab mod_muc_mam: Validate that the FORM_TYPE of a query is as expected
Kim Alvefur <zash@zash.se>
parents: 9552
diff changeset
154 end
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
155 form, err = query_form:data(form);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
156 if err then
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
157 origin.send(st.error_reply(stanza, "modify", "bad-request", select(2, next(err))));
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
158 return true;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
159 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
160 qstart, qend = form["start"], form["end"];
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
161 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
162
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
163 if qstart or qend then -- Validate timestamps
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
164 local vstart, vend = (qstart and timestamp_parse(qstart)), (qend and timestamp_parse(qend))
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
165 if (qstart and not vstart) or (qend and not vend) then
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
166 origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid timestamp"))
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
167 return true;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
168 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
169 qstart, qend = vstart, vend;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
170 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
171
10415
360d574517b6 mod_muc_mam: Copy debug log improvements from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10119
diff changeset
172 module:log("debug", "Archive query by %s id=%s when=%s...%s",
360d574517b6 mod_muc_mam: Copy debug log improvements from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10119
diff changeset
173 origin.username,
360d574517b6 mod_muc_mam: Copy debug log improvements from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10119
diff changeset
174 qid or stanza.attr.id,
360d574517b6 mod_muc_mam: Copy debug log improvements from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10119
diff changeset
175 qstart and timestamp(qstart) or "",
360d574517b6 mod_muc_mam: Copy debug log improvements from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10119
diff changeset
176 qend and timestamp(qend) or "");
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
177
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
178 -- RSM stuff
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
179 local qset = rsm.get(query);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
180 local qmax = m_min(qset and qset.max or default_max_items, max_max_items);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
181 local reverse = qset and qset.before or false;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
182
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
183 local before, after = qset and qset.before, qset and qset.after;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
184 if type(before) ~= "string" then before = nil; end
10415
360d574517b6 mod_muc_mam: Copy debug log improvements from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10119
diff changeset
185 if qset then
360d574517b6 mod_muc_mam: Copy debug log improvements from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10119
diff changeset
186 module:log("debug", "Archive query id=%s rsm=%q", qid or stanza.attr.id, qset);
360d574517b6 mod_muc_mam: Copy debug log improvements from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10119
diff changeset
187 end
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
188
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
189 -- Load all the data!
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
190 local data, err = archive:find(room_node, {
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
191 start = qstart; ["end"] = qend; -- Time range
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
192 limit = qmax + 1;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
193 before = before; after = after;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
194 reverse = reverse;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
195 with = "message<groupchat";
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
196 });
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
197
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
198 if not data then
10415
360d574517b6 mod_muc_mam: Copy debug log improvements from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10119
diff changeset
199 module:log("debug", "Archive query id=%s failed: %s", qid or stanza.attr.id, err);
10022
b56654f89cd5 mod_muc_mam: Propagate item-not-found to client (fixes #1325)
Kim Alvefur <zash@zash.se>
parents: 10000
diff changeset
200 if err == "item-not-found" then
b56654f89cd5 mod_muc_mam: Propagate item-not-found to client (fixes #1325)
Kim Alvefur <zash@zash.se>
parents: 10000
diff changeset
201 origin.send(st.error_reply(stanza, "modify", "item-not-found"));
b56654f89cd5 mod_muc_mam: Propagate item-not-found to client (fixes #1325)
Kim Alvefur <zash@zash.se>
parents: 10000
diff changeset
202 else
b56654f89cd5 mod_muc_mam: Propagate item-not-found to client (fixes #1325)
Kim Alvefur <zash@zash.se>
parents: 10000
diff changeset
203 origin.send(st.error_reply(stanza, "cancel", "internal-server-error"));
b56654f89cd5 mod_muc_mam: Propagate item-not-found to client (fixes #1325)
Kim Alvefur <zash@zash.se>
parents: 10000
diff changeset
204 end
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
205 return true;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
206 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
207 local total = tonumber(err);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
208
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
209 local msg_reply_attr = { to = stanza.attr.from, from = stanza.attr.to };
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
210
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
211 local results = {};
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
212
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
213 -- Wrap it in stuff and deliver
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
214 local first, last;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
215 local count = 0;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
216 local complete = "true";
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
217 for id, item, when in data do
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
218 count = count + 1;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
219 if count > qmax then
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
220 complete = nil;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
221 break;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
222 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
223 local fwd_st = st.message(msg_reply_attr)
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
224 :tag("result", { xmlns = xmlns_mam, queryid = qid, id = id })
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
225 :tag("forwarded", { xmlns = xmlns_forward })
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
226 :tag("delay", { xmlns = xmlns_delay, stamp = timestamp(when) }):up();
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
227
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
228 -- Strip <x> tag, containing the original senders JID, unless the room makes this public
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
229 if room:get_whois() ~= "anyone" then
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
230 item:maptags(function (tag)
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
231 if tag.name == "x" and tag.attr.xmlns == xmlns_muc_user then
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
232 return nil;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
233 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
234 return tag;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
235 end);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
236 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
237 if not is_stanza(item) then
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
238 item = st.deserialize(item);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
239 end
9841
a44f562e01a5 mod_muc_mam: Strip the stanza 'to' attribute (fixes #1259)
Kim Alvefur <zash@zash.se>
parents: 9552
diff changeset
240 item.attr.to = nil;
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
241 item.attr.xmlns = "jabber:client";
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
242 fwd_st:add_child(item);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
243
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
244 if not first then first = id; end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
245 last = id;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
246
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
247 if reverse then
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
248 results[count] = fwd_st;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
249 else
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
250 origin.send(fwd_st);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
251 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
252 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
253
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
254 if reverse then
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
255 for i = #results, 1, -1 do
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
256 origin.send(results[i]);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
257 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
258 first, last = last, first;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
259 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
260
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
261
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
262 origin.send(st.reply(stanza)
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
263 :tag("fin", { xmlns = xmlns_mam, queryid = qid, complete = complete })
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
264 :add_child(rsm.generate {
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
265 first = first, last = last, count = total }));
10415
360d574517b6 mod_muc_mam: Copy debug log improvements from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10119
diff changeset
266
360d574517b6 mod_muc_mam: Copy debug log improvements from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10119
diff changeset
267 -- That's all folks!
360d574517b6 mod_muc_mam: Copy debug log improvements from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10119
diff changeset
268 module:log("debug", "Archive query id=%s completed, %d items returned", qid or stanza.attr.id, complete and count or count - 1);
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
269 return true;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
270 end);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
271
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
272 module:hook("muc-get-history", function (event)
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
273 local room = event.room;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
274 if not archiving_enabled(room) then return end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
275 local room_jid = room.jid;
8783
79133eca0656 mod_muc_mam: Tweak calculation of max history to retrieve
Kim Alvefur <zash@zash.se>
parents: 8725
diff changeset
276 local maxstanzas = event.maxstanzas;
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
277 local maxchars = event.maxchars;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
278 local since = event.since;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
279 local to = event.to;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
280
8784
64b78e3deb96 mod_muc_mam: Skip fetching history if no history was requested
Kim Alvefur <zash@zash.se>
parents: 8783
diff changeset
281 if maxstanzas == 0 or maxchars == 0 then
64b78e3deb96 mod_muc_mam: Skip fetching history if no history was requested
Kim Alvefur <zash@zash.se>
parents: 8783
diff changeset
282 return -- No history requested
64b78e3deb96 mod_muc_mam: Skip fetching history if no history was requested
Kim Alvefur <zash@zash.se>
parents: 8783
diff changeset
283 end
64b78e3deb96 mod_muc_mam: Skip fetching history if no history was requested
Kim Alvefur <zash@zash.se>
parents: 8783
diff changeset
284
8783
79133eca0656 mod_muc_mam: Tweak calculation of max history to retrieve
Kim Alvefur <zash@zash.se>
parents: 8725
diff changeset
285 if not maxstanzas or maxstanzas > get_historylength(room) then
79133eca0656 mod_muc_mam: Tweak calculation of max history to retrieve
Kim Alvefur <zash@zash.se>
parents: 8725
diff changeset
286 maxstanzas = get_historylength(room);
79133eca0656 mod_muc_mam: Tweak calculation of max history to retrieve
Kim Alvefur <zash@zash.se>
parents: 8725
diff changeset
287 end
79133eca0656 mod_muc_mam: Tweak calculation of max history to retrieve
Kim Alvefur <zash@zash.se>
parents: 8725
diff changeset
288
8785
82b889608503 mod_muc_mam: Skip fetching history if built-in recent history is enough
Kim Alvefur <zash@zash.se>
parents: 8784
diff changeset
289 if room._history and #room._history >= maxstanzas then
82b889608503 mod_muc_mam: Skip fetching history if built-in recent history is enough
Kim Alvefur <zash@zash.se>
parents: 8784
diff changeset
290 return -- It can deal with this itself
82b889608503 mod_muc_mam: Skip fetching history if built-in recent history is enough
Kim Alvefur <zash@zash.se>
parents: 8784
diff changeset
291 end
82b889608503 mod_muc_mam: Skip fetching history if built-in recent history is enough
Kim Alvefur <zash@zash.se>
parents: 8784
diff changeset
292
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
293 -- Load all the data!
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
294 local query = {
8783
79133eca0656 mod_muc_mam: Tweak calculation of max history to retrieve
Kim Alvefur <zash@zash.se>
parents: 8725
diff changeset
295 limit = maxstanzas;
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
296 start = since;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
297 reverse = true;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
298 with = "message<groupchat";
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
299 }
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
300 local data, err = archive:find(jid_split(room_jid), query);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
301
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
302 if not data then
10111
0f335815244f plugins: Remove tostring call from logging
Kim Alvefur <zash@zash.se>
parents: 10030
diff changeset
303 module:log("error", "Could not fetch history: %s", err);
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
304 return
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
305 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
306
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
307 local history, i = {}, 1;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
308
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
309 for id, item, when in data do
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
310 item.attr.to = to;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
311 item:tag("delay", { xmlns = "urn:xmpp:delay", from = room_jid, stamp = timestamp(when) }):up(); -- XEP-0203
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
312 item:tag("stanza-id", { xmlns = xmlns_st_id, by = room_jid, id = id }):up();
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
313 if room:get_whois() ~= "anyone" then
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
314 item:maptags(function (tag)
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
315 if tag.name == "x" and tag.attr.xmlns == xmlns_muc_user then
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
316 return nil;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
317 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
318 return tag;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
319 end);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
320 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
321 if maxchars then
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
322 local chars = #tostring(item);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
323 if maxchars - chars < 0 then
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
324 break
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
325 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
326 maxchars = maxchars - chars;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
327 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
328 history[i], i = item, i+1;
10111
0f335815244f plugins: Remove tostring call from logging
Kim Alvefur <zash@zash.se>
parents: 10030
diff changeset
329 -- module:log("debug", item);
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
330 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
331 function event.next_stanza()
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
332 i = i - 1;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
333 return history[i];
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
334 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
335 return true;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
336 end, 1);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
337
8786
adffadd88ff0 mod_muc_mam: Have stanza-id filtering over all groupchat messages, not just ones considered for history
Kim Alvefur <zash@zash.se>
parents: 8785
diff changeset
338 module:hook("muc-broadcast-messages", function (event)
adffadd88ff0 mod_muc_mam: Have stanza-id filtering over all groupchat messages, not just ones considered for history
Kim Alvefur <zash@zash.se>
parents: 8785
diff changeset
339 local room, stanza = event.room, event.stanza;
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
340
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
341 -- Filter out <stanza-id> that claim to be from us
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
342 stanza:maptags(function (tag)
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
343 if tag.name == "stanza-id" and tag.attr.xmlns == xmlns_st_id
8786
adffadd88ff0 mod_muc_mam: Have stanza-id filtering over all groupchat messages, not just ones considered for history
Kim Alvefur <zash@zash.se>
parents: 8785
diff changeset
344 and jid_prep(tag.attr.by) == room.jid then
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
345 return nil;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
346 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
347 if tag.name == "x" and tag.attr.xmlns == xmlns_muc_user then
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
348 return nil;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
349 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
350 return tag;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
351 end);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
352
8786
adffadd88ff0 mod_muc_mam: Have stanza-id filtering over all groupchat messages, not just ones considered for history
Kim Alvefur <zash@zash.se>
parents: 8785
diff changeset
353 end, 0);
adffadd88ff0 mod_muc_mam: Have stanza-id filtering over all groupchat messages, not just ones considered for history
Kim Alvefur <zash@zash.se>
parents: 8785
diff changeset
354
adffadd88ff0 mod_muc_mam: Have stanza-id filtering over all groupchat messages, not just ones considered for history
Kim Alvefur <zash@zash.se>
parents: 8785
diff changeset
355 -- Handle messages
adffadd88ff0 mod_muc_mam: Have stanza-id filtering over all groupchat messages, not just ones considered for history
Kim Alvefur <zash@zash.se>
parents: 8785
diff changeset
356 local function save_to_history(self, stanza)
10560
3adb6c46fbf4 mod_muc_mam: Remove unused variable [luacheck]
Kim Alvefur <zash@zash.se>
parents: 10558
diff changeset
357 local room_node = jid_split(self.jid);
8786
adffadd88ff0 mod_muc_mam: Have stanza-id filtering over all groupchat messages, not just ones considered for history
Kim Alvefur <zash@zash.se>
parents: 8785
diff changeset
358
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
359 local stored_stanza = stanza;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
360
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
361 if stanza.name == "message" and self:get_whois() == "anyone" then
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
362 stored_stanza = st.clone(stanza);
9841
a44f562e01a5 mod_muc_mam: Strip the stanza 'to' attribute (fixes #1259)
Kim Alvefur <zash@zash.se>
parents: 9552
diff changeset
363 stored_stanza.attr.to = nil;
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
364 local actor = jid_bare(self._occupants[stanza.attr.from].jid);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
365 local affiliation = self:get_affiliation(actor) or "none";
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
366 local role = self:get_role(actor) or self:get_default_role(affiliation);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
367 stored_stanza:add_direct_child(st.stanza("x", { xmlns = xmlns_muc_user })
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
368 :tag("item", { affiliation = affiliation; role = role; jid = actor }));
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
369 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
370
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
371 -- Policy check
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
372 if not archiving_enabled(self) then return end -- Don't log
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
373
9843
17060708d0eb mod_muc_mam: Add comment about the tricks done with the 'with' field
Kim Alvefur <zash@zash.se>
parents: 9842
diff changeset
374 -- Save the type in the 'with' field, allows storing presence without conflicts
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
375 local with = stanza.name
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
376 if stanza.attr.type then
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
377 with = with .. "<" .. stanza.attr.type
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
378 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
379
9842
6f39be2e0be5 mod_muc_mam: Move a comment to the line it describes
Kim Alvefur <zash@zash.se>
parents: 9841
diff changeset
380 -- And stash it
10000
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
381 local time = time_now();
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
382 local id, err = archive:append(room_node, nil, stored_stanza, time, with);
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
383
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
384 if not id and err == "quota-limit" then
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
385 if type(cleanup_after) == "number" then
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
386 module:log("debug", "Room '%s' over quota, cleaning archive", room_node);
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
387 local cleaned = archive:delete(room_node, {
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
388 ["end"] = (os.time() - cleanup_after);
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
389 });
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
390 if cleaned then
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
391 id, err = archive:append(room_node, nil, stored_stanza, time, with);
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
392 end
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
393 end
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
394 if not id and (archive.caps and archive.caps.truncate) then
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
395 module:log("debug", "User '%s' over quota, truncating archive", room_node);
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
396 local truncated = archive:delete(room_node, {
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
397 truncate = archive_item_limit - 1;
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
398 });
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
399 if truncated then
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
400 id, err = archive:append(room_node, nil, stored_stanza, time, with);
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
401 end
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
402 end
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
403 end
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
404
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
405 if id then
9880
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
406 schedule_cleanup(room_node);
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
407 stanza:add_direct_child(st.stanza("stanza-id", { xmlns = xmlns_st_id, by = self.jid, id = id }));
10526
28c8e09fb3cd mod_muc_mam: Log error when unable to store stanza (fix #1480) [luacheck]
Kim Alvefur <zash@zash.se>
parents: 10029
diff changeset
408 else
28c8e09fb3cd mod_muc_mam: Log error when unable to store stanza (fix #1480) [luacheck]
Kim Alvefur <zash@zash.se>
parents: 10029
diff changeset
409 module:log("error", "Could not archive stanza: %s", err);
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
410 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
411 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
412
8724
cfcc78c50905 mod_muc_mam: Let muc/history.lib decide which messages to store
Kim Alvefur <zash@zash.se>
parents: 8723
diff changeset
413 module:hook("muc-add-history", function (event)
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
414 local room, stanza = event.room, event.stanza;
8724
cfcc78c50905 mod_muc_mam: Let muc/history.lib decide which messages to store
Kim Alvefur <zash@zash.se>
parents: 8723
diff changeset
415 save_to_history(room, stanza);
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
416 end);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
417
9001
23070882f3d4 mod_muc_mam: Disable presence logging by default
Kim Alvefur <zash@zash.se>
parents: 8832
diff changeset
418 if module:get_option_boolean("muc_log_presences", false) then
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
419 module:hook("muc-occupant-joined", function (event)
8725
ced09d7d7c96 mod_muc_mam: Save the MUC <x> on recorded join stanzas
Kim Alvefur <zash@zash.se>
parents: 8724
diff changeset
420 save_to_history(event.room, st.stanza("presence", { from = event.nick }):tag("x", { xmlns = "http://jabber.org/protocol/muc" }));
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
421 end);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
422 module:hook("muc-occupant-left", function (event)
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
423 save_to_history(event.room, st.stanza("presence", { type = "unavailable", from = event.nick }));
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
424 end);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
425 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
426
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
427 if not archive.delete then
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
428 module:log("warn", "Storage driver %s does not support deletion", archive._provided_by);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
429 module:log("warn", "Archived message will persist after a room has been destroyed");
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
430 else
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
431 module:hook("muc-room-destroyed", function(event)
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
432 local room_node = jid_split(event.room.jid);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
433 archive:delete(room_node);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
434 end);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
435 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
436
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
437 -- And role/affiliation changes?
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
438
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
439 module:add_feature(xmlns_mam);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
440
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
441 module:hook("muc-disco#info", function(event)
10119
29733134c76c mod_muc_mam: Conditionally advertise MAM feature on rooms (fixes #1407)
Kim Alvefur <zash@zash.se>
parents: 10111
diff changeset
442 if archiving_enabled(event.room) then
29733134c76c mod_muc_mam: Conditionally advertise MAM feature on rooms (fixes #1407)
Kim Alvefur <zash@zash.se>
parents: 10111
diff changeset
443 event.reply:tag("feature", {var=xmlns_mam}):up();
29733134c76c mod_muc_mam: Conditionally advertise MAM feature on rooms (fixes #1407)
Kim Alvefur <zash@zash.se>
parents: 10111
diff changeset
444 end
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
445 end);
9880
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
446
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
447 -- Cleanup
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
448
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
449 if cleanup_after ~= "never" then
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
450 local cleanup_storage = module:open_store("muc_log_cleanup");
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
451 local cleanup_map = module:open_store("muc_log_cleanup", "map");
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
452
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
453 local day = 86400;
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
454 local multipliers = { d = day, w = day * 7, m = 31 * day, y = 365.2425 * day };
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
455 local n, m = cleanup_after:lower():match("(%d+)%s*([dwmy]?)");
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
456 if not n then
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
457 module:log("error", "Could not parse muc_log_expires_after string %q", cleanup_after);
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
458 return false;
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
459 end
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
460
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
461 cleanup_after = tonumber(n) * ( multipliers[m] or 1 );
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
462
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
463 module:log("debug", "muc_log_expires_after = %d -- in seconds", cleanup_after);
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
464
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
465 if not archive.delete then
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
466 module:log("error", "muc_log_expires_after set but mod_%s does not support deleting", archive._provided_by);
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
467 return false;
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
468 end
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
469
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
470 -- For each day, store a set of rooms that have new messages. To expire
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
471 -- messages, we collect the union of sets of rooms from dates that fall
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
472 -- outside the cleanup range.
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
473
10029
2c8f674b9243 mod_muc_mam: Cache last date that archive owner has messages to reduce writes (fixes #1368)
Kim Alvefur <zash@zash.se>
parents: 9880
diff changeset
474 local last_date = require "util.cache".new(module:get_option_number("muc_log_cleanup_date_cache_size", 1000));
9880
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
475 function schedule_cleanup(roomname, date)
10029
2c8f674b9243 mod_muc_mam: Cache last date that archive owner has messages to reduce writes (fixes #1368)
Kim Alvefur <zash@zash.se>
parents: 9880
diff changeset
476 date = date or datestamp();
2c8f674b9243 mod_muc_mam: Cache last date that archive owner has messages to reduce writes (fixes #1368)
Kim Alvefur <zash@zash.se>
parents: 9880
diff changeset
477 if last_date:get(roomname) == date then return end
2c8f674b9243 mod_muc_mam: Cache last date that archive owner has messages to reduce writes (fixes #1368)
Kim Alvefur <zash@zash.se>
parents: 9880
diff changeset
478 local ok = cleanup_map:set(date, roomname, true);
2c8f674b9243 mod_muc_mam: Cache last date that archive owner has messages to reduce writes (fixes #1368)
Kim Alvefur <zash@zash.se>
parents: 9880
diff changeset
479 if ok then
2c8f674b9243 mod_muc_mam: Cache last date that archive owner has messages to reduce writes (fixes #1368)
Kim Alvefur <zash@zash.se>
parents: 9880
diff changeset
480 last_date:set(roomname, date);
2c8f674b9243 mod_muc_mam: Cache last date that archive owner has messages to reduce writes (fixes #1368)
Kim Alvefur <zash@zash.se>
parents: 9880
diff changeset
481 end
9880
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
482 end
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
483
10585
2d8535338099 mod_muc_mam: Measure how long a cleanup run takes (like mod_mam)
Kim Alvefur <zash@zash.se>
parents: 10568
diff changeset
484 local cleanup_time = module:measure("cleanup", "times");
2d8535338099 mod_muc_mam: Measure how long a cleanup run takes (like mod_mam)
Kim Alvefur <zash@zash.se>
parents: 10568
diff changeset
485
9880
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
486 cleanup_runner = require "util.async".runner(function ()
10585
2d8535338099 mod_muc_mam: Measure how long a cleanup run takes (like mod_mam)
Kim Alvefur <zash@zash.se>
parents: 10568
diff changeset
487 local cleanup_done = cleanup_time();
9880
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
488 local rooms = {};
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
489 local cut_off = datestamp(os.time() - cleanup_after);
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
490 for date in cleanup_storage:users() do
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
491 if date <= cut_off then
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
492 module:log("debug", "Messages from %q should be expired", date);
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
493 local messages_this_day = cleanup_storage:get(date);
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
494 if messages_this_day then
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
495 for room in pairs(messages_this_day) do
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
496 rooms[room] = true;
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
497 end
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
498 if date < cut_off then
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
499 -- Messages from the same day as the cut-off might not have expired yet,
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
500 -- but all earlier will have, so clear storage for those days.
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
501 cleanup_storage:set(date, nil);
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
502 end
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
503 end
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
504 end
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
505 end
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
506 local sum, num_rooms = 0, 0;
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
507 for room in pairs(rooms) do
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
508 local ok, err = archive:delete(room, { ["end"] = os.time() - cleanup_after; })
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
509 if ok then
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
510 num_rooms = num_rooms + 1;
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
511 sum = sum + (tonumber(ok) or 0);
10561
29b3eb95c268 mod_muc_mam: Log error when unable to delete old messages (fix #1481) [luacheck]
Kim Alvefur <zash@zash.se>
parents: 10526
diff changeset
512 else
10562
670afc079f68 mod_muc_mam: Schedule cleanup again on failure
Kim Alvefur <zash@zash.se>
parents: 10561
diff changeset
513 cleanup_map:set(cut_off, room, true);
10561
29b3eb95c268 mod_muc_mam: Log error when unable to delete old messages (fix #1481) [luacheck]
Kim Alvefur <zash@zash.se>
parents: 10526
diff changeset
514 module:log("error", "Could not delete messages for room '%s': %s", room, err);
9880
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
515 end
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
516 end
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
517 module:log("info", "Deleted %d expired messages for %d rooms", sum, num_rooms);
10585
2d8535338099 mod_muc_mam: Measure how long a cleanup run takes (like mod_mam)
Kim Alvefur <zash@zash.se>
parents: 10568
diff changeset
518 cleanup_done();
9880
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
519 end);
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
520
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
521 cleanup_task = module:add_timer(1, function ()
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
522 cleanup_runner:run(true);
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
523 return cleanup_interval;
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
524 end);
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
525 else
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
526 module:log("debug", "Archive expiry disabled");
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
527 end