From a34ea396f605de54eb433cc5b41df2a0477d85f0 Mon Sep 17 00:00:00 2001 From: Matt Isenhower Date: Tue, 15 Nov 2022 13:44:39 -0500 Subject: [PATCH] Only update festival ranking data when needed --- app/data/index.mjs | 2 +- app/data/updaters/DataUpdater.mjs | 13 ++++++++ app/data/updaters/FestivalRankingUpdater.mjs | 31 +++++++++++++++++++- app/data/updaters/FestivalUpdater.mjs | 4 +-- 4 files changed, 46 insertions(+), 4 deletions(-) diff --git a/app/data/index.mjs b/app/data/index.mjs index 38f8405..017837a 100644 --- a/app/data/index.mjs +++ b/app/data/index.mjs @@ -28,7 +28,7 @@ export async function updateAll() { for (let updater of updaters()) { try { - await updater.update(); + await updater.updateIfNeeded(); } catch (e) { console.error(e); } diff --git a/app/data/updaters/DataUpdater.mjs b/app/data/updaters/DataUpdater.mjs index 5f16e64..61d23dd 100644 --- a/app/data/updaters/DataUpdater.mjs +++ b/app/data/updaters/DataUpdater.mjs @@ -54,6 +54,19 @@ export default class DataUpdater return new SplatNet3Client(this.nsoClient, locale.code); } + async shouldUpdate() { + return true; + } + + async updateIfNeeded() { + if (!(await this.shouldUpdate())) { + this.console.info('No need to update data'); + return; + } + + return await this.update(); + } + async update() { this.console.info('Updating data...'); diff --git a/app/data/updaters/FestivalRankingUpdater.mjs b/app/data/updaters/FestivalRankingUpdater.mjs index 39100d6..9a607cf 100644 --- a/app/data/updaters/FestivalRankingUpdater.mjs +++ b/app/data/updaters/FestivalRankingUpdater.mjs @@ -1,3 +1,5 @@ +import fs from 'fs/promises'; +import prefixedConsole from "../../common/prefixedConsole.mjs"; import DataUpdater from "./DataUpdater.mjs"; export default class FestivalRankingUpdater extends DataUpdater @@ -5,10 +7,11 @@ export default class FestivalRankingUpdater extends DataUpdater name = 'FestivalRankingUpdater'; filename = 'festivals.ranking'; - constructor(region = null, festID = null) { + constructor(region = null, festID = null, endTime = null) { super(region); this.festID = festID; + this.endTime = endTime; this.filename += `.${region}.${festID}`; } @@ -21,6 +24,32 @@ export default class FestivalRankingUpdater extends DataUpdater '$..image3dThumbnail.url', ]; + get console() { + this._console ??= prefixedConsole('Updater', this.region, this.name, this.festID); + + return this._console; + } + + async shouldUpdate() { + // Does the file exist? + try { + await fs.readFile(this.getPath(this.filename)); + } catch (e) { + // File doesn't exist or other error, so we need to download the data + return true; + } + + // How long until this festival ends/ended? + // We want to update this data until 4 hours after the Splatfest ends + let diff = Date.now() - new Date(this.endTime); + if (diff < 4 * 60 * 60 * 100) { + return true; + } + + // Otherwise, no need to update + return false; + } + getData(locale) { return this.splatnet(locale).getFestRankingData(this.festID); } diff --git a/app/data/updaters/FestivalUpdater.mjs b/app/data/updaters/FestivalUpdater.mjs index 6d25f70..033a969 100644 --- a/app/data/updaters/FestivalUpdater.mjs +++ b/app/data/updaters/FestivalUpdater.mjs @@ -40,8 +40,8 @@ export default class FestivalUpdater extends DataUpdater Object.assign(node, detailResult.data.fest); - let rankingUpdater = new FestivalRankingUpdater(this.region, node.id); - await rankingUpdater.update(); + let rankingUpdater = new FestivalRankingUpdater(this.region, node.id, node.endTime); + await rankingUpdater.updateIfNeeded(); } return result;