Drawaria Soundboard Menu

Menú draggable con botones para reproducir sonidos locales de Drawaria.online y enviar el enlace del sonido al chat.

Bu betiği kurabilmeniz için Tampermonkey, Greasemonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği yüklemek için Tampermonkey gibi bir uzantı yüklemeniz gerekir.

Bu betiği kurabilmeniz için Tampermonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Userscripts gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği indirebilmeniz için ayrıca Tampermonkey gibi bir eklenti kurmanız gerekmektedir.

Bu komut dosyasını yüklemek için bir kullanıcı komut dosyası yöneticisi uzantısı yüklemeniz gerekecek.

(Zaten bir kullanıcı komut dosyası yöneticim var, kurmama izin verin!)

Bu stili yüklemek için Stylus gibi bir uzantı yüklemeniz gerekir.

Bu stili yüklemek için Stylus gibi bir uzantı kurmanız gerekir.

Bu stili yükleyebilmek için Stylus gibi bir uzantı yüklemeniz gerekir.

Bu stili yüklemek için bir kullanıcı stili yöneticisi uzantısı yüklemeniz gerekir.

Bu stili yüklemek için bir kullanıcı stili yöneticisi uzantısı kurmanız gerekir.

Bu stili yükleyebilmek için bir kullanıcı stili yöneticisi uzantısı yüklemeniz gerekir.

(Zateb bir user-style yöneticim var, yükleyeyim!)

// ==UserScript==
// @name         Drawaria Soundboard Menu
// @namespace    http://tampermonkey.net/
// @version      1.4
// @description  Menú draggable con botones para reproducir sonidos locales de Drawaria.online y enviar el enlace del sonido al chat.
// @author       YouTubeDrawaria
// @match        https://drawaria.online/*
// @grant        none
// @license      MIT
// @icon         https://www.google.com/s2/favicons?sz=64&domain=drawaria.online
// ==/UserScript==

(function() {
    'use strict';

    // Lista de archivos de sonido identificados de la pestaña de red del juego.
    const localSoundFiles = [
        "guess", "tick", "afk", "selword", "otherguess", "turnresults", "turnaborted", "startdraw"
        // Agrega más nombres de sonido si los encuentras en el directorio /snd/
    ];

    // Almacenamiento de elementos de audio
    const audioElements = {};

    // URL base para los archivos de sonido del juego
    const soundBaseUrl = 'https://drawaria.online/snd/';

    // Función para inicializar y precargar elementos de audio
    function initializeAudio() {
        localSoundFiles.forEach(soundName => {
            const audio = new Audio(`${soundBaseUrl}${soundName}.mp3`);
            audio.preload = 'auto'; // Precargar el audio
            audio.volume = 0.5; // Volumen por defecto (puedes ajustarlo)
            audioElements[soundName] = audio;
        });
    }

    // Función para reproducir un sonido localmente
    function playLocalSound(soundName) {
        if (audioElements[soundName]) {
            audioElements[soundName].pause(); // Pausar si ya se está reproduciendo
            audioElements[soundName].currentTime = 0; // Reiniciar al principio
            audioElements[soundName].play().catch(e => {
                // Manejar errores de reproducción (ej. políticas de autoplay del navegador)
                // console.error("Drawaria Soundboard: Error al reproducir el sonido local:", soundName, e);
            });
        } else {
            // console.warn(`Drawaria Soundboard: Sonido "${soundName}" no encontrado o no inicializado.`);
        }
    }

    // Función para enviar el enlace del sonido al chat del juego
    function sendSoundLinkToChat(soundName) {
        const chatInput = document.querySelector("#chatbox_textinput");
        if (!chatInput) {
            updateErrorMessage("Campo de chat no encontrado.");
            return;
        }

        if (chatInput.disabled) {
            updateErrorMessage("El chat está deshabilitado. No se puede enviar el link.");
            return;
        }

        const soundLink = `${soundBaseUrl}${soundName}.mp3`;
        chatInput.value = soundLink; // Poner el link en el campo de chat

        // Simular la pulsación de la tecla Enter para enviar el mensaje
        // Esto depende de que jQuery esté disponible en la página del juego
        if (window.jQuery) {
            // Simula un evento de keydown para la tecla Enter (which: 13)
            window.jQuery(document).trigger(window.jQuery.Event("keydown", { which: 13 }));
            chatInput.value = ''; // Limpiar el campo de chat después de enviar
            updateErrorMessage("Link enviado al chat.", true);
        } else {
            updateErrorMessage("jQuery no encontrado. No se puede enviar el link al chat.", false);
        }
    }

    // Manejo de mensajes de error/éxito en la UI del soundboard
    let errorTimeout;
    function updateErrorMessage(message, isSuccess = false) {
        const errMsgElement = document.querySelector("#drawo-soundboard #error-message");
        if (errMsgElement) {
            errMsgElement.textContent = message;
            errMsgElement.style.color = isSuccess ? "#8f8" : "#f86"; // Verde para éxito, rojo para error

            clearTimeout(errorTimeout);
            errorTimeout = setTimeout(() => {
                errMsgElement.textContent = ""; // Limpiar el mensaje después de 3 segundos
            }, 3000);
        }
    }


    // --- Creación de la Interfaz de Usuario (UI) ---

    const menu = document.createElement('div');
    menu.id = "drawo-soundboard";
    Object.assign(menu.style, {
        position: 'fixed',
        top: '100px',
        left: '30px',
        zIndex: '9999',
        background: '#1d232a',
        padding: '13px',
        border: '2px solid #00b4d8',
        borderRadius: '11px',
        boxShadow: '0 7px 24px rgba(0,0,0,0.28)',
        color: '#eee',
        fontFamily: 'sans-serif',
        userSelect: 'none', // Evita la selección de texto en el soundboard
        minWidth: '140px',
        display: 'flex',
        flexDirection: 'column',
        gap: '8px',
    });

    const dragBar = document.createElement('div');
    Object.assign(dragBar.style, {
        cursor: 'grab',
        fontWeight: 'bold',
        marginBottom: '9px',
        textAlign: 'center',
    });
    dragBar.textContent = "🎶 Drawaria Sounds";
    menu.appendChild(dragBar);

    const errMsgDisplay = document.createElement('div');
    errMsgDisplay.id = "error-message"; // ID para facilitar la segmentación
    Object.assign(errMsgDisplay.style, {
        color: "#f86",
        fontSize: "13px",
        marginBottom: "5px",
        textAlign: 'center',
    });
    menu.appendChild(errMsgDisplay);

    const buttonsContainer = document.createElement('div');
    buttonsContainer.style.display = 'grid';
    buttonsContainer.style.gridTemplateColumns = 'repeat(auto-fit, minmax(120px, 1fr))';
    buttonsContainer.style.gap = '8px';
    menu.appendChild(buttonsContainer);

    // Crear un botón para cada sonido
    localSoundFiles.forEach(soundName => {
        const btn = document.createElement('button');
        // Formatear el nombre para mostrarlo (ej. "startdraw" -> "Start Draw")
        btn.textContent = soundName.replace(/([A-Z])/g, ' $1').replace(/^./, str => str.toUpperCase()).trim();
        Object.assign(btn.style, {
            padding: '5px 10px',
            background: '#023e8a',
            color: '#fff',
            border: 'none',
            borderRadius: '6px',
            cursor: 'pointer',
            flexShrink: 0,
            whiteSpace: 'nowrap',
            overflow: 'hidden',
            textOverflow: 'ellipsis',
        });
        btn.onmouseenter = () => btn.style.background = '#0096c7';
        btn.onmouseleave = () => btn.style.background = '#023e8a';
        btn.onclick = () => {
            playLocalSound(soundName); // Reproducir localmente
            sendSoundLinkToChat(soundName); // Enviar el enlace al chat
        };
        buttonsContainer.appendChild(btn);
    });

    document.body.appendChild(menu);

    // --- Funcionalidad de Arrastre (Draggable) ---
    let offsetX = 0, offsetY = 0, dragging = false;

    dragBar.onmousedown = function(e) {
        dragging = true;
        dragBar.style.cursor = 'grabbing';
        offsetX = e.clientX - menu.offsetLeft;
        offsetY = e.clientY - menu.offsetTop;
        document.body.style.userSelect = 'none'; // Prevenir la selección de texto
        e.preventDefault(); // Prevenir el comportamiento predeterminado del navegador
    };

    document.onmousemove = function(e) {
        if (dragging) {
            menu.style.left = (e.clientX - offsetX) + "px";
            menu.style.top = (e.clientY - offsetY) + "px";
        }
    };

    document.onmouseup = function() {
        dragging = false;
        dragBar.style.cursor = 'grab';
        document.body.style.userSelect = ''; // Re-habilitar la selección de texto
    };

    // Inicializar los elementos de audio cuando el DOM esté completamente cargado
    window.addEventListener('load', initializeAudio);

})();