Add maxTotalChatBackups config.yaml value

3849908fe1322436d6fa437eb0c48957d8772cf2

Cohee <18619528+Cohee1207@users.noreply.github.com>

3 files changed, +20 -3Showing whitespace changes
default/config.yaml+2 -0
@@ -98,6 +98,8 @@ skipContentCheck: false
9898disableChatBackup: false
9999# Number of backups to keep for each chat and settings file
100100numberOfBackups: 50
101+# Maximum number of chat backups to keep per user (starting from the most recent). Set to -1 to keep all backups.
102+maxTotalChatBackups: 500
101103# Interval in milliseconds to throttle chat backups per user
102104chatBackupThrottleInterval: 10000
103105# Allowed hosts for card downloads
src/endpoints/chats.js+7 -0
@@ -32,6 +32,13 @@ function backupChat(directory, name, chat) {
3232 writeFileAtomicSync(backupFile, chat, 'utf-8');
3333
3434 removeOldBackups(directory, `chat_${name}_`);
35+
36+ const maxTotalChatBackups = Number(getConfigValue('maxTotalChatBackups', 500));
37+ if (isNaN(maxTotalChatBackups) || maxTotalChatBackups < 0) {
38+ return;
39+ }
40+
41+ removeOldBackups(directory, 'chat_', maxTotalChatBackups);
3542 } catch (err) {
3643 console.log(`Could not backup chat for ${name}`, err);
3744 }
src/util.js+11 -3
@@ -376,16 +376,24 @@ export function generateTimestamp() {
376376 * Remove old backups with the given prefix from a specified directory.
377377 * @param {string} directory The root directory to remove backups from.
378378 * @param {string} prefix File prefix to filter backups by.
379+ * @param {number?} limit Maximum number of backups to keep. If null, the limit is determined by the `numberOfBackups` config value.
379380 */
380381export function removeOldBackups(directory, prefix, limit = null) {
381382 const MAX_BACKUPS = limit ?? Number(getConfigValue('numberOfBackups', 50));
382383
383384 let files = fs.readdirSync(directory).filter(f => f.startsWith(prefix));
384385 if (files.length > MAX_BACKUPS) {
385386 files = files.map(f => path.join(directory, f));
386387 files.sort((a, b) => fs.statSync(a).mtimeMs - fs.statSync(b).mtimeMs);
387388
388- fs.rmSync(files[0]);
389+ while (files.length > MAX_BACKUPS) {
390+ const oldest = files.shift();
391+ if (!oldest) {
392+ break;
393+ }
394+
395+ fs.rmSync(oldest);
396+ }
389397 }
390398}
391399