Files
blitzkit/packages/bot/src/core/streams/wotbreplay.ts
T

57 lines
1.8 KiB
TypeScript
Raw Normal View History

2025-09-06 00:48:39 -05:00
import { ReadStream } from "@blitzkit/core";
import AdmZip from "adm-zip";
import { readFile } from "fs/promises";
import { Parser } from "pickleparser";
import protobuf from "protobufjs";
2024-04-28 17:06:31 -05:00
interface WotbReplayMetaJson {
version: string;
title: string;
dbid: string;
playerName: string;
battleStartTime: string;
playerVehicleName: string;
mapName: string;
arenaUniqueId: string;
battleDuration: number;
vehicleCompDescriptor: number;
camouflageId: number;
mapId: number;
arenaBonusType: number;
}
export class WotbReplayReadStream extends ReadStream {
async wotbReplay() {
const pickleParser = new Parser();
const zip = new AdmZip(Buffer.from(this.buffer));
2025-09-06 00:48:39 -05:00
const metaJsonBuffer = zip.getEntry("meta.json")?.getData();
const battleResultsDat = zip.getEntry("battle_results.dat")?.getData();
2024-04-28 17:06:31 -05:00
if (!metaJsonBuffer || !battleResultsDat)
2025-09-06 00:48:39 -05:00
throw new SyntaxError("meta.json not found");
2024-04-28 17:06:31 -05:00
const metaJson = JSON.parse(
2025-09-06 00:48:39 -05:00
metaJsonBuffer.toString()
2024-04-28 17:06:31 -05:00
) as WotbReplayMetaJson;
const unpickledBattleResults = pickleParser.parse(battleResultsDat);
const [, battleResultsString] = unpickledBattleResults as [number, string];
const root = await protobuf.load(
2025-09-06 00:48:39 -05:00
`${__dirname}/../../protos/BattleResultsClient.proto`
2024-04-28 17:06:31 -05:00
);
const BattleResults = root.lookupType(
2025-09-06 00:48:39 -05:00
"BattleResultsGenerated.BattleResultsClient"
2024-04-28 17:06:31 -05:00
);
2024-05-01 13:04:31 -05:00
const reader = protobuf.Reader.create(Buffer.from(battleResultsString));
// const decodedBattleResults = BattleResults.decodeDelimited(
// Buffer.from(battleResultsString),
// );
// console.log(decodedBattleResults.toJSON());
2024-04-28 17:06:31 -05:00
}
}
2025-09-06 00:48:39 -05:00
const replay = await readFile("temp/test3.wotbreplay");
2024-06-23 20:59:03 -05:00
const stream = new WotbReplayReadStream(replay.buffer as ArrayBuffer);
2024-04-28 17:06:31 -05:00
stream.wotbReplay();