view mod_migrate_lastlog2/mod_migrate_lastlog2.lua @ 6258:06fbbd45ba75

mod_cloud_notify: Readme: fix links and labels that were removed in the last commit diff --git a/mod_cloud_notify/README.md b/mod_cloud_notify/README.md --- a/mod_cloud_notify/README.md +++ b/mod_cloud_notify/README.md @@ -1,3 +1,9 @@ +---- +-labels: +-- 'Stage-Beta' +-summary: 'XEP-0357: Cloud push notifications' +---- + # Introduction This module enables support for sending "push notifications" to clients @@ -32,15 +38,15 @@ notification to your device. When your d it will display it or wake up the app so it can connect to XMPP and receive any pending messages. -This protocol is described for developers in \[XEP-0357: Push -Notifications\]. +This protocol is described for developers in [XEP-0357: Push +Notifications]. -For this module to work reliably, you must have \[mod_smacks\], -\[mod_mam\] and \[mod_carbons\] also enabled on your server. +For this module to work reliably, you must have [mod_smacks], +[mod_mam] and [mod_carbons] also enabled on your server. Some clients, notably Siskin and Snikket iOS need some additional extensions that are not currently defined in a standard XEP. To support -these clients, see \[mod_cloud_notify_extensions\]. +these clients, see [mod_cloud_notify_extensions]. # Configuration @@ -58,18 +64,18 @@ these clients, see \[mod_cloud_notify_ex # Internal design notes App servers are notified about offline messages, messages stored by -\[mod_mam\] or messages waiting in the smacks queue. The business rules +[mod_mam] or messages waiting in the smacks queue. The business rules outlined [here](//mail.jabber.org/pipermail/standards/2016-February/030925.html) are all honored[^2]. -To cooperate with \[mod_smacks\] this module consumes some events: +To cooperate with [mod_smacks] this module consumes some events: `smacks-ack-delayed`, `smacks-hibernation-start` and `smacks-hibernation-end`. These events allow this module to send out notifications for messages received while the session is hibernated by -\[mod_smacks\] or even when smacks acknowledgements for messages are +[mod_smacks] or even when smacks acknowledgements for messages are delayed by a certain amount of seconds configurable with the -\[mod_smacks\] setting `smacks_max_ack_delay`. +[mod_smacks] setting `smacks_max_ack_delay`. The `smacks_max_ack_delay` setting allows to send out notifications to clients which aren't already in smacks hibernation state (because the
author Menel <menel@snikket.de>
date Fri, 13 Jun 2025 10:44:37 +0200
parents a4d7fefa4a8b
children
line wrap: on
line source

-- This module is based on the shell command code from mod_account_activity

local autoremove = module:get_option_boolean("migrate_lastlog2_auto_remove", true);

local function do_migration()
	local store = module:open_store("account_activity", "keyval+");
	local lastlog2 = module:open_store("lastlog2", "keyval+");
	local n_updated, n_errors, n_skipped = 0, 0, 0;

	local async = require "prosody.util.async";

	local p = require "prosody.util.promise".new(function (resolve)
		local async_runner = async.runner(function ()
			local n = 0;
			for username in lastlog2:items() do
				local was_error = nil;
				n = n + 1;
				if n % 100 == 0 then
					module:log("debug", "Processed %d...", n);
					async.sleep(0);
				end
				local lastlog2_data = lastlog2:get(username);
				if lastlog2_data then
					local current_data, err = store:get(username);
					if not current_data then
						if not err then
							current_data = {};
						else
							n_errors = n_errors + 1;
						end
					end
					if current_data then
						local imported_timestamp = current_data.timestamp;
						local latest;
						for k, v in pairs(lastlog2_data) do
							if k ~= "registered" and (not latest or v.timestamp > latest) then
								latest = v.timestamp;
							end
						end
						if latest and (not imported_timestamp or imported_timestamp < latest) then
							local ok, err = store:set_key(username, "timestamp", latest);
							if ok then
								n_updated = n_updated + 1;
							else
								module:log("error", "Failed to import %q: %s", username, err);
								was_error = true;
								n_errors = n_errors + 1;
							end
						else
							n_skipped = n_skipped + 1;
						end
					end
					if autoremove and not was_error then
						lastlog2:set(username, nil);
					end
				end
			end
			return resolve(("%d accounts imported, %d errors, %d skipped"):format(n_updated, n_errors, n_skipped));
		end);
		async_runner:run(true);
	end);
	return p;
end

function module.ready()
	do_migration();
end