diff --git a/src/commands/fullStats.tsx b/src/commands/fullStats.tsx index a622487b9..37fcc658e 100644 --- a/src/commands/fullStats.tsx +++ b/src/commands/fullStats.tsx @@ -62,6 +62,8 @@ export const fullStatsCommand = new Promise( ) )[player.id]; + const tierOption = interaction.options.getString('tier'); + return [ await fullStats( commandGroup, @@ -74,7 +76,7 @@ export const fullStatsCommand = new Promise( 'tank-type': interaction.options.getString('tank-type') ?? undefined, nation: interaction.options.getString('nation') ?? undefined, - tier: interaction.options.getInteger('tier') ?? undefined, + tier: tierOption ? parseInt(tierOption) : undefined, 'tree-type': (interaction.options.getString('tree-type') ?? undefined) as TreeTypeString | undefined, } satisfies Partial) diff --git a/src/commands/ownedTanks.tsx b/src/commands/ownedTanks.tsx index 0c48e106f..af7f11a48 100644 --- a/src/commands/ownedTanks.tsx +++ b/src/commands/ownedTanks.tsx @@ -15,6 +15,7 @@ import { tankopedia, tankopediaInfo, } from '../core/blitz/tankopedia'; +import addTierChoices from '../core/discord/addTierChoices'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteUsername from '../core/discord/autocompleteUsername'; import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand'; @@ -52,24 +53,7 @@ export const ownedTanksCommand: CommandRegistry = { command: new SlashCommandBuilder() .setName('owned-tanks') .setDescription("Shows a player's owned tanks") - .addStringOption((option) => - option - .setName('tier') - .setDescription('The tier you want to see') - .setChoices( - { name: 'Tier I (1)', value: '1' }, - { name: 'Tier II (2)', value: '2' }, - { name: 'Tier III (3)', value: '3' }, - { name: 'Tier IV (4)', value: '4' }, - { name: 'Tier V (5)', value: '5' }, - { name: 'Tier VI (6)', value: '6' }, - { name: 'Tier VII (7)', value: '7' }, - { name: 'Tier VIII (8)', value: '8' }, - { name: 'Tier IX (9)', value: '9' }, - { name: 'Tier X (10)', value: '10' }, - ) - .setRequired(true), - ) + .addStringOption(addTierChoices) .addStringOption(addUsernameChoices), async handler(interaction) { diff --git a/src/commands/stats.tsx b/src/commands/stats.tsx index b66eb48cf..6913b08dd 100644 --- a/src/commands/stats.tsx +++ b/src/commands/stats.tsx @@ -60,6 +60,8 @@ export const statsCommand = new Promise(async (resolve) => { ) )[player.id]; + const tierOption = interaction.options.getString('tier'); + return [ await stats( commandGroup, @@ -72,7 +74,7 @@ export const statsCommand = new Promise(async (resolve) => { 'tank-type': interaction.options.getString('tank-type') ?? undefined, nation: interaction.options.getString('nation') ?? undefined, - tier: interaction.options.getInteger('tier') ?? undefined, + tier: tierOption ? parseInt(tierOption) : undefined, 'tree-type': (interaction.options.getString('tree-type') ?? undefined) as TreeTypeString | undefined, } satisfies Partial) diff --git a/src/core/blitz/numberToRomanNumeral.ts b/src/core/blitz/numberToRomanNumeral.ts new file mode 100644 index 000000000..e71b20ab8 --- /dev/null +++ b/src/core/blitz/numberToRomanNumeral.ts @@ -0,0 +1,32 @@ +/** + * Thanks, August! + * https://stackoverflow.com/a/41358305/12294756 + */ +const ROMAN = { + M: 1000, + CM: 900, + D: 500, + CD: 400, + C: 100, + XC: 90, + L: 50, + XL: 40, + X: 10, + IX: 9, + V: 5, + IV: 4, + I: 1, +}; +const ROMAN_KEYS = Object.keys(ROMAN) as (keyof typeof ROMAN)[]; + +export default function numberToRomanNumeral(value: number) { + let string = ''; + + ROMAN_KEYS.forEach((index) => { + const part = Math.floor(value / ROMAN[index]); + value -= part * ROMAN[index]; + string += index.repeat(part); + }); + + return string; +} diff --git a/src/core/discord/addStatTypeSubCommandGroups.ts b/src/core/discord/addStatTypeSubCommandGroups.ts index 06ad4f0d2..e1866c441 100644 --- a/src/core/discord/addStatTypeSubCommandGroups.ts +++ b/src/core/discord/addStatTypeSubCommandGroups.ts @@ -4,6 +4,7 @@ import { StatType } from '../../renderers/stats'; import { tankopediaInfo } from '../blitz/tankopedia'; import addPeriodSubCommands from './addPeriodSubCommands'; import addTankChoices from './addTankChoices'; +import addTierChoices from './addTierChoices'; import addUsernameChoices from './addUsernameChoices'; export default async function addStatTypeSubCommandGroups( @@ -61,13 +62,8 @@ export default async function addStatTypeSubCommandGroups( ) .setRequired(false), ) - .addIntegerOption((option) => - option - .setName('tier') - .setDescription('Tier') - .setMinValue(1) - .setMaxValue(10) - .setRequired(false), + .addStringOption((option) => + addTierChoices(option).setRequired(false), ) .addStringOption((option) => option diff --git a/src/core/discord/addTierChoices.ts b/src/core/discord/addTierChoices.ts new file mode 100644 index 000000000..04958d3c6 --- /dev/null +++ b/src/core/discord/addTierChoices.ts @@ -0,0 +1,16 @@ +import { SlashCommandStringOption } from 'discord.js'; +import { range } from 'lodash'; +import numberToRomanNumeral from '../blitz/numberToRomanNumeral'; + +export default function addTierChoices(option: SlashCommandStringOption) { + return option + .setName('tier') + .setDescription('The tier you want to see') + .setChoices( + ...range(10, 0).map((tier) => ({ + name: `Tier ${tier} - ${numberToRomanNumeral(tier)}`, + value: `${tier}`, + })), + ) + .setRequired(true); +}