mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-24 12:09:51 +02:00
feat: player count
This commit is contained in:
1 parent
1d112bb633
commit
db83ac40b4
10 files changed
+49
-45
No files matched your search
@@ -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
@@ -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',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -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>);
|
||||||
@@ -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,
|
||||||
|
|||||||
Reference in new issue
Block a user