Combine analytics and game types (#839)

## Description:

Combine analytics and game types. Simplify and remove redundant player
information.

- Remove ip address.
- Add playerID.
- Combine redundant player tables.
- Move game metadata in to GameEndInfo type, an extension of
GameStartInfo

## Please complete the following:

- [x] I have added screenshots for all UI updates
- [x] I confirm I have thoroughly tested these changes and take full
responsibility for any bugs introduced
- [x] I understand that submitting code with bugs that could have been
caught through manual testing blocks releases and new features for all
contributors

---------

Co-authored-by: Scott Anderson <662325+scottanderson@users.noreply.github.com>
This commit is contained in:
Scott Anderson
2025-05-22 15:06:30 -04:00
committed by GitHub
co-authored by Scott Anderson
parent 373de1a752
commit 9302af868d
14 changed files with 75 additions and 104 deletions
+18 -16
View File
@@ -1,6 +1,5 @@
import { z } from "zod";
import quickChatData from "../../resources/QuickChat.json" with { type: "json" };
import { PlayerStatsSchema } from "./ArchiveSchemas";
import {
AllPlayers,
Difficulty,
@@ -11,6 +10,7 @@ import {
PlayerType,
UnitType,
} from "./game/Game";
import { PlayerStatsSchema } from "./StatsSchemas";
import { flattenedEmojiTable } from "./Util";
export type GameID = string;
@@ -88,9 +88,6 @@ export type ClientJoinMessage = z.infer<typeof ClientJoinMessageSchema>;
export type ClientLogMessage = z.infer<typeof ClientLogMessageSchema>;
export type ClientHashMessage = z.infer<typeof ClientHashSchema>;
export type PlayerRecord = z.infer<typeof PlayerRecordSchema>;
export type GameRecord = z.infer<typeof GameRecordSchema>;
export type AllPlayersStats = z.infer<typeof AllPlayersStatsSchema>;
export type Player = z.infer<typeof PlayerSchema>;
export type GameStartInfo = z.infer<typeof GameStartInfoSchema>;
@@ -442,26 +439,31 @@ export const ClientMessageSchema = z.union([
ClientHashSchema,
]);
export const PlayerRecordSchema = z.object({
clientID: ID,
username: SafeString,
ip: SafeString.nullable(), // WARNING: PII
export const PlayerRecordSchema = PlayerSchema.extend({
persistentID: PersistentIdSchema, // WARNING: PII
stats: PlayerStatsSchema,
});
export type PlayerRecord = z.infer<typeof PlayerRecordSchema>;
export const GameRecordSchema = z.object({
id: ID,
gameStartInfo: GameStartInfoSchema,
export const GameEndInfoSchema = GameStartInfoSchema.extend({
players: z.array(PlayerRecordSchema),
startTimestampMS: z.number(),
endTimestampMS: z.number(),
durationSeconds: z.number(),
date: SafeString,
start: z.number(),
end: z.number(),
duration: z.number().nonnegative(),
num_turns: z.number(),
turns: z.array(TurnSchema),
winner: z.union([ID, SafeString]).nullable().optional(),
winnerType: z.enum(["player", "team"]).nullable().optional(),
});
export type GameEndInfo = z.infer<typeof GameEndInfoSchema>;
export const AnalyticsRecordSchema = z.object({
info: GameEndInfoSchema,
version: z.literal("v0.0.2"),
gitCommit: z.string(),
});
export type AnalyticsRecord = z.infer<typeof AnalyticsRecordSchema>;
export const GameRecordSchema = AnalyticsRecordSchema.extend({
turns: z.array(TurnSchema),
});
export type GameRecord = z.infer<typeof GameRecordSchema>;