您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Menú draggable con botones para reproducir sonidos locales de Drawaria.online y enviar el enlace del sonido al chat.
// ==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); })();