File size: 4,215 Bytes
364eb96
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
(function () {
    console.log("%c Monkeytype Cheat Initiated (Human 100 WPM + Fixes) ", "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;

        // Determine properties
        let key = char;
        let code, keyCode;

        if (keyMap[char]) {
            code = keyMap[char].code;
            keyCode = keyMap[char].keyCode;
        } else {
            // Fallback for letters/numbers
            code = `Key${char.toUpperCase()}`;
            keyCode = char.toUpperCase().charCodeAt(0);
        }

        const eventOptions = {
            key: key,
            code: code,
            keyCode: keyCode, // Important for legacy checks
            which: keyCode,
            bubbles: true,
            cancelable: true,
            isTrusted: true // Ignored by browser but good for consistency
        };

        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() {
        // ~100 WPM
        const baseDelay = 120;
        const variance = (Math.random() * 60) - 30;
        return baseDelay + variance;
    }

    async function cheat() {
        const activeWord = document.querySelector('#words .word.active');
        const allWords = document.querySelectorAll('#words .word');

        if (!activeWord) {
            console.error("Could not find active word. Is the test running?");
            return;
        }

        let distinctText = "";
        let foundActive = false;

        allWords.forEach(word => {
            if (word === activeWord) {
                foundActive = true;
            }
            if (foundActive) {
                const letters = word.querySelectorAll('letter');
                letters.forEach(l => distinctText += l.textContent);
                distinctText += " ";
            }
        });

        // The first char was typed by user.
        // We trim it.
        const textToType = distinctText.substring(1);
        console.log(`Typing ${textToType.length} characters...`);

        for (let i = 0; i < textToType.length; i++) {
            typeChar(textToType[i]);
            await new Promise(resolve => setTimeout(resolve, getDelay()));
        }
    }

    const triggerHandler = (e) => {
        const activeWord = document.querySelector('#words .word.active');
        if (activeWord && e.key.length === 1 && !e.ctrlKey && !e.altKey && !e.metaKey) {
            const firstLetterElement = activeWord.querySelector('letter');
            const firstLetter = firstLetterElement ? firstLetterElement.textContent : null;

            if (firstLetter && e.key === firstLetter) {
                window.removeEventListener('keydown', triggerHandler);
                // Increased delay to 150ms to prevent race condition with React state updates
                console.log("Trigger detected. Starting in 150ms...");
                setTimeout(cheat, 150);
            }
        }
    };

    window.addEventListener('keydown', triggerHandler);
    console.log("READY: Type the first letter to start.");
})();