Files
blitzkit/src/commands/ownedTanks.tsx
T

132 lines
4.9 KiB
TypeScript
Raw Normal View History

2023-05-28 16:56:15 +00:00
import { SlashCommandBuilder } from 'discord.js';
2024-03-06 09:52:09 -06:00
import CommandWrapper from '../components/CommandWrapper';
2023-10-14 11:06:03 -05:00
import NoData, { NoDataType } from '../components/NoData';
import * as Tanks from '../components/Tanks';
import TitleBar from '../components/TitleBar';
2023-12-05 17:36:18 -06:00
import { encyclopediaInfo } from '../core/blitz/encyclopediaInfo';
2023-10-14 11:06:03 -05:00
import { getAccountInfo } from '../core/blitz/getAccountInfo';
import { getClanAccountInfo } from '../core/blitz/getClanAccountInfo';
import getTankStats from '../core/blitz/getTankStats';
2023-12-14 22:19:01 -06:00
import { emblemIdToURL } from '../core/blitzkrieg/emblemIdToURL';
2023-12-05 17:36:18 -06:00
import {
TIER_ROMAN_NUMERALS,
2023-12-14 22:19:01 -06:00
TankDefinition,
2023-12-05 17:36:18 -06:00
Tier,
tankDefinitions,
2023-12-14 22:19:01 -06:00
} from '../core/blitzkrieg/tankDefinitions';
2023-11-29 12:17:21 -06:00
import { tankIcon } from '../core/blitzkrieg/tankIcon';
2023-10-14 11:32:02 -05:00
import addTierChoices from '../core/discord/addTierChoices';
import addUsernameChoices from '../core/discord/addUsernameChoices';
import autocompleteUsername from '../core/discord/autocompleteUsername';
2023-10-14 11:36:10 -05:00
import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand';
2023-07-11 19:54:57 +00:00
import { CommandRegistry } from '../events/interactionCreate';
2023-04-25 01:39:43 +00:00
2024-03-06 15:34:10 -06:00
export const ownedTanksCommand = new Promise<CommandRegistry>((resolve) => {
resolve({
inProduction: true,
inPublic: true,
2023-04-25 01:39:43 +00:00
2024-03-06 15:34:10 -06:00
command: new SlashCommandBuilder()
.setName('owned-tanks')
.setDescription("Shows a player's owned tanks")
.addStringOption(addTierChoices)
.addStringOption(addUsernameChoices),
2023-04-25 01:39:43 +00:00
2024-03-06 15:34:10 -06:00
async handler(interaction) {
const tier = Number(interaction.options.getString('tier'));
const account = await resolvePlayerFromCommand(interaction);
const { id, region: server } = account;
const accountInfo = await getAccountInfo(server, id);
const tankStats = await getTankStats(server, id);
const filteredTanks = (
await Promise.all(
tankStats.map(async (tankData) => ({
tankDefinitions: (await tankDefinitions)[tankData.tank_id]!,
id: tankData.tank_id,
})),
)
).filter((tank) => tank.tankDefinitions?.tier === tier);
const clanAccountInfo = await getClanAccountInfo(server, id, ['clan']);
const groupedTanks: Record<string, TankDefinition[]> = {};
const nations: string[] = [];
2023-08-09 00:19:50 +00:00
2024-03-06 15:34:10 -06:00
filteredTanks.forEach((tank) => {
if (groupedTanks[tank.tankDefinitions.nation] === undefined) {
groupedTanks[tank.tankDefinitions.nation] = [tank.tankDefinitions];
nations.push(tank.tankDefinitions.nation);
} else {
groupedTanks[tank.tankDefinitions.nation].push(tank.tankDefinitions);
}
});
2023-08-09 00:19:50 +00:00
2024-03-06 15:34:10 -06:00
nations.sort();
2023-04-26 00:02:10 +00:00
2024-03-06 15:34:10 -06:00
return (
<CommandWrapper>
<TitleBar
title={accountInfo.nickname}
image={
clanAccountInfo?.clan
? emblemIdToURL(clanAccountInfo.clan.emblem_set_id)
: undefined
}
description={`Tier ${TIER_ROMAN_NUMERALS[tier as Tier]} tanks`}
/>
2023-06-05 18:47:00 +00:00
2024-03-06 15:34:10 -06:00
{filteredTanks.length === 0 && (
<NoData type={NoDataType.TanksFound} />
)}
2023-06-06 16:53:13 +00:00
2024-03-06 15:34:10 -06:00
{filteredTanks.length > 0 &&
(await Promise.all(
nations.map(async (nation) => {
const tanks = groupedTanks[nation];
const leftColumnSize = Math.ceil(tanks.length / 2);
const leftColumn = tanks.slice(0, leftColumnSize);
const rightColumn = tanks.slice(leftColumnSize);
2023-08-09 00:19:50 +00:00
2024-03-06 15:34:10 -06:00
return (
<Tanks.Root>
<Tanks.Title>
{(await encyclopediaInfo).vehicle_nations[nation]}
</Tanks.Title>
2023-08-09 00:19:50 +00:00
2024-03-06 15:34:10 -06:00
<Tanks.Row>
<Tanks.Column>
{await Promise.all(
leftColumn.map(async (tank) => (
<Tanks.Item
key={tank.id}
name={tank.name}
tankType={tank.type}
image={tankIcon(tank.id)}
treeType={tank.treeType}
/>
)),
)}
</Tanks.Column>
<Tanks.Column>
{await Promise.all(
rightColumn.map(async (tank) => (
<Tanks.Item
key={tank.id}
name={tank.name}
tankType={tank.type}
image={tankIcon(tank.id)}
treeType={tank.treeType}
/>
)),
)}
</Tanks.Column>
</Tanks.Row>
</Tanks.Root>
);
}),
))}
</CommandWrapper>
);
},
2023-05-14 17:13:42 +00:00
2024-03-06 15:34:10 -06:00
autocomplete: autocompleteUsername,
});
});