HeroesWM Inventory Stars Hider

Удаляет артефакты инвентаря, отмеченные звёздами, только для вкладки "Все артефакты".

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         HeroesWM Inventory Stars Hider
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  Удаляет артефакты инвентаря, отмеченные звёздами, только для вкладки "Все артефакты".
// @author       o3-mini-ChatGPT
// @match        https://www.heroeswm.ru/inventory.php*
// @grant        none
// @run-at       document-end
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // Массив подстрок для поиска нужных звездочек
    const starIndicators = [
        'src="https://dcdn.heroeswm.ru/i/inv_im/small_star2.png"',
        'src="https://dcdn.heroeswm.ru/i/inv_im/small_star1.png"'
    ];

    /**
     * Функция проверяет, содержит ли элемент одну из указанных подстрок.
     * @param {HTMLElement} element - Элемент для проверки.
     * @returns {boolean} - Возвращает true, если элемент содержит хотя бы одну из строк.
     */
    function containsStarIndicator(element) {
        return starIndicators.some(indicator => element.innerHTML.indexOf(indicator) !== -1);
    }

    /**
     * Функция проверяет, активна ли вкладка "Все артефакты" (filter_tab1).
     * @returns {boolean} - Возвращает true, если filter_tab1 имеет класс 'filter_tab_active'.
     */
    function isFilterTab1Active() {
        const filterTab1 = document.getElementById('filter_tab1');
        return filterTab1 && filterTab1.classList.contains('filter_tab_active');
    }

    /**
     * Функция удаляет все элементы инвентаря (id начинается с "id_inv_item"),
     * если они содержат указанные изображения звезд, а также только если активна вкладка filter_tab1.
     */
    function removeStarElements() {
        if (!isFilterTab1Active()) {
            console.log('Filter Tab 1 не активна – удаление не производится.');
            return;
        }
        const inventoryItems = document.querySelectorAll("div[id^='id_inv_item']");
        inventoryItems.forEach(item => {
            if (containsStarIndicator(item)) {
                item.remove();
                console.log("Удален элемент инвентаря, содержащий звезду:", item);
            }
        });
    }

    // Первый проход при загрузке страницы
    removeStarElements();

    // Наблюдатель за динамическим добавлением элементов в DOM
    const observer = new MutationObserver(mutations => {
        // Если вкладка filter_tab1 не активна – никаких изменений не обрабатываем
        if (!isFilterTab1Active()) return;

        mutations.forEach(mutation => {
            mutation.addedNodes.forEach(node => {
                // Обрабатываем только элементы
                if (node.nodeType === Node.ELEMENT_NODE) {
                    // Если добавлен элемент инвентаря с нужным id и он содержит звездный индикатор
                    if (node.id && node.id.indexOf("id_inv_item") === 0 && containsStarIndicator(node)) {
                        node.remove();
                        console.log("Удален динамически добавленный элемент инвентаря:", node);
                    }
                    // Проверяем всех потомков добавленного элемента, если вдруг они содержат inventory items
                    const descendants = node.querySelectorAll("div[id^='id_inv_item']");
                    descendants.forEach(descendant => {
                        if (containsStarIndicator(descendant)) {
                            descendant.remove();
                            console.log("Удален динамически добавленный потомок инвентаря:", descendant);
                        }
                    });
                }
            });
        });
    });

    // Наблюдаем за изменениями во всем теле документа
    observer.observe(document.body, { childList: true, subtree: true });

    // Если вкладки меняются, можем контролировать повторное выполнение удаления.
    // Подписываемся на клик по элементам фильтра, затем через небольшой интервал запускаем проверку.
    document.querySelectorAll('.filter_tab').forEach(tab => {
        tab.addEventListener('click', () => {
            // Задержка для того, чтобы изменения классов отработали
            setTimeout(removeStarElements, 200);
        });
    });
})();