From d8ac0b2ef60ad8e4047101e5029c81868c04fba6 Mon Sep 17 00:00:00 2001 From: tresabhi Date: Sun, 9 Jul 2023 17:49:11 +0000 Subject: [PATCH] feat: added order to getDiffedTankStats --- src/commands/eligible.ts | 10 +++---- src/core/blitz/sumStats.ts | 2 +- ...nkStatsDiffed.ts => getDiffedTankStats.ts} | 28 +++++++++++++----- src/core/blitzstars/getPlayerHistories.ts | 2 +- src/core/blitzstars/getTankHistories.ts | 2 +- src/core/blitzstars/playerAverage.ts | 2 +- src/renderers/fullStats.tsx | 10 +++---- src/renderers/stats.tsx | 10 +++---- src/renderers/today.tsx | 29 ++++++++----------- 9 files changed, 51 insertions(+), 44 deletions(-) rename src/core/blitzstars/{getTankStatsDiffed.ts => getDiffedTankStats.ts} (80%) diff --git a/src/commands/eligible.ts b/src/commands/eligible.ts index 2df78fe04..fa1364c2b 100644 --- a/src/commands/eligible.ts +++ b/src/commands/eligible.ts @@ -3,9 +3,9 @@ import calculateWN8 from '../core/blitz/calculateWN8.js'; import getWargamingResponse from '../core/blitz/getWargamingResponse.js'; import sumStats from '../core/blitz/sumStats.js'; import { tankopedia } from '../core/blitz/tankopedia.js'; +import getDiffedTankStats from '../core/blitzstars/getDiffedTankStats.js'; import getPeriodNow from '../core/blitzstars/getPeriodNow.js'; import getPeriodStart from '../core/blitzstars/getPeriodStart.js'; -import getTankStatsDiffed from '../core/blitzstars/getTankStatsDiffed.js'; import { tankAverages } from '../core/blitzstars/tankAverages.js'; import addUsernameChoices from '../core/discord/addUsernameChoices.js'; import embedNegative from '../core/discord/embedNegative.js'; @@ -59,13 +59,13 @@ export const eligibleCommand: CommandRegistry = { let body = ''; if (clan === 'SKLLD') { - const tankStatsOverTime = await getTankStatsDiffed( + const { diffed } = await getDiffedTankStats( server, id, getPeriodStart('30'), getPeriodNow(), ); - const entries = Object.entries(tankStatsOverTime); + const entries = Object.entries(diffed); const stats = sumStats(entries.map(([, stats]) => stats)); const averageTier = (await entries.reduce>( @@ -116,7 +116,7 @@ export const eligibleCommand: CommandRegistry = { const tankId = parseInt(tankIdString); if ((await tankopedia)[tankId]?.tier === 10) { - const tankStats = tankStatsOverTime[tankId]; + const tankStats = diffed[tankId]; return (await accumulator) + tankStats.damage_dealt; } else return accumulator; }, @@ -127,7 +127,7 @@ export const eligibleCommand: CommandRegistry = { const tankId = parseInt(tankIdString); if ((await tankopedia)[tankId]?.tier === 10) { - const tankStats = tankStatsOverTime[tankId]; + const tankStats = diffed[tankId]; return (await accumulator) + tankStats.battles; } else return accumulator; }, diff --git a/src/core/blitz/sumStats.ts b/src/core/blitz/sumStats.ts index 10b2095a0..31bf53d6f 100644 --- a/src/core/blitz/sumStats.ts +++ b/src/core/blitz/sumStats.ts @@ -1,5 +1,5 @@ import { AllStats } from '../../types/accountInfo.js'; -import { emptyAllStats } from '../blitzstars/getTankStatsDiffed.js'; +import { emptyAllStats } from '../blitzstars/getDiffedTankStats.js'; export default function sumStats(allStatsCollection: AllStats[]) { return allStatsCollection.reduce((accumulated, current) => { diff --git a/src/core/blitzstars/getTankStatsDiffed.ts b/src/core/blitzstars/getDiffedTankStats.ts similarity index 80% rename from src/core/blitzstars/getTankStatsDiffed.ts rename to src/core/blitzstars/getDiffedTankStats.ts index 513f7f21c..208b816ad 100644 --- a/src/core/blitzstars/getTankStatsDiffed.ts +++ b/src/core/blitzstars/getDiffedTankStats.ts @@ -34,7 +34,7 @@ export const emptyTankHistoryNode: TankHistoryRaw = { all: emptyAllStats, }; -export default async function getTankStatsDiffed( +export default async function getDiffedTankStats( server: BlitzServer, id: number, start: number, @@ -46,26 +46,27 @@ export default async function getTankStatsDiffed( // sort them even though most won't be used const tankSortedHistory: Record = {}; - const tankIds: number[] = []; + const tanks: number[] = []; history.forEach((node) => { if (!tankSortedHistory[node.tank_id]) { tankSortedHistory[node.tank_id] = [node]; - tankIds.push(node.tank_id); + tanks.push(node.tank_id); } else { tankSortedHistory[node.tank_id].push(node); } }); // find the ones played within the range - const tankIdsInRange = tankIds.filter((tankId) => + const inRangeTanks = tanks.filter((tankId) => tankSortedHistory[tankId].some( (node) => node.last_battle_time > start && node.last_battle_time < end, ), ); + const playedTanks: number[] = []; // fetch history node right before "start" and right before "end" - const tanksBeforeAndAfter: Record = {}; - tankIdsInRange.forEach((tankId) => { + const diffed: Record = {}; + inRangeTanks.forEach((tankId) => { const sortedHistory = tankSortedHistory[tankId]; const previousIndex = sortedHistory.findIndex((node) => node.last_battle_time > start) - 1; @@ -81,7 +82,7 @@ export default async function getTankStatsDiffed( // check if there was a change in battles as games in ratings do update last_battle_time if (diff((a) => a.battles) > 0) { - tanksBeforeAndAfter[tankId] = { + diffed[tankId] = { battles: diff((a) => a.battles), capture_points: diff((a) => a.capture_points), damage_dealt: diff((a) => a.damage_dealt), @@ -100,8 +101,19 @@ export default async function getTankStatsDiffed( wins: diff((a) => a.wins), xp: diff((a) => a.xp), }; + + playedTanks.push(tankId); } }); - return tanksBeforeAndAfter; + const order = playedTanks.sort((a, b) => { + const aHistories = tankSortedHistory[a]; + const bHistories = tankSortedHistory[b]; + const aLatest = aHistories[aHistories.length - 1]; + const bLatest = bHistories[bHistories.length - 1]; + + return bLatest.last_battle_time - aLatest.last_battle_time; + }); + + return { diffed, order }; } diff --git a/src/core/blitzstars/getPlayerHistories.ts b/src/core/blitzstars/getPlayerHistories.ts index 72e6aa852..fcbf625be 100644 --- a/src/core/blitzstars/getPlayerHistories.ts +++ b/src/core/blitzstars/getPlayerHistories.ts @@ -8,7 +8,7 @@ import { } from '../../types/histories.js'; import getWargamingResponse from '../blitz/getWargamingResponse.js'; import { WARGAMING_APPLICATION_ID } from '../node/arguments.js'; -import { emptyAllStats } from './getTankStatsDiffed.js'; +import { emptyAllStats } from './getDiffedTankStats.js'; export interface PlayerHistoryRaw { clan: { clan_id: number; name: string; tag: string }; diff --git a/src/core/blitzstars/getTankHistories.ts b/src/core/blitzstars/getTankHistories.ts index 4e69e198c..b2a7aa713 100644 --- a/src/core/blitzstars/getTankHistories.ts +++ b/src/core/blitzstars/getTankHistories.ts @@ -6,7 +6,7 @@ import { getHistoriesDefaultOptions, } from '../../types/histories.js'; import getTankStats from '../blitz/getTankStats.js'; -import { emptyAllStats } from './getTankStatsDiffed.js'; +import { emptyAllStats } from './getDiffedTankStats.js'; export interface TankHistory extends History { tank_id: number; diff --git a/src/core/blitzstars/playerAverage.ts b/src/core/blitzstars/playerAverage.ts index f2206d83c..4f79f77af 100644 --- a/src/core/blitzstars/playerAverage.ts +++ b/src/core/blitzstars/playerAverage.ts @@ -1,5 +1,5 @@ import sumStats from '../blitz/sumStats.js'; -import { emptyAllStats } from './getTankStatsDiffed.js'; +import { emptyAllStats } from './getDiffedTankStats.js'; import { tankAverages } from './tankAverages.js'; console.log('Calculating player average...'); diff --git a/src/renderers/fullStats.tsx b/src/renderers/fullStats.tsx index 9c40c557e..698d8794a 100644 --- a/src/renderers/fullStats.tsx +++ b/src/renderers/fullStats.tsx @@ -10,7 +10,7 @@ import getWargamingResponse from '../core/blitz/getWargamingResponse.js'; import resolveTankName from '../core/blitz/resolveTankName.js'; import sumStats from '../core/blitz/sumStats.js'; import { Tier, tankopedia } from '../core/blitz/tankopedia.js'; -import getTankStatsDiffed from '../core/blitzstars/getTankStatsDiffed.js'; +import getDiffedTankStats from '../core/blitzstars/getDiffedTankStats.js'; import { tankAverages } from '../core/blitzstars/tankAverages.js'; import { ResolvedPeriod } from '../core/discord/resolvePeriodFromCommand.js'; import { ResolvedPlayer } from '../core/discord/resolvePlayerFromCommand.js'; @@ -50,13 +50,13 @@ export default async function fullStats( image = (await tankopedia)[tankId!]?.images.normal; } - const tankStats = await getTankStatsDiffed(server, id, start, end); + const { diffed } = await getDiffedTankStats(server, id, start, end); let stats: AllStats; let supplementaryStats: SupplementaryStats; let tierWeights: TierWeightsRecord; if (type === 'player') { - const entries = Object.entries(tankStats); + const entries = Object.entries(diffed); stats = sumStats(entries.map(([, stats]) => stats)); const battlesOfTanksWithAverages = await entries.reduce< PossiblyPromise @@ -124,10 +124,10 @@ export default async function fullStats( {}, ); } else { - stats = tankStats[tankId!]; + stats = diffed[tankId!]; supplementaryStats = { - WN8: calculateWN8((await tankAverages)[tankId!].all, tankStats[tankId!]), + WN8: calculateWN8((await tankAverages)[tankId!].all, diffed[tankId!]), tier: (await tankopedia)[tankId!]?.tier, }; } diff --git a/src/renderers/stats.tsx b/src/renderers/stats.tsx index 6027869e1..314bf7077 100644 --- a/src/renderers/stats.tsx +++ b/src/renderers/stats.tsx @@ -10,7 +10,7 @@ import getWargamingResponse from '../core/blitz/getWargamingResponse.js'; import resolveTankName from '../core/blitz/resolveTankName.js'; import sumStats from '../core/blitz/sumStats.js'; import { Tier, tankopedia } from '../core/blitz/tankopedia.js'; -import getTankStatsDiffed from '../core/blitzstars/getTankStatsDiffed.js'; +import getDiffedTankStats from '../core/blitzstars/getDiffedTankStats.js'; import { tankAverages } from '../core/blitzstars/tankAverages.js'; import { ResolvedPeriod } from '../core/discord/resolvePeriodFromCommand.js'; import { ResolvedPlayer } from '../core/discord/resolvePlayerFromCommand.js'; @@ -52,13 +52,13 @@ export default async function stats( image = (await tankopedia)[tankId!]?.images.normal; } - const tankStats = await getTankStatsDiffed(server, id, start, end); + const { diffed } = await getDiffedTankStats(server, id, start, end); let stats: AllStats | undefined; let supplementaryStats: SupplementaryStats; let tierWeights: TierWeightsRecord; if (type === 'player') { - const entries = Object.entries(tankStats); + const entries = Object.entries(diffed); stats = sumStats(entries.map(([, stats]) => stats)); const battlesOfTanksWithAverages = await entries.reduce< PossiblyPromise @@ -126,11 +126,11 @@ export default async function stats( {}, ); } else { - stats = tankStats[tankId!]; + stats = diffed[tankId!]; supplementaryStats = { WN8: stats - ? calculateWN8((await tankAverages)[tankId!].all, tankStats[tankId!]) + ? calculateWN8((await tankAverages)[tankId!].all, diffed[tankId!]) : undefined, tier: (await tankopedia)[tankId!]?.tier, }; diff --git a/src/renderers/today.tsx b/src/renderers/today.tsx index e36dbbce6..62fd19504 100644 --- a/src/renderers/today.tsx +++ b/src/renderers/today.tsx @@ -10,8 +10,8 @@ import getWargamingResponse from '../core/blitz/getWargamingResponse.js'; import resolveTankName from '../core/blitz/resolveTankName.js'; import sumStats from '../core/blitz/sumStats.js'; import { tankopedia } from '../core/blitz/tankopedia.js'; +import getDiffedTankStats from '../core/blitzstars/getDiffedTankStats.js'; import getPeriodNow from '../core/blitzstars/getPeriodNow.js'; -import getTankStatsDiffed from '../core/blitzstars/getTankStatsDiffed.js'; import getTimeDaysAgo from '../core/blitzstars/getTimeDaysAgo.js'; import { tankAverages } from '../core/blitzstars/tankAverages.js'; import { ResolvedPlayer } from '../core/discord/resolvePlayerFromCommand.js'; @@ -22,7 +22,7 @@ import { PossiblyPromise } from '../types/possiblyPromise.js'; // TODO: sort tanks by last played export default async function today({ server, id }: ResolvedPlayer) { - const tankStatsOverTime = await getTankStatsDiffed( + const { diffed, order } = await getDiffedTankStats( server, id, getTimeDaysAgo(0), @@ -40,7 +40,7 @@ export default async function today({ server, id }: ResolvedPlayer) { }; const allStatsToAccumulate: AllStats[] = []; - Object.entries(tankStatsOverTime).forEach(([, tankStats]) => { + Object.entries(diffed).forEach(([, tankStats]) => { allStatsToAccumulate.push(tankStats); }); Object.entries(careerTankStatsRaw).forEach(([, tankStats]) => { @@ -49,11 +49,11 @@ export default async function today({ server, id }: ResolvedPlayer) { const accumulatedStats = sumStats(allStatsToAccumulate); - if (Object.keys(tankStatsOverTime).length > 0) { - tankStatsOverTime[0] = accumulatedStats; + if (Object.keys(diffed).length > 0) { + diffed[0] = accumulatedStats; } - const tankStatsOverTimeEntries = Object.entries(tankStatsOverTime); + const tankStatsOverTimeEntries = Object.entries(diffed); const todayWN8s = await tankStatsOverTimeEntries.reduce< PossiblyPromise> >(async (accumulator, [tankIdString, tankStats]) => { @@ -86,12 +86,12 @@ export default async function today({ server, id }: ResolvedPlayer) { todayWN8s[0] = todayWN8sEntries.reduce( (accumulator, [tankIdString, wn8]) => - accumulator + wn8 * tankStatsOverTime[Number(tankIdString)].battles, + accumulator + wn8 * diffed[Number(tankIdString)].battles, 0, ) / todayWN8sEntries.reduce( (accumulator, [tankIdString]) => - accumulator + tankStatsOverTime[Number(tankIdString)].battles, + accumulator + diffed[Number(tankIdString)].battles, 0, ); careerWN8s[0] = @@ -111,8 +111,8 @@ export default async function today({ server, id }: ResolvedPlayer) { ); const rows = await Promise.all( - tankStatsOverTimeEntries.map(async ([tankIdString, tankStats], index) => { - const tankId = parseInt(tankIdString); + [0, ...order].map(async (tankId, index) => { + const tankStats = diffed[tankId]; const career = careerStats[tankId]; return ( @@ -120,9 +120,7 @@ export default async function today({ server, id }: ResolvedPlayer) { isListing={tankId !== 0} minimized={index > 4} key={tankId} - name={ - tankId === 0 ? 'Total' : await resolveTankName(Number(tankIdString)) - } + name={tankId === 0 ? 'Total' : await resolveTankName(tankId)} winrate={tankStats.wins / tankStats.battles} careerWinrate={career.wins / career.battles} WN8={isNaN(todayWN8s[tankId]) ? undefined : todayWN8s[tankId]} @@ -132,10 +130,7 @@ export default async function today({ server, id }: ResolvedPlayer) { battles={tankStats.battles} careerBattles={career.battles} icon={ - tankId === 0 - ? undefined - : (await tankopedia)[tankIdString as unknown as number]?.images - .normal + tankId === 0 ? undefined : (await tankopedia)[tankId]?.images.normal } /> );