Auto Luarmor V2 (Remade!)

Automatically does Luarmor for you with smart key and button handling

// ==UserScript==
// @name         Auto Luarmor V2 (Remade!)
// @namespace    http://tampermonkey.net/
// @license MIT
// @version      2.1
// @description  Automatically does Luarmor for you with smart key and button handling
// @author       Aro Moon (98% ChatGPT)
// @match        https://ads.luarmor.net/get_key?for*
// @grant        none
// @run-at       document-idle
// ==/UserScript==

(function () {
    let isPaused = false;
    let currentAction = "Idle";
    let currentKey = "N/A";
    let logHistory = [];
    const logCache = new Set();

    // Flags to prevent repeated logs
    let blacklistLogged = false;
    let loaderLogged = false;
    let captchaLogged = false;
    let nextBtnNotClickableLogged = false;

    // Create floating UI
    const ui = document.createElement("div");
    ui.style.cssText = `
        position: fixed;
        top: 20px;
        right: 20px;
        width: 250px;
        background: rgba(25, 25, 25, 0.9);
        color: #fff;
        font-family: Arial, sans-serif;
        border-radius: 8px;
        box-shadow: 0 0 10px rgba(0,0,0,0.5);
        padding: 10px;
        z-index: 999999;
        font-size: 13px;
    `;
    ui.innerHTML = `
        <div style="display: flex; justify-content: space-between; align-items: center;">
            <strong>Script Status</strong>
            <button id="toggleBtn" style="
                background: #444;
                border: none;
                color: #fff;
                padding: 4px 8px;
                border-radius: 4px;
                cursor: pointer;
            ">Pause</button>
        </div>
        <div style="margin-top: 5px;">
            <b>Current Key:</b>
            <span id="keyDisplay" style="display:inline-block; max-width: 220px; word-break: break-all;">
                ${currentKey}
            </span>
        </div>
        <div style="margin-top: 5px;">
            <b>Action:</b> <span id="actionDisplay">${currentAction}</span>
        </div>
        <div style="margin-top: 5px;">
            <b style="cursor: pointer;" id="logToggle">Log ▼</b>
            <div id="logAreaContainer" style="display: none; max-height: 100px; overflow-y: auto; background: rgba(0,0,0,0.3); padding: 5px; border-radius: 4px; margin-top: 3px;">
                <div id="logArea" style="font-size: 12px;"></div>
            </div>
        </div>
    `;
    document.body.appendChild(ui);

    const toggleBtn = ui.querySelector("#toggleBtn");
    const keyDisplay = ui.querySelector("#keyDisplay");
    const actionDisplay = ui.querySelector("#actionDisplay");
    const logArea = ui.querySelector("#logArea");
    const logToggle = ui.querySelector("#logToggle");
    const logAreaContainer = ui.querySelector("#logAreaContainer");

    toggleBtn.addEventListener("click", () => {
        isPaused = !isPaused;
        toggleBtn.textContent = isPaused ? "Resume" : "Pause";
        if (isPaused) {
            log("Script paused");
        } else {
            log("Script resumed - reloading page...");
            location.reload();
        }
    });

    logToggle.addEventListener("click", () => {
        const isHidden = logAreaContainer.style.display === "none";
        logAreaContainer.style.display = isHidden ? "block" : "none";
        logToggle.textContent = isHidden ? "Log ▲" : "Log ▼";
    });

    function log(message) {
        if (logCache.has(message)) return;
        logCache.add(message);
        const timestamp = new Date().toLocaleTimeString();
        logHistory.unshift(`[${timestamp}] ${message}`);
        if (logHistory.length > 100) logHistory.pop();
        logArea.innerHTML = logHistory.join("<br>");
        console.log(message);
        setTimeout(() => logCache.delete(message), 5000);
    }

    function setAction(action) {
        currentAction = action;
        actionDisplay.textContent = action;
        log(action);
    }

    function setKey(key) {
        currentKey = key;
        keyDisplay.textContent = key;
    }

    function isBlocked() {
        const blacklist = document.querySelector('.swal2-x-mark');
        const loader = document.querySelector('.loader');
        const captcha = document.getElementById('captchafield');

        const blacklistVisible = blacklist && blacklist.offsetParent !== null;
        const loaderVisible = loader && loader.offsetParent !== null;
        const captchaVisible = captcha && captcha.offsetParent !== null;

        if (blacklistVisible) {
            if (!blacklistLogged) { setAction("Waiting (blacklisted)..."); blacklistLogged = true; }
            return { type: "blacklist", blocked: true };
        } else blacklistLogged = false;

        if (loaderVisible) {
            if (!loaderLogged) { setAction("Waiting for loader..."); loaderLogged = true; }
            return { type: "loader", blocked: true };
        } else loaderLogged = false;

        if (captchaVisible) {
            if (!captchaLogged) { setAction("Waiting for captcha..."); captchaLogged = true; }
            return { type: "captcha", blocked: true };
        } else captchaLogged = false;

        return { type: null, blocked: false };
    }

    function grabKeyOnce() {
        if (currentKey !== "N/A") return;
        const keyElement = document.querySelector('h6.mb-0.text-sm');
        if (keyElement) {
            const keyText = keyElement.textContent.trim();
            if (keyText) {
                setKey(keyText);
                log(`Key grabbed: ${keyText}`);
            }
        }
    }

    function onLoad() {
        if (isPaused) return setAction("Paused");
        const blockStatus = isBlocked();
        if (blockStatus.blocked) {
            setTimeout(onLoad, 500);
            return;
        }
        grabKeyOnce();
        checkProgress();
        waitForButtonToBeClickable();
    }

    function checkProgress() {
        if (isPaused) return setAction("Paused");
        const blockStatus = isBlocked();
        if (blockStatus.blocked) return;

        const progressElement = document.getElementById('adprogressp');
        if (!progressElement) return;
        const progressText = progressElement.textContent;
        const progressParts = progressText.match(/(\d+)\/(\d+)/);
        if (!progressParts) return;
        const currentProgress = parseInt(progressParts[1], 10);
        const totalProgress = parseInt(progressParts[2], 10);
        const remainingProgress = totalProgress - currentProgress;
        setAction(`Remaining Progress: ${remainingProgress}`);

        if (remainingProgress === 0) {
            const keyElement = document.querySelector('h6.mb-0.text-sm');
            const addTimeBtn = keyElement ? document.getElementById(`addtimebtn_${keyElement.textContent.trim()}`) : null;
            const newKeyBtn = document.getElementById('newkeybtn');

            if (keyElement && addTimeBtn && addTimeBtn.offsetParent !== null && !addTimeBtn.disabled) {
                addTimeBtn.click();
                setAction(`Clicked Add Time for key: ${keyElement.textContent.trim()}`);
            } else if (newKeyBtn && newKeyBtn.offsetParent !== null && !newKeyBtn.disabled) {
                newKeyBtn.click();
                setAction("Clicked Get a New Key");
            }
        }
    }

    function waitForButtonToBeClickable() {
        if (isPaused) return setAction("Paused");
        const blockStatus = isBlocked();
        if (blockStatus.blocked) {
            setTimeout(waitForButtonToBeClickable, 500);
            return;
        }

        const btn = document.getElementById('nextbtn');
        if (btn && btn.offsetParent !== null && !(btn.style.cursor === 'not-allowed' || btn.disabled)) {
            btn.click();
            setAction("Clicked Next button");
            nextBtnNotClickableLogged = false;
            setTimeout(checkWindowFocus, 1000);
        } else {
            if (!nextBtnNotClickableLogged) { setAction("Waiting to click button"); nextBtnNotClickableLogged = true; }
            setTimeout(waitForButtonToBeClickable, 500);
        }
    }

    function checkWindowFocus() {
        if (isPaused) return setAction("Paused");
        const blockStatus = isBlocked();
        if (blockStatus.blocked) return;

        if (!document.hasFocus()) {
            setAction("Waiting for window focus...");
            return;
        }
        setTimeout(() => {
            const btn = document.getElementById('nextbtn');
            if (btn && btn.offsetParent !== null && !(btn.style.cursor === 'not-allowed' || btn.disabled)) {
                btn.click();
                setAction("Clicked Next button (focus)");
                nextBtnNotClickableLogged = false;
            }
            setTimeout(checkWindowFocus, 1000);
        }, 500);
    }

    if (document.readyState === "complete") {
        onLoad();
    } else {
        window.addEventListener("load", onLoad);
    }
})();