From 3cb05a8c0c36baedfd27f2d4660d5de8d093ccfa Mon Sep 17 00:00:00 2001 From: Miodec Date: Mon, 11 May 2026 12:51:18 +0200 Subject: [PATCH 1/4] chore: add todo --- frontend/src/ts/commandline/commandline-metadata.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/frontend/src/ts/commandline/commandline-metadata.ts b/frontend/src/ts/commandline/commandline-metadata.ts index 0f53145a8f2e..f8e26655076e 100644 --- a/frontend/src/ts/commandline/commandline-metadata.ts +++ b/frontend/src/ts/commandline/commandline-metadata.ts @@ -14,6 +14,9 @@ import * as UI from "../ui"; import { typedKeys } from "../utils/misc"; import { Validation } from "../types/validation"; +//TODO: remove display property and instead use optionsMetadata from configMetadata +// eventually this file should be fully merged into config metadata, probably under the 'commandline' property + type ConfigKeysWithoutCommands = | "minWpmCustomSpeed" | "minAccCustom" From fa53654aa0d96bd15e5b7eecf1fb40fb552e978b Mon Sep 17 00:00:00 2001 From: Miodec Date: Mon, 11 May 2026 12:56:55 +0200 Subject: [PATCH 2/4] chore: fix tests --- frontend/__tests__/components/ui/form/InputField.spec.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/__tests__/components/ui/form/InputField.spec.tsx b/frontend/__tests__/components/ui/form/InputField.spec.tsx index b9228192d38c..2e27b11bb5bc 100644 --- a/frontend/__tests__/components/ui/form/InputField.spec.tsx +++ b/frontend/__tests__/components/ui/form/InputField.spec.tsx @@ -16,6 +16,7 @@ function makeField(name: string, value = "") { errors: [], }, }, + options: {}, handleBlur: vi.fn(), handleChange: vi.fn(), getMeta: () => ({ hasWarning: false, warnings: [] }), @@ -85,6 +86,7 @@ describe("InputField", () => { it("shows FieldIndicator", () => { const field = makeField("name"); + field.options = { validators: { onChange: () => undefined } }; field.state.meta.isValidating = true; const { container } = render(() => field} />); From ada3376b4546ee0676f27c6a1eecbaa2d5f46826 Mon Sep 17 00:00:00 2001 From: Miodec Date: Mon, 11 May 2026 16:26:48 +0200 Subject: [PATCH 3/4] chore: throw if xp is NaN --- backend/src/api/controllers/result.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/backend/src/api/controllers/result.ts b/backend/src/api/controllers/result.ts index 996e1746b69b..566365a3689f 100644 --- a/backend/src/api/controllers/result.ts +++ b/backend/src/api/controllers/result.ts @@ -584,6 +584,18 @@ export async function addResult( streak, ); + if (isNaN(xpGained.xp)) { + throw new MonkeyError( + 500, + "Calculated XP is NaN", + JSON.stringify({ + xpGained, + result: completedEvent, + }), + uid, + ); + } + if (xpGained.xp < 0) { throw new MonkeyError( 500, From f5cb8e2c42147bae6ffa0f5cb02923c6fc24e8b5 Mon Sep 17 00:00:00 2001 From: Miodec Date: Mon, 11 May 2026 16:27:16 +0200 Subject: [PATCH 4/4] chore: add breakdown item if gainMultiplier anything other than 1 --- backend/__tests__/api/controllers/result.spec.ts | 1 + backend/src/api/controllers/result.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/__tests__/api/controllers/result.spec.ts b/backend/__tests__/api/controllers/result.spec.ts index e5fee5001c8a..a0b3fbe38c48 100644 --- a/backend/__tests__/api/controllers/result.spec.ts +++ b/backend/__tests__/api/controllers/result.spec.ts @@ -631,6 +631,7 @@ describe("result controller test", () => { xp: 0, dailyXpBonus: false, xpBreakdown: { + configMultiplier: 0, accPenalty: 28, base: 20, incomplete: 5, diff --git a/backend/src/api/controllers/result.ts b/backend/src/api/controllers/result.ts index 566365a3689f..eb9e94875d5b 100644 --- a/backend/src/api/controllers/result.ts +++ b/backend/src/api/controllers/result.ts @@ -825,7 +825,7 @@ async function calculateXp( const totalXp = Math.round((xpAfterAccuracy + incompleteXp) * gainMultiplier) + dailyBonus; - if (gainMultiplier > 1) { + if (gainMultiplier !== 1) { // breakdown.push([ // "configMultiplier", // Math.round((xpAfterAccuracy + incompleteXp) * (gainMultiplier - 1)),