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;
-}