Жалобы на Администрацию | BELGOROD 🗽

для Руководства сервера BELGOROD 🗽

// ==UserScript==
// @name         Жалобы на Администрацию | BELGOROD 🗽
// @namespace    https://forum.blackrussia.online 
// @version      0.4
// @description  для Руководства сервера BELGOROD 🗽
// @author       Medrodore
// @match        http://forum.blackrussia.online/index.php?threads/*
// @include      http://forum.blackrussia.online/index.php?threads/
// @icon       https://klike.net/uploads/posts/2021-12/1638345168_12.jpg
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';
    const UNACCEPT_PREFIX =4; // Префикс "Отказано"
    const ACCEPT_PREFIX = 8; // Префикс "Одобрено"
    const RESHENO_PREFIX = 6; // Префикс "Решено"
    const PIN_PREFIX = 2; // Префикс "На рассмотрении"
    const GA_PREFIX = 12; // Префикс "Главному Администратору"
    const COMMAND_PREFIX = 10; // Префикс "Команде Проекта"
    const WATCHED_PREFIX = 9; // Префикс "Рассмотрено"
    const CLOSE_PREFIX = 7 // Префикс "Закрыто"
    const SPECIAL_PREFIX = 11; // Префикс "Специальному Администратору"
    const buttons = [
        {
            title: '---------------Жалобы на Администрацию---------------'
        },
        {
            title: 'Приветствие',
            content:
            "[CENTER] [FONT=Courier New] Доброго времени суток, уважаемый игрок. [/FONT] [/CENTER] <br><br>"+
            "[CENTER] [FONT=Courier New] текст [/FONT] [/CENTER]",
        },
        {
            title: 'На рассмотрение',
            content:
            "[CENTER] [FONT=Courier New] [FONT=Courier New] Доброго времени суток, уважаемый игрок. <br><br>"+
            "Запросил доказательства у администратора. <br>"+
            "Просьба не создавать копии данной темы. <br>"+
            '[COLOR=orange] На рассмотрении. [/COLOR] [/FONT] [/CENTER]',
            prefix: PIN_PREFIX,
            status: True,
        },
        {
            title: 'Не по форме',
            content:
            "[CENTER] [FONT=Courier New] Доброго времени суток, уважаемый игрок.<br><br>"+
            "Ваша жалоба составлена не по форме, ознакомьтесь с правилами подачи жалоб: [URL=https://forum.blackrussia.online/threads/%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0-%D0%BF%D0%BE%D0%B4%D0%B0%D1%87%D0%B8-%D0%B6%D0%B0%D0%BB%D0%BE%D0%B1-%D0%BD%D0%B0-%D0%B0%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%86%D0%B8%D1%8E.3429349/]*жмяк*[/URL] <br>"+
            '[COLOR=RED]Отказано[/COLOR], Закрыто. [/FONT] [/CENTER] ',
            prefix: CLOSE_PREFIX,
            status: false,
        },
        {
            title: 'Не является адм',
            content:
            "[CENTER] [FONT=Courier New] Доброго времени суток, уважаемый игрок. <br>"+
            "Данный игрок не является Администратором. <br>"+
            '[COLOR=RED] Закрыто. [/COLOR] [/FONT] [/CENTER]',
            prefix: CLOSE_PREFIX,
            status: false,
        },
        {
            title: 'Беседа с адм',
            content:
            "[CENTER] [FONT=Courier New] Доброго времени суток, уважаемый игрок. <br>"+
            "С Администратором будет проведена беседа, просим прощения за доставленные неудобства. <br>"+
            '[COLOR=Green] Одобрено [/COLOR] [/FONT] [/CENTER]',
            prefix: ACCEPT_PREFIX,
            status: false,
        },
        {
            title: 'передать Кемрану',
            content:
            "[CENTER] [FONT=Courier New] Доброго времени суток, уважаемый игрок. <br>"+
            "Ваша жалоба передана Главному Администратору [URL=https://forum.blackrussia.online/members/kemran_ahmedovich%F0%9F%91%91.190244/'] @Kemran_Ahmedovich [/URL] <br>"+
            '[COLOR=White] Ожидайте ответа. [/COLOR] [/FONT] [/CENTER] ',
            prefix: GA_PREFIX,
            status: true,
        },
        {
            title: 'Передать ЗГА',
            content:
            "[CENTER] [FONT=Courier New] Доброго времени суток, уважаемый игрок. <br>"+
            "Ваша жалоба передана Заместителю Главного Администратора. <br>"+
            '[COLOR=White] Ожидайте ответа [/COLOR] [/FONT] [/CENTER] ',
            prefix: GA_PREFIX,
            status: true,
        },
        {
            title: 'Наказание верное',
            content:
            "[CENTER] [FONT=Courier New] Доброго времени суток, уважаемый игрок. <br>"+
            "Проверив доказательства администратора, было принято решение, что наказание выдано верно. <br>"+
            '[COLOR=RED] Закрыто [/COLOR] [/FONT] [/CENTER]',
            prefix: UNACCEPT_PREFIX,
            status: false,
        },
        {
            title: '---------------Перенаправление---------------'
        },
        {
         title: 'обжалование',
         content:
         "[CENTER] [FONT=Courier New] Доброго времени суток, уважаемый игрок. <br>"+
            "Если вы согласны с наказанием, напишите в раздел Обжалований [URL=https://forum.blackrussia.online/threads/%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0-%D0%BF%D0%BE%D0%B4%D0%B0%D1%87%D0%B8-%D0%B7%D0%B0%D1%8F%D0%B2%D0%BA%D0%B8-%D0%BD%D0%B0-%D0%BE%D0%B1%D0%B6%D0%B0%D0%BB%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BD%D0%B0%D0%BA%D0%B0%D0%B7%D0%B0%D0%BD%D0%B8%D1%8F.3429398/'] *жмяк*[/URL] <br>"+
            '[COLOR=RED] Закрыто [/COLOR] [/FONT] [/CENTER]',
            prefix: CLOSE_PREFIX,
            status: false,
        },
        {
            title: 'на игроков',
            content:
            "[CENTER] [FONT=Courier New] Доброго времени суток, уважаемый игрок. <br>"+
            "Обратитесь в раздел Жалоб на игроков. <br>"+
            '[COLOR=RED] Закрыто [/COLOR] [/FONT] [/CENTER]',
            prefix: CLOSE_PREFIX,
            status: false,
        }
     ];

 $(document).ready(() => {
     // Загрузка скрипта для обработки шаблонов
     addButton('Меню', 'selectAnswer');
     addButton('Одобрить', 'accepted') ;
     addButton('Отказать', 'unaccept') ;
     addButton('На рассмотрение', 'pin') ;
     addButton('Рассмотрено', 'watched') ;
     addButton('Закрыть', 'closed') ;
     addButton('КП', 'teamProject') ;
     addButton('Спецу', 'specialAdmin') ;
     addButton('ГА', 'mainAdmin') ;


     // Поиск информации о теме
     const threadData = getThreadData() ;
     $('button#pin'). cklick(() =>editThreadData(PIN_PREFIX, true)) ;
     $('button#accepted'). cklick(() =>editThreadData(ACCEPT_PREFIX, false)) ;
     $('button#teamProject'). cklick(() =>editThreadData(COMMAND_PREFIX, true)) ;
     $('button#watched'). cklick (() =>editThreadData(WACHED_PREFIX, false)) ;
     $('button#unaccept'). cklick(() =>editThreadData(UNACCEPT_PREFIX, false)) ;
     $('button#mainAdmin'). cklick(() =>editThreadData (GA_PREFIX, true)) ;

     $('button#specialAdmin'). cklick(() =>editThreadData (SPECIAL_PREFIX, true)) ;

     $('button#unaccept'). click(() =>editThreadData (UNACCEPT_PREFIX, false)) ;

     $('button#selectAnswer'). click(() =>{
         XF. alert(buttonsMarkup(buttons), null, 'Выберите ответ:') ;
         buttons.forEach((btn,id)=> {
             if(id>1){
                 $(`button#answers-${id}`). click(() =>pasteContent(ID, threadData, true)) ;
             } else {
                 $(`button#answers-${id} `). click(() =>pasteContent(ID, threadData, false)) ;
             }
         }) ;
     }) ;
 }) ;
    function addButton(name, id) {
       $('.button--icon--reply').before(
           `<button type="button" class="button--primary button rippleButton" id="${id}" style="border-radius:30px; margin-right:7px;">${name}</button>`,
      ) ;
    }

    function buttonsMarkup(button) {
        return `<div class="select_answer" >${buttons
        .map(
            (btn,i)=>
            `<button id="answers-${i} class=" button--primary button`+
            `rippleButton " style=" margin:5px"><span class="button-TEST" >${btn, title}</span></button>`,
            )
            .join('')} </div>`;
    }

  function pasteContent(id, data = {}, send = false) {
        const template = Handlebars.compile(buttons[id].content);
        if ($('.fr-element.fr-view p').text() === '') $('.fr-element.fr-view p').empty();

        $('span.fr-placeholder').empty();
        $('div.fr-element.fr-view p').append(template(data));
        $('a.overlay-titleCloser').trigger('click');

        if(send == true){
            editThreadData(buttons[id].prefix, buttons[id].status);
            $('.button--icon.button--icon--reply.rippleButton').trigger('click');
        }
    }

    function getThreadData() {
        const authorID = $('a.username')[0].attributes['data-user-id'].nodeValue;
        const authorName = $('a.username').html();
        const hours = new Date().getHours();
        return {
            user: {
                id: authorID,
                name: authorName,
                mention: `[USER=${authorID}]${authorName}[/USER]`,
            },
            greeting: () =>
            4 < hours && hours <= 11
            ? 'Доброе утро'
            : 11 < hours && hours <= 15
            ? 'Добрый день'
            : 15 < hours && hours <= 21
            ? 'Добрый вечер'
            : 'Доброй ночи',
        };
    }

    function editThreadData(prefix, pin = false) {
        // Получаем заголовок темы, так как он необходим при запросе
        const threadTitle = $('.p-title-value')[0].lastChild.textContent;

        if(pin == false){
            fetch(`${document.URL}edit`, {
                method: 'POST',
                body: getFormData({
                    prefix_id: prefix,
                    title: threadTitle,
                    _xfToken: XF.config.csrf,
                    _xfRequestUri: document.URL.split(XF.config.url.fullBase)[1],
                    _xfWithData: 1,
                    _xfResponseType: 'json',
                }),
            }).then(() => location.reload());
        }
        if(pin == true){
            fetch(`${document.URL}edit`, {
                method: 'POST',
                body: getFormData({
                    prefix_id: prefix,
                    title: threadTitle,
                    sticky: 1,
                    _xfToken: XF.config.csrf,
                    _xfRequestUri: document.URL.split(XF.config.url.fullBase)[1],
                    _xfWithData: 1,
                    _xfResponseType: 'json',
                }),
            }).then(() => location.reload());
        }
    }

    function getFormData(data) {
        const formData = new FormData();
        Object.entries(data).forEach(i => formData.append(i[0], i[1]));
        return formData;
    }
})();