NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Auto Luarmor // @namespace http://tampermonkey.net/ // @version 2.6.4 // @description Finds the elements on the page such as +12H, next, start, etc.. and clicks them at the appropriate times so you never have to do luarmor yourself again! (Code was written by ChatGPT) // @author Chatgpt // @license MIT // @match https://ads.luarmor.net/get_key* // @grant none // @downloadURL https://update.greasyfork.org/scripts/535173/Auto%20Luarmor.user.js // @updateURL https://update.greasyfork.org/scripts/535173/Auto%20Luarmor.meta.js // ==/UserScript== (function () { 'use strict'; let scriptPaused = false; const selectors = { nextButton: '#nextbtn', addTimeButton: '[id^="addtimebtn_"]', progressText: '#adprogressp', newKeyButton: '#newkeybtn', captchaCheckText: 'h1', keyTimeLeft: '[id^="_timeleft_"]', blacklistTitle: '#swal2-title', blacklistTimeText: 'p.text-sm', keyValue: 'h6.mb-0.text-sm' }; function isInPopupWindow() { return window.name === 'luarmor_popup'; } function parseTimeToMs(timeStr) { const parts = timeStr.split(':').map(Number); if (parts.length === 3) { const [h, m, s] = parts; return ((h * 60 + m) * 60 + s) * 1000; } else { const match = timeStr.match(/(\d+)\s*hours?\s*(\d+)\s*minutes?/i); if (match) { const [, h, m] = match.map(Number); return ((h * 60 + m) * 60) * 1000; } } return 0; } function flashTitle(message, duration = 3000) { const originalTitle = document.title; let visible = true; const interval = 500; const flashCount = Math.floor(duration / interval); let i = 0; const flasher = setInterval(() => { document.title = visible ? message : originalTitle; visible = !visible; i++; if (i >= flashCount) { clearInterval(flasher); document.title = originalTitle; } }, interval); } let lastStatusMessage = ''; // To track the last message logged let lastCooldownStatus = ''; // To keep track of the last cooldown status let lastCooldownTime = ''; // To keep track of the last cooldown time function updateStatus(msg) { const statusText = document.getElementById('luarmor-status-text'); if (statusText) statusText.textContent = msg; // Extract the label from the message const labelMatch = msg.match(/^[\u{1F600}-\u{1F64F}]+|\D+/gu); // Match emojis and non-numeric characters at the start const label = labelMatch ? labelMatch[0] : msg; // Check if the label has changed (log when label changes) if (label !== lastStatusMessage) { console.log(msg); lastStatusMessage = label; } // Check if it's a cooldown message if (msg.includes("Cooldown")) { const timeMatch = msg.match(/\d{2}:\d{2}:\d{2}/); const currentCooldown = timeMatch ? timeMatch[0] : ''; // Log only when the cooldown status changes (not the time) if (currentCooldown !== lastCooldownTime) { // Log the first time the cooldown is detected if (lastCooldownStatus !== 'Cooldown') { console.log(msg); // Log once when the cooldown starts lastCooldownStatus = 'Cooldown'; } lastCooldownTime = currentCooldown; } } else { // Reset cooldown status when it's no longer a cooldown message if (lastCooldownStatus === 'Cooldown') { lastCooldownStatus = ''; // Reset the cooldown log flag when it's no longer "Cooldown" } } } function updateUITimers() { // Update active key time if available const timeLeftElem = document.querySelector(selectors.keyTimeLeft); if (timeLeftElem) { document.getElementById('luarmor-timeleft').textContent = timeLeftElem.textContent.trim(); } // Update key from the page const keyElem = document.querySelector(selectors.keyValue); if (keyElem) { document.getElementById('luarmor-key').textContent = keyElem.textContent.trim(); } // Directly read cooldown time from DOM const nextBtn = document.querySelector(selectors.nextButton); const cooldownElem = document.getElementById('luarmor-cooldown'); if (nextBtn && cooldownElem) { if (nextBtn.style.cursor === 'not-allowed') { // Extract the visible time from the button's text const match = nextBtn.textContent.match(/\d{2}:\d{2}:\d{2}/); cooldownElem.textContent = match ? match[0] : 'Waiting...'; } else { cooldownElem.textContent = 'None'; } } // Only update blacklist time and cooldown if blacklisted const isBlacklisted = document.querySelector(selectors.blacklistTitle)?.textContent.includes("Temporarily Blacklisted"); if (isBlacklisted) { const blacklistTextElem = document.querySelector(selectors.blacklistTimeText); if (blacklistTextElem) { const blacklistTime = blacklistTextElem.textContent.replace("You can continue in:", '').trim(); document.getElementById('luarmor-blacklist').textContent = blacklistTime; const ms = parseTimeToMs(blacklistTime); const h = String(Math.floor(ms / 3600000)).padStart(2, '0'); const m = String(Math.floor((ms % 3600000) / 60000)).padStart(2, '0'); const s = String(Math.floor((ms % 60000) / 1000)).padStart(2, '0'); document.getElementById('luarmor-cooldown').textContent = `${h}:${m}:${s}`; } } else { document.getElementById('luarmor-blacklist').textContent = 'None'; document.getElementById('luarmor-cooldown').textContent = 'None'; } } function checkBlacklist(callback) { const blacklistElement = document.querySelector('.text-danger'); if (blacklistElement && blacklistElement.textContent.includes('temporarily blacklisted')) { updateStatus('π« Still blacklisted. Waiting...'); // Retry every 2 seconds setTimeout(() => checkBlacklist(callback), 2000); return true; // Still blacklisted } else { callback(); // Not blacklisted anymore, proceed return false; } } let cooldownInterval; function handleCooldownAndClickStart() { if (scriptPaused) return; updateUITimers(); const nextBtn = document.querySelector(selectors.nextButton); if (!nextBtn) return console.log("β Next button not found."); if (nextBtn.style.cursor === 'not-allowed') { clearInterval(cooldownInterval); // prevent duplicates cooldownInterval = setInterval(() => { if (scriptPaused) return; const btn = document.querySelector(selectors.nextButton); if (!btn || btn.style.cursor !== 'not-allowed') { clearInterval(cooldownInterval); return; } const match = btn.textContent.match(/\d{2}:\d{2}:\d{2}/); if (match) updateStatus(`β³ Cooldown: ${match[0]}`); }, 1000); const match = nextBtn.textContent.match(/\d{2}:\d{2}:\d{2}/); const ms = match ? parseTimeToMs(match[0]) : 0; if (ms > 3000) { setTimeout(() => { if (scriptPaused) return; window.focus(); flashTitle("β° Cooldown Ending!"); }, ms - 3000); } setTimeout(() => { if (scriptPaused) return; const btn = document.querySelector(selectors.nextButton); if (btn?.style.cursor !== 'not-allowed') { clearInterval(cooldownInterval); btn.click(); updateStatus("π’ Clicked Start."); setTimeout(() => window.close(), 1000); } }, ms + 1000); } else { nextBtn.click(); updateStatus("π’ Clicked Start."); setTimeout(() => window.close(), 1000); } } function handleProgressCheck() { if (scriptPaused) return; const progress = document.querySelector(selectors.progressText); if (!progress) return console.log("β Progress not found."); const match = progress.textContent.match(/(\d+)\s*\/\s*(\d+)/); if (!match) return console.log("β Invalid progress format."); const current = parseInt(match[1], 10); const total = parseInt(match[2], 10); updateStatus(`π Progress: ${current}/${total}`); if (current >= total) { const addBtn = document.querySelector(selectors.addTimeButton); if (addBtn && !addBtn.classList.contains('disabled')) { addBtn.click(); updateStatus("π’ Clicked +12H."); return; } const timeLeft = document.querySelector(selectors.keyTimeLeft); const ms = timeLeft ? parseTimeToMs(timeLeft.textContent.trim()) : 0; if (ms > 12 * 60 * 60 * 1000) { updateStatus("π Max time. Retry in 12h."); setTimeout(handleProgressCheck, 12 * 60 * 60 * 1000 + 1000); return; } const newKey = document.querySelector(selectors.newKeyButton); if (newKey && !newKey.disabled) { newKey.click(); updateStatus("π’ Clicked new key."); } } else { handleCooldownAndClickStart(); } } function observeDOMChanges() { const observerConfig = { childList: true, subtree: true, characterData: true }; const callback = () => { updateUITimers(); // Your existing logic to read the DOM and update your display }; const observer = new MutationObserver(callback); const targets = [ document.querySelector(selectors.keyTimeLeft), document.querySelector(selectors.keyValue), document.querySelector(selectors.nextButton), document.querySelector(selectors.blacklistTitle), document.querySelector(selectors.blacklistTimeText) ]; targets.forEach(target => { if (target) observer.observe(target, observerConfig); }); } function checkCaptchaAndProceed() { if (scriptPaused) return; const check = document.querySelector(selectors.captchaCheckText); if (check?.textContent.includes("Checking Your Browser")) { updateStatus("β³ CAPTCHA detected..."); setTimeout(checkCaptchaAndProceed, 3000); } else { updateStatus("π’ Proceeding."); setTimeout(handleProgressCheck, 1000); } } function injectUI() { const style = document.createElement('style'); style.textContent = ` #luarmor-status-box { position: fixed; top: 10px; left: 10px; background: rgba(0,0,0,0.85); color: #0f0; padding: 12px 16px; border-radius: 10px; font-family: monospace; font-size: 14px; z-index: 9999; box-shadow: 0 0 12px rgba(0,255,0,0.5); transition: opacity 0.5s ease; max-width: 320px; } #luarmor-logo { position: fixed; bottom: 10px; right: 10px; width: 50px; height: 50px; background: url('https://upload.wikimedia.org/wikipedia/commons/thumb/1/1d/Green_check.svg/1024px-Green_check.svg.png') no-repeat center; background-size: contain; opacity: 0.7; z-index: 9998; } #luarmor-status-box .extra { margin-top: 8px; font-size: 12px; color: #aaa; } #luarmor-status-box .extra strong { color: #0f0; } `; document.head.appendChild(style); const box = document.createElement('div'); box.id = 'luarmor-status-box'; box.innerHTML = ` <div id="luarmor-status-text">π Script initialized</div> <button id="luarmor-pause-btn" style="margin-top: 8px; background:#222; color:#0f0; border:1px solid #0f0; padding:4px 8px; border-radius:6px; cursor:pointer;"> βΈοΈ Pause Script </button> <div class="extra"> π Key: <strong id="luarmor-key">loading...</strong><br> β±οΈ Time Left: <strong id="luarmor-timeleft">loading...</strong><br> β Blacklist: <strong id="luarmor-blacklist">None</strong><br> π Cooldown: <strong id="luarmor-cooldown">None</strong> </div> `; document.body.appendChild(box); const pauseBtn = document.getElementById('luarmor-pause-btn'); pauseBtn.addEventListener('click', () => { scriptPaused = !scriptPaused; pauseBtn.textContent = scriptPaused ? 'βΆοΈ Resume Script' : 'βΈοΈ Pause Script'; updateStatus(scriptPaused ? 'βΈοΈ Script paused by user.' : 'βΆοΈ Script resumed.'); if (!scriptPaused) { if (!checkBlacklist()) checkCaptchaAndProceed(); } }); const logo = document.createElement('div'); logo.id = 'luarmor-logo'; document.body.appendChild(logo); } observeDOMChanges(); // Start observing changes window.addEventListener("load", () => { if (isInPopupWindow()) { window.name = 'luarmor_popup'; console.log("β Running in popup."); flashTitle("π Script Started!"); injectUI(); if (!checkBlacklist()) checkCaptchaAndProceed(); setInterval(updateUITimers, 1000); } else { if (!window.popupOpenedOnce) { const popup = window.open(window.location.href, '_blank', 'width=500,height=600'); if (popup) { popup.name = 'luarmor_popup'; window.popupOpenedOnce = true; setTimeout(() => window.close(), 500); } else { console.log("β Failed to open popup."); alert("Popup failed to open. Please try adding the following to your adblocker whitelist:\n\nads.luarmor.net/get_key\n\nOr try the rule:\n@@||ads.luarmor.net/get_key$popup,domain=ads.luarmor.net"); } } } }); })();