From 405f544774a23ede434342750d44e23ba411df56 Mon Sep 17 00:00:00 2001 From: tresabhi Date: Mon, 10 Jul 2023 01:23:49 +0000 Subject: [PATCH] fix: time zone compliant commands --- src/commands/eligible.ts | 4 ++-- src/commands/evolution.tsx | 4 ++-- src/commands/fullStats.tsx | 4 ++-- src/commands/stats.tsx | 6 +++--- src/core/blitzstars/getPeriodStart.ts | 10 ++++++--- src/core/blitzstars/getTimeDaysAgo.ts | 22 +++++++++++++------- src/core/discord/resolvePeriodFromButton.ts | 4 +++- src/core/discord/resolvePeriodFromCommand.ts | 8 ++++--- src/core/express/resolvePeriodFromRequest.ts | 8 +++++-- src/core/express/resolvePeriodFromURL.ts | 12 +++++++---- src/routes/stats.tsx | 2 +- 11 files changed, 54 insertions(+), 30 deletions(-) diff --git a/src/commands/eligible.ts b/src/commands/eligible.ts index fa1364c2b..db3c77e00 100644 --- a/src/commands/eligible.ts +++ b/src/commands/eligible.ts @@ -5,7 +5,7 @@ import sumStats from '../core/blitz/sumStats.js'; import { tankopedia } from '../core/blitz/tankopedia.js'; import getDiffedTankStats from '../core/blitzstars/getDiffedTankStats.js'; import getPeriodNow from '../core/blitzstars/getPeriodNow.js'; -import getPeriodStart from '../core/blitzstars/getPeriodStart.js'; +import getTimeDaysAgo from '../core/blitzstars/getTimeDaysAgo.js'; import { tankAverages } from '../core/blitzstars/tankAverages.js'; import addUsernameChoices from '../core/discord/addUsernameChoices.js'; import embedNegative from '../core/discord/embedNegative.js'; @@ -62,7 +62,7 @@ export const eligibleCommand: CommandRegistry = { const { diffed } = await getDiffedTankStats( server, id, - getPeriodStart('30'), + getTimeDaysAgo(server, 30), getPeriodNow(), ); const entries = Object.entries(diffed); diff --git a/src/commands/evolution.tsx b/src/commands/evolution.tsx index d2b7d59d1..555f1dd1f 100644 --- a/src/commands/evolution.tsx +++ b/src/commands/evolution.tsx @@ -34,7 +34,7 @@ export const evolutionCommand: CommandRegistry = { true, ) as StatType; const player = await resolvePlayerFromCommand(interaction); - const period = resolvePeriodFromCommand(interaction); + const period = resolvePeriodFromCommand(player.server, interaction); const tankIdRaw = interaction.options.getString('tank')!; const tankId = commandGroup === 'tank' ? await resolveTankId(tankIdRaw) : null; @@ -74,8 +74,8 @@ export const evolutionCommand: CommandRegistry = { const url = new URL(`${CYCLIC_API}/${interaction.customId}`); const path = url.pathname.split('/').filter(Boolean); const commandGroup = path[1] as StatType; - const period = resolvePeriodFromButton(interaction); const player = await resolvePlayerFromButton(interaction); + const period = resolvePeriodFromButton(player.server, interaction); return await evolution( commandGroup, diff --git a/src/commands/fullStats.tsx b/src/commands/fullStats.tsx index 4b158a124..4991a4bb6 100644 --- a/src/commands/fullStats.tsx +++ b/src/commands/fullStats.tsx @@ -33,7 +33,7 @@ export const fullStatsCommand: CommandRegistry = { true, ) as StatType; const player = await resolvePlayerFromCommand(interaction); - const period = resolvePeriodFromCommand(interaction); + const period = resolvePeriodFromCommand(player.server, interaction); const tankIdRaw = interaction.options.getString('tank')!; const tankId = commandGroup === 'tank' ? await resolveTankId(tankIdRaw) : null; @@ -71,8 +71,8 @@ export const fullStatsCommand: CommandRegistry = { const url = new URL(`${CYCLIC_API}/${interaction.customId}`); const path = url.pathname.split('/').filter(Boolean); const commandGroup = path[1] as StatType; - const period = resolvePeriodFromButton(interaction); const player = await resolvePlayerFromButton(interaction); + const period = resolvePeriodFromButton(player.server, interaction); return await fullStats( commandGroup, diff --git a/src/commands/stats.tsx b/src/commands/stats.tsx index 0ae09fd0e..24b1583bb 100644 --- a/src/commands/stats.tsx +++ b/src/commands/stats.tsx @@ -20,7 +20,7 @@ import { AccountInfo } from '../types/accountInfo.js'; export const statsCommand: CommandRegistry = { inProduction: true, - inDevelopment: false, + inDevelopment: true, inPublic: true, command: addStatTypeSubCommandGroups( @@ -34,7 +34,7 @@ export const statsCommand: CommandRegistry = { true, ) as StatType; const player = await resolvePlayerFromCommand(interaction); - const period = resolvePeriodFromCommand(interaction); + const period = resolvePeriodFromCommand(player.server, interaction); const tankIdRaw = interaction.options.getString('tank')!; const tankId = commandGroup === 'tank' ? await resolveTankId(tankIdRaw) : null; @@ -72,8 +72,8 @@ export const statsCommand: CommandRegistry = { const url = new URL(`${CYCLIC_API}/${interaction.customId}`); const path = url.pathname.split('/').filter(Boolean); const commandGroup = path[1] as StatType; - const period = resolvePeriodFromButton(interaction); const player = await resolvePlayerFromButton(interaction); + const period = resolvePeriodFromButton(player.server, interaction); return await stats( commandGroup, diff --git a/src/core/blitzstars/getPeriodStart.ts b/src/core/blitzstars/getPeriodStart.ts index ec955af34..d1d820428 100644 --- a/src/core/blitzstars/getPeriodStart.ts +++ b/src/core/blitzstars/getPeriodStart.ts @@ -1,12 +1,16 @@ +import { BlitzServer } from '../../constants/servers.js'; import { Period } from '../discord/addPeriodSubCommands.js'; import getTimeDaysAgo from './getTimeDaysAgo.js'; -export default function getPeriodStart(period: Exclude) { +export default function getPeriodStart( + server: BlitzServer, + period: Exclude, +) { if (period === 'career') { return -Infinity; } else if (period === 'today') { - return getTimeDaysAgo(0); + return getTimeDaysAgo(server, 1); } else { - return getTimeDaysAgo(parseInt(period)); + return getTimeDaysAgo(server, parseInt(period)); } } diff --git a/src/core/blitzstars/getTimeDaysAgo.ts b/src/core/blitzstars/getTimeDaysAgo.ts index 86a3512ea..357bca538 100644 --- a/src/core/blitzstars/getTimeDaysAgo.ts +++ b/src/core/blitzstars/getTimeDaysAgo.ts @@ -1,12 +1,20 @@ -export default function getTimeDaysAgo(daysAgo: number) { +import { BlitzServer } from '../../constants/servers.js'; + +export const TIME_ZONE_MAPPINGS: Record = { + com: -5, // Central North American Time + eu: +1, // Central European Time + asia: +7, // Central Asia Standard Time +}; + +export default function getTimeDaysAgo(server: BlitzServer, daysAgo: number) { const now = new Date(); - now.setHours(5, 0, 0, 0); + if (daysAgo === 0) now.getTime() / 1000; - // if it's after 5:00 AM today, subtract one day - if (now.getTime() > Date.now()) now.setDate(now.getDate() - 1); + const time = new Date(); - // subtract the period number of days from now - now.setDate(now.getDate() - daysAgo); + time.setUTCHours(-TIME_ZONE_MAPPINGS[server], 0, 0, 0); + if (time > now) time.setUTCDate(time.getUTCDate() - 1); + time.setUTCDate(time.getUTCDate() - daysAgo + 1); - return now.getTime() / 1000; + return time.getTime() / 1000; } diff --git a/src/core/discord/resolvePeriodFromButton.ts b/src/core/discord/resolvePeriodFromButton.ts index cda3c11ca..823780c75 100644 --- a/src/core/discord/resolvePeriodFromButton.ts +++ b/src/core/discord/resolvePeriodFromButton.ts @@ -1,9 +1,11 @@ import { ButtonInteraction, CacheType } from 'discord.js'; import { CYCLIC_API } from '../../constants/cyclic.js'; +import { BlitzServer } from '../../constants/servers.js'; import resolvePeriodFromURL from '../express/resolvePeriodFromURL.js'; export default function resolvePeriodFromButton( + server: BlitzServer, interaction: ButtonInteraction, ) { - return resolvePeriodFromURL(`${CYCLIC_API}/${interaction.customId}`); + return resolvePeriodFromURL(server, `${CYCLIC_API}/${interaction.customId}`); } diff --git a/src/core/discord/resolvePeriodFromCommand.ts b/src/core/discord/resolvePeriodFromCommand.ts index 6c5a6bfe5..c3d8816d6 100644 --- a/src/core/discord/resolvePeriodFromCommand.ts +++ b/src/core/discord/resolvePeriodFromCommand.ts @@ -1,4 +1,5 @@ import { CacheType, ChatInputCommandInteraction } from 'discord.js'; +import { BlitzServer } from '../../constants/servers.js'; import getPeriodNow from '../blitzstars/getPeriodNow.js'; import getPeriodStart from '../blitzstars/getPeriodStart.js'; import getTimeDaysAgo from '../blitzstars/getTimeDaysAgo.js'; @@ -30,6 +31,7 @@ export interface ResolvedPeriod { } export default function resolvePeriodFromCommand( + server: BlitzServer, interaction: ChatInputCommandInteraction, ) { let statsName: string; @@ -46,12 +48,12 @@ export default function resolvePeriodFromCommand( statsName = `${startMin} to ${endMax} days' statistics`; evolutionName = `${startMin} to ${endMax} days' evolution`; - start = getTimeDaysAgo(startMin); - end = getTimeDaysAgo(endMax); + start = getTimeDaysAgo(server, startMin); + end = getTimeDaysAgo(server, endMax); } else { statsName = PERIOD_NAMES[period]; evolutionName = EVOLUTION_PERIOD_NAMES[period]; - start = getPeriodStart(period); + start = getPeriodStart(server, period); end = getPeriodNow(); } diff --git a/src/core/express/resolvePeriodFromRequest.ts b/src/core/express/resolvePeriodFromRequest.ts index 8695d79a0..2350d09e0 100644 --- a/src/core/express/resolvePeriodFromRequest.ts +++ b/src/core/express/resolvePeriodFromRequest.ts @@ -1,7 +1,11 @@ import { Request } from 'express'; import { CYCLIC_API } from '../../constants/cyclic.js'; +import { BlitzServer } from '../../constants/servers.js'; import resolvePeriodFromURL from './resolvePeriodFromURL.js'; -export default function resolvePeriodFromRequest(request: Request) { - return resolvePeriodFromURL(`${CYCLIC_API}${request.path}`); +export default function resolvePeriodFromRequest( + server: BlitzServer, + request: Request, +) { + return resolvePeriodFromURL(server, `${CYCLIC_API}${request.path}`); } diff --git a/src/core/express/resolvePeriodFromURL.ts b/src/core/express/resolvePeriodFromURL.ts index 2799f2f39..e490a15aa 100644 --- a/src/core/express/resolvePeriodFromURL.ts +++ b/src/core/express/resolvePeriodFromURL.ts @@ -1,3 +1,4 @@ +import { BlitzServer } from '../../constants/servers.js'; import getPeriodNow from '../blitzstars/getPeriodNow.js'; import getPeriodStart from '../blitzstars/getPeriodStart.js'; import getTimeDaysAgo from '../blitzstars/getTimeDaysAgo.js'; @@ -8,7 +9,10 @@ import { ResolvedPeriod, } from '../discord/resolvePeriodFromCommand.js'; -export default function resolvePeriodFromURL(urlString: string) { +export default function resolvePeriodFromURL( + server: BlitzServer, + urlString: string, +) { let statsName: string; let evolutionName: string; let start: number; @@ -25,12 +29,12 @@ export default function resolvePeriodFromURL(urlString: string) { statsName = `${startMin} to ${endMax} days' statistics`; evolutionName = `${startMin} to ${endMax} days' evolution`; - start = getTimeDaysAgo(startMin); - end = getTimeDaysAgo(endMax); + start = getTimeDaysAgo(server, startMin); + end = getTimeDaysAgo(server, endMax); } else { statsName = PERIOD_NAMES[period]; evolutionName = EVOLUTION_PERIOD_NAMES[period]; - start = getPeriodStart(period); + start = getPeriodStart(server, period); end = getPeriodNow(); } diff --git a/src/routes/stats.tsx b/src/routes/stats.tsx index 71cd12053..f67840232 100644 --- a/src/routes/stats.tsx +++ b/src/routes/stats.tsx @@ -10,8 +10,8 @@ export const statsRoute: RouteRegistry = { async handler(req) { const type = req.params.type as StatType; - const period = resolvePeriodFromRequest(req); const player = resolvePlayerFromRequest(req); + const period = resolvePeriodFromRequest(player.server, req); return await stats( type,