Merged Auto Click Bypass + Luarmor Delay + Ace Fullscreen Mobile GUI + OneTap Copy

Auto click on bypass buttons with Luarmor delay logic, plus full-screen mobile GUI with one-tap copy on Ace sites.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey, Greasemonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Userscripts.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een gebruikersscriptbeheerder nodig.

(Ik heb al een user script manager, laat me het downloaden!)

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

(Ik heb al een beheerder - laat me doorgaan met de installatie!)

// ==UserScript==
// @name         Merged Auto Click Bypass + Luarmor Delay + Ace Fullscreen Mobile GUI + OneTap Copy
// @namespace    AutoClickBypassAceGUI
// @version      1.0
// @description  Auto click on bypass buttons with Luarmor delay logic, plus full-screen mobile GUI with one-tap copy on Ace sites.
// @match        *://*/*
// @run-at       document-start
// @grant        GM_setClipboard
// ==/UserScript==

(function() {
    'use strict';

    // --- Code from Auto Click Bypass Buttons + Luarmor Delay ---

    // --- LISTE DES MOTS-CLES ---
    const keywords = [
        "bypass now",
        "bypass",
        "skip",
        "skip wait",
        "skip anyway",
        "next",
        "continue",
        "proceed"
    ];

    function matchText(text) {
        if (!text) return false;
        text = text.toLowerCase().trim();
        return keywords.some(k => text.includes(k));
    }

    // Pour savoir si on doit retarder le bouton "Next"
    let shouldDelayNext = false;

    // Détection du clic sur "Skip anyway" + site Luarmor + historique proche
    function handleLuarmorSpecialCase(text) {
        const isLuarmor = location.hostname.includes("luarmor");
        if (!isLuarmor) return;
        text = text.toLowerCase();
        if (text.includes("skip anyway")) {
            // Vérifie que Luarmor n’est pas à plus de 3 pages derrière
            if (window.history.length <= 3) {
                console.log("[Luarmor Delay] Skip anyway détecté → activation du délai Next (7s)");
                shouldDelayNext = true;
            } else {
                console.log("[Luarmor Delay] Historique trop long → pas de délai");
            }
        }
    }

    function delayedClickIfNeeded(el, text) {
        text = text.toLowerCase();
        if (shouldDelayNext && text.includes("next")) {
            shouldDelayNext = false; // Réinitialisation
            console.log("[Luarmor Delay] Attente de 7 secondes avant Next…");
            setTimeout(() => {
                console.log("[Luarmor Delay] Clic NEXT après délai !");
                el.click();
            }, 7000);
            return true; // Ne pas faire un second clic
        }
        return false;
    }

    function processElement(el) {
        const txt = el.innerText || el.value || "";
        if (!matchText(txt)) return;
        // Cas spécial Luarmor / Skip anyway / Next
        handleLuarmorSpecialCase(txt);
        if (delayedClickIfNeeded(el, txt)) {
            return;
        }
        // Clic normal
        console.log("[AutoClickBypass] Click:", txt, el);
        el.click();
    }

    function scan(root=document) {
        const elements = root.querySelectorAll("button, a, div, span, input[type='button'], input[type='submit']");
        elements.forEach(processElement);
    }

    // MutationObserver pour éléments dynamiques
    const observer = new MutationObserver(mutations => {
        mutations.forEach(m => {
            m.addedNodes.forEach(node => {
                if (node.nodeType === 1) {
                    scan(node);
                }
            });
        });
    });

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

    // Premier scan
    window.addEventListener("load", () => scan());

    // --- Code from Ace Fullscreen Mobile GUI + OneTap Copy (conditional on 'ace' in hostname) ---

    if (location.hostname.includes("ace")) {
        //--------------------------------------
        // 📱 GUI PLEIN ÉCRAN MOBILE + STYLE PROPRE
        //--------------------------------------
        const gui = document.createElement("div");
        gui.id = "aceMobileGUI";
        gui.innerHTML = `
            <div id="aceContainer">
                <div class="aceBlock">
                    <div class="aceTitle">Message</div>
                    <div id="aceMsg" class="aceBox copyable">(chargement...)</div>
                </div>
                <div class="aceBlock">
                    <div class="aceTitle">Scroll Area (tap = copier)</div>
                    <div id="aceScroll" class="aceBox copyable">(chargement...)</div>
                </div>
                <div class="aceBlock">
                    <div class="aceTitle">Actions</div>
                    <div id="aceActions" class="aceBox copyable">(chargement...)</div>
                </div>
            </div>
        `;

        //--------------------------------------
        // 🎨 STYLE MODERNE SOLIDE (0 transparence)
        //--------------------------------------
        const styles = `
            #aceMobileGUI {
                position: fixed;
                top: 0;
                left: 0;
                width: 100vw;
                height: 100vh;
                background: #1a1a1a;
                color: #fff;
                display: flex;
                flex-direction: column;
                overflow-y: auto;
                padding: 15px;
                font-family: Arial, sans-serif;
                z-index: 999999999;
            }
            #aceContainer {
                width: 100%;
            }
            .aceBlock {
                margin-bottom: 28px;
            }
            .aceTitle {
                font-size: 20px;
                font-weight: bold;
                margin-bottom: 8px;
                color: #ddd;
            }
            .aceBox {
                width: 100%;
                background: #000;
                border: 2px solid #333;
                border-radius: 10px;
                padding: 15px;
                font-size: 17px;
                line-height: 1.45;
                min-height: 120px;
                max-height: 350px;
                overflow-y: auto;
            }
            .aceBox:active {
                background: #111;
            }
        `;

        const styleTag = document.createElement("style");
        styleTag.innerText = styles;
        document.head.appendChild(styleTag);
        document.body.appendChild(gui);

        //--------------------------------------
        // 🔄 Mise à jour auto du contenu
        //--------------------------------------
        function update() {
            const d1 = document.querySelector("#aceOverlayMessage");
            const d2 = document.querySelector("#aceScrollArea");
            const d3 = document.querySelector("#aceOverlayActions");
            document.getElementById("aceMsg").innerText = d1 ? d1.innerText.trim() : "(introuvable)";
            document.getElementById("aceScroll").innerText = d2 ? d2.innerText.trim() : "(introuvable)";
            document.getElementById("aceActions").innerText = d3 ? d3.innerText.trim() : "(introuvable)";
        }

        setInterval(update, 300);

        //--------------------------------------
        // 📋 Copie instantanée : 1 tap = texte en clipboard
        //--------------------------------------
        function copyText(text) {
            if (typeof GM_setClipboard !== "undefined") {
                GM_setClipboard(text);
            } else {
                navigator.clipboard.writeText(text).catch(()=>{});
            }
        }

        document.addEventListener("click", function(e) {
            const box = e.target.closest(".copyable");
            if (!box) return;
            let content = box.innerText.trim();
            if (content.length === 0) return;
            copyText(content);
            box.style.background = "#222";
            setTimeout(() => {
                box.style.background = "#000";
            }, 120);
        });
    }

})();