Discord Platform Spoof + Toolbox

Switch platforms, highlight red users, and trigger full wipe with a slick UI.

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         Discord Platform Spoof + Toolbox
// @namespace    http://tampermonkey.net/
// @version      1.5.4
// @author       CheetoPuffsz23
// @description  Switch platforms, highlight red users, and trigger full wipe with a slick UI.
// @match        https://discord.com/channels/*
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_deleteValue
// @license      MIT
// ==/UserScript==

(function () {
    'use strict';

    const platforms = {
        "Web": { "$os": "Windows", "$browser": "Chrome", "$device": "" },
        "Mobile": { "$os": "Android", "$browser": "Discord Android", "$device": "Discord Android" }
    };

    let selected = GM_getValue("discordSpoofPlatform", "Web");
    let uiContainer = null;
    let isVisible = false;

    const spoofedProps = () => platforms[selected];

    const originalSend = WebSocket.prototype.send;
    WebSocket.prototype.send = function (data) {
        try {
            if (typeof data === "string" && data.includes('"op":2')) {
                const parsed = JSON.parse(data);
                if (parsed?.op === 2 && parsed?.d?.properties) {
                    parsed.d.properties = spoofedProps();
                    console.log(`[Spoof] Applied "${selected}" spoof:`, parsed.d.properties);
                    data = JSON.stringify(parsed);
                }
            }
        } catch (err) {
            console.error("[Spoof] Failed to spoof IDENTIFY:", err);
        }
        return originalSend.call(this, data);
    };

    function highlightRedUsernames() {
        const observer = new MutationObserver(() => {
            Array.from(document.querySelectorAll('[class*="username"]')).forEach(el => {
                const name = el.textContent.toLowerCase();
                if (name.includes("admin") || name.includes("mod")) {
                    el.style.color = "#ff4d4d";
                }
            });
        });

        observer.observe(document.body, { childList: true, subtree: true });
    }

    function toggleUsernameHighlight() {
        const style = document.getElementById("toolbox-username-style");
        if (style) style.remove();
        else {
            const css = document.createElement("style");
            css.id = "toolbox-username-style";
            css.textContent = `
                [class*='username'] { color: #ff5555 !important; }
            `;
            document.head.appendChild(css);
        }
    }

    function createDivider() {
        const div = document.createElement("div");
        div.style.cssText = "margin: 12px 0; border-bottom: 1px solid rgba(255,255,255,0.1);";
        return div;
    }

    function createSubtleLabel(text) {
        const label = document.createElement("div");
        label.textContent = text;
        label.style.cssText = "margin-top: 4px; margin-bottom: 0.3px; font-size: 10px; color: #888; font-weight: 400; text-align: right;";
        return label;
    }
        function createLabel(text) {
        const label = document.createElement("div");
        label.textContent = text;
        label.style.cssText = "margin-top: 4px; font-size: 15px; color: #fff; font-weight: 600; text-align: center;";
        return label;
    }

    function createUI() {
        uiContainer = document.createElement("div");
        uiContainer.style.cssText = `
            position: fixed;
            top: 100px;
            left: 100px;
            width: 260px;
            background: rgba(30, 30, 40, 0.65);
            backdrop-filter: blur(10px);
            border-radius: 12px;
            box-shadow: 0 0 15px rgba(0,0,0,0.5);
            color: #fff;
            font-family: 'Segoe UI', sans-serif;
            font-size: 14px;
            z-index: 999999;
            user-select: none;
        `;

        const header = document.createElement("div");
        header.textContent = "🛠️ Discord Toolbox";
        header.style.cssText = `
            padding: 10px 12px;
            font-weight: bold;
            background: rgba(0,0,0,0.2);
            border-bottom: 1px solid rgba(255,255,255,0.1);
            border-radius: 12px 12px 0 0;
            cursor: move;
        `;
        uiContainer.appendChild(header);

        const body = document.createElement("div");
        body.style.padding = "12px";

       const inputStyle = `
           width: 100%;
           padding: 8px;
           border-radius: 6px;
           background: rgba(50,50,60,0.9);
           color: #fff;
           border: 1px solid rgba(0,0,0,0.3);
           margin: 8px 0 2px 0;
           box-sizing: border-box;
         `;
        const buttonStyle = `
            margin-top: 8px;
            width: 100%;
            padding: 8px;
            border-radius: 6px;
            background: rgba(60, 60, 70, 0.9);
            color: #fff;
            border: 1px solid rgba(0,0,0,0.3);
            cursor: pointer;
        `;

        const select = document.createElement("select");
        select.style.cssText = inputStyle;

        Object.keys(platforms).forEach(key => {
            const option = document.createElement("option");
            option.value = key;
            option.textContent = key;
            if (key === selected) option.selected = true;
            select.append(option);
        });

        select.onchange = () => {
            selected = select.value;
            GM_setValue("discordSpoofPlatform", selected);
            alert(`✅ Spoofed as "${selected}". Click Reconnect to apply.`);
        };

        const webhookInput = document.createElement("input");
        webhookInput.placeholder = "https://discord.com/api/webhooks/...";
        webhookInput.style.cssText = inputStyle;

        const reconnectBtn = document.createElement("button");
        reconnectBtn.textContent = "🔄 Reconnect";
        reconnectBtn.style.cssText = buttonStyle;
        reconnectBtn.onclick = () => {
            alert("📡 Reloading to reconnect...");
            window.location.reload();
        };

        const usernameColorToggle = document.createElement("button");
        usernameColorToggle.textContent = "🎨 Toggle Red Usernames";
        usernameColorToggle.style.cssText = buttonStyle;
        usernameColorToggle.onclick = toggleUsernameHighlight;

        const deleteWebhookBtn = document.createElement("button");
        deleteWebhookBtn.textContent = "🚫 Delete Webhook";
        deleteWebhookBtn.style.cssText = buttonStyle;
        deleteWebhookBtn.onclick = async () => {
            const url = webhookInput.value.trim();
            if (!url.startsWith("https://discord.com/api/webhooks/")) return alert("❌ Invalid webhook URL.");
            try {
                const res = await fetch(url, { method: "DELETE" });
                if (res.ok) alert("✅ Webhook deleted successfully.");
                else alert(`❌ Failed to delete webhook: ${res.status}`);
            } catch (err) {
                console.error("Webhook delete error:", err);
                alert("❌ Error deleting webhook.");
            }
        };

        const panicBtn = document.createElement("button");
        panicBtn.textContent = "💣 Panic Wipe";
        panicBtn.style.cssText = buttonStyle + "background: #9b1c1c; border-color: #5c0d0d;";
        panicBtn.onclick = () => {
            alert("☠️ Nuking everything...");
            if (uiContainer) uiContainer.remove();
            WebSocket.prototype.send = originalSend;
            GM_deleteValue("discordSpoofPlatform");
            for (const key in window) {
                if (typeof window[key] === "function" && /spoof|ui|tool/i.test(key)) {
                    window[key] = () => {};
                }
            }
        };

        body.append(
            createLabel("📱 Platform Spoof"), select,
            reconnectBtn, createSubtleLabel("Reload to apply"),
            usernameColorToggle, createSubtleLabel("Changes username color for easier readability"),
            createDivider(),
            webhookInput, createSubtleLabel("Paste full webhook URL"), deleteWebhookBtn,
            createDivider(),
            panicBtn, createSubtleLabel("Press Shift + P to hide the menu temporarily!")
        );

        uiContainer.appendChild(body);
        document.body.appendChild(uiContainer);

        let isDragging = false, offsetX = 0, offsetY = 0;
        header.addEventListener("mousedown", (e) => {
            isDragging = true;
            offsetX = e.clientX - uiContainer.offsetLeft;
            offsetY = e.clientY - uiContainer.offsetTop;
            document.body.style.userSelect = "none";
        });
        document.addEventListener("mouseup", () => {
            isDragging = false;
            document.body.style.userSelect = "";
        });
        document.addEventListener("mousemove", (e) => {
            if (isDragging) {
                uiContainer.style.left = `${e.clientX - offsetX}px`;
                uiContainer.style.top = `${e.clientY - offsetY}px`;
            }
        });
    }

    function toggleUI() {
        if (!uiContainer) return;
        isVisible = !isVisible;
        uiContainer.style.display = isVisible ? "block" : "none";
    }

    document.addEventListener("keydown", (e) => {
        const t = e.target;
        if (t.tagName === "INPUT" || t.tagName === "TEXTAREA" || t.isContentEditable) return;
        if (e.shiftKey && e.key.toLowerCase() === "p") toggleUI();
    });

    window.addEventListener("load", () => {
        createUI();
        uiContainer.style.display = "block";
        isVisible = true;
        highlightRedUsernames();
        console.log("[Spoof] Toolbox loaded. Shift+P to toggle.");
    });
})();