BR | Optimized Auto-Reply

Оптимизация загрузки страниц и исправление зависаний

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да инсталирате разширение, като например Tampermonkey .

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name         BR | Optimized Auto-Reply
// @namespace    https://forum.blackrussia.online
// @version      5.4.0
// @description  Оптимизация загрузки страниц и исправление зависаний
// @author       Nuserik Detta
// @match        https://forum.blackrussia.online/threads/*
// @match        https://forum.blackrussia.online/categories/*
// @match        https://forum.blackrussia.online/forums/*
// @grant        none
// @run-at       document-start
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    const CONFIG = {
        HOME: 'https://forum.blackrussia.online/categories/%D0%9F%D1%80%D0%B5%D0%B4%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F-%D0%BF%D0%BE-%D1%83%D0%BB%D1%83%D1%87%D1%88%D0%B5%D0%BD%D0%B8%D1%8E.656/',
        WAIT: 35,
        PHRASES: ["Up", "Не поддерживаю"]
    };

    function showUI(txt) {
        let p = document.getElementById('br-ultra-ui');
        if (!p) {
            p = document.createElement('div');
            p.id = 'br-ultra-ui';
            p.style = 'position:fixed;top:0;left:0;right:0;background:rgba(255,0,0,0.9);color:white;padding:10px;z-index:1000000;text-align:center;font-family:sans-serif;font-weight:bold;box-shadow:0 2px 5px rgba(0,0,0,0.5);';
            document.body.appendChild(p);
        }
        p.innerText = txt;
    }

    async function start() {
        // Ждем, пока прогрузится структура страницы, чтобы не мешать браузеру
        if (document.readyState === 'loading') {
            await new Promise(r => document.addEventListener('DOMContentLoaded', r));
        }

        const url = window.location.href;

        // 1. ЛОГИКА В РАЗДЕЛАХ
        if (url.includes('/categories/') || url.includes('/forums/')) {
            showUI("СКАНИРОВАНИЕ...");

            const threads = document.querySelectorAll('.structItem-title a');
            
            if (threads.length === 0) {
                const nodes = document.querySelectorAll('.node-title a');
                if (nodes.length > 0) {
                    showUI("ВХОД В ПОДРАЗДЕЛ...");
                    location.replace(nodes[0].href);
                    return;
                }
            }

            for (let t of threads) {
                if (t.href.includes('/threads/')) {
                    if (!sessionStorage.getItem('done_' + t.href)) {
                        showUI("ПЕРЕХОД...");
                        location.replace(t.href); // replace быстрее href
                        return;
                    }
                }
            }
            
            showUI("ОЖИДАНИЕ ОБНОВЛЕНИЯ...");
            setTimeout(() => { location.replace(CONFIG.HOME); }, 10000);
        }

        // 2. ЛОГИКА В ТЕМЕ
        if (url.includes('/threads/')) {
            let timer = CONFIG.WAIT;
            
            const countdown = setInterval(() => {
                showUI(`ОТПРАВКА: ${timer} сек`);
                if (timer <= 0) {
                    clearInterval(countdown);
                    send();
                }
                timer--;
            }, 1000);

            async function send() {
                const editor = document.querySelector('.fr-element.fr-view');
                const btn = document.querySelector('.button--primary.button--icon--reply') || 
                            document.querySelector('button[type="submit"].button--icon--reply');

                if (editor && btn) {
                    const msg = CONFIG.PHRASES[Math.floor(Math.random() * CONFIG.PHRASES.length)];
                    editor.innerHTML = `<p>${msg}</p>`;
                    showUI("КЛИК...");
                    
                    setTimeout(() => {
                        btn.click();
                        sessionStorage.setItem('done_' + url, '1');
                        // После ответа ждем чуть дольше, чтобы форум успел сохранить пост
                        setTimeout(() => { location.replace(CONFIG.HOME); }, 5000);
                    }, 1000);
                } else {
                    showUI("ЗАКРЫТО ИЛИ ОШИБКА");
                    sessionStorage.setItem('done_' + url, '1');
                    setTimeout(() => { location.replace(CONFIG.HOME); }, 2000);
                }
            }
        }
    }

    // Запускаем через небольшую паузу, чтобы дать браузеру "вдохнуть"
    setTimeout(start, 500);
})();