您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Panel de control avanzado con auto-kick, auto-prohibit, spam tools y un panel de actividad separado para Drawaria.online
// ==UserScript== // @name Drawaria Advanced Control Panel - Multi-Panel // @namespace http://tampermonkey.net/ // @version 1.1 // @description Panel de control avanzado con auto-kick, auto-prohibit, spam tools y un panel de actividad separado para Drawaria.online // @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'; // Global definitions const GLITCH_TEXT_STRINGS = { "welcome_glitch": "꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅꧅", "chaos_text": "ॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐॐ", "symbols": "▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓" }; class DrawariaAdvancedPanel { constructor() { this.init(); } init() { if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', () => this.setup()); } else { this.setup(); } } setup() { this.createStyles(); this.initializeVariables(); // Initialize variables before creating panels this.createMainPanel(); this.createActivityPanel(); this.createBroadcastPanel(); // New: Create Broadcast Panel this.setupEventListeners(); this.initializeBotConnection(); console.log('🎯 Drawaria Advanced Control Panel loaded!'); } createStyles() { const styles = ` /* Base Panel Styles (shared) */ .drawaria-panel { position: fixed; width: 350px; min-height: 50px; border-radius: 15px; box-shadow: 0 15px 35px rgba(0,0,0,0.4); z-index: 999999; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; color: white; user-select: none; cursor: grab; /* Changed to grab for clarity */ transition: all 0.3s ease; border: 2px solid rgba(255,255,255,0.2); box-sizing: border-box; /* Include padding/border in element's total width/height */ } .drawaria-panel:hover { box-shadow: 0 20px 40px rgba(0,0,0,0.5); transform: translateY(-2px); } .drawaria-panel.minimized { height: 50px; overflow: hidden; min-height: auto; /* Allow minimization to override min-height */ } .panel-header { background: rgba(0,0,0,0.3); padding: 15px; border-radius: 13px 13px 0 0; display: flex; justify-content: space-between; align-items: center; font-weight: bold; font-size: 16px; text-shadow: 0 1px 2px rgba(0,0,0,0.5); backdrop-filter: blur(10px); cursor: grab; } .panel-header:active { cursor: grabbing; } .panel-content { padding: 20px; max-height: 600px; overflow-y: auto; } .panel-content::-webkit-scrollbar { width: 8px; } .panel-content::-webkit-scrollbar-track { background: rgba(255,255,255,0.1); border-radius: 4px; } .panel-content::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.3); border-radius: 4px; } .panel-content::-webkit-scrollbar-thumb:hover { background: rgba(255,255,255,0.5); } .control-section { margin-bottom: 20px; padding: 15px; background: rgba(255,255,255,0.15); border-radius: 10px; border-left: 4px solid #fff; backdrop-filter: blur(5px); } .control-section h3 { margin: 0 0 15px 0; font-size: 14px; text-transform: uppercase; letter-spacing: 1px; display: flex; align-items: center; gap: 8px; } .control-btn { width: 100%; padding: 12px 15px; margin: 8px 0; border: none; border-radius: 8px; background: rgba(255,255,255,0.2); color: white; font-size: 13px; font-weight: 500; cursor: pointer; transition: all 0.3s ease; display: flex; align-items: center; gap: 10px; text-transform: uppercase; letter-spacing: 0.5px; } .control-btn:hover { background: rgba(255,255,255,0.3); transform: translateY(-1px); box-shadow: 0 4px 12px rgba(0,0,0,0.2); } .control-btn.active { background: linear-gradient(45deg, #4CAF50, #45a049); box-shadow: 0 4px 15px rgba(76,175,80,0.4); animation: pulse 2s infinite; } .control-btn.danger.active { background: linear-gradient(45deg, #f44336, #d32f2f); box-shadow: 0 4px 15px rgba(244,67,54,0.4); } .control-btn.warning.active { background: linear-gradient(45deg, #FF9800, #f57c00); box-shadow: 0 4px 15px rgba(255,152,0,0.4); } @keyframes pulse { 0% { transform: scale(1); } 50% { transform: scale(1.02); } 100% { transform: scale(1); } } .status-display { background: rgba(0,0,0,0.4); border-radius: 8px; padding: 12px; margin-top: 15px; font-size: 11px; max-height: 120px; overflow-y: auto; border: 1px solid rgba(255,255,255,0.1); } .status-line { margin: 3px 0; opacity: 0.9; padding: 2px 0; } .status-success { color: #4CAF50; } .status-warning { color: #FF9800; } .status-error { color: #f44336; } .status-info { color: #2196F3; } .minimize-btn { background: rgba(255,255,255,0.2); border: none; color: white; width: 30px; height: 30px; border-radius: 50%; cursor: pointer; font-size: 18px; font-weight: bold; transition: all 0.3s ease; } .minimize-btn:hover { background: rgba(255,255,255,0.3); transform: rotate(180deg); } .stats-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 10px; } .stat-box { background: rgba(0,0,0,0.3); padding: 8px; border-radius: 6px; text-align: center; font-size: 11px; } .stat-number { font-size: 18px; font-weight: bold; display: block; margin-bottom: 2px; } .emergency-stop { background: linear-gradient(45deg, #ff1744, #d50000) !important; animation: blink 1s infinite; } @keyframes blink { 0%, 50% { opacity: 1; } 51%, 100% { opacity: 0.7; } } /* Activity Panel Specific Styles */ #drawaria-activity-panel { top: 20px; right: 400px; /* Position next to main panel */ background: linear-gradient(135deg, #1a2a6c 0%, #b21f1f 100%); /* Deep Blue to Red */ min-height: 250px; /* Adjust as needed for content */ } #drawaria-broadcast-panel { top: 300px; /* Position below activity panel */ right: 400px; /* Align with activity panel */ background: linear-gradient(135deg, #fc00ff 0%, #00dbde 100%); /* Pink to Cyan */ min-height: 180px; /* Adjust as needed */ } .activity-controls { display: flex; flex-direction: column; gap: 8px; } #activity-input { padding: 10px; border: none; border-radius: 6px; background: rgba(255,255,255,0.2); color: white; font-size: 13px; outline: none; } #activity-input::placeholder { color: rgba(255,255,255,0.6); } #activity-input:focus { background: rgba(255,255,255,0.3); box-shadow: 0 0 10px rgba(255,255,255,0.2); } .activity-display { background: rgba(0,0,0,0.4); border-radius: 8px; padding: 12px; margin-top: 10px; border-left: 4px solid #4CAF50; } .activity-status { font-weight: bold; margin-bottom: 5px; color: #4CAF50; } .activity-duration { font-size: 11px; opacity: 0.8; } .broadcast-settings { margin-top: 10px; font-size: 11px; } .broadcast-settings label { display: block; /* Ensures label takes full width */ margin-top: 5px; /* Spacing for the select */ } .broadcast-settings select { background: rgba(255,255,255,0.2); color: white; border: none; border-radius: 4px; padding: 4px; margin-left: 5px; /* Adjust spacing as needed */ width: calc(100% - 70px); /* Adjust width to fit */ } .broadcast-settings select option { background-color: #333; /* Darker background for options */ color: white; } .activity-display.active { border-left-color: #2196F3; animation: pulse-activity 3s infinite; } @keyframes pulse-activity { 0%, 100% { border-left-color: #2196F3; } 50% { border-left-color: #4CAF50; } } `; const styleSheet = document.createElement('style'); styleSheet.textContent = styles; document.head.appendChild(styleSheet); } initializeVariables() { this.isMainMinimized = false; this.isActivityMinimized = false; this.isBroadcastMinimized = false; this.activeBotInstance = null; this.intervals = {}; // Statistics this.stats = { playersProcessed: 0, commandsSent: 0, roomsVisited: 0, startTime: Date.now() }; // Activity Status this.activityStatus = { current: '', startTime: null, isActive: false, broadcastIntervalId: null, // Renamed to avoid conflict with `intervals` object keys autoBroadcast: false }; // Automation states this.automation = { autoRoomSwitch: false, autoKick: false, autoProhibit: false, spamTodo: false, spamGlitch: false }; this.currentRoom = null; this.lastRoomChange = 0; } // Generic Drag Functionality setupPanelDrag(panelElement, headerElement, minimizeButtonId) { let isDragging = false; let currentX, currentY, initialX, initialY; let xOffset = 0, yOffset = 0; const updatePosition = (x, y) => { panelElement.style.transform = `translate(${x}px, ${y}px)`; panelElement.setAttribute('data-x', x); panelElement.setAttribute('data-y', y); }; // Read initial position from data attributes if available (from previous drag) const storedX = parseFloat(panelElement.getAttribute('data-x') || 0); const storedY = parseFloat(panelElement.getAttribute('data-y') || 0); updatePosition(storedX, storedY); // Apply initial or stored position headerElement.addEventListener('mousedown', (e) => { // Prevent drag if clicking on minimize button if (minimizeButtonId && e.target.id === minimizeButtonId) { return; } initialX = e.clientX - xOffset; initialY = e.clientY - yOffset; isDragging = true; panelElement.style.cursor = 'grabbing'; headerElement.style.cursor = 'grabbing'; // Also update header cursor // Get current transform values if panel has been dragged before const transform = window.getComputedStyle(panelElement).transform; if (transform && transform !== 'none') { const matrix = new DOMMatrix(transform); xOffset = matrix.m41; yOffset = matrix.m42; initialX = e.clientX - xOffset; initialY = e.clientY - yOffset; } }); document.addEventListener('mousemove', (e) => { if (isDragging) { e.preventDefault(); currentX = e.clientX - initialX; currentY = e.clientY - initialY; // Keep within viewport (simplified) const rect = panelElement.getBoundingClientRect(); currentX = Math.max(-rect.left, Math.min(window.innerWidth - rect.right, currentX)); currentY = Math.max(-rect.top, Math.min(window.innerHeight - rect.bottom, currentY)); xOffset = currentX; yOffset = currentY; updatePosition(xOffset, yOffset); } }); document.addEventListener('mouseup', () => { isDragging = false; panelElement.style.cursor = 'grab'; headerElement.style.cursor = 'grab'; // Reset header cursor }); } createMainPanel() { this.mainPanel = document.createElement('div'); this.mainPanel.id = 'drawaria-advanced-panel'; this.mainPanel.classList.add('drawaria-panel'); // Add common panel class this.mainPanel.style.top = '20px'; this.mainPanel.style.right = '20px'; this.mainPanel.innerHTML = ` <div class="panel-header" id="main-panel-header"> <span>🎯 Drawaria Advanced Panel</span> <button class="minimize-btn" id="minimize-main-btn">−</button> </div> <div class="panel-content"> <!-- Bot Automation Section --> <div class="control-section"> <h3>🤖 Automatización de Bot</h3> <button class="control-btn" id="auto-room-switch"> 🔄 Auto Cambiar Sala </button> <button class="control-btn danger" id="auto-kick"> ⚡ Auto Kick Jugadores </button> <button class="control-btn danger" id="auto-prohibit"> 🚫 Auto Prohibir Dibujo </button> </div> <!-- Spam Tools Section --> <div class="control-section"> <h3>📢 Herramientas de Spam</h3> <button class="control-btn warning" id="spam-todo"> 📋 Spam TODO (Reportes/Reglas/AFK) </button> <button class="control-btn warning" id="spam-glitch"> ✨ Spam Texto Glitch </button> </div> <!-- Statistics Section --> <div class="control-section"> <h3>📊 Estadísticas</h3> <div class="stats-grid"> <div class="stat-box"> <span class="stat-number" id="players-processed">0</span> <span>Jugadores</span> </div> <div class="stat-box"> <span class="stat-number" id="commands-sent">0</span> <span>Comandos</span> </div> <div class="stat-box"> <span class="stat-number" id="rooms-visited">0</span> <span>Salas</span> </div> <div class="stat-box"> <span class="stat-number" id="uptime">0s</span> <span>Uptime</span> </div> </div> </div> <!-- Status Section --> <div class="control-section"> <h3>📡 Estado del Sistema</h3> <div class="status-display" id="status-display"> <div class="status-line status-info">Sistema iniciado correctamente</div> </div> </div> <!-- Emergency Section --> <div class="control-section"> <h3>🆘 Emergencia</h3> <button class="control-btn emergency-stop" id="emergency-stop"> 🛑 PARAR TODO </button> </div> </div> `; document.body.appendChild(this.mainPanel); this.setupPanelDrag(this.mainPanel, this.mainPanel.querySelector('.panel-header'), 'minimize-main-btn'); } createActivityPanel() { this.activityPanel = document.createElement('div'); this.activityPanel.id = 'drawaria-activity-panel'; this.activityPanel.classList.add('drawaria-panel'); // Add common panel class // Position handled by CSS for initial load, but can be set here too this.activityPanel.innerHTML = ` <div class="panel-header" id="activity-panel-header"> <span>📺 Estado de Actividad</span> <button class="minimize-btn" id="minimize-activity-btn">−</button> </div> <div class="panel-content"> <div class="activity-controls"> <input type="text" id="activity-input" placeholder="¿Qué estás haciendo? (ej: Jugando Drawaria)" maxlength="100"> <button class="control-btn" id="set-activity"> 📢 Establecer Estado </button> <button class="control-btn" id="clear-activity"> 🚫 Limpiar Estado </button> </div> <div class="activity-display" id="activity-display"> <div class="activity-status" id="activity-status"> Estado: Inactivo </div> <div class="activity-duration" id="activity-duration"> Duración: 0m 0s </div> </div> </div> `; document.body.appendChild(this.activityPanel); this.setupPanelDrag(this.activityPanel, this.activityPanel.querySelector('.panel-header'), 'minimize-activity-btn'); } createBroadcastPanel() { this.broadcastPanel = document.createElement('div'); this.broadcastPanel.id = 'drawaria-broadcast-panel'; this.broadcastPanel.classList.add('drawaria-panel'); // Add common panel class this.broadcastPanel.innerHTML = ` <div class="panel-header" id="broadcast-panel-header"> <span>🌐 Transmisión de Estado</span> <button class="minimize-btn" id="minimize-broadcast-btn">−</button> </div> <div class="panel-content"> <button class="control-btn" id="broadcast-activity"> 📡 Mostrar en Chat </button> <button class="control-btn" id="auto-broadcast"> 🔄 Auto-Transmitir </button> <div class="broadcast-settings"> <label>Intervalo: <select id="broadcast-interval"> <option value="30000">30 segundos</option> <option value="60000" selected>1 minuto</option> <option value="300000">5 minutos</option> </select> </label> </div> </div> `; document.body.appendChild(this.broadcastPanel); this.setupPanelDrag(this.broadcastPanel, this.broadcastPanel.querySelector('.panel-header'), 'minimize-broadcast-btn'); } setupEventListeners() { // Main Panel Minimize button document.getElementById('minimize-main-btn').addEventListener('click', () => { this.toggleMinimize(this.mainPanel, 'isMainMinimized'); }); // Activity Panel Minimize button document.getElementById('minimize-activity-btn').addEventListener('click', () => { this.toggleMinimize(this.activityPanel, 'isActivityMinimized'); }); // Broadcast Panel Minimize button document.getElementById('minimize-broadcast-btn').addEventListener('click', () => { this.toggleMinimize(this.broadcastPanel, 'isBroadcastMinimized'); }); // Main Control buttons document.getElementById('auto-room-switch').addEventListener('click', () => { this.toggleAutomation('autoRoomSwitch', 'Auto Cambiar Sala'); }); document.getElementById('auto-kick').addEventListener('click', () => { this.toggleAutomation('autoKick', 'Auto Kick'); }); document.getElementById('auto-prohibit').addEventListener('click', () => { this.toggleAutomation('autoProhibit', 'Auto Prohibir'); }); document.getElementById('spam-todo').addEventListener('click', () => { this.toggleAutomation('spamTodo', 'Spam TODO'); }); document.getElementById('spam-glitch').addEventListener('click', () => { this.toggleAutomation('spamGlitch', 'Spam Glitch'); }); document.getElementById('emergency-stop').addEventListener('click', () => { this.emergencyStop(); }); // Activity Status Buttons (now on the new activity panel) document.getElementById('set-activity').addEventListener('click', () => { this.setActivityStatus(); }); document.getElementById('clear-activity').addEventListener('click', () => { this.clearActivityStatus(); }); // Broadcast Activity Buttons (now on the new broadcast panel) document.getElementById('broadcast-activity').addEventListener('click', () => { this.broadcastActivity(); }); document.getElementById('auto-broadcast').addEventListener('click', () => { this.toggleAutoBroadcast(); }); // Enter key on activity input document.getElementById('activity-input').addEventListener('keypress', (e) => { if (e.key === 'Enter') { this.setActivityStatus(); } }); // Update uptime every second setInterval(() => { this.updateUptime(); }, 1000); // Update activity duration every second setInterval(() => { this.updateActivityDuration(); }, 1000); } initializeBotConnection() { setTimeout(() => { this.findAndConnectBot(); }, 2000); } findAndConnectBot() { if (window.sockets && window.sockets.length > 0) { this.activeBotInstance = window.sockets; this.addStatus('Conectado a socket existente', 'success'); return; } if (window._io) { this.addStatus('Sistema de IO detectado', 'success'); return; } this.addStatus('Esperando conexión de bot...', 'warning'); setTimeout(() => { this.findAndConnectBot(); }, 5000); } // Generic Toggle Minimize function toggleMinimize(panelElement, stateProperty) { this[stateProperty] = !this[stateProperty]; panelElement.classList.toggle('minimized', this[stateProperty]); const btn = panelElement.querySelector('.minimize-btn'); btn.textContent = this[stateProperty] ? '+' : '−'; } toggleAutomation(type, name) { this.automation[type] = !this.automation[type]; const btn = document.getElementById(type.replace(/([A-Z])/g, '-$1').toLowerCase()); if (this.automation[type]) { btn.classList.add('active'); this.startAutomation(type); this.addStatus(`✅ ${name} activado`, 'success'); } else { btn.classList.remove('active'); this.stopAutomation(type); this.addStatus(`⏹️ ${name} desactivado`, 'warning'); } } startAutomation(type) { switch (type) { case 'autoRoomSwitch': this.intervals.roomSwitch = setInterval(() => { this.changeRoom(); }, this.getRandomInterval(3000, 5000)); break; case 'autoKick': case 'autoProhibit': if (this.automation.autoRoomSwitch) { this.startPlayerActions(); } else { this.addStatus('❌ Activar Auto Cambiar Sala primero', 'error'); this.automation[type] = false; const btn = document.getElementById(type.replace(/([A-Z])/g, '-$1').toLowerCase()); btn.classList.remove('active'); } break; case 'spamTodo': this.intervals.spamTodo = setInterval(() => { this.sendTodoSpam(); }, this.getRandomInterval(700, 1200)); break; case 'spamGlitch': this.intervals.spamGlitch = setInterval(() => { this.sendGlitchText(); }, this.getRandomInterval(800, 1500)); break; } } stopAutomation(type) { if (this.intervals[type]) { clearInterval(this.intervals[type]); delete this.intervals[type]; } if (type === 'autoRoomSwitch') { this.stopPlayerActions(); } } startPlayerActions() { if (this.intervals.playerActions) return; this.intervals.playerActions = setInterval(() => { this.performPlayerActions(); }, this.getRandomInterval(1000, 2000)); } stopPlayerActions() { if (this.intervals.playerActions) { clearInterval(this.intervals.playerActions); delete this.intervals.playerActions; } } changeRoom() { try { if (window._io && window._io.emits && window._io.emits.pgswtichroom) { const data = window._io.emits.pgswtichroom(); if (this.activeBotInstance && this.activeBotInstance.send) { this.activeBotInstance.send(data); } } else { this.simulateRoomChange(); } this.stats.roomsVisited++; this.updateStats(); this.addStatus(`🔄 Cambiando sala (${this.stats.roomsVisited})`, 'info'); } catch (error) { this.addStatus(`❌ Error cambiando sala: ${error.message}`, 'error'); } } performPlayerActions() { try { const players = this.getCurrentPlayers(); players.forEach(player => { if (this.automation.autoKick) { this.kickPlayer(player); } if (this.automation.autoProhibit) { this.prohibitPlayer(player); } this.stats.playersProcessed++; }); if (players.length > 0) { this.updateStats(); this.addStatus(`⚡ Procesados ${players.length} jugadores`, 'success'); } } catch (error) { this.addStatus(`❌ Error en acciones: ${error.message}`, 'error'); } } getCurrentPlayers() { const players = []; if (this.activeBotInstance && this.activeBotInstance.room && this.activeBotInstance.room.players) { return this.activeBotInstance.room.players.filter(p => p.id !== this.activeBotInstance.id); } const playerElements = document.querySelectorAll('#playerlist .playerlist-row'); playerElements.forEach((element, index) => { if (index > 0) { players.push({ id: Math.random() * 1000, name: `Player${index}`, element: element }); } }); return players.slice(0, 3); } kickPlayer(player) { try { if (window._io && window._io.emits && window._io.emits.sendvotekick) { const data = window._io.emits.sendvotekick(player.id); if (this.activeBotInstance && this.activeBotInstance.send) { this.activeBotInstance.send(data); this.stats.commandsSent++; } } else { console.log('Kick simulation:', player.name); this.stats.commandsSent++; } } catch (error) { this.addStatus(`❌ Error kickeando ${player.name}: ${error.message}`, 'error'); } } prohibitPlayer(player) { try { if (window._io && window._io.emits && window._io.emits.pgdrawvote) { const data = window._io.emits.pgdrawvote(player.id, 0); if (this.activeBotInstance && this.activeBotInstance.send) { this.activeBotInstance.send(data); this.stats.commandsSent++; } } else { console.log('Prohibit simulation:', player.name); this.stats.commandsSent++; } } catch (error) { this.addStatus(`❌ Error prohibiendo ${player.name}: ${error.message}`, 'error'); } } sendTodoSpam() { const commands = ['report', 'rules', 'afk']; commands.forEach(cmd => { try { let data; switch (cmd) { case 'report': data = `42["clientnotify",-1,2,["", "Generic Report"]]`; break; case 'rules': data = `42["clientnotify",-1,100,[2]]`; break; case 'afk': data = `42["playerafk"]`; break; default: return; } if (this.activeBotInstance && this.activeBotInstance.send) { this.activeBotInstance.send(data); } else { console.log(`Simulating TODO command: ${cmd}`); } this.stats.commandsSent++; } catch (error) { this.addStatus(`❌ Error enviando TODO ${cmd}: ${error.message}`, 'error'); } }); this.updateStats(); this.addStatus('📋 Spam TODO enviado', 'info'); } sendGlitchText() { try { const glitchTexts = Object.values(GLITCH_TEXT_STRINGS); const randomText = glitchTexts[Math.floor(Math.random() * glitchTexts.length)]; if (this.activeBotInstance && this.activeBotInstance.emit) { this.activeBotInstance.emit("chatmsg", randomText); } else { this.injectChatMessage(randomText); } this.stats.commandsSent++; this.updateStats(); this.addStatus('✨ Texto Glitch enviado', 'info'); } catch (error) { this.addStatus(`❌ Error enviando glitch: ${error.message}`, 'error'); } } injectChatMessage(message) { const chatInput = document.querySelector('input[placeholder*="chat"], input[placeholder*="Chat"], #chatinput, .chat-input'); if (chatInput) { chatInput.value = message; chatInput.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', code: 'Enter' })); } } simulateRoomChange() { this.addStatus('🔄 Simulando cambio de sala...', 'warning'); } getRandomInterval(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } setActivityStatus() { const input = document.getElementById('activity-input'); const activity = input.value.trim(); if (!activity) { this.addStatus('❌ Escribe una actividad primero', 'error'); return; } this.activityStatus.current = activity; this.activityStatus.startTime = Date.now(); this.activityStatus.isActive = true; this.updateActivityDisplay(); this.addStatus(`📺 Estado establecido: ${activity}`, 'success'); input.value = ''; if (this.activityStatus.autoBroadcast) { this.broadcastActivity(); } } clearActivityStatus() { this.activityStatus.current = ''; this.activityStatus.startTime = null; this.activityStatus.isActive = false; this.updateActivityDisplay(); this.addStatus('🚫 Estado de actividad limpiado', 'warning'); } updateActivityDisplay() { const statusElement = document.getElementById('activity-status'); const displayElement = document.getElementById('activity-display'); if (this.activityStatus.isActive) { statusElement.textContent = `Estado: ${this.activityStatus.current}`; displayElement.classList.add('active'); } else { statusElement.textContent = 'Estado: Inactivo'; displayElement.classList.remove('active'); document.getElementById('activity-duration').textContent = 'Duración: 0m 0s'; } } updateActivityDuration() { if (!this.activityStatus.isActive || !this.activityStatus.startTime) return; const duration = Math.floor((Date.now() - this.activityStatus.startTime) / 1000); const hours = Math.floor(duration / 3600); const minutes = Math.floor((duration % 3600) / 60); const seconds = duration % 60; let durationText = ''; if (hours > 0) durationText += `${hours}h `; if (minutes > 0 || hours > 0) durationText += `${minutes}m `; durationText += `${seconds}s`; document.getElementById('activity-duration').textContent = `Duración: ${durationText}`; } broadcastActivity() { if (!this.activityStatus.isActive) { this.addStatus('❌ No hay estado activo para transmitir', 'error'); return; } const duration = this.activityStatus.startTime ? Math.floor((Date.now() - this.activityStatus.startTime) / 60000) : 0; const message = `🎮 ${this.activityStatus.current} ${duration > 0 ? `(${duration}min)` : ''}`; try { this.sendChatMessage(message); this.addStatus('📡 Estado transmitido al chat', 'success'); this.updateProfile(this.activityStatus.current); } catch (error) { this.addStatus(`❌ Error transmitiendo: ${error.message}`, 'error'); } } toggleAutoBroadcast() { this.activityStatus.autoBroadcast = !this.activityStatus.autoBroadcast; const btn = document.getElementById('auto-broadcast'); if (this.activityStatus.autoBroadcast) { btn.classList.add('active'); const interval = document.getElementById('broadcast-interval').value; this.activityStatus.broadcastIntervalId = setInterval(() => { // Using broadcastIntervalId if (this.activityStatus.isActive) { this.broadcastActivity(); } }, parseInt(interval)); this.addStatus('🔄 Auto-transmisión activada', 'success'); } else { btn.classList.remove('active'); if (this.activityStatus.broadcastIntervalId) { // Using broadcastIntervalId clearInterval(this.activityStatus.broadcastIntervalId); this.activityStatus.broadcastIntervalId = null; } this.addStatus('⏹️ Auto-transmisión desactivada', 'warning'); } } sendChatMessage(message) { if (this.activeBotInstance && this.activeBotInstance.emit) { this.activeBotInstance.emit("chatmsg", message); return; } const chatInput = document.querySelector('#chatinput, input[placeholder*="chat"], .chat-input'); if (chatInput) { const originalValue = chatInput.value; chatInput.value = message; chatInput.dispatchEvent(new Event('input', { bubbles: true })); chatInput.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', code: 'Enter', bubbles: true })); setTimeout(() => { chatInput.value = originalValue; }, 100); return; } const sendBtn = document.querySelector('[onclick*="chat"], .send-btn, button[title*="Send"]'); if (sendBtn) { console.log('Sending activity status (simulated):', message); } throw new Error('No se pudo acceder al chat para enviar el mensaje.'); } updateProfile(activity) { try { const profileElements = document.querySelectorAll('.profile-status, .user-status, [data-status]'); profileElements.forEach(element => { if (element.textContent.length < 50) { element.textContent = activity.substring(0, 30); } }); } catch (error) { console.warn('No se pudo actualizar el estado del perfil:', error); } } emergencyStop() { Object.keys(this.intervals).forEach(key => { clearInterval(this.intervals[key]); delete this.intervals[key]; }); Object.keys(this.automation).forEach(key => { this.automation[key] = false; }); document.querySelectorAll('.control-btn.active').forEach(btn => { btn.classList.remove('active'); }); // Stop and clear activity status and auto-broadcast this.clearActivityStatus(); if (this.activityStatus.broadcastIntervalId) { clearInterval(this.activityStatus.broadcastIntervalId); this.activityStatus.broadcastIntervalId = null; } this.activityStatus.autoBroadcast = false; const autoBroadcastBtn = document.getElementById('auto-broadcast'); if (autoBroadcastBtn) autoBroadcastBtn.classList.remove('active'); this.addStatus('🛑 PARADA DE EMERGENCIA ACTIVADA', 'error'); this.addStatus('🔴 Todas las automatizaciones detenidas', 'error'); } addStatus(message, type = 'info') { const statusDisplay = document.getElementById('status-display'); if (!statusDisplay) return; // Ensure element exists before trying to add status const timestamp = new Date().toLocaleTimeString(); const statusLine = document.createElement('div'); statusLine.className = `status-line status-${type}`; statusLine.textContent = `${timestamp} - ${message}`; statusDisplay.insertBefore(statusLine, statusDisplay.firstChild); while (statusDisplay.children.length > 15) { statusDisplay.removeChild(statusDisplay.lastChild); } statusDisplay.scrollTop = 0; } updateStats() { document.getElementById('players-processed').textContent = this.stats.playersProcessed; document.getElementById('commands-sent').textContent = this.stats.commandsSent; document.getElementById('rooms-visited').textContent = this.stats.roomsVisited; } updateUptime() { const uptime = Math.floor((Date.now() - this.stats.startTime) / 1000); const minutes = Math.floor(uptime / 60); const seconds = uptime % 60; document.getElementById('uptime').textContent = `${minutes}m ${seconds}s`; } } new DrawariaAdvancedPanel(); })();