mirror of
https://github.com/monkeytypegame/monkeytype.git
synced 2025-10-29 02:07:55 +08:00
impr: save pbs for numbers mode separately (notreallystatic, miodec) (#4946)
This commit is contained in:
parent
3e591635e5
commit
1429c2ca8c
8 changed files with 110 additions and 13 deletions
|
|
@ -32,4 +32,81 @@ describe("Pb Utils", () => {
|
|||
expect(result).toBe(expected);
|
||||
});
|
||||
});
|
||||
describe("checkAndUpdatePb", () => {
|
||||
it("should update personal best", () => {
|
||||
const userPbs: SharedTypes.PersonalBests = {
|
||||
time: {},
|
||||
words: {},
|
||||
custom: {},
|
||||
quote: {},
|
||||
zen: {},
|
||||
};
|
||||
const result = {
|
||||
difficulty: "normal",
|
||||
language: "english",
|
||||
punctuation: false,
|
||||
lazyMode: false,
|
||||
acc: 100,
|
||||
consistency: 100,
|
||||
rawWpm: 100,
|
||||
wpm: 110,
|
||||
numbers: false,
|
||||
mode: "time",
|
||||
mode2: "15",
|
||||
} as unknown as SharedTypes.Result<SharedTypes.Config.Mode>;
|
||||
|
||||
const run = pb.checkAndUpdatePb(userPbs, undefined, result);
|
||||
|
||||
expect(run.isPb).toBe(true);
|
||||
expect(run.personalBests?.["time"]?.["15"]?.[0]).not.toBe(undefined);
|
||||
});
|
||||
it("should not override default pb when saving numbers test", () => {
|
||||
const userPbs: SharedTypes.PersonalBests = {
|
||||
time: {
|
||||
"15": [
|
||||
{
|
||||
acc: 100,
|
||||
consistency: 100,
|
||||
difficulty: "normal",
|
||||
lazyMode: false,
|
||||
language: "english",
|
||||
numbers: false,
|
||||
punctuation: false,
|
||||
raw: 100,
|
||||
timestamp: 0,
|
||||
wpm: 100,
|
||||
},
|
||||
],
|
||||
},
|
||||
words: {},
|
||||
custom: {},
|
||||
quote: {},
|
||||
zen: {},
|
||||
};
|
||||
const result = {
|
||||
difficulty: "normal",
|
||||
language: "english",
|
||||
punctuation: false,
|
||||
lazyMode: false,
|
||||
acc: 100,
|
||||
consistency: 100,
|
||||
rawWpm: 100,
|
||||
wpm: 110,
|
||||
numbers: true,
|
||||
mode: "time",
|
||||
mode2: "15",
|
||||
} as unknown as SharedTypes.Result<SharedTypes.Config.Mode>;
|
||||
|
||||
const run = pb.checkAndUpdatePb(userPbs, undefined, result);
|
||||
|
||||
expect(run.isPb).toBe(true);
|
||||
|
||||
expect(run.personalBests?.["time"]?.["15"]).toEqual(
|
||||
expect.arrayContaining([
|
||||
expect.objectContaining({ numbers: false, wpm: 100 }),
|
||||
expect.objectContaining({ numbers: true, wpm: 110 }),
|
||||
])
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -73,19 +73,28 @@ function matchesPersonalBest(
|
|||
result.difficulty === undefined ||
|
||||
result.language === undefined ||
|
||||
result.punctuation === undefined ||
|
||||
result.lazyMode === undefined
|
||||
result.lazyMode === undefined ||
|
||||
result.numbers === undefined
|
||||
) {
|
||||
throw new Error("Missing result data (matchesPersonalBest)");
|
||||
}
|
||||
|
||||
const sameLazyMode =
|
||||
result.lazyMode === personalBest.lazyMode ||
|
||||
(!result.lazyMode && !personalBest.lazyMode);
|
||||
const samePunctuation = result.punctuation === personalBest.punctuation;
|
||||
(result.lazyMode ?? false) === (personalBest.lazyMode ?? false);
|
||||
const samePunctuation =
|
||||
(result.punctuation ?? false) === (personalBest.punctuation ?? false);
|
||||
const sameDifficulty = result.difficulty === personalBest.difficulty;
|
||||
const sameLanguage = result.language === personalBest.language;
|
||||
const sameNumbers =
|
||||
(result.numbers ?? false) === (personalBest.numbers ?? false);
|
||||
|
||||
return sameLazyMode && samePunctuation && sameDifficulty && sameLanguage;
|
||||
return (
|
||||
sameLazyMode &&
|
||||
samePunctuation &&
|
||||
sameDifficulty &&
|
||||
sameLanguage &&
|
||||
sameNumbers
|
||||
);
|
||||
}
|
||||
|
||||
function updatePersonalBest(
|
||||
|
|
@ -104,7 +113,8 @@ function updatePersonalBest(
|
|||
result.acc === undefined ||
|
||||
result.consistency === undefined ||
|
||||
result.rawWpm === undefined ||
|
||||
result.wpm === undefined
|
||||
result.wpm === undefined ||
|
||||
result.numbers === undefined
|
||||
) {
|
||||
throw new Error("Missing result data (updatePersonalBest)");
|
||||
}
|
||||
|
|
@ -117,6 +127,7 @@ function updatePersonalBest(
|
|||
personalBest.consistency = result.consistency;
|
||||
personalBest.raw = result.rawWpm;
|
||||
personalBest.wpm = result.wpm;
|
||||
personalBest.numbers = result.numbers;
|
||||
personalBest.timestamp = Date.now();
|
||||
|
||||
return true;
|
||||
|
|
@ -131,7 +142,8 @@ function buildPersonalBest(result: Result): SharedTypes.PersonalBest {
|
|||
result.acc === undefined ||
|
||||
result.consistency === undefined ||
|
||||
result.rawWpm === undefined ||
|
||||
result.wpm === undefined
|
||||
result.wpm === undefined ||
|
||||
result.numbers === undefined
|
||||
) {
|
||||
throw new Error("Missing result data (buildPersonalBest)");
|
||||
}
|
||||
|
|
@ -144,6 +156,7 @@ function buildPersonalBest(result: Result): SharedTypes.PersonalBest {
|
|||
punctuation: result.punctuation,
|
||||
raw: result.rawWpm,
|
||||
wpm: result.wpm,
|
||||
numbers: result.numbers,
|
||||
timestamp: Date.now(),
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -256,6 +256,7 @@
|
|||
<td>difficulty</td>
|
||||
<td>language</td>
|
||||
<td>punctuation</td>
|
||||
<td>numbers</td>
|
||||
<td>lazy mode</td>
|
||||
<td>date</td>
|
||||
</tr>
|
||||
|
|
|
|||
|
|
@ -692,7 +692,7 @@
|
|||
.title {
|
||||
color: var(--text-color);
|
||||
}
|
||||
min-width: 50rem;
|
||||
width: 100%;
|
||||
max-height: calc(100vh - 10rem);
|
||||
overflow-y: scroll;
|
||||
table {
|
||||
|
|
|
|||
|
|
@ -648,6 +648,7 @@ export async function saveLocalPB<M extends SharedTypes.Config.Mode>(
|
|||
mode: M,
|
||||
mode2: SharedTypes.Config.Mode2<M>,
|
||||
punctuation: boolean,
|
||||
numbers: boolean,
|
||||
language: string,
|
||||
difficulty: SharedTypes.Config.Difficulty,
|
||||
lazyMode: boolean,
|
||||
|
|
@ -683,10 +684,11 @@ export async function saveLocalPB<M extends SharedTypes.Config.Mode>(
|
|||
] as unknown as SharedTypes.PersonalBest[]
|
||||
).forEach((pb) => {
|
||||
if (
|
||||
pb.punctuation === punctuation &&
|
||||
(pb.punctuation ?? false) === punctuation &&
|
||||
(pb.numbers ?? false) === numbers &&
|
||||
pb.difficulty === difficulty &&
|
||||
pb.language === language &&
|
||||
(pb.lazyMode === lazyMode || (pb.lazyMode === undefined && !lazyMode))
|
||||
(pb.lazyMode ?? false) === lazyMode
|
||||
) {
|
||||
found = true;
|
||||
pb.wpm = wpm;
|
||||
|
|
@ -713,6 +715,7 @@ export async function saveLocalPB<M extends SharedTypes.Config.Mode>(
|
|||
raw,
|
||||
timestamp: Date.now(),
|
||||
consistency,
|
||||
numbers,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -73,6 +73,7 @@ function update(mode: SharedTypes.Config.Mode): void {
|
|||
<td>${pb.difficulty}</td>
|
||||
<td>${pb.language ? getLanguageDisplayString(pb.language) : "-"}</td>
|
||||
<td>${pb.punctuation ? '<i class="fas fa-check"></i>' : ""}</td>
|
||||
<td>${pb.numbers ? '<i class="fas fa-check"></i>' : ""}</td>
|
||||
<td>${pb.lazyMode ? '<i class="fas fa-check"></i>' : ""}</td>
|
||||
<td>${dateText}</td>
|
||||
</tr>
|
||||
|
|
|
|||
|
|
@ -1250,6 +1250,7 @@ async function saveResult(
|
|||
Config.mode,
|
||||
completedEvent.mode2,
|
||||
Config.punctuation,
|
||||
Config.numbers,
|
||||
Config.language,
|
||||
Config.difficulty,
|
||||
Config.lazyMode,
|
||||
|
|
|
|||
7
shared-types/types.d.ts
vendored
7
shared-types/types.d.ts
vendored
|
|
@ -112,11 +112,12 @@ declare namespace SharedTypes {
|
|||
|
||||
interface PersonalBest {
|
||||
acc: number;
|
||||
consistency: number;
|
||||
consistency?: number;
|
||||
difficulty: SharedTypes.Config.Difficulty;
|
||||
lazyMode: boolean;
|
||||
lazyMode?: boolean;
|
||||
language: string;
|
||||
punctuation: boolean;
|
||||
punctuation?: boolean;
|
||||
numbers?: boolean;
|
||||
raw: number;
|
||||
wpm: number;
|
||||
timestamp: number;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue