diff --git a/frontend/src/scripts/controllers/challenge-controller.js b/frontend/src/scripts/controllers/challenge-controller.ts similarity index 70% rename from frontend/src/scripts/controllers/challenge-controller.js rename to frontend/src/scripts/controllers/challenge-controller.ts index f05d5322d..74a001fe2 100644 --- a/frontend/src/scripts/controllers/challenge-controller.js +++ b/frontend/src/scripts/controllers/challenge-controller.ts @@ -10,7 +10,7 @@ import * as TestState from "../test/test-state"; let challengeLoading = false; -export function clearActive() { +export function clearActive(): void { if ( TestState.activeChallenge && !challengeLoading && @@ -21,10 +21,12 @@ export function clearActive() { } } -export function verify(result) { +export function verify( + result: MonkeyTypes.Result +): string | null { try { if (TestState.activeChallenge) { - let afk = (result.afkDuration / result.testDuration) * 100; + const afk = (result.afkDuration / result.testDuration) * 100; if (afk > 10) { Notifications.add(`Challenge failed: AFK time is greater than 10%`, 0); @@ -39,81 +41,87 @@ export function verify(result) { return TestState.activeChallenge.name; } else { let requirementsMet = true; - let failReasons = []; - for (let requirementType in TestState.activeChallenge.requirements) { - if (requirementsMet == false) return; - let requirementValue = - TestState.activeChallenge.requirements[requirementType]; + const failReasons = []; + for (const requirementType in TestState.activeChallenge.requirements) { + if (requirementsMet == false) return null; + const requirementValue = + TestState.activeChallenge.requirements[ + requirementType as keyof typeof TestState.activeChallenge.requirements + ]; if (requirementType == "wpm") { - let wpmMode = Object.keys(requirementValue)[0]; + const wpmMode = Object.keys(requirementValue)[0]; if (wpmMode == "exact") { - if (Math.round(result.wpm) != requirementValue.exact) { + if (Math.round(result.wpm) != requirementValue["exact"]) { requirementsMet = false; - failReasons.push(`WPM not ${requirementValue.exact}`); + failReasons.push(`WPM not ${requirementValue["exact"]}`); } } else if (wpmMode == "min") { - if (result.wpm < requirementValue.min) { + if (result.wpm < requirementValue["min"]) { requirementsMet = false; - failReasons.push(`WPM below ${requirementValue.min}`); + failReasons.push(`WPM below ${requirementValue["min"]}`); } } } else if (requirementType == "acc") { - let accMode = Object.keys(requirementValue)[0]; + const accMode = Object.keys(requirementValue)[0]; if (accMode == "exact") { - if (result.acc != requirementValue.exact) { + if (result.acc != requirementValue["exact"]) { requirementsMet = false; - failReasons.push(`Accuracy not ${requirementValue.exact}`); + failReasons.push(`Accuracy not ${requirementValue["exact"]}`); } } else if (accMode == "min") { - if (result.acc < requirementValue.min) { + if (result.acc < requirementValue["min"]) { requirementsMet = false; - failReasons.push(`Accuracy below ${requirementValue.min}`); + failReasons.push(`Accuracy below ${requirementValue["min"]}`); } } } else if (requirementType == "afk") { - let afkMode = Object.keys(requirementValue)[0]; + const afkMode = Object.keys(requirementValue)[0]; if (afkMode == "max") { - if (Math.round(afk) > requirementValue.max) { + if (Math.round(afk) > requirementValue["max"]) { requirementsMet = false; failReasons.push( - `AFK percentage above ${requirementValue.max}` + `AFK percentage above ${requirementValue["max"]}` ); } } } else if (requirementType == "time") { - let timeMode = Object.keys(requirementValue)[0]; + const timeMode = Object.keys(requirementValue)[0]; if (timeMode == "min") { - if (Math.round(result.testDuration) < requirementValue.min) { + if (Math.round(result.testDuration) < requirementValue["min"]) { requirementsMet = false; - failReasons.push(`Test time below ${requirementValue.min}`); + failReasons.push(`Test time below ${requirementValue["min"]}`); } } } else if (requirementType == "funbox") { - let funboxMode = requirementValue; + const funboxMode = requirementValue["exact"]; if (funboxMode != result.funbox) { requirementsMet = false; failReasons.push(`${funboxMode} funbox not active`); } } else if (requirementType == "raw") { - let rawMode = Object.keys(requirementValue)[0]; + const rawMode = Object.keys(requirementValue)[0]; if (rawMode == "exact") { - if (Math.round(result.rawWpm) != requirementValue.exact) { + if (Math.round(result.rawWpm) != requirementValue["exact"]) { requirementsMet = false; - failReasons.push(`Raw WPM not ${requirementValue.exact}`); + failReasons.push(`Raw WPM not ${requirementValue["exact"]}`); } } } else if (requirementType == "con") { - let conMode = Object.keys(requirementValue)[0]; + const conMode = Object.keys(requirementValue)[0]; if (conMode == "exact") { - if (Math.round(result.consistency) != requirementValue.exact) { + if (Math.round(result.consistency) != requirementValue["exact"]) { requirementsMet = false; - failReasons.push(`Consistency not ${requirementValue.exact}`); + failReasons.push( + `Consistency not ${requirementValue["exact"]}` + ); } } } else if (requirementType == "config") { - for (let configKey in requirementValue) { - let configValue = requirementValue[configKey]; - if (Config[configKey] != configValue) { + for (const configKey in requirementValue) { + const configValue = requirementValue[configKey]; + if ( + Config[configKey as keyof MonkeyTypes.Config] != configValue + ) { requirementsMet = false; failReasons.push(`${configKey} not set to ${configValue}`); } @@ -146,7 +154,7 @@ export function verify(result) { } else { return null; } - } catch (e) { + } catch (e: any) { console.error(e); Notifications.add( `Something went wrong when verifying challenge: ${e.message}`, @@ -156,13 +164,13 @@ export function verify(result) { } } -export async function setup(challengeName) { +export async function setup(challengeName: string): Promise { challengeLoading = true; UpdateConfig.setFunbox("none"); - let list = await Misc.getChallengeList(); - let challenge = list.filter((c) => c.name === challengeName)[0]; + const list = await Misc.getChallengeList(); + const challenge = list.filter((c) => c.name === challengeName)[0]; let notitext; try { if (challenge === undefined) { @@ -175,7 +183,7 @@ export async function setup(challengeName) { return false; } if (challenge.type === "customTime") { - UpdateConfig.setTimeConfig(challenge.parameters[0], true); + UpdateConfig.setTimeConfig(challenge.parameters[0] as number, true); UpdateConfig.setMode("time", true); UpdateConfig.setDifficulty("normal", true); if (challenge.name === "englishMaster") { @@ -184,18 +192,18 @@ export async function setup(challengeName) { UpdateConfig.setPunctuation(true, true); } } else if (challenge.type === "customWords") { - UpdateConfig.setWordCount(challenge.parameters[0], true); + UpdateConfig.setWordCount(challenge.parameters[0] as number, true); UpdateConfig.setMode("words", true); UpdateConfig.setDifficulty("normal", true); } else if (challenge.type === "customText") { - CustomText.setText(challenge.parameters[0].split(" ")); - CustomText.setIsWordRandom(challenge.parameters[1]); - CustomText.setWord(parseInt(challenge.parameters[2])); + CustomText.setText((challenge.parameters[0] as string).split(" ")); + CustomText.setIsWordRandom(challenge.parameters[1] as boolean); + CustomText.setWord(challenge.parameters[2] as number); UpdateConfig.setMode("custom", true); UpdateConfig.setDifficulty("normal", true); } else if (challenge.type === "script") { - let scriptdata = await fetch("/challenges/" + challenge.parameters[0]); - scriptdata = await scriptdata.text(); + const response = await fetch("/challenges/" + challenge.parameters[0]); + const scriptdata = await response.text(); let text = scriptdata.trim(); text = text.replace(/[\n\r\t ]/gm, " "); text = text.replace(/ +/gm, " "); @@ -204,7 +212,7 @@ export async function setup(challengeName) { UpdateConfig.setMode("custom", true); UpdateConfig.setDifficulty("normal", true); if (challenge.parameters[1] != null) { - UpdateConfig.setTheme(challenge.parameters[1]); + UpdateConfig.setTheme(challenge.parameters[1] as string); } if (challenge.parameters[2] != null) { Funbox.activate(challenge.parameters[2]); @@ -214,16 +222,19 @@ export async function setup(challengeName) { UpdateConfig.setMode("time", true); UpdateConfig.setDifficulty("master", true); } else if (challenge.type === "funbox") { - UpdateConfig.setFunbox(challenge.parameters[0], true); + UpdateConfig.setFunbox(challenge.parameters[0] as string, true); UpdateConfig.setDifficulty("normal", true); if (challenge.parameters[1] === "words") { - UpdateConfig.setWordCount(challenge.parameters[2], true); + UpdateConfig.setWordCount(challenge.parameters[2] as number, true); } else if (challenge.parameters[1] === "time") { - UpdateConfig.setTimeConfig(challenge.parameters[2], true); + UpdateConfig.setTimeConfig(challenge.parameters[2] as number, true); } - UpdateConfig.setMode(challenge.parameters[1], true); + UpdateConfig.setMode(challenge.parameters[1] as MonkeyTypes.Mode, true); if (challenge.parameters[3] !== undefined) { - UpdateConfig.setDifficulty(challenge.parameters[3], true); + UpdateConfig.setDifficulty( + challenge.parameters[3] as MonkeyTypes.Difficulty, + true + ); } } else if (challenge.type === "special") { if (challenge.name === "semimak") { @@ -253,6 +264,7 @@ export async function setup(challengeName) { return true; } catch (e) { Notifications.add("Something went wrong: " + e, -1); + return false; } }