From acc1590aa229665815b570be92fd549508d5e8c6 Mon Sep 17 00:00:00 2001 From: Tau Date: Wed, 27 Mar 2019 20:13:55 -0400 Subject: [PATCH] aimedb: Deal with redundant command codes Some messages apparently use more than one command code depending on the game. The meaning of the 0x0006 response code is also overloaded apparently, so that's cool. Fortunately that's the game's problem and not ours. --- src/aimedb/decoder.ts | 14 +++++++++++++- src/aimedb/encoder.ts | 13 +++++++++++++ src/aimedb/index.ts | 1 + src/aimedb/request.ts | 6 ++++++ src/aimedb/response.ts | 7 +++++++ 5 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/aimedb/decoder.ts b/src/aimedb/decoder.ts index 1f4ce5f..e6ae581 100644 --- a/src/aimedb/decoder.ts +++ b/src/aimedb/decoder.ts @@ -54,6 +54,16 @@ function readLookupRequest(msg: Buffer): Request.LookupRequest { }; } +function readLookupRequest2(msg: Buffer): Request.LookupRequest2 { + const luid = msg.slice(0x0020, 0x002a).toString("hex"); + + return { + ...begin(msg), + type: "lookup2", + luid, + }; +} + function readHelloRequest(msg: Buffer): Request.HelloRequest { return { ...begin(msg), @@ -69,10 +79,12 @@ function readGoodbyeRequest(msg: Buffer): Request.GoodbyeRequest { const readers = new Map Request.AimeRequest>(); +readers.set(0x0004, readLookupRequest); readers.set(0x0005, readRegisterRequest); readers.set(0x0009, readLogRequest); readers.set(0x000b, readCampaignRequest); -readers.set(0x000f, readLookupRequest); +readers.set(0x000d, readRegisterRequest); +readers.set(0x000f, readLookupRequest2); readers.set(0x0064, readHelloRequest); readers.set(0x0066, readGoodbyeRequest); diff --git a/src/aimedb/encoder.ts b/src/aimedb/encoder.ts index 8631855..2de438d 100644 --- a/src/aimedb/encoder.ts +++ b/src/aimedb/encoder.ts @@ -55,6 +55,17 @@ export class Encoder extends Transform { // -1 aime id means card is not registered // register level does not seem to matter + buf = begin(0x0130); + buf.writeUInt16LE(0x0006, 0x0004); // cmd code + buf.writeUInt16LE(msg.status, 0x0008); + buf.writeInt32LE(msg.aimeId || -1, 0x0020); + buf.writeUInt8(registerLevels[msg.registerLevel], 0x0024); + + break; + + case "lookup2": + // Seems identical to the above? Just with a different command code. + buf = begin(0x0130); buf.writeUInt16LE(0x0010, 0x0004); // cmd code buf.writeUInt16LE(msg.status, 0x0008); @@ -64,6 +75,8 @@ export class Encoder extends Transform { break; case "register": + // Same response code as v1 lookup command! + buf = begin(0x0030); buf.writeUInt16LE(0x0006, 0x0004); // cmd code buf.writeUInt16LE(msg.status, 0x0008); diff --git a/src/aimedb/index.ts b/src/aimedb/index.ts index 531079f..38946af 100644 --- a/src/aimedb/index.ts +++ b/src/aimedb/index.ts @@ -26,6 +26,7 @@ export default async function aimedb(socket) { break; case "lookup": + case "lookup2": console.log("Aimedb: Mifare lookup", req.luid); output.write({ type: req.type, status: 1 }); // Add aimeId if desired diff --git a/src/aimedb/request.ts b/src/aimedb/request.ts index 9f4722c..79deef3 100644 --- a/src/aimedb/request.ts +++ b/src/aimedb/request.ts @@ -29,6 +29,11 @@ export interface LookupRequest extends AimeRequestBase { luid: string; } +export interface LookupRequest2 extends AimeRequestBase { + type: "lookup2"; + luid: string; +} + export interface HelloRequest extends AimeRequestBase { type: "hello"; } @@ -43,4 +48,5 @@ export type AimeRequest = | HelloRequest | LogRequest | LookupRequest + | LookupRequest2 | RegisterRequest; diff --git a/src/aimedb/response.ts b/src/aimedb/response.ts index 5e3ec87..f22ddb9 100644 --- a/src/aimedb/response.ts +++ b/src/aimedb/response.ts @@ -22,6 +22,12 @@ export interface LookupResponse extends AimeResponseBase { registerLevel: RegisterLevel; } +export interface LookupResponse2 extends AimeResponseBase { + type: "lookup2"; + aimeId?: number; + registerLevel: RegisterLevel; +} + export interface RegisterResponse extends AimeResponseBase { type: "register"; aimeId: number; @@ -32,4 +38,5 @@ export type AimeResponse = | HelloResponse | LogResponse | LookupResponse + | LookupResponse2 | RegisterResponse;