From f357c2b32eb99d266e786eba331cd241a6caf25d Mon Sep 17 00:00:00 2001 From: GEEKiDoS Date: Tue, 20 Jan 2026 03:19:36 +0800 Subject: [PATCH] add premium pass hack for p2d --- src/services/p2d/user.ts | 17 ++++++++++++++--- src/types/p2d/pdata.ts | 1 + src/utils/kbinxml.ts | 2 +- src/utils/sha256.ts | 2 +- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/services/p2d/user.ts b/src/services/p2d/user.ts index 4349e7d..d94fdbe 100644 --- a/src/services/p2d/user.ts +++ b/src/services/p2d/user.ts @@ -3,6 +3,8 @@ import { inject, injectable } from "tsyringe"; import { PlayerPlayData, PlayerMusicData, PlayerPlayLog, PlayerCourseLog, PlayerCustomizeSetting, PlayerRivalData } from "../../types/p2d/index.js"; import { Pdata } from "../../types/p2d/pdata.js"; import { fromKBinXml, toObject } from "../../utils/kbinxml.js"; +import { to_bin, to_xml } from "@geekidos/kbinxml"; +import { sha256 } from "../../utils/sha256.js"; @injectable() export class UserService { @@ -143,6 +145,15 @@ export class UserService { if (!result) return undefined; + // TODO: implement actual kbinxml encoding/decoding library in js + // to avoid hacking like this and in utils/kbinxml/kxml-value.ts + let { data } = to_xml(result.pdata.buffer) + if (!data.includes("premium_pass")) { + data = data.replace("", "1") + result.pdata.buffer = to_bin(data).data; + result.check_sum = sha256(Buffer.from(result.pdata.buffer)); + } + return { pdata: Buffer.from(result.pdata.buffer), check_sum: result.check_sum, @@ -153,11 +164,11 @@ export class UserService { const binary = await this.getPDataBinary(player); if (!binary) return undefined; - return toObject(fromKBinXml(binary.pdata)).pdata; + return toObject(fromKBinXml(binary.pdata as Uint8Array)).pdata; } upsertPDataBinary(player: string, pdata: Buffer, check_sum: string) { - const unpacked = toObject(fromKBinXml(pdata)) as { pdata: Pdata }; + const unpacked = toObject(fromKBinXml(pdata as Uint8Array)) as { pdata: Pdata }; const { djname, infinitas_id } = unpacked.pdata.player; return this.playDataCol @@ -165,7 +176,7 @@ export class UserService { $set: { djname, infinitas_id, - pdata: new Binary(pdata), + pdata: new Binary(pdata as Uint8Array), check_sum, } }, { upsert: true }); diff --git a/src/types/p2d/pdata.ts b/src/types/p2d/pdata.ts index 8e0d539..f426000 100644 --- a/src/types/p2d/pdata.ts +++ b/src/types/p2d/pdata.ts @@ -1,4 +1,5 @@ export interface Pdata { + premium_pass: boolean; bit: Bit; dan: Dan; effector: Effector; diff --git a/src/utils/kbinxml.ts b/src/utils/kbinxml.ts index b4716f6..069f24b 100644 --- a/src/utils/kbinxml.ts +++ b/src/utils/kbinxml.ts @@ -283,7 +283,7 @@ export function toKBinXml(topName: string, obj: Serializable, encoding: 'UTF-8' const bin = to_bin(xml); if (dumpXml) { - writeFileSync('dump.bin', Buffer.from(bin.data)); + writeFileSync('dump.bin', Uint8Array.from(bin.data)); } return bin; diff --git a/src/utils/sha256.ts b/src/utils/sha256.ts index e345897..35af57e 100644 --- a/src/utils/sha256.ts +++ b/src/utils/sha256.ts @@ -2,6 +2,6 @@ import { createHash } from "crypto"; export function sha256(data: Buffer) { return createHash('sha256') - .update(data) + .update(Uint8Array.from(data)) .digest('hex'); }