Files
blitzkit/src/commands/fullStats.tsx
T

114 lines
4.4 KiB
TypeScript
Raw Normal View History

2023-06-16 02:01:06 +00:00
import { SlashCommandBuilder } from 'discord.js';
2023-08-07 22:51:04 +00:00
import { TreeTypeString } from '../components/Tanks';
2023-07-11 19:54:57 +00:00
import { CYCLIC_API } from '../constants/cyclic';
import getWargamingResponse from '../core/blitz/getWargamingResponse';
import resolveTankId from '../core/blitz/resolveTankId';
import addStatTypeSubCommandGroups from '../core/discord/addStatTypeSubCommandGroups';
import autocompleteTanks from '../core/discord/autocompleteTanks';
import autocompleteUsername from '../core/discord/autocompleteUsername';
import interactionToURL from '../core/discord/interactionToURL';
import linkButton from '../core/discord/linkButton';
import primaryButton from '../core/discord/primaryButton';
import resolvePeriodFromButton from '../core/discord/resolvePeriodFromButton';
import resolvePeriodFromCommand from '../core/discord/resolvePeriodFromCommand';
import resolvePlayerFromButton from '../core/discord/resolvePlayerFromButton';
import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand';
2023-07-16 18:26:33 +00:00
import { secrets } from '../core/node/secrets';
2023-08-04 02:13:21 +00:00
import { CommandRegistryRaw } from '../events/interactionCreate';
import fullStats from '../renderers/fullStats';
2023-08-07 22:51:04 +00:00
import { MultiTankFilters, StatType } from '../renderers/stats';
2023-07-11 19:54:57 +00:00
import { AccountInfo } from '../types/accountInfo';
2023-04-21 23:45:13 +00:00
2023-08-04 02:13:21 +00:00
export const fullStatsCommand = new Promise<CommandRegistryRaw>(
async (resolve) => {
const command = await addStatTypeSubCommandGroups(
new SlashCommandBuilder()
2023-08-04 02:24:14 +00:00
.setName('full-stats')
2023-08-04 02:13:21 +00:00
.setDescription('Full in-game statistics'),
2023-06-25 02:32:56 +00:00
);
2023-08-04 02:13:21 +00:00
resolve({
inProduction: true,
inPublic: true,
command,
async handler(interaction) {
const commandGroup = interaction.options.getSubcommandGroup(
true,
) as StatType;
const player = await resolvePlayerFromCommand(interaction);
2023-08-07 22:51:04 +00:00
const resolvedPeriod = resolvePeriodFromCommand(
player.region,
interaction,
);
const period = interaction.options.getString('period');
2023-08-04 02:13:21 +00:00
const tankIdRaw = interaction.options.getString('tank')!;
const tankId =
commandGroup === 'tank' ? await resolveTankId(tankIdRaw) : null;
const start = interaction.options.getInteger('start');
const end = interaction.options.getInteger('end');
const path = interactionToURL(interaction, {
...player,
tankId,
start,
end,
2023-08-07 22:51:04 +00:00
period,
2023-08-04 02:13:21 +00:00
});
const { nickname } = (
await getWargamingResponse<AccountInfo>(
`https://api.wotblitz.${player.region}/wotb/account/info/?application_id=${secrets.WARGAMING_APPLICATION_ID}&account_id=${player.id}`,
)
)[player.id];
2023-08-23 00:14:41 +00:00
const tierOption = interaction.options.getString('tier');
2023-08-04 02:13:21 +00:00
return [
2023-08-07 22:51:04 +00:00
await fullStats(
commandGroup,
resolvedPeriod,
player,
commandGroup === 'tank'
? tankId
: commandGroup === 'multi-tank'
? ({
'tank-type':
interaction.options.getString('tank-type') ?? undefined,
nation: interaction.options.getString('nation') ?? undefined,
2023-08-23 00:14:41 +00:00
tier: tierOption ? parseInt(tierOption) : undefined,
2023-08-07 22:51:04 +00:00
'tree-type': (interaction.options.getString('tree-type') ??
undefined) as TreeTypeString | undefined,
} satisfies Partial<MultiTankFilters>)
: null,
),
2023-08-04 02:13:21 +00:00
primaryButton(path, 'Refresh'),
// linkButton(`${CYCLIC_API}/${path}`, 'Embed'),
linkButton(
`https://www.blitzstars.com/player/${player.region}/${nickname}`,
'BlitzStars',
),
];
},
autocomplete: (interaction) => {
autocompleteUsername(interaction);
autocompleteTanks(interaction);
},
async button(interaction) {
const url = new URL(`${CYCLIC_API}/${interaction.customId}`);
const path = url.pathname.split('/').filter(Boolean);
const commandGroup = path[1] as StatType;
const player = await resolvePlayerFromButton(interaction);
const period = resolvePeriodFromButton(player.region, interaction);
return await fullStats(
commandGroup,
period,
player,
parseInt(url.searchParams.get('tankId')!),
);
},
});
2023-06-25 02:32:56 +00:00
},
2023-08-04 02:13:21 +00:00
);