diff --git a/.vscode/settings.json b/.vscode/settings.json index f17372342..68ad53f7a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -21,6 +21,7 @@ "Smri", "startcase", "strvk", + "tankaverages", "tankopedia", "tankstats", "Unicum", diff --git a/package.json b/package.json index cc3539319..fcafaa25d 100644 --- a/package.json +++ b/package.json @@ -5,8 +5,8 @@ "main": "src/index.ts", "type": "module", "scripts": { - "build:bot": "yarn lint && node scripts/build --build=bot", - "build:server": "yarn lint && node scripts/build --build=server", + "build:bot": "node scripts/build --build=bot", + "build:server": "node scripts/build --build=server", "build": "yarn lint && node scripts/build --build=all", "dev:bot": "yarn build:bot --dev && yarn start:bot --dev", "dev:server": "yarn build:server --dev && yarn start:server --dev", diff --git a/scripts/build.js b/scripts/build.js index d2161ac2e..9f56eafc5 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -1,5 +1,5 @@ import { build } from 'esbuild'; -import { rmSync } from 'fs'; +import { mkdirSync, rmSync, writeFileSync } from 'fs'; import { argv } from 'process'; const isProd = !argv.includes('--dev'); @@ -7,8 +7,37 @@ const buildAll = argv.includes('--build=all'); const buildBot = argv.includes('--build=bot') | buildAll; const buildServer = argv.includes('--build=server') | buildAll; -console.log('Removing dist...'); -rmSync('dist', { recursive: true, force: true }); +if (isProd) { + // only remove in production to ensure no time is wasted in dev + console.log('Removing dist...'); + rmSync('dist', { recursive: true, force: true }); + + console.log('Creating dist...'); + mkdirSync('dist'); + + console.log('Caching tankopedia...'); + fetch('https://www.blitzstars.com/bs-tankopedia.json') + .then((response) => response.text()) + .then((tankopedia) => { + writeFileSync('./dist/tankopedia.json', tankopedia); + console.log('Tankopedia cached'); + }); + + console.log('Caching tank averages...'); + fetch('https://www.blitzstars.com/api/tankaverages.json') + .then((response) => response.json()) + .then((individualTankAverages) => { + const tankAverages = {}; + + individualTankAverages.forEach((individualTankAverage) => { + tankAverages[individualTankAverage.tank_id] = individualTankAverage; + }); + + writeFileSync('./dist/tankaverages.json', JSON.stringify(tankAverages)); + + console.log('Tank averages cached'); + }); +} const commonOptions = { platform: 'node', @@ -26,21 +55,26 @@ const commonOptions = { logLevel: isProd ? 'info' : 'silent', }; -console.log('Building...'); if (buildBot) { + console.log('Building bot...'); build({ ...commonOptions, entryPoints: ['src/bot.ts'], outfile: 'dist/bot.cjs', + }).then(() => { + console.log('Bot built'); }); } if (buildServer) { + console.log('Building server...'); build({ ...commonOptions, entryPoints: ['src/server.ts'], outfile: 'dist/server.cjs', + }).then(() => { + console.log('Server built'); }); } diff --git a/src/core/blitz/tankopedia.ts b/src/core/blitz/tankopedia.ts index a79aa6411..6e0b2678e 100644 --- a/src/core/blitz/tankopedia.ts +++ b/src/core/blitz/tankopedia.ts @@ -1,4 +1,5 @@ -import { WargamingResponse } from '../../types/wargamingResponse.js'; +import { readFileSync } from 'fs'; +import { join } from 'path'; export type TankType = 'AT-SPG' | 'lightTank' | 'mediumTank' | 'heavyTank'; @@ -18,30 +19,15 @@ export interface Tankopedia { [id: number]: TankopediaEntry; } -export const tankopedia: Tankopedia = {}; -export const TANK_IDS: number[] = []; -export const TANKS: TankopediaEntry[] = []; -export const TANK_NAMES: string[] = []; - -console.log('Caching tankopedia...'); -fetch('https://www.blitzstars.com/bs-tankopedia.json') - .then( - (response) => - response.json() as Promise< - WargamingResponse & { status: 'ok' } - >, - ) - .then((wargamingResponse) => { - Object.assign(tankopedia, wargamingResponse.data); - Object.entries(tankopedia).forEach(([idString, entry]) => { - const id = Number(idString); - - TANK_IDS.push(id); - TANKS.push(entry); - TANK_NAMES.push(entry.name); - }), - console.log('Cached tankopedia'); - }); +export const tankopedia = ( + JSON.parse( + readFileSync(join(__dirname, 'tankopedia.json')) as unknown as string, + ) as { data: Tankopedia } +).data; +const entries = Object.entries(tankopedia); +export const TANK_IDS = entries.map(([, { tank_id }]) => tank_id as number); +export const TANKS = entries.map(([, entry]) => entry as TankopediaEntry); +export const TANK_NAMES = entries.map(([, { name }]) => name); export const TANK_ICONS: Record = { 'AT-SPG': 'https://i.imgur.com/BIHSEH0.png', diff --git a/src/core/blitzstars/tankAverages.ts b/src/core/blitzstars/tankAverages.ts index 747f5a449..b5858a13b 100644 --- a/src/core/blitzstars/tankAverages.ts +++ b/src/core/blitzstars/tankAverages.ts @@ -1,3 +1,5 @@ +import { readFileSync } from 'fs'; +import { join } from 'path'; import { AllStats } from '../../types/accountInfo.js'; export interface SpecialStats { @@ -78,14 +80,8 @@ export interface IndividualTankAverage { last_update: number; } -export const tankAverages: Record = {}; +export type TankAverages = Record; -console.log('Caching tank averages...'); -fetch('https://www.blitzstars.com/api/tankaverages.json') - .then((response) => response.json() as Promise) - .then((individualTankAverages) => { - individualTankAverages.forEach((individualTankAverage) => { - tankAverages[individualTankAverage.tank_id] = individualTankAverage; - }); - console.log('Tank averages cached'); - }); +export const tankAverages = JSON.parse( + readFileSync(join(__dirname, 'tankaverages.json')) as unknown as string, +) as TankAverages; diff --git a/src/core/process/isDev.ts b/src/core/process/isDev.ts index 71a694792..3a6db04c9 100644 --- a/src/core/process/isDev.ts +++ b/src/core/process/isDev.ts @@ -3,5 +3,3 @@ const isDevBoolean = process.env.NODE_ENV === 'development'; export default function isDev() { return isDevBoolean; } - -console.log(process.env.NODE_ENV); diff --git a/src/server.ts b/src/server.ts index 857cc4937..099ce5b56 100644 --- a/src/server.ts +++ b/src/server.ts @@ -15,4 +15,4 @@ app.get('/', async (req, res) => { res.end(svg); }); -app.listen(process.env.PORT || 3000); +app.listen(process.env.PORT ?? 3000);