Drawaria Timer Control

Control visual del temporizador en Drawaria.online

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください
// ==UserScript==
// @name         Drawaria Timer Control
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  Control visual del temporizador en Drawaria.online
// @author       YouTubeDrawaria
// @match        https://drawaria.online/*
// @grant        GM_addStyle
// @grant        GM_setValue
// @grant        GM_getValue
// @require      https://code.jquery.com/jquery-3.6.0.min.js
// @icon         https://www.google.com/s2/favicons?sz=64&domain=drawaria.online
// @license      MIT
// ==/UserScript==


/* globals $, jQuery, GM_addStyle, GM_setValue, GM_getValue */

(function() {
    'use strict';

    // --- Estilos para el menú ---
    GM_addStyle(`
        #timerControlMenu {
            position: fixed;
            top: 100px;
            left: 20px;
            background-color: #2c3e50; /* Color de fondo oscuro */
            border: 2px solid #3498db; /* Borde azul */
            border-radius: 8px;
            padding: 15px;
            z-index: 10001; /* Muy alto para estar encima de todo */
            color: #ecf0f1; /* Texto claro */
            font-family: Arial, sans-serif;
            box-shadow: 0 4px 8px rgba(0,0,0,0.3);
            cursor: grab;
            min-width: 250px;
        }
        #timerControlMenu h3 {
            margin-top: 0;
            margin-bottom: 10px;
            color: #3498db; /* Título azul */
            text-align: center;
            font-size: 18px;
        }
        #timerControlMenu label {
            display: block;
            margin-top: 10px;
            font-size: 14px;
        }
        #timerControlMenu input[type="number"],
        #timerControlMenu input[type="text"] {
            width: calc(100% - 22px);
            padding: 8px 10px;
            margin-top: 5px;
            border: 1px solid #7f8c8d;
            border-radius: 4px;
            background-color: #34495e; /* Input oscuro */
            color: #ecf0f1;
            font-size: 14px;
        }
        #timerControlMenu button {
            background-color: #3498db; /* Botón azul */
            color: white;
            border: none;
            padding: 10px 15px;
            margin-top: 15px;
            margin-right: 5px;
            border-radius: 4px;
            cursor: pointer;
            font-size: 14px;
            transition: background-color 0.3s ease;
        }
        #timerControlMenu button:hover {
            background-color: #2980b9; /* Azul más oscuro al pasar el mouse */
        }
        #timerControlMenu button:disabled {
            background-color: #7f8c8d;
            cursor: not-allowed;
        }
        #timerControlMenu .button-group {
            display: flex;
            justify-content: space-around;
            flex-wrap: wrap;
        }
        .timer-status {
            margin-top: 10px;
            font-style: italic;
            color: #95a5a6;
            font-size: 12px;
            text-align: center;
        }
    `);

    // --- Crear el HTML del menú ---
    const menuHtml = `
        <div id="timerControlMenu">
            <h3>Timer Control</h3>
            <label for="customTimeInput">Tiempo (segundos):</label>
            <input type="number" id="customTimeInput" value="60" min="1" max="999">

            <div class="button-group">
                <button id="setCustomTimerBtn">Fijar Tiempo</button>
                <button id="startCustomTimerBtn">Iniciar Custom</button>
            </div>
            <div class="button-group">
                <button id="stopCustomTimerBtn">Detener Custom</button>
                <button id="resetToGameTimerBtn">Resetear a Juego</button>
            </div>
             <div class="button-group">
                <button id="hideGameTimerBtn">Ocultar Timer Juego</button>
                <button id="showGameTimerBtn">Mostrar Timer Juego</button>
            </div>
            <div class="timer-status" id="timerControlStatus">Esperando...</div>
        </div>
    `;
    $('body').append(menuHtml);

    // --- Lógica para hacer el menú arrastrable ---
    let menu = $('#timerControlMenu');
    let offsetX, offsetY, isDragging = false;

    menu.on('mousedown', function(e) {
        if (e.target.tagName === 'INPUT' || e.target.tagName === 'BUTTON') {
            return; // No arrastrar si se hace clic en input/button
        }
        isDragging = true;
        offsetX = e.clientX - menu.offset().left;
        offsetY = e.clientY - menu.offset().top;
        menu.css('cursor', 'grabbing');
    });

    $(document).on('mousemove', function(e) {
        if (!isDragging) return;
        menu.offset({
            top: e.clientY - offsetY,
            left: e.clientX - offsetX
        });
    }).on('mouseup', function() {
        if (isDragging) {
            isDragging = false;
            menu.css('cursor', 'grab');
        }
    });

    // --- Variables para controlar el temporizador ---
    let customTimerInterval = null;
    let customTimeRemaining = 0;
    let customTotalTime = 0;
    let originalGameTimerObserver = null;
    let gameTimerIsHidden = false;

    const $timerTextElement = () => $('#rightbar .timer .timer-text'); // El texto del número
    const $timerSvgPath = () => $('#rightbar .timer .timer-bar svg path'); // La barra de progreso SVG
    const $gameTimerElement = () => $('#rightbar .timer');

    // --- Funciones del temporizador ---
    function updateStatus(message) {
        $('#timerControlStatus').text(message);
    }

    function getSvgPathLength() {
        const path = $timerSvgPath()[0];
        return path ? path.getTotalLength() : 295.416; // Valor por defecto si no se encuentra
    }
    const svgPathLength = getSvgPathLength(); // Obtener una vez

    function updateVisualTimer(seconds, totalSeconds) {
        const timerTextEl = $timerTextElement();
        const timerSvgPathEl = $timerSvgPath();

        if (timerTextEl.length) {
            timerTextEl.text(Math.max(0, Math.ceil(seconds)));
        }

        if (timerSvgPathEl.length) {
            let progress = 0;
            if (totalSeconds > 0) {
                progress = Math.max(0, seconds) / totalSeconds;
            }
            const offset = svgPathLength * (1 - progress);
            timerSvgPathEl.css('stroke-dashoffset', offset + 'px');
        }
    }

    function stopCustomTimer() {
        if (customTimerInterval) {
            clearInterval(customTimerInterval);
            customTimerInterval = null;
            updateStatus('Temporizador custom detenido.');
            $('#startCustomTimerBtn').prop('disabled', false);
             $('#stopCustomTimerBtn').prop('disabled', true);
        }
    }

    $('#setCustomTimerBtn').on('click', function() {
        const time = parseInt($('#customTimeInput').val());
        if (isNaN(time) || time <= 0) {
            alert("Por favor, introduce un tiempo válido en segundos.");
            return;
        }
        customTotalTime = time;
        customTimeRemaining = time;
        stopCustomTimer(); // Detiene cualquier temporizador custom anterior
        updateVisualTimer(customTimeRemaining, customTotalTime);
        updateStatus(`Tiempo fijado a ${customTotalTime}s. Haz clic en "Iniciar Custom".`);
        $('#startCustomTimerBtn').prop('disabled', false);
    });

    $('#startCustomTimerBtn').on('click', function() {
        if (customTotalTime <= 0) {
            alert("Fija un tiempo primero usando 'Fijar Tiempo'.");
            return;
        }
        if (customTimerInterval) { // Si ya hay uno corriendo, lo reinicia
            stopCustomTimer();
        }
        customTimeRemaining = customTotalTime; // Reinicia el conteo
        updateVisualTimer(customTimeRemaining, customTotalTime);

        updateStatus(`Temporizador custom iniciado (${customTotalTime}s).`);
        $('#startCustomTimerBtn').prop('disabled', true);
        $('#stopCustomTimerBtn').prop('disabled', false);


        customTimerInterval = setInterval(() => {
            customTimeRemaining--;
            updateVisualTimer(customTimeRemaining, customTotalTime);
            if (customTimeRemaining <= 0) {
                stopCustomTimer();
                updateStatus('Temporizador custom finalizado.');
                // Aquí podrías añadir un sonido o alguna otra indicación
            }
        }, 1000);
    });


    $('#stopCustomTimerBtn').on('click', function() {
        stopCustomTimer();
    });

    $('#resetToGameTimerBtn').on('click', function() {
        stopCustomTimer();
        // Intentar que el juego retome su visualización original es complejo
        // porque no sabemos el estado real del timer del juego.
        // Por ahora, solo detenemos el custom y el juego debería seguir su curso.
        // Si el timer del juego estaba oculto, lo mostramos.
        if(gameTimerIsHidden) {
            $gameTimerElement().show();
            gameTimerIsHidden = false;
        }
        updateStatus('Intentando resetear al temporizador del juego.');
        $('#startCustomTimerBtn').prop('disabled', false);
    });

    $('#hideGameTimerBtn').on('click', function() {
        $gameTimerElement().hide();
        gameTimerIsHidden = true;
        updateStatus('Temporizador del juego oculto.');
    });

    $('#showGameTimerBtn').on('click', function() {
        $gameTimerElement().show();
        gameTimerIsHidden = false;
        updateStatus('Temporizador del juego mostrado.');
    });


    // --- Observador para intentar detectar el temporizador del juego ---
    // Esto es experimental y podría no funcionar perfectamente.
    // La idea es resetear nuestro estado cuando el timer del juego se vuelve visible.
    const gameTimerNode = $gameTimerElement()[0];
    if (gameTimerNode) {
        originalGameTimerObserver = new MutationObserver(mutations => {
            mutations.forEach(mutation => {
                if (mutation.attributeName === 'style') {
                    const displayStyle = $gameTimerElement().css('display');
                    if (displayStyle === 'block' || displayStyle === 'flex') { // O cualquier estilo que use para mostrarse
                        if (!customTimerInterval) { // Si no hay un timer custom activo
                            // El timer del juego se ha mostrado, podría ser un nuevo turno
                            // Aquí podríamos intentar leer el valor inicial del juego, pero es difícil
                            // Por ahora, solo logueamos
                            // console.log("Game timer became visible.");
                            // updateStatus("Temporizador del juego detectado.");
                        }
                    }
                }
            });
        });
        originalGameTimerObserver.observe(gameTimerNode, { attributes: true });
    }

    updateStatus("Menú de control de timer cargado.");
    $('#stopCustomTimerBtn').prop('disabled', true); // Deshabilitar stop al inicio

    console.log("Drawaria Timer Control script loaded.");

})();