From 68193b46270c4fe943d6a7230cd742c23268a309 Mon Sep 17 00:00:00 2001 From: zkldi <20380519+zkldi@users.noreply.github.com> Date: Tue, 14 Dec 2021 20:44:16 +0000 Subject: [PATCH 1/6] Hotfix: Where did my LR2Hook client go?? --- server/src/lib/builtin-clients/builtin-clients.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/server/src/lib/builtin-clients/builtin-clients.ts b/server/src/lib/builtin-clients/builtin-clients.ts index 3e0bc1cbd..efc7d74f1 100644 --- a/server/src/lib/builtin-clients/builtin-clients.ts +++ b/server/src/lib/builtin-clients/builtin-clients.ts @@ -127,6 +127,18 @@ const BtchiDefaultClients: DefaultClients = [ apiKeyTemplate: null, apiKeyFilename: null, }, + { + name: "LR2 Hook", + webhookUri: null, + redirectUri: null, + requestedPermissions: ["submit_score"], + clientID: "CXLR2Hook", + apiKeyFilename: "BokutachiAuth.json", + apiKeyTemplate: JSON.stringify({ + url: `${ServerConfig.OUR_URL}/ir/lr2hook/import`, + apiKey: "%%TACHI_KEY%%", + }), + }, ]; export async function LoadDefaultClients() { From fb4f0af04097f75f8df2efbcfa75d62e4635ceb3 Mon Sep 17 00:00:00 2001 From: zkldi <20380519+zkldi@users.noreply.github.com> Date: Tue, 14 Dec 2021 20:51:08 +0000 Subject: [PATCH 2/6] Update version to v2.0.8 --- server/package.json | 2 +- server/src/lib/constants/version.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/package.json b/server/package.json index 1ced3dfd2..a0ffef1dc 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "tachi-server", - "version": "2.0.6", + "version": "2.0.8", "description": "A score tracking server.", "main": "js/index.js", "private": true, diff --git a/server/src/lib/constants/version.ts b/server/src/lib/constants/version.ts index c61ae131b..b0cda0ad6 100644 --- a/server/src/lib/constants/version.ts +++ b/server/src/lib/constants/version.ts @@ -4,7 +4,7 @@ const MAJOR = 2; const MINOR = 0; -const PATCH = 6; +const PATCH = 8; // As is with all front-facing zkldi projects, the version names for tachi-server // are from an album I like. In this case, the album is Portishead - Dummy. From 317b0e18b95abad3b636577346c0a3fbe579403a Mon Sep 17 00:00:00 2001 From: zkldi <20380519+zkldi@users.noreply.github.com> Date: Tue, 14 Dec 2021 20:51:31 +0000 Subject: [PATCH 3/6] Patch LR2 Gauge functionality back in? --- .../import-types/ir/lr2hook/converter.ts | 17 +++++++++++++++++ .../import-types/ir/lr2hook/parser.ts | 1 + .../import-types/ir/lr2hook/types.ts | 1 + server/src/test-utils/test-data.ts | 1 + 4 files changed, 20 insertions(+) diff --git a/server/src/lib/score-import/import-types/ir/lr2hook/converter.ts b/server/src/lib/score-import/import-types/ir/lr2hook/converter.ts index dde272d4a..45a454673 100644 --- a/server/src/lib/score-import/import-types/ir/lr2hook/converter.ts +++ b/server/src/lib/score-import/import-types/ir/lr2hook/converter.ts @@ -62,6 +62,7 @@ export const ConverterLR2Hook: ConverterFunction = }, }, scoreMeta: { + gauge: ConvertGauge(data.playerData.gauge), random: chart.playtype === "7K" ? ConvertRandom(data.playerData.random) : null, client: "LR2", }, @@ -70,6 +71,22 @@ export const ConverterLR2Hook: ConverterFunction = return { song, chart, dryScore }; }; +function ConvertGauge( + gauge: LR2HookScore["playerData"]["gauge"] +): ScoreDocument<"bms:7K" | "bms:14K">["scoreMeta"]["gauge"] { + switch (gauge) { + case "EASY": + return "EASY"; + case "GROOVE": + return "NORMAL"; + case "HARD": + case "G-ATTACK": + case "HAZARD": + case "P-ATTACK": + return "HARD"; + } +} + function ConvertRandom( random: LR2HookScore["playerData"]["random"] ): ScoreDocument<"bms:7K">["scoreMeta"]["random"] { diff --git a/server/src/lib/score-import/import-types/ir/lr2hook/parser.ts b/server/src/lib/score-import/import-types/ir/lr2hook/parser.ts index 7747a3071..09da68602 100644 --- a/server/src/lib/score-import/import-types/ir/lr2hook/parser.ts +++ b/server/src/lib/score-import/import-types/ir/lr2hook/parser.ts @@ -16,6 +16,7 @@ const PR_LR2Hook: PrudenceSchema = { gameMode: p.any, // ALLSCR and H-RAN may also be sent, but we don't support them. random: p.isIn(SUPPORTED_RANDOMS), + gauge: p.isIn("GROOVE", "HARD", "HAZARD", "EASY", "P-ATTACK", "G-ATTACK"), }, scoreData: { pgreat: p.isPositiveInteger, diff --git a/server/src/lib/score-import/import-types/ir/lr2hook/types.ts b/server/src/lib/score-import/import-types/ir/lr2hook/types.ts index cf66aac8c..547eaa8c7 100644 --- a/server/src/lib/score-import/import-types/ir/lr2hook/types.ts +++ b/server/src/lib/score-import/import-types/ir/lr2hook/types.ts @@ -6,6 +6,7 @@ export interface LR2HookScore { autoScr: boolean; gameMode: unknown; random: "NONRAN" | "MIRROR" | "RAN" | "S-RAN"; + gauge: "GROOVE" | "HAZARD" | "HARD" | "EASY" | "P-ATTACK" | "G-ATTACK"; }; scoreData: { pgreat: integer; diff --git a/server/src/test-utils/test-data.ts b/server/src/test-utils/test-data.ts index 981b57735..c266ef967 100644 --- a/server/src/test-utils/test-data.ts +++ b/server/src/test-utils/test-data.ts @@ -49,6 +49,7 @@ export const TestingLR2HookScore: LR2HookScore = { autoScr: false, gameMode: "7K", random: "RAN", + gauge: "GROOVE", }, scoreData: { pgreat: 1000, From 2265b98569560def63af6765bba0f5d009a92401 Mon Sep 17 00:00:00 2001 From: zkldi <20380519+zkldi@users.noreply.github.com> Date: Tue, 14 Dec 2021 20:56:48 +0000 Subject: [PATCH 4/6] Bump version and bump KT Common Appropriately. --- server/package.json | 4 ++-- server/pnpm-lock.yaml | 8 ++++---- server/src/lib/constants/version.ts | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/server/package.json b/server/package.json index a0ffef1dc..fa975ce66 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "tachi-server", - "version": "2.0.8", + "version": "2.0.9", "description": "A score tracking server.", "main": "js/index.js", "private": true, @@ -83,7 +83,7 @@ "rimraf": "3.0.2", "safe-json-stringify": "1.2.0", "seq-logging": "^1.1.1", - "tachi-common": "0.3.19", + "tachi-common": "0.3.21", "ts-node": "10.0.0", "typescript": "4.3.4", "winston": "3.3.3", diff --git a/server/pnpm-lock.yaml b/server/pnpm-lock.yaml index 63b897a34..c2b70ddc0 100644 --- a/server/pnpm-lock.yaml +++ b/server/pnpm-lock.yaml @@ -63,7 +63,7 @@ specifiers: safe-json-stringify: 1.2.0 seq-logging: ^1.1.1 supertest: 6.1.3 - tachi-common: 0.3.19 + tachi-common: 0.3.21 tap: 15.0.9 ts-node: 10.0.0 tsconfig-paths: 3.10.1 @@ -107,7 +107,7 @@ dependencies: rimraf: 3.0.2 safe-json-stringify: 1.2.0 seq-logging: 1.1.1 - tachi-common: 0.3.19 + tachi-common: 0.3.21 ts-node: 10.0.0_83f53b0a0c5616d3fa00ed4e30b9ce1b typescript: 4.3.4 winston: 3.3.3 @@ -5387,8 +5387,8 @@ packages: strip-ansi: 6.0.0 dev: true - /tachi-common/0.3.19: - resolution: {integrity: sha512-N3/n9emh2X9pA+3jQ1UfkLX9V8hk/oHGE1GPlkReRmyIR9gRAxhf3uZCiorPqibSkPzx9LrGLJcO52FR5NQ8oA==} + /tachi-common/0.3.21: + resolution: {integrity: sha512-gOaqyEMLrDr0xpmtVqjAYqdY+NgbpaVHZlt0g0v+nmKDMG9gyrqd99alUApUb/o0zzLd8o2uediajgWGcDTCFw==} dependencies: monk: 7.3.4 transitivePeerDependencies: diff --git a/server/src/lib/constants/version.ts b/server/src/lib/constants/version.ts index b0cda0ad6..e49480519 100644 --- a/server/src/lib/constants/version.ts +++ b/server/src/lib/constants/version.ts @@ -4,7 +4,7 @@ const MAJOR = 2; const MINOR = 0; -const PATCH = 8; +const PATCH = 9; // As is with all front-facing zkldi projects, the version names for tachi-server // are from an album I like. In this case, the album is Portishead - Dummy. From fd644165662db3b3269dd5ff47aab56e942b0948 Mon Sep 17 00:00:00 2001 From: zkldi <20380519+zkldi@users.noreply.github.com> Date: Tue, 14 Dec 2021 21:52:31 +0000 Subject: [PATCH 5/6] Make autoScr 0 instead of false --- server/package.json | 2 +- server/src/lib/constants/version.ts | 2 +- server/src/lib/score-import/import-types/ir/lr2hook/parser.ts | 2 +- server/src/lib/score-import/import-types/ir/lr2hook/types.ts | 2 +- server/src/test-utils/test-data.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/server/package.json b/server/package.json index fa975ce66..01887429d 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "tachi-server", - "version": "2.0.9", + "version": "2.0.10", "description": "A score tracking server.", "main": "js/index.js", "private": true, diff --git a/server/src/lib/constants/version.ts b/server/src/lib/constants/version.ts index e49480519..851ef7778 100644 --- a/server/src/lib/constants/version.ts +++ b/server/src/lib/constants/version.ts @@ -4,7 +4,7 @@ const MAJOR = 2; const MINOR = 0; -const PATCH = 9; +const PATCH = 10; // As is with all front-facing zkldi projects, the version names for tachi-server // are from an album I like. In this case, the album is Portishead - Dummy. diff --git a/server/src/lib/score-import/import-types/ir/lr2hook/parser.ts b/server/src/lib/score-import/import-types/ir/lr2hook/parser.ts index 09da68602..9d42f4e83 100644 --- a/server/src/lib/score-import/import-types/ir/lr2hook/parser.ts +++ b/server/src/lib/score-import/import-types/ir/lr2hook/parser.ts @@ -10,7 +10,7 @@ const SUPPORTED_RANDOMS = ["NONRAN", "MIRROR", "RAN", "S-RAN"]; const PR_LR2Hook: PrudenceSchema = { md5: "string", playerData: { - autoScr: p.is(false), + autoScr: p.is(0), // don't really need this, but it's // { "ALL", "SINGLE", "7K", "5K", "DOUBLE", "14K", "10K", "9K" }; gameMode: p.any, diff --git a/server/src/lib/score-import/import-types/ir/lr2hook/types.ts b/server/src/lib/score-import/import-types/ir/lr2hook/types.ts index 547eaa8c7..edcf99825 100644 --- a/server/src/lib/score-import/import-types/ir/lr2hook/types.ts +++ b/server/src/lib/score-import/import-types/ir/lr2hook/types.ts @@ -3,7 +3,7 @@ import { integer } from "tachi-common"; export interface LR2HookScore { md5: string; playerData: { - autoScr: boolean; + autoScr: 0; gameMode: unknown; random: "NONRAN" | "MIRROR" | "RAN" | "S-RAN"; gauge: "GROOVE" | "HAZARD" | "HARD" | "EASY" | "P-ATTACK" | "G-ATTACK"; diff --git a/server/src/test-utils/test-data.ts b/server/src/test-utils/test-data.ts index c266ef967..6d792f0d2 100644 --- a/server/src/test-utils/test-data.ts +++ b/server/src/test-utils/test-data.ts @@ -46,7 +46,7 @@ export const TestingKsHookSV3CScore = GetKTDataJSON("./kshook-sv3c/base.json") a export const TestingLR2HookScore: LR2HookScore = { md5: "38616b85332037cc12924f2ae2840262", playerData: { - autoScr: false, + autoScr: 0, gameMode: "7K", random: "RAN", gauge: "GROOVE", From 1b82e1fe3415c4e0c4a37ccf6935852691a97d7e Mon Sep 17 00:00:00 2001 From: zkldi <20380519+zkldi@users.noreply.github.com> Date: Thu, 16 Dec 2021 19:09:58 +0000 Subject: [PATCH 6/6] Fix how ConvertToBeatorajaFormat handles epg/lpg data. --- .../beatoraja/charts/convert-scores.test.ts | 68 +++++++++++++++++++ .../ir/beatoraja/charts/convert-scores.ts | 9 ++- 2 files changed, 76 insertions(+), 1 deletion(-) diff --git a/server/src/server/router/ir/beatoraja/charts/convert-scores.test.ts b/server/src/server/router/ir/beatoraja/charts/convert-scores.test.ts index c2e28413d..15bfb1be2 100644 --- a/server/src/server/router/ir/beatoraja/charts/convert-scores.test.ts +++ b/server/src/server/router/ir/beatoraja/charts/convert-scores.test.ts @@ -3,6 +3,7 @@ import t from "tap"; import ResetDBState from "test-utils/resets"; import { GetKTDataJSON } from "test-utils/test-data"; import { TachiScoreDataToBeatorajaFormat } from "./convert-scores"; +import deepmerge from "deepmerge"; const gazerChart = GetKTDataJSON("./tachi/bms-gazer-chart.json"); @@ -48,6 +49,61 @@ t.test("#TachiScoreDataToBeatorajaFormat", (t) => { passnotes: 0, minbp: 0, notes: 2256, + epg: 617, + lpg: 0, + egr: 0, + lgr: 0, + egd: 0, + lgd: 0, + ebd: 0, + lbd: 0, + epr: 0, + lpr: 0, + ems: 0, + lms: 0, + }, + "Should return the beatoraja score format." + ); + + t.end(); + }); + + t.test("Should fake epg/egr data if the score doesn't have it..", (t) => { + const res = TachiScoreDataToBeatorajaFormat( + deepmerge(pbScore, { scoreData: { score: 999 } }), + gazerChart.data.hashSHA256, + "", + gazerChart.data.notecount, + 0 + ); + + t.strictSame( + res, + { + sha256: "195fe1be5c3e74fccd04dc426e05f8a9cfa8a1059c339d0a23e99f63661f0b7d", + player: "", + playcount: 0, + clear: 5, + date: 0, + maxcombo: 0, + deviceType: null, + gauge: 0, + random: null, + passnotes: 0, + minbp: 0, + notes: 2256, + epg: Math.floor(999 / 2), + lpg: 0, + egr: 1, + lgr: 0, + egd: 0, + lgd: 0, + ebd: 0, + lbd: 0, + epr: 0, + lpr: 0, + ems: 0, + lms: 0, }, "Should return the beatoraja score format." ); @@ -79,6 +135,18 @@ t.test("#TachiScoreDataToBeatorajaFormat", (t) => { passnotes: 0, minbp: 0, notes: 2256, + epg: 617, + lpg: 0, + egr: 0, + lgr: 0, + egd: 0, + lgd: 0, + ebd: 0, + lbd: 0, + epr: 0, + lpr: 0, + ems: 0, + lms: 0, }, "Should return the beatoraja score format." ); diff --git a/server/src/server/router/ir/beatoraja/charts/convert-scores.ts b/server/src/server/router/ir/beatoraja/charts/convert-scores.ts index 9a00e25e4..7bd31380b 100644 --- a/server/src/server/router/ir/beatoraja/charts/convert-scores.ts +++ b/server/src/server/router/ir/beatoraja/charts/convert-scores.ts @@ -89,5 +89,12 @@ export function TachiScoreDataToBeatorajaFormat( judgements[key] = scoreData.hitMeta[key] ?? 0; } - return beatorajaScore; + // If we have no epg/egr data, we can't calculate EX score on the beatoraja client. + // We have to fake some data for LR2 scores/other scores. + if (!judgements.epg && !judgements.lpg && !judgements.egr && !judgements.lgr) { + judgements.epg = Math.floor(pbScore.scoreData.score / 2); + judgements.egr = pbScore.scoreData.score % 2; + } + + return { ...beatorajaScore, ...judgements }; }