Drawaria Soundboard Menu

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

Vous devrez installer une extension telle que Tampermonkey, Greasemonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Userscripts pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension de gestionnaire de script utilisateur pour installer ce script.

(J'ai déjà un gestionnaire de scripts utilisateur, laissez-moi l'installer !)

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

(J'ai déjà un gestionnaire de style utilisateur, laissez-moi l'installer!)

// ==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);

})();