Files
blitzkit/src/commands/ownedTanks.tsx
T

151 lines
5.1 KiB
TypeScript
Raw Normal View History

2023-05-28 16:56:15 +00:00
import { SlashCommandBuilder } from 'discord.js';
2023-07-11 19:54:57 +00:00
import NoData, { NoDataType } from '../components/NoData';
import PoweredBy, { PoweredByType } from '../components/PoweredBy';
import * as Tanks from '../components/Tanks';
import TitleBar from '../components/TitleBar';
import Wrapper from '../components/Wrapper';
import { REGION_NAMES } from '../constants/regions';
2023-07-11 19:54:57 +00:00
import getTankStats from '../core/blitz/getTankStats';
import getTreeType from '../core/blitz/getTreeType';
import getWargamingResponse from '../core/blitz/getWargamingResponse';
import resolveTankName from '../core/blitz/resolveTankName';
2023-06-21 01:52:26 +00:00
import {
TIER_ROMAN_NUMERALS,
Tier,
tankopedia,
2023-07-11 19:54:57 +00:00
} from '../core/blitz/tankopedia';
import addUsernameChoices from '../core/discord/addUsernameChoices';
import autocompleteUsername from '../core/discord/autocompleteUsername';
import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand';
import { WARGAMING_APPLICATION_ID } from '../core/node/arguments';
import { CommandRegistry } from '../events/interactionCreate';
import { AccountInfo } from '../types/accountInfo';
import { PlayerClanData } from '../types/playerClanData';
2023-04-27 19:55:42 +00:00
2023-04-28 13:07:51 +00:00
const COMP_TANKS = [
2023-04-27 19:55:42 +00:00
// light tanks
2023-04-28 13:07:51 +00:00
24321, // t-100 lt
20257, // sheridan
3649, // bat chat
19537, // vickers
2023-04-27 19:55:42 +00:00
// heavy tanks
2023-04-28 13:07:51 +00:00
6145, // is-4
7169, // is-7
10785, // t110e5
12161, // strvk
4481, // kranvagn
22817, // m6 yoh
6225, // fv215b
5425, // wz 113
7297, // 60tp
58641, // vk 72
6753, // type 71
];
2023-04-25 01:39:43 +00:00
2023-07-05 01:15:18 +00:00
export const ownedTanksCommand: CommandRegistry = {
2023-04-26 00:02:10 +00:00
inProduction: true,
2023-07-10 19:14:16 +00:00
inDevelopment: false,
2023-04-26 00:02:10 +00:00
inPublic: true,
2023-04-25 01:39:43 +00:00
2023-04-26 00:02:10 +00:00
command: new SlashCommandBuilder()
.setName('ownedtanks')
2023-04-26 00:02:10 +00:00
.setDescription("Shows a player's owned tanks")
2023-06-16 02:07:01 +00:00
.addStringOption((option) =>
2023-04-26 00:02:10 +00:00
option
.setName('tier')
2023-05-08 01:03:05 +00:00
.setDescription('The tier you want to see')
2023-06-16 02:07:01 +00:00
.setChoices(
{ name: 'Tier I', value: '1' },
{ name: 'Tier II', value: '2' },
{ name: 'Tier III', value: '3' },
{ name: 'Tier IV', value: '4' },
{ name: 'Tier V', value: '5' },
{ name: 'Tier VI', value: '6' },
{ name: 'Tier VII', value: '7' },
{ name: 'Tier VIII', value: '8' },
{ name: 'Tier IX', value: '9' },
{ name: 'Tier X', value: '10' },
)
2023-04-26 00:02:10 +00:00
.setRequired(true),
2023-05-08 01:03:05 +00:00
)
2023-06-27 02:22:28 +00:00
.addStringOption(addUsernameChoices),
2023-04-25 01:39:43 +00:00
2023-06-27 01:43:30 +00:00
async handler(interaction) {
2023-06-16 02:07:01 +00:00
const tier = Number(interaction.options.getString('tier'));
2023-06-27 02:07:14 +00:00
const account = await resolvePlayerFromCommand(interaction);
const { id, region: server } = account;
2023-05-16 02:02:50 +00:00
const accountInfo = await getWargamingResponse<AccountInfo>(
2023-06-12 01:17:26 +00:00
`https://api.wotblitz.${server}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`,
2023-05-16 02:02:50 +00:00
);
const tankStats = await getTankStats(server, id);
const tanks = (
await Promise.all(
tankStats.map(async (tankData) => ({
...(await tankopedia)[tankData.tank_id],
tank_id: tankData.tank_id,
})),
)
).filter((tank) => tank?.tier === tier);
2023-06-05 18:47:00 +00:00
const clanData = await getWargamingResponse<PlayerClanData>(
2023-06-12 01:17:26 +00:00
`https://api.wotblitz.${server}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}&extra=clan`,
2023-06-05 18:47:00 +00:00
);
2023-07-08 19:39:35 +00:00
const leftColumnSize = Math.ceil(tanks.length / 2);
const leftColumn = tanks.slice(0, leftColumnSize);
const rightColumn = tanks.slice(leftColumnSize);
2023-04-26 00:02:10 +00:00
2023-06-16 02:01:06 +00:00
return (
2023-06-05 18:47:00 +00:00
<Wrapper>
<TitleBar
name={accountInfo[id].nickname}
2023-06-21 01:52:26 +00:00
nameDiscriminator={`(Tier ${TIER_ROMAN_NUMERALS[tier as Tier]})`}
2023-06-05 18:47:00 +00:00
image={
clanData[id]?.clan
? `https://wotblitz-gc.gcdn.co/icons/clanEmblems1x/clan-icon-v2-${clanData[id]?.clan?.emblem_set_id}.png`
: undefined
}
description={`Owned tanks • ${new Date().toDateString()} • ${
REGION_NAMES[server]
2023-06-05 18:47:00 +00:00
}`}
/>
2023-06-06 16:53:13 +00:00
{tanks.length === 0 && <NoData type={NoDataType.TanksFound} />}
{tanks.length > 0 && (
<Tanks.Root>
2023-07-09 00:47:03 +00:00
<Tanks.Column>
{await Promise.all(
leftColumn.map(async (tank) => (
<Tanks.Item
key={tank.tank_id}
name={await resolveTankName(tank.tank_id)}
2023-07-10 18:16:33 +00:00
tankType={tank.type}
2023-07-09 00:54:19 +00:00
image={tank.images?.normal}
2023-07-10 18:16:33 +00:00
treeType={await getTreeType(tank.tank_id)}
2023-07-09 00:47:03 +00:00
/>
)),
)}
</Tanks.Column>
<Tanks.Column>
{await Promise.all(
rightColumn.map(async (tank) => (
<Tanks.Item
key={tank.tank_id}
name={await resolveTankName(tank.tank_id)}
2023-07-10 18:16:33 +00:00
tankType={tank.type}
2023-07-09 00:54:19 +00:00
image={tank.images?.normal}
2023-07-10 18:16:33 +00:00
treeType={await getTreeType(tank.tank_id)}
2023-07-09 00:47:03 +00:00
/>
)),
)}
</Tanks.Column>
2023-06-06 16:53:13 +00:00
</Tanks.Root>
)}
2023-06-05 18:47:00 +00:00
2023-06-28 18:07:49 +00:00
<PoweredBy type={PoweredByType.Wargaming} />
2023-06-16 02:01:06 +00:00
</Wrapper>
2023-06-05 18:47:00 +00:00
);
2023-04-26 00:02:10 +00:00
},
2023-05-14 17:13:42 +00:00
2023-06-27 02:22:28 +00:00
autocomplete: autocompleteUsername,
2023-07-05 01:15:18 +00:00
};