Files
blitzkit/src/commands/ownedTanks.tsx
T

86 lines
3.3 KiB
TypeScript
Raw Normal View History

2024-03-16 00:06:44 -05:00
import { chunk } from 'lodash';
import markdownEscape from 'markdown-escape';
import { TANK_CLASSES } from '../components/Tanks/components/Item/constants';
2023-10-14 11:06:03 -05:00
import { getAccountInfo } from '../core/blitz/getAccountInfo';
import getTankStats from '../core/blitz/getTankStats';
2023-12-05 17:36:18 -06:00
import {
2024-03-16 00:06:44 -05:00
NATIONS,
2023-12-14 22:19:01 -06:00
TankDefinition,
2023-12-05 17:36:18 -06:00
Tier,
2024-03-16 00:06:44 -05:00
flags,
2023-12-05 17:36:18 -06:00
tankDefinitions,
2023-12-14 22:19:01 -06:00
} from '../core/blitzkrieg/tankDefinitions';
2024-03-12 23:36:56 -05:00
import { TIER_ROMAN_NUMERALS } from '../core/blitzkrieg/tankDefinitions/constants';
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';
2024-03-08 20:29:35 -06:00
import { createLocalizedCommand } from '../core/discord/createLocalizedCommand';
2023-10-14 11:36:10 -05:00
import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand';
2024-03-08 20:29:35 -06:00
import { translator } from '../core/localization/translator';
2023-07-11 19:54:57 +00:00
import { CommandRegistry } from '../events/interactionCreate';
2023-04-25 01:39:43 +00:00
2024-03-16 00:06:44 -05:00
const TANKS_PER_MESSAGE = 64;
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-08 20:29:35 -06:00
command: createLocalizedCommand('owned-tanks')
2024-03-06 15:34:10 -06:00
.addStringOption(addTierChoices)
.addStringOption(addUsernameChoices),
2023-04-25 01:39:43 +00:00
2024-03-06 15:34:10 -06:00
async handler(interaction) {
2024-03-08 20:29:35 -06:00
const { translate } = translator(interaction.locale);
2024-03-06 15:34:10 -06:00
const tier = Number(interaction.options.getString('tier'));
2024-03-14 16:43:28 -05:00
const { id, region } = await resolvePlayerFromCommand(interaction);
const accountInfo = await getAccountInfo(region, id);
const tankStats = await getTankStats(region, id, interaction.locale);
2024-03-06 15:34:10 -06:00
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 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-16 00:06:44 -05:00
const awaitedTankDefinitions = await tankDefinitions;
const awaitedNations = await NATIONS;
const lines = tankStats
.map(({ tank_id }) => awaitedTankDefinitions[tank_id])
.filter((tank) => tank.tier === tier)
.sort(
(a, b) =>
TANK_CLASSES.indexOf(a.class) - TANK_CLASSES.indexOf(b.class),
)
.sort(
(a, b) =>
awaitedNations.indexOf(a.nation) - awaitedNations.indexOf(b.nation),
)
.map((tank) => `${flags[tank.nation]} ${markdownEscape(tank.name)}`);
2023-04-26 00:02:10 +00:00
2024-03-16 00:06:44 -05:00
return chunk(lines, TANKS_PER_MESSAGE).map((lines, index) =>
index === 0
? `${translate('bot.commands.owned_tanks.body.title', [
markdownEscape(accountInfo.nickname),
2024-03-08 20:29:35 -06:00
TIER_ROMAN_NUMERALS[tier as Tier],
2024-03-16 00:06:44 -05:00
])}${lines.join('\n')}`
: lines.join('\n'),
2024-03-06 15:34:10 -06:00
);
},
2023-05-14 17:13:42 +00:00
2024-03-06 15:34:10 -06:00
autocomplete: autocompleteUsername,
});
});