From a12f969251dcd387405128e7f49e1cdb969102bc Mon Sep 17 00:00:00 2001 From: tresabhi Date: Thu, 1 Jun 2023 18:36:39 +0000 Subject: [PATCH] feat: wm8 and average tier calculation --- src/commands/debug.ts | 40 ++--- src/commands/stats.tsx | 92 ++++++------ src/commands/tankstats.tsx | 73 +++------ src/commands/today.tsx | 2 +- src/components/GenericAllStats.tsx | 44 ++++++ src/components/GenericStats/index.tsx | 4 +- src/core/blitz/getWN8.ts | 45 ++++++ src/core/blitz/tankopedia.ts | 158 ++++---------------- src/core/blitzstars/getPeriodStart.ts | 10 +- src/core/blitzstars/getPlayerStats.ts | 15 -- src/core/blitzstars/getTankStatsOverTime.ts | 4 +- src/core/blitzstars/tankaverages.ts | 90 +++++++++++ src/types/accountInfo.ts | 13 +- src/types/playerStats.ts | 23 --- src/types/statistics.ts | 30 ---- 15 files changed, 315 insertions(+), 328 deletions(-) create mode 100644 src/components/GenericAllStats.tsx create mode 100644 src/core/blitz/getWN8.ts delete mode 100644 src/core/blitzstars/getPlayerStats.ts create mode 100644 src/core/blitzstars/tankaverages.ts delete mode 100644 src/types/playerStats.ts delete mode 100644 src/types/statistics.ts diff --git a/src/commands/debug.ts b/src/commands/debug.ts index b18d676fc..a33a18f1f 100644 --- a/src/commands/debug.ts +++ b/src/commands/debug.ts @@ -1,8 +1,10 @@ -import { EmbedBuilder, SlashCommandBuilder } from 'discord.js'; +import { SlashCommandBuilder } from 'discord.js'; import packageJSON from '../../package.json' assert { type: 'json' }; -import { ACCENT_COLOR } from '../constants/colors.js'; import { tankopedia } from '../core/blitz/tankopedia.js'; +import { tankAverages } from '../core/blitzstars/tankaverages.js'; +import cleanTable from '../core/interaction/cleanTable.js'; import cmdName from '../core/interaction/cmdName.js'; +import infoEmbed from '../core/interaction/infoEmbed.js'; import getClientId from '../core/process/getClientId.js'; import { CommandRegistry } from '../events/interactionCreate.js'; import { client } from '../index.js'; @@ -24,22 +26,24 @@ export default { await interaction.editReply({ embeds: [ - new EmbedBuilder() - .setTitle(`${client.user?.username} debug information`) - .setColor(ACCENT_COLOR) - .setDescription( - `**Version**: ${packageJSON.version}\n**Uptime**: ${Math.floor( - uptime / 1000 / 60 / 60 / 24, - )}d ${Math.floor((uptime / 1000 / 60 / 60) % 24)}h ${Math.floor( - (uptime / 1000 / 60) % 60, - )}m ${Math.floor((uptime / 1000) % 60)}s ${Math.floor( - uptime % 1000, - )}ms\n**Tankopedia**: ${ - tankopedia ? 'cached' : 'not cached' - }\n**Client ID**: ${getClientId()}\n**Tag**: ${ - interaction.client.user.tag - }`, - ), + infoEmbed( + `${client.user?.username} debug information`, + cleanTable([ + ['Version', packageJSON.version], + ['Client ID', getClientId()], + ['Tag', interaction.client.user.tag], + [ + 'Uptime', + `${Math.floor(uptime / 1000 / 60 / 60 / 24)}d ${Math.floor( + (uptime / 1000 / 60 / 60) % 24, + )}h ${Math.floor((uptime / 1000 / 60) % 60)}m ${Math.floor( + (uptime / 1000) % 60, + )}s ${Math.floor(uptime % 1000)}ms`, + ], + ['Tankopedia cached', `${tankopedia !== undefined}`], + ['Tank averages cached', `${tankAverages !== undefined}`], + ]), + ), ], }); diff --git a/src/commands/stats.tsx b/src/commands/stats.tsx index 13e2078bc..ecb3c6465 100644 --- a/src/commands/stats.tsx +++ b/src/commands/stats.tsx @@ -3,7 +3,7 @@ import { ButtonBuilder, SlashCommandBuilder, } from 'discord.js'; -import GenericStats from '../components/GenericStats/index.js'; +import GenericAllStats from '../components/GenericAllStats.js'; import NoBattlesInPeriod from '../components/NoBattlesInPeriod.js'; import PoweredByBlitzStars from '../components/PoweredByBlitzStars.js'; import TitleBar from '../components/TitleBar.js'; @@ -11,11 +11,14 @@ import Wrapper from '../components/Wrapper.js'; import { BLITZ_SERVERS } from '../constants/servers.js'; import usernameAutocomplete from '../core/autocomplete/username.js'; import getBlitzAccount from '../core/blitz/getBlitzAccount.js'; +import getWN8 from '../core/blitz/getWN8.js'; import getWargamingResponse from '../core/blitz/getWargamingResponse.js'; import sumStats from '../core/blitz/sumStats.js'; +import { tankopedia } from '../core/blitz/tankopedia.js'; import getPeriodNow from '../core/blitzstars/getPeriodNow.js'; import getPeriodicStart from '../core/blitzstars/getPeriodStart.js'; import getTankStatsOverTime from '../core/blitzstars/getTankStatsOverTime.js'; +import { tankAverages } from '../core/blitzstars/tankaverages.js'; import cmdName from '../core/interaction/cmdName.js'; import fullBlitzStarsStats from '../core/interaction/fullBlitzStarsStats.js'; import { supportBlitzStars } from '../core/interaction/supportBlitzStars.js'; @@ -27,12 +30,16 @@ import addUsernameOption from '../core/options/addUsernameOption.js'; import { args } from '../core/process/args.js'; import render from '../core/ui/render.js'; import { CommandRegistry } from '../events/interactionCreate.js'; -import { AccountInfo, AllStats } from '../types/accountInfo.js'; +import { + AccountInfo, + AllStats, + SupplementaryStats, +} from '../types/accountInfo.js'; import { PlayerClanData } from '../types/playerClanData.js'; export default { inProduction: true, - inDevelopment: false, + inDevelopment: true, inPublic: true, command: new SlashCommandBuilder() @@ -53,20 +60,41 @@ export default { `https://api.wotblitz.${server}/wotb/clans/accountinfo/?application_id=${args['wargaming-application-id']}&account_id=${id}&extra=clan`, ); let stats: AllStats; + let supplementaryStats: SupplementaryStats | undefined; if (period === 'career') { stats = accountInfo[id].statistics.all; } else { - stats = sumStats( - Object.entries( - await getTankStatsOverTime( - server, - id, - getPeriodicStart(period), - getPeriodNow(), - ), - ).map(([, stats]) => stats), + const tankStatsOverTime = await getTankStatsOverTime( + server, + id, + getPeriodicStart(period), + getPeriodNow(), ); + const entries = Object.entries(tankStatsOverTime); + const totalBattles = entries.reduce( + (accumulator, [, stats]) => accumulator + stats.battles, + 0, + ); + + supplementaryStats = { + tier: + entries.reduce((accumulator, [tankIdString, stats]) => { + const tankId = Number(tankIdString); + const tankTier = tankopedia[tankId].tier; + + return accumulator + tankTier * stats.battles; + }, 0) / totalBattles, + wn8: + entries.reduce((accumulator, [tankIdString, stats]) => { + const tankId = Number(tankIdString); + const tankWn8 = getWN8(tankAverages[tankId].all, stats); + + return accumulator + tankWn8 * stats.battles; + }, 0) / totalBattles, + }; + + stats = sumStats(entries.map(([, stats]) => stats)); } const image = await render( @@ -88,43 +116,9 @@ export default { {stats.battles === 0 && } {stats.battles > 0 && ( - )} diff --git a/src/commands/tankstats.tsx b/src/commands/tankstats.tsx index 61a10c796..3edcf380b 100644 --- a/src/commands/tankstats.tsx +++ b/src/commands/tankstats.tsx @@ -3,7 +3,7 @@ import { ButtonBuilder, SlashCommandBuilder, } from 'discord.js'; -import GenericStats from '../components/GenericStats/index.js'; +import GenericAllStats from '../components/GenericAllStats.js'; import NoBattlesInPeriod from '../components/NoBattlesInPeriod.js'; import PoweredByBlitzStars from '../components/PoweredByBlitzStars.js'; import TitleBar from '../components/TitleBar.js'; @@ -12,6 +12,7 @@ import { BLITZ_SERVERS } from '../constants/servers.js'; import tanksAutocomplete from '../core/autocomplete/tanks.js'; import usernameAutocomplete from '../core/autocomplete/username.js'; import getBlitzAccount from '../core/blitz/getBlitzAccount.js'; +import getWN8 from '../core/blitz/getWN8.js'; import getWargamingResponse from '../core/blitz/getWargamingResponse.js'; import resolveTankId from '../core/blitz/resolveTankId.js'; import resolveTankName from '../core/blitz/resolveTankName.js'; @@ -21,6 +22,7 @@ import getPeriodicStart from '../core/blitzstars/getPeriodStart.js'; import getTankStatsOverTime, { emptyAllStats, } from '../core/blitzstars/getTankStatsOverTime.js'; +import { tankAverages } from '../core/blitzstars/tankaverages.js'; import cmdName from '../core/interaction/cmdName.js'; import fullBlitzStarsStats from '../core/interaction/fullBlitzStarsStats.js'; import { supportBlitzStars } from '../core/interaction/supportBlitzStars.js'; @@ -38,7 +40,7 @@ import { TanksStats } from '../types/tanksStats.js'; export default { inProduction: true, - inDevelopment: false, + inDevelopment: true, inPublic: true, command: new SlashCommandBuilder() @@ -64,28 +66,29 @@ export default { `https://api.wotblitz.${server}/wotb/tanks/stats/?application_id=${args['wargaming-application-id']}&account_id=${id}`, ); let stats: AllStats; + const tankId = Number(tank); if (period === 'career') { stats = - tankStats[id].find((stats) => stats.tank_id === Number(tank))?.all ?? + tankStats[id].find((stats) => stats.tank_id === tankId)?.all ?? emptyAllStats; } else { - stats = ( - await getTankStatsOverTime( - server, - id, - getPeriodicStart(period), - getPeriodNow(), - ) - )[Number(tank)]; + const tankStatsOverTime = await getTankStatsOverTime( + server, + id, + getPeriodicStart(period), + getPeriodNow(), + ); + + stats = tankStatsOverTime[tankId] ?? emptyAllStats; } const image = await render( } {stats.battles > 0 && ( - // TODO: GenericStats generator for AllStats - )} diff --git a/src/commands/today.tsx b/src/commands/today.tsx index ea84232c2..0fd76e2e6 100644 --- a/src/commands/today.tsx +++ b/src/commands/today.tsx @@ -30,7 +30,7 @@ import { TanksStats } from '../types/tanksStats.js'; export default { inProduction: true, - inDevelopment: false, + inDevelopment: true, inPublic: true, command: new SlashCommandBuilder() diff --git a/src/components/GenericAllStats.tsx b/src/components/GenericAllStats.tsx new file mode 100644 index 000000000..62039cf49 --- /dev/null +++ b/src/components/GenericAllStats.tsx @@ -0,0 +1,44 @@ +import { AllStats, SupplementaryStats } from '../types/accountInfo.js'; +import GenericStats from './GenericStats/index.js'; + +export interface GenericAllStatsProps { + stats: AllStats; + supplementaryStats?: SupplementaryStats; +} + +export default function GenericAllStats({ + stats, + supplementaryStats, +}: GenericAllStatsProps) { + return ( + + ); +} diff --git a/src/components/GenericStats/index.tsx b/src/components/GenericStats/index.tsx index 6f55650b0..53e253e57 100644 --- a/src/components/GenericStats/index.tsx +++ b/src/components/GenericStats/index.tsx @@ -11,7 +11,9 @@ export default function GenericStats({ stats, columnCount = 2, }: GenericStatsProps) { - const filteredStats = stats.filter(([, value]) => value !== `${-Infinity}`); + const filteredStats = stats.filter( + ([, value]) => `${value}` !== `${-Infinity}`, + ); const itemsPerRow = Math.ceil(filteredStats.length / columnCount); const columns: Stat[][] = []; diff --git a/src/core/blitz/getWN8.ts b/src/core/blitz/getWN8.ts new file mode 100644 index 000000000..86da436f9 --- /dev/null +++ b/src/core/blitz/getWN8.ts @@ -0,0 +1,45 @@ +import { AllStats } from '../../types/accountInfo.js'; + +/** + * Formula from https://web.archive.org/web/20190105064817/http://wiki.wnefficiency.net/pages/WN8 + */ +export default function getWN8(expected: AllStats, average: AllStats) { + const avgDmg = average.damage_dealt / average.battles; + const avgSpot = average.spotted / average.battles; + const avgFrag = average.frags / average.battles; + const avgDef = average.dropped_capture_points / average.battles; + const avgWinRate = average.wins / average.battles; + + const expDmg = expected.damage_dealt / expected.battles; + const expSpot = expected.spotted / expected.battles; + const expFrag = expected.frags / expected.battles; + const expDef = expected.dropped_capture_points / expected.battles; + const expWinRate = expected.wins / expected.battles; + + const rDAMAGE = avgDmg / expDmg; + const rSPOT = avgSpot / expSpot; + const rFRAG = avgFrag / expFrag; + const rDEF = avgDef / expDef; + const rWIN = avgWinRate / expWinRate; + + const rWINc = Math.max(0, (rWIN - 0.71) / (1 - 0.71)); + const rDAMAGEc = Math.max(0, (rDAMAGE - 0.22) / (1 - 0.22)); + const rFRAGc = Math.max( + 0, + Math.min(rDAMAGEc + 0.2, (rFRAG - 0.12) / (1 - 0.12)), + ); + const rSPOTc = Math.max( + 0, + Math.min(rDAMAGEc + 0.1, (rSPOT - 0.38) / (1 - 0.38)), + ); + const rDEFc = Math.max(0, Math.min(rDAMAGEc + 0.1, (rDEF - 0.1) / (1 - 0.1))); + + const WN8 = + 980 * rDAMAGEc + + 210 * rDAMAGEc * rFRAGc + + 155 * rFRAGc * rSPOTc + + 75 * rDEFc * rFRAGc + + 145 * Math.min(1.8, rWINc); + + return WN8; +} diff --git a/src/core/blitz/tankopedia.ts b/src/core/blitz/tankopedia.ts index e4bd8b6ab..19d6c3df3 100644 --- a/src/core/blitz/tankopedia.ts +++ b/src/core/blitz/tankopedia.ts @@ -1,145 +1,49 @@ -import { args } from '../process/args.js'; +import { WargamingResponse } from '../../types/wargamingResponse.js'; import isDev from '../process/isDev.js'; import URLToBase64 from '../ui/URLToBase64.js'; -import getWargamingResponse from './getWargamingResponse.js'; + +/* +"1": { + "name": "T-34", + "nation": "ussr", + "is_premium": false, + "tier": 5, + "cost": { + "price_credit": 400000, + "price_gold": 0 + }, + "images": { + "preview": "/api/bs-cache/tank-icons/https%3A%2F%2Fglossary-eu-static.gcdn.co%2Ficons%2Fwotb%2Fcurrent%2Fuploaded%2Fvehicles%2Fhd_thumbnail%2FT-34.png", + "normal": "http://glossary-eu-static.gcdn.co/icons/wotb/current/uploaded/vehicles/hd/T-34.png" + }, + "tank_id": 1, + "type": "mediumTank", + "description": "The legend of the Soviet armored forces and the most widely-produced Soviet tank of World War II, with a total of 33,805 vehicles manufactured. Three variants of this model were produced at several Soviet factories from 1940 through 1944." + }, + */ export interface Tankopedia { [id: number]: { - description: string; - engines: number[]; - guns: number[]; - is_premium: boolean; name: string; nation: string; - next_tanks: { [id: number]: number }; - prices_xp: { [id: number]: number }; - suspensions: number[]; - tank_id: number; + is_premium: boolean; tier: number; - turrets: number[] | null; + cost: { price_credit: number; price_gold: number }; + images: { preview: string; normal: string }; + tank_id: number; type: string; - cost: { - price_credit: number; - price_gold: number; - }; - default_profile: { - battle_level_range_max: number; - battle_level_range_min: number; - engine_id: number; - firepower: number; - gun_id: number; - hp: number; - hull_hp: number; - hull_weight: number; - is_default: boolean; - maneuverability: number; - max_ammo: number; - max_weight: number; - profile_id: string; - protection: number; - shot_efficiency: number; - signal_range: number; - speed_backward: number; - suspension_id: number; - turret_id: number; - weight: number; - armor: { - hull: { - front: number; - rear: number; - sides: number; - }; - turret: { - front: number; - rear: number; - sides: number; - }; - }; - engine: { - fire_chance: number; - name: string; - power: number; - tier: number; - weight: number; - }; - gun: { - aim_time: number; - caliber: number; - clip_capacity: number; - clip_reload_time: number; - dispersion: number; - fire_rate: number; - move_down_arc: number; - move_up_arc: number; - name: string; - reload_time: number; - tier: number; - traverse_speed: number; - weight: number; - }; - shells: { - damage: number; - penetration: number; - type: string; - }; - suspension: { - load_limit: number; - name: string; - tier: number; - traverse_speed: number; - weight: number; - }; - turret: { - hp: number; - name: string; - tier: number; - traverse_left_arc: number; - traverse_right_arc: number; - traverse_speed: number; - view_range: number; - weight: number; - }; - }; - images: { - normal: string; - preview: string; - }; - modules_tree: { - [id: number]: { - is_default: boolean; - module_id: number; - name: string; - next_modules: number[] | null; - next_tanks: number[] | null; - price_credit: number; - price_xp: number; - type: string; - }; - }; + description: string; }; } -export interface TankopediaInfo { - achievement_sections: { [name: string]: { name: string; order: number } }; - tanks_updated_at: number; - languages: { [name: string]: string }; - vehicle_types: { [name: string]: string }; - vehicle_nations: { [name: string]: string }; - game_version: string; -} - console.log('Caching tankopedia...'); -export const tankopedia = await getWargamingResponse( - `https://api.wotblitz.com/wotb/encyclopedia/vehicles/?application_id=${args['wargaming-application-id']}`, -); +export const tankopedia = ( + (await ( + await fetch('https://www.blitzstars.com/bs-tankopedia.json') + ).json()) as WargamingResponse & { status: 'ok' } +).data; console.log('Cached tankopedia'); -console.log('Caching tankopedia info...'); -export const tankopediaInfo = await getWargamingResponse( - `https://api.wotblitz.com/wotb/encyclopedia/info/?application_id=${args['wargaming-application-id']}`, -); -console.log('Cached tankopedia info'); - /** * @deprecated */ diff --git a/src/core/blitzstars/getPeriodStart.ts b/src/core/blitzstars/getPeriodStart.ts index 8cb9c3074..916bcd9f7 100644 --- a/src/core/blitzstars/getPeriodStart.ts +++ b/src/core/blitzstars/getPeriodStart.ts @@ -3,8 +3,16 @@ import { StatPeriod } from '../options/addStatPeriodChoices.js'; export default function getPeriodicStart(period: StatPeriod) { if (period === 'career') { return -Infinity; + } else if (period === 'today') { + const now = new Date(); + now.setHours(5, 0, 0, 0); + + // If it's after 5:00 AM today, subtract one day + if (now.getTime() > Date.now()) now.setDate(now.getDate() - 1); + + return now.getTime() / 1000; } else { - const daysAgo = period === 'today' ? 0 : Number(period) - 1; + const daysAgo = Number(period) - 1; const periodStart = new Date(); periodStart.setDate(periodStart.getDate() - daysAgo); diff --git a/src/core/blitzstars/getPlayerStats.ts b/src/core/blitzstars/getPlayerStats.ts deleted file mode 100644 index 2c9d6904d..000000000 --- a/src/core/blitzstars/getPlayerStats.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { CacheType, ChatInputCommandInteraction } from 'discord.js'; -import { PlayerStats } from '../../types/playerStats.js'; - -export default async function getPlayerStats( - interaction: ChatInputCommandInteraction, - command: string, - id: number, - callback: (playerStats: PlayerStats) => void, -) { - fetch(`https://www.blitzstars.com/api/playerstats/${id}`).then( - async (response) => { - callback((await response.json()) as PlayerStats); - }, - ); -} diff --git a/src/core/blitzstars/getTankStatsOverTime.ts b/src/core/blitzstars/getTankStatsOverTime.ts index 662b41b3b..1230d7c0f 100644 --- a/src/core/blitzstars/getTankStatsOverTime.ts +++ b/src/core/blitzstars/getTankStatsOverTime.ts @@ -47,8 +47,8 @@ export type TankHistory = TankHistoryNode[]; export default async function getTankStatsOverTime( server: BlitzServer, id: number, - start = -Infinity, - end = Infinity, + start: number, + end: number, ) { const latestTankStatsRaw = await getWargamingResponse( `https://api.wotblitz.${server}/wotb/tanks/stats/?application_id=${args['wargaming-application-id']}&account_id=${id}`, diff --git a/src/core/blitzstars/tankaverages.ts b/src/core/blitzstars/tankaverages.ts new file mode 100644 index 000000000..7d6e5bce2 --- /dev/null +++ b/src/core/blitzstars/tankaverages.ts @@ -0,0 +1,90 @@ +import { AllStats } from '../../types/accountInfo.js'; + +export interface SpecialStats { + winrate: number; + damageRatio: number; + kdr: number; + damagePerBattle: number; + killsPerBattle: number; + hitsPerBattle: number; + spotsPerBattle: number; + wpm: number; + dpm: number; + kpm: number; + hitRate: number; + survivalRate: number; +} + +export type Percentiles = [ + number, + number, + number, + number, + number, + number, + number, + number, + number, +]; + +export interface SpecialPercentiles { + winRate: Percentiles; + damageRatio: Percentiles; + kdr: Percentiles; + damagePerBattle: Percentiles; + killsPerBattle: Percentiles; + hitsPerBattle: Percentiles; + spotsPerBattle: Percentiles; + wpm: Percentiles; + dpm: Percentiles; + kpm: Percentiles; + hitRate: Percentiles; + survivalRate: Percentiles; +} + +export interface MeanSd { + winrateMean: number; + winrateSd: number; + hitRateMean: number; + hitRateSd: number; + survivalRateMean: number; + survivalRateSd: number; + damageRatioMean: number; + damageRatioSd: number; + kdrMean: number; + kdrSd: number; + dpbMean: number; + dpbSd: number; + kpbMean: number; + kpbSd: number; + hpbMean: number; + hpbSd: number; + spbMean: number; + spbSd: number; +} + +export interface IndividualTankAverages { + _id: number; + battle_life_time: number; + total_battle_life_time: number; + number_of_players: number; + tank_id: number; + all: AllStats; + special: SpecialStats; + percentiles: SpecialPercentiles; + percentiles_player_count: number; + meanSd: MeanSd; + shotEff: number; + last_update: number; +} + +console.log('Caching tank averages...'); +const tankAveragesRaw = (await ( + await fetch('https://www.blitzstars.com/api/tankaverages.json') +).json()) as IndividualTankAverages[]; +export const tankAverages: Record = {}; + +Object.entries(tankAveragesRaw).forEach(([, tank]) => { + tankAverages[tank.tank_id] = tank; +}); +console.log('Tank averages cached'); diff --git a/src/types/accountInfo.ts b/src/types/accountInfo.ts index f4eceb21d..3e14adc50 100644 --- a/src/types/accountInfo.ts +++ b/src/types/accountInfo.ts @@ -18,16 +18,9 @@ export interface AllStats { dropped_capture_points: number; } -export interface SpecialStats { - winrate: number; - damageRatio: number; - kdr: number; - dpb: number; - kpb: number; - hpb: number; - spb: number; - hitRate: number; - survivalRate: number; +export interface SupplementaryStats { + wn8: number; + tier: number; } export interface ClanStats { diff --git a/src/types/playerStats.ts b/src/types/playerStats.ts deleted file mode 100644 index 5f9e31662..000000000 --- a/src/types/playerStats.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { BlitzStartsComputedPeriodicStatistics } from './statistics.js'; - -export type PlayerStats = { - clan: { - clan_id: number; - name: string; - tag: string; - }; - statistics: BlitzStartsComputedPeriodicStatistics; - _id: string; - last_battle_time: number; - nickname: string; - account_id: number; - achievements: { - account_id: string; - medalLafayettePool: number; - medalRadleyWalters: number; - warrior: number; - jointVictoryCount: number; - }; - region: string; - __v: number; -}[]; diff --git a/src/types/statistics.ts b/src/types/statistics.ts deleted file mode 100644 index 0f051d96a..000000000 --- a/src/types/statistics.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { AllStats, SpecialStats } from './accountInfo.js'; - -export interface BlitzStartsComputedPeriodicStatistics { - all: AllStats; - - wn7: number; - wn8: number; - avg_tier: number; -} - -export interface PeriodStatistics - extends BlitzStartsComputedPeriodicStatistics { - special: SpecialStats; - pwp: number; -} - -export interface PlayerPeriodicStatsCollection { - statistics: PeriodStatistics; - period30d: PeriodStatistics; - period90d: PeriodStatistics; - - _id: string; - nickname: string; - nickname_lowercase: string; - region: string; - last_battle_time: number; - __v: number; - updatedAt: string; - createdAt: string; -}