From 3c80a43435e210ca7214a524432636751a24c4d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sat, 7 Sep 2024 21:45:00 -0500 Subject: [PATCH] fix: types --- .vscode/settings.json | 1 + bun.lockb | Bin 202211 -> 266836 bytes package.json | 25 +----- packages/bot/package.json | 17 ++++ packages/bot/src/commands/breakdown/index.tsx | 2 +- .../bot/src/commands/breakdown/render.tsx | 31 +++---- packages/bot/src/commands/debug.ts | 2 +- packages/bot/src/commands/evolution.tsx | 14 +-- packages/bot/src/commands/fullStats.tsx | 15 ++-- packages/bot/src/commands/inactive.tsx | 8 +- packages/bot/src/commands/link.tsx | 6 +- packages/bot/src/commands/ownedTanks.tsx | 16 ++-- packages/bot/src/commands/playerInfo.ts | 2 +- packages/bot/src/commands/rating.tsx | 31 +++---- .../bot/src/commands/ratingLeaderboard.tsx | 44 +++++----- packages/bot/src/commands/replay.tsx | 22 ++--- packages/bot/src/commands/research.tsx | 38 ++++---- packages/bot/src/commands/searchClans.ts | 4 +- packages/bot/src/commands/searchPlayers.ts | 8 +- packages/bot/src/commands/stats.tsx | 14 +-- packages/bot/src/commands/today.ts | 2 +- .../src/components/AllStatsOverview/index.tsx | 6 +- .../components/Breakdown/components/Row.tsx | 4 +- .../Breakdown/components/RowStat.tsx | 2 +- .../src/components/GenericAllStats/index.tsx | 6 +- .../Tanks/components/Item/constants.ts | 5 +- .../Tanks/components/Item/index.tsx | 6 +- packages/bot/src/components/TierWeights.tsx | 2 +- .../src/core/blitzkit/getBlitzFromDiscord.ts | 5 +- .../src/core/blitzkit/getPeriodNow.ts | 0 .../src/core/blitzkit/getPeriodStart.ts | 4 +- .../src/core/blitzkit/jsxToPng.ts | 0 .../src/core/blitzkit/jsxToPngThreaded.ts | 2 +- .../core/blitzkit/jsxToSvg/Roboto-Black.ttf | Bin .../core/blitzkit/jsxToSvg/Roboto-Bold.ttf | Bin .../src/core/blitzkit/jsxToSvg/Roboto.ttf | Bin .../src/core/blitzkit/jsxToSvg/index.ts | 2 +- .../src/core/blitzkit/svgToPng.ts | 0 .../src/core/blitzkit/svgToPngThreaded.ts | 0 .../src/core/blitzstars/getStatsInPeriod.ts | 8 +- .../src/core/blitzstars}/getTankHistories.ts | 7 +- .../src/core/discord/addClanChoices.ts | 0 .../src/core/discord/addFilterOptions.ts | 12 ++- .../src/core/discord/addPeriodSubCommands.ts | 0 .../core/discord/addPeriodicFilterOptions.ts | 0 .../src/core/discord/addRegionChoices.ts | 4 +- .../src/core/discord/addTankChoices.ts | 0 .../src/core/discord/addTierChoices.ts | 0 .../src/core/discord/addUsernameChoices.ts | 0 .../discord/autocompleteClan/constants.ts | 0 .../core/discord/autocompleteClan/index.ts | 2 +- .../src/core/discord/autocompleteTanks.ts | 2 +- .../src/core/discord/autocompleteUsername.ts | 2 +- .../src/core/discord/buttonLink.ts | 0 .../src/core/discord/buttonPrimary.ts | 0 .../src/core/discord/buttonRefresh.ts | 0 .../src/core/discord/client.ts | 0 .../src/core/discord/commandToURL.ts | 0 .../core/discord/createLocalizedCommand.ts | 0 .../src/core/discord/embedInfo.ts | 2 +- .../src/core/discord/embedNegative.ts | 2 +- .../src/core/discord/embedPositive.ts | 2 +- .../src/core/discord/embedWarning.ts | 2 +- .../src/core/discord/getCustomPeriodParams.ts | 0 .../src/core/discord/getFiltersFromButton.ts | 3 +- .../src/core/discord/getFiltersFromCommand.ts | 5 +- .../src/core/discord/getPeriodOptionName.ts | 0 .../src/core/discord/localizationObject.ts | 0 .../src/core/discord/manager.ts | 2 +- .../src/core/discord/markdownTable.ts | 0 .../discord/normalizeInteractionReturnable.ts | 2 +- .../{website => bot}/src/core/discord/psa.ts | 0 .../core/discord/resolveClanFromCommand.ts | 6 +- .../core/discord/resolvePeriodFromButton.ts | 4 +- .../core/discord/resolvePeriodFromCommand.ts | 4 +- .../core/discord/resolvePlayerFromButton.ts | 2 +- .../resolvePlayerFromCommand/constants.ts | 0 .../discord/resolvePlayerFromCommand/index.ts | 6 +- .../core/localization/strings/constants.ts | 2 + .../src/core/localization/strings/index.ts | 1 + .../src/core/localization/translator.ts | 0 .../handlers/chatInputCommand.ts | 2 +- .../bot/src/events/interactionCreate/index.ts | 4 +- packages/bot/src/types/histories.ts | 2 +- packages/bot/src/workers/bot.ts | 4 +- packages/bot/tsconfig.json | 3 + packages/core/package.json | 6 +- packages/core/src/blitz/constants.ts | 2 + packages/core/src/blitz/equipmentPrice.ts | 2 +- packages/core/src/blitz/idToRegion.ts | 2 +- .../blitzkit/averageDefinitions/constants.ts | 1 + .../src/blitzkit/averageDefinitions/index.ts | 2 +- .../core/src/blitzkit/skillDefinitions.ts | 2 +- .../src/blitzkit/tankDefinitions/constants.ts | 2 +- .../src/blitzkit/tankDefinitions/index.ts | 5 +- .../src/statistics/deltaBkrlBlitzStats.ts | 4 +- .../core/src/statistics/deltaTankStats.ts | 2 + packages/core/src/statistics/filterStats.ts | 5 +- .../core/src/statistics/getTierWeights.ts | 2 +- packages/core/src/statistics/sumStats.ts | 1 + packages/core/src/streams/rts.ts | 2 +- .../core/src/zustand/createNextSafeStore.tsx | 1 - packages/scripts/package.json | 7 +- packages/scripts/src/applyPatches.ts | 21 +++-- packages/scripts/src/averages.ts | 29 ++++--- .../scripts/src/buildAssets/boosterIcons.ts | 4 +- .../src/buildAssets/camouflageIcons.ts | 4 +- .../buildAssets/consumableProvisionIcons.ts | 8 +- .../scripts/src/buildAssets/currencies.ts | 6 +- .../scripts/src/buildAssets/definitions.ts | 74 ++++++++-------- .../scripts/src/buildAssets/equipmentIcons.ts | 8 +- packages/scripts/src/buildAssets/flags.ts | 20 +++-- .../src/buildAssets/gameModeBanners.ts | 6 +- .../scripts/src/buildAssets/moduleIcons.ts | 8 +- .../scripts/src/buildAssets/shellIcons.ts | 8 +- .../scripts/src/buildAssets/skillIcons.ts | 10 +-- .../scripts/src/buildAssets/tankArmors.ts | 10 +-- packages/scripts/src/buildAssets/tankIcons.ts | 12 +-- .../scripts/src/buildAssets/tankModels.ts | 12 +-- .../scripts/src/buildRatingLeaderboard.ts | 31 +++---- .../src/core/blitz/readBase64DVPL.ts | 0 .../src/core/blitz/readDVPL.ts | 0 .../src/core/blitz/readDVPLFile.ts | 0 .../src/core/blitz/readStringDVPL.ts | 0 .../src/core/blitz/readXMLDVPL.ts | 0 .../src/core/blitz/readYAML.ts | 0 .../src/core/blitz/readYAMLDVPL.ts | 0 .../src/core/github}/commitAssets.ts | 5 +- .../src/core/github}/commitMultipleFiles.ts | 7 +- .../src/core/github}/fetchPreDiscoveredIds.ts | 9 +- packages/scripts/src/discoverIds.ts | 27 +++--- packages/scripts/src/downloadZipClient.ts | 3 - packages/scripts/src/reviews.ts | 35 +++++--- packages/scripts/src/sitemap.ts | 2 +- packages/website/package.json | 2 + .../api/[region]/rating/current/info/route.ts | 2 +- .../rating/current/league/[league]/route.ts | 2 +- .../rating/current/search/[username]/route.ts | 2 +- .../src/app/api/patreon/auth/[code]/route.ts | 6 +- .../api/patreon/membership/[token]/route.ts | 2 +- .../app/api/patreon/refresh/[token]/route.ts | 2 +- .../app/api/tank-voting/[id]/average/route.ts | 3 +- .../app/api/tank-voting/[id]/cast/route.ts | 3 +- .../website/src/app/components/Checks.tsx | 8 +- .../app/docs/[directory]/[document]/page.tsx | 2 +- .../src/app/tools/compare/components/Body.tsx | 3 +- .../tools/compare/components/CompareRow.tsx | 24 ++--- .../tools/compare/components/CompareTable.tsx | 24 ++--- .../app/tools/compare/components/Controls.tsx | 2 +- .../components/IntersectionMarker/index.tsx | 2 +- .../app/tools/compare/components/TankCard.tsx | 3 +- .../tools/compare/components/TankControl.tsx | 2 +- .../website/src/app/tools/compare/page.tsx | 16 ++-- .../src/app/tools/embed/[embed]/page.tsx | 6 +- .../tools/embed/configurations/breakdown.tsx | 12 +-- .../app/tools/performance/components/Info.tsx | 3 +- .../tools/performance/components/TankRow.tsx | 8 +- .../tools/performance/components/Tanks.tsx | 8 +- .../performance/components/TierBreakdown.tsx | 20 ++--- .../tools/performance/components/Total.tsx | 12 +-- .../website/src/app/tools/rating/page.tsx | 21 +++-- .../website/src/app/tools/session/page.tsx | 12 +-- .../Characteristics/components/Modules.tsx | 5 ++ .../[id]/components/Model/HeroSection.tsx | 1 + .../MetaSection/components/Votes/index.tsx | 6 +- .../components/Model/MetaSection/index.tsx | 1 + .../[id]/components/Model/TankSandbox.tsx | 2 +- .../components/DynamicArmorSwitcher.tsx | 1 + .../[id]/components/QuickInputs/index.tsx | 2 +- .../[id]/components/ShotDisplaySection.tsx | 1 + .../tankopedia/[id]/components/Title.tsx | 4 +- .../tankopedia/components/PageTurner.tsx | 2 +- .../tools/tankopedia/components/QuickLink.tsx | 2 +- .../tools/tankopedia/components/SearchBar.tsx | 2 +- .../tools/tankopedia/components/TankCard.tsx | 4 + .../components/TankSearch/constants.tsx | 2 +- .../components/TankSearch/index.tsx | 4 + .../tankopedia/components/TierFilter.tsx | 3 +- .../src/app/tools/tankopedia/page.css.ts | 82 ------------------ .../Armor/components/ArmorPlateDisplay.tsx | 1 + .../Armor/components/ShotDisplay.tsx | 1 + .../Armor/components/StaticArmor.tsx | 6 ++ .../components/StaticArmorSceneComponent.tsx | 7 ++ .../website/src/components/ClassIcon/index.ts | 2 +- .../src/components/EquipmentManager.tsx | 1 + .../Footer/components/WoTBVersion.tsx | 2 +- .../website/src/components/ModuleManager.tsx | 8 +- .../components/WargamingAccountName.tsx | 1 + .../components/WargamingLoginButton.tsx | 2 +- .../website/src/components/Navbar/index.tsx | 10 ++- .../website/src/components/PageWrapper.tsx | 2 +- .../src/components/TankRowHeaderCell.tsx | 4 +- .../website/src/components/TanksEmbed.tsx | 20 +++-- packages/website/src/core/blitz/canSplash.ts | 2 + .../website/src/core/blitz/extractArmor.ts | 11 ++- .../src/core/blitz/extractModel/constants.ts | 3 +- .../src/core/blitz/extractModel/index.ts | 12 ++- packages/website/src/core/blitz/fetchBlitz.ts | 7 +- .../website/src/core/blitz/generateStats.ts | 4 +- .../src/core/blitz/getAccountAchievements.ts | 2 +- .../website/src/core/blitz/getAccountInfo.ts | 3 +- .../src/core/blitz/getClanAccountInfo.ts | 2 +- .../website/src/core/blitz/getClanInfo.ts | 2 +- .../src/core/blitz/getLeagueFromScore.ts | 2 +- .../website/src/core/blitz/getRatingInfo.ts | 4 +- .../website/src/core/blitz/getRatingLeague.ts | 7 +- .../src/core/blitz/getRatingNeighbors.ts | 4 +- .../website/src/core/blitz/getTankStats.ts | 3 +- .../website/src/core/blitz/isValidBlitzId.ts | 10 +-- .../src/core/blitz/regionSubdomainToRegion.ts | 4 +- .../src/core/blitz/regionToRegionSubdomain.ts | 2 +- .../website/src/core/blitz/resolveTankId.ts | 7 +- .../core/blitz/searchClansAcrossRegions.ts | 4 +- .../core/blitz/searchCurrentRatingPlayers.ts | 2 +- .../blitz/searchPlayersAcrossRegions/index.ts | 2 +- packages/website/src/core/blitz/toUniqueId.ts | 2 +- .../src/core/blitzkit/buildTechTreeLine.ts | 2 +- .../website/src/core/blitzkit/createBlob.ts | 2 +- .../src/core/blitzkit/filtersToDescription.ts | 11 ++- .../src/core/blitzkit/flagUserActivity.ts | 2 +- .../blitzkit/getArchivedLatestSeasonNumber.ts | 6 +- .../core/blitzkit/getArchivedRatingInfo.ts | 5 +- .../blitzkit/getArchivedRatingLeaderboard.ts | 9 +- .../getArchivedRatingMidnightLeaderboard.ts | 9 +- .../src/core/blitzkit/getTimeDaysAgo.ts | 2 +- .../website/src/core/blitzkit/hasEquipment.ts | 2 +- .../src/core/blitzkit/linkBlitzAndDiscord.ts | 2 +- packages/website/src/core/blitzkit/octokit.ts | 2 +- .../website/src/core/blitzkit/parseBkni.ts | 6 +- .../website/src/core/blitzkit/processes.ts | 4 +- .../src/core/blitzkit/readTexture/index.ts | 5 +- .../src/core/blitzkit/resolveAncestry.ts | 2 +- .../src/core/blitzkit/resolveReload.ts | 2 +- .../src/core/blitzkit/tankToCompareMember.ts | 4 +- .../blitzstars/getBlitzStarsLinkButton.ts | 4 +- .../src/core/blitzstars/getPlayerHistories.ts | 5 +- .../src/core/blitzstars/getPlayerStats.ts | 3 +- .../src/core/blitzstars/tankAverages.ts | 3 +- .../website/src/core/github/assetCommit.ts | 27 +++--- .../website/src/hooks/useAppliedEquipments.ts | 4 +- .../src/hooks/useAveragesExclusionRatio.ts | 2 +- packages/website/src/hooks/useEccentricity.ts | 7 +- .../website/src/hooks/useEquipmentPreset.ts | 2 +- packages/website/src/hooks/useProvision.ts | 2 +- packages/website/src/hooks/useTankVotes.ts | 2 +- .../website/src/stores/comparePersistent.ts | 2 +- .../website/src/stores/embedState/index.ts | 17 +++- packages/website/src/stores/session.ts | 8 +- packages/website/src/stores/tankFilters.ts | 2 +- .../stores/tankPerformancePersistent/index.ts | 2 +- .../src/stores/tankPerformanceSort/index.ts | 2 +- .../website/src/stores/tankopediaEphemeral.ts | 4 +- .../src/stores/tankopediaPersistent/index.ts | 2 +- packages/website/tsconfig.json | 29 +------ tsconfig.json | 75 +--------------- 255 files changed, 797 insertions(+), 838 deletions(-) create mode 100644 packages/bot/package.json rename packages/{website => bot}/src/core/blitzkit/getBlitzFromDiscord.ts (66%) rename packages/{website => bot}/src/core/blitzkit/getPeriodNow.ts (100%) rename packages/{website => bot}/src/core/blitzkit/getPeriodStart.ts (70%) rename packages/{website => bot}/src/core/blitzkit/jsxToPng.ts (100%) rename packages/{website => bot}/src/core/blitzkit/jsxToPngThreaded.ts (76%) rename packages/{website => bot}/src/core/blitzkit/jsxToSvg/Roboto-Black.ttf (100%) rename packages/{website => bot}/src/core/blitzkit/jsxToSvg/Roboto-Bold.ttf (100%) rename packages/{website => bot}/src/core/blitzkit/jsxToSvg/Roboto.ttf (100%) rename packages/{website => bot}/src/core/blitzkit/jsxToSvg/index.ts (88%) rename packages/{website => bot}/src/core/blitzkit/svgToPng.ts (100%) rename packages/{website => bot}/src/core/blitzkit/svgToPngThreaded.ts (100%) rename packages/{website/src/core/blitzkit => bot/src/core/blitzstars}/getTankHistories.ts (93%) rename packages/{website => bot}/src/core/discord/addClanChoices.ts (100%) rename packages/{website => bot}/src/core/discord/addFilterOptions.ts (91%) rename packages/{website => bot}/src/core/discord/addPeriodSubCommands.ts (100%) rename packages/{website => bot}/src/core/discord/addPeriodicFilterOptions.ts (100%) rename packages/{website => bot}/src/core/discord/addRegionChoices.ts (89%) rename packages/{website => bot}/src/core/discord/addTankChoices.ts (100%) rename packages/{website => bot}/src/core/discord/addTierChoices.ts (100%) rename packages/{website => bot}/src/core/discord/addUsernameChoices.ts (100%) rename packages/{website => bot}/src/core/discord/autocompleteClan/constants.ts (100%) rename packages/{website => bot}/src/core/discord/autocompleteClan/index.ts (93%) rename packages/{website => bot}/src/core/discord/autocompleteTanks.ts (96%) rename packages/{website => bot}/src/core/discord/autocompleteUsername.ts (93%) rename packages/{website => bot}/src/core/discord/buttonLink.ts (100%) rename packages/{website => bot}/src/core/discord/buttonPrimary.ts (100%) rename packages/{website => bot}/src/core/discord/buttonRefresh.ts (100%) rename packages/{website => bot}/src/core/discord/client.ts (100%) rename packages/{website => bot}/src/core/discord/commandToURL.ts (100%) rename packages/{website => bot}/src/core/discord/createLocalizedCommand.ts (100%) rename packages/{website => bot}/src/core/discord/embedInfo.ts (83%) rename packages/{website => bot}/src/core/discord/embedNegative.ts (80%) rename packages/{website => bot}/src/core/discord/embedPositive.ts (80%) rename packages/{website => bot}/src/core/discord/embedWarning.ts (80%) rename packages/{website => bot}/src/core/discord/getCustomPeriodParams.ts (100%) rename packages/{website => bot}/src/core/discord/getFiltersFromButton.ts (84%) rename packages/{website => bot}/src/core/discord/getFiltersFromCommand.ts (81%) rename packages/{website => bot}/src/core/discord/getPeriodOptionName.ts (100%) rename packages/{website => bot}/src/core/discord/localizationObject.ts (100%) rename packages/{website => bot}/src/core/discord/manager.ts (68%) rename packages/{website => bot}/src/core/discord/markdownTable.ts (100%) rename packages/{website => bot}/src/core/discord/normalizeInteractionReturnable.ts (95%) rename packages/{website => bot}/src/core/discord/psa.ts (100%) rename packages/{website => bot}/src/core/discord/resolveClanFromCommand.ts (81%) rename packages/{website => bot}/src/core/discord/resolvePeriodFromButton.ts (91%) rename packages/{website => bot}/src/core/discord/resolvePeriodFromCommand.ts (92%) rename packages/{website => bot}/src/core/discord/resolvePlayerFromButton.ts (89%) rename packages/{website => bot}/src/core/discord/resolvePlayerFromCommand/constants.ts (100%) rename packages/{website => bot}/src/core/discord/resolvePlayerFromCommand/index.ts (87%) rename packages/{website => bot}/src/core/localization/strings/constants.ts (68%) rename packages/{website => bot}/src/core/localization/strings/index.ts (92%) rename packages/{website => bot}/src/core/localization/translator.ts (100%) create mode 100644 packages/bot/tsconfig.json rename packages/{website => scripts}/src/core/blitz/readBase64DVPL.ts (100%) rename packages/{website => scripts}/src/core/blitz/readDVPL.ts (100%) rename packages/{website => scripts}/src/core/blitz/readDVPLFile.ts (100%) rename packages/{website => scripts}/src/core/blitz/readStringDVPL.ts (100%) rename packages/{website => scripts}/src/core/blitz/readXMLDVPL.ts (100%) rename packages/{website => scripts}/src/core/blitz/readYAML.ts (100%) rename packages/{website => scripts}/src/core/blitz/readYAMLDVPL.ts (100%) rename packages/{website/src/core/blitzkit => scripts/src/core/github}/commitAssets.ts (72%) rename packages/{website/src/core/blitzkit => scripts/src/core/github}/commitMultipleFiles.ts (88%) rename packages/{website/src/core/blitzkit => scripts/src/core/github}/fetchPreDiscoveredIds.ts (77%) delete mode 100644 packages/scripts/src/downloadZipClient.ts delete mode 100644 packages/website/src/app/tools/tankopedia/page.css.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index 588494a00..5b01a0358 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -65,6 +65,7 @@ "Everytime", "FASTNAME", "FOURCC", + "frameloop", "fsformat", "Fullscreen", "fullstats", diff --git a/bun.lockb b/bun.lockb index 748c3458b5e0575d9a401c8dd726c0ef131d1d22..cf0d7b47dacd503f1ea999aa6937775706777456 100644 GIT binary patch delta 83874 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 Dm#EdG delta 43590 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 zou6((resolve) => { {!hasInactiveMembers && ( diff --git a/packages/bot/src/commands/link.tsx b/packages/bot/src/commands/link.tsx index 8d8ee8999..8cf45f682 100644 --- a/packages/bot/src/commands/link.tsx +++ b/packages/bot/src/commands/link.tsx @@ -1,9 +1,9 @@ import { teal } from '@radix-ui/colors'; +import { getAccountInfo } from '../../../website/src/core/blitz/getAccountInfo'; +import { getClanAccountInfo } from '../../../website/src/core/blitz/getClanAccountInfo'; +import { linkBlitzAndDiscord } from '../../../website/src/core/blitzkit/linkBlitzAndDiscord'; import { Glow } from '../components/AllStatsOverview/components/HeroStat/components/Glow'; import CommandWrapper from '../components/CommandWrapper'; -import { getAccountInfo } from '../core/blitz/getAccountInfo'; -import { getClanAccountInfo } from '../core/blitz/getClanAccountInfo'; -import { linkBlitzAndDiscord } from '../core/blitzkit/linkBlitzAndDiscord'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteUsername from '../core/discord/autocompleteUsername'; import { createLocalizedCommand } from '../core/discord/createLocalizedCommand'; diff --git a/packages/bot/src/commands/ownedTanks.tsx b/packages/bot/src/commands/ownedTanks.tsx index c476a343d..78f586511 100644 --- a/packages/bot/src/commands/ownedTanks.tsx +++ b/packages/bot/src/commands/ownedTanks.tsx @@ -1,16 +1,16 @@ -import { gameDefinitions } from '@blitzkit/core/src/blitzkit/gameDefinitions'; -import { chunk } from 'lodash'; -import markdownEscape from 'markdown-escape'; -import { TANK_CLASSES } from '../components/Tanks/components/Item/constants'; -import { getAccountInfo } from '../core/blitz/getAccountInfo'; -import getTankStats from '../core/blitz/getTankStats'; import { + TANK_CLASSES, + TIER_ROMAN_NUMERALS, TankDefinition, Tier, flags, tankDefinitions, -} from '../core/blitzkit/tankDefinitions'; -import { TIER_ROMAN_NUMERALS } from '../core/blitzkit/tankDefinitions/constants'; +} from '@blitzkit/core'; +import { gameDefinitions } from '@blitzkit/core/src/blitzkit/gameDefinitions'; +import { chunk } from 'lodash'; +import markdownEscape from 'markdown-escape'; +import { getAccountInfo } from '../../../website/src/core/blitz/getAccountInfo'; +import getTankStats from '../../../website/src/core/blitz/getTankStats'; import addTierChoices from '../core/discord/addTierChoices'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteUsername from '../core/discord/autocompleteUsername'; diff --git a/packages/bot/src/commands/playerInfo.ts b/packages/bot/src/commands/playerInfo.ts index f6af4a6dc..68d29026c 100644 --- a/packages/bot/src/commands/playerInfo.ts +++ b/packages/bot/src/commands/playerInfo.ts @@ -1,5 +1,5 @@ import markdownEscape from 'markdown-escape'; -import { getAccountInfo } from '../core/blitz/getAccountInfo'; +import { getAccountInfo } from '../../../website/src/core/blitz/getAccountInfo'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteUsername from '../core/discord/autocompleteUsername'; import { createLocalizedCommand } from '../core/discord/createLocalizedCommand'; diff --git a/packages/bot/src/commands/rating.tsx b/packages/bot/src/commands/rating.tsx index fc62d2465..eaa04a4ea 100644 --- a/packages/bot/src/commands/rating.tsx +++ b/packages/bot/src/commands/rating.tsx @@ -1,24 +1,23 @@ +import { BkrlFormat, deltaBkrlBlitzStats } from '@blitzkit/core'; import { SlashCommandSubcommandBuilder } from 'discord.js'; import markdownEscape from 'markdown-escape'; +import { getAccountInfo } from '../../../website/src/core/blitz/getAccountInfo'; +import { getClanAccountInfo } from '../../../website/src/core/blitz/getClanAccountInfo'; +import { getLeagueFromScore } from '../../../website/src/core/blitz/getLeagueFromScore'; +import getRatingInfo from '../../../website/src/core/blitz/getRatingInfo'; +import { getRatingNeighbors } from '../../../website/src/core/blitz/getRatingNeighbors'; +import { normalizeLeagueIcon } from '../../../website/src/core/blitz/normalizeLeagueIcon'; +import { emblemURL } from '../../../website/src/core/blitzkit/emblemURL'; +import getArchivedRatingMidnightLeaderboard from '../../../website/src/core/blitzkit/getArchivedRatingMidnightLeaderboard'; +import { iconPng } from '../../../website/src/core/blitzkit/iconPng'; import { Glow } from '../components/AllStatsOverview/components/HeroStat/components/Glow'; import CommandWrapper from '../components/CommandWrapper'; import { DeltaCaret } from '../components/DeltaCaret'; import TitleBar from '../components/TitleBar'; -import { getAccountInfo } from '../core/blitz/getAccountInfo'; -import { getClanAccountInfo } from '../core/blitz/getClanAccountInfo'; -import { getLeagueFromScore } from '../core/blitz/getLeagueFromScore'; -import getRatingInfo from '../core/blitz/getRatingInfo'; -import { getRatingNeighbors } from '../core/blitz/getRatingNeighbors'; -import { normalizeLeagueIcon } from '../core/blitz/normalizeLeagueIcon'; -import { emblemURL } from '../core/blitzkit/emblemURL'; -import getArchivedRatingMidnightLeaderboard from '../core/blitzkit/getArchivedRatingMidnightLeaderboard'; -import { iconPng } from '../core/blitzkit/iconPng'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import { createLocalizedCommand } from '../core/discord/createLocalizedCommand'; import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand'; import { translator } from '../core/localization/translator'; -import { deltaBkrlBlitzStats } from '../core/statistics/deltaBkrlBlitzStats'; -import { BkrlFormat } from '../core/streams/bkrl'; import { CommandRegistry } from '../events/interactionCreate'; import { theme } from '../stitches.config'; @@ -122,9 +121,9 @@ export const ratingCommand = new Promise((resolve) => {
((resolve) => { padding: 16, backgroundColor: theme.colors[`appBackground2${leagueTheme}`], borderRadius: 4, - border: `1px solid ${theme.colors[`componentInteractive${leagueTheme}`]}`, + border: `1px solid ${ + theme.colors[`componentInteractive${leagueTheme}`] + }`, display: 'flex', alignItems: 'center', justifyContent: 'space-between', diff --git a/packages/bot/src/commands/ratingLeaderboard.tsx b/packages/bot/src/commands/ratingLeaderboard.tsx index 50f75f4eb..c450d0241 100644 --- a/packages/bot/src/commands/ratingLeaderboard.tsx +++ b/packages/bot/src/commands/ratingLeaderboard.tsx @@ -1,3 +1,9 @@ +import { + BkrlDiscriminatedEntries, + FIRST_MINIMAL_ARCHIVED_RATING_SEASON, + LEAGUES, + Region, +} from '@blitzkit/core'; import { APIApplicationCommandOptionChoice, Locale, @@ -5,22 +11,20 @@ import { } from 'discord.js'; import { range } from 'lodash'; import markdownEscape from 'markdown-escape'; +import { getAccountInfo } from '../../../website/src/core/blitz/getAccountInfo'; +import { getClanAccountInfo } from '../../../website/src/core/blitz/getClanAccountInfo'; +import getRatingInfo from '../../../website/src/core/blitz/getRatingInfo'; +import { getRatingLeague } from '../../../website/src/core/blitz/getRatingLeague'; +import { getRatingNeighbors } from '../../../website/src/core/blitz/getRatingNeighbors'; +import { isOnGoingRatingSeason } from '../../../website/src/core/blitz/isOnGoingRatingSeason'; +import { getArchivedLatestSeasonNumber } from '../../../website/src/core/blitzkit/getArchivedLatestSeasonNumber'; +import getArchivedRatingInfo from '../../../website/src/core/blitzkit/getArchivedRatingInfo'; +import { getArchivedRatingLeaderboard } from '../../../website/src/core/blitzkit/getArchivedRatingLeaderboard'; +import getArchivedRatingMidnightLeaderboard from '../../../website/src/core/blitzkit/getArchivedRatingMidnightLeaderboard'; +import { UserError } from '../../../website/src/hooks/userError'; import CommandWrapper from '../components/CommandWrapper'; import * as Leaderboard from '../components/Leaderboard'; import TitleBar from '../components/TitleBar'; -import { LEAGUES } from '../constants/leagues'; -import { FIRST_MINIMAL_ARCHIVED_RATING_SEASON } from '../constants/rating'; -import { Region } from '../constants/regions'; -import { getAccountInfo } from '../core/blitz/getAccountInfo'; -import { getClanAccountInfo } from '../core/blitz/getClanAccountInfo'; -import getRatingInfo from '../core/blitz/getRatingInfo'; -import { getRatingLeague } from '../core/blitz/getRatingLeague'; -import { getRatingNeighbors } from '../core/blitz/getRatingNeighbors'; -import { isOnGoingRatingSeason } from '../core/blitz/isOnGoingRatingSeason'; -import { getArchivedLatestSeasonNumber } from '../core/blitzkit/getArchivedLatestSeasonNumber'; -import getArchivedRatingInfo from '../core/blitzkit/getArchivedRatingInfo'; -import { getArchivedRatingLeaderboard } from '../core/blitzkit/getArchivedRatingLeaderboard'; -import getArchivedRatingMidnightLeaderboard from '../core/blitzkit/getArchivedRatingMidnightLeaderboard'; import addRegionChoices from '../core/discord/addRegionChoices'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteUsername from '../core/discord/autocompleteUsername'; @@ -28,9 +32,7 @@ import { createLocalizedCommand } from '../core/discord/createLocalizedCommand'; import { localizationObject } from '../core/discord/localizationObject'; import resolvePlayerFromCommand from '../core/discord/resolvePlayerFromCommand'; import { translator } from '../core/localization/translator'; -import { BkrlDiscriminatedEntries } from '../core/streams/bkrl'; import { CommandRegistry } from '../events/interactionCreate'; -import { UserError } from '../hooks/userError'; export interface RatingPlayer { spa_id: number; @@ -254,7 +256,7 @@ export const ratingLeaderboardCommand = new Promise( name_localizations: localizationObject( `common.leagues.${name}`, ), - }) satisfies APIApplicationCommandOptionChoice, + } satisfies APIApplicationCommandOptionChoice), ), ) .setRequired(true); @@ -277,8 +279,8 @@ export const ratingLeaderboardCommand = new Promise( const season = seasonOption ? parseInt(seasonOption) : onGoingSeason - ? latestArchivedSeasonNumber + 1 - : latestArchivedSeasonNumber; + ? latestArchivedSeasonNumber + 1 + : latestArchivedSeasonNumber; const isCurrentSeason = season === latestArchivedSeasonNumber + 1; let titleName: string; let titleImage: string | undefined; @@ -311,7 +313,7 @@ export const ratingLeaderboardCommand = new Promise( position: player.number, clan: player.clan_tag, nickname: player.nickname, - }) satisfies SimplifiedPlayer, + } satisfies SimplifiedPlayer), ), ) : await getArchivedRatingLeaderboard(region, season!).then( @@ -347,7 +349,7 @@ export const ratingLeaderboardCommand = new Promise( 'bot.commands.rating_leaderboard.body.deleted_player', [`${player.id}`], ), - }) satisfies SimplifiedPlayer, + } satisfies SimplifiedPlayer), ); }, ); @@ -396,7 +398,7 @@ export const ratingLeaderboardCommand = new Promise( score: player.score, clan: player.clan_tag, nickname: player.nickname, - }) satisfies SimplifiedPlayer, + } satisfies SimplifiedPlayer), ), ) : await getArchivedRatingLeaderboard(region, season!).then( diff --git a/packages/bot/src/commands/replay.tsx b/packages/bot/src/commands/replay.tsx index 6833d4a73..c13a61a21 100644 --- a/packages/bot/src/commands/replay.tsx +++ b/packages/bot/src/commands/replay.tsx @@ -1,19 +1,21 @@ +import { + idToRegion, + tankDefinitions, + TIER_ROMAN_NUMERALS, +} from '@blitzkit/core'; import { tankIcon } from '@blitzkit/core/src/blitzkit/tankIcon'; +import calculateWN8 from '@blitzkit/core/src/statistics/calculateWN8'; import { clamp } from 'lodash'; +import { getClanAccountInfo } from '../../../website/src/core/blitz/getClanAccountInfo'; +import { emblemURL } from '../../../website/src/core/blitzkit/emblemURL'; +import { iconPng } from '../../../website/src/core/blitzkit/iconPng'; +import { mapDefinitions } from '../../../website/src/core/blitzkit/mapDefinitions'; +import { RenderConfiguration } from '../../../website/src/core/blitzkit/renderConfiguration'; +import { tankAverages } from '../../../website/src/core/blitzstars/tankAverages'; import CommandWrapper from '../components/CommandWrapper'; import TitleBar from '../components/TitleBar'; -import { getClanAccountInfo } from '../core/blitz/getClanAccountInfo'; -import { idToRegion } from '../core/blitz/idToRegion'; -import { emblemURL } from '../core/blitzkit/emblemURL'; -import { iconPng } from '../core/blitzkit/iconPng'; -import { mapDefinitions } from '../core/blitzkit/mapDefinitions'; -import { RenderConfiguration } from '../core/blitzkit/renderConfiguration'; -import { tankDefinitions } from '../core/blitzkit/tankDefinitions'; -import { TIER_ROMAN_NUMERALS } from '../core/blitzkit/tankDefinitions/constants'; -import { tankAverages } from '../core/blitzstars/tankAverages'; import buttonLink from '../core/discord/buttonLink'; import { createLocalizedCommand } from '../core/discord/createLocalizedCommand'; -import calculateWN8 from '../core/statistics/calculateWN8'; import { CommandRegistry } from '../events/interactionCreate'; import { theme } from '../stitches.config'; diff --git a/packages/bot/src/commands/research.tsx b/packages/bot/src/commands/research.tsx index 0b1a91f9e..a29216fb2 100644 --- a/packages/bot/src/commands/research.tsx +++ b/packages/bot/src/commands/research.tsx @@ -1,22 +1,22 @@ -import { Locale, escapeMarkdown } from 'discord.js'; +import { + asset, + equipmentPriceMatrix, + TANK_ICONS, + tankDefinitions, + TIER_ROMAN_NUMERALS, +} from '@blitzkit/core'; +import { escapeMarkdown, Locale } from 'discord.js'; +import { getAccountInfo } from '../../../website/src/core/blitz/getAccountInfo'; +import { getClanAccountInfo } from '../../../website/src/core/blitz/getClanAccountInfo'; +import getTankStats from '../../../website/src/core/blitz/getTankStats'; +import resolveTankId from '../../../website/src/core/blitz/resolveTankId'; +import { buildTechTreeLine } from '../../../website/src/core/blitzkit/buildTechTreeLine'; +import { emblemURL } from '../../../website/src/core/blitzkit/emblemURL'; +import { iconPng } from '../../../website/src/core/blitzkit/iconPng'; +import { resolveAncestry } from '../../../website/src/core/blitzkit/resolveAncestry'; +import { tankIconPng } from '../../../website/src/core/blitzkit/tankIconPng'; import CommandWrapper from '../components/CommandWrapper'; import TitleBar from '../components/TitleBar'; -import { equipmentPriceMatrix } from '../constants/equipmentPrice'; -import { getAccountInfo } from '../core/blitz/getAccountInfo'; -import { getClanAccountInfo } from '../core/blitz/getClanAccountInfo'; -import getTankStats from '../core/blitz/getTankStats'; -import resolveTankId from '../core/blitz/resolveTankId'; -import { asset } from '../core/blitzkit/asset'; -import { buildTechTreeLine } from '../core/blitzkit/buildTechTreeLine'; -import { emblemURL } from '../core/blitzkit/emblemURL'; -import { iconPng } from '../core/blitzkit/iconPng'; -import { resolveAncestry } from '../core/blitzkit/resolveAncestry'; -import { tankDefinitions } from '../core/blitzkit/tankDefinitions'; -import { - TANK_ICONS, - TIER_ROMAN_NUMERALS, -} from '../core/blitzkit/tankDefinitions/constants'; -import { tankIconPng } from '../core/blitzkit/tankIconPng'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteTanks from '../core/discord/autocompleteTanks'; import { createLocalizedCommand } from '../core/discord/createLocalizedCommand'; @@ -220,7 +220,9 @@ export const researchCommand = new Promise((resolve) => {
= { researchable: 'Tech tree', diff --git a/packages/bot/src/components/Tanks/components/Item/index.tsx b/packages/bot/src/components/Tanks/components/Item/index.tsx index 3619808c3..b5383dff0 100644 --- a/packages/bot/src/components/Tanks/components/Item/index.tsx +++ b/packages/bot/src/components/Tanks/components/Item/index.tsx @@ -1,8 +1,6 @@ +import { TankClass, TreeType } from '@blitzkit/core'; import { theme } from '../../../../stitches.config'; -import { TANK_CLASSES, TREE_TYPES, TREE_TYPE_ICONS } from './constants'; - -export type TankClass = (typeof TANK_CLASSES)[number]; -export type TreeType = (typeof TREE_TYPES)[number]; +import { TREE_TYPE_ICONS } from './constants'; export interface ItemProps { tankType?: TankClass; diff --git a/packages/bot/src/components/TierWeights.tsx b/packages/bot/src/components/TierWeights.tsx index 21d291911..b72059c46 100644 --- a/packages/bot/src/components/TierWeights.tsx +++ b/packages/bot/src/components/TierWeights.tsx @@ -1,4 +1,4 @@ -import { Tier } from '../core/blitzkit/tankDefinitions'; +import { Tier } from '@blitzkit/core'; import { theme } from '../stitches.config'; export type TierWeightsRecord = Partial>; diff --git a/packages/website/src/core/blitzkit/getBlitzFromDiscord.ts b/packages/bot/src/core/blitzkit/getBlitzFromDiscord.ts similarity index 66% rename from packages/website/src/core/blitzkit/getBlitzFromDiscord.ts rename to packages/bot/src/core/blitzkit/getBlitzFromDiscord.ts index f82238dcf..d64ebcbc0 100644 --- a/packages/website/src/core/blitzkit/getBlitzFromDiscord.ts +++ b/packages/bot/src/core/blitzkit/getBlitzFromDiscord.ts @@ -1,6 +1,5 @@ -import { usersDatabase } from '../../databases/users'; -import { idToRegion } from '../blitz/idToRegion'; -import { flagUserActivity } from './flagUserActivity'; +import { idToRegion, usersDatabase } from '@blitzkit/core'; +import { flagUserActivity } from '../../../../website/src/core/blitzkit/flagUserActivity'; export async function getBlitzFromDiscord(discordId: bigint) { const unique = await usersDatabase.discordUser.findUnique({ diff --git a/packages/website/src/core/blitzkit/getPeriodNow.ts b/packages/bot/src/core/blitzkit/getPeriodNow.ts similarity index 100% rename from packages/website/src/core/blitzkit/getPeriodNow.ts rename to packages/bot/src/core/blitzkit/getPeriodNow.ts diff --git a/packages/website/src/core/blitzkit/getPeriodStart.ts b/packages/bot/src/core/blitzkit/getPeriodStart.ts similarity index 70% rename from packages/website/src/core/blitzkit/getPeriodStart.ts rename to packages/bot/src/core/blitzkit/getPeriodStart.ts index b60c19307..be8700df0 100644 --- a/packages/website/src/core/blitzkit/getPeriodStart.ts +++ b/packages/bot/src/core/blitzkit/getPeriodStart.ts @@ -1,6 +1,6 @@ -import { Region } from '../../constants/regions'; +import { Region } from '@blitzkit/core'; +import getTimeDaysAgo from '../../../../website/src/core/blitzkit/getTimeDaysAgo'; import { PeriodSize } from '../discord/addPeriodSubCommands'; -import getTimeDaysAgo from './getTimeDaysAgo'; export default function getPeriodStart(region: Region, period: PeriodSize) { if (period === 'career') return 0; diff --git a/packages/website/src/core/blitzkit/jsxToPng.ts b/packages/bot/src/core/blitzkit/jsxToPng.ts similarity index 100% rename from packages/website/src/core/blitzkit/jsxToPng.ts rename to packages/bot/src/core/blitzkit/jsxToPng.ts diff --git a/packages/website/src/core/blitzkit/jsxToPngThreaded.ts b/packages/bot/src/core/blitzkit/jsxToPngThreaded.ts similarity index 76% rename from packages/website/src/core/blitzkit/jsxToPngThreaded.ts rename to packages/bot/src/core/blitzkit/jsxToPngThreaded.ts index 0e8b08991..c3f8466c4 100644 --- a/packages/website/src/core/blitzkit/jsxToPngThreaded.ts +++ b/packages/bot/src/core/blitzkit/jsxToPngThreaded.ts @@ -1,5 +1,5 @@ +import { RenderConfiguration } from '../../../../website/src/core/blitzkit/renderConfiguration'; import jsxToSvg from './jsxToSvg'; -import { RenderConfiguration } from './renderConfiguration'; import { svgToPngThreaded } from './svgToPngThreaded'; export default async function jsxToPngThreaded( diff --git a/packages/website/src/core/blitzkit/jsxToSvg/Roboto-Black.ttf b/packages/bot/src/core/blitzkit/jsxToSvg/Roboto-Black.ttf similarity index 100% rename from packages/website/src/core/blitzkit/jsxToSvg/Roboto-Black.ttf rename to packages/bot/src/core/blitzkit/jsxToSvg/Roboto-Black.ttf diff --git a/packages/website/src/core/blitzkit/jsxToSvg/Roboto-Bold.ttf b/packages/bot/src/core/blitzkit/jsxToSvg/Roboto-Bold.ttf similarity index 100% rename from packages/website/src/core/blitzkit/jsxToSvg/Roboto-Bold.ttf rename to packages/bot/src/core/blitzkit/jsxToSvg/Roboto-Bold.ttf diff --git a/packages/website/src/core/blitzkit/jsxToSvg/Roboto.ttf b/packages/bot/src/core/blitzkit/jsxToSvg/Roboto.ttf similarity index 100% rename from packages/website/src/core/blitzkit/jsxToSvg/Roboto.ttf rename to packages/bot/src/core/blitzkit/jsxToSvg/Roboto.ttf diff --git a/packages/website/src/core/blitzkit/jsxToSvg/index.ts b/packages/bot/src/core/blitzkit/jsxToSvg/index.ts similarity index 88% rename from packages/website/src/core/blitzkit/jsxToSvg/index.ts rename to packages/bot/src/core/blitzkit/jsxToSvg/index.ts index a084517f6..6a67055cd 100644 --- a/packages/website/src/core/blitzkit/jsxToSvg/index.ts +++ b/packages/bot/src/core/blitzkit/jsxToSvg/index.ts @@ -1,6 +1,6 @@ import { readFile } from 'fs/promises'; import satori from 'satori'; -import { RenderConfiguration } from '../renderConfiguration'; +import { RenderConfiguration } from '../../../../../website/src/core/blitzkit/renderConfiguration'; import robotoBlack from './Roboto-Black.ttf'; import robotoBold from './Roboto-Bold.ttf'; import roboto from './Roboto.ttf'; diff --git a/packages/website/src/core/blitzkit/svgToPng.ts b/packages/bot/src/core/blitzkit/svgToPng.ts similarity index 100% rename from packages/website/src/core/blitzkit/svgToPng.ts rename to packages/bot/src/core/blitzkit/svgToPng.ts diff --git a/packages/website/src/core/blitzkit/svgToPngThreaded.ts b/packages/bot/src/core/blitzkit/svgToPngThreaded.ts similarity index 100% rename from packages/website/src/core/blitzkit/svgToPngThreaded.ts rename to packages/bot/src/core/blitzkit/svgToPngThreaded.ts diff --git a/packages/bot/src/core/blitzstars/getStatsInPeriod.ts b/packages/bot/src/core/blitzstars/getStatsInPeriod.ts index a718705bf..3c6a9a55e 100644 --- a/packages/bot/src/core/blitzstars/getStatsInPeriod.ts +++ b/packages/bot/src/core/blitzstars/getStatsInPeriod.ts @@ -1,11 +1,9 @@ +import { BlitzStats, emptyAllStats, Region } from '@blitzkit/core'; import { Locale } from 'discord.js'; -import { Region } from '../../../../../src/constants/regions'; import getTankHistories, { TankHistories, TankHistoryRaw, -} from '../../../../../src/core/blitzkit/getTankHistories'; -import { BlitzStats } from '../../../../../src/core/statistics/compositeStats/constants'; -import { emptyAllStats } from './constants'; +} from './getTankHistories'; const emptyTankHistoryNode: TankHistoryRaw = { account_id: 0, @@ -106,5 +104,3 @@ export default async function getStatsInPeriod( return { diff, order } satisfies DiffedTankStats; } - -export * from './constants'; diff --git a/packages/website/src/core/blitzkit/getTankHistories.ts b/packages/bot/src/core/blitzstars/getTankHistories.ts similarity index 93% rename from packages/website/src/core/blitzkit/getTankHistories.ts rename to packages/bot/src/core/blitzstars/getTankHistories.ts index 9624d8319..1d532e109 100644 --- a/packages/website/src/core/blitzkit/getTankHistories.ts +++ b/packages/bot/src/core/blitzstars/getTankHistories.ts @@ -1,12 +1,13 @@ -import { emptyAllStats } from '@blitzkit/core/src/blitzstars/getStatsInPeriod/constants'; -import { Region } from '../../constants/regions'; +import { Region, emptyAllStats } from '@blitzkit/core'; +import { Locale } from 'discord.js'; +import getTankStats from '../../../../website/src/core/blitz/getTankStats'; +import { UserError } from '../../../../website/src/hooks/userError'; import { GetHistoriesOptions, Histories, History, getHistoriesDefaultOptions, } from '../../types/histories'; -import getTankStats from '../blitz/getTankStats'; import { translator } from '../localization/translator'; export interface TankHistory extends History { diff --git a/packages/website/src/core/discord/addClanChoices.ts b/packages/bot/src/core/discord/addClanChoices.ts similarity index 100% rename from packages/website/src/core/discord/addClanChoices.ts rename to packages/bot/src/core/discord/addClanChoices.ts diff --git a/packages/website/src/core/discord/addFilterOptions.ts b/packages/bot/src/core/discord/addFilterOptions.ts similarity index 91% rename from packages/website/src/core/discord/addFilterOptions.ts rename to packages/bot/src/core/discord/addFilterOptions.ts index 3c874f7e5..377378f3b 100644 --- a/packages/website/src/core/discord/addFilterOptions.ts +++ b/packages/bot/src/core/discord/addFilterOptions.ts @@ -1,13 +1,11 @@ +import { TANK_CLASSES, TREE_TYPES } from '@blitzkit/core'; import { APIApplicationCommandOptionChoice, Locale, SlashCommandBuilder, SlashCommandSubcommandBuilder, } from 'discord.js'; -import { - TANK_CLASSES, - TREE_TYPES, -} from '../../components/Tanks/components/Item/constants'; +import {} from '../../components/Tanks/components/Item/constants'; import { translator } from '../localization/translator'; import addTankChoices from './addTankChoices'; import addTierChoices from './addTierChoices'; @@ -41,7 +39,7 @@ export function addFilterOptions< name_localizations: localizationObject( `common.nations.${nation}`, ), - }) satisfies APIApplicationCommandOptionChoice, + } satisfies APIApplicationCommandOptionChoice), ), ) .setRequired(false), @@ -70,7 +68,7 @@ export function addFilterOptions< name_localizations: localizationObject( `common.tank_class_short.${tankType}`, ), - }) satisfies APIApplicationCommandOptionChoice, + } satisfies APIApplicationCommandOptionChoice), ), ) .setRequired(false), @@ -98,7 +96,7 @@ export function addFilterOptions< name_localizations: localizationObject( `common.tree_type.${treeType}`, ), - }) satisfies APIApplicationCommandOptionChoice, + } satisfies APIApplicationCommandOptionChoice), ), ) .setRequired(false), diff --git a/packages/website/src/core/discord/addPeriodSubCommands.ts b/packages/bot/src/core/discord/addPeriodSubCommands.ts similarity index 100% rename from packages/website/src/core/discord/addPeriodSubCommands.ts rename to packages/bot/src/core/discord/addPeriodSubCommands.ts diff --git a/packages/website/src/core/discord/addPeriodicFilterOptions.ts b/packages/bot/src/core/discord/addPeriodicFilterOptions.ts similarity index 100% rename from packages/website/src/core/discord/addPeriodicFilterOptions.ts rename to packages/bot/src/core/discord/addPeriodicFilterOptions.ts diff --git a/packages/website/src/core/discord/addRegionChoices.ts b/packages/bot/src/core/discord/addRegionChoices.ts similarity index 89% rename from packages/website/src/core/discord/addRegionChoices.ts rename to packages/bot/src/core/discord/addRegionChoices.ts index 9e53ca323..7b1e2afa2 100644 --- a/packages/website/src/core/discord/addRegionChoices.ts +++ b/packages/bot/src/core/discord/addRegionChoices.ts @@ -1,9 +1,9 @@ +import { REGIONS } from '@blitzkit/core'; import { APIApplicationCommandOptionChoice, Locale, SlashCommandStringOption, } from 'discord.js'; -import { REGIONS } from '../../constants/regions'; import { translator } from '../localization/translator'; import { localizationObject } from './localizationObject'; @@ -26,7 +26,7 @@ export default function addRegionChoices(option: SlashCommandStringOption) { name_localizations: localizationObject( `common.regions.normal.${region}`, ), - }) satisfies APIApplicationCommandOptionChoice, + } satisfies APIApplicationCommandOptionChoice), ), ) .setRequired(true); diff --git a/packages/website/src/core/discord/addTankChoices.ts b/packages/bot/src/core/discord/addTankChoices.ts similarity index 100% rename from packages/website/src/core/discord/addTankChoices.ts rename to packages/bot/src/core/discord/addTankChoices.ts diff --git a/packages/website/src/core/discord/addTierChoices.ts b/packages/bot/src/core/discord/addTierChoices.ts similarity index 100% rename from packages/website/src/core/discord/addTierChoices.ts rename to packages/bot/src/core/discord/addTierChoices.ts diff --git a/packages/website/src/core/discord/addUsernameChoices.ts b/packages/bot/src/core/discord/addUsernameChoices.ts similarity index 100% rename from packages/website/src/core/discord/addUsernameChoices.ts rename to packages/bot/src/core/discord/addUsernameChoices.ts diff --git a/packages/website/src/core/discord/autocompleteClan/constants.ts b/packages/bot/src/core/discord/autocompleteClan/constants.ts similarity index 100% rename from packages/website/src/core/discord/autocompleteClan/constants.ts rename to packages/bot/src/core/discord/autocompleteClan/constants.ts diff --git a/packages/website/src/core/discord/autocompleteClan/index.ts b/packages/bot/src/core/discord/autocompleteClan/index.ts similarity index 93% rename from packages/website/src/core/discord/autocompleteClan/index.ts rename to packages/bot/src/core/discord/autocompleteClan/index.ts index ea317791b..24d99d4cf 100644 --- a/packages/website/src/core/discord/autocompleteClan/index.ts +++ b/packages/bot/src/core/discord/autocompleteClan/index.ts @@ -3,7 +3,7 @@ import { AutocompleteInteraction, CacheType, } from 'discord.js'; -import searchClansAcrossRegions from '../../blitz/searchClansAcrossRegions'; +import searchClansAcrossRegions from '../../../../../website/src/core/blitz/searchClansAcrossRegions'; import { translator } from '../../localization/translator'; import { DISCORD_CHOICES_MAX_NAME_SIZE, OVERFLOW_SUFFIX } from './constants'; diff --git a/packages/website/src/core/discord/autocompleteTanks.ts b/packages/bot/src/core/discord/autocompleteTanks.ts similarity index 96% rename from packages/website/src/core/discord/autocompleteTanks.ts rename to packages/bot/src/core/discord/autocompleteTanks.ts index 39e2fd27e..1f09ebb55 100644 --- a/packages/website/src/core/discord/autocompleteTanks.ts +++ b/packages/bot/src/core/discord/autocompleteTanks.ts @@ -4,11 +4,11 @@ import { CacheType, } from 'discord.js'; import { go } from 'fuzzysort'; -import { tankNames } from '../blitzkit/tankDefinitions/tankNames'; import { DISCORD_CHOICES_MAX_NAME_SIZE, OVERFLOW_SUFFIX, } from './autocompleteClan/constants'; +import { tankNames } from '@blitzkit/core'; export const tankNamesTechTreeOnly = tankNames.then((names) => names.filter((tank) => tank.treeType === 'researchable'), diff --git a/packages/website/src/core/discord/autocompleteUsername.ts b/packages/bot/src/core/discord/autocompleteUsername.ts similarity index 93% rename from packages/website/src/core/discord/autocompleteUsername.ts rename to packages/bot/src/core/discord/autocompleteUsername.ts index 7f459d1fd..4a8871157 100644 --- a/packages/website/src/core/discord/autocompleteUsername.ts +++ b/packages/bot/src/core/discord/autocompleteUsername.ts @@ -3,7 +3,7 @@ import { AutocompleteInteraction, CacheType, } from 'discord.js'; -import searchPlayersAcrossRegions from '../blitz/searchPlayersAcrossRegions'; +import searchPlayersAcrossRegions from '../../../../website/src/core/blitz/searchPlayersAcrossRegions'; import { translator } from '../localization/translator'; import { DISCORD_CHOICES_MAX_NAME_SIZE, diff --git a/packages/website/src/core/discord/buttonLink.ts b/packages/bot/src/core/discord/buttonLink.ts similarity index 100% rename from packages/website/src/core/discord/buttonLink.ts rename to packages/bot/src/core/discord/buttonLink.ts diff --git a/packages/website/src/core/discord/buttonPrimary.ts b/packages/bot/src/core/discord/buttonPrimary.ts similarity index 100% rename from packages/website/src/core/discord/buttonPrimary.ts rename to packages/bot/src/core/discord/buttonPrimary.ts diff --git a/packages/website/src/core/discord/buttonRefresh.ts b/packages/bot/src/core/discord/buttonRefresh.ts similarity index 100% rename from packages/website/src/core/discord/buttonRefresh.ts rename to packages/bot/src/core/discord/buttonRefresh.ts diff --git a/packages/website/src/core/discord/client.ts b/packages/bot/src/core/discord/client.ts similarity index 100% rename from packages/website/src/core/discord/client.ts rename to packages/bot/src/core/discord/client.ts diff --git a/packages/website/src/core/discord/commandToURL.ts b/packages/bot/src/core/discord/commandToURL.ts similarity index 100% rename from packages/website/src/core/discord/commandToURL.ts rename to packages/bot/src/core/discord/commandToURL.ts diff --git a/packages/website/src/core/discord/createLocalizedCommand.ts b/packages/bot/src/core/discord/createLocalizedCommand.ts similarity index 100% rename from packages/website/src/core/discord/createLocalizedCommand.ts rename to packages/bot/src/core/discord/createLocalizedCommand.ts diff --git a/packages/website/src/core/discord/embedInfo.ts b/packages/bot/src/core/discord/embedInfo.ts similarity index 83% rename from packages/website/src/core/discord/embedInfo.ts rename to packages/bot/src/core/discord/embedInfo.ts index 75ac86c80..78cf9dd32 100644 --- a/packages/website/src/core/discord/embedInfo.ts +++ b/packages/bot/src/core/discord/embedInfo.ts @@ -1,5 +1,5 @@ import { EmbedBuilder } from 'discord.js'; -import { ACCENT_COLOR } from '../../constants/colors'; +import { ACCENT_COLOR } from './colors'; export default function embedInfo(title: string, description: string) { const embed = new EmbedBuilder() diff --git a/packages/website/src/core/discord/embedNegative.ts b/packages/bot/src/core/discord/embedNegative.ts similarity index 80% rename from packages/website/src/core/discord/embedNegative.ts rename to packages/bot/src/core/discord/embedNegative.ts index 35704b20e..ca2511631 100644 --- a/packages/website/src/core/discord/embedNegative.ts +++ b/packages/bot/src/core/discord/embedNegative.ts @@ -1,5 +1,5 @@ import { EmbedBuilder } from 'discord.js'; -import { NEGATIVE_COLOR } from '../../constants/colors'; +import { NEGATIVE_COLOR } from './colors'; export default function embedNegative(title: string, description: string) { return new EmbedBuilder() diff --git a/packages/website/src/core/discord/embedPositive.ts b/packages/bot/src/core/discord/embedPositive.ts similarity index 80% rename from packages/website/src/core/discord/embedPositive.ts rename to packages/bot/src/core/discord/embedPositive.ts index 47174a0d1..45b2b99e1 100644 --- a/packages/website/src/core/discord/embedPositive.ts +++ b/packages/bot/src/core/discord/embedPositive.ts @@ -1,5 +1,5 @@ import { EmbedBuilder } from 'discord.js'; -import { POSITIVE_COLOR } from '../../constants/colors'; +import { POSITIVE_COLOR } from './colors'; export default function embedPositive(title: string, description: string) { return new EmbedBuilder() diff --git a/packages/website/src/core/discord/embedWarning.ts b/packages/bot/src/core/discord/embedWarning.ts similarity index 80% rename from packages/website/src/core/discord/embedWarning.ts rename to packages/bot/src/core/discord/embedWarning.ts index 3148f7a7a..26550232a 100644 --- a/packages/website/src/core/discord/embedWarning.ts +++ b/packages/bot/src/core/discord/embedWarning.ts @@ -1,5 +1,5 @@ import { EmbedBuilder } from 'discord.js'; -import { WARNING_COLOR } from '../../constants/colors'; +import { WARNING_COLOR } from './colors'; export default function embedWarning(title: string, description: string) { return new EmbedBuilder() diff --git a/packages/website/src/core/discord/getCustomPeriodParams.ts b/packages/bot/src/core/discord/getCustomPeriodParams.ts similarity index 100% rename from packages/website/src/core/discord/getCustomPeriodParams.ts rename to packages/bot/src/core/discord/getCustomPeriodParams.ts diff --git a/packages/website/src/core/discord/getFiltersFromButton.ts b/packages/bot/src/core/discord/getFiltersFromButton.ts similarity index 84% rename from packages/website/src/core/discord/getFiltersFromButton.ts rename to packages/bot/src/core/discord/getFiltersFromButton.ts index 3ad62a16c..4aa8f1716 100644 --- a/packages/website/src/core/discord/getFiltersFromButton.ts +++ b/packages/bot/src/core/discord/getFiltersFromButton.ts @@ -1,6 +1,5 @@ +import { StatFilters, TreeType } from '@blitzkit/core'; import { ButtonInteraction } from 'discord.js'; -import { TreeType } from '../../components/Tanks'; -import { StatFilters } from '../statistics/filterStats'; export function getFiltersFromButton(interaction: ButtonInteraction) { const url = new URL(`https://example.com/${interaction.customId}`); diff --git a/packages/website/src/core/discord/getFiltersFromCommand.ts b/packages/bot/src/core/discord/getFiltersFromCommand.ts similarity index 81% rename from packages/website/src/core/discord/getFiltersFromCommand.ts rename to packages/bot/src/core/discord/getFiltersFromCommand.ts index 0ebf09157..8fc8fd712 100644 --- a/packages/website/src/core/discord/getFiltersFromCommand.ts +++ b/packages/bot/src/core/discord/getFiltersFromCommand.ts @@ -1,7 +1,6 @@ +import { StatFilters, TreeType } from '@blitzkit/core'; import { ChatInputCommandInteraction } from 'discord.js'; -import { TreeType } from '../../components/Tanks'; -import resolveTankId from '../blitz/resolveTankId'; -import { StatFilters } from '../statistics/filterStats'; +import resolveTankId from '../../../../website/src/core/blitz/resolveTankId'; export async function getFiltersFromCommand( interaction: ChatInputCommandInteraction, diff --git a/packages/website/src/core/discord/getPeriodOptionName.ts b/packages/bot/src/core/discord/getPeriodOptionName.ts similarity index 100% rename from packages/website/src/core/discord/getPeriodOptionName.ts rename to packages/bot/src/core/discord/getPeriodOptionName.ts diff --git a/packages/website/src/core/discord/localizationObject.ts b/packages/bot/src/core/discord/localizationObject.ts similarity index 100% rename from packages/website/src/core/discord/localizationObject.ts rename to packages/bot/src/core/discord/localizationObject.ts diff --git a/packages/website/src/core/discord/manager.ts b/packages/bot/src/core/discord/manager.ts similarity index 68% rename from packages/website/src/core/discord/manager.ts rename to packages/bot/src/core/discord/manager.ts index 56e536c5a..280d1d67d 100644 --- a/packages/website/src/core/discord/manager.ts +++ b/packages/bot/src/core/discord/manager.ts @@ -1,5 +1,5 @@ +import { assertSecret } from '@blitzkit/core'; import { ShardingManager } from 'discord.js'; -import { assertSecret } from '../../../packages/core/src/blitzkit/assertSecret'; export const manager = new ShardingManager('dist/bot/workers/bot.js', { token: assertSecret(process.env.DISCORD_TOKEN), diff --git a/packages/website/src/core/discord/markdownTable.ts b/packages/bot/src/core/discord/markdownTable.ts similarity index 100% rename from packages/website/src/core/discord/markdownTable.ts rename to packages/bot/src/core/discord/markdownTable.ts diff --git a/packages/website/src/core/discord/normalizeInteractionReturnable.ts b/packages/bot/src/core/discord/normalizeInteractionReturnable.ts similarity index 95% rename from packages/website/src/core/discord/normalizeInteractionReturnable.ts rename to packages/bot/src/core/discord/normalizeInteractionReturnable.ts index a6532f2e6..24b692086 100644 --- a/packages/website/src/core/discord/normalizeInteractionReturnable.ts +++ b/packages/bot/src/core/discord/normalizeInteractionReturnable.ts @@ -7,10 +7,10 @@ import { InteractionReplyOptions, MessageEditOptions, } from 'discord.js'; +import { RenderConfiguration } from '../../../../website/src/core/blitzkit/renderConfiguration'; import { InteractionReturnable } from '../../events/interactionCreate'; import { Writeable } from '../../types/writable'; import jsxToPngThreaded from '../blitzkit/jsxToPngThreaded'; -import { RenderConfiguration } from '../blitzkit/renderConfiguration'; export default async function normalizeInteractionReturnable( returnable: InteractionReturnable, diff --git a/packages/website/src/core/discord/psa.ts b/packages/bot/src/core/discord/psa.ts similarity index 100% rename from packages/website/src/core/discord/psa.ts rename to packages/bot/src/core/discord/psa.ts diff --git a/packages/website/src/core/discord/resolveClanFromCommand.ts b/packages/bot/src/core/discord/resolveClanFromCommand.ts similarity index 81% rename from packages/website/src/core/discord/resolveClanFromCommand.ts rename to packages/bot/src/core/discord/resolveClanFromCommand.ts index 5b062736b..6c6ee0cf3 100644 --- a/packages/website/src/core/discord/resolveClanFromCommand.ts +++ b/packages/bot/src/core/discord/resolveClanFromCommand.ts @@ -1,8 +1,8 @@ +import { Region } from '@blitzkit/core'; import { ChatInputCommandInteraction } from 'discord.js'; import markdownEscape from 'markdown-escape'; -import { Region } from '../../constants/regions'; -import { UserError } from '../../hooks/userError'; -import searchClansAcrossRegions from '../blitz/searchClansAcrossRegions'; +import searchClansAcrossRegions from '../../../../website/src/core/blitz/searchClansAcrossRegions'; +import { UserError } from '../../../../website/src/hooks/userError'; import { translator } from '../localization/translator'; import { serverAndIdPattern } from './resolvePlayerFromCommand/constants'; diff --git a/packages/website/src/core/discord/resolvePeriodFromButton.ts b/packages/bot/src/core/discord/resolvePeriodFromButton.ts similarity index 91% rename from packages/website/src/core/discord/resolvePeriodFromButton.ts rename to packages/bot/src/core/discord/resolvePeriodFromButton.ts index d0bebfb6e..caddb5527 100644 --- a/packages/website/src/core/discord/resolvePeriodFromButton.ts +++ b/packages/bot/src/core/discord/resolvePeriodFromButton.ts @@ -1,8 +1,8 @@ +import { Region } from '@blitzkit/core'; import { ButtonInteraction } from 'discord.js'; -import { Region } from '../../constants/regions'; +import getTimeDaysAgo from '../../../../website/src/core/blitzkit/getTimeDaysAgo'; import getPeriodNow from '../blitzkit/getPeriodNow'; import getPeriodStart from '../blitzkit/getPeriodStart'; -import getTimeDaysAgo from '../blitzkit/getTimeDaysAgo'; import { PeriodType } from './addPeriodSubCommands'; import { getPeriodOptionName } from './getPeriodOptionName'; import { ResolvedPeriod } from './resolvePeriodFromCommand'; diff --git a/packages/website/src/core/discord/resolvePeriodFromCommand.ts b/packages/bot/src/core/discord/resolvePeriodFromCommand.ts similarity index 92% rename from packages/website/src/core/discord/resolvePeriodFromCommand.ts rename to packages/bot/src/core/discord/resolvePeriodFromCommand.ts index c4084dd74..bb721ce31 100644 --- a/packages/website/src/core/discord/resolvePeriodFromCommand.ts +++ b/packages/bot/src/core/discord/resolvePeriodFromCommand.ts @@ -1,8 +1,8 @@ +import { Region } from '@blitzkit/core'; import { CacheType, ChatInputCommandInteraction } from 'discord.js'; -import { Region } from '../../constants/regions'; +import getTimeDaysAgo from '../../../../website/src/core/blitzkit/getTimeDaysAgo'; import getPeriodNow from '../blitzkit/getPeriodNow'; import getPeriodStart from '../blitzkit/getPeriodStart'; -import getTimeDaysAgo from '../blitzkit/getTimeDaysAgo'; import { translator } from '../localization/translator'; import { PeriodType } from './addPeriodSubCommands'; import { getPeriodOptionName } from './getPeriodOptionName'; diff --git a/packages/website/src/core/discord/resolvePlayerFromButton.ts b/packages/bot/src/core/discord/resolvePlayerFromButton.ts similarity index 89% rename from packages/website/src/core/discord/resolvePlayerFromButton.ts rename to packages/bot/src/core/discord/resolvePlayerFromButton.ts index 8d5a5a4b1..9e165e13b 100644 --- a/packages/website/src/core/discord/resolvePlayerFromButton.ts +++ b/packages/bot/src/core/discord/resolvePlayerFromButton.ts @@ -1,5 +1,5 @@ +import { Region } from '@blitzkit/core'; import { ButtonInteraction } from 'discord.js'; -import { Region } from '../../constants/regions'; import { ResolvedPlayer } from './resolvePlayerFromCommand'; export default async function resolvePlayerFromButton( diff --git a/packages/website/src/core/discord/resolvePlayerFromCommand/constants.ts b/packages/bot/src/core/discord/resolvePlayerFromCommand/constants.ts similarity index 100% rename from packages/website/src/core/discord/resolvePlayerFromCommand/constants.ts rename to packages/bot/src/core/discord/resolvePlayerFromCommand/constants.ts diff --git a/packages/website/src/core/discord/resolvePlayerFromCommand/index.ts b/packages/bot/src/core/discord/resolvePlayerFromCommand/index.ts similarity index 87% rename from packages/website/src/core/discord/resolvePlayerFromCommand/index.ts rename to packages/bot/src/core/discord/resolvePlayerFromCommand/index.ts index 351d5edad..c61a1a03f 100644 --- a/packages/website/src/core/discord/resolvePlayerFromCommand/index.ts +++ b/packages/bot/src/core/discord/resolvePlayerFromCommand/index.ts @@ -1,8 +1,8 @@ +import { Region } from '@blitzkit/core'; import { CacheType, ChatInputCommandInteraction } from 'discord.js'; import markdownEscape from 'markdown-escape'; -import { Region } from '../../../constants/regions'; -import { UserError } from '../../../hooks/userError'; -import searchPlayersAcrossRegions from '../../blitz/searchPlayersAcrossRegions'; +import searchPlayersAcrossRegions from '../../../../../website/src/core/blitz/searchPlayersAcrossRegions'; +import { UserError } from '../../../../../website/src/hooks/userError'; import { getBlitzFromDiscord } from '../../blitzkit/getBlitzFromDiscord'; import { translator } from '../../localization/translator'; import { serverAndIdPattern } from './constants'; diff --git a/packages/website/src/core/localization/strings/constants.ts b/packages/bot/src/core/localization/strings/constants.ts similarity index 68% rename from packages/website/src/core/localization/strings/constants.ts rename to packages/bot/src/core/localization/strings/constants.ts index 5b849f363..d3e372cf3 100644 --- a/packages/website/src/core/localization/strings/constants.ts +++ b/packages/bot/src/core/localization/strings/constants.ts @@ -1 +1,3 @@ +import { Locale } from 'discord.js'; + export const SUPPORTED_LOCALES: Locale[] = [Locale.EnglishUS, Locale.SpanishES]; diff --git a/packages/website/src/core/localization/strings/index.ts b/packages/bot/src/core/localization/strings/index.ts similarity index 92% rename from packages/website/src/core/localization/strings/index.ts rename to packages/bot/src/core/localization/strings/index.ts index 12d16255a..b2c679268 100644 --- a/packages/website/src/core/localization/strings/index.ts +++ b/packages/bot/src/core/localization/strings/index.ts @@ -1,3 +1,4 @@ +import { Locale } from 'discord.js'; import { SUPPORTED_LOCALES } from './constants'; export type TranslationFragmentTree = { diff --git a/packages/website/src/core/localization/translator.ts b/packages/bot/src/core/localization/translator.ts similarity index 100% rename from packages/website/src/core/localization/translator.ts rename to packages/bot/src/core/localization/translator.ts diff --git a/packages/bot/src/events/interactionCreate/handlers/chatInputCommand.ts b/packages/bot/src/events/interactionCreate/handlers/chatInputCommand.ts index 807861844..6a0ab7e55 100644 --- a/packages/bot/src/events/interactionCreate/handlers/chatInputCommand.ts +++ b/packages/bot/src/events/interactionCreate/handlers/chatInputCommand.ts @@ -8,12 +8,12 @@ import { InteractionReplyOptions, } from 'discord.js'; import { InteractionRawReturnable, commands } from '..'; +import { UserError } from '../../../../../website/src/hooks/userError'; import buttonLink from '../../../core/discord/buttonLink'; import embedWarning from '../../../core/discord/embedWarning'; import normalizeInteractionReturnable from '../../../core/discord/normalizeInteractionReturnable'; import { psa } from '../../../core/discord/psa'; import { translator } from '../../../core/localization/translator'; -import { UserError } from '../../../hooks/userError'; import { Writeable } from '../../../types/writable'; export default async function handleChatInputCommand( diff --git a/packages/bot/src/events/interactionCreate/index.ts b/packages/bot/src/events/interactionCreate/index.ts index 3e408070b..36ddb2147 100644 --- a/packages/bot/src/events/interactionCreate/index.ts +++ b/packages/bot/src/events/interactionCreate/index.ts @@ -1,3 +1,4 @@ +import { assertSecret } from '@blitzkit/core'; import { AttachmentBuilder, AutocompleteInteraction, @@ -13,7 +14,7 @@ import { SlashCommandOptionsOnlyBuilder, SlashCommandSubcommandsOnlyBuilder, } from 'discord.js'; -import { assertSecret } from '../../../packages/core/src/blitzkit/assertSecret'; +import { RenderConfiguration } from '../../../../website/src/core/blitzkit/renderConfiguration'; import { aboutCommand } from '../../commands/about'; import { breakdownCommand } from '../../commands/breakdown'; import { debugCommand } from '../../commands/debug'; @@ -33,7 +34,6 @@ import { searchClansCommand } from '../../commands/searchClans'; import { searchPlayersCommand } from '../../commands/searchPlayers'; import { statsCommand } from '../../commands/stats'; import { todayCommand } from '../../commands/today'; -import { RenderConfiguration } from '../../core/blitzkit/renderConfiguration'; import handleAutocomplete from './handlers/autocomplete'; import handleButton from './handlers/button'; import handleChatInputCommand from './handlers/chatInputCommand'; diff --git a/packages/bot/src/types/histories.ts b/packages/bot/src/types/histories.ts index 47309fae3..322d807a6 100644 --- a/packages/bot/src/types/histories.ts +++ b/packages/bot/src/types/histories.ts @@ -1,6 +1,6 @@ // a cleaner simplification of Blitz Stars' histories because it's a mess there -import { BlitzStats } from '../core/statistics/compositeStats/constants'; +import { BlitzStats } from '@blitzkit/core'; export interface History { all: BlitzStats; diff --git a/packages/bot/src/workers/bot.ts b/packages/bot/src/workers/bot.ts index 8225a4274..b139eb403 100644 --- a/packages/bot/src/workers/bot.ts +++ b/packages/bot/src/workers/bot.ts @@ -1,5 +1,5 @@ -import { assertSecret } from '../../packages/core/src/blitzkit/assertSecret'; -import { registerProcesses } from '../core/blitzkit/processes'; +import { assertSecret } from '@blitzkit/core'; +import { registerProcesses } from '../../../website/src/core/blitzkit/processes'; import { client } from '../core/discord/client'; console.log(`🟡 Launching bot ${client.shard?.ids[0]}`); diff --git a/packages/bot/tsconfig.json b/packages/bot/tsconfig.json new file mode 100644 index 000000000..4082f16a5 --- /dev/null +++ b/packages/bot/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../../tsconfig.json" +} diff --git a/packages/core/package.json b/packages/core/package.json index 42cc72333..daea6d2c4 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -10,8 +10,12 @@ "@octokit/plugin-throttling": "^8.2.0", "protobufjs": "^7.4.0", "lz4js": "^0.2.0", + "yaml": "^2.5.0", + "sharp": "^0.33.5", + "dotenv": "^16.4.5", "pickleparser": "^0.2.1", - "adm-zip": "^0.5.16" + "adm-zip": "^0.5.16", + "crc": "^4.3.2" }, "devDependencies": { "@types/adm-zip": "^0.5.5", diff --git a/packages/core/src/blitz/constants.ts b/packages/core/src/blitz/constants.ts index 3132c6263..2df9f341c 100644 --- a/packages/core/src/blitz/constants.ts +++ b/packages/core/src/blitz/constants.ts @@ -1,3 +1,5 @@ +import { BlitzStats } from '../statistics'; + export const TREE_TYPES = ['researchable', 'premium', 'collector'] as const; export const TANK_CLASSES = [ diff --git a/packages/core/src/blitz/equipmentPrice.ts b/packages/core/src/blitz/equipmentPrice.ts index 2368671c5..beba36083 100644 --- a/packages/core/src/blitz/equipmentPrice.ts +++ b/packages/core/src/blitz/equipmentPrice.ts @@ -1,5 +1,5 @@ import { Vector3Tuple } from 'three'; -import { Tier } from '../core/blitzkit/tankDefinitions'; +import { Tier } from '../blitzkit'; export const equipmentPriceMatrix: Record = { 1: [100, 200, 300], diff --git a/packages/core/src/blitz/idToRegion.ts b/packages/core/src/blitz/idToRegion.ts index ddc7c788f..64f15d810 100644 --- a/packages/core/src/blitz/idToRegion.ts +++ b/packages/core/src/blitz/idToRegion.ts @@ -1,4 +1,4 @@ -import { Region } from '../../constants/regions'; +import { Region } from './regions'; export const MIN_REGION_IDS: Record = { asia: 20e8, diff --git a/packages/core/src/blitzkit/averageDefinitions/constants.ts b/packages/core/src/blitzkit/averageDefinitions/constants.ts index 36816d061..16b88f269 100644 --- a/packages/core/src/blitzkit/averageDefinitions/constants.ts +++ b/packages/core/src/blitzkit/averageDefinitions/constants.ts @@ -1,5 +1,6 @@ import { Samples } from '.'; import { emptyAllStats } from '../../blitz/constants'; +import { BlitzkitStats } from '../../statistics'; export const emptyAverageDefinitionsAllStats: BlitzkitStats = { ...emptyAllStats, diff --git a/packages/core/src/blitzkit/averageDefinitions/index.ts b/packages/core/src/blitzkit/averageDefinitions/index.ts index 9d65527ed..825d49570 100644 --- a/packages/core/src/blitzkit/averageDefinitions/index.ts +++ b/packages/core/src/blitzkit/averageDefinitions/index.ts @@ -1,5 +1,5 @@ -import { BlitzkitStats } from '../../../../../src/core/statistics/compositeStats/constants'; import { decodeProtobuf } from '../../protobuf/decodeProtobuf'; +import { BlitzkitStats } from '../../statistics'; import { asset } from '../asset'; export interface AverageDefinitionsEntry { diff --git a/packages/core/src/blitzkit/skillDefinitions.ts b/packages/core/src/blitzkit/skillDefinitions.ts index 89fe65c69..52454608f 100644 --- a/packages/core/src/blitzkit/skillDefinitions.ts +++ b/packages/core/src/blitzkit/skillDefinitions.ts @@ -1,6 +1,6 @@ import { asset } from '@blitzkit/core/src/blitzkit/asset'; import { fetchCdonLz4 } from '@blitzkit/core/src/blitzkit/fetchCdonLz4'; -import { TankClass } from '../../../../src/components/Tanks'; +import { TankClass } from './tankDefinitions'; export interface SkillDefinitions { classes: Record; diff --git a/packages/core/src/blitzkit/tankDefinitions/constants.ts b/packages/core/src/blitzkit/tankDefinitions/constants.ts index 2e5210c85..869a507bc 100644 --- a/packages/core/src/blitzkit/tankDefinitions/constants.ts +++ b/packages/core/src/blitzkit/tankDefinitions/constants.ts @@ -1,4 +1,4 @@ -import { CrewMember, GunDefinition, ShellType, Tier } from '.'; +import { CrewMember, GunDefinition, ShellType, TankClass, Tier } from '.'; export const SHELL_NAMES: Record = { ap: 'AP', diff --git a/packages/core/src/blitzkit/tankDefinitions/index.ts b/packages/core/src/blitzkit/tankDefinitions/index.ts index b2a11a12b..8cfcc6c5e 100644 --- a/packages/core/src/blitzkit/tankDefinitions/index.ts +++ b/packages/core/src/blitzkit/tankDefinitions/index.ts @@ -1,9 +1,12 @@ import { Vector2Tuple } from 'three'; -import { TankClass, TreeType } from '../../../components/Tanks'; +import { TANK_CLASSES, TREE_TYPES } from '../../blitz/constants'; import { asset } from '../asset'; import { fetchCdonLz4 } from '../fetchCdonLz4'; import { TIERS } from './constants'; +export type TankClass = (typeof TANK_CLASSES)[number]; +export type TreeType = (typeof TREE_TYPES)[number]; + export enum ShellType { AP = 'ap', APCR = 'ap_cr', diff --git a/packages/core/src/statistics/deltaBkrlBlitzStats.ts b/packages/core/src/statistics/deltaBkrlBlitzStats.ts index 670d31b9a..db82f8672 100644 --- a/packages/core/src/statistics/deltaBkrlBlitzStats.ts +++ b/packages/core/src/statistics/deltaBkrlBlitzStats.ts @@ -1,5 +1,5 @@ -import { RatingPlayer } from '../../commands/ratingLeaderboard'; -import { RatingStats } from '../blitz/getAccountInfo'; +import { RatingPlayer } from '../../../bot/src/commands/ratingLeaderboard'; +import { RatingStats } from '../../../website/src/core/blitz/getAccountInfo'; import { BkrlSuperset1Entry } from '../streams/bkrl'; export function deltaBkrlBlitzStats( diff --git a/packages/core/src/statistics/deltaTankStats.ts b/packages/core/src/statistics/deltaTankStats.ts index 30bd8d3a6..8f185e51a 100644 --- a/packages/core/src/statistics/deltaTankStats.ts +++ b/packages/core/src/statistics/deltaTankStats.ts @@ -1,3 +1,5 @@ +import { IndividualTankStats, emptyIndividualTankStats } from '../types'; + export function deltaTankStats( tanksA: IndividualTankStats[], tanksB: IndividualTankStats[], diff --git a/packages/core/src/statistics/filterStats.ts b/packages/core/src/statistics/filterStats.ts index f5f73a1c1..2a1b16da5 100644 --- a/packages/core/src/statistics/filterStats.ts +++ b/packages/core/src/statistics/filterStats.ts @@ -1,4 +1,7 @@ -import { tankDefinitions } from '../blitzkit/tankDefinitions'; +import { DiffedTankStats } from '../../../bot/src/core/blitzstars/getStatsInPeriod'; +import { SupplementaryStats } from '../../../website/src/core/blitz/getAccountInfo'; +import { tankAverages } from '../../../website/src/core/blitzstars/tankAverages'; +import { tankDefinitions, TreeType } from '../blitzkit/tankDefinitions'; import calculateWN8 from './calculateWN8'; import sumStats from './sumStats'; diff --git a/packages/core/src/statistics/getTierWeights.ts b/packages/core/src/statistics/getTierWeights.ts index e24b984df..138937f48 100644 --- a/packages/core/src/statistics/getTierWeights.ts +++ b/packages/core/src/statistics/getTierWeights.ts @@ -1,4 +1,4 @@ -import { TierWeightsRecord } from '../../components/TierWeights'; +import { TierWeightsRecord } from '../../../bot/src/components/TierWeights'; import { tankDefinitions } from '../blitzkit/tankDefinitions'; import { BlitzStats } from './compositeStats/constants'; diff --git a/packages/core/src/statistics/sumStats.ts b/packages/core/src/statistics/sumStats.ts index f95278794..45ef1b62a 100644 --- a/packages/core/src/statistics/sumStats.ts +++ b/packages/core/src/statistics/sumStats.ts @@ -1,3 +1,4 @@ +import { emptyAllStats } from '..'; import { BlitzStats } from './compositeStats/constants'; export default function sumStats(allStatsCollection: BlitzStats[]) { diff --git a/packages/core/src/streams/rts.ts b/packages/core/src/streams/rts.ts index e490bdc27..657ef046b 100644 --- a/packages/core/src/streams/rts.ts +++ b/packages/core/src/streams/rts.ts @@ -1,5 +1,5 @@ import { times } from 'lodash'; -import { IndividualTankStats } from '../../types/tanksStats'; +import { IndividualTankStats } from '..'; import { BlitzStats } from '../statistics/compositeStats/constants'; import { ReadStream, WriteStream } from './buffer'; diff --git a/packages/core/src/zustand/createNextSafeStore.tsx b/packages/core/src/zustand/createNextSafeStore.tsx index 0e0337487..8b0e79753 100644 --- a/packages/core/src/zustand/createNextSafeStore.tsx +++ b/packages/core/src/zustand/createNextSafeStore.tsx @@ -1,4 +1,3 @@ -// MIGRATION TODO: i added this use client, it makes stuff work again? 'use client'; import { Draft, produce } from 'immer'; diff --git a/packages/scripts/package.json b/packages/scripts/package.json index b7a161ddc..95115c625 100644 --- a/packages/scripts/package.json +++ b/packages/scripts/package.json @@ -3,10 +3,15 @@ "private": true, "type": "module", "dependencies": { + "progress": "^2.0.3", "@gltf-transform/core": "^3.10.1", - "lodash": "^4.17.21" + "decompress": "^4.2.1", + "googleapis": "^134.0.0", + "fast-xml-parser": "^4.4.1" }, "devDependencies": { + "@types/decompress": "^4.2.7", + "@types/progress": "^2.0.7", "@types/lodash": "^4.17.7" } } diff --git a/packages/scripts/src/applyPatches.ts b/packages/scripts/src/applyPatches.ts index 3d7ff6210..983ef99ea 100644 --- a/packages/scripts/src/applyPatches.ts +++ b/packages/scripts/src/applyPatches.ts @@ -1,13 +1,13 @@ +import { assertSecret } from '@blitzkit/core'; import { mkdir, writeFile } from 'fs/promises'; import { parse as parsePath } from 'path'; import ProgressBar from 'progress'; import { parse as parseYaml, stringify as stringifyYaml } from 'yaml'; +import { dvp } from '../../../submodules/blitzkit-closed/src/dvp'; +import { writeDVPL } from '../../website/src/core/blitz/writeDVPL'; import { readStringDVPL } from '../src/core/blitz/readStringDVPL'; -import { readYAMLDVPL } from '../src/core/blitz/readYAMLDVPL'; -import { writeDVPL } from '../src/core/blitz/writeDVPL'; -import { assertSecret } from '../src/core/blitzkit/secret'; -import { dvp } from '../submodules/blitzkit-closed/src/dvp'; import { DATA } from './buildAssets/constants'; +import { readYAMLDVPL } from './core/blitz/readYAMLDVPL'; const versionTextFile = await readStringDVPL(`${DATA}/version.txt.dvpl`); const currentVersion = versionTextFile @@ -21,7 +21,9 @@ console.log(`Installing patches for ${currentVersion}...`); let patchIndex = 1; while (true) { const response = await fetch( - `${assertSecret(process.env.WOTB_DLC_CDN)}/dlc/s${currentVersion}_${patchIndex}.yaml`, + `${assertSecret( + process.env.WOTB_DLC_CDN, + )}/dlc/s${currentVersion}_${patchIndex}.yaml`, ); if (response.status === 200) { @@ -32,7 +34,10 @@ while (true) { `${assertSecret(process.env.WOTB_DLC_CDN)}/dlc/${data.dx11}`, ).then((response) => response.arrayBuffer()); const dvpd = await fetch( - `${assertSecret(process.env.WOTB_DLC_CDN)}/dlc/${data.dx11.replace('.dvpm', '.dvpd')}`, + `${assertSecret(process.env.WOTB_DLC_CDN)}/dlc/${data.dx11.replace( + '.dvpm', + '.dvpd', + )}`, ).then((response) => response.arrayBuffer()); const files = await dvp(dvpm, dvpd); const bar = new ProgressBar( @@ -58,7 +63,9 @@ while (true) { console.log('Found dynamic content localizations; patching...'); const localizationsResponse = await fetch( - `${assertSecret(process.env.WOTB_DLC_CDN)}/dlc/${data.dynamicContentLocalizationsDir}/en.yaml`, + `${assertSecret(process.env.WOTB_DLC_CDN)}/dlc/${ + data.dynamicContentLocalizationsDir + }/en.yaml`, ); const newStrings = parseYaml(await localizationsResponse.text()); const oldStrings = await readYAMLDVPL>( diff --git a/packages/scripts/src/averages.ts b/packages/scripts/src/averages.ts index 7a7057a19..56a86ab6a 100644 --- a/packages/scripts/src/averages.ts +++ b/packages/scripts/src/averages.ts @@ -1,23 +1,22 @@ -import { chunk, times } from 'lodash'; -import { Region, REGIONS } from '../src/constants/regions'; -import { getAccountInfo } from '../src/core/blitz/getAccountInfo'; -import getTankStats from '../src/core/blitz/getTankStats'; -import { idToRegion } from '../src/core/blitz/idToRegion'; import { AverageDefinitions, AverageDefinitionsEntry, AverageDefinitionsEntrySubPartial, AverageDefinitionsManifest, + IndividualTankStats, + REGIONS, + Region, Samples, -} from '../src/core/blitzkit/averageDefinitions'; -import { averageDefinitionsAllStatsKeys, emptySamples, -} from '../src/core/blitzkit/averageDefinitions/constants'; -import { commitAssets } from '../src/core/blitzkit/commitAssets'; -import { fetchPreDiscoveredIds } from '../src/core/blitzkit/fetchPreDiscoveredIds'; -import { encodeToBase64 } from '../src/core/protobuf/encodeToBase64'; -import { IndividualTankStats } from '../src/types/tanksStats'; + encodeProtobufToBase64, + idToRegion, +} from '@blitzkit/core'; +import { chunk, times } from 'lodash'; +import { getAccountInfo } from '../../website/src/core/blitz/getAccountInfo'; +import getTankStats from '../../website/src/core/blitz/getTankStats'; +import { commitAssets } from './core/github/commitAssets'; +import { fetchPreDiscoveredIds } from './core/github/fetchPreDiscoveredIds'; interface DataPoint { x: number; @@ -130,7 +129,9 @@ times(THREADS, async () => { async function postWork() { console.log( - `Generating statistics based on ${samples.d_120.toLocaleString()} players (${samples.total.toLocaleString()} checked in total) and ${tankIds.length} tanks...`, + `Generating statistics based on ${samples.d_120.toLocaleString()} players (${samples.total.toLocaleString()} checked in total) and ${ + tankIds.length + } tanks...`, ); const averages: Record = {}; @@ -224,7 +225,7 @@ async function postWork() { commitAssets('averages', [ { path: `averages/${latest}.pb`, - content: await encodeToBase64( + content: await encodeProtobufToBase64( 'average_definitions', 'blitzkit.AverageDefinitions', averageDefinitions, diff --git a/packages/scripts/src/buildAssets/boosterIcons.ts b/packages/scripts/src/buildAssets/boosterIcons.ts index e2d0b7e5a..6302ce9f3 100644 --- a/packages/scripts/src/buildAssets/boosterIcons.ts +++ b/packages/scripts/src/buildAssets/boosterIcons.ts @@ -2,8 +2,8 @@ import { readdir } from 'fs/promises'; import sharp from 'sharp'; import { readDVPLFile } from '../../src/core/blitz/readDVPLFile'; import { readStringDVPL } from '../../src/core/blitz/readStringDVPL'; -import { commitAssets } from '../../src/core/blitzkit/commitAssets'; -import { FileChange } from '../../src/core/blitzkit/commitMultipleFiles'; +import { commitAssets } from '../core/github/commitAssets'; +import { FileChange } from '../core/github/commitMultipleFiles'; import { DATA } from './constants'; export async function boosterIcons() { diff --git a/packages/scripts/src/buildAssets/camouflageIcons.ts b/packages/scripts/src/buildAssets/camouflageIcons.ts index be7705a8b..ff8f0a1bc 100644 --- a/packages/scripts/src/buildAssets/camouflageIcons.ts +++ b/packages/scripts/src/buildAssets/camouflageIcons.ts @@ -1,6 +1,6 @@ import { readDVPLFile } from '../../src/core/blitz/readDVPLFile'; -import { commitAssets } from '../../src/core/blitzkit/commitAssets'; -import { FileChange } from '../../src/core/blitzkit/commitMultipleFiles'; +import { commitAssets } from '../core/github/commitAssets'; +import { FileChange } from '../core/github/commitMultipleFiles'; import { DATA } from './constants'; export async function camouflageIcons() { diff --git a/packages/scripts/src/buildAssets/consumableProvisionIcons.ts b/packages/scripts/src/buildAssets/consumableProvisionIcons.ts index 447612d14..e8276a7b3 100644 --- a/packages/scripts/src/buildAssets/consumableProvisionIcons.ts +++ b/packages/scripts/src/buildAssets/consumableProvisionIcons.ts @@ -2,12 +2,12 @@ import { existsSync } from 'fs'; import sharp from 'sharp'; import { readDVPLFile } from '../../src/core/blitz/readDVPLFile'; import { readStringDVPL } from '../../src/core/blitz/readStringDVPL'; -import { readXMLDVPL } from '../../src/core/blitz/readXMLDVPL'; -import { readYAMLDVPL } from '../../src/core/blitz/readYAMLDVPL'; -import { commitAssets } from '../../src/core/blitzkit/commitAssets'; -import { FileChange } from '../../src/core/blitzkit/commitMultipleFiles'; import { DATA } from './constants'; import { ConsumablesCommon, ProvisionsCommon } from './definitions'; +import { readXMLDVPL } from '../core/blitz/readXMLDVPL'; +import { readYAMLDVPL } from '../core/blitz/readYAMLDVPL'; +import { commitAssets } from '../core/github/commitAssets'; +import { FileChange } from '../core/github/commitMultipleFiles'; interface Mappings { Header: { version: number }; diff --git a/packages/scripts/src/buildAssets/currencies.ts b/packages/scripts/src/buildAssets/currencies.ts index d9e00e408..a066ff577 100644 --- a/packages/scripts/src/buildAssets/currencies.ts +++ b/packages/scripts/src/buildAssets/currencies.ts @@ -1,8 +1,8 @@ +import { assertSecret } from '@blitzkit/core'; import sharp from 'sharp'; import { readDVPLFile } from '../../src/core/blitz/readDVPLFile'; -import { commitAssets } from '../../src/core/blitzkit/commitAssets'; -import { FileChange } from '../../src/core/blitzkit/commitMultipleFiles'; -import { assertSecret } from '../../src/core/blitzkit/secret'; +import { commitAssets } from '../core/github/commitAssets'; +import { FileChange } from '../core/github/commitMultipleFiles'; import { DATA } from './constants'; const ICONS = [ diff --git a/packages/scripts/src/buildAssets/definitions.ts b/packages/scripts/src/buildAssets/definitions.ts index 93362aa0b..4b689e172 100644 --- a/packages/scripts/src/buildAssets/definitions.ts +++ b/packages/scripts/src/buildAssets/definitions.ts @@ -1,47 +1,39 @@ +import { + assertSecret, + CamouflageDefinitions, + ConsumableDefinitions, + ConsumableEntry, + Crew, + CrewMember, + EquipmentDefinitions, + EquipmentPreset, + EquipmentRow, + GameDefinitions, + GunDefinition, + ModelArmor, + ModelDefinitions, + ProvisionDefinitions, + ProvisionEntry, + ShellType, + superCompress, + TankClass, + TankDefinitions, + TankFilterDefinitionCategory, + TankPrice, + Tier, + Unlock, +} from '@blitzkit/core'; import { SkillDefinitions } from '@blitzkit/core/src/blitzkit/skillDefinitions'; import { readdir } from 'fs/promises'; import { parse as parsePath } from 'path'; import { Vector3Tuple } from 'three'; import { parse as parseYaml } from 'yaml'; -import { TankClass } from '../../src/components/Tanks'; -import { WARGAMING_APPLICATION_ID } from '../../src/constants/wargamingApplicationID'; -import { readStringDVPL } from '../../src/core/blitz/readStringDVPL'; -import { readXMLDVPL } from '../../src/core/blitz/readXMLDVPL'; -import { readYAMLDVPL } from '../../src/core/blitz/readYAMLDVPL'; -import { toUniqueId } from '../../src/core/blitz/toUniqueId'; -import { CamouflageDefinitions } from '../../src/core/blitzkit/camouflageDefinitions'; -import { commitAssets } from '../../src/core/blitzkit/commitAssets'; -import { - ConsumableDefinitions, - ConsumableEntry, - TankFilterDefinitionCategory, -} from '../../src/core/blitzkit/consumableDefinitions'; -import { - EquipmentDefinitions, - EquipmentPreset, - EquipmentRow, -} from '../../src/core/blitzkit/equipmentDefinitions'; -import { GameDefinitions } from '../../src/core/blitzkit/gameDefinitions'; -import { MapDefinitions } from '../../src/core/blitzkit/mapDefinitions'; -import { - ModelArmor, - ModelDefinitions, -} from '../../src/core/blitzkit/modelDefinitions'; -import { - ProvisionDefinitions, - ProvisionEntry, -} from '../../src/core/blitzkit/provisionDefinitions'; -import { superCompress } from '../../src/core/blitzkit/superCompress'; -import { - Crew, - CrewMember, - GunDefinition, - ShellType, - TankDefinitions, - TankPrice, - Tier, - Unlock, -} from '../../src/core/blitzkit/tankDefinitions'; +import { toUniqueId } from '../../../website/src/core/blitz/toUniqueId'; +import { MapDefinitions } from '../../../website/src/core/blitzkit/mapDefinitions'; +import { readStringDVPL } from '../core/blitz/readStringDVPL'; +import { readXMLDVPL } from '../core/blitz/readXMLDVPL'; +import { readYAMLDVPL } from '../core/blitz/readYAMLDVPL'; +import { commitAssets } from '../core/github/commitAssets'; import { DATA } from './constants'; import { Avatar } from './skillIcons'; import { TankParameters } from './tankIcons'; @@ -458,7 +450,9 @@ export async function definitions() { console.log('Building definitions...'); const wargamingTankopedia = (await fetch( - `https://api.wotblitz.com/wotb/encyclopedia/vehicles/?application_id=${WARGAMING_APPLICATION_ID}&fields=description`, + `https://api.wotblitz.com/wotb/encyclopedia/vehicles/?application_id=${assertSecret( + process.env.NEXT_PUBLIC_WARGAMING_APPLICATION_ID, + )}&fields=description`, ).then((response) => response.json())) as { data: { [key: number]: { description: null | string } }; }; diff --git a/packages/scripts/src/buildAssets/equipmentIcons.ts b/packages/scripts/src/buildAssets/equipmentIcons.ts index 22514c963..a6b217deb 100644 --- a/packages/scripts/src/buildAssets/equipmentIcons.ts +++ b/packages/scripts/src/buildAssets/equipmentIcons.ts @@ -1,10 +1,10 @@ import sharp from 'sharp'; import { readDVPLFile } from '../../src/core/blitz/readDVPLFile'; import { readStringDVPL } from '../../src/core/blitz/readStringDVPL'; -import { readXMLDVPL } from '../../src/core/blitz/readXMLDVPL'; -import { readYAMLDVPL } from '../../src/core/blitz/readYAMLDVPL'; -import { commitAssets } from '../../src/core/blitzkit/commitAssets'; -import { FileChange } from '../../src/core/blitzkit/commitMultipleFiles'; +import { readXMLDVPL } from '../core/blitz/readXMLDVPL'; +import { readYAMLDVPL } from '../core/blitz/readYAMLDVPL'; +import { commitAssets } from '../core/github/commitAssets'; +import { FileChange } from '../core/github/commitMultipleFiles'; import { DATA } from './constants'; import { OptionalDevices } from './definitions'; diff --git a/packages/scripts/src/buildAssets/flags.ts b/packages/scripts/src/buildAssets/flags.ts index ebab92968..3f94b1724 100644 --- a/packages/scripts/src/buildAssets/flags.ts +++ b/packages/scripts/src/buildAssets/flags.ts @@ -1,9 +1,9 @@ import { readdir } from 'fs/promises'; import sharp from 'sharp'; -import { readBase64DVPL } from '../../src/core/blitz/readBase64DVPL'; -import { readDVPLFile } from '../../src/core/blitz/readDVPLFile'; -import { commitAssets } from '../../src/core/blitzkit/commitAssets'; -import { FileChange } from '../../src/core/blitzkit/commitMultipleFiles'; +import { readBase64DVPL } from '../core/blitz/readBase64DVPL'; +import { readDVPLFile } from '../core/blitz/readDVPLFile'; +import { commitAssets } from '../core/github/commitAssets'; +import { FileChange } from '../core/github/commitMultipleFiles'; import { DATA } from './constants'; export async function flags() { @@ -11,7 +11,9 @@ export async function flags() { const changes = [ ...(await Promise.all( - (await readdir(`${DATA}/Gfx/Lobby/flags`)) + ( + await readdir(`${DATA}/Gfx/Lobby/flags`) + ) .filter( (flag) => flag.startsWith('flag_profile-stat_') && @@ -34,7 +36,9 @@ export async function flags() { }), )), ...(await Promise.all( - (await readdir(`${DATA}/Gfx/Lobby/flags`)) + ( + await readdir(`${DATA}/Gfx/Lobby/flags`) + ) .filter( (flag) => flag.startsWith('flag_tutor-tank_') && @@ -54,7 +58,9 @@ export async function flags() { }), )), ...(await Promise.all( - (await readdir(`${DATA}/Gfx/Lobby/flags`)) + ( + await readdir(`${DATA}/Gfx/Lobby/flags`) + ) .filter( (flag) => flag.startsWith('flag_filter_') && diff --git a/packages/scripts/src/buildAssets/gameModeBanners.ts b/packages/scripts/src/buildAssets/gameModeBanners.ts index 506fed1d0..bf0fbee22 100644 --- a/packages/scripts/src/buildAssets/gameModeBanners.ts +++ b/packages/scripts/src/buildAssets/gameModeBanners.ts @@ -1,8 +1,8 @@ import sharp from 'sharp'; import { readDVPLFile } from '../../src/core/blitz/readDVPLFile'; -import { readYAMLDVPL } from '../../src/core/blitz/readYAMLDVPL'; -import { commitAssets } from '../../src/core/blitzkit/commitAssets'; -import { FileChange } from '../../src/core/blitzkit/commitMultipleFiles'; +import { readYAMLDVPL } from '../core/blitz/readYAMLDVPL'; +import { commitAssets } from '../core/github/commitAssets'; +import { FileChange } from '../core/github/commitMultipleFiles'; import { DATA } from './constants'; import { SquadBattleTypeStyles } from './definitions'; diff --git a/packages/scripts/src/buildAssets/moduleIcons.ts b/packages/scripts/src/buildAssets/moduleIcons.ts index 878cb2410..36a28da55 100644 --- a/packages/scripts/src/buildAssets/moduleIcons.ts +++ b/packages/scripts/src/buildAssets/moduleIcons.ts @@ -1,15 +1,17 @@ import { readdir } from 'fs/promises'; import sharp from 'sharp'; import { readDVPLFile } from '../../src/core/blitz/readDVPLFile'; -import { commitAssets } from '../../src/core/blitzkit/commitAssets'; -import { FileChange } from '../../src/core/blitzkit/commitMultipleFiles'; +import { commitAssets } from '../core/github/commitAssets'; +import { FileChange } from '../core/github/commitMultipleFiles'; import { DATA } from './constants'; export async function moduleIcons() { console.log('Building module icons...'); const changes = await Promise.all( - (await readdir(`${DATA}/Gfx/UI/ModulesTechTree`)) + ( + await readdir(`${DATA}/Gfx/UI/ModulesTechTree`) + ) .filter( (file) => !file.endsWith('@2x.packed.webp.dvpl') && file.startsWith('vehicle'), diff --git a/packages/scripts/src/buildAssets/shellIcons.ts b/packages/scripts/src/buildAssets/shellIcons.ts index b66546a17..48f46133d 100644 --- a/packages/scripts/src/buildAssets/shellIcons.ts +++ b/packages/scripts/src/buildAssets/shellIcons.ts @@ -2,8 +2,8 @@ import { readdir } from 'fs/promises'; import sharp from 'sharp'; import { readDVPLFile } from '../../src/core/blitz/readDVPLFile'; import { readStringDVPL } from '../../src/core/blitz/readStringDVPL'; -import { commitAssets } from '../../src/core/blitzkit/commitAssets'; -import { FileChange } from '../../src/core/blitzkit/commitMultipleFiles'; +import { commitAssets } from '../core/github/commitAssets'; +import { FileChange } from '../core/github/commitMultipleFiles'; import { DATA } from './constants'; export async function shellIcons() { @@ -16,7 +16,9 @@ export async function shellIcons() { ); const changes = await Promise.all( - (await readdir(`${DATA}/Gfx/Shared/tank-supply/ammunition/big`)) + ( + await readdir(`${DATA}/Gfx/Shared/tank-supply/ammunition/big`) + ) .filter((file) => file.endsWith('_l.txt.dvpl')) .map(async (file) => { const name = file.match(/(.+)_l\.txt\.dvpl/)![1]; diff --git a/packages/scripts/src/buildAssets/skillIcons.ts b/packages/scripts/src/buildAssets/skillIcons.ts index 02b556c5a..8eeb7eeb5 100644 --- a/packages/scripts/src/buildAssets/skillIcons.ts +++ b/packages/scripts/src/buildAssets/skillIcons.ts @@ -1,9 +1,9 @@ +import { TankClass } from '@blitzkit/core'; import sharp from 'sharp'; -import { TankClass } from '../../src/components/Tanks'; -import { readDVPLFile } from '../../src/core/blitz/readDVPLFile'; -import { readXMLDVPL } from '../../src/core/blitz/readXMLDVPL'; -import { commitAssets } from '../../src/core/blitzkit/commitAssets'; -import { FileChange } from '../../src/core/blitzkit/commitMultipleFiles'; +import { readDVPLFile } from '../core/blitz/readDVPLFile'; +import { readXMLDVPL } from '../core/blitz/readXMLDVPL'; +import { commitAssets } from '../core/github/commitAssets'; +import { FileChange } from '../core/github/commitMultipleFiles'; import { DATA } from './constants'; interface SkillIcon { diff --git a/packages/scripts/src/buildAssets/tankArmors.ts b/packages/scripts/src/buildAssets/tankArmors.ts index a3a6dd08e..f2f2f4a06 100644 --- a/packages/scripts/src/buildAssets/tankArmors.ts +++ b/packages/scripts/src/buildAssets/tankArmors.ts @@ -1,10 +1,10 @@ import { NodeIO } from '@gltf-transform/core'; import { readdir } from 'fs/promises'; -import { extractArmor } from '../../src/core/blitz/extractArmor'; -import { readXMLDVPL } from '../../src/core/blitz/readXMLDVPL'; -import { toUniqueId } from '../../src/core/blitz/toUniqueId'; -import { commitAssets } from '../../src/core/blitzkit/commitAssets'; -import { FileChange } from '../../src/core/blitzkit/commitMultipleFiles'; +import { extractArmor } from '../../../website/src/core/blitz/extractArmor'; +import { toUniqueId } from '../../../website/src/core/blitz/toUniqueId'; +import { readXMLDVPL } from '../core/blitz/readXMLDVPL'; +import { commitAssets } from '../core/github/commitAssets'; +import { FileChange } from '../core/github/commitMultipleFiles'; import { DATA } from './constants'; import { VehicleDefinitionList } from './definitions'; diff --git a/packages/scripts/src/buildAssets/tankIcons.ts b/packages/scripts/src/buildAssets/tankIcons.ts index d3d751824..d1a792ffe 100644 --- a/packages/scripts/src/buildAssets/tankIcons.ts +++ b/packages/scripts/src/buildAssets/tankIcons.ts @@ -1,12 +1,12 @@ +import { NATION_IDS } from '@blitzkit/core'; import { readdir } from 'fs/promises'; import sharp from 'sharp'; import { Vector3Tuple } from 'three'; -import { NATION_IDS } from '../../src/constants/nations'; -import { readDVPLFile } from '../../src/core/blitz/readDVPLFile'; -import { readXMLDVPL } from '../../src/core/blitz/readXMLDVPL'; -import { readYAMLDVPL } from '../../src/core/blitz/readYAMLDVPL'; -import { commitAssets } from '../../src/core/blitzkit/commitAssets'; -import { FileChange } from '../../src/core/blitzkit/commitMultipleFiles'; +import { readDVPLFile } from '../core/blitz/readDVPLFile'; +import { readXMLDVPL } from '../core/blitz/readXMLDVPL'; +import { readYAMLDVPL } from '../core/blitz/readYAMLDVPL'; +import { commitAssets } from '../core/github/commitAssets'; +import { FileChange } from '../core/github/commitMultipleFiles'; import { DATA } from './constants'; import { VehicleDefinitionList } from './definitions'; diff --git a/packages/scripts/src/buildAssets/tankModels.ts b/packages/scripts/src/buildAssets/tankModels.ts index d2f05dc9d..24f683b5d 100644 --- a/packages/scripts/src/buildAssets/tankModels.ts +++ b/packages/scripts/src/buildAssets/tankModels.ts @@ -1,11 +1,11 @@ import { NodeIO } from '@gltf-transform/core'; import { readdir } from 'fs/promises'; -import { extractModel } from '../../src/core/blitz/extractModel'; -import { readXMLDVPL } from '../../src/core/blitz/readXMLDVPL'; -import { readYAMLDVPL } from '../../src/core/blitz/readYAMLDVPL'; -import { toUniqueId } from '../../src/core/blitz/toUniqueId'; -import { commitAssets } from '../../src/core/blitzkit/commitAssets'; -import { FileChange } from '../../src/core/blitzkit/commitMultipleFiles'; +import { extractModel } from '../../../website/src/core/blitz/extractModel'; +import { toUniqueId } from '../../../website/src/core/blitz/toUniqueId'; +import { readXMLDVPL } from '../core/blitz/readXMLDVPL'; +import { readYAMLDVPL } from '../core/blitz/readYAMLDVPL'; +import { commitAssets } from '../core/github/commitAssets'; +import { FileChange } from '../core/github/commitMultipleFiles'; import { DATA } from './constants'; import { VehicleDefinitionList } from './definitions'; import { TankParameters } from './tankIcons'; diff --git a/packages/scripts/src/buildRatingLeaderboard.ts b/packages/scripts/src/buildRatingLeaderboard.ts index 234614bdd..44ff39073 100644 --- a/packages/scripts/src/buildRatingLeaderboard.ts +++ b/packages/scripts/src/buildRatingLeaderboard.ts @@ -1,24 +1,25 @@ +import { + BkrlBaseEntry, + BkrlFormat, + BkrlSuperset1Entry, + BkrlWriteStream, + CdonValue, + CdonWriteStream, + RegionSubdomain, + superCompress, +} from '@blitzkit/core'; import { chunk } from 'lodash'; import { argv } from 'process'; import { RatingInfo, RatingNeighbors, RatingPlayer, -} from '../src/commands/ratingLeaderboard'; -import { RegionSubdomain } from '../src/constants/regions'; -import { getAccountInfo } from '../src/core/blitz/getAccountInfo'; -import regionSubdomainToRegion from '../src/core/blitz/regionSubdomainToRegion'; -import { commitAssets } from '../src/core/blitzkit/commitAssets'; -import { FileChange } from '../src/core/blitzkit/commitMultipleFiles.js'; -import { patientFetchJSON } from '../src/core/blitzkit/patientFetchJSON'; -import { superCompress } from '../src/core/blitzkit/superCompress'; -import { - BkrlBaseEntry, - BkrlFormat, - BkrlSuperset1Entry, - BkrlWriteStream, -} from '../src/core/streams/bkrl'; -import { CdonValue, CdonWriteStream } from '../src/core/streams/cdon'; +} from '../../bot/src/commands/ratingLeaderboard'; +import { getAccountInfo } from '../../website/src/core/blitz/getAccountInfo'; +import regionSubdomainToRegion from '../../website/src/core/blitz/regionSubdomainToRegion'; +import { patientFetchJSON } from '../../website/src/core/blitzkit/patientFetchJSON'; +import { commitAssets } from './core/github/commitAssets'; +import { FileChange } from './core/github/commitMultipleFiles'; /* * Central North American Time (UTC-5): use 0 5 * * *. diff --git a/packages/website/src/core/blitz/readBase64DVPL.ts b/packages/scripts/src/core/blitz/readBase64DVPL.ts similarity index 100% rename from packages/website/src/core/blitz/readBase64DVPL.ts rename to packages/scripts/src/core/blitz/readBase64DVPL.ts diff --git a/packages/website/src/core/blitz/readDVPL.ts b/packages/scripts/src/core/blitz/readDVPL.ts similarity index 100% rename from packages/website/src/core/blitz/readDVPL.ts rename to packages/scripts/src/core/blitz/readDVPL.ts diff --git a/packages/website/src/core/blitz/readDVPLFile.ts b/packages/scripts/src/core/blitz/readDVPLFile.ts similarity index 100% rename from packages/website/src/core/blitz/readDVPLFile.ts rename to packages/scripts/src/core/blitz/readDVPLFile.ts diff --git a/packages/website/src/core/blitz/readStringDVPL.ts b/packages/scripts/src/core/blitz/readStringDVPL.ts similarity index 100% rename from packages/website/src/core/blitz/readStringDVPL.ts rename to packages/scripts/src/core/blitz/readStringDVPL.ts diff --git a/packages/website/src/core/blitz/readXMLDVPL.ts b/packages/scripts/src/core/blitz/readXMLDVPL.ts similarity index 100% rename from packages/website/src/core/blitz/readXMLDVPL.ts rename to packages/scripts/src/core/blitz/readXMLDVPL.ts diff --git a/packages/website/src/core/blitz/readYAML.ts b/packages/scripts/src/core/blitz/readYAML.ts similarity index 100% rename from packages/website/src/core/blitz/readYAML.ts rename to packages/scripts/src/core/blitz/readYAML.ts diff --git a/packages/website/src/core/blitz/readYAMLDVPL.ts b/packages/scripts/src/core/blitz/readYAMLDVPL.ts similarity index 100% rename from packages/website/src/core/blitz/readYAMLDVPL.ts rename to packages/scripts/src/core/blitz/readYAMLDVPL.ts diff --git a/packages/website/src/core/blitzkit/commitAssets.ts b/packages/scripts/src/core/github/commitAssets.ts similarity index 72% rename from packages/website/src/core/blitzkit/commitAssets.ts rename to packages/scripts/src/core/github/commitAssets.ts index b9f2837a8..486f4fa51 100644 --- a/packages/website/src/core/blitzkit/commitAssets.ts +++ b/packages/scripts/src/core/github/commitAssets.ts @@ -1,5 +1,4 @@ -import { assertSecret } from '../../../packages/core/src/blitzkit/assertSecret'; -import { ASSETS_REPO } from '../../constants/assets'; +import { assertSecret } from '@blitzkit/core'; import commitMultipleFiles, { FileChange } from './commitMultipleFiles'; export async function commitAssets(message: string, changes: FileChange[]) { @@ -9,7 +8,7 @@ export async function commitAssets(message: string, changes: FileChange[]) { await commitMultipleFiles( 'tresabhi', - ASSETS_REPO, + assertSecret(process.env.NEXT_PUBLIC_ASSET_REPO), assertSecret(process.env.NEXT_PUBLIC_ASSET_BRANCH), `${message} - ${new Date().toDateString()}`, changes, diff --git a/packages/website/src/core/blitzkit/commitMultipleFiles.ts b/packages/scripts/src/core/github/commitMultipleFiles.ts similarity index 88% rename from packages/website/src/core/blitzkit/commitMultipleFiles.ts rename to packages/scripts/src/core/github/commitMultipleFiles.ts index 36f561149..a5087a3df 100644 --- a/packages/website/src/core/blitzkit/commitMultipleFiles.ts +++ b/packages/scripts/src/core/github/commitMultipleFiles.ts @@ -1,6 +1,9 @@ import ProgressBar from 'progress'; -import { GithubChangeBlob, createBlob } from './createBlob'; -import { octokit } from './octokit'; +import { + GithubChangeBlob, + createBlob, +} from '../../../../website/src/core/blitzkit/createBlob'; +import { octokit } from '../../../../website/src/core/blitzkit/octokit'; export interface FileChange { path: string; diff --git a/packages/website/src/core/blitzkit/fetchPreDiscoveredIds.ts b/packages/scripts/src/core/github/fetchPreDiscoveredIds.ts similarity index 77% rename from packages/website/src/core/blitzkit/fetchPreDiscoveredIds.ts rename to packages/scripts/src/core/github/fetchPreDiscoveredIds.ts index d5bfed266..4538b141f 100644 --- a/packages/website/src/core/blitzkit/fetchPreDiscoveredIds.ts +++ b/packages/scripts/src/core/github/fetchPreDiscoveredIds.ts @@ -1,9 +1,8 @@ +import { asset, DidsReadStream } from '@blitzkit/core'; import { times } from 'lodash'; import { decompress } from 'lz4js'; import ProgressBar from 'progress'; -import { DidsReadStream } from '../streams/dids'; -import { asset } from './asset'; -import { DiscoveredIdsDefinitions } from './discoveredIdDefinitions'; +import { DiscoveredIdsDefinitions } from '../../../../website/src/core/blitzkit/discoveredIdDefinitions'; export async function fetchPreDiscoveredIds() { const idChunks: number[][] = []; @@ -11,7 +10,9 @@ export async function fetchPreDiscoveredIds() { response.json(), )) as DiscoveredIdsDefinitions; const bar = new ProgressBar( - `Fetching ${manifest.count.toLocaleString()} ids in ${manifest.chunks} chunks :bar`, + `Fetching ${manifest.count.toLocaleString()} ids in ${ + manifest.chunks + } chunks :bar`, manifest.chunks, ); diff --git a/packages/scripts/src/discoverIds.ts b/packages/scripts/src/discoverIds.ts index 7e3b250b9..d2516a51f 100644 --- a/packages/scripts/src/discoverIds.ts +++ b/packages/scripts/src/discoverIds.ts @@ -1,13 +1,18 @@ +import { + DidsReadStream, + DidsWriteStream, + MIN_REGION_IDS, + REGIONS, + Region, + asset, + idToRegion, +} from '@blitzkit/core'; import { chunk, times, uniq } from 'lodash'; import { compress, decompress } from 'lz4js'; -import { REGIONS, Region } from '../src/constants/regions'; -import { retryAbleBlitzFetchEvent } from '../src/core/blitz/fetchBlitz'; -import { getAccountInfo } from '../src/core/blitz/getAccountInfo'; -import { MIN_IDS, idToRegion } from '../src/core/blitz/idToRegion'; -import { asset } from '../src/core/blitzkit/asset'; -import { commitAssets } from '../src/core/blitzkit/commitAssets'; -import { DiscoveredIdsDefinitions } from '../src/core/blitzkit/discoveredIdDefinitions'; -import { DidsReadStream, DidsWriteStream } from '../src/core/streams/dids'; +import { retryAbleBlitzFetchEvent } from '../../website/src/core/blitz/fetchBlitz'; +import { getAccountInfo } from '../../website/src/core/blitz/getAccountInfo'; +import { DiscoveredIdsDefinitions } from '../../website/src/core/blitzkit/discoveredIdDefinitions'; +import { commitAssets } from './core/github/commitAssets'; const CHUNK_SIZE = 2 ** 21; const RUN_TIME = 1000 * 60 * 60 * 5.5; @@ -47,9 +52,9 @@ while (chunkIndex < preDiscoveredManifest.chunks) { } const regionalIdIndex: Record = { - asia: ids.findLast((id) => idToRegion(id) === 'asia') ?? MIN_IDS.asia, - com: ids.findLast((id) => idToRegion(id) === 'com') ?? MIN_IDS.com, - eu: ids.findLast((id) => idToRegion(id) === 'eu') ?? MIN_IDS.eu, + asia: ids.findLast((id) => idToRegion(id) === 'asia') ?? MIN_REGION_IDS.asia, + com: ids.findLast((id) => idToRegion(id) === 'com') ?? MIN_REGION_IDS.com, + eu: ids.findLast((id) => idToRegion(id) === 'eu') ?? MIN_REGION_IDS.eu, }; const zeroStreak: Record = { asia: 0, com: 0, eu: 0 }; let regionIndex = 0; diff --git a/packages/scripts/src/downloadZipClient.ts b/packages/scripts/src/downloadZipClient.ts deleted file mode 100644 index c3939cf3a..000000000 --- a/packages/scripts/src/downloadZipClient.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { assertSecret } from '../src/core/blitzkit/secret'; - -assertSecret(process.env.ZIP_URL); diff --git a/packages/scripts/src/reviews.ts b/packages/scripts/src/reviews.ts index 739b60dec..659759ba2 100644 --- a/packages/scripts/src/reviews.ts +++ b/packages/scripts/src/reviews.ts @@ -1,22 +1,25 @@ +import { + asset, + decodeProtobuf, + encodeProtobufToBase64, + Reviews, + Video, + youtubers, +} from '@blitzkit/core'; import { readdir } from 'fs/promises'; import { google } from 'googleapis'; import { cloneDeep, uniqBy } from 'lodash'; import { parse as parseYaml } from 'yaml'; -import { youtubers } from '../src/constants/youtubers'; -import { readXMLDVPL } from '../src/core/blitz/readXMLDVPL'; -import { readYAMLDVPL } from '../src/core/blitz/readYAMLDVPL'; -import { toUniqueId } from '../src/core/blitz/toUniqueId'; -import { asset } from '../src/core/blitzkit/asset'; -import { commitAssets } from '../src/core/blitzkit/commitAssets'; -import { Reviews, Video } from '../src/core/blitzkit/reviews'; -import { decode } from '../src/core/protobuf/decode'; -import { encodeToBase64 } from '../src/core/protobuf/encodeToBase64'; +import { toUniqueId } from '../../website/src/core/blitz/toUniqueId'; import { DATA } from './buildAssets/constants'; import { BlitzStrings, botPattern, VehicleDefinitionList, } from './buildAssets/definitions'; +import { readXMLDVPL } from './core/blitz/readXMLDVPL'; +import { readYAMLDVPL } from './core/blitz/readYAMLDVPL'; +import { commitAssets } from './core/github/commitAssets'; const MAX_QUERIES = 128; @@ -25,7 +28,11 @@ console.log('Finding reviews...'); const currentReviews = await fetch(asset('definitions/reviews.pb')) .then((response) => response.arrayBuffer()) .then((buffer) => - decode('reviews', 'blitzkit.Reviews', new Uint8Array(buffer)), + decodeProtobuf( + 'reviews', + 'blitzkit.Reviews', + new Uint8Array(buffer), + ), ); const auth = await google.auth.getClient({ scopes: ['https://www.googleapis.com/auth/youtube.readonly'], @@ -111,7 +118,7 @@ for (const tank of tanksSanitized) { ({ id: item.id!.videoId!, author: item.snippet!.channelId!, - }) satisfies Video, + } satisfies Video), ), }; @@ -124,7 +131,11 @@ for (const tank of tanksSanitized) { } } -const content = await encodeToBase64('reviews', 'blitzkit.Reviews', reviews); +const content = await encodeProtobufToBase64( + 'reviews', + 'blitzkit.Reviews', + reviews, +); await commitAssets('reviews', [ { content, encoding: 'base64', path: 'definitions/reviews.pb' }, diff --git a/packages/scripts/src/sitemap.ts b/packages/scripts/src/sitemap.ts index ece92ca58..3866d7cc6 100644 --- a/packages/scripts/src/sitemap.ts +++ b/packages/scripts/src/sitemap.ts @@ -1,4 +1,4 @@ -import { tankDefinitions } from '../src/core/blitzkit/tankDefinitions'; +import { tankDefinitions } from '@blitzkit/core'; // random vercel bug forces require import const { writeFileSync } = require('fs'); diff --git a/packages/website/package.json b/packages/website/package.json index d405713fd..7f8f263bf 100644 --- a/packages/website/package.json +++ b/packages/website/package.json @@ -16,6 +16,8 @@ "@react-three/drei": "^9.111.5", "@react-three/fiber": "^8.17.6", "react": "^18.3.1", + "markdown-to-jsx": "^7.5.0", + "compare-versions": "^6.1.1", "react-device-detect": "^2.2.3", "react-dom": "^18.3.1", "react-fuzzysort": "^1.0.1", diff --git a/packages/website/src/app/api/[region]/rating/current/info/route.ts b/packages/website/src/app/api/[region]/rating/current/info/route.ts index e464ca6b5..fdd613f79 100644 --- a/packages/website/src/app/api/[region]/rating/current/info/route.ts +++ b/packages/website/src/app/api/[region]/rating/current/info/route.ts @@ -1,5 +1,5 @@ +import { Region } from '@blitzkit/core'; import { NextResponse } from 'next/server'; -import { Region } from '../../../../../../constants/regions'; import getRatingInfo from '../../../../../../core/blitz/getRatingInfo'; export async function GET( diff --git a/packages/website/src/app/api/[region]/rating/current/league/[league]/route.ts b/packages/website/src/app/api/[region]/rating/current/league/[league]/route.ts index e75eb6e09..05e30e467 100644 --- a/packages/website/src/app/api/[region]/rating/current/league/[league]/route.ts +++ b/packages/website/src/app/api/[region]/rating/current/league/[league]/route.ts @@ -1,5 +1,5 @@ +import { Region } from '@blitzkit/core'; import { NextResponse } from 'next/server'; -import { Region } from '../../../../../../../constants/regions'; import { getRatingLeague } from '../../../../../../../core/blitz/getRatingLeague'; export async function GET( diff --git a/packages/website/src/app/api/[region]/rating/current/search/[username]/route.ts b/packages/website/src/app/api/[region]/rating/current/search/[username]/route.ts index edf3df3dc..3681ec814 100644 --- a/packages/website/src/app/api/[region]/rating/current/search/[username]/route.ts +++ b/packages/website/src/app/api/[region]/rating/current/search/[username]/route.ts @@ -1,5 +1,5 @@ +import { Region } from '@blitzkit/core'; import { NextResponse } from 'next/server'; -import { Region } from '../../../../../../../constants/regions'; import { searchCurrentRatingPlayers } from '../../../../../../../core/blitz/searchCurrentRatingPlayers'; export async function GET( diff --git a/packages/website/src/app/api/patreon/auth/[code]/route.ts b/packages/website/src/app/api/patreon/auth/[code]/route.ts index 755ccb13f..8ec284a7a 100644 --- a/packages/website/src/app/api/patreon/auth/[code]/route.ts +++ b/packages/website/src/app/api/patreon/auth/[code]/route.ts @@ -1,5 +1,5 @@ +import { assertSecret } from '@blitzkit/core'; import { NextResponse } from 'next/server'; -import { assertSecret } from '../../../../../core/blitzkit/secret'; export async function GET( request: Request, @@ -12,7 +12,9 @@ export async function GET( process.env.NEXT_PUBLIC_PATREON_CLIENT_ID, )}&client_secret=${assertSecret( process.env.PATREON_CLIENT_SECRET, - )}&redirect_uri=${assertSecret(process.env.NEXT_PUBLIC_PATREON_REDIRECT_URI)}`, + )}&redirect_uri=${assertSecret( + process.env.NEXT_PUBLIC_PATREON_REDIRECT_URI, + )}`, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, diff --git a/packages/website/src/app/api/patreon/membership/[token]/route.ts b/packages/website/src/app/api/patreon/membership/[token]/route.ts index fd3995f25..ea9d1d2d3 100644 --- a/packages/website/src/app/api/patreon/membership/[token]/route.ts +++ b/packages/website/src/app/api/patreon/membership/[token]/route.ts @@ -1,5 +1,5 @@ +import { assertSecret } from '@blitzkit/core'; import { NextResponse } from 'next/server'; -import { assertSecret } from '../../../../../core/blitzkit/secret'; interface PatreonMembershipResponse { data: { diff --git a/packages/website/src/app/api/patreon/refresh/[token]/route.ts b/packages/website/src/app/api/patreon/refresh/[token]/route.ts index ef395faef..22106a448 100644 --- a/packages/website/src/app/api/patreon/refresh/[token]/route.ts +++ b/packages/website/src/app/api/patreon/refresh/[token]/route.ts @@ -1,5 +1,5 @@ +import { assertSecret } from '@blitzkit/core'; import { NextResponse } from 'next/server'; -import { assertSecret } from '../../../../../core/blitzkit/secret'; export async function GET( request: Request, diff --git a/packages/website/src/app/api/tank-voting/[id]/average/route.ts b/packages/website/src/app/api/tank-voting/[id]/average/route.ts index 9e93b294c..322703302 100644 --- a/packages/website/src/app/api/tank-voting/[id]/average/route.ts +++ b/packages/website/src/app/api/tank-voting/[id]/average/route.ts @@ -1,7 +1,6 @@ +import { tankDefinitions, usersDatabase } from '@blitzkit/core'; import { NextRequest, NextResponse } from 'next/server'; import { isValidBlitzId } from '../../../../../core/blitz/isValidBlitzId'; -import { tankDefinitions } from '../../../../../core/blitzkit/tankDefinitions'; -import { usersDatabase } from '../../../../../databases/users'; import { BlitzkitResponse, BlitzkitResponseError, diff --git a/packages/website/src/app/api/tank-voting/[id]/cast/route.ts b/packages/website/src/app/api/tank-voting/[id]/cast/route.ts index 3290e0fdc..f3e5e8327 100644 --- a/packages/website/src/app/api/tank-voting/[id]/cast/route.ts +++ b/packages/website/src/app/api/tank-voting/[id]/cast/route.ts @@ -1,7 +1,6 @@ +import { tankDefinitions, usersDatabase } from '@blitzkit/core'; import { NextRequest, NextResponse } from 'next/server'; import { isValidBlitzId } from '../../../../../core/blitz/isValidBlitzId'; -import { tankDefinitions } from '../../../../../core/blitzkit/tankDefinitions'; -import { usersDatabase } from '../../../../../databases/users'; import { BlitzkitResponse, BlitzkitResponseError, diff --git a/packages/website/src/app/components/Checks.tsx b/packages/website/src/app/components/Checks.tsx index fdd07ecd3..1962110e8 100644 --- a/packages/website/src/app/components/Checks.tsx +++ b/packages/website/src/app/components/Checks.tsx @@ -1,9 +1,9 @@ 'use client'; +import { assertSecret, idToRegion } from '@blitzkit/core'; import { Button, Flex, Heading, Link, Text } from '@radix-ui/themes'; import { usePathname } from 'next/navigation'; import { useEffect, useState } from 'react'; -import { idToRegion } from '@blitzkit/core'; import * as App from '../../stores/app'; import { CURRENT_POLICIES_AGREEMENT_INDEX } from '../../stores/app/constants'; import { PatreonAuthResponse } from '../auth/[provider]/page'; @@ -77,9 +77,9 @@ export function Checks() { fetch( `https://api.worldoftanks.${idToRegion( wargaming.id, - )}/wot/auth/prolongate/?application_id=${assertSecret(process.env.WARGAMING_APPLICATION_ID)}&access_token=${ - wargaming.token - }`, + )}/wot/auth/prolongate/?application_id=${assertSecret( + process.env.NEXT_PUBLIC_WARGAMING_APPLICATION_ID, + )}&access_token=${wargaming.token}`, ) .then((response) => response.json() as Promise) .then((json) => { diff --git a/packages/website/src/app/docs/[directory]/[document]/page.tsx b/packages/website/src/app/docs/[directory]/[document]/page.tsx index 781922efc..11238377b 100644 --- a/packages/website/src/app/docs/[directory]/[document]/page.tsx +++ b/packages/website/src/app/docs/[directory]/[document]/page.tsx @@ -1,9 +1,9 @@ +import { assertSecret } from '@blitzkit/core'; import { Table } from '@radix-ui/themes'; import Markdown from 'markdown-to-jsx'; import { use } from 'react'; import { Link } from '../../../../components/Link'; import PageWrapper from '../../../../components/PageWrapper'; -import { assertSecret } from '../../../../core/blitzkit/secret'; export default function Page({ params, diff --git a/packages/website/src/app/tools/compare/components/Body.tsx b/packages/website/src/app/tools/compare/components/Body.tsx index e49ee84cd..f1afb66cf 100644 --- a/packages/website/src/app/tools/compare/components/Body.tsx +++ b/packages/website/src/app/tools/compare/components/Body.tsx @@ -1,7 +1,6 @@ +import { asset, TankCharacteristics } from '@blitzkit/core'; import { Flex, Heading, IconButton, Table } from '@radix-ui/themes'; import { StickyColumnHeaderCell } from '../../../../components/StickyColumnHeaderCell'; -import { asset } from '../../../../core/blitzkit/asset'; -import { TankCharacteristics } from '../../../../core/blitzkit/tankCharacteristics'; import * as CompareEphemeral from '../../../../stores/compareEphemeral'; import { CompareRow } from './CompareRow'; import { CompareSectionTitle } from './CompareSectionTitle'; diff --git a/packages/website/src/app/tools/compare/components/CompareRow.tsx b/packages/website/src/app/tools/compare/components/CompareRow.tsx index 77c73f01c..6ba15ccb1 100644 --- a/packages/website/src/app/tools/compare/components/CompareRow.tsx +++ b/packages/website/src/app/tools/compare/components/CompareRow.tsx @@ -1,12 +1,12 @@ +import { TankCharacteristics } from '@blitzkit/core'; import { CaretLeftIcon, CaretRightIcon, CaretSortIcon, } from '@radix-ui/react-icons'; import { Flex, IconButton, Table, Text } from '@radix-ui/themes'; +import { theme } from '../../../../../../bot/src/stitches.config'; import { StickyRowHeaderCell } from '../../../../components/StickyRowHeaderCell'; -import { TankCharacteristics } from '../../../../core/blitzkit/tankCharacteristics'; -import { theme } from '../../../../stitches.config'; import * as CompareEphemeral from '../../../../stores/compareEphemeral'; import * as ComparePersistent from '../../../../stores/comparePersistent'; @@ -103,8 +103,8 @@ export function CompareRow({ const resolvedDisplayValue = display ? display(stats[index]) : decimals === undefined - ? value - : value?.toFixed(decimals); + ? value + : value?.toFixed(decimals); return ( values[0] - : value < values[0] - ) - ? `color-mix(in srgb, ${theme.colors.componentCallToActionInteractive_green} ${normalizedDeltaPercentage}%, ${theme.colors.componentCallToActionInteractive_green}00)` - : `color-mix(in srgb, ${theme.colors.componentCallToActionInteractive_red} ${normalizedDeltaPercentage}%, ${theme.colors.componentCallToActionInteractive_red}00)`, + deltaType === 'higherIsBetter' + ? value > values[0] + : value < values[0] + ) + ? `color-mix(in srgb, ${theme.colors.componentCallToActionInteractive_green} ${normalizedDeltaPercentage}%, ${theme.colors.componentCallToActionInteractive_green}00)` + : `color-mix(in srgb, ${theme.colors.componentCallToActionInteractive_red} ${normalizedDeltaPercentage}%, ${theme.colors.componentCallToActionInteractive_red}00)`, }} > diff --git a/packages/website/src/app/tools/compare/components/CompareTable.tsx b/packages/website/src/app/tools/compare/components/CompareTable.tsx index 8b9aa6401..fbafab3f5 100644 --- a/packages/website/src/app/tools/compare/components/CompareTable.tsx +++ b/packages/website/src/app/tools/compare/components/CompareTable.tsx @@ -1,8 +1,20 @@ +import { + TankCharacteristics, + asset, + availableProvisions, + checkConsumableProvisionInclusivity, + consumableDefinitions, + equipmentDefinitions, + provisionDefinitions, + skillDefinitions, +} from '@blitzkit/core'; import { permanentSkills } from '@blitzkit/core/src/blitz/permanentSkills'; import { ComponentPlaceholderIcon } from '@radix-ui/react-icons'; import { Button, Flex, Popover, Slider, Table, Text } from '@radix-ui/themes'; import { debounce, times } from 'lodash'; import { use } from 'react'; +import { theme } from '../../../../../../bot/src/stitches.config'; +import { BlitzkitButtonGrayIcon } from '../../../../components/BlitzkitButtonGrayIcon'; import { ConsumablesManager } from '../../../../components/ConsumablesManager'; import { CrewSkillManager } from '../../../../components/CrewSkillManager'; import { EquipmentManager } from '../../../../components/EquipmentManager'; @@ -10,16 +22,6 @@ import { ModuleManager } from '../../../../components/ModuleManager'; import { ProvisionsManager } from '../../../../components/ProvisionsManager'; import { StickyColumnHeaderCell } from '../../../../components/StickyColumnHeaderCell'; import { StickyTableRoot } from '../../../../components/StickyTableRoot'; -import { asset } from '../../../../core/blitzkit/asset'; -import { availableProvisions } from '../../../../core/blitzkit/availableProvisions'; -import { checkConsumableProvisionInclusivity } from '../../../../core/blitzkit/checkConsumableProvisionInclusivity'; -import { consumableDefinitions } from '../../../../core/blitzkit/consumableDefinitions'; -import { equipmentDefinitions } from '../../../../core/blitzkit/equipmentDefinitions'; -import { provisionDefinitions } from '../../../../core/blitzkit/provisionDefinitions'; -import { skillDefinitions } from '../../../../core/blitzkit/skillDefinitions'; -import { TankCharacteristics } from '../../../../core/blitzkit/tankCharacteristics'; -import { BlitzkitButtonGray } from '../../../../icons/BlitzkitButtonGray'; -import { theme } from '../../../../stitches.config'; import * as CompareEphemeral from '../../../../stores/compareEphemeral'; import { EquipmentMatrix } from '../../../../stores/duel'; import { Body } from './Body'; @@ -56,7 +58,7 @@ export function CompareTable({ stats }: CompareTableProps) { align="center" justify="center" > - + diff --git a/packages/website/src/app/tools/compare/components/Controls.tsx b/packages/website/src/app/tools/compare/components/Controls.tsx index 4a8c52a4a..2d798ecb6 100644 --- a/packages/website/src/app/tools/compare/components/Controls.tsx +++ b/packages/website/src/app/tools/compare/components/Controls.tsx @@ -1,7 +1,7 @@ +import { provisionDefinitions } from '@blitzkit/core'; import { PlusIcon, TrashIcon } from '@radix-ui/react-icons'; import { Button, Dialog, Flex, SegmentedControl } from '@radix-ui/themes'; import { use } from 'react'; -import { provisionDefinitions } from '../../../../core/blitzkit/provisionDefinitions'; import { tankToCompareMember } from '../../../../core/blitzkit/tankToCompareMember'; import * as CompareEphemeral from '../../../../stores/compareEphemeral'; import * as ComparePersistent from '../../../../stores/comparePersistent'; diff --git a/packages/website/src/app/tools/compare/components/IntersectionMarker/index.tsx b/packages/website/src/app/tools/compare/components/IntersectionMarker/index.tsx index fd43a8170..e5243f176 100644 --- a/packages/website/src/app/tools/compare/components/IntersectionMarker/index.tsx +++ b/packages/website/src/app/tools/compare/components/IntersectionMarker/index.tsx @@ -1,5 +1,5 @@ import { useEffect, useRef } from 'react'; -import { theme } from '../../../../../stitches.config'; +import { theme } from '../../../../../../../bot/src/stitches.config'; import { insertionMarkers } from './constants'; export function InsertionMarker({ index }: { index: number }) { diff --git a/packages/website/src/app/tools/compare/components/TankCard.tsx b/packages/website/src/app/tools/compare/components/TankCard.tsx index b027b399f..9ab059a60 100644 --- a/packages/website/src/app/tools/compare/components/TankCard.tsx +++ b/packages/website/src/app/tools/compare/components/TankCard.tsx @@ -1,9 +1,8 @@ +import { TankDefinition, tankIcon } from '@blitzkit/core'; import { Flex, Text } from '@radix-ui/themes'; import { useEffect, useRef } from 'react'; import { Vector2 } from 'three'; import { StickyColumnHeaderCell } from '../../../../components/StickyColumnHeaderCell'; -import { TankDefinition } from '../../../../core/blitzkit/tankDefinitions'; -import { tankIcon } from '../../../../core/blitzkit/tankIcon'; import * as CompareEphemeral from '../../../../stores/compareEphemeral'; import { InsertionMarker } from './IntersectionMarker'; import { insertionMarkers } from './IntersectionMarker/constants'; diff --git a/packages/website/src/app/tools/compare/components/TankControl.tsx b/packages/website/src/app/tools/compare/components/TankControl.tsx index a97970acf..6597a1901 100644 --- a/packages/website/src/app/tools/compare/components/TankControl.tsx +++ b/packages/website/src/app/tools/compare/components/TankControl.tsx @@ -1,8 +1,8 @@ +import { provisionDefinitions } from '@blitzkit/core'; import { ExternalLinkIcon, LoopIcon, TrashIcon } from '@radix-ui/react-icons'; import { Dialog, Flex, IconButton } from '@radix-ui/themes'; import Link from 'next/link'; import { use, useState } from 'react'; -import { provisionDefinitions } from '../../../../core/blitzkit/provisionDefinitions'; import { tankToCompareMember } from '../../../../core/blitzkit/tankToCompareMember'; import * as CompareEphemeral from '../../../../stores/compareEphemeral'; import { TankSearch } from '../../tankopedia/components/TankSearch'; diff --git a/packages/website/src/app/tools/compare/page.tsx b/packages/website/src/app/tools/compare/page.tsx index 4daa94fed..9491e2896 100644 --- a/packages/website/src/app/tools/compare/page.tsx +++ b/packages/website/src/app/tools/compare/page.tsx @@ -1,17 +1,19 @@ 'use client'; +import { + createDefaultSkills, + equipmentDefinitions, + modelDefinitions, + provisionDefinitions, + skillDefinitions, + tankCharacteristics, + tankDefinitions, +} from '@blitzkit/core'; import { PlusIcon } from '@radix-ui/react-icons'; import { Box, Flex, Heading, IconButton, Text } from '@radix-ui/themes'; import { usePathname, useRouter, useSearchParams } from 'next/navigation'; import { use, useCallback, useEffect, useMemo, useState } from 'react'; import PageWrapper from '../../../components/PageWrapper'; -import { createDefaultSkills } from '../../../core/blitzkit/createDefaultSkills'; -import { equipmentDefinitions } from '../../../core/blitzkit/equipmentDefinitions'; -import { modelDefinitions } from '../../../core/blitzkit/modelDefinitions'; -import { provisionDefinitions } from '../../../core/blitzkit/provisionDefinitions'; -import { skillDefinitions } from '../../../core/blitzkit/skillDefinitions'; -import { tankCharacteristics } from '../../../core/blitzkit/tankCharacteristics'; -import { tankDefinitions } from '../../../core/blitzkit/tankDefinitions'; import { tankToCompareMember } from '../../../core/blitzkit/tankToCompareMember'; import * as CompareEphemeral from '../../../stores/compareEphemeral'; import { CompareTable } from './components/CompareTable'; diff --git a/packages/website/src/app/tools/embed/[embed]/page.tsx b/packages/website/src/app/tools/embed/[embed]/page.tsx index 733108de9..83cd6c631 100644 --- a/packages/website/src/app/tools/embed/[embed]/page.tsx +++ b/packages/website/src/app/tools/embed/[embed]/page.tsx @@ -1,5 +1,6 @@ 'use client'; +import { imgur } from '@blitzkit/core'; import { CodeIcon, HeightIcon, @@ -15,7 +16,6 @@ import { ReactNode, useEffect, useRef, useState } from 'react'; import { stringify } from 'urlon'; import { CopyButton } from '../../../../components/CopyButton'; import PageWrapper from '../../../../components/PageWrapper'; -import { imgur } from '../../../../core/blitzkit/imgur'; import * as App from '../../../../stores/app'; import * as EmbedState from '../../../../stores/embedState'; import { EmbedConfig } from '../../../../stores/embedState'; @@ -97,7 +97,9 @@ export default function Page({ state: stringify(shallowState), }); - return `${location.origin}/tools/embed/${params.embed}/host?${searchParams.toString()}`; + return `${location.origin}/tools/embed/${ + params.embed + }/host?${searchParams.toString()}`; }} > diff --git a/packages/website/src/app/tools/embed/configurations/breakdown.tsx b/packages/website/src/app/tools/embed/configurations/breakdown.tsx index 2d5598dc2..75929da2f 100644 --- a/packages/website/src/app/tools/embed/configurations/breakdown.tsx +++ b/packages/website/src/app/tools/embed/configurations/breakdown.tsx @@ -1,15 +1,15 @@ +import { + CompositeStatsKey, + compositeStatsKeys, + tankDefinitionsArray, +} from '@blitzkit/core'; +import strings from '@blitzkit/core/lang/en-US.json'; import { grayA, grayDark, grayDarkA } from '@radix-ui/colors'; import { use } from 'react'; import { BreakdownEmbedCard, BreakdownEmbedWrapper, } from '../../../../components/TanksEmbed'; -import { tankDefinitionsArray } from '../../../../core/blitzkit/tankDefinitions'; -import { - CompositeStatsKey, - compositeStatsKeys, -} from '../../../../core/statistics/compositeStats/constants'; -import strings from '../../../../lang/en-US.json'; import { EmbedConfig } from '../../../../stores/embedState'; import { EmbedItemType } from '../../../../stores/embedState/constants'; import { useEmbedStateCurry } from '../../../../stores/embedState/utilities'; diff --git a/packages/website/src/app/tools/performance/components/Info.tsx b/packages/website/src/app/tools/performance/components/Info.tsx index a02f188bf..12aa362b3 100644 --- a/packages/website/src/app/tools/performance/components/Info.tsx +++ b/packages/website/src/app/tools/performance/components/Info.tsx @@ -1,11 +1,10 @@ 'use client'; +import { averageDefinitions, formatCompact } from '@blitzkit/core'; import { InfoCircledIcon } from '@radix-ui/react-icons'; import { Callout, Flex } from '@radix-ui/themes'; import { use } from 'react'; -import { averageDefinitions } from '../../../../core/blitzkit/averageDefinitions'; import { discoveredIdsDefinitions } from '../../../../core/blitzkit/discoveredIdDefinitions'; -import { formatCompact } from '../../../../core/math/formatCompact'; export function Info() { const awaitedDiscoveredIdsDefinitions = use(discoveredIdsDefinitions); diff --git a/packages/website/src/app/tools/performance/components/TankRow.tsx b/packages/website/src/app/tools/performance/components/TankRow.tsx index f780fd439..a7a23962a 100644 --- a/packages/website/src/app/tools/performance/components/TankRow.tsx +++ b/packages/website/src/app/tools/performance/components/TankRow.tsx @@ -1,9 +1,11 @@ +import { + TankDefinition, + averageDefinitions, + formatCompact, +} from '@blitzkit/core'; import { Table } from '@radix-ui/themes'; import { memo, use } from 'react'; import { TankRowHeaderCell } from '../../../../components/TankRowHeaderCell'; -import { averageDefinitions } from '../../../../core/blitzkit/averageDefinitions'; -import { TankDefinition } from '../../../../core/blitzkit/tankDefinitions'; -import { formatCompact } from '../../../../core/math/formatCompact'; import { useAveragesExclusionRatio } from '../../../../hooks/useAveragesExclusionRatio'; import * as TankPerformancePersistent from '../../../../stores/tankPerformancePersistent'; diff --git a/packages/website/src/app/tools/performance/components/Tanks.tsx b/packages/website/src/app/tools/performance/components/Tanks.tsx index 897b967af..34324386c 100644 --- a/packages/website/src/app/tools/performance/components/Tanks.tsx +++ b/packages/website/src/app/tools/performance/components/Tanks.tsx @@ -1,11 +1,13 @@ 'use client'; +import { + averageDefinitionsArray, + filterTank, + tankDefinitions, +} from '@blitzkit/core'; import { Table } from '@radix-ui/themes'; import { times } from 'lodash'; import { Suspense, use, useEffect, useMemo, useState } from 'react'; -import { averageDefinitionsArray } from '../../../../core/blitzkit/averageDefinitions'; -import { filterTank } from '../../../../core/blitzkit/filterTank'; -import { tankDefinitions } from '../../../../core/blitzkit/tankDefinitions'; import * as TankFilters from '../../../../stores/tankFilters'; import * as TankPerformancePersistent from '../../../../stores/tankPerformancePersistent'; import * as TankPerformanceSort from '../../../../stores/tankPerformanceSort'; diff --git a/packages/website/src/app/tools/performance/components/TierBreakdown.tsx b/packages/website/src/app/tools/performance/components/TierBreakdown.tsx index df41ac38d..9ed96da21 100644 --- a/packages/website/src/app/tools/performance/components/TierBreakdown.tsx +++ b/packages/website/src/app/tools/performance/components/TierBreakdown.tsx @@ -1,20 +1,20 @@ 'use client'; +import { + averageDefinitionsArray, + formatCompact, + TANK_CLASSES, + TankClass, + tankDefinitions, + Tier, + TIER_ROMAN_NUMERALS, +} from '@blitzkit/core'; +import strings from '@blitzkit/core/lang/en-US.json'; import { ResponsiveBar } from '@nivo/bar'; import { Box, Flex, Heading } from '@radix-ui/themes'; import { times } from 'lodash'; import { use } from 'react'; -import { TankClass } from '../../../../components/Tanks'; -import { TANK_CLASSES } from '../../../../components/Tanks/components/Item/constants'; -import { averageDefinitionsArray } from '../../../../core/blitzkit/averageDefinitions'; -import { - tankDefinitions, - Tier, -} from '../../../../core/blitzkit/tankDefinitions'; -import { TIER_ROMAN_NUMERALS } from '../../../../core/blitzkit/tankDefinitions/constants'; -import { formatCompact } from '../../../../core/math/formatCompact'; import { nivoTheme } from '../../../../core/nivo/theme'; -import strings from '../../../../lang/en-US.json'; export function TierBreakdown() { const awaitedAverageDefinitionsArray = use(averageDefinitionsArray); diff --git a/packages/website/src/app/tools/performance/components/Total.tsx b/packages/website/src/app/tools/performance/components/Total.tsx index 10c648d17..c7b788a5b 100644 --- a/packages/website/src/app/tools/performance/components/Total.tsx +++ b/packages/website/src/app/tools/performance/components/Total.tsx @@ -1,12 +1,12 @@ -import { Table } from '@radix-ui/themes'; -import { memo, use, useCallback } from 'react'; -import { StickyRowHeaderCell } from '../../../../components/StickyRowHeaderCell'; import { averageDefinitions, AverageDefinitionsEntryWithId, -} from '../../../../core/blitzkit/averageDefinitions'; -import { formatCompact } from '../../../../core/math/formatCompact'; -import { BlitzkitStats } from '../../../../core/statistics/compositeStats/constants'; + BlitzkitStats, + formatCompact, +} from '@blitzkit/core'; +import { Table } from '@radix-ui/themes'; +import { memo, use, useCallback } from 'react'; +import { StickyRowHeaderCell } from '../../../../components/StickyRowHeaderCell'; import { useAveragesExclusionRatio } from '../../../../hooks/useAveragesExclusionRatio'; import * as TankPerformancePersistent from '../../../../stores/tankPerformancePersistent'; diff --git a/packages/website/src/app/tools/rating/page.tsx b/packages/website/src/app/tools/rating/page.tsx index 2542baf95..9299eaeb8 100644 --- a/packages/website/src/app/tools/rating/page.tsx +++ b/packages/website/src/app/tools/rating/page.tsx @@ -1,5 +1,12 @@ 'use client'; +import { + FIRST_MINIMAL_ARCHIVED_RATING_SEASON, + LEAGUES, + Region, + REGIONS, + UNLOCALIZED_REGION_NAMES, +} from '@blitzkit/core'; import { blackA, orangeDark } from '@radix-ui/colors'; import { MagnifyingGlassIcon } from '@radix-ui/react-icons'; import { @@ -15,16 +22,13 @@ import { produce } from 'immer'; import { debounce, range } from 'lodash'; import { ChangeEvent, useEffect, useRef, useState } from 'react'; import { create } from 'zustand'; -import { RatingInfo, RatingPlayer } from '../../../commands/ratingLeaderboard'; +import { + RatingInfo, + RatingPlayer, +} from '../../../../../bot/src/commands/ratingLeaderboard'; +import { theme } from '../../../../../bot/src/stitches.config'; import PageWrapper from '../../../components/PageWrapper'; import { Skeleton } from '../../../components/Skeleton'; -import { LEAGUES } from '../../../constants/leagues'; -import { FIRST_MINIMAL_ARCHIVED_RATING_SEASON } from '../../../constants/rating'; -import { - REGIONS, - Region, - UNLOCALIZED_REGION_NAMES, -} from '../../../constants/regions'; import fetchBlitz from '../../../core/blitz/fetchBlitz'; import { getClanAccountInfo } from '../../../core/blitz/getClanAccountInfo'; import getRatingInfo from '../../../core/blitz/getRatingInfo'; @@ -38,7 +42,6 @@ import { import { getArchivedLatestSeasonNumber } from '../../../core/blitzkit/getArchivedLatestSeasonNumber'; import getArchivedRatingInfo from '../../../core/blitzkit/getArchivedRatingInfo'; import { getArchivedRatingLeaderboard } from '../../../core/blitzkit/getArchivedRatingLeaderboard'; -import { theme } from '../../../stitches.config'; import { PageTurner } from './components/PageTurner'; const ROWS_PER_PAGE = Math.floor(100 / 3); diff --git a/packages/website/src/app/tools/session/page.tsx b/packages/website/src/app/tools/session/page.tsx index 13620fe3a..74a9b2e6f 100644 --- a/packages/website/src/app/tools/session/page.tsx +++ b/packages/website/src/app/tools/session/page.tsx @@ -1,5 +1,12 @@ 'use client'; +import { + IndividualTankStats, + UNLOCALIZED_REGION_NAMES_SHORT, + deltaTankStats, + idToRegion, + tankDefinitions, +} from '@blitzkit/core'; import { ArrowDownIcon, MagnifyingGlassIcon, @@ -22,7 +29,6 @@ import { debounce } from 'lodash'; import { use, useEffect, useMemo, useRef, useState } from 'react'; import PageWrapper from '../../../components/PageWrapper'; import { TankRowHeaderCell } from '../../../components/TankRowHeaderCell'; -import { UNLOCALIZED_REGION_NAMES_SHORT } from '../../../constants/regions'; import { STAT_KEYS, STAT_NAMES, @@ -36,15 +42,11 @@ import { getAccountInfo, } from '../../../core/blitz/getAccountInfo'; import getTankStats from '../../../core/blitz/getTankStats'; -import { idToRegion } from '../../../core/blitz/idToRegion'; import searchPlayersAcrossRegions, { AccountListWithServer, } from '../../../core/blitz/searchPlayersAcrossRegions'; -import { tankDefinitions } from '../../../core/blitzkit/tankDefinitions'; import { tankAverages } from '../../../core/blitzstars/tankAverages'; -import { deltaTankStats } from '../../../core/statistics/deltaTankStats'; import * as Session from '../../../stores/session'; -import { IndividualTankStats } from '../../../types/tanksStats'; export default function Page({ searchParams, diff --git a/packages/website/src/app/tools/tankopedia/[id]/components/Characteristics/components/Modules.tsx b/packages/website/src/app/tools/tankopedia/[id]/components/Characteristics/components/Modules.tsx index ce47d9c24..100d11cc8 100644 --- a/packages/website/src/app/tools/tankopedia/[id]/components/Characteristics/components/Modules.tsx +++ b/packages/website/src/app/tools/tankopedia/[id]/components/Characteristics/components/Modules.tsx @@ -1,9 +1,14 @@ import { asset, formatCompact, + ModuleDefinition, + ModuleType, + TankDefinition, tankDefinitions, tankIcon, + Tier, TIER_ROMAN_NUMERALS, + Unlock, } from '@blitzkit/core'; import { Button, diff --git a/packages/website/src/app/tools/tankopedia/[id]/components/Model/HeroSection.tsx b/packages/website/src/app/tools/tankopedia/[id]/components/Model/HeroSection.tsx index 556bedadb..04a479632 100644 --- a/packages/website/src/app/tools/tankopedia/[id]/components/Model/HeroSection.tsx +++ b/packages/website/src/app/tools/tankopedia/[id]/components/Model/HeroSection.tsx @@ -1,6 +1,7 @@ import { resolveNearPenetration, tankDefinitions, Var } from '@blitzkit/core'; import { Box, Flex, Heading, Text } from '@radix-ui/themes'; import { Suspense, use, useEffect, useMemo, useRef, useState } from 'react'; +import { ThicknessRange } from '../../../../../../components/Armor/components/StaticArmor'; import { classIcons } from '../../../../../../components/ClassIcon'; import { NAVBAR_HEIGHT } from '../../../../../../components/Navbar/index.css'; import { useFullScreen } from '../../../../../../hooks/useFullScreen'; diff --git a/packages/website/src/app/tools/tankopedia/[id]/components/Model/MetaSection/components/Votes/index.tsx b/packages/website/src/app/tools/tankopedia/[id]/components/Model/MetaSection/components/Votes/index.tsx index 57846e014..d975d0387 100644 --- a/packages/website/src/app/tools/tankopedia/[id]/components/Model/MetaSection/components/Votes/index.tsx +++ b/packages/website/src/app/tools/tankopedia/[id]/components/Model/MetaSection/components/Votes/index.tsx @@ -1,9 +1,9 @@ 'use client'; +import { formatCompact } from '@blitzkit/core'; import { Flex, Heading, Skeleton, Text } from '@radix-ui/themes'; import { memo } from 'react'; import { WargamingLoginButton } from '../../../../../../../../../components/Navbar/components/WargamingLoginButton'; -import { formatCompact } from '../../../../../../../../../core/math/formatCompact'; import { useTankVotes } from '../../../../../../../../../hooks/useTankVotes'; import * as App from '../../../../../../../../../stores/app'; import * as Duel from '../../../../../../../../../stores/duel'; @@ -71,7 +71,9 @@ export const Votes = memo( {votes ? ( wargaming ? ( votes.last_updated ? ( - `You voted on ${new Date(votes.last_updated).toLocaleDateString()}` + `You voted on ${new Date( + votes.last_updated, + ).toLocaleDateString()}` ) : ( `You haven't voted yet` ) diff --git a/packages/website/src/app/tools/tankopedia/[id]/components/Model/MetaSection/index.tsx b/packages/website/src/app/tools/tankopedia/[id]/components/Model/MetaSection/index.tsx index 08c01a629..ea218c42b 100644 --- a/packages/website/src/app/tools/tankopedia/[id]/components/Model/MetaSection/index.tsx +++ b/packages/website/src/app/tools/tankopedia/[id]/components/Model/MetaSection/index.tsx @@ -11,6 +11,7 @@ import { use, useState } from 'react'; import { classIcons } from '../../../../../../../components/ClassIcon'; import { Link } from '../../../../../../../components/Link'; import { ScienceIcon } from '../../../../../../../components/ScienceIcon'; +import { tankToDuelMember } from '../../../../../../../core/blitzkit/tankToDuelMember'; import * as App from '../../../../../../../stores/app'; import * as Duel from '../../../../../../../stores/duel'; import * as TankopediaEphemeral from '../../../../../../../stores/tankopediaEphemeral'; diff --git a/packages/website/src/app/tools/tankopedia/[id]/components/Model/TankSandbox.tsx b/packages/website/src/app/tools/tankopedia/[id]/components/Model/TankSandbox.tsx index 9883c309b..a69d9b3f6 100644 --- a/packages/website/src/app/tools/tankopedia/[id]/components/Model/TankSandbox.tsx +++ b/packages/website/src/app/tools/tankopedia/[id]/components/Model/TankSandbox.tsx @@ -159,7 +159,7 @@ export const TankSandbox = forwardRef( ['accentColor']; diff --git a/packages/website/src/components/TankRowHeaderCell.tsx b/packages/website/src/components/TankRowHeaderCell.tsx index e986bcaca..88795c199 100644 --- a/packages/website/src/components/TankRowHeaderCell.tsx +++ b/packages/website/src/components/TankRowHeaderCell.tsx @@ -1,6 +1,6 @@ +import { TankDefinition } from '@blitzkit/core'; import { tankIcon } from '@blitzkit/core/src/blitzkit/tankIcon'; -import { classIcons } from '../../packages/website/src/components/ClassIcon'; -import { TankDefinition } from '../core/blitzkit/tankDefinitions'; +import { classIcons } from './ClassIcon'; import { ExperimentIcon } from './ExperimentIcon'; import { Link } from './Link'; import { StickyRowHeaderCell } from './StickyRowHeaderCell'; diff --git a/packages/website/src/components/TanksEmbed.tsx b/packages/website/src/components/TanksEmbed.tsx index db3612291..a631075e5 100644 --- a/packages/website/src/components/TanksEmbed.tsx +++ b/packages/website/src/components/TanksEmbed.tsx @@ -1,18 +1,20 @@ +import { + CompositeStatsKey, + previewCompositeStat, + TankDefinition, +} from '@blitzkit/core'; +import strings from '@blitzkit/core/lang/en-US.json'; import { amberDark, blueDark } from '@radix-ui/colors'; import { Flex, Text } from '@radix-ui/themes'; import { times } from 'lodash'; import { ReactNode } from 'react'; -import { ClassHeavy } from '../../packages/website/src/components/ClassIcon/components/ClassHeavy'; -import { ClassLight } from '../../packages/website/src/components/ClassIcon/components/ClassLight'; -import { ClassMedium } from '../../packages/website/src/components/ClassIcon/components/ClassMedium'; -import { ClassTankDestroyer } from '../../packages/website/src/components/ClassIcon/components/ClassTankDestroyer'; -import { useEmbedStateCurry } from '../../packages/website/src/stores/embedState/utilities'; import { breakdownConfig } from '../app/tools/embed/configurations/breakdown'; import { toRadiusVar } from '../app/tools/embed/utilities'; -import { TankDefinition } from '../core/blitzkit/tankDefinitions'; -import { previewCompositeStat } from '../core/statistics/compositeStats'; -import { CompositeStatsKey } from '../core/statistics/compositeStats/constants'; -import strings from '../lang/en-US.json'; +import { useEmbedStateCurry } from '../stores/embedState/utilities'; +import { ClassHeavy } from './ClassIcon/components/ClassHeavy'; +import { ClassLight } from './ClassIcon/components/ClassLight'; +import { ClassMedium } from './ClassIcon/components/ClassMedium'; +import { ClassTankDestroyer } from './ClassIcon/components/ClassTankDestroyer'; interface BreakdownEmbedWrapperProps { children: ReactNode; diff --git a/packages/website/src/core/blitz/canSplash.ts b/packages/website/src/core/blitz/canSplash.ts index e67604866..14e7c2e34 100644 --- a/packages/website/src/core/blitz/canSplash.ts +++ b/packages/website/src/core/blitz/canSplash.ts @@ -1,3 +1,5 @@ +import { ShellDefinition, ShellType } from '@blitzkit/core'; + export function canSplash(type: ShellDefinition['type']): type is ShellType.HE { return type === ShellType.HE; } diff --git a/packages/website/src/core/blitz/extractArmor.ts b/packages/website/src/core/blitz/extractArmor.ts index db5302dae..5e4b1addb 100644 --- a/packages/website/src/core/blitz/extractArmor.ts +++ b/packages/website/src/core/blitz/extractArmor.ts @@ -1,13 +1,16 @@ +import { + Hierarchy, + Sc2ReadStream, + ScgReadStream, + VertexAttribute, +} from '@blitzkit/core'; import { Accessor, Document, Node, Scene } from '@gltf-transform/core'; import { times } from 'lodash'; -import { Hierarchy, Sc2ReadStream } from '../streams/sc2'; -import { ScgReadStream } from '../streams/scg'; -import { VertexAttribute } from '../streams/scpg'; +import { readDVPLFile } from '../../../../scripts/src/core/blitz/readDVPLFile'; import { vertexAttributeGLTFName, vertexAttributeGltfVectorSizes, } from './extractModel/constants'; -import { readDVPLFile } from './readDVPLFile'; export async function extractArmor(data: string, fileName: string) { const sc2Path = `${data}/3d/Tanks/CollisionMeshes/${fileName}.sc2.dvpl`; diff --git a/packages/website/src/core/blitz/extractModel/constants.ts b/packages/website/src/core/blitz/extractModel/constants.ts index 2e560c9af..159e8c35f 100644 --- a/packages/website/src/core/blitz/extractModel/constants.ts +++ b/packages/website/src/core/blitz/extractModel/constants.ts @@ -1,5 +1,4 @@ -import { vertexAttributeVectorSizes } from '../../streams/scg'; -import { VertexAttribute } from '../../streams/scpg'; +import { VertexAttribute, vertexAttributeVectorSizes } from '@blitzkit/core'; export const vertexAttributeGLTFName: Partial> = { diff --git a/packages/website/src/core/blitz/extractModel/index.ts b/packages/website/src/core/blitz/extractModel/index.ts index 4020f00d2..c6b3c4432 100644 --- a/packages/website/src/core/blitz/extractModel/index.ts +++ b/packages/website/src/core/blitz/extractModel/index.ts @@ -1,13 +1,17 @@ +import { + Hierarchy, + Sc2ReadStream, + ScgReadStream, + Textures, + VertexAttribute, +} from '@blitzkit/core'; import { Document, Material, Node, Scene } from '@gltf-transform/core'; import { times } from 'lodash'; import { dirname } from 'path'; import { Matrix4, Quaternion, Vector3, Vector4Tuple } from 'three'; +import { readDVPLFile } from '../../../../../scripts/src/core/blitz/readDVPLFile'; import { readTexture } from '../../blitzkit/readTexture'; import { TextureMutation } from '../../blitzkit/readTexture/constants'; -import { Hierarchy, Sc2ReadStream, Textures } from '../../streams/sc2'; -import { ScgReadStream } from '../../streams/scg'; -import { VertexAttribute } from '../../streams/scpg'; -import { readDVPLFile } from '../readDVPLFile'; import { vertexAttributeGLTFName, vertexAttributeGltfVectorSizes, diff --git a/packages/website/src/core/blitz/fetchBlitz.ts b/packages/website/src/core/blitz/fetchBlitz.ts index e635c2ce2..f8d9d11cb 100644 --- a/packages/website/src/core/blitz/fetchBlitz.ts +++ b/packages/website/src/core/blitz/fetchBlitz.ts @@ -1,6 +1,5 @@ -import { assertSecret } from '@blitzkit/core'; +import { assertSecret, Region } from '@blitzkit/core'; import { EventManager } from '@blitzkit/core/src/blitzkit/eventManager'; -import { Region } from '../../constants/regions'; import { patientFetch } from '../blitzkit/patientFetch'; const RETRY_ERRORS = ['REQUEST_LIMIT_EXCEEDED', 'SOURCE_NOT_AVAILABLE']; @@ -73,7 +72,9 @@ export default function fetchBlitz( return new Promise((resolve) => { queue.push({ url: `https://api.wotblitz.${region}/wotb/${path}/?${Object.entries({ - application_id: assertSecret(process.env.WARGAMING_APPLICATION_ID), + application_id: assertSecret( + process.env.NEXT_PUBLIC_WARGAMING_APPLICATION_ID, + ), ...params, }) .filter(([_, value]) => value !== undefined) diff --git a/packages/website/src/core/blitz/generateStats.ts b/packages/website/src/core/blitz/generateStats.ts index 7dfb6115a..47ec6df83 100644 --- a/packages/website/src/core/blitz/generateStats.ts +++ b/packages/website/src/core/blitz/generateStats.ts @@ -1,5 +1,5 @@ -import calculateWN8 from '../statistics/calculateWN8'; -import { BlitzStats } from '../statistics/compositeStats/constants'; +import { BlitzStats } from '@blitzkit/core'; +import calculateWN8 from '@blitzkit/core/src/statistics/calculateWN8'; export type Stat = keyof ReturnType; diff --git a/packages/website/src/core/blitz/getAccountAchievements.ts b/packages/website/src/core/blitz/getAccountAchievements.ts index c87e34118..55a84fcd0 100644 --- a/packages/website/src/core/blitz/getAccountAchievements.ts +++ b/packages/website/src/core/blitz/getAccountAchievements.ts @@ -1,4 +1,4 @@ -import { Region } from '../../constants/regions'; +import { Region } from '@blitzkit/core'; import fetchBlitz from './fetchBlitz'; import { normalizeIds } from './normalizeIds'; diff --git a/packages/website/src/core/blitz/getAccountInfo.ts b/packages/website/src/core/blitz/getAccountInfo.ts index 50a21ee0a..cbd25b93b 100644 --- a/packages/website/src/core/blitz/getAccountInfo.ts +++ b/packages/website/src/core/blitz/getAccountInfo.ts @@ -1,5 +1,4 @@ -import { Region } from '../../constants/regions'; -import { BlitzStats } from '../statistics/compositeStats/constants'; +import { BlitzStats, Region } from '@blitzkit/core'; import fetchBlitz, { FetchBlitzParams } from './fetchBlitz'; import { normalizeIds } from './normalizeIds'; diff --git a/packages/website/src/core/blitz/getClanAccountInfo.ts b/packages/website/src/core/blitz/getClanAccountInfo.ts index 0a986eac7..e56cb05e4 100644 --- a/packages/website/src/core/blitz/getClanAccountInfo.ts +++ b/packages/website/src/core/blitz/getClanAccountInfo.ts @@ -1,4 +1,4 @@ -import { Region } from '../../constants/regions'; +import { Region } from '@blitzkit/core'; import fetchBlitz from './fetchBlitz'; import { normalizeIds } from './normalizeIds'; diff --git a/packages/website/src/core/blitz/getClanInfo.ts b/packages/website/src/core/blitz/getClanInfo.ts index 9ac36d92d..0b1a5423c 100644 --- a/packages/website/src/core/blitz/getClanInfo.ts +++ b/packages/website/src/core/blitz/getClanInfo.ts @@ -1,4 +1,4 @@ -import { Region } from '../../constants/regions'; +import { Region } from '@blitzkit/core'; import fetchBlitz from './fetchBlitz'; import { normalizeIds } from './normalizeIds'; diff --git a/packages/website/src/core/blitz/getLeagueFromScore.ts b/packages/website/src/core/blitz/getLeagueFromScore.ts index d0f881be2..ee58bcbb5 100644 --- a/packages/website/src/core/blitz/getLeagueFromScore.ts +++ b/packages/website/src/core/blitz/getLeagueFromScore.ts @@ -1,4 +1,4 @@ -import { LEAGUES } from '../../constants/leagues'; +import { LEAGUES } from '@blitzkit/core'; export function getLeagueFromScore(score: number) { return LEAGUES.find(({ minScore }) => score >= minScore)!; diff --git a/packages/website/src/core/blitz/getRatingInfo.ts b/packages/website/src/core/blitz/getRatingInfo.ts index d85a7e1d9..bcec8cc18 100644 --- a/packages/website/src/core/blitz/getRatingInfo.ts +++ b/packages/website/src/core/blitz/getRatingInfo.ts @@ -1,5 +1,5 @@ -import { RatingInfo } from '../../commands/ratingLeaderboard'; -import { Region } from '../../constants/regions'; +import { Region } from '@blitzkit/core'; +import { RatingInfo } from '../../../../bot/src/commands/ratingLeaderboard'; import { context } from '../blitzkit/context'; import { patientFetch } from '../blitzkit/patientFetch'; import regionToRegionSubdomain from './regionToRegionSubdomain'; diff --git a/packages/website/src/core/blitz/getRatingLeague.ts b/packages/website/src/core/blitz/getRatingLeague.ts index dd96cb335..8484821ff 100644 --- a/packages/website/src/core/blitz/getRatingLeague.ts +++ b/packages/website/src/core/blitz/getRatingLeague.ts @@ -1,5 +1,8 @@ -import { LeagueTop, RatingPlayer } from '../../commands/ratingLeaderboard'; -import { Region } from '../../constants/regions'; +import { Region } from '@blitzkit/core'; +import { + LeagueTop, + RatingPlayer, +} from '../../../../bot/src/commands/ratingLeaderboard'; import { context } from '../blitzkit/context'; import { patientFetch } from '../blitzkit/patientFetch'; import regionToRegionSubdomain from './regionToRegionSubdomain'; diff --git a/packages/website/src/core/blitz/getRatingNeighbors.ts b/packages/website/src/core/blitz/getRatingNeighbors.ts index 879c1e14e..e198b4ec4 100644 --- a/packages/website/src/core/blitz/getRatingNeighbors.ts +++ b/packages/website/src/core/blitz/getRatingNeighbors.ts @@ -1,5 +1,5 @@ -import { RatingNeighbors } from '../../commands/ratingLeaderboard'; -import { Region } from '../../constants/regions'; +import { Region } from '@blitzkit/core'; +import { RatingNeighbors } from '../../../../bot/src/commands/ratingLeaderboard'; import { patientFetch } from '../blitzkit/patientFetch'; import { withCORSProxy } from '../blitzkit/withCORSProxy'; import regionToRegionSubdomain from './regionToRegionSubdomain'; diff --git a/packages/website/src/core/blitz/getTankStats.ts b/packages/website/src/core/blitz/getTankStats.ts index 61e73f9e4..59526bbe6 100644 --- a/packages/website/src/core/blitz/getTankStats.ts +++ b/packages/website/src/core/blitz/getTankStats.ts @@ -1,5 +1,4 @@ -import { Region } from '../../constants/regions'; -import { TanksStats } from '../../types/tanksStats'; +import { Region, TanksStats } from '@blitzkit/core'; import fetchBlitz, { FetchBlitzParams } from './fetchBlitz'; export default async function getTankStats( diff --git a/packages/website/src/core/blitz/isValidBlitzId.ts b/packages/website/src/core/blitz/isValidBlitzId.ts index 563fbc7b5..cc992d555 100644 --- a/packages/website/src/core/blitz/isValidBlitzId.ts +++ b/packages/website/src/core/blitz/isValidBlitzId.ts @@ -1,6 +1,4 @@ -import { Region } from '../../constants/regions'; -import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; -import { idToRegion } from './idToRegion'; +import { Region, assertSecret, idToRegion } from '@blitzkit/core'; export async function isValidBlitzId(id: number, token?: string) { let region: Region; @@ -12,9 +10,9 @@ export async function isValidBlitzId(id: number, token?: string) { } const json = await fetch( - `https://api.wotblitz.${region}/wotb/account/info/?account_id=${ - id - }&application_id=${WARGAMING_APPLICATION_ID}${ + `https://api.wotblitz.${region}/wotb/account/info/?account_id=${id}&application_id=${assertSecret( + process.env.NEXT_PUBLIC_WARGAMING_APPLICATION_ID, + )}${ token === undefined ? '' : `&access_token=${token}` }&fields=account_id%2C-account_id`, ).then( diff --git a/packages/website/src/core/blitz/regionSubdomainToRegion.ts b/packages/website/src/core/blitz/regionSubdomainToRegion.ts index 066f772cd..4d6f17ddb 100644 --- a/packages/website/src/core/blitz/regionSubdomainToRegion.ts +++ b/packages/website/src/core/blitz/regionSubdomainToRegion.ts @@ -1,7 +1,7 @@ -import { Region, RegionSubdomain } from '../../constants/regions'; +import { Region, RegionSubdomain } from "@blitzkit/core"; export default function regionSubdomainToRegion( regionDomain: RegionSubdomain, ): Region { - return regionDomain === 'na' ? 'com' : regionDomain; + return regionDomain === 'na' ? 'com' : regionDomain; } diff --git a/packages/website/src/core/blitz/regionToRegionSubdomain.ts b/packages/website/src/core/blitz/regionToRegionSubdomain.ts index fe44d9dcd..1c85f0920 100644 --- a/packages/website/src/core/blitz/regionToRegionSubdomain.ts +++ b/packages/website/src/core/blitz/regionToRegionSubdomain.ts @@ -1,4 +1,4 @@ -import { Region, RegionSubdomain } from '../../constants/regions'; +import { Region, RegionSubdomain } from "@blitzkit/core"; export default function regionToRegionSubdomain( regionDomain: Region, diff --git a/packages/website/src/core/blitz/resolveTankId.ts b/packages/website/src/core/blitz/resolveTankId.ts index 125ed93f2..285ee0cb6 100644 --- a/packages/website/src/core/blitz/resolveTankId.ts +++ b/packages/website/src/core/blitz/resolveTankId.ts @@ -1,11 +1,10 @@ +import { tankDefinitions, tankNames } from '@blitzkit/core'; import { Locale } from 'discord.js'; import { go } from 'fuzzysort'; import markdownEscape from 'markdown-escape'; +import { tankNamesTechTreeOnly } from '../../../../bot/src/core/discord/autocompleteTanks'; +import { translator } from '../../../../bot/src/core/localization/translator'; import { UserError } from '../../hooks/userError'; -import { tankDefinitions } from '../blitzkit/tankDefinitions'; -import { tankNames } from '../blitzkit/tankDefinitions/tankNames'; -import { tankNamesTechTreeOnly } from '../discord/autocompleteTanks'; -import { translator } from '../localization/translator'; export default async function resolveTankId( tank: string | number, diff --git a/packages/website/src/core/blitz/searchClansAcrossRegions.ts b/packages/website/src/core/blitz/searchClansAcrossRegions.ts index 6d14f7e8d..4a7297da8 100644 --- a/packages/website/src/core/blitz/searchClansAcrossRegions.ts +++ b/packages/website/src/core/blitz/searchClansAcrossRegions.ts @@ -1,5 +1,5 @@ -import { Region } from '../../constants/regions'; -import { ClanList } from '../../types/clanList'; +import { Region } from '@blitzkit/core'; +import { ClanList } from '../../../../bot/src/types/clanList'; import fetchBlitz from './fetchBlitz'; export default async function searchClansAcrossRegions( diff --git a/packages/website/src/core/blitz/searchCurrentRatingPlayers.ts b/packages/website/src/core/blitz/searchCurrentRatingPlayers.ts index 4b5b5b2c3..0368782ae 100644 --- a/packages/website/src/core/blitz/searchCurrentRatingPlayers.ts +++ b/packages/website/src/core/blitz/searchCurrentRatingPlayers.ts @@ -1,4 +1,4 @@ -import { Region } from '../../constants/regions'; +import { Region } from '@blitzkit/core'; import { context } from '../blitzkit/context'; import regionToRegionSubdomain from './regionToRegionSubdomain'; diff --git a/packages/website/src/core/blitz/searchPlayersAcrossRegions/index.ts b/packages/website/src/core/blitz/searchPlayersAcrossRegions/index.ts index 8ca9130a7..b9a534f97 100644 --- a/packages/website/src/core/blitz/searchPlayersAcrossRegions/index.ts +++ b/packages/website/src/core/blitz/searchPlayersAcrossRegions/index.ts @@ -1,4 +1,4 @@ -import { Region } from '../../../constants/regions'; +import { Region } from '@blitzkit/core'; import fetchBlitz from '../fetchBlitz'; import { usernamePattern } from './constants'; diff --git a/packages/website/src/core/blitz/toUniqueId.ts b/packages/website/src/core/blitz/toUniqueId.ts index 53eb45c6f..3c080081a 100644 --- a/packages/website/src/core/blitz/toUniqueId.ts +++ b/packages/website/src/core/blitz/toUniqueId.ts @@ -1,4 +1,4 @@ -import { NATION_IDS } from '../../constants/nations'; +import { NATION_IDS } from "@blitzkit/core"; export function toUniqueId(nation: string, id: number) { return (id << 8) + (NATION_IDS[nation] << 4) + 1; diff --git a/packages/website/src/core/blitzkit/buildTechTreeLine.ts b/packages/website/src/core/blitzkit/buildTechTreeLine.ts index 5f7a56aea..7b9a24f43 100644 --- a/packages/website/src/core/blitzkit/buildTechTreeLine.ts +++ b/packages/website/src/core/blitzkit/buildTechTreeLine.ts @@ -1,5 +1,5 @@ +import { tankDefinitions } from '@blitzkit/core'; import { resolveAncestry } from './resolveAncestry'; -import { tankDefinitions } from './tankDefinitions'; export async function buildTechTreeLine(start: number, end: number) { const awaitedTankDefinitions = await tankDefinitions; diff --git a/packages/website/src/core/blitzkit/createBlob.ts b/packages/website/src/core/blitzkit/createBlob.ts index 2677521da..1265acba8 100644 --- a/packages/website/src/core/blitzkit/createBlob.ts +++ b/packages/website/src/core/blitzkit/createBlob.ts @@ -1,5 +1,5 @@ import { throttle } from 'lodash'; -import { FileChange } from './commitMultipleFiles'; +import { FileChange } from '../../../../scripts/src/core/github/commitMultipleFiles'; import { octokit } from './octokit'; export interface GithubChangeBlob { diff --git a/packages/website/src/core/blitzkit/filtersToDescription.ts b/packages/website/src/core/blitzkit/filtersToDescription.ts index c22714aad..ae5f4a7ee 100644 --- a/packages/website/src/core/blitzkit/filtersToDescription.ts +++ b/packages/website/src/core/blitzkit/filtersToDescription.ts @@ -1,8 +1,11 @@ +import { + StatFilters, + tankDefinitions, + Tier, + TIER_ROMAN_NUMERALS, +} from '@blitzkit/core'; import { Locale } from 'discord.js'; -import { translator } from '../localization/translator'; -import { StatFilters } from '../statistics/filterStats'; -import { Tier, tankDefinitions } from './tankDefinitions'; -import { TIER_ROMAN_NUMERALS } from './tankDefinitions/constants'; +import { translator } from '../../../../bot/src/core/localization/translator'; export async function filtersToDescription( { nation, tier, tankType, treeType, tank }: StatFilters, diff --git a/packages/website/src/core/blitzkit/flagUserActivity.ts b/packages/website/src/core/blitzkit/flagUserActivity.ts index d4f35d4e1..986e0a666 100644 --- a/packages/website/src/core/blitzkit/flagUserActivity.ts +++ b/packages/website/src/core/blitzkit/flagUserActivity.ts @@ -1,4 +1,4 @@ -import { usersDatabase } from '../../databases/users'; +import { usersDatabase } from '@blitzkit/core'; export async function flagUserActivity(blitzId: number) { await usersDatabase.user.upsert({ diff --git a/packages/website/src/core/blitzkit/getArchivedLatestSeasonNumber.ts b/packages/website/src/core/blitzkit/getArchivedLatestSeasonNumber.ts index e613eaf6d..3ede181bf 100644 --- a/packages/website/src/core/blitzkit/getArchivedLatestSeasonNumber.ts +++ b/packages/website/src/core/blitzkit/getArchivedLatestSeasonNumber.ts @@ -1,4 +1,4 @@ -import { ASSETS_REPO } from '../../constants/assets'; +import { assertSecret } from '@blitzkit/core'; import getRatingInfo from '../blitz/getRatingInfo'; interface GitHubTrees { @@ -17,7 +17,9 @@ export async function getArchivedLatestSeasonNumber() { if (ratingInfo.detail) { const regionsURL = ( (await fetch( - `https://api.github.com/repos/tresabhi/${ASSETS_REPO}/git/trees/main`, + `https://api.github.com/repos/tresabhi/${assertSecret( + process.env.NEXT_PUBLIC_ASSET_REPO, + )}/git/trees/main`, ).then((response) => response.json())) as GitHubTrees ).tree.find(({ path }) => path === 'regions')!.url; const comURL = ( diff --git a/packages/website/src/core/blitzkit/getArchivedRatingInfo.ts b/packages/website/src/core/blitzkit/getArchivedRatingInfo.ts index fb08928c4..dec923fc5 100644 --- a/packages/website/src/core/blitzkit/getArchivedRatingInfo.ts +++ b/packages/website/src/core/blitzkit/getArchivedRatingInfo.ts @@ -1,7 +1,6 @@ +import { Region, asset } from '@blitzkit/core'; import { superDecompress } from '@blitzkit/core/src/blitzkit/superDecompress'; -import { RatingInfo } from '../../commands/ratingLeaderboard'; -import { Region } from '../../constants/regions'; -import { asset } from './asset'; +import { RatingInfo } from '../../../../bot/src/commands/ratingLeaderboard'; const cache: Record< Region, diff --git a/packages/website/src/core/blitzkit/getArchivedRatingLeaderboard.ts b/packages/website/src/core/blitzkit/getArchivedRatingLeaderboard.ts index be9a5278f..0991d783c 100644 --- a/packages/website/src/core/blitzkit/getArchivedRatingLeaderboard.ts +++ b/packages/website/src/core/blitzkit/getArchivedRatingLeaderboard.ts @@ -1,6 +1,9 @@ -import { Region } from '../../constants/regions'; -import { BkrlDiscriminatedEntries, BkrlReadStream } from '../streams/bkrl'; -import { asset } from './asset'; +import { + asset, + BkrlDiscriminatedEntries, + BkrlReadStream, + Region, +} from '@blitzkit/core'; const cache: Record> = { asia: {}, diff --git a/packages/website/src/core/blitzkit/getArchivedRatingMidnightLeaderboard.ts b/packages/website/src/core/blitzkit/getArchivedRatingMidnightLeaderboard.ts index 2413c7396..150d1b100 100644 --- a/packages/website/src/core/blitzkit/getArchivedRatingMidnightLeaderboard.ts +++ b/packages/website/src/core/blitzkit/getArchivedRatingMidnightLeaderboard.ts @@ -1,6 +1,9 @@ -import { Region } from '../../constants/regions'; -import { BkrlDiscriminatedEntries, BkrlReadStream } from '../streams/bkrl'; -import { asset } from './asset'; +import { + asset, + BkrlDiscriminatedEntries, + BkrlReadStream, + Region, +} from '@blitzkit/core'; const cache: Record> = { com: {}, diff --git a/packages/website/src/core/blitzkit/getTimeDaysAgo.ts b/packages/website/src/core/blitzkit/getTimeDaysAgo.ts index 0d388ddce..f1c529d9f 100644 --- a/packages/website/src/core/blitzkit/getTimeDaysAgo.ts +++ b/packages/website/src/core/blitzkit/getTimeDaysAgo.ts @@ -1,4 +1,4 @@ -import { Region } from '../../constants/regions'; +import { Region } from '@blitzkit/core'; const TIME_ZONE_MAPPINGS: Record = { com: -5, // Central North American Time diff --git a/packages/website/src/core/blitzkit/hasEquipment.ts b/packages/website/src/core/blitzkit/hasEquipment.ts index 6177456d9..e0a36e0ed 100644 --- a/packages/website/src/core/blitzkit/hasEquipment.ts +++ b/packages/website/src/core/blitzkit/hasEquipment.ts @@ -1,5 +1,5 @@ import { equipmentDefinitions } from '@blitzkit/core/src/blitzkit/equipmentDefinitions'; -import { EquipmentMatrix } from '../../../packages/website/src/stores/duel'; +import { EquipmentMatrix } from '../../stores/duel'; export async function hasEquipment( id: number, diff --git a/packages/website/src/core/blitzkit/linkBlitzAndDiscord.ts b/packages/website/src/core/blitzkit/linkBlitzAndDiscord.ts index 045dc80bd..813ea0aab 100644 --- a/packages/website/src/core/blitzkit/linkBlitzAndDiscord.ts +++ b/packages/website/src/core/blitzkit/linkBlitzAndDiscord.ts @@ -1,4 +1,4 @@ -import { usersDatabase } from '../../databases/users'; +import { usersDatabase } from '@blitzkit/core'; import { flagUserActivity } from './flagUserActivity'; export async function linkBlitzAndDiscord(discordId: bigint, blitzId: number) { diff --git a/packages/website/src/core/blitzkit/octokit.ts b/packages/website/src/core/blitzkit/octokit.ts index d11356b62..9078fb23f 100644 --- a/packages/website/src/core/blitzkit/octokit.ts +++ b/packages/website/src/core/blitzkit/octokit.ts @@ -1,6 +1,6 @@ +import { assertSecret } from '@blitzkit/core'; import { throttling } from '@octokit/plugin-throttling'; import { Octokit } from '@octokit/rest'; -import { assertSecret } from '../../../packages/core/src/blitzkit/assertSecret'; Octokit.plugin(throttling); diff --git a/packages/website/src/core/blitzkit/parseBkni.ts b/packages/website/src/core/blitzkit/parseBkni.ts index feec1ae08..bf864354d 100644 --- a/packages/website/src/core/blitzkit/parseBkni.ts +++ b/packages/website/src/core/blitzkit/parseBkni.ts @@ -1,7 +1,5 @@ -import getBkniPercentile, { - BKNI_COLORS, - BkniPercentile, -} from '../statistics/getBkniPercentile'; +import { BKNI_COLORS, BkniPercentile } from '@blitzkit/core'; +import getBkniPercentile from '@blitzkit/core/src/statistics/getBkniPercentile'; export function parseBkni(bkni: number) { const bkniFraction = (bkni + 1) / 2; diff --git a/packages/website/src/core/blitzkit/processes.ts b/packages/website/src/core/blitzkit/processes.ts index ffbf7816f..698ddfada 100644 --- a/packages/website/src/core/blitzkit/processes.ts +++ b/packages/website/src/core/blitzkit/processes.ts @@ -1,5 +1,5 @@ -import { usersDatabase } from '../../databases/users'; -import { client } from '../discord/client'; +import { usersDatabase } from '@blitzkit/core'; +import { client } from '../../../../bot/src/core/discord/client'; const EXIT_EVENTS = [ 'beforeExit', diff --git a/packages/website/src/core/blitzkit/readTexture/index.ts b/packages/website/src/core/blitzkit/readTexture/index.ts index eb64496d2..89c9a0cc8 100644 --- a/packages/website/src/core/blitzkit/readTexture/index.ts +++ b/packages/website/src/core/blitzkit/readTexture/index.ts @@ -1,8 +1,7 @@ +import { DdsReadStream, PvrReadStream } from '@blitzkit/core'; import { existsSync } from 'fs'; import sharp from 'sharp'; -import { readDVPLFile } from '../../blitz/readDVPLFile'; -import { DdsReadStream } from '../../streams/dds'; -import { PvrReadStream } from '../../streams/pvr'; +import { readDVPLFile } from '../../../../../scripts/src/core/blitz/readDVPLFile'; import { TextureMutation } from './constants'; export async function readTexture(path: string, mutation?: TextureMutation) { diff --git a/packages/website/src/core/blitzkit/resolveAncestry.ts b/packages/website/src/core/blitzkit/resolveAncestry.ts index 980c67894..9d919eff5 100644 --- a/packages/website/src/core/blitzkit/resolveAncestry.ts +++ b/packages/website/src/core/blitzkit/resolveAncestry.ts @@ -1,4 +1,4 @@ -import { tankDefinitions } from './tankDefinitions'; +import { tankDefinitions } from '@blitzkit/core'; export async function resolveAncestry(id: number) { const awaitedTankDefinitions = await tankDefinitions; diff --git a/packages/website/src/core/blitzkit/resolveReload.ts b/packages/website/src/core/blitzkit/resolveReload.ts index c9c2b9840..22aa30bc5 100644 --- a/packages/website/src/core/blitzkit/resolveReload.ts +++ b/packages/website/src/core/blitzkit/resolveReload.ts @@ -1,4 +1,4 @@ -import { GunDefinition } from './tankDefinitions'; +import { GunDefinition } from '@blitzkit/core'; export function resolveReload(gun: GunDefinition) { if (gun.type === 'regular') { diff --git a/packages/website/src/core/blitzkit/tankToCompareMember.ts b/packages/website/src/core/blitzkit/tankToCompareMember.ts index 663eecc73..d63c95cfb 100644 --- a/packages/website/src/core/blitzkit/tankToCompareMember.ts +++ b/packages/website/src/core/blitzkit/tankToCompareMember.ts @@ -1,7 +1,7 @@ +import { TankDefinition } from '@blitzkit/core'; import { ProvisionDefinitions } from '@blitzkit/core/src/blitzkit/provisionDefinitions'; import { uniqueId } from 'lodash'; -import { CompareMember } from '../../../packages/website/src/stores/compareEphemeral'; -import { TankDefinition } from './tankDefinitions'; +import { CompareMember } from '../../stores/compareEphemeral'; import { tankToDuelMember } from './tankToDuelMember'; export function tankToCompareMember( diff --git a/packages/website/src/core/blitzstars/getBlitzStarsLinkButton.ts b/packages/website/src/core/blitzstars/getBlitzStarsLinkButton.ts index da2074adc..0152b36e4 100644 --- a/packages/website/src/core/blitzstars/getBlitzStarsLinkButton.ts +++ b/packages/website/src/core/blitzstars/getBlitzStarsLinkButton.ts @@ -1,6 +1,6 @@ -import { Region } from '../../constants/regions'; +import { Region } from '@blitzkit/core'; +import buttonLink from '../../../../bot/src/core/discord/buttonLink'; import { getAccountInfo } from '../blitz/getAccountInfo'; -import buttonLink from '../discord/buttonLink'; export async function getBlitzStarsLinkButton( region: Region, diff --git a/packages/website/src/core/blitzstars/getPlayerHistories.ts b/packages/website/src/core/blitzstars/getPlayerHistories.ts index c34834c53..3a0c7440f 100644 --- a/packages/website/src/core/blitzstars/getPlayerHistories.ts +++ b/packages/website/src/core/blitzstars/getPlayerHistories.ts @@ -1,11 +1,10 @@ -import { emptyAllStats } from '@blitzkit/core/src/blitzstars/getStatsInPeriod/constants'; -import { Region } from '../../constants/regions'; +import { Region, emptyAllStats } from '@blitzkit/core'; import { GetHistoriesOptions, Histories, History, getHistoriesDefaultOptions, -} from '../../types/histories'; +} from '../../../../bot/src/types/histories'; import { getAccountInfo } from '../blitz/getAccountInfo'; import { PlayerStats } from './getPlayerStats'; diff --git a/packages/website/src/core/blitzstars/getPlayerStats.ts b/packages/website/src/core/blitzstars/getPlayerStats.ts index 1ba54703a..0cd37eda4 100644 --- a/packages/website/src/core/blitzstars/getPlayerStats.ts +++ b/packages/website/src/core/blitzstars/getPlayerStats.ts @@ -1,5 +1,4 @@ -import { Region } from '../../constants/regions'; -import { BlitzStats } from '../statistics/compositeStats/constants'; +import { BlitzStats, Region } from '@blitzkit/core'; interface IndividualPlayerStats { clan: { clan_id: number; name: string; tag: string }; diff --git a/packages/website/src/core/blitzstars/tankAverages.ts b/packages/website/src/core/blitzstars/tankAverages.ts index a6b0b5bd4..251c62a57 100644 --- a/packages/website/src/core/blitzstars/tankAverages.ts +++ b/packages/website/src/core/blitzstars/tankAverages.ts @@ -1,6 +1,5 @@ +import { BlitzStats, tankDefinitions } from '@blitzkit/core'; import { context } from '../blitzkit/context'; -import { tankDefinitions } from '../blitzkit/tankDefinitions'; -import { BlitzStats } from '../statistics/compositeStats/constants'; interface SpecialStats { winrate: number; diff --git a/packages/website/src/core/github/assetCommit.ts b/packages/website/src/core/github/assetCommit.ts index e415fbee2..550abaf64 100644 --- a/packages/website/src/core/github/assetCommit.ts +++ b/packages/website/src/core/github/assetCommit.ts @@ -1,5 +1,4 @@ -import { assertSecret } from '../../../packages/core/src/blitzkit/assertSecret'; -import { ASSETS_REPO } from '../../constants/assets'; +import { assertSecret } from '@blitzkit/core'; import { GithubChangeBlob, createBlob } from '../blitzkit/createBlob'; import { octokit } from '../blitzkit/octokit'; @@ -10,11 +9,15 @@ export class AssetCommit { async add(path: string, content: string, encoding: 'utf-8' | 'base64') { console.log(`Blob: adding ${path}...`); - const blob = await createBlob('tresabhi', ASSETS_REPO, { - content, - encoding, - path, - }); + const blob = await createBlob( + 'tresabhi', + assertSecret(process.env.NEXT_PUBLIC_ASSET_REPO), + { + content, + encoding, + path, + }, + ); this.blobs.push(blob!); } @@ -25,14 +28,14 @@ export class AssetCommit { const latestCommitSha = ( await octokit.git.getRef({ owner: 'tresabhi', - repo: ASSETS_REPO, + repo: assertSecret(process.env.NEXT_PUBLIC_ASSET_REPO), ref: `heads/${assertSecret(process.env.NEXT_PUBLIC_ASSET_BRANCH)}`, }) ).data.object.sha; const treeSha = ( await octokit.git.getCommit({ owner: 'tresabhi', - repo: ASSETS_REPO, + repo: assertSecret(process.env.NEXT_PUBLIC_ASSET_REPO), commit_sha: latestCommitSha, }) ).data.tree.sha; @@ -40,20 +43,20 @@ export class AssetCommit { const { data: treeData } = await octokit.git.createTree({ owner: 'tresabhi', - repo: ASSETS_REPO, + repo: assertSecret(process.env.NEXT_PUBLIC_ASSET_REPO), base_tree: treeSha, tree: blobs, }); const { data: newCommitData } = await octokit.git.createCommit({ owner: 'tresabhi', - repo: ASSETS_REPO, + repo: assertSecret(process.env.NEXT_PUBLIC_ASSET_REPO), message: this.message, tree: treeData.sha, parents: [latestCommitSha], }); await octokit.git.updateRef({ owner: 'tresabhi', - repo: ASSETS_REPO, + repo: assertSecret(process.env.NEXT_PUBLIC_ASSET_REPO), ref: `heads/${assertSecret(process.env.NEXT_PUBLIC_ASSET_BRANCH)}`, sha: newCommitData.sha, }); diff --git a/packages/website/src/hooks/useAppliedEquipments.ts b/packages/website/src/hooks/useAppliedEquipments.ts index d88aa3097..2c48c433a 100644 --- a/packages/website/src/hooks/useAppliedEquipments.ts +++ b/packages/website/src/hooks/useAppliedEquipments.ts @@ -1,5 +1,5 @@ -import { EquipmentMatrix } from '../../packages/website/src/stores/duel'; -import { EquipmentPreset } from '../core/blitzkit/equipmentDefinitions'; +import { EquipmentPreset } from '@blitzkit/core'; +import { EquipmentMatrix } from '../stores/duel'; export function useAppliedEquipments( matrix: EquipmentMatrix, diff --git a/packages/website/src/hooks/useAveragesExclusionRatio.ts b/packages/website/src/hooks/useAveragesExclusionRatio.ts index 46fa4a838..60bf9dc10 100644 --- a/packages/website/src/hooks/useAveragesExclusionRatio.ts +++ b/packages/website/src/hooks/useAveragesExclusionRatio.ts @@ -1,5 +1,5 @@ +import { averageDefinitions } from '@blitzkit/core'; import { use } from 'react'; -import { averageDefinitions } from '../core/blitzkit/averageDefinitions'; import { discoveredIdsDefinitions } from '../core/blitzkit/discoveredIdDefinitions'; export function useAveragesExclusionRatio() { diff --git a/packages/website/src/hooks/useEccentricity.ts b/packages/website/src/hooks/useEccentricity.ts index 92c723089..39603159d 100644 --- a/packages/website/src/hooks/useEccentricity.ts +++ b/packages/website/src/hooks/useEccentricity.ts @@ -1,10 +1,7 @@ +import { TankDefinition, tankDefinitions } from '@blitzkit/core'; import { sumBy } from 'lodash'; import { use, useMemo } from 'react'; -import * as Duel from '../../packages/website/src/stores/duel'; -import { - TankDefinition, - tankDefinitions, -} from '../core/blitzkit/tankDefinitions'; +import * as Duel from '../stores/duel'; export enum UseEccentricityMode { Tier, diff --git a/packages/website/src/hooks/useEquipmentPreset.ts b/packages/website/src/hooks/useEquipmentPreset.ts index f6d7cf9ee..59bc19baa 100644 --- a/packages/website/src/hooks/useEquipmentPreset.ts +++ b/packages/website/src/hooks/useEquipmentPreset.ts @@ -1,4 +1,4 @@ -import { equipmentDefinitions } from '../core/blitzkit/equipmentDefinitions'; +import { equipmentDefinitions } from '@blitzkit/core'; import { useAwait } from './useAwait'; export function useEquipmentPreset(preset: string) { diff --git a/packages/website/src/hooks/useProvision.ts b/packages/website/src/hooks/useProvision.ts index ce0c1984c..606c38f93 100644 --- a/packages/website/src/hooks/useProvision.ts +++ b/packages/website/src/hooks/useProvision.ts @@ -1,4 +1,4 @@ -import * as Duel from '../../packages/website/src/stores/duel'; +import * as Duel from '../stores/duel'; export function useProvision(id: number) { const provisions = Duel.use((state) => state.protagonist.provisions); diff --git a/packages/website/src/hooks/useTankVotes.ts b/packages/website/src/hooks/useTankVotes.ts index 105f3157e..dec1694e1 100644 --- a/packages/website/src/hooks/useTankVotes.ts +++ b/packages/website/src/hooks/useTankVotes.ts @@ -1,7 +1,7 @@ import { useEffect, useState } from 'react'; -import * as App from '../../packages/website/src/stores/app'; import { TankVotes } from '../app/api/tank-voting/[id]/average/route'; import { unwrapBlitzkitResponse } from '../core/blitzkit/unwrapBlitzkitResponse'; +import * as App from '../stores/app'; export interface BlitzkitResponseError { status: 'error'; diff --git a/packages/website/src/stores/comparePersistent.ts b/packages/website/src/stores/comparePersistent.ts index fa4522873..edd9b632c 100644 --- a/packages/website/src/stores/comparePersistent.ts +++ b/packages/website/src/stores/comparePersistent.ts @@ -1,9 +1,9 @@ 'use client'; +import { createNextSafeStore } from '@blitzkit/core'; import { merge } from 'lodash'; import { create } from 'zustand'; import { persist, subscribeWithSelector } from 'zustand/middleware'; -import { createNextSafeStore } from '../core/zustand/createNextSafeStore'; export type DeltaMode = 'none' | 'percentage' | 'absolute'; export interface ComparePersistent { diff --git a/packages/website/src/stores/embedState/index.ts b/packages/website/src/stores/embedState/index.ts index 01fd2c82e..efbb26870 100644 --- a/packages/website/src/stores/embedState/index.ts +++ b/packages/website/src/stores/embedState/index.ts @@ -1,8 +1,8 @@ 'use client'; +import { createNextSafeStore } from '@blitzkit/core'; import * as radixColors from '@radix-ui/colors'; import { create } from 'zustand'; -import { createNextSafeStore } from '../../core/zustand/createNextSafeStore'; import { EmbedConfigItemType, EmbedItemType, @@ -22,8 +22,19 @@ export type RadixTextColor = | Exclude | 'gray' | undefined; -export type RadixColorVariantRaw = - `${1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12}`; +export type RadixColorVariantRaw = `${ + | 1 + | 2 + | 3 + | 4 + | 5 + | 6 + | 7 + | 8 + | 9 + | 10 + | 11 + | 12}`; export type RadixColorVariant = `${'' | 'a'}${RadixColorVariantRaw}`; export type RadixColor = Exclude< keyof typeof radixColors, diff --git a/packages/website/src/stores/session.ts b/packages/website/src/stores/session.ts index 5afd3da61..de1c6a7af 100644 --- a/packages/website/src/stores/session.ts +++ b/packages/website/src/stores/session.ts @@ -1,12 +1,14 @@ 'use client'; +import { + IndividualTankStats, + Region, + createNextSafeStore, +} from '@blitzkit/core'; import { merge } from 'lodash'; import { create } from 'zustand'; import { persist } from 'zustand/middleware'; -import { Region } from '../constants/regions'; import { Stat } from '../core/blitz/generateStats'; -import { createNextSafeStore } from '../core/zustand/createNextSafeStore'; -import { IndividualTankStats } from '../types/tanksStats'; interface SessionBase { columns: Stat[]; diff --git a/packages/website/src/stores/tankFilters.ts b/packages/website/src/stores/tankFilters.ts index 404864dd3..1181617f3 100644 --- a/packages/website/src/stores/tankFilters.ts +++ b/packages/website/src/stores/tankFilters.ts @@ -1,6 +1,6 @@ 'use client'; -import { Tier, createNextSafeStore } from '@blitzkit/core'; +import { TankClass, Tier, TreeType, createNextSafeStore } from '@blitzkit/core'; import { create } from 'zustand'; export interface TankFilters { diff --git a/packages/website/src/stores/tankPerformancePersistent/index.ts b/packages/website/src/stores/tankPerformancePersistent/index.ts index 6cebe3476..69f33d5a7 100644 --- a/packages/website/src/stores/tankPerformancePersistent/index.ts +++ b/packages/website/src/stores/tankPerformancePersistent/index.ts @@ -1,9 +1,9 @@ 'use client'; +import { createNextSafeStore } from '@blitzkit/core'; import { merge } from 'lodash'; import { create } from 'zustand'; import { persist, subscribeWithSelector } from 'zustand/middleware'; -import { createNextSafeStore } from '../../core/zustand/createNextSafeStore'; import { PlayerCountPeriod } from './constants'; export interface TankPerformancePersistent { diff --git a/packages/website/src/stores/tankPerformanceSort/index.ts b/packages/website/src/stores/tankPerformanceSort/index.ts index 86893965d..ec00ed774 100644 --- a/packages/website/src/stores/tankPerformanceSort/index.ts +++ b/packages/website/src/stores/tankPerformanceSort/index.ts @@ -1,7 +1,7 @@ 'use client'; +import { createNextSafeStore } from '@blitzkit/core'; import { create } from 'zustand'; -import { createNextSafeStore } from '../../core/zustand/createNextSafeStore'; import { TankPerformanceSortTypeNames } from './constants'; export type TankPerformanceSortType = keyof typeof TankPerformanceSortTypeNames; diff --git a/packages/website/src/stores/tankopediaEphemeral.ts b/packages/website/src/stores/tankopediaEphemeral.ts index b7fb5bea4..22c1922a2 100644 --- a/packages/website/src/stores/tankopediaEphemeral.ts +++ b/packages/website/src/stores/tankopediaEphemeral.ts @@ -1,10 +1,12 @@ 'use client'; -import { createNextSafeStore } from '@blitzkit/core'; +import { createNextSafeStore, ModelDefinition } from '@blitzkit/core'; import { Vector3 } from 'three'; import { create } from 'zustand'; import { subscribeWithSelector } from 'zustand/middleware'; import { XP_MULTIPLIERS } from '../app/tools/tankopedia/[id]/components/Model/TechTreeSection'; +import { ArmorType } from '../components/Armor/components/SpacedArmorScene'; +import { ExternalModuleVariant } from '../components/Armor/components/SpacedArmorSceneComponent'; interface TankopediaEphemeral { shot?: Shot; diff --git a/packages/website/src/stores/tankopediaPersistent/index.ts b/packages/website/src/stores/tankopediaPersistent/index.ts index 48c2900de..fe53e8a8e 100644 --- a/packages/website/src/stores/tankopediaPersistent/index.ts +++ b/packages/website/src/stores/tankopediaPersistent/index.ts @@ -1,6 +1,6 @@ 'use client'; -import { createNextSafeStore } from '@blitzkit/core'; +import { createNextSafeStore, TankClass, Tier, TreeType } from '@blitzkit/core'; import { merge } from 'lodash'; import { create } from 'zustand'; import { persist, subscribeWithSelector } from 'zustand/middleware'; diff --git a/packages/website/tsconfig.json b/packages/website/tsconfig.json index 8fe71658b..4082f16a5 100644 --- a/packages/website/tsconfig.json +++ b/packages/website/tsconfig.json @@ -1,30 +1,3 @@ { - "compilerOptions": { - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": false, - "noEmit": true, - "incremental": true, - "module": "esnext", - "esModuleInterop": true, - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "plugins": [ - { - "name": "next" - } - ] - }, - "include": [ - "next-env.d.ts", - "dist/website/types/**/*.ts", - "**/*.ts", - "**/*.tsx", - "../core/src/blitz/permanentSkills.tsx", - "../core/src/types/proto.d.ts" -, "../core/src/blitzkit/degressiveStat.ts", "../core/src/blitzkit/progressiveStat.ts", "../core/src/blitzkit/normalizeBoundingBox.ts", "../core/src/blitzkit/unionBoundingBox.ts", "../core/src/blitzkit/resolveDpm.ts" ], - "exclude": ["node_modules"] + "extends": "../../tsconfig.json" } diff --git a/tsconfig.json b/tsconfig.json index 9947ec45d..e313e2813 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -20,77 +20,6 @@ } ] }, - "include": [ - "src/**/*", - "scripts/**/*", - "dist/website/types/**/*.ts", - "packages/website/src/stores", - "packages/core/src/imgur/imgur.ts", - "packages/core/src/blitzkit/assertSecret.ts", - "packages/website/src/components/icons", - "packages/website/src/components/BlitzkitButtonGray.tsx", - "packages/website/src/components/Patreon.tsx", - "packages/website/src/components/Wargaming.tsx", - "packages/core/src/patreon/patreonLoginUrl.ts", - "packages/website/src/app/components/Footer", - "packages/website/src/components/Navbar", - "packages/website/src/components/Party3.tsx", - "packages/website/src/components/PageWrapper.tsx", - "packages/core/src/blitzkit/gameDefinitions.ts", - "packages/core/src/zustand/createNextSafeStore.tsx", - "packages/core/src/blitzkit/superDecompress.ts", - "packages/core/src/blitzkit/superCompress.ts", - "packages/website/src/components/ClassIcon", - "packages/core/src/blitzkit/asset.ts", - "packages/core/src/blitzkit/fetchCdonLz4.ts", - "packages/core/src/blitz/resolveNearPenetration.ts", - "packages/core/src/blitzkit/modelDefinitions.ts", - "packages/core/src/blitzkit/camouflageDefinitions.ts", - "packages/core/src/blitzkit/filterTank.ts", - "packages/core/src/blitzkit/tankIcon.ts", - "packages/core/src/blitzkit/consumableDefinitions.ts", - "packages/core/src/blitzkit/eventManager.ts", - "packages/core/src/blitzkit/provisionDefinitions.ts", - "packages/core/src/radix/var.ts", - "packages/core/src/blitzkit/equipmentDefinitions.ts", - "packages/website/src/components/Armor", - "packages/website/types/glsl.d.ts", - "packages/core/src/blitzkit/uniqueGuns.ts", - "packages/core/src/blitzkit/averageDefinitions", - "packages/core/src/protobuf", - "packages/core/src/blitzstars/getStatsInPeriod", - "packages/core/src/statistics/percentiles.ts", - "packages/core/src/math", - "packages/website/src/components/EquipmentManager.tsx", - "packages/website/src/components/ModuleButtons", - "packages/core/src/blitzkit/availableProvisions.ts", - "packages/website/src/components/ProvisionsManager.tsx", - "packages/website/src/components/ModuleManager.tsx", - "packages/website/src/components/CrewSkillManager.tsx", - "packages/website/src/components/ConsumablesManager.tsx", - "packages/core/src/blitzkit/checkConsumableProvisionInclusivity.ts", - "packages/core/src/blitzkit/skillDefinitions.ts", - "packages/core/src/blitzkit/createDefaultSkills.ts", - "packages/core/src/blitzkit/tankCharacteristics.ts", - "packages/core/src/blitzkit/coefficient.ts", - "packages/core/src/blitzkit/sum.ts", - "packages/core/src/blitzkit/resolvePenetrationCoefficient.ts", - "packages/core/src/blitzkit/isExplosive.ts", - "packages/core/src/blitzkit/reviews.ts", - "packages/core/src/blitzkit/youtubers.ts", - "packages/core/src/blitzkit/modelTransform.ts", - "packages/core/src/databases", - "packages/bot/src/index.ts", - "packages/bot/src/stitches.config.ts", - "packages/bot/src/types/writable.ts", - "packages/website/types/urlon.d.ts", - "packages/core/src/types/tanksStats.ts", - "packages/core/src/types/proto.d.ts", - "packages/bot/src/types/possiblyPromise.ts", - "packages/bot/src/types/histories.ts", - "packages/bot/src/types/ttf.d.ts", - "packages/bot/src/types/clanList.ts", - "packages/core/src/blitz/regions.ts" -, "packages/bot/src/core/radix/radixColors.ts", "packages/bot/src/core/discord/colors.ts", "packages/core/src/blitz/equipmentPrice.ts", "packages/core/src/blitz/leagues.ts", "packages/core/src/blitz/rating.ts", "packages/core/src/blitz/nations.ts", "packages/scripts/src/buildAssets", "packages/scripts/src/applyPatches.ts", "packages/scripts/src/averages.ts", "packages/scripts/src/buildRatingLeaderboard.ts", "packages/scripts/src/discoverIds.ts", "packages/scripts/src/downloadZipClient.ts", "packages/scripts/src/reviews.ts", "packages/scripts/src/setupDepotDownloader.ts", "packages/scripts/src/sitemap.ts" ], - "exclude": ["node_modules/**/*", "dist", "scripts"] + "include": ["packages/**/*"], + "exclude": ["node_modules/**/*", "dist"] }