astars club Mega Clicker

fuck him all )

// ==UserScript==
// @name         astars club Mega Clicker
// @namespace    animestars.org
// @description  fuck him all )
// @author       astars lover
// @version      0.21
// @match        https://astars.club/clubs/*/boost/
// @match        https://asstars1.astars.club/clubs/*/boost/
// @match        https://animestars.org/clubs/*/boost/
// @match        https://as1.astars.club/clubs/*/boost/
// @match        https://asstars.tv/clubs/*/boost/
// @icon         https://www.google.com/s2/favicons?sz=64&domain=astars.club
// @grant        none
// @license MIT
// ==/UserScript==

// Сохраняем оригинальные методы
const originalPush = { ...DLEPush };

let lastText = '';

let newAlert = function(text) {
    if (lastText != text) {
        console.log(text);
        lastText = text;
    }
}

// Отключаем уведомления
DLEPush.info = newAlert;
DLEPush.success = newAlert;
DLEPush.warning = newAlert;
DLEPush.error = newAlert;

const userHash = dle_login_hash ?? '';
const REQUEST_DELAY = 5;
let requestCount = 0;
let totalBoosted = 0;
const AUTO_START_TIME = "21:01"; // Время автозапуска в формате HH:MM (по Москве)
let countdownInterval;
let refreshInterval;
let startBtnId = 'startBtnId';

function createButton() {
    const button = document.createElement("button");
    button.id = startBtnId;
    button.innerText = "Ожидание...";
    button.style.position = "fixed";
    button.style.right = "10px";
    button.style.top = "50%";
    button.style.transform = "translateY(-50%)";
    button.style.padding = "10px 20px";
    button.style.fontSize = "16px";
    button.style.backgroundColor = "red";
    button.style.color = "white";
    button.style.border = "none";
    button.style.cursor = "pointer";
    button.style.zIndex = "1000";
    document.body.appendChild(button);

    updateButtonCountdown(button);
    countdownInterval = setInterval(() => updateButtonCountdown(button), 1000);

    button.addEventListener("click", processBoosting);
    createInfoBlock();
}

function updateButtonCountdown(button) {
    const now = new Date();
    const moscowTime = new Date(now.toLocaleString("en-US", { timeZone: "Europe/Moscow" }));
    const [targetHour, targetMinute] = AUTO_START_TIME.split(":").map(Number);
    const targetTime = new Date(moscowTime);
    targetTime.setHours(targetHour, targetMinute, 0, 0);
    if (targetTime < moscowTime) targetTime.setDate(targetTime.getDate() + 1);

    const diff = targetTime - moscowTime;
    if (diff <= 0) {
        button.innerText = "Жми сюда и запускай!";
        clearInterval(countdownInterval);
    } else {
        const hours = String(Math.floor(diff / (1000 * 60 * 60))).padStart(2, '0');
        const minutes = String(Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60))).padStart(2, '0');
        const seconds = String(Math.floor((diff % (1000 * 60)) / 1000)).padStart(2, '0');
        button.innerText = `${hours}:${minutes}:${seconds}`;
    }
}

function createInfoBlock() {
    const infoBlock = document.createElement("div");
    infoBlock.id = "boost-info";
    infoBlock.style.position = "fixed";
    infoBlock.style.right = "10px";
    infoBlock.style.top = "60%";
    infoBlock.style.transform = "translateY(-50%)";
    infoBlock.style.padding = "10px";
    infoBlock.style.fontSize = "14px";
    infoBlock.style.backgroundColor = "black";
    infoBlock.style.color = "white";
    infoBlock.style.border = "1px solid white";
    infoBlock.style.zIndex = "1000";
    infoBlock.innerHTML = `Количество запросов: 0<br>Сдано карточек: 0`;
    document.body.appendChild(infoBlock);
}

function updateInfoBlock() {
    const infoBlock = document.getElementById("boost-info");
    if (infoBlock) {
        infoBlock.innerHTML = `Количество запросов: ${requestCount}<br>Сдано карточек: ${totalBoosted}`;
    }
}

async function sendBoostRequest(cardId, clubId) {
    await new Promise(resolve => setTimeout(resolve, REQUEST_DELAY));
    requestCount++;
    updateInfoBlock();
    const url = "/clubs/" + clubId + "/boost/";
    const data = { action: "boost", card_id: cardId, user_hash: userHash };

    try {
        const response = await fetch(url, {
            method: "POST",
            headers: { "Content-Type": "application/x-www-form-urlencoded" },
            body: new URLSearchParams(data)
        });
        return await response.json();
    } catch (error) {
        // DLEPush?.info(error);
        return null;
    }
}

async function sendRefreshRequest(cardId) {
    await new Promise(resolve => setTimeout(resolve, REQUEST_DELAY));
    requestCount++;
    updateInfoBlock();
    const url = "/engine/ajax/controller.php?mod=clubs_ajax";
    const data = { action: "boost_refresh", card_id: cardId, user_hash: userHash };

    try {
        const response = await fetch(url, {
            method: "POST",
            headers: { "Content-Type": "application/x-www-form-urlencoded" },
            body: new URLSearchParams(data)
        });
        return await response.json();
    } catch (error) {
        // DLEPush?.info(error);
        return null;
    }
}

function parseBoostHtml(html) {
    const parser = new DOMParser();
    const doc = parser.parseFromString(html, "text/html");
    const boostBtn = doc.querySelector(".club__boost-btn");
    const refreshBtn = doc.querySelector(".club__boost__refresh-btn");
    return { boostBtn, refreshBtn };
}

function autoClickRefreshButton() {
    refreshInterval = setInterval(() => {
        const refreshButton = document.querySelector(".club__boost__refresh-btn");
        if (refreshButton) {
            refreshButton.click();
            console.log("Кнопка обновления буста нажата");
        }
    }, 5000);
}

async function processBoosting() {
    // DLEPush?.success('Вперед, отаки! Начинаем эпичный марафон!');
    autoClickRefreshButton();
    document.getElementById(startBtnId)?.remove();
    let btn = document.querySelector(".club__boost-btn") || document.querySelector(".club__boost__refresh-btn");
    let cardId = 0;
    let clubId = 0;

    let needRefresh = false;
    let needBoost = true;
    let response = {};

    while (true) {
        if (response?.boost_html_changed) {
            let { boostBtn: newBoostBtn, refreshBtn: newRefreshBtn } = parseBoostHtml(response.boost_html_changed);
            btn = newBoostBtn || newRefreshBtn;
        }
        else if (response?.boost_html) {
            let { boostBtn: newBoostBtn, refreshBtn: newRefreshBtn } = parseBoostHtml(response.boost_html);
            btn = newBoostBtn || newRefreshBtn;
        }

        if (response?.boost_count) {
            totalBoosted = response.boost_count;
            updateInfoBlock();

            if (response.boost_count >= "300") {
//                finishBoost("Достигнут лимит бустов. все.");
//                break;
            }
        }

        if (!btn) {
            finishBoost('Кнопки не найдены. все.');
            break;
        }

        cardId = btn.getAttribute("data-card-id");
        clubId = btn.getAttribute("data-club-id");

        if (needBoost) {
            needBoost = false;
            response = await sendBoostRequest(cardId, clubId);
            response = await sendBoostRequest(cardId, clubId);
        }

        if (needRefresh) {
            needRefresh = false;
            response = await sendRefreshRequest(cardId);
        }

        if (response?.error) {
            console.log(response.error);

            if (response.error === 'Карта пожертвована') {
                boostOk();
                needRefresh = true;
                continue;
            }

            if (response.error === 'Следующую карту можно сдать клубу через -1 секунд') {
                needBoost = true;
                continue;
            }

            if (response.error === 'Нужная клубу карта не менялась') {
                needRefresh = true;
                continue;
            }

            if (response.error === 'Нужная клубу карта не менялась') {
                needRefresh = true;
                continue;
            }

            if (response.error.includes("Достигнут дневной лимит. все.") || response.error === 'Достигнут дневной лимит пожертвований в клуб, подождите до завтра') {
                finishBoost("Достигнут дневной лимит. все.")
                break;
            }

            if (!needBoost && !needRefresh) needBoost = true;
        } else {
            needBoost = true;
            needRefresh = true;
        }
    }
}

function boostOk() {
    var snd = new Audio("data:audio/wav;base64,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qJrx4KOQjahZxWbcZgztj2c49nKmkId44S71j0c8eV9yDK6uPRzx5X18eDvjvQ6yKo9ZSS6l//8elePK/Lf//IInrOF/FvDoADYAGBMGb7FtErm5MXMlmPAJQVgWta7Zx2go+8xJ0UiCb8LHHdftWyLJE0QIAIsI+UbXu67dZMjmgDGCGl1H+vpF4NSDckSIkk7Vd+sxEhBQMRU8j/12UIRhzSaUdQ+rQU5kGeFxm+hb1oh6pWWmv3uvmReDl0UnvtapVaIzo1jZbf/pD6ElLqSX+rUmOQNpJFa/r+sa4e/pBlAABoAAAAA3CUgShLdGIxsY7AUABPRrgCABdDuQ5GC7DqPQCgbbJUAoRSUj+NIEig0YfyWUho1VBBBA//uQZB4ABZx5zfMakeAAAAmwAAAAF5F3P0w9GtAAACfAAAAAwLhMDmAYWMgVEG1U0FIGCBgXBXAtfMH10000EEEEEECUBYln03TTTdNBDZopopYvrTTdNa325mImNg3TTPV9q3pmY0xoO6bv3r00y+IDGid/9aaaZTGMuj9mpu9Mpio1dXrr5HERTZSmqU36A3CumzN/9Robv/Xx4v9ijkSRSNLQhAWumap82WRSBUqXStV/YcS+XVLnSS+WLDroqArFkMEsAS+eWmrUzrO0oEmE40RlMZ5+ODIkAyKAGUwZ3mVKmcamcJnMW26MRPgUw6j+LkhyHGVGYjSUUKNpuJUQoOIAyDvEyG8S5yfK6dhZc0Tx1KI/gviKL6qvvFs1+bWtaz58uUNnryq6kt5RzOCkPWlVqVX2a/EEBUdU1KrXLf40GoiiFXK///qpoiDXrOgqDR38JB0bw7SoL+ZB9o1RCkQjQ2CBYZKd/+VJxZRRZlqSkKiws0WFxUyCwsKiMy7hUVFhIaCrNQsKkTIsLivwKKigsj8XYlwt/WKi2N4d//uQRCSAAjURNIHpMZBGYiaQPSYyAAABLAAAAAAAACWAAAAApUF/Mg+0aohSIRobBAsMlO//Kk4soosy1JSFRYWaLC4qZBYWFRGZdwqKiwkNBVmoWFSJkWFxX4FFRQWR+LsS4W/rFRb/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////VEFHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU291bmRib3kuZGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAwNGh0dHA6Ly93d3cuc291bmRib3kuZGUAAAAAAAAAACU=");
    snd.play();
}

function finishBoost(text) {
    clearInterval(refreshInterval);
    Object?.assign(DLEPush, originalPush);
    DLEPush?.info(text);
}


(function() {
    'use strict';
    if (/^\/clubs\/\d+\/boost\/$/.test(window.location.pathname)) {
        createButton();
    }
})();