From 10b813ff58c3bf1695ef1ace422af83337bea1af Mon Sep 17 00:00:00 2001 From: Gavin McDonald Date: Mon, 21 Apr 2025 18:07:22 -0400 Subject: [PATCH] clean up old games --- lib/GameStore.ts | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/lib/GameStore.ts b/lib/GameStore.ts index cf104a2..3cbb9fc 100644 --- a/lib/GameStore.ts +++ b/lib/GameStore.ts @@ -5,6 +5,11 @@ import { GameState, GameUpdate, Settings } from '@/types'; const deck = new Deck(); +const SECOND = 1000; +const MINUTE = 60 * SECOND; +const HOUR = 60 * MINUTE; +const DAY = 24 * HOUR; + export default class GameStore { private startTime: number; private dms: Map; @@ -18,7 +23,8 @@ export default class GameStore { this.spectators = new Map(); this.players = new Map(); - setInterval(() => this.log(), 15 * 60 * 1000); + setInterval(() => this.log(), 15 * MINUTE); + setInterval(() => this.cleanUp(), HOUR); } createGameIDs() { @@ -145,8 +151,22 @@ export default class GameStore { console.log('-'.repeat(uptimeLog.length)); } - deleteGame(gameID: string): void { - this.dms.delete(gameID); - this.spectators.delete(gameID); + cleanUp() { + const now = Date.now(); + + const expired = [...this.dms.values()].filter(({ lastUpdated }) => lastUpdated < now - DAY); + const unused = [...this.dms.values()].filter( + ({ lastUpdated, players }) => players.size === 0 && lastUpdated < now - HOUR, + ); + + expired.forEach(this.deleteGame); + unused.forEach(this.deleteGame); + } + + deleteGame(game: GameState): void { + console.log(Date.now(), 'DELETE', game); + + this.dms.delete(game.dmID); + this.spectators.delete(game.spectatorID); } }