Telegram Central Script Executor

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

Dovrai installare un'estensione come Tampermonkey, Greasemonkey o Violentmonkey per installare questo script.

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

Dovrai installare un'estensione come Tampermonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Userscripts per installare questo script.

Dovrai installare un'estensione come ad esempio Tampermonkey per installare questo script.

Dovrai installare un gestore di script utente per installare questo script.

(Ho già un gestore di script utente, lasciamelo installare!)

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

(Ho già un gestore di stile utente, lasciamelo installare!)

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

})();