Steam Auto-Click "Show More Content" (v4.2, with Pause Button)

Быстрая версия: автоматически нажимает "Показать еще" без задержки. Добавлена плавающая кнопка для паузы/возобновления работы.

// ==UserScript==
// @name         Steam Auto-Click "Show More Content" (v4.2, with Pause Button)
// @namespace    http://tampermonkey.net/
// @version      4.2
// @description  Быстрая версия: автоматически нажимает "Показать еще" без задержки. Добавлена плавающая кнопка для паузы/возобновления работы.
// @author       Gemini & Community
// @match        https://steamcommunity.com/app/*
// @match        https://steamcommunity.com/workshop/browse/*
// @match        https://steamcommunity.com/id/*/myworkshopfiles/*
// @grant        GM_addStyle
// @run-at       document-idle
// @icon         https://store.steampowered.com/favicon.ico
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // --- НАСТРОЙКИ ---
    const MAX_CLICKS = 150; // Увеличено, так как клики происходят быстрее
    const POLL_INTERVAL_MS = 1000; // Интервал для запасной проверки (в мс)
    // --- КОНЕЦ НАСТРОЕК ---

    let clickCount = 0;
    let isClicking = false;
    let isPaused = false; // Новая переменная состояния паузы
    let observer;
    let pollIntervalId;
    let pauseButton; // Переменная для кнопки паузы

    console.log("Userscript v4.2 (with Pause Button) запущен.");

    // Функция для создания и управления кнопкой паузы
    const createPauseButton = () => {
        pauseButton = document.createElement('button');
        pauseButton.id = 'tm-pause-button';
        pauseButton.textContent = 'Пауза';

        // Применяем стили через GM_addStyle для большей совместимости
        GM_addStyle(`
            #tm-pause-button {
                position: fixed;
                bottom: 20px;
                right: 20px;
                z-index: 9999;
                padding: 10px 15px;
                background-color: #4CAF50; /* Зеленый - работает */
                color: white;
                border: none;
                border-radius: 5px;
                cursor: pointer;
                font-size: 14px;
                box-shadow: 0 2px 5px rgba(0,0,0,0.2);
                transition: background-color 0.3s;
            }
            #tm-pause-button:hover {
                opacity: 0.9;
            }
        `);

        pauseButton.addEventListener('click', () => {
            isPaused = !isPaused; // Инвертируем состояние паузы
            if (isPaused) {
                pauseButton.textContent = 'Возобновить';
                pauseButton.style.backgroundColor = '#f44336'; // Красный - на паузе
                console.log("Скрипт поставлен на паузу.");
            } else {
                pauseButton.textContent = 'Пауза';
                pauseButton.style.backgroundColor = '#4CAF50'; // Зеленый - работает
                console.log("Скрипт возобновлен.");
                // Сразу после возобновления пытаемся кликнуть
                processContent();
            }
        });

        document.body.appendChild(pauseButton);
    };


    // Функция для очистки: отключает наблюдатель, интервал и удаляет кнопку
    const cleanup = () => {
        console.log("Завершение работы скрипта. Очистка...");
        if (observer) {
            observer.disconnect();
        }
        if (pollIntervalId) {
            clearInterval(pollIntervalId);
        }
        if (pauseButton) {
            pauseButton.remove();
        }
    };

    // Основная функция для обработки контента
    const processContent = () => {
        // Если скрипт на паузе, ничего не делаем
        if (isPaused || isClicking) return;

        const noMoreContent = document.getElementById('NoMoreContent');
        if (noMoreContent && noMoreContent.style.display !== 'none') {
            console.log("Больше контента нет. Скрипт остановлен.");
            cleanup();
            return;
        }

        if (clickCount >= MAX_CLICKS) {
            console.warn(`Достигнут лимит в ${MAX_CLICKS} кликов. Скрипт остановлен.`);
            cleanup();
            return;
        }

        const moreButton = document.getElementById('GetMoreContentBtn');
        if (moreButton && moreButton.style.display !== 'none') {
            isClicking = true;
            clickCount++;
            console.log(`Кнопка найдена. Мгновенный клик #${clickCount}...`);

            // --- Клик происходит немедленно ---
            moreButton.querySelector('a')?.click();

            requestAnimationFrame(() => {
                 isClicking = false;
            });
        }
    };

    // --- ЗАПУСК СКРИПТА ---

    // Создаем кнопку паузы при старте
    createPauseButton();

    // Целевой узел для наблюдения.
    const targetNode = document.body;

    // Конфигурация для наблюдателя: следим за структурой и ИЗМЕНЕНИЕМ АТРИБУТОВ
    const config = {
        childList: true,
        subtree: true,
        attributes: true,
        attributeFilter: ['style', 'class']
    };

    // Создаем наблюдателя
    observer = new MutationObserver(() => {
        // Проверяем паузу перед обработкой мутаций
        if (isPaused) return;
        processContent();
    });

    // Начинаем наблюдение
    observer.observe(targetNode, config);

    // Запускаем периодическую проверку как надежный запасной вариант
    pollIntervalId = setInterval(processContent, POLL_INTERVAL_MS);

    // Выполняем первую проверку немедленно при запуске
    processContent();

})();