Форум Black Russia Модератор UI v3

Улучшенный интерфейс модератора с выбором раздела и причины отказа

// ==UserScript==
// @name         Форум Black Russia Модератор UI v3
// @namespace    https://forum.blackrussia.online/
// @version      3.0
// @description  Улучшенный интерфейс модератора с выбором раздела и причины отказа
// @author       E.Sailauov
// @match        https://forum.blackrussia.online/threads/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    const PHOTO_URL = 'https://i.postimg.cc/2SXx0xNt/RLwzo.png';

    const QUOTES = {
        BIO: "Помни: хорошая биография — ключ к интересной игре в Black Russia.",
        SITUATION: "RP ситуация оживляет мир — играй честно и с умом!",
        ORG: "Организация должна вдохновлять игроков на роль и командную игру."
    };

    const DENY_REASONS = {
        BIO: ['Нарушение правил','Не дополнил','Плагиат','Мало информации','Не по форме','Не от первого лица','NRP никнейм','Заголовок не по форме','Возраст не совпадает с датой','Указана не полная дата','Возраст младше 18','Грамматические ошибки','Не все заполнил','Нейросеть','Изображение себя героя','Вне игровая локация (место рождения)','Вне игровая локация (место проживания)','Уже на рассмотрении','Оффтоп','От третьего лица'],
        SITUATION: ['Нарушение правил','Не дополнил','Мало информации','Не по форме','Сверхъестественные события','Копирование чужой ситуации','OOC-информация в скриншотах'],
        ORG: ['Нарушение правил','Не дополнил','Мало информации','Не по форме','Копирование чужой организации','Государственная форма организации','Отсутствие визуальной особенности','Лидер без RP биографии','Название не отражает тематику','OOC-информация на скриншотах']
    };

    const RESPONSES = {
        ACCEPT: (user, section) => `[CENTER][img]${PHOTO_URL}[/img][/CENTER]\n[COLOR=rgb(0,255,127)][FONT=times new roman][SIZE=4][I][CENTER]Здравствуйте, уважаемый ${user}![/CENTER][/I][/SIZE][/FONT][/COLOR]\n[I][CENTER][FONT=times new roman][SIZE=4]Ваша RP работа (${section}) одобрена![/SIZE][/FONT][/CENTER][/I]\n[CENTER][FONT=times new roman][SIZE=3][I]${QUOTES[section]}[/I][/SIZE][/FONT][/CENTER]`,
        DENY: (user, section, reason) => `[CENTER][img]${PHOTO_URL}[/img][/CENTER]\n[COLOR=rgb(255,0,0)][FONT=times new roman][SIZE=4][I][CENTER]Здравствуйте, уважаемый ${user}![/CENTER][/I][/SIZE][/FONT][/COLOR]\n[I][CENTER][FONT=times new roman][SIZE=4]Ваша RP работа (${section}) отклонена по причине: ${reason}[/SIZE][/FONT][/CENTER][/I]\n[CENTER][FONT=times new roman][SIZE=3][I]Примечание: убедитесь, что исправили ошибки и соблюдаете правила раздела.[/I][/SIZE][/FONT][/CENTER]\n[CENTER][FONT=times new roman][SIZE=3][I]${QUOTES[section]}[/I][/SIZE][/FONT][/CENTER]`,
        REVIEW: (user, section) => `[CENTER][img]${PHOTO_URL}[/img][/CENTER]\n[COLOR=rgb(255,165,0)][FONT=times new roman][SIZE=4][I][CENTER]Здравствуйте, уважаемый ${user}![/CENTER][/I][/SIZE][/FONT][/COLOR]\n[I][CENTER][FONT=times new roman][SIZE=4]Ваша RP работа (${section}) на рассмотрении.[/SIZE][/FONT][/CENTER][/I]\n[CENTER][FONT=times new roman][SIZE=3][I]${QUOTES[section]}[/I][/SIZE][/FONT][/CENTER]`
    };

    function sendResponse(user, section, type, reason='') {
        let content = '';
        switch(type){
            case 'ACCEPT': content = RESPONSES.ACCEPT(user, section); break;
            case 'DENY': content = RESPONSES.DENY(user, section, reason); break;
            case 'REVIEW': content = RESPONSES.REVIEW(user, section); break;
        }
        console.log(content); // здесь можно вставлять в редактор форума
    }

    function createUI() {
        const container = document.createElement('div');
        container.style.padding = '10px';
        container.style.background = 'linear-gradient(to right, #2c3e50, #4ca1af)';
        container.style.borderRadius = '10px';
        container.style.marginBottom = '15px';
        container.style.color = '#fff';
        container.style.fontFamily = 'Arial, sans-serif';

        const userInput = document.createElement('input');
        userInput.placeholder = 'Введите ник игрока';
        userInput.style.marginRight = '10px';
        userInput.style.padding = '5px';
        container.appendChild(userInput);

        const sectionSelect = document.createElement('select');
        ['BIO','SITUATION','ORG'].forEach(sec => {
            const opt = document.createElement('option');
            opt.value = sec;
            opt.textContent = sec;
            sectionSelect.appendChild(opt);
        });
        sectionSelect.style.marginRight = '10px';
        container.appendChild(sectionSelect);

        const typeSelect = document.createElement('select');
        ['REVIEW','ACCEPT','DENY','CLOSE'].forEach(type=>{
            const opt = document.createElement('option');
            opt.value = type;
            opt.textContent = type;
            typeSelect.appendChild(opt);
        });
        typeSelect.style.marginRight = '10px';
        container.appendChild(typeSelect);

        const reasonSelect = document.createElement('select');
        reasonSelect.style.marginRight = '10px';
        reasonSelect.style.display = 'none';
        container.appendChild(reasonSelect);

        typeSelect.addEventListener('change', ()=>{
            if(typeSelect.value === 'DENY'){
                reasonSelect.innerHTML = '';
                const sec = sectionSelect.value;
                DENY_REASONS[sec].forEach(r=>{
                    const opt = document.createElement('option');
                    opt.value = r;
                    opt.textContent = r;
                    reasonSelect.appendChild(opt);
                });
                reasonSelect.style.display = 'inline-block';
            } else {
                reasonSelect.style.display = 'none';
            }
        });

        const sendBtn = document.createElement('button');
        sendBtn.textContent = 'Отправить';
        sendBtn.style.backgroundColor = '#3498db';
        sendBtn.style.color = '#fff';
        sendBtn.style.border = 'none';
        sendBtn.style.padding = '5px 10px';
        sendBtn.style.borderRadius = '5px';
        sendBtn.onclick = ()=>{
            sendResponse(userInput.value, sectionSelect.value, typeSelect.value, reasonSelect.value);
        };
        container.appendChild(sendBtn);

        document.body.insertBefore(container, document.body.firstChild);
    }

    createUI();

})();