File size: 3,376 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
(function () {
    console.log("%c Monkeytype Cheat Initiated (Human 100 WPM) ", "background: #222; color: #bada55; font-size: 20px");

    function typeChar(char) {
        const target = document.activeElement || document.body;
        const key = char;
        const code = `Key${char.toUpperCase()}`;
        const eventOptions = {
            key: key,
            code: code,
            charCode: char.charCodeAt(0),
            keyCode: char.toUpperCase().charCodeAt(0),
            which: char.toUpperCase().charCodeAt(0),
            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));
    }

    // Standard WPM: 1 word = 5 chars. 100 WPM = 500 CPM.
    // 60000ms / 500 = 120ms per char.
    // We add randomness to make it look human.
    function getDelay() {
        // Base delay for 100 WPM
        const baseDelay = 120;
        // Random variance between -30ms and +30ms
        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 started?");
            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 += " ";
            }
        });

        const textToType = distinctText.substring(1);
        console.log(`Typing ${textToType.length} characters at ~100 WPM...`);

        for (let i = 0; i < textToType.length; i++) {
            typeChar(textToType[i]);
            // Wait for a human-like delay
            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);
                setTimeout(cheat, 10);
            }
        }
    };

    window.addEventListener('keydown', triggerHandler);

    console.log("READY: Type the first correct letter of the current word to start human-like typing.");
})();