HeroesWM Inventory Stars Hider

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

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 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);
        });
    });
})();