feat: player count

This commit is contained in:
TrèsAbhi committed 2024-06-30 20:34:22 -05:00
1 parent 1d112bb633
commit db83ac40b4
10 files changed
+49 -45

No files matched your search

+1
View File
@@ -4,6 +4,7 @@ package blitzkit;
message AverageDefinitions { message AverageDefinitions {
map<uint32, Tank> averages = 1; map<uint32, Tank> averages = 1;
uint32 players = 2;
} }
message Tank { message Tank {
+10 -4
View File
@@ -119,7 +119,7 @@ async function postWork() {
`Generating statistics based off ${includedPlayers.toLocaleString()} players (${checkedPlayers.toLocaleString()} checked in total) and ${tankIds.length} tanks...`, `Generating statistics based off ${includedPlayers.toLocaleString()} players (${checkedPlayers.toLocaleString()} checked in total) and ${tankIds.length} tanks...`,
); );
const averages: AverageDefinitions = {}; const averages: Record<number, AverageDefinitionsEntry> = {};
tankIds.forEach((id) => { tankIds.forEach((id) => {
const tanks = tanksSorted[id]; const tanks = tanksSorted[id];
@@ -170,14 +170,20 @@ async function postWork() {
averages[id] = entry as AverageDefinitionsEntry; averages[id] = entry as AverageDefinitionsEntry;
}); });
const averageDefinitions = {
averages,
players: includedPlayers,
} satisfies AverageDefinitions;
commitAssets( commitAssets(
'averages', 'averages',
[ [
{ {
path: 'definitions/averages.pb', path: 'definitions/averages.pb',
content: await encodeToBase64('blitzkit.AverageDefinitions', { content: await encodeToBase64(
averages, 'blitzkit.AverageDefinitions',
}), averageDefinitions,
),
encoding: 'base64', encoding: 'base64',
}, },
], ],
+3 -8
View File
@@ -7,14 +7,9 @@ import { getAccountInfo } from '../src/core/blitz/getAccountInfo';
import { MIN_IDS, idToRegion } from '../src/core/blitz/idToRegion'; import { MIN_IDS, idToRegion } from '../src/core/blitz/idToRegion';
import { asset } from '../src/core/blitzkit/asset'; import { asset } from '../src/core/blitzkit/asset';
import { commitAssets } from '../src/core/blitzkit/commitAssets'; import { commitAssets } from '../src/core/blitzkit/commitAssets';
import { DiscoverIdsDefinitions } from '../src/core/blitzkit/discoveredIdDefinitions';
import { DidsReadStream, DidsWriteStream } from '../src/core/streams/dids'; import { DidsReadStream, DidsWriteStream } from '../src/core/streams/dids';
export interface DiscoverIdsManifest {
time: number;
chunks: number;
count: number;
}
const CHUNK_SIZE = 2 ** 21; const CHUNK_SIZE = 2 ** 21;
const RUN_TIME = 1000 * 60 * 60 * 5.5; const RUN_TIME = 1000 * 60 * 60 * 5.5;
const PROGRESS_UPDATE_FREQUENCY = 1000 * 60; const PROGRESS_UPDATE_FREQUENCY = 1000 * 60;
@@ -31,7 +26,7 @@ const indexableRegions = [...REGIONS];
let ids: number[] = []; let ids: number[] = [];
const preDiscoveredManifest = (await fetch( const preDiscoveredManifest = (await fetch(
asset('ids/manifest.json', !production), asset('ids/manifest.json', !production),
).then((response) => response.json())) as DiscoverIdsManifest; ).then((response) => response.json())) as DiscoverIdsDefinitions;
console.log( console.log(
`Fetching ${preDiscoveredManifest.chunks} pre-discovered chunks...`, `Fetching ${preDiscoveredManifest.chunks} pre-discovered chunks...`,
@@ -163,7 +158,7 @@ function post() {
chunks: idsChunked.length, chunks: idsChunked.length,
count: ids.length, count: ids.length,
time: Date.now(), time: Date.now(),
} satisfies DiscoverIdsManifest), } satisfies DiscoverIdsDefinitions),
encoding: 'utf-8', encoding: 'utf-8',
path: 'ids/manifest.json', path: 'ids/manifest.json',
}, },
@@ -44,9 +44,6 @@ export function Header() {
<Table.ColumnHeaderCell width="0" justify="center"> <Table.ColumnHeaderCell width="0" justify="center">
Capture points Capture points
</Table.ColumnHeaderCell> </Table.ColumnHeaderCell>
<Table.ColumnHeaderCell width="0" justify="center">
Dropped capture points
</Table.ColumnHeaderCell>
</Table.Row> </Table.Row>
</Table.Header> </Table.Header>
); );
@@ -2,15 +2,11 @@
import { InfoCircledIcon } from '@radix-ui/react-icons'; import { InfoCircledIcon } from '@radix-ui/react-icons';
import { Callout, Flex } from '@radix-ui/themes'; import { Callout, Flex } from '@radix-ui/themes';
import { use, useMemo } from 'react'; import { use } from 'react';
import { averageDefinitionsArray } from '../../../../core/blitzkit/averageDefinitions'; import { averageDefinitions } from '../../../../core/blitzkit/averageDefinitions';
export function Info() { export function Info() {
const awaitedAverageDefinitionsArray = use(averageDefinitionsArray); const awaitedAverageDefinitions = use(averageDefinitions);
const samples = useMemo(
() => awaitedAverageDefinitionsArray.reduce((a, b) => a + b.samples, 0),
[],
);
return ( return (
<Flex justify="center"> <Flex justify="center">
@@ -19,9 +15,9 @@ export function Info() {
<InfoCircledIcon /> <InfoCircledIcon />
</Callout.Icon> </Callout.Icon>
<Callout.Text> <Callout.Text>
Based on {samples.toLocaleString()} players with at least 5,000 career Based on {awaitedAverageDefinitions.players.toLocaleString()} players
battles and 1 battle in the past 120 days. Stats displayed as an with at least 5,000 career battles and 1 battle in the past 120 days.
average per battle. Updated daily. Player counts are less than real values. Updated daily.
</Callout.Text> </Callout.Text>
</Callout.Root> </Callout.Root>
</Flex> </Flex>
@@ -4,12 +4,12 @@ import { times } from 'lodash';
export function RowLoader() { export function RowLoader() {
return ( return (
<Table.Row> <Table.Row>
<Table.RowHeaderCell> <Table.RowHeaderCell align="center">
<Skeleton height="100%" width="128px" /> <Skeleton height="100%" width="128px" />
</Table.RowHeaderCell> </Table.RowHeaderCell>
{times(14, (index) => ( {times(13, (index) => (
<Table.Cell key={index}> <Table.Cell key={index} align="center">
<Skeleton height="1em" width="32px" /> <Skeleton height="1em" width="32px" />
</Table.Cell> </Table.Cell>
))} ))}
@@ -1,5 +1,5 @@
import { Table } from '@radix-ui/themes'; import { Table } from '@radix-ui/themes';
import { memo, use } from 'react'; import { memo, use, useMemo } from 'react';
import { TankRowHeaderCell } from '../../../../components/TankRowHeaderCell'; import { TankRowHeaderCell } from '../../../../components/TankRowHeaderCell';
import { averageDefinitions } from '../../../../core/blitzkit/averageDefinitions'; import { averageDefinitions } from '../../../../core/blitzkit/averageDefinitions';
import { TankDefinition } from '../../../../core/blitzkit/tankDefinitions'; import { TankDefinition } from '../../../../core/blitzkit/tankDefinitions';
@@ -11,7 +11,11 @@ interface TankRowProps {
export const TankRow = memo<TankRowProps>( export const TankRow = memo<TankRowProps>(
({ tank }) => { ({ tank }) => {
const awaitedAverageDefinitions = use(averageDefinitions); const awaitedAverageDefinitions = use(averageDefinitions);
const averages = awaitedAverageDefinitions[tank.id]; const averages = awaitedAverageDefinitions.averages[tank.id];
const numberFormat = useMemo(
() => Intl.NumberFormat(undefined, { notation: 'compact' }),
[],
);
return ( return (
<Table.Row> <Table.Row>
@@ -20,7 +24,7 @@ export const TankRow = memo<TankRowProps>(
{Math.round(averages.mu.wins * 100)}% {Math.round(averages.mu.wins * 100)}%
</Table.Cell> </Table.Cell>
<Table.Cell align="center"> <Table.Cell align="center">
{averages.samples.toLocaleString()} {numberFormat.format(Math.round(averages.samples))}
</Table.Cell> </Table.Cell>
<Table.Cell align="center"> <Table.Cell align="center">
{Math.round(averages.mu.damage_dealt).toLocaleString()} {Math.round(averages.mu.damage_dealt).toLocaleString()}
@@ -47,9 +51,6 @@ export const TankRow = memo<TankRowProps>(
<Table.Cell align="center"> <Table.Cell align="center">
{averages.mu.capture_points.toFixed(2)} {averages.mu.capture_points.toFixed(2)}
</Table.Cell> </Table.Cell>
<Table.Cell align="center">
{averages.mu.dropped_capture_points.toFixed(2)}
</Table.Cell>
</Table.Row> </Table.Row>
); );
}, },
@@ -21,25 +21,21 @@ export interface AverageDefinitionsEntrySubPartial {
} }
export interface AverageDefinitions { export interface AverageDefinitions {
[id: number]: AverageDefinitionsEntry; averages: Record<number, AverageDefinitionsEntry>;
} players: number;
interface AverageDefinitionsProto {
averages: AverageDefinitions;
} }
export const averageDefinitions = fetch(asset('definitions/averages.pb')) export const averageDefinitions = fetch(asset('definitions/averages.pb'))
.then((response) => response.arrayBuffer()) .then((response) => response.arrayBuffer())
.then((buffer) => { .then((buffer) => {
return decode<AverageDefinitionsProto>( return decode<AverageDefinitions>(
'blitzkit.AverageDefinitions', 'blitzkit.AverageDefinitions',
new Uint8Array(buffer), new Uint8Array(buffer),
); );
}) });
.then((data) => data.averages);
export const averageDefinitionsArray = averageDefinitions.then((data) => export const averageDefinitionsArray = averageDefinitions.then((data) =>
Object.entries(data).map(([key, value]) => ({ Object.entries(data.averages).map(([key, value]) => ({
id: Number(key), id: Number(key),
...(value as AverageDefinitionsEntry), ...(value as AverageDefinitionsEntry),
})), })),
@@ -0,0 +1,12 @@
import { asset } from './asset';
import isDev from './isDev';
export interface DiscoveredIdsDefinitions {
time: number;
chunks: number;
count: number;
}
export const discoveredIdsDefinitions = fetch(
asset('ids/manifest.json', isDev()),
).then((response) => response.json() as Promise<DiscoveredIdsDefinitions>);
+2 -2
View File
@@ -1,15 +1,15 @@
import { times } from 'lodash'; import { times } from 'lodash';
import { decompress } from 'lz4js'; import { decompress } from 'lz4js';
import ProgressBar from 'progress'; import ProgressBar from 'progress';
import { DiscoverIdsManifest } from '../../../scripts/discoverIds';
import { DidsReadStream } from '../streams/dids'; import { DidsReadStream } from '../streams/dids';
import { asset } from './asset'; import { asset } from './asset';
import { DiscoveredIdsDefinitions } from './discoveredIdDefinitions';
export async function fetchPreDiscoveredIds(dev: boolean) { export async function fetchPreDiscoveredIds(dev: boolean) {
const idChunks: number[][] = []; const idChunks: number[][] = [];
const manifest = (await fetch(asset('ids/manifest.json', dev)).then( const manifest = (await fetch(asset('ids/manifest.json', dev)).then(
(response) => response.json(), (response) => response.json(),
)) as DiscoverIdsManifest; )) as DiscoveredIdsDefinitions;
const bar = new ProgressBar( const bar = new ProgressBar(
`Fetching ${manifest.count.toLocaleString()} ids in ${manifest.chunks} chunks :bar`, `Fetching ${manifest.count.toLocaleString()} ids in ${manifest.chunks} chunks :bar`,
manifest.chunks, manifest.chunks,