Software /
code /
prosody
Annotate
plugins/mod_muc_mam.lua @ 10049:c523642ea293
util.dependencies: Increase Lua version to warn about to 5.4
No significant problems have been encountered with Lua 5.3 itself, so
apart from some odd problems in LuaExpat it seems about time to declare
it ready.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Wed, 19 Jun 2019 19:16:09 +0200 |
parent | 10030:98ef41a60fc3 |
child | 10111:0f335815244f |
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); |
3de80fc511ab
mod_muc_mam: Validate that the FORM_TYPE of a query is as expected
Kim Alvefur <zash@zash.se>
parents:
9552
diff
changeset
|
148 if form_type ~= xmlns_mam then |
3de80fc511ab
mod_muc_mam: Validate that the FORM_TYPE of a query is as expected
Kim Alvefur <zash@zash.se>
parents:
9552
diff
changeset
|
149 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
|
150 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
|
151 end |
8722
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
152 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
|
153 if err then |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
154 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
|
155 return true; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
156 end |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
157 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
|
158 end |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
159 |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
160 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
|
161 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
|
162 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
|
163 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
|
164 return true; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
165 end |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
166 qstart, qend = vstart, vend; |
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 module:log("debug", "Archive query id %s from %s until %s)", |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
170 tostring(qid), |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
171 qstart and timestamp(qstart) or "the dawn of time", |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
172 qend and timestamp(qend) or "now"); |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
173 |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
174 -- RSM stuff |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
175 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
|
176 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
|
177 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
|
178 |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
179 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
|
180 if type(before) ~= "string" then before = nil; end |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
181 |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
182 -- Load all the data! |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
183 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
|
184 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
|
185 limit = qmax + 1; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
186 before = before; after = after; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
187 reverse = reverse; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
188 with = "message<groupchat"; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
189 }); |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
190 |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
191 if not data then |
10022
b56654f89cd5
mod_muc_mam: Propagate item-not-found to client (fixes #1325)
Kim Alvefur <zash@zash.se>
parents:
10000
diff
changeset
|
192 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
|
193 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
|
194 else |
b56654f89cd5
mod_muc_mam: Propagate item-not-found to client (fixes #1325)
Kim Alvefur <zash@zash.se>
parents:
10000
diff
changeset
|
195 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
|
196 end |
8722
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
197 return true; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
198 end |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
199 local total = tonumber(err); |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
200 |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
201 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
|
202 |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
203 local results = {}; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
204 |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
205 -- 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
|
206 local first, last; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
207 local count = 0; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
208 local complete = "true"; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
209 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
|
210 count = count + 1; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
211 if count > qmax then |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
212 complete = nil; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
213 break; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
214 end |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
215 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
|
216 :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
|
217 :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
|
218 :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
|
219 |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
220 -- 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
|
221 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
|
222 item:maptags(function (tag) |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
223 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
|
224 return nil; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
225 end |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
226 return tag; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
227 end); |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
228 end |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
229 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
|
230 item = st.deserialize(item); |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
231 end |
9841
a44f562e01a5
mod_muc_mam: Strip the stanza 'to' attribute (fixes #1259)
Kim Alvefur <zash@zash.se>
parents:
9552
diff
changeset
|
232 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
|
233 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
|
234 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
|
235 |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
236 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
|
237 last = id; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
238 |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
239 if reverse then |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
240 results[count] = fwd_st; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
241 else |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
242 origin.send(fwd_st); |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
243 end |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
244 end |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
245 |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
246 if reverse then |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
247 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
|
248 origin.send(results[i]); |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
249 end |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
250 first, last = last, first; |
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 |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
253 -- That's all folks! |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
254 module:log("debug", "Archive query %s completed", tostring(qid)); |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
255 |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
256 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
|
257 :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
|
258 :add_child(rsm.generate { |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
259 first = first, last = last, count = total })); |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
260 return true; |
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 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
|
264 local room = event.room; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
265 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
|
266 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
|
267 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
|
268 local maxchars = event.maxchars; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
269 local since = event.since; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
270 local to = event.to; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
271 |
8784
64b78e3deb96
mod_muc_mam: Skip fetching history if no history was requested
Kim Alvefur <zash@zash.se>
parents:
8783
diff
changeset
|
272 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
|
273 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
|
274 end |
64b78e3deb96
mod_muc_mam: Skip fetching history if no history was requested
Kim Alvefur <zash@zash.se>
parents:
8783
diff
changeset
|
275 |
8783
79133eca0656
mod_muc_mam: Tweak calculation of max history to retrieve
Kim Alvefur <zash@zash.se>
parents:
8725
diff
changeset
|
276 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
|
277 maxstanzas = get_historylength(room); |
79133eca0656
mod_muc_mam: Tweak calculation of max history to retrieve
Kim Alvefur <zash@zash.se>
parents:
8725
diff
changeset
|
278 end |
79133eca0656
mod_muc_mam: Tweak calculation of max history to retrieve
Kim Alvefur <zash@zash.se>
parents:
8725
diff
changeset
|
279 |
8785
82b889608503
mod_muc_mam: Skip fetching history if built-in recent history is enough
Kim Alvefur <zash@zash.se>
parents:
8784
diff
changeset
|
280 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
|
281 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
|
282 end |
82b889608503
mod_muc_mam: Skip fetching history if built-in recent history is enough
Kim Alvefur <zash@zash.se>
parents:
8784
diff
changeset
|
283 |
8722
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
284 -- Load all the data! |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
285 local query = { |
8783
79133eca0656
mod_muc_mam: Tweak calculation of max history to retrieve
Kim Alvefur <zash@zash.se>
parents:
8725
diff
changeset
|
286 limit = maxstanzas; |
8722
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
287 start = since; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
288 reverse = true; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
289 with = "message<groupchat"; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
290 } |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
291 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
|
292 |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
293 if not data then |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
294 module:log("error", "Could not fetch history: %s", tostring(err)); |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
295 return |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
296 end |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
297 |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
298 local history, i = {}, 1; |
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 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
|
301 item.attr.to = to; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
302 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
|
303 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
|
304 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
|
305 item:maptags(function (tag) |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
306 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
|
307 return nil; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
308 end |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
309 return tag; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
310 end); |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
311 end |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
312 if maxchars then |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
313 local chars = #tostring(item); |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
314 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
|
315 break |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
316 end |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
317 maxchars = maxchars - chars; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
318 end |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
319 history[i], i = item, i+1; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
320 -- module:log("debug", tostring(item)); |
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 function event.next_stanza() |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
323 i = i - 1; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
324 return history[i]; |
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 return true; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
327 end, 1); |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
328 |
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
|
329 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
|
330 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
|
331 |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
332 -- 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
|
333 stanza:maptags(function (tag) |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
334 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
|
335 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
|
336 return nil; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
337 end |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
338 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
|
339 return nil; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
340 end |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
341 return tag; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
342 end); |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
343 |
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 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
|
345 |
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 -- 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
|
347 local function save_to_history(self, stanza) |
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
|
348 local room_node, room_host = jid_split(self.jid); |
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
|
349 |
8722
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
350 local stored_stanza = stanza; |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
351 |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
352 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
|
353 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
|
354 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
|
355 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
|
356 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
|
357 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
|
358 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
|
359 :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
|
360 end |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
361 |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
362 -- Policy check |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
363 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
|
364 |
9843
17060708d0eb
mod_muc_mam: Add comment about the tricks done with the 'with' field
Kim Alvefur <zash@zash.se>
parents:
9842
diff
changeset
|
365 -- 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
|
366 local with = stanza.name |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
367 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
|
368 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
|
369 end |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
370 |
9842
6f39be2e0be5
mod_muc_mam: Move a comment to the line it describes
Kim Alvefur <zash@zash.se>
parents:
9841
diff
changeset
|
371 -- And stash it |
10000
189b00a782bf
mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents:
9882
diff
changeset
|
372 local time = time_now(); |
189b00a782bf
mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents:
9882
diff
changeset
|
373 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
|
374 |
189b00a782bf
mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents:
9882
diff
changeset
|
375 if not id and err == "quota-limit" then |
189b00a782bf
mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents:
9882
diff
changeset
|
376 if type(cleanup_after) == "number" then |
189b00a782bf
mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents:
9882
diff
changeset
|
377 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
|
378 local cleaned = archive:delete(room_node, { |
189b00a782bf
mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents:
9882
diff
changeset
|
379 ["end"] = (os.time() - cleanup_after); |
189b00a782bf
mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents:
9882
diff
changeset
|
380 }); |
189b00a782bf
mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents:
9882
diff
changeset
|
381 if cleaned then |
189b00a782bf
mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents:
9882
diff
changeset
|
382 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 end |
189b00a782bf
mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents:
9882
diff
changeset
|
384 end |
189b00a782bf
mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents:
9882
diff
changeset
|
385 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
|
386 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
|
387 local truncated = archive:delete(room_node, { |
189b00a782bf
mod_muc_mam: Handle archive quotas
Kim Alvefur <zash@zash.se>
parents:
9882
diff
changeset
|
388 truncate = archive_item_limit - 1; |
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 truncated 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 end |
8722
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
395 |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
396 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
|
397 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
|
398 stanza:add_direct_child(st.stanza("stanza-id", { xmlns = xmlns_st_id, by = self.jid, id = id })); |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
399 end |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
400 end |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
401 |
8724
cfcc78c50905
mod_muc_mam: Let muc/history.lib decide which messages to store
Kim Alvefur <zash@zash.se>
parents:
8723
diff
changeset
|
402 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
|
403 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
|
404 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
|
405 end); |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
406 |
9001
23070882f3d4
mod_muc_mam: Disable presence logging by default
Kim Alvefur <zash@zash.se>
parents:
8832
diff
changeset
|
407 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
|
408 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
|
409 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
|
410 end); |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
411 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
|
412 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
|
413 end); |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
414 end |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
415 |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
416 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
|
417 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
|
418 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
|
419 else |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
420 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
|
421 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
|
422 archive:delete(room_node); |
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 end |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
425 |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
426 -- And role/affiliation changes? |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
427 |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
428 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
|
429 |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
430 module:hook("muc-disco#info", function(event) |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
431 event.reply:tag("feature", {var=xmlns_mam}):up(); |
7ee93b3fa160
mod_muc_mam: Import mod_mam_muc from prosody-modules ba6466fa6823
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
432 end); |
9880
78885b1bbb91
mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents:
9843
diff
changeset
|
433 |
78885b1bbb91
mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents:
9843
diff
changeset
|
434 -- Cleanup |
78885b1bbb91
mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents:
9843
diff
changeset
|
435 |
78885b1bbb91
mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents:
9843
diff
changeset
|
436 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
|
437 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
|
438 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
|
439 |
78885b1bbb91
mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents:
9843
diff
changeset
|
440 local day = 86400; |
78885b1bbb91
mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents:
9843
diff
changeset
|
441 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
|
442 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
|
443 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
|
444 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
|
445 return false; |
78885b1bbb91
mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents:
9843
diff
changeset
|
446 end |
78885b1bbb91
mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents:
9843
diff
changeset
|
447 |
78885b1bbb91
mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents:
9843
diff
changeset
|
448 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
|
449 |
78885b1bbb91
mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents:
9843
diff
changeset
|
450 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
|
451 |
78885b1bbb91
mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents:
9843
diff
changeset
|
452 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
|
453 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
|
454 return false; |
78885b1bbb91
mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents:
9843
diff
changeset
|
455 end |
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 -- 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
|
458 -- 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
|
459 -- 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
|
460 |
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
|
461 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
|
462 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
|
463 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
|
464 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
|
465 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
|
466 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
|
467 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
|
468 end |
9880
78885b1bbb91
mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents:
9843
diff
changeset
|
469 end |
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 cleanup_runner = require "util.async".runner(function () |
78885b1bbb91
mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents:
9843
diff
changeset
|
472 local rooms = {}; |
78885b1bbb91
mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents:
9843
diff
changeset
|
473 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
|
474 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
|
475 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
|
476 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
|
477 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
|
478 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
|
479 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
|
480 rooms[room] = true; |
78885b1bbb91
mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents:
9843
diff
changeset
|
481 end |
78885b1bbb91
mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents:
9843
diff
changeset
|
482 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
|
483 -- 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
|
484 -- 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
|
485 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
|
486 end |
78885b1bbb91
mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents:
9843
diff
changeset
|
487 end |
78885b1bbb91
mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents:
9843
diff
changeset
|
488 end |
78885b1bbb91
mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents:
9843
diff
changeset
|
489 end |
78885b1bbb91
mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents:
9843
diff
changeset
|
490 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
|
491 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
|
492 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
|
493 if ok then |
78885b1bbb91
mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents:
9843
diff
changeset
|
494 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
|
495 sum = sum + (tonumber(ok) or 0); |
78885b1bbb91
mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents:
9843
diff
changeset
|
496 end |
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 module:log("info", "Deleted %d expired messages for %d rooms", sum, num_rooms); |
78885b1bbb91
mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents:
9843
diff
changeset
|
499 end); |
78885b1bbb91
mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents:
9843
diff
changeset
|
500 |
78885b1bbb91
mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents:
9843
diff
changeset
|
501 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
|
502 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
|
503 return cleanup_interval; |
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 else |
78885b1bbb91
mod_muc_mam: Copy cleanup mechanism from mod_mam (fixes #672)
Kim Alvefur <zash@zash.se>
parents:
9843
diff
changeset
|
506 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
|
507 end |