Telegram Central Script Executor

Menu flutuante para executar scripts internos diretamente no Telegram Web sem precisar recriar arquivos no Tampermonkey.

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

Tendrás que instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Tendrás que instalar una extensión como Tampermonkey antes de poder instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==UserScript==
// @name         Telegram Central Script Executor
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Menu flutuante para executar scripts internos diretamente no Telegram Web sem precisar recriar arquivos no Tampermonkey.
// @author       Gemini
// @match        https://web.telegram.org/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // 1. Cria a estrutura da Interface (GUI)
    const painel = document.createElement('div');
    painel.id = 'central_executor_gui';
    painel.style = `
        position: fixed; top: 100px; right: 30px; z-index: 999999;
        background: #182533; border: 2px solid #2b5278; border-radius: 10px;
        padding: 12px; width: 320px; box-shadow: 0 6px 25px rgba(0,0,0,0.6);
        font-family: sans-serif; color: #fff; display: none;
    `;

    painel.innerHTML = `
        <div id="executor_header" style="padding: 8px; margin-bottom: 10px; background: #2b5278; border-radius: 5px; text-align: center; font-weight: bold; cursor: move; user-select: none; font-size: 13px;">
            💻 EXECUTOR CENTRAL DE SCRIPTS
        </div>
        <textarea id="executor_code_input" placeholder="Cole o código do seu script aqui dentro..." style="width: 94%; height: 180px; background: #0f1922; color: #a6d6ff; border: 1px solid #2b5278; border-radius: 5px; padding: 8px; font-family: monospace; resize: vertical; font-size: 11px; outline: none;"></textarea>
        
        <div style="display: flex; gap: 5px; margin-top: 8px;">
            <button id="btn_execute_now" style="flex: 1; background: #2481cc; color: white; border: none; padding: 10px; font-weight: bold; border-radius: 5px; cursor: pointer; font-size: 12px;">EXECUTAR SCRIPT</button>
            <button id="btn_clear_input" style="background: #34495e; color: white; border: none; padding: 10px; border-radius: 5px; cursor: pointer; font-size: 12px;">LIMPAR</button>
        </div>
        <div style="text-align: center; margin-top: 8px;">
            <button id="btn_close_executor" style="background: none; border: none; color: #ff5252; cursor: pointer; font-size: 11px; font-weight: bold;">[ FECHAR PAINEL ]</button>
        </div>
    `;

    // 2. Cria o Botão Flutuante para Abrir/Fechar o Menu
    const acionador = document.createElement('div');
    acionador.id = 'btn_trigger_executor';
    acionador.innerText = '⚙️';
    acionador.style = `
        position: fixed; top: 15px; right: 15px; z-index: 999998;
        background: #2481cc; color: white; width: 40px; height: 40px;
        border-radius: 50%; display: flex; align-items: center; justify-content: center;
        font-size: 18px; cursor: pointer; box-shadow: 0 2px 10px rgba(0,0,0,0.4);
        user-select: none;
    `;

    document.body.appendChild(painel);
    document.body.appendChild(acionador);

    // --- SISTEMA DE ARRASTAR (DRAG & DROP) ---
    const header = document.getElementById('executor_header');
    let isDragging = false, initialX, initialY;

    header.onmousedown = (e) => {
        isDragging = true;
        initialX = e.clientX - painel.offsetLeft;
        initialY = e.clientY - painel.offsetTop;
    };
    document.onmousemove = (e) => {
        if (!isDragging) return;
        painel.style.left = (e.clientX - initialX) + 'px';
        painel.style.top = (e.clientY - initialY) + 'px';
        painel.style.right = 'auto';
    };
    document.onmouseup = () => isDragging = false;

    // --- LÓGICA DE INTERAÇÃO ---
    
    // Alternar visibilidade (Abrir / Fechar)
    acionador.onclick = () => {
        painel.style.display = painel.style.display === 'none' ? 'block' : 'none';
    };
    document.getElementById('btn_close_executor').onclick = () => {
        painel.style.display = 'none';
    };

    // Limpar caixa de texto
    document.getElementById('btn_clear_input').onclick = () => {
        document.getElementById('executor_code_input').value = '';
    };

    // INJETAR E EXECUTAR O SCRIPT COLADO
    document.getElementById('btn_execute_now').onclick = () => {
        const codigoParaRodar = document.getElementById('executor_code_input').value;
        
        if (!codigoParaRodar.trim()) {
            alert("A caixa de texto está vazia! Cole um script primeiro.");
            return;
        }

        try {
            // Cria uma função dinâmica contendo o código e a executa imediatamente
            const scriptInjetado = new Function(codigoParaRodar);
            scriptInjetado();
            console.log("Script injetado e executado com sucesso através do painel central.");
        } catch (erro) {
            alert("Erro de sintaxe no script colado:\n\n" + erro.message);
        }
    };

})();