astars.club Auto Helper

хелпер который помогает определить популярность карты на сайте astars.club

Verze ze dne 20. 01. 2025. Zobrazit nejnovější verzi.

// ==UserScript==
// @name         astars.club Auto Helper
// @namespace    astars.club
// @version      1.8
// @description  хелпер который помогает определить популярность карты на сайте astars.club
// @author       astars lover
// @match        https://astars.club/*
// @license MIT
// @grant        none


// ==/UserScript==

const DELAY = 500; // Задержка между запросами в миллисекундах (по умолчанию 0,5 секунды)

const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));

async function updateCardInfo(cardId, element) {
    if (!cardId || !element) {
        console.log(cardId, 'updateCardInfo error');
        return;
    }

    try {
        await sleep(DELAY);

        // Получение количества "Желающих"
        const needResponse = await fetch(`https://astars.club/cards/${cardId}/users/need/`);
        if (needResponse.status === 502) {
            console.error("Ошибка 502: Остановка выполнения скриптов.");
            throw new Error("502 Bad Gateway");
        }

        let needCount = 0;
        if (needResponse.ok) {
            const needHtml = await needResponse.text();
            const needDoc = new DOMParser().parseFromString(needHtml, 'text/html');
            needCount = needDoc.querySelectorAll('.profile__friends-item').length;

            const pagination = needDoc.querySelector('.pagination__pages');
            if (pagination) {
                const lastPageLink = pagination.querySelector('a:last-of-type');
                const totalPages = lastPageLink ? parseInt(lastPageLink.innerText, 10) : 1;
                if (totalPages > 1) {
                    needCount += (totalPages - 1) * 50;
                }
            }
        }

        await sleep(DELAY);

        // Получение количества "Готовых поменять"
        const tradeResponse = await fetch(`https://astars.club/cards/${cardId}/users/trade/`);
        if (tradeResponse.status === 502) {
            console.error("Ошибка 502: Остановка выполнения скриптов.");
            throw new Error("502 Bad Gateway");
        }

        let tradeCount = 0;
        if (tradeResponse.ok) {
            const tradeHtml = await tradeResponse.text();
            const tradeDoc = new DOMParser().parseFromString(tradeHtml, 'text/html');
            tradeCount = tradeDoc.querySelectorAll('.profile__friends-item').length;

            const pagination = tradeDoc.querySelector('.pagination__pages');
            if (pagination) {
                const lastPageLink = pagination.querySelector('a:last-of-type');
                const totalPages = lastPageLink ? parseInt(lastPageLink.innerText, 10) : 1;
                if (totalPages > 1 && tradeCount >= 50) {
                    tradeCount += (totalPages - 1) * 50;
                }
            }
        }

        await sleep(DELAY);

        // Получение популярности и ранга
        const popularityResponse = await fetch(`https://astars.club/cards/${cardId}/users/`);
        if (popularityResponse.status === 502) {
            console.error("Ошибка 502: Остановка выполнения скриптов.");
            throw new Error("502 Bad Gateway");
        }

        let popularityCount = 0;
        let rankText = '';
        if (popularityResponse.ok) {
            const popularityHtml = await popularityResponse.text();
            const popularityDoc = new DOMParser().parseFromString(popularityHtml, 'text/html');
            popularityCount = popularityDoc.querySelectorAll('.card-show__owner').length;

            const pagination = popularityDoc.querySelector('.pagination__pages');
            if (pagination) {
                const lastPageLink = pagination.querySelector('a:last-of-type');
                const totalPages = lastPageLink ? parseInt(lastPageLink.innerText, 10) : 1;
                if (totalPages > 1) {
                    popularityCount += (totalPages - 1) * 35;
                }
            }

            const rankElement = popularityDoc.querySelector('.anime-cards__rank');
            if (rankElement) {
                rankText = rankElement.textContent.trim();
            }
        }

        // Очистка старой информации
        element.querySelector('.link-icon')?.remove();

        // Добавление новой информации
        const icon = document.createElement('div');
        icon.className = 'link-icon';
        icon.style.position = 'absolute';
        icon.style.top = '5px';
        icon.style.right = '5px';
        icon.style.backgroundColor = 'rgba(0, 0, 0, 0.7)';
        icon.style.color = 'white';
        icon.style.padding = '5px';
        icon.style.borderRadius = '5px';
        icon.style.fontSize = '12px';
        icon.innerHTML = `Ранг: ${rankText}<br>Уже имеют: ${popularityCount}<br>Хотят получить: ${needCount}<br>Готовы поменять: ${tradeCount}`;

        element.style.position = 'relative';
        element.appendChild(icon);

        console.log(cardId, '- ok');

    } catch (error) {
        console.error(`Ошибка обработки карты ${cardId}:`, error);
        // Остановка выполнения скриптов
        throw error;
    }
}

function processCards() {
    const cards = document.querySelectorAll('.lootbox__card, .anime-cards__item, .trade__inventory-item, .trade__main-item');

    console.log(cards.length, 'cards found');

    for (const card of cards) {
        let cardId = card.getAttribute('data-id') || card.getAttribute('card-id');
        const href = card.getAttribute('href');

        if (href) {
            let cardIdMatch = href.match(/\/cards\/(\d+)\/users\//);
            console.log(cardIdMatch);
            if (cardIdMatch) {
                cardId = cardIdMatch[1];
            }
        }
        if (cardId) {
            updateCardInfo(cardId, card).catch(error => {
                console.error("Остановка из-за критической ошибки:", error.message);
                return;
            });
        } else {
            console.log(cardId, 'cardId not found');
            console.log(card);
        }
    }
}

function addUpdateButton() {
    if (!document.querySelector('#fetchLinksButton')) {
        const button = document.createElement('button');
        button.id = 'fetchLinksButton';
        button.innerText = 'Обновить инфу';
        button.style.position = 'fixed';
        button.style.top = '10px';
        button.style.right = '10px';
        button.style.zIndex = '1000';
        button.style.backgroundColor = '#007bff';
        button.style.color = '#fff';
        button.style.border = 'none';
        button.style.borderRadius = '5px';
        button.style.padding = '10px 15px';
        button.style.cursor = 'pointer';
        button.style.boxShadow = '0 2px 5px rgba(0, 0, 0, 0.2)';
        button.addEventListener('click', processCards);
        document.body.appendChild(button);
    }
}

function clearIcons() {
    $('.card-notification')?.first()?.click();
}

(function() {
    'use strict';

    setInterval(clearIcons, 2000);
    addUpdateButton();
})();
长期地址
遇到问题?请前往 GitHub 提 Issues,或加Q群1031348184

赞助商

Fishcpy

广告

Rainyun

注册一下就行

Rainyun

一年攒够 12 元