diff --git a/packages/bot/src/commands/ownedTanks.tsx b/packages/bot/src/commands/ownedTanks.tsx index a272ab11e..ce4b62556 100644 --- a/packages/bot/src/commands/ownedTanks.tsx +++ b/packages/bot/src/commands/ownedTanks.tsx @@ -5,31 +5,31 @@ import { flags, getAccountInfo, getTankStats, -} from '@blitzkit/core'; -import { literals } from '@blitzkit/i18n'; -import markdownEscape from 'markdown-escape'; +} from "@blitzkit/core"; +import { literals } from "@blitzkit/i18n"; +import markdownEscape from "markdown-escape"; import { gameDefinitions, tankDefinitions, -} from '../core/blitzkit/nonBlockingPromises'; -import { addTierChoices } from '../core/discord/addTierChoices'; -import { addUsernameChoices } from '../core/discord/addUsernameChoices'; -import { autocompleteUsername } from '../core/discord/autocompleteUsername'; -import { chunkLines } from '../core/discord/chunkLines'; -import { createLocalizedCommand } from '../core/discord/createLocalizedCommand'; -import { resolvePlayerFromCommand } from '../core/discord/resolvePlayerFromCommand'; -import { translator } from '../core/localization/translator'; -import { CommandRegistry } from '../events/interactionCreate'; +} from "../core/blitzkit/nonBlockingPromises"; +import { addTierChoices } from "../core/discord/addTierChoices"; +import { addUsernameChoices } from "../core/discord/addUsernameChoices"; +import { autocompleteUsername } from "../core/discord/autocompleteUsername"; +import { chunkLines } from "../core/discord/chunkLines"; +import { createLocalizedCommand } from "../core/discord/createLocalizedCommand"; +import { resolvePlayerFromCommand } from "../core/discord/resolvePlayerFromCommand"; +import { translator } from "../core/localization/translator"; +import { CommandRegistry } from "../events/interactionCreate"; export const ownedTanksCommand = new Promise((resolve) => { resolve({ - command: createLocalizedCommand('owned-tanks') + command: createLocalizedCommand("owned-tanks") .addStringOption(addTierChoices) .addStringOption(addUsernameChoices), async handler(interaction) { const { strings, unwrap } = translator(interaction.locale); - const tier = Number(interaction.options.getString('tier')); + const tier = Number(interaction.options.getString("tier")); const { id, region } = await resolvePlayerFromCommand(interaction); const accountInfo = await getAccountInfo(region, id); const tankStats = await getTankStats(region, id); @@ -43,7 +43,7 @@ export const ownedTanksCommand = new Promise((resolve) => { tankStats.map(async (tankData) => ({ tankDefinitions: (await tankDefinitions).tanks[tankData.tank_id]!, id: tankData.tank_id, - })), + })) ) ).filter((tank) => tank.tankDefinitions?.tier === tier); const groupedTanks: Record = {}; @@ -60,25 +60,25 @@ export const ownedTanksCommand = new Promise((resolve) => { const awaitedTankDefinitions = await tankDefinitions; const awaitedGameDefinitions = await gameDefinitions; - const title = literals(strings.bot.commands.owned_tanks.body.title, [ - markdownEscape(accountInfo.nickname), - TIER_ROMAN_NUMERALS[tier], - ]); + const title = literals(strings.bot.commands.owned_tanks.body.title, { + name: markdownEscape(accountInfo.nickname), + tier: TIER_ROMAN_NUMERALS[tier], + }); const tankList = tankStats .map(({ tank_id }) => awaitedTankDefinitions.tanks[tank_id]) .filter((tank) => tank.tier === tier) .sort( (a, b) => - TANK_CLASSES.indexOf(a.class) - TANK_CLASSES.indexOf(b.class), + TANK_CLASSES.indexOf(a.class) - TANK_CLASSES.indexOf(b.class) ) .sort( (a, b) => awaitedGameDefinitions.nations.indexOf(a.nation) - - awaitedGameDefinitions.nations.indexOf(b.nation), + awaitedGameDefinitions.nations.indexOf(b.nation) ) .map( (tank) => - `[${flags[tank.nation]} ${markdownEscape(unwrap(tank.name))}]()`, + `[${flags[tank.nation]} ${markdownEscape(unwrap(tank.name))}]()` ); const lines = [title, ...tankList]; diff --git a/packages/bot/src/commands/permissions.ts b/packages/bot/src/commands/permissions.ts index 8dad1039a..1885c699e 100644 --- a/packages/bot/src/commands/permissions.ts +++ b/packages/bot/src/commands/permissions.ts @@ -1,11 +1,11 @@ -import { literals } from '@blitzkit/i18n'; -import { createLocalizedCommand } from '../core/discord/createLocalizedCommand'; -import { translator } from '../core/localization/translator'; -import { CommandRegistry } from '../events/interactionCreate'; +import { literals } from "@blitzkit/i18n"; +import { createLocalizedCommand } from "../core/discord/createLocalizedCommand"; +import { translator } from "../core/localization/translator"; +import { CommandRegistry } from "../events/interactionCreate"; export const permissionsCommand = new Promise((resolve) => { resolve({ - command: createLocalizedCommand('permissions'), + command: createLocalizedCommand("permissions"), async handler(interaction) { const { strings } = translator(interaction.locale); @@ -14,33 +14,33 @@ export const permissionsCommand = new Promise((resolve) => { new Date().getDay() === 5 && new Date().getDate() === 13; const permissions = [ [ - interaction.appPermissions?.has('ViewChannel'), + interaction.appPermissions?.has("ViewChannel"), strings.bot.commands.permissions.body.view_channels, ], [ - interaction.appPermissions?.has('ReadMessageHistory'), + interaction.appPermissions?.has("ReadMessageHistory"), strings.bot.commands.permissions.body.read_message_history, ], [ - interaction.appPermissions?.has('AttachFiles'), + interaction.appPermissions?.has("AttachFiles"), strings.bot.commands.permissions.body.attach_files, ], [ - interaction.appPermissions?.has('UseExternalEmojis'), + interaction.appPermissions?.has("UseExternalEmojis"), strings.bot.commands.permissions.body.external_emojis, ], ]; const body = permissions .map(([hasPermission, description]) => { if (hasPermission) { - return `${isFridayThe13th ? '😇' : '✅'} ${description}`; + return `${isFridayThe13th ? "😇" : "✅"} ${description}`; } else { - return `${isFridayThe13th ? '💀' : '❌'} ${description}`; + return `${isFridayThe13th ? "💀" : "❌"} ${description}`; } }) - .join('\n'); + .join("\n"); - return literals(strings.bot.commands.permissions.body.title, [body]); + return literals(strings.bot.commands.permissions.body.title, { body }); }, }); }); diff --git a/packages/bot/src/commands/ping.ts b/packages/bot/src/commands/ping.ts index fcf896313..3f0c0b9a4 100644 --- a/packages/bot/src/commands/ping.ts +++ b/packages/bot/src/commands/ping.ts @@ -1,15 +1,15 @@ -import { literals } from '@blitzkit/i18n'; -import { createLocalizedCommand } from '../core/discord/createLocalizedCommand'; -import { translator } from '../core/localization/translator'; -import { CommandRegistry } from '../events/interactionCreate'; +import { literals } from "@blitzkit/i18n"; +import { createLocalizedCommand } from "../core/discord/createLocalizedCommand"; +import { translator } from "../core/localization/translator"; +import { CommandRegistry } from "../events/interactionCreate"; export const pingCommand = new Promise((resolve) => { resolve({ handlesInteraction: true, - command: createLocalizedCommand('ping', [ - { subcommand: 'blitzkit' }, - { subcommand: 'wotb' }, + command: createLocalizedCommand("ping", [ + { subcommand: "blitzkit" }, + { subcommand: "wotb" }, ]), async handler(interaction) { @@ -17,17 +17,17 @@ export const pingCommand = new Promise((resolve) => { const subcommand = interaction.options.getSubcommand(); const executionStart = Date.now(); - if (subcommand === 'blitzkit') { + if (subcommand === "blitzkit") { await interaction.editReply(strings.bot.commands.ping.body.pong); } else { - await fetch('https://api.wotblitz.com/'); + await fetch("https://api.wotblitz.com/"); } const executionTime = Date.now() - executionStart; interaction.editReply( - literals(strings.bot.commands.ping.body.pong_with_time, [ - `${Math.round(executionTime)}`, - ]), + literals(strings.bot.commands.ping.body.pong_with_time, { + time: executionTime.toFixed(0), + }) ); }, }); diff --git a/packages/bot/src/commands/playerInfo.ts b/packages/bot/src/commands/playerInfo.ts index 5d4be9776..2b4c61268 100644 --- a/packages/bot/src/commands/playerInfo.ts +++ b/packages/bot/src/commands/playerInfo.ts @@ -1,19 +1,19 @@ -import { getAccountInfo } from '@blitzkit/core'; -import { literals } from '@blitzkit/i18n'; -import markdownEscape from 'markdown-escape'; -import { addUsernameChoices } from '../core/discord/addUsernameChoices'; -import { autocompleteUsername } from '../core/discord/autocompleteUsername'; -import { createLocalizedCommand } from '../core/discord/createLocalizedCommand'; -import { embedInfo } from '../core/discord/embedInfo'; -import { markdownTable } from '../core/discord/markdownTable'; -import { resolvePlayerFromCommand } from '../core/discord/resolvePlayerFromCommand'; -import { translator } from '../core/localization/translator'; -import { CommandRegistry } from '../events/interactionCreate'; +import { getAccountInfo } from "@blitzkit/core"; +import { literals } from "@blitzkit/i18n"; +import markdownEscape from "markdown-escape"; +import { addUsernameChoices } from "../core/discord/addUsernameChoices"; +import { autocompleteUsername } from "../core/discord/autocompleteUsername"; +import { createLocalizedCommand } from "../core/discord/createLocalizedCommand"; +import { embedInfo } from "../core/discord/embedInfo"; +import { markdownTable } from "../core/discord/markdownTable"; +import { resolvePlayerFromCommand } from "../core/discord/resolvePlayerFromCommand"; +import { translator } from "../core/localization/translator"; +import { CommandRegistry } from "../events/interactionCreate"; export const playerInfoCommand = new Promise((resolve) => { resolve({ command: - createLocalizedCommand('player-info').addStringOption(addUsernameChoices), + createLocalizedCommand("player-info").addStringOption(addUsernameChoices), async handler(interaction) { const { strings } = translator(interaction.locale); @@ -22,9 +22,9 @@ export const playerInfoCommand = new Promise((resolve) => { const accountInfo = await getAccountInfo(region, id); return embedInfo( - literals(strings.bot.commands.player_info.body.title, [ - markdownEscape(accountInfo.nickname), - ]), + literals(strings.bot.commands.player_info.body.title, { + name: markdownEscape(accountInfo.nickname), + }), markdownTable([ [ @@ -51,16 +51,16 @@ export const playerInfoCommand = new Promise((resolve) => { [ strings.bot.commands.player_info.body.created, new Date(accountInfo.created_at * 1000).toLocaleDateString( - interaction.locale, + interaction.locale ), ], [ strings.bot.commands.player_info.body.last_battle, new Date(accountInfo.last_battle_time * 1000).toLocaleDateString( - interaction.locale, + interaction.locale ), ], - ]), + ]) ); }, diff --git a/packages/bot/src/commands/rating.tsx b/packages/bot/src/commands/rating.tsx index eb0a38613..1f44c7ac3 100644 --- a/packages/bot/src/commands/rating.tsx +++ b/packages/bot/src/commands/rating.tsx @@ -8,42 +8,42 @@ import { getRatingInfo, getRatingNeighbors, imgur, -} from '@blitzkit/core'; -import { literals } from '@blitzkit/i18n'; -import { SlashCommandSubcommandBuilder } from 'discord.js'; -import markdownEscape from 'markdown-escape'; -import { Glow } from '../components/AllStatsOverview/components/HeroStat/components/Glow'; -import { CommandWrapper } from '../components/CommandWrapper'; -import { DeltaCaret } from '../components/DeltaCaret'; -import { TitleBar } from '../components/TitleBar'; -import { normalizeLeagueIcon } from '../core/blitz/normalizeLeagueIcon'; -import { iconPng } from '../core/blitzkit/iconPng'; -import { addUsernameChoices } from '../core/discord/addUsernameChoices'; -import { createLocalizedCommand } from '../core/discord/createLocalizedCommand'; -import { resolvePlayerFromCommand } from '../core/discord/resolvePlayerFromCommand'; -import { translator } from '../core/localization/translator'; -import { CommandRegistry } from '../events/interactionCreate'; -import { theme } from '../stitches.config'; +} from "@blitzkit/core"; +import { literals } from "@blitzkit/i18n"; +import { SlashCommandSubcommandBuilder } from "discord.js"; +import markdownEscape from "markdown-escape"; +import { Glow } from "../components/AllStatsOverview/components/HeroStat/components/Glow"; +import { CommandWrapper } from "../components/CommandWrapper"; +import { DeltaCaret } from "../components/DeltaCaret"; +import { TitleBar } from "../components/TitleBar"; +import { normalizeLeagueIcon } from "../core/blitz/normalizeLeagueIcon"; +import { iconPng } from "../core/blitzkit/iconPng"; +import { addUsernameChoices } from "../core/discord/addUsernameChoices"; +import { createLocalizedCommand } from "../core/discord/createLocalizedCommand"; +import { resolvePlayerFromCommand } from "../core/discord/resolvePlayerFromCommand"; +import { translator } from "../core/localization/translator"; +import { CommandRegistry } from "../events/interactionCreate"; +import { theme } from "../stitches.config"; const LEAGUE_ACCENT = [ - '_purple', - '_sand', - '_amber', - '_mauve', - '_brown', + "_purple", + "_sand", + "_amber", + "_mauve", + "_brown", ] as const; export const ratingCommand = new Promise((resolve) => { resolve({ - command: createLocalizedCommand('rating', [ + command: createLocalizedCommand("rating", [ { - subcommand: 'today', + subcommand: "today", modify(option: SlashCommandSubcommandBuilder) { option.addStringOption(addUsernameChoices); }, }, { - subcommand: 'season', + subcommand: "season", modify(option: SlashCommandSubcommandBuilder) { option.addStringOption(addUsernameChoices); }, @@ -52,11 +52,11 @@ export const ratingCommand = new Promise((resolve) => { async handler(interaction) { const subcommand = interaction.options.getSubcommand(true) as - | 'season' - | 'today'; + | "season" + | "today"; const { strings } = translator(interaction.locale); const { id, region } = await resolvePlayerFromCommand(interaction); - const clan = (await getClanAccountInfo(region, id, ['clan']))?.clan; + const clan = (await getClanAccountInfo(region, id, ["clan"]))?.clan; const clanImage = clan ? emblemURL(clan.emblem_set_id) : undefined; const ratingInfo = await getRatingInfo(region); @@ -67,20 +67,20 @@ export const ratingCommand = new Promise((resolve) => { const leaderboard = await getArchivedRatingLeaderboard( region, - ratingInfo.current_season - (subcommand === 'today' ? 0 : 1), + ratingInfo.current_season - (subcommand === "today" ? 0 : 1) ); - if (leaderboard.version!.$case === 'v1') { + if (leaderboard.version!.$case === "v1") { throw new Error( - 'Encountered bkrl minimal format in latest season. Wait till next cron?', + "Encountered bkrl minimal format in latest season. Wait till next cron?" ); } const accountInfo = await getAccountInfo(region, id, [ - 'statistics.rating', + "statistics.rating", ]); const statsIndex = leaderboard.version!.value.entries.findIndex( - (entry) => entry.id === id, + (entry) => entry.id === id ); const statsA = leaderboard ? leaderboard.version!.value.entries[statsIndex!] @@ -90,9 +90,9 @@ export const ratingCommand = new Promise((resolve) => { const statsB2Array = (await getRatingNeighbors(region, id, 0)).neighbors; if (statsB2Array === undefined) { - return literals(strings.bot.commands.rating.errors.no_participation, [ - markdownEscape(accountInfo.nickname), - ]); + return literals(strings.bot.commands.rating.errors.no_participation, { + name: markdownEscape(accountInfo.nickname), + }); } const [statsB2] = statsB2Array; @@ -102,15 +102,15 @@ export const ratingCommand = new Promise((resolve) => { return strings.bot.commands.rating.errors.unrecorded_stats; } if (!statsB1) { - return literals(strings.bot.commands.rating.errors.no_participation, [ - markdownEscape(accountInfo.nickname), - ]); + return literals(strings.bot.commands.rating.errors.no_participation, { + name: markdownEscape(accountInfo.nickname), + }); } const reward = ratingInfo.rewards.find( (reward) => statsB2.number >= reward.from_position && - statsB2.number <= reward.to_position, + statsB2.number <= reward.to_position ); const positionDelta = leaderboard ? statsB2.number - positionA! @@ -118,11 +118,11 @@ export const ratingCommand = new Promise((resolve) => { const delta = deltaBkrlBlitzStats( statsA, accountInfo.statistics.rating!, - statsB2, + statsB2 ); const leagueTheme = LEAGUE_ACCENT[league.index]; let rewardImage = reward - ? reward.type === 'vehicle' + ? reward.type === "vehicle" ? reward.vehicle.preview_image_url : reward.stuff.image_url : undefined; @@ -131,7 +131,7 @@ export const ratingCommand = new Promise((resolve) => { const { ok } = await fetch(rewardImage); if (!ok) { - rewardImage = imgur('kP88vqr'); + rewardImage = imgur("kP88vqr"); } } @@ -147,24 +147,24 @@ export const ratingCommand = new Promise((resolve) => {
{reward === undefined && ( @@ -172,17 +172,17 @@ export const ratingCommand = new Promise((resolve) => { endOpacity={3 / 4} color={theme.colors[`solidBackground${leagueTheme}`]} style={{ - transform: 'translateX(-16px) rotate(90deg)', + transform: "translateX(-16px) rotate(90deg)", }} /> )}
((resolve) => { style={{ width: 64, height: 64, - objectFit: 'contain', + objectFit: "contain", }} src={normalizeLeagueIcon( - ratingInfo.leagues[league.index].big_icon, + ratingInfo.leagues[league.index].big_icon )} />
((resolve) => { }} > {Math.abs(delta.score).toLocaleString( - interaction.locale, + interaction.locale )} @@ -241,9 +241,9 @@ export const ratingCommand = new Promise((resolve) => {
((resolve) => { }} > {Math.abs(positionDelta).toLocaleString( - interaction.locale, + interaction.locale )} @@ -279,23 +279,23 @@ export const ratingCommand = new Promise((resolve) => { {reward && (
((resolve) => { color: theme.colors[`textHighContrast${leagueTheme}`], fontSize: 16, maxWidth: 136, - textAlign: 'right', - whiteSpace: 'nowrap', - textOverflow: 'ellipsis', - overflow: 'hidden', + textAlign: "right", + whiteSpace: "nowrap", + textOverflow: "ellipsis", + overflow: "hidden", }} > - {reward.type === 'vehicle' + {reward.type === "vehicle" ? reward.vehicle.user_string : reward.stuff.title} @@ -317,9 +317,9 @@ export const ratingCommand = new Promise((resolve) => {
((resolve) => { }} > Reward - {reward.type === 'stuff' ? ` x${reward.count}` : ''} + {reward.type === "stuff" ? ` x${reward.count}` : ""}
@@ -338,7 +338,7 @@ export const ratingCommand = new Promise((resolve) => { style={{ width: 64, height: 64, - objectFit: 'cover', + objectFit: "cover", }} src={await iconPng(rewardImage!)} /> @@ -350,7 +350,7 @@ export const ratingCommand = new Promise((resolve) => { endOpacity={3 / 4} color={theme.colors[`solidBackground${leagueTheme}`]} style={{ - transform: 'translateX(16px) rotate(-90deg)', + transform: "translateX(16px) rotate(-90deg)", }} /> )} @@ -362,10 +362,10 @@ export const ratingCommand = new Promise((resolve) => { direction="reverse" color={theme.colors[`solidBackground${leagueTheme}`]} style={{ - position: 'absolute', + position: "absolute", top: -40, - left: '50%', - transform: 'translateX(-50%)', + left: "50%", + transform: "translateX(-50%)", }} /> )} @@ -373,32 +373,32 @@ export const ratingCommand = new Promise((resolve) => { )}
{delta.battles > 0 && ( -
+
{delta.battles.toLocaleString(interaction.locale)} @@ -414,19 +414,19 @@ export const ratingCommand = new Promise((resolve) => {
{(100 * (delta.wins / delta.battles)).toFixed(0)}% @@ -442,23 +442,23 @@ export const ratingCommand = new Promise((resolve) => {
{Math.round(delta.damage / delta.battles).toLocaleString( - interaction.locale, + interaction.locale )} ((resolve) => {
{(100 * (delta.survived / delta.battles)).toFixed(0)}% @@ -500,19 +500,19 @@ export const ratingCommand = new Promise((resolve) => {
{(delta.kills / delta.battles).toFixed(2)} diff --git a/packages/bot/src/commands/ratingLeaderboard.tsx b/packages/bot/src/commands/ratingLeaderboard.tsx index 6833cbf32..37cf8875f 100644 --- a/packages/bot/src/commands/ratingLeaderboard.tsx +++ b/packages/bot/src/commands/ratingLeaderboard.tsx @@ -13,27 +13,27 @@ import { RatingInfo, RatingLeaderboard, Region, -} from '@blitzkit/core'; -import { literals } from '@blitzkit/i18n'; +} from "@blitzkit/core"; +import { literals } from "@blitzkit/i18n"; import { APIApplicationCommandOptionChoice, Locale, SlashCommandSubcommandBuilder, -} from 'discord.js'; -import { range } from 'lodash-es'; -import markdownEscape from 'markdown-escape'; -import { CommandWrapper } from '../components/CommandWrapper'; -import * as Leaderboard from '../components/Leaderboard'; -import { TitleBar } from '../components/TitleBar'; -import { UserError } from '../core/blitzkit/userError'; -import { addRegionChoices } from '../core/discord/addRegionChoices'; -import { addUsernameChoices } from '../core/discord/addUsernameChoices'; -import { autocompleteUsername } from '../core/discord/autocompleteUsername'; -import { createLocalizedCommand } from '../core/discord/createLocalizedCommand'; -import { localizationObject } from '../core/discord/localizationObject'; -import { resolvePlayerFromCommand } from '../core/discord/resolvePlayerFromCommand'; -import { translator } from '../core/localization/translator'; -import { CommandRegistry } from '../events/interactionCreate'; +} from "discord.js"; +import { range } from "lodash-es"; +import markdownEscape from "markdown-escape"; +import { CommandWrapper } from "../components/CommandWrapper"; +import * as Leaderboard from "../components/Leaderboard"; +import { TitleBar } from "../components/TitleBar"; +import { UserError } from "../core/blitzkit/userError"; +import { addRegionChoices } from "../core/discord/addRegionChoices"; +import { addUsernameChoices } from "../core/discord/addUsernameChoices"; +import { autocompleteUsername } from "../core/discord/autocompleteUsername"; +import { createLocalizedCommand } from "../core/discord/createLocalizedCommand"; +import { localizationObject } from "../core/discord/localizationObject"; +import { resolvePlayerFromCommand } from "../core/discord/resolvePlayerFromCommand"; +import { translator } from "../core/localization/translator"; +import { CommandRegistry } from "../events/interactionCreate"; interface SimplifiedPlayer { id: number; @@ -51,7 +51,7 @@ export const ratingLeaderboardCommand = new Promise( const onGoingSeason = await isOnGoingRatingSeason(); const seasonNumbers = range( FIRST_MINIMAL_ARCHIVED_RATING_SEASON, - latestArchivedSeasonNumber + (onGoingSeason ? 1 : 0) + 1, + latestArchivedSeasonNumber + (onGoingSeason ? 1 : 0) + 1 ); function addOptions(option: SlashCommandSubcommandBuilder) { @@ -66,51 +66,50 @@ export const ratingLeaderboardCommand = new Promise( (strings) => strings.bot.commands.rating_leaderboard.options.limit.name, undefined, - true, - ), + true + ) ) .setDescription( literals( strings.bot.commands.rating_leaderboard.options.limit .description, - [`${DEFAULT_LIMIT}`], - ), + { count: DEFAULT_LIMIT } + ) ) .setDescriptionLocalizations( localizationObject( (strings) => strings.bot.commands.rating_leaderboard.options.limit .description, - [`${DEFAULT_LIMIT}`], - ), + { count: DEFAULT_LIMIT } + ) ) .setRequired(false) .setMinValue(5) - .setMaxValue(30), + .setMaxValue(30) ) .addStringOption((option) => option .setName( - strings.bot.commands.rating_leaderboard.options.season.name, + strings.bot.commands.rating_leaderboard.options.season.name ) .setNameLocalizations( localizationObject( (strings) => strings.bot.commands.rating_leaderboard.options.season.name, undefined, - true, - ), + true + ) ) .setDescription( - strings.bot.commands.rating_leaderboard.options.season - .description, + strings.bot.commands.rating_leaderboard.options.season.description ) .setDescriptionLocalizations( localizationObject( (strings) => strings.bot.commands.rating_leaderboard.options.season - .description, - ), + .description + ) ) .setRequired(false) .addChoices( @@ -124,7 +123,7 @@ export const ratingLeaderboardCommand = new Promise( ? literals( strings.bot.commands.rating_leaderboard.options.season .choices.current, - [`${number}`], + { season: number } ) : `${number}`, value: `${number}`, @@ -133,27 +132,27 @@ export const ratingLeaderboardCommand = new Promise( (strings) => strings.bot.commands.rating_leaderboard.options .season.choices.current, - [`${number}`], + { season: number } ) : undefined, } satisfies APIApplicationCommandOptionChoice; }) - .reverse(), - ), + .reverse() + ) ); } resolve({ - command: createLocalizedCommand('rating-leaderboard', [ + command: createLocalizedCommand("rating-leaderboard", [ { - subcommand: 'neighbors', + subcommand: "neighbors", modify(option: SlashCommandSubcommandBuilder) { option.addStringOption(addUsernameChoices); addOptions(option); }, }, { - subcommand: 'league', + subcommand: "league", modify(option: SlashCommandSubcommandBuilder) { option .addStringOption((option) => { @@ -161,7 +160,7 @@ export const ratingLeaderboardCommand = new Promise( return option .setName( - strings.bot.commands.rating_leaderboard.options.league.name, + strings.bot.commands.rating_leaderboard.options.league.name ) .setNameLocalizations( localizationObject( @@ -169,19 +168,19 @@ export const ratingLeaderboardCommand = new Promise( strings.bot.commands.rating_leaderboard.options.league .name, undefined, - true, - ), + true + ) ) .setDescription( strings.bot.commands.rating_leaderboard.options.league - .description, + .description ) .setDescriptionLocalizations( localizationObject( (strings) => strings.bot.commands.rating_leaderboard.options.league - .description, - ), + .description + ) ) .addChoices( ...LEAGUES.map( @@ -195,10 +194,10 @@ export const ratingLeaderboardCommand = new Promise( (strings) => ( strings.common.leagues as Record - )[name], + )[name] ), - }) satisfies APIApplicationCommandOptionChoice, - ), + }) satisfies APIApplicationCommandOptionChoice + ) ) .setRequired(true); }) @@ -213,10 +212,10 @@ export const ratingLeaderboardCommand = new Promise( async handler(interaction) { const { strings } = translator(interaction.locale); const subcommand = interaction.options.getSubcommand(true) as - | 'league' - | 'neighbors'; - const limit = interaction.options.getInteger('limit') ?? DEFAULT_LIMIT; - const seasonOption = interaction.options.getString('season'); + | "league" + | "neighbors"; + const limit = interaction.options.getInteger("limit") ?? DEFAULT_LIMIT; + const seasonOption = interaction.options.getString("season"); const season = seasonOption ? parseInt(seasonOption) : onGoingSeason @@ -232,11 +231,11 @@ export const ratingLeaderboardCommand = new Promise( let playerId: number | undefined; let regionRatingInfo: RatingInfo | null; - if (subcommand === 'league') { + if (subcommand === "league") { const leagueIndex = parseInt( - interaction.options.getString('league')!, + interaction.options.getString("league")! ); - const region = interaction.options.getString('region') as Region; + const region = interaction.options.getString("region") as Region; regionRatingInfo = await (isCurrentSeason ? getRatingInfo(region) : null); @@ -259,8 +258,8 @@ export const ratingLeaderboardCommand = new Promise( position: player.number, clan: player.clan_tag, nickname: player.nickname, - }) satisfies SimplifiedPlayer, - ), + }) satisfies SimplifiedPlayer + ) ) : await getArchivedRatingLeaderboard(region, season!).then( async (players) => { @@ -269,17 +268,17 @@ export const ratingLeaderboardCommand = new Promise( ? 0 : players.version!.value.entries.findIndex( (player) => - player.score < LEAGUES[leagueIndex - 1].minScore, + player.score < LEAGUES[leagueIndex - 1].minScore ); const lastPlayerIndex = firstPlayerIndex + limit - 1; const trimmed = players.version!.value.entries.slice( firstPlayerIndex, - lastPlayerIndex + 1, + lastPlayerIndex + 1 ); const clanData = await getClanAccountInfo( region, trimmed.map(({ id }) => id), - ['clan'], + ["clan"] ); return trimmed.map( @@ -294,16 +293,16 @@ export const ratingLeaderboardCommand = new Promise( literals( strings.bot.commands.rating_leaderboard.body .deleted_player, - [`${player.id}`], + { id: player.id } ), - }) satisfies SimplifiedPlayer, + }) satisfies SimplifiedPlayer ); - }, + } ); const leagueInfo = LEAGUES[leagueIndex]; archivedLeaderboard = await getArchivedRatingLeaderboard( region, - season, + season ); players = result; @@ -316,12 +315,12 @@ export const ratingLeaderboardCommand = new Promise( ? (strings.common.leagues as Record)[ LEAGUES[leagueInfo.index].name ] - : '' + : "" } - ${strings.common.regions.short[region]}`; titleImage = imgur(leagueInfo.icon); titleDescription = literals( strings.bot.commands.rating_leaderboard.body.top_players, - [`${limit}`], + { count: limit } ); } else { const { region, id } = await resolvePlayerFromCommand(interaction); @@ -338,7 +337,7 @@ export const ratingLeaderboardCommand = new Promise( } const accountInfo = await getAccountInfo(region, id); - const clan = (await getClanAccountInfo(region, id, ['clan']))?.clan; + const clan = (await getClanAccountInfo(region, id, ["clan"]))?.clan; const neighbors = isCurrentSeason ? await getRatingNeighbors(region, id, Math.round(limit / 2)).then( (players) => @@ -350,13 +349,13 @@ export const ratingLeaderboardCommand = new Promise( score: player.score, clan: player.clan_tag, nickname: player.nickname, - }) satisfies SimplifiedPlayer, - ), + }) satisfies SimplifiedPlayer + ) ) : await getArchivedRatingLeaderboard(region, season!).then( async (players) => { const playerIndex = players.version!.value.entries.findIndex( - (player) => player.id === id, + (player) => player.id === id ); if (playerIndex === -1) { @@ -364,20 +363,20 @@ export const ratingLeaderboardCommand = new Promise( literals( strings.bot.commands.rating_leaderboard.body .no_participation, - [markdownEscape(accountInfo.nickname), `${season}`], - ), + { player: markdownEscape(accountInfo.nickname), season } + ) ); } const halfRange = Math.round(limit / 2); const trimmed = players.version!.value.entries.slice( playerIndex - halfRange, - playerIndex + halfRange + 1, + playerIndex + halfRange + 1 ); const clanData = await getClanAccountInfo( region, trimmed.map((player) => player.id), - ['clan'], + ["clan"] ); return trimmed.map((player, index) => ({ @@ -389,18 +388,18 @@ export const ratingLeaderboardCommand = new Promise( ? clanData[index]!.account_name : `Deleted ${player.id}`, })); - }, + } ); archivedLeaderboard = await getArchivedRatingLeaderboard( region, - season, + season ); players = neighbors; titleImage = clan ? `https://wotblitz-gc.gcdn.co/icons/clanEmblems1x/clan-icon-v2-${clan.emblem_set_id}.png` : undefined; - titleName = neighbors ? accountInfo.nickname : ''; + titleName = neighbors ? accountInfo.nickname : ""; titleDescription = strings.bot.commands.rating_leaderboard.body.neighbors; playersAfter = @@ -414,7 +413,7 @@ export const ratingLeaderboardCommand = new Promise( const items = players.map((player) => { const midnightIndex = archivedLeaderboard?.version!.value.entries.findIndex( - (item) => item.id === player.id, + (item) => item.id === player.id ); const midnightScore = midnightIndex === undefined @@ -453,7 +452,7 @@ export const ratingLeaderboardCommand = new Promise( )} @@ -465,5 +464,5 @@ export const ratingLeaderboardCommand = new Promise( autocomplete: autocompleteUsername, }); - }, + } ); diff --git a/packages/bot/src/core/discord/localizationObject.ts b/packages/bot/src/core/discord/localizationObject.ts index d3e5560f8..a7ca99f47 100644 --- a/packages/bot/src/core/discord/localizationObject.ts +++ b/packages/bot/src/core/discord/localizationObject.ts @@ -1,15 +1,15 @@ -import { BlitzKitStrings, literals as literalsFunc } from '@blitzkit/i18n'; -import { Locale } from 'discord.js'; -import { SUPPORTED_LOCALES_DISCORD } from '../localization/strings/constants'; -import { translator } from '../localization/translator'; +import { BlitzKitStrings, literals as literalsFunc } from "@blitzkit/i18n"; +import { Locale } from "discord.js"; +import { SUPPORTED_LOCALES_DISCORD } from "../localization/strings/constants"; +import { translator } from "../localization/translator"; const validNameRegex = /^[\p{Ll}\p{Lm}\p{Lo}\p{N}\p{sc=Devanagari}\p{sc=Thai}_-]+$/u; export function localizationObject( path: (strings: BlitzKitStrings) => string, - literals: string[] = [], - strict = false, + literals?: Record, + strict = false ) { return SUPPORTED_LOCALES_DISCORD.reduce>>( (localizations, locale) => { @@ -20,7 +20,7 @@ export function localizationObject( if (!isValid) { console.warn( - `Invalid localization for ${locale} (${path}): ${translation}; skipping...`, + `Invalid localization for ${locale} (${path}): ${translation}; skipping...` ); return localizations; } @@ -30,6 +30,6 @@ export function localizationObject( [locale]: translation, }; }, - {}, + {} ); }