mod_mam_adhoc/mod_mam_adhoc.lua
changeset 714 5879368d9ff7
child 739 6c7b6a0dcacf
equal deleted inserted replaced
713:88ef66a65b13 714:5879368d9ff7
       
     1 module:depends"adhoc";
       
     2 local dataforms_new = require "util.dataforms".new;
       
     3 local dm_load = require "util.datamanager".load;
       
     4 local dm_store = require "util.datamanager".store;
       
     5 local jid_split = require "util.jid".split;
       
     6 local t_insert = table.insert;
       
     7 
       
     8 local mam_prefs_form = dataforms_new{
       
     9 	title = "Archive preferences";
       
    10 	--instructions = "";
       
    11 	{
       
    12 		name = "default",
       
    13 		label = "Default storage policy",
       
    14 		type = "list-single",
       
    15 		value = {
       
    16 			{ value = "always", label = "Always" },
       
    17 			{ value = "never", label = "Never", default = true},
       
    18 			{ value = "roster", label = "Roster" },
       
    19 		},
       
    20 	};
       
    21 	{
       
    22 		name = "always",
       
    23 		label = "Always store messages to/from",
       
    24 		type = "jid-multi"
       
    25 	};
       
    26 	{
       
    27 		name = "never",
       
    28 		label = "Never store messages to/from",
       
    29 		type = "jid-multi"
       
    30 	};
       
    31 };
       
    32 
       
    33 local host = module.host;
       
    34 
       
    35 local default_attrs = {
       
    36 	always = true, [true] = "always",
       
    37 	never = false, [false] = "never",
       
    38 	roster = "roster",
       
    39 }
       
    40 
       
    41 local global_default_policy = module:get_option("default_archive_policy", false);
       
    42 local archive_store = "archive2";
       
    43 local prefs_store = archive_store .. "_prefs";
       
    44 local function get_prefs(user)
       
    45 	return dm_load(user, host, prefs_store) or
       
    46 		{ [false] = global_default_policy };
       
    47 end
       
    48 local function set_prefs(user, prefs)
       
    49 	return dm_store(user, host, prefs_store, prefs);
       
    50 end
       
    51 
       
    52 local function mam_prefs_handler(self, data, state)
       
    53 	local username, hostname = jid_split(data.from);
       
    54 	if state then -- the second return value
       
    55 		if data.action == "cancel" then
       
    56 			return { status = "canceled" };
       
    57 		end
       
    58 
       
    59 		if not username or not hostname or hostname ~= module.host then
       
    60 			return { status = "error", error = { type = "cancel",
       
    61 				condition = "forbidden", message = "Invalid user or hostname." } };
       
    62 		end
       
    63 
       
    64 		local fields = mam_prefs_form:data(data.form);
       
    65 
       
    66 		local default, always, never = fields.default, fields.always, fields.never;
       
    67 		local prefs = {};
       
    68 		if default then
       
    69 			prefs[false] = default_attrs[default];
       
    70 		end
       
    71 		if always then
       
    72 			for i=1,#always do
       
    73 				prefs[always[i]] = true;
       
    74 			end
       
    75 		end
       
    76 		if never then
       
    77 			for i=1,#never do
       
    78 				prefs[never[i]] = false;
       
    79 			end
       
    80 		end
       
    81 
       
    82 		set_prefs(username, prefs);
       
    83 
       
    84 		return { status = "completed" }
       
    85 	else -- No state, send the form.
       
    86 		local prefs = get_prefs(username);
       
    87 		local values = {
       
    88 			default = {
       
    89 				{ value = "always", label = "Always" };
       
    90 				{ value = "never", label = "Never" };
       
    91 				{ value = "roster", label = "Roster" };
       
    92 			};
       
    93 			always = {};
       
    94 			never = {};
       
    95 		};
       
    96 
       
    97 		for jid, p in pairs(prefs) do
       
    98 			if jid then
       
    99 				t_insert(values[p and "always" or "never"], jid);
       
   100 
       
   101 			elseif p == true then -- Yes, this is ugly.  FIXME later.
       
   102 				values.default[1].default = true;
       
   103 			elseif p == false then
       
   104 				values.default[2].default = true;
       
   105 			elseif p == "roster" then
       
   106 				values.default[3].default = true;
       
   107 			end
       
   108 		end
       
   109 		return { status = "executing", actions  = { "complete" }, form = { layout = mam_prefs_form, values = values } }, true;
       
   110 	end
       
   111 end
       
   112 
       
   113 module:provides("adhoc", module:require"adhoc".new("Archive settings", "mamprefs", mam_prefs_handler));