Перейти к содержимому
Zone of Games Forum

Рекомендованные сообщения

В 03.06.2025 в 10:03, 0wn3df1x сказал:

 

 

Приветствую,офтоп,

Вы унас спец по макросам в стим,не ли макроса который позволит убрать все игры из блеклиста?)

 

UPD

ЛЮДИ проверяйте СМС,в стиме в не одна тема  приходят СМС,с кодом подтверждения  на смену данных.

На всякий советуют поменять пароль,и пароль от почты,если вам пришло.

 

Изменено пользователем edifiei

Поделиться сообщением


Ссылка на сообщение
39 минут назад, edifiei сказал:

UPD

ЛЮДИ проверяйте СМС,в стиме в не одна тема  приходят СМС,с кодом подтверждения  на смену данных.

На всякий советуют поменять пароль,и пароль от почты,если вам пришло.

 

Ничего менять не надо. Была новость- утекли только номера телефонов, без какой-либо привязки к почте\логину. Не наводите панику.

 

Утёкшие данные не позволяют определить аккаунт, пароль, платёжную информацию и другие личные данные пользователей Steam по номеру телефона

https://store.steampowered.com/news/app/593110/view/533224478739530145

Изменено пользователем adl

Поделиться сообщением


Ссылка на сообщение
5 минут назад, adl сказал:

Ничего менять не надо. Была новость- утекли только номера телефонов, без какой-либо привязки к почте\логину. Не наводите панику.

 

Утёкшие данные не позволяют определить аккаунт, пароль, платёжную информацию и другие личные данные пользователей Steam по номеру телефона

https://store.steampowered.com/news/app/593110/view/533224478739530145

Человеку написавшему в поддержку(с его слов),посоветовали сменить пароли,и сказали что  возможно была попытка взлома.

Поделиться сообщением


Ссылка на сообщение
1 час назад, edifiei сказал:

Приветствую,офтоп,

Вы унас спец по макросам в стим,не ли макроса который позволит убрать все игры из блеклиста?)

  1. Заходим на страницу: https://store.steampowered.com/account/notinterested/
  2. Устанавливаем Tamper Monkey (если ещё нет). 
  3. Ставим скрипт:
Скрытый текст

// ==UserScript==
// @name         SIGA
// @namespace    http://tampermonkey.net/
// @version      2.1
// @description  Постепенное удаление всех игр из списка "Не интересно" в Steam с возможностью паузы и отслеживанием прогресса.
// @author       0wn3df1x
// @match        https://store.steampowered.com/account/notinterested*
// @icon         https://store.steampowered.com/favicon.ico
// @grant        GM_xmlhttpRequest
// @grant        GM_addStyle
// @require      https://code.jquery.com/jquery-3.6.0.min.js
// @connect      store.steampowered.com
// ==/UserScript==

(function() {
    'use strict';

    const $ = window.jQuery;

    let state = {
        allIgnoredApps: [],
        removedInSessionAppIds: [],
        currentIndex: 0,
        totalToRemove: 0,
        isPaused: false,
        isCleaning: false,
        sessionID: null,
        removeInterval: 3500,
        currentAppRetries: 0,
        uiContainer: null,
        mainActionButton: null,
        getRemovedButton: null,
        progressBarFill: null,
        progressTextElement: null,
        etaTextElement: null,
        statusMessageElement: null,
        copyFeedbackElement: null
    };

    const RATE_LIMIT_WAIT_MS = 3 * 60 * 1000;
    const MAX_APP_RETRIES = 3;

    let cssStyles = `
        #steamIgnoredCleanerUI {
            background: #151f2c;
            padding: 20px;
            margin: 25px 0;
            border-radius: 5px;
            color: #c6d4df;
            border: 1px solid #2a3f5a;
            box-shadow: 0 0 15px rgba(0,0,0,0.3);
            font-family: "Motiva Sans", Arial, Helvetica, sans-serif;
        }
        .cleaner-header h2 {
            color: #67c1f5;
            margin-top: 0;
            margin-bottom: 15px;
            font-weight: 500;
            border-bottom: 1px solid #2a3f5a;
            padding-bottom: 10px;
        }
        .cleaner-main-layout {
            display: flex;
            gap: 20px;
        }
        .cleaner-controls {
            flex-grow: 1;
        }
        .cleaner-side-panel {
            flex-basis: 200px;
            flex-shrink: 0;
        }
        .steam-cleaner-button {
            background: linear-gradient(to bottom, #799905 5%, #536904 95%);
            border: 1px solid #1b2838;
            padding: 8px 15px;
            color: #fff;
            cursor: pointer;
            border-radius: 3px;
            margin-bottom: 15px;
            font-size: 14px;
            transition: background 0.2s ease;
        }
        .steam-cleaner-button:hover {
            background: linear-gradient(to bottom, #8ab807 5%, #647d05 95%);
        }
        .steam-cleaner-button:disabled {
            opacity: 0.5;
            cursor: not-allowed;
        }
        .steam-cleaner-button.secondary {
            background: linear-gradient(to bottom, #4b6077 5%, #3a4b5d 95%);
        }
        .steam-cleaner-button.secondary:hover {
            background: linear-gradient(to bottom, #5c738e 5%, #45586b 95%);
        }
        .progress-section {
            margin-top: 15px;
        }
        .progress-bar-container {
            width: 100%;
            background: #101822;
            height: 22px;
            border-radius: 3px;
            overflow: hidden;
            border: 1px solid #2a3f5a;
        }
        .progress-bar-fill {
            height: 100%;
            background: #67c1f5;
            width: 0%;
            transition: width 0.3s ease-out;
            text-align: center;
            line-height: 22px;
            color: #fff;
            font-size: 12px;
        }
        .progress-info, .status-output-message {
            color: #a8b2ba;
            margin: 8px 0;
            font-size: 13px;
        }
        .status-output-message.error {
            color: #ff6b6b;
            font-weight: bold;
        }
        .status-output-message.success {
            color: #799905;
            font-weight: bold;
        }
        .copy-feedback-message {
            display: block;
            font-size: 12px;
            color: #67c1f5;
            margin-top: 5px;
            min-height: 15px;
        }
        .initial-info {
            color: #a8b2ba;
            margin-bottom: 15px;
            font-size: 14px;
        }
    `;
    GM_addStyle(cssStyles.replace(/\/\*[\s\S]*?\*\/|\/\/.*/g, ''));


    function createUI() {
        const container = $(`
            <div id="steamIgnoredCleanerUI">
                <div class="cleaner-header">
                    <h2>Steam Очиститель Списка "Не интересно"</h2>
                </div>
                <div class="cleaner-main-layout">
                    <div class="cleaner-controls">
                        <div class="initial-info">
                            Этот скрипт поможет вам удалить <b>ВСЕ</b> игры из вашего списка "Не интересно" в Steam.
                            Процесс происходит постепенно, чтобы избежать блокировок со стороны Steam.
                        </div>
                        <button id="cleanerMainActionButton" class="steam-cleaner-button">Начать очистку</button>
                        <div class="progress-section">
                            <div class="progress-bar-container">
                                <div id="cleanerProgressBarFill" class="progress-bar-fill">0%</div>
                            </div>
                            <div id="cleanerProgressText" class="progress-info">Ожидание начала...</div>
                            <div id="cleanerEtaText" class="progress-info">ETA: N/A</div>
                        </div>
                        <div id="cleanerStatusMessage" class="status-output-message"></div>
                    </div>
                    <div class="cleaner-side-panel">
                        <button id="cleanerGetRemovedButton" class="steam-cleaner-button secondary" disabled>
                            Копировать список удаленных
                        </button>
                        <span id="cleanerCopyFeedback" class="copy-feedback-message"></span>
                    </div>
                </div>
            </div>
        `).insertAfter('.pageheader');

        state.uiContainer = container;
        state.mainActionButton = $('#cleanerMainActionButton');
        state.getRemovedButton = $('#cleanerGetRemovedButton');
        state.progressBarFill = $('#cleanerProgressBarFill');
        state.progressTextElement = $('#cleanerProgressText');
        state.etaTextElement = $('#cleanerEtaText');
        state.statusMessageElement = $('#cleanerStatusMessage');
        state.copyFeedbackElement = $('#cleanerCopyFeedback');

        state.mainActionButton.click(handleMainAction);
        state.getRemovedButton.click(copyRemovedListToClipboard);
    }

    function updateStatus(message, type = 'info') {
        state.statusMessageElement.text(message)
            .removeClass('error success')
            .addClass(type === 'error' ? 'error' : (type === 'success' ? 'success' : ''));
        console.log((type === 'error' ? 'X ' : (type === 'success' ? 'V ' : 'i ')) + message);
    }

    function updateProgressDisplay() {
        if (state.totalToRemove === 0 && !state.isCleaning) {
            state.progressBarFill.css('width', '0%').text('0%');
            state.progressTextElement.text('Ожидание начала...');
            state.etaTextElement.text('ETA: N/A');
            return;
        }
         if (state.totalToRemove === 0 && state.isCleaning) {
            state.progressBarFill.css('width', '0%').text('0%');
            state.progressTextElement.text('Нет игр для удаления.');
            state.etaTextElement.text('ETA: N/A');
            return;
        }


        const processedCount = state.currentIndex;
        const percent = state.totalToRemove > 0 ? (processedCount / state.totalToRemove) * 100 : 0;
        state.progressBarFill.css('width', `${percent.toFixed(1)}%`).text(`${percent.toFixed(0)}%`);

        if (state.isCleaning && !state.isPaused && processedCount < state.totalToRemove) {
            state.progressTextElement.text(`Обработано: ${processedCount} из ${state.totalToRemove}`);
            const etaSeconds = (state.totalToRemove - processedCount) * (state.removeInterval / 1000);
            state.etaTextElement.text(`ETA: ${formatTime(etaSeconds)}`);
        } else if (processedCount === state.totalToRemove && state.totalToRemove > 0) {
             state.progressTextElement.text(`Завершено: ${processedCount} из ${state.totalToRemove}`);
             state.etaTextElement.text('Готово!');
        } else if (state.isPaused) {
            state.progressTextElement.text(`Пауза. Обработано: ${processedCount} из ${state.totalToRemove}`);
             const etaSecondsPaused = (state.totalToRemove - processedCount) * (state.removeInterval / 1000);
            state.etaTextElement.text(`ETA (на паузе): ${formatTime(etaSecondsPaused)}`);
        }
    }

    function formatTime(totalSeconds) {
        if (isNaN(totalSeconds) || totalSeconds < 0) return 'N/A';
        const hours = Math.floor(totalSeconds / 3600);
        const minutes = Math.floor((totalSeconds % 3600) / 60);
        const seconds = Math.floor(totalSeconds % 60);
        let timeString = '';
        if (hours > 0) timeString += `${hours `;
        if (minutes > 0 || hours > 0) timeString += `${minutes `;
        timeString += `${seconds}с`;
        return timeString.trim() || '0с';
    }

    async function fetchIgnoredApps() {
        return new Promise((resolve, reject) => {
            GM_xmlhttpRequest({
                method: 'GET',
                url: 'https://store.steampowered.com/dynamicstore/userdata/',
                onload: function(response) {
                    try {
                        const data = JSON.parse(response.responseText);
                        if (data.rgIgnoredApps) {
                            resolve(Object.keys(data.rgIgnoredApps).map(Number));
                        } else {
                            resolve([]);
                        }
                    } catch (e) {
                        console.error("X Ошибка парсинга userdata:", e);
                        reject("Не удалось разобрать данные пользователя.");
                    }
                },
                onerror: function(err) {
                    console.error("X Ошибка загрузки userdata:", err);
                    reject("Ошибка сети при получении списка игнорируемых игр.");
                }
            });
        });
    }

    function removeNextApp() {
        if (state.isPaused || !state.isCleaning) {
            if (state.isPaused) updateStatus('Процесс на паузе.', 'info');
            return;
        }

        if (state.currentIndex >= state.totalToRemove) {
            updateStatus('* Очистка завершена! Все игры из списка обработаны.', 'success');
            state.mainActionButton.text('Начать очистку').prop('disabled', false);
            state.getRemovedButton.prop('disabled', state.removedInSessionAppIds.length === 0);
            state.isCleaning = false;
            updateProgressDisplay();
            return;
        }

        const appId = state.allIgnoredApps[state.currentIndex];
        updateStatus(`Удаление appID: ${appId} (${state.currentIndex + 1} из ${state.totalToRemove})...`);
        updateProgressDisplay();

        $J.post('https://store.steampowered.com/recommended/ignorerecommendation/', {
            sessionid: state.sessionID,
            appid: appId,
            snr: '1_account_notinterested_',
            remove: 1
        })
        .done(function(response) {
            state.removedInSessionAppIds.push(appId);
            state.getRemovedButton.prop('disabled', false);

            $J('#ignored_app_' + appId).fadeOut(function() { $(this).remove(); });
            if (typeof GDynamicStore !== 'undefined' && GDynamicStore.InvalidateCache) {
                GDynamicStore.InvalidateCache();
            }

            state.currentIndex++;
            state.currentAppRetries = 0;
            setTimeout(removeNextApp, state.removeInterval);
        })
        .fail(function(jqXHR, textStatus, errorThrown) {
            if (jqXHR.status === 429) {
                updateStatus(`! Ошибка 429 (Too Many Requests) для appID: ${appId}. Ожидание ${formatTime(RATE_LIMIT_WAIT_MS / 1000)}...`, 'error');
                setTimeout(removeNextApp, RATE_LIMIT_WAIT_MS);
            } else {
                state.currentAppRetries++;
                if (state.currentAppRetries < MAX_APP_RETRIES) {
                    const retryDelay = state.removeInterval * (state.currentAppRetries + 1);
                    updateStatus(`X Ошибка удаления ${appId} (попытка ${state.currentAppRetries}/${MAX_APP_RETRIES}): ${jqXHR.statusText || errorThrown}. Повтор через ${formatTime(retryDelay/1000)}.`, 'error');
                    setTimeout(removeNextApp, retryDelay);
                } else {
                    updateStatus(`X Пропуск appID: ${appId} после ${MAX_APP_RETRIES} неудачных попыток. Ошибка: ${jqXHR.statusText || errorThrown}`, 'error');
                    state.currentIndex++;
                    state.currentAppRetries = 0;
                    setTimeout(removeNextApp, state.removeInterval);
                }
            }
        });
    }

    async function handleMainAction() {
        if (state.isCleaning && !state.isPaused) {
            state.isPaused = true;
            state.mainActionButton.text('Продолжить очистку');
            updateStatus('Очистка приостановлена.', 'info');
            updateProgressDisplay();
        } else if (state.isCleaning && state.isPaused) {
            state.isPaused = false;
            state.mainActionButton.text('Пауза');
            updateStatus('Возобновление очистки...', 'info');
            removeNextApp();
        } else {
            state.mainActionButton.prop('disabled', true).text('Загрузка списка...');
            updateStatus('Получение списка игнорируемых игр...', 'info');
            state.isCleaning = true;
            state.isPaused = false;

            try {
                state.allIgnoredApps = await fetchIgnoredApps();
                state.totalToRemove = state.allIgnoredApps.length;
                state.currentIndex = 0;
                state.removedInSessionAppIds = [];
                state.currentAppRetries = 0;

                if (state.totalToRemove === 0) {
                    updateStatus('V В вашем списке "Не интересно" нет игр для удаления.', 'success');
                    state.mainActionButton.prop('disabled', false).text('Начать очистку');
                    state.isCleaning = false;
                    updateProgressDisplay();
                    return;
                }

                updateStatus(`Найдено ${state.totalToRemove} игр. Начинаем очистку...`, 'info');
                state.mainActionButton.prop('disabled', false).text('Пауза');
                state.getRemovedButton.prop('disabled', true);
                state.copyFeedbackElement.text('');
                updateProgressDisplay();
                removeNextApp();

            } catch (errorMsg) {
                updateStatus(`X Ошибка: ${errorMsg}`, 'error');
                state.mainActionButton.prop('disabled', false).text('Начать очистку');
                state.isCleaning = false;
            }
        }
    }

    function copyRemovedListToClipboard() {
        if (state.removedInSessionAppIds.length === 0) {
            state.copyFeedbackElement.text('Список удаленных пуст.');
            setTimeout(() => state.copyFeedbackElement.text(''), 3000);
            return;
        }

        const listString = state.removedInSessionAppIds.join('\n');
        navigator.clipboard.writeText(listString).then(() => {
            state.copyFeedbackElement.text(`Скопировано ${state.removedInSessionAppIds.length} AppID!`);
            setTimeout(() => state.copyFeedbackElement.text(''), 3000);
        }).catch(err => {
            state.copyFeedbackElement.text('X Ошибка копирования.');
            console.error('X Ошибка копирования в буфер обмена:', err);
            setTimeout(() => state.copyFeedbackElement.text(''), 3000);
        });
    }

    $(function() {
        if (typeof g_sessionID === 'undefined' || g_sessionID === null) {
            const pageContent = $('#account_notinterested_area .pagecontent');
            if (pageContent.length) {
                 pageContent.first().prepend('<div style="color: red; font-weight: bold; padding: 10px; background: #330000; border: 1px solid red; margin-bottom:15px;">Steam Session ID не найден. Убедитесь, что вы авторизованы в Steam. Скрипт не будет работать.</div>');
            } else {
                alert('Steam Session ID не найден. Убедитесь, что вы авторизованы в Steam. Скрипт не будет работать.');
            }
            console.error("X Steam Ignored Apps Cleaner: g_sessionID is not available.");
            return;
        }
        state.sessionID = g_sessionID;

        if (typeof $J === 'undefined') {
             window.$J = $;
             console.warn("i Steam Ignored Apps Cleaner: $J is not defined by Steam, using Tampermonkey's jQuery.");
        }

        createUI();
        updateStatus('Скрипт готов к работе. Нажмите "Начать очистку".', 'info');
        updateProgressDisplay();
    });

})();

 


Чем больше игр скрыто — тем дольше будет удалять. Как видно с моего скрина, для удаления моих 52916 скрытых понадобится ждать 51 час. Можно поставить на удаление и держать вкладку открытой пару часов. Затем продолжить в другой день. 

hUKjDyg.png

  • Спасибо (+1) 1

Поделиться сообщением


Ссылка на сообщение
2 минуты назад, 0wn3df1x сказал:
  1. Заходим на страницу: https://store.steampowered.com/account/notinterested/
  2. Устанавливаем Tamper Monkey (если ещё нет). 
  3. Ставим скрипт:
  Скрипт (Показать содержимое)


// ==UserScript==
// @name         SIGA
// @namespace    http://tampermonkey.net/
// @version      2.1
// @description  Постепенное удаление всех игр из списка "Не интересно" в Steam с возможностью паузы и отслеживанием прогресса.
// @author       0wn3df1x
// @match        https://store.steampowered.com/account/notinterested*
// @icon         https://store.steampowered.com/favicon.ico
// @grant        GM_xmlhttpRequest
// @grant        GM_addStyle
// @require      https://code.jquery.com/jquery-3.6.0.min.js
// @connect      store.steampowered.com
// ==/UserScript==

(function() {
    'use strict';

    const $ = window.jQuery;

    let state = {
        allIgnoredApps: [],
        removedInSessionAppIds: [],
        currentIndex: 0,
        totalToRemove: 0,
        isPaused: false,
        isCleaning: false,
        sessionID: null,
        removeInterval: 3500,
        currentAppRetries: 0,
        uiContainer: null,
        mainActionButton: null,
        getRemovedButton: null,
        progressBarFill: null,
        progressTextElement: null,
        etaTextElement: null,
        statusMessageElement: null,
        copyFeedbackElement: null
    };

    const RATE_LIMIT_WAIT_MS = 3 * 60 * 1000;
    const MAX_APP_RETRIES = 3;

    let cssStyles = `
        #steamIgnoredCleanerUI {
            background: #151f2c;
            padding: 20px;
            margin: 25px 0;
            border-radius: 5px;
            color: #c6d4df;
            border: 1px solid #2a3f5a;
            box-shadow: 0 0 15px rgba(0,0,0,0.3);
            font-family: "Motiva Sans", Arial, Helvetica, sans-serif;
        }
        .cleaner-header h2 {
            color: #67c1f5;
            margin-top: 0;
            margin-bottom: 15px;
            font-weight: 500;
            border-bottom: 1px solid #2a3f5a;
            padding-bottom: 10px;
        }
        .cleaner-main-layout {
            display: flex;
            gap: 20px;
        }
        .cleaner-controls {
            flex-grow: 1;
        }
        .cleaner-side-panel {
            flex-basis: 200px;
            flex-shrink: 0;
        }
        .steam-cleaner-button {
            background: linear-gradient(to bottom, #799905 5%, #536904 95%);
            border: 1px solid #1b2838;
            padding: 8px 15px;
            color: #fff;
            cursor: pointer;
            border-radius: 3px;
            margin-bottom: 15px;
            font-size: 14px;
            transition: background 0.2s ease;
        }
        .steam-cleaner-button:hover {
            background: linear-gradient(to bottom, #8ab807 5%, #647d05 95%);
        }
        .steam-cleaner-button:disabled {
            opacity: 0.5;
            cursor: not-allowed;
        }
        .steam-cleaner-button.secondary {
            background: linear-gradient(to bottom, #4b6077 5%, #3a4b5d 95%);
        }
        .steam-cleaner-button.secondary:hover {
            background: linear-gradient(to bottom, #5c738e 5%, #45586b 95%);
        }
        .progress-section {
            margin-top: 15px;
        }
        .progress-bar-container {
            width: 100%;
            background: #101822;
            height: 22px;
            border-radius: 3px;
            overflow: hidden;
            border: 1px solid #2a3f5a;
        }
        .progress-bar-fill {
            height: 100%;
            background: #67c1f5;
            width: 0%;
            transition: width 0.3s ease-out;
            text-align: center;
            line-height: 22px;
            color: #fff;
            font-size: 12px;
        }
        .progress-info, .status-output-message {
            color: #a8b2ba;
            margin: 8px 0;
            font-size: 13px;
        }
        .status-output-message.error {
            color: #ff6b6b;
            font-weight: bold;
        }
        .status-output-message.success {
            color: #799905;
            font-weight: bold;
        }
        .copy-feedback-message {
            display: block;
            font-size: 12px;
            color: #67c1f5;
            margin-top: 5px;
            min-height: 15px;
        }
        .initial-info {
            color: #a8b2ba;
            margin-bottom: 15px;
            font-size: 14px;
        }
    `;
    GM_addStyle(cssStyles.replace(/\/\*[\s\S]*?\*\/|\/\/.*/g, ''));


    function createUI() {
        const container = $(`
            <div id="steamIgnoredCleanerUI">
                <div class="cleaner-header">
                    <h2>Steam Очиститель Списка "Не интересно"</h2>
                </div>
                <div class="cleaner-main-layout">
                    <div class="cleaner-controls">
                        <div class="initial-info">
                            Этот скрипт поможет вам удалить <b>ВСЕ</b> игры из вашего списка "Не интересно" в Steam.
                            Процесс происходит постепенно, чтобы избежать блокировок со стороны Steam.
                        </div>
                        <button id="cleanerMainActionButton" class="steam-cleaner-button">Начать очистку</button>
                        <div class="progress-section">
                            <div class="progress-bar-container">
                                <div id="cleanerProgressBarFill" class="progress-bar-fill">0%</div>
                            </div>
                            <div id="cleanerProgressText" class="progress-info">Ожидание начала...</div>
                            <div id="cleanerEtaText" class="progress-info">ETA: N/A</div>
                        </div>
                        <div id="cleanerStatusMessage" class="status-output-message"></div>
                    </div>
                    <div class="cleaner-side-panel">
                        <button id="cleanerGetRemovedButton" class="steam-cleaner-button secondary" disabled>
                            Копировать список удаленных
                        </button>
                        <span id="cleanerCopyFeedback" class="copy-feedback-message"></span>
                    </div>
                </div>
            </div>
        `).insertAfter('.pageheader');

        state.uiContainer = container;
        state.mainActionButton = $('#cleanerMainActionButton');
        state.getRemovedButton = $('#cleanerGetRemovedButton');
        state.progressBarFill = $('#cleanerProgressBarFill');
        state.progressTextElement = $('#cleanerProgressText');
        state.etaTextElement = $('#cleanerEtaText');
        state.statusMessageElement = $('#cleanerStatusMessage');
        state.copyFeedbackElement = $('#cleanerCopyFeedback');

        state.mainActionButton.click(handleMainAction);
        state.getRemovedButton.click(copyRemovedListToClipboard);
    }

    function updateStatus(message, type = 'info') {
        state.statusMessageElement.text(message)
            .removeClass('error success')
            .addClass(type === 'error' ? 'error' : (type === 'success' ? 'success' : ''));
        console.log((type === 'error' ? 'X ' : (type === 'success' ? 'V ' : 'i ')) + message);
    }

    function updateProgressDisplay() {
        if (state.totalToRemove === 0 && !state.isCleaning) {
            state.progressBarFill.css('width', '0%').text('0%');
            state.progressTextElement.text('Ожидание начала...');
            state.etaTextElement.text('ETA: N/A');
            return;
        }
         if (state.totalToRemove === 0 && state.isCleaning) {
            state.progressBarFill.css('width', '0%').text('0%');
            state.progressTextElement.text('Нет игр для удаления.');
            state.etaTextElement.text('ETA: N/A');
            return;
        }


        const processedCount = state.currentIndex;
        const percent = state.totalToRemove > 0 ? (processedCount / state.totalToRemove) * 100 : 0;
        state.progressBarFill.css('width', `${percent.toFixed(1)}%`).text(`${percent.toFixed(0)}%`);

        if (state.isCleaning && !state.isPaused && processedCount < state.totalToRemove) {
            state.progressTextElement.text(`Обработано: ${processedCount} из ${state.totalToRemove}`);
            const etaSeconds = (state.totalToRemove - processedCount) * (state.removeInterval / 1000);
            state.etaTextElement.text(`ETA: ${formatTime(etaSeconds)}`);
        } else if (processedCount === state.totalToRemove && state.totalToRemove > 0) {
             state.progressTextElement.text(`Завершено: ${processedCount} из ${state.totalToRemove}`);
             state.etaTextElement.text('Готово!');
        } else if (state.isPaused) {
            state.progressTextElement.text(`Пауза. Обработано: ${processedCount} из ${state.totalToRemove}`);
             const etaSecondsPaused = (state.totalToRemove - processedCount) * (state.removeInterval / 1000);
            state.etaTextElement.text(`ETA (на паузе): ${formatTime(etaSecondsPaused)}`);
        }
    }

    function formatTime(totalSeconds) {
        if (isNaN(totalSeconds) || totalSeconds < 0) return 'N/A';
        const hours = Math.floor(totalSeconds / 3600);
        const minutes = Math.floor((totalSeconds % 3600) / 60);
        const seconds = Math.floor(totalSeconds % 60);
        let timeString = '';
        if (hours > 0) timeString += `${hours `;
        if (minutes > 0 || hours > 0) timeString += `${minutes `;
        timeString += `${seconds}с`;
        return timeString.trim() || '0с';
    }

    async function fetchIgnoredApps() {
        return new Promise((resolve, reject) => {
            GM_xmlhttpRequest({
                method: 'GET',
                url: 'https://store.steampowered.com/dynamicstore/userdata/',
                onload: function(response) {
                    try {
                        const data = JSON.parse(response.responseText);
                        if (data.rgIgnoredApps) {
                            resolve(Object.keys(data.rgIgnoredApps).map(Number));
                        } else {
                            resolve([]);
                        }
                    } catch (e) {
                        console.error("X Ошибка парсинга userdata:", e);
                        reject("Не удалось разобрать данные пользователя.");
                    }
                },
                onerror: function(err) {
                    console.error("X Ошибка загрузки userdata:", err);
                    reject("Ошибка сети при получении списка игнорируемых игр.");
                }
            });
        });
    }

    function removeNextApp() {
        if (state.isPaused || !state.isCleaning) {
            if (state.isPaused) updateStatus('Процесс на паузе.', 'info');
            return;
        }

        if (state.currentIndex >= state.totalToRemove) {
            updateStatus('* Очистка завершена! Все игры из списка обработаны.', 'success');
            state.mainActionButton.text('Начать очистку').prop('disabled', false);
            state.getRemovedButton.prop('disabled', state.removedInSessionAppIds.length === 0);
            state.isCleaning = false;
            updateProgressDisplay();
            return;
        }

        const appId = state.allIgnoredApps[state.currentIndex];
        updateStatus(`Удаление appID: ${appId} (${state.currentIndex + 1} из ${state.totalToRemove})...`);
        updateProgressDisplay();

        $J.post('https://store.steampowered.com/recommended/ignorerecommendation/', {
            sessionid: state.sessionID,
            appid: appId,
            snr: '1_account_notinterested_',
            remove: 1
        })
        .done(function(response) {
            state.removedInSessionAppIds.push(appId);
            state.getRemovedButton.prop('disabled', false);

            $J('#ignored_app_' + appId).fadeOut(function() { $(this).remove(); });
            if (typeof GDynamicStore !== 'undefined' && GDynamicStore.InvalidateCache) {
                GDynamicStore.InvalidateCache();
            }

            state.currentIndex++;
            state.currentAppRetries = 0;
            setTimeout(removeNextApp, state.removeInterval);
        })
        .fail(function(jqXHR, textStatus, errorThrown) {
            if (jqXHR.status === 429) {
                updateStatus(`! Ошибка 429 (Too Many Requests) для appID: ${appId}. Ожидание ${formatTime(RATE_LIMIT_WAIT_MS / 1000)}...`, 'error');
                setTimeout(removeNextApp, RATE_LIMIT_WAIT_MS);
            } else {
                state.currentAppRetries++;
                if (state.currentAppRetries < MAX_APP_RETRIES) {
                    const retryDelay = state.removeInterval * (state.currentAppRetries + 1);
                    updateStatus(`X Ошибка удаления ${appId} (попытка ${state.currentAppRetries}/${MAX_APP_RETRIES}): ${jqXHR.statusText || errorThrown}. Повтор через ${formatTime(retryDelay/1000)}.`, 'error');
                    setTimeout(removeNextApp, retryDelay);
                } else {
                    updateStatus(`X Пропуск appID: ${appId} после ${MAX_APP_RETRIES} неудачных попыток. Ошибка: ${jqXHR.statusText || errorThrown}`, 'error');
                    state.currentIndex++;
                    state.currentAppRetries = 0;
                    setTimeout(removeNextApp, state.removeInterval);
                }
            }
        });
    }

    async function handleMainAction() {
        if (state.isCleaning && !state.isPaused) {
            state.isPaused = true;
            state.mainActionButton.text('Продолжить очистку');
            updateStatus('Очистка приостановлена.', 'info');
            updateProgressDisplay();
        } else if (state.isCleaning && state.isPaused) {
            state.isPaused = false;
            state.mainActionButton.text('Пауза');
            updateStatus('Возобновление очистки...', 'info');
            removeNextApp();
        } else {
            state.mainActionButton.prop('disabled', true).text('Загрузка списка...');
            updateStatus('Получение списка игнорируемых игр...', 'info');
            state.isCleaning = true;
            state.isPaused = false;

            try {
                state.allIgnoredApps = await fetchIgnoredApps();
                state.totalToRemove = state.allIgnoredApps.length;
                state.currentIndex = 0;
                state.removedInSessionAppIds = [];
                state.currentAppRetries = 0;

                if (state.totalToRemove === 0) {
                    updateStatus('V В вашем списке "Не интересно" нет игр для удаления.', 'success');
                    state.mainActionButton.prop('disabled', false).text('Начать очистку');
                    state.isCleaning = false;
                    updateProgressDisplay();
                    return;
                }

                updateStatus(`Найдено ${state.totalToRemove} игр. Начинаем очистку...`, 'info');
                state.mainActionButton.prop('disabled', false).text('Пауза');
                state.getRemovedButton.prop('disabled', true);
                state.copyFeedbackElement.text('');
                updateProgressDisplay();
                removeNextApp();

            } catch (errorMsg) {
                updateStatus(`X Ошибка: ${errorMsg}`, 'error');
                state.mainActionButton.prop('disabled', false).text('Начать очистку');
                state.isCleaning = false;
            }
        }
    }

    function copyRemovedListToClipboard() {
        if (state.removedInSessionAppIds.length === 0) {
            state.copyFeedbackElement.text('Список удаленных пуст.');
            setTimeout(() => state.copyFeedbackElement.text(''), 3000);
            return;
        }

        const listString = state.removedInSessionAppIds.join('\n');
        navigator.clipboard.writeText(listString).then(() => {
            state.copyFeedbackElement.text(`Скопировано ${state.removedInSessionAppIds.length} AppID!`);
            setTimeout(() => state.copyFeedbackElement.text(''), 3000);
        }).catch(err => {
            state.copyFeedbackElement.text('X Ошибка копирования.');
            console.error('X Ошибка копирования в буфер обмена:', err);
            setTimeout(() => state.copyFeedbackElement.text(''), 3000);
        });
    }

    $(function() {
        if (typeof g_sessionID === 'undefined' || g_sessionID === null) {
            const pageContent = $('#account_notinterested_area .pagecontent');
            if (pageContent.length) {
                 pageContent.first().prepend('<div style="color: red; font-weight: bold; padding: 10px; background: #330000; border: 1px solid red; margin-bottom:15px;">Steam Session ID не найден. Убедитесь, что вы авторизованы в Steam. Скрипт не будет работать.</div>');
            } else {
                alert('Steam Session ID не найден. Убедитесь, что вы авторизованы в Steam. Скрипт не будет работать.');
            }
            console.error("X Steam Ignored Apps Cleaner: g_sessionID is not available.");
            return;
        }
        state.sessionID = g_sessionID;

        if (typeof $J === 'undefined') {
             window.$J = $;
             console.warn("i Steam Ignored Apps Cleaner: $J is not defined by Steam, using Tampermonkey's jQuery.");
        }

        createUI();
        updateStatus('Скрипт готов к работе. Нажмите "Начать очистку".', 'info');
        updateProgressDisplay();
    });

})();

 


Чем больше игр скрыто — тем дольше будет удалять. Как видно с моего скрина, для удаления моих 52916 скрытых понадобится ждать 51 час. Можно поставить на удаление и держать вкладку открытой пару часов. Затем продолжить в другой день. 

hUKjDyg.png

Спасибо,а то ручками очень долго)

Поделиться сообщением


Ссылка на сообщение
12 минут назад, 0wn3df1x сказал:
  1. . Как видно с моего скрина, для удаления моих 52916 скрытых понадобится ждать 51 час.

     

Это у тебя столько сткрытых игр было?!:ohmy:  Это где ты столько хентая умудрился накопать?  В стиме столько нету вроде бы.

  • Хаха (+1) 2

Поделиться сообщением


Ссылка на сообщение
10 минут назад, piton4 сказал:

Это у тебя столько сткрытых игр было?!:ohmy:  Это где ты столько хентая умудрился накопать?  В стиме столько нету вроде бы.

Они у меня и сейчас есть. Я их не удалял, просто скрипт сделал по запросу.
Я использую скрытие для формирования более точного списка рекомендаций, а также для отслеживания новых будущих игр.

  • +1 1

Поделиться сообщением


Ссылка на сообщение
6 минут назад, 0wn3df1x сказал:

Они у меня и сейчас есть. Я их не удалял

Понимаю :wink:

Поделиться сообщением


Ссылка на сообщение

Заприметил тут в одной новости анонс шикарной пошаговой PSX-Style RPG Never’s End.

header.jpg?t=1748985272

Выглядят как по мне просто пушка-гонка. Русский из коробки. Занесу в хотелки.

  • Спасибо (+1) 2

Поделиться сообщением


Ссылка на сообщение
10 минут назад, lordik555 сказал:

Заприметил тут в одной новости анонс шикарной пошаговой PSX-Style RPG Never’s End.

блин побежал сразу в стим пробовать, думал демка есть, а ее к сожалению нет, а так да вроде годная вещь, тоже добавил.

Изменено пользователем \miroslav\
  • +1 1

Поделиться сообщением


Ссылка на сообщение
1 минуту назад, \miroslav\ сказал:

блин побежал сразу в стим пробовать, думал демка есть, а ее к сожалению нет, атак да вроде годная вещь, тоже добавил.

Мне вот стилистически очень такие нравятся, приглушенные пастельные тона — кайф. Напомнило кстати игру Eternal Eyes с PS1. Проходил последнюю в том году.

Поделиться сообщением


Ссылка на сообщение
1 минуту назад, lordik555 сказал:

Мне вот стилистически очень такие нравятся

А я с фф тактикс полюбил такой жанр игр, серия игр Дисгайа тоже нравится. 

Поделиться сообщением


Ссылка на сообщение
7 минут назад, \miroslav\ сказал:

А я с фф тактикс полюбил такой жанр игр, серия игр Дисгайа тоже нравится. 

https://store.steampowered.com/app/699170/Fell_Seal_Arbiters_Mark/

Вот взял,очень советовали. Говорили “настоящее” продолжение  ФФТ на выходные поиграю

 

Изменено пользователем edifiei
  • Лайк (+1) 1

Поделиться сообщением


Ссылка на сообщение
13 минут назад, edifiei сказал:

https://store.steampowered.com/app/699170/Fell_Seal_Arbiters_Mark/

Вот взял,очень советовали. Говорили “настоящее” продолжение  ФФТ на выходные поиграю

А вот эта игрушка (установочный пакет) у меня уже давно ждет своего часа только вот руки никак до нее не доходят.)

Поделиться сообщением


Ссылка на сообщение

Новелла чисто на часик с небольшим — Чел я просто хочу домой.

header.jpg?t=1745482318

Из интересного: Paint-стилистика, вайбовая музыка (конечно не уровня Anger Foot, но на уровне), 13 концовок, которые постепенно раскрывают всю картину происходящего.

Разработчики наши ребята.

Изменено пользователем lordik555
  • +1 1

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Похожие публикации

    • Автор: 0wn3df1x

      В этом году мы уже наблюдали, как на российский рынок Steam вернулись игры от Relic Entertainment (после ухода от Sega) и Humble Games. Вернулся No Rest for the Wicked от Moon Studios, наконец избавившейся от издателя. Однако, как оказалось, это далеко не всё.
      В этом году мы уже наблюдали, как на российский рынок Steam вернулись игры от Relic Entertainment (после ухода от Sega) и Humble Games. Вернулся No Rest for the Wicked от Moon Studios, наконец избавившейся от издателя. Однако, как оказалось, это далеко не всё.
      Разбирая старые архивы, я наткнулся на список игр, доступных в России, датированный октябрем 2024 года. Решил сравнить его с актуальной базой на июнь 2025-го и обнаружил несколько любопытных, хоть и частичных, возвращений.
      Тихое и очень выборочное возвращение Ubisoft
      Игры французского гиганта исчезли из продажи в начале марта 2022 года, но стали вновь доступны для россиян в мае 2025-го.
      Cold Fear (исчезла 7 марта 2022, вернулась 10 мая 2025) I Am Alive (исчезла 9 марта 2022, вернулась 22 мая 2025) Grow Home (исчезла 9 марта 2022, вернулась 22 мая 2025) Grow Up (исчезла 9 марта 2022, вернулась 22 мая 2025)
      Важно отметить: это не полноценное возвращение. Основной каталог Ubisoft, включая серии Assassin’s Creed, Far Cry и другие флагманы, по-прежнему недоступен для покупки в регионе. Появление лишь нескольких старых проектов может говорить о пересмотре юридических формальностей по старым контрактам, а не об изменении общей политики компании.
      Avalanche Studios: тоже не все сразу
      Похожая история произошла и с играми, изданными шведской компанией Avalanche Studios. Их проекты также пропали в марте 2022 года, а этой весной пара из них снова стала доступна для покупки.
      Generation Zero (исчезла 11 марта 2022, вернулась 29 апреля 2025) theHunter: Call of the Wild (исчезла 11 марта 2022, вернулась 2 мая 2025)
      Здесь также видна избирательность. Например, более свежие игры издателя, такие как Call of the Wild: The Angler и Ravenbound, в продаже так и не появились. Это также указывает на то, что издатель не вернулся на рынок полностью.
      А вы замечали возвращение каких-либо других игр в Steam?
    • Автор: SerGEAnt

      Игру можно забрать с русских аккаунтов, а русификатор вместе с озвучкой берем из нашего архива.
      В Steam стартовала раздача не нуждающегося в представлении шутера с элементами RPG Borderlands 2.
      Игру можно забрать с русских аккаунтов, а русификатор вместе с озвучкой берем из нашего архива.


  • Продвигаемые темы

  • Последние сообщения

    • И от кого перевод 1-2 глав лучше?
    • А кто уже проходил игру, можете подсказать, почему в Пустеше я не могу активировать зоны сохранения? 
    • Не знаю, у меня с планшета и с компа всё погружается вроде. @romka Спасибо кстати, что когда-то посоветовал postimage, наверное лучшая штука по вставке изображений.      
    • Почему-то с мобилки вижу твои скрины, а в стационарке не прогружаются.
    • Возможно история и персонажи здесь послабее, но всё остальное наоборот сильнее. Оптимизация, картинка(да, я считаю, здесь лучшая картинка из всех игр ремеди, и то что они сделали трасс. пути в AW2 всё равно не вызывает таких ощущений как в Контрол), дополнительные задания, физика, боевая система, прокачка, элементы метроидвании, сеттинг. Всё это делает Контрол лучшей игрой Ремеди. Ну "сеттинг" это уже вкусовщина конечно, но в целом вот так вот.   Согласен. Записки все читать, всё слушать, во всё вникать... В Контрол это очень круто и главное интересно. У меня буквально считанные игры, в которых мне действительно интересно было читать записки, да и вообще вникать в лор.
    • Ага. И вполне рабочий — в медийке засветилась, пик онлайна обновился. Не знаю какие впечатления останутся от проекта по его завершению, но на данный момент я заинтересовался второй частью. Если сама по себе игра уже не приносит дохода, почему бы не “вложить” её в рекламу? @Mertisadon  в описании продолжения говорится, что первую игру делал один человек, а вторую кто-то уже помогал. Так что есть надежда на углубление сюжета и расширение лора. 
    • @deseven Ничего. Дождемся!
    • Я играл в контрол на выходе и ощущения  были примерно те же, красивая, но в плане сюжета не ок. А в этом году прикупил ultimate edition на пс5 за копейки и решил еще раз попробовать. И во второй раз я как-то внимательнее отнесся к сюжету и понял правила, по которым живет мир игры, и как там все работает. И  прошел игру с дополнениями на одном дыхании. Это просто потрясающе/положительные эмоции/отвал жопы, простите. Лабиринт пепельницы — вау. И сейчас прохожу  Алана второго, тоже на пс5 про, тоже дисковая версия со всеми допами. А история схожая, я на выходе пытался играть в него на пк, но не зашло вообще. А после осмысленного прохождения контрола — второй Алан ложится на его базу, и воспринимается совершенно по-другому. Потряснейшая история, а дополнения найт спрингс — это просто феерия, вернее ЭПФ, ведь аббревиатуры — это круто (с) П.С. Проходил все игры  ремеди, кроме квантум брейка, ребята в плане сюжета и подачи — прогрессируют. Макс Пейны — это классика, но возраст ощущается сильно, и я не про графику, а про сюжет и его подачу. А первого Алана — считаю игрой на 3+ из 5 П.П.С. Наверное, Контрол  и Алан Вейк 2 — воспринимаются  не сразу, потому что приходится думать. Абсолютное большинство привыкло к разжевыванию и простому восприятию сюжета, а особенность этих игр в том, что тут наваливают базы, которую надо осмыслить, чтобы остальной сюжет был понятен, а это сложно и не хочется, хочется после работы мозг расслабить. Наверное, в этом и причина того, что и меня проняло со второго раза.
    • да 99% что это именно маркетинговый ход для рекламы их второй части. https://store.steampowered.com/app/3399900/HellSlave_II_Judgment_of_the_Archon/
  • Изменения статусов

    • Дмитрий Соснов  »  Tirniel

      Привет! ты разбираешься в компьютерном железе, сможешь помочь с советом по апгрейду старого компа?
      · 1 ответ
    • SHAMAH

      Куда вход на сайт убрали и ЗАЧЕМ? Хотел файл скачать, там только медленная загрузка и “зарегистрируйтесь”. Все. Пришлось вручную страницу входа прописывать.
      · 0 ответов
    • Nosferatu  »  behar

      Добрый вечер.
      Подскажите пожалуйста, у вас не осталось случайно исходников для фикса на широкоформатные мониторы для игры Vampire The Masquerade Redemption?
      Если да, то не могли бы вы ими поделиться, а если нет, то прошу прощенья что побеспокоил.
      Заранее спасибо.
      · 0 ответов
    • AlcoKolyic  »  makc_ar

      Здраствуйте! Извините, а можно попросить ссылку на место где можно взять перевод (патч или образ игры с переводом) El Shaddai: Ascension of the Metatron для ps3, пожалуйста? А то в теме к этой игре у меня не получилось найти работающие ссылки… Первая ведет в группу в которой удалены большинство постов, а пост с этой игрой ведет на сайт https://psnext.ru который сейчас не имеет отношения к видеоиграм. 
      · 0 ответов
    • oleg72  »  Boor

      https://www.skidrowcodex.net/fate-reawakened-goldberg/
      · 0 ответов
  • Лучшие авторы


Zone of Games © 2003–2025 | Реклама на сайте.

×