From bff6eb050314b17758f91c4a371a02e61ff729e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sun, 8 Oct 2023 17:53:24 -0500 Subject: [PATCH 01/43] feat: simplified no ongoing ratings season --- src/commands/ratings.tsx | 154 ++++++++++++++++++--------------------- 1 file changed, 72 insertions(+), 82 deletions(-) diff --git a/src/commands/ratings.tsx b/src/commands/ratings.tsx index 3f49a15ea..13626733e 100644 --- a/src/commands/ratings.tsx +++ b/src/commands/ratings.tsx @@ -20,6 +20,7 @@ import getMidnightLeaderboard, { import addRegionChoices from '../core/discord/addRegionChoices'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteUsername from '../core/discord/autocompleteUsername'; +import embedNegative from '../core/discord/embedNegative'; import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand'; import { octokit } from '../core/github/octokit'; import throwError from '../core/node/throwError'; @@ -172,6 +173,11 @@ function addSubcommands( ); } +const noOngoingSeason = embedNegative( + 'No ongoing season', + "Wargaming didn't provide any data for this season.", +); + export const ratingsCommand = new Promise( async (resolve) => { const seasonChoices = await octokit.repos @@ -259,27 +265,28 @@ export const ratingsCommand = new Promise( regionRatingsInfo = await (subcommandGroup === 'current' ? getRatingsInfo(region) : getArchivedRatingsInfo(season!, region)); + + if (regionRatingsInfo.detail !== undefined) return noOngoingSeason; + const regionSubdomain = regionToRegionSubdomain(region); const result = subcommandGroup === 'current' - ? regionRatingsInfo.detail === undefined - ? await fetch( - `https://${regionSubdomain}.wotblitz.com/en/api/rating-leaderboards/league/${leagueIndex}/top/`, + ? await fetch( + `https://${regionSubdomain}.wotblitz.com/en/api/rating-leaderboards/league/${leagueIndex}/top/`, + ) + .then((response) => response.json() as Promise) + .then(async ({ result }) => + result.slice(0, limit).map( + (player) => + ({ + id: player.spa_id, + score: player.score, + position: player.number, + clan: player.clan_tag, + nickname: player.nickname, + }) satisfies SimplifiedPlayer, + ), ) - .then((response) => response.json() as Promise) - .then(async ({ result }) => - result.slice(0, limit).map( - (player) => - ({ - id: player.spa_id, - score: player.score, - position: player.number, - clan: player.clan_tag, - nickname: player.nickname, - }) satisfies SimplifiedPlayer, - ), - ) - : undefined : await octokit.repos .getContent({ ...DATABASE_REPO, @@ -323,34 +330,25 @@ export const ratingsCommand = new Promise( }) satisfies SimplifiedPlayer, ); }); - const leagueInfo = - regionRatingsInfo.detail === undefined - ? regionRatingsInfo.leagues[leagueIndex] - : undefined; + const leagueInfo = regionRatingsInfo.leagues[leagueIndex]; midnightLeaderboard = subcommandGroup === 'current' - ? regionRatingsInfo.detail === undefined - ? await getMidnightLeaderboard( - region, - regionRatingsInfo.current_season, - ) - : undefined + ? await getMidnightLeaderboard( + region, + regionRatingsInfo.current_season, + ) : await getMidnightLeaderboard(region, season!); players = result; playersBefore = result ? result[0].position - 1 : 0; playersAfter = - regionRatingsInfo.detail === undefined && result !== undefined - ? regionRatingsInfo.count - result[result.length - 1].position - : 0; + regionRatingsInfo.count - result[result.length - 1].position; titleName = `${ leagueInfo ? leagueInfo.title : 'No Ongoing Season' } - ${REGION_NAMES_SHORT[region]}`; - titleImage = leagueInfo - ? leagueInfo.big_icon.startsWith('http') - ? leagueInfo.big_icon - : `https:${leagueInfo.big_icon}` - : undefined; + titleImage = leagueInfo.big_icon.startsWith('http') + ? leagueInfo.big_icon + : `https:${leagueInfo.big_icon}`; titleDescription = `Top ${limit} players`; } else { const { region, id } = await resolvePlayerFromCommand(interaction); @@ -372,6 +370,9 @@ export const ratingsCommand = new Promise( response.json(), )) as RatingsInfo; }); + + if (regionRatingsInfo.detail !== undefined) return noOngoingSeason; + const accountInfo = await getWargamingResponse( `https://api.wotblitz.${region}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, ); @@ -383,29 +384,26 @@ export const ratingsCommand = new Promise( const regionSubdomain = regionToRegionSubdomain(region); const neighbors = subcommandGroup === 'current' - ? regionRatingsInfo.detail === undefined - ? await fetch( - `https://${regionSubdomain}.wotblitz.com/en/api/rating-leaderboards/user/${id}/?neighbors=${Math.round( - limit / 2, - )}`, + ? await fetch( + `https://${regionSubdomain}.wotblitz.com/en/api/rating-leaderboards/user/${id}/?neighbors=${Math.round( + limit / 2, + )}`, + ) + .then( + (response) => response.json() as Promise, + ) + .then((players) => + players.neighbors.map( + (player) => + ({ + id: player.spa_id, + position: player.number, + score: player.score, + clan: player.clan_tag, + nickname: player.nickname, + }) satisfies SimplifiedPlayer, + ), ) - .then( - (response) => - response.json() as Promise, - ) - .then((players) => - players.neighbors.map( - (player) => - ({ - id: player.spa_id, - position: player.number, - score: player.score, - clan: player.clan_tag, - nickname: player.nickname, - }) satisfies SimplifiedPlayer, - ), - ) - : undefined : await octokit.repos .getContent({ ...DATABASE_REPO, @@ -453,21 +451,17 @@ export const ratingsCommand = new Promise( }); midnightLeaderboard = subcommandGroup === 'current' - ? regionRatingsInfo.detail === undefined - ? await getMidnightLeaderboard( - region, - regionRatingsInfo.current_season, - ) - : undefined + ? await getMidnightLeaderboard( + region, + regionRatingsInfo.current_season, + ) : await getMidnightLeaderboard(region, season!); if (clan && neighbors) titleNameDiscriminator = `[${clan.tag}]`; players = neighbors; - titleImage = neighbors - ? clan - ? `https://wotblitz-gc.gcdn.co/icons/clanEmblems1x/clan-icon-v2-${clan.emblem_set_id}.png` - : undefined + titleImage = clan + ? `https://wotblitz-gc.gcdn.co/icons/clanEmblems1x/clan-icon-v2-${clan.emblem_set_id}.png` : undefined; titleName = neighbors ? accountInfo[id].nickname @@ -475,24 +469,20 @@ export const ratingsCommand = new Promise( titleDescription = 'Ratings neighbours'; playersBefore = neighbors ? neighbors[0].position - 1 : 0; playersAfter = - regionRatingsInfo.detail === undefined - ? neighbors - ? regionRatingsInfo.count - - neighbors[neighbors.length - 1].position - : 0 - : 0; + regionRatingsInfo.count - neighbors[neighbors.length - 1].position; playerId = id; } - const items = players?.map((player) => { - const reward = - regionRatingsInfo.detail === undefined - ? regionRatingsInfo.rewards.find( - (reward) => - player.position >= reward.from_position && - player.position <= reward.to_position, - ) - : undefined; + const resolvedRegionRatingsInfo: typeof regionRatingsInfo & { + detail: undefined; + } = regionRatingsInfo; + + const items = players.map((player) => { + const reward = resolvedRegionRatingsInfo.rewards.find( + (reward) => + player.position >= reward.from_position && + player.position <= reward.to_position, + ); const midnightIndex = midnightLeaderboard?.findIndex( (item) => item.id === player.id, ); From 97d427a6a80174e0532b15e6551149dcdb969aef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sun, 8 Oct 2023 18:53:21 -0500 Subject: [PATCH 02/43] feat: better guild command handling --- src/events/interactionCreate/index.ts | 33 +++++++++------------------ 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/src/events/interactionCreate/index.ts b/src/events/interactionCreate/index.ts index 823eca426..db65bf71d 100644 --- a/src/events/interactionCreate/index.ts +++ b/src/events/interactionCreate/index.ts @@ -134,30 +134,19 @@ commands.then((awaitedCommands) => { try { console.log(`Refreshing ${publicCommands.length} public command(s).`); - rest - .put(Routes.applicationCommands(getClientId()), { body: publicCommands }) - .then((publicData) => { - console.log( - `Successfully refreshed ${ - (publicData as RESTPostAPIChatInputApplicationCommandsJSONBody[]) - .length - } public command(s).`, - ); - }); + rest.put(Routes.applicationCommands(getClientId()), { + body: publicCommands, + }); console.log(`Refreshing ${guildCommands.length} guild command(s).`); - rest - .put( - Routes.applicationGuildCommands(getClientId(), discord.tres_guild_id), - { body: guildCommands }, - ) - .then((guildData) => { - console.log( - `Successfully refreshed ${ - (guildData as unknown[]).length - } guild command(s).`, - ); - }); + (isDev() + ? [discord.test_guild_id] + : [discord.tres_guild_id, discord.sklld_guild_id] + ).forEach((guildId) => + rest.put(Routes.applicationGuildCommands(getClientId(), guildId), { + body: guildCommands, + }), + ); } catch (error) { console.error(error); } From 19298b9ad6c737b969e75956ed1c9702aa0c1edf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Tue, 10 Oct 2023 20:33:24 -0500 Subject: [PATCH 03/43] feat: link command basic functionaility --- .github/workflows/cd-host.yml | 2 +- .vscode/settings.json | 1 + discord.json | 4 +- package.dist.json | 2 +- package.json | 4 +- .../20231009152251_use_big_int/migration.sql | 8 ++ prisma/migrations/migration_lock.toml | 3 + prisma/schema.prisma | 14 +++ src/bot.ts | 4 +- src/commands/link.ts | 98 +++++++++++++++++++ src/commands/verify.ts | 82 ---------------- src/core/cockroackdb/discordBlitz.ts | 23 +++++ src/core/discord/resolvePlayerFromCommand.ts | 40 ++------ src/core/node/processes.ts | 29 ++++++ src/core/node/secrets.ts | 6 +- src/events/error.ts | 40 -------- .../handlers/chatInputCommand.ts | 5 +- src/events/interactionCreate/index.ts | 2 +- yarn.lock | 24 +++++ 19 files changed, 225 insertions(+), 166 deletions(-) create mode 100644 prisma/migrations/20231009152251_use_big_int/migration.sql create mode 100644 prisma/migrations/migration_lock.toml create mode 100644 prisma/schema.prisma create mode 100644 src/commands/link.ts delete mode 100644 src/commands/verify.ts create mode 100644 src/core/cockroackdb/discordBlitz.ts create mode 100644 src/core/node/processes.ts delete mode 100644 src/events/error.ts diff --git a/.github/workflows/cd-host.yml b/.github/workflows/cd-host.yml index bda094d6d..33834e705 100644 --- a/.github/workflows/cd-host.yml +++ b/.github/workflows/cd-host.yml @@ -29,4 +29,4 @@ jobs: unzip bot.zip - name: Run bot - run: NODE_ENV=production GH_TOKEN=${{ secrets.GH_TOKEN }} DISCORD_TOKEN=${{ secrets.DISCORD_TOKEN }} node --enable-source-maps --trace-warnings index.cjs + run: NODE_ENV=production GH_TOKEN=${{ secrets.GH_TOKEN }} DISCORD_TOKEN=${{ secrets.DISCORD_TOKEN }} node --enable-source-maps index.cjs diff --git a/.vscode/settings.json b/.vscode/settings.json index e63c24f60..30edbe1b0 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,6 +5,7 @@ "bepaint", "blitzstars", "cleandist", + "cockroackdb", "customperiod", "deburr", "diacriticless", diff --git a/discord.json b/discord.json index d169bf4c9..d3ffa5749 100644 --- a/discord.json +++ b/discord.json @@ -8,5 +8,7 @@ "sklld_peasant_role": "896878529512370228", "tres_guild_id": "734786591205359697", - "tres_log_channel": "1109262265850544148" + "tres_log_channel": "1109262265850544148", + + "test_guild_id": "1124729294829142116" } diff --git a/package.dist.json b/package.dist.json index a4aa082e6..9e205ed74 100644 --- a/package.dist.json +++ b/package.dist.json @@ -2,6 +2,6 @@ "main": "server.js", "type": "module", "scripts": { - "start": "node --enable-source-maps --trace-warnings server.cjs" + "start": "node --enable-source-maps server.cjs" } } diff --git a/package.json b/package.json index 49a527f52..97c151197 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "dev:bot": "yarn build:bot && yarn start:bot", "dev:docs": "vitepress dev docs", "dev:website": "next dev", - "start:bot": "node --enable-source-maps --trace-warnings dist/bot/index.cjs", + "start:bot": "node --enable-source-maps dist/bot/index.cjs", "start:website": "next start", "host:docs": "vitepress preview docs", "publish:ratingsleaderboard": "vite-node --script scripts/buildRatingsLeaderboard --publish", @@ -26,6 +26,7 @@ "license": "MIT", "dependencies": { "@octokit/rest": "^20.0.1", + "@prisma/client": "^5.4.1", "@radix-ui/colors": "^3.0.0-rc.4", "@radix-ui/react-icons": "^1.3.0", "@radix-ui/themes": "^1.1.2", @@ -62,6 +63,7 @@ "compare-versions": "^6.1.0", "knip": "^2.27.1", "prettier": "^3.0.3", + "prisma": "^5.4.1", "typescript": "^5.2.2" } } diff --git a/prisma/migrations/20231009152251_use_big_int/migration.sql b/prisma/migrations/20231009152251_use_big_int/migration.sql new file mode 100644 index 000000000..2fdbde59a --- /dev/null +++ b/prisma/migrations/20231009152251_use_big_int/migration.sql @@ -0,0 +1,8 @@ +-- CreateTable +CREATE TABLE "discord_blitz" ( + "discord" INT8 NOT NULL, + "region" STRING NOT NULL, + "blitz" INT4 NOT NULL, + + CONSTRAINT "discord_blitz_pkey" PRIMARY KEY ("discord") +); diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml new file mode 100644 index 000000000..7106c8a84 --- /dev/null +++ b/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "cockroachdb" \ No newline at end of file diff --git a/prisma/schema.prisma b/prisma/schema.prisma new file mode 100644 index 000000000..20719dbc2 --- /dev/null +++ b/prisma/schema.prisma @@ -0,0 +1,14 @@ +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "cockroachdb" + url = env("DISCORD_BLITZ_DB") +} + +model discord_blitz { + discord BigInt @id + region String + blitz Int +} diff --git a/src/bot.ts b/src/bot.ts index 55f661aa1..4506ce218 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -1,6 +1,6 @@ import { client } from './core/discord/client'; +import { registerProcesses } from './core/node/processes'; import { secrets } from './core/node/secrets'; -import { registerErrorHandlers } from './events/error'; -registerErrorHandlers(); +registerProcesses(); client.login(secrets.DISCORD_TOKEN); diff --git a/src/commands/link.ts b/src/commands/link.ts new file mode 100644 index 000000000..e1ca47b5e --- /dev/null +++ b/src/commands/link.ts @@ -0,0 +1,98 @@ +import { SlashCommandBuilder } from 'discord.js'; +import { Region } from '../constants/regions'; +import { linkBlitzAndDiscord } from '../core/cockroackdb/discordBlitz'; +import addUsernameChoices from '../core/discord/addUsernameChoices'; +import autocompleteUsername from '../core/discord/autocompleteUsername'; +import embedNegative from '../core/discord/embedNegative'; +import { CommandRegistry } from '../events/interactionCreate'; + +const serverAndIdPattern = /(com|eu|asia)\/[0-9]+/; + +export const verifyCommand: CommandRegistry = { + inProduction: true, + inPublic: true, + + command: new SlashCommandBuilder() + .setName('link') + .setDescription('Links your Blitz and Discord account') + .addStringOption((option) => addUsernameChoices(option).setRequired(true)), + + async handler(interaction) { + // const blitzAccount = await resolvePlayerFromCommand(interaction); + // const { id, region: server } = blitzAccount; + // const accountInfo = await getWargamingResponse( + // `https://api.wotblitz.${server}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, + // ); + // const clanData = await getWargamingResponse( + // `https://api.wotblitz.${server}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}&extra=clan`, + // ); + // const clan = clanData[id]?.clan; + // const clanTag = clan ? ` [${clan!.tag}]` : ''; + // const member = + // interaction.member && + // interaction.guild?.members.cache.get(interaction.member?.user.id); + + // if (!interaction.guild?.members.me?.permissions.has('ManageNicknames')) { + // return embedNegative( + // `${markdownEscape(interaction.user.username)} failed to verify`, + // "I don't have the permission to change your nickname.", + // ); + // } + // if (!interaction.member || !member) { + // return embedNegative( + // `${interaction.user.username} is not in this server`, + // "I couldn't find this person in this server. Did they leave?", + // ); + // } + + // try { + // await member.setNickname(`${accountInfo[id].nickname}${clanTag}`); + + // if (interaction.guildId === discord.sklld_guild_id) { + // if (!interaction.guild?.members.me?.permissions.has('ManageRoles')) { + // return embedNegative( + // `${markdownEscape(interaction.user.username)} failed to verify`, + // "I don't have the permission to change your manage roles.", + // ); + // } + + // await member.roles.remove(discord.sklld_verify_role); + // await member.roles.add(discord.sklld_peasant_role); + // } + + // return embedPositive( + // `${interaction.user.username} is verified`, + // `The user is now verified as ${markdownEscape( + // accountInfo[id].nickname, + // )}${markdownEscape(clanTag)}`, + // ); + // } catch (error) { + // return embedNegative( + // `${interaction.user.username} failed to verify`, + // "I can't change your nickname because you have higher permissions than me. Try setting your nickname to your Blitz username manually.", + // ); + // } + + const username = interaction.options.getString('username', true); + + if (serverAndIdPattern.test(username)) { + const [region, idString] = username.split('/'); + const id = parseInt(idString); + const discordId = parseInt(interaction.user.id); + + await linkBlitzAndDiscord(discordId, region as Region, id); + + return 'success'; + } else { + return [ + embedNegative( + 'Please select from the options', + 'Click on the user you desire after the search results show up (like the image below).', + ), + 'https://i.imgur.com/ncJyV1F.png', + ]; + } + }, + + autocomplete: autocompleteUsername, +}; diff --git a/src/commands/verify.ts b/src/commands/verify.ts deleted file mode 100644 index 70524c432..000000000 --- a/src/commands/verify.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { SlashCommandBuilder } from 'discord.js'; -import markdownEscape from 'markdown-escape'; -import discord from '../../discord.json' assert { type: 'json' }; -import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; -import getWargamingResponse from '../core/blitz/getWargamingResponse'; -import addUsernameChoices from '../core/discord/addUsernameChoices'; -import autocompleteUsername from '../core/discord/autocompleteUsername'; -import embedNegative from '../core/discord/embedNegative'; -import embedPositive from '../core/discord/embedPositive'; -import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand'; -import { CommandRegistry } from '../events/interactionCreate'; -import { AccountInfo } from '../types/accountInfo'; -import { PlayerClanData } from '../types/playerClanData'; - -export const verifyCommand: CommandRegistry = { - inProduction: true, - inPublic: true, - - command: new SlashCommandBuilder() - .setName('verify') - .setDescription("Set's the user's username to their in-game name") - .addStringOption((option) => addUsernameChoices(option).setRequired(true)), - - async handler(interaction) { - const blitzAccount = await resolvePlayerFromCommand(interaction); - const { id, region: server } = blitzAccount; - const accountInfo = await getWargamingResponse( - `https://api.wotblitz.${server}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, - ); - const clanData = await getWargamingResponse( - `https://api.wotblitz.${server}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}&extra=clan`, - ); - const clan = clanData[id]?.clan; - const clanTag = clan ? ` [${clan!.tag}]` : ''; - const member = - interaction.member && - interaction.guild?.members.cache.get(interaction.member?.user.id); - - if (!interaction.guild?.members.me?.permissions.has('ManageNicknames')) { - return embedNegative( - `${markdownEscape(interaction.user.username)} failed to verify`, - "I don't have the permission to change your nickname.", - ); - } - if (!interaction.member || !member) { - return embedNegative( - `${interaction.user.username} is not in this server`, - "I couldn't find this person in this server. Did they leave?", - ); - } - - try { - await member.setNickname(`${accountInfo[id].nickname}${clanTag}`); - - if (interaction.guildId === discord.sklld_guild_id) { - if (!interaction.guild?.members.me?.permissions.has('ManageRoles')) { - return embedNegative( - `${markdownEscape(interaction.user.username)} failed to verify`, - "I don't have the permission to change your manage roles.", - ); - } - - await member.roles.remove(discord.sklld_verify_role); - await member.roles.add(discord.sklld_peasant_role); - } - - return embedPositive( - `${interaction.user.username} is verified`, - `The user is now verified as ${markdownEscape( - accountInfo[id].nickname, - )}${markdownEscape(clanTag)}`, - ); - } catch (error) { - return embedNegative( - `${interaction.user.username} failed to verify`, - "I can't change your nickname because you have higher permissions than me. Try setting your nickname to your Blitz username manually.", - ); - } - }, - - autocomplete: autocompleteUsername, -}; diff --git a/src/core/cockroackdb/discordBlitz.ts b/src/core/cockroackdb/discordBlitz.ts new file mode 100644 index 000000000..fd644e944 --- /dev/null +++ b/src/core/cockroackdb/discordBlitz.ts @@ -0,0 +1,23 @@ +import { PrismaClient } from '@prisma/client'; +import { Region } from '../../constants/regions'; + +export const discordBlitzDB = new PrismaClient(); + +export function linkBlitzAndDiscord( + discord: number, + region: Region, + blitz: number, +) { + return discordBlitzDB.discord_blitz.upsert({ + where: { discord }, + update: { region, blitz }, + create: { discord, region, blitz }, + }); +} + +export function getBlitzFromDiscord(discord: number) { + return discordBlitzDB.discord_blitz.findUnique({ + where: { discord }, + select: { region: true, blitz: true }, + }) as Promise; +} diff --git a/src/core/discord/resolvePlayerFromCommand.ts b/src/core/discord/resolvePlayerFromCommand.ts index 38e4efa2f..4958bee03 100644 --- a/src/core/discord/resolvePlayerFromCommand.ts +++ b/src/core/discord/resolvePlayerFromCommand.ts @@ -1,8 +1,6 @@ import { CacheType, ChatInputCommandInteraction } from 'discord.js'; import { Region } from '../../constants/regions'; -import listPlayers, { - usernamePatternWithoutPosition, -} from '../blitz/listPlayers'; +import { getBlitzFromDiscord } from '../cockroackdb/discordBlitz'; import throwError from '../node/throwError'; export const serverAndIdPattern = /(com|eu|asia)\/[0-9]+/; @@ -15,38 +13,14 @@ export interface ResolvedPlayer { export default async function resolvePlayerFromCommand( interaction: ChatInputCommandInteraction, ) { - const commandUsername = interaction.options.getString('username'); - const displayName = interaction.guild?.members.cache - .get(interaction.user.id) - ?.displayName.match(usernamePatternWithoutPosition)?.[0]; - const username = commandUsername ?? displayName; + const account = await getBlitzFromDiscord(parseInt(interaction.user.id)); - if (username === undefined) { + if (account) { + return { region: account.region, id: account.blitz }; + } else { throw throwError( - 'Username could not be inferred', - "You didn't provide me a username in the command nor was I able to infer your Blitz username from your Discord nickname. Try providing a username manually in the command or using the `/verify` command to set your Discord nickname to your Blitz username.", + "You're not linked", + 'Use the `/link` command to link your Discord and Blitz accounts.', ); } - - if (serverAndIdPattern.test(username)) { - const [server, accountId] = username.split('/'); - return { - region: server as Region, - id: Number(accountId), - } satisfies ResolvedPlayer; - } else { - const accounts = await listPlayers(username); - - if (accounts[0]) { - return { - region: accounts[0].region, - id: accounts[0].account_id, - } satisfies ResolvedPlayer; - } else { - throw throwError( - 'Could not find user', - `I couldn't find user \`${username}\`. Try providing a valid username manually or using the \`/verify\` command to set your Discord nickname to your Blitz username.`, - ); - } - } } diff --git a/src/core/node/processes.ts b/src/core/node/processes.ts new file mode 100644 index 000000000..f7fee3548 --- /dev/null +++ b/src/core/node/processes.ts @@ -0,0 +1,29 @@ +import { discordBlitzDB } from '../cockroackdb/discordBlitz'; +import { client } from '../discord/client'; + +const EXIT_EVENTS = [ + 'beforeExit', + 'exit', + 'SIGINT', + 'SIGTERM', + 'SIGUSR1', + 'SIGUSR2', +]; + +async function cleanup() { + console.log('Cleaning up...'); + + await Promise.all([discordBlitzDB.$disconnect(), client.destroy()]); + + console.log('Gracefully exiting...'); + + EXIT_EVENTS.forEach((event) => process.off(event, cleanup)); + process.exit(0); +} + +export function registerProcesses() { + process.on('uncaughtException', console.error); + client.on('error', console.error); + + EXIT_EVENTS.forEach((event) => process.on(event, cleanup)); +} diff --git a/src/core/node/secrets.ts b/src/core/node/secrets.ts index 9836fec85..264382263 100644 --- a/src/core/node/secrets.ts +++ b/src/core/node/secrets.ts @@ -2,7 +2,11 @@ import { config } from 'dotenv'; config(); -export const SECRET_KEYS = ['DISCORD_TOKEN', 'GH_TOKEN'] as const; +export const SECRET_KEYS = [ + 'DISCORD_TOKEN', + 'GH_TOKEN', + 'DISCORD_BLITZ_DB', +] as const; export type SECRET = typeof SECRET_KEYS extends readonly (infer T)[] ? T diff --git a/src/events/error.ts b/src/events/error.ts deleted file mode 100644 index 537e06b29..000000000 --- a/src/events/error.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { EmbedBuilder, TextChannel } from 'discord.js'; -import discord from '../../discord.json' assert { type: 'json' }; -import { NEGATIVE_COLOR } from '../constants/colors'; -import { client } from '../core/discord/client'; -import isDev from '../core/node/isDev'; - -const PROCESS_ERROR_EVENTS = ['uncaughtException']; -const CLIENT_ERROR_EVENTS = ['error']; - -export function handleError(error: Error, command: string) { - console.error(error); - - ( - client.guilds.cache - .get(discord.tres_guild_id) - ?.channels.cache.get(discord.tres_log_channel) as TextChannel - ).send({ - embeds: [ - new EmbedBuilder() - .setTitle(`${client.user?.username} ran into an error`) - .setColor(NEGATIVE_COLOR) - .setDescription( - `\`\`\`${[command, error.name, error.message, error.stack] - .filter((item) => item !== undefined) - .join('\n\n')}\`\`\``, - ), - ], - }); -} - -export function registerErrorHandlers() { - if (!isDev()) { - PROCESS_ERROR_EVENTS.forEach((name) => - process.on(name, (error) => handleError(error, 'process error')), - ); - CLIENT_ERROR_EVENTS.forEach((name) => - client.on(name, (error) => handleError(error, 'client error')), - ); - } -} diff --git a/src/events/interactionCreate/handlers/chatInputCommand.ts b/src/events/interactionCreate/handlers/chatInputCommand.ts index e603b4048..985ed45c8 100644 --- a/src/events/interactionCreate/handlers/chatInputCommand.ts +++ b/src/events/interactionCreate/handlers/chatInputCommand.ts @@ -11,7 +11,6 @@ import embedNegative from '../../../core/discord/embedNegative'; import embedWarning from '../../../core/discord/embedWarning'; import normalizeInteractionReturnable from '../../../core/discord/normalizeInteractionReturnable'; import { psa } from '../../../core/discord/psa'; -import { handleError } from '../../error'; export default async function handleChatInputCommand( interaction: ChatInputCommandInteraction, @@ -55,6 +54,8 @@ export default async function handleChatInputCommand( .setStyle(ButtonStyle.Link), ); + console.error(interaction.commandName, error); + await interaction.editReply({ embeds: [ embedNegative( @@ -64,7 +65,5 @@ export default async function handleChatInputCommand( ], components: [actionRow], }); - - handleError(error as Error, interaction.commandName); } } diff --git a/src/events/interactionCreate/index.ts b/src/events/interactionCreate/index.ts index db65bf71d..4a7389abf 100644 --- a/src/events/interactionCreate/index.ts +++ b/src/events/interactionCreate/index.ts @@ -30,7 +30,7 @@ import { searchPlayersCommand } from '../../commands/searchPlayers'; import { searchTanksCommand } from '../../commands/searchTanks'; import { statsCommand } from '../../commands/stats'; import { todayCommand } from '../../commands/today'; -import { verifyCommand } from '../../commands/verify'; +import { verifyCommand } from '../../commands/link'; import getClientId from '../../core/node/getClientId'; import isDev from '../../core/node/isDev'; import { secrets } from '../../core/node/secrets'; diff --git a/yarn.lock b/yarn.lock index d85a8246c..a5eb64006 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1060,6 +1060,23 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== +"@prisma/client@^5.4.1": + version "5.4.1" + resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.4.1.tgz#f891d1bc2739d303afaf4406b673f57bf84b226c" + integrity sha512-xyD0DJ3gRNfLbPsC+YfMBBuLJtZKQfy1OD2qU/PZg+HKrr7SO+09174LMeTlWP0YF2wca9LxtVd4HnAiB5ketQ== + dependencies: + "@prisma/engines-version" "5.4.1-1.2f302df92bd8945e20ad4595a73def5b96afa54f" + +"@prisma/engines-version@5.4.1-1.2f302df92bd8945e20ad4595a73def5b96afa54f": + version "5.4.1-1.2f302df92bd8945e20ad4595a73def5b96afa54f" + resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-5.4.1-1.2f302df92bd8945e20ad4595a73def5b96afa54f.tgz#347534906f2a9d6fcf02aeeb911103c5ebfe4384" + integrity sha512-+nUQM/y8C+1GG5Ioeqcu6itFslCfxvQSAUVSMC9XM2G2Fcq0F4Afnp6m0pXF6X6iUBWen7jZBPmM9Qlq4Nr3/A== + +"@prisma/engines@5.4.1": + version "5.4.1" + resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-5.4.1.tgz#80b854c87ba30d02ce8df1578cc955ac1c97216a" + integrity sha512-vJTdY4la/5V3N7SFvWRmSMUh4mIQnyb/MNoDjzVbh9iLmEC+uEykj/1GPviVsorvfz7DbYSQC4RiwmlEpTEvGA== + "@radix-ui/colors@^2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@radix-ui/colors/-/colors-2.1.0.tgz#8aa6f233f68076a92c57db93d7235172e88fda44" @@ -3636,6 +3653,13 @@ pretty-ms@^8.0.0: dependencies: parse-ms "^3.0.0" +prisma@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/prisma/-/prisma-5.4.1.tgz#2abbd2ae446519654330d67acd81e7bafbac67a2" + integrity sha512-op9PmU8Bcw5dNAas82wBYTG0yHnpq9/O3bhxbDBrNzwZTwBqsVCxxYRLf6wHNh9HVaDGhgjjHlu1+BcW8qdnBg== + dependencies: + "@prisma/engines" "5.4.1" + proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" From 6dc7a10c2e6f7a3d4f2728e0b89fd74057df8619 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Tue, 10 Oct 2023 21:20:01 -0500 Subject: [PATCH 04/43] feat: completed link --- src/commands/link.ts | 98 ------- src/commands/link.tsx | 268 ++++++++++++++++++ .../components/WN8Display/components/Glow.tsx | 25 +- .../components/WN8Display/index.tsx | 6 +- src/components/Wrapper.tsx | 5 +- .../discord/normalizeInteractionReturnable.ts | 4 + src/events/interactionCreate/index.ts | 4 +- src/stitches.config.ts | 2 + 8 files changed, 294 insertions(+), 118 deletions(-) delete mode 100644 src/commands/link.ts create mode 100644 src/commands/link.tsx diff --git a/src/commands/link.ts b/src/commands/link.ts deleted file mode 100644 index e1ca47b5e..000000000 --- a/src/commands/link.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { SlashCommandBuilder } from 'discord.js'; -import { Region } from '../constants/regions'; -import { linkBlitzAndDiscord } from '../core/cockroackdb/discordBlitz'; -import addUsernameChoices from '../core/discord/addUsernameChoices'; -import autocompleteUsername from '../core/discord/autocompleteUsername'; -import embedNegative from '../core/discord/embedNegative'; -import { CommandRegistry } from '../events/interactionCreate'; - -const serverAndIdPattern = /(com|eu|asia)\/[0-9]+/; - -export const verifyCommand: CommandRegistry = { - inProduction: true, - inPublic: true, - - command: new SlashCommandBuilder() - .setName('link') - .setDescription('Links your Blitz and Discord account') - .addStringOption((option) => addUsernameChoices(option).setRequired(true)), - - async handler(interaction) { - // const blitzAccount = await resolvePlayerFromCommand(interaction); - // const { id, region: server } = blitzAccount; - // const accountInfo = await getWargamingResponse( - // `https://api.wotblitz.${server}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, - // ); - // const clanData = await getWargamingResponse( - // `https://api.wotblitz.${server}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}&extra=clan`, - // ); - // const clan = clanData[id]?.clan; - // const clanTag = clan ? ` [${clan!.tag}]` : ''; - // const member = - // interaction.member && - // interaction.guild?.members.cache.get(interaction.member?.user.id); - - // if (!interaction.guild?.members.me?.permissions.has('ManageNicknames')) { - // return embedNegative( - // `${markdownEscape(interaction.user.username)} failed to verify`, - // "I don't have the permission to change your nickname.", - // ); - // } - // if (!interaction.member || !member) { - // return embedNegative( - // `${interaction.user.username} is not in this server`, - // "I couldn't find this person in this server. Did they leave?", - // ); - // } - - // try { - // await member.setNickname(`${accountInfo[id].nickname}${clanTag}`); - - // if (interaction.guildId === discord.sklld_guild_id) { - // if (!interaction.guild?.members.me?.permissions.has('ManageRoles')) { - // return embedNegative( - // `${markdownEscape(interaction.user.username)} failed to verify`, - // "I don't have the permission to change your manage roles.", - // ); - // } - - // await member.roles.remove(discord.sklld_verify_role); - // await member.roles.add(discord.sklld_peasant_role); - // } - - // return embedPositive( - // `${interaction.user.username} is verified`, - // `The user is now verified as ${markdownEscape( - // accountInfo[id].nickname, - // )}${markdownEscape(clanTag)}`, - // ); - // } catch (error) { - // return embedNegative( - // `${interaction.user.username} failed to verify`, - // "I can't change your nickname because you have higher permissions than me. Try setting your nickname to your Blitz username manually.", - // ); - // } - - const username = interaction.options.getString('username', true); - - if (serverAndIdPattern.test(username)) { - const [region, idString] = username.split('/'); - const id = parseInt(idString); - const discordId = parseInt(interaction.user.id); - - await linkBlitzAndDiscord(discordId, region as Region, id); - - return 'success'; - } else { - return [ - embedNegative( - 'Please select from the options', - 'Click on the user you desire after the search results show up (like the image below).', - ), - 'https://i.imgur.com/ncJyV1F.png', - ]; - } - }, - - autocomplete: autocompleteUsername, -}; diff --git a/src/commands/link.tsx b/src/commands/link.tsx new file mode 100644 index 000000000..fc773c893 --- /dev/null +++ b/src/commands/link.tsx @@ -0,0 +1,268 @@ +import { teal } from '@radix-ui/colors'; +import { AttachmentBuilder, SlashCommandBuilder } from 'discord.js'; +import { Glow } from '../components/AllStatsOverview/components/WN8Display/components/Glow'; +import Wrapper from '../components/Wrapper'; +import { REGION_NAMES_SHORT, Region } from '../constants/regions'; +import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; +import getWargamingResponse from '../core/blitz/getWargamingResponse'; +import { linkBlitzAndDiscord } from '../core/cockroackdb/discordBlitz'; +import addUsernameChoices from '../core/discord/addUsernameChoices'; +import autocompleteUsername from '../core/discord/autocompleteUsername'; +import embedNegative from '../core/discord/embedNegative'; +import { CommandRegistry } from '../events/interactionCreate'; +import { theme } from '../stitches.config'; +import { AccountInfo } from '../types/accountInfo'; +import { PlayerClanData } from '../types/playerClanData'; + +const serverAndIdPattern = /(com|eu|asia)\/[0-9]+/; + +export const verifyCommand: CommandRegistry = { + inProduction: true, + inPublic: true, + + command: new SlashCommandBuilder() + .setName('link') + .setDescription('Links your Blitz and Discord account') + .addStringOption((option) => addUsernameChoices(option).setRequired(true)), + + async handler(interaction) { + // const blitzAccount = await resolvePlayerFromCommand(interaction); + // const { id, region: server } = blitzAccount; + // const accountInfo = await getWargamingResponse( + // `https://api.wotblitz.${server}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, + // ); + // const clanData = await getWargamingResponse( + // `https://api.wotblitz.${server}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}&extra=clan`, + // ); + // const clan = clanData[id]?.clan; + // const clanTag = clan ? ` [${clan!.tag}]` : ''; + // const member = + // interaction.member && + // interaction.guild?.members.cache.get(interaction.member?.user.id); + + // if (!interaction.guild?.members.me?.permissions.has('ManageNicknames')) { + // return embedNegative( + // `${markdownEscape(interaction.user.username)} failed to verify`, + // "I don't have the permission to change your nickname.", + // ); + // } + // if (!interaction.member || !member) { + // return embedNegative( + // `${interaction.user.username} is not in this server`, + // "I couldn't find this person in this server. Did they leave?", + // ); + // } + + // try { + // await member.setNickname(`${accountInfo[id].nickname}${clanTag}`); + + // if (interaction.guildId === discord.sklld_guild_id) { + // if (!interaction.guild?.members.me?.permissions.has('ManageRoles')) { + // return embedNegative( + // `${markdownEscape(interaction.user.username)} failed to verify`, + // "I don't have the permission to change your manage roles.", + // ); + // } + + // await member.roles.remove(discord.sklld_verify_role); + // await member.roles.add(discord.sklld_peasant_role); + // } + + // return embedPositive( + // `${interaction.user.username} is verified`, + // `The user is now verified as ${markdownEscape( + // accountInfo[id].nickname, + // )}${markdownEscape(clanTag)}`, + // ); + // } catch (error) { + // return embedNegative( + // `${interaction.user.username} failed to verify`, + // "I can't change your nickname because you have higher permissions than me. Try setting your nickname to your Blitz username manually.", + // ); + // } + + const username = interaction.options.getString('username', true); + + if (serverAndIdPattern.test(username)) { + const [region, idString] = username.split('/'); + const id = parseInt(idString); + const discordId = parseInt(interaction.user.id); + // const account = ( + // await getWargamingResponse( + // `https://api.wotblitz.${region}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, + // ) + // )[id]; + // const clan = await getWargamingResponse( + // `https://api.wotblitz.${region}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}&extra=clan`, + // ); + const [account, clan] = await Promise.all([ + getWargamingResponse( + `https://api.wotblitz.${region}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, + ), + getWargamingResponse( + `https://api.wotblitz.${region}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}&extra=clan`, + ), + ]); + + await linkBlitzAndDiscord(discordId, region as Region, id); + + return ( + +
+ + +
+
+ + +
+ + {interaction.user.displayName} + + + @{interaction.user.username} + +
+
+ +
+ + Accounts linked +
+ +
+ {clan[id]?.clan ? ( + + ) : null} +
+ + {account[id].nickname} + + + {clan[id]?.clan ? `[${clan[id]?.clan?.tag}] - ` : ''} + {REGION_NAMES_SHORT[region as Region]} + +
+
+
+ + +
+
+ ); + } else { + return [ + embedNegative( + 'Please select from the options', + 'Follow the procedure like the video above. The search results may take a while to show up.', + ), + new AttachmentBuilder('https://i.imgur.com/2p6GFgC.gif'), + ]; + } + }, + + autocomplete: autocompleteUsername, +}; diff --git a/src/components/AllStatsOverview/components/WN8Display/components/Glow.tsx b/src/components/AllStatsOverview/components/WN8Display/components/Glow.tsx index 44c1c21d5..b5a524067 100644 --- a/src/components/AllStatsOverview/components/WN8Display/components/Glow.tsx +++ b/src/components/AllStatsOverview/components/WN8Display/components/Glow.tsx @@ -1,31 +1,28 @@ -import { Percentile } from '../../../../../constants/percentiles'; -import { PERCENTILE_COLORS } from '../../../../PercentileIndicator'; - -export enum GlowSide { - Top, - Bottom, -} - export interface GlowProps { - percentile: Percentile; - side: GlowSide; + color: string; + direction?: 'default' | 'reverse'; + rotation?: number; } -export function Glow({ percentile, side }: GlowProps) { - const color = PERCENTILE_COLORS[percentile]; +export function Glow({ + color, + direction = 'default', + rotation = 0, +}: GlowProps) { const color1 = color; const color2 = `${color}00`; const background = `linear-gradient(${ - side === GlowSide.Top ? 0 : 180 + direction === 'default' ? 0 : 180 }deg, ${color1} 0%, ${color2} 100%)`; return (
diff --git a/src/components/AllStatsOverview/components/WN8Display/index.tsx b/src/components/AllStatsOverview/components/WN8Display/index.tsx index 4fd0da495..513d1efdf 100644 --- a/src/components/AllStatsOverview/components/WN8Display/index.tsx +++ b/src/components/AllStatsOverview/components/WN8Display/index.tsx @@ -2,7 +2,7 @@ import { Percentile } from '../../../../constants/percentiles'; import getWN8Percentile from '../../../../core/blitz/getWN8Percentile'; import { theme } from '../../../../stitches.config'; import { PERCENTILE_COLORS } from '../../../PercentileIndicator'; -import { Glow, GlowSide } from './components/Glow'; +import { Glow } from './components/Glow'; export interface WN8DisplayProps { WN8?: number; @@ -37,7 +37,7 @@ export function WN8Display({ WN8 }: WN8DisplayProps) { gap: -16, }} > - +
- +
); } diff --git a/src/components/Wrapper.tsx b/src/components/Wrapper.tsx index ce3aad029..0af54719e 100644 --- a/src/components/Wrapper.tsx +++ b/src/components/Wrapper.tsx @@ -4,15 +4,16 @@ import { theme } from '../stitches.config'; export interface WrapperProps { children: ReactNode; naked?: boolean; + fat?: boolean; } -export default function Wrapper({ children, naked }: WrapperProps) { +export default function Wrapper({ children, naked, fat }: WrapperProps) { return (
).addComponents( item, ); + } else if (item instanceof AttachmentBuilder) { + if (!reply.files) reply.files = []; + reply.files.push(item); } else { const image = await jsxToPng(item); if (!reply.files) reply.files = []; diff --git a/src/events/interactionCreate/index.ts b/src/events/interactionCreate/index.ts index 4a7389abf..dea18f7f5 100644 --- a/src/events/interactionCreate/index.ts +++ b/src/events/interactionCreate/index.ts @@ -1,4 +1,5 @@ import { + AttachmentBuilder, AutocompleteInteraction, ButtonBuilder, ButtonInteraction, @@ -20,6 +21,7 @@ import { eligibleCommand } from '../../commands/eligible'; import { evolutionCommand } from '../../commands/evolution'; import { fullStatsCommand } from '../../commands/fullStats'; import { inactiveCommand } from '../../commands/inactive'; +import { verifyCommand } from '../../commands/link'; import { ownedTanksCommand } from '../../commands/ownedTanks'; import { pingCommand } from '../../commands/ping'; import { playerAchievementsCommand } from '../../commands/playerAchievements'; @@ -30,7 +32,6 @@ import { searchPlayersCommand } from '../../commands/searchPlayers'; import { searchTanksCommand } from '../../commands/searchTanks'; import { statsCommand } from '../../commands/stats'; import { todayCommand } from '../../commands/today'; -import { verifyCommand } from '../../commands/link'; import getClientId from '../../core/node/getClientId'; import isDev from '../../core/node/isDev'; import { secrets } from '../../core/node/secrets'; @@ -42,6 +43,7 @@ export type InteractionRawReturnable = | string | EmbedBuilder | ButtonBuilder + | AttachmentBuilder | JSX.Element; export type InteractionIterableReturnable = | InteractionRawReturnable diff --git a/src/stitches.config.ts b/src/stitches.config.ts index 1d8327ba3..f8f9a2a92 100644 --- a/src/stitches.config.ts +++ b/src/stitches.config.ts @@ -3,6 +3,7 @@ import { blueDark, slate, slateDark, + tealDark, tomatoDark, } from '@radix-ui/colors'; import { createBorderStyles, createColors, createSpaces } from 'bepaint'; @@ -18,6 +19,7 @@ export const theme = { ...createColors(amberDark, 'amber'), ...createColors(blueDark, 'blue'), ...createColors(tomatoDark, 'red'), + ...createColors(tealDark, 'teal'), }, borderStyles: { From 97cc9509c06a493454143f1d9239b28e4616b849 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Tue, 10 Oct 2023 21:33:11 -0500 Subject: [PATCH 05/43] feat: updated welcome message --- src/events/guildMemberAdd.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/events/guildMemberAdd.ts b/src/events/guildMemberAdd.ts index a8182b3a4..a34372d01 100644 --- a/src/events/guildMemberAdd.ts +++ b/src/events/guildMemberAdd.ts @@ -1,4 +1,9 @@ -import { EmbedBuilder, GuildMember, TextChannel } from 'discord.js'; +import { + AttachmentBuilder, + EmbedBuilder, + GuildMember, + TextChannel, +} from 'discord.js'; import discord from '../../discord.json' assert { type: 'json' }; import { ACCENT_COLOR } from '../constants/colors'; @@ -15,9 +20,10 @@ export default async function (member: GuildMember) { .setColor(ACCENT_COLOR) .setTitle(`Welcome ${member.user.username}`) .setDescription( - `Welcome to the Skilled server, **${member.user.username}**! To continue, please use the \`/verify\` command.\n\nExample: \`/verify Sabina244\``, + `Welcome to the Skilled server, **${member.user.username}**! To continue, please use the \`/link\` command.`, ), ], + files: [new AttachmentBuilder('https://i.imgur.com/2p6GFgC.gif')], }); console.log(`${member.user.tag} joined`); From be644bb3d9736392703def0b31d42ab36a83c983 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Tue, 10 Oct 2023 21:37:17 -0500 Subject: [PATCH 06/43] feat: refined welcome --- src/events/guildMemberAdd.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/events/guildMemberAdd.ts b/src/events/guildMemberAdd.ts index a34372d01..ad798295f 100644 --- a/src/events/guildMemberAdd.ts +++ b/src/events/guildMemberAdd.ts @@ -4,6 +4,7 @@ import { GuildMember, TextChannel, } from 'discord.js'; +import markdownEscape from 'markdown-escape'; import discord from '../../discord.json' assert { type: 'json' }; import { ACCENT_COLOR } from '../constants/colors'; @@ -18,14 +19,12 @@ export default async function (member: GuildMember) { embeds: [ new EmbedBuilder() .setColor(ACCENT_COLOR) - .setTitle(`Welcome ${member.user.username}`) + .setTitle(`Welcome, ${markdownEscape(member.user.displayName)}`) .setDescription( - `Welcome to the Skilled server, **${member.user.username}**! To continue, please use the \`/link\` command.`, + `Welcome to the Skilled server! To continue, please use the \`/link\` command.`, ), ], files: [new AttachmentBuilder('https://i.imgur.com/2p6GFgC.gif')], }); - - console.log(`${member.user.tag} joined`); } } From f965452c5d10219bf4dd2880aa131e2ca0f7b9c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Tue, 10 Oct 2023 21:45:00 -0500 Subject: [PATCH 07/43] feat: re-added manual username entry --- src/core/discord/resolvePlayerFromCommand.ts | 45 +++++++++++++++++--- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/src/core/discord/resolvePlayerFromCommand.ts b/src/core/discord/resolvePlayerFromCommand.ts index 4958bee03..0b34a317f 100644 --- a/src/core/discord/resolvePlayerFromCommand.ts +++ b/src/core/discord/resolvePlayerFromCommand.ts @@ -1,5 +1,7 @@ import { CacheType, ChatInputCommandInteraction } from 'discord.js'; +import markdownEscape from 'markdown-escape'; import { Region } from '../../constants/regions'; +import listPlayers from '../blitz/listPlayers'; import { getBlitzFromDiscord } from '../cockroackdb/discordBlitz'; import throwError from '../node/throwError'; @@ -13,14 +15,43 @@ export interface ResolvedPlayer { export default async function resolvePlayerFromCommand( interaction: ChatInputCommandInteraction, ) { - const account = await getBlitzFromDiscord(parseInt(interaction.user.id)); + const commandUsername = interaction.options.getString('username'); - if (account) { - return { region: account.region, id: account.blitz }; + if (commandUsername) { + if (serverAndIdPattern.test(commandUsername)) { + const [server, accountId] = commandUsername.split('/'); + + return { + region: server as Region, + id: Number(accountId), + } satisfies ResolvedPlayer; + } else { + const accounts = await listPlayers(commandUsername); + + if (accounts[0]) { + return { + region: accounts[0].region, + id: accounts[0].account_id, + } satisfies ResolvedPlayer; + } else { + throw throwError( + 'Could not find user', + `I couldn't find user "${markdownEscape( + commandUsername, + )}". Try picking an user from the search result, typing in a valid username, or using the \`/link\` command.`, + ); + } + } } else { - throw throwError( - "You're not linked", - 'Use the `/link` command to link your Discord and Blitz accounts.', - ); + const account = await getBlitzFromDiscord(parseInt(interaction.user.id)); + + if (account) { + return { region: account.region, id: account.blitz }; + } else { + throw throwError( + "You're not linked", + 'Use the `/link` command to link your Discord and Blitz accounts.', + ); + } } } From 78e4c82f20ba5bc692bb4f312e5d964105644016 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Wed, 11 Oct 2023 18:26:35 -0500 Subject: [PATCH 08/43] feat: simpler subcommands --- src/commands/eligible.ts | 2 +- src/commands/evolution.tsx | 7 +- src/commands/fullStats.tsx | 6 +- src/commands/stats.tsx | 162 +++++++++-------- src/commands/today.tsx | 2 +- src/components/Tanks/components/Item.tsx | 11 +- src/components/TitleBar.tsx | 24 +-- src/constants/cyclic.ts | 1 - src/core/blitz/filterStats.ts | 79 ++++++++ src/core/blitz/tankopedia.ts | 13 +- src/core/blitzkrieg/filtersToDescription.ts | 23 +++ .../blitzstars/getBlitzStarsLinkButton.ts | 18 ++ src/core/blitzstars/getDiffedTankStats.ts | 45 +++-- src/core/blitzstars/getPeriodStart.ts | 4 +- src/core/discord/addPeriodSubCommands.ts | 51 ++---- .../discord/addStatTypeSubCommandGroups.ts | 127 ++++++------- src/core/discord/interactionToURL.ts | 8 +- src/core/discord/refreshButton.ts | 16 ++ src/core/discord/resolvePeriodFromButton.ts | 6 +- src/core/discord/resolvePeriodFromCommand.ts | 30 ++- src/core/discord/resolvePeriodFromURL.ts | 30 +-- src/core/discord/resolvePlayerFromButton.ts | 3 +- .../interactionCreate/handlers/button.tsx | 3 +- .../handlers/chatInputCommand.ts | 1 - src/events/interactionCreate/index.ts | 3 +- src/renderers/fullStats.tsx | 9 +- src/renderers/stats.tsx | 172 ------------------ src/renderers/today.tsx | 2 +- 28 files changed, 397 insertions(+), 461 deletions(-) delete mode 100644 src/constants/cyclic.ts create mode 100644 src/core/blitz/filterStats.ts create mode 100644 src/core/blitzkrieg/filtersToDescription.ts create mode 100644 src/core/blitzstars/getBlitzStarsLinkButton.ts create mode 100644 src/core/discord/refreshButton.ts delete mode 100644 src/renderers/stats.tsx diff --git a/src/commands/eligible.ts b/src/commands/eligible.ts index bd89200d5..9f31732d4 100644 --- a/src/commands/eligible.ts +++ b/src/commands/eligible.ts @@ -58,7 +58,7 @@ export const eligibleCommand: CommandRegistry = { let body = ''; if (clan === 'SKLLD') { - const { diffed } = await getDiffedTankStats( + const { diff: diffed } = await getDiffedTankStats( server, id, getTimeDaysAgo(server, 30), diff --git a/src/commands/evolution.tsx b/src/commands/evolution.tsx index 1b39ef3b9..1de62cce2 100644 --- a/src/commands/evolution.tsx +++ b/src/commands/evolution.tsx @@ -1,9 +1,9 @@ import { SlashCommandBuilder } from 'discord.js'; -import { CYCLIC_API } from '../constants/cyclic'; import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; import getWargamingResponse from '../core/blitz/getWargamingResponse'; import resolveTankId from '../core/blitz/resolveTankId'; import addStatTypeSubCommandGroups from '../core/discord/addStatTypeSubCommandGroups'; +import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteTanks from '../core/discord/autocompleteTanks'; import autocompleteUsername from '../core/discord/autocompleteUsername'; import interactionToURL from '../core/discord/interactionToURL'; @@ -24,7 +24,7 @@ export const evolutionCommand = new Promise( new SlashCommandBuilder() .setName('evolution') .setDescription('Evolution of statistics'), - false, + (option) => option.addStringOption(addUsernameChoices), ); resolve({ @@ -59,7 +59,6 @@ export const evolutionCommand = new Promise( return [ await evolution(commandGroup, period, player, tankId), primaryButton(path, 'Refresh'), - // linkButton(`${CYCLIC_API}/${path}`, 'Embed'), linkButton( `https://www.blitzstars.com/player/${player.region}/${nickname}${ commandGroup === 'tank' ? `/tank/${tankId!}` : '' @@ -75,7 +74,7 @@ export const evolutionCommand = new Promise( }, async button(interaction) { - const url = new URL(`${CYCLIC_API}/${interaction.customId}`); + const url = new URL(`https://example.com/${interaction.customId}`); const path = url.pathname.split('/').filter(Boolean); const commandGroup = path[1] as StatType; const player = await resolvePlayerFromButton(interaction); diff --git a/src/commands/fullStats.tsx b/src/commands/fullStats.tsx index d1c10afb7..2350d7fc3 100644 --- a/src/commands/fullStats.tsx +++ b/src/commands/fullStats.tsx @@ -1,10 +1,10 @@ import { SlashCommandBuilder } from 'discord.js'; import { TreeTypeString } from '../components/Tanks'; -import { CYCLIC_API } from '../constants/cyclic'; import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; import getWargamingResponse from '../core/blitz/getWargamingResponse'; import resolveTankId from '../core/blitz/resolveTankId'; import addStatTypeSubCommandGroups from '../core/discord/addStatTypeSubCommandGroups'; +import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteTanks from '../core/discord/autocompleteTanks'; import autocompleteUsername from '../core/discord/autocompleteUsername'; import interactionToURL from '../core/discord/interactionToURL'; @@ -25,6 +25,7 @@ export const fullStatsCommand = new Promise( new SlashCommandBuilder() .setName('full-stats') .setDescription('Full in-game statistics'), + (option) => option.addStringOption(addUsernameChoices), ); resolve({ @@ -82,7 +83,6 @@ export const fullStatsCommand = new Promise( : null, ), primaryButton(path, 'Refresh'), - // linkButton(`${CYCLIC_API}/${path}`, 'Embed'), linkButton( `https://www.blitzstars.com/player/${player.region}/${nickname}`, 'BlitzStars', @@ -96,7 +96,7 @@ export const fullStatsCommand = new Promise( }, async button(interaction) { - const url = new URL(`${CYCLIC_API}/${interaction.customId}`); + const url = new URL(`https://example.com/${interaction.customId}`); const path = url.pathname.split('/').filter(Boolean); const commandGroup = path[1] as StatType; const player = await resolvePlayerFromButton(interaction); diff --git a/src/commands/stats.tsx b/src/commands/stats.tsx index 60f1dcc9c..fd1916db2 100644 --- a/src/commands/stats.tsx +++ b/src/commands/stats.tsx @@ -1,28 +1,77 @@ import { SlashCommandBuilder } from 'discord.js'; +import AllStatsOverview from '../components/AllStatsOverview'; +import NoData, { NoDataType } from '../components/NoData'; import { TreeTypeString } from '../components/Tanks'; -import { CYCLIC_API } from '../constants/cyclic'; +import TitleBar from '../components/TitleBar'; +import Wrapper from '../components/Wrapper'; import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; +import { StatFilters, filterStats } from '../core/blitz/filterStats'; import getWargamingResponse from '../core/blitz/getWargamingResponse'; -import resolveTankId from '../core/blitz/resolveTankId'; +import { filtersToDescription } from '../core/blitzkrieg/filtersToDescription'; +import { getBlitzStarsLinkButton } from '../core/blitzstars/getBlitzStarsLinkButton'; +import getDiffedTankStats from '../core/blitzstars/getDiffedTankStats'; +import { PeriodType } from '../core/discord/addPeriodSubCommands'; import addStatTypeSubCommandGroups from '../core/discord/addStatTypeSubCommandGroups'; +import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteTanks from '../core/discord/autocompleteTanks'; import autocompleteUsername from '../core/discord/autocompleteUsername'; import interactionToURL from '../core/discord/interactionToURL'; -import linkButton from '../core/discord/linkButton'; -import primaryButton from '../core/discord/primaryButton'; +import { refreshButton } from '../core/discord/refreshButton'; import resolvePeriodFromButton from '../core/discord/resolvePeriodFromButton'; -import resolvePeriodFromCommand from '../core/discord/resolvePeriodFromCommand'; +import resolvePeriodFromCommand, { + ResolvedPeriod, +} from '../core/discord/resolvePeriodFromCommand'; import resolvePlayerFromButton from '../core/discord/resolvePlayerFromButton'; -import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand'; +import resolvePlayerFromCommand, { + ResolvedPlayer, +} from '../core/discord/resolvePlayerFromCommand'; import { CommandRegistryRaw } from '../events/interactionCreate'; -import stats, { MultiTankFilters, StatType } from '../renderers/stats'; import { AccountInfo } from '../types/accountInfo'; +import { PlayerClanData } from '../types/playerClanData'; + +export default async function render( + { region, id }: ResolvedPlayer, + { start, end, name: statsName }: ResolvedPeriod, + filters: StatFilters, +) { + const nickname = ( + await getWargamingResponse( + `https://api.wotblitz.${region}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, + ) + )[id].nickname; + const clan = ( + await getWargamingResponse( + `https://api.wotblitz.${region}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}&extra=clan`, + ) + )[id]?.clan; + const clanImage = clan + ? `https://wotblitz-gc.gcdn.co/icons/clanEmblems1x/clan-icon-v2-${clan.emblem_set_id}.png` + : undefined; + const diffedTankStats = await getDiffedTankStats(region, id, start, end); + const { stats, supplementary } = await filterStats(diffedTankStats, filters); + + return ( + + + + {!stats?.battles && } + {stats?.battles > 0 && ( + + )} + + ); +} export const statsCommand = new Promise(async (resolve) => { const command = await addStatTypeSubCommandGroups( new SlashCommandBuilder() .setName('stats') .setDescription('Regular battles statistics'), + (option) => option.addStringOption(addUsernameChoices), ); resolve({ @@ -32,59 +81,38 @@ export const statsCommand = new Promise(async (resolve) => { command, async handler(interaction) { - const commandGroup = interaction.options.getSubcommandGroup( - true, - ) as StatType; - const player = await resolvePlayerFromCommand(interaction); + const resolvedPlayer = await resolvePlayerFromCommand(interaction); const resolvedPeriod = resolvePeriodFromCommand( - player.region, + resolvedPlayer.region, interaction, ); - const period = interaction.options.getString('period'); - const tankIdRaw = interaction.options.getString('tank')!; - const tankId = - commandGroup === 'tank' ? await resolveTankId(tankIdRaw) : null; - const start = interaction.options.getInteger('start'); - const end = interaction.options.getInteger('end'); + const filters = { + nation: interaction.options.getString('nation') ?? undefined, + tier: + parseInt(interaction.options.getString('tier') ?? '0') || undefined, + tankType: interaction.options.getString('tank-type') ?? undefined, + treeType: + (interaction.options.getString('tree-type') as + | TreeTypeString + | undefined) ?? undefined, + tank: + parseInt(interaction.options.getString('tank') ?? '0') || undefined, + } satisfies StatFilters; const path = interactionToURL(interaction, { - ...player, - tankId, - start, - end, - period, + ...resolvedPlayer, + ...((interaction.options.getSubcommand() as PeriodType) === 'custom' + ? { + start: interaction.options.getInteger('start', true), + end: interaction.options.getInteger('end', true), + } + : undefined), + ...filters, }); - const { nickname } = ( - await getWargamingResponse( - `https://api.wotblitz.${player.region}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${player.id}`, - ) - )[player.id]; - - const tierOption = interaction.options.getString('tier'); return [ - await stats( - commandGroup, - resolvedPeriod, - player, - commandGroup === 'tank' - ? tankId - : commandGroup === 'multi-tank' - ? ({ - 'tank-type': - interaction.options.getString('tank-type') ?? undefined, - nation: interaction.options.getString('nation') ?? undefined, - tier: tierOption ? parseInt(tierOption) : undefined, - 'tree-type': (interaction.options.getString('tree-type') ?? - undefined) as TreeTypeString | undefined, - } satisfies Partial) - : null, - ), - primaryButton(path, 'Refresh'), - // linkButton(`${CYCLIC_API}/${path}`, 'Embed'), - linkButton( - `https://www.blitzstars.com/player/${player.region}/${nickname}`, - 'BlitzStars', - ), + await render(resolvedPlayer, resolvedPeriod, filters), + refreshButton(interaction, path), + await getBlitzStarsLinkButton(resolvedPlayer.region, resolvedPlayer.id), ]; }, @@ -94,27 +122,19 @@ export const statsCommand = new Promise(async (resolve) => { }, async button(interaction) { - const url = new URL(`${CYCLIC_API}/${interaction.customId}`); - const path = url.pathname.split('/').filter(Boolean); - const commandGroup = path[1] as StatType; + const url = new URL(`https://example.com${interaction.customId}`); const player = await resolvePlayerFromButton(interaction); const period = resolvePeriodFromButton(player.region, interaction); - return await stats( - commandGroup, - period, - player, - commandGroup === 'tank' - ? parseInt(url.searchParams.get('tankId')!) - : commandGroup === 'multi-tank' - ? ({ - 'tank-type': url.searchParams.get('tank-type')!, - nation: url.searchParams.get('nation')!, - tier: parseInt(url.searchParams.get('tier')!), - 'tree-type': url.searchParams.get('tree-type') as TreeTypeString, - } satisfies MultiTankFilters) - : null, - ); + return await render(player, period, { + nation: url.searchParams.get('nation') ?? undefined, + tank: parseInt(url.searchParams.get('tank') ?? '0') || undefined, + tankType: url.searchParams.get('tank-type') ?? undefined, + treeType: + (url.searchParams.get('tree-type') as TreeTypeString | undefined) ?? + undefined, + tier: parseInt(url.searchParams.get('tier') ?? '0') || undefined, + }); }, }); }); diff --git a/src/commands/today.tsx b/src/commands/today.tsx index 48d658056..f1b77309e 100644 --- a/src/commands/today.tsx +++ b/src/commands/today.tsx @@ -65,7 +65,7 @@ export const todayCommand: CommandRegistry = { return [ await today(player, cutoff, maximized, showTotal, false), primaryButton(path, 'Refresh'), - // linkButton(`${CYCLIC_API}/${path}`, 'Embed'), + // linkButton(`https://example.com/${path}`, 'Embed'), linkButton( `https://www.blitzstars.com/player/${player.region}/${nickname}`, 'BlitzStars', diff --git a/src/components/Tanks/components/Item.tsx b/src/components/Tanks/components/Item.tsx index 4aa2e77ea..ae680fc26 100644 --- a/src/components/Tanks/components/Item.tsx +++ b/src/components/Tanks/components/Item.tsx @@ -2,7 +2,6 @@ import { TANK_ICONS, TANK_ICONS_COLLECTOR, TANK_ICONS_PREMIUM, - TankType, } from '../../../core/blitz/tankopedia'; import { theme } from '../../../stitches.config'; @@ -12,11 +11,17 @@ export enum TreeTypeEnum { Collector, } -export type TreeTypeString = 'techtree' | 'premium' | 'collector'; +export type TreeTypeString = 'tech-tree' | 'premium' | 'collector'; + +export const TREE_TYPE_NAMES: Record = { + 'tech-tree': 'Tech tree', + premium: 'Premium', + collector: 'Collector', +}; export interface ItemProps { image?: string; - tankType?: TankType; + tankType?: string; name: string; treeType: TreeTypeEnum; } diff --git a/src/components/TitleBar.tsx b/src/components/TitleBar.tsx index 277ec1c38..b3e4da675 100644 --- a/src/components/TitleBar.tsx +++ b/src/components/TitleBar.tsx @@ -2,17 +2,11 @@ import { theme } from '../stitches.config'; export interface TitleBarProps { name: string; - nameDiscriminator?: string; image?: string; description?: string; } -export default function TitleBar({ - name, - nameDiscriminator, - image, - description, -}: TitleBarProps) { +export default function TitleBar({ name, image, description }: TitleBarProps) { return (
@@ -51,24 +44,11 @@ export default function TitleBar({ color: theme.colors.textHighContrast, fontWeight: 900, whiteSpace: 'nowrap', - maxWidth: nameDiscriminator === undefined ? Infinity : 240, overflow: 'hidden', }} > {name} - {nameDiscriminator && ( - - {nameDiscriminator} - - )}
diff --git a/src/constants/cyclic.ts b/src/constants/cyclic.ts deleted file mode 100644 index 4543b432e..000000000 --- a/src/constants/cyclic.ts +++ /dev/null @@ -1 +0,0 @@ -export const CYCLIC_API = 'https://blitzkrieg-embeds.cyclic.app'; diff --git a/src/core/blitz/filterStats.ts b/src/core/blitz/filterStats.ts new file mode 100644 index 000000000..149d2cd3b --- /dev/null +++ b/src/core/blitz/filterStats.ts @@ -0,0 +1,79 @@ +// BIG TODO: reorganize code folder + +import { TreeTypeString } from '../../components/Tanks'; +import { DiffedTankStats } from '../blitzstars/getDiffedTankStats'; +import { tankAverages } from '../blitzstars/tankAverages'; +import calculateWN8 from './calculateWN8'; +import sumStats from './sumStats'; +import { tankopedia } from './tankopedia'; + +export interface StatFilters { + nation?: string; + tier?: number; + tankType?: string; + treeType?: TreeTypeString; + tank?: number; +} + +export async function filterStats( + { diff, order }: DiffedTankStats, + filters: StatFilters, +) { + // tank, if provided, takes priority over all other filters + if (filters.tank) filters = { tank: filters.tank }; + + const awaitedTankopedia = await tankopedia; + const awaitedTankAverages = await tankAverages; + const filteredOrder = order.filter((id) => { + const entry = awaitedTankopedia[id]; + + return ( + entry && + (filters.nation === undefined || entry.nation === filters.nation) && + (filters.tier === undefined || entry.tier === filters.tier) && + (filters.tankType === undefined || entry.type === filters.tankType) && + (filters.treeType === undefined || + (filters.treeType === 'collector' && entry.is_collectible) || + (filters.treeType === 'premium' && + entry.is_premium && + !entry.is_collectible) || + (filters.treeType === 'tech-tree' && + !entry.is_collectible && + !entry.is_premium)) && + (filters.tank === undefined || entry.tank_id === filters.tank) + ); + }); + const stats = sumStats(filteredOrder.map((id) => diff[id])); + const battlesOfTanksWithAverages = filteredOrder.reduce( + (accumulator, id) => + awaitedTankAverages[id] ? accumulator + diff[id].battles : accumulator, + 0, + ); + const battlesOfTanksWithTankopediaEntry = filteredOrder.reduce( + (accumulator, id) => + awaitedTankopedia[id] ? accumulator + diff[id].battles : accumulator, + 0, + ); + const supplementary = { + WN8: + filteredOrder.reduce( + (accumulator, id) => + awaitedTankAverages[id] + ? accumulator + + calculateWN8(awaitedTankAverages[id].all, diff[id]) * + diff[id].battles + : accumulator, + 0, + ) / battlesOfTanksWithAverages, + tier: + filteredOrder.reduce( + (accumulator, id) => + awaitedTankopedia[id] + ? accumulator + awaitedTankopedia[id]!.tier * diff[id].battles + : accumulator, + 0, + ) / battlesOfTanksWithTankopediaEntry, + }; + + return { stats, supplementary }; +} diff --git a/src/core/blitz/tankopedia.ts b/src/core/blitz/tankopedia.ts index 77e84b852..9eeb6b41f 100644 --- a/src/core/blitz/tankopedia.ts +++ b/src/core/blitz/tankopedia.ts @@ -2,8 +2,7 @@ import { deburr } from 'lodash'; import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; import { context } from '../blitzkrieg/context'; import getWargamingResponse from './getWargamingResponse'; - -export type TankType = 'AT-SPG' | 'lightTank' | 'mediumTank' | 'heavyTank'; +import { TreeTypeString } from '../../components/Tanks'; export interface TankopediaEntry { name: string; @@ -14,10 +13,10 @@ export interface TankopediaEntry { cost: { price_credit: number; price_gold: number }; images: { preview: string; normal: string }; tank_id: number; - type: TankType; + type: string; description: string; } - +type asd = TreeTypeString export interface Tankopedia { [id: number]: TankopediaEntry | undefined; } @@ -77,21 +76,21 @@ export const tankopediaInfo = getWargamingResponse( ); console.log('Cached tankopedia info'); -export const TANK_ICONS: Record = { +export const TANK_ICONS: Record = { 'AT-SPG': 'https://i.imgur.com/BIHSEH0.png', lightTank: 'https://i.imgur.com/CSNha5V.png', mediumTank: 'https://i.imgur.com/wvf3ltm.png', heavyTank: 'https://i.imgur.com/ECeqlZa.png', }; -export const TANK_ICONS_PREMIUM: Record = { +export const TANK_ICONS_PREMIUM: Record = { 'AT-SPG': 'https://i.imgur.com/TCu3EdR.png', lightTank: 'https://i.imgur.com/zdkpTRb.png', mediumTank: 'https://i.imgur.com/3z7eHX6.png', heavyTank: 'https://i.imgur.com/P3vbmyA.png', }; -export const TANK_ICONS_COLLECTOR: Record = { +export const TANK_ICONS_COLLECTOR: Record = { 'AT-SPG': 'https://i.imgur.com/WTjeirB.png', lightTank: 'https://i.imgur.com/EwhtKkU.png', mediumTank: 'https://i.imgur.com/u8YDMBh.png', diff --git a/src/core/blitzkrieg/filtersToDescription.ts b/src/core/blitzkrieg/filtersToDescription.ts new file mode 100644 index 000000000..fd3f0da2c --- /dev/null +++ b/src/core/blitzkrieg/filtersToDescription.ts @@ -0,0 +1,23 @@ +import { TREE_TYPE_NAMES } from '../../components/Tanks'; +import { StatFilters } from '../blitz/filterStats'; +import resolveTankName from '../blitz/resolveTankName'; +import { TIER_ROMAN_NUMERALS, Tier, tankopediaInfo } from '../blitz/tankopedia'; + +export async function filtersToDescription({ + nation, + tier, + tankType, + treeType, + tank, +}: StatFilters) { + const awaitedTankopediaInfo = await tankopediaInfo; + const info: string[] = []; + + if (tank) return await resolveTankName(tank); + if (nation) info.push(awaitedTankopediaInfo.vehicle_nations[nation]); + if (tier) info.push(`Tier ${TIER_ROMAN_NUMERALS[tier as Tier]}`); + if (tankType) info.push(awaitedTankopediaInfo.vehicle_types[tankType]); + if (treeType) info.push(TREE_TYPE_NAMES[treeType]); + + return info.length === 0 ? 'No filters' : info.join(', '); +} diff --git a/src/core/blitzstars/getBlitzStarsLinkButton.ts b/src/core/blitzstars/getBlitzStarsLinkButton.ts new file mode 100644 index 000000000..41817944c --- /dev/null +++ b/src/core/blitzstars/getBlitzStarsLinkButton.ts @@ -0,0 +1,18 @@ +import { Region } from '../../constants/regions'; +import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; +import { AccountInfo } from '../../types/accountInfo'; +import getWargamingResponse from '../blitz/getWargamingResponse'; +import linkButton from '../discord/linkButton'; + +export async function getBlitzStarsLinkButton(region: Region, id: number) { + const { nickname } = ( + await getWargamingResponse( + `https://api.wotblitz.${region}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, + ) + )[id]; + + return linkButton( + `https://www.blitzstars.com/player/${region}/${nickname}`, + 'BlitzStars', + ); +} diff --git a/src/core/blitzstars/getDiffedTankStats.ts b/src/core/blitzstars/getDiffedTankStats.ts index ccf0f2099..512a52692 100644 --- a/src/core/blitzstars/getDiffedTankStats.ts +++ b/src/core/blitzstars/getDiffedTankStats.ts @@ -34,6 +34,11 @@ export const emptyTankHistoryNode: TankHistoryRaw = { all: emptyAllStats, }; +export interface DiffedTankStats { + diff: Record; + order: number[]; +} + // BIG TODO: merge this neatly with diffNormalizedTankStats export default async function getDiffedTankStats( server: Region, @@ -66,7 +71,7 @@ export default async function getDiffedTankStats( const playedTanks: number[] = []; // fetch history node right before "start" and right before "end" - const diffed: Record = {}; + const diff: Record = {}; inRangeTanks.forEach((tankId) => { const sortedHistory = tankSortedHistory[tankId]; const previousIndex = @@ -77,30 +82,30 @@ export default async function getDiffedTankStats( const latest = sortedHistory[latestIndex] ?? sortedHistory[sortedHistory.length - 1]; - function diff(get: (allStats: AllStats) => number) { + function d(get: (allStats: AllStats) => number) { return get(latest.all) - get(previous.all); } // check if there was a change in battles as games in ratings do update last_battle_time - if (diff((a) => a.battles) > 0) { - diffed[tankId] = { - battles: diff((a) => a.battles), - capture_points: diff((a) => a.capture_points), - damage_dealt: diff((a) => a.damage_dealt), - damage_received: diff((a) => a.damage_received), - dropped_capture_points: diff((a) => a.dropped_capture_points), - frags: diff((a) => a.frags), - frags8p: diff((a) => a.frags8p), - hits: diff((a) => a.hits), - losses: diff((a) => a.losses), + if (d((a) => a.battles) > 0) { + diff[tankId] = { + battles: d((a) => a.battles), + capture_points: d((a) => a.capture_points), + damage_dealt: d((a) => a.damage_dealt), + damage_received: d((a) => a.damage_received), + dropped_capture_points: d((a) => a.dropped_capture_points), + frags: d((a) => a.frags), + frags8p: d((a) => a.frags8p), + hits: d((a) => a.hits), + losses: d((a) => a.losses), max_frags: latest.all.max_frags, max_xp: latest.all.max_xp, - shots: diff((a) => a.shots), - spotted: diff((a) => a.spotted), - survived_battles: diff((a) => a.survived_battles), - win_and_survived: diff((a) => a.win_and_survived), - wins: diff((a) => a.wins), - xp: diff((a) => a.xp), + shots: d((a) => a.shots), + spotted: d((a) => a.spotted), + survived_battles: d((a) => a.survived_battles), + win_and_survived: d((a) => a.win_and_survived), + wins: d((a) => a.wins), + xp: d((a) => a.xp), }; playedTanks.push(tankId); @@ -116,5 +121,5 @@ export default async function getDiffedTankStats( return bLatest.last_battle_time - aLatest.last_battle_time; }); - return { diffed, order }; + return { diff, order } satisfies DiffedTankStats; } diff --git a/src/core/blitzstars/getPeriodStart.ts b/src/core/blitzstars/getPeriodStart.ts index 118084a35..b60c19307 100644 --- a/src/core/blitzstars/getPeriodStart.ts +++ b/src/core/blitzstars/getPeriodStart.ts @@ -3,5 +3,7 @@ import { PeriodSize } from '../discord/addPeriodSubCommands'; import getTimeDaysAgo from './getTimeDaysAgo'; export default function getPeriodStart(region: Region, period: PeriodSize) { - return period === 'career' ? 0 : getTimeDaysAgo(region, parseInt(period)); + if (period === 'career') return 0; + if (period === 'today') return getTimeDaysAgo(region, 1); + return getTimeDaysAgo(region, parseInt(period)); } diff --git a/src/core/discord/addPeriodSubCommands.ts b/src/core/discord/addPeriodSubCommands.ts index cd28a4c4b..b8ca9c488 100644 --- a/src/core/discord/addPeriodSubCommands.ts +++ b/src/core/discord/addPeriodSubCommands.ts @@ -1,55 +1,42 @@ -import { - SlashCommandSubcommandBuilder, - SlashCommandSubcommandGroupBuilder, -} from 'discord.js'; +import { SlashCommandBuilder, SlashCommandSubcommandBuilder } from 'discord.js'; -export type PeriodType = 'period' | 'custom'; -export type PeriodSize = `${number}` | 'career'; +export type PeriodType = 'today' | '30' | '60' | '90' | 'custom'; +export type PeriodSize = 'today' | `${number}` | 'career'; export default function addPeriodSubCommands( - option: SlashCommandSubcommandGroupBuilder, + option: SlashCommandBuilder, extra: ( option: SlashCommandSubcommandBuilder, ) => SlashCommandSubcommandBuilder = (option) => option, ) { - return option + option .addSubcommand((option) => - extra( - option - .setName('period' satisfies PeriodType) - .setDescription("Preset period's statistics") - .addStringOption((option) => - option - .setName('period') - .setDescription('A preset period') - .setChoices( - { name: 'Today', value: '1' satisfies PeriodSize }, - { name: '30 days', value: '30' satisfies PeriodSize }, - { name: '60 days', value: '60' satisfies PeriodSize }, - { name: '90 days', value: '90' satisfies PeriodSize }, - { name: 'Career', value: 'career' satisfies PeriodSize }, - ) - .setRequired(true), - ), - ), + extra(option.setName('today').setDescription('Today')), + ) + .addSubcommand((option) => + extra(option.setName('30').setDescription('30 days')), + ) + .addSubcommand((option) => + extra(option.setName('60').setDescription('60 days')), + ) + .addSubcommand((option) => + extra(option.setName('90').setDescription('90 days')), ) .addSubcommand((option) => extra( option - .setName('custom' satisfies PeriodType) - .setDescription("Custom period's statistics") + .setName('custom') + .setDescription('Custom range') .addIntegerOption((option) => option .setName('start') - .setDescription('Days ago from today') - .setMinValue(0) + .setDescription('Start in number of days ago from today') .setRequired(true), ) .addIntegerOption((option) => option .setName('end') - .setDescription('Days ago from today') - .setMinValue(0) + .setDescription('End in number of days') .setRequired(true), ), ), diff --git a/src/core/discord/addStatTypeSubCommandGroups.ts b/src/core/discord/addStatTypeSubCommandGroups.ts index e1866c441..5da5655e7 100644 --- a/src/core/discord/addStatTypeSubCommandGroups.ts +++ b/src/core/discord/addStatTypeSubCommandGroups.ts @@ -1,91 +1,70 @@ -import { SlashCommandBuilder } from 'discord.js'; -import { TreeTypeString } from '../../components/Tanks'; -import { StatType } from '../../renderers/stats'; +import { SlashCommandBuilder, SlashCommandSubcommandBuilder } from 'discord.js'; +import { TREE_TYPE_NAMES, TreeTypeString } from '../../components/Tanks'; 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( option: SlashCommandBuilder, - addMultiTank = true, + extra: ( + option: SlashCommandSubcommandBuilder, + ) => SlashCommandSubcommandBuilder = (option) => option, ) { const awaitedTankopediaInfo = await tankopediaInfo; - option - .addSubcommandGroup((option) => - addPeriodSubCommands(option, (option) => - option.addStringOption(addUsernameChoices), - ) - .setName('player' satisfies StatType) - .setDescription('Player statistics'), - ) - .addSubcommandGroup((option) => - addPeriodSubCommands(option, (option) => - option - .addStringOption(addTankChoices) - .addStringOption(addUsernameChoices), - ) - .setName('tank' satisfies StatType) - .setDescription('Tank statistics'), - ); + addPeriodSubCommands(option, (option) => { + extra(option); - if (addMultiTank) - option.addSubcommandGroup((option) => - addPeriodSubCommands(option, (option) => + return option + .addStringOption((option) => option - .addStringOption(addUsernameChoices) - .addStringOption((option) => { - option - .setName('nation') - .setDescription('Nation') - .addChoices( - ...Object.entries(awaitedTankopediaInfo.vehicle_nations).map( - ([type, name]) => ({ name, value: type }), - ), - ); - - return option; - }) - .addStringOption((option) => - option - .setName('tank-type') - .setDescription('Type') - .addChoices( - ...Object.entries(awaitedTankopediaInfo.vehicle_types).map( - ([type, name]) => ({ - name: name.replace(' Tank', ''), - value: type, - }), - ), - ) - .setRequired(false), + .setName('nation') + .setDescription('Nation') + .addChoices( + ...Object.entries(awaitedTankopediaInfo.vehicle_nations).map( + ([type, name]) => ({ name, value: type }), + ), ) - .addStringOption((option) => - addTierChoices(option).setRequired(false), - ) - .addStringOption((option) => - option - .setName('tree-type') - .setDescription('Tech tree type') - .addChoices( - { - name: 'Tech Tree', - value: 'techtree' satisfies TreeTypeString, - }, - { name: 'Premium', value: 'premium' satisfies TreeTypeString }, - { - name: 'Collector', - value: 'collector' satisfies TreeTypeString, - }, - ) - .setRequired(false), - ), + .setRequired(false), ) - .setName('multi-tank' satisfies StatType) - .setDescription('Multiple tanks'), - ); + .addStringOption((option) => addTierChoices(option).setRequired(false)) + .addStringOption((option) => + option + .setName('tank-type') + .setDescription('Tank type') + .addChoices( + ...Object.entries(awaitedTankopediaInfo.vehicle_types).map( + ([type, name]) => ({ + name: name.replace(' Tank', ''), + value: type, + }), + ), + ) + .setRequired(false), + ) + .addStringOption((option) => + option + .setName('tree-type') + .setDescription('Tech tree type') + .addChoices( + { + name: TREE_TYPE_NAMES['tech-tree'], + value: 'tech-tree' satisfies TreeTypeString, + }, + { + name: TREE_TYPE_NAMES.premium, + value: 'premium' satisfies TreeTypeString, + }, + { + name: TREE_TYPE_NAMES.collector, + value: 'collector' satisfies TreeTypeString, + }, + ) + .setRequired(false), + ) + .addStringOption((option) => addTankChoices(option).setRequired(false)); + }); return option; } diff --git a/src/core/discord/interactionToURL.ts b/src/core/discord/interactionToURL.ts index f05d03cb3..c4dac3f10 100644 --- a/src/core/discord/interactionToURL.ts +++ b/src/core/discord/interactionToURL.ts @@ -1,11 +1,7 @@ -import { - CacheType, - ChatInputCommandInteraction, - CommandInteractionOption, -} from 'discord.js'; +import { CacheType, ChatInputCommandInteraction } from 'discord.js'; export interface Parameters { - [key: string]: CommandInteractionOption['value'] | undefined | null; + [key: string]: string | number | boolean | undefined | null; } export default function interactionToURL( diff --git a/src/core/discord/refreshButton.ts b/src/core/discord/refreshButton.ts new file mode 100644 index 000000000..61394afd5 --- /dev/null +++ b/src/core/discord/refreshButton.ts @@ -0,0 +1,16 @@ +import { ChatInputCommandInteraction } from 'discord.js'; +import primaryButton from './primaryButton'; + +export function refreshButton( + interaction: ChatInputCommandInteraction, + path: string, +) { + if ( + interaction.appPermissions?.has('AttachFiles') && + interaction.appPermissions?.has('ViewChannel') + ) { + return primaryButton(path, 'Refresh'); + } + + return null; +} diff --git a/src/core/discord/resolvePeriodFromButton.ts b/src/core/discord/resolvePeriodFromButton.ts index 8267c3dce..18f2ba18f 100644 --- a/src/core/discord/resolvePeriodFromButton.ts +++ b/src/core/discord/resolvePeriodFromButton.ts @@ -1,5 +1,4 @@ import { ButtonInteraction, CacheType } from 'discord.js'; -import { CYCLIC_API } from '../../constants/cyclic'; import { Region } from '../../constants/regions'; import resolvePeriodFromURL from './resolvePeriodFromURL'; @@ -7,5 +6,8 @@ export default function resolvePeriodFromButton( server: Region, interaction: ButtonInteraction, ) { - return resolvePeriodFromURL(server, `${CYCLIC_API}/${interaction.customId}`); + return resolvePeriodFromURL( + server, + `https://example.com/${interaction.customId}`, + ); } diff --git a/src/core/discord/resolvePeriodFromCommand.ts b/src/core/discord/resolvePeriodFromCommand.ts index 564226944..fbb7d1995 100644 --- a/src/core/discord/resolvePeriodFromCommand.ts +++ b/src/core/discord/resolvePeriodFromCommand.ts @@ -6,12 +6,13 @@ import getTimeDaysAgo from '../blitzstars/getTimeDaysAgo'; import { PeriodSize, PeriodType } from '../discord/addPeriodSubCommands'; export function getPeriodOptionName(period: PeriodSize) { - return period === 'career' ? 'Career' : `${period}-day`; + if (period === 'career') return 'Career'; + if (period === 'today') return 'Today'; + return `${period} days`; } export interface ResolvedPeriod { - statsName: string; - evolutionName: string; + name: string; start: number; end: number; } @@ -20,33 +21,28 @@ export default function resolvePeriodFromCommand( region: Region, interaction: ChatInputCommandInteraction, ) { - let statsName: string; - let evolutionName: string; + let name: string; let start: number; let end: number; const periodSubcommand = interaction.options.getSubcommand() as PeriodType; - const periodOption = interaction.options.getString('period') as PeriodSize; if (periodSubcommand === 'custom') { - const startRaw = interaction.options.getInteger('start', true); - const endRaw = interaction.options.getInteger('end', true); - const startDaysAgoMin = Math.min(startRaw, endRaw); - const endDaysAgoMax = Math.max(startRaw, endRaw); + const startOption = interaction.options.getInteger('start', true); + const endOption = interaction.options.getInteger('end', true); + const startDaysAgoMin = Math.min(startOption, endOption); + const endDaysAgoMax = Math.max(startOption, endOption); - statsName = `${startDaysAgoMin} to ${endDaysAgoMax} days' statistics`; - evolutionName = `${startDaysAgoMin} to ${endDaysAgoMax} days' evolution`; + name = `${startDaysAgoMin} - ${endDaysAgoMax} days`; start = getTimeDaysAgo(region, endDaysAgoMax); end = getTimeDaysAgo(region, startDaysAgoMin); } else { - statsName = `${getPeriodOptionName(periodOption)} Statistics`; - evolutionName = `${getPeriodOptionName(periodOption)} Evolution`; - start = getPeriodStart(region, periodOption); + name = getPeriodOptionName(periodSubcommand); + start = getPeriodStart(region, periodSubcommand); end = getPeriodNow(); } return { - statsName, - evolutionName, + name, start, end, } satisfies ResolvedPeriod; diff --git a/src/core/discord/resolvePeriodFromURL.ts b/src/core/discord/resolvePeriodFromURL.ts index 2f275e4c3..0ddca139d 100644 --- a/src/core/discord/resolvePeriodFromURL.ts +++ b/src/core/discord/resolvePeriodFromURL.ts @@ -2,24 +2,22 @@ import { Region } from '../../constants/regions'; import getPeriodNow from '../blitzstars/getPeriodNow'; import getPeriodStart from '../blitzstars/getPeriodStart'; import getTimeDaysAgo from '../blitzstars/getTimeDaysAgo'; -import { PeriodSize, PeriodType } from './addPeriodSubCommands'; +import { PeriodType } from './addPeriodSubCommands'; import { ResolvedPeriod, getPeriodOptionName, } from './resolvePeriodFromCommand'; export default function resolvePeriodFromURL( - server: Region, + region: Region, urlString: string, ) { - let statsName: string; - let evolutionName: string; + let name: string; let start: number; let end: number; const url = new URL(urlString); - const path = url.pathname.split('/').filter(Boolean); - const periodSubcommand = path[path.length - 1] as PeriodType; - const periodOption = url.searchParams.get('period') as PeriodSize; + const path = url.pathname.split('/'); + const periodSubcommand = path[2] as PeriodType; if (periodSubcommand === 'custom') { const startRaw = parseInt(url!.searchParams.get('start')!); @@ -27,16 +25,18 @@ export default function resolvePeriodFromURL( const startDaysAgoMin = Math.min(startRaw, endRaw); const endDaysAgoMax = Math.max(startRaw, endRaw); - statsName = `${startDaysAgoMin} to ${endDaysAgoMax} days' statistics`; - evolutionName = `${startDaysAgoMin} to ${endDaysAgoMax} days' evolution`; - start = getTimeDaysAgo(server, endDaysAgoMax); - end = getTimeDaysAgo(server, startDaysAgoMin); + name = `${startDaysAgoMin} - ${endDaysAgoMax} days`; + start = getTimeDaysAgo(region, endDaysAgoMax); + end = getTimeDaysAgo(region, startDaysAgoMin); } else { - statsName = `${getPeriodOptionName(periodOption)} Statistics`; - evolutionName = `${getPeriodOptionName(periodOption)} Evolution`; - start = getPeriodStart(server, periodOption); + name = getPeriodOptionName(periodSubcommand); + start = getPeriodStart(region, periodSubcommand); end = getPeriodNow(); } - return { statsName, evolutionName, start, end } satisfies ResolvedPeriod; + return { + name, + start, + end, + } satisfies ResolvedPeriod; } diff --git a/src/core/discord/resolvePlayerFromButton.ts b/src/core/discord/resolvePlayerFromButton.ts index 8369c4c1b..eb57e5120 100644 --- a/src/core/discord/resolvePlayerFromButton.ts +++ b/src/core/discord/resolvePlayerFromButton.ts @@ -1,9 +1,8 @@ import { ButtonInteraction, CacheType } from 'discord.js'; -import { CYCLIC_API } from '../../constants/cyclic'; import resolvePlayerFromURL from './resolvePlayerFromURL'; export default async function resolvePlayerFromButton( interaction: ButtonInteraction, ) { - return resolvePlayerFromURL(`${CYCLIC_API}/${interaction.customId}`); + return resolvePlayerFromURL(`https://exmaple.com/${interaction.customId}`); } diff --git a/src/events/interactionCreate/handlers/button.tsx b/src/events/interactionCreate/handlers/button.tsx index cac6fddb5..40c6d7a98 100644 --- a/src/events/interactionCreate/handlers/button.tsx +++ b/src/events/interactionCreate/handlers/button.tsx @@ -1,6 +1,5 @@ import { ButtonInteraction, CacheType } from 'discord.js'; import { commands } from '..'; -import { CYCLIC_API } from '../../../constants/cyclic'; import normalizeInteractionReturnable from '../../../core/discord/normalizeInteractionReturnable'; import throwError from '../../../core/node/throwError'; @@ -9,7 +8,7 @@ export default async function handleButton( ) { await interaction.deferUpdate(); - const url = new URL(`${CYCLIC_API}/${interaction.customId}`); + const url = new URL(`https://example.com/${interaction.customId}`); const commandName = url.pathname.split('/')[1]; const button = (await commands)[commandName]?.button; diff --git a/src/events/interactionCreate/handlers/chatInputCommand.ts b/src/events/interactionCreate/handlers/chatInputCommand.ts index 985ed45c8..605a82567 100644 --- a/src/events/interactionCreate/handlers/chatInputCommand.ts +++ b/src/events/interactionCreate/handlers/chatInputCommand.ts @@ -17,7 +17,6 @@ export default async function handleChatInputCommand( ) { const registry = (await commands)[interaction.commandName]; - console.log(interaction.toString()); await interaction.deferReply(); try { diff --git a/src/events/interactionCreate/index.ts b/src/events/interactionCreate/index.ts index dea18f7f5..f218d5c7a 100644 --- a/src/events/interactionCreate/index.ts +++ b/src/events/interactionCreate/index.ts @@ -44,7 +44,8 @@ export type InteractionRawReturnable = | EmbedBuilder | ButtonBuilder | AttachmentBuilder - | JSX.Element; + | JSX.Element + | null; export type InteractionIterableReturnable = | InteractionRawReturnable | InteractionRawReturnable[]; diff --git a/src/renderers/fullStats.tsx b/src/renderers/fullStats.tsx index e69f28c29..bcd5641b4 100644 --- a/src/renderers/fullStats.tsx +++ b/src/renderers/fullStats.tsx @@ -23,7 +23,7 @@ import { MultiTankFilters, StatType } from './stats'; export default async function fullStats( type: Type, - { start, end, statsName }: ResolvedPeriod, + { start, end, name: statsName }: ResolvedPeriod, { region: server, id }: ResolvedPlayer, filters: Type extends 'tank' ? number @@ -50,7 +50,12 @@ export default async function fullStats( image = (await tankopedia)[filters as number]?.images.normal; } - const { diffed, order } = await getDiffedTankStats(server, id, start, end); + const { diff: diffed, order } = await getDiffedTankStats( + server, + id, + start, + end, + ); const awaitedTankopedia = await tankopedia; let stats: AllStats | undefined; let supplementaryStats: SupplementaryStats; diff --git a/src/renderers/stats.tsx b/src/renderers/stats.tsx deleted file mode 100644 index 5e1f457e4..000000000 --- a/src/renderers/stats.tsx +++ /dev/null @@ -1,172 +0,0 @@ -import AllStatsOverview from '../components/AllStatsOverview'; -import NoData, { NoDataType } from '../components/NoData'; -import { TreeTypeString } from '../components/Tanks'; -import TitleBar from '../components/TitleBar'; -import Wrapper from '../components/Wrapper'; -import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; -import calculateWN8 from '../core/blitz/calculateWN8'; -import getWargamingResponse from '../core/blitz/getWargamingResponse'; -import resolveTankName from '../core/blitz/resolveTankName'; -import sumStats from '../core/blitz/sumStats'; -import { tankopedia } from '../core/blitz/tankopedia'; -import getDiffedTankStats from '../core/blitzstars/getDiffedTankStats'; -import { tankAverages } from '../core/blitzstars/tankAverages'; -import { ResolvedPeriod } from '../core/discord/resolvePeriodFromCommand'; -import { ResolvedPlayer } from '../core/discord/resolvePlayerFromCommand'; -import { theme } from '../stitches.config'; -import { - AccountInfo, - AllStats, - SupplementaryStats, -} from '../types/accountInfo'; -import { PlayerClanData } from '../types/playerClanData'; - -export type StatType = 'player' | 'tank' | 'multi-tank'; - -export interface MultiTankFilters { - nation: string; - 'tank-type': string; - tier: number; - 'tree-type': TreeTypeString; -} - -export default async function stats( - type: Type, - { start, end, statsName }: ResolvedPeriod, - { region: server, id }: ResolvedPlayer, - filters: Type extends 'tank' - ? number - : Type extends 'multi-tank' - ? Partial - : null, - naked = false, -) { - let nameDiscriminator: string | undefined; - let image: string | undefined; - - if (type === 'player' || type === 'multi-tank') { - const clan = ( - await getWargamingResponse( - `https://api.wotblitz.${server}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}&extra=clan`, - ) - )[id]?.clan; - - if (clan) nameDiscriminator = `[${clan.tag}]`; - image = clan - ? `https://wotblitz-gc.gcdn.co/icons/clanEmblems1x/clan-icon-v2-${clan.emblem_set_id}.png` - : undefined; - } else if (type === 'tank') { - nameDiscriminator = `(${await resolveTankName(filters as number)})`; - image = (await tankopedia)[filters as number]?.images.normal; - } else { - } - - const { diffed, order } = await getDiffedTankStats(server, id, start, end); - const awaitedTankopedia = await tankopedia; - let stats: AllStats | undefined; - let supplementaryStats: SupplementaryStats; - - if (type === 'player' || type === 'multi-tank') { - const typedFilters = filters as Partial | null; - const filteredOrder = order.filter( - (id) => - typedFilters === null || - ((typedFilters.nation === undefined || - awaitedTankopedia[id]?.nation === typedFilters.nation) && - (typedFilters['tank-type'] === undefined || - awaitedTankopedia[id]?.type === typedFilters['tank-type']) && - (typedFilters.tier === undefined || - awaitedTankopedia[id]?.tier === typedFilters.tier) && - (typedFilters['tree-type'] === undefined || - (typedFilters['tree-type'] === 'collector' && - awaitedTankopedia[id]?.is_collectible) || - (typedFilters['tree-type'] === 'premium' && - awaitedTankopedia[id]?.is_premium) || - (typedFilters['tree-type'] === 'techtree' && - !awaitedTankopedia[id]?.is_collectible && - !awaitedTankopedia[id]?.is_premium))), - ); - const awaitedTankAverages = await tankAverages; - stats = sumStats(filteredOrder.map((id) => diffed[id])); - const battlesOfTanksWithAverages = filteredOrder.reduce( - (accumulator, id) => - awaitedTankAverages[id] - ? accumulator + diffed[id].battles - : accumulator, - 0, - ); - const battlesOfTanksWithTankopediaEntry = filteredOrder.reduce( - (accumulator, id) => - awaitedTankopedia[id] ? accumulator + diffed[id].battles : accumulator, - 0, - ); - - supplementaryStats = { - WN8: - filteredOrder.reduce( - (accumulator, id) => - awaitedTankAverages[id] - ? accumulator + - calculateWN8(awaitedTankAverages[id].all, diffed[id]) * - diffed[id].battles - : accumulator, - 0, - ) / battlesOfTanksWithAverages, - tier: - filteredOrder.reduce( - (accumulator, id) => - awaitedTankopedia[id] - ? accumulator + awaitedTankopedia[id]!.tier * diffed[id].battles - : accumulator, - 0, - ) / battlesOfTanksWithTankopediaEntry, - }; - } else { - stats = diffed[(filters as number)!]; - - supplementaryStats = { - WN8: stats - ? calculateWN8( - (await tankAverages)[(filters as number)!].all, - diffed[(filters as number)!], - ) - : undefined, - tier: (await tankopedia)[(filters as number)!]?.tier, - }; - } - - const accountInfo = await getWargamingResponse( - `https://api.wotblitz.${server}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, - ); - const overview = ( - - ); - const footer = ( - - /full-stats for all statistics - - ); - - return naked ? ( - {overview} - ) : ( - - - - {!stats?.battles && } - {stats?.battles > 0 && overview} - - ); -} diff --git a/src/renderers/today.tsx b/src/renderers/today.tsx index ff0c40bc6..c63afb8da 100644 --- a/src/renderers/today.tsx +++ b/src/renderers/today.tsx @@ -27,7 +27,7 @@ export default async function today( showTotal = true, naked?: boolean, ) { - const { diffed, order } = await getDiffedTankStats( + const { diff: diffed, order } = await getDiffedTankStats( server, id, getTimeDaysAgo(server, 1), From d2668974f74e122c643646dc0d3994b448bd3bde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Wed, 11 Oct 2023 18:42:36 -0500 Subject: [PATCH 09/43] feat: code split a lot --- src/commands/link.tsx | 4 +- src/commands/ownedTanks.tsx | 4 +- src/commands/ratings.tsx | 8 +-- src/commands/stats.tsx | 72 ++++++--------------- src/core/blitz/getAccountInfo.ts | 11 ++++ src/core/blitz/getClanLogo.ts | 3 + src/core/blitz/playerClanInfo.ts | 10 +++ src/core/discord/getCustomPeriodParams.ts | 14 ++++ src/core/discord/getFiltersFromButton.ts | 17 +++++ src/core/discord/getFiltersFromCommand.ts | 18 ++++++ src/core/discord/resolvePeriodFromButton.ts | 46 ++++++++++--- src/core/discord/resolvePeriodFromURL.ts | 42 ------------ src/core/discord/resolvePlayerFromButton.ts | 14 ++-- src/core/discord/resolvePlayerFromURL.ts | 11 ---- src/renderers/evolution.tsx | 4 +- src/renderers/fullStats.tsx | 4 +- src/renderers/today.tsx | 4 +- src/types/playerClanData.ts | 2 +- 18 files changed, 155 insertions(+), 133 deletions(-) create mode 100644 src/core/blitz/getAccountInfo.ts create mode 100644 src/core/blitz/getClanLogo.ts create mode 100644 src/core/blitz/playerClanInfo.ts create mode 100644 src/core/discord/getCustomPeriodParams.ts create mode 100644 src/core/discord/getFiltersFromButton.ts create mode 100644 src/core/discord/getFiltersFromCommand.ts delete mode 100644 src/core/discord/resolvePeriodFromURL.ts delete mode 100644 src/core/discord/resolvePlayerFromURL.ts diff --git a/src/commands/link.tsx b/src/commands/link.tsx index fc773c893..d7b9fb014 100644 --- a/src/commands/link.tsx +++ b/src/commands/link.tsx @@ -12,7 +12,7 @@ import embedNegative from '../core/discord/embedNegative'; import { CommandRegistry } from '../events/interactionCreate'; import { theme } from '../stitches.config'; import { AccountInfo } from '../types/accountInfo'; -import { PlayerClanData } from '../types/playerClanData'; +import { PlayerClanInfo } from '../types/playerClanData'; const serverAndIdPattern = /(com|eu|asia)\/[0-9]+/; @@ -99,7 +99,7 @@ export const verifyCommand: CommandRegistry = { getWargamingResponse( `https://api.wotblitz.${region}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, ), - getWargamingResponse( + getWargamingResponse( `https://api.wotblitz.${region}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}&extra=clan`, ), ]); diff --git a/src/commands/ownedTanks.tsx b/src/commands/ownedTanks.tsx index a8bd2e0cb..17297119a 100644 --- a/src/commands/ownedTanks.tsx +++ b/src/commands/ownedTanks.tsx @@ -21,7 +21,7 @@ import autocompleteUsername from '../core/discord/autocompleteUsername'; import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand'; import { CommandRegistry } from '../events/interactionCreate'; import { AccountInfo } from '../types/accountInfo'; -import { PlayerClanData } from '../types/playerClanData'; +import { PlayerClanInfo } from '../types/playerClanData'; const COMP_TANKS = [ // light tanks @@ -70,7 +70,7 @@ export const ownedTanksCommand: CommandRegistry = { })), ) ).filter((tank) => tank.tankopedia?.tier === tier); - const clanData = await getWargamingResponse( + const clanData = await getWargamingResponse( `https://api.wotblitz.${server}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}&extra=clan`, ); const groupedTanks: Record = {}; diff --git a/src/commands/ratings.tsx b/src/commands/ratings.tsx index 13626733e..e6506b3b7 100644 --- a/src/commands/ratings.tsx +++ b/src/commands/ratings.tsx @@ -26,7 +26,7 @@ import { octokit } from '../core/github/octokit'; import throwError from '../core/node/throwError'; import { CommandRegistryRaw } from '../events/interactionCreate'; import { AccountInfo } from '../types/accountInfo'; -import { PlayerClanData } from '../types/playerClanData'; +import { PlayerClanInfo } from '../types/playerClanData'; export interface RatingsPlayer { spa_id: number; @@ -313,7 +313,7 @@ export const ratingsCommand = new Promise( lastPlayerIndex + 1, ); const ids = trimmed.map((player) => player.id).join(','); - const clanData = await getWargamingResponse( + const clanData = await getWargamingResponse( `https://api.wotblitz.${region}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${ids}&extra=clan`, ); @@ -377,7 +377,7 @@ export const ratingsCommand = new Promise( `https://api.wotblitz.${region}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, ); const clan = ( - await getWargamingResponse( + await getWargamingResponse( `https://api.wotblitz.${region}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}&extra=clan`, ) )[id]?.clan; @@ -437,7 +437,7 @@ export const ratingsCommand = new Promise( playerIndex + halfRange + 1, ); const ids = trimmed.map((player) => player.id).join(','); - const clanData = await getWargamingResponse( + const clanData = await getWargamingResponse( `https://api.wotblitz.${region}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${ids}&extra=clan`, ); diff --git a/src/commands/stats.tsx b/src/commands/stats.tsx index fd1916db2..b6f3e48f2 100644 --- a/src/commands/stats.tsx +++ b/src/commands/stats.tsx @@ -1,20 +1,22 @@ import { SlashCommandBuilder } from 'discord.js'; import AllStatsOverview from '../components/AllStatsOverview'; import NoData, { NoDataType } from '../components/NoData'; -import { TreeTypeString } from '../components/Tanks'; import TitleBar from '../components/TitleBar'; import Wrapper from '../components/Wrapper'; -import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; import { StatFilters, filterStats } from '../core/blitz/filterStats'; -import getWargamingResponse from '../core/blitz/getWargamingResponse'; +import { getAccountInfo } from '../core/blitz/getAccountInfo'; +import { getClanLogo } from '../core/blitz/getClanLogo'; +import { playerClanInfo } from '../core/blitz/playerClanInfo'; import { filtersToDescription } from '../core/blitzkrieg/filtersToDescription'; import { getBlitzStarsLinkButton } from '../core/blitzstars/getBlitzStarsLinkButton'; import getDiffedTankStats from '../core/blitzstars/getDiffedTankStats'; -import { PeriodType } from '../core/discord/addPeriodSubCommands'; import addStatTypeSubCommandGroups from '../core/discord/addStatTypeSubCommandGroups'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteTanks from '../core/discord/autocompleteTanks'; import autocompleteUsername from '../core/discord/autocompleteUsername'; +import { getCustomPeriodParams } from '../core/discord/getCustomPeriodParams'; +import { getFiltersFromButton } from '../core/discord/getFiltersFromButton'; +import { getFiltersFromCommand } from '../core/discord/getFiltersFromCommand'; import interactionToURL from '../core/discord/interactionToURL'; import { refreshButton } from '../core/discord/refreshButton'; import resolvePeriodFromButton from '../core/discord/resolvePeriodFromButton'; @@ -26,27 +28,15 @@ import resolvePlayerFromCommand, { ResolvedPlayer, } from '../core/discord/resolvePlayerFromCommand'; import { CommandRegistryRaw } from '../events/interactionCreate'; -import { AccountInfo } from '../types/accountInfo'; -import { PlayerClanData } from '../types/playerClanData'; export default async function render( { region, id }: ResolvedPlayer, - { start, end, name: statsName }: ResolvedPeriod, + { start, end, name }: ResolvedPeriod, filters: StatFilters, ) { - const nickname = ( - await getWargamingResponse( - `https://api.wotblitz.${region}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, - ) - )[id].nickname; - const clan = ( - await getWargamingResponse( - `https://api.wotblitz.${region}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}&extra=clan`, - ) - )[id]?.clan; - const clanImage = clan - ? `https://wotblitz-gc.gcdn.co/icons/clanEmblems1x/clan-icon-v2-${clan.emblem_set_id}.png` - : undefined; + const nickname = (await getAccountInfo(region, id))[id].nickname; + const clan = (await playerClanInfo(region, id))[id]?.clan; + const clanImage = clan ? getClanLogo(clan.emblem_set_id) : undefined; const diffedTankStats = await getDiffedTankStats(region, id, start, end); const { stats, supplementary } = await filterStats(diffedTankStats, filters); @@ -55,7 +45,7 @@ export default async function render( {!stats?.battles && } @@ -86,34 +76,18 @@ export const statsCommand = new Promise(async (resolve) => { resolvedPlayer.region, interaction, ); - const filters = { - nation: interaction.options.getString('nation') ?? undefined, - tier: - parseInt(interaction.options.getString('tier') ?? '0') || undefined, - tankType: interaction.options.getString('tank-type') ?? undefined, - treeType: - (interaction.options.getString('tree-type') as - | TreeTypeString - | undefined) ?? undefined, - tank: - parseInt(interaction.options.getString('tank') ?? '0') || undefined, - } satisfies StatFilters; + const filters = getFiltersFromCommand(interaction); const path = interactionToURL(interaction, { ...resolvedPlayer, - ...((interaction.options.getSubcommand() as PeriodType) === 'custom' - ? { - start: interaction.options.getInteger('start', true), - end: interaction.options.getInteger('end', true), - } - : undefined), + ...getCustomPeriodParams(interaction), ...filters, }); - return [ - await render(resolvedPlayer, resolvedPeriod, filters), + return Promise.all([ + render(resolvedPlayer, resolvedPeriod, filters), refreshButton(interaction, path), - await getBlitzStarsLinkButton(resolvedPlayer.region, resolvedPlayer.id), - ]; + getBlitzStarsLinkButton(resolvedPlayer.region, resolvedPlayer.id), + ]); }, autocomplete: (interaction) => { @@ -122,19 +96,11 @@ export const statsCommand = new Promise(async (resolve) => { }, async button(interaction) { - const url = new URL(`https://example.com${interaction.customId}`); const player = await resolvePlayerFromButton(interaction); const period = resolvePeriodFromButton(player.region, interaction); + const filters = getFiltersFromButton(interaction); - return await render(player, period, { - nation: url.searchParams.get('nation') ?? undefined, - tank: parseInt(url.searchParams.get('tank') ?? '0') || undefined, - tankType: url.searchParams.get('tank-type') ?? undefined, - treeType: - (url.searchParams.get('tree-type') as TreeTypeString | undefined) ?? - undefined, - tier: parseInt(url.searchParams.get('tier') ?? '0') || undefined, - }); + return await render(player, period, filters); }, }); }); diff --git a/src/core/blitz/getAccountInfo.ts b/src/core/blitz/getAccountInfo.ts new file mode 100644 index 000000000..04ff4e29c --- /dev/null +++ b/src/core/blitz/getAccountInfo.ts @@ -0,0 +1,11 @@ +import { Region } from '../../constants/regions'; +import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; +import { AccountInfo } from '../../types/accountInfo'; +import getWargamingResponse from './getWargamingResponse'; + +// BIG TODO: generalize all get wargaming calls +export function getAccountInfo(region: Region, id: number) { + return getWargamingResponse( + `https://api.wotblitz.${region}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, + ); +} diff --git a/src/core/blitz/getClanLogo.ts b/src/core/blitz/getClanLogo.ts new file mode 100644 index 000000000..17354e727 --- /dev/null +++ b/src/core/blitz/getClanLogo.ts @@ -0,0 +1,3 @@ +export function getClanLogo(emblemId: number) { + return `https://wotblitz-gc.gcdn.co/icons/clanEmblems1x/clan-icon-v2-${emblemId}.png` +} \ No newline at end of file diff --git a/src/core/blitz/playerClanInfo.ts b/src/core/blitz/playerClanInfo.ts new file mode 100644 index 000000000..151449b89 --- /dev/null +++ b/src/core/blitz/playerClanInfo.ts @@ -0,0 +1,10 @@ +import { Region } from '../../constants/regions'; +import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; +import { PlayerClanInfo } from '../../types/playerClanData'; +import getWargamingResponse from './getWargamingResponse'; + +export function playerClanInfo(region: Region, id: number) { + return getWargamingResponse( + `https://api.wotblitz.${region}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}&extra=clan`, + ); +} diff --git a/src/core/discord/getCustomPeriodParams.ts b/src/core/discord/getCustomPeriodParams.ts new file mode 100644 index 000000000..55b7b8aa0 --- /dev/null +++ b/src/core/discord/getCustomPeriodParams.ts @@ -0,0 +1,14 @@ +import { ChatInputCommandInteraction } from 'discord.js'; +import { PeriodType } from './addPeriodSubCommands'; + +export function getCustomPeriodParams( + interaction: ChatInputCommandInteraction, +) { + if ((interaction.options.getSubcommand() as PeriodType) === 'custom') + return { + start: interaction.options.getInteger('start', true), + end: interaction.options.getInteger('end', true), + }; + + return undefined; +} diff --git a/src/core/discord/getFiltersFromButton.ts b/src/core/discord/getFiltersFromButton.ts new file mode 100644 index 000000000..cb26b8464 --- /dev/null +++ b/src/core/discord/getFiltersFromButton.ts @@ -0,0 +1,17 @@ +import { ButtonInteraction } from 'discord.js'; +import { TreeTypeString } from '../../components/Tanks'; +import { StatFilters } from '../blitz/filterStats'; + +export function getFiltersFromButton(interaction: ButtonInteraction) { + const url = new URL(`https://example.com/${interaction.customId}`); + + return { + nation: url.searchParams.get('nation') ?? undefined, + tank: parseInt(url.searchParams.get('tank') ?? '0') || undefined, + tankType: url.searchParams.get('tank-type') ?? undefined, + treeType: + (url.searchParams.get('tree-type') as TreeTypeString | undefined) ?? + undefined, + tier: parseInt(url.searchParams.get('tier') ?? '0') || undefined, + } satisfies StatFilters; +} diff --git a/src/core/discord/getFiltersFromCommand.ts b/src/core/discord/getFiltersFromCommand.ts new file mode 100644 index 000000000..a622cdd5b --- /dev/null +++ b/src/core/discord/getFiltersFromCommand.ts @@ -0,0 +1,18 @@ +import { ChatInputCommandInteraction } from 'discord.js'; +import { TreeTypeString } from '../../components/Tanks'; +import { StatFilters } from '../blitz/filterStats'; + +export function getFiltersFromCommand( + interaction: ChatInputCommandInteraction, +) { + return { + nation: interaction.options.getString('nation') ?? undefined, + tier: parseInt(interaction.options.getString('tier') ?? '0') || undefined, + tankType: interaction.options.getString('tank-type') ?? undefined, + treeType: + (interaction.options.getString('tree-type') as + | TreeTypeString + | undefined) ?? undefined, + tank: parseInt(interaction.options.getString('tank') ?? '0') || undefined, + } satisfies StatFilters; +} diff --git a/src/core/discord/resolvePeriodFromButton.ts b/src/core/discord/resolvePeriodFromButton.ts index 18f2ba18f..4188ba50d 100644 --- a/src/core/discord/resolvePeriodFromButton.ts +++ b/src/core/discord/resolvePeriodFromButton.ts @@ -1,13 +1,43 @@ -import { ButtonInteraction, CacheType } from 'discord.js'; +import { ButtonInteraction } from 'discord.js'; import { Region } from '../../constants/regions'; -import resolvePeriodFromURL from './resolvePeriodFromURL'; +import getPeriodNow from '../blitzstars/getPeriodNow'; +import getPeriodStart from '../blitzstars/getPeriodStart'; +import getTimeDaysAgo from '../blitzstars/getTimeDaysAgo'; +import { PeriodType } from './addPeriodSubCommands'; +import { + ResolvedPeriod, + getPeriodOptionName, +} from './resolvePeriodFromCommand'; export default function resolvePeriodFromButton( - server: Region, - interaction: ButtonInteraction, + region: Region, + interaction: ButtonInteraction, ) { - return resolvePeriodFromURL( - server, - `https://example.com/${interaction.customId}`, - ); + let name: string; + let start: number; + let end: number; + const url = new URL(`https://example.com/${interaction.customId}`); + const path = url.pathname.split('/'); + const periodSubcommand = path[2] as PeriodType; + + if (periodSubcommand === 'custom') { + const startRaw = parseInt(url!.searchParams.get('start')!); + const endRaw = parseInt(url!.searchParams.get('end')!); + const startDaysAgoMin = Math.min(startRaw, endRaw); + const endDaysAgoMax = Math.max(startRaw, endRaw); + + name = `${startDaysAgoMin} - ${endDaysAgoMax} days`; + start = getTimeDaysAgo(region, endDaysAgoMax); + end = getTimeDaysAgo(region, startDaysAgoMin); + } else { + name = getPeriodOptionName(periodSubcommand); + start = getPeriodStart(region, periodSubcommand); + end = getPeriodNow(); + } + + return { + name, + start, + end, + } satisfies ResolvedPeriod; } diff --git a/src/core/discord/resolvePeriodFromURL.ts b/src/core/discord/resolvePeriodFromURL.ts deleted file mode 100644 index 0ddca139d..000000000 --- a/src/core/discord/resolvePeriodFromURL.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Region } from '../../constants/regions'; -import getPeriodNow from '../blitzstars/getPeriodNow'; -import getPeriodStart from '../blitzstars/getPeriodStart'; -import getTimeDaysAgo from '../blitzstars/getTimeDaysAgo'; -import { PeriodType } from './addPeriodSubCommands'; -import { - ResolvedPeriod, - getPeriodOptionName, -} from './resolvePeriodFromCommand'; - -export default function resolvePeriodFromURL( - region: Region, - urlString: string, -) { - let name: string; - let start: number; - let end: number; - const url = new URL(urlString); - const path = url.pathname.split('/'); - const periodSubcommand = path[2] as PeriodType; - - if (periodSubcommand === 'custom') { - const startRaw = parseInt(url!.searchParams.get('start')!); - const endRaw = parseInt(url!.searchParams.get('end')!); - const startDaysAgoMin = Math.min(startRaw, endRaw); - const endDaysAgoMax = Math.max(startRaw, endRaw); - - name = `${startDaysAgoMin} - ${endDaysAgoMax} days`; - start = getTimeDaysAgo(region, endDaysAgoMax); - end = getTimeDaysAgo(region, startDaysAgoMin); - } else { - name = getPeriodOptionName(periodSubcommand); - start = getPeriodStart(region, periodSubcommand); - end = getPeriodNow(); - } - - return { - name, - start, - end, - } satisfies ResolvedPeriod; -} diff --git a/src/core/discord/resolvePlayerFromButton.ts b/src/core/discord/resolvePlayerFromButton.ts index eb57e5120..8d5a5a4b1 100644 --- a/src/core/discord/resolvePlayerFromButton.ts +++ b/src/core/discord/resolvePlayerFromButton.ts @@ -1,8 +1,14 @@ -import { ButtonInteraction, CacheType } from 'discord.js'; -import resolvePlayerFromURL from './resolvePlayerFromURL'; +import { ButtonInteraction } from 'discord.js'; +import { Region } from '../../constants/regions'; +import { ResolvedPlayer } from './resolvePlayerFromCommand'; export default async function resolvePlayerFromButton( - interaction: ButtonInteraction, + interaction: ButtonInteraction, ) { - return resolvePlayerFromURL(`https://exmaple.com/${interaction.customId}`); + const url = new URL(`https://exmaple.com/${interaction.customId}`); + + return { + id: parseInt(url.searchParams.get('id')!), + region: url.searchParams.get('region') as Region, + } satisfies ResolvedPlayer; } diff --git a/src/core/discord/resolvePlayerFromURL.ts b/src/core/discord/resolvePlayerFromURL.ts deleted file mode 100644 index 33c369a0c..000000000 --- a/src/core/discord/resolvePlayerFromURL.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Region } from '../../constants/regions'; -import { ResolvedPlayer } from '../discord/resolvePlayerFromCommand'; - -export default function resolvePlayerFromURL(urlString: string) { - const url = new URL(urlString); - - return { - id: parseInt(url.searchParams.get('id')!), - region: url.searchParams.get('region') as Region, - } satisfies ResolvedPlayer; -} diff --git a/src/renderers/evolution.tsx b/src/renderers/evolution.tsx index 2f140de09..d245afcc2 100644 --- a/src/renderers/evolution.tsx +++ b/src/renderers/evolution.tsx @@ -12,7 +12,7 @@ import { ResolvedPeriod } from '../core/discord/resolvePeriodFromCommand'; import { ResolvedPlayer } from '../core/discord/resolvePlayerFromCommand'; import { AccountInfo } from '../types/accountInfo'; import { Histories } from '../types/histories'; -import { PlayerClanData } from '../types/playerClanData'; +import { PlayerClanInfo } from '../types/playerClanData'; import { StatType } from './stats'; export default async function evolution( @@ -26,7 +26,7 @@ export default async function evolution( if (type === 'player') { const clan = ( - await getWargamingResponse( + await getWargamingResponse( `https://api.wotblitz.${server}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}&extra=clan`, ) )[id]?.clan; diff --git a/src/renderers/fullStats.tsx b/src/renderers/fullStats.tsx index bcd5641b4..067d6b0b1 100644 --- a/src/renderers/fullStats.tsx +++ b/src/renderers/fullStats.tsx @@ -18,7 +18,7 @@ import { AllStats, SupplementaryStats, } from '../types/accountInfo'; -import { PlayerClanData } from '../types/playerClanData'; +import { PlayerClanInfo } from '../types/playerClanData'; import { MultiTankFilters, StatType } from './stats'; export default async function fullStats( @@ -36,7 +36,7 @@ export default async function fullStats( if (type === 'player' || type === 'multi-tank') { const clan = ( - await getWargamingResponse( + await getWargamingResponse( `https://api.wotblitz.${server}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}&extra=clan`, ) )[id]?.clan; diff --git a/src/renderers/today.tsx b/src/renderers/today.tsx index c63afb8da..481ce7f10 100644 --- a/src/renderers/today.tsx +++ b/src/renderers/today.tsx @@ -17,7 +17,7 @@ import getTimeDaysAgo from '../core/blitzstars/getTimeDaysAgo'; import { tankAverages } from '../core/blitzstars/tankAverages'; import { ResolvedPlayer } from '../core/discord/resolvePlayerFromCommand'; import { AccountInfo, AllStats } from '../types/accountInfo'; -import { PlayerClanData } from '../types/playerClanData'; +import { PlayerClanInfo } from '../types/playerClanData'; import { PossiblyPromise } from '../types/possiblyPromise'; export default async function today( @@ -36,7 +36,7 @@ export default async function today( const accountInfo = await getWargamingResponse( `https://api.wotblitz.${server}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, ); - const clanData = await getWargamingResponse( + const clanData = await getWargamingResponse( `https://api.wotblitz.${server}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}&extra=clan`, ); const careerTankStatsRaw = await getTankStats(server, id); diff --git a/src/types/playerClanData.ts b/src/types/playerClanData.ts index 4dab4ff4d..63bbd0fcf 100644 --- a/src/types/playerClanData.ts +++ b/src/types/playerClanData.ts @@ -1,4 +1,4 @@ -export type PlayerClanData = { +export type PlayerClanInfo = { [accountId: number]: { account_id: number; joined_at: number; From d062a0da1bcaa211c5ae0d89c0fcbd78900ba648 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Wed, 11 Oct 2023 18:57:51 -0500 Subject: [PATCH 10/43] feat: updated full stats --- src/commands/fullStats.tsx | 136 +++++++------- src/commands/stats.tsx | 9 +- .../GenericAllStats/components/Card.tsx | 1 + src/core/blitz/filterStats.ts | 2 +- src/core/blitz/tankopedia.ts | 2 +- src/core/blitzkrieg/getTierWeights.ts | 22 +++ src/renderers/fullStats.tsx | 173 ------------------ 7 files changed, 99 insertions(+), 246 deletions(-) create mode 100644 src/core/blitzkrieg/getTierWeights.ts delete mode 100644 src/renderers/fullStats.tsx diff --git a/src/commands/fullStats.tsx b/src/commands/fullStats.tsx index 2350d7fc3..67ed931c9 100644 --- a/src/commands/fullStats.tsx +++ b/src/commands/fullStats.tsx @@ -1,23 +1,68 @@ import { SlashCommandBuilder } from 'discord.js'; -import { TreeTypeString } from '../components/Tanks'; -import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; -import getWargamingResponse from '../core/blitz/getWargamingResponse'; -import resolveTankId from '../core/blitz/resolveTankId'; +import GenericAllStats from '../components/GenericAllStats'; +import NoData, { NoDataType } from '../components/NoData'; +import TierWeights from '../components/TierWeights'; +import TitleBar from '../components/TitleBar'; +import Wrapper from '../components/Wrapper'; +import { StatFilters, filterStats } from '../core/blitz/filterStats'; +import { getAccountInfo } from '../core/blitz/getAccountInfo'; +import { getClanLogo } from '../core/blitz/getClanLogo'; +import { playerClanInfo } from '../core/blitz/playerClanInfo'; +import { filtersToDescription } from '../core/blitzkrieg/filtersToDescription'; +import { getTierWeights } from '../core/blitzkrieg/getTierWeights'; +import { getBlitzStarsLinkButton } from '../core/blitzstars/getBlitzStarsLinkButton'; +import getDiffedTankStats from '../core/blitzstars/getDiffedTankStats'; import addStatTypeSubCommandGroups from '../core/discord/addStatTypeSubCommandGroups'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteTanks from '../core/discord/autocompleteTanks'; import autocompleteUsername from '../core/discord/autocompleteUsername'; +import { getCustomPeriodParams } from '../core/discord/getCustomPeriodParams'; +import { getFiltersFromButton } from '../core/discord/getFiltersFromButton'; +import { getFiltersFromCommand } from '../core/discord/getFiltersFromCommand'; import interactionToURL from '../core/discord/interactionToURL'; -import linkButton from '../core/discord/linkButton'; -import primaryButton from '../core/discord/primaryButton'; +import { refreshButton } from '../core/discord/refreshButton'; import resolvePeriodFromButton from '../core/discord/resolvePeriodFromButton'; -import resolvePeriodFromCommand from '../core/discord/resolvePeriodFromCommand'; +import resolvePeriodFromCommand, { + ResolvedPeriod, +} from '../core/discord/resolvePeriodFromCommand'; import resolvePlayerFromButton from '../core/discord/resolvePlayerFromButton'; -import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand'; +import resolvePlayerFromCommand, { + ResolvedPlayer, +} from '../core/discord/resolvePlayerFromCommand'; import { CommandRegistryRaw } from '../events/interactionCreate'; -import fullStats from '../renderers/fullStats'; -import { MultiTankFilters, StatType } from '../renderers/stats'; -import { AccountInfo } from '../types/accountInfo'; + +async function render( + { region, id }: ResolvedPlayer, + { start, end, name }: ResolvedPeriod, + filters: StatFilters, +) { + const nickname = (await getAccountInfo(region, id))[id].nickname; + const clan = (await playerClanInfo(region, id))[id]?.clan; + const clanImage = clan ? getClanLogo(clan.emblem_set_id) : undefined; + const diffedTankStats = await getDiffedTankStats(region, id, start, end); + const { stats, supplementary, filteredOrder } = await filterStats( + diffedTankStats, + filters, + ); + const filterDescriptions = await filtersToDescription(filters); + const tierWeights = await getTierWeights(diffedTankStats.diff, filteredOrder); + + return ( + + + + {stats.battles === 0 && } + {stats.battles > 0 && } + {stats.battles > 0 && ( + + )} + + ); +} export const fullStatsCommand = new Promise( async (resolve) => { @@ -35,59 +80,23 @@ export const fullStatsCommand = new Promise( command, async handler(interaction) { - const commandGroup = interaction.options.getSubcommandGroup( - true, - ) as StatType; - const player = await resolvePlayerFromCommand(interaction); + const resolvedPlayer = await resolvePlayerFromCommand(interaction); const resolvedPeriod = resolvePeriodFromCommand( - player.region, + resolvedPlayer.region, interaction, ); - const period = interaction.options.getString('period'); - const tankIdRaw = interaction.options.getString('tank')!; - const tankId = - commandGroup === 'tank' ? await resolveTankId(tankIdRaw) : null; - const start = interaction.options.getInteger('start'); - const end = interaction.options.getInteger('end'); + const filters = getFiltersFromCommand(interaction); const path = interactionToURL(interaction, { - ...player, - tankId, - start, - end, - period, + ...resolvedPlayer, + ...getCustomPeriodParams(interaction), + ...filters, }); - const { nickname } = ( - await getWargamingResponse( - `https://api.wotblitz.${player.region}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${player.id}`, - ) - )[player.id]; - const tierOption = interaction.options.getString('tier'); - - return [ - await fullStats( - commandGroup, - resolvedPeriod, - player, - commandGroup === 'tank' - ? tankId - : commandGroup === 'multi-tank' - ? ({ - 'tank-type': - interaction.options.getString('tank-type') ?? undefined, - nation: interaction.options.getString('nation') ?? undefined, - tier: tierOption ? parseInt(tierOption) : undefined, - 'tree-type': (interaction.options.getString('tree-type') ?? - undefined) as TreeTypeString | undefined, - } satisfies Partial) - : null, - ), - primaryButton(path, 'Refresh'), - linkButton( - `https://www.blitzstars.com/player/${player.region}/${nickname}`, - 'BlitzStars', - ), - ]; + return Promise.all([ + render(resolvedPlayer, resolvedPeriod, filters), + refreshButton(interaction, path), + getBlitzStarsLinkButton(resolvedPlayer.region, resolvedPlayer.id), + ]); }, autocomplete: (interaction) => { @@ -96,18 +105,11 @@ export const fullStatsCommand = new Promise( }, async button(interaction) { - const url = new URL(`https://example.com/${interaction.customId}`); - const path = url.pathname.split('/').filter(Boolean); - const commandGroup = path[1] as StatType; const player = await resolvePlayerFromButton(interaction); const period = resolvePeriodFromButton(player.region, interaction); + const filters = getFiltersFromButton(interaction); - return await fullStats( - commandGroup, - period, - player, - parseInt(url.searchParams.get('tankId')!), - ); + return await render(player, period, filters); }, }); }, diff --git a/src/commands/stats.tsx b/src/commands/stats.tsx index b6f3e48f2..b670cd098 100644 --- a/src/commands/stats.tsx +++ b/src/commands/stats.tsx @@ -29,7 +29,7 @@ import resolvePlayerFromCommand, { } from '../core/discord/resolvePlayerFromCommand'; import { CommandRegistryRaw } from '../events/interactionCreate'; -export default async function render( +async function render( { region, id }: ResolvedPlayer, { start, end, name }: ResolvedPeriod, filters: StatFilters, @@ -39,17 +39,18 @@ export default async function render( const clanImage = clan ? getClanLogo(clan.emblem_set_id) : undefined; const diffedTankStats = await getDiffedTankStats(region, id, start, end); const { stats, supplementary } = await filterStats(diffedTankStats, filters); + const filterDescriptions = await filtersToDescription(filters); return ( - {!stats?.battles && } - {stats?.battles > 0 && ( + {!stats.battles && } + {stats.battles > 0 && ( )} diff --git a/src/components/GenericAllStats/components/Card.tsx b/src/components/GenericAllStats/components/Card.tsx index ac42bb83e..0b570a837 100644 --- a/src/components/GenericAllStats/components/Card.tsx +++ b/src/components/GenericAllStats/components/Card.tsx @@ -44,6 +44,7 @@ export function Card({ items, title }: CardProps) { > {items.map((item) => (
, + order: number[] = Object.keys(stats).map(parseInt), +) { + const awaitedTankopedia = await tankopedia; + const tierWeights: TierWeightsRecord = {}; + + order.map((id) => { + const entry = awaitedTankopedia[id]; + + if (!entry) return; + if (!tierWeights[entry.tier]) tierWeights[entry.tier] = 0; + + tierWeights[entry.tier]! += stats[id].battles; + }); + + return tierWeights; +} diff --git a/src/renderers/fullStats.tsx b/src/renderers/fullStats.tsx deleted file mode 100644 index 067d6b0b1..000000000 --- a/src/renderers/fullStats.tsx +++ /dev/null @@ -1,173 +0,0 @@ -import GenericAllStats from '../components/GenericAllStats'; -import NoData, { NoDataType } from '../components/NoData'; -import TierWeights, { TierWeightsRecord } from '../components/TierWeights'; -import TitleBar from '../components/TitleBar'; -import Wrapper from '../components/Wrapper'; -import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; -import calculateWN8 from '../core/blitz/calculateWN8'; -import getWargamingResponse from '../core/blitz/getWargamingResponse'; -import resolveTankName from '../core/blitz/resolveTankName'; -import sumStats from '../core/blitz/sumStats'; -import { Tier, tankopedia } from '../core/blitz/tankopedia'; -import getDiffedTankStats from '../core/blitzstars/getDiffedTankStats'; -import { tankAverages } from '../core/blitzstars/tankAverages'; -import { ResolvedPeriod } from '../core/discord/resolvePeriodFromCommand'; -import { ResolvedPlayer } from '../core/discord/resolvePlayerFromCommand'; -import { - AccountInfo, - AllStats, - SupplementaryStats, -} from '../types/accountInfo'; -import { PlayerClanInfo } from '../types/playerClanData'; -import { MultiTankFilters, StatType } from './stats'; - -export default async function fullStats( - type: Type, - { start, end, name: statsName }: ResolvedPeriod, - { region: server, id }: ResolvedPlayer, - filters: Type extends 'tank' - ? number - : Type extends 'multi-tank' - ? Partial - : null, -) { - let nameDiscriminator: string | undefined; - let image: string | undefined; - - if (type === 'player' || type === 'multi-tank') { - const clan = ( - await getWargamingResponse( - `https://api.wotblitz.${server}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}&extra=clan`, - ) - )[id]?.clan; - - if (clan) nameDiscriminator = `[${clan.tag}]`; - image = clan - ? `https://wotblitz-gc.gcdn.co/icons/clanEmblems1x/clan-icon-v2-${clan.emblem_set_id}.png` - : undefined; - } else if (type === 'tank') { - nameDiscriminator = `(${await resolveTankName(filters as number)})`; - image = (await tankopedia)[filters as number]?.images.normal; - } - - const { diff: diffed, order } = await getDiffedTankStats( - server, - id, - start, - end, - ); - const awaitedTankopedia = await tankopedia; - let stats: AllStats | undefined; - let supplementaryStats: SupplementaryStats; - let tierWeights: TierWeightsRecord; - - if (type === 'player' || type === 'multi-tank') { - const typedFilters = filters as Partial | null; - const filteredOrder = order.filter( - (id) => - typedFilters === null || - ((typedFilters.nation === undefined || - awaitedTankopedia[id]?.nation === typedFilters.nation) && - (typedFilters['tank-type'] === undefined || - awaitedTankopedia[id]?.type === typedFilters['tank-type']) && - (typedFilters.tier === undefined || - awaitedTankopedia[id]?.tier === typedFilters.tier) && - (typedFilters['tree-type'] === undefined || - (typedFilters['tree-type'] === 'collector' && - awaitedTankopedia[id]?.is_collectible) || - (typedFilters['tree-type'] === 'premium' && - awaitedTankopedia[id]?.is_premium) || - (typedFilters['tree-type'] === 'techtree' && - !awaitedTankopedia[id]?.is_collectible && - !awaitedTankopedia[id]?.is_premium))), - ); - const awaitedTankAverages = await tankAverages; - stats = sumStats(filteredOrder.map((id) => diffed[id])); - const battlesOfTanksWithAverages = filteredOrder.reduce( - (accumulator, id) => - awaitedTankAverages[id] - ? accumulator + diffed[id].battles - : accumulator, - 0, - ); - const battlesOfTanksWithTankopediaEntry = filteredOrder.reduce( - (accumulator, id) => - awaitedTankopedia[id] ? accumulator + diffed[id].battles : accumulator, - 0, - ); - - supplementaryStats = { - WN8: - filteredOrder.reduce( - (accumulator, id) => - awaitedTankAverages[id] - ? accumulator + - calculateWN8(awaitedTankAverages[id].all, diffed[id]) * - diffed[id].battles - : accumulator, - 0, - ) / battlesOfTanksWithAverages, - tier: - filteredOrder.reduce( - (accumulator, id) => - awaitedTankopedia[id] - ? accumulator + awaitedTankopedia[id]!.tier * diffed[id].battles - : accumulator, - 0, - ) / battlesOfTanksWithTankopediaEntry, - }; - tierWeights = filteredOrder.reduce((accumulator, id) => { - const tankopediaEntry = awaitedTankopedia[id]; - - if (!tankopediaEntry) return accumulator; - - const tier = tankopediaEntry.tier as Tier; - - if (accumulator[tier]) { - accumulator[tier]! += diffed[id].battles; - } else { - accumulator[tier] = diffed[id].battles; - } - - return accumulator; - }, {}); - } else { - stats = diffed[(filters as number)!]; - - supplementaryStats = { - WN8: stats - ? calculateWN8( - (await tankAverages)[(filters as number)!].all, - diffed[(filters as number)!], - ) - : undefined, - tier: (await tankopedia)[(filters as number)!]?.tier, - }; - } - - const accountInfo = await getWargamingResponse( - `https://api.wotblitz.${server}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, - ); - - return ( - - - - {stats.battles === 0 && } - {stats.battles > 0 && type === 'player' && ( - - )} - {stats.battles > 0 && ( - - )} - - ); -} From 59bae96c1b12de98889469b25ba3e67ee67cf65d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Wed, 11 Oct 2023 19:01:00 -0500 Subject: [PATCH 11/43] feat: change tier weights to arabic numerals --- src/components/TierWeights.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/TierWeights.tsx b/src/components/TierWeights.tsx index f08a7046f..db5ecb2cd 100644 --- a/src/components/TierWeights.tsx +++ b/src/components/TierWeights.tsx @@ -1,4 +1,4 @@ -import { TIER_ROMAN_NUMERALS, Tier } from '../core/blitz/tankopedia'; +import { Tier } from '../core/blitz/tankopedia'; import { theme } from '../stitches.config'; export type TierWeightsRecord = Partial>; @@ -26,7 +26,7 @@ export default function TierWeights({ weights }: TierWeightsProps) { minWidth: 16, }} > - {TIER_ROMAN_NUMERALS[parseInt(tier) as Tier]} + {tier}
))}
From 0db96795b36f076527cf4df66397bbaaff8ea29e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Wed, 11 Oct 2023 19:04:58 -0500 Subject: [PATCH 12/43] fix: a few type erros --- src/commands/evolution.tsx | 1 - src/commands/ownedTanks.tsx | 7 +------ src/commands/ratings.tsx | 3 +-- src/components/Breakdown/components/Row.tsx | 3 +-- src/core/discord/normalizeInteractionReturnable.ts | 2 ++ src/renderers/evolution.tsx | 6 ++---- src/renderers/today.tsx | 5 +---- 7 files changed, 8 insertions(+), 19 deletions(-) diff --git a/src/commands/evolution.tsx b/src/commands/evolution.tsx index 1de62cce2..11eab4063 100644 --- a/src/commands/evolution.tsx +++ b/src/commands/evolution.tsx @@ -15,7 +15,6 @@ import resolvePlayerFromButton from '../core/discord/resolvePlayerFromButton'; import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand'; import { CommandRegistryRaw } from '../events/interactionCreate'; import evolution from '../renderers/evolution'; -import { StatType } from '../renderers/stats'; import { AccountInfo } from '../types/accountInfo'; export const evolutionCommand = new Promise( diff --git a/src/commands/ownedTanks.tsx b/src/commands/ownedTanks.tsx index 17297119a..595faeba6 100644 --- a/src/commands/ownedTanks.tsx +++ b/src/commands/ownedTanks.tsx @@ -91,17 +91,12 @@ export const ownedTanksCommand: CommandRegistry = { {filteredTanks.length === 0 && } diff --git a/src/commands/ratings.tsx b/src/commands/ratings.tsx index e6506b3b7..29ec7e91a 100644 --- a/src/commands/ratings.tsx +++ b/src/commands/ratings.tsx @@ -513,8 +513,7 @@ export const ratingsCommand = new Promise( {items && ( diff --git a/src/components/Breakdown/components/Row.tsx b/src/components/Breakdown/components/Row.tsx index 9c4a7281f..04328e483 100644 --- a/src/components/Breakdown/components/Row.tsx +++ b/src/components/Breakdown/components/Row.tsx @@ -1,5 +1,4 @@ import { Percentile } from '../../../constants/percentiles'; -import { TankType } from '../../../core/blitz/tankopedia'; import { theme } from '../../../stitches.config'; import { TREE_TYPE_ICONS, TreeTypeEnum } from '../../Tanks'; import { RowStat } from './RowStat'; @@ -17,7 +16,7 @@ interface RowProps { title: string; minimized?: boolean; treeType?: TreeTypeEnum; - tankType?: TankType; + tankType?: string; stats: (RowStatItem | undefined)[]; } diff --git a/src/core/discord/normalizeInteractionReturnable.ts b/src/core/discord/normalizeInteractionReturnable.ts index 1e5ef9561..0ee6cd014 100644 --- a/src/core/discord/normalizeInteractionReturnable.ts +++ b/src/core/discord/normalizeInteractionReturnable.ts @@ -34,6 +34,8 @@ export default async function normalizeInteractionReturnable( } else if (item instanceof AttachmentBuilder) { if (!reply.files) reply.files = []; reply.files.push(item); + } else if (item === null) { + return; } else { const image = await jsxToPng(item); if (!reply.files) reply.files = []; diff --git a/src/renderers/evolution.tsx b/src/renderers/evolution.tsx index d245afcc2..2b792e388 100644 --- a/src/renderers/evolution.tsx +++ b/src/renderers/evolution.tsx @@ -13,11 +13,10 @@ import { ResolvedPlayer } from '../core/discord/resolvePlayerFromCommand'; import { AccountInfo } from '../types/accountInfo'; import { Histories } from '../types/histories'; import { PlayerClanInfo } from '../types/playerClanData'; -import { StatType } from './stats'; export default async function evolution( type: Type, - { start, end, evolutionName }: ResolvedPeriod, + { start, end, name }: ResolvedPeriod, { region: server, id }: ResolvedPlayer, tankId: Type extends 'tank' ? number : null, ) { @@ -84,9 +83,8 @@ export default async function evolution( {/* goofy ahh bug forces me to call them as functions */} diff --git a/src/renderers/today.tsx b/src/renderers/today.tsx index 481ce7f10..baf7cfb96 100644 --- a/src/renderers/today.tsx +++ b/src/renderers/today.tsx @@ -192,15 +192,12 @@ export default async function today( {rows.length === 0 && } From db976c4ae98cace4f5cfb14315fbafde7b2188a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Wed, 11 Oct 2023 20:18:51 -0500 Subject: [PATCH 13/43] =?UTF-8?q?feat:=20added=20future=20features=20?= =?UTF-8?q?=F0=9F=91=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/commands/evolution.tsx | 139 +++++++++++++++++- src/core/blitzkrieg/addStatPropertyOptions.ts | 61 ++++++++ src/core/discord/autocompleteClan.ts | 2 - src/core/discord/autocompleteStatProperty.ts | 20 +++ src/core/discord/autocompleteTanks.ts | 2 - src/core/discord/autocompleteUsername.ts | 8 +- src/renderers/evolution.tsx | 120 --------------- 7 files changed, 214 insertions(+), 138 deletions(-) create mode 100644 src/core/blitzkrieg/addStatPropertyOptions.ts create mode 100644 src/core/discord/autocompleteStatProperty.ts delete mode 100644 src/renderers/evolution.tsx diff --git a/src/commands/evolution.tsx b/src/commands/evolution.tsx index 11eab4063..3cebffd36 100644 --- a/src/commands/evolution.tsx +++ b/src/commands/evolution.tsx @@ -2,20 +2,130 @@ import { SlashCommandBuilder } from 'discord.js'; import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; import getWargamingResponse from '../core/blitz/getWargamingResponse'; import resolveTankId from '../core/blitz/resolveTankId'; +import getPlayerHistories from '../core/blitzstars/getPlayerHistories'; +import getTankHistories from '../core/blitzstars/getTankHistories'; import addStatTypeSubCommandGroups from '../core/discord/addStatTypeSubCommandGroups'; -import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteTanks from '../core/discord/autocompleteTanks'; import autocompleteUsername from '../core/discord/autocompleteUsername'; import interactionToURL from '../core/discord/interactionToURL'; import linkButton from '../core/discord/linkButton'; import primaryButton from '../core/discord/primaryButton'; import resolvePeriodFromButton from '../core/discord/resolvePeriodFromButton'; -import resolvePeriodFromCommand from '../core/discord/resolvePeriodFromCommand'; +import resolvePeriodFromCommand, { + ResolvedPeriod, +} from '../core/discord/resolvePeriodFromCommand'; import resolvePlayerFromButton from '../core/discord/resolvePlayerFromButton'; -import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand'; +import resolvePlayerFromCommand, { + ResolvedPlayer, +} from '../core/discord/resolvePlayerFromCommand'; import { CommandRegistryRaw } from '../events/interactionCreate'; -import evolution from '../renderers/evolution'; import { AccountInfo } from '../types/accountInfo'; +import { PlayerClanInfo } from '../types/playerClanData'; + +async function render( + { region, id }: ResolvedPlayer, + { start, end, name }: ResolvedPeriod, + type: 'player' | 'tank', + tankId?: number, +) { + let nameDiscriminator: string | undefined; + let image: string | undefined; + + if (type === 'player') { + const clan = ( + await getWargamingResponse( + `https://api.wotblitz.${region}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}&extra=clan`, + ) + )[id]?.clan; + + if (clan) nameDiscriminator = `[${clan.tag}]`; + image = clan + ? `https://wotblitz-gc.gcdn.co/icons/clanEmblems1x/clan-icon-v2-${clan.emblem_set_id}.png` + : undefined; + } else { + nameDiscriminator = `(${await resolveTankName(tankId!)})`; + image = (await tankopedia)[tankId!]?.images.normal; + } + + let histories: Histories; + + if (type === 'player') { + histories = await getPlayerHistories(region, id, { + start, + end, + includeLatestHistories: true, + includePreviousHistories: true, + }); + } else { + histories = await getTankHistories(region, id, { + tankId: tankId!, + start, + end, + includeLatestHistories: true, + includePreviousHistories: true, + }); + } + + const plot = histories.map( + (history) => + [ + history.all.battles, + (history.all.wins / history.all.battles) * 100, + ] as Graph.PlotItem, + ); + const times = histories.map((history) => history.last_battle_time); + const minTime = Math.min(...times); + const maxTime = Math.max(...times); + const ys = plot.map(([, y]) => y); + const xs = plot.map(([x]) => x); + const maxY = Math.max(...ys); + const minY = Math.min(...ys); + const maxX = Math.max(...xs); + const minX = Math.min(...xs); + + const accountInfo = await getWargamingResponse( + `https://api.wotblitz.${region}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, + ); + + return ( + + + + {/* goofy ahh bug forces me to call them as functions */} + {plot.length > 0 && ( + + {Graph.Line({ + // career winrate + color: Graph.LineColor.Red, + plot: plot, + minY, + maxY, + })} + + )} + + {plot.length === 0 && } + + ); +} export const evolutionCommand = new Promise( async (resolve) => { @@ -23,7 +133,21 @@ export const evolutionCommand = new Promise( new SlashCommandBuilder() .setName('evolution') .setDescription('Evolution of statistics'), - (option) => option.addStringOption(addUsernameChoices), + // (option) => + // option + // .addStringOption((option) => + // addStatPropertyOptions(option) + // .setName('x') + // .setDescription('X axis') + // .setRequired(false), + // ) + // .addStringOption((option) => + // addStatPropertyOptions(option) + // .setName('y') + // .setDescription('Y axis') + // .setRequired(false), + // ) + // .addStringOption(addUsernameChoices), ); resolve({ @@ -56,7 +180,7 @@ export const evolutionCommand = new Promise( }); return [ - await evolution(commandGroup, period, player, tankId), + await render(commandGroup, period, player, tankId), primaryButton(path, 'Refresh'), linkButton( `https://www.blitzstars.com/player/${player.region}/${nickname}${ @@ -70,6 +194,7 @@ export const evolutionCommand = new Promise( autocomplete: (interaction) => { autocompleteUsername(interaction); autocompleteTanks(interaction); + // autocompleteStatProperty(interaction, 'x'); }, async button(interaction) { @@ -79,7 +204,7 @@ export const evolutionCommand = new Promise( const player = await resolvePlayerFromButton(interaction); const period = resolvePeriodFromButton(player.region, interaction); - return await evolution( + return await render( commandGroup, period, player, diff --git a/src/core/blitzkrieg/addStatPropertyOptions.ts b/src/core/blitzkrieg/addStatPropertyOptions.ts new file mode 100644 index 000000000..b8d6dcedb --- /dev/null +++ b/src/core/blitzkrieg/addStatPropertyOptions.ts @@ -0,0 +1,61 @@ +import { SlashCommandStringOption } from 'discord.js'; + +export const STAT_PROPERTIES = [ + { name: 'Time', value: 'time' }, + + { name: 'Battles', value: 'battles' }, + { name: 'Maximum XP', value: 'max_xp' }, + { name: 'Maximum kills', value: 'max_frags' }, + + { name: 'Accumulated spots', value: 'spotted' }, + { name: 'Accumulated hits', value: 'hits' }, + { name: 'Accumulated kills', value: 'frags' }, + { name: 'Accumulated wins', value: 'wins' }, + { name: 'Accumulated losses', value: 'losses' }, + { name: 'Accumulated capture points', value: 'capture_points' }, + { name: 'Accumulated damage dealt', value: 'damage_dealt' }, + { name: 'Accumulated damage received', value: 'damage_received' }, + { name: 'Accumulated shots', value: 'shots' }, + { name: 'Accumulated kills above tier 8', value: 'frags8p' }, + { name: 'Accumulated XP', value: 'xp' }, + { + name: 'Accumulated won and survived battles', + value: 'win_and_survived', + }, + { name: 'Accumulated survived battles', value: 'survived_battles' }, + { + name: 'Accumulated dropped capture points', + value: 'dropped_capture_points', + }, + + { name: 'Average spots', value: 'average_spotted' }, + { name: 'Average hits', value: 'average_hits' }, + { name: 'Average kills', value: 'average_frags' }, + { name: 'Average winrate', value: 'average_wins' }, + { name: 'Average loss rate', value: 'average_losses' }, + { name: 'Average capture points', value: 'average_capture_points' }, + { name: 'Average damage dealt', value: 'average_damage_dealt' }, + { name: 'Average damage received', value: 'average_damage_received' }, + { name: 'Average shots', value: 'average_shots' }, + { name: 'Average kills above tier 8', value: 'average_frags8p' }, + { name: 'Average XP', value: 'average_xp' }, + { + name: 'Average win and survival rate', + value: 'average_win_and_survived', + }, + { name: 'Average survival rate', value: 'average_survived_battles' }, + + { name: 'Average WN8', value: 'average_wn8' }, + { name: 'Average damage ratio', value: 'average_damage_ratio' }, + { + name: 'Average kills to death ratio', + value: 'average_kills_to_death_ratio', + }, +]; + +export function addStatPropertyOptions(option: SlashCommandStringOption) { + return option + .setName('stat-property') + .setDescription('A specific statistical property') + .setAutocomplete(true); +} diff --git a/src/core/discord/autocompleteClan.ts b/src/core/discord/autocompleteClan.ts index c80d0c2c5..1b9cef647 100644 --- a/src/core/discord/autocompleteClan.ts +++ b/src/core/discord/autocompleteClan.ts @@ -25,6 +25,4 @@ export default async function autocompleteClan( ) : [], ); - - console.log(`Clan autocomplete for ${focusedOption.value}`); } diff --git a/src/core/discord/autocompleteStatProperty.ts b/src/core/discord/autocompleteStatProperty.ts new file mode 100644 index 000000000..ff2cec6b1 --- /dev/null +++ b/src/core/discord/autocompleteStatProperty.ts @@ -0,0 +1,20 @@ +import { AutocompleteInteraction, CacheType } from 'discord.js'; +import { go } from 'fuzzysort'; +import { STAT_PROPERTIES } from '../blitzkrieg/addStatPropertyOptions'; + +export default async function autocompleteStatProperty( + interaction: AutocompleteInteraction, + name = 'stat-property', +) { + const focusedOption = interaction.options.getFocused(true); + if (focusedOption.name !== name) return; + + await interaction.respond( + focusedOption.value + ? go(focusedOption.value, STAT_PROPERTIES, { + keys: ['name'], + limit: 10, + }).map(({ obj }) => obj) + : STAT_PROPERTIES.slice(0, 25), + ); +} diff --git a/src/core/discord/autocompleteTanks.ts b/src/core/discord/autocompleteTanks.ts index dabd7d25a..64d953101 100644 --- a/src/core/discord/autocompleteTanks.ts +++ b/src/core/discord/autocompleteTanks.ts @@ -28,6 +28,4 @@ export default async function autocompleteTanks( ) : [], ); - - console.log(`Tanks autocomplete for ${focusedOption.value}`); } diff --git a/src/core/discord/autocompleteUsername.ts b/src/core/discord/autocompleteUsername.ts index f83722c01..753cfe516 100644 --- a/src/core/discord/autocompleteUsername.ts +++ b/src/core/discord/autocompleteUsername.ts @@ -25,11 +25,5 @@ export default async function autocompleteUsername( ) : [], ); - - console.log(`Username autocomplete for ${focusedOption.value}`); - } catch (error) { - console.warn( - `Failed to autocomplete username for ${focusedOption.value} in time`, - ); - } + } catch (error) {} } diff --git a/src/renderers/evolution.tsx b/src/renderers/evolution.tsx deleted file mode 100644 index 2b792e388..000000000 --- a/src/renderers/evolution.tsx +++ /dev/null @@ -1,120 +0,0 @@ -import * as Graph from '../components/Graph'; -import NoData, { NoDataType } from '../components/NoData'; -import TitleBar from '../components/TitleBar'; -import Wrapper from '../components/Wrapper'; -import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; -import getWargamingResponse from '../core/blitz/getWargamingResponse'; -import resolveTankName from '../core/blitz/resolveTankName'; -import { tankopedia } from '../core/blitz/tankopedia'; -import getPlayerHistories from '../core/blitzstars/getPlayerHistories'; -import getTankHistories from '../core/blitzstars/getTankHistories'; -import { ResolvedPeriod } from '../core/discord/resolvePeriodFromCommand'; -import { ResolvedPlayer } from '../core/discord/resolvePlayerFromCommand'; -import { AccountInfo } from '../types/accountInfo'; -import { Histories } from '../types/histories'; -import { PlayerClanInfo } from '../types/playerClanData'; - -export default async function evolution( - type: Type, - { start, end, name }: ResolvedPeriod, - { region: server, id }: ResolvedPlayer, - tankId: Type extends 'tank' ? number : null, -) { - let nameDiscriminator: string | undefined; - let image: string | undefined; - - if (type === 'player') { - const clan = ( - await getWargamingResponse( - `https://api.wotblitz.${server}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}&extra=clan`, - ) - )[id]?.clan; - - if (clan) nameDiscriminator = `[${clan.tag}]`; - image = clan - ? `https://wotblitz-gc.gcdn.co/icons/clanEmblems1x/clan-icon-v2-${clan.emblem_set_id}.png` - : undefined; - } else { - nameDiscriminator = `(${await resolveTankName(tankId!)})`; - image = (await tankopedia)[tankId!]?.images.normal; - } - - let histories: Histories; - - if (type === 'player') { - histories = await getPlayerHistories(server, id, { - start, - end, - includeLatestHistories: true, - includePreviousHistories: true, - }); - } else { - histories = await getTankHistories(server, id, { - tankId: tankId!, - start, - end, - includeLatestHistories: true, - includePreviousHistories: true, - }); - } - - const plot = histories.map( - (history) => - [ - history.all.battles, - (history.all.wins / history.all.battles) * 100, - ] as Graph.PlotItem, - ); - const times = histories.map((history) => history.last_battle_time); - const minTime = Math.min(...times); - const maxTime = Math.max(...times); - const ys = plot.map(([, y]) => y); - const xs = plot.map(([x]) => x); - const maxY = Math.max(...ys); - const minY = Math.min(...ys); - const maxX = Math.max(...xs); - const minX = Math.min(...xs); - - const accountInfo = await getWargamingResponse( - `https://api.wotblitz.${server}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, - ); - - return ( - - - - {/* goofy ahh bug forces me to call them as functions */} - {plot.length > 0 && ( - - {Graph.Line({ - // career winrate - color: Graph.LineColor.Red, - plot: plot, - minY, - maxY, - })} - - )} - - {plot.length === 0 && } - - ); -} From ec64dab720d2d92fcfc867da07e432cc42613963 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Wed, 11 Oct 2023 21:26:33 -0500 Subject: [PATCH 14/43] fix: use webp images in layout --- src/app/tools/layout.tsx | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/app/tools/layout.tsx b/src/app/tools/layout.tsx index 348899b48..2f281b63f 100644 --- a/src/app/tools/layout.tsx +++ b/src/app/tools/layout.tsx @@ -19,17 +19,32 @@ export default function ToolsLayout({ children }: ToolsLayoutProps) {
+
+ Date: Thu, 12 Oct 2023 11:45:43 -0500 Subject: [PATCH 15/43] feat: sorted commands in /about commands --- src/commands/about.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/commands/about.ts b/src/commands/about.ts index d0d28ec5c..63fbc6aa0 100644 --- a/src/commands/about.ts +++ b/src/commands/about.ts @@ -51,6 +51,7 @@ export const aboutCommand: CommandRegistry = { await Promise.all(COMMANDS_RAW) ) .filter((registry) => registry.inPublic && registry.inProduction) + .sort((a, b) => (a.command.name < b.command.name ? -1 : 1)) .map( (registry) => `- \`/${registry.command.name}\`: ${registry.command.description}`, From bcd3a00f91accb32239bd3a9e5aeb28ace4a3f5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Thu, 12 Oct 2023 11:56:11 -0500 Subject: [PATCH 16/43] feat: updated /evolution --- src/commands/evolution.tsx | 161 +++++++++--------- src/commands/fullStats.tsx | 8 +- src/commands/stats.tsx | 8 +- ...playerClanInfo.ts => getPlayerClanInfo.ts} | 2 +- src/core/discord/addPeriodSubCommands.ts | 13 +- ...andGroups.ts => addStatTypeSubCommands.ts} | 14 +- 6 files changed, 107 insertions(+), 99 deletions(-) rename src/core/blitz/{playerClanInfo.ts => getPlayerClanInfo.ts} (87%) rename src/core/discord/{addStatTypeSubCommandGroups.ts => addStatTypeSubCommands.ts} (87%) diff --git a/src/commands/evolution.tsx b/src/commands/evolution.tsx index 3cebffd36..8404f13cc 100644 --- a/src/commands/evolution.tsx +++ b/src/commands/evolution.tsx @@ -1,10 +1,21 @@ -import { SlashCommandBuilder } from 'discord.js'; +import { + SlashCommandBuilder, + SlashCommandSubcommandGroupBuilder, +} from 'discord.js'; +import * as Graph from '../components/Graph'; +import NoData, { NoDataType } from '../components/NoData'; +import TitleBar from '../components/TitleBar'; +import Wrapper from '../components/Wrapper'; import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; +import { getAccountInfo } from '../core/blitz/getAccountInfo'; +import { getClanLogo } from '../core/blitz/getClanLogo'; +import { getPlayerClanInfo } from '../core/blitz/getPlayerClanInfo'; import getWargamingResponse from '../core/blitz/getWargamingResponse'; import resolveTankId from '../core/blitz/resolveTankId'; import getPlayerHistories from '../core/blitzstars/getPlayerHistories'; import getTankHistories from '../core/blitzstars/getTankHistories'; -import addStatTypeSubCommandGroups from '../core/discord/addStatTypeSubCommandGroups'; +import addPeriodSubCommands from '../core/discord/addPeriodSubCommands'; +import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteTanks from '../core/discord/autocompleteTanks'; import autocompleteUsername from '../core/discord/autocompleteUsername'; import interactionToURL from '../core/discord/interactionToURL'; @@ -20,52 +31,31 @@ import resolvePlayerFromCommand, { } from '../core/discord/resolvePlayerFromCommand'; import { CommandRegistryRaw } from '../events/interactionCreate'; import { AccountInfo } from '../types/accountInfo'; -import { PlayerClanInfo } from '../types/playerClanData'; + +type EvolutionStatType = 'player' | 'tank'; async function render( { region, id }: ResolvedPlayer, { start, end, name }: ResolvedPeriod, type: 'player' | 'tank', - tankId?: number, + tankId: number | null, ) { - let nameDiscriminator: string | undefined; - let image: string | undefined; - - if (type === 'player') { - const clan = ( - await getWargamingResponse( - `https://api.wotblitz.${region}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}&extra=clan`, - ) - )[id]?.clan; - - if (clan) nameDiscriminator = `[${clan.tag}]`; - image = clan - ? `https://wotblitz-gc.gcdn.co/icons/clanEmblems1x/clan-icon-v2-${clan.emblem_set_id}.png` - : undefined; - } else { - nameDiscriminator = `(${await resolveTankName(tankId!)})`; - image = (await tankopedia)[tankId!]?.images.normal; - } - - let histories: Histories; - - if (type === 'player') { - histories = await getPlayerHistories(region, id, { - start, - end, - includeLatestHistories: true, - includePreviousHistories: true, - }); - } else { - histories = await getTankHistories(region, id, { - tankId: tankId!, - start, - end, - includeLatestHistories: true, - includePreviousHistories: true, - }); - } - + const clan = (await getPlayerClanInfo(region, id))[id]?.clan; + const logo = clan ? getClanLogo(clan.emblem_set_id) : undefined; + const histories = await (type === 'player' + ? getPlayerHistories(region, id, { + start, + end, + includeLatestHistories: true, + includePreviousHistories: true, + }) + : getTankHistories(region, id, { + tankId: tankId!, + start, + end, + includeLatestHistories: true, + includePreviousHistories: true, + })); const plot = histories.map( (history) => [ @@ -91,7 +81,7 @@ async function render( @@ -129,26 +119,32 @@ async function render( export const evolutionCommand = new Promise( async (resolve) => { - const command = await addStatTypeSubCommandGroups( - new SlashCommandBuilder() - .setName('evolution') - .setDescription('Evolution of statistics'), - // (option) => - // option - // .addStringOption((option) => - // addStatPropertyOptions(option) - // .setName('x') - // .setDescription('X axis') - // .setRequired(false), - // ) - // .addStringOption((option) => - // addStatPropertyOptions(option) - // .setName('y') - // .setDescription('Y axis') - // .setRequired(false), - // ) - // .addStringOption(addUsernameChoices), - ); + let playerGroup: SlashCommandSubcommandGroupBuilder; + let tankGroup: SlashCommandSubcommandGroupBuilder; + const command = new SlashCommandBuilder() + .setName('evolution') + .setDescription('Evolution of statistics') + .addSubcommandGroup((option) => { + playerGroup = option + .setName('player') + .setDescription('Player statistics'); + + return playerGroup; + }) + .addSubcommandGroup((option) => { + tankGroup = option.setName('tank').setDescription('Tank statistics'); + + return tankGroup; + }); + + await Promise.all([ + addPeriodSubCommands(playerGroup!, (option) => + option.addStringOption(addUsernameChoices), + ), + addPeriodSubCommands(tankGroup!, (option) => + option.addStringOption(addUsernameChoices), + ), + ]); resolve({ inProduction: true, @@ -157,35 +153,35 @@ export const evolutionCommand = new Promise( command, async handler(interaction) { - const commandGroup = interaction.options.getSubcommandGroup( - true, - ) as StatType; - const player = await resolvePlayerFromCommand(interaction); - const period = resolvePeriodFromCommand(player.region, interaction); + const commandGroup = + interaction.options.getSubcommandGroup() as EvolutionStatType; + const resolvedPlayer = await resolvePlayerFromCommand(interaction); + const resolvedPeriod = resolvePeriodFromCommand( + resolvedPlayer.region, + interaction, + ); const tankIdRaw = interaction.options.getString('tank')!; const tankId = commandGroup === 'tank' ? await resolveTankId(tankIdRaw) : null; const start = interaction.options.getInteger('start'); const end = interaction.options.getInteger('end'); const { nickname } = ( - await getWargamingResponse( - `https://api.wotblitz.${player.region}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${player.id}`, - ) - )[player.id]; + await getAccountInfo(resolvedPlayer.region, resolvedPlayer.id) + )[resolvedPlayer.id]; const path = interactionToURL(interaction, { - ...player, + ...resolvedPlayer, tankId, start, end, }); return [ - await render(commandGroup, period, player, tankId), + await render(resolvedPlayer, resolvedPeriod, commandGroup, tankId), primaryButton(path, 'Refresh'), linkButton( - `https://www.blitzstars.com/player/${player.region}/${nickname}${ - commandGroup === 'tank' ? `/tank/${tankId!}` : '' - }`, + `https://www.blitzstars.com/player/${ + resolvedPlayer.region + }/${nickname}${commandGroup === 'tank' ? `/tank/${tankId!}` : ''}`, 'BlitzStars', ), ]; @@ -194,21 +190,20 @@ export const evolutionCommand = new Promise( autocomplete: (interaction) => { autocompleteUsername(interaction); autocompleteTanks(interaction); - // autocompleteStatProperty(interaction, 'x'); }, async button(interaction) { const url = new URL(`https://example.com/${interaction.customId}`); - const path = url.pathname.split('/').filter(Boolean); - const commandGroup = path[1] as StatType; + const path = url.pathname.split('/'); + const commandGroup = path[1] as EvolutionStatType; const player = await resolvePlayerFromButton(interaction); const period = resolvePeriodFromButton(player.region, interaction); return await render( - commandGroup, - period, player, - parseInt(url.searchParams.get('tankId')!), + period, + commandGroup, + parseInt(url.searchParams.get('tankId') ?? '0') || null, ); }, }); diff --git a/src/commands/fullStats.tsx b/src/commands/fullStats.tsx index 67ed931c9..da0674517 100644 --- a/src/commands/fullStats.tsx +++ b/src/commands/fullStats.tsx @@ -7,12 +7,12 @@ import Wrapper from '../components/Wrapper'; import { StatFilters, filterStats } from '../core/blitz/filterStats'; import { getAccountInfo } from '../core/blitz/getAccountInfo'; import { getClanLogo } from '../core/blitz/getClanLogo'; -import { playerClanInfo } from '../core/blitz/playerClanInfo'; +import { getPlayerClanInfo } from '../core/blitz/getPlayerClanInfo'; import { filtersToDescription } from '../core/blitzkrieg/filtersToDescription'; import { getTierWeights } from '../core/blitzkrieg/getTierWeights'; import { getBlitzStarsLinkButton } from '../core/blitzstars/getBlitzStarsLinkButton'; import getDiffedTankStats from '../core/blitzstars/getDiffedTankStats'; -import addStatTypeSubCommandGroups from '../core/discord/addStatTypeSubCommandGroups'; +import addStatTypeSubCommands from '../core/discord/addStatTypeSubCommands'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteTanks from '../core/discord/autocompleteTanks'; import autocompleteUsername from '../core/discord/autocompleteUsername'; @@ -37,7 +37,7 @@ async function render( filters: StatFilters, ) { const nickname = (await getAccountInfo(region, id))[id].nickname; - const clan = (await playerClanInfo(region, id))[id]?.clan; + const clan = (await getPlayerClanInfo(region, id))[id]?.clan; const clanImage = clan ? getClanLogo(clan.emblem_set_id) : undefined; const diffedTankStats = await getDiffedTankStats(region, id, start, end); const { stats, supplementary, filteredOrder } = await filterStats( @@ -66,7 +66,7 @@ async function render( export const fullStatsCommand = new Promise( async (resolve) => { - const command = await addStatTypeSubCommandGroups( + const command = await addStatTypeSubCommands( new SlashCommandBuilder() .setName('full-stats') .setDescription('Full in-game statistics'), diff --git a/src/commands/stats.tsx b/src/commands/stats.tsx index b670cd098..0a12af782 100644 --- a/src/commands/stats.tsx +++ b/src/commands/stats.tsx @@ -6,11 +6,11 @@ import Wrapper from '../components/Wrapper'; import { StatFilters, filterStats } from '../core/blitz/filterStats'; import { getAccountInfo } from '../core/blitz/getAccountInfo'; import { getClanLogo } from '../core/blitz/getClanLogo'; -import { playerClanInfo } from '../core/blitz/playerClanInfo'; +import { getPlayerClanInfo } from '../core/blitz/getPlayerClanInfo'; import { filtersToDescription } from '../core/blitzkrieg/filtersToDescription'; import { getBlitzStarsLinkButton } from '../core/blitzstars/getBlitzStarsLinkButton'; import getDiffedTankStats from '../core/blitzstars/getDiffedTankStats'; -import addStatTypeSubCommandGroups from '../core/discord/addStatTypeSubCommandGroups'; +import addStatTypeSubCommands from '../core/discord/addStatTypeSubCommands'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteTanks from '../core/discord/autocompleteTanks'; import autocompleteUsername from '../core/discord/autocompleteUsername'; @@ -35,7 +35,7 @@ async function render( filters: StatFilters, ) { const nickname = (await getAccountInfo(region, id))[id].nickname; - const clan = (await playerClanInfo(region, id))[id]?.clan; + const clan = (await getPlayerClanInfo(region, id))[id]?.clan; const clanImage = clan ? getClanLogo(clan.emblem_set_id) : undefined; const diffedTankStats = await getDiffedTankStats(region, id, start, end); const { stats, supplementary } = await filterStats(diffedTankStats, filters); @@ -58,7 +58,7 @@ async function render( } export const statsCommand = new Promise(async (resolve) => { - const command = await addStatTypeSubCommandGroups( + const command = await addStatTypeSubCommands( new SlashCommandBuilder() .setName('stats') .setDescription('Regular battles statistics'), diff --git a/src/core/blitz/playerClanInfo.ts b/src/core/blitz/getPlayerClanInfo.ts similarity index 87% rename from src/core/blitz/playerClanInfo.ts rename to src/core/blitz/getPlayerClanInfo.ts index 151449b89..db30e7f0a 100644 --- a/src/core/blitz/playerClanInfo.ts +++ b/src/core/blitz/getPlayerClanInfo.ts @@ -3,7 +3,7 @@ import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID import { PlayerClanInfo } from '../../types/playerClanData'; import getWargamingResponse from './getWargamingResponse'; -export function playerClanInfo(region: Region, id: number) { +export function getPlayerClanInfo(region: Region, id: number) { return getWargamingResponse( `https://api.wotblitz.${region}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}&extra=clan`, ); diff --git a/src/core/discord/addPeriodSubCommands.ts b/src/core/discord/addPeriodSubCommands.ts index b8ca9c488..fa900898a 100644 --- a/src/core/discord/addPeriodSubCommands.ts +++ b/src/core/discord/addPeriodSubCommands.ts @@ -1,10 +1,14 @@ -import { SlashCommandBuilder, SlashCommandSubcommandBuilder } from 'discord.js'; +import { + SlashCommandBuilder, + SlashCommandSubcommandBuilder, + SlashCommandSubcommandGroupBuilder, +} from 'discord.js'; -export type PeriodType = 'today' | '30' | '60' | '90' | 'custom'; +export type PeriodType = 'today' | '30' | '60' | '90' | 'career' | 'custom'; export type PeriodSize = 'today' | `${number}` | 'career'; export default function addPeriodSubCommands( - option: SlashCommandBuilder, + option: SlashCommandBuilder | SlashCommandSubcommandGroupBuilder, extra: ( option: SlashCommandSubcommandBuilder, ) => SlashCommandSubcommandBuilder = (option) => option, @@ -22,6 +26,9 @@ export default function addPeriodSubCommands( .addSubcommand((option) => extra(option.setName('90').setDescription('90 days')), ) + .addSubcommand((option) => + extra(option.setName('career').setDescription('Career')), + ) .addSubcommand((option) => extra( option diff --git a/src/core/discord/addStatTypeSubCommandGroups.ts b/src/core/discord/addStatTypeSubCommands.ts similarity index 87% rename from src/core/discord/addStatTypeSubCommandGroups.ts rename to src/core/discord/addStatTypeSubCommands.ts index 5da5655e7..b528c0886 100644 --- a/src/core/discord/addStatTypeSubCommandGroups.ts +++ b/src/core/discord/addStatTypeSubCommands.ts @@ -1,16 +1,22 @@ -import { SlashCommandBuilder, SlashCommandSubcommandBuilder } from 'discord.js'; +import { + SlashCommandBuilder, + SlashCommandSubcommandBuilder, + SlashCommandSubcommandGroupBuilder, +} from 'discord.js'; import { TREE_TYPE_NAMES, TreeTypeString } from '../../components/Tanks'; import { tankopediaInfo } from '../blitz/tankopedia'; import addPeriodSubCommands from './addPeriodSubCommands'; import addTankChoices from './addTankChoices'; import addTierChoices from './addTierChoices'; -export default async function addStatTypeSubCommandGroups( - option: SlashCommandBuilder, +export default async function addStatTypeSubCommands< + OptionType extends SlashCommandBuilder | SlashCommandSubcommandGroupBuilder, +>( + option: OptionType, extra: ( option: SlashCommandSubcommandBuilder, ) => SlashCommandSubcommandBuilder = (option) => option, -) { +): Promise { const awaitedTankopediaInfo = await tankopediaInfo; addPeriodSubCommands(option, (option) => { From 7447ccc487d2fdf4442bbc5b418b6cb6b0ede5e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Thu, 12 Oct 2023 12:07:45 -0500 Subject: [PATCH 17/43] fix: evolution refresh button --- src/commands/evolution.tsx | 53 ++++++++----------- src/commands/fullStats.tsx | 13 ++--- src/commands/stats.tsx | 13 ++--- .../blitzstars/getBlitzStarsLinkButton.ts | 10 +++- src/core/discord/resolvePeriodFromButton.ts | 2 +- 5 files changed, 41 insertions(+), 50 deletions(-) diff --git a/src/commands/evolution.tsx b/src/commands/evolution.tsx index 8404f13cc..a7b1f6b27 100644 --- a/src/commands/evolution.tsx +++ b/src/commands/evolution.tsx @@ -6,20 +6,20 @@ import * as Graph from '../components/Graph'; import NoData, { NoDataType } from '../components/NoData'; import TitleBar from '../components/TitleBar'; import Wrapper from '../components/Wrapper'; -import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; import { getAccountInfo } from '../core/blitz/getAccountInfo'; import { getClanLogo } from '../core/blitz/getClanLogo'; import { getPlayerClanInfo } from '../core/blitz/getPlayerClanInfo'; -import getWargamingResponse from '../core/blitz/getWargamingResponse'; import resolveTankId from '../core/blitz/resolveTankId'; +import { getBlitzStarsLinkButton } from '../core/blitzstars/getBlitzStarsLinkButton'; import getPlayerHistories from '../core/blitzstars/getPlayerHistories'; import getTankHistories from '../core/blitzstars/getTankHistories'; import addPeriodSubCommands from '../core/discord/addPeriodSubCommands'; +import addTankChoices from '../core/discord/addTankChoices'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteTanks from '../core/discord/autocompleteTanks'; import autocompleteUsername from '../core/discord/autocompleteUsername'; +import { getCustomPeriodParams } from '../core/discord/getCustomPeriodParams'; import interactionToURL from '../core/discord/interactionToURL'; -import linkButton from '../core/discord/linkButton'; import primaryButton from '../core/discord/primaryButton'; import resolvePeriodFromButton from '../core/discord/resolvePeriodFromButton'; import resolvePeriodFromCommand, { @@ -30,7 +30,6 @@ import resolvePlayerFromCommand, { ResolvedPlayer, } from '../core/discord/resolvePlayerFromCommand'; import { CommandRegistryRaw } from '../events/interactionCreate'; -import { AccountInfo } from '../types/accountInfo'; type EvolutionStatType = 'player' | 'tank'; @@ -40,6 +39,7 @@ async function render( type: 'player' | 'tank', tankId: number | null, ) { + const accountInfo = await getAccountInfo(region, id); const clan = (await getPlayerClanInfo(region, id))[id]?.clan; const logo = clan ? getClanLogo(clan.emblem_set_id) : undefined; const histories = await (type === 'player' @@ -73,10 +73,6 @@ async function render( const maxX = Math.max(...xs); const minX = Math.min(...xs); - const accountInfo = await getWargamingResponse( - `https://api.wotblitz.${region}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, - ); - return ( - {/* goofy ahh bug forces me to call them as functions */} {plot.length > 0 && ( {Graph.Line({ - // career winrate color: Graph.LineColor.Red, plot: plot, minY, @@ -142,7 +136,9 @@ export const evolutionCommand = new Promise( option.addStringOption(addUsernameChoices), ), addPeriodSubCommands(tankGroup!, (option) => - option.addStringOption(addUsernameChoices), + option + .addStringOption(addTankChoices) + .addStringOption(addUsernameChoices), ), ]); @@ -155,34 +151,29 @@ export const evolutionCommand = new Promise( async handler(interaction) { const commandGroup = interaction.options.getSubcommandGroup() as EvolutionStatType; - const resolvedPlayer = await resolvePlayerFromCommand(interaction); - const resolvedPeriod = resolvePeriodFromCommand( - resolvedPlayer.region, - interaction, - ); + const player = await resolvePlayerFromCommand(interaction); + const period = resolvePeriodFromCommand(player.region, interaction); const tankIdRaw = interaction.options.getString('tank')!; const tankId = commandGroup === 'tank' ? await resolveTankId(tankIdRaw) : null; - const start = interaction.options.getInteger('start'); - const end = interaction.options.getInteger('end'); - const { nickname } = ( - await getAccountInfo(resolvedPlayer.region, resolvedPlayer.id) - )[resolvedPlayer.id]; + const { nickname } = (await getAccountInfo(player.region, player.id))[ + player.id + ]; const path = interactionToURL(interaction, { - ...resolvedPlayer, + ...player, + ...getCustomPeriodParams(interaction), tankId, - start, - end, }); + getBlitzStarsLinkButton; + return [ - await render(resolvedPlayer, resolvedPeriod, commandGroup, tankId), + await render(player, period, commandGroup, tankId), primaryButton(path, 'Refresh'), - linkButton( - `https://www.blitzstars.com/player/${ - resolvedPlayer.region - }/${nickname}${commandGroup === 'tank' ? `/tank/${tankId!}` : ''}`, - 'BlitzStars', + await getBlitzStarsLinkButton( + player.region, + player.id, + tankId ?? undefined, ), ]; }, @@ -195,7 +186,7 @@ export const evolutionCommand = new Promise( async button(interaction) { const url = new URL(`https://example.com/${interaction.customId}`); const path = url.pathname.split('/'); - const commandGroup = path[1] as EvolutionStatType; + const commandGroup = path[2] as EvolutionStatType; const player = await resolvePlayerFromButton(interaction); const period = resolvePeriodFromButton(player.region, interaction); diff --git a/src/commands/fullStats.tsx b/src/commands/fullStats.tsx index da0674517..92734a8db 100644 --- a/src/commands/fullStats.tsx +++ b/src/commands/fullStats.tsx @@ -80,22 +80,19 @@ export const fullStatsCommand = new Promise( command, async handler(interaction) { - const resolvedPlayer = await resolvePlayerFromCommand(interaction); - const resolvedPeriod = resolvePeriodFromCommand( - resolvedPlayer.region, - interaction, - ); + const player = await resolvePlayerFromCommand(interaction); + const period = resolvePeriodFromCommand(player.region, interaction); const filters = getFiltersFromCommand(interaction); const path = interactionToURL(interaction, { - ...resolvedPlayer, + ...player, ...getCustomPeriodParams(interaction), ...filters, }); return Promise.all([ - render(resolvedPlayer, resolvedPeriod, filters), + render(player, period, filters), refreshButton(interaction, path), - getBlitzStarsLinkButton(resolvedPlayer.region, resolvedPlayer.id), + getBlitzStarsLinkButton(player.region, player.id), ]); }, diff --git a/src/commands/stats.tsx b/src/commands/stats.tsx index 0a12af782..c58383178 100644 --- a/src/commands/stats.tsx +++ b/src/commands/stats.tsx @@ -72,22 +72,19 @@ export const statsCommand = new Promise(async (resolve) => { command, async handler(interaction) { - const resolvedPlayer = await resolvePlayerFromCommand(interaction); - const resolvedPeriod = resolvePeriodFromCommand( - resolvedPlayer.region, - interaction, - ); + const player = await resolvePlayerFromCommand(interaction); + const period = resolvePeriodFromCommand(player.region, interaction); const filters = getFiltersFromCommand(interaction); const path = interactionToURL(interaction, { - ...resolvedPlayer, + ...player, ...getCustomPeriodParams(interaction), ...filters, }); return Promise.all([ - render(resolvedPlayer, resolvedPeriod, filters), + render(player, period, filters), refreshButton(interaction, path), - getBlitzStarsLinkButton(resolvedPlayer.region, resolvedPlayer.id), + getBlitzStarsLinkButton(player.region, player.id), ]); }, diff --git a/src/core/blitzstars/getBlitzStarsLinkButton.ts b/src/core/blitzstars/getBlitzStarsLinkButton.ts index 41817944c..9fdaf152d 100644 --- a/src/core/blitzstars/getBlitzStarsLinkButton.ts +++ b/src/core/blitzstars/getBlitzStarsLinkButton.ts @@ -4,7 +4,11 @@ import { AccountInfo } from '../../types/accountInfo'; import getWargamingResponse from '../blitz/getWargamingResponse'; import linkButton from '../discord/linkButton'; -export async function getBlitzStarsLinkButton(region: Region, id: number) { +export async function getBlitzStarsLinkButton( + region: Region, + id: number, + tankId?: number, +) { const { nickname } = ( await getWargamingResponse( `https://api.wotblitz.${region}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, @@ -12,7 +16,9 @@ export async function getBlitzStarsLinkButton(region: Region, id: number) { )[id]; return linkButton( - `https://www.blitzstars.com/player/${region}/${nickname}`, + `https://www.blitzstars.com/player/${region}/${nickname}${ + tankId ? `/tank/${tankId!}` : '' + }`, 'BlitzStars', ); } diff --git a/src/core/discord/resolvePeriodFromButton.ts b/src/core/discord/resolvePeriodFromButton.ts index 4188ba50d..2fb989aea 100644 --- a/src/core/discord/resolvePeriodFromButton.ts +++ b/src/core/discord/resolvePeriodFromButton.ts @@ -18,7 +18,7 @@ export default function resolvePeriodFromButton( let end: number; const url = new URL(`https://example.com/${interaction.customId}`); const path = url.pathname.split('/'); - const periodSubcommand = path[2] as PeriodType; + const periodSubcommand = path.at(-1) as PeriodType; if (periodSubcommand === 'custom') { const startRaw = parseInt(url!.searchParams.get('start')!); From e96538bae02c503607e5688146e12f0b6dcc6581 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Thu, 12 Oct 2023 13:00:33 -0500 Subject: [PATCH 18/43] feat: core chunk 1 --- src/_core/blitz/getAccountAchievements.ts | 36 ++++ src/_core/blitz/getAccountInfo.ts | 89 +++++++++ src/_core/blitz/getClanAccountInfo.ts | 45 +++++ src/_core/blitz/getClanInfo.ts | 54 ++++++ src/_core/blitz/normalizeExtra.ts | 3 + src/_core/blitz/normalizeIds.ts | 3 + src/_core/blitzstars/getPlayerStats.ts | 38 ++++ .../statistics}/calculateWN8.ts | 5 +- .../statistics/deltaTankStats.ts} | 5 +- .../blitz => _core/statistics}/filterStats.ts | 10 +- src/app/embeds/session/page.tsx | 6 +- src/commands/clanEvent.ts | 178 +++++++++--------- src/commands/eligible.ts | 20 +- src/commands/evolution.tsx | 11 +- src/commands/fullStats.tsx | 6 +- src/commands/inactive.tsx | 36 ++-- src/commands/link.tsx | 113 ++++------- src/commands/ownedTanks.tsx | 42 +---- src/commands/playerAchievements.ts | 21 +-- src/commands/playerInfo.ts | 11 +- src/commands/ratings.tsx | 33 ++-- src/commands/stats.tsx | 4 +- src/core/blitz/getAccountInfo.ts | 11 -- src/core/blitzkrieg/filtersToDescription.ts | 2 +- src/core/blitzstars/getPlayerHistories.ts | 22 +-- src/core/discord/getFiltersFromButton.ts | 2 +- src/core/discord/getFiltersFromCommand.ts | 2 +- src/types/accountAchievements.ts | 10 - src/types/accountInfo.ts | 63 ------- src/types/clanInfo.ts | 30 --- src/types/playerClanData.ts | 18 -- 31 files changed, 463 insertions(+), 466 deletions(-) create mode 100644 src/_core/blitz/getAccountAchievements.ts create mode 100644 src/_core/blitz/getAccountInfo.ts create mode 100644 src/_core/blitz/getClanAccountInfo.ts create mode 100644 src/_core/blitz/getClanInfo.ts create mode 100644 src/_core/blitz/normalizeExtra.ts create mode 100644 src/_core/blitz/normalizeIds.ts create mode 100644 src/_core/blitzstars/getPlayerStats.ts rename src/{core/blitz => _core/statistics}/calculateWN8.ts (89%) rename src/{core/blitz/diffNormalizedTankStats.ts => _core/statistics/deltaTankStats.ts} (96%) rename src/{core/blitz => _core/statistics}/filterStats.ts (90%) delete mode 100644 src/core/blitz/getAccountInfo.ts delete mode 100644 src/types/accountAchievements.ts delete mode 100644 src/types/accountInfo.ts delete mode 100644 src/types/clanInfo.ts delete mode 100644 src/types/playerClanData.ts diff --git a/src/_core/blitz/getAccountAchievements.ts b/src/_core/blitz/getAccountAchievements.ts new file mode 100644 index 000000000..52073afd3 --- /dev/null +++ b/src/_core/blitz/getAccountAchievements.ts @@ -0,0 +1,36 @@ +import { Region } from '../../constants/regions'; +import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; +import getWargamingResponse from '../../core/blitz/getWargamingResponse'; +import { normalizeIds } from './normalizeIds'; + +interface IndividualAccountAchievements { + achievements: { + [achievement: string]: number; + }; + max_series: { + [achievement: string]: number; + }; +} + +export interface AccountAchievements { + [id: number]: IndividualAccountAchievements; +} + +export async function getAccountAchievements< + Ids extends number | number[], + ReturnType = Ids extends number + ? IndividualAccountAchievements + : IndividualAccountAchievements[], +>(region: Region, ids: Ids) { + const object = await getWargamingResponse( + `https://api.wotblitz.${region}/wotb/account/achievements/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${normalizeIds( + ids, + )}`, + ); + + if (typeof ids === 'number') { + return object[ids as number] as ReturnType; + } else { + return ids.map((id) => object[id]) as ReturnType; + } +} diff --git a/src/_core/blitz/getAccountInfo.ts b/src/_core/blitz/getAccountInfo.ts new file mode 100644 index 000000000..20e5c6644 --- /dev/null +++ b/src/_core/blitz/getAccountInfo.ts @@ -0,0 +1,89 @@ +import { Region } from '../../constants/regions'; +import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; +import getWargamingResponse from '../../core/blitz/getWargamingResponse'; +import { normalizeIds } from './normalizeIds'; + +export interface AllStats { + spotted: number; + hits: number; + frags: number; + max_xp: number; + wins: number; + losses: number; + capture_points: number; + battles: number; + damage_dealt: number; + damage_received: number; + max_frags: number; + shots: number; + frags8p: number; + xp: number; + win_and_survived: number; + survived_battles: number; + dropped_capture_points: number; +} + +export interface SupplementaryStats { + // if undefined, WN8 is not available for tanks without averages + WN8?: number; + tier?: number; +} + +export interface ClanStats { + spotted: number; + max_frags_tank_id: number; + hits: number; + frags: number; + max_xp: number; + max_xp_tank_id: number; + wins: number; + losses: number; + capture_points: number; + battles: number; + damage_dealt: number; + damage_received: number; + max_frags: number; + shots: number; + frags8p: number; + xp: number; + win_and_survived: number; + survived_battles: number; + dropped_capture_points: number; +} + +interface IndividualAccountInfo { + account_id: number; + created_at: number; + updated_at: number; + private: null; + last_battle_time: number; + nickname: string; + statistics: { + all: AllStats; + clan: ClanStats; + frags: null | number; + }; +} + +export interface AccountInfo { + [accountId: number]: IndividualAccountInfo; +} + +export async function getAccountInfo< + Ids extends number | number[], + ReturnType = Ids extends number + ? IndividualAccountInfo + : IndividualAccountInfo[], +>(region: Region, ids: Ids) { + const object = await getWargamingResponse( + `https://api.wotblitz.${region}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${normalizeIds( + ids, + )}`, + ); + + if (typeof ids === 'number') { + return object[ids as number] as ReturnType; + } else { + return ids.map((id) => object[id]) as ReturnType; + } +} diff --git a/src/_core/blitz/getClanAccountInfo.ts b/src/_core/blitz/getClanAccountInfo.ts new file mode 100644 index 000000000..b25a32253 --- /dev/null +++ b/src/_core/blitz/getClanAccountInfo.ts @@ -0,0 +1,45 @@ +import { Region } from '../../constants/regions'; +import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; +import getWargamingResponse from '../../core/blitz/getWargamingResponse'; +import { normalizeExtra } from './normalizeExtra'; +import { normalizeIds } from './normalizeIds'; + +export type IndividualClanAccountInfo = { + account_id: number; + joined_at: number; + clan_id: number; + role: string; + account_name: string; + + clan?: { + members_count: number; + name: string; + created_at: number; + tag: string; + clan_id: number; + emblem_set_id: number; + }; +} | null; + +export interface ClanAccountInfo { + [accountId: number]: IndividualClanAccountInfo; +} + +export async function getClanAccountInfo< + Ids extends number | number[], + ReturnType = Ids extends number + ? IndividualClanAccountInfo + : IndividualClanAccountInfo[], +>(region: Region, ids: Ids, extra?: string[]) { + const object = await getWargamingResponse( + `https://api.wotblitz.${region}/wotb/clans/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${normalizeIds( + ids, + )}${normalizeExtra(extra)}`, + ); + + if (typeof ids === 'number') { + return object[ids as number] as ReturnType; + } else { + return ids.map((id) => object[id]) as ReturnType; + } +} diff --git a/src/_core/blitz/getClanInfo.ts b/src/_core/blitz/getClanInfo.ts new file mode 100644 index 000000000..a28c9e740 --- /dev/null +++ b/src/_core/blitz/getClanInfo.ts @@ -0,0 +1,54 @@ +import { Region } from '../../constants/regions'; +import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; +import getWargamingResponse from '../../core/blitz/getWargamingResponse'; +import { normalizeIds } from './normalizeIds'; + +export interface IndividualClanInfo { + recruiting_options: { + vehicles_level: number; + wins_ratio: number; + average_battles_per_day: number; + battles: number; + average_damage: number; + }; + members_count: number; + name: string; + creator_name: string; + clan_id: number; + created_at: number; + updated_at: number; + leader_name: string; + members_ids: number[]; + recruiting_policy: string; + tag: string; + is_clan_disbanded: boolean; + old_name: string; + emblem_set_id: number; + creator_id: number; + motto: string; + renamed_at: number; + old_tag: null; + leader_id: number; + description: string; +} + +export interface ClanInfo { + [clanId: number]: IndividualClanInfo; +} + +export async function getClanInfo< + Ids extends number | number[], + ReturnType = Ids extends number ? IndividualClanInfo : IndividualClanInfo[], +>(region: Region, ids: Ids) { + const object = await getWargamingResponse( + `https://api.wotblitz.${region}/wotb/clans/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${normalizeIds( + ids, + )}`, + ); + + if (typeof ids === 'number') { + return object[ids as number] as ReturnType; + } else { + return ids.map((id) => object[id]) as ReturnType; + } +} diff --git a/src/_core/blitz/normalizeExtra.ts b/src/_core/blitz/normalizeExtra.ts new file mode 100644 index 000000000..23c5acd9b --- /dev/null +++ b/src/_core/blitz/normalizeExtra.ts @@ -0,0 +1,3 @@ +export function normalizeExtra(extra?: string[]) { + return extra ? `&extra=${extra.join(',')}` : ''; +} diff --git a/src/_core/blitz/normalizeIds.ts b/src/_core/blitz/normalizeIds.ts new file mode 100644 index 000000000..3357438e7 --- /dev/null +++ b/src/_core/blitz/normalizeIds.ts @@ -0,0 +1,3 @@ +export function normalizeIds(ids: number | number[]): string { + return typeof ids === 'number' ? ids.toString() : ids.join(','); +} diff --git a/src/_core/blitzstars/getPlayerStats.ts b/src/_core/blitzstars/getPlayerStats.ts new file mode 100644 index 000000000..effff133b --- /dev/null +++ b/src/_core/blitzstars/getPlayerStats.ts @@ -0,0 +1,38 @@ +import { Region } from '../../constants/regions'; +import { AllStats } from '../blitz/getAccountInfo'; + +export interface IndividualPlayerStats { + clan: { clan_id: number; name: string; tag: string }; + statistics: { + all: AllStats; + wn8: number; + wn7: number; + average_tier: number; + }; + last_battle_time: number; + nickname: string; + account_id: number; + achievements: { + account_id: number; + [key: string]: number; + }; + region: Region; +} + +export type PlayerStats = IndividualPlayerStats[]; + +export async function getPlayerStats< + Ids extends number | number[], + ReturnType = Ids extends number ? PlayerStats : PlayerStats[], +>(region: Region, ids: Ids) { + const stats = await Promise.all( + ((typeof ids === 'number' ? [ids] : ids) as number[]).map((id) => + fetch(`https://www.blitzstars.com/api/playerstats/${id}`).then( + (response) => response.json() as Promise, + ), + ), + ); + + if (typeof ids === 'number') return stats[0] as ReturnType; + return stats as ReturnType; +} diff --git a/src/core/blitz/calculateWN8.ts b/src/_core/statistics/calculateWN8.ts similarity index 89% rename from src/core/blitz/calculateWN8.ts rename to src/_core/statistics/calculateWN8.ts index 1c3a1fc24..c169bc148 100644 --- a/src/core/blitz/calculateWN8.ts +++ b/src/_core/statistics/calculateWN8.ts @@ -1,7 +1,10 @@ -import { AllStats } from '../../types/accountInfo'; +import { AllStats } from '../blitz/getAccountInfo'; /** * Formula from https://web.archive.org/web/20190105064817/http://wiki.wnefficiency.net/pages/WN8 + * + * @param expected what all players on average perform like + * @param average what the player in question performs like */ export default function calculateWN8(expected: AllStats, average: AllStats) { const avgDmg = average.damage_dealt / average.battles; diff --git a/src/core/blitz/diffNormalizedTankStats.ts b/src/_core/statistics/deltaTankStats.ts similarity index 96% rename from src/core/blitz/diffNormalizedTankStats.ts rename to src/_core/statistics/deltaTankStats.ts index 35f4a26c2..83c017a43 100644 --- a/src/core/blitz/diffNormalizedTankStats.ts +++ b/src/_core/statistics/deltaTankStats.ts @@ -4,10 +4,7 @@ import { emptyIndividualTankStats, } from '../../types/tanksStats'; -export function diffNormalizedTankStats( - a: NormalizedTankStats, - b: NormalizedTankStats, -) { +export function deltaTankStats(a: NormalizedTankStats, b: NormalizedTankStats) { const bTanks = Object.keys(b); const changedTanks = bTanks.filter((id) => { return ( diff --git a/src/core/blitz/filterStats.ts b/src/_core/statistics/filterStats.ts similarity index 90% rename from src/core/blitz/filterStats.ts rename to src/_core/statistics/filterStats.ts index b093e09a4..d7dcbf628 100644 --- a/src/core/blitz/filterStats.ts +++ b/src/_core/statistics/filterStats.ts @@ -1,11 +1,9 @@ -// BIG TODO: reorganize code folder - import { TreeTypeString } from '../../components/Tanks'; -import { DiffedTankStats } from '../blitzstars/getDiffedTankStats'; -import { tankAverages } from '../blitzstars/tankAverages'; +import sumStats from '../../core/blitz/sumStats'; +import { tankopedia } from '../../core/blitz/tankopedia'; +import { DiffedTankStats } from '../../core/blitzstars/getDiffedTankStats'; +import { tankAverages } from '../../core/blitzstars/tankAverages'; import calculateWN8 from './calculateWN8'; -import sumStats from './sumStats'; -import { tankopedia } from './tankopedia'; export interface StatFilters { nation?: string; diff --git a/src/app/embeds/session/page.tsx b/src/app/embeds/session/page.tsx index 96fadb885..2af6e33f6 100644 --- a/src/app/embeds/session/page.tsx +++ b/src/app/embeds/session/page.tsx @@ -2,11 +2,11 @@ import { ContextMenu } from '@radix-ui/themes'; import { useEffect, useState } from 'react'; +import calculateWN8 from '../../../_core/statistics/calculateWN8'; +import { deltaTankStats } from '../../../_core/statistics/deltaTankStats'; import * as Breakdown from '../../../components/Breakdown'; import { TreeTypeEnum } from '../../../components/Tanks'; import { WARGAMING_APPLICATION_ID } from '../../../constants/wargamingApplicationID'; -import calculateWN8 from '../../../core/blitz/calculateWN8'; -import { diffNormalizedTankStats } from '../../../core/blitz/diffNormalizedTankStats'; import getWN8Percentile from '../../../core/blitz/getWN8Percentile'; import getWargamingResponse from '../../../core/blitz/getWargamingResponse'; import { TankopediaEntry, tankopedia } from '../../../core/blitz/tankopedia'; @@ -111,7 +111,7 @@ export default function SessionPage() { list: ( Object.values( - diffNormalizedTankStats(session.tankStats, career), + deltaTankStats(session.tankStats, career), ) as IndividualTankStats[] ).map((stats) => { return { diff --git a/src/commands/clanEvent.ts b/src/commands/clanEvent.ts index 43e5b446d..f51a9a7f2 100644 --- a/src/commands/clanEvent.ts +++ b/src/commands/clanEvent.ts @@ -1,97 +1,93 @@ -import { SlashCommandBuilder, escapeMarkdown } from 'discord.js'; -import markdownEscape from 'markdown-escape'; -import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; -import getWargamingResponse from '../core/blitz/getWargamingResponse'; -import { PlayerHistoriesRaw } from '../core/blitzstars/getPlayerHistories'; -import getTimeDaysAgo from '../core/blitzstars/getTimeDaysAgo'; -import addClanChoices from '../core/discord/addClanChoices'; -import autocompleteClan from '../core/discord/autocompleteClan'; -import embedWarning from '../core/discord/embedWarning'; -import resolveClanFromCommand from '../core/discord/resolveClanFromCommand'; -import { CommandRegistry } from '../events/interactionCreate'; -import { AccountAchievements } from '../types/accountAchievements'; -import { AccountInfo } from '../types/accountInfo'; -import { ClanInfo } from '../types/clanInfo'; +// _____ _____ _ _ _ _ _____ ____ __ __ ______ ____ _____ _ __ +// |_ _| / ____| | | | /\ | | | | / ____/ __ \| \/ | ____| | _ \ /\ / ____| |/ / +// | | | (___ | |__| | / \ | | | | | | | | | | \ / | |__ | |_) | / \ | | | ' / +// | | \___ \| __ | / /\ \ | | | | | | | | | | |\/| | __| | _ < / /\ \| | | < +// _| |_ ____) | | | |/ ____ \| |____| |____ | |___| |__| | | | | |____ | |_) / ____ \ |____| . \ +// |_____| |_____/|_| |_/_/ \_\______|______| \_____\____/|_| |_|______| |____/_/ \_\_____|_|\_\ -export const clanEventCommand: CommandRegistry = { - inProduction: false, - inPublic: true, +// import { SlashCommandBuilder, escapeMarkdown } from 'discord.js'; +// import markdownEscape from 'markdown-escape'; +// import { getAccountAchievements } from '../_core/blitz/getAccountAchievements'; +// import { getAccountInfo } from '../_core/blitz/getAccountInfo'; +// import { getClanInfo } from '../_core/blitz/getClanInfo'; +// import { PlayerHistoriesRaw } from '../core/blitzstars/getPlayerHistories'; +// import getTimeDaysAgo from '../core/blitzstars/getTimeDaysAgo'; +// import addClanChoices from '../core/discord/addClanChoices'; +// import autocompleteClan from '../core/discord/autocompleteClan'; +// import embedWarning from '../core/discord/embedWarning'; +// import resolveClanFromCommand from '../core/discord/resolveClanFromCommand'; +// import { CommandRegistry } from '../events/interactionCreate'; - command: new SlashCommandBuilder() - .setName('clan-event') - .setDescription('Lists all inactive players') - .addStringOption(addClanChoices), +// export const clanEventCommand: CommandRegistry = { +// inProduction: false, +// inPublic: true, - async handler(interaction) { - const { region, id } = await resolveClanFromCommand(interaction); - const clan = ( - await getWargamingResponse( - `https://api.wotblitz.${region}/wotb/clans/info/?application_id=${WARGAMING_APPLICATION_ID}&clan_id=${id}`, - ) - )[id]; - const memberIds = clan.members_ids.join(','); - const [players, achievements, previousJointVictories] = await Promise.all([ - getWargamingResponse( - `https://api.wotblitz.${region}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${memberIds}`, - ), - getWargamingResponse( - `https://api.wotblitz.${region}/wotb/account/achievements/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${memberIds}`, - ), - Promise.all( - clan.members_ids.map((id) => - fetch(`https://www.blitzstars.com/api/playerstats/${id}`) - .then((response) => response.json() as Promise) - .then((data) => ({ - id, - jointVictory: data[0]?.achievements.jointVictoryCount as - | number - | undefined, - })), - ), - ).then((data) => - data.reduce>( - (accumulator, value) => ({ - ...accumulator, - [value.id]: value.jointVictory, - }), - {}, - ), - ), - ]); - const jointVictories = clan.members_ids.map((id) => ({ - id, - joinVictory: - players[id].last_battle_time > getTimeDaysAgo(region, 1) - ? previousJointVictories[id] === undefined - ? 0 - : achievements[id].max_series.jointVictory - - previousJointVictories[id]! - : 0, - })); +// command: new SlashCommandBuilder() +// .setName('clan-event') +// .setDescription('Lists all inactive players') +// .addStringOption(addClanChoices), - return [ - `# ${escapeMarkdown(clan.name)} [${escapeMarkdown( - clan.tag, - )}]'s platoon wins today: ${( - jointVictories.reduce( - (accumulator, { joinVictory }) => accumulator + joinVictory, - 0, - ) / 2 - ).toFixed(0)}\n${jointVictories - .filter(({ joinVictory }) => joinVictory) - .sort((a, b) => b.joinVictory - a.joinVictory) - .map( - ({ id, joinVictory }) => - `- ${markdownEscape(players[id].nickname)}: ${joinVictory}`, - ) - .join('\n')}`, +// async handler(interaction) { +// const { region, id } = await resolveClanFromCommand(interaction); +// const clan = await getClanInfo(region, id); +// const [players, achievements, previousJointVictories] = await Promise.all([ +// getAccountInfo(region, clan.members_ids), +// getAccountAchievements(region, clan.members_ids), +// Promise.all( +// clan.members_ids.map((id) => +// fetch(`https://www.blitzstars.com/api/playerstats/${id}`) +// .then((response) => response.json() as Promise) +// .then((data) => ({ +// id, +// jointVictory: data[0]?.achievements.jointVictoryCount as +// | number +// | undefined, +// })), +// ), +// ).then((data) => +// data.reduce>( +// (accumulator, value) => ({ +// ...accumulator, +// [value.id]: value.jointVictory, +// }), +// {}, +// ), +// ), +// ]); +// const jointVictories = clan.members_ids.map((id) => ({ +// id, +// joinVictory: +// players[id].last_battle_time > getTimeDaysAgo(region, 1) +// ? previousJointVictories[id] === undefined +// ? 0 +// : achievements[id].max_series.jointVictory - +// previousJointVictories[id]! +// : 0, +// })); - embedWarning( - 'This is an approximation!', - "Wargaming provides very little information about platoons publicly. Caveats:\n- Players in two different clans platooning artificially inflates the total count\n- Game-mode battles aren't counted since Wargaming doesn't publicly share that data\n- This command is also subject to Blitzkrieg's reset times (use `/about timezones` for more info)", - ), - ]; - }, +// return [ +// `# ${escapeMarkdown(clan.name)} [${escapeMarkdown( +// clan.tag, +// )}]'s platoon wins today: ${( +// jointVictories.reduce( +// (accumulator, { joinVictory }) => accumulator + joinVictory, +// 0, +// ) / 2 +// ).toFixed(0)}\n${jointVictories +// .filter(({ joinVictory }) => joinVictory) +// .sort((a, b) => b.joinVictory - a.joinVictory) +// .map( +// ({ id, joinVictory }) => +// `- ${markdownEscape(players[id].nickname)}: ${joinVictory}`, +// ) +// .join('\n')}`, - autocomplete: autocompleteClan, -}; +// embedWarning( +// 'This is an approximation!', +// "Wargaming provides very little information about platoons publicly. Caveats:\n- Players in two different clans platooning artificially inflates the total count\n- Game-mode battles aren't counted since Wargaming doesn't publicly share that data\n- This command is also subject to Blitzkrieg's reset times (use `/about timezones` for more info)", +// ), +// ]; +// }, + +// autocomplete: autocompleteClan, +// }; diff --git a/src/commands/eligible.ts b/src/commands/eligible.ts index 9f31732d4..71f424e6c 100644 --- a/src/commands/eligible.ts +++ b/src/commands/eligible.ts @@ -1,7 +1,6 @@ import { SlashCommandBuilder } from 'discord.js'; -import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; -import calculateWN8 from '../core/blitz/calculateWN8'; -import getWargamingResponse from '../core/blitz/getWargamingResponse'; +import { getAccountInfo } from '../_core/blitz/getAccountInfo'; +import calculateWN8 from '../_core/statistics/calculateWN8'; import sumStats from '../core/blitz/sumStats'; import { tankopedia } from '../core/blitz/tankopedia'; import getDiffedTankStats from '../core/blitzstars/getDiffedTankStats'; @@ -14,7 +13,6 @@ import embedPositive from '../core/discord/embedPositive'; import markdownTable, { TableInput } from '../core/discord/markdownTable'; import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand'; import { CommandRegistry } from '../events/interactionCreate'; -import { AccountInfo } from '../types/accountInfo'; import { PossiblyPromise } from '../types/possiblyPromise'; export type SkilledClan = 'SKLLD' | 'SMRI'; @@ -48,20 +46,18 @@ export const eligibleCommand: CommandRegistry = { async handler(interaction) { const clan = interaction.options.getString('clan') as SkilledClan; - const { id, region: server } = await resolvePlayerFromCommand(interaction); - const accountInfo = await getWargamingResponse( - `https://api.wotblitz.${server}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, - ); + const { id, region: region } = await resolvePlayerFromCommand(interaction); + const accountInfo = await getAccountInfo(region, id); const problems: TableInput = []; - const title = `${accountInfo[id].nickname}'s eligibility for ${SKILLED_CLANS[clan]}`; + const title = `${accountInfo.nickname}'s eligibility for ${SKILLED_CLANS[clan]}`; let isEligible = false; let body = ''; if (clan === 'SKLLD') { const { diff: diffed } = await getDiffedTankStats( - server, + region, id, - getTimeDaysAgo(server, 30), + getTimeDaysAgo(region, 30), getPeriodNow(), ); const entries = Object.entries(diffed); @@ -171,7 +167,7 @@ export const eligibleCommand: CommandRegistry = { problems, )}`; } else if (clan === 'SMRI') { - const stats = accountInfo[id].statistics.all; + const stats = accountInfo.statistics.all; if (stats.battles < 1500) { problems.push([ diff --git a/src/commands/evolution.tsx b/src/commands/evolution.tsx index a7b1f6b27..815c10a73 100644 --- a/src/commands/evolution.tsx +++ b/src/commands/evolution.tsx @@ -2,11 +2,11 @@ import { SlashCommandBuilder, SlashCommandSubcommandGroupBuilder, } from 'discord.js'; +import { getAccountInfo } from '../_core/blitz/getAccountInfo'; import * as Graph from '../components/Graph'; import NoData, { NoDataType } from '../components/NoData'; import TitleBar from '../components/TitleBar'; import Wrapper from '../components/Wrapper'; -import { getAccountInfo } from '../core/blitz/getAccountInfo'; import { getClanLogo } from '../core/blitz/getClanLogo'; import { getPlayerClanInfo } from '../core/blitz/getPlayerClanInfo'; import resolveTankId from '../core/blitz/resolveTankId'; @@ -75,11 +75,7 @@ async function render( return ( - + {plot.length > 0 && ( ( const tankIdRaw = interaction.options.getString('tank')!; const tankId = commandGroup === 'tank' ? await resolveTankId(tankIdRaw) : null; - const { nickname } = (await getAccountInfo(player.region, player.id))[ - player.id - ]; const path = interactionToURL(interaction, { ...player, ...getCustomPeriodParams(interaction), diff --git a/src/commands/fullStats.tsx b/src/commands/fullStats.tsx index 92734a8db..21c17740e 100644 --- a/src/commands/fullStats.tsx +++ b/src/commands/fullStats.tsx @@ -1,11 +1,11 @@ import { SlashCommandBuilder } from 'discord.js'; +import { getAccountInfo } from '../_core/blitz/getAccountInfo'; +import { StatFilters, filterStats } from '../_core/statistics/filterStats'; import GenericAllStats from '../components/GenericAllStats'; import NoData, { NoDataType } from '../components/NoData'; import TierWeights from '../components/TierWeights'; import TitleBar from '../components/TitleBar'; import Wrapper from '../components/Wrapper'; -import { StatFilters, filterStats } from '../core/blitz/filterStats'; -import { getAccountInfo } from '../core/blitz/getAccountInfo'; import { getClanLogo } from '../core/blitz/getClanLogo'; import { getPlayerClanInfo } from '../core/blitz/getPlayerClanInfo'; import { filtersToDescription } from '../core/blitzkrieg/filtersToDescription'; @@ -36,7 +36,7 @@ async function render( { start, end, name }: ResolvedPeriod, filters: StatFilters, ) { - const nickname = (await getAccountInfo(region, id))[id].nickname; + const { nickname } = await getAccountInfo(region, id); const clan = (await getPlayerClanInfo(region, id))[id]?.clan; const clanImage = clan ? getClanLogo(clan.emblem_set_id) : undefined; const diffedTankStats = await getDiffedTankStats(region, id, start, end); diff --git a/src/commands/inactive.tsx b/src/commands/inactive.tsx index 7b14b5ea5..91986bc2c 100644 --- a/src/commands/inactive.tsx +++ b/src/commands/inactive.tsx @@ -1,16 +1,14 @@ import { SlashCommandBuilder } from 'discord.js'; +import { getAccountInfo } from '../_core/blitz/getAccountInfo'; +import { getClanInfo } from '../_core/blitz/getClanInfo'; import GenericStats from '../components/GenericStats'; import NoData, { NoDataType } from '../components/NoData'; import TitleBar from '../components/TitleBar'; import Wrapper from '../components/Wrapper'; -import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; -import getWargamingResponse from '../core/blitz/getWargamingResponse'; import addClanChoices from '../core/discord/addClanChoices'; import autocompleteClan from '../core/discord/autocompleteClan'; import resolveClanFromCommand from '../core/discord/resolveClanFromCommand'; import { CommandRegistry } from '../events/interactionCreate'; -import { AccountInfo } from '../types/accountInfo'; -import { ClanInfo } from '../types/clanInfo'; const DEFAULT_THRESHOLD = 7; @@ -36,24 +34,16 @@ export const inactiveCommand: CommandRegistry = { const threshold = interaction.options.getNumber('threshold')! ?? DEFAULT_THRESHOLD; const time = new Date().getTime() / 1000; - const clanData = ( - await getWargamingResponse( - `https://api.wotblitz.${region}/wotb/clans/info/?application_id=${WARGAMING_APPLICATION_ID}&clan_id=${id}`, + const clanInfo = await getClanInfo(region, id); + const accountInfo = await getAccountInfo(region, clanInfo.members_ids); + const inactive = accountInfo + .map( + (account) => + [ + account.nickname, + (time - account.last_battle_time) / 60 / 60 / 24, + ] as [string, number], ) - )[id]; - const memberIds = clanData.members_ids; - const accounts = await getWargamingResponse( - `https://api.wotblitz.${region}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${memberIds.join( - ',', - )}`, - ); - const inactive = memberIds - .map((memberId) => { - const member = accounts[memberId]; - const inactiveDays = (time - member.last_battle_time) / 60 / 60 / 24; - - return [member.nickname, inactiveDays] as [string, number]; - }) .filter(([, inactiveDays]) => inactiveDays >= threshold) .sort((a, b) => b[1] - a[1]) .map( @@ -64,8 +54,8 @@ export const inactiveCommand: CommandRegistry = { return ( diff --git a/src/commands/link.tsx b/src/commands/link.tsx index d7b9fb014..5dfb6f01b 100644 --- a/src/commands/link.tsx +++ b/src/commands/link.tsx @@ -1,18 +1,22 @@ import { teal } from '@radix-ui/colors'; -import { AttachmentBuilder, SlashCommandBuilder } from 'discord.js'; +import { + AttachmentBuilder, + GuildMemberRoleManager, + SlashCommandBuilder, +} from 'discord.js'; +import markdownEscape from 'markdown-escape'; +import discord from '../../discord.json' assert { type: 'json' }; +import { getAccountInfo } from '../_core/blitz/getAccountInfo'; +import { getClanAccountInfo } from '../_core/blitz/getClanAccountInfo'; import { Glow } from '../components/AllStatsOverview/components/WN8Display/components/Glow'; import Wrapper from '../components/Wrapper'; import { REGION_NAMES_SHORT, Region } from '../constants/regions'; -import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; -import getWargamingResponse from '../core/blitz/getWargamingResponse'; import { linkBlitzAndDiscord } from '../core/cockroackdb/discordBlitz'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteUsername from '../core/discord/autocompleteUsername'; import embedNegative from '../core/discord/embedNegative'; import { CommandRegistry } from '../events/interactionCreate'; import { theme } from '../stitches.config'; -import { AccountInfo } from '../types/accountInfo'; -import { PlayerClanInfo } from '../types/playerClanData'; const serverAndIdPattern = /(com|eu|asia)\/[0-9]+/; @@ -26,86 +30,33 @@ export const verifyCommand: CommandRegistry = { .addStringOption((option) => addUsernameChoices(option).setRequired(true)), async handler(interaction) { - // const blitzAccount = await resolvePlayerFromCommand(interaction); - // const { id, region: server } = blitzAccount; - // const accountInfo = await getWargamingResponse( - // `https://api.wotblitz.${server}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, - // ); - // const clanData = await getWargamingResponse( - // `https://api.wotblitz.${server}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}&extra=clan`, - // ); - // const clan = clanData[id]?.clan; - // const clanTag = clan ? ` [${clan!.tag}]` : ''; - // const member = - // interaction.member && - // interaction.guild?.members.cache.get(interaction.member?.user.id); - - // if (!interaction.guild?.members.me?.permissions.has('ManageNicknames')) { - // return embedNegative( - // `${markdownEscape(interaction.user.username)} failed to verify`, - // "I don't have the permission to change your nickname.", - // ); - // } - // if (!interaction.member || !member) { - // return embedNegative( - // `${interaction.user.username} is not in this server`, - // "I couldn't find this person in this server. Did they leave?", - // ); - // } - - // try { - // await member.setNickname(`${accountInfo[id].nickname}${clanTag}`); - - // if (interaction.guildId === discord.sklld_guild_id) { - // if (!interaction.guild?.members.me?.permissions.has('ManageRoles')) { - // return embedNegative( - // `${markdownEscape(interaction.user.username)} failed to verify`, - // "I don't have the permission to change your manage roles.", - // ); - // } - - // await member.roles.remove(discord.sklld_verify_role); - // await member.roles.add(discord.sklld_peasant_role); - // } - - // return embedPositive( - // `${interaction.user.username} is verified`, - // `The user is now verified as ${markdownEscape( - // accountInfo[id].nickname, - // )}${markdownEscape(clanTag)}`, - // ); - // } catch (error) { - // return embedNegative( - // `${interaction.user.username} failed to verify`, - // "I can't change your nickname because you have higher permissions than me. Try setting your nickname to your Blitz username manually.", - // ); - // } - const username = interaction.options.getString('username', true); if (serverAndIdPattern.test(username)) { const [region, idString] = username.split('/'); const id = parseInt(idString); const discordId = parseInt(interaction.user.id); - // const account = ( - // await getWargamingResponse( - // `https://api.wotblitz.${region}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, - // ) - // )[id]; - // const clan = await getWargamingResponse( - // `https://api.wotblitz.${region}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}&extra=clan`, - // ); - const [account, clan] = await Promise.all([ - getWargamingResponse( - `https://api.wotblitz.${region}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, - ), - getWargamingResponse( - `https://api.wotblitz.${region}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}&extra=clan`, - ), - ]); + const accountInfo = await getAccountInfo(region as Region, id); + const clanAccountInfo = await getClanAccountInfo(region as Region, id); await linkBlitzAndDiscord(discordId, region as Region, id); + if (interaction.guildId === discord.sklld_guild_id) { + if (!interaction.guild?.members.me?.permissions.has('ManageRoles')) { + return embedNegative( + `${markdownEscape(interaction.user.username)} failed to verify`, + "I don't have the permission to change your manage roles.", + ); + } + + await (interaction.member!.roles as GuildMemberRoleManager).remove( + discord.sklld_verify_role, + ); + await (interaction.member!.roles as GuildMemberRoleManager).add( + discord.sklld_peasant_role, + ); + } + return (
- {clan[id]?.clan ? ( + {clanAccountInfo?.clan ? ( ) : null}
- {account[id].nickname} + {accountInfo.nickname} - {clan[id]?.clan ? `[${clan[id]?.clan?.tag}] - ` : ''} + {clanAccountInfo?.clan + ? `[${clanAccountInfo?.clan?.tag}] - ` + : ''} {REGION_NAMES_SHORT[region as Region]}
diff --git a/src/commands/ownedTanks.tsx b/src/commands/ownedTanks.tsx index 595faeba6..6c9870b63 100644 --- a/src/commands/ownedTanks.tsx +++ b/src/commands/ownedTanks.tsx @@ -1,12 +1,13 @@ import { SlashCommandBuilder } from 'discord.js'; +import { getAccountInfo } from '../_core/blitz/getAccountInfo'; +import { getClanAccountInfo } from '../_core/blitz/getClanAccountInfo'; import NoData, { NoDataType } from '../components/NoData'; import * as Tanks from '../components/Tanks'; import TitleBar from '../components/TitleBar'; import Wrapper from '../components/Wrapper'; -import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; +import { getClanLogo } from '../core/blitz/getClanLogo'; import getTankStats from '../core/blitz/getTankStats'; import getTreeType from '../core/blitz/getTreeType'; -import getWargamingResponse from '../core/blitz/getWargamingResponse'; import resolveTankName from '../core/blitz/resolveTankName'; import { TIER_ROMAN_NUMERALS, @@ -20,29 +21,6 @@ import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteUsername from '../core/discord/autocompleteUsername'; import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand'; import { CommandRegistry } from '../events/interactionCreate'; -import { AccountInfo } from '../types/accountInfo'; -import { PlayerClanInfo } from '../types/playerClanData'; - -const COMP_TANKS = [ - // light tanks - 24321, // t-100 lt - 20257, // sheridan - 3649, // bat chat - 19537, // vickers - - // heavy tanks - 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 -]; export const ownedTanksCommand: CommandRegistry = { inProduction: true, @@ -58,9 +36,7 @@ export const ownedTanksCommand: CommandRegistry = { const tier = Number(interaction.options.getString('tier')); const account = await resolvePlayerFromCommand(interaction); const { id, region: server } = account; - const accountInfo = await getWargamingResponse( - `https://api.wotblitz.${server}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, - ); + const accountInfo = await getAccountInfo(server, id); const tankStats = await getTankStats(server, id); const filteredTanks = ( await Promise.all( @@ -70,9 +46,7 @@ export const ownedTanksCommand: CommandRegistry = { })), ) ).filter((tank) => tank.tankopedia?.tier === tier); - const clanData = await getWargamingResponse( - `https://api.wotblitz.${server}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}&extra=clan`, - ); + const clanAccountInfo = await getClanAccountInfo(server, id); const groupedTanks: Record = {}; const nations: string[] = []; @@ -90,10 +64,10 @@ export const ownedTanksCommand: CommandRegistry = { return ( ( - `https://api.wotblitz.${server}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, - ); - const accountsAchievements = - await getWargamingResponse( - `https://api.wotblitz.${server}/wotb/account/achievements/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, - ); - const accountAchievements = accountsAchievements[id]; + const { id, region: region } = account; + const accountInfo = await getAccountInfo(region, id); + const accountsAchievements = await getAccountAchievements(region, id); + const accountAchievements = accountsAchievements; const compound = { ...accountAchievements.achievements, ...accountAchievements.max_series, }; return embedInfo( - `${markdownEscape(accounts[id].nickname)}'s information`, + `${markdownEscape(accountInfo.nickname)}'s information`, markdownTable( Object.keys(compound) diff --git a/src/commands/playerInfo.ts b/src/commands/playerInfo.ts index f85908394..36f748390 100644 --- a/src/commands/playerInfo.ts +++ b/src/commands/playerInfo.ts @@ -1,14 +1,12 @@ import { SlashCommandBuilder } from 'discord.js'; import markdownEscape from 'markdown-escape'; -import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; -import getWargamingResponse from '../core/blitz/getWargamingResponse'; +import { getAccountInfo } from '../_core/blitz/getAccountInfo'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteUsername from '../core/discord/autocompleteUsername'; import embedInfo from '../core/discord/embedInfo'; import markdownTable from '../core/discord/markdownTable'; import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand'; import { CommandRegistry } from '../events/interactionCreate'; -import { AccountInfo } from '../types/accountInfo'; export const playerInfoCommand: CommandRegistry = { inProduction: true, @@ -21,11 +19,8 @@ export const playerInfoCommand: CommandRegistry = { async handler(interaction) { const account = await resolvePlayerFromCommand(interaction); - const { id, region: server } = account; - const accounts = await getWargamingResponse( - `https://api.wotblitz.${server}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, - ); - const accountInfo = accounts[id]; + const { id, region: region } = account; + const accountInfo = await getAccountInfo(region, id); return embedInfo( `${markdownEscape(accountInfo.nickname)}'s information`, diff --git a/src/commands/ratings.tsx b/src/commands/ratings.tsx index 29ec7e91a..02e97fe4c 100644 --- a/src/commands/ratings.tsx +++ b/src/commands/ratings.tsx @@ -5,14 +5,14 @@ import { SlashCommandSubcommandGroupBuilder, } from 'discord.js'; import { BlitzkriegRatingsLeaderboard } from '../../scripts/buildRatingsLeaderboard'; +import { getAccountInfo } from '../_core/blitz/getAccountInfo'; +import { getClanAccountInfo } from '../_core/blitz/getClanAccountInfo'; import * as Leaderboard from '../components/Leaderboard'; import TitleBar from '../components/TitleBar'; import Wrapper from '../components/Wrapper'; import { REGION_NAMES_SHORT, Region } from '../constants/regions'; -import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; import getArchivedRatingsInfo from '../core/blitz/getArchivedRatingsInfo'; import getRatingsInfo from '../core/blitz/getRatingsInfo'; -import getWargamingResponse from '../core/blitz/getWargamingResponse'; import regionToRegionSubdomain from '../core/blitz/regionToRegionSubdomain'; import getMidnightLeaderboard, { DATABASE_REPO, @@ -25,8 +25,6 @@ import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand'; import { octokit } from '../core/github/octokit'; import throwError from '../core/node/throwError'; import { CommandRegistryRaw } from '../events/interactionCreate'; -import { AccountInfo } from '../types/accountInfo'; -import { PlayerClanInfo } from '../types/playerClanData'; export interface RatingsPlayer { spa_id: number; @@ -312,9 +310,9 @@ export const ratingsCommand = new Promise( firstPlayerIndex, lastPlayerIndex + 1, ); - const ids = trimmed.map((player) => player.id).join(','); - const clanData = await getWargamingResponse( - `https://api.wotblitz.${region}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${ids}&extra=clan`, + const clanData = await getClanAccountInfo( + region, + trimmed.map(({ id }) => id), ); return trimmed.map( @@ -373,14 +371,8 @@ export const ratingsCommand = new Promise( if (regionRatingsInfo.detail !== undefined) return noOngoingSeason; - const accountInfo = await getWargamingResponse( - `https://api.wotblitz.${region}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, - ); - const clan = ( - await getWargamingResponse( - `https://api.wotblitz.${region}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}&extra=clan`, - ) - )[id]?.clan; + const accountInfo = await getAccountInfo(region, id); + const clan = (await getClanAccountInfo(region, id, ['clan']))?.clan; const regionSubdomain = regionToRegionSubdomain(region); const neighbors = subcommandGroup === 'current' @@ -426,7 +418,7 @@ export const ratingsCommand = new Promise( if (playerIndex === -1) { throw throwError( - `${accountInfo[id].nickname} didn't player ratings in season ${season}`, + `${accountInfo.nickname} didn't player ratings in season ${season}`, 'This player did not participate in this season or did not get past calibration.', ); } @@ -436,9 +428,10 @@ export const ratingsCommand = new Promise( playerIndex - halfRange, playerIndex + halfRange + 1, ); - const ids = trimmed.map((player) => player.id).join(','); - const clanData = await getWargamingResponse( - `https://api.wotblitz.${region}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${ids}&extra=clan`, + const clanData = await getClanAccountInfo( + region, + trimmed.map((player) => player.id), + ['clan'], ); return trimmed.map((player, index) => ({ @@ -464,7 +457,7 @@ export const ratingsCommand = new Promise( ? `https://wotblitz-gc.gcdn.co/icons/clanEmblems1x/clan-icon-v2-${clan.emblem_set_id}.png` : undefined; titleName = neighbors - ? accountInfo[id].nickname + ? accountInfo.nickname : `No Ongoing Season - ${REGION_NAMES_SHORT[region]}`; titleDescription = 'Ratings neighbours'; playersBefore = neighbors ? neighbors[0].position - 1 : 0; diff --git a/src/commands/stats.tsx b/src/commands/stats.tsx index c58383178..fa769167a 100644 --- a/src/commands/stats.tsx +++ b/src/commands/stats.tsx @@ -1,10 +1,10 @@ import { SlashCommandBuilder } from 'discord.js'; +import { getAccountInfo } from '../_core/blitz/getAccountInfo'; +import { StatFilters, filterStats } from '../_core/statistics/filterStats'; import AllStatsOverview from '../components/AllStatsOverview'; import NoData, { NoDataType } from '../components/NoData'; import TitleBar from '../components/TitleBar'; import Wrapper from '../components/Wrapper'; -import { StatFilters, filterStats } from '../core/blitz/filterStats'; -import { getAccountInfo } from '../core/blitz/getAccountInfo'; import { getClanLogo } from '../core/blitz/getClanLogo'; import { getPlayerClanInfo } from '../core/blitz/getPlayerClanInfo'; import { filtersToDescription } from '../core/blitzkrieg/filtersToDescription'; diff --git a/src/core/blitz/getAccountInfo.ts b/src/core/blitz/getAccountInfo.ts deleted file mode 100644 index 04ff4e29c..000000000 --- a/src/core/blitz/getAccountInfo.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Region } from '../../constants/regions'; -import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; -import { AccountInfo } from '../../types/accountInfo'; -import getWargamingResponse from './getWargamingResponse'; - -// BIG TODO: generalize all get wargaming calls -export function getAccountInfo(region: Region, id: number) { - return getWargamingResponse( - `https://api.wotblitz.${region}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, - ); -} diff --git a/src/core/blitzkrieg/filtersToDescription.ts b/src/core/blitzkrieg/filtersToDescription.ts index fd3f0da2c..08bb64349 100644 --- a/src/core/blitzkrieg/filtersToDescription.ts +++ b/src/core/blitzkrieg/filtersToDescription.ts @@ -1,5 +1,5 @@ +import { StatFilters } from '../../_core/statistics/filterStats'; import { TREE_TYPE_NAMES } from '../../components/Tanks'; -import { StatFilters } from '../blitz/filterStats'; import resolveTankName from '../blitz/resolveTankName'; import { TIER_ROMAN_NUMERALS, Tier, tankopediaInfo } from '../blitz/tankopedia'; diff --git a/src/core/blitzstars/getPlayerHistories.ts b/src/core/blitzstars/getPlayerHistories.ts index 7d5915ec5..13bcbd674 100644 --- a/src/core/blitzstars/getPlayerHistories.ts +++ b/src/core/blitzstars/getPlayerHistories.ts @@ -1,6 +1,6 @@ import { Region } from '../../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; -import { AccountInfo, AllStats } from '../../types/accountInfo'; +import { AccountInfo } from '../../types/accountInfo'; import { GetHistoriesOptions, Histories, @@ -10,26 +10,6 @@ import { import getWargamingResponse from '../blitz/getWargamingResponse'; import { emptyAllStats } from './getDiffedTankStats'; -export interface PlayerHistoryRaw { - clan: { clan_id: number; name: string; tag: string }; - statistics: { - all: AllStats; - wn8: number; - wn7: number; - average_tier: number; - }; - last_battle_time: number; - nickname: string; - account_id: number; - achievements: { - account_id: number; - [key: string]: number; - }; - region: Region; -} - -export type PlayerHistoriesRaw = PlayerHistoryRaw[]; - export default async function getPlayerHistories( server: Region, id: number, diff --git a/src/core/discord/getFiltersFromButton.ts b/src/core/discord/getFiltersFromButton.ts index cb26b8464..7bef99461 100644 --- a/src/core/discord/getFiltersFromButton.ts +++ b/src/core/discord/getFiltersFromButton.ts @@ -1,6 +1,6 @@ import { ButtonInteraction } from 'discord.js'; +import { StatFilters } from '../../_core/statistics/filterStats'; import { TreeTypeString } from '../../components/Tanks'; -import { StatFilters } from '../blitz/filterStats'; export function getFiltersFromButton(interaction: ButtonInteraction) { const url = new URL(`https://example.com/${interaction.customId}`); diff --git a/src/core/discord/getFiltersFromCommand.ts b/src/core/discord/getFiltersFromCommand.ts index a622cdd5b..d5ebb0baa 100644 --- a/src/core/discord/getFiltersFromCommand.ts +++ b/src/core/discord/getFiltersFromCommand.ts @@ -1,6 +1,6 @@ import { ChatInputCommandInteraction } from 'discord.js'; +import { StatFilters } from '../../_core/statistics/filterStats'; import { TreeTypeString } from '../../components/Tanks'; -import { StatFilters } from '../blitz/filterStats'; export function getFiltersFromCommand( interaction: ChatInputCommandInteraction, diff --git a/src/types/accountAchievements.ts b/src/types/accountAchievements.ts deleted file mode 100644 index 1fbcc0378..000000000 --- a/src/types/accountAchievements.ts +++ /dev/null @@ -1,10 +0,0 @@ -export interface AccountAchievements { - [id: number]: { - achievements: { - [achievement: string]: number; - }; - max_series: { - [achievement: string]: number; - }; - }; -} diff --git a/src/types/accountInfo.ts b/src/types/accountInfo.ts deleted file mode 100644 index bcb90e861..000000000 --- a/src/types/accountInfo.ts +++ /dev/null @@ -1,63 +0,0 @@ -export interface AllStats { - spotted: number; - hits: number; - frags: number; - max_xp: number; - wins: number; - losses: number; - capture_points: number; - battles: number; - damage_dealt: number; - damage_received: number; - max_frags: number; - shots: number; - frags8p: number; - xp: number; - win_and_survived: number; - survived_battles: number; - dropped_capture_points: number; -} - -export interface SupplementaryStats { - // if undefined, WN8 is not available for tanks without averages - WN8?: number; - tier?: number; -} - -export interface ClanStats { - spotted: number; - max_frags_tank_id: number; - hits: number; - frags: number; - max_xp: number; - max_xp_tank_id: number; - wins: number; - losses: number; - capture_points: number; - battles: number; - damage_dealt: number; - damage_received: number; - max_frags: number; - shots: number; - frags8p: number; - xp: number; - win_and_survived: number; - survived_battles: number; - dropped_capture_points: number; -} - -export interface AccountInfo { - [accountId: number]: { - account_id: number; - created_at: number; - updated_at: number; - private: null; - last_battle_time: number; - nickname: string; - statistics: { - all: AllStats; - clan: ClanStats; - frags: null | number; - }; - }; -} diff --git a/src/types/clanInfo.ts b/src/types/clanInfo.ts deleted file mode 100644 index 7ac8e8d5e..000000000 --- a/src/types/clanInfo.ts +++ /dev/null @@ -1,30 +0,0 @@ -export interface ClanInfo { - [clanId: number]: { - recruiting_options: { - vehicles_level: number; - wins_ratio: number; - average_battles_per_day: number; - battles: number; - average_damage: number; - }; - members_count: number; - name: string; - creator_name: string; - clan_id: number; - created_at: number; - updated_at: number; - leader_name: string; - members_ids: number[]; - recruiting_policy: string; - tag: string; - is_clan_disbanded: boolean; - old_name: string; - emblem_set_id: number; - creator_id: number; - motto: string; - renamed_at: number; - old_tag: null; - leader_id: number; - description: string; - }; -} diff --git a/src/types/playerClanData.ts b/src/types/playerClanData.ts deleted file mode 100644 index 63bbd0fcf..000000000 --- a/src/types/playerClanData.ts +++ /dev/null @@ -1,18 +0,0 @@ -export type PlayerClanInfo = { - [accountId: number]: { - account_id: number; - joined_at: number; - clan_id: number; - role: string; - account_name: string; - - clan?: { - members_count: number; - name: string; - created_at: number; - tag: string; - clan_id: number; - emblem_set_id: number; - }; - } | null; -}; From 862445259e09ff20ab79e5d4bf17128a42bc0165 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sat, 14 Oct 2023 10:52:05 -0500 Subject: [PATCH 19/43] feat: core chunk 2 --- src/commands/evolution.tsx | 4 ++-- src/commands/fullStats.tsx | 4 ++-- src/commands/stats.tsx | 6 ++--- src/commands/today.tsx | 10 ++------ src/components/AllStatsOverview/index.tsx | 2 +- src/components/GenericAllStats/index.tsx | 2 +- src/core/blitz/getPlayerClanInfo.ts | 10 -------- src/core/blitz/sumStats.ts | 2 +- src/core/blitzkrieg/getTierWeights.ts | 2 +- .../blitzstars/getBlitzStarsLinkButton.ts | 10 ++------ src/core/blitzstars/getDiffedTankStats.ts | 2 +- src/core/blitzstars/getPlayerHistories.ts | 18 ++++---------- src/core/blitzstars/tankAverages.ts | 2 +- src/events/interactionCreate/index.ts | 2 -- src/renderers/today.tsx | 24 +++++++------------ src/types/histories.ts | 2 +- src/types/tanksStats.ts | 2 +- 17 files changed, 33 insertions(+), 71 deletions(-) delete mode 100644 src/core/blitz/getPlayerClanInfo.ts diff --git a/src/commands/evolution.tsx b/src/commands/evolution.tsx index 815c10a73..6390302f4 100644 --- a/src/commands/evolution.tsx +++ b/src/commands/evolution.tsx @@ -3,12 +3,12 @@ import { SlashCommandSubcommandGroupBuilder, } from 'discord.js'; import { getAccountInfo } from '../_core/blitz/getAccountInfo'; +import { getClanAccountInfo } from '../_core/blitz/getClanAccountInfo'; import * as Graph from '../components/Graph'; import NoData, { NoDataType } from '../components/NoData'; import TitleBar from '../components/TitleBar'; import Wrapper from '../components/Wrapper'; import { getClanLogo } from '../core/blitz/getClanLogo'; -import { getPlayerClanInfo } from '../core/blitz/getPlayerClanInfo'; import resolveTankId from '../core/blitz/resolveTankId'; import { getBlitzStarsLinkButton } from '../core/blitzstars/getBlitzStarsLinkButton'; import getPlayerHistories from '../core/blitzstars/getPlayerHistories'; @@ -40,7 +40,7 @@ async function render( tankId: number | null, ) { const accountInfo = await getAccountInfo(region, id); - const clan = (await getPlayerClanInfo(region, id))[id]?.clan; + const clan = (await getClanAccountInfo(region, id))?.clan; const logo = clan ? getClanLogo(clan.emblem_set_id) : undefined; const histories = await (type === 'player' ? getPlayerHistories(region, id, { diff --git a/src/commands/fullStats.tsx b/src/commands/fullStats.tsx index 21c17740e..08903fa3e 100644 --- a/src/commands/fullStats.tsx +++ b/src/commands/fullStats.tsx @@ -1,5 +1,6 @@ import { SlashCommandBuilder } from 'discord.js'; import { getAccountInfo } from '../_core/blitz/getAccountInfo'; +import { getClanAccountInfo } from '../_core/blitz/getClanAccountInfo'; import { StatFilters, filterStats } from '../_core/statistics/filterStats'; import GenericAllStats from '../components/GenericAllStats'; import NoData, { NoDataType } from '../components/NoData'; @@ -7,7 +8,6 @@ import TierWeights from '../components/TierWeights'; import TitleBar from '../components/TitleBar'; import Wrapper from '../components/Wrapper'; import { getClanLogo } from '../core/blitz/getClanLogo'; -import { getPlayerClanInfo } from '../core/blitz/getPlayerClanInfo'; import { filtersToDescription } from '../core/blitzkrieg/filtersToDescription'; import { getTierWeights } from '../core/blitzkrieg/getTierWeights'; import { getBlitzStarsLinkButton } from '../core/blitzstars/getBlitzStarsLinkButton'; @@ -37,7 +37,7 @@ async function render( filters: StatFilters, ) { const { nickname } = await getAccountInfo(region, id); - const clan = (await getPlayerClanInfo(region, id))[id]?.clan; + const clan = (await getClanAccountInfo(region, id))?.clan; const clanImage = clan ? getClanLogo(clan.emblem_set_id) : undefined; const diffedTankStats = await getDiffedTankStats(region, id, start, end); const { stats, supplementary, filteredOrder } = await filterStats( diff --git a/src/commands/stats.tsx b/src/commands/stats.tsx index fa769167a..0c9ad0f76 100644 --- a/src/commands/stats.tsx +++ b/src/commands/stats.tsx @@ -1,12 +1,12 @@ import { SlashCommandBuilder } from 'discord.js'; import { getAccountInfo } from '../_core/blitz/getAccountInfo'; +import { getClanAccountInfo } from '../_core/blitz/getClanAccountInfo'; import { StatFilters, filterStats } from '../_core/statistics/filterStats'; import AllStatsOverview from '../components/AllStatsOverview'; import NoData, { NoDataType } from '../components/NoData'; import TitleBar from '../components/TitleBar'; import Wrapper from '../components/Wrapper'; import { getClanLogo } from '../core/blitz/getClanLogo'; -import { getPlayerClanInfo } from '../core/blitz/getPlayerClanInfo'; import { filtersToDescription } from '../core/blitzkrieg/filtersToDescription'; import { getBlitzStarsLinkButton } from '../core/blitzstars/getBlitzStarsLinkButton'; import getDiffedTankStats from '../core/blitzstars/getDiffedTankStats'; @@ -34,8 +34,8 @@ async function render( { start, end, name }: ResolvedPeriod, filters: StatFilters, ) { - const nickname = (await getAccountInfo(region, id))[id].nickname; - const clan = (await getPlayerClanInfo(region, id))[id]?.clan; + const { nickname } = await getAccountInfo(region, id); + const clan = (await getClanAccountInfo(region, id))?.clan; const clanImage = clan ? getClanLogo(clan.emblem_set_id) : undefined; const diffedTankStats = await getDiffedTankStats(region, id, start, end); const { stats, supplementary } = await filterStats(diffedTankStats, filters); diff --git a/src/commands/today.tsx b/src/commands/today.tsx index f1b77309e..a77c0dfb2 100644 --- a/src/commands/today.tsx +++ b/src/commands/today.tsx @@ -1,6 +1,5 @@ import { SlashCommandBuilder } from 'discord.js'; -import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; -import getWargamingResponse from '../core/blitz/getWargamingResponse'; +import { getAccountInfo } from '../_core/blitz/getAccountInfo'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteUsername from '../core/discord/autocompleteUsername'; import interactionToURL from '../core/discord/interactionToURL'; @@ -10,7 +9,6 @@ import resolvePlayerFromButton from '../core/discord/resolvePlayerFromButton'; import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand'; import { CommandRegistry } from '../events/interactionCreate'; import today from '../renderers/today'; -import { AccountInfo } from '../types/accountInfo'; export const todayCommand: CommandRegistry = { inProduction: true, @@ -50,11 +48,7 @@ export const todayCommand: CommandRegistry = { const cutoff = interaction.options.getInteger('cutoff') ?? undefined; const maximized = interaction.options.getInteger('maximized') ?? undefined; const showTotal = interaction.options.getBoolean('show-total') ?? undefined; - const { nickname } = ( - await getWargamingResponse( - `https://api.wotblitz.${player.region}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${player.id}`, - ) - )[player.id]; + const { nickname } = await getAccountInfo(player.region, player.id); const path = interactionToURL(interaction, { ...player, cutoff, diff --git a/src/components/AllStatsOverview/index.tsx b/src/components/AllStatsOverview/index.tsx index da7ba6c34..e78774e9d 100644 --- a/src/components/AllStatsOverview/index.tsx +++ b/src/components/AllStatsOverview/index.tsx @@ -1,4 +1,4 @@ -import { AllStats, SupplementaryStats } from '../../types/accountInfo'; +import { AllStats, SupplementaryStats } from '../../_core/blitz/getAccountInfo'; import { WN8Display } from './components/WN8Display'; import { WN8SurroundingStat, diff --git a/src/components/GenericAllStats/index.tsx b/src/components/GenericAllStats/index.tsx index 3919b7c14..fa75bfe4c 100644 --- a/src/components/GenericAllStats/index.tsx +++ b/src/components/GenericAllStats/index.tsx @@ -1,6 +1,6 @@ +import { AllStats, SupplementaryStats } from '../../_core/blitz/getAccountInfo'; import getWN8Percentile from '../../core/blitz/getWN8Percentile'; import isNumber from '../../core/node/isNumber'; -import { AllStats, SupplementaryStats } from '../../types/accountInfo'; import { Card } from './components/Card'; import { Root } from './components/Root'; import { Row } from './components/Row'; diff --git a/src/core/blitz/getPlayerClanInfo.ts b/src/core/blitz/getPlayerClanInfo.ts deleted file mode 100644 index db30e7f0a..000000000 --- a/src/core/blitz/getPlayerClanInfo.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Region } from '../../constants/regions'; -import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; -import { PlayerClanInfo } from '../../types/playerClanData'; -import getWargamingResponse from './getWargamingResponse'; - -export function getPlayerClanInfo(region: Region, id: number) { - return getWargamingResponse( - `https://api.wotblitz.${region}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}&extra=clan`, - ); -} diff --git a/src/core/blitz/sumStats.ts b/src/core/blitz/sumStats.ts index 160ddf593..63a002b37 100644 --- a/src/core/blitz/sumStats.ts +++ b/src/core/blitz/sumStats.ts @@ -1,4 +1,4 @@ -import { AllStats } from '../../types/accountInfo'; +import { AllStats } from '../../_core/blitz/getAccountInfo'; import { emptyAllStats } from '../blitzstars/getDiffedTankStats'; export default function sumStats(allStatsCollection: AllStats[]) { diff --git a/src/core/blitzkrieg/getTierWeights.ts b/src/core/blitzkrieg/getTierWeights.ts index 4140c4164..cf4a079ea 100644 --- a/src/core/blitzkrieg/getTierWeights.ts +++ b/src/core/blitzkrieg/getTierWeights.ts @@ -1,5 +1,5 @@ +import { AllStats } from '../../_core/blitz/getAccountInfo'; import { TierWeightsRecord } from '../../components/TierWeights'; -import { AllStats } from '../../types/accountInfo'; import { tankopedia } from '../blitz/tankopedia'; export async function getTierWeights( diff --git a/src/core/blitzstars/getBlitzStarsLinkButton.ts b/src/core/blitzstars/getBlitzStarsLinkButton.ts index 9fdaf152d..78e0388f8 100644 --- a/src/core/blitzstars/getBlitzStarsLinkButton.ts +++ b/src/core/blitzstars/getBlitzStarsLinkButton.ts @@ -1,7 +1,5 @@ +import { getAccountInfo } from '../../_core/blitz/getAccountInfo'; import { Region } from '../../constants/regions'; -import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; -import { AccountInfo } from '../../types/accountInfo'; -import getWargamingResponse from '../blitz/getWargamingResponse'; import linkButton from '../discord/linkButton'; export async function getBlitzStarsLinkButton( @@ -9,11 +7,7 @@ export async function getBlitzStarsLinkButton( id: number, tankId?: number, ) { - const { nickname } = ( - await getWargamingResponse( - `https://api.wotblitz.${region}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, - ) - )[id]; + const { nickname } = await getAccountInfo(region, id); return linkButton( `https://www.blitzstars.com/player/${region}/${nickname}${ diff --git a/src/core/blitzstars/getDiffedTankStats.ts b/src/core/blitzstars/getDiffedTankStats.ts index 512a52692..dc571d972 100644 --- a/src/core/blitzstars/getDiffedTankStats.ts +++ b/src/core/blitzstars/getDiffedTankStats.ts @@ -1,5 +1,5 @@ +import { AllStats } from '../../_core/blitz/getAccountInfo'; import { Region } from '../../constants/regions'; -import { AllStats } from '../../types/accountInfo'; import getTankHistories, { TankHistories, TankHistoryRaw, diff --git a/src/core/blitzstars/getPlayerHistories.ts b/src/core/blitzstars/getPlayerHistories.ts index 13bcbd674..c546c3907 100644 --- a/src/core/blitzstars/getPlayerHistories.ts +++ b/src/core/blitzstars/getPlayerHistories.ts @@ -1,13 +1,12 @@ +import { getAccountInfo } from '../../_core/blitz/getAccountInfo'; +import { PlayerStats } from '../../_core/blitzstars/getPlayerStats'; import { Region } from '../../constants/regions'; -import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; -import { AccountInfo } from '../../types/accountInfo'; import { GetHistoriesOptions, Histories, History, getHistoriesDefaultOptions, } from '../../types/histories'; -import getWargamingResponse from '../blitz/getWargamingResponse'; import { emptyAllStats } from './getDiffedTankStats'; export default async function getPlayerHistories( @@ -19,7 +18,7 @@ export default async function getPlayerHistories( const response = await fetch( `https://www.blitzstars.com/api/playerstats/${id}`, ); - const playerHistories = ((await response.json()) as PlayerHistoriesRaw).map( + const playerHistories = ((await response.json()) as PlayerStats).map( (history) => ({ all: history.statistics.all, @@ -42,16 +41,9 @@ export default async function getPlayerHistories( const latestNodes: Histories = []; if (mergedOptions.includeLatestHistories) { - const { - last_battle_time, - statistics: { all }, - } = ( - await getWargamingResponse( - `https://api.wotblitz.${server}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, - ) - )[id]; + const { last_battle_time, statistics } = await getAccountInfo(server, id); - latestNodes.push({ all, last_battle_time }); + latestNodes.push({ all: statistics.all, last_battle_time }); } const previousNodes: Histories = []; diff --git a/src/core/blitzstars/tankAverages.ts b/src/core/blitzstars/tankAverages.ts index 8fd37a864..23d5599ee 100644 --- a/src/core/blitzstars/tankAverages.ts +++ b/src/core/blitzstars/tankAverages.ts @@ -1,4 +1,4 @@ -import { AllStats } from '../../types/accountInfo'; +import { AllStats } from '../../_core/blitz/getAccountInfo'; import { context } from '../blitzkrieg/context'; export interface SpecialStats { diff --git a/src/events/interactionCreate/index.ts b/src/events/interactionCreate/index.ts index f218d5c7a..a461732ab 100644 --- a/src/events/interactionCreate/index.ts +++ b/src/events/interactionCreate/index.ts @@ -15,7 +15,6 @@ import { } from 'discord.js'; import discord from '../../../discord.json' assert { type: 'json' }; import { aboutCommand } from '../../commands/about'; -import { clanEventCommand } from '../../commands/clanEvent'; import { debugCommand } from '../../commands/debug'; import { eligibleCommand } from '../../commands/eligible'; import { evolutionCommand } from '../../commands/evolution'; @@ -102,7 +101,6 @@ export const COMMANDS_RAW: CommandRegistry[] = [ evolutionCommand, statsCommand, ratingsCommand, - clanEventCommand, ]; export const commands = Promise.all(COMMANDS_RAW).then((rawCommands) => diff --git a/src/renderers/today.tsx b/src/renderers/today.tsx index baf7cfb96..d4a908e2c 100644 --- a/src/renderers/today.tsx +++ b/src/renderers/today.tsx @@ -1,13 +1,13 @@ +import { AllStats, getAccountInfo } from '../_core/blitz/getAccountInfo'; +import { getClanAccountInfo } from '../_core/blitz/getClanAccountInfo'; +import calculateWN8 from '../_core/statistics/calculateWN8'; import * as Breakdown from '../components/Breakdown'; import NoData, { NoDataType } from '../components/NoData'; import TitleBar from '../components/TitleBar'; import Wrapper from '../components/Wrapper'; -import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; -import calculateWN8 from '../core/blitz/calculateWN8'; import getTankStats from '../core/blitz/getTankStats'; import getTreeType from '../core/blitz/getTreeType'; import getWN8Percentile from '../core/blitz/getWN8Percentile'; -import getWargamingResponse from '../core/blitz/getWargamingResponse'; import resolveTankName from '../core/blitz/resolveTankName'; import sumStats from '../core/blitz/sumStats'; import { tankopedia } from '../core/blitz/tankopedia'; @@ -16,8 +16,6 @@ import getPeriodNow from '../core/blitzstars/getPeriodNow'; import getTimeDaysAgo from '../core/blitzstars/getTimeDaysAgo'; import { tankAverages } from '../core/blitzstars/tankAverages'; import { ResolvedPlayer } from '../core/discord/resolvePlayerFromCommand'; -import { AccountInfo, AllStats } from '../types/accountInfo'; -import { PlayerClanInfo } from '../types/playerClanData'; import { PossiblyPromise } from '../types/possiblyPromise'; export default async function today( @@ -33,16 +31,12 @@ export default async function today( getTimeDaysAgo(server, 1), getPeriodNow(), ); - const accountInfo = await getWargamingResponse( - `https://api.wotblitz.${server}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, - ); - const clanData = await getWargamingResponse( - `https://api.wotblitz.${server}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}&extra=clan`, - ); + const accountInfo = await getAccountInfo(server, id); + const clanData = await getClanAccountInfo(server, id); const careerTankStatsRaw = await getTankStats(server, id); const careerStats: Record = showTotal ? { - 0: accountInfo[id].statistics.all, + 0: accountInfo.statistics.all, } : {}; const allStatsToAccumulate: AllStats[] = []; @@ -191,10 +185,10 @@ export default async function today( ) : ( Date: Sat, 14 Oct 2023 10:55:00 -0500 Subject: [PATCH 20/43] feat: cached archived ratings --- .../blitzkrieg}/getArchivedRatingsInfo.ts | 26 ++++++++++++++++--- src/commands/ratings.tsx | 2 +- 2 files changed, 24 insertions(+), 4 deletions(-) rename src/{core/blitz => _core/blitzkrieg}/getArchivedRatingsInfo.ts (54%) diff --git a/src/core/blitz/getArchivedRatingsInfo.ts b/src/_core/blitzkrieg/getArchivedRatingsInfo.ts similarity index 54% rename from src/core/blitz/getArchivedRatingsInfo.ts rename to src/_core/blitzkrieg/getArchivedRatingsInfo.ts index c22e29653..42a47b489 100644 --- a/src/core/blitz/getArchivedRatingsInfo.ts +++ b/src/_core/blitzkrieg/getArchivedRatingsInfo.ts @@ -1,13 +1,31 @@ import { RatingsInfo } from '../../commands/ratings'; import { Region } from '../../constants/regions'; -import { DATABASE_REPO } from '../database/getMidnightLeaderboard'; -import { octokit } from '../github/octokit'; -import throwError from '../node/throwError'; +import { DATABASE_REPO } from '../../core/database/getMidnightLeaderboard'; +import { octokit } from '../../core/github/octokit'; +import throwError from '../../core/node/throwError'; + +const ARCHIVED_RATINGS_CACHE: Record< + Region, + Record< + number, + RatingsInfo & { + detail: undefined; + } + > +> = { + com: {}, + eu: {}, + asia: {}, +}; export default async function getArchivedRatingsInfo( season: number, region: Region, ) { + if (ARCHIVED_RATINGS_CACHE[region][season]) { + return ARCHIVED_RATINGS_CACHE[region][season]; + } + const { data } = await octokit.repos.getContent({ ...DATABASE_REPO, path: `${region}/ratings/${season}/info.json`, @@ -21,5 +39,7 @@ export default async function getArchivedRatingsInfo( detail: undefined; }; + ARCHIVED_RATINGS_CACHE[region][season] = jsonContent; + return jsonContent; } diff --git a/src/commands/ratings.tsx b/src/commands/ratings.tsx index 02e97fe4c..4a909b35b 100644 --- a/src/commands/ratings.tsx +++ b/src/commands/ratings.tsx @@ -7,11 +7,11 @@ import { import { BlitzkriegRatingsLeaderboard } from '../../scripts/buildRatingsLeaderboard'; import { getAccountInfo } from '../_core/blitz/getAccountInfo'; import { getClanAccountInfo } from '../_core/blitz/getClanAccountInfo'; +import getArchivedRatingsInfo from '../_core/blitzkrieg/getArchivedRatingsInfo'; import * as Leaderboard from '../components/Leaderboard'; import TitleBar from '../components/TitleBar'; import Wrapper from '../components/Wrapper'; import { REGION_NAMES_SHORT, Region } from '../constants/regions'; -import getArchivedRatingsInfo from '../core/blitz/getArchivedRatingsInfo'; import getRatingsInfo from '../core/blitz/getRatingsInfo'; import regionToRegionSubdomain from '../core/blitz/regionToRegionSubdomain'; import getMidnightLeaderboard, { From 07e3660388422fd459f3a77126eba986c638b848 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sat, 14 Oct 2023 10:58:48 -0500 Subject: [PATCH 21/43] feat: core chunk 3 --- .vscode/settings.json | 1 + .../blitz/fetchWargaming.ts} | 10 ++++------ src/_core/blitz/getAccountAchievements.ts | 4 ++-- src/_core/blitz/getAccountInfo.ts | 4 ++-- src/_core/blitz/getClanAccountInfo.ts | 4 ++-- src/_core/blitz/getClanInfo.ts | 4 ++-- src/{core => _core}/blitz/getRatingsInfo.ts | 2 +- src/{core => _core}/blitz/getTankStats.ts | 10 +++++----- src/{core => _core}/blitz/getTreeType.ts | 2 +- src/_core/blitzkrieg/emblemIdToURL.ts | 3 +++ src/app/embeds/session/page.tsx | 4 ++-- src/app/tools/session/page.tsx | 4 ++-- src/commands/evolution.tsx | 4 ++-- src/commands/fullStats.tsx | 4 ++-- src/commands/ownedTanks.tsx | 8 ++++---- src/commands/ratings.tsx | 2 +- src/commands/searchClans.ts | 4 ++-- src/commands/searchPlayers.ts | 4 ++-- src/commands/stats.tsx | 4 ++-- src/core/blitz/getClanLogo.ts | 3 --- src/core/blitz/listClans.ts | 8 ++++---- src/core/blitz/listPlayers.ts | 8 ++++---- src/core/blitz/tankopedia.ts | 8 ++++---- src/core/blitzstars/getTankHistories.ts | 2 +- src/renderers/today.tsx | 4 ++-- 25 files changed, 57 insertions(+), 58 deletions(-) rename src/{core/blitz/getWargamingResponse.ts => _core/blitz/fetchWargaming.ts} (66%) rename src/{core => _core}/blitz/getRatingsInfo.ts (82%) rename src/{core => _core}/blitz/getTankStats.ts (54%) rename src/{core => _core}/blitz/getTreeType.ts (83%) create mode 100644 src/_core/blitzkrieg/emblemIdToURL.ts delete mode 100644 src/core/blitz/getClanLogo.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index 30edbe1b0..9a808967a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -43,6 +43,7 @@ "wargaming", "webp", "winrate", + "wotblitz", "zustand" ], "deno.enable": false, diff --git a/src/core/blitz/getWargamingResponse.ts b/src/_core/blitz/fetchWargaming.ts similarity index 66% rename from src/core/blitz/getWargamingResponse.ts rename to src/_core/blitz/fetchWargaming.ts index 2c4848455..ac8c2d1ba 100644 --- a/src/core/blitz/getWargamingResponse.ts +++ b/src/_core/blitz/fetchWargaming.ts @@ -1,6 +1,6 @@ -import throwError from '../node/throwError'; +import throwError from '../../core/node/throwError'; -export type WargamingResponse = +export type BlitzResponse = | { status: 'error'; error: { field: string; message: string; code: 402; value: null }; @@ -10,12 +10,10 @@ export type WargamingResponse = data: Data; }; -export default async function getWargamingResponse( - url: string, -) { +export default async function fetchBlitz(url: string) { const data = (await fetch(url).then((response) => response.json(), - )) as WargamingResponse; + )) as BlitzResponse; if (data.status === 'ok') { return data.data; diff --git a/src/_core/blitz/getAccountAchievements.ts b/src/_core/blitz/getAccountAchievements.ts index 52073afd3..edb21ca14 100644 --- a/src/_core/blitz/getAccountAchievements.ts +++ b/src/_core/blitz/getAccountAchievements.ts @@ -1,6 +1,6 @@ import { Region } from '../../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; -import getWargamingResponse from '../../core/blitz/getWargamingResponse'; +import fetchBlitz from './fetchWargaming'; import { normalizeIds } from './normalizeIds'; interface IndividualAccountAchievements { @@ -22,7 +22,7 @@ export async function getAccountAchievements< ? IndividualAccountAchievements : IndividualAccountAchievements[], >(region: Region, ids: Ids) { - const object = await getWargamingResponse( + const object = await fetchBlitz( `https://api.wotblitz.${region}/wotb/account/achievements/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${normalizeIds( ids, )}`, diff --git a/src/_core/blitz/getAccountInfo.ts b/src/_core/blitz/getAccountInfo.ts index 20e5c6644..5852ea073 100644 --- a/src/_core/blitz/getAccountInfo.ts +++ b/src/_core/blitz/getAccountInfo.ts @@ -1,6 +1,6 @@ import { Region } from '../../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; -import getWargamingResponse from '../../core/blitz/getWargamingResponse'; +import fetchBlitz from './fetchWargaming'; import { normalizeIds } from './normalizeIds'; export interface AllStats { @@ -75,7 +75,7 @@ export async function getAccountInfo< ? IndividualAccountInfo : IndividualAccountInfo[], >(region: Region, ids: Ids) { - const object = await getWargamingResponse( + const object = await fetchBlitz( `https://api.wotblitz.${region}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${normalizeIds( ids, )}`, diff --git a/src/_core/blitz/getClanAccountInfo.ts b/src/_core/blitz/getClanAccountInfo.ts index b25a32253..9fee45c89 100644 --- a/src/_core/blitz/getClanAccountInfo.ts +++ b/src/_core/blitz/getClanAccountInfo.ts @@ -1,6 +1,6 @@ import { Region } from '../../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; -import getWargamingResponse from '../../core/blitz/getWargamingResponse'; +import fetchBlitz from './fetchWargaming'; import { normalizeExtra } from './normalizeExtra'; import { normalizeIds } from './normalizeIds'; @@ -31,7 +31,7 @@ export async function getClanAccountInfo< ? IndividualClanAccountInfo : IndividualClanAccountInfo[], >(region: Region, ids: Ids, extra?: string[]) { - const object = await getWargamingResponse( + const object = await fetchBlitz( `https://api.wotblitz.${region}/wotb/clans/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${normalizeIds( ids, )}${normalizeExtra(extra)}`, diff --git a/src/_core/blitz/getClanInfo.ts b/src/_core/blitz/getClanInfo.ts index a28c9e740..625daca67 100644 --- a/src/_core/blitz/getClanInfo.ts +++ b/src/_core/blitz/getClanInfo.ts @@ -1,6 +1,6 @@ import { Region } from '../../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; -import getWargamingResponse from '../../core/blitz/getWargamingResponse'; +import fetchBlitz from './fetchWargaming'; import { normalizeIds } from './normalizeIds'; export interface IndividualClanInfo { @@ -40,7 +40,7 @@ export async function getClanInfo< Ids extends number | number[], ReturnType = Ids extends number ? IndividualClanInfo : IndividualClanInfo[], >(region: Region, ids: Ids) { - const object = await getWargamingResponse( + const object = await fetchBlitz( `https://api.wotblitz.${region}/wotb/clans/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${normalizeIds( ids, )}`, diff --git a/src/core/blitz/getRatingsInfo.ts b/src/_core/blitz/getRatingsInfo.ts similarity index 82% rename from src/core/blitz/getRatingsInfo.ts rename to src/_core/blitz/getRatingsInfo.ts index 56588cdac..8c4c85aa5 100644 --- a/src/core/blitz/getRatingsInfo.ts +++ b/src/_core/blitz/getRatingsInfo.ts @@ -1,6 +1,6 @@ import { RatingsInfo } from '../../commands/ratings'; import { Region } from '../../constants/regions'; -import regionToRegionSubdomain from './regionToRegionSubdomain'; +import regionToRegionSubdomain from '../../core/blitz/regionToRegionSubdomain'; export default async function getRatingsInfo(region: Region) { const response = await fetch( diff --git a/src/core/blitz/getTankStats.ts b/src/_core/blitz/getTankStats.ts similarity index 54% rename from src/core/blitz/getTankStats.ts rename to src/_core/blitz/getTankStats.ts index 8ff5766ba..bf1e3c60c 100644 --- a/src/core/blitz/getTankStats.ts +++ b/src/_core/blitz/getTankStats.ts @@ -1,18 +1,18 @@ -import { REGION_NAMES, Region } from '../../constants/regions'; +import { Region } from '../../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; +import throwError from '../../core/node/throwError'; import { TanksStats } from '../../types/tanksStats'; -import throwError from '../node/throwError'; -import getWargamingResponse from './getWargamingResponse'; +import fetchBlitz from './fetchWargaming'; export default async function getTankStats(region: Region, id: number) { - const tankStats = await getWargamingResponse( + const tankStats = await fetchBlitz( `https://api.wotblitz.${region}/wotb/tanks/stats/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, ); if (tankStats[id] === null) { throw throwError( 'No tank stats available', - `Wargaming says there is no tank stats for this account. This account may not have any battles/tanks or exist in the ${REGION_NAMES[region]} server.`, + "This player doesn't have any stats for tanks available. This may not be the player you are looking for.", ); } diff --git a/src/core/blitz/getTreeType.ts b/src/_core/blitz/getTreeType.ts similarity index 83% rename from src/core/blitz/getTreeType.ts rename to src/_core/blitz/getTreeType.ts index 5c5e4f1ec..ae43ca2fc 100644 --- a/src/core/blitz/getTreeType.ts +++ b/src/_core/blitz/getTreeType.ts @@ -1,5 +1,5 @@ import { TreeTypeEnum } from '../../components/Tanks'; -import { tankopedia } from './tankopedia'; +import { tankopedia } from '../../core/blitz/tankopedia'; export default async function getTreeType(id: number) { const entry = (await tankopedia)[id]; diff --git a/src/_core/blitzkrieg/emblemIdToURL.ts b/src/_core/blitzkrieg/emblemIdToURL.ts new file mode 100644 index 000000000..e07dd2ba8 --- /dev/null +++ b/src/_core/blitzkrieg/emblemIdToURL.ts @@ -0,0 +1,3 @@ +export function emblemIdToURL(emblemId: number) { + return `https://wotblitz-gc.gcdn.co/icons/clanEmblems1x/clan-icon-v2-${emblemId}.png`; +} diff --git a/src/app/embeds/session/page.tsx b/src/app/embeds/session/page.tsx index 2af6e33f6..95984a340 100644 --- a/src/app/embeds/session/page.tsx +++ b/src/app/embeds/session/page.tsx @@ -2,13 +2,13 @@ import { ContextMenu } from '@radix-ui/themes'; import { useEffect, useState } from 'react'; +import fetchBlitz from '../../../_core/blitz/fetchWargaming'; import calculateWN8 from '../../../_core/statistics/calculateWN8'; import { deltaTankStats } from '../../../_core/statistics/deltaTankStats'; import * as Breakdown from '../../../components/Breakdown'; import { TreeTypeEnum } from '../../../components/Tanks'; import { WARGAMING_APPLICATION_ID } from '../../../constants/wargamingApplicationID'; import getWN8Percentile from '../../../core/blitz/getWN8Percentile'; -import getWargamingResponse from '../../../core/blitz/getWargamingResponse'; import { TankopediaEntry, tankopedia } from '../../../core/blitz/tankopedia'; import { tankAverages } from '../../../core/blitzstars/tankAverages'; import { useSession } from '../../../stores/session'; @@ -73,7 +73,7 @@ export default function SessionPage() { async function recalculateDiff() { if (session.isTracking) { const { id, region } = session; - const careerRaw = await getWargamingResponse( + const careerRaw = await fetchBlitz( `https://api.wotblitz.${region}/wotb/tanks/stats/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, ); const career = careerRaw[id].reduce< diff --git a/src/app/tools/session/page.tsx b/src/app/tools/session/page.tsx index 906988e7f..a946386a7 100644 --- a/src/app/tools/session/page.tsx +++ b/src/app/tools/session/page.tsx @@ -18,10 +18,10 @@ import { } from '@radix-ui/themes'; import { debounce } from 'lodash'; import { ChangeEvent, useRef, useState } from 'react'; +import fetchBlitz from '../../../_core/blitz/fetchWargaming'; import PageWrapper from '../../../components/PageWrapper'; import { REGION_NAMES, Region } from '../../../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../../../constants/wargamingApplicationID'; -import getWargamingResponse from '../../../core/blitz/getWargamingResponse'; import listPlayers, { AccountListWithServer, } from '../../../core/blitz/listPlayers'; @@ -54,7 +54,7 @@ export default function Page() { input.current!.value = nickname; const rawTankStats = ( - await getWargamingResponse( + await fetchBlitz( `https://api.wotblitz.${region}/wotb/tanks/stats/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, ) )[id]; diff --git a/src/commands/evolution.tsx b/src/commands/evolution.tsx index 6390302f4..c389bb632 100644 --- a/src/commands/evolution.tsx +++ b/src/commands/evolution.tsx @@ -4,11 +4,11 @@ import { } from 'discord.js'; import { getAccountInfo } from '../_core/blitz/getAccountInfo'; import { getClanAccountInfo } from '../_core/blitz/getClanAccountInfo'; +import { emblemIdToURL } from '../_core/blitzkrieg/emblemIdToURL'; import * as Graph from '../components/Graph'; import NoData, { NoDataType } from '../components/NoData'; import TitleBar from '../components/TitleBar'; import Wrapper from '../components/Wrapper'; -import { getClanLogo } from '../core/blitz/getClanLogo'; import resolveTankId from '../core/blitz/resolveTankId'; import { getBlitzStarsLinkButton } from '../core/blitzstars/getBlitzStarsLinkButton'; import getPlayerHistories from '../core/blitzstars/getPlayerHistories'; @@ -41,7 +41,7 @@ async function render( ) { const accountInfo = await getAccountInfo(region, id); const clan = (await getClanAccountInfo(region, id))?.clan; - const logo = clan ? getClanLogo(clan.emblem_set_id) : undefined; + const logo = clan ? emblemIdToURL(clan.emblem_set_id) : undefined; const histories = await (type === 'player' ? getPlayerHistories(region, id, { start, diff --git a/src/commands/fullStats.tsx b/src/commands/fullStats.tsx index 08903fa3e..dcefd2a01 100644 --- a/src/commands/fullStats.tsx +++ b/src/commands/fullStats.tsx @@ -1,13 +1,13 @@ import { SlashCommandBuilder } from 'discord.js'; import { getAccountInfo } from '../_core/blitz/getAccountInfo'; import { getClanAccountInfo } from '../_core/blitz/getClanAccountInfo'; +import { emblemIdToURL } from '../_core/blitzkrieg/emblemIdToURL'; import { StatFilters, filterStats } from '../_core/statistics/filterStats'; import GenericAllStats from '../components/GenericAllStats'; import NoData, { NoDataType } from '../components/NoData'; import TierWeights from '../components/TierWeights'; import TitleBar from '../components/TitleBar'; import Wrapper from '../components/Wrapper'; -import { getClanLogo } from '../core/blitz/getClanLogo'; import { filtersToDescription } from '../core/blitzkrieg/filtersToDescription'; import { getTierWeights } from '../core/blitzkrieg/getTierWeights'; import { getBlitzStarsLinkButton } from '../core/blitzstars/getBlitzStarsLinkButton'; @@ -38,7 +38,7 @@ async function render( ) { const { nickname } = await getAccountInfo(region, id); const clan = (await getClanAccountInfo(region, id))?.clan; - const clanImage = clan ? getClanLogo(clan.emblem_set_id) : undefined; + const clanImage = clan ? emblemIdToURL(clan.emblem_set_id) : undefined; const diffedTankStats = await getDiffedTankStats(region, id, start, end); const { stats, supplementary, filteredOrder } = await filterStats( diffedTankStats, diff --git a/src/commands/ownedTanks.tsx b/src/commands/ownedTanks.tsx index 6c9870b63..b8a15792d 100644 --- a/src/commands/ownedTanks.tsx +++ b/src/commands/ownedTanks.tsx @@ -1,13 +1,13 @@ import { SlashCommandBuilder } from 'discord.js'; import { getAccountInfo } from '../_core/blitz/getAccountInfo'; import { getClanAccountInfo } from '../_core/blitz/getClanAccountInfo'; +import getTankStats from '../_core/blitz/getTankStats'; +import getTreeType from '../_core/blitz/getTreeType'; +import { emblemIdToURL } from '../_core/blitzkrieg/emblemIdToURL'; import NoData, { NoDataType } from '../components/NoData'; import * as Tanks from '../components/Tanks'; import TitleBar from '../components/TitleBar'; import Wrapper from '../components/Wrapper'; -import { getClanLogo } from '../core/blitz/getClanLogo'; -import getTankStats from '../core/blitz/getTankStats'; -import getTreeType from '../core/blitz/getTreeType'; import resolveTankName from '../core/blitz/resolveTankName'; import { TIER_ROMAN_NUMERALS, @@ -67,7 +67,7 @@ export const ownedTanksCommand: CommandRegistry = { name={accountInfo.nickname} image={ clanAccountInfo?.clan - ? getClanLogo(clanAccountInfo.clan.emblem_set_id) + ? emblemIdToURL(clanAccountInfo.clan.emblem_set_id) : undefined } description={`Tier ${TIER_ROMAN_NUMERALS[tier as Tier]} tanks`} diff --git a/src/commands/ratings.tsx b/src/commands/ratings.tsx index 4a909b35b..305a0723e 100644 --- a/src/commands/ratings.tsx +++ b/src/commands/ratings.tsx @@ -7,12 +7,12 @@ import { import { BlitzkriegRatingsLeaderboard } from '../../scripts/buildRatingsLeaderboard'; import { getAccountInfo } from '../_core/blitz/getAccountInfo'; import { getClanAccountInfo } from '../_core/blitz/getClanAccountInfo'; +import getRatingsInfo from '../_core/blitz/getRatingsInfo'; import getArchivedRatingsInfo from '../_core/blitzkrieg/getArchivedRatingsInfo'; import * as Leaderboard from '../components/Leaderboard'; import TitleBar from '../components/TitleBar'; import Wrapper from '../components/Wrapper'; import { REGION_NAMES_SHORT, Region } from '../constants/regions'; -import getRatingsInfo from '../core/blitz/getRatingsInfo'; import regionToRegionSubdomain from '../core/blitz/regionToRegionSubdomain'; import getMidnightLeaderboard, { DATABASE_REPO, diff --git a/src/commands/searchClans.ts b/src/commands/searchClans.ts index 28016ce85..dfe60053c 100644 --- a/src/commands/searchClans.ts +++ b/src/commands/searchClans.ts @@ -1,8 +1,8 @@ import { SlashCommandBuilder } from 'discord.js'; import markdownEscape from 'markdown-escape'; +import fetchBlitz from '../_core/blitz/fetchWargaming'; import { REGION_NAMES, Region } from '../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; -import getWargamingResponse from '../core/blitz/getWargamingResponse'; import addClanChoices from '../core/discord/addClanChoices'; import addRegionChoices from '../core/discord/addRegionChoices'; import embedInfo from '../core/discord/embedInfo'; @@ -30,7 +30,7 @@ export const searchClansCommand: CommandRegistry = { const server = interaction.options.getString('region') as Region; const clan = interaction.options.getString('clan')!; const limit = interaction.options.getInteger('limit') ?? 25; - const clanList = await getWargamingResponse( + const clanList = await fetchBlitz( `https://api.wotblitz.${server}/wotb/clans/list/?application_id=${WARGAMING_APPLICATION_ID}&search=${clan}&limit=${limit}`, ); diff --git a/src/commands/searchPlayers.ts b/src/commands/searchPlayers.ts index 87d66c640..8b2eacf8e 100644 --- a/src/commands/searchPlayers.ts +++ b/src/commands/searchPlayers.ts @@ -1,8 +1,8 @@ import { SlashCommandBuilder } from 'discord.js'; import markdownEscape from 'markdown-escape'; +import fetchBlitz from '../_core/blitz/fetchWargaming'; import { REGION_NAMES, Region } from '../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; -import getWargamingResponse from '../core/blitz/getWargamingResponse'; import { AccountList, usernamePattern } from '../core/blitz/listPlayers'; import addRegionChoices from '../core/discord/addRegionChoices'; import addUsernameChoices from '../core/discord/addUsernameChoices'; @@ -34,7 +34,7 @@ export const searchPlayersCommand: CommandRegistry = { const limit = interaction.options.getInteger('limit') ?? 25; const trimmedSearch = name.trim(); const players = usernamePattern.test(trimmedSearch) - ? await getWargamingResponse( + ? await fetchBlitz( `https://api.wotblitz.${server}/wotb/account/list/?application_id=${WARGAMING_APPLICATION_ID}&search=${encodeURIComponent( trimmedSearch, )}&limit=${limit}`, diff --git a/src/commands/stats.tsx b/src/commands/stats.tsx index 0c9ad0f76..0b5b0aa61 100644 --- a/src/commands/stats.tsx +++ b/src/commands/stats.tsx @@ -1,12 +1,12 @@ import { SlashCommandBuilder } from 'discord.js'; import { getAccountInfo } from '../_core/blitz/getAccountInfo'; import { getClanAccountInfo } from '../_core/blitz/getClanAccountInfo'; +import { emblemIdToURL } from '../_core/blitzkrieg/emblemIdToURL'; import { StatFilters, filterStats } from '../_core/statistics/filterStats'; import AllStatsOverview from '../components/AllStatsOverview'; import NoData, { NoDataType } from '../components/NoData'; import TitleBar from '../components/TitleBar'; import Wrapper from '../components/Wrapper'; -import { getClanLogo } from '../core/blitz/getClanLogo'; import { filtersToDescription } from '../core/blitzkrieg/filtersToDescription'; import { getBlitzStarsLinkButton } from '../core/blitzstars/getBlitzStarsLinkButton'; import getDiffedTankStats from '../core/blitzstars/getDiffedTankStats'; @@ -36,7 +36,7 @@ async function render( ) { const { nickname } = await getAccountInfo(region, id); const clan = (await getClanAccountInfo(region, id))?.clan; - const clanImage = clan ? getClanLogo(clan.emblem_set_id) : undefined; + const clanImage = clan ? emblemIdToURL(clan.emblem_set_id) : undefined; const diffedTankStats = await getDiffedTankStats(region, id, start, end); const { stats, supplementary } = await filterStats(diffedTankStats, filters); const filterDescriptions = await filtersToDescription(filters); diff --git a/src/core/blitz/getClanLogo.ts b/src/core/blitz/getClanLogo.ts deleted file mode 100644 index 17354e727..000000000 --- a/src/core/blitz/getClanLogo.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function getClanLogo(emblemId: number) { - return `https://wotblitz-gc.gcdn.co/icons/clanEmblems1x/clan-icon-v2-${emblemId}.png` -} \ No newline at end of file diff --git a/src/core/blitz/listClans.ts b/src/core/blitz/listClans.ts index a0475bd62..e047aed81 100644 --- a/src/core/blitz/listClans.ts +++ b/src/core/blitz/listClans.ts @@ -1,7 +1,7 @@ +import fetchBlitz from '../../_core/blitz/fetchWargaming'; import { Region } from '../../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; import { Clan, ClanList } from '../../types/clanList'; -import getWargamingResponse from './getWargamingResponse'; export type ClanListWithRegion = (Clan & { region: 'com' | 'eu' | 'asia'; @@ -14,7 +14,7 @@ export default async function listClans(search: string, limit = 9) { return ( await Promise.all([ - getWargamingResponse( + fetchBlitz( `https://api.wotblitz.com/wotb/clans/list/?application_id=${WARGAMING_APPLICATION_ID}&search=${search}&limit=${normalizedLimit}`, ).then( (value) => @@ -24,7 +24,7 @@ export default async function listClans(search: string, limit = 9) { region: 'com' as Region, })), ), - getWargamingResponse( + fetchBlitz( `https://api.wotblitz.eu/wotb/clans/list/?application_id=${WARGAMING_APPLICATION_ID}&search=${search}&limit=${normalizedLimit}`, ).then( (value) => @@ -34,7 +34,7 @@ export default async function listClans(search: string, limit = 9) { region: 'eu' as Region, })), ), - getWargamingResponse( + fetchBlitz( `https://api.wotblitz.asia/wotb/clans/list/?application_id=${WARGAMING_APPLICATION_ID}&search=${search}&limit=${normalizedLimit}`, ).then( (value) => diff --git a/src/core/blitz/listPlayers.ts b/src/core/blitz/listPlayers.ts index 15f3bae99..0a4242b04 100644 --- a/src/core/blitz/listPlayers.ts +++ b/src/core/blitz/listPlayers.ts @@ -1,6 +1,6 @@ +import fetchBlitz from '../../_core/blitz/fetchWargaming'; import { Region } from '../../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; -import getWargamingResponse from './getWargamingResponse'; interface Account { nickname: string; @@ -22,7 +22,7 @@ export default async function listPlayers(search: string, limit = 9) { if (usernamePattern.test(trimmedSearch)) { return ( await Promise.all([ - getWargamingResponse( + fetchBlitz( `https://api.wotblitz.com/wotb/account/list/?application_id=${WARGAMING_APPLICATION_ID}&search=${encodedSearch}&limit=${normalizedLimit}`, ).then( (value) => @@ -32,7 +32,7 @@ export default async function listPlayers(search: string, limit = 9) { region: 'com' as Region, })), ), - getWargamingResponse( + fetchBlitz( `https://api.wotblitz.eu/wotb/account/list/?application_id=${WARGAMING_APPLICATION_ID}&search=${encodedSearch}&limit=${normalizedLimit}`, ).then( (value) => @@ -42,7 +42,7 @@ export default async function listPlayers(search: string, limit = 9) { region: 'eu' as Region, })), ), - getWargamingResponse( + fetchBlitz( `https://api.wotblitz.asia/wotb/account/list/?application_id=${WARGAMING_APPLICATION_ID}&search=${encodedSearch}&limit=${normalizedLimit}`, ).then( (value) => diff --git a/src/core/blitz/tankopedia.ts b/src/core/blitz/tankopedia.ts index b77049f0f..a525d86bd 100644 --- a/src/core/blitz/tankopedia.ts +++ b/src/core/blitz/tankopedia.ts @@ -1,8 +1,8 @@ import { deburr } from 'lodash'; +import fetchBlitz from '../../_core/blitz/fetchWargaming'; +import { TreeTypeString } from '../../components/Tanks'; import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; import { context } from '../blitzkrieg/context'; -import getWargamingResponse from './getWargamingResponse'; -import { TreeTypeString } from '../../components/Tanks'; export interface TankopediaEntry { name: string; @@ -16,7 +16,7 @@ export interface TankopediaEntry { type: string; description: string; } -type asd = TreeTypeString +type asd = TreeTypeString; export interface Tankopedia { [id: number]: TankopediaEntry | undefined; } @@ -71,7 +71,7 @@ export interface TankopediaInfo { // this is blocking because info is needed for command creation console.log('Caching tankopedia info...'); -export const tankopediaInfo = getWargamingResponse( +export const tankopediaInfo = fetchBlitz( `https://api.wotblitz.com/wotb/encyclopedia/info/?application_id=${WARGAMING_APPLICATION_ID}`, ); console.log('Cached tankopedia info'); diff --git a/src/core/blitzstars/getTankHistories.ts b/src/core/blitzstars/getTankHistories.ts index 3b5ed9d14..b37a6b508 100644 --- a/src/core/blitzstars/getTankHistories.ts +++ b/src/core/blitzstars/getTankHistories.ts @@ -1,3 +1,4 @@ +import getTankStats from '../../_core/blitz/getTankStats'; import { Region } from '../../constants/regions'; import { GetHistoriesOptions, @@ -5,7 +6,6 @@ import { History, getHistoriesDefaultOptions, } from '../../types/histories'; -import getTankStats from '../blitz/getTankStats'; import { emptyAllStats } from './getDiffedTankStats'; export interface TankHistory extends History { diff --git a/src/renderers/today.tsx b/src/renderers/today.tsx index d4a908e2c..2496fefb6 100644 --- a/src/renderers/today.tsx +++ b/src/renderers/today.tsx @@ -1,12 +1,12 @@ import { AllStats, getAccountInfo } from '../_core/blitz/getAccountInfo'; import { getClanAccountInfo } from '../_core/blitz/getClanAccountInfo'; +import getTankStats from '../_core/blitz/getTankStats'; +import getTreeType from '../_core/blitz/getTreeType'; import calculateWN8 from '../_core/statistics/calculateWN8'; import * as Breakdown from '../components/Breakdown'; import NoData, { NoDataType } from '../components/NoData'; import TitleBar from '../components/TitleBar'; import Wrapper from '../components/Wrapper'; -import getTankStats from '../core/blitz/getTankStats'; -import getTreeType from '../core/blitz/getTreeType'; import getWN8Percentile from '../core/blitz/getWN8Percentile'; import resolveTankName from '../core/blitz/resolveTankName'; import sumStats from '../core/blitz/sumStats'; From b827f7f730b527a61d814dc43051348a7e636a98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sat, 14 Oct 2023 11:06:03 -0500 Subject: [PATCH 22/43] feat: swap core and _core --- .../blitz/getWN8Percentile.ts | 0 src/{core => LEGACY_core}/blitz/listClans.ts | 2 +- .../blitz/listPlayers.ts | 2 +- .../blitz/numberToRomanNumeral.ts | 0 .../blitz/regionToRegionSubdomain.ts | 0 .../blitz/resolveTankId.ts | 0 .../blitz/resolveTankName.ts | 0 src/{core => LEGACY_core}/blitz/sumStats.ts | 2 +- src/{core => LEGACY_core}/blitz/tankopedia.ts | 2 +- .../blitzkrieg/addStatPropertyOptions.ts | 0 .../blitzkrieg/context.ts | 0 .../blitzkrieg/filtersToDescription.ts | 2 +- .../blitzkrieg/getTierWeights.ts | 2 +- .../blitzstars/getBlitzStarsLinkButton.ts | 2 +- .../blitzstars/getDiffedTankStats.ts | 2 +- .../blitzstars/getPeriodNow.ts | 0 .../blitzstars/getPeriodStart.ts | 0 .../blitzstars/getPlayerHistories.ts | 4 +- .../blitzstars/getTankHistories.ts | 2 +- .../blitzstars/getTimeDaysAgo.ts | 0 .../blitzstars/tankAverages.ts | 2 +- .../cockroackdb/discordBlitz.ts | 0 .../database/getMidnightLeaderboard.ts | 0 .../discord/addClanChoices.ts | 0 .../discord/addPeriodSubCommands.ts | 0 .../discord/addRegionChoices.ts | 0 .../discord/addStatTypeSubCommands.ts | 0 .../discord/addTankChoices.ts | 0 .../discord/addTierChoices.ts | 0 .../discord/addUsernameChoices.ts | 0 .../discord/autocompleteClan.ts | 0 .../discord/autocompleteStatProperty.ts | 0 .../discord/autocompleteTanks.ts | 0 .../discord/autocompleteUsername.ts | 0 src/{core => LEGACY_core}/discord/client.ts | 0 .../discord/embedInfo.ts | 0 .../discord/embedNegative.ts | 0 .../discord/embedPositive.ts | 0 .../discord/embedWarning.ts | 0 .../discord/getCustomPeriodParams.ts | 0 .../discord/getFiltersFromButton.ts | 2 +- .../discord/getFiltersFromCommand.ts | 2 +- .../discord/interactionToURL.ts | 0 .../discord/linkButton.ts | 0 .../discord/markdownTable.ts | 0 .../discord/normalizeInteractionReturnable.ts | 0 .../discord/primaryButton.ts | 0 src/{core => LEGACY_core}/discord/psa.ts | 0 .../discord/refreshButton.ts | 0 .../discord/resolveClanFromCommand.ts | 0 .../discord/resolvePeriodFromButton.ts | 0 .../discord/resolvePeriodFromCommand.ts | 0 .../discord/resolvePlayerFromButton.ts | 0 .../discord/resolvePlayerFromCommand.ts | 0 src/{core => LEGACY_core}/github/octokit.ts | 0 src/{core => LEGACY_core}/node/getClientId.ts | 0 src/{core => LEGACY_core}/node/isDev.ts | 0 src/{core => LEGACY_core}/node/isNumber.ts | 0 src/{core => LEGACY_core}/node/jsxToPng.ts | 0 src/{core => LEGACY_core}/node/jsxToSvg.ts | 0 src/{core => LEGACY_core}/node/processes.ts | 0 src/{core => LEGACY_core}/node/secrets.ts | 0 src/{core => LEGACY_core}/node/svgToPng.ts | 0 src/{core => LEGACY_core}/node/throwError.ts | 0 src/app/api/tank-averages/route.ts | 2 +- src/app/api/tankopedia/route.ts | 2 +- src/app/embeds/session/page.tsx | 15 +++--- src/app/tools/session/page.tsx | 8 +-- src/bot.ts | 6 +-- src/commands/clanEvent.ts | 18 +++---- src/commands/debug.ts | 12 ++--- src/commands/eligible.ts | 28 ++++++----- src/commands/evolution.tsx | 46 ++++++++--------- src/commands/fullStats.tsx | 50 +++++++++---------- src/commands/inactive.tsx | 10 ++-- src/commands/link.tsx | 12 ++--- src/commands/ownedTanks.tsx | 30 +++++------ src/commands/playerAchievements.ts | 16 +++--- src/commands/playerInfo.ts | 12 ++--- src/commands/ratings.tsx | 30 +++++------ src/commands/searchClans.ts | 8 +-- src/commands/searchPlayers.ts | 10 ++-- src/commands/searchTanks.ts | 6 +-- src/commands/stats.tsx | 48 +++++++++--------- src/commands/today.tsx | 16 +++--- .../components/WN8Display/index.tsx | 2 +- src/components/AllStatsOverview/index.tsx | 2 +- src/components/GenericAllStats/index.tsx | 6 +-- src/components/Tanks/components/Item.tsx | 2 +- src/components/TierWeights.tsx | 2 +- src/{_core => core}/blitz/fetchWargaming.ts | 2 +- .../blitz/getAccountAchievements.ts | 0 src/{_core => core}/blitz/getAccountInfo.ts | 0 .../blitz/getClanAccountInfo.ts | 0 src/{_core => core}/blitz/getClanInfo.ts | 0 src/{_core => core}/blitz/getRatingsInfo.ts | 2 +- src/{_core => core}/blitz/getTankStats.ts | 2 +- src/{_core => core}/blitz/getTreeType.ts | 2 +- src/{_core => core}/blitz/normalizeExtra.ts | 0 src/{_core => core}/blitz/normalizeIds.ts | 0 .../blitzkrieg/emblemIdToURL.ts | 0 .../blitzkrieg/getArchivedRatingsInfo.ts | 6 +-- .../blitzstars/getPlayerStats.ts | 0 .../statistics/calculateWN8.ts | 0 .../statistics/deltaTankStats.ts | 0 src/{_core => core}/statistics/filterStats.ts | 8 +-- .../interactionCreate/handlers/button.tsx | 4 +- .../handlers/chatInputCommand.ts | 8 +-- src/events/interactionCreate/index.ts | 6 +-- src/events/ready.ts | 2 +- src/renderers/today.tsx | 28 +++++------ src/types/histories.ts | 2 +- src/types/tanksStats.ts | 2 +- 113 files changed, 254 insertions(+), 247 deletions(-) rename src/{core => LEGACY_core}/blitz/getWN8Percentile.ts (100%) rename src/{core => LEGACY_core}/blitz/listClans.ts (96%) rename src/{core => LEGACY_core}/blitz/listPlayers.ts (97%) rename src/{core => LEGACY_core}/blitz/numberToRomanNumeral.ts (100%) rename src/{core => LEGACY_core}/blitz/regionToRegionSubdomain.ts (100%) rename src/{core => LEGACY_core}/blitz/resolveTankId.ts (100%) rename src/{core => LEGACY_core}/blitz/resolveTankName.ts (100%) rename src/{core => LEGACY_core}/blitz/sumStats.ts (95%) rename src/{core => LEGACY_core}/blitz/tankopedia.ts (98%) rename src/{core => LEGACY_core}/blitzkrieg/addStatPropertyOptions.ts (100%) rename src/{core => LEGACY_core}/blitzkrieg/context.ts (100%) rename src/{core => LEGACY_core}/blitzkrieg/filtersToDescription.ts (92%) rename src/{core => LEGACY_core}/blitzkrieg/getTierWeights.ts (90%) rename src/{core => LEGACY_core}/blitzstars/getBlitzStarsLinkButton.ts (86%) rename src/{core => LEGACY_core}/blitzstars/getDiffedTankStats.ts (98%) rename src/{core => LEGACY_core}/blitzstars/getPeriodNow.ts (100%) rename src/{core => LEGACY_core}/blitzstars/getPeriodStart.ts (100%) rename src/{core => LEGACY_core}/blitzstars/getPlayerHistories.ts (92%) rename src/{core => LEGACY_core}/blitzstars/getTankHistories.ts (98%) rename src/{core => LEGACY_core}/blitzstars/getTimeDaysAgo.ts (100%) rename src/{core => LEGACY_core}/blitzstars/tankAverages.ts (97%) rename src/{core => LEGACY_core}/cockroackdb/discordBlitz.ts (100%) rename src/{core => LEGACY_core}/database/getMidnightLeaderboard.ts (100%) rename src/{core => LEGACY_core}/discord/addClanChoices.ts (100%) rename src/{core => LEGACY_core}/discord/addPeriodSubCommands.ts (100%) rename src/{core => LEGACY_core}/discord/addRegionChoices.ts (100%) rename src/{core => LEGACY_core}/discord/addStatTypeSubCommands.ts (100%) rename src/{core => LEGACY_core}/discord/addTankChoices.ts (100%) rename src/{core => LEGACY_core}/discord/addTierChoices.ts (100%) rename src/{core => LEGACY_core}/discord/addUsernameChoices.ts (100%) rename src/{core => LEGACY_core}/discord/autocompleteClan.ts (100%) rename src/{core => LEGACY_core}/discord/autocompleteStatProperty.ts (100%) rename src/{core => LEGACY_core}/discord/autocompleteTanks.ts (100%) rename src/{core => LEGACY_core}/discord/autocompleteUsername.ts (100%) rename src/{core => LEGACY_core}/discord/client.ts (100%) rename src/{core => LEGACY_core}/discord/embedInfo.ts (100%) rename src/{core => LEGACY_core}/discord/embedNegative.ts (100%) rename src/{core => LEGACY_core}/discord/embedPositive.ts (100%) rename src/{core => LEGACY_core}/discord/embedWarning.ts (100%) rename src/{core => LEGACY_core}/discord/getCustomPeriodParams.ts (100%) rename src/{core => LEGACY_core}/discord/getFiltersFromButton.ts (90%) rename src/{core => LEGACY_core}/discord/getFiltersFromCommand.ts (90%) rename src/{core => LEGACY_core}/discord/interactionToURL.ts (100%) rename src/{core => LEGACY_core}/discord/linkButton.ts (100%) rename src/{core => LEGACY_core}/discord/markdownTable.ts (100%) rename src/{core => LEGACY_core}/discord/normalizeInteractionReturnable.ts (100%) rename src/{core => LEGACY_core}/discord/primaryButton.ts (100%) rename src/{core => LEGACY_core}/discord/psa.ts (100%) rename src/{core => LEGACY_core}/discord/refreshButton.ts (100%) rename src/{core => LEGACY_core}/discord/resolveClanFromCommand.ts (100%) rename src/{core => LEGACY_core}/discord/resolvePeriodFromButton.ts (100%) rename src/{core => LEGACY_core}/discord/resolvePeriodFromCommand.ts (100%) rename src/{core => LEGACY_core}/discord/resolvePlayerFromButton.ts (100%) rename src/{core => LEGACY_core}/discord/resolvePlayerFromCommand.ts (100%) rename src/{core => LEGACY_core}/github/octokit.ts (100%) rename src/{core => LEGACY_core}/node/getClientId.ts (100%) rename src/{core => LEGACY_core}/node/isDev.ts (100%) rename src/{core => LEGACY_core}/node/isNumber.ts (100%) rename src/{core => LEGACY_core}/node/jsxToPng.ts (100%) rename src/{core => LEGACY_core}/node/jsxToSvg.ts (100%) rename src/{core => LEGACY_core}/node/processes.ts (100%) rename src/{core => LEGACY_core}/node/secrets.ts (100%) rename src/{core => LEGACY_core}/node/svgToPng.ts (100%) rename src/{core => LEGACY_core}/node/throwError.ts (100%) rename src/{_core => core}/blitz/fetchWargaming.ts (90%) rename src/{_core => core}/blitz/getAccountAchievements.ts (100%) rename src/{_core => core}/blitz/getAccountInfo.ts (100%) rename src/{_core => core}/blitz/getClanAccountInfo.ts (100%) rename src/{_core => core}/blitz/getClanInfo.ts (100%) rename src/{_core => core}/blitz/getRatingsInfo.ts (81%) rename src/{_core => core}/blitz/getTankStats.ts (92%) rename src/{_core => core}/blitz/getTreeType.ts (82%) rename src/{_core => core}/blitz/normalizeExtra.ts (100%) rename src/{_core => core}/blitz/normalizeIds.ts (100%) rename src/{_core => core}/blitzkrieg/emblemIdToURL.ts (100%) rename src/{_core => core}/blitzkrieg/getArchivedRatingsInfo.ts (82%) rename src/{_core => core}/blitzstars/getPlayerStats.ts (100%) rename src/{_core => core}/statistics/calculateWN8.ts (100%) rename src/{_core => core}/statistics/deltaTankStats.ts (100%) rename src/{_core => core}/statistics/filterStats.ts (89%) diff --git a/src/core/blitz/getWN8Percentile.ts b/src/LEGACY_core/blitz/getWN8Percentile.ts similarity index 100% rename from src/core/blitz/getWN8Percentile.ts rename to src/LEGACY_core/blitz/getWN8Percentile.ts diff --git a/src/core/blitz/listClans.ts b/src/LEGACY_core/blitz/listClans.ts similarity index 96% rename from src/core/blitz/listClans.ts rename to src/LEGACY_core/blitz/listClans.ts index e047aed81..3625c12a4 100644 --- a/src/core/blitz/listClans.ts +++ b/src/LEGACY_core/blitz/listClans.ts @@ -1,6 +1,6 @@ -import fetchBlitz from '../../_core/blitz/fetchWargaming'; import { Region } from '../../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; +import fetchBlitz from '../../core/blitz/fetchWargaming'; import { Clan, ClanList } from '../../types/clanList'; export type ClanListWithRegion = (Clan & { diff --git a/src/core/blitz/listPlayers.ts b/src/LEGACY_core/blitz/listPlayers.ts similarity index 97% rename from src/core/blitz/listPlayers.ts rename to src/LEGACY_core/blitz/listPlayers.ts index 0a4242b04..c0ca7b393 100644 --- a/src/core/blitz/listPlayers.ts +++ b/src/LEGACY_core/blitz/listPlayers.ts @@ -1,6 +1,6 @@ -import fetchBlitz from '../../_core/blitz/fetchWargaming'; import { Region } from '../../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; +import fetchBlitz from '../../core/blitz/fetchWargaming'; interface Account { nickname: string; diff --git a/src/core/blitz/numberToRomanNumeral.ts b/src/LEGACY_core/blitz/numberToRomanNumeral.ts similarity index 100% rename from src/core/blitz/numberToRomanNumeral.ts rename to src/LEGACY_core/blitz/numberToRomanNumeral.ts diff --git a/src/core/blitz/regionToRegionSubdomain.ts b/src/LEGACY_core/blitz/regionToRegionSubdomain.ts similarity index 100% rename from src/core/blitz/regionToRegionSubdomain.ts rename to src/LEGACY_core/blitz/regionToRegionSubdomain.ts diff --git a/src/core/blitz/resolveTankId.ts b/src/LEGACY_core/blitz/resolveTankId.ts similarity index 100% rename from src/core/blitz/resolveTankId.ts rename to src/LEGACY_core/blitz/resolveTankId.ts diff --git a/src/core/blitz/resolveTankName.ts b/src/LEGACY_core/blitz/resolveTankName.ts similarity index 100% rename from src/core/blitz/resolveTankName.ts rename to src/LEGACY_core/blitz/resolveTankName.ts diff --git a/src/core/blitz/sumStats.ts b/src/LEGACY_core/blitz/sumStats.ts similarity index 95% rename from src/core/blitz/sumStats.ts rename to src/LEGACY_core/blitz/sumStats.ts index 63a002b37..e2de6e3ab 100644 --- a/src/core/blitz/sumStats.ts +++ b/src/LEGACY_core/blitz/sumStats.ts @@ -1,4 +1,4 @@ -import { AllStats } from '../../_core/blitz/getAccountInfo'; +import { AllStats } from '../../core/blitz/getAccountInfo'; import { emptyAllStats } from '../blitzstars/getDiffedTankStats'; export default function sumStats(allStatsCollection: AllStats[]) { diff --git a/src/core/blitz/tankopedia.ts b/src/LEGACY_core/blitz/tankopedia.ts similarity index 98% rename from src/core/blitz/tankopedia.ts rename to src/LEGACY_core/blitz/tankopedia.ts index a525d86bd..16e33672f 100644 --- a/src/core/blitz/tankopedia.ts +++ b/src/LEGACY_core/blitz/tankopedia.ts @@ -1,7 +1,7 @@ import { deburr } from 'lodash'; -import fetchBlitz from '../../_core/blitz/fetchWargaming'; import { TreeTypeString } from '../../components/Tanks'; import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; +import fetchBlitz from '../../core/blitz/fetchWargaming'; import { context } from '../blitzkrieg/context'; export interface TankopediaEntry { diff --git a/src/core/blitzkrieg/addStatPropertyOptions.ts b/src/LEGACY_core/blitzkrieg/addStatPropertyOptions.ts similarity index 100% rename from src/core/blitzkrieg/addStatPropertyOptions.ts rename to src/LEGACY_core/blitzkrieg/addStatPropertyOptions.ts diff --git a/src/core/blitzkrieg/context.ts b/src/LEGACY_core/blitzkrieg/context.ts similarity index 100% rename from src/core/blitzkrieg/context.ts rename to src/LEGACY_core/blitzkrieg/context.ts diff --git a/src/core/blitzkrieg/filtersToDescription.ts b/src/LEGACY_core/blitzkrieg/filtersToDescription.ts similarity index 92% rename from src/core/blitzkrieg/filtersToDescription.ts rename to src/LEGACY_core/blitzkrieg/filtersToDescription.ts index 08bb64349..ef49cdf62 100644 --- a/src/core/blitzkrieg/filtersToDescription.ts +++ b/src/LEGACY_core/blitzkrieg/filtersToDescription.ts @@ -1,5 +1,5 @@ -import { StatFilters } from '../../_core/statistics/filterStats'; import { TREE_TYPE_NAMES } from '../../components/Tanks'; +import { StatFilters } from '../../core/statistics/filterStats'; import resolveTankName from '../blitz/resolveTankName'; import { TIER_ROMAN_NUMERALS, Tier, tankopediaInfo } from '../blitz/tankopedia'; diff --git a/src/core/blitzkrieg/getTierWeights.ts b/src/LEGACY_core/blitzkrieg/getTierWeights.ts similarity index 90% rename from src/core/blitzkrieg/getTierWeights.ts rename to src/LEGACY_core/blitzkrieg/getTierWeights.ts index cf4a079ea..7f88ab7a1 100644 --- a/src/core/blitzkrieg/getTierWeights.ts +++ b/src/LEGACY_core/blitzkrieg/getTierWeights.ts @@ -1,5 +1,5 @@ -import { AllStats } from '../../_core/blitz/getAccountInfo'; import { TierWeightsRecord } from '../../components/TierWeights'; +import { AllStats } from '../../core/blitz/getAccountInfo'; import { tankopedia } from '../blitz/tankopedia'; export async function getTierWeights( diff --git a/src/core/blitzstars/getBlitzStarsLinkButton.ts b/src/LEGACY_core/blitzstars/getBlitzStarsLinkButton.ts similarity index 86% rename from src/core/blitzstars/getBlitzStarsLinkButton.ts rename to src/LEGACY_core/blitzstars/getBlitzStarsLinkButton.ts index 78e0388f8..c603dd8a1 100644 --- a/src/core/blitzstars/getBlitzStarsLinkButton.ts +++ b/src/LEGACY_core/blitzstars/getBlitzStarsLinkButton.ts @@ -1,5 +1,5 @@ -import { getAccountInfo } from '../../_core/blitz/getAccountInfo'; import { Region } from '../../constants/regions'; +import { getAccountInfo } from '../../core/blitz/getAccountInfo'; import linkButton from '../discord/linkButton'; export async function getBlitzStarsLinkButton( diff --git a/src/core/blitzstars/getDiffedTankStats.ts b/src/LEGACY_core/blitzstars/getDiffedTankStats.ts similarity index 98% rename from src/core/blitzstars/getDiffedTankStats.ts rename to src/LEGACY_core/blitzstars/getDiffedTankStats.ts index dc571d972..68027d79b 100644 --- a/src/core/blitzstars/getDiffedTankStats.ts +++ b/src/LEGACY_core/blitzstars/getDiffedTankStats.ts @@ -1,5 +1,5 @@ -import { AllStats } from '../../_core/blitz/getAccountInfo'; import { Region } from '../../constants/regions'; +import { AllStats } from '../../core/blitz/getAccountInfo'; import getTankHistories, { TankHistories, TankHistoryRaw, diff --git a/src/core/blitzstars/getPeriodNow.ts b/src/LEGACY_core/blitzstars/getPeriodNow.ts similarity index 100% rename from src/core/blitzstars/getPeriodNow.ts rename to src/LEGACY_core/blitzstars/getPeriodNow.ts diff --git a/src/core/blitzstars/getPeriodStart.ts b/src/LEGACY_core/blitzstars/getPeriodStart.ts similarity index 100% rename from src/core/blitzstars/getPeriodStart.ts rename to src/LEGACY_core/blitzstars/getPeriodStart.ts diff --git a/src/core/blitzstars/getPlayerHistories.ts b/src/LEGACY_core/blitzstars/getPlayerHistories.ts similarity index 92% rename from src/core/blitzstars/getPlayerHistories.ts rename to src/LEGACY_core/blitzstars/getPlayerHistories.ts index c546c3907..c17d22f8e 100644 --- a/src/core/blitzstars/getPlayerHistories.ts +++ b/src/LEGACY_core/blitzstars/getPlayerHistories.ts @@ -1,6 +1,6 @@ -import { getAccountInfo } from '../../_core/blitz/getAccountInfo'; -import { PlayerStats } from '../../_core/blitzstars/getPlayerStats'; import { Region } from '../../constants/regions'; +import { getAccountInfo } from '../../core/blitz/getAccountInfo'; +import { PlayerStats } from '../../core/blitzstars/getPlayerStats'; import { GetHistoriesOptions, Histories, diff --git a/src/core/blitzstars/getTankHistories.ts b/src/LEGACY_core/blitzstars/getTankHistories.ts similarity index 98% rename from src/core/blitzstars/getTankHistories.ts rename to src/LEGACY_core/blitzstars/getTankHistories.ts index b37a6b508..2a210b0ae 100644 --- a/src/core/blitzstars/getTankHistories.ts +++ b/src/LEGACY_core/blitzstars/getTankHistories.ts @@ -1,5 +1,5 @@ -import getTankStats from '../../_core/blitz/getTankStats'; import { Region } from '../../constants/regions'; +import getTankStats from '../../core/blitz/getTankStats'; import { GetHistoriesOptions, Histories, diff --git a/src/core/blitzstars/getTimeDaysAgo.ts b/src/LEGACY_core/blitzstars/getTimeDaysAgo.ts similarity index 100% rename from src/core/blitzstars/getTimeDaysAgo.ts rename to src/LEGACY_core/blitzstars/getTimeDaysAgo.ts diff --git a/src/core/blitzstars/tankAverages.ts b/src/LEGACY_core/blitzstars/tankAverages.ts similarity index 97% rename from src/core/blitzstars/tankAverages.ts rename to src/LEGACY_core/blitzstars/tankAverages.ts index 23d5599ee..cd86c1236 100644 --- a/src/core/blitzstars/tankAverages.ts +++ b/src/LEGACY_core/blitzstars/tankAverages.ts @@ -1,4 +1,4 @@ -import { AllStats } from '../../_core/blitz/getAccountInfo'; +import { AllStats } from '../../core/blitz/getAccountInfo'; import { context } from '../blitzkrieg/context'; export interface SpecialStats { diff --git a/src/core/cockroackdb/discordBlitz.ts b/src/LEGACY_core/cockroackdb/discordBlitz.ts similarity index 100% rename from src/core/cockroackdb/discordBlitz.ts rename to src/LEGACY_core/cockroackdb/discordBlitz.ts diff --git a/src/core/database/getMidnightLeaderboard.ts b/src/LEGACY_core/database/getMidnightLeaderboard.ts similarity index 100% rename from src/core/database/getMidnightLeaderboard.ts rename to src/LEGACY_core/database/getMidnightLeaderboard.ts diff --git a/src/core/discord/addClanChoices.ts b/src/LEGACY_core/discord/addClanChoices.ts similarity index 100% rename from src/core/discord/addClanChoices.ts rename to src/LEGACY_core/discord/addClanChoices.ts diff --git a/src/core/discord/addPeriodSubCommands.ts b/src/LEGACY_core/discord/addPeriodSubCommands.ts similarity index 100% rename from src/core/discord/addPeriodSubCommands.ts rename to src/LEGACY_core/discord/addPeriodSubCommands.ts diff --git a/src/core/discord/addRegionChoices.ts b/src/LEGACY_core/discord/addRegionChoices.ts similarity index 100% rename from src/core/discord/addRegionChoices.ts rename to src/LEGACY_core/discord/addRegionChoices.ts diff --git a/src/core/discord/addStatTypeSubCommands.ts b/src/LEGACY_core/discord/addStatTypeSubCommands.ts similarity index 100% rename from src/core/discord/addStatTypeSubCommands.ts rename to src/LEGACY_core/discord/addStatTypeSubCommands.ts diff --git a/src/core/discord/addTankChoices.ts b/src/LEGACY_core/discord/addTankChoices.ts similarity index 100% rename from src/core/discord/addTankChoices.ts rename to src/LEGACY_core/discord/addTankChoices.ts diff --git a/src/core/discord/addTierChoices.ts b/src/LEGACY_core/discord/addTierChoices.ts similarity index 100% rename from src/core/discord/addTierChoices.ts rename to src/LEGACY_core/discord/addTierChoices.ts diff --git a/src/core/discord/addUsernameChoices.ts b/src/LEGACY_core/discord/addUsernameChoices.ts similarity index 100% rename from src/core/discord/addUsernameChoices.ts rename to src/LEGACY_core/discord/addUsernameChoices.ts diff --git a/src/core/discord/autocompleteClan.ts b/src/LEGACY_core/discord/autocompleteClan.ts similarity index 100% rename from src/core/discord/autocompleteClan.ts rename to src/LEGACY_core/discord/autocompleteClan.ts diff --git a/src/core/discord/autocompleteStatProperty.ts b/src/LEGACY_core/discord/autocompleteStatProperty.ts similarity index 100% rename from src/core/discord/autocompleteStatProperty.ts rename to src/LEGACY_core/discord/autocompleteStatProperty.ts diff --git a/src/core/discord/autocompleteTanks.ts b/src/LEGACY_core/discord/autocompleteTanks.ts similarity index 100% rename from src/core/discord/autocompleteTanks.ts rename to src/LEGACY_core/discord/autocompleteTanks.ts diff --git a/src/core/discord/autocompleteUsername.ts b/src/LEGACY_core/discord/autocompleteUsername.ts similarity index 100% rename from src/core/discord/autocompleteUsername.ts rename to src/LEGACY_core/discord/autocompleteUsername.ts diff --git a/src/core/discord/client.ts b/src/LEGACY_core/discord/client.ts similarity index 100% rename from src/core/discord/client.ts rename to src/LEGACY_core/discord/client.ts diff --git a/src/core/discord/embedInfo.ts b/src/LEGACY_core/discord/embedInfo.ts similarity index 100% rename from src/core/discord/embedInfo.ts rename to src/LEGACY_core/discord/embedInfo.ts diff --git a/src/core/discord/embedNegative.ts b/src/LEGACY_core/discord/embedNegative.ts similarity index 100% rename from src/core/discord/embedNegative.ts rename to src/LEGACY_core/discord/embedNegative.ts diff --git a/src/core/discord/embedPositive.ts b/src/LEGACY_core/discord/embedPositive.ts similarity index 100% rename from src/core/discord/embedPositive.ts rename to src/LEGACY_core/discord/embedPositive.ts diff --git a/src/core/discord/embedWarning.ts b/src/LEGACY_core/discord/embedWarning.ts similarity index 100% rename from src/core/discord/embedWarning.ts rename to src/LEGACY_core/discord/embedWarning.ts diff --git a/src/core/discord/getCustomPeriodParams.ts b/src/LEGACY_core/discord/getCustomPeriodParams.ts similarity index 100% rename from src/core/discord/getCustomPeriodParams.ts rename to src/LEGACY_core/discord/getCustomPeriodParams.ts diff --git a/src/core/discord/getFiltersFromButton.ts b/src/LEGACY_core/discord/getFiltersFromButton.ts similarity index 90% rename from src/core/discord/getFiltersFromButton.ts rename to src/LEGACY_core/discord/getFiltersFromButton.ts index 7bef99461..d8b07b1d2 100644 --- a/src/core/discord/getFiltersFromButton.ts +++ b/src/LEGACY_core/discord/getFiltersFromButton.ts @@ -1,6 +1,6 @@ import { ButtonInteraction } from 'discord.js'; -import { StatFilters } from '../../_core/statistics/filterStats'; import { TreeTypeString } from '../../components/Tanks'; +import { StatFilters } from '../../core/statistics/filterStats'; export function getFiltersFromButton(interaction: ButtonInteraction) { const url = new URL(`https://example.com/${interaction.customId}`); diff --git a/src/core/discord/getFiltersFromCommand.ts b/src/LEGACY_core/discord/getFiltersFromCommand.ts similarity index 90% rename from src/core/discord/getFiltersFromCommand.ts rename to src/LEGACY_core/discord/getFiltersFromCommand.ts index d5ebb0baa..5a01d9084 100644 --- a/src/core/discord/getFiltersFromCommand.ts +++ b/src/LEGACY_core/discord/getFiltersFromCommand.ts @@ -1,6 +1,6 @@ import { ChatInputCommandInteraction } from 'discord.js'; -import { StatFilters } from '../../_core/statistics/filterStats'; import { TreeTypeString } from '../../components/Tanks'; +import { StatFilters } from '../../core/statistics/filterStats'; export function getFiltersFromCommand( interaction: ChatInputCommandInteraction, diff --git a/src/core/discord/interactionToURL.ts b/src/LEGACY_core/discord/interactionToURL.ts similarity index 100% rename from src/core/discord/interactionToURL.ts rename to src/LEGACY_core/discord/interactionToURL.ts diff --git a/src/core/discord/linkButton.ts b/src/LEGACY_core/discord/linkButton.ts similarity index 100% rename from src/core/discord/linkButton.ts rename to src/LEGACY_core/discord/linkButton.ts diff --git a/src/core/discord/markdownTable.ts b/src/LEGACY_core/discord/markdownTable.ts similarity index 100% rename from src/core/discord/markdownTable.ts rename to src/LEGACY_core/discord/markdownTable.ts diff --git a/src/core/discord/normalizeInteractionReturnable.ts b/src/LEGACY_core/discord/normalizeInteractionReturnable.ts similarity index 100% rename from src/core/discord/normalizeInteractionReturnable.ts rename to src/LEGACY_core/discord/normalizeInteractionReturnable.ts diff --git a/src/core/discord/primaryButton.ts b/src/LEGACY_core/discord/primaryButton.ts similarity index 100% rename from src/core/discord/primaryButton.ts rename to src/LEGACY_core/discord/primaryButton.ts diff --git a/src/core/discord/psa.ts b/src/LEGACY_core/discord/psa.ts similarity index 100% rename from src/core/discord/psa.ts rename to src/LEGACY_core/discord/psa.ts diff --git a/src/core/discord/refreshButton.ts b/src/LEGACY_core/discord/refreshButton.ts similarity index 100% rename from src/core/discord/refreshButton.ts rename to src/LEGACY_core/discord/refreshButton.ts diff --git a/src/core/discord/resolveClanFromCommand.ts b/src/LEGACY_core/discord/resolveClanFromCommand.ts similarity index 100% rename from src/core/discord/resolveClanFromCommand.ts rename to src/LEGACY_core/discord/resolveClanFromCommand.ts diff --git a/src/core/discord/resolvePeriodFromButton.ts b/src/LEGACY_core/discord/resolvePeriodFromButton.ts similarity index 100% rename from src/core/discord/resolvePeriodFromButton.ts rename to src/LEGACY_core/discord/resolvePeriodFromButton.ts diff --git a/src/core/discord/resolvePeriodFromCommand.ts b/src/LEGACY_core/discord/resolvePeriodFromCommand.ts similarity index 100% rename from src/core/discord/resolvePeriodFromCommand.ts rename to src/LEGACY_core/discord/resolvePeriodFromCommand.ts diff --git a/src/core/discord/resolvePlayerFromButton.ts b/src/LEGACY_core/discord/resolvePlayerFromButton.ts similarity index 100% rename from src/core/discord/resolvePlayerFromButton.ts rename to src/LEGACY_core/discord/resolvePlayerFromButton.ts diff --git a/src/core/discord/resolvePlayerFromCommand.ts b/src/LEGACY_core/discord/resolvePlayerFromCommand.ts similarity index 100% rename from src/core/discord/resolvePlayerFromCommand.ts rename to src/LEGACY_core/discord/resolvePlayerFromCommand.ts diff --git a/src/core/github/octokit.ts b/src/LEGACY_core/github/octokit.ts similarity index 100% rename from src/core/github/octokit.ts rename to src/LEGACY_core/github/octokit.ts diff --git a/src/core/node/getClientId.ts b/src/LEGACY_core/node/getClientId.ts similarity index 100% rename from src/core/node/getClientId.ts rename to src/LEGACY_core/node/getClientId.ts diff --git a/src/core/node/isDev.ts b/src/LEGACY_core/node/isDev.ts similarity index 100% rename from src/core/node/isDev.ts rename to src/LEGACY_core/node/isDev.ts diff --git a/src/core/node/isNumber.ts b/src/LEGACY_core/node/isNumber.ts similarity index 100% rename from src/core/node/isNumber.ts rename to src/LEGACY_core/node/isNumber.ts diff --git a/src/core/node/jsxToPng.ts b/src/LEGACY_core/node/jsxToPng.ts similarity index 100% rename from src/core/node/jsxToPng.ts rename to src/LEGACY_core/node/jsxToPng.ts diff --git a/src/core/node/jsxToSvg.ts b/src/LEGACY_core/node/jsxToSvg.ts similarity index 100% rename from src/core/node/jsxToSvg.ts rename to src/LEGACY_core/node/jsxToSvg.ts diff --git a/src/core/node/processes.ts b/src/LEGACY_core/node/processes.ts similarity index 100% rename from src/core/node/processes.ts rename to src/LEGACY_core/node/processes.ts diff --git a/src/core/node/secrets.ts b/src/LEGACY_core/node/secrets.ts similarity index 100% rename from src/core/node/secrets.ts rename to src/LEGACY_core/node/secrets.ts diff --git a/src/core/node/svgToPng.ts b/src/LEGACY_core/node/svgToPng.ts similarity index 100% rename from src/core/node/svgToPng.ts rename to src/LEGACY_core/node/svgToPng.ts diff --git a/src/core/node/throwError.ts b/src/LEGACY_core/node/throwError.ts similarity index 100% rename from src/core/node/throwError.ts rename to src/LEGACY_core/node/throwError.ts diff --git a/src/app/api/tank-averages/route.ts b/src/app/api/tank-averages/route.ts index 7f5ab96bf..caf1f5d34 100644 --- a/src/app/api/tank-averages/route.ts +++ b/src/app/api/tank-averages/route.ts @@ -1,5 +1,5 @@ import { NextResponse } from 'next/server'; -import { tankAverages } from '../../../core/blitzstars/tankAverages'; +import { tankAverages } from '../../../LEGACY_core/blitzstars/tankAverages'; export async function GET() { return NextResponse.json(await tankAverages); diff --git a/src/app/api/tankopedia/route.ts b/src/app/api/tankopedia/route.ts index 665728654..5000b80d4 100644 --- a/src/app/api/tankopedia/route.ts +++ b/src/app/api/tankopedia/route.ts @@ -1,5 +1,5 @@ import { NextResponse } from 'next/server'; -import { tankopedia } from '../../../core/blitz/tankopedia'; +import { tankopedia } from '../../../LEGACY_core/blitz/tankopedia'; export async function GET() { return NextResponse.json(await tankopedia); diff --git a/src/app/embeds/session/page.tsx b/src/app/embeds/session/page.tsx index 95984a340..850e818ef 100644 --- a/src/app/embeds/session/page.tsx +++ b/src/app/embeds/session/page.tsx @@ -2,15 +2,18 @@ import { ContextMenu } from '@radix-ui/themes'; import { useEffect, useState } from 'react'; -import fetchBlitz from '../../../_core/blitz/fetchWargaming'; -import calculateWN8 from '../../../_core/statistics/calculateWN8'; -import { deltaTankStats } from '../../../_core/statistics/deltaTankStats'; +import getWN8Percentile from '../../../LEGACY_core/blitz/getWN8Percentile'; +import { + TankopediaEntry, + tankopedia, +} from '../../../LEGACY_core/blitz/tankopedia'; +import { tankAverages } from '../../../LEGACY_core/blitzstars/tankAverages'; import * as Breakdown from '../../../components/Breakdown'; import { TreeTypeEnum } from '../../../components/Tanks'; import { WARGAMING_APPLICATION_ID } from '../../../constants/wargamingApplicationID'; -import getWN8Percentile from '../../../core/blitz/getWN8Percentile'; -import { TankopediaEntry, tankopedia } from '../../../core/blitz/tankopedia'; -import { tankAverages } from '../../../core/blitzstars/tankAverages'; +import fetchBlitz from '../../../core/blitz/fetchWargaming'; +import calculateWN8 from '../../../core/statistics/calculateWN8'; +import { deltaTankStats } from '../../../core/statistics/deltaTankStats'; import { useSession } from '../../../stores/session'; import { IndividualTankStats, TanksStats } from '../../../types/tanksStats'; import { CustomColumnDisplay } from '../../tools/session/components/CustomColumn'; diff --git a/src/app/tools/session/page.tsx b/src/app/tools/session/page.tsx index a946386a7..500424052 100644 --- a/src/app/tools/session/page.tsx +++ b/src/app/tools/session/page.tsx @@ -18,13 +18,13 @@ import { } from '@radix-ui/themes'; import { debounce } from 'lodash'; import { ChangeEvent, useRef, useState } from 'react'; -import fetchBlitz from '../../../_core/blitz/fetchWargaming'; +import listPlayers, { + AccountListWithServer, +} from '../../../LEGACY_core/blitz/listPlayers'; import PageWrapper from '../../../components/PageWrapper'; import { REGION_NAMES, Region } from '../../../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../../../constants/wargamingApplicationID'; -import listPlayers, { - AccountListWithServer, -} from '../../../core/blitz/listPlayers'; +import fetchBlitz from '../../../core/blitz/fetchWargaming'; import { useSession } from '../../../stores/session'; import { NormalizedTankStats, TanksStats } from '../../../types/tanksStats'; import SessionPage from '../../embeds/session/page'; diff --git a/src/bot.ts b/src/bot.ts index 4506ce218..5daff8a42 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -1,6 +1,6 @@ -import { client } from './core/discord/client'; -import { registerProcesses } from './core/node/processes'; -import { secrets } from './core/node/secrets'; +import { client } from './LEGACY_core/discord/client'; +import { registerProcesses } from './LEGACY_core/node/processes'; +import { secrets } from './LEGACY_core/node/secrets'; registerProcesses(); client.login(secrets.DISCORD_TOKEN); diff --git a/src/commands/clanEvent.ts b/src/commands/clanEvent.ts index f51a9a7f2..6be992a47 100644 --- a/src/commands/clanEvent.ts +++ b/src/commands/clanEvent.ts @@ -7,15 +7,15 @@ // import { SlashCommandBuilder, escapeMarkdown } from 'discord.js'; // import markdownEscape from 'markdown-escape'; -// import { getAccountAchievements } from '../_core/blitz/getAccountAchievements'; -// import { getAccountInfo } from '../_core/blitz/getAccountInfo'; -// import { getClanInfo } from '../_core/blitz/getClanInfo'; -// import { PlayerHistoriesRaw } from '../core/blitzstars/getPlayerHistories'; -// import getTimeDaysAgo from '../core/blitzstars/getTimeDaysAgo'; -// import addClanChoices from '../core/discord/addClanChoices'; -// import autocompleteClan from '../core/discord/autocompleteClan'; -// import embedWarning from '../core/discord/embedWarning'; -// import resolveClanFromCommand from '../core/discord/resolveClanFromCommand'; +// import { getAccountAchievements } from '../core/blitz/getAccountAchievements'; +// import { getAccountInfo } from '../core/blitz/getAccountInfo'; +// import { getClanInfo } from '../core/blitz/getClanInfo'; +// import { PlayerHistoriesRaw } from '../LEGACY_core/blitzstars/getPlayerHistories'; +// import getTimeDaysAgo from '../LEGACY_core/blitzstars/getTimeDaysAgo'; +// import addClanChoices from '../LEGACY_core/discord/addClanChoices'; +// import autocompleteClan from '../LEGACY_core/discord/autocompleteClan'; +// import embedWarning from '../LEGACY_core/discord/embedWarning'; +// import resolveClanFromCommand from '../LEGACY_core/discord/resolveClanFromCommand'; // import { CommandRegistry } from '../events/interactionCreate'; // export const clanEventCommand: CommandRegistry = { diff --git a/src/commands/debug.ts b/src/commands/debug.ts index e3afbe119..37a49094b 100644 --- a/src/commands/debug.ts +++ b/src/commands/debug.ts @@ -1,11 +1,11 @@ import { SlashCommandBuilder } from 'discord.js'; import packageJSON from '../../package.json' assert { type: 'json' }; -import { tankopedia } from '../core/blitz/tankopedia'; -import { tankAverages } from '../core/blitzstars/tankAverages'; -import { client } from '../core/discord/client'; -import embedInfo from '../core/discord/embedInfo'; -import markdownTable from '../core/discord/markdownTable'; -import getClientId from '../core/node/getClientId'; +import { tankopedia } from '../LEGACY_core/blitz/tankopedia'; +import { tankAverages } from '../LEGACY_core/blitzstars/tankAverages'; +import { client } from '../LEGACY_core/discord/client'; +import embedInfo from '../LEGACY_core/discord/embedInfo'; +import markdownTable from '../LEGACY_core/discord/markdownTable'; +import getClientId from '../LEGACY_core/node/getClientId'; import { CommandRegistry } from '../events/interactionCreate'; const executionStart = new Date().getTime(); diff --git a/src/commands/eligible.ts b/src/commands/eligible.ts index 71f424e6c..201101888 100644 --- a/src/commands/eligible.ts +++ b/src/commands/eligible.ts @@ -1,17 +1,19 @@ import { SlashCommandBuilder } from 'discord.js'; -import { getAccountInfo } from '../_core/blitz/getAccountInfo'; -import calculateWN8 from '../_core/statistics/calculateWN8'; -import sumStats from '../core/blitz/sumStats'; -import { tankopedia } from '../core/blitz/tankopedia'; -import getDiffedTankStats from '../core/blitzstars/getDiffedTankStats'; -import getPeriodNow from '../core/blitzstars/getPeriodNow'; -import getTimeDaysAgo from '../core/blitzstars/getTimeDaysAgo'; -import { tankAverages } from '../core/blitzstars/tankAverages'; -import addUsernameChoices from '../core/discord/addUsernameChoices'; -import embedNegative from '../core/discord/embedNegative'; -import embedPositive from '../core/discord/embedPositive'; -import markdownTable, { TableInput } from '../core/discord/markdownTable'; -import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand'; +import sumStats from '../LEGACY_core/blitz/sumStats'; +import { tankopedia } from '../LEGACY_core/blitz/tankopedia'; +import getDiffedTankStats from '../LEGACY_core/blitzstars/getDiffedTankStats'; +import getPeriodNow from '../LEGACY_core/blitzstars/getPeriodNow'; +import getTimeDaysAgo from '../LEGACY_core/blitzstars/getTimeDaysAgo'; +import { tankAverages } from '../LEGACY_core/blitzstars/tankAverages'; +import addUsernameChoices from '../LEGACY_core/discord/addUsernameChoices'; +import embedNegative from '../LEGACY_core/discord/embedNegative'; +import embedPositive from '../LEGACY_core/discord/embedPositive'; +import markdownTable, { + TableInput, +} from '../LEGACY_core/discord/markdownTable'; +import resolvePlayerFromCommand from '../LEGACY_core/discord/resolvePlayerFromCommand'; +import { getAccountInfo } from '../core/blitz/getAccountInfo'; +import calculateWN8 from '../core/statistics/calculateWN8'; import { CommandRegistry } from '../events/interactionCreate'; import { PossiblyPromise } from '../types/possiblyPromise'; diff --git a/src/commands/evolution.tsx b/src/commands/evolution.tsx index c389bb632..6be79726b 100644 --- a/src/commands/evolution.tsx +++ b/src/commands/evolution.tsx @@ -2,33 +2,33 @@ import { SlashCommandBuilder, SlashCommandSubcommandGroupBuilder, } from 'discord.js'; -import { getAccountInfo } from '../_core/blitz/getAccountInfo'; -import { getClanAccountInfo } from '../_core/blitz/getClanAccountInfo'; -import { emblemIdToURL } from '../_core/blitzkrieg/emblemIdToURL'; +import resolveTankId from '../LEGACY_core/blitz/resolveTankId'; +import { getBlitzStarsLinkButton } from '../LEGACY_core/blitzstars/getBlitzStarsLinkButton'; +import getPlayerHistories from '../LEGACY_core/blitzstars/getPlayerHistories'; +import getTankHistories from '../LEGACY_core/blitzstars/getTankHistories'; +import addPeriodSubCommands from '../LEGACY_core/discord/addPeriodSubCommands'; +import addTankChoices from '../LEGACY_core/discord/addTankChoices'; +import addUsernameChoices from '../LEGACY_core/discord/addUsernameChoices'; +import autocompleteTanks from '../LEGACY_core/discord/autocompleteTanks'; +import autocompleteUsername from '../LEGACY_core/discord/autocompleteUsername'; +import { getCustomPeriodParams } from '../LEGACY_core/discord/getCustomPeriodParams'; +import interactionToURL from '../LEGACY_core/discord/interactionToURL'; +import primaryButton from '../LEGACY_core/discord/primaryButton'; +import resolvePeriodFromButton from '../LEGACY_core/discord/resolvePeriodFromButton'; +import resolvePeriodFromCommand, { + ResolvedPeriod, +} from '../LEGACY_core/discord/resolvePeriodFromCommand'; +import resolvePlayerFromButton from '../LEGACY_core/discord/resolvePlayerFromButton'; +import resolvePlayerFromCommand, { + ResolvedPlayer, +} from '../LEGACY_core/discord/resolvePlayerFromCommand'; import * as Graph from '../components/Graph'; import NoData, { NoDataType } from '../components/NoData'; import TitleBar from '../components/TitleBar'; import Wrapper from '../components/Wrapper'; -import resolveTankId from '../core/blitz/resolveTankId'; -import { getBlitzStarsLinkButton } from '../core/blitzstars/getBlitzStarsLinkButton'; -import getPlayerHistories from '../core/blitzstars/getPlayerHistories'; -import getTankHistories from '../core/blitzstars/getTankHistories'; -import addPeriodSubCommands from '../core/discord/addPeriodSubCommands'; -import addTankChoices from '../core/discord/addTankChoices'; -import addUsernameChoices from '../core/discord/addUsernameChoices'; -import autocompleteTanks from '../core/discord/autocompleteTanks'; -import autocompleteUsername from '../core/discord/autocompleteUsername'; -import { getCustomPeriodParams } from '../core/discord/getCustomPeriodParams'; -import interactionToURL from '../core/discord/interactionToURL'; -import primaryButton from '../core/discord/primaryButton'; -import resolvePeriodFromButton from '../core/discord/resolvePeriodFromButton'; -import resolvePeriodFromCommand, { - ResolvedPeriod, -} from '../core/discord/resolvePeriodFromCommand'; -import resolvePlayerFromButton from '../core/discord/resolvePlayerFromButton'; -import resolvePlayerFromCommand, { - ResolvedPlayer, -} from '../core/discord/resolvePlayerFromCommand'; +import { getAccountInfo } from '../core/blitz/getAccountInfo'; +import { getClanAccountInfo } from '../core/blitz/getClanAccountInfo'; +import { emblemIdToURL } from '../core/blitzkrieg/emblemIdToURL'; import { CommandRegistryRaw } from '../events/interactionCreate'; type EvolutionStatType = 'player' | 'tank'; diff --git a/src/commands/fullStats.tsx b/src/commands/fullStats.tsx index dcefd2a01..1e46f16ea 100644 --- a/src/commands/fullStats.tsx +++ b/src/commands/fullStats.tsx @@ -1,34 +1,34 @@ import { SlashCommandBuilder } from 'discord.js'; -import { getAccountInfo } from '../_core/blitz/getAccountInfo'; -import { getClanAccountInfo } from '../_core/blitz/getClanAccountInfo'; -import { emblemIdToURL } from '../_core/blitzkrieg/emblemIdToURL'; -import { StatFilters, filterStats } from '../_core/statistics/filterStats'; +import { filtersToDescription } from '../LEGACY_core/blitzkrieg/filtersToDescription'; +import { getTierWeights } from '../LEGACY_core/blitzkrieg/getTierWeights'; +import { getBlitzStarsLinkButton } from '../LEGACY_core/blitzstars/getBlitzStarsLinkButton'; +import getDiffedTankStats from '../LEGACY_core/blitzstars/getDiffedTankStats'; +import addStatTypeSubCommands from '../LEGACY_core/discord/addStatTypeSubCommands'; +import addUsernameChoices from '../LEGACY_core/discord/addUsernameChoices'; +import autocompleteTanks from '../LEGACY_core/discord/autocompleteTanks'; +import autocompleteUsername from '../LEGACY_core/discord/autocompleteUsername'; +import { getCustomPeriodParams } from '../LEGACY_core/discord/getCustomPeriodParams'; +import { getFiltersFromButton } from '../LEGACY_core/discord/getFiltersFromButton'; +import { getFiltersFromCommand } from '../LEGACY_core/discord/getFiltersFromCommand'; +import interactionToURL from '../LEGACY_core/discord/interactionToURL'; +import { refreshButton } from '../LEGACY_core/discord/refreshButton'; +import resolvePeriodFromButton from '../LEGACY_core/discord/resolvePeriodFromButton'; +import resolvePeriodFromCommand, { + ResolvedPeriod, +} from '../LEGACY_core/discord/resolvePeriodFromCommand'; +import resolvePlayerFromButton from '../LEGACY_core/discord/resolvePlayerFromButton'; +import resolvePlayerFromCommand, { + ResolvedPlayer, +} from '../LEGACY_core/discord/resolvePlayerFromCommand'; import GenericAllStats from '../components/GenericAllStats'; import NoData, { NoDataType } from '../components/NoData'; import TierWeights from '../components/TierWeights'; import TitleBar from '../components/TitleBar'; import Wrapper from '../components/Wrapper'; -import { filtersToDescription } from '../core/blitzkrieg/filtersToDescription'; -import { getTierWeights } from '../core/blitzkrieg/getTierWeights'; -import { getBlitzStarsLinkButton } from '../core/blitzstars/getBlitzStarsLinkButton'; -import getDiffedTankStats from '../core/blitzstars/getDiffedTankStats'; -import addStatTypeSubCommands from '../core/discord/addStatTypeSubCommands'; -import addUsernameChoices from '../core/discord/addUsernameChoices'; -import autocompleteTanks from '../core/discord/autocompleteTanks'; -import autocompleteUsername from '../core/discord/autocompleteUsername'; -import { getCustomPeriodParams } from '../core/discord/getCustomPeriodParams'; -import { getFiltersFromButton } from '../core/discord/getFiltersFromButton'; -import { getFiltersFromCommand } from '../core/discord/getFiltersFromCommand'; -import interactionToURL from '../core/discord/interactionToURL'; -import { refreshButton } from '../core/discord/refreshButton'; -import resolvePeriodFromButton from '../core/discord/resolvePeriodFromButton'; -import resolvePeriodFromCommand, { - ResolvedPeriod, -} from '../core/discord/resolvePeriodFromCommand'; -import resolvePlayerFromButton from '../core/discord/resolvePlayerFromButton'; -import resolvePlayerFromCommand, { - ResolvedPlayer, -} from '../core/discord/resolvePlayerFromCommand'; +import { getAccountInfo } from '../core/blitz/getAccountInfo'; +import { getClanAccountInfo } from '../core/blitz/getClanAccountInfo'; +import { emblemIdToURL } from '../core/blitzkrieg/emblemIdToURL'; +import { StatFilters, filterStats } from '../core/statistics/filterStats'; import { CommandRegistryRaw } from '../events/interactionCreate'; async function render( diff --git a/src/commands/inactive.tsx b/src/commands/inactive.tsx index 91986bc2c..53974201e 100644 --- a/src/commands/inactive.tsx +++ b/src/commands/inactive.tsx @@ -1,13 +1,13 @@ import { SlashCommandBuilder } from 'discord.js'; -import { getAccountInfo } from '../_core/blitz/getAccountInfo'; -import { getClanInfo } from '../_core/blitz/getClanInfo'; +import addClanChoices from '../LEGACY_core/discord/addClanChoices'; +import autocompleteClan from '../LEGACY_core/discord/autocompleteClan'; +import resolveClanFromCommand from '../LEGACY_core/discord/resolveClanFromCommand'; import GenericStats from '../components/GenericStats'; import NoData, { NoDataType } from '../components/NoData'; import TitleBar from '../components/TitleBar'; import Wrapper from '../components/Wrapper'; -import addClanChoices from '../core/discord/addClanChoices'; -import autocompleteClan from '../core/discord/autocompleteClan'; -import resolveClanFromCommand from '../core/discord/resolveClanFromCommand'; +import { getAccountInfo } from '../core/blitz/getAccountInfo'; +import { getClanInfo } from '../core/blitz/getClanInfo'; import { CommandRegistry } from '../events/interactionCreate'; const DEFAULT_THRESHOLD = 7; diff --git a/src/commands/link.tsx b/src/commands/link.tsx index 5dfb6f01b..bcf82df3a 100644 --- a/src/commands/link.tsx +++ b/src/commands/link.tsx @@ -6,15 +6,15 @@ import { } from 'discord.js'; import markdownEscape from 'markdown-escape'; import discord from '../../discord.json' assert { type: 'json' }; -import { getAccountInfo } from '../_core/blitz/getAccountInfo'; -import { getClanAccountInfo } from '../_core/blitz/getClanAccountInfo'; +import { linkBlitzAndDiscord } from '../LEGACY_core/cockroackdb/discordBlitz'; +import addUsernameChoices from '../LEGACY_core/discord/addUsernameChoices'; +import autocompleteUsername from '../LEGACY_core/discord/autocompleteUsername'; +import embedNegative from '../LEGACY_core/discord/embedNegative'; import { Glow } from '../components/AllStatsOverview/components/WN8Display/components/Glow'; import Wrapper from '../components/Wrapper'; import { REGION_NAMES_SHORT, Region } from '../constants/regions'; -import { linkBlitzAndDiscord } from '../core/cockroackdb/discordBlitz'; -import addUsernameChoices from '../core/discord/addUsernameChoices'; -import autocompleteUsername from '../core/discord/autocompleteUsername'; -import embedNegative from '../core/discord/embedNegative'; +import { getAccountInfo } from '../core/blitz/getAccountInfo'; +import { getClanAccountInfo } from '../core/blitz/getClanAccountInfo'; import { CommandRegistry } from '../events/interactionCreate'; import { theme } from '../stitches.config'; diff --git a/src/commands/ownedTanks.tsx b/src/commands/ownedTanks.tsx index b8a15792d..f10185ae5 100644 --- a/src/commands/ownedTanks.tsx +++ b/src/commands/ownedTanks.tsx @@ -1,25 +1,25 @@ import { SlashCommandBuilder } from 'discord.js'; -import { getAccountInfo } from '../_core/blitz/getAccountInfo'; -import { getClanAccountInfo } from '../_core/blitz/getClanAccountInfo'; -import getTankStats from '../_core/blitz/getTankStats'; -import getTreeType from '../_core/blitz/getTreeType'; -import { emblemIdToURL } from '../_core/blitzkrieg/emblemIdToURL'; -import NoData, { NoDataType } from '../components/NoData'; -import * as Tanks from '../components/Tanks'; -import TitleBar from '../components/TitleBar'; -import Wrapper from '../components/Wrapper'; -import resolveTankName from '../core/blitz/resolveTankName'; +import resolveTankName from '../LEGACY_core/blitz/resolveTankName'; import { TIER_ROMAN_NUMERALS, TankopediaEntry, Tier, 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'; +} from '../LEGACY_core/blitz/tankopedia'; +import addTierChoices from '../LEGACY_core/discord/addTierChoices'; +import addUsernameChoices from '../LEGACY_core/discord/addUsernameChoices'; +import autocompleteUsername from '../LEGACY_core/discord/autocompleteUsername'; +import resolvePlayerFromCommand from '../LEGACY_core/discord/resolvePlayerFromCommand'; +import NoData, { NoDataType } from '../components/NoData'; +import * as Tanks from '../components/Tanks'; +import TitleBar from '../components/TitleBar'; +import Wrapper from '../components/Wrapper'; +import { getAccountInfo } from '../core/blitz/getAccountInfo'; +import { getClanAccountInfo } from '../core/blitz/getClanAccountInfo'; +import getTankStats from '../core/blitz/getTankStats'; +import getTreeType from '../core/blitz/getTreeType'; +import { emblemIdToURL } from '../core/blitzkrieg/emblemIdToURL'; import { CommandRegistry } from '../events/interactionCreate'; export const ownedTanksCommand: CommandRegistry = { diff --git a/src/commands/playerAchievements.ts b/src/commands/playerAchievements.ts index a080189d7..323930bcd 100644 --- a/src/commands/playerAchievements.ts +++ b/src/commands/playerAchievements.ts @@ -1,13 +1,15 @@ import { SlashCommandBuilder } from 'discord.js'; import { startCase } from 'lodash'; import markdownEscape from 'markdown-escape'; -import { getAccountAchievements } from '../_core/blitz/getAccountAchievements'; -import { getAccountInfo } from '../_core/blitz/getAccountInfo'; -import addUsernameChoices from '../core/discord/addUsernameChoices'; -import autocompleteUsername from '../core/discord/autocompleteUsername'; -import embedInfo from '../core/discord/embedInfo'; -import markdownTable, { TableInputEntry } from '../core/discord/markdownTable'; -import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand'; +import addUsernameChoices from '../LEGACY_core/discord/addUsernameChoices'; +import autocompleteUsername from '../LEGACY_core/discord/autocompleteUsername'; +import embedInfo from '../LEGACY_core/discord/embedInfo'; +import markdownTable, { + TableInputEntry, +} from '../LEGACY_core/discord/markdownTable'; +import resolvePlayerFromCommand from '../LEGACY_core/discord/resolvePlayerFromCommand'; +import { getAccountAchievements } from '../core/blitz/getAccountAchievements'; +import { getAccountInfo } from '../core/blitz/getAccountInfo'; import { CommandRegistry } from '../events/interactionCreate'; type SortBy = 'name' | 'count'; diff --git a/src/commands/playerInfo.ts b/src/commands/playerInfo.ts index 36f748390..a0a8e445e 100644 --- a/src/commands/playerInfo.ts +++ b/src/commands/playerInfo.ts @@ -1,11 +1,11 @@ import { SlashCommandBuilder } from 'discord.js'; import markdownEscape from 'markdown-escape'; -import { getAccountInfo } from '../_core/blitz/getAccountInfo'; -import addUsernameChoices from '../core/discord/addUsernameChoices'; -import autocompleteUsername from '../core/discord/autocompleteUsername'; -import embedInfo from '../core/discord/embedInfo'; -import markdownTable from '../core/discord/markdownTable'; -import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand'; +import addUsernameChoices from '../LEGACY_core/discord/addUsernameChoices'; +import autocompleteUsername from '../LEGACY_core/discord/autocompleteUsername'; +import embedInfo from '../LEGACY_core/discord/embedInfo'; +import markdownTable from '../LEGACY_core/discord/markdownTable'; +import resolvePlayerFromCommand from '../LEGACY_core/discord/resolvePlayerFromCommand'; +import { getAccountInfo } from '../core/blitz/getAccountInfo'; import { CommandRegistry } from '../events/interactionCreate'; export const playerInfoCommand: CommandRegistry = { diff --git a/src/commands/ratings.tsx b/src/commands/ratings.tsx index 305a0723e..a5354cd99 100644 --- a/src/commands/ratings.tsx +++ b/src/commands/ratings.tsx @@ -5,25 +5,25 @@ import { SlashCommandSubcommandGroupBuilder, } from 'discord.js'; import { BlitzkriegRatingsLeaderboard } from '../../scripts/buildRatingsLeaderboard'; -import { getAccountInfo } from '../_core/blitz/getAccountInfo'; -import { getClanAccountInfo } from '../_core/blitz/getClanAccountInfo'; -import getRatingsInfo from '../_core/blitz/getRatingsInfo'; -import getArchivedRatingsInfo from '../_core/blitzkrieg/getArchivedRatingsInfo'; +import regionToRegionSubdomain from '../LEGACY_core/blitz/regionToRegionSubdomain'; +import getMidnightLeaderboard, { + DATABASE_REPO, +} from '../LEGACY_core/database/getMidnightLeaderboard'; +import addRegionChoices from '../LEGACY_core/discord/addRegionChoices'; +import addUsernameChoices from '../LEGACY_core/discord/addUsernameChoices'; +import autocompleteUsername from '../LEGACY_core/discord/autocompleteUsername'; +import embedNegative from '../LEGACY_core/discord/embedNegative'; +import resolvePlayerFromCommand from '../LEGACY_core/discord/resolvePlayerFromCommand'; +import { octokit } from '../LEGACY_core/github/octokit'; +import throwError from '../LEGACY_core/node/throwError'; import * as Leaderboard from '../components/Leaderboard'; import TitleBar from '../components/TitleBar'; import Wrapper from '../components/Wrapper'; import { REGION_NAMES_SHORT, Region } from '../constants/regions'; -import regionToRegionSubdomain from '../core/blitz/regionToRegionSubdomain'; -import getMidnightLeaderboard, { - DATABASE_REPO, -} from '../core/database/getMidnightLeaderboard'; -import addRegionChoices from '../core/discord/addRegionChoices'; -import addUsernameChoices from '../core/discord/addUsernameChoices'; -import autocompleteUsername from '../core/discord/autocompleteUsername'; -import embedNegative from '../core/discord/embedNegative'; -import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand'; -import { octokit } from '../core/github/octokit'; -import throwError from '../core/node/throwError'; +import { getAccountInfo } from '../core/blitz/getAccountInfo'; +import { getClanAccountInfo } from '../core/blitz/getClanAccountInfo'; +import getRatingsInfo from '../core/blitz/getRatingsInfo'; +import getArchivedRatingsInfo from '../core/blitzkrieg/getArchivedRatingsInfo'; import { CommandRegistryRaw } from '../events/interactionCreate'; export interface RatingsPlayer { diff --git a/src/commands/searchClans.ts b/src/commands/searchClans.ts index dfe60053c..a3bb1f5b0 100644 --- a/src/commands/searchClans.ts +++ b/src/commands/searchClans.ts @@ -1,11 +1,11 @@ import { SlashCommandBuilder } from 'discord.js'; import markdownEscape from 'markdown-escape'; -import fetchBlitz from '../_core/blitz/fetchWargaming'; +import addClanChoices from '../LEGACY_core/discord/addClanChoices'; +import addRegionChoices from '../LEGACY_core/discord/addRegionChoices'; +import embedInfo from '../LEGACY_core/discord/embedInfo'; import { REGION_NAMES, Region } from '../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; -import addClanChoices from '../core/discord/addClanChoices'; -import addRegionChoices from '../core/discord/addRegionChoices'; -import embedInfo from '../core/discord/embedInfo'; +import fetchBlitz from '../core/blitz/fetchWargaming'; import { CommandRegistry } from '../events/interactionCreate'; import { ClanList } from '../types/clanList'; diff --git a/src/commands/searchPlayers.ts b/src/commands/searchPlayers.ts index 8b2eacf8e..7673482ef 100644 --- a/src/commands/searchPlayers.ts +++ b/src/commands/searchPlayers.ts @@ -1,12 +1,12 @@ import { SlashCommandBuilder } from 'discord.js'; import markdownEscape from 'markdown-escape'; -import fetchBlitz from '../_core/blitz/fetchWargaming'; +import { AccountList, usernamePattern } from '../LEGACY_core/blitz/listPlayers'; +import addRegionChoices from '../LEGACY_core/discord/addRegionChoices'; +import addUsernameChoices from '../LEGACY_core/discord/addUsernameChoices'; +import embedInfo from '../LEGACY_core/discord/embedInfo'; import { REGION_NAMES, Region } from '../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; -import { AccountList, usernamePattern } from '../core/blitz/listPlayers'; -import addRegionChoices from '../core/discord/addRegionChoices'; -import addUsernameChoices from '../core/discord/addUsernameChoices'; -import embedInfo from '../core/discord/embedInfo'; +import fetchBlitz from '../core/blitz/fetchWargaming'; import { CommandRegistry } from '../events/interactionCreate'; export const searchPlayersCommand: CommandRegistry = { diff --git a/src/commands/searchTanks.ts b/src/commands/searchTanks.ts index 441443b92..5b4e3b445 100644 --- a/src/commands/searchTanks.ts +++ b/src/commands/searchTanks.ts @@ -1,9 +1,9 @@ import { SlashCommandBuilder } from 'discord.js'; import { go } from 'fuzzysort'; import markdownEscape from 'markdown-escape'; -import { TANK_NAMES_DIACRITICS } from '../core/blitz/tankopedia'; -import addTankChoices from '../core/discord/addTankChoices'; -import embedInfo from '../core/discord/embedInfo'; +import { TANK_NAMES_DIACRITICS } from '../LEGACY_core/blitz/tankopedia'; +import addTankChoices from '../LEGACY_core/discord/addTankChoices'; +import embedInfo from '../LEGACY_core/discord/embedInfo'; import { CommandRegistry } from '../events/interactionCreate'; export const searchTanksCommand: CommandRegistry = { diff --git a/src/commands/stats.tsx b/src/commands/stats.tsx index 0b5b0aa61..42d721ddd 100644 --- a/src/commands/stats.tsx +++ b/src/commands/stats.tsx @@ -1,32 +1,32 @@ import { SlashCommandBuilder } from 'discord.js'; -import { getAccountInfo } from '../_core/blitz/getAccountInfo'; -import { getClanAccountInfo } from '../_core/blitz/getClanAccountInfo'; -import { emblemIdToURL } from '../_core/blitzkrieg/emblemIdToURL'; -import { StatFilters, filterStats } from '../_core/statistics/filterStats'; +import { filtersToDescription } from '../LEGACY_core/blitzkrieg/filtersToDescription'; +import { getBlitzStarsLinkButton } from '../LEGACY_core/blitzstars/getBlitzStarsLinkButton'; +import getDiffedTankStats from '../LEGACY_core/blitzstars/getDiffedTankStats'; +import addStatTypeSubCommands from '../LEGACY_core/discord/addStatTypeSubCommands'; +import addUsernameChoices from '../LEGACY_core/discord/addUsernameChoices'; +import autocompleteTanks from '../LEGACY_core/discord/autocompleteTanks'; +import autocompleteUsername from '../LEGACY_core/discord/autocompleteUsername'; +import { getCustomPeriodParams } from '../LEGACY_core/discord/getCustomPeriodParams'; +import { getFiltersFromButton } from '../LEGACY_core/discord/getFiltersFromButton'; +import { getFiltersFromCommand } from '../LEGACY_core/discord/getFiltersFromCommand'; +import interactionToURL from '../LEGACY_core/discord/interactionToURL'; +import { refreshButton } from '../LEGACY_core/discord/refreshButton'; +import resolvePeriodFromButton from '../LEGACY_core/discord/resolvePeriodFromButton'; +import resolvePeriodFromCommand, { + ResolvedPeriod, +} from '../LEGACY_core/discord/resolvePeriodFromCommand'; +import resolvePlayerFromButton from '../LEGACY_core/discord/resolvePlayerFromButton'; +import resolvePlayerFromCommand, { + ResolvedPlayer, +} from '../LEGACY_core/discord/resolvePlayerFromCommand'; import AllStatsOverview from '../components/AllStatsOverview'; import NoData, { NoDataType } from '../components/NoData'; import TitleBar from '../components/TitleBar'; import Wrapper from '../components/Wrapper'; -import { filtersToDescription } from '../core/blitzkrieg/filtersToDescription'; -import { getBlitzStarsLinkButton } from '../core/blitzstars/getBlitzStarsLinkButton'; -import getDiffedTankStats from '../core/blitzstars/getDiffedTankStats'; -import addStatTypeSubCommands from '../core/discord/addStatTypeSubCommands'; -import addUsernameChoices from '../core/discord/addUsernameChoices'; -import autocompleteTanks from '../core/discord/autocompleteTanks'; -import autocompleteUsername from '../core/discord/autocompleteUsername'; -import { getCustomPeriodParams } from '../core/discord/getCustomPeriodParams'; -import { getFiltersFromButton } from '../core/discord/getFiltersFromButton'; -import { getFiltersFromCommand } from '../core/discord/getFiltersFromCommand'; -import interactionToURL from '../core/discord/interactionToURL'; -import { refreshButton } from '../core/discord/refreshButton'; -import resolvePeriodFromButton from '../core/discord/resolvePeriodFromButton'; -import resolvePeriodFromCommand, { - ResolvedPeriod, -} from '../core/discord/resolvePeriodFromCommand'; -import resolvePlayerFromButton from '../core/discord/resolvePlayerFromButton'; -import resolvePlayerFromCommand, { - ResolvedPlayer, -} from '../core/discord/resolvePlayerFromCommand'; +import { getAccountInfo } from '../core/blitz/getAccountInfo'; +import { getClanAccountInfo } from '../core/blitz/getClanAccountInfo'; +import { emblemIdToURL } from '../core/blitzkrieg/emblemIdToURL'; +import { StatFilters, filterStats } from '../core/statistics/filterStats'; import { CommandRegistryRaw } from '../events/interactionCreate'; async function render( diff --git a/src/commands/today.tsx b/src/commands/today.tsx index a77c0dfb2..fb3979f60 100644 --- a/src/commands/today.tsx +++ b/src/commands/today.tsx @@ -1,12 +1,12 @@ import { SlashCommandBuilder } from 'discord.js'; -import { getAccountInfo } from '../_core/blitz/getAccountInfo'; -import addUsernameChoices from '../core/discord/addUsernameChoices'; -import autocompleteUsername from '../core/discord/autocompleteUsername'; -import interactionToURL from '../core/discord/interactionToURL'; -import linkButton from '../core/discord/linkButton'; -import primaryButton from '../core/discord/primaryButton'; -import resolvePlayerFromButton from '../core/discord/resolvePlayerFromButton'; -import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand'; +import addUsernameChoices from '../LEGACY_core/discord/addUsernameChoices'; +import autocompleteUsername from '../LEGACY_core/discord/autocompleteUsername'; +import interactionToURL from '../LEGACY_core/discord/interactionToURL'; +import linkButton from '../LEGACY_core/discord/linkButton'; +import primaryButton from '../LEGACY_core/discord/primaryButton'; +import resolvePlayerFromButton from '../LEGACY_core/discord/resolvePlayerFromButton'; +import resolvePlayerFromCommand from '../LEGACY_core/discord/resolvePlayerFromCommand'; +import { getAccountInfo } from '../core/blitz/getAccountInfo'; import { CommandRegistry } from '../events/interactionCreate'; import today from '../renderers/today'; diff --git a/src/components/AllStatsOverview/components/WN8Display/index.tsx b/src/components/AllStatsOverview/components/WN8Display/index.tsx index 513d1efdf..5af4f40b1 100644 --- a/src/components/AllStatsOverview/components/WN8Display/index.tsx +++ b/src/components/AllStatsOverview/components/WN8Display/index.tsx @@ -1,5 +1,5 @@ import { Percentile } from '../../../../constants/percentiles'; -import getWN8Percentile from '../../../../core/blitz/getWN8Percentile'; +import getWN8Percentile from '../../../../LEGACY_core/blitz/getWN8Percentile'; import { theme } from '../../../../stitches.config'; import { PERCENTILE_COLORS } from '../../../PercentileIndicator'; import { Glow } from './components/Glow'; diff --git a/src/components/AllStatsOverview/index.tsx b/src/components/AllStatsOverview/index.tsx index e78774e9d..5b3f4d0f3 100644 --- a/src/components/AllStatsOverview/index.tsx +++ b/src/components/AllStatsOverview/index.tsx @@ -1,4 +1,4 @@ -import { AllStats, SupplementaryStats } from '../../_core/blitz/getAccountInfo'; +import { AllStats, SupplementaryStats } from '../../core/blitz/getAccountInfo'; import { WN8Display } from './components/WN8Display'; import { WN8SurroundingStat, diff --git a/src/components/GenericAllStats/index.tsx b/src/components/GenericAllStats/index.tsx index fa75bfe4c..e664c8282 100644 --- a/src/components/GenericAllStats/index.tsx +++ b/src/components/GenericAllStats/index.tsx @@ -1,6 +1,6 @@ -import { AllStats, SupplementaryStats } from '../../_core/blitz/getAccountInfo'; -import getWN8Percentile from '../../core/blitz/getWN8Percentile'; -import isNumber from '../../core/node/isNumber'; +import { AllStats, SupplementaryStats } from '../../core/blitz/getAccountInfo'; +import getWN8Percentile from '../../LEGACY_core/blitz/getWN8Percentile'; +import isNumber from '../../LEGACY_core/node/isNumber'; import { Card } from './components/Card'; import { Root } from './components/Root'; import { Row } from './components/Row'; diff --git a/src/components/Tanks/components/Item.tsx b/src/components/Tanks/components/Item.tsx index ae680fc26..d08459b17 100644 --- a/src/components/Tanks/components/Item.tsx +++ b/src/components/Tanks/components/Item.tsx @@ -2,7 +2,7 @@ import { TANK_ICONS, TANK_ICONS_COLLECTOR, TANK_ICONS_PREMIUM, -} from '../../../core/blitz/tankopedia'; +} from '../../../LEGACY_core/blitz/tankopedia'; import { theme } from '../../../stitches.config'; export enum TreeTypeEnum { diff --git a/src/components/TierWeights.tsx b/src/components/TierWeights.tsx index db5ecb2cd..38613b7cf 100644 --- a/src/components/TierWeights.tsx +++ b/src/components/TierWeights.tsx @@ -1,4 +1,4 @@ -import { Tier } from '../core/blitz/tankopedia'; +import { Tier } from '../LEGACY_core/blitz/tankopedia'; import { theme } from '../stitches.config'; export type TierWeightsRecord = Partial>; diff --git a/src/_core/blitz/fetchWargaming.ts b/src/core/blitz/fetchWargaming.ts similarity index 90% rename from src/_core/blitz/fetchWargaming.ts rename to src/core/blitz/fetchWargaming.ts index ac8c2d1ba..0fd760a60 100644 --- a/src/_core/blitz/fetchWargaming.ts +++ b/src/core/blitz/fetchWargaming.ts @@ -1,4 +1,4 @@ -import throwError from '../../core/node/throwError'; +import throwError from '../../LEGACY_core/node/throwError'; export type BlitzResponse = | { diff --git a/src/_core/blitz/getAccountAchievements.ts b/src/core/blitz/getAccountAchievements.ts similarity index 100% rename from src/_core/blitz/getAccountAchievements.ts rename to src/core/blitz/getAccountAchievements.ts diff --git a/src/_core/blitz/getAccountInfo.ts b/src/core/blitz/getAccountInfo.ts similarity index 100% rename from src/_core/blitz/getAccountInfo.ts rename to src/core/blitz/getAccountInfo.ts diff --git a/src/_core/blitz/getClanAccountInfo.ts b/src/core/blitz/getClanAccountInfo.ts similarity index 100% rename from src/_core/blitz/getClanAccountInfo.ts rename to src/core/blitz/getClanAccountInfo.ts diff --git a/src/_core/blitz/getClanInfo.ts b/src/core/blitz/getClanInfo.ts similarity index 100% rename from src/_core/blitz/getClanInfo.ts rename to src/core/blitz/getClanInfo.ts diff --git a/src/_core/blitz/getRatingsInfo.ts b/src/core/blitz/getRatingsInfo.ts similarity index 81% rename from src/_core/blitz/getRatingsInfo.ts rename to src/core/blitz/getRatingsInfo.ts index 8c4c85aa5..ddb3c641a 100644 --- a/src/_core/blitz/getRatingsInfo.ts +++ b/src/core/blitz/getRatingsInfo.ts @@ -1,6 +1,6 @@ import { RatingsInfo } from '../../commands/ratings'; import { Region } from '../../constants/regions'; -import regionToRegionSubdomain from '../../core/blitz/regionToRegionSubdomain'; +import regionToRegionSubdomain from '../../LEGACY_core/blitz/regionToRegionSubdomain'; export default async function getRatingsInfo(region: Region) { const response = await fetch( diff --git a/src/_core/blitz/getTankStats.ts b/src/core/blitz/getTankStats.ts similarity index 92% rename from src/_core/blitz/getTankStats.ts rename to src/core/blitz/getTankStats.ts index bf1e3c60c..b2d29c8d6 100644 --- a/src/_core/blitz/getTankStats.ts +++ b/src/core/blitz/getTankStats.ts @@ -1,6 +1,6 @@ import { Region } from '../../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; -import throwError from '../../core/node/throwError'; +import throwError from '../../LEGACY_core/node/throwError'; import { TanksStats } from '../../types/tanksStats'; import fetchBlitz from './fetchWargaming'; diff --git a/src/_core/blitz/getTreeType.ts b/src/core/blitz/getTreeType.ts similarity index 82% rename from src/_core/blitz/getTreeType.ts rename to src/core/blitz/getTreeType.ts index ae43ca2fc..8f7a8ff32 100644 --- a/src/_core/blitz/getTreeType.ts +++ b/src/core/blitz/getTreeType.ts @@ -1,5 +1,5 @@ import { TreeTypeEnum } from '../../components/Tanks'; -import { tankopedia } from '../../core/blitz/tankopedia'; +import { tankopedia } from '../../LEGACY_core/blitz/tankopedia'; export default async function getTreeType(id: number) { const entry = (await tankopedia)[id]; diff --git a/src/_core/blitz/normalizeExtra.ts b/src/core/blitz/normalizeExtra.ts similarity index 100% rename from src/_core/blitz/normalizeExtra.ts rename to src/core/blitz/normalizeExtra.ts diff --git a/src/_core/blitz/normalizeIds.ts b/src/core/blitz/normalizeIds.ts similarity index 100% rename from src/_core/blitz/normalizeIds.ts rename to src/core/blitz/normalizeIds.ts diff --git a/src/_core/blitzkrieg/emblemIdToURL.ts b/src/core/blitzkrieg/emblemIdToURL.ts similarity index 100% rename from src/_core/blitzkrieg/emblemIdToURL.ts rename to src/core/blitzkrieg/emblemIdToURL.ts diff --git a/src/_core/blitzkrieg/getArchivedRatingsInfo.ts b/src/core/blitzkrieg/getArchivedRatingsInfo.ts similarity index 82% rename from src/_core/blitzkrieg/getArchivedRatingsInfo.ts rename to src/core/blitzkrieg/getArchivedRatingsInfo.ts index 42a47b489..7141cb93d 100644 --- a/src/_core/blitzkrieg/getArchivedRatingsInfo.ts +++ b/src/core/blitzkrieg/getArchivedRatingsInfo.ts @@ -1,8 +1,8 @@ import { RatingsInfo } from '../../commands/ratings'; import { Region } from '../../constants/regions'; -import { DATABASE_REPO } from '../../core/database/getMidnightLeaderboard'; -import { octokit } from '../../core/github/octokit'; -import throwError from '../../core/node/throwError'; +import { DATABASE_REPO } from '../../LEGACY_core/database/getMidnightLeaderboard'; +import { octokit } from '../../LEGACY_core/github/octokit'; +import throwError from '../../LEGACY_core/node/throwError'; const ARCHIVED_RATINGS_CACHE: Record< Region, diff --git a/src/_core/blitzstars/getPlayerStats.ts b/src/core/blitzstars/getPlayerStats.ts similarity index 100% rename from src/_core/blitzstars/getPlayerStats.ts rename to src/core/blitzstars/getPlayerStats.ts diff --git a/src/_core/statistics/calculateWN8.ts b/src/core/statistics/calculateWN8.ts similarity index 100% rename from src/_core/statistics/calculateWN8.ts rename to src/core/statistics/calculateWN8.ts diff --git a/src/_core/statistics/deltaTankStats.ts b/src/core/statistics/deltaTankStats.ts similarity index 100% rename from src/_core/statistics/deltaTankStats.ts rename to src/core/statistics/deltaTankStats.ts diff --git a/src/_core/statistics/filterStats.ts b/src/core/statistics/filterStats.ts similarity index 89% rename from src/_core/statistics/filterStats.ts rename to src/core/statistics/filterStats.ts index d7dcbf628..78413ee2d 100644 --- a/src/_core/statistics/filterStats.ts +++ b/src/core/statistics/filterStats.ts @@ -1,8 +1,8 @@ import { TreeTypeString } from '../../components/Tanks'; -import sumStats from '../../core/blitz/sumStats'; -import { tankopedia } from '../../core/blitz/tankopedia'; -import { DiffedTankStats } from '../../core/blitzstars/getDiffedTankStats'; -import { tankAverages } from '../../core/blitzstars/tankAverages'; +import sumStats from '../../LEGACY_core/blitz/sumStats'; +import { tankopedia } from '../../LEGACY_core/blitz/tankopedia'; +import { DiffedTankStats } from '../../LEGACY_core/blitzstars/getDiffedTankStats'; +import { tankAverages } from '../../LEGACY_core/blitzstars/tankAverages'; import calculateWN8 from './calculateWN8'; export interface StatFilters { diff --git a/src/events/interactionCreate/handlers/button.tsx b/src/events/interactionCreate/handlers/button.tsx index 40c6d7a98..d819a6927 100644 --- a/src/events/interactionCreate/handlers/button.tsx +++ b/src/events/interactionCreate/handlers/button.tsx @@ -1,7 +1,7 @@ import { ButtonInteraction, CacheType } from 'discord.js'; import { commands } from '..'; -import normalizeInteractionReturnable from '../../../core/discord/normalizeInteractionReturnable'; -import throwError from '../../../core/node/throwError'; +import normalizeInteractionReturnable from '../../../LEGACY_core/discord/normalizeInteractionReturnable'; +import throwError from '../../../LEGACY_core/node/throwError'; export default async function handleButton( interaction: ButtonInteraction, diff --git a/src/events/interactionCreate/handlers/chatInputCommand.ts b/src/events/interactionCreate/handlers/chatInputCommand.ts index 605a82567..577e92e72 100644 --- a/src/events/interactionCreate/handlers/chatInputCommand.ts +++ b/src/events/interactionCreate/handlers/chatInputCommand.ts @@ -7,10 +7,10 @@ import { } from 'discord.js'; import { commands } from '..'; import discord from '../../../../discord.json' assert { type: 'json' }; -import embedNegative from '../../../core/discord/embedNegative'; -import embedWarning from '../../../core/discord/embedWarning'; -import normalizeInteractionReturnable from '../../../core/discord/normalizeInteractionReturnable'; -import { psa } from '../../../core/discord/psa'; +import embedNegative from '../../../LEGACY_core/discord/embedNegative'; +import embedWarning from '../../../LEGACY_core/discord/embedWarning'; +import normalizeInteractionReturnable from '../../../LEGACY_core/discord/normalizeInteractionReturnable'; +import { psa } from '../../../LEGACY_core/discord/psa'; export default async function handleChatInputCommand( interaction: ChatInputCommandInteraction, diff --git a/src/events/interactionCreate/index.ts b/src/events/interactionCreate/index.ts index a461732ab..6f988c149 100644 --- a/src/events/interactionCreate/index.ts +++ b/src/events/interactionCreate/index.ts @@ -14,6 +14,9 @@ import { SlashCommandSubcommandsOnlyBuilder, } from 'discord.js'; import discord from '../../../discord.json' assert { type: 'json' }; +import getClientId from '../../LEGACY_core/node/getClientId'; +import isDev from '../../LEGACY_core/node/isDev'; +import { secrets } from '../../LEGACY_core/node/secrets'; import { aboutCommand } from '../../commands/about'; import { debugCommand } from '../../commands/debug'; import { eligibleCommand } from '../../commands/eligible'; @@ -31,9 +34,6 @@ import { searchPlayersCommand } from '../../commands/searchPlayers'; import { searchTanksCommand } from '../../commands/searchTanks'; import { statsCommand } from '../../commands/stats'; import { todayCommand } from '../../commands/today'; -import getClientId from '../../core/node/getClientId'; -import isDev from '../../core/node/isDev'; -import { secrets } from '../../core/node/secrets'; import handleAutocomplete from './handlers/autocomplete'; import handleButton from './handlers/button'; import handleChatInputCommand from './handlers/chatInputCommand'; diff --git a/src/events/ready.ts b/src/events/ready.ts index cf6996d04..9307a98fa 100644 --- a/src/events/ready.ts +++ b/src/events/ready.ts @@ -1,5 +1,5 @@ import { Client } from 'discord.js'; -import isDev from '../core/node/isDev'; +import isDev from '../LEGACY_core/node/isDev'; export default function ready(client: Client) { console.log( diff --git a/src/renderers/today.tsx b/src/renderers/today.tsx index 2496fefb6..a337945e6 100644 --- a/src/renderers/today.tsx +++ b/src/renderers/today.tsx @@ -1,21 +1,21 @@ -import { AllStats, getAccountInfo } from '../_core/blitz/getAccountInfo'; -import { getClanAccountInfo } from '../_core/blitz/getClanAccountInfo'; -import getTankStats from '../_core/blitz/getTankStats'; -import getTreeType from '../_core/blitz/getTreeType'; -import calculateWN8 from '../_core/statistics/calculateWN8'; +import getWN8Percentile from '../LEGACY_core/blitz/getWN8Percentile'; +import resolveTankName from '../LEGACY_core/blitz/resolveTankName'; +import sumStats from '../LEGACY_core/blitz/sumStats'; +import { tankopedia } from '../LEGACY_core/blitz/tankopedia'; +import getDiffedTankStats from '../LEGACY_core/blitzstars/getDiffedTankStats'; +import getPeriodNow from '../LEGACY_core/blitzstars/getPeriodNow'; +import getTimeDaysAgo from '../LEGACY_core/blitzstars/getTimeDaysAgo'; +import { tankAverages } from '../LEGACY_core/blitzstars/tankAverages'; +import { ResolvedPlayer } from '../LEGACY_core/discord/resolvePlayerFromCommand'; import * as Breakdown from '../components/Breakdown'; import NoData, { NoDataType } from '../components/NoData'; import TitleBar from '../components/TitleBar'; import Wrapper from '../components/Wrapper'; -import getWN8Percentile from '../core/blitz/getWN8Percentile'; -import resolveTankName from '../core/blitz/resolveTankName'; -import sumStats from '../core/blitz/sumStats'; -import { tankopedia } from '../core/blitz/tankopedia'; -import getDiffedTankStats from '../core/blitzstars/getDiffedTankStats'; -import getPeriodNow from '../core/blitzstars/getPeriodNow'; -import getTimeDaysAgo from '../core/blitzstars/getTimeDaysAgo'; -import { tankAverages } from '../core/blitzstars/tankAverages'; -import { ResolvedPlayer } from '../core/discord/resolvePlayerFromCommand'; +import { AllStats, getAccountInfo } from '../core/blitz/getAccountInfo'; +import { getClanAccountInfo } from '../core/blitz/getClanAccountInfo'; +import getTankStats from '../core/blitz/getTankStats'; +import getTreeType from '../core/blitz/getTreeType'; +import calculateWN8 from '../core/statistics/calculateWN8'; import { PossiblyPromise } from '../types/possiblyPromise'; export default async function today( diff --git a/src/types/histories.ts b/src/types/histories.ts index 05332c32f..59c2f8ab4 100644 --- a/src/types/histories.ts +++ b/src/types/histories.ts @@ -1,6 +1,6 @@ // a cleaner simplification of Blitz Stars' histories because it's a mess there -import { AllStats } from '../_core/blitz/getAccountInfo'; +import { AllStats } from '../core/blitz/getAccountInfo'; export interface History { all: AllStats; diff --git a/src/types/tanksStats.ts b/src/types/tanksStats.ts index 4849ffd1c..70aa4986d 100644 --- a/src/types/tanksStats.ts +++ b/src/types/tanksStats.ts @@ -1,4 +1,4 @@ -import { AllStats } from '../_core/blitz/getAccountInfo'; +import { AllStats } from '../core/blitz/getAccountInfo'; export interface IndividualTankStats { all: AllStats; From 9bdb14e13ae1f683ab4a48bf80883d024942e414 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sat, 14 Oct 2023 11:15:42 -0500 Subject: [PATCH 23/43] feat: core chunk 4 --- src/LEGACY_core/blitz/resolveTankId.ts | 9 ++++++--- src/LEGACY_core/discord/addTierChoices.ts | 2 +- src/LEGACY_core/discord/autocompleteClan.ts | 4 ++-- src/LEGACY_core/discord/autocompleteUsername.ts | 4 ++-- src/LEGACY_core/discord/getFiltersFromCommand.ts | 7 +++++-- src/LEGACY_core/discord/resolveClanFromCommand.ts | 4 ++-- src/LEGACY_core/discord/resolvePlayerFromCommand.ts | 4 ++-- src/app/embeds/session/page.tsx | 2 +- src/app/tools/session/page.tsx | 8 ++++---- src/commands/fullStats.tsx | 2 +- src/commands/ratings.tsx | 2 +- src/commands/searchPlayers.ts | 5 ++++- src/commands/stats.tsx | 2 +- .../AllStatsOverview/components/WN8Display/index.tsx | 2 +- src/components/GenericAllStats/index.tsx | 2 +- src/core/blitz/getRatingsInfo.ts | 2 +- .../blitz/regionToRegionSubdomain.ts | 0 .../blitz/searchClansAcrossRegions.ts} | 7 +++++-- .../blitz/searchPlayersAcrossRegions.ts} | 7 +++++-- .../blitz => core/math}/numberToRomanNumeral.ts | 0 .../blitz => core/statistics}/getWN8Percentile.ts | 0 src/renderers/today.tsx | 2 +- 22 files changed, 46 insertions(+), 31 deletions(-) rename src/{LEGACY_core => core}/blitz/regionToRegionSubdomain.ts (100%) rename src/{LEGACY_core/blitz/listClans.ts => core/blitz/searchClansAcrossRegions.ts} (91%) rename src/{LEGACY_core/blitz/listPlayers.ts => core/blitz/searchPlayersAcrossRegions.ts} (93%) rename src/{LEGACY_core/blitz => core/math}/numberToRomanNumeral.ts (100%) rename src/{LEGACY_core/blitz => core/statistics}/getWN8Percentile.ts (100%) diff --git a/src/LEGACY_core/blitz/resolveTankId.ts b/src/LEGACY_core/blitz/resolveTankId.ts index a7bb5d8a2..876c4aa0f 100644 --- a/src/LEGACY_core/blitz/resolveTankId.ts +++ b/src/LEGACY_core/blitz/resolveTankId.ts @@ -2,11 +2,14 @@ import { go } from 'fuzzysort'; import throwError from '../node/throwError'; import { TANKS, tankopedia } from './tankopedia'; -export default async function resolveTankId(tank: string) { - const number = parseInt(tank); +export default async function resolveTankId(tank: string | number) { + const number = typeof tank === 'string' ? parseInt(tank) : tank; if (Number.isNaN(number)) { - const searchResult = go(tank, await TANKS, { keys: ['name'], limit: 1 }); + const searchResult = go(`${tank}`, await TANKS, { + keys: ['name'], + limit: 1, + }); if (searchResult.length === 0) { throw throwError( diff --git a/src/LEGACY_core/discord/addTierChoices.ts b/src/LEGACY_core/discord/addTierChoices.ts index 04958d3c6..f6913427e 100644 --- a/src/LEGACY_core/discord/addTierChoices.ts +++ b/src/LEGACY_core/discord/addTierChoices.ts @@ -1,6 +1,6 @@ import { SlashCommandStringOption } from 'discord.js'; import { range } from 'lodash'; -import numberToRomanNumeral from '../blitz/numberToRomanNumeral'; +import numberToRomanNumeral from '../../core/math/numberToRomanNumeral'; export default function addTierChoices(option: SlashCommandStringOption) { return option diff --git a/src/LEGACY_core/discord/autocompleteClan.ts b/src/LEGACY_core/discord/autocompleteClan.ts index 1b9cef647..3de7c8598 100644 --- a/src/LEGACY_core/discord/autocompleteClan.ts +++ b/src/LEGACY_core/discord/autocompleteClan.ts @@ -4,7 +4,7 @@ import { CacheType, } from 'discord.js'; import { REGION_NAMES } from '../../constants/regions'; -import listClans from '../blitz/listClans'; +import searchClansAcrossRegions from '../../core/blitz/searchClansAcrossRegions'; export default async function autocompleteClan( interaction: AutocompleteInteraction, @@ -12,7 +12,7 @@ export default async function autocompleteClan( const focusedOption = interaction.options.getFocused(true); if (focusedOption.name !== 'clan') return; if (focusedOption.value.length < 2) return interaction.respond([]); - const players = await listClans(focusedOption.value); + const players = await searchClansAcrossRegions(focusedOption.value); await interaction.respond( players diff --git a/src/LEGACY_core/discord/autocompleteUsername.ts b/src/LEGACY_core/discord/autocompleteUsername.ts index 753cfe516..b29c860f9 100644 --- a/src/LEGACY_core/discord/autocompleteUsername.ts +++ b/src/LEGACY_core/discord/autocompleteUsername.ts @@ -4,14 +4,14 @@ import { CacheType, } from 'discord.js'; import { REGION_NAMES } from '../../constants/regions'; -import listPlayers from '../blitz/listPlayers'; +import searchPlayersAcrossRegions from '../../core/blitz/searchPlayersAcrossRegions'; export default async function autocompleteUsername( interaction: AutocompleteInteraction, ) { const focusedOption = interaction.options.getFocused(true); if (focusedOption.name !== 'username') return; - const players = await listPlayers(focusedOption.value); + const players = await searchPlayersAcrossRegions(focusedOption.value); try { await interaction.respond( diff --git a/src/LEGACY_core/discord/getFiltersFromCommand.ts b/src/LEGACY_core/discord/getFiltersFromCommand.ts index 5a01d9084..fab2cc795 100644 --- a/src/LEGACY_core/discord/getFiltersFromCommand.ts +++ b/src/LEGACY_core/discord/getFiltersFromCommand.ts @@ -1,10 +1,13 @@ import { ChatInputCommandInteraction } from 'discord.js'; import { TreeTypeString } from '../../components/Tanks'; import { StatFilters } from '../../core/statistics/filterStats'; +import resolveTankId from '../blitz/resolveTankId'; -export function getFiltersFromCommand( +export async function getFiltersFromCommand( interaction: ChatInputCommandInteraction, ) { + const tankRaw = interaction.options.getString('tank'); + return { nation: interaction.options.getString('nation') ?? undefined, tier: parseInt(interaction.options.getString('tier') ?? '0') || undefined, @@ -13,6 +16,6 @@ export function getFiltersFromCommand( (interaction.options.getString('tree-type') as | TreeTypeString | undefined) ?? undefined, - tank: parseInt(interaction.options.getString('tank') ?? '0') || undefined, + tank: tankRaw === null ? undefined : await resolveTankId(tankRaw), } satisfies StatFilters; } diff --git a/src/LEGACY_core/discord/resolveClanFromCommand.ts b/src/LEGACY_core/discord/resolveClanFromCommand.ts index 0e47d700b..479e7b96f 100644 --- a/src/LEGACY_core/discord/resolveClanFromCommand.ts +++ b/src/LEGACY_core/discord/resolveClanFromCommand.ts @@ -1,6 +1,6 @@ import { ChatInputCommandInteraction } from 'discord.js'; import { Region } from '../../constants/regions'; -import listClans from '../blitz/listClans'; +import searchClansAcrossRegions from '../../core/blitz/searchClansAcrossRegions'; import throwError from '../node/throwError'; import { serverAndIdPattern } from './resolvePlayerFromCommand'; @@ -13,7 +13,7 @@ export default async function resolveClanFromCommand( const [server, accountId] = clan.split('/'); return { region: server as Region, id: Number(accountId) }; } else { - const accounts = await listClans(clan); + const accounts = await searchClansAcrossRegions(clan); if (accounts[0]) { return { region: accounts[0].region, id: accounts[0].clan_id }; diff --git a/src/LEGACY_core/discord/resolvePlayerFromCommand.ts b/src/LEGACY_core/discord/resolvePlayerFromCommand.ts index 0b34a317f..f00cde535 100644 --- a/src/LEGACY_core/discord/resolvePlayerFromCommand.ts +++ b/src/LEGACY_core/discord/resolvePlayerFromCommand.ts @@ -1,7 +1,7 @@ import { CacheType, ChatInputCommandInteraction } from 'discord.js'; import markdownEscape from 'markdown-escape'; import { Region } from '../../constants/regions'; -import listPlayers from '../blitz/listPlayers'; +import searchPlayersAcrossRegions from '../../core/blitz/searchPlayersAcrossRegions'; import { getBlitzFromDiscord } from '../cockroackdb/discordBlitz'; import throwError from '../node/throwError'; @@ -26,7 +26,7 @@ export default async function resolvePlayerFromCommand( id: Number(accountId), } satisfies ResolvedPlayer; } else { - const accounts = await listPlayers(commandUsername); + const accounts = await searchPlayersAcrossRegions(commandUsername); if (accounts[0]) { return { diff --git a/src/app/embeds/session/page.tsx b/src/app/embeds/session/page.tsx index 850e818ef..d585880bd 100644 --- a/src/app/embeds/session/page.tsx +++ b/src/app/embeds/session/page.tsx @@ -2,7 +2,6 @@ import { ContextMenu } from '@radix-ui/themes'; import { useEffect, useState } from 'react'; -import getWN8Percentile from '../../../LEGACY_core/blitz/getWN8Percentile'; import { TankopediaEntry, tankopedia, @@ -14,6 +13,7 @@ import { WARGAMING_APPLICATION_ID } from '../../../constants/wargamingApplicatio import fetchBlitz from '../../../core/blitz/fetchWargaming'; import calculateWN8 from '../../../core/statistics/calculateWN8'; import { deltaTankStats } from '../../../core/statistics/deltaTankStats'; +import getWN8Percentile from '../../../core/statistics/getWN8Percentile'; import { useSession } from '../../../stores/session'; import { IndividualTankStats, TanksStats } from '../../../types/tanksStats'; import { CustomColumnDisplay } from '../../tools/session/components/CustomColumn'; diff --git a/src/app/tools/session/page.tsx b/src/app/tools/session/page.tsx index 500424052..c738f836f 100644 --- a/src/app/tools/session/page.tsx +++ b/src/app/tools/session/page.tsx @@ -18,13 +18,13 @@ import { } from '@radix-ui/themes'; import { debounce } from 'lodash'; import { ChangeEvent, useRef, useState } from 'react'; -import listPlayers, { - AccountListWithServer, -} from '../../../LEGACY_core/blitz/listPlayers'; import PageWrapper from '../../../components/PageWrapper'; import { REGION_NAMES, Region } from '../../../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../../../constants/wargamingApplicationID'; import fetchBlitz from '../../../core/blitz/fetchWargaming'; +import searchPlayersAcrossRegions, { + AccountListWithServer, +} from '../../../core/blitz/searchPlayersAcrossRegions'; import { useSession } from '../../../stores/session'; import { NormalizedTankStats, TanksStats } from '../../../types/tanksStats'; import SessionPage from '../../embeds/session/page'; @@ -40,7 +40,7 @@ export default function Page() { const handleChange = debounce( async (event: ChangeEvent) => { if (event.target.value) { - setSearchResults(await listPlayers(event.target.value)); + setSearchResults(await searchPlayersAcrossRegions(event.target.value)); } else { setSearchResults(undefined); setShowSearchResults(false); diff --git a/src/commands/fullStats.tsx b/src/commands/fullStats.tsx index 1e46f16ea..ef6b0bbe0 100644 --- a/src/commands/fullStats.tsx +++ b/src/commands/fullStats.tsx @@ -82,7 +82,7 @@ export const fullStatsCommand = new Promise( async handler(interaction) { const player = await resolvePlayerFromCommand(interaction); const period = resolvePeriodFromCommand(player.region, interaction); - const filters = getFiltersFromCommand(interaction); + const filters = await getFiltersFromCommand(interaction); const path = interactionToURL(interaction, { ...player, ...getCustomPeriodParams(interaction), diff --git a/src/commands/ratings.tsx b/src/commands/ratings.tsx index a5354cd99..693105e45 100644 --- a/src/commands/ratings.tsx +++ b/src/commands/ratings.tsx @@ -5,7 +5,6 @@ import { SlashCommandSubcommandGroupBuilder, } from 'discord.js'; import { BlitzkriegRatingsLeaderboard } from '../../scripts/buildRatingsLeaderboard'; -import regionToRegionSubdomain from '../LEGACY_core/blitz/regionToRegionSubdomain'; import getMidnightLeaderboard, { DATABASE_REPO, } from '../LEGACY_core/database/getMidnightLeaderboard'; @@ -23,6 +22,7 @@ import { REGION_NAMES_SHORT, Region } from '../constants/regions'; import { getAccountInfo } from '../core/blitz/getAccountInfo'; import { getClanAccountInfo } from '../core/blitz/getClanAccountInfo'; import getRatingsInfo from '../core/blitz/getRatingsInfo'; +import regionToRegionSubdomain from '../core/blitz/regionToRegionSubdomain'; import getArchivedRatingsInfo from '../core/blitzkrieg/getArchivedRatingsInfo'; import { CommandRegistryRaw } from '../events/interactionCreate'; diff --git a/src/commands/searchPlayers.ts b/src/commands/searchPlayers.ts index 7673482ef..584334fcd 100644 --- a/src/commands/searchPlayers.ts +++ b/src/commands/searchPlayers.ts @@ -1,12 +1,15 @@ import { SlashCommandBuilder } from 'discord.js'; import markdownEscape from 'markdown-escape'; -import { AccountList, usernamePattern } from '../LEGACY_core/blitz/listPlayers'; import addRegionChoices from '../LEGACY_core/discord/addRegionChoices'; import addUsernameChoices from '../LEGACY_core/discord/addUsernameChoices'; import embedInfo from '../LEGACY_core/discord/embedInfo'; import { REGION_NAMES, Region } from '../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; import fetchBlitz from '../core/blitz/fetchWargaming'; +import { + AccountList, + usernamePattern, +} from '../core/blitz/searchPlayersAcrossRegions'; import { CommandRegistry } from '../events/interactionCreate'; export const searchPlayersCommand: CommandRegistry = { diff --git a/src/commands/stats.tsx b/src/commands/stats.tsx index 42d721ddd..316060ab1 100644 --- a/src/commands/stats.tsx +++ b/src/commands/stats.tsx @@ -74,7 +74,7 @@ export const statsCommand = new Promise(async (resolve) => { async handler(interaction) { const player = await resolvePlayerFromCommand(interaction); const period = resolvePeriodFromCommand(player.region, interaction); - const filters = getFiltersFromCommand(interaction); + const filters = await getFiltersFromCommand(interaction); const path = interactionToURL(interaction, { ...player, ...getCustomPeriodParams(interaction), diff --git a/src/components/AllStatsOverview/components/WN8Display/index.tsx b/src/components/AllStatsOverview/components/WN8Display/index.tsx index 5af4f40b1..6e8fe8aba 100644 --- a/src/components/AllStatsOverview/components/WN8Display/index.tsx +++ b/src/components/AllStatsOverview/components/WN8Display/index.tsx @@ -1,5 +1,5 @@ import { Percentile } from '../../../../constants/percentiles'; -import getWN8Percentile from '../../../../LEGACY_core/blitz/getWN8Percentile'; +import getWN8Percentile from '../../../../core/statistics/getWN8Percentile'; import { theme } from '../../../../stitches.config'; import { PERCENTILE_COLORS } from '../../../PercentileIndicator'; import { Glow } from './components/Glow'; diff --git a/src/components/GenericAllStats/index.tsx b/src/components/GenericAllStats/index.tsx index e664c8282..aa8493d16 100644 --- a/src/components/GenericAllStats/index.tsx +++ b/src/components/GenericAllStats/index.tsx @@ -1,5 +1,5 @@ import { AllStats, SupplementaryStats } from '../../core/blitz/getAccountInfo'; -import getWN8Percentile from '../../LEGACY_core/blitz/getWN8Percentile'; +import getWN8Percentile from '../../core/statistics/getWN8Percentile'; import isNumber from '../../LEGACY_core/node/isNumber'; import { Card } from './components/Card'; import { Root } from './components/Root'; diff --git a/src/core/blitz/getRatingsInfo.ts b/src/core/blitz/getRatingsInfo.ts index ddb3c641a..56588cdac 100644 --- a/src/core/blitz/getRatingsInfo.ts +++ b/src/core/blitz/getRatingsInfo.ts @@ -1,6 +1,6 @@ import { RatingsInfo } from '../../commands/ratings'; import { Region } from '../../constants/regions'; -import regionToRegionSubdomain from '../../LEGACY_core/blitz/regionToRegionSubdomain'; +import regionToRegionSubdomain from './regionToRegionSubdomain'; export default async function getRatingsInfo(region: Region) { const response = await fetch( diff --git a/src/LEGACY_core/blitz/regionToRegionSubdomain.ts b/src/core/blitz/regionToRegionSubdomain.ts similarity index 100% rename from src/LEGACY_core/blitz/regionToRegionSubdomain.ts rename to src/core/blitz/regionToRegionSubdomain.ts diff --git a/src/LEGACY_core/blitz/listClans.ts b/src/core/blitz/searchClansAcrossRegions.ts similarity index 91% rename from src/LEGACY_core/blitz/listClans.ts rename to src/core/blitz/searchClansAcrossRegions.ts index 3625c12a4..1e62aa981 100644 --- a/src/LEGACY_core/blitz/listClans.ts +++ b/src/core/blitz/searchClansAcrossRegions.ts @@ -1,13 +1,16 @@ import { Region } from '../../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; -import fetchBlitz from '../../core/blitz/fetchWargaming'; import { Clan, ClanList } from '../../types/clanList'; +import fetchBlitz from './fetchWargaming'; export type ClanListWithRegion = (Clan & { region: 'com' | 'eu' | 'asia'; })[]; -export default async function listClans(search: string, limit = 9) { +export default async function searchClansAcrossRegions( + search: string, + limit = 9, +) { const trimmed = search.trim(); if (trimmed.length < 3 && trimmed.length > 100) return []; const normalizedLimit = Math.round(limit / 3); diff --git a/src/LEGACY_core/blitz/listPlayers.ts b/src/core/blitz/searchPlayersAcrossRegions.ts similarity index 93% rename from src/LEGACY_core/blitz/listPlayers.ts rename to src/core/blitz/searchPlayersAcrossRegions.ts index c0ca7b393..b24315ee1 100644 --- a/src/LEGACY_core/blitz/listPlayers.ts +++ b/src/core/blitz/searchPlayersAcrossRegions.ts @@ -1,6 +1,6 @@ import { Region } from '../../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; -import fetchBlitz from '../../core/blitz/fetchWargaming'; +import fetchBlitz from './fetchWargaming'; interface Account { nickname: string; @@ -14,7 +14,10 @@ export type AccountListWithServer = (Account & { export const usernamePattern = /^[a-zA-Z0-9_]{3,24}$/; export const usernamePatternWithoutPosition = /[a-zA-Z0-9_]{3,24}/; -export default async function listPlayers(search: string, limit = 9) { +export default async function searchPlayersAcrossRegions( + search: string, + limit = 9, +) { const trimmedSearch = search.trim(); const normalizedLimit = Math.round(limit / 3); const encodedSearch = encodeURIComponent(trimmedSearch); diff --git a/src/LEGACY_core/blitz/numberToRomanNumeral.ts b/src/core/math/numberToRomanNumeral.ts similarity index 100% rename from src/LEGACY_core/blitz/numberToRomanNumeral.ts rename to src/core/math/numberToRomanNumeral.ts diff --git a/src/LEGACY_core/blitz/getWN8Percentile.ts b/src/core/statistics/getWN8Percentile.ts similarity index 100% rename from src/LEGACY_core/blitz/getWN8Percentile.ts rename to src/core/statistics/getWN8Percentile.ts diff --git a/src/renderers/today.tsx b/src/renderers/today.tsx index a337945e6..cfc6f38cc 100644 --- a/src/renderers/today.tsx +++ b/src/renderers/today.tsx @@ -1,4 +1,3 @@ -import getWN8Percentile from '../LEGACY_core/blitz/getWN8Percentile'; import resolveTankName from '../LEGACY_core/blitz/resolveTankName'; import sumStats from '../LEGACY_core/blitz/sumStats'; import { tankopedia } from '../LEGACY_core/blitz/tankopedia'; @@ -16,6 +15,7 @@ import { getClanAccountInfo } from '../core/blitz/getClanAccountInfo'; import getTankStats from '../core/blitz/getTankStats'; import getTreeType from '../core/blitz/getTreeType'; import calculateWN8 from '../core/statistics/calculateWN8'; +import getWN8Percentile from '../core/statistics/getWN8Percentile'; import { PossiblyPromise } from '../types/possiblyPromise'; export default async function today( From ed8bab7df8d3343d3e3eac97269fe782c3b5dae8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sat, 14 Oct 2023 11:25:42 -0500 Subject: [PATCH 24/43] feat: core chunk 5 --- .../blitzkrieg/addStatPropertyOptions.ts | 61 ------------------- .../discord/addStatTypeSubCommands.ts | 2 +- .../discord/autocompleteStatProperty.ts | 20 ------ src/LEGACY_core/discord/autocompleteTanks.ts | 2 +- .../discord/getFiltersFromCommand.ts | 2 +- .../discord/resolvePeriodFromButton.ts | 6 +- .../discord/resolvePeriodFromCommand.ts | 6 +- src/app/api/tank-averages/route.ts | 2 +- src/app/api/tankopedia/route.ts | 2 +- src/app/embeds/session/page.tsx | 10 +-- src/commands/debug.ts | 4 +- src/commands/eligible.ts | 14 ++--- src/commands/evolution.tsx | 8 +-- src/commands/fullStats.tsx | 10 +-- src/commands/ownedTanks.tsx | 16 ++--- src/commands/searchTanks.ts | 2 +- src/commands/stats.tsx | 8 +-- src/components/Tanks/components/Item.tsx | 2 +- src/components/TierWeights.tsx | 2 +- src/core/blitz/getTreeType.ts | 2 +- .../blitz/resolveTankId.ts | 4 +- .../blitz/resolveTankName.ts | 2 +- .../blitzkrieg/context.ts | 0 .../blitzkrieg/filtersToDescription.ts | 8 ++- .../blitzkrieg}/getPeriodNow.ts | 0 .../blitzkrieg}/getPeriodStart.ts | 2 +- .../blitzkrieg}/getTankHistories.ts | 4 +- .../blitzkrieg}/getTimeDaysAgo.ts | 0 .../blitzstars/getBlitzStarsLinkButton.ts | 4 +- .../blitzstars/getPlayerHistories.ts | 6 +- .../blitzstars/getStatsInPeriod.ts} | 6 +- .../blitzstars/tankAverages.ts | 5 +- .../blitz => core/blitzstars}/tankopedia.ts | 2 +- src/core/statistics/filterStats.ts | 8 +-- .../statistics}/getTierWeights.ts | 4 +- .../blitz => core/statistics}/sumStats.ts | 4 +- src/renderers/today.tsx | 16 ++--- 37 files changed, 91 insertions(+), 165 deletions(-) delete mode 100644 src/LEGACY_core/blitzkrieg/addStatPropertyOptions.ts delete mode 100644 src/LEGACY_core/discord/autocompleteStatProperty.ts rename src/{LEGACY_core => core}/blitz/resolveTankId.ts (85%) rename src/{LEGACY_core => core}/blitz/resolveTankName.ts (78%) rename src/{LEGACY_core => core}/blitzkrieg/context.ts (100%) rename src/{LEGACY_core => core}/blitzkrieg/filtersToDescription.ts (82%) rename src/{LEGACY_core/blitzstars => core/blitzkrieg}/getPeriodNow.ts (100%) rename src/{LEGACY_core/blitzstars => core/blitzkrieg}/getPeriodStart.ts (80%) rename src/{LEGACY_core/blitzstars => core/blitzkrieg}/getTankHistories.ts (96%) rename src/{LEGACY_core/blitzstars => core/blitzkrieg}/getTimeDaysAgo.ts (100%) rename src/{LEGACY_core => core}/blitzstars/getBlitzStarsLinkButton.ts (75%) rename src/{LEGACY_core => core}/blitzstars/getPlayerHistories.ts (90%) rename src/{LEGACY_core/blitzstars/getDiffedTankStats.ts => core/blitzstars/getStatsInPeriod.ts} (96%) rename src/{LEGACY_core => core}/blitzstars/tankAverages.ts (95%) rename src/{LEGACY_core/blitz => core/blitzstars}/tankopedia.ts (98%) rename src/{LEGACY_core/blitzkrieg => core/statistics}/getTierWeights.ts (82%) rename src/{LEGACY_core/blitz => core/statistics}/sumStats.ts (90%) diff --git a/src/LEGACY_core/blitzkrieg/addStatPropertyOptions.ts b/src/LEGACY_core/blitzkrieg/addStatPropertyOptions.ts deleted file mode 100644 index b8d6dcedb..000000000 --- a/src/LEGACY_core/blitzkrieg/addStatPropertyOptions.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { SlashCommandStringOption } from 'discord.js'; - -export const STAT_PROPERTIES = [ - { name: 'Time', value: 'time' }, - - { name: 'Battles', value: 'battles' }, - { name: 'Maximum XP', value: 'max_xp' }, - { name: 'Maximum kills', value: 'max_frags' }, - - { name: 'Accumulated spots', value: 'spotted' }, - { name: 'Accumulated hits', value: 'hits' }, - { name: 'Accumulated kills', value: 'frags' }, - { name: 'Accumulated wins', value: 'wins' }, - { name: 'Accumulated losses', value: 'losses' }, - { name: 'Accumulated capture points', value: 'capture_points' }, - { name: 'Accumulated damage dealt', value: 'damage_dealt' }, - { name: 'Accumulated damage received', value: 'damage_received' }, - { name: 'Accumulated shots', value: 'shots' }, - { name: 'Accumulated kills above tier 8', value: 'frags8p' }, - { name: 'Accumulated XP', value: 'xp' }, - { - name: 'Accumulated won and survived battles', - value: 'win_and_survived', - }, - { name: 'Accumulated survived battles', value: 'survived_battles' }, - { - name: 'Accumulated dropped capture points', - value: 'dropped_capture_points', - }, - - { name: 'Average spots', value: 'average_spotted' }, - { name: 'Average hits', value: 'average_hits' }, - { name: 'Average kills', value: 'average_frags' }, - { name: 'Average winrate', value: 'average_wins' }, - { name: 'Average loss rate', value: 'average_losses' }, - { name: 'Average capture points', value: 'average_capture_points' }, - { name: 'Average damage dealt', value: 'average_damage_dealt' }, - { name: 'Average damage received', value: 'average_damage_received' }, - { name: 'Average shots', value: 'average_shots' }, - { name: 'Average kills above tier 8', value: 'average_frags8p' }, - { name: 'Average XP', value: 'average_xp' }, - { - name: 'Average win and survival rate', - value: 'average_win_and_survived', - }, - { name: 'Average survival rate', value: 'average_survived_battles' }, - - { name: 'Average WN8', value: 'average_wn8' }, - { name: 'Average damage ratio', value: 'average_damage_ratio' }, - { - name: 'Average kills to death ratio', - value: 'average_kills_to_death_ratio', - }, -]; - -export function addStatPropertyOptions(option: SlashCommandStringOption) { - return option - .setName('stat-property') - .setDescription('A specific statistical property') - .setAutocomplete(true); -} diff --git a/src/LEGACY_core/discord/addStatTypeSubCommands.ts b/src/LEGACY_core/discord/addStatTypeSubCommands.ts index b528c0886..df0d61a4e 100644 --- a/src/LEGACY_core/discord/addStatTypeSubCommands.ts +++ b/src/LEGACY_core/discord/addStatTypeSubCommands.ts @@ -4,7 +4,7 @@ import { SlashCommandSubcommandGroupBuilder, } from 'discord.js'; import { TREE_TYPE_NAMES, TreeTypeString } from '../../components/Tanks'; -import { tankopediaInfo } from '../blitz/tankopedia'; +import { tankopediaInfo } from '../../core/blitzstars/tankopedia'; import addPeriodSubCommands from './addPeriodSubCommands'; import addTankChoices from './addTankChoices'; import addTierChoices from './addTierChoices'; diff --git a/src/LEGACY_core/discord/autocompleteStatProperty.ts b/src/LEGACY_core/discord/autocompleteStatProperty.ts deleted file mode 100644 index ff2cec6b1..000000000 --- a/src/LEGACY_core/discord/autocompleteStatProperty.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { AutocompleteInteraction, CacheType } from 'discord.js'; -import { go } from 'fuzzysort'; -import { STAT_PROPERTIES } from '../blitzkrieg/addStatPropertyOptions'; - -export default async function autocompleteStatProperty( - interaction: AutocompleteInteraction, - name = 'stat-property', -) { - const focusedOption = interaction.options.getFocused(true); - if (focusedOption.name !== name) return; - - await interaction.respond( - focusedOption.value - ? go(focusedOption.value, STAT_PROPERTIES, { - keys: ['name'], - limit: 10, - }).map(({ obj }) => obj) - : STAT_PROPERTIES.slice(0, 25), - ); -} diff --git a/src/LEGACY_core/discord/autocompleteTanks.ts b/src/LEGACY_core/discord/autocompleteTanks.ts index 64d953101..cbfb54dc1 100644 --- a/src/LEGACY_core/discord/autocompleteTanks.ts +++ b/src/LEGACY_core/discord/autocompleteTanks.ts @@ -4,7 +4,7 @@ import { CacheType, } from 'discord.js'; import { go } from 'fuzzysort'; -import { TANK_NAMES_DIACRITICS } from '../blitz/tankopedia'; +import { TANK_NAMES_DIACRITICS } from '../../core/blitzstars/tankopedia'; export default async function autocompleteTanks( interaction: AutocompleteInteraction, diff --git a/src/LEGACY_core/discord/getFiltersFromCommand.ts b/src/LEGACY_core/discord/getFiltersFromCommand.ts index fab2cc795..ccdac0834 100644 --- a/src/LEGACY_core/discord/getFiltersFromCommand.ts +++ b/src/LEGACY_core/discord/getFiltersFromCommand.ts @@ -1,7 +1,7 @@ import { ChatInputCommandInteraction } from 'discord.js'; import { TreeTypeString } from '../../components/Tanks'; +import resolveTankId from '../../core/blitz/resolveTankId'; import { StatFilters } from '../../core/statistics/filterStats'; -import resolveTankId from '../blitz/resolveTankId'; export async function getFiltersFromCommand( interaction: ChatInputCommandInteraction, diff --git a/src/LEGACY_core/discord/resolvePeriodFromButton.ts b/src/LEGACY_core/discord/resolvePeriodFromButton.ts index 2fb989aea..7e1ee2be8 100644 --- a/src/LEGACY_core/discord/resolvePeriodFromButton.ts +++ b/src/LEGACY_core/discord/resolvePeriodFromButton.ts @@ -1,8 +1,8 @@ import { ButtonInteraction } from 'discord.js'; import { Region } from '../../constants/regions'; -import getPeriodNow from '../blitzstars/getPeriodNow'; -import getPeriodStart from '../blitzstars/getPeriodStart'; -import getTimeDaysAgo from '../blitzstars/getTimeDaysAgo'; +import getPeriodNow from '../../core/blitzkrieg/getPeriodNow'; +import getPeriodStart from '../../core/blitzkrieg/getPeriodStart'; +import getTimeDaysAgo from '../../core/blitzkrieg/getTimeDaysAgo'; import { PeriodType } from './addPeriodSubCommands'; import { ResolvedPeriod, diff --git a/src/LEGACY_core/discord/resolvePeriodFromCommand.ts b/src/LEGACY_core/discord/resolvePeriodFromCommand.ts index fbb7d1995..1ac6cfdc2 100644 --- a/src/LEGACY_core/discord/resolvePeriodFromCommand.ts +++ b/src/LEGACY_core/discord/resolvePeriodFromCommand.ts @@ -1,8 +1,8 @@ import { CacheType, ChatInputCommandInteraction } from 'discord.js'; import { Region } from '../../constants/regions'; -import getPeriodNow from '../blitzstars/getPeriodNow'; -import getPeriodStart from '../blitzstars/getPeriodStart'; -import getTimeDaysAgo from '../blitzstars/getTimeDaysAgo'; +import getPeriodNow from '../../core/blitzkrieg/getPeriodNow'; +import getPeriodStart from '../../core/blitzkrieg/getPeriodStart'; +import getTimeDaysAgo from '../../core/blitzkrieg/getTimeDaysAgo'; import { PeriodSize, PeriodType } from '../discord/addPeriodSubCommands'; export function getPeriodOptionName(period: PeriodSize) { diff --git a/src/app/api/tank-averages/route.ts b/src/app/api/tank-averages/route.ts index caf1f5d34..7f5ab96bf 100644 --- a/src/app/api/tank-averages/route.ts +++ b/src/app/api/tank-averages/route.ts @@ -1,5 +1,5 @@ import { NextResponse } from 'next/server'; -import { tankAverages } from '../../../LEGACY_core/blitzstars/tankAverages'; +import { tankAverages } from '../../../core/blitzstars/tankAverages'; export async function GET() { return NextResponse.json(await tankAverages); diff --git a/src/app/api/tankopedia/route.ts b/src/app/api/tankopedia/route.ts index 5000b80d4..1ee08729c 100644 --- a/src/app/api/tankopedia/route.ts +++ b/src/app/api/tankopedia/route.ts @@ -1,5 +1,5 @@ import { NextResponse } from 'next/server'; -import { tankopedia } from '../../../LEGACY_core/blitz/tankopedia'; +import { tankopedia } from '../../../core/blitzstars/tankopedia'; export async function GET() { return NextResponse.json(await tankopedia); diff --git a/src/app/embeds/session/page.tsx b/src/app/embeds/session/page.tsx index d585880bd..c60c1db84 100644 --- a/src/app/embeds/session/page.tsx +++ b/src/app/embeds/session/page.tsx @@ -2,15 +2,15 @@ import { ContextMenu } from '@radix-ui/themes'; import { useEffect, useState } from 'react'; -import { - TankopediaEntry, - tankopedia, -} from '../../../LEGACY_core/blitz/tankopedia'; -import { tankAverages } from '../../../LEGACY_core/blitzstars/tankAverages'; import * as Breakdown from '../../../components/Breakdown'; import { TreeTypeEnum } from '../../../components/Tanks'; import { WARGAMING_APPLICATION_ID } from '../../../constants/wargamingApplicationID'; import fetchBlitz from '../../../core/blitz/fetchWargaming'; +import { tankAverages } from '../../../core/blitzstars/tankAverages'; +import { + TankopediaEntry, + tankopedia, +} from '../../../core/blitzstars/tankopedia'; import calculateWN8 from '../../../core/statistics/calculateWN8'; import { deltaTankStats } from '../../../core/statistics/deltaTankStats'; import getWN8Percentile from '../../../core/statistics/getWN8Percentile'; diff --git a/src/commands/debug.ts b/src/commands/debug.ts index 37a49094b..2cc139ac9 100644 --- a/src/commands/debug.ts +++ b/src/commands/debug.ts @@ -1,11 +1,11 @@ import { SlashCommandBuilder } from 'discord.js'; import packageJSON from '../../package.json' assert { type: 'json' }; -import { tankopedia } from '../LEGACY_core/blitz/tankopedia'; -import { tankAverages } from '../LEGACY_core/blitzstars/tankAverages'; import { client } from '../LEGACY_core/discord/client'; import embedInfo from '../LEGACY_core/discord/embedInfo'; import markdownTable from '../LEGACY_core/discord/markdownTable'; import getClientId from '../LEGACY_core/node/getClientId'; +import { tankAverages } from '../core/blitzstars/tankAverages'; +import { tankopedia } from '../core/blitzstars/tankopedia'; import { CommandRegistry } from '../events/interactionCreate'; const executionStart = new Date().getTime(); diff --git a/src/commands/eligible.ts b/src/commands/eligible.ts index 201101888..9d9d0cea5 100644 --- a/src/commands/eligible.ts +++ b/src/commands/eligible.ts @@ -1,10 +1,4 @@ import { SlashCommandBuilder } from 'discord.js'; -import sumStats from '../LEGACY_core/blitz/sumStats'; -import { tankopedia } from '../LEGACY_core/blitz/tankopedia'; -import getDiffedTankStats from '../LEGACY_core/blitzstars/getDiffedTankStats'; -import getPeriodNow from '../LEGACY_core/blitzstars/getPeriodNow'; -import getTimeDaysAgo from '../LEGACY_core/blitzstars/getTimeDaysAgo'; -import { tankAverages } from '../LEGACY_core/blitzstars/tankAverages'; import addUsernameChoices from '../LEGACY_core/discord/addUsernameChoices'; import embedNegative from '../LEGACY_core/discord/embedNegative'; import embedPositive from '../LEGACY_core/discord/embedPositive'; @@ -13,7 +7,13 @@ import markdownTable, { } from '../LEGACY_core/discord/markdownTable'; import resolvePlayerFromCommand from '../LEGACY_core/discord/resolvePlayerFromCommand'; import { getAccountInfo } from '../core/blitz/getAccountInfo'; +import getPeriodNow from '../core/blitzkrieg/getPeriodNow'; +import getTimeDaysAgo from '../core/blitzkrieg/getTimeDaysAgo'; +import getStatsInPeriod from '../core/blitzstars/getStatsInPeriod'; +import { tankAverages } from '../core/blitzstars/tankAverages'; +import { tankopedia } from '../core/blitzstars/tankopedia'; import calculateWN8 from '../core/statistics/calculateWN8'; +import sumStats from '../core/statistics/sumStats'; import { CommandRegistry } from '../events/interactionCreate'; import { PossiblyPromise } from '../types/possiblyPromise'; @@ -56,7 +56,7 @@ export const eligibleCommand: CommandRegistry = { let body = ''; if (clan === 'SKLLD') { - const { diff: diffed } = await getDiffedTankStats( + const { diff: diffed } = await getStatsInPeriod( region, id, getTimeDaysAgo(region, 30), diff --git a/src/commands/evolution.tsx b/src/commands/evolution.tsx index 6be79726b..5eca9c17e 100644 --- a/src/commands/evolution.tsx +++ b/src/commands/evolution.tsx @@ -2,10 +2,6 @@ import { SlashCommandBuilder, SlashCommandSubcommandGroupBuilder, } from 'discord.js'; -import resolveTankId from '../LEGACY_core/blitz/resolveTankId'; -import { getBlitzStarsLinkButton } from '../LEGACY_core/blitzstars/getBlitzStarsLinkButton'; -import getPlayerHistories from '../LEGACY_core/blitzstars/getPlayerHistories'; -import getTankHistories from '../LEGACY_core/blitzstars/getTankHistories'; import addPeriodSubCommands from '../LEGACY_core/discord/addPeriodSubCommands'; import addTankChoices from '../LEGACY_core/discord/addTankChoices'; import addUsernameChoices from '../LEGACY_core/discord/addUsernameChoices'; @@ -28,7 +24,11 @@ import TitleBar from '../components/TitleBar'; import Wrapper from '../components/Wrapper'; import { getAccountInfo } from '../core/blitz/getAccountInfo'; import { getClanAccountInfo } from '../core/blitz/getClanAccountInfo'; +import resolveTankId from '../core/blitz/resolveTankId'; import { emblemIdToURL } from '../core/blitzkrieg/emblemIdToURL'; +import getTankHistories from '../core/blitzkrieg/getTankHistories'; +import { getBlitzStarsLinkButton } from '../core/blitzstars/getBlitzStarsLinkButton'; +import getPlayerHistories from '../core/blitzstars/getPlayerHistories'; import { CommandRegistryRaw } from '../events/interactionCreate'; type EvolutionStatType = 'player' | 'tank'; diff --git a/src/commands/fullStats.tsx b/src/commands/fullStats.tsx index ef6b0bbe0..a63652d44 100644 --- a/src/commands/fullStats.tsx +++ b/src/commands/fullStats.tsx @@ -1,8 +1,4 @@ import { SlashCommandBuilder } from 'discord.js'; -import { filtersToDescription } from '../LEGACY_core/blitzkrieg/filtersToDescription'; -import { getTierWeights } from '../LEGACY_core/blitzkrieg/getTierWeights'; -import { getBlitzStarsLinkButton } from '../LEGACY_core/blitzstars/getBlitzStarsLinkButton'; -import getDiffedTankStats from '../LEGACY_core/blitzstars/getDiffedTankStats'; import addStatTypeSubCommands from '../LEGACY_core/discord/addStatTypeSubCommands'; import addUsernameChoices from '../LEGACY_core/discord/addUsernameChoices'; import autocompleteTanks from '../LEGACY_core/discord/autocompleteTanks'; @@ -28,7 +24,11 @@ import Wrapper from '../components/Wrapper'; import { getAccountInfo } from '../core/blitz/getAccountInfo'; import { getClanAccountInfo } from '../core/blitz/getClanAccountInfo'; import { emblemIdToURL } from '../core/blitzkrieg/emblemIdToURL'; +import { filtersToDescription } from '../core/blitzkrieg/filtersToDescription'; +import { getBlitzStarsLinkButton } from '../core/blitzstars/getBlitzStarsLinkButton'; +import getStatsInPeriod from '../core/blitzstars/getStatsInPeriod'; import { StatFilters, filterStats } from '../core/statistics/filterStats'; +import { getTierWeights } from '../core/statistics/getTierWeights'; import { CommandRegistryRaw } from '../events/interactionCreate'; async function render( @@ -39,7 +39,7 @@ async function render( const { nickname } = await getAccountInfo(region, id); const clan = (await getClanAccountInfo(region, id))?.clan; const clanImage = clan ? emblemIdToURL(clan.emblem_set_id) : undefined; - const diffedTankStats = await getDiffedTankStats(region, id, start, end); + const diffedTankStats = await getStatsInPeriod(region, id, start, end); const { stats, supplementary, filteredOrder } = await filterStats( diffedTankStats, filters, diff --git a/src/commands/ownedTanks.tsx b/src/commands/ownedTanks.tsx index f10185ae5..8af307d76 100644 --- a/src/commands/ownedTanks.tsx +++ b/src/commands/ownedTanks.tsx @@ -1,12 +1,4 @@ import { SlashCommandBuilder } from 'discord.js'; -import resolveTankName from '../LEGACY_core/blitz/resolveTankName'; -import { - TIER_ROMAN_NUMERALS, - TankopediaEntry, - Tier, - tankopedia, - tankopediaInfo, -} from '../LEGACY_core/blitz/tankopedia'; import addTierChoices from '../LEGACY_core/discord/addTierChoices'; import addUsernameChoices from '../LEGACY_core/discord/addUsernameChoices'; import autocompleteUsername from '../LEGACY_core/discord/autocompleteUsername'; @@ -19,7 +11,15 @@ import { getAccountInfo } from '../core/blitz/getAccountInfo'; import { getClanAccountInfo } from '../core/blitz/getClanAccountInfo'; import getTankStats from '../core/blitz/getTankStats'; import getTreeType from '../core/blitz/getTreeType'; +import resolveTankName from '../core/blitz/resolveTankName'; import { emblemIdToURL } from '../core/blitzkrieg/emblemIdToURL'; +import { + TIER_ROMAN_NUMERALS, + TankopediaEntry, + Tier, + tankopedia, + tankopediaInfo, +} from '../core/blitzstars/tankopedia'; import { CommandRegistry } from '../events/interactionCreate'; export const ownedTanksCommand: CommandRegistry = { diff --git a/src/commands/searchTanks.ts b/src/commands/searchTanks.ts index 5b4e3b445..c57dc1c7b 100644 --- a/src/commands/searchTanks.ts +++ b/src/commands/searchTanks.ts @@ -1,9 +1,9 @@ import { SlashCommandBuilder } from 'discord.js'; import { go } from 'fuzzysort'; import markdownEscape from 'markdown-escape'; -import { TANK_NAMES_DIACRITICS } from '../LEGACY_core/blitz/tankopedia'; import addTankChoices from '../LEGACY_core/discord/addTankChoices'; import embedInfo from '../LEGACY_core/discord/embedInfo'; +import { TANK_NAMES_DIACRITICS } from '../core/blitzstars/tankopedia'; import { CommandRegistry } from '../events/interactionCreate'; export const searchTanksCommand: CommandRegistry = { diff --git a/src/commands/stats.tsx b/src/commands/stats.tsx index 316060ab1..548f14495 100644 --- a/src/commands/stats.tsx +++ b/src/commands/stats.tsx @@ -1,7 +1,4 @@ import { SlashCommandBuilder } from 'discord.js'; -import { filtersToDescription } from '../LEGACY_core/blitzkrieg/filtersToDescription'; -import { getBlitzStarsLinkButton } from '../LEGACY_core/blitzstars/getBlitzStarsLinkButton'; -import getDiffedTankStats from '../LEGACY_core/blitzstars/getDiffedTankStats'; import addStatTypeSubCommands from '../LEGACY_core/discord/addStatTypeSubCommands'; import addUsernameChoices from '../LEGACY_core/discord/addUsernameChoices'; import autocompleteTanks from '../LEGACY_core/discord/autocompleteTanks'; @@ -26,6 +23,9 @@ import Wrapper from '../components/Wrapper'; import { getAccountInfo } from '../core/blitz/getAccountInfo'; import { getClanAccountInfo } from '../core/blitz/getClanAccountInfo'; import { emblemIdToURL } from '../core/blitzkrieg/emblemIdToURL'; +import { filtersToDescription } from '../core/blitzkrieg/filtersToDescription'; +import { getBlitzStarsLinkButton } from '../core/blitzstars/getBlitzStarsLinkButton'; +import getStatsInPeriod from '../core/blitzstars/getStatsInPeriod'; import { StatFilters, filterStats } from '../core/statistics/filterStats'; import { CommandRegistryRaw } from '../events/interactionCreate'; @@ -37,7 +37,7 @@ async function render( const { nickname } = await getAccountInfo(region, id); const clan = (await getClanAccountInfo(region, id))?.clan; const clanImage = clan ? emblemIdToURL(clan.emblem_set_id) : undefined; - const diffedTankStats = await getDiffedTankStats(region, id, start, end); + const diffedTankStats = await getStatsInPeriod(region, id, start, end); const { stats, supplementary } = await filterStats(diffedTankStats, filters); const filterDescriptions = await filtersToDescription(filters); diff --git a/src/components/Tanks/components/Item.tsx b/src/components/Tanks/components/Item.tsx index d08459b17..f36138203 100644 --- a/src/components/Tanks/components/Item.tsx +++ b/src/components/Tanks/components/Item.tsx @@ -2,7 +2,7 @@ import { TANK_ICONS, TANK_ICONS_COLLECTOR, TANK_ICONS_PREMIUM, -} from '../../../LEGACY_core/blitz/tankopedia'; +} from '../../../core/blitzstars/tankopedia'; import { theme } from '../../../stitches.config'; export enum TreeTypeEnum { diff --git a/src/components/TierWeights.tsx b/src/components/TierWeights.tsx index 38613b7cf..61951cb41 100644 --- a/src/components/TierWeights.tsx +++ b/src/components/TierWeights.tsx @@ -1,4 +1,4 @@ -import { Tier } from '../LEGACY_core/blitz/tankopedia'; +import { Tier } from '../core/blitzstars/tankopedia'; import { theme } from '../stitches.config'; export type TierWeightsRecord = Partial>; diff --git a/src/core/blitz/getTreeType.ts b/src/core/blitz/getTreeType.ts index 8f7a8ff32..01db48e26 100644 --- a/src/core/blitz/getTreeType.ts +++ b/src/core/blitz/getTreeType.ts @@ -1,5 +1,5 @@ import { TreeTypeEnum } from '../../components/Tanks'; -import { tankopedia } from '../../LEGACY_core/blitz/tankopedia'; +import { tankopedia } from '../blitzstars/tankopedia'; export default async function getTreeType(id: number) { const entry = (await tankopedia)[id]; diff --git a/src/LEGACY_core/blitz/resolveTankId.ts b/src/core/blitz/resolveTankId.ts similarity index 85% rename from src/LEGACY_core/blitz/resolveTankId.ts rename to src/core/blitz/resolveTankId.ts index 876c4aa0f..7b3a10ce4 100644 --- a/src/LEGACY_core/blitz/resolveTankId.ts +++ b/src/core/blitz/resolveTankId.ts @@ -1,6 +1,6 @@ import { go } from 'fuzzysort'; -import throwError from '../node/throwError'; -import { TANKS, tankopedia } from './tankopedia'; +import throwError from '../../LEGACY_core/node/throwError'; +import { TANKS, tankopedia } from '../blitzstars/tankopedia'; export default async function resolveTankId(tank: string | number) { const number = typeof tank === 'string' ? parseInt(tank) : tank; diff --git a/src/LEGACY_core/blitz/resolveTankName.ts b/src/core/blitz/resolveTankName.ts similarity index 78% rename from src/LEGACY_core/blitz/resolveTankName.ts rename to src/core/blitz/resolveTankName.ts index 6d3d38a8d..7954de496 100644 --- a/src/LEGACY_core/blitz/resolveTankName.ts +++ b/src/core/blitz/resolveTankName.ts @@ -1,4 +1,4 @@ -import { tankopedia } from './tankopedia'; +import { tankopedia } from '../blitzstars/tankopedia'; export default async function resolveTankName(tankId: number) { const tankopediaName = (await tankopedia)[tankId]?.name; diff --git a/src/LEGACY_core/blitzkrieg/context.ts b/src/core/blitzkrieg/context.ts similarity index 100% rename from src/LEGACY_core/blitzkrieg/context.ts rename to src/core/blitzkrieg/context.ts diff --git a/src/LEGACY_core/blitzkrieg/filtersToDescription.ts b/src/core/blitzkrieg/filtersToDescription.ts similarity index 82% rename from src/LEGACY_core/blitzkrieg/filtersToDescription.ts rename to src/core/blitzkrieg/filtersToDescription.ts index ef49cdf62..85d79c20d 100644 --- a/src/LEGACY_core/blitzkrieg/filtersToDescription.ts +++ b/src/core/blitzkrieg/filtersToDescription.ts @@ -1,7 +1,11 @@ import { TREE_TYPE_NAMES } from '../../components/Tanks'; -import { StatFilters } from '../../core/statistics/filterStats'; import resolveTankName from '../blitz/resolveTankName'; -import { TIER_ROMAN_NUMERALS, Tier, tankopediaInfo } from '../blitz/tankopedia'; +import { + TIER_ROMAN_NUMERALS, + Tier, + tankopediaInfo, +} from '../blitzstars/tankopedia'; +import { StatFilters } from '../statistics/filterStats'; export async function filtersToDescription({ nation, diff --git a/src/LEGACY_core/blitzstars/getPeriodNow.ts b/src/core/blitzkrieg/getPeriodNow.ts similarity index 100% rename from src/LEGACY_core/blitzstars/getPeriodNow.ts rename to src/core/blitzkrieg/getPeriodNow.ts diff --git a/src/LEGACY_core/blitzstars/getPeriodStart.ts b/src/core/blitzkrieg/getPeriodStart.ts similarity index 80% rename from src/LEGACY_core/blitzstars/getPeriodStart.ts rename to src/core/blitzkrieg/getPeriodStart.ts index b60c19307..a4ccffcfe 100644 --- a/src/LEGACY_core/blitzstars/getPeriodStart.ts +++ b/src/core/blitzkrieg/getPeriodStart.ts @@ -1,5 +1,5 @@ +import { PeriodSize } from '../../LEGACY_core/discord/addPeriodSubCommands'; import { Region } from '../../constants/regions'; -import { PeriodSize } from '../discord/addPeriodSubCommands'; import getTimeDaysAgo from './getTimeDaysAgo'; export default function getPeriodStart(region: Region, period: PeriodSize) { diff --git a/src/LEGACY_core/blitzstars/getTankHistories.ts b/src/core/blitzkrieg/getTankHistories.ts similarity index 96% rename from src/LEGACY_core/blitzstars/getTankHistories.ts rename to src/core/blitzkrieg/getTankHistories.ts index 2a210b0ae..8ee89de4d 100644 --- a/src/LEGACY_core/blitzstars/getTankHistories.ts +++ b/src/core/blitzkrieg/getTankHistories.ts @@ -1,12 +1,12 @@ import { Region } from '../../constants/regions'; -import getTankStats from '../../core/blitz/getTankStats'; import { GetHistoriesOptions, Histories, History, getHistoriesDefaultOptions, } from '../../types/histories'; -import { emptyAllStats } from './getDiffedTankStats'; +import getTankStats from '../blitz/getTankStats'; +import { emptyAllStats } from '../blitzstars/getStatsInPeriod'; export interface TankHistory extends History { tank_id: number; diff --git a/src/LEGACY_core/blitzstars/getTimeDaysAgo.ts b/src/core/blitzkrieg/getTimeDaysAgo.ts similarity index 100% rename from src/LEGACY_core/blitzstars/getTimeDaysAgo.ts rename to src/core/blitzkrieg/getTimeDaysAgo.ts diff --git a/src/LEGACY_core/blitzstars/getBlitzStarsLinkButton.ts b/src/core/blitzstars/getBlitzStarsLinkButton.ts similarity index 75% rename from src/LEGACY_core/blitzstars/getBlitzStarsLinkButton.ts rename to src/core/blitzstars/getBlitzStarsLinkButton.ts index c603dd8a1..049ff8d1d 100644 --- a/src/LEGACY_core/blitzstars/getBlitzStarsLinkButton.ts +++ b/src/core/blitzstars/getBlitzStarsLinkButton.ts @@ -1,6 +1,6 @@ +import linkButton from '../../LEGACY_core/discord/linkButton'; import { Region } from '../../constants/regions'; -import { getAccountInfo } from '../../core/blitz/getAccountInfo'; -import linkButton from '../discord/linkButton'; +import { getAccountInfo } from '../blitz/getAccountInfo'; export async function getBlitzStarsLinkButton( region: Region, diff --git a/src/LEGACY_core/blitzstars/getPlayerHistories.ts b/src/core/blitzstars/getPlayerHistories.ts similarity index 90% rename from src/LEGACY_core/blitzstars/getPlayerHistories.ts rename to src/core/blitzstars/getPlayerHistories.ts index c17d22f8e..b64bcc617 100644 --- a/src/LEGACY_core/blitzstars/getPlayerHistories.ts +++ b/src/core/blitzstars/getPlayerHistories.ts @@ -1,13 +1,13 @@ import { Region } from '../../constants/regions'; -import { getAccountInfo } from '../../core/blitz/getAccountInfo'; -import { PlayerStats } from '../../core/blitzstars/getPlayerStats'; import { GetHistoriesOptions, Histories, History, getHistoriesDefaultOptions, } from '../../types/histories'; -import { emptyAllStats } from './getDiffedTankStats'; +import { getAccountInfo } from '../blitz/getAccountInfo'; +import { PlayerStats } from './getPlayerStats'; +import { emptyAllStats } from './getStatsInPeriod'; export default async function getPlayerHistories( server: Region, diff --git a/src/LEGACY_core/blitzstars/getDiffedTankStats.ts b/src/core/blitzstars/getStatsInPeriod.ts similarity index 96% rename from src/LEGACY_core/blitzstars/getDiffedTankStats.ts rename to src/core/blitzstars/getStatsInPeriod.ts index 68027d79b..0a703ff07 100644 --- a/src/LEGACY_core/blitzstars/getDiffedTankStats.ts +++ b/src/core/blitzstars/getStatsInPeriod.ts @@ -1,9 +1,9 @@ import { Region } from '../../constants/regions'; -import { AllStats } from '../../core/blitz/getAccountInfo'; +import { AllStats } from '../blitz/getAccountInfo'; import getTankHistories, { TankHistories, TankHistoryRaw, -} from './getTankHistories'; +} from '../blitzkrieg/getTankHistories'; export const emptyAllStats: AllStats = { battles: 0, @@ -40,7 +40,7 @@ export interface DiffedTankStats { } // BIG TODO: merge this neatly with diffNormalizedTankStats -export default async function getDiffedTankStats( +export default async function getStatsInPeriod( server: Region, id: number, start: number, diff --git a/src/LEGACY_core/blitzstars/tankAverages.ts b/src/core/blitzstars/tankAverages.ts similarity index 95% rename from src/LEGACY_core/blitzstars/tankAverages.ts rename to src/core/blitzstars/tankAverages.ts index cd86c1236..6bcf55c17 100644 --- a/src/LEGACY_core/blitzstars/tankAverages.ts +++ b/src/core/blitzstars/tankAverages.ts @@ -1,5 +1,6 @@ -import { AllStats } from '../../core/blitz/getAccountInfo'; +import { AllStats } from '../blitz/getAccountInfo'; import { context } from '../blitzkrieg/context'; +import { tankopedia } from './tankopedia'; export interface SpecialStats { winrate: number; @@ -79,6 +80,8 @@ export interface IndividualTankAverage { last_update: number; } +tankopedia; + export type TankAverages = Record; console.log('Caching tank averages...'); diff --git a/src/LEGACY_core/blitz/tankopedia.ts b/src/core/blitzstars/tankopedia.ts similarity index 98% rename from src/LEGACY_core/blitz/tankopedia.ts rename to src/core/blitzstars/tankopedia.ts index 16e33672f..23d816f22 100644 --- a/src/LEGACY_core/blitz/tankopedia.ts +++ b/src/core/blitzstars/tankopedia.ts @@ -1,7 +1,7 @@ import { deburr } from 'lodash'; import { TreeTypeString } from '../../components/Tanks'; import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; -import fetchBlitz from '../../core/blitz/fetchWargaming'; +import fetchBlitz from '../blitz/fetchWargaming'; import { context } from '../blitzkrieg/context'; export interface TankopediaEntry { diff --git a/src/core/statistics/filterStats.ts b/src/core/statistics/filterStats.ts index 78413ee2d..a0b3ecc55 100644 --- a/src/core/statistics/filterStats.ts +++ b/src/core/statistics/filterStats.ts @@ -1,9 +1,9 @@ import { TreeTypeString } from '../../components/Tanks'; -import sumStats from '../../LEGACY_core/blitz/sumStats'; -import { tankopedia } from '../../LEGACY_core/blitz/tankopedia'; -import { DiffedTankStats } from '../../LEGACY_core/blitzstars/getDiffedTankStats'; -import { tankAverages } from '../../LEGACY_core/blitzstars/tankAverages'; +import { DiffedTankStats } from '../blitzstars/getStatsInPeriod'; +import { tankAverages } from '../blitzstars/tankAverages'; +import { tankopedia } from '../blitzstars/tankopedia'; import calculateWN8 from './calculateWN8'; +import sumStats from './sumStats'; export interface StatFilters { nation?: string; diff --git a/src/LEGACY_core/blitzkrieg/getTierWeights.ts b/src/core/statistics/getTierWeights.ts similarity index 82% rename from src/LEGACY_core/blitzkrieg/getTierWeights.ts rename to src/core/statistics/getTierWeights.ts index 7f88ab7a1..a31dde982 100644 --- a/src/LEGACY_core/blitzkrieg/getTierWeights.ts +++ b/src/core/statistics/getTierWeights.ts @@ -1,6 +1,6 @@ import { TierWeightsRecord } from '../../components/TierWeights'; -import { AllStats } from '../../core/blitz/getAccountInfo'; -import { tankopedia } from '../blitz/tankopedia'; +import { AllStats } from '../blitz/getAccountInfo'; +import { tankopedia } from '../blitzstars/tankopedia'; export async function getTierWeights( stats: Record, diff --git a/src/LEGACY_core/blitz/sumStats.ts b/src/core/statistics/sumStats.ts similarity index 90% rename from src/LEGACY_core/blitz/sumStats.ts rename to src/core/statistics/sumStats.ts index e2de6e3ab..10c692c0b 100644 --- a/src/LEGACY_core/blitz/sumStats.ts +++ b/src/core/statistics/sumStats.ts @@ -1,5 +1,5 @@ -import { AllStats } from '../../core/blitz/getAccountInfo'; -import { emptyAllStats } from '../blitzstars/getDiffedTankStats'; +import { AllStats } from '../blitz/getAccountInfo'; +import { emptyAllStats } from '../blitzstars/getStatsInPeriod'; export default function sumStats(allStatsCollection: AllStats[]) { return allStatsCollection.reduce((accumulated, current) => { diff --git a/src/renderers/today.tsx b/src/renderers/today.tsx index cfc6f38cc..6f0710599 100644 --- a/src/renderers/today.tsx +++ b/src/renderers/today.tsx @@ -1,10 +1,3 @@ -import resolveTankName from '../LEGACY_core/blitz/resolveTankName'; -import sumStats from '../LEGACY_core/blitz/sumStats'; -import { tankopedia } from '../LEGACY_core/blitz/tankopedia'; -import getDiffedTankStats from '../LEGACY_core/blitzstars/getDiffedTankStats'; -import getPeriodNow from '../LEGACY_core/blitzstars/getPeriodNow'; -import getTimeDaysAgo from '../LEGACY_core/blitzstars/getTimeDaysAgo'; -import { tankAverages } from '../LEGACY_core/blitzstars/tankAverages'; import { ResolvedPlayer } from '../LEGACY_core/discord/resolvePlayerFromCommand'; import * as Breakdown from '../components/Breakdown'; import NoData, { NoDataType } from '../components/NoData'; @@ -14,8 +7,15 @@ import { AllStats, getAccountInfo } from '../core/blitz/getAccountInfo'; import { getClanAccountInfo } from '../core/blitz/getClanAccountInfo'; import getTankStats from '../core/blitz/getTankStats'; import getTreeType from '../core/blitz/getTreeType'; +import resolveTankName from '../core/blitz/resolveTankName'; +import getPeriodNow from '../core/blitzkrieg/getPeriodNow'; +import getTimeDaysAgo from '../core/blitzkrieg/getTimeDaysAgo'; +import getStatsInPeriod from '../core/blitzstars/getStatsInPeriod'; +import { tankAverages } from '../core/blitzstars/tankAverages'; +import { tankopedia } from '../core/blitzstars/tankopedia'; import calculateWN8 from '../core/statistics/calculateWN8'; import getWN8Percentile from '../core/statistics/getWN8Percentile'; +import sumStats from '../core/statistics/sumStats'; import { PossiblyPromise } from '../types/possiblyPromise'; export default async function today( @@ -25,7 +25,7 @@ export default async function today( showTotal = true, naked?: boolean, ) { - const { diff: diffed, order } = await getDiffedTankStats( + const { diff: diffed, order } = await getStatsInPeriod( server, id, getTimeDaysAgo(server, 1), From 4f3e86836763c20945a6aa1bd45c14e116fd36c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sat, 14 Oct 2023 11:28:41 -0500 Subject: [PATCH 25/43] feat: added mightnight leaderboard cache --- .../discord/resolvePlayerFromCommand.ts | 2 +- src/LEGACY_core/node/processes.ts | 2 +- src/commands/link.tsx | 2 +- src/commands/ratings.tsx | 6 +++--- .../blitzkrieg}/discordBlitz.ts | 0 src/core/blitzkrieg/getArchivedRatingsInfo.ts | 6 +++--- .../blitzkrieg}/getMidnightLeaderboard.ts | 20 +++++++++++++++++-- 7 files changed, 27 insertions(+), 11 deletions(-) rename src/{LEGACY_core/cockroackdb => core/blitzkrieg}/discordBlitz.ts (100%) rename src/{LEGACY_core/database => core/blitzkrieg}/getMidnightLeaderboard.ts (60%) diff --git a/src/LEGACY_core/discord/resolvePlayerFromCommand.ts b/src/LEGACY_core/discord/resolvePlayerFromCommand.ts index f00cde535..b28d3cd8f 100644 --- a/src/LEGACY_core/discord/resolvePlayerFromCommand.ts +++ b/src/LEGACY_core/discord/resolvePlayerFromCommand.ts @@ -2,7 +2,7 @@ import { CacheType, ChatInputCommandInteraction } from 'discord.js'; import markdownEscape from 'markdown-escape'; import { Region } from '../../constants/regions'; import searchPlayersAcrossRegions from '../../core/blitz/searchPlayersAcrossRegions'; -import { getBlitzFromDiscord } from '../cockroackdb/discordBlitz'; +import { getBlitzFromDiscord } from '../../core/blitzkrieg/discordBlitz'; import throwError from '../node/throwError'; export const serverAndIdPattern = /(com|eu|asia)\/[0-9]+/; diff --git a/src/LEGACY_core/node/processes.ts b/src/LEGACY_core/node/processes.ts index f7fee3548..dcd851a55 100644 --- a/src/LEGACY_core/node/processes.ts +++ b/src/LEGACY_core/node/processes.ts @@ -1,4 +1,4 @@ -import { discordBlitzDB } from '../cockroackdb/discordBlitz'; +import { discordBlitzDB } from '../../core/blitzkrieg/discordBlitz'; import { client } from '../discord/client'; const EXIT_EVENTS = [ diff --git a/src/commands/link.tsx b/src/commands/link.tsx index bcf82df3a..dd99f34cc 100644 --- a/src/commands/link.tsx +++ b/src/commands/link.tsx @@ -6,7 +6,6 @@ import { } from 'discord.js'; import markdownEscape from 'markdown-escape'; import discord from '../../discord.json' assert { type: 'json' }; -import { linkBlitzAndDiscord } from '../LEGACY_core/cockroackdb/discordBlitz'; import addUsernameChoices from '../LEGACY_core/discord/addUsernameChoices'; import autocompleteUsername from '../LEGACY_core/discord/autocompleteUsername'; import embedNegative from '../LEGACY_core/discord/embedNegative'; @@ -15,6 +14,7 @@ import Wrapper from '../components/Wrapper'; import { REGION_NAMES_SHORT, Region } from '../constants/regions'; import { getAccountInfo } from '../core/blitz/getAccountInfo'; import { getClanAccountInfo } from '../core/blitz/getClanAccountInfo'; +import { linkBlitzAndDiscord } from '../core/blitzkrieg/discordBlitz'; import { CommandRegistry } from '../events/interactionCreate'; import { theme } from '../stitches.config'; diff --git a/src/commands/ratings.tsx b/src/commands/ratings.tsx index 693105e45..3f8dbbc2c 100644 --- a/src/commands/ratings.tsx +++ b/src/commands/ratings.tsx @@ -5,9 +5,6 @@ import { SlashCommandSubcommandGroupBuilder, } from 'discord.js'; import { BlitzkriegRatingsLeaderboard } from '../../scripts/buildRatingsLeaderboard'; -import getMidnightLeaderboard, { - DATABASE_REPO, -} from '../LEGACY_core/database/getMidnightLeaderboard'; import addRegionChoices from '../LEGACY_core/discord/addRegionChoices'; import addUsernameChoices from '../LEGACY_core/discord/addUsernameChoices'; import autocompleteUsername from '../LEGACY_core/discord/autocompleteUsername'; @@ -24,6 +21,9 @@ import { getClanAccountInfo } from '../core/blitz/getClanAccountInfo'; import getRatingsInfo from '../core/blitz/getRatingsInfo'; import regionToRegionSubdomain from '../core/blitz/regionToRegionSubdomain'; import getArchivedRatingsInfo from '../core/blitzkrieg/getArchivedRatingsInfo'; +import getMidnightLeaderboard, { + DATABASE_REPO, +} from '../core/blitzkrieg/getMidnightLeaderboard'; import { CommandRegistryRaw } from '../events/interactionCreate'; export interface RatingsPlayer { diff --git a/src/LEGACY_core/cockroackdb/discordBlitz.ts b/src/core/blitzkrieg/discordBlitz.ts similarity index 100% rename from src/LEGACY_core/cockroackdb/discordBlitz.ts rename to src/core/blitzkrieg/discordBlitz.ts diff --git a/src/core/blitzkrieg/getArchivedRatingsInfo.ts b/src/core/blitzkrieg/getArchivedRatingsInfo.ts index 7141cb93d..49533e048 100644 --- a/src/core/blitzkrieg/getArchivedRatingsInfo.ts +++ b/src/core/blitzkrieg/getArchivedRatingsInfo.ts @@ -1,8 +1,8 @@ -import { RatingsInfo } from '../../commands/ratings'; -import { Region } from '../../constants/regions'; -import { DATABASE_REPO } from '../../LEGACY_core/database/getMidnightLeaderboard'; import { octokit } from '../../LEGACY_core/github/octokit'; import throwError from '../../LEGACY_core/node/throwError'; +import { RatingsInfo } from '../../commands/ratings'; +import { Region } from '../../constants/regions'; +import { DATABASE_REPO } from './getMidnightLeaderboard'; const ARCHIVED_RATINGS_CACHE: Record< Region, diff --git a/src/LEGACY_core/database/getMidnightLeaderboard.ts b/src/core/blitzkrieg/getMidnightLeaderboard.ts similarity index 60% rename from src/LEGACY_core/database/getMidnightLeaderboard.ts rename to src/core/blitzkrieg/getMidnightLeaderboard.ts index b318299e2..257033227 100644 --- a/src/LEGACY_core/database/getMidnightLeaderboard.ts +++ b/src/core/blitzkrieg/getMidnightLeaderboard.ts @@ -1,13 +1,26 @@ import { BlitzkriegRatingsLeaderboard } from '../../../scripts/buildRatingsLeaderboard'; import { Region } from '../../constants/regions'; -import { octokit } from '../github/octokit'; +import { octokit } from '../../LEGACY_core/github/octokit'; export const DATABASE_REPO = { owner: 'tresabhi', repo: 'blitzkrieg-db' }; +const MIDNIGHT_LEADERBOARD_CACHE: Record< + Region, + Record +> = { + com: {}, + eu: {}, + asia: {}, +}; + export default async function getMidnightLeaderboard( region: Region, season: number, ) { + if (MIDNIGHT_LEADERBOARD_CACHE[region][season]) { + return MIDNIGHT_LEADERBOARD_CACHE[region][season]; + } + try { const { data } = await octokit.repos.getContent({ ...DATABASE_REPO, @@ -16,8 +29,11 @@ export default async function getMidnightLeaderboard( if (!Array.isArray(data) && data.type === 'file') { const response = await fetch(data.download_url!); + const json = (await response.json()) as BlitzkriegRatingsLeaderboard; - return (await response.json()) as BlitzkriegRatingsLeaderboard; + MIDNIGHT_LEADERBOARD_CACHE[region][season] = json; + + return json; } } catch (error) { console.warn( From d726005c38ef66855f30a25c13cbf8094ef2d97e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sat, 14 Oct 2023 11:32:02 -0500 Subject: [PATCH 26/43] feat: core chunk 6 --- .../discord/resolvePeriodFromButton.ts | 2 +- .../discord/resolvePeriodFromCommand.ts | 5 ++++- src/LEGACY_core/node/processes.ts | 2 +- src/bot.ts | 2 +- src/commands/debug.ts | 4 ++-- src/commands/eligible.ts | 6 +++--- src/commands/evolution.tsx | 16 +++++++-------- src/commands/fullStats.tsx | 20 +++++++++---------- src/commands/inactive.tsx | 4 ++-- src/commands/link.tsx | 6 +++--- src/commands/ownedTanks.tsx | 6 +++--- src/commands/playerAchievements.ts | 6 +++--- src/commands/playerInfo.ts | 6 +++--- src/commands/ratings.tsx | 8 ++++---- src/commands/searchClans.ts | 6 +++--- src/commands/searchPlayers.ts | 6 +++--- src/commands/searchTanks.ts | 4 ++-- src/commands/stats.tsx | 20 +++++++++---------- src/commands/today.tsx | 8 ++++---- src/core/blitzkrieg/getPeriodStart.ts | 2 +- .../discord/addClanChoices.ts | 0 .../discord/addFilterOptions.ts} | 4 ++-- .../discord/addPeriodSubCommands.ts | 0 .../discord/addRegionChoices.ts | 0 .../discord/addTankChoices.ts | 0 .../discord/addTierChoices.ts | 2 +- .../discord/addUsernameChoices.ts | 0 .../discord/autocompleteClan.ts | 2 +- .../discord/autocompleteTanks.ts | 2 +- .../discord/autocompleteUsername.ts | 2 +- src/{LEGACY_core => core}/discord/client.ts | 0 .../discord/commandToURL.ts} | 2 +- .../discord/embedInfo.ts | 0 .../discord/embedNegative.ts | 0 .../discord/embedPositive.ts | 0 .../discord/embedWarning.ts | 0 .../discord/getCustomPeriodParams.ts | 0 .../discord/getFiltersFromButton.ts | 2 +- .../discord/getFiltersFromCommand.ts | 4 ++-- .../handlers/chatInputCommand.ts | 4 ++-- 40 files changed, 83 insertions(+), 80 deletions(-) rename src/{LEGACY_core => core}/discord/addClanChoices.ts (100%) rename src/{LEGACY_core/discord/addStatTypeSubCommands.ts => core/discord/addFilterOptions.ts} (94%) rename src/{LEGACY_core => core}/discord/addPeriodSubCommands.ts (100%) rename src/{LEGACY_core => core}/discord/addRegionChoices.ts (100%) rename src/{LEGACY_core => core}/discord/addTankChoices.ts (100%) rename src/{LEGACY_core => core}/discord/addTierChoices.ts (85%) rename src/{LEGACY_core => core}/discord/addUsernameChoices.ts (100%) rename src/{LEGACY_core => core}/discord/autocompleteClan.ts (91%) rename src/{LEGACY_core => core}/discord/autocompleteTanks.ts (91%) rename src/{LEGACY_core => core}/discord/autocompleteUsername.ts (90%) rename src/{LEGACY_core => core}/discord/client.ts (100%) rename src/{LEGACY_core/discord/interactionToURL.ts => core/discord/commandToURL.ts} (94%) rename src/{LEGACY_core => core}/discord/embedInfo.ts (100%) rename src/{LEGACY_core => core}/discord/embedNegative.ts (100%) rename src/{LEGACY_core => core}/discord/embedPositive.ts (100%) rename src/{LEGACY_core => core}/discord/embedWarning.ts (100%) rename src/{LEGACY_core => core}/discord/getCustomPeriodParams.ts (100%) rename src/{LEGACY_core => core}/discord/getFiltersFromButton.ts (90%) rename src/{LEGACY_core => core}/discord/getFiltersFromCommand.ts (85%) diff --git a/src/LEGACY_core/discord/resolvePeriodFromButton.ts b/src/LEGACY_core/discord/resolvePeriodFromButton.ts index 7e1ee2be8..9c6ecd833 100644 --- a/src/LEGACY_core/discord/resolvePeriodFromButton.ts +++ b/src/LEGACY_core/discord/resolvePeriodFromButton.ts @@ -3,7 +3,7 @@ import { Region } from '../../constants/regions'; import getPeriodNow from '../../core/blitzkrieg/getPeriodNow'; import getPeriodStart from '../../core/blitzkrieg/getPeriodStart'; import getTimeDaysAgo from '../../core/blitzkrieg/getTimeDaysAgo'; -import { PeriodType } from './addPeriodSubCommands'; +import { PeriodType } from '../../core/discord/addPeriodSubCommands'; import { ResolvedPeriod, getPeriodOptionName, diff --git a/src/LEGACY_core/discord/resolvePeriodFromCommand.ts b/src/LEGACY_core/discord/resolvePeriodFromCommand.ts index 1ac6cfdc2..af5a081e2 100644 --- a/src/LEGACY_core/discord/resolvePeriodFromCommand.ts +++ b/src/LEGACY_core/discord/resolvePeriodFromCommand.ts @@ -3,7 +3,10 @@ import { Region } from '../../constants/regions'; import getPeriodNow from '../../core/blitzkrieg/getPeriodNow'; import getPeriodStart from '../../core/blitzkrieg/getPeriodStart'; import getTimeDaysAgo from '../../core/blitzkrieg/getTimeDaysAgo'; -import { PeriodSize, PeriodType } from '../discord/addPeriodSubCommands'; +import { + PeriodSize, + PeriodType, +} from '../../core/discord/addPeriodSubCommands'; export function getPeriodOptionName(period: PeriodSize) { if (period === 'career') return 'Career'; diff --git a/src/LEGACY_core/node/processes.ts b/src/LEGACY_core/node/processes.ts index dcd851a55..5fd37f005 100644 --- a/src/LEGACY_core/node/processes.ts +++ b/src/LEGACY_core/node/processes.ts @@ -1,5 +1,5 @@ import { discordBlitzDB } from '../../core/blitzkrieg/discordBlitz'; -import { client } from '../discord/client'; +import { client } from '../../core/discord/client'; const EXIT_EVENTS = [ 'beforeExit', diff --git a/src/bot.ts b/src/bot.ts index 5daff8a42..36c339a74 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -1,4 +1,4 @@ -import { client } from './LEGACY_core/discord/client'; +import { client } from './core/discord/client'; import { registerProcesses } from './LEGACY_core/node/processes'; import { secrets } from './LEGACY_core/node/secrets'; diff --git a/src/commands/debug.ts b/src/commands/debug.ts index 2cc139ac9..beb20d2de 100644 --- a/src/commands/debug.ts +++ b/src/commands/debug.ts @@ -1,11 +1,11 @@ import { SlashCommandBuilder } from 'discord.js'; import packageJSON from '../../package.json' assert { type: 'json' }; -import { client } from '../LEGACY_core/discord/client'; -import embedInfo from '../LEGACY_core/discord/embedInfo'; import markdownTable from '../LEGACY_core/discord/markdownTable'; import getClientId from '../LEGACY_core/node/getClientId'; import { tankAverages } from '../core/blitzstars/tankAverages'; import { tankopedia } from '../core/blitzstars/tankopedia'; +import { client } from '../core/discord/client'; +import embedInfo from '../core/discord/embedInfo'; import { CommandRegistry } from '../events/interactionCreate'; const executionStart = new Date().getTime(); diff --git a/src/commands/eligible.ts b/src/commands/eligible.ts index 9d9d0cea5..3844d9cbf 100644 --- a/src/commands/eligible.ts +++ b/src/commands/eligible.ts @@ -1,7 +1,4 @@ import { SlashCommandBuilder } from 'discord.js'; -import addUsernameChoices from '../LEGACY_core/discord/addUsernameChoices'; -import embedNegative from '../LEGACY_core/discord/embedNegative'; -import embedPositive from '../LEGACY_core/discord/embedPositive'; import markdownTable, { TableInput, } from '../LEGACY_core/discord/markdownTable'; @@ -12,6 +9,9 @@ import getTimeDaysAgo from '../core/blitzkrieg/getTimeDaysAgo'; import getStatsInPeriod from '../core/blitzstars/getStatsInPeriod'; import { tankAverages } from '../core/blitzstars/tankAverages'; import { tankopedia } from '../core/blitzstars/tankopedia'; +import addUsernameChoices from '../core/discord/addUsernameChoices'; +import embedNegative from '../core/discord/embedNegative'; +import embedPositive from '../core/discord/embedPositive'; import calculateWN8 from '../core/statistics/calculateWN8'; import sumStats from '../core/statistics/sumStats'; import { CommandRegistry } from '../events/interactionCreate'; diff --git a/src/commands/evolution.tsx b/src/commands/evolution.tsx index 5eca9c17e..5d3df9f90 100644 --- a/src/commands/evolution.tsx +++ b/src/commands/evolution.tsx @@ -2,13 +2,6 @@ import { SlashCommandBuilder, SlashCommandSubcommandGroupBuilder, } from 'discord.js'; -import addPeriodSubCommands from '../LEGACY_core/discord/addPeriodSubCommands'; -import addTankChoices from '../LEGACY_core/discord/addTankChoices'; -import addUsernameChoices from '../LEGACY_core/discord/addUsernameChoices'; -import autocompleteTanks from '../LEGACY_core/discord/autocompleteTanks'; -import autocompleteUsername from '../LEGACY_core/discord/autocompleteUsername'; -import { getCustomPeriodParams } from '../LEGACY_core/discord/getCustomPeriodParams'; -import interactionToURL from '../LEGACY_core/discord/interactionToURL'; import primaryButton from '../LEGACY_core/discord/primaryButton'; import resolvePeriodFromButton from '../LEGACY_core/discord/resolvePeriodFromButton'; import resolvePeriodFromCommand, { @@ -29,6 +22,13 @@ import { emblemIdToURL } from '../core/blitzkrieg/emblemIdToURL'; import getTankHistories from '../core/blitzkrieg/getTankHistories'; import { getBlitzStarsLinkButton } from '../core/blitzstars/getBlitzStarsLinkButton'; import getPlayerHistories from '../core/blitzstars/getPlayerHistories'; +import addPeriodSubCommands from '../core/discord/addPeriodSubCommands'; +import addTankChoices from '../core/discord/addTankChoices'; +import addUsernameChoices from '../core/discord/addUsernameChoices'; +import autocompleteTanks from '../core/discord/autocompleteTanks'; +import autocompleteUsername from '../core/discord/autocompleteUsername'; +import commandToURL from '../core/discord/commandToURL'; +import { getCustomPeriodParams } from '../core/discord/getCustomPeriodParams'; import { CommandRegistryRaw } from '../events/interactionCreate'; type EvolutionStatType = 'player' | 'tank'; @@ -152,7 +152,7 @@ export const evolutionCommand = new Promise( const tankIdRaw = interaction.options.getString('tank')!; const tankId = commandGroup === 'tank' ? await resolveTankId(tankIdRaw) : null; - const path = interactionToURL(interaction, { + const path = commandToURL(interaction, { ...player, ...getCustomPeriodParams(interaction), tankId, diff --git a/src/commands/fullStats.tsx b/src/commands/fullStats.tsx index a63652d44..647f8f9c7 100644 --- a/src/commands/fullStats.tsx +++ b/src/commands/fullStats.tsx @@ -1,12 +1,4 @@ import { SlashCommandBuilder } from 'discord.js'; -import addStatTypeSubCommands from '../LEGACY_core/discord/addStatTypeSubCommands'; -import addUsernameChoices from '../LEGACY_core/discord/addUsernameChoices'; -import autocompleteTanks from '../LEGACY_core/discord/autocompleteTanks'; -import autocompleteUsername from '../LEGACY_core/discord/autocompleteUsername'; -import { getCustomPeriodParams } from '../LEGACY_core/discord/getCustomPeriodParams'; -import { getFiltersFromButton } from '../LEGACY_core/discord/getFiltersFromButton'; -import { getFiltersFromCommand } from '../LEGACY_core/discord/getFiltersFromCommand'; -import interactionToURL from '../LEGACY_core/discord/interactionToURL'; import { refreshButton } from '../LEGACY_core/discord/refreshButton'; import resolvePeriodFromButton from '../LEGACY_core/discord/resolvePeriodFromButton'; import resolvePeriodFromCommand, { @@ -27,6 +19,14 @@ import { emblemIdToURL } from '../core/blitzkrieg/emblemIdToURL'; import { filtersToDescription } from '../core/blitzkrieg/filtersToDescription'; import { getBlitzStarsLinkButton } from '../core/blitzstars/getBlitzStarsLinkButton'; import getStatsInPeriod from '../core/blitzstars/getStatsInPeriod'; +import addFilterOptions from '../core/discord/addFilterOptions'; +import addUsernameChoices from '../core/discord/addUsernameChoices'; +import autocompleteTanks from '../core/discord/autocompleteTanks'; +import autocompleteUsername from '../core/discord/autocompleteUsername'; +import commandToURL from '../core/discord/commandToURL'; +import { getCustomPeriodParams } from '../core/discord/getCustomPeriodParams'; +import { getFiltersFromButton } from '../core/discord/getFiltersFromButton'; +import { getFiltersFromCommand } from '../core/discord/getFiltersFromCommand'; import { StatFilters, filterStats } from '../core/statistics/filterStats'; import { getTierWeights } from '../core/statistics/getTierWeights'; import { CommandRegistryRaw } from '../events/interactionCreate'; @@ -66,7 +66,7 @@ async function render( export const fullStatsCommand = new Promise( async (resolve) => { - const command = await addStatTypeSubCommands( + const command = await addFilterOptions( new SlashCommandBuilder() .setName('full-stats') .setDescription('Full in-game statistics'), @@ -83,7 +83,7 @@ export const fullStatsCommand = new Promise( const player = await resolvePlayerFromCommand(interaction); const period = resolvePeriodFromCommand(player.region, interaction); const filters = await getFiltersFromCommand(interaction); - const path = interactionToURL(interaction, { + const path = commandToURL(interaction, { ...player, ...getCustomPeriodParams(interaction), ...filters, diff --git a/src/commands/inactive.tsx b/src/commands/inactive.tsx index 53974201e..5e67fff28 100644 --- a/src/commands/inactive.tsx +++ b/src/commands/inactive.tsx @@ -1,6 +1,4 @@ import { SlashCommandBuilder } from 'discord.js'; -import addClanChoices from '../LEGACY_core/discord/addClanChoices'; -import autocompleteClan from '../LEGACY_core/discord/autocompleteClan'; import resolveClanFromCommand from '../LEGACY_core/discord/resolveClanFromCommand'; import GenericStats from '../components/GenericStats'; import NoData, { NoDataType } from '../components/NoData'; @@ -8,6 +6,8 @@ import TitleBar from '../components/TitleBar'; import Wrapper from '../components/Wrapper'; import { getAccountInfo } from '../core/blitz/getAccountInfo'; import { getClanInfo } from '../core/blitz/getClanInfo'; +import addClanChoices from '../core/discord/addClanChoices'; +import autocompleteClan from '../core/discord/autocompleteClan'; import { CommandRegistry } from '../events/interactionCreate'; const DEFAULT_THRESHOLD = 7; diff --git a/src/commands/link.tsx b/src/commands/link.tsx index dd99f34cc..88950d4ff 100644 --- a/src/commands/link.tsx +++ b/src/commands/link.tsx @@ -6,15 +6,15 @@ import { } from 'discord.js'; import markdownEscape from 'markdown-escape'; import discord from '../../discord.json' assert { type: 'json' }; -import addUsernameChoices from '../LEGACY_core/discord/addUsernameChoices'; -import autocompleteUsername from '../LEGACY_core/discord/autocompleteUsername'; -import embedNegative from '../LEGACY_core/discord/embedNegative'; import { Glow } from '../components/AllStatsOverview/components/WN8Display/components/Glow'; import Wrapper from '../components/Wrapper'; import { REGION_NAMES_SHORT, Region } from '../constants/regions'; import { getAccountInfo } from '../core/blitz/getAccountInfo'; import { getClanAccountInfo } from '../core/blitz/getClanAccountInfo'; import { linkBlitzAndDiscord } from '../core/blitzkrieg/discordBlitz'; +import addUsernameChoices from '../core/discord/addUsernameChoices'; +import autocompleteUsername from '../core/discord/autocompleteUsername'; +import embedNegative from '../core/discord/embedNegative'; import { CommandRegistry } from '../events/interactionCreate'; import { theme } from '../stitches.config'; diff --git a/src/commands/ownedTanks.tsx b/src/commands/ownedTanks.tsx index 8af307d76..cce9a87f5 100644 --- a/src/commands/ownedTanks.tsx +++ b/src/commands/ownedTanks.tsx @@ -1,7 +1,4 @@ import { SlashCommandBuilder } from 'discord.js'; -import addTierChoices from '../LEGACY_core/discord/addTierChoices'; -import addUsernameChoices from '../LEGACY_core/discord/addUsernameChoices'; -import autocompleteUsername from '../LEGACY_core/discord/autocompleteUsername'; import resolvePlayerFromCommand from '../LEGACY_core/discord/resolvePlayerFromCommand'; import NoData, { NoDataType } from '../components/NoData'; import * as Tanks from '../components/Tanks'; @@ -20,6 +17,9 @@ import { tankopedia, tankopediaInfo, } from '../core/blitzstars/tankopedia'; +import addTierChoices from '../core/discord/addTierChoices'; +import addUsernameChoices from '../core/discord/addUsernameChoices'; +import autocompleteUsername from '../core/discord/autocompleteUsername'; import { CommandRegistry } from '../events/interactionCreate'; export const ownedTanksCommand: CommandRegistry = { diff --git a/src/commands/playerAchievements.ts b/src/commands/playerAchievements.ts index 323930bcd..b695a642e 100644 --- a/src/commands/playerAchievements.ts +++ b/src/commands/playerAchievements.ts @@ -1,15 +1,15 @@ import { SlashCommandBuilder } from 'discord.js'; import { startCase } from 'lodash'; import markdownEscape from 'markdown-escape'; -import addUsernameChoices from '../LEGACY_core/discord/addUsernameChoices'; -import autocompleteUsername from '../LEGACY_core/discord/autocompleteUsername'; -import embedInfo from '../LEGACY_core/discord/embedInfo'; import markdownTable, { TableInputEntry, } from '../LEGACY_core/discord/markdownTable'; import resolvePlayerFromCommand from '../LEGACY_core/discord/resolvePlayerFromCommand'; import { getAccountAchievements } from '../core/blitz/getAccountAchievements'; import { getAccountInfo } from '../core/blitz/getAccountInfo'; +import addUsernameChoices from '../core/discord/addUsernameChoices'; +import autocompleteUsername from '../core/discord/autocompleteUsername'; +import embedInfo from '../core/discord/embedInfo'; import { CommandRegistry } from '../events/interactionCreate'; type SortBy = 'name' | 'count'; diff --git a/src/commands/playerInfo.ts b/src/commands/playerInfo.ts index a0a8e445e..b37a71312 100644 --- a/src/commands/playerInfo.ts +++ b/src/commands/playerInfo.ts @@ -1,11 +1,11 @@ import { SlashCommandBuilder } from 'discord.js'; import markdownEscape from 'markdown-escape'; -import addUsernameChoices from '../LEGACY_core/discord/addUsernameChoices'; -import autocompleteUsername from '../LEGACY_core/discord/autocompleteUsername'; -import embedInfo from '../LEGACY_core/discord/embedInfo'; import markdownTable from '../LEGACY_core/discord/markdownTable'; import resolvePlayerFromCommand from '../LEGACY_core/discord/resolvePlayerFromCommand'; import { getAccountInfo } from '../core/blitz/getAccountInfo'; +import addUsernameChoices from '../core/discord/addUsernameChoices'; +import autocompleteUsername from '../core/discord/autocompleteUsername'; +import embedInfo from '../core/discord/embedInfo'; import { CommandRegistry } from '../events/interactionCreate'; export const playerInfoCommand: CommandRegistry = { diff --git a/src/commands/ratings.tsx b/src/commands/ratings.tsx index 3f8dbbc2c..b8527e8b3 100644 --- a/src/commands/ratings.tsx +++ b/src/commands/ratings.tsx @@ -5,10 +5,6 @@ import { SlashCommandSubcommandGroupBuilder, } from 'discord.js'; import { BlitzkriegRatingsLeaderboard } from '../../scripts/buildRatingsLeaderboard'; -import addRegionChoices from '../LEGACY_core/discord/addRegionChoices'; -import addUsernameChoices from '../LEGACY_core/discord/addUsernameChoices'; -import autocompleteUsername from '../LEGACY_core/discord/autocompleteUsername'; -import embedNegative from '../LEGACY_core/discord/embedNegative'; import resolvePlayerFromCommand from '../LEGACY_core/discord/resolvePlayerFromCommand'; import { octokit } from '../LEGACY_core/github/octokit'; import throwError from '../LEGACY_core/node/throwError'; @@ -24,6 +20,10 @@ import getArchivedRatingsInfo from '../core/blitzkrieg/getArchivedRatingsInfo'; import getMidnightLeaderboard, { DATABASE_REPO, } from '../core/blitzkrieg/getMidnightLeaderboard'; +import addRegionChoices from '../core/discord/addRegionChoices'; +import addUsernameChoices from '../core/discord/addUsernameChoices'; +import autocompleteUsername from '../core/discord/autocompleteUsername'; +import embedNegative from '../core/discord/embedNegative'; import { CommandRegistryRaw } from '../events/interactionCreate'; export interface RatingsPlayer { diff --git a/src/commands/searchClans.ts b/src/commands/searchClans.ts index a3bb1f5b0..8eb4bc83d 100644 --- a/src/commands/searchClans.ts +++ b/src/commands/searchClans.ts @@ -1,11 +1,11 @@ import { SlashCommandBuilder } from 'discord.js'; import markdownEscape from 'markdown-escape'; -import addClanChoices from '../LEGACY_core/discord/addClanChoices'; -import addRegionChoices from '../LEGACY_core/discord/addRegionChoices'; -import embedInfo from '../LEGACY_core/discord/embedInfo'; import { REGION_NAMES, Region } from '../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; import fetchBlitz from '../core/blitz/fetchWargaming'; +import addClanChoices from '../core/discord/addClanChoices'; +import addRegionChoices from '../core/discord/addRegionChoices'; +import embedInfo from '../core/discord/embedInfo'; import { CommandRegistry } from '../events/interactionCreate'; import { ClanList } from '../types/clanList'; diff --git a/src/commands/searchPlayers.ts b/src/commands/searchPlayers.ts index 584334fcd..9a376d9c7 100644 --- a/src/commands/searchPlayers.ts +++ b/src/commands/searchPlayers.ts @@ -1,8 +1,5 @@ import { SlashCommandBuilder } from 'discord.js'; import markdownEscape from 'markdown-escape'; -import addRegionChoices from '../LEGACY_core/discord/addRegionChoices'; -import addUsernameChoices from '../LEGACY_core/discord/addUsernameChoices'; -import embedInfo from '../LEGACY_core/discord/embedInfo'; import { REGION_NAMES, Region } from '../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; import fetchBlitz from '../core/blitz/fetchWargaming'; @@ -10,6 +7,9 @@ import { AccountList, usernamePattern, } from '../core/blitz/searchPlayersAcrossRegions'; +import addRegionChoices from '../core/discord/addRegionChoices'; +import addUsernameChoices from '../core/discord/addUsernameChoices'; +import embedInfo from '../core/discord/embedInfo'; import { CommandRegistry } from '../events/interactionCreate'; export const searchPlayersCommand: CommandRegistry = { diff --git a/src/commands/searchTanks.ts b/src/commands/searchTanks.ts index c57dc1c7b..0429c5e56 100644 --- a/src/commands/searchTanks.ts +++ b/src/commands/searchTanks.ts @@ -1,9 +1,9 @@ import { SlashCommandBuilder } from 'discord.js'; import { go } from 'fuzzysort'; import markdownEscape from 'markdown-escape'; -import addTankChoices from '../LEGACY_core/discord/addTankChoices'; -import embedInfo from '../LEGACY_core/discord/embedInfo'; import { TANK_NAMES_DIACRITICS } from '../core/blitzstars/tankopedia'; +import addTankChoices from '../core/discord/addTankChoices'; +import embedInfo from '../core/discord/embedInfo'; import { CommandRegistry } from '../events/interactionCreate'; export const searchTanksCommand: CommandRegistry = { diff --git a/src/commands/stats.tsx b/src/commands/stats.tsx index 548f14495..5f2584f9f 100644 --- a/src/commands/stats.tsx +++ b/src/commands/stats.tsx @@ -1,12 +1,4 @@ import { SlashCommandBuilder } from 'discord.js'; -import addStatTypeSubCommands from '../LEGACY_core/discord/addStatTypeSubCommands'; -import addUsernameChoices from '../LEGACY_core/discord/addUsernameChoices'; -import autocompleteTanks from '../LEGACY_core/discord/autocompleteTanks'; -import autocompleteUsername from '../LEGACY_core/discord/autocompleteUsername'; -import { getCustomPeriodParams } from '../LEGACY_core/discord/getCustomPeriodParams'; -import { getFiltersFromButton } from '../LEGACY_core/discord/getFiltersFromButton'; -import { getFiltersFromCommand } from '../LEGACY_core/discord/getFiltersFromCommand'; -import interactionToURL from '../LEGACY_core/discord/interactionToURL'; import { refreshButton } from '../LEGACY_core/discord/refreshButton'; import resolvePeriodFromButton from '../LEGACY_core/discord/resolvePeriodFromButton'; import resolvePeriodFromCommand, { @@ -26,6 +18,14 @@ import { emblemIdToURL } from '../core/blitzkrieg/emblemIdToURL'; import { filtersToDescription } from '../core/blitzkrieg/filtersToDescription'; import { getBlitzStarsLinkButton } from '../core/blitzstars/getBlitzStarsLinkButton'; import getStatsInPeriod from '../core/blitzstars/getStatsInPeriod'; +import addFilterOptions from '../core/discord/addFilterOptions'; +import addUsernameChoices from '../core/discord/addUsernameChoices'; +import autocompleteTanks from '../core/discord/autocompleteTanks'; +import autocompleteUsername from '../core/discord/autocompleteUsername'; +import commandToURL from '../core/discord/commandToURL'; +import { getCustomPeriodParams } from '../core/discord/getCustomPeriodParams'; +import { getFiltersFromButton } from '../core/discord/getFiltersFromButton'; +import { getFiltersFromCommand } from '../core/discord/getFiltersFromCommand'; import { StatFilters, filterStats } from '../core/statistics/filterStats'; import { CommandRegistryRaw } from '../events/interactionCreate'; @@ -58,7 +58,7 @@ async function render( } export const statsCommand = new Promise(async (resolve) => { - const command = await addStatTypeSubCommands( + const command = await addFilterOptions( new SlashCommandBuilder() .setName('stats') .setDescription('Regular battles statistics'), @@ -75,7 +75,7 @@ export const statsCommand = new Promise(async (resolve) => { const player = await resolvePlayerFromCommand(interaction); const period = resolvePeriodFromCommand(player.region, interaction); const filters = await getFiltersFromCommand(interaction); - const path = interactionToURL(interaction, { + const path = commandToURL(interaction, { ...player, ...getCustomPeriodParams(interaction), ...filters, diff --git a/src/commands/today.tsx b/src/commands/today.tsx index fb3979f60..537e06a9d 100644 --- a/src/commands/today.tsx +++ b/src/commands/today.tsx @@ -1,12 +1,12 @@ import { SlashCommandBuilder } from 'discord.js'; -import addUsernameChoices from '../LEGACY_core/discord/addUsernameChoices'; -import autocompleteUsername from '../LEGACY_core/discord/autocompleteUsername'; -import interactionToURL from '../LEGACY_core/discord/interactionToURL'; import linkButton from '../LEGACY_core/discord/linkButton'; import primaryButton from '../LEGACY_core/discord/primaryButton'; import resolvePlayerFromButton from '../LEGACY_core/discord/resolvePlayerFromButton'; import resolvePlayerFromCommand from '../LEGACY_core/discord/resolvePlayerFromCommand'; import { getAccountInfo } from '../core/blitz/getAccountInfo'; +import addUsernameChoices from '../core/discord/addUsernameChoices'; +import autocompleteUsername from '../core/discord/autocompleteUsername'; +import commandToURL from '../core/discord/commandToURL'; import { CommandRegistry } from '../events/interactionCreate'; import today from '../renderers/today'; @@ -49,7 +49,7 @@ export const todayCommand: CommandRegistry = { const maximized = interaction.options.getInteger('maximized') ?? undefined; const showTotal = interaction.options.getBoolean('show-total') ?? undefined; const { nickname } = await getAccountInfo(player.region, player.id); - const path = interactionToURL(interaction, { + const path = commandToURL(interaction, { ...player, cutoff, maximized, diff --git a/src/core/blitzkrieg/getPeriodStart.ts b/src/core/blitzkrieg/getPeriodStart.ts index a4ccffcfe..b60c19307 100644 --- a/src/core/blitzkrieg/getPeriodStart.ts +++ b/src/core/blitzkrieg/getPeriodStart.ts @@ -1,5 +1,5 @@ -import { PeriodSize } from '../../LEGACY_core/discord/addPeriodSubCommands'; import { Region } from '../../constants/regions'; +import { PeriodSize } from '../discord/addPeriodSubCommands'; import getTimeDaysAgo from './getTimeDaysAgo'; export default function getPeriodStart(region: Region, period: PeriodSize) { diff --git a/src/LEGACY_core/discord/addClanChoices.ts b/src/core/discord/addClanChoices.ts similarity index 100% rename from src/LEGACY_core/discord/addClanChoices.ts rename to src/core/discord/addClanChoices.ts diff --git a/src/LEGACY_core/discord/addStatTypeSubCommands.ts b/src/core/discord/addFilterOptions.ts similarity index 94% rename from src/LEGACY_core/discord/addStatTypeSubCommands.ts rename to src/core/discord/addFilterOptions.ts index df0d61a4e..9a79642a4 100644 --- a/src/LEGACY_core/discord/addStatTypeSubCommands.ts +++ b/src/core/discord/addFilterOptions.ts @@ -4,12 +4,12 @@ import { SlashCommandSubcommandGroupBuilder, } from 'discord.js'; import { TREE_TYPE_NAMES, TreeTypeString } from '../../components/Tanks'; -import { tankopediaInfo } from '../../core/blitzstars/tankopedia'; +import { tankopediaInfo } from '../blitzstars/tankopedia'; import addPeriodSubCommands from './addPeriodSubCommands'; import addTankChoices from './addTankChoices'; import addTierChoices from './addTierChoices'; -export default async function addStatTypeSubCommands< +export default async function addFilterOptions< OptionType extends SlashCommandBuilder | SlashCommandSubcommandGroupBuilder, >( option: OptionType, diff --git a/src/LEGACY_core/discord/addPeriodSubCommands.ts b/src/core/discord/addPeriodSubCommands.ts similarity index 100% rename from src/LEGACY_core/discord/addPeriodSubCommands.ts rename to src/core/discord/addPeriodSubCommands.ts diff --git a/src/LEGACY_core/discord/addRegionChoices.ts b/src/core/discord/addRegionChoices.ts similarity index 100% rename from src/LEGACY_core/discord/addRegionChoices.ts rename to src/core/discord/addRegionChoices.ts diff --git a/src/LEGACY_core/discord/addTankChoices.ts b/src/core/discord/addTankChoices.ts similarity index 100% rename from src/LEGACY_core/discord/addTankChoices.ts rename to src/core/discord/addTankChoices.ts diff --git a/src/LEGACY_core/discord/addTierChoices.ts b/src/core/discord/addTierChoices.ts similarity index 85% rename from src/LEGACY_core/discord/addTierChoices.ts rename to src/core/discord/addTierChoices.ts index f6913427e..784096076 100644 --- a/src/LEGACY_core/discord/addTierChoices.ts +++ b/src/core/discord/addTierChoices.ts @@ -1,6 +1,6 @@ import { SlashCommandStringOption } from 'discord.js'; import { range } from 'lodash'; -import numberToRomanNumeral from '../../core/math/numberToRomanNumeral'; +import numberToRomanNumeral from '../math/numberToRomanNumeral'; export default function addTierChoices(option: SlashCommandStringOption) { return option diff --git a/src/LEGACY_core/discord/addUsernameChoices.ts b/src/core/discord/addUsernameChoices.ts similarity index 100% rename from src/LEGACY_core/discord/addUsernameChoices.ts rename to src/core/discord/addUsernameChoices.ts diff --git a/src/LEGACY_core/discord/autocompleteClan.ts b/src/core/discord/autocompleteClan.ts similarity index 91% rename from src/LEGACY_core/discord/autocompleteClan.ts rename to src/core/discord/autocompleteClan.ts index 3de7c8598..83b4bdc0e 100644 --- a/src/LEGACY_core/discord/autocompleteClan.ts +++ b/src/core/discord/autocompleteClan.ts @@ -4,7 +4,7 @@ import { CacheType, } from 'discord.js'; import { REGION_NAMES } from '../../constants/regions'; -import searchClansAcrossRegions from '../../core/blitz/searchClansAcrossRegions'; +import searchClansAcrossRegions from '../blitz/searchClansAcrossRegions'; export default async function autocompleteClan( interaction: AutocompleteInteraction, diff --git a/src/LEGACY_core/discord/autocompleteTanks.ts b/src/core/discord/autocompleteTanks.ts similarity index 91% rename from src/LEGACY_core/discord/autocompleteTanks.ts rename to src/core/discord/autocompleteTanks.ts index cbfb54dc1..adfc8477b 100644 --- a/src/LEGACY_core/discord/autocompleteTanks.ts +++ b/src/core/discord/autocompleteTanks.ts @@ -4,7 +4,7 @@ import { CacheType, } from 'discord.js'; import { go } from 'fuzzysort'; -import { TANK_NAMES_DIACRITICS } from '../../core/blitzstars/tankopedia'; +import { TANK_NAMES_DIACRITICS } from '../blitzstars/tankopedia'; export default async function autocompleteTanks( interaction: AutocompleteInteraction, diff --git a/src/LEGACY_core/discord/autocompleteUsername.ts b/src/core/discord/autocompleteUsername.ts similarity index 90% rename from src/LEGACY_core/discord/autocompleteUsername.ts rename to src/core/discord/autocompleteUsername.ts index b29c860f9..8d5428883 100644 --- a/src/LEGACY_core/discord/autocompleteUsername.ts +++ b/src/core/discord/autocompleteUsername.ts @@ -4,7 +4,7 @@ import { CacheType, } from 'discord.js'; import { REGION_NAMES } from '../../constants/regions'; -import searchPlayersAcrossRegions from '../../core/blitz/searchPlayersAcrossRegions'; +import searchPlayersAcrossRegions from '../blitz/searchPlayersAcrossRegions'; export default async function autocompleteUsername( interaction: AutocompleteInteraction, diff --git a/src/LEGACY_core/discord/client.ts b/src/core/discord/client.ts similarity index 100% rename from src/LEGACY_core/discord/client.ts rename to src/core/discord/client.ts diff --git a/src/LEGACY_core/discord/interactionToURL.ts b/src/core/discord/commandToURL.ts similarity index 94% rename from src/LEGACY_core/discord/interactionToURL.ts rename to src/core/discord/commandToURL.ts index c4dac3f10..9ea5db481 100644 --- a/src/LEGACY_core/discord/interactionToURL.ts +++ b/src/core/discord/commandToURL.ts @@ -4,7 +4,7 @@ export interface Parameters { [key: string]: string | number | boolean | undefined | null; } -export default function interactionToURL( +export default function commandToURL( interaction: ChatInputCommandInteraction, parameters?: Parameters, ) { diff --git a/src/LEGACY_core/discord/embedInfo.ts b/src/core/discord/embedInfo.ts similarity index 100% rename from src/LEGACY_core/discord/embedInfo.ts rename to src/core/discord/embedInfo.ts diff --git a/src/LEGACY_core/discord/embedNegative.ts b/src/core/discord/embedNegative.ts similarity index 100% rename from src/LEGACY_core/discord/embedNegative.ts rename to src/core/discord/embedNegative.ts diff --git a/src/LEGACY_core/discord/embedPositive.ts b/src/core/discord/embedPositive.ts similarity index 100% rename from src/LEGACY_core/discord/embedPositive.ts rename to src/core/discord/embedPositive.ts diff --git a/src/LEGACY_core/discord/embedWarning.ts b/src/core/discord/embedWarning.ts similarity index 100% rename from src/LEGACY_core/discord/embedWarning.ts rename to src/core/discord/embedWarning.ts diff --git a/src/LEGACY_core/discord/getCustomPeriodParams.ts b/src/core/discord/getCustomPeriodParams.ts similarity index 100% rename from src/LEGACY_core/discord/getCustomPeriodParams.ts rename to src/core/discord/getCustomPeriodParams.ts diff --git a/src/LEGACY_core/discord/getFiltersFromButton.ts b/src/core/discord/getFiltersFromButton.ts similarity index 90% rename from src/LEGACY_core/discord/getFiltersFromButton.ts rename to src/core/discord/getFiltersFromButton.ts index d8b07b1d2..3d906e35b 100644 --- a/src/LEGACY_core/discord/getFiltersFromButton.ts +++ b/src/core/discord/getFiltersFromButton.ts @@ -1,6 +1,6 @@ import { ButtonInteraction } from 'discord.js'; import { TreeTypeString } from '../../components/Tanks'; -import { StatFilters } from '../../core/statistics/filterStats'; +import { StatFilters } from '../statistics/filterStats'; export function getFiltersFromButton(interaction: ButtonInteraction) { const url = new URL(`https://example.com/${interaction.customId}`); diff --git a/src/LEGACY_core/discord/getFiltersFromCommand.ts b/src/core/discord/getFiltersFromCommand.ts similarity index 85% rename from src/LEGACY_core/discord/getFiltersFromCommand.ts rename to src/core/discord/getFiltersFromCommand.ts index ccdac0834..3a08f1bad 100644 --- a/src/LEGACY_core/discord/getFiltersFromCommand.ts +++ b/src/core/discord/getFiltersFromCommand.ts @@ -1,7 +1,7 @@ import { ChatInputCommandInteraction } from 'discord.js'; import { TreeTypeString } from '../../components/Tanks'; -import resolveTankId from '../../core/blitz/resolveTankId'; -import { StatFilters } from '../../core/statistics/filterStats'; +import resolveTankId from '../blitz/resolveTankId'; +import { StatFilters } from '../statistics/filterStats'; export async function getFiltersFromCommand( interaction: ChatInputCommandInteraction, diff --git a/src/events/interactionCreate/handlers/chatInputCommand.ts b/src/events/interactionCreate/handlers/chatInputCommand.ts index 577e92e72..1cc146887 100644 --- a/src/events/interactionCreate/handlers/chatInputCommand.ts +++ b/src/events/interactionCreate/handlers/chatInputCommand.ts @@ -7,10 +7,10 @@ import { } from 'discord.js'; import { commands } from '..'; import discord from '../../../../discord.json' assert { type: 'json' }; -import embedNegative from '../../../LEGACY_core/discord/embedNegative'; -import embedWarning from '../../../LEGACY_core/discord/embedWarning'; import normalizeInteractionReturnable from '../../../LEGACY_core/discord/normalizeInteractionReturnable'; import { psa } from '../../../LEGACY_core/discord/psa'; +import embedNegative from '../../../core/discord/embedNegative'; +import embedWarning from '../../../core/discord/embedWarning'; export default async function handleChatInputCommand( interaction: ChatInputCommandInteraction, From 01dd7ad9c6d9f781ad82b5f9cdb6f2693da28a80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sat, 14 Oct 2023 11:36:10 -0500 Subject: [PATCH 27/43] feat: core chunk 7 --- src/commands/debug.ts | 4 ++-- src/commands/eligible.ts | 6 ++---- src/commands/evolution.tsx | 20 +++++++++---------- src/commands/fullStats.tsx | 20 +++++++++---------- src/commands/inactive.tsx | 2 +- src/commands/ownedTanks.tsx | 2 +- src/commands/playerAchievements.ts | 6 ++---- src/commands/playerInfo.ts | 4 ++-- src/commands/ratings.tsx | 4 ++-- src/commands/stats.tsx | 20 +++++++++---------- src/commands/today.tsx | 12 +++++------ src/components/GenericAllStats/index.tsx | 2 +- src/core/blitzkrieg/getArchivedRatingsInfo.ts | 2 +- .../node => core/blitzkrieg}/getClientId.ts | 0 src/core/blitzkrieg/getMidnightLeaderboard.ts | 2 +- .../node => core/blitzkrieg}/isDev.ts | 0 .../node => core/blitzkrieg}/jsxToPng.ts | 0 .../node => core/blitzkrieg}/jsxToSvg.ts | 0 .../github => core/blitzkrieg}/octokit.ts | 2 +- .../node => core/blitzkrieg}/svgToPng.ts | 0 .../blitzstars/getBlitzStarsLinkButton.ts | 4 ++-- .../discord/buttonLink.ts} | 2 +- .../discord/buttonPrimary.ts} | 2 +- .../discord/buttonRefresh.ts} | 6 +++--- src/core/discord/commandToURL.ts | 3 +++ .../discord/markdownTable.ts | 0 .../discord/normalizeInteractionReturnable.ts | 2 +- src/{LEGACY_core => core}/discord/psa.ts | 0 .../discord/resolveClanFromCommand.ts | 4 ++-- .../discord/resolvePeriodFromButton.ts | 8 ++++---- .../discord/resolvePeriodFromCommand.ts | 11 ++++------ .../discord/resolvePlayerFromButton.ts | 0 .../discord/resolvePlayerFromCommand.ts | 6 +++--- .../node => core/math}/isNumber.ts | 0 .../interactionCreate/handlers/button.tsx | 2 +- .../handlers/chatInputCommand.ts | 4 ++-- src/events/interactionCreate/index.ts | 4 ++-- src/events/ready.ts | 2 +- src/renderers/today.tsx | 2 +- 39 files changed, 83 insertions(+), 87 deletions(-) rename src/{LEGACY_core/node => core/blitzkrieg}/getClientId.ts (100%) rename src/{LEGACY_core/node => core/blitzkrieg}/isDev.ts (100%) rename src/{LEGACY_core/node => core/blitzkrieg}/jsxToPng.ts (100%) rename src/{LEGACY_core/node => core/blitzkrieg}/jsxToSvg.ts (100%) rename src/{LEGACY_core/github => core/blitzkrieg}/octokit.ts (64%) rename src/{LEGACY_core/node => core/blitzkrieg}/svgToPng.ts (100%) rename src/{LEGACY_core/discord/linkButton.ts => core/discord/buttonLink.ts} (90%) rename src/{LEGACY_core/discord/primaryButton.ts => core/discord/buttonPrimary.ts} (89%) rename src/{LEGACY_core/discord/refreshButton.ts => core/discord/buttonRefresh.ts} (68%) rename src/{LEGACY_core => core}/discord/markdownTable.ts (100%) rename src/{LEGACY_core => core}/discord/normalizeInteractionReturnable.ts (96%) rename src/{LEGACY_core => core}/discord/psa.ts (100%) rename src/{LEGACY_core => core}/discord/resolveClanFromCommand.ts (86%) rename src/{LEGACY_core => core}/discord/resolvePeriodFromButton.ts (81%) rename src/{LEGACY_core => core}/discord/resolvePeriodFromCommand.ts (82%) rename src/{LEGACY_core => core}/discord/resolvePlayerFromButton.ts (100%) rename src/{LEGACY_core => core}/discord/resolvePlayerFromCommand.ts (88%) rename src/{LEGACY_core/node => core/math}/isNumber.ts (100%) diff --git a/src/commands/debug.ts b/src/commands/debug.ts index beb20d2de..7b1254add 100644 --- a/src/commands/debug.ts +++ b/src/commands/debug.ts @@ -1,11 +1,11 @@ import { SlashCommandBuilder } from 'discord.js'; import packageJSON from '../../package.json' assert { type: 'json' }; -import markdownTable from '../LEGACY_core/discord/markdownTable'; -import getClientId from '../LEGACY_core/node/getClientId'; +import getClientId from '../core/blitzkrieg/getClientId'; import { tankAverages } from '../core/blitzstars/tankAverages'; import { tankopedia } from '../core/blitzstars/tankopedia'; import { client } from '../core/discord/client'; import embedInfo from '../core/discord/embedInfo'; +import markdownTable from '../core/discord/markdownTable'; import { CommandRegistry } from '../events/interactionCreate'; const executionStart = new Date().getTime(); diff --git a/src/commands/eligible.ts b/src/commands/eligible.ts index 3844d9cbf..9dcf864a2 100644 --- a/src/commands/eligible.ts +++ b/src/commands/eligible.ts @@ -1,8 +1,4 @@ import { SlashCommandBuilder } from 'discord.js'; -import markdownTable, { - TableInput, -} from '../LEGACY_core/discord/markdownTable'; -import resolvePlayerFromCommand from '../LEGACY_core/discord/resolvePlayerFromCommand'; import { getAccountInfo } from '../core/blitz/getAccountInfo'; import getPeriodNow from '../core/blitzkrieg/getPeriodNow'; import getTimeDaysAgo from '../core/blitzkrieg/getTimeDaysAgo'; @@ -12,6 +8,8 @@ import { tankopedia } from '../core/blitzstars/tankopedia'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import embedNegative from '../core/discord/embedNegative'; import embedPositive from '../core/discord/embedPositive'; +import markdownTable, { TableInput } from '../core/discord/markdownTable'; +import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand'; import calculateWN8 from '../core/statistics/calculateWN8'; import sumStats from '../core/statistics/sumStats'; import { CommandRegistry } from '../events/interactionCreate'; diff --git a/src/commands/evolution.tsx b/src/commands/evolution.tsx index 5d3df9f90..d6ec480fb 100644 --- a/src/commands/evolution.tsx +++ b/src/commands/evolution.tsx @@ -2,15 +2,6 @@ import { SlashCommandBuilder, SlashCommandSubcommandGroupBuilder, } from 'discord.js'; -import primaryButton from '../LEGACY_core/discord/primaryButton'; -import resolvePeriodFromButton from '../LEGACY_core/discord/resolvePeriodFromButton'; -import resolvePeriodFromCommand, { - ResolvedPeriod, -} from '../LEGACY_core/discord/resolvePeriodFromCommand'; -import resolvePlayerFromButton from '../LEGACY_core/discord/resolvePlayerFromButton'; -import resolvePlayerFromCommand, { - ResolvedPlayer, -} from '../LEGACY_core/discord/resolvePlayerFromCommand'; import * as Graph from '../components/Graph'; import NoData, { NoDataType } from '../components/NoData'; import TitleBar from '../components/TitleBar'; @@ -27,8 +18,17 @@ import addTankChoices from '../core/discord/addTankChoices'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteTanks from '../core/discord/autocompleteTanks'; import autocompleteUsername from '../core/discord/autocompleteUsername'; +import buttonPrimary from '../core/discord/buttonPrimary'; import commandToURL from '../core/discord/commandToURL'; import { getCustomPeriodParams } from '../core/discord/getCustomPeriodParams'; +import resolvePeriodFromButton from '../core/discord/resolvePeriodFromButton'; +import resolvePeriodFromCommand, { + ResolvedPeriod, +} from '../core/discord/resolvePeriodFromCommand'; +import resolvePlayerFromButton from '../core/discord/resolvePlayerFromButton'; +import resolvePlayerFromCommand, { + ResolvedPlayer, +} from '../core/discord/resolvePlayerFromCommand'; import { CommandRegistryRaw } from '../events/interactionCreate'; type EvolutionStatType = 'player' | 'tank'; @@ -162,7 +162,7 @@ export const evolutionCommand = new Promise( return [ await render(player, period, commandGroup, tankId), - primaryButton(path, 'Refresh'), + buttonPrimary(path, 'Refresh'), await getBlitzStarsLinkButton( player.region, player.id, diff --git a/src/commands/fullStats.tsx b/src/commands/fullStats.tsx index 647f8f9c7..9630433f9 100644 --- a/src/commands/fullStats.tsx +++ b/src/commands/fullStats.tsx @@ -1,13 +1,4 @@ import { SlashCommandBuilder } from 'discord.js'; -import { refreshButton } from '../LEGACY_core/discord/refreshButton'; -import resolvePeriodFromButton from '../LEGACY_core/discord/resolvePeriodFromButton'; -import resolvePeriodFromCommand, { - ResolvedPeriod, -} from '../LEGACY_core/discord/resolvePeriodFromCommand'; -import resolvePlayerFromButton from '../LEGACY_core/discord/resolvePlayerFromButton'; -import resolvePlayerFromCommand, { - ResolvedPlayer, -} from '../LEGACY_core/discord/resolvePlayerFromCommand'; import GenericAllStats from '../components/GenericAllStats'; import NoData, { NoDataType } from '../components/NoData'; import TierWeights from '../components/TierWeights'; @@ -23,10 +14,19 @@ import addFilterOptions from '../core/discord/addFilterOptions'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteTanks from '../core/discord/autocompleteTanks'; import autocompleteUsername from '../core/discord/autocompleteUsername'; +import { buttonRefresh } from '../core/discord/buttonRefresh'; import commandToURL from '../core/discord/commandToURL'; import { getCustomPeriodParams } from '../core/discord/getCustomPeriodParams'; import { getFiltersFromButton } from '../core/discord/getFiltersFromButton'; import { getFiltersFromCommand } from '../core/discord/getFiltersFromCommand'; +import resolvePeriodFromButton from '../core/discord/resolvePeriodFromButton'; +import resolvePeriodFromCommand, { + ResolvedPeriod, +} from '../core/discord/resolvePeriodFromCommand'; +import resolvePlayerFromButton from '../core/discord/resolvePlayerFromButton'; +import resolvePlayerFromCommand, { + ResolvedPlayer, +} from '../core/discord/resolvePlayerFromCommand'; import { StatFilters, filterStats } from '../core/statistics/filterStats'; import { getTierWeights } from '../core/statistics/getTierWeights'; import { CommandRegistryRaw } from '../events/interactionCreate'; @@ -91,7 +91,7 @@ export const fullStatsCommand = new Promise( return Promise.all([ render(player, period, filters), - refreshButton(interaction, path), + buttonRefresh(interaction, path), getBlitzStarsLinkButton(player.region, player.id), ]); }, diff --git a/src/commands/inactive.tsx b/src/commands/inactive.tsx index 5e67fff28..aabc824aa 100644 --- a/src/commands/inactive.tsx +++ b/src/commands/inactive.tsx @@ -1,5 +1,4 @@ import { SlashCommandBuilder } from 'discord.js'; -import resolveClanFromCommand from '../LEGACY_core/discord/resolveClanFromCommand'; import GenericStats from '../components/GenericStats'; import NoData, { NoDataType } from '../components/NoData'; import TitleBar from '../components/TitleBar'; @@ -8,6 +7,7 @@ import { getAccountInfo } from '../core/blitz/getAccountInfo'; import { getClanInfo } from '../core/blitz/getClanInfo'; import addClanChoices from '../core/discord/addClanChoices'; import autocompleteClan from '../core/discord/autocompleteClan'; +import resolveClanFromCommand from '../core/discord/resolveClanFromCommand'; import { CommandRegistry } from '../events/interactionCreate'; const DEFAULT_THRESHOLD = 7; diff --git a/src/commands/ownedTanks.tsx b/src/commands/ownedTanks.tsx index cce9a87f5..16fa9fd85 100644 --- a/src/commands/ownedTanks.tsx +++ b/src/commands/ownedTanks.tsx @@ -1,5 +1,4 @@ import { SlashCommandBuilder } from 'discord.js'; -import resolvePlayerFromCommand from '../LEGACY_core/discord/resolvePlayerFromCommand'; import NoData, { NoDataType } from '../components/NoData'; import * as Tanks from '../components/Tanks'; import TitleBar from '../components/TitleBar'; @@ -20,6 +19,7 @@ import { import addTierChoices from '../core/discord/addTierChoices'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteUsername from '../core/discord/autocompleteUsername'; +import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand'; import { CommandRegistry } from '../events/interactionCreate'; export const ownedTanksCommand: CommandRegistry = { diff --git a/src/commands/playerAchievements.ts b/src/commands/playerAchievements.ts index b695a642e..440b4d954 100644 --- a/src/commands/playerAchievements.ts +++ b/src/commands/playerAchievements.ts @@ -1,15 +1,13 @@ import { SlashCommandBuilder } from 'discord.js'; import { startCase } from 'lodash'; import markdownEscape from 'markdown-escape'; -import markdownTable, { - TableInputEntry, -} from '../LEGACY_core/discord/markdownTable'; -import resolvePlayerFromCommand from '../LEGACY_core/discord/resolvePlayerFromCommand'; import { getAccountAchievements } from '../core/blitz/getAccountAchievements'; import { getAccountInfo } from '../core/blitz/getAccountInfo'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteUsername from '../core/discord/autocompleteUsername'; import embedInfo from '../core/discord/embedInfo'; +import markdownTable, { TableInputEntry } from '../core/discord/markdownTable'; +import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand'; import { CommandRegistry } from '../events/interactionCreate'; type SortBy = 'name' | 'count'; diff --git a/src/commands/playerInfo.ts b/src/commands/playerInfo.ts index b37a71312..64342da2d 100644 --- a/src/commands/playerInfo.ts +++ b/src/commands/playerInfo.ts @@ -1,11 +1,11 @@ import { SlashCommandBuilder } from 'discord.js'; import markdownEscape from 'markdown-escape'; -import markdownTable from '../LEGACY_core/discord/markdownTable'; -import resolvePlayerFromCommand from '../LEGACY_core/discord/resolvePlayerFromCommand'; import { getAccountInfo } from '../core/blitz/getAccountInfo'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteUsername from '../core/discord/autocompleteUsername'; import embedInfo from '../core/discord/embedInfo'; +import markdownTable from '../core/discord/markdownTable'; +import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand'; import { CommandRegistry } from '../events/interactionCreate'; export const playerInfoCommand: CommandRegistry = { diff --git a/src/commands/ratings.tsx b/src/commands/ratings.tsx index b8527e8b3..334ff9da7 100644 --- a/src/commands/ratings.tsx +++ b/src/commands/ratings.tsx @@ -5,8 +5,6 @@ import { SlashCommandSubcommandGroupBuilder, } from 'discord.js'; import { BlitzkriegRatingsLeaderboard } from '../../scripts/buildRatingsLeaderboard'; -import resolvePlayerFromCommand from '../LEGACY_core/discord/resolvePlayerFromCommand'; -import { octokit } from '../LEGACY_core/github/octokit'; import throwError from '../LEGACY_core/node/throwError'; import * as Leaderboard from '../components/Leaderboard'; import TitleBar from '../components/TitleBar'; @@ -20,10 +18,12 @@ import getArchivedRatingsInfo from '../core/blitzkrieg/getArchivedRatingsInfo'; import getMidnightLeaderboard, { DATABASE_REPO, } from '../core/blitzkrieg/getMidnightLeaderboard'; +import { octokit } from '../core/blitzkrieg/octokit'; import addRegionChoices from '../core/discord/addRegionChoices'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteUsername from '../core/discord/autocompleteUsername'; import embedNegative from '../core/discord/embedNegative'; +import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand'; import { CommandRegistryRaw } from '../events/interactionCreate'; export interface RatingsPlayer { diff --git a/src/commands/stats.tsx b/src/commands/stats.tsx index 5f2584f9f..f2cad10df 100644 --- a/src/commands/stats.tsx +++ b/src/commands/stats.tsx @@ -1,13 +1,4 @@ import { SlashCommandBuilder } from 'discord.js'; -import { refreshButton } from '../LEGACY_core/discord/refreshButton'; -import resolvePeriodFromButton from '../LEGACY_core/discord/resolvePeriodFromButton'; -import resolvePeriodFromCommand, { - ResolvedPeriod, -} from '../LEGACY_core/discord/resolvePeriodFromCommand'; -import resolvePlayerFromButton from '../LEGACY_core/discord/resolvePlayerFromButton'; -import resolvePlayerFromCommand, { - ResolvedPlayer, -} from '../LEGACY_core/discord/resolvePlayerFromCommand'; import AllStatsOverview from '../components/AllStatsOverview'; import NoData, { NoDataType } from '../components/NoData'; import TitleBar from '../components/TitleBar'; @@ -22,10 +13,19 @@ import addFilterOptions from '../core/discord/addFilterOptions'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteTanks from '../core/discord/autocompleteTanks'; import autocompleteUsername from '../core/discord/autocompleteUsername'; +import { buttonRefresh } from '../core/discord/buttonRefresh'; import commandToURL from '../core/discord/commandToURL'; import { getCustomPeriodParams } from '../core/discord/getCustomPeriodParams'; import { getFiltersFromButton } from '../core/discord/getFiltersFromButton'; import { getFiltersFromCommand } from '../core/discord/getFiltersFromCommand'; +import resolvePeriodFromButton from '../core/discord/resolvePeriodFromButton'; +import resolvePeriodFromCommand, { + ResolvedPeriod, +} from '../core/discord/resolvePeriodFromCommand'; +import resolvePlayerFromButton from '../core/discord/resolvePlayerFromButton'; +import resolvePlayerFromCommand, { + ResolvedPlayer, +} from '../core/discord/resolvePlayerFromCommand'; import { StatFilters, filterStats } from '../core/statistics/filterStats'; import { CommandRegistryRaw } from '../events/interactionCreate'; @@ -83,7 +83,7 @@ export const statsCommand = new Promise(async (resolve) => { return Promise.all([ render(player, period, filters), - refreshButton(interaction, path), + buttonRefresh(interaction, path), getBlitzStarsLinkButton(player.region, player.id), ]); }, diff --git a/src/commands/today.tsx b/src/commands/today.tsx index 537e06a9d..2de10c577 100644 --- a/src/commands/today.tsx +++ b/src/commands/today.tsx @@ -1,12 +1,12 @@ import { SlashCommandBuilder } from 'discord.js'; -import linkButton from '../LEGACY_core/discord/linkButton'; -import primaryButton from '../LEGACY_core/discord/primaryButton'; -import resolvePlayerFromButton from '../LEGACY_core/discord/resolvePlayerFromButton'; -import resolvePlayerFromCommand from '../LEGACY_core/discord/resolvePlayerFromCommand'; import { getAccountInfo } from '../core/blitz/getAccountInfo'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteUsername from '../core/discord/autocompleteUsername'; +import buttonLink from '../core/discord/buttonLink'; +import buttonPrimary from '../core/discord/buttonPrimary'; import commandToURL from '../core/discord/commandToURL'; +import resolvePlayerFromButton from '../core/discord/resolvePlayerFromButton'; +import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand'; import { CommandRegistry } from '../events/interactionCreate'; import today from '../renderers/today'; @@ -58,9 +58,9 @@ export const todayCommand: CommandRegistry = { return [ await today(player, cutoff, maximized, showTotal, false), - primaryButton(path, 'Refresh'), + buttonPrimary(path, 'Refresh'), // linkButton(`https://example.com/${path}`, 'Embed'), - linkButton( + buttonLink( `https://www.blitzstars.com/player/${player.region}/${nickname}`, 'BlitzStars', ), diff --git a/src/components/GenericAllStats/index.tsx b/src/components/GenericAllStats/index.tsx index aa8493d16..3304b780e 100644 --- a/src/components/GenericAllStats/index.tsx +++ b/src/components/GenericAllStats/index.tsx @@ -1,6 +1,6 @@ import { AllStats, SupplementaryStats } from '../../core/blitz/getAccountInfo'; import getWN8Percentile from '../../core/statistics/getWN8Percentile'; -import isNumber from '../../LEGACY_core/node/isNumber'; +import isNumber from '../../core/math/isNumber'; import { Card } from './components/Card'; import { Root } from './components/Root'; import { Row } from './components/Row'; diff --git a/src/core/blitzkrieg/getArchivedRatingsInfo.ts b/src/core/blitzkrieg/getArchivedRatingsInfo.ts index 49533e048..bd5a26135 100644 --- a/src/core/blitzkrieg/getArchivedRatingsInfo.ts +++ b/src/core/blitzkrieg/getArchivedRatingsInfo.ts @@ -1,8 +1,8 @@ -import { octokit } from '../../LEGACY_core/github/octokit'; import throwError from '../../LEGACY_core/node/throwError'; import { RatingsInfo } from '../../commands/ratings'; import { Region } from '../../constants/regions'; import { DATABASE_REPO } from './getMidnightLeaderboard'; +import { octokit } from './octokit'; const ARCHIVED_RATINGS_CACHE: Record< Region, diff --git a/src/LEGACY_core/node/getClientId.ts b/src/core/blitzkrieg/getClientId.ts similarity index 100% rename from src/LEGACY_core/node/getClientId.ts rename to src/core/blitzkrieg/getClientId.ts diff --git a/src/core/blitzkrieg/getMidnightLeaderboard.ts b/src/core/blitzkrieg/getMidnightLeaderboard.ts index 257033227..17794025d 100644 --- a/src/core/blitzkrieg/getMidnightLeaderboard.ts +++ b/src/core/blitzkrieg/getMidnightLeaderboard.ts @@ -1,6 +1,6 @@ import { BlitzkriegRatingsLeaderboard } from '../../../scripts/buildRatingsLeaderboard'; import { Region } from '../../constants/regions'; -import { octokit } from '../../LEGACY_core/github/octokit'; +import { octokit } from './octokit'; export const DATABASE_REPO = { owner: 'tresabhi', repo: 'blitzkrieg-db' }; diff --git a/src/LEGACY_core/node/isDev.ts b/src/core/blitzkrieg/isDev.ts similarity index 100% rename from src/LEGACY_core/node/isDev.ts rename to src/core/blitzkrieg/isDev.ts diff --git a/src/LEGACY_core/node/jsxToPng.ts b/src/core/blitzkrieg/jsxToPng.ts similarity index 100% rename from src/LEGACY_core/node/jsxToPng.ts rename to src/core/blitzkrieg/jsxToPng.ts diff --git a/src/LEGACY_core/node/jsxToSvg.ts b/src/core/blitzkrieg/jsxToSvg.ts similarity index 100% rename from src/LEGACY_core/node/jsxToSvg.ts rename to src/core/blitzkrieg/jsxToSvg.ts diff --git a/src/LEGACY_core/github/octokit.ts b/src/core/blitzkrieg/octokit.ts similarity index 64% rename from src/LEGACY_core/github/octokit.ts rename to src/core/blitzkrieg/octokit.ts index 6e87855d7..3f67fdf51 100644 --- a/src/LEGACY_core/github/octokit.ts +++ b/src/core/blitzkrieg/octokit.ts @@ -1,4 +1,4 @@ import { Octokit } from '@octokit/rest'; -import { secrets } from '../node/secrets'; +import { secrets } from '../../LEGACY_core/node/secrets'; export const octokit = new Octokit({ auth: secrets.GH_TOKEN }); diff --git a/src/LEGACY_core/node/svgToPng.ts b/src/core/blitzkrieg/svgToPng.ts similarity index 100% rename from src/LEGACY_core/node/svgToPng.ts rename to src/core/blitzkrieg/svgToPng.ts diff --git a/src/core/blitzstars/getBlitzStarsLinkButton.ts b/src/core/blitzstars/getBlitzStarsLinkButton.ts index 049ff8d1d..da2074adc 100644 --- a/src/core/blitzstars/getBlitzStarsLinkButton.ts +++ b/src/core/blitzstars/getBlitzStarsLinkButton.ts @@ -1,6 +1,6 @@ -import linkButton from '../../LEGACY_core/discord/linkButton'; import { Region } from '../../constants/regions'; import { getAccountInfo } from '../blitz/getAccountInfo'; +import buttonLink from '../discord/buttonLink'; export async function getBlitzStarsLinkButton( region: Region, @@ -9,7 +9,7 @@ export async function getBlitzStarsLinkButton( ) { const { nickname } = await getAccountInfo(region, id); - return linkButton( + return buttonLink( `https://www.blitzstars.com/player/${region}/${nickname}${ tankId ? `/tank/${tankId!}` : '' }`, diff --git a/src/LEGACY_core/discord/linkButton.ts b/src/core/discord/buttonLink.ts similarity index 90% rename from src/LEGACY_core/discord/linkButton.ts rename to src/core/discord/buttonLink.ts index c553b009b..5df2dfdf9 100644 --- a/src/LEGACY_core/discord/linkButton.ts +++ b/src/core/discord/buttonLink.ts @@ -4,7 +4,7 @@ import { ComponentEmojiResolvable, } from 'discord.js'; -export default function linkButton( +export default function buttonLink( url: string, label: string, emoji?: ComponentEmojiResolvable, diff --git a/src/LEGACY_core/discord/primaryButton.ts b/src/core/discord/buttonPrimary.ts similarity index 89% rename from src/LEGACY_core/discord/primaryButton.ts rename to src/core/discord/buttonPrimary.ts index eee16a2f4..9a38a56b5 100644 --- a/src/LEGACY_core/discord/primaryButton.ts +++ b/src/core/discord/buttonPrimary.ts @@ -4,7 +4,7 @@ import { ComponentEmojiResolvable, } from 'discord.js'; -export default function primaryButton( +export default function buttonPrimary( id: string, label: string, emoji?: ComponentEmojiResolvable, diff --git a/src/LEGACY_core/discord/refreshButton.ts b/src/core/discord/buttonRefresh.ts similarity index 68% rename from src/LEGACY_core/discord/refreshButton.ts rename to src/core/discord/buttonRefresh.ts index 61394afd5..0a210a006 100644 --- a/src/LEGACY_core/discord/refreshButton.ts +++ b/src/core/discord/buttonRefresh.ts @@ -1,7 +1,7 @@ import { ChatInputCommandInteraction } from 'discord.js'; -import primaryButton from './primaryButton'; +import buttonPrimary from './buttonPrimary'; -export function refreshButton( +export function buttonRefresh( interaction: ChatInputCommandInteraction, path: string, ) { @@ -9,7 +9,7 @@ export function refreshButton( interaction.appPermissions?.has('AttachFiles') && interaction.appPermissions?.has('ViewChannel') ) { - return primaryButton(path, 'Refresh'); + return buttonPrimary(path, 'Refresh'); } return null; diff --git a/src/core/discord/commandToURL.ts b/src/core/discord/commandToURL.ts index 9ea5db481..bad50d302 100644 --- a/src/core/discord/commandToURL.ts +++ b/src/core/discord/commandToURL.ts @@ -4,6 +4,9 @@ export interface Parameters { [key: string]: string | number | boolean | undefined | null; } +// TODO: automatically infer command options??? +// but how would that work with the region and id options? + export default function commandToURL( interaction: ChatInputCommandInteraction, parameters?: Parameters, diff --git a/src/LEGACY_core/discord/markdownTable.ts b/src/core/discord/markdownTable.ts similarity index 100% rename from src/LEGACY_core/discord/markdownTable.ts rename to src/core/discord/markdownTable.ts diff --git a/src/LEGACY_core/discord/normalizeInteractionReturnable.ts b/src/core/discord/normalizeInteractionReturnable.ts similarity index 96% rename from src/LEGACY_core/discord/normalizeInteractionReturnable.ts rename to src/core/discord/normalizeInteractionReturnable.ts index 0ee6cd014..5f8da39da 100644 --- a/src/LEGACY_core/discord/normalizeInteractionReturnable.ts +++ b/src/core/discord/normalizeInteractionReturnable.ts @@ -6,7 +6,7 @@ import { InteractionEditReplyOptions, } from 'discord.js'; import { InteractionReturnable } from '../../events/interactionCreate'; -import jsxToPng from '../node/jsxToPng'; +import jsxToPng from '../blitzkrieg/jsxToPng'; export default async function normalizeInteractionReturnable( returnable: InteractionReturnable, diff --git a/src/LEGACY_core/discord/psa.ts b/src/core/discord/psa.ts similarity index 100% rename from src/LEGACY_core/discord/psa.ts rename to src/core/discord/psa.ts diff --git a/src/LEGACY_core/discord/resolveClanFromCommand.ts b/src/core/discord/resolveClanFromCommand.ts similarity index 86% rename from src/LEGACY_core/discord/resolveClanFromCommand.ts rename to src/core/discord/resolveClanFromCommand.ts index 479e7b96f..f9e8ca5aa 100644 --- a/src/LEGACY_core/discord/resolveClanFromCommand.ts +++ b/src/core/discord/resolveClanFromCommand.ts @@ -1,7 +1,7 @@ import { ChatInputCommandInteraction } from 'discord.js'; +import throwError from '../../LEGACY_core/node/throwError'; import { Region } from '../../constants/regions'; -import searchClansAcrossRegions from '../../core/blitz/searchClansAcrossRegions'; -import throwError from '../node/throwError'; +import searchClansAcrossRegions from '../blitz/searchClansAcrossRegions'; import { serverAndIdPattern } from './resolvePlayerFromCommand'; export default async function resolveClanFromCommand( diff --git a/src/LEGACY_core/discord/resolvePeriodFromButton.ts b/src/core/discord/resolvePeriodFromButton.ts similarity index 81% rename from src/LEGACY_core/discord/resolvePeriodFromButton.ts rename to src/core/discord/resolvePeriodFromButton.ts index 9c6ecd833..5498b7553 100644 --- a/src/LEGACY_core/discord/resolvePeriodFromButton.ts +++ b/src/core/discord/resolvePeriodFromButton.ts @@ -1,9 +1,9 @@ import { ButtonInteraction } from 'discord.js'; import { Region } from '../../constants/regions'; -import getPeriodNow from '../../core/blitzkrieg/getPeriodNow'; -import getPeriodStart from '../../core/blitzkrieg/getPeriodStart'; -import getTimeDaysAgo from '../../core/blitzkrieg/getTimeDaysAgo'; -import { PeriodType } from '../../core/discord/addPeriodSubCommands'; +import getPeriodNow from '../blitzkrieg/getPeriodNow'; +import getPeriodStart from '../blitzkrieg/getPeriodStart'; +import getTimeDaysAgo from '../blitzkrieg/getTimeDaysAgo'; +import { PeriodType } from './addPeriodSubCommands'; import { ResolvedPeriod, getPeriodOptionName, diff --git a/src/LEGACY_core/discord/resolvePeriodFromCommand.ts b/src/core/discord/resolvePeriodFromCommand.ts similarity index 82% rename from src/LEGACY_core/discord/resolvePeriodFromCommand.ts rename to src/core/discord/resolvePeriodFromCommand.ts index af5a081e2..a09da237d 100644 --- a/src/LEGACY_core/discord/resolvePeriodFromCommand.ts +++ b/src/core/discord/resolvePeriodFromCommand.ts @@ -1,12 +1,9 @@ import { CacheType, ChatInputCommandInteraction } from 'discord.js'; import { Region } from '../../constants/regions'; -import getPeriodNow from '../../core/blitzkrieg/getPeriodNow'; -import getPeriodStart from '../../core/blitzkrieg/getPeriodStart'; -import getTimeDaysAgo from '../../core/blitzkrieg/getTimeDaysAgo'; -import { - PeriodSize, - PeriodType, -} from '../../core/discord/addPeriodSubCommands'; +import getPeriodNow from '../blitzkrieg/getPeriodNow'; +import getPeriodStart from '../blitzkrieg/getPeriodStart'; +import getTimeDaysAgo from '../blitzkrieg/getTimeDaysAgo'; +import { PeriodSize, PeriodType } from './addPeriodSubCommands'; export function getPeriodOptionName(period: PeriodSize) { if (period === 'career') return 'Career'; diff --git a/src/LEGACY_core/discord/resolvePlayerFromButton.ts b/src/core/discord/resolvePlayerFromButton.ts similarity index 100% rename from src/LEGACY_core/discord/resolvePlayerFromButton.ts rename to src/core/discord/resolvePlayerFromButton.ts diff --git a/src/LEGACY_core/discord/resolvePlayerFromCommand.ts b/src/core/discord/resolvePlayerFromCommand.ts similarity index 88% rename from src/LEGACY_core/discord/resolvePlayerFromCommand.ts rename to src/core/discord/resolvePlayerFromCommand.ts index b28d3cd8f..7991deb01 100644 --- a/src/LEGACY_core/discord/resolvePlayerFromCommand.ts +++ b/src/core/discord/resolvePlayerFromCommand.ts @@ -1,9 +1,9 @@ import { CacheType, ChatInputCommandInteraction } from 'discord.js'; import markdownEscape from 'markdown-escape'; +import throwError from '../../LEGACY_core/node/throwError'; import { Region } from '../../constants/regions'; -import searchPlayersAcrossRegions from '../../core/blitz/searchPlayersAcrossRegions'; -import { getBlitzFromDiscord } from '../../core/blitzkrieg/discordBlitz'; -import throwError from '../node/throwError'; +import searchPlayersAcrossRegions from '../blitz/searchPlayersAcrossRegions'; +import { getBlitzFromDiscord } from '../blitzkrieg/discordBlitz'; export const serverAndIdPattern = /(com|eu|asia)\/[0-9]+/; diff --git a/src/LEGACY_core/node/isNumber.ts b/src/core/math/isNumber.ts similarity index 100% rename from src/LEGACY_core/node/isNumber.ts rename to src/core/math/isNumber.ts diff --git a/src/events/interactionCreate/handlers/button.tsx b/src/events/interactionCreate/handlers/button.tsx index d819a6927..79ac496cd 100644 --- a/src/events/interactionCreate/handlers/button.tsx +++ b/src/events/interactionCreate/handlers/button.tsx @@ -1,7 +1,7 @@ import { ButtonInteraction, CacheType } from 'discord.js'; import { commands } from '..'; -import normalizeInteractionReturnable from '../../../LEGACY_core/discord/normalizeInteractionReturnable'; import throwError from '../../../LEGACY_core/node/throwError'; +import normalizeInteractionReturnable from '../../../core/discord/normalizeInteractionReturnable'; export default async function handleButton( interaction: ButtonInteraction, diff --git a/src/events/interactionCreate/handlers/chatInputCommand.ts b/src/events/interactionCreate/handlers/chatInputCommand.ts index 1cc146887..039e4fd0e 100644 --- a/src/events/interactionCreate/handlers/chatInputCommand.ts +++ b/src/events/interactionCreate/handlers/chatInputCommand.ts @@ -7,10 +7,10 @@ import { } from 'discord.js'; import { commands } from '..'; import discord from '../../../../discord.json' assert { type: 'json' }; -import normalizeInteractionReturnable from '../../../LEGACY_core/discord/normalizeInteractionReturnable'; -import { psa } from '../../../LEGACY_core/discord/psa'; +import { psa } from '../../../core/discord/psa'; import embedNegative from '../../../core/discord/embedNegative'; import embedWarning from '../../../core/discord/embedWarning'; +import normalizeInteractionReturnable from '../../../core/discord/normalizeInteractionReturnable'; export default async function handleChatInputCommand( interaction: ChatInputCommandInteraction, diff --git a/src/events/interactionCreate/index.ts b/src/events/interactionCreate/index.ts index 6f988c149..67dd931b7 100644 --- a/src/events/interactionCreate/index.ts +++ b/src/events/interactionCreate/index.ts @@ -14,8 +14,6 @@ import { SlashCommandSubcommandsOnlyBuilder, } from 'discord.js'; import discord from '../../../discord.json' assert { type: 'json' }; -import getClientId from '../../LEGACY_core/node/getClientId'; -import isDev from '../../LEGACY_core/node/isDev'; import { secrets } from '../../LEGACY_core/node/secrets'; import { aboutCommand } from '../../commands/about'; import { debugCommand } from '../../commands/debug'; @@ -34,6 +32,8 @@ import { searchPlayersCommand } from '../../commands/searchPlayers'; import { searchTanksCommand } from '../../commands/searchTanks'; import { statsCommand } from '../../commands/stats'; import { todayCommand } from '../../commands/today'; +import getClientId from '../../core/blitzkrieg/getClientId'; +import isDev from '../../core/blitzkrieg/isDev'; import handleAutocomplete from './handlers/autocomplete'; import handleButton from './handlers/button'; import handleChatInputCommand from './handlers/chatInputCommand'; diff --git a/src/events/ready.ts b/src/events/ready.ts index 9307a98fa..6e41e3b45 100644 --- a/src/events/ready.ts +++ b/src/events/ready.ts @@ -1,5 +1,5 @@ import { Client } from 'discord.js'; -import isDev from '../LEGACY_core/node/isDev'; +import isDev from '../core/blitzkrieg/isDev'; export default function ready(client: Client) { console.log( diff --git a/src/renderers/today.tsx b/src/renderers/today.tsx index 6f0710599..675497ca6 100644 --- a/src/renderers/today.tsx +++ b/src/renderers/today.tsx @@ -1,4 +1,3 @@ -import { ResolvedPlayer } from '../LEGACY_core/discord/resolvePlayerFromCommand'; import * as Breakdown from '../components/Breakdown'; import NoData, { NoDataType } from '../components/NoData'; import TitleBar from '../components/TitleBar'; @@ -13,6 +12,7 @@ import getTimeDaysAgo from '../core/blitzkrieg/getTimeDaysAgo'; import getStatsInPeriod from '../core/blitzstars/getStatsInPeriod'; import { tankAverages } from '../core/blitzstars/tankAverages'; import { tankopedia } from '../core/blitzstars/tankopedia'; +import { ResolvedPlayer } from '../core/discord/resolvePlayerFromCommand'; import calculateWN8 from '../core/statistics/calculateWN8'; import getWN8Percentile from '../core/statistics/getWN8Percentile'; import sumStats from '../core/statistics/sumStats'; From ec00bdf9de3219cbe91a78851175d44b737cccb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sat, 14 Oct 2023 11:36:48 -0500 Subject: [PATCH 28/43] feat: core chunk 8 --- src/bot.ts | 4 ++-- src/commands/ratings.tsx | 2 +- src/core/blitz/fetchWargaming.ts | 2 +- src/core/blitz/getTankStats.ts | 2 +- src/core/blitz/resolveTankId.ts | 2 +- src/core/blitzkrieg/getArchivedRatingsInfo.ts | 2 +- src/core/blitzkrieg/octokit.ts | 2 +- src/{LEGACY_core/node => core/blitzkrieg}/processes.ts | 4 ++-- src/{LEGACY_core/node => core/blitzkrieg}/secrets.ts | 0 src/{LEGACY_core/node => core/blitzkrieg}/throwError.ts | 0 src/core/discord/resolveClanFromCommand.ts | 2 +- src/core/discord/resolvePlayerFromCommand.ts | 2 +- src/events/interactionCreate/handlers/button.tsx | 2 +- src/events/interactionCreate/index.ts | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) rename src/{LEGACY_core/node => core/blitzkrieg}/processes.ts (82%) rename src/{LEGACY_core/node => core/blitzkrieg}/secrets.ts (100%) rename src/{LEGACY_core/node => core/blitzkrieg}/throwError.ts (100%) diff --git a/src/bot.ts b/src/bot.ts index 36c339a74..71c0f155b 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -1,6 +1,6 @@ +import { registerProcesses } from './core/blitzkrieg/processes'; +import { secrets } from './core/blitzkrieg/secrets'; import { client } from './core/discord/client'; -import { registerProcesses } from './LEGACY_core/node/processes'; -import { secrets } from './LEGACY_core/node/secrets'; registerProcesses(); client.login(secrets.DISCORD_TOKEN); diff --git a/src/commands/ratings.tsx b/src/commands/ratings.tsx index 334ff9da7..f7ed5b22e 100644 --- a/src/commands/ratings.tsx +++ b/src/commands/ratings.tsx @@ -5,7 +5,6 @@ import { SlashCommandSubcommandGroupBuilder, } from 'discord.js'; import { BlitzkriegRatingsLeaderboard } from '../../scripts/buildRatingsLeaderboard'; -import throwError from '../LEGACY_core/node/throwError'; import * as Leaderboard from '../components/Leaderboard'; import TitleBar from '../components/TitleBar'; import Wrapper from '../components/Wrapper'; @@ -19,6 +18,7 @@ import getMidnightLeaderboard, { DATABASE_REPO, } from '../core/blitzkrieg/getMidnightLeaderboard'; import { octokit } from '../core/blitzkrieg/octokit'; +import throwError from '../core/blitzkrieg/throwError'; import addRegionChoices from '../core/discord/addRegionChoices'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteUsername from '../core/discord/autocompleteUsername'; diff --git a/src/core/blitz/fetchWargaming.ts b/src/core/blitz/fetchWargaming.ts index 0fd760a60..86f99ac71 100644 --- a/src/core/blitz/fetchWargaming.ts +++ b/src/core/blitz/fetchWargaming.ts @@ -1,4 +1,4 @@ -import throwError from '../../LEGACY_core/node/throwError'; +import throwError from '../blitzkrieg/throwError'; export type BlitzResponse = | { diff --git a/src/core/blitz/getTankStats.ts b/src/core/blitz/getTankStats.ts index b2d29c8d6..3d435143c 100644 --- a/src/core/blitz/getTankStats.ts +++ b/src/core/blitz/getTankStats.ts @@ -1,7 +1,7 @@ import { Region } from '../../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; -import throwError from '../../LEGACY_core/node/throwError'; import { TanksStats } from '../../types/tanksStats'; +import throwError from '../blitzkrieg/throwError'; import fetchBlitz from './fetchWargaming'; export default async function getTankStats(region: Region, id: number) { diff --git a/src/core/blitz/resolveTankId.ts b/src/core/blitz/resolveTankId.ts index 7b3a10ce4..391785fbe 100644 --- a/src/core/blitz/resolveTankId.ts +++ b/src/core/blitz/resolveTankId.ts @@ -1,5 +1,5 @@ import { go } from 'fuzzysort'; -import throwError from '../../LEGACY_core/node/throwError'; +import throwError from '../blitzkrieg/throwError'; import { TANKS, tankopedia } from '../blitzstars/tankopedia'; export default async function resolveTankId(tank: string | number) { diff --git a/src/core/blitzkrieg/getArchivedRatingsInfo.ts b/src/core/blitzkrieg/getArchivedRatingsInfo.ts index bd5a26135..6a97afcef 100644 --- a/src/core/blitzkrieg/getArchivedRatingsInfo.ts +++ b/src/core/blitzkrieg/getArchivedRatingsInfo.ts @@ -1,8 +1,8 @@ -import throwError from '../../LEGACY_core/node/throwError'; import { RatingsInfo } from '../../commands/ratings'; import { Region } from '../../constants/regions'; import { DATABASE_REPO } from './getMidnightLeaderboard'; import { octokit } from './octokit'; +import throwError from './throwError'; const ARCHIVED_RATINGS_CACHE: Record< Region, diff --git a/src/core/blitzkrieg/octokit.ts b/src/core/blitzkrieg/octokit.ts index 3f67fdf51..509aafa5a 100644 --- a/src/core/blitzkrieg/octokit.ts +++ b/src/core/blitzkrieg/octokit.ts @@ -1,4 +1,4 @@ import { Octokit } from '@octokit/rest'; -import { secrets } from '../../LEGACY_core/node/secrets'; +import { secrets } from './secrets'; export const octokit = new Octokit({ auth: secrets.GH_TOKEN }); diff --git a/src/LEGACY_core/node/processes.ts b/src/core/blitzkrieg/processes.ts similarity index 82% rename from src/LEGACY_core/node/processes.ts rename to src/core/blitzkrieg/processes.ts index 5fd37f005..9834d616c 100644 --- a/src/LEGACY_core/node/processes.ts +++ b/src/core/blitzkrieg/processes.ts @@ -1,5 +1,5 @@ -import { discordBlitzDB } from '../../core/blitzkrieg/discordBlitz'; -import { client } from '../../core/discord/client'; +import { client } from '../discord/client'; +import { discordBlitzDB } from './discordBlitz'; const EXIT_EVENTS = [ 'beforeExit', diff --git a/src/LEGACY_core/node/secrets.ts b/src/core/blitzkrieg/secrets.ts similarity index 100% rename from src/LEGACY_core/node/secrets.ts rename to src/core/blitzkrieg/secrets.ts diff --git a/src/LEGACY_core/node/throwError.ts b/src/core/blitzkrieg/throwError.ts similarity index 100% rename from src/LEGACY_core/node/throwError.ts rename to src/core/blitzkrieg/throwError.ts diff --git a/src/core/discord/resolveClanFromCommand.ts b/src/core/discord/resolveClanFromCommand.ts index f9e8ca5aa..f9828d0c0 100644 --- a/src/core/discord/resolveClanFromCommand.ts +++ b/src/core/discord/resolveClanFromCommand.ts @@ -1,7 +1,7 @@ import { ChatInputCommandInteraction } from 'discord.js'; -import throwError from '../../LEGACY_core/node/throwError'; import { Region } from '../../constants/regions'; import searchClansAcrossRegions from '../blitz/searchClansAcrossRegions'; +import throwError from '../blitzkrieg/throwError'; import { serverAndIdPattern } from './resolvePlayerFromCommand'; export default async function resolveClanFromCommand( diff --git a/src/core/discord/resolvePlayerFromCommand.ts b/src/core/discord/resolvePlayerFromCommand.ts index 7991deb01..5a53615c0 100644 --- a/src/core/discord/resolvePlayerFromCommand.ts +++ b/src/core/discord/resolvePlayerFromCommand.ts @@ -1,9 +1,9 @@ import { CacheType, ChatInputCommandInteraction } from 'discord.js'; import markdownEscape from 'markdown-escape'; -import throwError from '../../LEGACY_core/node/throwError'; import { Region } from '../../constants/regions'; import searchPlayersAcrossRegions from '../blitz/searchPlayersAcrossRegions'; import { getBlitzFromDiscord } from '../blitzkrieg/discordBlitz'; +import throwError from '../blitzkrieg/throwError'; export const serverAndIdPattern = /(com|eu|asia)\/[0-9]+/; diff --git a/src/events/interactionCreate/handlers/button.tsx b/src/events/interactionCreate/handlers/button.tsx index 79ac496cd..4394a54ce 100644 --- a/src/events/interactionCreate/handlers/button.tsx +++ b/src/events/interactionCreate/handlers/button.tsx @@ -1,6 +1,6 @@ import { ButtonInteraction, CacheType } from 'discord.js'; import { commands } from '..'; -import throwError from '../../../LEGACY_core/node/throwError'; +import throwError from '../../../core/blitzkrieg/throwError'; import normalizeInteractionReturnable from '../../../core/discord/normalizeInteractionReturnable'; export default async function handleButton( diff --git a/src/events/interactionCreate/index.ts b/src/events/interactionCreate/index.ts index 67dd931b7..730b45ed5 100644 --- a/src/events/interactionCreate/index.ts +++ b/src/events/interactionCreate/index.ts @@ -14,7 +14,6 @@ import { SlashCommandSubcommandsOnlyBuilder, } from 'discord.js'; import discord from '../../../discord.json' assert { type: 'json' }; -import { secrets } from '../../LEGACY_core/node/secrets'; import { aboutCommand } from '../../commands/about'; import { debugCommand } from '../../commands/debug'; import { eligibleCommand } from '../../commands/eligible'; @@ -34,6 +33,7 @@ import { statsCommand } from '../../commands/stats'; import { todayCommand } from '../../commands/today'; import getClientId from '../../core/blitzkrieg/getClientId'; import isDev from '../../core/blitzkrieg/isDev'; +import { secrets } from '../../core/blitzkrieg/secrets'; import handleAutocomplete from './handlers/autocomplete'; import handleButton from './handlers/button'; import handleChatInputCommand from './handlers/chatInputCommand'; From 4e0321ca5f5a4878faacb5662815a46445d48566 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sat, 14 Oct 2023 11:38:07 -0500 Subject: [PATCH 29/43] fix: removed unused pallets --- src/stitches.config.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/stitches.config.ts b/src/stitches.config.ts index f8f9a2a92..0e5b70ea0 100644 --- a/src/stitches.config.ts +++ b/src/stitches.config.ts @@ -4,7 +4,6 @@ import { slate, slateDark, tealDark, - tomatoDark, } from '@radix-ui/colors'; import { createBorderStyles, createColors, createSpaces } from 'bepaint'; @@ -18,14 +17,12 @@ export const theme = { ...createColors(amberDark, 'amber'), ...createColors(blueDark, 'blue'), - ...createColors(tomatoDark, 'red'), ...createColors(tealDark, 'teal'), }, borderStyles: { ...createBorderStyles(slateDark), ...createBorderStyles(blueDark, undefined, 'blue'), - ...createBorderStyles(tomatoDark, undefined, 'red'), }, durations: { From d3bbc7f2b015e7548e313c16ae72cea1ff7255de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sat, 14 Oct 2023 11:40:16 -0500 Subject: [PATCH 30/43] feat: merge renderers --- src/commands/today.tsx | 210 +++++++++++++++++++++++++++++++++++++++- src/renderers/today.tsx | 201 -------------------------------------- 2 files changed, 205 insertions(+), 206 deletions(-) delete mode 100644 src/renderers/today.tsx diff --git a/src/commands/today.tsx b/src/commands/today.tsx index 2de10c577..c549c4845 100644 --- a/src/commands/today.tsx +++ b/src/commands/today.tsx @@ -1,14 +1,214 @@ import { SlashCommandBuilder } from 'discord.js'; -import { getAccountInfo } from '../core/blitz/getAccountInfo'; +import * as Breakdown from '../components/Breakdown'; +import NoData, { NoDataType } from '../components/NoData'; +import TitleBar from '../components/TitleBar'; +import Wrapper from '../components/Wrapper'; +import { AllStats, getAccountInfo } from '../core/blitz/getAccountInfo'; +import { getClanAccountInfo } from '../core/blitz/getClanAccountInfo'; +import getTankStats from '../core/blitz/getTankStats'; +import getTreeType from '../core/blitz/getTreeType'; +import resolveTankName from '../core/blitz/resolveTankName'; +import getPeriodNow from '../core/blitzkrieg/getPeriodNow'; +import getTimeDaysAgo from '../core/blitzkrieg/getTimeDaysAgo'; +import getStatsInPeriod from '../core/blitzstars/getStatsInPeriod'; +import { tankAverages } from '../core/blitzstars/tankAverages'; +import { tankopedia } from '../core/blitzstars/tankopedia'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteUsername from '../core/discord/autocompleteUsername'; import buttonLink from '../core/discord/buttonLink'; import buttonPrimary from '../core/discord/buttonPrimary'; import commandToURL from '../core/discord/commandToURL'; import resolvePlayerFromButton from '../core/discord/resolvePlayerFromButton'; -import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand'; +import resolvePlayerFromCommand, { + ResolvedPlayer, +} from '../core/discord/resolvePlayerFromCommand'; +import calculateWN8 from '../core/statistics/calculateWN8'; +import getWN8Percentile from '../core/statistics/getWN8Percentile'; +import sumStats from '../core/statistics/sumStats'; import { CommandRegistry } from '../events/interactionCreate'; -import today from '../renderers/today'; +import { PossiblyPromise } from '../types/possiblyPromise'; + +async function render( + { region: server, id }: ResolvedPlayer, + cutoff = Infinity, + maximized = 4, + showTotal = true, + naked?: boolean, +) { + const { diff: diffed, order } = await getStatsInPeriod( + server, + id, + getTimeDaysAgo(server, 1), + getPeriodNow(), + ); + const accountInfo = await getAccountInfo(server, id); + const clanData = await getClanAccountInfo(server, id); + const careerTankStatsRaw = await getTankStats(server, id); + const careerStats: Record = showTotal + ? { + 0: accountInfo.statistics.all, + } + : {}; + const allStatsToAccumulate: AllStats[] = []; + + Object.entries(diffed).forEach(([, tankStats]) => { + allStatsToAccumulate.push(tankStats); + }); + Object.entries(careerTankStatsRaw).forEach(([, tankStats]) => { + careerStats[tankStats.tank_id] = tankStats.all; + }); + + const accumulatedStats = sumStats(allStatsToAccumulate); + + if (showTotal && Object.keys(diffed).length > 0) { + diffed[0] = accumulatedStats; + } + + const tankStatsOverTimeEntries = Object.entries(diffed); + const todayWN8s = await tankStatsOverTimeEntries.reduce< + PossiblyPromise> + >(async (accumulator, [tankIdString, tankStats]) => { + const tankId = parseInt(tankIdString); + + return (showTotal && tankId === 0) || !(await tankAverages)[tankId] + ? accumulator + : { + ...(await accumulator), + [tankId]: calculateWN8((await tankAverages)[tankId].all, tankStats), + }; + }, {}); + + const careerWN8s = await careerTankStatsRaw.reduce< + PossiblyPromise> + >(async (accumulator, { tank_id }) => { + return (showTotal && tank_id === 0) || + (await tankAverages)[tank_id] === undefined + ? accumulator + : { + ...(await accumulator), + [tank_id]: calculateWN8( + (await tankAverages)[tank_id].all, + careerStats[tank_id], + ), + }; + }, {}); + const todayWN8sEntries = Object.entries(todayWN8s); + const careerWN8sEntries = Object.entries(careerWN8s); + + if (showTotal) { + todayWN8s[0] = + todayWN8sEntries.reduce( + (accumulator, [tankIdString, wn8]) => + accumulator + wn8 * diffed[Number(tankIdString)].battles, + 0, + ) / + todayWN8sEntries.reduce( + (accumulator, [tankIdString]) => + accumulator + diffed[Number(tankIdString)].battles, + 0, + ); + careerWN8s[0] = + careerWN8sEntries.reduce( + (accumulator, [tankIdString, WN8]) => + isNaN(WN8) + ? accumulator + : accumulator + WN8 * careerStats[Number(tankIdString)].battles, + 0, + ) / + careerWN8sEntries.reduce( + (accumulator, [tankIdString, WN8]) => + isNaN(WN8) + ? accumulator + : accumulator + careerStats[Number(tankIdString)].battles, + 0, + ); + } + + const rows = await Promise.all( + [ + // this code unreadable on god will forget tomorrow no cap + ...(order.length === 0 || !showTotal ? [] : [0]), + ...(isFinite(cutoff) ? order.slice(0, cutoff) : order), + ].map(async (id, index) => { + const tankStats = diffed[id]; + const career = careerStats[id]; + const tankopediaEntry = (await tankopedia)[id]; + + return ( + maximized : index + 1 > maximized} + stats={[ + { + title: 'Battles', + current: tankStats.battles.toLocaleString(), + career: career.battles.toLocaleString(), + }, + { + title: 'Winrate', + current: `${(100 * (tankStats.wins / tankStats.battles)).toFixed( + 2, + )}%`, + career: `${(100 * (career.wins / career.battles)).toFixed(2)}%`, + delta: + tankStats.wins / tankStats.battles - + career.wins / career.battles, + }, + { + title: 'WN8', + current: isNaN(todayWN8s[id]) + ? undefined + : Math.round(todayWN8s[id]).toLocaleString(), + career: isNaN(careerWN8s[id]) + ? undefined + : Math.round(careerWN8s[id]).toLocaleString(), + percentile: isNaN(todayWN8s[id]) + ? undefined + : getWN8Percentile(todayWN8s[id]), + }, + { + title: 'Damage', + current: Math.round( + tankStats.damage_dealt / tankStats.battles, + ).toLocaleString(), + career: Math.round( + career.damage_dealt / career.battles, + ).toLocaleString(), + delta: + tankStats.damage_dealt / tankStats.battles - + career.damage_dealt / career.battles, + }, + ]} + /> + ); + }), + ); + + return naked ? ( + + {rows} + + ) : ( + + + + {rows.length === 0 && } + {rows.length > 0 && {rows}} + + ); +} export const todayCommand: CommandRegistry = { inProduction: true, @@ -57,7 +257,7 @@ export const todayCommand: CommandRegistry = { }); return [ - await today(player, cutoff, maximized, showTotal, false), + await render(player, cutoff, maximized, showTotal, false), buttonPrimary(path, 'Refresh'), // linkButton(`https://example.com/${path}`, 'Embed'), buttonLink( @@ -72,6 +272,6 @@ export const todayCommand: CommandRegistry = { async button(interaction) { const player = await resolvePlayerFromButton(interaction); - return await today(player); + return await render(player); }, }; diff --git a/src/renderers/today.tsx b/src/renderers/today.tsx deleted file mode 100644 index 675497ca6..000000000 --- a/src/renderers/today.tsx +++ /dev/null @@ -1,201 +0,0 @@ -import * as Breakdown from '../components/Breakdown'; -import NoData, { NoDataType } from '../components/NoData'; -import TitleBar from '../components/TitleBar'; -import Wrapper from '../components/Wrapper'; -import { AllStats, getAccountInfo } from '../core/blitz/getAccountInfo'; -import { getClanAccountInfo } from '../core/blitz/getClanAccountInfo'; -import getTankStats from '../core/blitz/getTankStats'; -import getTreeType from '../core/blitz/getTreeType'; -import resolveTankName from '../core/blitz/resolveTankName'; -import getPeriodNow from '../core/blitzkrieg/getPeriodNow'; -import getTimeDaysAgo from '../core/blitzkrieg/getTimeDaysAgo'; -import getStatsInPeriod from '../core/blitzstars/getStatsInPeriod'; -import { tankAverages } from '../core/blitzstars/tankAverages'; -import { tankopedia } from '../core/blitzstars/tankopedia'; -import { ResolvedPlayer } from '../core/discord/resolvePlayerFromCommand'; -import calculateWN8 from '../core/statistics/calculateWN8'; -import getWN8Percentile from '../core/statistics/getWN8Percentile'; -import sumStats from '../core/statistics/sumStats'; -import { PossiblyPromise } from '../types/possiblyPromise'; - -export default async function today( - { region: server, id }: ResolvedPlayer, - cutoff = Infinity, - maximized = 4, - showTotal = true, - naked?: boolean, -) { - const { diff: diffed, order } = await getStatsInPeriod( - server, - id, - getTimeDaysAgo(server, 1), - getPeriodNow(), - ); - const accountInfo = await getAccountInfo(server, id); - const clanData = await getClanAccountInfo(server, id); - const careerTankStatsRaw = await getTankStats(server, id); - const careerStats: Record = showTotal - ? { - 0: accountInfo.statistics.all, - } - : {}; - const allStatsToAccumulate: AllStats[] = []; - - Object.entries(diffed).forEach(([, tankStats]) => { - allStatsToAccumulate.push(tankStats); - }); - Object.entries(careerTankStatsRaw).forEach(([, tankStats]) => { - careerStats[tankStats.tank_id] = tankStats.all; - }); - - const accumulatedStats = sumStats(allStatsToAccumulate); - - if (showTotal && Object.keys(diffed).length > 0) { - diffed[0] = accumulatedStats; - } - - const tankStatsOverTimeEntries = Object.entries(diffed); - const todayWN8s = await tankStatsOverTimeEntries.reduce< - PossiblyPromise> - >(async (accumulator, [tankIdString, tankStats]) => { - const tankId = parseInt(tankIdString); - - return (showTotal && tankId === 0) || !(await tankAverages)[tankId] - ? accumulator - : { - ...(await accumulator), - [tankId]: calculateWN8((await tankAverages)[tankId].all, tankStats), - }; - }, {}); - - const careerWN8s = await careerTankStatsRaw.reduce< - PossiblyPromise> - >(async (accumulator, { tank_id }) => { - return (showTotal && tank_id === 0) || - (await tankAverages)[tank_id] === undefined - ? accumulator - : { - ...(await accumulator), - [tank_id]: calculateWN8( - (await tankAverages)[tank_id].all, - careerStats[tank_id], - ), - }; - }, {}); - const todayWN8sEntries = Object.entries(todayWN8s); - const careerWN8sEntries = Object.entries(careerWN8s); - - if (showTotal) { - todayWN8s[0] = - todayWN8sEntries.reduce( - (accumulator, [tankIdString, wn8]) => - accumulator + wn8 * diffed[Number(tankIdString)].battles, - 0, - ) / - todayWN8sEntries.reduce( - (accumulator, [tankIdString]) => - accumulator + diffed[Number(tankIdString)].battles, - 0, - ); - careerWN8s[0] = - careerWN8sEntries.reduce( - (accumulator, [tankIdString, WN8]) => - isNaN(WN8) - ? accumulator - : accumulator + WN8 * careerStats[Number(tankIdString)].battles, - 0, - ) / - careerWN8sEntries.reduce( - (accumulator, [tankIdString, WN8]) => - isNaN(WN8) - ? accumulator - : accumulator + careerStats[Number(tankIdString)].battles, - 0, - ); - } - - const rows = await Promise.all( - [ - // this code unreadable on god will forget tomorrow no cap - ...(order.length === 0 || !showTotal ? [] : [0]), - ...(isFinite(cutoff) ? order.slice(0, cutoff) : order), - ].map(async (id, index) => { - const tankStats = diffed[id]; - const career = careerStats[id]; - const tankopediaEntry = (await tankopedia)[id]; - - return ( - maximized : index + 1 > maximized} - stats={[ - { - title: 'Battles', - current: tankStats.battles.toLocaleString(), - career: career.battles.toLocaleString(), - }, - { - title: 'Winrate', - current: `${(100 * (tankStats.wins / tankStats.battles)).toFixed( - 2, - )}%`, - career: `${(100 * (career.wins / career.battles)).toFixed(2)}%`, - delta: - tankStats.wins / tankStats.battles - - career.wins / career.battles, - }, - { - title: 'WN8', - current: isNaN(todayWN8s[id]) - ? undefined - : Math.round(todayWN8s[id]).toLocaleString(), - career: isNaN(careerWN8s[id]) - ? undefined - : Math.round(careerWN8s[id]).toLocaleString(), - percentile: isNaN(todayWN8s[id]) - ? undefined - : getWN8Percentile(todayWN8s[id]), - }, - { - title: 'Damage', - current: Math.round( - tankStats.damage_dealt / tankStats.battles, - ).toLocaleString(), - career: Math.round( - career.damage_dealt / career.battles, - ).toLocaleString(), - delta: - tankStats.damage_dealt / tankStats.battles - - career.damage_dealt / career.battles, - }, - ]} - /> - ); - }), - ); - - return naked ? ( - - {rows} - - ) : ( - - - - {rows.length === 0 && } - {rows.length > 0 && {rows}} - - ); -} From 630a37025ea9908fa188f2841037c41b7230b317 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sat, 14 Oct 2023 12:04:11 -0500 Subject: [PATCH 31/43] feat: added reset in options --- src/app/embeds/session/page.tsx | 3 +- src/app/tools/session/components/Menu.tsx | 9 +- src/app/tools/session/page.tsx | 140 ++++++++++++++-------- src/stores/session.ts | 2 + 4 files changed, 103 insertions(+), 51 deletions(-) diff --git a/src/app/embeds/session/page.tsx b/src/app/embeds/session/page.tsx index c60c1db84..b73fef64a 100644 --- a/src/app/embeds/session/page.tsx +++ b/src/app/embeds/session/page.tsx @@ -18,6 +18,7 @@ import { useSession } from '../../../stores/session'; import { IndividualTankStats, TanksStats } from '../../../types/tanksStats'; import { CustomColumnDisplay } from '../../tools/session/components/CustomColumn'; import { Menu } from '../../tools/session/components/Menu'; +import { resetSession } from '../../tools/session/page'; const REFRESH_RATE = 1 / 5; @@ -324,7 +325,7 @@ export default function SessionPage() {
- + ); } diff --git a/src/app/tools/session/components/Menu.tsx b/src/app/tools/session/components/Menu.tsx index f5f66e815..c2480217c 100644 --- a/src/app/tools/session/components/Menu.tsx +++ b/src/app/tools/session/components/Menu.tsx @@ -4,9 +4,10 @@ import { CustomColumn } from './CustomColumn'; interface ContextMenuProps { Builder: typeof DropdownMenu | typeof ContextMenu; + reset: () => void; } -export function Menu({ Builder }: ContextMenuProps) { +export function Menu({ Builder, reset }: ContextMenuProps) { const session = useSession(); return ( @@ -34,6 +35,12 @@ export function Menu({ Builder }: ContextMenuProps) { > Show career + + + + + Reset + ); } diff --git a/src/app/tools/session/page.tsx b/src/app/tools/session/page.tsx index c738f836f..e89c25a64 100644 --- a/src/app/tools/session/page.tsx +++ b/src/app/tools/session/page.tsx @@ -14,10 +14,9 @@ import { Flex, Text, TextField, - Tooltip, } from '@radix-ui/themes'; import { debounce } from 'lodash'; -import { ChangeEvent, useRef, useState } from 'react'; +import { ChangeEvent, useEffect, useRef, useState } from 'react'; import PageWrapper from '../../../components/PageWrapper'; import { REGION_NAMES, Region } from '../../../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../../../constants/wargamingApplicationID'; @@ -31,6 +30,36 @@ import SessionPage from '../../embeds/session/page'; import { Menu } from './components/Menu'; import * as styles from './page.css'; +export async function setSession(region: Region, id: number, nickname: string) { + const rawTankStats = ( + await fetchBlitz( + `https://api.wotblitz.${region}/wotb/tanks/stats/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, + ) + )[id]; + const tankStats = rawTankStats.reduce( + (accumulator, tank) => ({ + ...accumulator, + [tank.tank_id]: tank, + }), + {}, + ); + + useSession.setState({ + isTracking: true, + id, + region, + nickname, + tankStats, + time: Date.now(), + }); +} + +export function resetSession() { + const session = useSession.getState(); + if (!session.isTracking) return; + setSession(session.region, session.id, session.nickname); +} + export default function Page() { const input = useRef(null); const [searchResults, setSearchResults] = useState< @@ -50,37 +79,9 @@ export default function Page() { ); const session = useSession(); - async function setSession(region: Region, id: number, nickname: string) { - input.current!.value = nickname; - - const rawTankStats = ( - await fetchBlitz( - `https://api.wotblitz.${region}/wotb/tanks/stats/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, - ) - )[id]; - const tankStats = rawTankStats.reduce( - (accumulator, tank) => ({ - ...accumulator, - [tank.tank_id]: tank, - }), - {}, - ); - - useSession.setState({ - isTracking: true, - id, - region, - nickname, - tankStats, - time: Date.now(), - }); - } - - function reset() { - const session = useSession.getState(); - if (!session.isTracking) return; - setSession(session.region, session.id, session.nickname); - } + useEffect(() => { + if (session.isTracking) input.current!.value = session.nickname; + }, [session]); return ( @@ -158,7 +159,7 @@ export default function Page() { onClick={(event) => { if (!session.promptBeforeReset) { event.preventDefault(); - reset(); + resetSession(); } }} className={styles.toolbarButton} @@ -201,7 +202,7 @@ export default function Page() { - @@ -209,19 +210,60 @@ export default function Page() { - - - + + + + + + + + Copied link to your clipboard + + + Keep in mind: +
    +
  • Paste this link into your browser to view the embed
  • +
  • Embeds abide your custom options
  • +
  • + Options do not transfer across websites/streaming softwares +
  • +
+
+ + + + useSession.setState({ + showEmbedPrompt: !checked, + }) + } + /> + Don't show this again + + + + + + + +
+
@@ -231,7 +273,7 @@ export default function Page() { - +
diff --git a/src/stores/session.ts b/src/stores/session.ts index e6db63fac..c66688ef1 100644 --- a/src/stores/session.ts +++ b/src/stores/session.ts @@ -20,6 +20,7 @@ type Session = ( } ) & { promptBeforeReset: boolean; + showEmbedPrompt: boolean; customColumns: { display: CustomColumnDisplay; showDelta: boolean; @@ -36,6 +37,7 @@ export const useSession = create()( promptBeforeReset: true, showTotal: true, showCareer: true, + showEmbedPrompt: true, customColumns: [ { display: 'battles', showDelta: false }, From db846c0680475d46cb0efa0ff61a4d00cd9dbbc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sat, 14 Oct 2023 18:50:08 -0500 Subject: [PATCH 32/43] fix: provide clan_id --- src/commands/ownedTanks.tsx | 14 -------------- src/components/GenericAllStats/index.tsx | 4 +--- src/core/blitz/getClanAccountInfo.ts | 2 +- 3 files changed, 2 insertions(+), 18 deletions(-) diff --git a/src/commands/ownedTanks.tsx b/src/commands/ownedTanks.tsx index 16fa9fd85..6b6878ab9 100644 --- a/src/commands/ownedTanks.tsx +++ b/src/commands/ownedTanks.tsx @@ -127,17 +127,3 @@ export const ownedTanksCommand: CommandRegistry = { autocomplete: autocompleteUsername, }; - -// TODO: make this work in the future -// console.log('Caching tank images...'); -// TANKS.then((tanks) => -// jsxToSvg( -//
-// {tanks.map(({ images, tank_id }) => { -// return ( -// images.normal && -// ); -// })} -//
, -// ), -// ).then(() => console.log('Cached tank images')); diff --git a/src/components/GenericAllStats/index.tsx b/src/components/GenericAllStats/index.tsx index 3304b780e..21cbee368 100644 --- a/src/components/GenericAllStats/index.tsx +++ b/src/components/GenericAllStats/index.tsx @@ -1,12 +1,10 @@ import { AllStats, SupplementaryStats } from '../../core/blitz/getAccountInfo'; -import getWN8Percentile from '../../core/statistics/getWN8Percentile'; import isNumber from '../../core/math/isNumber'; +import getWN8Percentile from '../../core/statistics/getWN8Percentile'; import { Card } from './components/Card'; import { Root } from './components/Root'; import { Row } from './components/Row'; -// TODO: remove the .js endings - export interface GenericAllStatsProps { stats: AllStats; supplementaryStats?: SupplementaryStats; diff --git a/src/core/blitz/getClanAccountInfo.ts b/src/core/blitz/getClanAccountInfo.ts index 9fee45c89..db534c432 100644 --- a/src/core/blitz/getClanAccountInfo.ts +++ b/src/core/blitz/getClanAccountInfo.ts @@ -32,7 +32,7 @@ export async function getClanAccountInfo< : IndividualClanAccountInfo[], >(region: Region, ids: Ids, extra?: string[]) { const object = await fetchBlitz( - `https://api.wotblitz.${region}/wotb/clans/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${normalizeIds( + `https://api.wotblitz.${region}/wotb/clans/info/?application_id=${WARGAMING_APPLICATION_ID}&clan_id=${normalizeIds( ids, )}${normalizeExtra(extra)}`, ); From cb8ae47be6e64d9fc8240677dd66bc346e1d1e7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sat, 14 Oct 2023 19:06:26 -0500 Subject: [PATCH 33/43] feat: removed tank icons in owned tanks --- src/components/Tanks/components/Item.tsx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/components/Tanks/components/Item.tsx b/src/components/Tanks/components/Item.tsx index f36138203..d9316cbd2 100644 --- a/src/components/Tanks/components/Item.tsx +++ b/src/components/Tanks/components/Item.tsx @@ -80,7 +80,15 @@ export function Item({ image, tankType, name, treeType }: ItemProps) {
- {image && } + {/* {image && ( + // TODO: remove hardcoded dimensions when satori fixes non-width unloadable images + + )} */} ); } From 15b8bfdf8fef34c98a669cfb486bf036dca1b704 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sat, 14 Oct 2023 19:16:07 -0500 Subject: [PATCH 34/43] fix: use extra clan feilds --- src/commands/link.tsx | 4 +++- src/core/blitz/getClanAccountInfo.ts | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/commands/link.tsx b/src/commands/link.tsx index 88950d4ff..9db82aaae 100644 --- a/src/commands/link.tsx +++ b/src/commands/link.tsx @@ -37,7 +37,9 @@ export const verifyCommand: CommandRegistry = { const id = parseInt(idString); const discordId = parseInt(interaction.user.id); const accountInfo = await getAccountInfo(region as Region, id); - const clanAccountInfo = await getClanAccountInfo(region as Region, id); + const clanAccountInfo = await getClanAccountInfo(region as Region, id, [ + 'clan', + ]); await linkBlitzAndDiscord(discordId, region as Region, id); diff --git a/src/core/blitz/getClanAccountInfo.ts b/src/core/blitz/getClanAccountInfo.ts index db534c432..6c36fc15f 100644 --- a/src/core/blitz/getClanAccountInfo.ts +++ b/src/core/blitz/getClanAccountInfo.ts @@ -32,7 +32,7 @@ export async function getClanAccountInfo< : IndividualClanAccountInfo[], >(region: Region, ids: Ids, extra?: string[]) { const object = await fetchBlitz( - `https://api.wotblitz.${region}/wotb/clans/info/?application_id=${WARGAMING_APPLICATION_ID}&clan_id=${normalizeIds( + `https://api.wotblitz.${region}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${normalizeIds( ids, )}${normalizeExtra(extra)}`, ); From ad51be7afc7a7a67bcbfe9273d4e7d542ff85220 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sun, 15 Oct 2023 15:24:07 -0500 Subject: [PATCH 35/43] feat: added /breakdown --- src/commands/breakdown.tsx | 310 ++++++++++++++++++ src/commands/today.tsx | 271 +-------------- .../Breakdown/components/RowStat.tsx | 2 +- src/events/interactionCreate/index.ts | 4 +- 4 files changed, 320 insertions(+), 267 deletions(-) create mode 100644 src/commands/breakdown.tsx diff --git a/src/commands/breakdown.tsx b/src/commands/breakdown.tsx new file mode 100644 index 000000000..170900c77 --- /dev/null +++ b/src/commands/breakdown.tsx @@ -0,0 +1,310 @@ +import { SlashCommandBuilder } from 'discord.js'; +import * as Breakdown from '../components/Breakdown'; +import NoData, { NoDataType } from '../components/NoData'; +import TitleBar from '../components/TitleBar'; +import Wrapper from '../components/Wrapper'; +import { AllStats, getAccountInfo } from '../core/blitz/getAccountInfo'; +import { getClanAccountInfo } from '../core/blitz/getClanAccountInfo'; +import getTankStats from '../core/blitz/getTankStats'; +import getTreeType from '../core/blitz/getTreeType'; +import resolveTankName from '../core/blitz/resolveTankName'; +import { filtersToDescription } from '../core/blitzkrieg/filtersToDescription'; +import { getBlitzStarsLinkButton } from '../core/blitzstars/getBlitzStarsLinkButton'; +import getStatsInPeriod from '../core/blitzstars/getStatsInPeriod'; +import { tankAverages } from '../core/blitzstars/tankAverages'; +import { tankopedia } from '../core/blitzstars/tankopedia'; +import addFilterOptions from '../core/discord/addFilterOptions'; +import addUsernameChoices from '../core/discord/addUsernameChoices'; +import autocompleteTanks from '../core/discord/autocompleteTanks'; +import autocompleteUsername from '../core/discord/autocompleteUsername'; +import buttonPrimary from '../core/discord/buttonPrimary'; +import commandToURL from '../core/discord/commandToURL'; +import { getCustomPeriodParams } from '../core/discord/getCustomPeriodParams'; +import { getFiltersFromButton } from '../core/discord/getFiltersFromButton'; +import { getFiltersFromCommand } from '../core/discord/getFiltersFromCommand'; +import resolvePeriodFromButton from '../core/discord/resolvePeriodFromButton'; +import resolvePeriodFromCommand, { + ResolvedPeriod, +} from '../core/discord/resolvePeriodFromCommand'; +import resolvePlayerFromButton from '../core/discord/resolvePlayerFromButton'; +import resolvePlayerFromCommand, { + ResolvedPlayer, +} from '../core/discord/resolvePlayerFromCommand'; +import calculateWN8 from '../core/statistics/calculateWN8'; +import { StatFilters, filterStats } from '../core/statistics/filterStats'; +import getWN8Percentile from '../core/statistics/getWN8Percentile'; +import { CommandRegistryRaw } from '../events/interactionCreate'; + +async function render( + { region, id }: ResolvedPlayer, + { start, end, name }: ResolvedPeriod, + filters: StatFilters, +) { + const awaitedTankopedia = await tankopedia; + const awaitedTankAverages = await tankAverages; + const statsInPeriod = await getStatsInPeriod(region, id, start, end); + const { filteredOrder } = await filterStats(statsInPeriod, filters); + const accountInfo = await getAccountInfo(region, id); + const clanData = await getClanAccountInfo(region, id); + const tankStats = await getTankStats(region, id); + const filterDescriptions = await filtersToDescription(filters); + const orderedCurrentStats: AllStats[] = []; + const orderedCareerStats: AllStats[] = []; + const orderedCurrentWN8: (number | undefined)[] = []; + const orderedCareerWN8: (number | undefined)[] = []; + const orderedCareerWN8Full: (number | undefined)[] = []; + + filteredOrder.forEach((id) => { + const tankAveragesEntry = awaitedTankAverages[id]; + const current = statsInPeriod.diff[id]; + const career = tankStats.find((tank) => tank.tank_id === id)!.all; + const currentWN8 = tankAveragesEntry + ? calculateWN8(tankAveragesEntry.all, current) + : undefined; + const careerWN8 = tankAveragesEntry + ? calculateWN8(tankAveragesEntry.all, career) + : undefined; + + orderedCurrentStats.push(current); + orderedCareerStats.push(career); + orderedCurrentWN8.push(currentWN8); + orderedCareerWN8.push(careerWN8); + }); + tankStats.forEach((tank) => { + const tankAveragesEntry = awaitedTankAverages[tank.tank_id]; + + orderedCareerWN8Full.push( + tankAveragesEntry + ? calculateWN8(tankAveragesEntry.all, tank.all) + : undefined, + ); + }); + + const currentBattles = orderedCurrentStats.reduce( + (accumulator, current) => accumulator + current.battles, + 0, + ); + const careerBattles = tankStats.reduce( + (accumulator, current) => accumulator + current.all.battles, + 0, + ); + const currentWinrate = + orderedCurrentStats.reduce( + (accumulator, current) => accumulator + current.wins, + 0, + ) / currentBattles; + const careerWinrate = + tankStats.reduce( + (accumulator, current) => accumulator + current.all.wins, + 0, + ) / careerBattles; + const currentWN8 = + orderedCurrentWN8.reduce( + (accumulator, current, index) => + accumulator + (current ?? 0) * orderedCurrentStats[index].battles, + 0, + ) / + orderedCurrentStats.reduce( + (accumulator, current, index) => + accumulator + + (orderedCurrentWN8[index] === undefined ? 0 : current.battles), + 0, + ); + const careerWN8 = + orderedCareerWN8Full.reduce( + (accumulator, current) => accumulator + (current ?? 0), + 0, + ) / + tankStats.reduce( + (accumulator, current, index) => + accumulator + + (orderedCareerWN8Full[index] === undefined ? 0 : current.all.battles), + 0, + ); + const currentDamage = + orderedCurrentStats.reduce( + (accumulator, current) => accumulator + current.damage_dealt, + 0, + ) / currentBattles; + const careerDamage = + tankStats.reduce( + (accumulator, current) => accumulator + current.all.damage_dealt, + 0, + ) / careerBattles; + + return ( + + + + {filteredOrder.length === 0 && ( + + )} + {filteredOrder.length > 0 && ( + + + + {await Promise.all( + filteredOrder.map(async (id, index) => { + const tankopediaEntry = awaitedTankopedia[id]; + const current = orderedCurrentStats[index]; + const career = orderedCareerStats[index]; + const currentWN8 = orderedCurrentWN8[index]; + const careerWN8 = orderedCareerWN8[index]; + + return ( + + ); + }), + )} + + )} + + ); +} + +export const breakdownCommand = new Promise( + async (resolve) => { + const command = await addFilterOptions( + new SlashCommandBuilder() + .setName('breakdown') + .setDescription("A period's breakdown by tanks played"), + (option) => option.addStringOption(addUsernameChoices), + ); + + resolve({ + inProduction: true, + inPublic: true, + + command, + + async handler(interaction) { + const player = await resolvePlayerFromCommand(interaction); + const period = resolvePeriodFromCommand(player.region, interaction); + const filters = await getFiltersFromCommand(interaction); + const path = commandToURL(interaction, { + ...player, + ...getCustomPeriodParams(interaction), + ...filters, + }); + + return Promise.all([ + render(player, period, filters), + buttonPrimary(path, 'Refresh'), + getBlitzStarsLinkButton(player.region, player.id), + ]); + }, + + autocomplete: (interaction) => { + autocompleteUsername(interaction); + autocompleteTanks(interaction); + }, + + async button(interaction) { + const player = await resolvePlayerFromButton(interaction); + const period = resolvePeriodFromButton(player.region, interaction); + const filters = getFiltersFromButton(interaction); + + return await render(player, period, filters); + }, + }); + }, +); diff --git a/src/commands/today.tsx b/src/commands/today.tsx index c549c4845..3b3e5e348 100644 --- a/src/commands/today.tsx +++ b/src/commands/today.tsx @@ -1,277 +1,18 @@ import { SlashCommandBuilder } from 'discord.js'; -import * as Breakdown from '../components/Breakdown'; -import NoData, { NoDataType } from '../components/NoData'; -import TitleBar from '../components/TitleBar'; -import Wrapper from '../components/Wrapper'; -import { AllStats, getAccountInfo } from '../core/blitz/getAccountInfo'; -import { getClanAccountInfo } from '../core/blitz/getClanAccountInfo'; -import getTankStats from '../core/blitz/getTankStats'; -import getTreeType from '../core/blitz/getTreeType'; -import resolveTankName from '../core/blitz/resolveTankName'; -import getPeriodNow from '../core/blitzkrieg/getPeriodNow'; -import getTimeDaysAgo from '../core/blitzkrieg/getTimeDaysAgo'; -import getStatsInPeriod from '../core/blitzstars/getStatsInPeriod'; -import { tankAverages } from '../core/blitzstars/tankAverages'; -import { tankopedia } from '../core/blitzstars/tankopedia'; -import addUsernameChoices from '../core/discord/addUsernameChoices'; -import autocompleteUsername from '../core/discord/autocompleteUsername'; -import buttonLink from '../core/discord/buttonLink'; -import buttonPrimary from '../core/discord/buttonPrimary'; -import commandToURL from '../core/discord/commandToURL'; -import resolvePlayerFromButton from '../core/discord/resolvePlayerFromButton'; -import resolvePlayerFromCommand, { - ResolvedPlayer, -} from '../core/discord/resolvePlayerFromCommand'; -import calculateWN8 from '../core/statistics/calculateWN8'; -import getWN8Percentile from '../core/statistics/getWN8Percentile'; -import sumStats from '../core/statistics/sumStats'; import { CommandRegistry } from '../events/interactionCreate'; -import { PossiblyPromise } from '../types/possiblyPromise'; - -async function render( - { region: server, id }: ResolvedPlayer, - cutoff = Infinity, - maximized = 4, - showTotal = true, - naked?: boolean, -) { - const { diff: diffed, order } = await getStatsInPeriod( - server, - id, - getTimeDaysAgo(server, 1), - getPeriodNow(), - ); - const accountInfo = await getAccountInfo(server, id); - const clanData = await getClanAccountInfo(server, id); - const careerTankStatsRaw = await getTankStats(server, id); - const careerStats: Record = showTotal - ? { - 0: accountInfo.statistics.all, - } - : {}; - const allStatsToAccumulate: AllStats[] = []; - - Object.entries(diffed).forEach(([, tankStats]) => { - allStatsToAccumulate.push(tankStats); - }); - Object.entries(careerTankStatsRaw).forEach(([, tankStats]) => { - careerStats[tankStats.tank_id] = tankStats.all; - }); - - const accumulatedStats = sumStats(allStatsToAccumulate); - - if (showTotal && Object.keys(diffed).length > 0) { - diffed[0] = accumulatedStats; - } - - const tankStatsOverTimeEntries = Object.entries(diffed); - const todayWN8s = await tankStatsOverTimeEntries.reduce< - PossiblyPromise> - >(async (accumulator, [tankIdString, tankStats]) => { - const tankId = parseInt(tankIdString); - - return (showTotal && tankId === 0) || !(await tankAverages)[tankId] - ? accumulator - : { - ...(await accumulator), - [tankId]: calculateWN8((await tankAverages)[tankId].all, tankStats), - }; - }, {}); - - const careerWN8s = await careerTankStatsRaw.reduce< - PossiblyPromise> - >(async (accumulator, { tank_id }) => { - return (showTotal && tank_id === 0) || - (await tankAverages)[tank_id] === undefined - ? accumulator - : { - ...(await accumulator), - [tank_id]: calculateWN8( - (await tankAverages)[tank_id].all, - careerStats[tank_id], - ), - }; - }, {}); - const todayWN8sEntries = Object.entries(todayWN8s); - const careerWN8sEntries = Object.entries(careerWN8s); - - if (showTotal) { - todayWN8s[0] = - todayWN8sEntries.reduce( - (accumulator, [tankIdString, wn8]) => - accumulator + wn8 * diffed[Number(tankIdString)].battles, - 0, - ) / - todayWN8sEntries.reduce( - (accumulator, [tankIdString]) => - accumulator + diffed[Number(tankIdString)].battles, - 0, - ); - careerWN8s[0] = - careerWN8sEntries.reduce( - (accumulator, [tankIdString, WN8]) => - isNaN(WN8) - ? accumulator - : accumulator + WN8 * careerStats[Number(tankIdString)].battles, - 0, - ) / - careerWN8sEntries.reduce( - (accumulator, [tankIdString, WN8]) => - isNaN(WN8) - ? accumulator - : accumulator + careerStats[Number(tankIdString)].battles, - 0, - ); - } - - const rows = await Promise.all( - [ - // this code unreadable on god will forget tomorrow no cap - ...(order.length === 0 || !showTotal ? [] : [0]), - ...(isFinite(cutoff) ? order.slice(0, cutoff) : order), - ].map(async (id, index) => { - const tankStats = diffed[id]; - const career = careerStats[id]; - const tankopediaEntry = (await tankopedia)[id]; - - return ( - maximized : index + 1 > maximized} - stats={[ - { - title: 'Battles', - current: tankStats.battles.toLocaleString(), - career: career.battles.toLocaleString(), - }, - { - title: 'Winrate', - current: `${(100 * (tankStats.wins / tankStats.battles)).toFixed( - 2, - )}%`, - career: `${(100 * (career.wins / career.battles)).toFixed(2)}%`, - delta: - tankStats.wins / tankStats.battles - - career.wins / career.battles, - }, - { - title: 'WN8', - current: isNaN(todayWN8s[id]) - ? undefined - : Math.round(todayWN8s[id]).toLocaleString(), - career: isNaN(careerWN8s[id]) - ? undefined - : Math.round(careerWN8s[id]).toLocaleString(), - percentile: isNaN(todayWN8s[id]) - ? undefined - : getWN8Percentile(todayWN8s[id]), - }, - { - title: 'Damage', - current: Math.round( - tankStats.damage_dealt / tankStats.battles, - ).toLocaleString(), - career: Math.round( - career.damage_dealt / career.battles, - ).toLocaleString(), - delta: - tankStats.damage_dealt / tankStats.battles - - career.damage_dealt / career.battles, - }, - ]} - /> - ); - }), - ); - - return naked ? ( - - {rows} - - ) : ( - - - - {rows.length === 0 && } - {rows.length > 0 && {rows}} - - ); -} +/** + * TODO: @deprecated + */ export const todayCommand: CommandRegistry = { inProduction: true, inPublic: true, command: new SlashCommandBuilder() .setName('today') - .setDescription('A general daily breakdown of your performance') - .addStringOption(addUsernameChoices) - .addIntegerOption((option) => - option - .setName('cutoff') - .setDescription( - 'The maximum number of tanks to display (default: Infinity)', - ) - .setRequired(false) - .setMinValue(1), - ) - .addIntegerOption((option) => - option - .setName('maximized') - .setDescription( - 'The number of rows with full stats after which all are collapsed (default: 4)', - ) - .setMinValue(0) - .setRequired(false), - ) - .addBooleanOption((option) => - option - .setName('show-total') - .setDescription('Show the total stats at the top (default: true)') - .setRequired(false), - ), + .setDescription('This command has been renamed to `/breakdown today`'), - async handler(interaction) { - const player = await resolvePlayerFromCommand(interaction); - const cutoff = interaction.options.getInteger('cutoff') ?? undefined; - const maximized = interaction.options.getInteger('maximized') ?? undefined; - const showTotal = interaction.options.getBoolean('show-total') ?? undefined; - const { nickname } = await getAccountInfo(player.region, player.id); - const path = commandToURL(interaction, { - ...player, - cutoff, - maximized, - 'show-total': showTotal, - }); - - return [ - await render(player, cutoff, maximized, showTotal, false), - buttonPrimary(path, 'Refresh'), - // linkButton(`https://example.com/${path}`, 'Embed'), - buttonLink( - `https://www.blitzstars.com/player/${player.region}/${nickname}`, - 'BlitzStars', - ), - ]; - }, - - autocomplete: autocompleteUsername, - - async button(interaction) { - const player = await resolvePlayerFromButton(interaction); - - return await render(player); + handler() { + return '# This command has been renamed to `/breakdown today`\n`/today` now comes with filters, periods and more! Use `/breakdown today` for same old functionality but also do checkout the other options.'; }, }; diff --git a/src/components/Breakdown/components/RowStat.tsx b/src/components/Breakdown/components/RowStat.tsx index 3c0cda7c0..17b1cd6a2 100644 --- a/src/components/Breakdown/components/RowStat.tsx +++ b/src/components/Breakdown/components/RowStat.tsx @@ -15,7 +15,7 @@ export function RowStat({ value, delta, percentile, - minimized, + minimized = false, }: RowStatProps) { return (
From 43f634e1987d20e07aee5bffded8d3f2fd1d8565 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sun, 15 Oct 2023 15:42:36 -0500 Subject: [PATCH 36/43] feat: added sharding --- .vscode/settings.json | 1 + scripts/build.ts | 11 ++++++----- src/core/blitzstars/tankopedia.ts | 1 - src/core/discord/manager.ts | 6 ++++++ src/index.ts | 8 ++++++++ 5 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 src/core/discord/manager.ts create mode 100644 src/index.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index 9a808967a..c04fd7c61 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -15,6 +15,7 @@ "kranvagn", "Leaderboard", "leaderboards", + "outdir", "outfile", "ownedtanks", "playerachievements", diff --git a/scripts/build.ts b/scripts/build.ts index 9905dda95..5be7d5c57 100644 --- a/scripts/build.ts +++ b/scripts/build.ts @@ -1,10 +1,10 @@ import { build } from 'esbuild'; -console.log('Building bot...'); +const FILES = ['bot', 'index']; await build({ - entryPoints: ['src/bot.ts'], - outfile: 'dist/bot/index.cjs', + entryPoints: FILES.map((file) => `src/${file}.ts`), + outdir: 'dist/bot', platform: 'node', tsconfig: 'tsconfig.esbuild.json', @@ -14,6 +14,9 @@ await build({ }, format: 'cjs', jsx: 'transform', + outExtension: { + '.js': '.cjs', + }, bundle: true, sourcemap: true, @@ -23,5 +26,3 @@ await build({ logLevel: 'info', }); - -console.log('Built bot'); diff --git a/src/core/blitzstars/tankopedia.ts b/src/core/blitzstars/tankopedia.ts index 23d816f22..70d4d4f1b 100644 --- a/src/core/blitzstars/tankopedia.ts +++ b/src/core/blitzstars/tankopedia.ts @@ -21,7 +21,6 @@ export interface Tankopedia { [id: number]: TankopediaEntry | undefined; } -console.log('Caching tankopedia...'); export const tankopedia = fetch( context === 'bot' ? 'https://www.blitzstars.com/bs-tankopedia.json' diff --git a/src/core/discord/manager.ts b/src/core/discord/manager.ts new file mode 100644 index 000000000..700b47607 --- /dev/null +++ b/src/core/discord/manager.ts @@ -0,0 +1,6 @@ +import { ShardingManager } from 'discord.js'; +import { secrets } from '../blitzkrieg/secrets'; + +export const manager = new ShardingManager(`${__dirname}/bot.cjs`, { + token: secrets.DISCORD_TOKEN, +}); diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 000000000..b68ca4c46 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,8 @@ +import { manager } from './core/discord/manager'; + +manager.on('shardCreate', (shard) => { + console.log(`🟡 Launching shard ${shard.id}`); + shard.on('ready', () => console.log(`🟢 Shard ${shard.id} launched`)); +}); + +manager.spawn(); From 9495ae233629a48813041f88b4b17eff9930a4c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sun, 15 Oct 2023 15:52:35 -0500 Subject: [PATCH 37/43] feat: simpler logging --- src/bot.ts | 2 ++ src/core/blitzkrieg/jsxToSvg.ts | 2 -- src/core/blitzstars/tankAverages.ts | 3 --- src/core/blitzstars/tankopedia.ts | 11 ++++------- src/core/discord/psa.ts | 2 -- src/events/interactionCreate/index.ts | 2 -- src/events/ready.ts | 7 +------ 7 files changed, 7 insertions(+), 22 deletions(-) diff --git a/src/bot.ts b/src/bot.ts index 71c0f155b..4e6aebe65 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -2,5 +2,7 @@ import { registerProcesses } from './core/blitzkrieg/processes'; import { secrets } from './core/blitzkrieg/secrets'; import { client } from './core/discord/client'; +console.log(`🟡 Launching bot ${client.shard?.ids[0]}`); + registerProcesses(); client.login(secrets.DISCORD_TOKEN); diff --git a/src/core/blitzkrieg/jsxToSvg.ts b/src/core/blitzkrieg/jsxToSvg.ts index eaffb3e5a..e0acc1621 100644 --- a/src/core/blitzkrieg/jsxToSvg.ts +++ b/src/core/blitzkrieg/jsxToSvg.ts @@ -12,7 +12,6 @@ let roboto: Buffer; let robotoBold: Buffer; let robotoBlack: Buffer; -console.log('Importing fonts...'); Promise.all( FONT_FILES.map( (file) => @@ -27,7 +26,6 @@ Promise.all( ), ).then((data) => { [roboto, robotoBold, robotoBlack] = data; - console.log('Fonts imported'); }); export default async function jsxToSvg(jsx: JSX.Element) { diff --git a/src/core/blitzstars/tankAverages.ts b/src/core/blitzstars/tankAverages.ts index 6bcf55c17..a210431c6 100644 --- a/src/core/blitzstars/tankAverages.ts +++ b/src/core/blitzstars/tankAverages.ts @@ -84,7 +84,6 @@ tankopedia; export type TankAverages = Record; -console.log('Caching tank averages...'); export const tankAverages = fetch( context === 'bot' ? 'https://www.blitzstars.com/api/tankaverages.json' @@ -100,8 +99,6 @@ export const tankAverages = fetch( individualTankAverage; }); - console.log('Tank averages cached'); - return partialTankAverages; } else { return json as TankAverages; diff --git a/src/core/blitzstars/tankopedia.ts b/src/core/blitzstars/tankopedia.ts index 70d4d4f1b..7be335929 100644 --- a/src/core/blitzstars/tankopedia.ts +++ b/src/core/blitzstars/tankopedia.ts @@ -27,12 +27,11 @@ export const tankopedia = fetch( : '/api/tankopedia', ) .then(async (response) => response.json()) - .then((wrapperTankopedia) => { - console.log('Tankopedia cached'); - return context === 'bot' + .then((wrapperTankopedia) => + context === 'bot' ? (wrapperTankopedia as { data: Tankopedia }).data - : (wrapperTankopedia as Tankopedia); - }); + : (wrapperTankopedia as Tankopedia), + ); const entries = new Promise(async (resolve) => { resolve(Object.entries(await tankopedia).map(([, entry]) => entry)); }); @@ -69,11 +68,9 @@ export interface TankopediaInfo { } // this is blocking because info is needed for command creation -console.log('Caching tankopedia info...'); export const tankopediaInfo = fetchBlitz( `https://api.wotblitz.com/wotb/encyclopedia/info/?application_id=${WARGAMING_APPLICATION_ID}`, ); -console.log('Cached tankopedia info'); export const TANK_ICONS: Record = { 'AT-SPG': 'https://i.imgur.com/BIHSEH0.png', diff --git a/src/core/discord/psa.ts b/src/core/discord/psa.ts index 48252aca0..06441f663 100644 --- a/src/core/discord/psa.ts +++ b/src/core/discord/psa.ts @@ -9,12 +9,10 @@ export interface PSA { export const psa: PSA = { data: null }; -console.log('Caching PSA...'); fetch( 'https://gist.githubusercontent.com/tresabhi/ed4b136f08856e615212e573aabe1968/raw', ) .then((response) => response.json()) .then((data) => { psa.data = data as PSAData; - console.log('PSA cached'); }); diff --git a/src/events/interactionCreate/index.ts b/src/events/interactionCreate/index.ts index 25efa3118..7a41cc454 100644 --- a/src/events/interactionCreate/index.ts +++ b/src/events/interactionCreate/index.ts @@ -136,12 +136,10 @@ commands.then((awaitedCommands) => { }); try { - console.log(`Refreshing ${publicCommands.length} public command(s).`); rest.put(Routes.applicationCommands(getClientId()), { body: publicCommands, }); - console.log(`Refreshing ${guildCommands.length} guild command(s).`); (isDev() ? [discord.test_guild_id] : [discord.tres_guild_id, discord.sklld_guild_id] diff --git a/src/events/ready.ts b/src/events/ready.ts index 6e41e3b45..50ecc620d 100644 --- a/src/events/ready.ts +++ b/src/events/ready.ts @@ -1,10 +1,5 @@ import { Client } from 'discord.js'; -import isDev from '../core/blitzkrieg/isDev'; export default function ready(client: Client) { - console.log( - `Logged in as ${client.user.tag} in ${ - isDev() ? 'development' : 'production' - } mode across ${client.guilds.cache.size} servers`, - ); + console.log(`🟢 Bot ${client.shard?.ids[0]} launched`); } From 6fdd4ba833ede21b52cddbbe4d4165748665a715 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Mon, 16 Oct 2023 20:08:08 -0500 Subject: [PATCH 38/43] feat: render threading --- scripts/build.ts | 10 ++++- src/core/blitzkrieg/jsxToPngThreaded.ts | 9 ++++ src/core/blitzkrieg/svgToPngThreaded.ts | 42 +++++++++++++++++++ .../discord/normalizeInteractionReturnable.ts | 4 +- src/events/ready.ts | 2 +- src/index.ts | 2 +- src/workers/render.ts | 9 ++++ 7 files changed, 73 insertions(+), 5 deletions(-) create mode 100644 src/core/blitzkrieg/jsxToPngThreaded.ts create mode 100644 src/core/blitzkrieg/svgToPngThreaded.ts create mode 100644 src/workers/render.ts diff --git a/scripts/build.ts b/scripts/build.ts index 5be7d5c57..f5deea4fb 100644 --- a/scripts/build.ts +++ b/scripts/build.ts @@ -1,6 +1,14 @@ import { build } from 'esbuild'; +import { readdir } from 'fs/promises'; -const FILES = ['bot', 'index']; +const FILES = [ + 'bot', + 'index', + + (await readdir('src/workers')).map( + (file) => `workers/${file.replace('.ts', '')}`, + ), +]; await build({ entryPoints: FILES.map((file) => `src/${file}.ts`), diff --git a/src/core/blitzkrieg/jsxToPngThreaded.ts b/src/core/blitzkrieg/jsxToPngThreaded.ts new file mode 100644 index 000000000..5a68fb629 --- /dev/null +++ b/src/core/blitzkrieg/jsxToPngThreaded.ts @@ -0,0 +1,9 @@ +import jsxToSvg from './jsxToSvg'; +import { svgToPngThreaded } from './svgToPngThreaded'; + +export default async function jsxToPngThreaded(jsx: JSX.Element) { + const svg = await jsxToSvg(jsx); + const png = await svgToPngThreaded(svg); + + return png; +} diff --git a/src/core/blitzkrieg/svgToPngThreaded.ts b/src/core/blitzkrieg/svgToPngThreaded.ts new file mode 100644 index 000000000..dbba997b4 --- /dev/null +++ b/src/core/blitzkrieg/svgToPngThreaded.ts @@ -0,0 +1,42 @@ +import { Worker } from 'worker_threads'; + +const MAX_WORKERS = 3; + +const workers = [...Array(MAX_WORKERS)].map(() => { + const worker = new Worker(`${__dirname}/workers/render.cjs`); + console.log(`🟡 Launching render worker ${worker.threadId}`); + return worker; +}); +const queue: { + svg: string; + resolve: (png: Buffer) => void; +}[] = []; + +function manageQueue() { + if (queue.length > 0 && workers.length > 0) { + const { svg, resolve } = queue.shift()!; + const worker = workers.shift()!; + + function cleanup() { + workers.push(worker); + manageQueue(); + } + + worker.postMessage(svg); + worker.on('message', (png: Uint8Array) => { + cleanup(); + resolve(Buffer.from(png)); + }); + worker.on('error', (error) => { + cleanup(); + throw error; + }); + } +} + +export function svgToPngThreaded(svg: string) { + return new Promise((resolve) => { + queue.push({ svg, resolve }); + manageQueue(); + }); +} diff --git a/src/core/discord/normalizeInteractionReturnable.ts b/src/core/discord/normalizeInteractionReturnable.ts index 5f8da39da..cdb0e2208 100644 --- a/src/core/discord/normalizeInteractionReturnable.ts +++ b/src/core/discord/normalizeInteractionReturnable.ts @@ -6,7 +6,7 @@ import { InteractionEditReplyOptions, } from 'discord.js'; import { InteractionReturnable } from '../../events/interactionCreate'; -import jsxToPng from '../blitzkrieg/jsxToPng'; +import jsxToPngThreaded from '../blitzkrieg/jsxToPngThreaded'; export default async function normalizeInteractionReturnable( returnable: InteractionReturnable, @@ -37,7 +37,7 @@ export default async function normalizeInteractionReturnable( } else if (item === null) { return; } else { - const image = await jsxToPng(item); + const image = await jsxToPngThreaded(item); if (!reply.files) reply.files = []; reply.files.push(image); } diff --git a/src/events/ready.ts b/src/events/ready.ts index 50ecc620d..3c24d0ab2 100644 --- a/src/events/ready.ts +++ b/src/events/ready.ts @@ -1,5 +1,5 @@ import { Client } from 'discord.js'; export default function ready(client: Client) { - console.log(`🟢 Bot ${client.shard?.ids[0]} launched`); + console.log(`🟢 Launched bot ${client.shard?.ids[0]}`); } diff --git a/src/index.ts b/src/index.ts index b68ca4c46..75effcb7b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,7 +2,7 @@ import { manager } from './core/discord/manager'; manager.on('shardCreate', (shard) => { console.log(`🟡 Launching shard ${shard.id}`); - shard.on('ready', () => console.log(`🟢 Shard ${shard.id} launched`)); + shard.on('ready', () => console.log(`🟢 Launched shard ${shard.id}`)); }); manager.spawn(); diff --git a/src/workers/render.ts b/src/workers/render.ts new file mode 100644 index 000000000..d6ad642c9 --- /dev/null +++ b/src/workers/render.ts @@ -0,0 +1,9 @@ +import { parentPort, threadId } from 'worker_threads'; +import svgToPng from '../core/blitzkrieg/svgToPng'; + +console.log(`🟢 Launched render worker ${threadId}`); + +parentPort?.on('message', async (svg: string) => { + const png = svgToPng(svg); + parentPort?.postMessage(png); +}); From f9e51f894a64b8bd957a081a75243ac4030ca881 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Mon, 16 Oct 2023 20:10:35 -0500 Subject: [PATCH 39/43] feat: removed sharding as it's not needed for now --- src/bot.ts | 2 +- src/core/discord/client.ts | 3 +-- src/index.ts | 16 ++++++++++------ 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/bot.ts b/src/bot.ts index 4e6aebe65..709d7d44b 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -2,7 +2,7 @@ import { registerProcesses } from './core/blitzkrieg/processes'; import { secrets } from './core/blitzkrieg/secrets'; import { client } from './core/discord/client'; -console.log(`🟡 Launching bot ${client.shard?.ids[0]}`); +// console.log(`🟡 Launching bot ${client.shard?.ids[0]}`); registerProcesses(); client.login(secrets.DISCORD_TOKEN); diff --git a/src/core/discord/client.ts b/src/core/discord/client.ts index 3b9e6bbd8..d79c653d5 100644 --- a/src/core/discord/client.ts +++ b/src/core/discord/client.ts @@ -1,11 +1,10 @@ import { Client, GatewayIntentBits } from 'discord.js'; import guildMemberAdd from '../../events/guildMemberAdd'; import interactionCreate from '../../events/interactionCreate'; -import ready from '../../events/ready'; export const client = new Client({ intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers], }) - .on('ready', ready) + // .on('ready', ready) .on('guildMemberAdd', guildMemberAdd) .on('interactionCreate', interactionCreate); diff --git a/src/index.ts b/src/index.ts index 75effcb7b..abd416e69 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,8 +1,12 @@ -import { manager } from './core/discord/manager'; +// import { manager } from './core/discord/manager'; -manager.on('shardCreate', (shard) => { - console.log(`🟡 Launching shard ${shard.id}`); - shard.on('ready', () => console.log(`🟢 Launched shard ${shard.id}`)); -}); +// manager.on('shardCreate', (shard) => { +// console.log(`🟡 Launching shard ${shard.id}`); +// shard.on('ready', () => console.log(`🟢 Launched shard ${shard.id}`)); +// }); -manager.spawn(); +// manager.spawn(); + +// TODO: re-enable if needed in the future + +import './bot'; From 1317c2879c8f5b0c7349790cc30398151be91de7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Mon, 16 Oct 2023 20:11:19 -0500 Subject: [PATCH 40/43] feat: switch to 6 hour hostings --- .github/workflows/cd-host.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cd-host.yml b/.github/workflows/cd-host.yml index 33834e705..a87109476 100644 --- a/.github/workflows/cd-host.yml +++ b/.github/workflows/cd-host.yml @@ -2,7 +2,7 @@ name: CD Host on: schedule: - - cron: '0 */5 * * *' + - cron: '0 */6 * * *' workflow_dispatch: concurrency: From 533bfc44588532ee1e4543ad69d571d6d9435965 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Mon, 16 Oct 2023 20:16:23 -0500 Subject: [PATCH 41/43] fix: clan images --- docs/changelogs/1.14.0.md | 5 +++++ src/commands/breakdown.tsx | 2 +- src/commands/evolution.tsx | 2 +- src/commands/fullStats.tsx | 2 +- src/commands/ownedTanks.tsx | 2 +- src/commands/ratings.tsx | 1 + src/commands/stats.tsx | 4 +++- 7 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 docs/changelogs/1.14.0.md diff --git a/docs/changelogs/1.14.0.md b/docs/changelogs/1.14.0.md new file mode 100644 index 000000000..6efbf0bd2 --- /dev/null +++ b/docs/changelogs/1.14.0.md @@ -0,0 +1,5 @@ +# Blitzkrieg 1.14.0 + +Elegance has never been met like this before + +## Features diff --git a/src/commands/breakdown.tsx b/src/commands/breakdown.tsx index 170900c77..477b158f4 100644 --- a/src/commands/breakdown.tsx +++ b/src/commands/breakdown.tsx @@ -45,7 +45,7 @@ async function render( const statsInPeriod = await getStatsInPeriod(region, id, start, end); const { filteredOrder } = await filterStats(statsInPeriod, filters); const accountInfo = await getAccountInfo(region, id); - const clanData = await getClanAccountInfo(region, id); + const clanData = await getClanAccountInfo(region, id, ['clan']); const tankStats = await getTankStats(region, id); const filterDescriptions = await filtersToDescription(filters); const orderedCurrentStats: AllStats[] = []; diff --git a/src/commands/evolution.tsx b/src/commands/evolution.tsx index d6ec480fb..b495076e4 100644 --- a/src/commands/evolution.tsx +++ b/src/commands/evolution.tsx @@ -40,7 +40,7 @@ async function render( tankId: number | null, ) { const accountInfo = await getAccountInfo(region, id); - const clan = (await getClanAccountInfo(region, id))?.clan; + const clan = (await getClanAccountInfo(region, id, ['clan']))?.clan; const logo = clan ? emblemIdToURL(clan.emblem_set_id) : undefined; const histories = await (type === 'player' ? getPlayerHistories(region, id, { diff --git a/src/commands/fullStats.tsx b/src/commands/fullStats.tsx index 9630433f9..f9262602a 100644 --- a/src/commands/fullStats.tsx +++ b/src/commands/fullStats.tsx @@ -37,7 +37,7 @@ async function render( filters: StatFilters, ) { const { nickname } = await getAccountInfo(region, id); - const clan = (await getClanAccountInfo(region, id))?.clan; + const clan = (await getClanAccountInfo(region, id, ['clan']))?.clan; const clanImage = clan ? emblemIdToURL(clan.emblem_set_id) : undefined; const diffedTankStats = await getStatsInPeriod(region, id, start, end); const { stats, supplementary, filteredOrder } = await filterStats( diff --git a/src/commands/ownedTanks.tsx b/src/commands/ownedTanks.tsx index 6b6878ab9..8f731590e 100644 --- a/src/commands/ownedTanks.tsx +++ b/src/commands/ownedTanks.tsx @@ -46,7 +46,7 @@ export const ownedTanksCommand: CommandRegistry = { })), ) ).filter((tank) => tank.tankopedia?.tier === tier); - const clanAccountInfo = await getClanAccountInfo(server, id); + const clanAccountInfo = await getClanAccountInfo(server, id, ['clan']); const groupedTanks: Record = {}; const nations: string[] = []; diff --git a/src/commands/ratings.tsx b/src/commands/ratings.tsx index f7ed5b22e..647507ed0 100644 --- a/src/commands/ratings.tsx +++ b/src/commands/ratings.tsx @@ -313,6 +313,7 @@ export const ratingsCommand = new Promise( const clanData = await getClanAccountInfo( region, trimmed.map(({ id }) => id), + ['clan'], ); return trimmed.map( diff --git a/src/commands/stats.tsx b/src/commands/stats.tsx index f2cad10df..f95a8aa30 100644 --- a/src/commands/stats.tsx +++ b/src/commands/stats.tsx @@ -35,12 +35,14 @@ async function render( filters: StatFilters, ) { const { nickname } = await getAccountInfo(region, id); - const clan = (await getClanAccountInfo(region, id))?.clan; + const clan = (await getClanAccountInfo(region, id, ['clan']))?.clan; const clanImage = clan ? emblemIdToURL(clan.emblem_set_id) : undefined; const diffedTankStats = await getStatsInPeriod(region, id, start, end); const { stats, supplementary } = await filterStats(diffedTankStats, filters); const filterDescriptions = await filtersToDescription(filters); + console.log(clan); + return ( Date: Mon, 16 Oct 2023 20:31:00 -0500 Subject: [PATCH 42/43] feat: changelog --- docs/changelogs/1.14.0.md | 40 +++++++++++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/docs/changelogs/1.14.0.md b/docs/changelogs/1.14.0.md index 6efbf0bd2..d1729fe45 100644 --- a/docs/changelogs/1.14.0.md +++ b/docs/changelogs/1.14.0.md @@ -3,3 +3,43 @@ Elegance has never been met like this before ## Features + +- Added `/link` + - Unlike `/verify`, `/link` links you Discord and Blitz accounts across all servers + - This command does not change your nickname + - `/link` now simply displays a deprecation message + - Usernames can still be inputted per-command to override your linked account +- `/stats` and `/full-stats` are now way simpler + - `/stats ` has been replaced with `/stats <30|60|90|...>` (likewise, `/full-stats`) + - These commands now have filters without having to opt into `multi-tank` +- Added `/breakdown` + - Unlike `/today`, `/breakdown` lets you select any period of time + - `/breakdown` now simply displays a deprecation message +- `/about commands` are now sorted alphabetically +- Added a `/reset` button to the options dropdown and embed context-menu + +## Changes + +- Simplified no ongoing ratings season edge case +- Updated welcome message for Skilled server to use `/link` and other up-to-date information +- Tier weights are now reported in Arabic numerals instead of Roman +- Removed tank images from `/owned-tanks` + - Wargaming messed up their API and almost no tanks have any images anymore + +## Fixes + +- Banners now use a more economical `.webp` format just like the home page +- Removed unused color palettes + +## Technical changes + +- Guild commands are now handled more efficiently +- Removed nickname-based Blitz username inference +- Code split a lot of common functionalities +- Re-arranged `core` folder +- Added midnight and latest ratings leaderboard caches +- Merged renderers into their primary user files +- Added sharding + - Disabled for now but good for future proofing +- Switched to a way cleaner logging schema +- Hosting is now done in 6 hour periods instead of 5 diff --git a/package.json b/package.json index 97c151197..837c75fd9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "blitzkrieg", - "version": "1.13.3", + "version": "1.14.0", "description": "🎉 Tools for everything World of Tanks Blitz", "main": "src/server.ts", "type": "module", From 9e23d60ef18bc095f917c0c24f058bd308f5f25b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Mon, 16 Oct 2023 20:33:12 -0500 Subject: [PATCH 43/43] fix: isolated session functions --- src/app/embeds/session/page.tsx | 3 +-- src/app/tools/session/page.tsx | 37 ++------------------------------- src/commands/stats.tsx | 2 -- src/stores/session.ts | 35 ++++++++++++++++++++++++++++++- 4 files changed, 37 insertions(+), 40 deletions(-) diff --git a/src/app/embeds/session/page.tsx b/src/app/embeds/session/page.tsx index b73fef64a..728f84710 100644 --- a/src/app/embeds/session/page.tsx +++ b/src/app/embeds/session/page.tsx @@ -14,11 +14,10 @@ import { import calculateWN8 from '../../../core/statistics/calculateWN8'; import { deltaTankStats } from '../../../core/statistics/deltaTankStats'; import getWN8Percentile from '../../../core/statistics/getWN8Percentile'; -import { useSession } from '../../../stores/session'; +import { resetSession, useSession } from '../../../stores/session'; import { IndividualTankStats, TanksStats } from '../../../types/tanksStats'; import { CustomColumnDisplay } from '../../tools/session/components/CustomColumn'; import { Menu } from '../../tools/session/components/Menu'; -import { resetSession } from '../../tools/session/page'; const REFRESH_RATE = 1 / 5; diff --git a/src/app/tools/session/page.tsx b/src/app/tools/session/page.tsx index e89c25a64..a6eb1e323 100644 --- a/src/app/tools/session/page.tsx +++ b/src/app/tools/session/page.tsx @@ -18,48 +18,15 @@ import { import { debounce } from 'lodash'; import { ChangeEvent, useEffect, useRef, useState } from 'react'; import PageWrapper from '../../../components/PageWrapper'; -import { REGION_NAMES, Region } from '../../../constants/regions'; -import { WARGAMING_APPLICATION_ID } from '../../../constants/wargamingApplicationID'; -import fetchBlitz from '../../../core/blitz/fetchWargaming'; +import { REGION_NAMES } from '../../../constants/regions'; import searchPlayersAcrossRegions, { AccountListWithServer, } from '../../../core/blitz/searchPlayersAcrossRegions'; -import { useSession } from '../../../stores/session'; -import { NormalizedTankStats, TanksStats } from '../../../types/tanksStats'; +import { resetSession, setSession, useSession } from '../../../stores/session'; import SessionPage from '../../embeds/session/page'; import { Menu } from './components/Menu'; import * as styles from './page.css'; -export async function setSession(region: Region, id: number, nickname: string) { - const rawTankStats = ( - await fetchBlitz( - `https://api.wotblitz.${region}/wotb/tanks/stats/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, - ) - )[id]; - const tankStats = rawTankStats.reduce( - (accumulator, tank) => ({ - ...accumulator, - [tank.tank_id]: tank, - }), - {}, - ); - - useSession.setState({ - isTracking: true, - id, - region, - nickname, - tankStats, - time: Date.now(), - }); -} - -export function resetSession() { - const session = useSession.getState(); - if (!session.isTracking) return; - setSession(session.region, session.id, session.nickname); -} - export default function Page() { const input = useRef(null); const [searchResults, setSearchResults] = useState< diff --git a/src/commands/stats.tsx b/src/commands/stats.tsx index f95a8aa30..3f2e8cf60 100644 --- a/src/commands/stats.tsx +++ b/src/commands/stats.tsx @@ -41,8 +41,6 @@ async function render( const { stats, supplementary } = await filterStats(diffedTankStats, filters); const filterDescriptions = await filtersToDescription(filters); - console.log(clan); - return ( ( + `https://api.wotblitz.${region}/wotb/tanks/stats/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, + ) + )[id]; + const tankStats = rawTankStats.reduce( + (accumulator, tank) => ({ + ...accumulator, + [tank.tank_id]: tank, + }), + {}, + ); + + useSession.setState({ + isTracking: true, + id, + region, + nickname, + tankStats, + time: Date.now(), + }); +} + +export function resetSession() { + const session = useSession.getState(); + if (!session.isTracking) return; + setSession(session.region, session.id, session.nickname); +} + export const useSession = create()( devtools( persist(