aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/mod_mam/mamprefs.lib.lua
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/mod_mam/mamprefs.lib.lua')
-rw-r--r--plugins/mod_mam/mamprefs.lib.lua76
1 files changed, 76 insertions, 0 deletions
diff --git a/plugins/mod_mam/mamprefs.lib.lua b/plugins/mod_mam/mamprefs.lib.lua
new file mode 100644
index 00000000..dd82b626
--- /dev/null
+++ b/plugins/mod_mam/mamprefs.lib.lua
@@ -0,0 +1,76 @@
+-- Prosody IM
+-- Copyright (C) 2008-2017 Matthew Wild
+-- Copyright (C) 2008-2017 Waqas Hussain
+-- Copyright (C) 2011-2017 Kim Alvefur
+--
+-- This project is MIT/X11 licensed. Please see the
+-- COPYING file in the source package for more information.
+--
+-- XEP-0313: Message Archive Management for Prosody
+--
+-- luacheck: ignore 122/prosody
+
+local global_default_policy = module:get_option_string("default_archive_policy", true);
+if global_default_policy ~= "roster" then
+ global_default_policy = module:get_option_boolean("default_archive_policy", global_default_policy);
+end
+local smart_enable = module:get_option_boolean("mam_smart_enable", false);
+
+do
+ -- luacheck: ignore 211/prefs_format
+ local prefs_format = {
+ [false] = "roster",
+ -- default ::= true | false | "roster"
+ -- true = always, false = never, nil = global default
+ ["romeo@montague.net"] = true, -- always
+ ["montague@montague.net"] = false, -- newer
+ };
+end
+
+local sessions = prosody.hosts[module.host].sessions;
+local archive_store = module:get_option_string("archive_store", "archive");
+local prefs = module:open_store(archive_store .. "_prefs");
+
+local function get_prefs(user, explicit)
+ local user_sessions = sessions[user];
+ local user_prefs = user_sessions and user_sessions.archive_prefs
+ if not user_prefs then
+ -- prefs not cached
+ user_prefs = prefs:get(user);
+ if not user_prefs then
+ -- prefs not set
+ if smart_enable and explicit then
+ -- a mam-capable client was involved in this action, set defaults
+ user_prefs = { [false] = global_default_policy };
+ prefs:set(user, user_prefs);
+ end
+ end
+ if user_sessions then
+ -- cache settings if they originate from user action
+ user_sessions.archive_prefs = user_prefs;
+ end
+ if not user_prefs then
+ if smart_enable then
+ -- not yet enabled, either explicitly or "smart"
+ user_prefs = { [false] = false };
+ else
+ -- no explicit settings, return defaults
+ user_prefs = { [false] = global_default_policy };
+ end
+ end
+ end
+ return user_prefs;
+end
+
+local function set_prefs(user, user_prefs)
+ local user_sessions = sessions[user];
+ if user_sessions then
+ user_sessions.archive_prefs = user_prefs;
+ end
+ return prefs:set(user, user_prefs);
+end
+
+return {
+ get = get_prefs,
+ set = set_prefs,
+}