| | (function () {
|
| | console.log("%c Monkeytype Command Typer (execCommand) ", "background: #222; color: #ff0000; font-size: 20px");
|
| |
|
| | const CONFIG = {
|
| | minWPM: 250,
|
| | maxWPM: 350,
|
| | errorRate: 0.15,
|
| | accuracy: 90,
|
| | startDelay: 50,
|
| | };
|
| |
|
| | let isArmed = true;
|
| |
|
| |
|
| |
|
| |
|
| | function typeChar(char) {
|
| | const target = document.activeElement || document.body;
|
| | const keyConfig = {
|
| | key: char,
|
| | code: char === ' ' ? 'Space' : `Key${char.toUpperCase()}`,
|
| | bubbles: true,
|
| | cancelable: true,
|
| | view: window
|
| | };
|
| |
|
| |
|
| | target.dispatchEvent(new KeyboardEvent('keydown', keyConfig));
|
| |
|
| |
|
| | target.dispatchEvent(new KeyboardEvent('keypress', keyConfig));
|
| |
|
| |
|
| | document.execCommand('insertText', false, char);
|
| |
|
| |
|
| |
|
| |
|
| |
|
| | target.dispatchEvent(new KeyboardEvent('keyup', keyConfig));
|
| | }
|
| |
|
| |
|
| | function sleep(ms) {
|
| | return new Promise(resolve => setTimeout(resolve, ms));
|
| | }
|
| |
|
| |
|
| |
|
| |
|
| | function getKeystrokeDelay() {
|
| |
|
| | const currentWPM = Math.floor(Math.random() * (CONFIG.maxWPM - CONFIG.minWPM + 1)) + CONFIG.minWPM;
|
| | const baseDelay = 60000 / (currentWPM * 5);
|
| |
|
| |
|
| | const variance = baseDelay * 0.2;
|
| | const noise = (Math.random() * variance * 2) - variance;
|
| |
|
| | return Math.max(10, baseDelay + noise);
|
| | }
|
| |
|
| | async function simulateMistake(correctChar) {
|
| | const possibleMistakes = "abcdefghijklmnopqrstuvwxyz";
|
| | const distinctMistake = possibleMistakes.charAt(Math.floor(Math.random() * possibleMistakes.length));
|
| |
|
| |
|
| | typeChar(distinctMistake);
|
| |
|
| |
|
| | await sleep(getKeystrokeDelay() * 2.5);
|
| |
|
| |
|
| |
|
| |
|
| | const target = document.activeElement || document.body;
|
| | const bsConfig = { key: 'Backspace', code: 'Backspace', bubbles: true, cancelable: true, view: window };
|
| |
|
| | target.dispatchEvent(new KeyboardEvent('keydown', bsConfig));
|
| | document.execCommand('delete', false, null);
|
| | target.dispatchEvent(new KeyboardEvent('keyup', bsConfig));
|
| |
|
| |
|
| | await sleep(getKeystrokeDelay() * 1.5);
|
| | }
|
| |
|
| | async function autoType(text) {
|
| | console.log(`Typing ${text.length} chars (Human-Like Method)...`);
|
| |
|
| | for (let i = 0; i < text.length; i++) {
|
| | const char = text[i];
|
| |
|
| |
|
| | if (/[a-zA-Z]/.test(char) && Math.random() < CONFIG.errorRate) {
|
| |
|
| |
|
| | await simulateMistake(char);
|
| | }
|
| |
|
| | typeChar(char);
|
| |
|
| | let delay = getKeystrokeDelay();
|
| |
|
| |
|
| | if (char === ' ') {
|
| | delay *= 1.3;
|
| | }
|
| |
|
| | await sleep(delay);
|
| | }
|
| | }
|
| |
|
| | const triggerHandler = (e) => {
|
| | if (!isArmed) return;
|
| |
|
| | if (e.key.length === 1 && !e.ctrlKey && !e.altKey && !e.metaKey) {
|
| |
|
| | const activeWord = document.querySelector('#words .word.active');
|
| | if (!activeWord) return;
|
| |
|
| | const firstLetterElement = activeWord.querySelector('letter');
|
| | const firstLetter = firstLetterElement ? firstLetterElement.textContent : null;
|
| |
|
| | if (firstLetter && e.key === firstLetter) {
|
| | isArmed = false;
|
| |
|
| |
|
| | const allWords = document.querySelectorAll('#words .word');
|
| | let fullBuffer = "";
|
| | let foundActive = false;
|
| |
|
| | allWords.forEach(word => {
|
| | if (word === activeWord) {
|
| | foundActive = true;
|
| | const letters = word.querySelectorAll('letter');
|
| | for (let i = 1; i < letters.length; i++) {
|
| | fullBuffer += letters[i].textContent;
|
| | }
|
| | fullBuffer += " ";
|
| | } else if (foundActive) {
|
| | const letters = word.querySelectorAll('letter');
|
| | letters.forEach(l => fullBuffer += l.textContent);
|
| | fullBuffer += " ";
|
| | }
|
| | });
|
| |
|
| | if (fullBuffer.endsWith(" ")) {
|
| | fullBuffer = fullBuffer.slice(0, -1);
|
| | }
|
| |
|
| | window.removeEventListener('keydown', triggerHandler);
|
| |
|
| | console.log("Trigger detected. Starting Command Typer...");
|
| | setTimeout(() => {
|
| | autoType(fullBuffer);
|
| | }, CONFIG.startDelay);
|
| | }
|
| | }
|
| | };
|
| |
|
| | window.addEventListener('keydown', triggerHandler);
|
| | console.log("READY! Type the first letter to test Command Mode.");
|
| | })();
|
| |
|