Add maxTotalChatBackups config.yaml value
| @@ -98,6 +98,8 @@ skipContentCheck: false | ||
| 98 | 98 | disableChatBackup: false |
| 99 | 99 | # Number of backups to keep for each chat and settings file |
| 100 | 100 | numberOfBackups: 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 | |
| 101 | 103 | # Interval in milliseconds to throttle chat backups per user |
| 102 | 104 | chatBackupThrottleInterval: 10000 |
| 103 | 105 | # Allowed hosts for card downloads |
| @@ -32,6 +32,13 @@ function backupChat(directory, name, chat) { | ||
| 32 | 32 | writeFileAtomicSync(backupFile, chat, 'utf-8'); |
| 33 | 33 | |
| 34 | 34 | 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); | |
| 35 | 42 | } catch (err) { |
| 36 | 43 | console.log(`Could not backup chat for ${name}`, err); |
| 37 | 44 | } |
| @@ -376,16 +376,24 @@ export function generateTimestamp() { | ||
| 376 | 376 | * Remove old backups with the given prefix from a specified directory. |
| 377 | 377 | * @param {string} directory The root directory to remove backups from. |
| 378 | 378 | * @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. | |
| 379 | 380 | */ |
| 380 | 381 | export function removeOldBackups(directory, prefix, limit = null) { |
| 381 | 382 | const MAX_BACKUPS = limit ?? Number(getConfigValue('numberOfBackups', 50)); |
| 382 | 383 | |
| 383 | 384 | let files = fs.readdirSync(directory).filter(f => f.startsWith(prefix)); |
| 384 | 385 | if (files.length > MAX_BACKUPS) { |
| 385 | 386 | files = files.map(f => path.join(directory, f)); |
| 386 | 387 | files.sort((a, b) => fs.statSync(a).mtimeMs - fs.statSync(b).mtimeMs); |
| 387 | 388 | |
| 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 | + } | |
| 389 | 397 | } |
| 390 | 398 | } |
| 391 | 399 | |