// ==UserScript== // @name Aternos Auto-Start and Restart Bot // @namespace https://aternos.org/ // @version 3.1 // @description Start Aternos server, confirm actions, and handle countdown for restart logic automatically. // @author Zephyr5929 // @match https://aternos.org/server/* // @grant none // @license MIT // @downloadURL none // ==/UserScript== (function () { 'use strict'; // Constants const INITIAL_DELAY_MS = 12000; // 12 seconds const COUNTDOWN_THRESHOLD_MS = 3.5 * 60 * 1000; // 3 minutes and 30 seconds in milliseconds // State tracking let startExecuted = false; let confirmExecuted = false; // Function to wait for the DOM to be ready function onDOMReady(callback) { if (document.readyState === "complete" || document.readyState === "interactive") { callback(); } else { document.addEventListener("DOMContentLoaded", callback); } } // Function to check if an element is visible function isVisible(selector) { const element = document.querySelector(selector); return element && element.offsetParent !== null; // Ensures the element is visible in the DOM } // Function to simulate a click on an element function clickElement(selector) { const element = document.querySelector(selector); if (element) { console.log(`Clicking element: ${selector}`); element.click(); return true; } else { console.warn(`Element not found: ${selector}`); return false; } } // Function to monitor for the "Confirm now!" button and click it when visible function monitorConfirmButton() { console.log("Monitoring for 'Confirm now!' button..."); const observer = new MutationObserver(() => { if (isVisible("#confirm")) { console.log("'Confirm now!' button detected. Clicking..."); if (clickElement("#confirm")) { confirmExecuted = true; // Track that "Confirm now!" was clicked observer.disconnect(); // Stop observing after clicking the button startCountdownMonitor(); // Start monitoring the countdown } } }); observer.observe(document.body, { childList: true, subtree: true, }); } // Function to monitor the countdown and click "Restart" if needed function startCountdownMonitor() { if (!startExecuted || !confirmExecuted) { console.warn("Countdown monitoring skipped. 'Start' or 'Confirm now!' not executed."); return; } console.log("Monitoring countdown for 'Restart' button..."); const observer = new MutationObserver(() => { const countdownElement = document.querySelector(".end-countdown"); if (countdownElement && isVisible(".end-countdown")) { const timerVisibleFor = Date.now() - countdownElement.dataset.appearTime; // Check if countdown has been visible for more than the threshold if (timerVisibleFor > COUNTDOWN_THRESHOLD_MS) { console.log("Countdown threshold exceeded. Clicking 'Restart'..."); if (clickElement("#restart")) { observer.disconnect(); // Stop observing after clicking "Restart" } } } }); // Add a custom attribute to track the time countdown became visible const countdownElement = document.querySelector(".end-countdown"); if (countdownElement) { countdownElement.dataset.appearTime = Date.now(); } observer.observe(document.body, { childList: true, subtree: true, }); } // Main logic to handle server start function handleServerStart() { // Check if the Restart button is visible if (isVisible("#restart")) { console.log("'Restart' button is visible. Skipping 'Start' and 'Confirm now!' actions."); return; } // Check if the Start button is visible and click it if (isVisible("#start")) { console.log("'Start' button is visible. Starting the server..."); if (clickElement("#start")) { startExecuted = true; // Track that "Start" was clicked monitorConfirmButton(); // Start monitoring for the "Confirm now!" button } } else { console.warn("'Start' button is not visible. No action taken."); } } // Initialize the script onDOMReady(() => { console.log("Page loaded. Waiting 12 seconds before starting..."); setTimeout(() => { handleServerStart(); }, INITIAL_DELAY_MS); }); })();