diff --git a/src/commands/today.tsx b/src/commands/today.tsx index 0029ace74..8f24e2f64 100644 --- a/src/commands/today.tsx +++ b/src/commands/today.tsx @@ -1,29 +1,9 @@ import { SlashCommandBuilder } from 'discord.js'; -import * as Breakdown from '../components/Breakdown/index.js'; -import NoData, { NoDataType } from '../components/NoData.js'; -import PoweredByBlitzStars from '../components/PoweredByBlitzStars.js'; -import TitleBar from '../components/TitleBar.js'; -import Wrapper from '../components/Wrapper.js'; -import { BLITZ_SERVERS } from '../constants/servers.js'; import usernameAutocomplete from '../core/autocomplete/username.js'; -import getTankStats from '../core/blitz/getTankStats.js'; -import getWN8 from '../core/blitz/getWN8.js'; -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 getTankStatsOverTime from '../core/blitzstars/getTankStatsOverTime.js'; -import getTimeDaysAgo from '../core/blitzstars/getTimeDaysAgo.js'; -import { tankAverages } from '../core/blitzstars/tankAverages.js'; -import fullBlitzStarsStats from '../core/interaction/fullBlitzStarsStats.js'; -import { supportBlitzStars } from '../core/interaction/supportBlitzStars.js'; import addUsernameOption from '../core/options/addUsernameOption.js'; import resolvePlayer from '../core/options/resolvePlayer.js'; -import { WARGAMING_APPLICATION_ID } from '../core/process/args.js'; import { CommandRegistry } from '../events/interactionCreate.js'; -import { AccountInfo, AllStats } from '../types/accountInfo.js'; -import { PlayerClanData } from '../types/playerClanData.js'; -import getPeriodNow from '../core/blitzstars/getPeriodNow.js'; +import today from '../renderers/today.js'; export default { inProduction: true, @@ -36,148 +16,9 @@ export default { .addStringOption(addUsernameOption), async execute(interaction) { - const { id, server } = await resolvePlayer(interaction); - const tankStatsOverTime = await getTankStatsOverTime( - server, - id, - getTimeDaysAgo(0), - getPeriodNow(), - ); - const accountInfo = await getWargamingResponse( - `https://api.wotblitz.${server}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, - ); - const clanData = await getWargamingResponse( - `https://api.wotblitz.${server}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}&extra=clan`, - ); - const careerTankStatsRaw = await getTankStats(server, id); - const careerStats: Record = { - 0: accountInfo[id].statistics.all, - }; - const allStatsToAccumulate: AllStats[] = []; + const player = await resolvePlayer(interaction); - Object.entries(tankStatsOverTime).forEach(([, tankStats]) => { - allStatsToAccumulate.push(tankStats); - }); - Object.entries(careerTankStatsRaw).forEach(([, tankStats]) => { - careerStats[tankStats.tank_id] = tankStats.all; - }); - - const accumulatedStats = sumStats(allStatsToAccumulate); - - if (Object.keys(tankStatsOverTime).length > 0) { - tankStatsOverTime[0] = accumulatedStats; - } - - const tankStatsOverTimeEntries = Object.entries(tankStatsOverTime); - const todayWN8s = tankStatsOverTimeEntries.reduce>( - (accumulator, [tankIdString, tankStats]) => { - const tankId = Number(tankIdString); - - return tankId === 0 || tankAverages[tankId] === undefined - ? accumulator - : { - ...accumulator, - [tankId]: getWN8(tankAverages[tankId].all, tankStats), - }; - }, - {}, - ); - const careerWN8s = careerTankStatsRaw.reduce>( - (accumulator, { tank_id }) => { - return tank_id === 0 || tankAverages[tank_id] === undefined - ? accumulator - : { - ...accumulator, - [tank_id]: getWN8( - tankAverages[tank_id].all, - careerStats[tank_id], - ), - }; - }, - {}, - ); - const todayWN8sEntries = Object.entries(todayWN8s); - const careerWN8sEntries = Object.entries(careerWN8s); - - todayWN8s[0] = - todayWN8sEntries.reduce( - (accumulator, [tankIdString, wn8]) => - accumulator + wn8 * tankStatsOverTime[Number(tankIdString)].battles, - 0, - ) / - todayWN8sEntries.reduce( - (accumulator, [tankIdString]) => - accumulator + tankStatsOverTime[Number(tankIdString)].battles, - 0, - ); - careerWN8s[0] = - careerWN8sEntries.reduce( - (accumulator, [tankIdString, WN8]) => - isNaN(WN8) - ? accumulator - : accumulator + WN8 * careerStats[Number(tankIdString)].battles, - 0, - ) / - careerWN8sEntries.reduce( - (accumulator, [tankIdString, WN8]) => - isNaN(WN8) - ? accumulator - : accumulator + careerStats[Number(tankIdString)].battles, - 0, - ); - - const rows = tankStatsOverTimeEntries.map(([tankIdString, tankStats]) => { - const tankId = Number(tankIdString); - const career = careerStats[tankId]; - - return ( - - ); - }); - - return [ - - - - {rows.length === 0 && } - {rows.length > 0 && {rows}} - - - , - fullBlitzStarsStats(server, accountInfo[id].nickname), - supportBlitzStars, - ]; + return await today(player); }, autocomplete: usernameAutocomplete, diff --git a/src/renderers/today.tsx b/src/renderers/today.tsx new file mode 100644 index 000000000..77650cb6b --- /dev/null +++ b/src/renderers/today.tsx @@ -0,0 +1,159 @@ +import * as Breakdown from '../components/Breakdown/index.js'; +import NoData, { NoDataType } from '../components/NoData.js'; +import PoweredByBlitzStars from '../components/PoweredByBlitzStars.js'; +import TitleBar from '../components/TitleBar.js'; +import Wrapper from '../components/Wrapper.js'; +import { BLITZ_SERVERS } from '../constants/servers.js'; +import getTankStats from '../core/blitz/getTankStats.js'; +import getWN8 from '../core/blitz/getWN8.js'; +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 getPeriodNow from '../core/blitzstars/getPeriodNow.js'; +import getTankStatsOverTime from '../core/blitzstars/getTankStatsOverTime.js'; +import getTimeDaysAgo from '../core/blitzstars/getTimeDaysAgo.js'; +import { tankAverages } from '../core/blitzstars/tankAverages.js'; +import { ResolvedPlayer } from '../core/options/resolvePlayer.js'; +import { WARGAMING_APPLICATION_ID } from '../core/process/args.js'; +import { AccountInfo, AllStats } from '../types/accountInfo.js'; +import { PlayerClanData } from '../types/playerClanData.js'; + +export default async function today({ server, id }: ResolvedPlayer) { + const tankStatsOverTime = await getTankStatsOverTime( + server, + id, + getTimeDaysAgo(0), + getPeriodNow(), + ); + const accountInfo = await getWargamingResponse( + `https://api.wotblitz.${server}/wotb/account/info/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}`, + ); + const clanData = await getWargamingResponse( + `https://api.wotblitz.${server}/wotb/clans/accountinfo/?application_id=${WARGAMING_APPLICATION_ID}&account_id=${id}&extra=clan`, + ); + const careerTankStatsRaw = await getTankStats(server, id); + const careerStats: Record = { + 0: accountInfo[id].statistics.all, + }; + const allStatsToAccumulate: AllStats[] = []; + + Object.entries(tankStatsOverTime).forEach(([, tankStats]) => { + allStatsToAccumulate.push(tankStats); + }); + Object.entries(careerTankStatsRaw).forEach(([, tankStats]) => { + careerStats[tankStats.tank_id] = tankStats.all; + }); + + const accumulatedStats = sumStats(allStatsToAccumulate); + + if (Object.keys(tankStatsOverTime).length > 0) { + tankStatsOverTime[0] = accumulatedStats; + } + + const tankStatsOverTimeEntries = Object.entries(tankStatsOverTime); + const todayWN8s = tankStatsOverTimeEntries.reduce>( + (accumulator, [tankIdString, tankStats]) => { + const tankId = Number(tankIdString); + + return tankId === 0 || tankAverages[tankId] === undefined + ? accumulator + : { + ...accumulator, + [tankId]: getWN8(tankAverages[tankId].all, tankStats), + }; + }, + {}, + ); + const careerWN8s = careerTankStatsRaw.reduce>( + (accumulator, { tank_id }) => { + return tank_id === 0 || tankAverages[tank_id] === undefined + ? accumulator + : { + ...accumulator, + [tank_id]: getWN8(tankAverages[tank_id].all, careerStats[tank_id]), + }; + }, + {}, + ); + const todayWN8sEntries = Object.entries(todayWN8s); + const careerWN8sEntries = Object.entries(careerWN8s); + + todayWN8s[0] = + todayWN8sEntries.reduce( + (accumulator, [tankIdString, wn8]) => + accumulator + wn8 * tankStatsOverTime[Number(tankIdString)].battles, + 0, + ) / + todayWN8sEntries.reduce( + (accumulator, [tankIdString]) => + accumulator + tankStatsOverTime[Number(tankIdString)].battles, + 0, + ); + careerWN8s[0] = + careerWN8sEntries.reduce( + (accumulator, [tankIdString, WN8]) => + isNaN(WN8) + ? accumulator + : accumulator + WN8 * careerStats[Number(tankIdString)].battles, + 0, + ) / + careerWN8sEntries.reduce( + (accumulator, [tankIdString, WN8]) => + isNaN(WN8) + ? accumulator + : accumulator + careerStats[Number(tankIdString)].battles, + 0, + ); + + const rows = tankStatsOverTimeEntries.map(([tankIdString, tankStats]) => { + const tankId = Number(tankIdString); + const career = careerStats[tankId]; + + return ( + + ); + }); + + return ( + + + + {rows.length === 0 && } + {rows.length > 0 && {rows}} + + + + ); +}