Annotate

plugins/mod_muc_mam.lua @ 11961:542a9a503073

util.async: Add sleep() method with configurable scheduling backend No scheduler set by default, so it will error (we plan to initialize it in util.startup). We wanted to avoid a hard dependency on util.timer (which in turn depends on network backends, etc.), and we didn't add timer.sleep() because we didn't want to add a hard dependency on util.async for things that don't need it.
author Matthew Wild <mwild1@gmail.com>
date Mon, 29 Nov 2021 14:11:24 +0000
parent 11876:52a1b885044e
child 11968:6e1af07921d1
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
11282
cabb022f31c0 mod_muc_mam: Copy extended MAM support from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10944
diff changeset
2 -- Copyright (C) 2011-2021 Kim Alvefur
8722
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";
11282
cabb022f31c0 mod_muc_mam: Copy extended MAM support from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10944
diff changeset
12 local xmlns_mam_ext = "urn:xmpp:mam:2#extended";
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
13 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
14 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
15 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
16 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
17 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
18
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
19 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
20 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
21 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
22 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
23 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
24 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
25 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
26
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
27 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
28 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
29
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
30 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
31 local tostring = tostring;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
32 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
33 local m_min = math.min;
11876
52a1b885044e mod_muc_mam: Use util.dataforms timestamp validation
Kim Alvefur <zash@zash.se>
parents: 11818
diff changeset
34 local timestamp, datestamp = import("util.datetime", "datetime", "date");
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
35 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
36
10000
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
37 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
38 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
39
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
40 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
41 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
42
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
43 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
44 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
45 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
46
9880
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
47 function schedule_cleanup()
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
48 -- 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
49 end
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
50
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
51 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
52 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
53
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
54 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
55 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
56
10000
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
57 local archive_item_limit = module:get_option_number("storage_archive_item_limit", archive.caps and archive.caps.quota or 1000);
10800
62794e065e33 MAM: Remove 1% of contents when reaching limits, fix #1545
Kim Alvefur <zash@zash.se>
parents: 10683
diff changeset
58 local archive_truncate = math.floor(archive_item_limit * 0.99);
10000
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
59
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
60 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
61 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
62 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
63 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
64 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
65 else
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
66 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
67 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
68 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
69 return false;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
70 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
71
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
72 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
73 if log_all_rooms then
10000
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
74 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
75 return true;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
76 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
77 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
78 if enabled == nil then
10000
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
79 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
80 return log_by_default;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
81 end
10000
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
82 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
83 return enabled;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
84 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
85
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
86 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
87 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
88 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
89 table.insert(form,
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
90 {
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
91 name = muc_form_enable,
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
92 type = "boolean",
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
93 label = "Enable archiving?",
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
94 value = archiving_enabled(room),
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
95 }
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
96 );
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
97 end);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
98
8723
f3bdb20214ab mod_muc_mam: Remove 0.10 compat code
Kim Alvefur <zash@zash.se>
parents: 8722
diff changeset
99 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
100 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
101 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
102 end);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
103 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
104
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
105 -- 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
106 local query_form = dataform {
11876
52a1b885044e mod_muc_mam: Use util.dataforms timestamp validation
Kim Alvefur <zash@zash.se>
parents: 11818
diff changeset
107 { name = "FORM_TYPE"; type = "hidden"; value = xmlns_mam };
52a1b885044e mod_muc_mam: Use util.dataforms timestamp validation
Kim Alvefur <zash@zash.se>
parents: 11818
diff changeset
108 { name = "with"; type = "jid-single" };
52a1b885044e mod_muc_mam: Use util.dataforms timestamp validation
Kim Alvefur <zash@zash.se>
parents: 11818
diff changeset
109 { name = "start"; type = "text-single"; datatype = "xs:dateTime" };
52a1b885044e mod_muc_mam: Use util.dataforms timestamp validation
Kim Alvefur <zash@zash.se>
parents: 11818
diff changeset
110 { name = "end"; type = "text-single"; datatype = "xs:dateTime" };
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
111 };
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
112
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
113 -- Serve form
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
114 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
115 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
116 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
117 return true;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
118 end);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
119
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
120 -- Handle archive queries
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
121 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
122 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
123 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
124 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
125 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
126 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
127
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
128 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
129 if not room then
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
130 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
131 return true;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
132 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
133 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
134
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
135 -- 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
136 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
137 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
138 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
139 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
140 return true;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
141 end
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 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
144
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
145 -- Search query parameters
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
146 local qstart, qend;
11282
cabb022f31c0 mod_muc_mam: Copy extended MAM support from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10944
diff changeset
147 local qbefore, qafter;
cabb022f31c0 mod_muc_mam: Copy extended MAM support from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10944
diff changeset
148 local qids;
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
149 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
150 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
151 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
152 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
153 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
154 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
155 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
156 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
157 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
158 end
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
159 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
160 if err then
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
161 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
162 return true;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
163 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
164 qstart, qend = form["start"], form["end"];
11282
cabb022f31c0 mod_muc_mam: Copy extended MAM support from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10944
diff changeset
165 qbefore, qafter = form["before-id"], form["after-id"];
cabb022f31c0 mod_muc_mam: Copy extended MAM support from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10944
diff changeset
166 qids = form["ids"];
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
167 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
168
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
169 -- RSM stuff
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
170 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
171 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
172 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
173
11282
cabb022f31c0 mod_muc_mam: Copy extended MAM support from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10944
diff changeset
174 local before, after = qset and qset.before or qbefore, qset and qset.after or qafter;
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
175 if type(before) ~= "string" then before = nil; end
11282
cabb022f31c0 mod_muc_mam: Copy extended MAM support from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10944
diff changeset
176 -- A reverse query needs to be flipped
cabb022f31c0 mod_muc_mam: Copy extended MAM support from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10944
diff changeset
177 local flip = reverse;
cabb022f31c0 mod_muc_mam: Copy extended MAM support from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10944
diff changeset
178 -- A flip-page query needs to be the opposite of that.
cabb022f31c0 mod_muc_mam: Copy extended MAM support from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10944
diff changeset
179 if query:get_child("flip-page") then flip = not flip end
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
180
11817
a67b4d4f8eef mod_muc_mam: Merge main and RSM-specific log message into a single one
Kim Alvefur <zash@zash.se>
parents: 11816
diff changeset
181 module:log("debug", "Archive query by %s id=%s when=%s...%s rsm=%q",
a67b4d4f8eef mod_muc_mam: Merge main and RSM-specific log message into a single one
Kim Alvefur <zash@zash.se>
parents: 11816
diff changeset
182 from,
a67b4d4f8eef mod_muc_mam: Merge main and RSM-specific log message into a single one
Kim Alvefur <zash@zash.se>
parents: 11816
diff changeset
183 qid or stanza.attr.id,
a67b4d4f8eef mod_muc_mam: Merge main and RSM-specific log message into a single one
Kim Alvefur <zash@zash.se>
parents: 11816
diff changeset
184 qstart and timestamp(qstart) or "",
a67b4d4f8eef mod_muc_mam: Merge main and RSM-specific log message into a single one
Kim Alvefur <zash@zash.se>
parents: 11816
diff changeset
185 qend and timestamp(qend) or "",
a67b4d4f8eef mod_muc_mam: Merge main and RSM-specific log message into a single one
Kim Alvefur <zash@zash.se>
parents: 11816
diff changeset
186 qset);
a67b4d4f8eef mod_muc_mam: Merge main and RSM-specific log message into a single one
Kim Alvefur <zash@zash.se>
parents: 11816
diff changeset
187
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
188 -- Load all the data!
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
189 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
190 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
191 limit = qmax + 1;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
192 before = before; after = after;
11282
cabb022f31c0 mod_muc_mam: Copy extended MAM support from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10944
diff changeset
193 ids = qids;
8722
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
11282
cabb022f31c0 mod_muc_mam: Copy extended MAM support from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10944
diff changeset
247 if flip then
8722
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
11282
cabb022f31c0 mod_muc_mam: Copy extended MAM support from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10944
diff changeset
254 if flip then
8722
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
11282
cabb022f31c0 mod_muc_mam: Copy extended MAM support from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10944
diff changeset
258 end
cabb022f31c0 mod_muc_mam: Copy extended MAM support from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10944
diff changeset
259 if reverse then
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
260 first, last = last, first;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
261 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
262
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
263
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
264 origin.send(st.reply(stanza)
11744
5f99aa6bb76d mod_muc_mam: Omit queryid attribute from <fin/>
Holger Weiss <holger@zedat.fu-berlin.de>
parents: 11282
diff changeset
265 :tag("fin", { xmlns = xmlns_mam, complete = complete })
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
266 :add_child(rsm.generate {
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
267 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
268
360d574517b6 mod_muc_mam: Copy debug log improvements from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10119
diff changeset
269 -- That's all folks!
360d574517b6 mod_muc_mam: Copy debug log improvements from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10119
diff changeset
270 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
271 return true;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
272 end);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
273
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
274 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
275 local room = event.room;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
276 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
277 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
278 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
279 local maxchars = event.maxchars;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
280 local since = event.since;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
281 local to = event.to;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
282
8784
64b78e3deb96 mod_muc_mam: Skip fetching history if no history was requested
Kim Alvefur <zash@zash.se>
parents: 8783
diff changeset
283 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
284 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
285 end
64b78e3deb96 mod_muc_mam: Skip fetching history if no history was requested
Kim Alvefur <zash@zash.se>
parents: 8783
diff changeset
286
8783
79133eca0656 mod_muc_mam: Tweak calculation of max history to retrieve
Kim Alvefur <zash@zash.se>
parents: 8725
diff changeset
287 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
288 maxstanzas = get_historylength(room);
79133eca0656 mod_muc_mam: Tweak calculation of max history to retrieve
Kim Alvefur <zash@zash.se>
parents: 8725
diff changeset
289 end
79133eca0656 mod_muc_mam: Tweak calculation of max history to retrieve
Kim Alvefur <zash@zash.se>
parents: 8725
diff changeset
290
8785
82b889608503 mod_muc_mam: Skip fetching history if built-in recent history is enough
Kim Alvefur <zash@zash.se>
parents: 8784
diff changeset
291 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
292 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
293 end
82b889608503 mod_muc_mam: Skip fetching history if built-in recent history is enough
Kim Alvefur <zash@zash.se>
parents: 8784
diff changeset
294
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
295 -- Load all the data!
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
296 local query = {
8783
79133eca0656 mod_muc_mam: Tweak calculation of max history to retrieve
Kim Alvefur <zash@zash.se>
parents: 8725
diff changeset
297 limit = maxstanzas;
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
298 start = since;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
299 reverse = true;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
300 with = "message<groupchat";
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 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
303
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
304 if not data then
10111
0f335815244f plugins: Remove tostring call from logging
Kim Alvefur <zash@zash.se>
parents: 10030
diff changeset
305 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
306 return
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
307 end
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 local history, i = {}, 1;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
310
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
311 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
312 item.attr.to = to;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
313 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
314 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
315 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
316 item:maptags(function (tag)
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
317 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
318 return nil;
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 return tag;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
321 end);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
322 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
323 if maxchars then
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
324 local chars = #tostring(item);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
325 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
326 break
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 maxchars = maxchars - chars;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
329 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
330 history[i], i = item, i+1;
10111
0f335815244f plugins: Remove tostring call from logging
Kim Alvefur <zash@zash.se>
parents: 10030
diff changeset
331 -- 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
332 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
333 function event.next_stanza()
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
334 i = i - 1;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
335 return history[i];
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
336 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
337 return true;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
338 end, 1);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
339
10814
e042b0c8b310 mod_muc_mam: Fix stanza id filter event name, fixes #1546
Kim Alvefur <zash@zash.se>
parents: 10682
diff changeset
340 module:hook("muc-broadcast-message", function (event)
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
341 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
342
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
343 -- 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
344 stanza:maptags(function (tag)
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
345 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
346 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
347 return nil;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
348 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
349 return tag;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
350 end);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
351
10834
c6e852984d48 mod_muc_mam: Remove spoofed archive IDs before archiving, fix #1552
Kim Alvefur <zash@zash.se>
parents: 10815
diff changeset
352 end, 1);
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
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 -- 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
355 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
356 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
357
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
358 local stored_stanza = stanza;
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
359
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
360 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
361 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
362 stored_stanza.attr.to = nil;
10670
5376f882cf82 mod_muc_mam: Fix traceback saving message from non-occupant (fixes #1497)
Kim Alvefur <zash@zash.se>
parents: 10566
diff changeset
363 local occupant = self._occupants[stanza.attr.from];
5376f882cf82 mod_muc_mam: Fix traceback saving message from non-occupant (fixes #1497)
Kim Alvefur <zash@zash.se>
parents: 10566
diff changeset
364 if occupant then
5376f882cf82 mod_muc_mam: Fix traceback saving message from non-occupant (fixes #1497)
Kim Alvefur <zash@zash.se>
parents: 10566
diff changeset
365 local actor = jid_bare(occupant.jid);
5376f882cf82 mod_muc_mam: Fix traceback saving message from non-occupant (fixes #1497)
Kim Alvefur <zash@zash.se>
parents: 10566
diff changeset
366 local affiliation = self:get_affiliation(actor) or "none";
5376f882cf82 mod_muc_mam: Fix traceback saving message from non-occupant (fixes #1497)
Kim Alvefur <zash@zash.se>
parents: 10566
diff changeset
367 local role = self:get_role(actor) or self:get_default_role(affiliation);
5376f882cf82 mod_muc_mam: Fix traceback saving message from non-occupant (fixes #1497)
Kim Alvefur <zash@zash.se>
parents: 10566
diff changeset
368 stored_stanza:add_direct_child(st.stanza("x", { xmlns = xmlns_muc_user })
5376f882cf82 mod_muc_mam: Fix traceback saving message from non-occupant (fixes #1497)
Kim Alvefur <zash@zash.se>
parents: 10566
diff changeset
369 :tag("item", { affiliation = affiliation; role = role; jid = actor }));
5376f882cf82 mod_muc_mam: Fix traceback saving message from non-occupant (fixes #1497)
Kim Alvefur <zash@zash.se>
parents: 10566
diff changeset
370 end
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
371 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
372
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
373 -- Policy check
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
374 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
375
9843
17060708d0eb mod_muc_mam: Add comment about the tricks done with the 'with' field
Kim Alvefur <zash@zash.se>
parents: 9842
diff changeset
376 -- 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
377 local with = stanza.name
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
378 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
379 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
380 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
381
9842
6f39be2e0be5 mod_muc_mam: Move a comment to the line it describes
Kim Alvefur <zash@zash.se>
parents: 9841
diff changeset
382 -- And stash it
10000
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
383 local time = time_now();
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
384 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
385
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
386 if not id and err == "quota-limit" then
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
387 if type(cleanup_after) == "number" then
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
388 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
389 local cleaned = archive:delete(room_node, {
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
390 ["end"] = (os.time() - cleanup_after);
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
391 });
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
392 if cleaned then
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
393 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
394 end
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
395 end
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
396 if not id and (archive.caps and archive.caps.truncate) then
11818
c443abff04d8 mod_muc_mam: Fix reference to "user" in debug message copied from mod_mam
Kim Alvefur <zash@zash.se>
parents: 11817
diff changeset
397 module:log("debug", "Room '%s' over quota, truncating archive", room_node);
10000
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
398 local truncated = archive:delete(room_node, {
10800
62794e065e33 MAM: Remove 1% of contents when reaching limits, fix #1545
Kim Alvefur <zash@zash.se>
parents: 10683
diff changeset
399 truncate = archive_truncate;
10000
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
400 });
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
401 if truncated then
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
402 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
403 end
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
404 end
189b00a782bf mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents: 9882
diff changeset
405 end
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
406
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
407 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
408 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
409 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
410 else
28c8e09fb3cd mod_muc_mam: Log error when unable to store stanza (fix #1480) [luacheck]
Kim Alvefur <zash@zash.se>
parents: 10029
diff changeset
411 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
412 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
413 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
414
8724
cfcc78c50905 mod_muc_mam: Let muc/history.lib decide which messages to store
Kim Alvefur <zash@zash.se>
parents: 8723
diff changeset
415 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
416 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
417 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
418 end);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
419
9001
23070882f3d4 mod_muc_mam: Disable presence logging by default
Kim Alvefur <zash@zash.se>
parents: 8832
diff changeset
420 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
421 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
422 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
423 end);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
424 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
425 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
426 end);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
427 end
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
428
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
429 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
430 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
431 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
432 else
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
433 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
434 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
435 archive:delete(room_node);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
436 end);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
437 end
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 -- And role/affiliation changes?
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:add_feature(xmlns_mam);
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
442
11282
cabb022f31c0 mod_muc_mam: Copy extended MAM support from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10944
diff changeset
443 local advertise_extended = archive.caps and archive.caps.full_id_range and archive.caps.ids;
cabb022f31c0 mod_muc_mam: Copy extended MAM support from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10944
diff changeset
444
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
445 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
446 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
447 event.reply:tag("feature", {var=xmlns_mam}):up();
11282
cabb022f31c0 mod_muc_mam: Copy extended MAM support from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10944
diff changeset
448 if advertise_extended then
cabb022f31c0 mod_muc_mam: Copy extended MAM support from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10944
diff changeset
449 (event.reply or event.stanza):tag("feature", {var=xmlns_mam_ext}):up();
cabb022f31c0 mod_muc_mam: Copy extended MAM support from mod_mam
Kim Alvefur <zash@zash.se>
parents: 10944
diff changeset
450 end
10119
29733134c76c mod_muc_mam: Conditionally advertise MAM feature on rooms (fixes #1407)
Kim Alvefur <zash@zash.se>
parents: 10111
diff changeset
451 end
10815
c432b7172fa3 mod_muc_mam: Fix missing advertising of XEP-0359, fixes #1547
Kim Alvefur <zash@zash.se>
parents: 10814
diff changeset
452 event.reply:tag("feature", {var=xmlns_st_id}):up();
8722
7ee93b3fa160 mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff changeset
453 end);
9880
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
454
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
455 -- Cleanup
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
456
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
457 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
458 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
459 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
460
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
461 local day = 86400;
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
462 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
463 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
464 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
465 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
466 return false;
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
467 end
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
468
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
469 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
470
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
471 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
472
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
473 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
474 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
475 return false;
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
476 end
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
477
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
478 -- 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
479 -- 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
480 -- 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
481
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
482 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
483 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
484 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
485 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
486 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
487 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
488 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
489 end
9880
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
490 end
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
491
10585
2d8535338099 mod_muc_mam: Measure how long a cleanup run takes (like mod_mam)
Kim Alvefur <zash@zash.se>
parents: 10568
diff changeset
492 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
493
10682
62ef68f95b6f mod_mam,mod_muc_mam: Allow other work to be performed during archive cleanup (fixes #1504)
Kim Alvefur <zash@zash.se>
parents: 10670
diff changeset
494 local async = require "util.async";
62ef68f95b6f mod_mam,mod_muc_mam: Allow other work to be performed during archive cleanup (fixes #1504)
Kim Alvefur <zash@zash.se>
parents: 10670
diff changeset
495 cleanup_runner = 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
496 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
497 local rooms = {};
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
498 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
499 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
500 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
501 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
502 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
503 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
504 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
505 rooms[room] = true;
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
506 end
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
507 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
508 -- 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
509 -- 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
510 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
511 end
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
512 end
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
513 end
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
514 end
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
515 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
516 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
517 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
518 if ok then
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
519 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
520 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
521 else
10562
670afc079f68 mod_muc_mam: Schedule cleanup again on failure
Kim Alvefur <zash@zash.se>
parents: 10561
diff changeset
522 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
523 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
524 end
10682
62ef68f95b6f mod_mam,mod_muc_mam: Allow other work to be performed during archive cleanup (fixes #1504)
Kim Alvefur <zash@zash.se>
parents: 10670
diff changeset
525 local wait, done = async.waiter();
62ef68f95b6f mod_mam,mod_muc_mam: Allow other work to be performed during archive cleanup (fixes #1504)
Kim Alvefur <zash@zash.se>
parents: 10670
diff changeset
526 module:add_timer(0.01, done);
62ef68f95b6f mod_mam,mod_muc_mam: Allow other work to be performed during archive cleanup (fixes #1504)
Kim Alvefur <zash@zash.se>
parents: 10670
diff changeset
527 wait();
9880
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
528 end
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
529 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
530 cleanup_done();
9880
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
531 end);
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
532
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
533 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
534 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
535 return cleanup_interval;
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
536 end);
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
537 else
78885b1bbb91 mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents: 9843
diff changeset
538 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
539 end