| (function () {
|
| console.log("%c Monkeytype Cheat Initiated (Reactive/Smart Mode) ", "background: #222; color: #bada55; font-size: 20px");
|
|
|
| const keyMap = {
|
| ' ': { code: 'Space', keyCode: 32 },
|
| '\n': { code: 'Enter', keyCode: 13 },
|
| '.': { code: 'Period', keyCode: 190 },
|
| ',': { code: 'Comma', keyCode: 188 },
|
| ';': { code: 'Semicolon', keyCode: 186 },
|
| '\'': { code: 'Quote', keyCode: 222 },
|
| '/': { code: 'Slash', keyCode: 191 },
|
| '\\': { code: 'Backslash', keyCode: 220 },
|
| '-': { code: 'Minus', keyCode: 189 },
|
| '=': { code: 'Equal', keyCode: 187 },
|
| '[': { code: 'BracketLeft', keyCode: 219 },
|
| ']': { code: 'BracketRight', keyCode: 221 }
|
| };
|
|
|
| function typeChar(char) {
|
| const target = document.activeElement || document.body;
|
| let key = char;
|
| let code, keyCode;
|
|
|
| if (keyMap[char]) {
|
| code = keyMap[char].code;
|
| keyCode = keyMap[char].keyCode;
|
| } else {
|
| code = `Key${char.toUpperCase()}`;
|
| keyCode = char.toUpperCase().charCodeAt(0);
|
| }
|
|
|
| const eventOptions = {
|
| key: key,
|
| code: code,
|
| keyCode: keyCode,
|
| which: keyCode,
|
| bubbles: true,
|
| cancelable: true,
|
| isTrusted: true
|
| };
|
|
|
| target.dispatchEvent(new KeyboardEvent('keydown', eventOptions));
|
| target.dispatchEvent(new KeyboardEvent('keypress', eventOptions));
|
|
|
| const inputEvent = new InputEvent('input', {
|
| data: char,
|
| inputType: 'insertText',
|
| bubbles: true,
|
| cancelable: true
|
| });
|
| target.dispatchEvent(inputEvent);
|
|
|
| target.dispatchEvent(new KeyboardEvent('keyup', eventOptions));
|
| }
|
|
|
| function getDelay() {
|
| return 100 + (Math.random() * 60 - 30);
|
| }
|
|
|
| async function cheat() {
|
| console.log("Cheat running... Press Escape to stop.");
|
|
|
| while (true) {
|
|
|
| const activeWord = document.querySelector('#words .word.active');
|
|
|
|
|
| if (!activeWord) {
|
|
|
| const isResult = document.querySelector('#result');
|
| if (isResult && isResult.checkVisibility && isResult.checkVisibility()) {
|
| console.log("Test finished.");
|
| break;
|
| }
|
|
|
|
|
| await new Promise(r => setTimeout(r, 500));
|
| continue;
|
| }
|
|
|
|
|
|
|
|
|
| const nextLetterNode = activeWord.querySelector('letter:not(.correct):not(.incorrect)');
|
|
|
| if (nextLetterNode) {
|
|
|
| typeChar(nextLetterNode.textContent);
|
| } else {
|
|
|
|
|
|
|
| const nextWord = activeWord.nextElementSibling;
|
| if (nextWord && nextWord.classList.contains('word')) {
|
| typeChar(' ');
|
| } else {
|
| console.log("Last word finished.");
|
| break;
|
| }
|
| }
|
|
|
|
|
| await new Promise(r => setTimeout(r, getDelay()));
|
| }
|
| }
|
|
|
|
|
| const triggerHandler = (e) => {
|
|
|
| if (e.key.length === 1 && !e.ctrlKey && !e.altKey && !e.metaKey) {
|
| const activeWord = document.querySelector('#words .word.active');
|
| if (activeWord) {
|
| const firstLetter = activeWord.querySelector('letter');
|
|
|
| if (firstLetter && e.key === firstLetter.textContent) {
|
| window.removeEventListener('keydown', triggerHandler);
|
| console.log("Triggered! Taking over in 100ms...");
|
|
|
| setTimeout(cheat, 100);
|
| }
|
| }
|
| }
|
| };
|
|
|
| window.addEventListener('keydown', triggerHandler);
|
| console.log("READY: Reactive Mode. Type the first letter.");
|
| })(); |