Nitrotype Auto Typing Bot

Automatically types during Nitrotype races with customizable settings.

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

You will need to install an extension such as Tampermonkey to install this script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Necesitará instalar una extensión como Tampermonkey para instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==UserScript==
// @name         Nitrotype Auto Typing Bot
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  Automatically types during Nitrotype races with customizable settings.
// @author       Simeon
// @match        *://www.nitrotype.com/*
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    let raceText = '';
    let typingDelay = 200; // Default typing delay
    let accuracy = 100; // Default accuracy
    let totalRaces = 1; // Default number of races
    let currentRaceCount = 0; // Current race counter

    // Create a UI for settings
    const createUI = () => {
        const uiDiv = document.createElement('div');
        uiDiv.style.position = 'fixed';
        uiDiv.style.top = '10px';
        uiDiv.style.right = '10px';
        uiDiv.style.backgroundColor = 'white';
        uiDiv.style.padding = '10px';
        uiDiv.style.zIndex = '1000';
        uiDiv.style.border = '1px solid black';

        uiDiv.innerHTML = `
            <h4>Nitrotype Auto Typing Bot</h4>
            <label for="wpm">Desired WPM:</label>
            <input type="number" id="wpm" min="1" value="40">
            <br>
            <label for="accuracy">Accuracy (%):</label>
            <input type="number" id="accuracy" min="0" max="100" value="100">
            <br>
            <label for="races">Number of Races:</label>
            <input type="number" id="races" min="1" value="1">
            <br>
            <button id="startRacing">Start Racing</button>
        `;

        document.body.appendChild(uiDiv);

        // Start racing on button click
        document.getElementById('startRacing').addEventListener('click', () => {
            const wpm = parseInt(document.getElementById('wpm').value);
            accuracy = parseInt(document.getElementById('accuracy').value);
            totalRaces = parseInt(document.getElementById('races').value);
            typingDelay = (60000 / wpm) / 5; // Calculate typing delay based on WPM
            currentRaceCount = 0; // Reset race counter
            alert("Settings saved! The bot will start racing.");
        });
    };

    // Detect race text and start typing
    const detectRaceText = () => {
        const textElement = document.querySelector('.race-text'); // Adjust selector as needed
        if (textElement) {
            raceText = textElement.innerText;
            console.log("Detected race text:", raceText);
            setTimeout(() => {
                simulateTyping(raceText);
            }, 3000); // Delay before typing
        }
    };

    const simulateTyping = (text) => {
        const inputField = document.querySelector('.input-field'); // Adjust selector as needed
        if (inputField) {
            inputField.focus();
            let lastIndex = 0;

            const typeNextCharacter = () => {
                if (lastIndex < text.length) {
                    const isAccurate = Math.random() * 100 < accuracy; // Determine if the character is accurate
                    const charToType = isAccurate ? text[lastIndex] : getRandomCharacter();

                    inputField.value += charToType; // Append character
                    inputField.dispatchEvent(new Event('input')); // Trigger input event

                    lastIndex++;
                    const delay = typingDelay + Math.random() * 50; // Randomize delay for realism
                    setTimeout(typeNextCharacter, delay);
                } else {
                    currentRaceCount++;
                    if (currentRaceCount < totalRaces) {
                        setTimeout(detectRaceText, 3000); // Delay before the next race
                    }
                }
            };

            typeNextCharacter();
        }
    };

    const getRandomCharacter = () => {
        const characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789":?-*\.,; ';
        return characters.charAt(Math.floor(Math.random() * characters.length));
    };

    // Monitor for race events
    const raceObserver = new MutationObserver(detectRaceText);
    raceObserver.observe(document.body, { childList: true, subtree: true });

    // Initialize the UI
    createUI();
})();