From c221c06511a44eea377c2fee887a62c01a564a1b Mon Sep 17 00:00:00 2001 From: tresabhi Date: Tue, 27 Jun 2023 02:02:00 +0000 Subject: [PATCH] feat: split resolvePeriod --- src/commands/evolution.tsx | 1 + src/commands/stats.tsx | 3 +- src/core/discord/resolvePeriodFromButton.ts | 9 ++++ src/core/discord/resolvePeriodFromCommand.ts | 38 +++------------- src/core/express/resolvePeriodFromRequest.ts | 7 +++ src/core/express/resolvePeriodFromURL.ts | 43 +++++++++++++++++++ .../handlers/chatInputCommand.ts | 2 +- src/responders/stats.tsx | 9 ++-- 8 files changed, 73 insertions(+), 39 deletions(-) create mode 100644 src/core/discord/resolvePeriodFromButton.ts create mode 100644 src/core/express/resolvePeriodFromRequest.ts create mode 100644 src/core/express/resolvePeriodFromURL.ts diff --git a/src/commands/evolution.tsx b/src/commands/evolution.tsx index e62cc92de..f1ee55b12 100644 --- a/src/commands/evolution.tsx +++ b/src/commands/evolution.tsx @@ -31,6 +31,7 @@ export default { return await evolution(commandGroup, period, player, tankId); + // TODO: implement this // new ButtonBuilder() // .setStyle(ButtonStyle.Link) // .setLabel('View on BlitzStars') diff --git a/src/commands/stats.tsx b/src/commands/stats.tsx index c35a0d7c7..4458b99da 100644 --- a/src/commands/stats.tsx +++ b/src/commands/stats.tsx @@ -6,6 +6,7 @@ import addStatsSubCommandGroups from '../core/discord/addStatsSubCommandGroups.j import interactionToURL from '../core/discord/interactionToURL.js'; import linkButton from '../core/discord/linkButton.js'; import primaryButton from '../core/discord/primaryButton.js'; +import resolvePeriodFromButton from '../core/discord/resolvePeriodFromButton.js'; import resolvePeriodFromCommand from '../core/discord/resolvePeriodFromCommand.js'; import resolvePlayer from '../core/discord/resolvePlayer.js'; import tanksAutocomplete from '../core/discord/tanksAutocomplete.js'; @@ -57,7 +58,7 @@ export default { const url = new URL(`${CYCLIC_API}/${interaction.customId}`); const path = url.pathname.split('/').filter(Boolean); const commandGroup = path[1] as StatType; - const period = resolvePeriodFromCommand(interaction); + const period = resolvePeriodFromButton(interaction); const player = await resolvePlayer(interaction); return await stats( diff --git a/src/core/discord/resolvePeriodFromButton.ts b/src/core/discord/resolvePeriodFromButton.ts new file mode 100644 index 000000000..cda3c11ca --- /dev/null +++ b/src/core/discord/resolvePeriodFromButton.ts @@ -0,0 +1,9 @@ +import { ButtonInteraction, CacheType } from 'discord.js'; +import { CYCLIC_API } from '../../constants/cyclic.js'; +import resolvePeriodFromURL from '../express/resolvePeriodFromURL.js'; + +export default function resolvePeriodFromButton( + interaction: ButtonInteraction, +) { + return resolvePeriodFromURL(`${CYCLIC_API}/${interaction.customId}`); +} diff --git a/src/core/discord/resolvePeriodFromCommand.ts b/src/core/discord/resolvePeriodFromCommand.ts index fe71e4861..6c5a6bfe5 100644 --- a/src/core/discord/resolvePeriodFromCommand.ts +++ b/src/core/discord/resolvePeriodFromCommand.ts @@ -1,10 +1,4 @@ -import { - ButtonInteraction, - CacheType, - ChatInputCommandInteraction, -} from 'discord.js'; -import { Request } from 'express'; -import { CYCLIC_API } from '../../constants/cyclic.js'; +import { CacheType, ChatInputCommandInteraction } from 'discord.js'; import getPeriodNow from '../blitzstars/getPeriodNow.js'; import getPeriodStart from '../blitzstars/getPeriodStart.js'; import getTimeDaysAgo from '../blitzstars/getTimeDaysAgo.js'; @@ -36,39 +30,17 @@ export interface ResolvedPeriod { } export default function resolvePeriodFromCommand( - input: - | ChatInputCommandInteraction - | ButtonInteraction - | Request, + interaction: ChatInputCommandInteraction, ) { let statsName: string; let evolutionName: string; let start: number; let end: number; - let url: URL; - let period: Period; - - if (input instanceof ChatInputCommandInteraction) { - period = input.options.getSubcommand() as Period; - } else { - url = new URL( - `${CYCLIC_API}${ - input instanceof ButtonInteraction ? `/${input.customId}` : input.path - }`, - ); - const path = url.pathname.split('/').filter(Boolean); - period = path[path.length - 1] as Period; - } + const period = interaction.options.getSubcommand() as Period; if (period === 'custom') { - const startRaw = - input instanceof ChatInputCommandInteraction - ? input.options.getInteger('start')! - : parseInt(url!.searchParams.get('start')!); - const endRaw = - input instanceof ChatInputCommandInteraction - ? input.options.getInteger('end')! - : parseInt(url!.searchParams.get('end')!); + const startRaw = interaction.options.getInteger('start')!; + const endRaw = interaction.options.getInteger('end')!; const startMin = Math.min(startRaw, endRaw); const endMax = Math.max(startRaw, endRaw); diff --git a/src/core/express/resolvePeriodFromRequest.ts b/src/core/express/resolvePeriodFromRequest.ts new file mode 100644 index 000000000..8695d79a0 --- /dev/null +++ b/src/core/express/resolvePeriodFromRequest.ts @@ -0,0 +1,7 @@ +import { Request } from 'express'; +import { CYCLIC_API } from '../../constants/cyclic.js'; +import resolvePeriodFromURL from './resolvePeriodFromURL.js'; + +export default function resolvePeriodFromRequest(request: Request) { + return resolvePeriodFromURL(`${CYCLIC_API}${request.path}`); +} diff --git a/src/core/express/resolvePeriodFromURL.ts b/src/core/express/resolvePeriodFromURL.ts new file mode 100644 index 000000000..2799f2f39 --- /dev/null +++ b/src/core/express/resolvePeriodFromURL.ts @@ -0,0 +1,43 @@ +import getPeriodNow from '../blitzstars/getPeriodNow.js'; +import getPeriodStart from '../blitzstars/getPeriodStart.js'; +import getTimeDaysAgo from '../blitzstars/getTimeDaysAgo.js'; +import { Period } from '../discord/addPeriodSubCommands.js'; +import { + EVOLUTION_PERIOD_NAMES, + PERIOD_NAMES, + ResolvedPeriod, +} from '../discord/resolvePeriodFromCommand.js'; + +export default function resolvePeriodFromURL(urlString: string) { + let statsName: string; + let evolutionName: string; + let start: number; + let end: number; + const url = new URL(urlString); + const path = url.pathname.split('/').filter(Boolean); + const period = path[path.length - 1] as Period; + + if (period === 'custom') { + const startRaw = parseInt(url!.searchParams.get('start')!); + const endRaw = parseInt(url!.searchParams.get('end')!); + const startMin = Math.min(startRaw, endRaw); + const endMax = Math.max(startRaw, endRaw); + + statsName = `${startMin} to ${endMax} days' statistics`; + evolutionName = `${startMin} to ${endMax} days' evolution`; + start = getTimeDaysAgo(startMin); + end = getTimeDaysAgo(endMax); + } else { + statsName = PERIOD_NAMES[period]; + evolutionName = EVOLUTION_PERIOD_NAMES[period]; + start = getPeriodStart(period); + end = getPeriodNow(); + } + + return { + statsName, + evolutionName, + start, + end, + } satisfies ResolvedPeriod; +} diff --git a/src/events/interactionCreate/handlers/chatInputCommand.ts b/src/events/interactionCreate/handlers/chatInputCommand.ts index 818cf1895..0944dbdb5 100644 --- a/src/events/interactionCreate/handlers/chatInputCommand.ts +++ b/src/events/interactionCreate/handlers/chatInputCommand.ts @@ -25,7 +25,7 @@ export default async function handleChatInputCommand( if (registry.handlesInteraction) return; - const reply = await normalizeInteractionReturnable(returnable); + const reply = await normalizeInteractionReturnable(returnable!); if (psa.data) { if (!reply.embeds) reply.embeds = []; diff --git a/src/responders/stats.tsx b/src/responders/stats.tsx index c3b92d327..bab1e5c5f 100644 --- a/src/responders/stats.tsx +++ b/src/responders/stats.tsx @@ -1,5 +1,5 @@ import { BlitzServer } from '../constants/servers.js'; -import resolvePeriodFromCommand from '../core/discord/resolvePeriodFromCommand.js'; +import resolvePeriodFromRequest from '../core/express/resolvePeriodFromRequest.js'; import stats, { StatType } from '../renderers/stats.js'; import { ResponderRegistry } from '../server.js'; @@ -9,11 +9,12 @@ export default { inDevelopment: true, async handler(req) { - console.log('yeah'); + const type = req.params.type as StatType; + const period = resolvePeriodFromRequest(req); return await stats( - req.params.type as StatType, - resolvePeriodFromCommand(req), + type, + period, { server: req.query.server as BlitzServer, id: parseInt(req.query.id as string),