mirror of
https://github.com/monkeytypegame/monkeytype.git
synced 2025-11-09 13:44:29 +08:00
converted to ts
This commit is contained in:
parent
bfceda9867
commit
2e27b7b4c6
2 changed files with 212 additions and 105 deletions
|
|
@ -1,52 +1,77 @@
|
|||
import * as TestWords from "./test-words";
|
||||
|
||||
type Keypress = {
|
||||
count: number;
|
||||
errors: number;
|
||||
words: string[];
|
||||
afk: boolean;
|
||||
};
|
||||
|
||||
type KeypressTimings = {
|
||||
spacing: {
|
||||
current: number;
|
||||
array: number[] | "toolong";
|
||||
};
|
||||
duration: {
|
||||
current: number;
|
||||
array: number[] | "toolong";
|
||||
};
|
||||
};
|
||||
|
||||
class Input {
|
||||
current: string;
|
||||
history: string[];
|
||||
historyLength: number;
|
||||
length: number;
|
||||
constructor() {
|
||||
this.current = "";
|
||||
this.history = [];
|
||||
this.historyLength = 0;
|
||||
this.length = 0;
|
||||
}
|
||||
|
||||
reset() {
|
||||
reset(): void {
|
||||
this.current = "";
|
||||
this.history = [];
|
||||
this.length = 0;
|
||||
}
|
||||
|
||||
resetHistory() {
|
||||
resetHistory(): void {
|
||||
this.history = [];
|
||||
this.length = 0;
|
||||
}
|
||||
|
||||
setCurrent(val) {
|
||||
setCurrent(val: string): void {
|
||||
this.current = val;
|
||||
this.length = this.current.length;
|
||||
}
|
||||
|
||||
appendCurrent(val) {
|
||||
appendCurrent(val: string): void {
|
||||
this.current += val;
|
||||
this.length = this.current.length;
|
||||
}
|
||||
|
||||
resetCurrent() {
|
||||
resetCurrent(): void {
|
||||
this.current = "";
|
||||
}
|
||||
|
||||
getCurrent() {
|
||||
getCurrent(): string {
|
||||
return this.current;
|
||||
}
|
||||
|
||||
pushHistory() {
|
||||
pushHistory(): void {
|
||||
this.history.push(this.current);
|
||||
this.historyLength = this.history.length;
|
||||
this.resetCurrent();
|
||||
}
|
||||
|
||||
popHistory() {
|
||||
return this.history.pop();
|
||||
popHistory(): string {
|
||||
const ret = this.history.pop() ?? "";
|
||||
this.historyLength = this.history.length;
|
||||
return ret;
|
||||
}
|
||||
|
||||
getHistory(i) {
|
||||
getHistory(i: number): string | string[] {
|
||||
if (i === undefined) {
|
||||
return this.history;
|
||||
} else {
|
||||
|
|
@ -54,69 +79,73 @@ class Input {
|
|||
}
|
||||
}
|
||||
|
||||
getHistoryLast() {
|
||||
getHistoryLast(): string {
|
||||
return this.history[this.history.length - 1];
|
||||
}
|
||||
}
|
||||
|
||||
class Corrected {
|
||||
current: string;
|
||||
history: string[];
|
||||
constructor() {
|
||||
this.current = "";
|
||||
this.history = [];
|
||||
}
|
||||
setCurrent(val) {
|
||||
setCurrent(val: string): void {
|
||||
this.current = val;
|
||||
}
|
||||
|
||||
appendCurrent(val) {
|
||||
appendCurrent(val: string): void {
|
||||
this.current += val;
|
||||
}
|
||||
|
||||
resetCurrent() {
|
||||
resetCurrent(): void {
|
||||
this.current = "";
|
||||
}
|
||||
|
||||
resetHistory() {
|
||||
resetHistory(): void {
|
||||
this.history = [];
|
||||
}
|
||||
|
||||
reset() {
|
||||
reset(): void {
|
||||
this.resetCurrent();
|
||||
this.resetHistory();
|
||||
}
|
||||
|
||||
getHistory(i) {
|
||||
getHistory(i: number): string {
|
||||
return this.history[i];
|
||||
}
|
||||
|
||||
popHistory() {
|
||||
return this.history.pop();
|
||||
popHistory(): string {
|
||||
return this.history.pop() ?? "";
|
||||
}
|
||||
|
||||
pushHistory() {
|
||||
pushHistory(): void {
|
||||
this.history.push(this.current);
|
||||
this.current = "";
|
||||
}
|
||||
}
|
||||
|
||||
export let input = new Input();
|
||||
export let corrected = new Corrected();
|
||||
export const input = new Input();
|
||||
export const corrected = new Corrected();
|
||||
|
||||
export let keypressPerSecond = [];
|
||||
export let currentKeypress = {
|
||||
export let keypressPerSecond: Keypress[] = [];
|
||||
export let currentKeypress: Keypress = {
|
||||
count: 0,
|
||||
errors: 0,
|
||||
words: [],
|
||||
afk: true,
|
||||
};
|
||||
export let lastKeypress;
|
||||
export let lastKeypress: number;
|
||||
export let currentBurstStart = 0;
|
||||
export let missedWords = {};
|
||||
export let missedWords: {
|
||||
[word: string]: number;
|
||||
} = {};
|
||||
export let accuracy = {
|
||||
correct: 0,
|
||||
incorrect: 0,
|
||||
};
|
||||
export let keypressTimings = {
|
||||
export let keypressTimings: KeypressTimings = {
|
||||
spacing: {
|
||||
current: -1,
|
||||
array: [],
|
||||
|
|
@ -126,45 +155,45 @@ export let keypressTimings = {
|
|||
array: [],
|
||||
},
|
||||
};
|
||||
export let wpmHistory = [];
|
||||
export let rawHistory = [];
|
||||
export let burstHistory = [];
|
||||
export let wpmHistory: number[] = [];
|
||||
export let rawHistory: number[] = [];
|
||||
export let burstHistory: number[] = [];
|
||||
export let bailout = false;
|
||||
export function setBailout(tf) {
|
||||
export function setBailout(tf: boolean): void {
|
||||
bailout = tf;
|
||||
}
|
||||
|
||||
export let spacingDebug = false;
|
||||
export function enableSpacingDebug() {
|
||||
export function enableSpacingDebug(): void {
|
||||
spacingDebug = true;
|
||||
console.clear();
|
||||
}
|
||||
|
||||
export function updateLastKeypress() {
|
||||
export function updateLastKeypress(): void {
|
||||
lastKeypress = performance.now();
|
||||
}
|
||||
|
||||
export function incrementKeypressCount() {
|
||||
export function incrementKeypressCount(): void {
|
||||
currentKeypress.count++;
|
||||
}
|
||||
|
||||
export function setKeypressNotAfk() {
|
||||
export function setKeypressNotAfk(): void {
|
||||
currentKeypress.afk = false;
|
||||
}
|
||||
|
||||
export function incrementKeypressErrors() {
|
||||
export function incrementKeypressErrors(): void {
|
||||
currentKeypress.errors++;
|
||||
}
|
||||
|
||||
export function pushKeypressWord(word) {
|
||||
export function pushKeypressWord(word: string): void {
|
||||
currentKeypress.words.push(word);
|
||||
}
|
||||
|
||||
export function setBurstStart(time) {
|
||||
export function setBurstStart(time: number): void {
|
||||
currentBurstStart = time;
|
||||
}
|
||||
|
||||
export function pushKeypressesToHistory() {
|
||||
export function pushKeypressesToHistory(): void {
|
||||
keypressPerSecond.push(currentKeypress);
|
||||
currentKeypress = {
|
||||
count: 0,
|
||||
|
|
@ -174,7 +203,7 @@ export function pushKeypressesToHistory() {
|
|||
};
|
||||
}
|
||||
|
||||
export function incrementAccuracy(correctincorrect) {
|
||||
export function incrementAccuracy(correctincorrect: boolean): void {
|
||||
if (correctincorrect) {
|
||||
accuracy.correct++;
|
||||
} else {
|
||||
|
|
@ -182,30 +211,30 @@ export function incrementAccuracy(correctincorrect) {
|
|||
}
|
||||
}
|
||||
|
||||
export function setKeypressTimingsTooLong() {
|
||||
export function setKeypressTimingsTooLong(): void {
|
||||
keypressTimings.spacing.array = "toolong";
|
||||
keypressTimings.duration.array = "toolong";
|
||||
}
|
||||
|
||||
export function pushKeypressDuration(val) {
|
||||
keypressTimings.duration.array.push(val);
|
||||
export function pushKeypressDuration(val: number): void {
|
||||
(keypressTimings.duration.array as number[]).push(val);
|
||||
}
|
||||
|
||||
export function setKeypressDuration(val) {
|
||||
export function setKeypressDuration(val: number): void {
|
||||
keypressTimings.duration.current = val;
|
||||
}
|
||||
|
||||
function pushKeypressSpacing(val) {
|
||||
keypressTimings.spacing.array.push(val);
|
||||
function pushKeypressSpacing(val: number): void {
|
||||
(keypressTimings.spacing.array as number[]).push(val);
|
||||
}
|
||||
|
||||
function setKeypressSpacing(val) {
|
||||
function setKeypressSpacing(val: number): void {
|
||||
keypressTimings.spacing.current = val;
|
||||
}
|
||||
|
||||
export function recordKeypressSpacing() {
|
||||
let now = performance.now();
|
||||
let diff = Math.abs(keypressTimings.spacing.current - now);
|
||||
export function recordKeypressSpacing(): void {
|
||||
const now = performance.now();
|
||||
const diff = Math.abs(keypressTimings.spacing.current - now);
|
||||
if (keypressTimings.spacing.current !== -1) {
|
||||
pushKeypressSpacing(diff);
|
||||
if (spacingDebug)
|
||||
|
|
@ -235,7 +264,7 @@ export function recordKeypressSpacing() {
|
|||
);
|
||||
}
|
||||
|
||||
export function resetKeypressTimings() {
|
||||
export function resetKeypressTimings(): void {
|
||||
keypressTimings = {
|
||||
spacing: {
|
||||
current: performance.now(),
|
||||
|
|
@ -249,7 +278,7 @@ export function resetKeypressTimings() {
|
|||
if (spacingDebug) console.clear();
|
||||
}
|
||||
|
||||
export function pushMissedWord(word) {
|
||||
export function pushMissedWord(word: string): void {
|
||||
if (!Object.keys(missedWords).includes(word)) {
|
||||
missedWords[word] = 1;
|
||||
} else {
|
||||
|
|
@ -257,15 +286,15 @@ export function pushMissedWord(word) {
|
|||
}
|
||||
}
|
||||
|
||||
export function pushToWpmHistory(word) {
|
||||
wpmHistory.push(word);
|
||||
export function pushToWpmHistory(wpm: number): void {
|
||||
wpmHistory.push(wpm);
|
||||
}
|
||||
|
||||
export function pushToRawHistory(word) {
|
||||
rawHistory.push(word);
|
||||
export function pushToRawHistory(raw: number): void {
|
||||
rawHistory.push(raw);
|
||||
}
|
||||
|
||||
export function pushBurstToHistory(speed) {
|
||||
export function pushBurstToHistory(speed: number): void {
|
||||
if (burstHistory[TestWords.words.currentIndex] === undefined) {
|
||||
burstHistory.push(speed);
|
||||
} else {
|
||||
|
|
@ -274,7 +303,7 @@ export function pushBurstToHistory(speed) {
|
|||
}
|
||||
}
|
||||
|
||||
export function restart() {
|
||||
export function restart(): void {
|
||||
wpmHistory = [];
|
||||
rawHistory = [];
|
||||
burstHistory = [];
|
||||
|
|
@ -3,19 +3,95 @@ import * as Misc from "../misc";
|
|||
import * as TestInput from "./test-input";
|
||||
import * as TestWords from "./test-words";
|
||||
|
||||
type CharCount = {
|
||||
spaces: number;
|
||||
correctWordChars: number;
|
||||
allCorrectChars: number;
|
||||
incorrectChars: number;
|
||||
extraChars: number;
|
||||
missedChars: number;
|
||||
correctSpaces: number;
|
||||
};
|
||||
|
||||
type Keypress = {
|
||||
count: number;
|
||||
errors: number;
|
||||
words: string[];
|
||||
afk: boolean;
|
||||
};
|
||||
|
||||
type KeypressTimings = {
|
||||
spacing: {
|
||||
current: number;
|
||||
array: number[] | "toolong";
|
||||
};
|
||||
duration: {
|
||||
current: number;
|
||||
array: number[] | "toolong";
|
||||
};
|
||||
};
|
||||
|
||||
type DebugStats = {
|
||||
start: number;
|
||||
end: number;
|
||||
wpmHistory: number[];
|
||||
rawHistory: number[];
|
||||
burstHistory: number[];
|
||||
keypressPerSecond: Keypress[];
|
||||
currentKeypress: {
|
||||
count: number;
|
||||
errors: number;
|
||||
words: string[];
|
||||
afk: boolean;
|
||||
};
|
||||
lastKeypress: number;
|
||||
currentBurstStart: number;
|
||||
lastSecondNotRound: boolean;
|
||||
missedWords: {
|
||||
[word: string]: number;
|
||||
};
|
||||
accuracy: {
|
||||
correct: number;
|
||||
incorrect: number;
|
||||
};
|
||||
keypressTimings: KeypressTimings;
|
||||
keySpacingStats?: {
|
||||
average: number;
|
||||
sd: number;
|
||||
};
|
||||
keyDurationStats?: {
|
||||
average: number;
|
||||
sd: number;
|
||||
};
|
||||
};
|
||||
|
||||
type Stats = {
|
||||
wpm: number;
|
||||
wpmRaw: number;
|
||||
acc: number;
|
||||
correctChars: number;
|
||||
incorrectChars: number;
|
||||
missedChars: number;
|
||||
extraChars: number;
|
||||
allChars: number;
|
||||
time: number;
|
||||
spaces: number;
|
||||
correctSpaces: number;
|
||||
};
|
||||
|
||||
export let invalid = false;
|
||||
export let start, end;
|
||||
export let start2, end2;
|
||||
export let start: number, end: number;
|
||||
export let start2: number, end2: number;
|
||||
export let lastSecondNotRound = false;
|
||||
|
||||
export let lastTestWpm = 0;
|
||||
|
||||
export function setLastTestWpm(wpm) {
|
||||
export function setLastTestWpm(wpm: number): void {
|
||||
lastTestWpm = wpm;
|
||||
}
|
||||
|
||||
export function getStats() {
|
||||
let ret = {
|
||||
export function getStats(): DebugStats {
|
||||
const ret: DebugStats = {
|
||||
start,
|
||||
end,
|
||||
wpmHistory: TestInput.wpmHistory,
|
||||
|
|
@ -34,10 +110,10 @@ export function getStats() {
|
|||
try {
|
||||
ret.keySpacingStats = {
|
||||
average:
|
||||
TestInput.keypressTimings.spacing.array.reduce(
|
||||
(TestInput.keypressTimings.spacing.array as number[]).reduce(
|
||||
(previous, current) => (current += previous)
|
||||
) / TestInput.keypressTimings.spacing.array.length,
|
||||
sd: Misc.stdDev(TestInput.keypressTimings.spacing.array),
|
||||
sd: Misc.stdDev(TestInput.keypressTimings.spacing.array as number[]),
|
||||
};
|
||||
} catch (e) {
|
||||
//
|
||||
|
|
@ -45,10 +121,10 @@ export function getStats() {
|
|||
try {
|
||||
ret.keyDurationStats = {
|
||||
average:
|
||||
TestInput.keypressTimings.duration.array.reduce(
|
||||
(TestInput.keypressTimings.duration.array as number[]).reduce(
|
||||
(previous, current) => (current += previous)
|
||||
) / TestInput.keypressTimings.duration.array.length,
|
||||
sd: Misc.stdDev(TestInput.keypressTimings.duration.array),
|
||||
sd: Misc.stdDev(TestInput.keypressTimings.duration.array as number[]),
|
||||
};
|
||||
} catch (e) {
|
||||
//
|
||||
|
|
@ -57,7 +133,7 @@ export function getStats() {
|
|||
return ret;
|
||||
}
|
||||
|
||||
export function restart() {
|
||||
export function restart(): void {
|
||||
start = 0;
|
||||
end = 0;
|
||||
invalid = false;
|
||||
|
|
@ -67,26 +143,26 @@ export function restart() {
|
|||
export let restartCount = 0;
|
||||
export let incompleteSeconds = 0;
|
||||
|
||||
export function incrementRestartCount() {
|
||||
export function incrementRestartCount(): void {
|
||||
restartCount++;
|
||||
}
|
||||
|
||||
export function incrementIncompleteSeconds(val) {
|
||||
export function incrementIncompleteSeconds(val: number): void {
|
||||
incompleteSeconds += val;
|
||||
}
|
||||
|
||||
export function resetIncomplete() {
|
||||
export function resetIncomplete(): void {
|
||||
restartCount = 0;
|
||||
incompleteSeconds = 0;
|
||||
}
|
||||
|
||||
export function setInvalid() {
|
||||
export function setInvalid(): void {
|
||||
invalid = true;
|
||||
}
|
||||
|
||||
export function calculateTestSeconds(now) {
|
||||
export function calculateTestSeconds(now?: number): number {
|
||||
if (now === undefined) {
|
||||
let endAfkSeconds = (end - TestInput.lastKeypress) / 1000;
|
||||
const endAfkSeconds = (end - TestInput.lastKeypress) / 1000;
|
||||
if ((Config.mode == "zen" || TestInput.bailout) && endAfkSeconds < 7) {
|
||||
return (TestInput.lastKeypress - start) / 1000;
|
||||
} else {
|
||||
|
|
@ -97,13 +173,13 @@ export function calculateTestSeconds(now) {
|
|||
}
|
||||
}
|
||||
|
||||
export function calculateWpmAndRaw() {
|
||||
export function calculateWpmAndRaw(): { wpm: number; raw: number } {
|
||||
let chars = 0;
|
||||
let correctWordChars = 0;
|
||||
let spaces = 0;
|
||||
//check input history
|
||||
for (let i = 0; i < TestInput.input.history.length; i++) {
|
||||
let word =
|
||||
const word =
|
||||
Config.mode == "zen"
|
||||
? TestInput.input.getHistory(i)
|
||||
: TestWords.words.get(i);
|
||||
|
|
@ -113,7 +189,7 @@ export function calculateWpmAndRaw() {
|
|||
correctWordChars += word.length;
|
||||
if (
|
||||
i < TestInput.input.history.length - 1 &&
|
||||
Misc.getLastChar(TestInput.input.getHistory(i)) !== "\n"
|
||||
Misc.getLastChar(TestInput.input.getHistory(i) as string) !== "\n"
|
||||
) {
|
||||
spaces++;
|
||||
}
|
||||
|
|
@ -121,12 +197,12 @@ export function calculateWpmAndRaw() {
|
|||
chars += TestInput.input.getHistory(i).length;
|
||||
}
|
||||
if (TestInput.input.current !== "") {
|
||||
let word =
|
||||
const word =
|
||||
Config.mode == "zen"
|
||||
? TestInput.input.current
|
||||
: TestWords.words.getCurrent();
|
||||
//check whats currently typed
|
||||
let toAdd = {
|
||||
const toAdd = {
|
||||
correct: 0,
|
||||
incorrect: 0,
|
||||
missed: 0,
|
||||
|
|
@ -156,26 +232,28 @@ export function calculateWpmAndRaw() {
|
|||
spaces = 0;
|
||||
}
|
||||
chars += TestInput.input.current.length;
|
||||
let testSeconds = calculateTestSeconds(performance.now());
|
||||
let wpm = Math.round(((correctWordChars + spaces) * (60 / testSeconds)) / 5);
|
||||
let raw = Math.round(((chars + spaces) * (60 / testSeconds)) / 5);
|
||||
const testSeconds = calculateTestSeconds(performance.now());
|
||||
const wpm = Math.round(
|
||||
((correctWordChars + spaces) * (60 / testSeconds)) / 5
|
||||
);
|
||||
const raw = Math.round(((chars + spaces) * (60 / testSeconds)) / 5);
|
||||
return {
|
||||
wpm: wpm,
|
||||
raw: raw,
|
||||
};
|
||||
}
|
||||
|
||||
export function setEnd(e) {
|
||||
export function setEnd(e: number): void {
|
||||
end = e;
|
||||
end2 = Date.now();
|
||||
}
|
||||
|
||||
export function setStart(s) {
|
||||
export function setStart(s: number): void {
|
||||
start = s;
|
||||
start2 = Date.now();
|
||||
}
|
||||
|
||||
export function calculateAfkSeconds(testSeconds) {
|
||||
export function calculateAfkSeconds(testSeconds: number): number {
|
||||
let extraAfk = 0;
|
||||
if (testSeconds !== undefined) {
|
||||
if (Config.mode === "time") {
|
||||
|
|
@ -191,16 +269,16 @@ export function calculateAfkSeconds(testSeconds) {
|
|||
// `gonna add extra ${extraAfk} seconds of afk because of no keypress data`
|
||||
// );
|
||||
}
|
||||
let ret = TestInput.keypressPerSecond.filter((x) => x.afk).length;
|
||||
const ret = TestInput.keypressPerSecond.filter((x) => x.afk).length;
|
||||
return ret + extraAfk;
|
||||
}
|
||||
|
||||
export function setLastSecondNotRound() {
|
||||
export function setLastSecondNotRound(): void {
|
||||
lastSecondNotRound = true;
|
||||
}
|
||||
|
||||
export function calculateBurst() {
|
||||
let timeToWrite = (performance.now() - TestInput.currentBurstStart) / 1000;
|
||||
export function calculateBurst(): number {
|
||||
const timeToWrite = (performance.now() - TestInput.currentBurstStart) / 1000;
|
||||
let wordLength;
|
||||
if (Config.mode === "zen") {
|
||||
wordLength = TestInput.input.current.length;
|
||||
|
|
@ -210,27 +288,27 @@ export function calculateBurst() {
|
|||
} else {
|
||||
wordLength = TestWords.words.getCurrent().length;
|
||||
}
|
||||
let speed = Misc.roundTo2((wordLength * (60 / timeToWrite)) / 5);
|
||||
const speed = Misc.roundTo2((wordLength * (60 / timeToWrite)) / 5);
|
||||
return Math.round(speed);
|
||||
}
|
||||
|
||||
export function calculateAccuracy() {
|
||||
let acc =
|
||||
export function calculateAccuracy(): number {
|
||||
const acc =
|
||||
(TestInput.accuracy.correct /
|
||||
(TestInput.accuracy.correct + TestInput.accuracy.incorrect)) *
|
||||
100;
|
||||
return isNaN(acc) ? 100 : acc;
|
||||
}
|
||||
|
||||
export function removeAfkData() {
|
||||
let testSeconds = calculateTestSeconds();
|
||||
export function removeAfkData(): void {
|
||||
const testSeconds = calculateTestSeconds();
|
||||
TestInput.keypressPerSecond.splice(testSeconds);
|
||||
TestInput.keypressTimings.duration.array.splice(testSeconds);
|
||||
TestInput.keypressTimings.spacing.array.splice(testSeconds);
|
||||
(TestInput.keypressTimings.duration.array as number[]).splice(testSeconds);
|
||||
(TestInput.keypressTimings.spacing.array as number[]).splice(testSeconds);
|
||||
TestInput.wpmHistory.splice(testSeconds);
|
||||
}
|
||||
|
||||
function countChars() {
|
||||
function countChars(): CharCount {
|
||||
let correctWordChars = 0;
|
||||
let correctChars = 0;
|
||||
let incorrectChars = 0;
|
||||
|
|
@ -239,7 +317,7 @@ function countChars() {
|
|||
let spaces = 0;
|
||||
let correctspaces = 0;
|
||||
for (let i = 0; i < TestInput.input.history.length; i++) {
|
||||
let word =
|
||||
const word =
|
||||
Config.mode == "zen"
|
||||
? TestInput.input.getHistory(i)
|
||||
: TestWords.words.get(i);
|
||||
|
|
@ -253,7 +331,7 @@ function countChars() {
|
|||
correctChars += word.length;
|
||||
if (
|
||||
i < TestInput.input.history.length - 1 &&
|
||||
Misc.getLastChar(TestInput.input.getHistory(i)) !== "\n"
|
||||
Misc.getLastChar(TestInput.input.getHistory(i) as string) !== "\n"
|
||||
) {
|
||||
correctspaces++;
|
||||
}
|
||||
|
|
@ -274,7 +352,7 @@ function countChars() {
|
|||
}
|
||||
} else {
|
||||
//not enough chars
|
||||
let toAdd = {
|
||||
const toAdd = {
|
||||
correct: 0,
|
||||
incorrect: 0,
|
||||
missed: 0,
|
||||
|
|
@ -321,18 +399,18 @@ function countChars() {
|
|||
};
|
||||
}
|
||||
|
||||
export function calculateStats() {
|
||||
export function calculateStats(): Stats {
|
||||
let testSeconds = calculateTestSeconds();
|
||||
console.log((end2 - start2) / 1000);
|
||||
console.log(testSeconds);
|
||||
if (Config.mode != "custom") {
|
||||
testSeconds = Misc.roundTo2(testSeconds);
|
||||
}
|
||||
let chars = countChars();
|
||||
let wpm = Misc.roundTo2(
|
||||
const chars = countChars();
|
||||
const wpm = Misc.roundTo2(
|
||||
((chars.correctWordChars + chars.correctSpaces) * (60 / testSeconds)) / 5
|
||||
);
|
||||
let wpmraw = Misc.roundTo2(
|
||||
const wpmraw = Misc.roundTo2(
|
||||
((chars.allCorrectChars +
|
||||
chars.spaces +
|
||||
chars.incorrectChars +
|
||||
|
|
@ -340,7 +418,7 @@ export function calculateStats() {
|
|||
(60 / testSeconds)) /
|
||||
5
|
||||
);
|
||||
let acc = Misc.roundTo2(calculateAccuracy());
|
||||
const acc = Misc.roundTo2(calculateAccuracy());
|
||||
return {
|
||||
wpm: isNaN(wpm) ? 0 : wpm,
|
||||
wpmRaw: isNaN(wpmraw) ? 0 : wpmraw,
|
||||
Loading…
Add table
Reference in a new issue