Ada1oov

Скрипт для модерирования форума BlackRussia

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey, Greasemonkey или Violentmonkey.

Для установки этого скрипта вам необходимо установить расширение, такое как Tampermonkey.

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

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

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

Чтобы установить этот скрипт, вы должны установить расширение — менеджер скриптов.

(у меня уже есть менеджер скриптов, дайте мне установить скрипт!)

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

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

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

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

(у меня уже есть менеджер стилей, дайте мне установить скрипт!)

// ==UserScript==
// @name         Ada1oov
// @namespace    https://forum.blackrussia.online/
// @version      2.0
// @description  Скрипт для модерирования форума BlackRussia
// @author       Adai_Adaioov
// @match        https://forum.blackrussia.online/threads/*
// @include      https://forum.blackrussia.online/threads/
// @grant        none
// @license MIT
// @icon https://postimg.cc/bGVzjKtY
// ==/UserScript==

(function () {
	'use strict';
    const NO_PREFIX = 0; // префикса нет
    const PIN_PREFIX = 2; //  префикс закрепить
	const OTKAZANO_PREFIX = 4; // префикс отказано
    const RESHENO_PREFIX = 6; // префикс решено
    const CLOSE_PREFIX = 7; // префикс закрыто
	const ACCEPT_PREFIX = 8; // префикс одобрено
    const WATCHED_PREFIX = 9; // рассмотрено
	const KP_PREFIX = 10; // команде проекта
    const SA_PREFIX = 11; // префикс спец адм
    const GA_PREFIX = 12; // префикс главному адм
	const TEH_PREFIX = 13; //  техническому специалисту
    const TotleEnd = "[B][CENTER][COLOR=lavender]Приятной игры на [COLOR=black]BLACK[/COLOR] [COLOR=RED]RUSSIA[/COLOR] [COLOR=Maroon]VOLOGDA[/COLOR].";
    const buttons = [
        {
		title: 'Приветствие',
	    dpstyle: 'font-family: Georgia; font-weight: bold; font-style: italic; text-transform: none; font-size: 15px; border-radius: 20px; margin-right: 5px; border: 2px solid; border-color: rgb(255, 69, 0);',
		content:
        "[B][CENTER][COLOR=#CCCCCC][ICODE]{{ greeting }}, уважаемый {{ user.name }} [/ICODE][/COLOR][/CENTER][/B]<br><br>" +
		'[CENTER]Ваш текст[/CENTER]',
	    },
        {
		title: 'ᅠ ᅠ ᅠ ᅠ ᅠ ᅠ                                ᅠ⠀             ⠀ Главному куратору форума    ⠀        ⠀    ⠀      ⠀ᅠ     ᅠ ᅠ     ᅠ ᅠ ᅠ ',
        dpstyle: 'oswald: 3px;     color: #fff; background: #212428; box-shadow: 0 0 2px 0 rgba(0,0,0,0.14),0 2px 2px 0 rgba(0,0,0,0.12),0 1px 3px 0 rgba(0,0,0,0.2); border: 1px solid #BF40BF; width: 96%',
	    },
        {
        title: 'nrp обман',
        content:
        "[B][CENTER][COLOR=#CCCCCC][ICODE]{{ greeting }}, уважаемый {{ user.name }} [/ICODE][/COLOR][/CENTER][/B]<br><br>" +
        "[CENTER]Игрок будет наказан по пункту правил:[/CENTER]<br>" +
        "[CENTER][QUOTE] 2.05. Запрещены любые OOC-обманы и их попытки, а также любые IC-обманы с нарушением Role Play правил и логики | 15–30 дней / PermBan [/QUOTE][/CENTER]<br><br>" +
        "[CENTER]Одобрено.[/CENTER]<br><br>" +
        TotleEnd,
        prefix: ACCEPT_PREFIX,
        status: false,
        },
        {
        title: 'Читы',
        content:
        "[B][CENTER][COLOR=#CCCCCC][ICODE]{{ greeting }}, уважаемый {{ user.name }} [/ICODE][/COLOR][/CENTER][/B]<br><br>" +
        "[CENTER]Игрок будет наказан по пункту правил:[/CENTER]<br>" +
        "[CENTER][QUOTE] 2.22. Запрещено хранить / использовать / распространять стороннее программное обеспечение или иные средства, позволяющие получить преимущество над другими игроками, включая макросы (в том числе с эмуляторов) | Ban 15–30 дней / PermBan [/QUOTE][/CENTER]<br><br>" +
        "[CENTER]Одобрено.[/CENTER]<br><br>" +
        TotleEnd,
       prefix: ACCEPT_PREFIX,
       status: false,
       },
       {
       title: 'Отсутствуют Условия',
       content:
       "[B][CENTER][COLOR=#CCCCCC][ICODE]{{ greeting }}, уважаемый {{ user.name }} [/ICODE][/COLOR][/CENTER][/B]<br><br>" +
       "[CENTER][QUOTE] В доказательствах отсутствуют условия сделки. [/QUOTE][/CENTER]<br><br>" +
       "[CENTER]Отказано.Закрыто.[/CENTER]<br><br>" +
       TotleEnd,
       prefix: OTKAZANO_PREFIX,
       status: false,
       },
       {
       title: 'Нет /time',
       content:
       "[B][CENTER][COLOR=#CCCCCC][ICODE]{{ greeting }}, уважаемый {{ user.name }} [/ICODE][/COLOR][/CENTER][/B]<br><br>" +
       "[CENTER][QUOTE] В доказательствах отсутствует /time. [/QUOTE][/CENTER]<br><br>" +
       "[CENTER]Отказано.Закрыто.[/CENTER]<br><br>" +
       TotleEnd,
       prefix: OTKAZANO_PREFIX,
       status: false,
       },
       {
       title: 'Нужна видиофиксация',
       content:
       "[B][CENTER][COLOR=#CCCCCC][ICODE]{{ greeting }}, уважаемый {{ user.name }} [/ICODE][/COLOR][/CENTER][/B]<br><br>" +
       "[CENTER][QUOTE] В данном случае требуется видеодоказательство на нарушение от игрока. [/QUOTE][/CENTER]<br><br>" +
       "[CENTER]Отказано.Закрыто.[/CENTER]<br><br>" +
       TotleEnd,
       prefix: OTKAZANO_PREFIX,
       status: false,
       },
       {
       title: ' Отсутствует доказательства',
       content:
       "[B][CENTER][COLOR=#CCCCCC][ICODE]{{ greeting }}, уважаемый {{ user.name }} [/ICODE][/COLOR][/CENTER][/B]<br><br>" +
       "[CENTER][QUOTE] В вашей жалобе отсутствуют доказательства. [/QUOTE][/CENTER]<br><br>" +
       "[CENTER]Отказано.Закрыто.[/CENTER]<br><br>" +
       TotleEnd,
       prefix: OTKAZANO_PREFIX,
       status: false,
       },
       {
       title: 'Нет нарушения',
       content:
       "[B][CENTER][COLOR=#CCCCCC][ICODE]{{ greeting }}, уважаемый {{ user.name }} [/ICODE][/COLOR][/CENTER][/B]<br><br>" +
       "[CENTER][QUOTE] со стороны игрока не увидел нарушения. [/QUOTE][/CENTER]<br><br>" +
       "[CENTER]Отказано.Закрыто.[/CENTER]<br><br>" +
       TotleEnd,
       prefix: OTKAZANO_PREFIX,
       status: false,
       },
       {
       title: 'Не по форме',
       content:
       "[B][CENTER][COLOR=#CCCCCC][ICODE]{{ greeting }}, уважаемый {{ user.name }} [/ICODE][/COLOR][/CENTER][/B]<br><br>" +
       "[CENTER] Ваша жалоба составлена не по форме [/CENTER]<br>" +
       "[CENTER][QUOTE]         Форма:<br>" +
                        "1. Ваш Nick_Name:<br>" +
                        "2. Nick_Name игрока:<br>" +
                        "3. Суть жалобы:<br>" +    
                        "4. Доказательство:  [/QUOTE][/CENTER]<br><br>" +
       "[CENTER]Отказано.Закрыто.[/CENTER]<br><br>" +
       TotleEnd,
       prefix: OTKAZANO_PREFIX,
       status: false,
       },
       {
       title: 'ᅠ ᅠ ᅠ ᅠ ᅠ ᅠ                                ᅠ⠀             ⠀ Ст.Куратор Форума   ⠀        ⠀    ⠀      ⠀ᅠ     ᅠ ᅠ     ᅠ ᅠ ᅠ ',
       dpstyle: 'oswald: 3px;     color: #fff; background: #212428; box-shadow: 0 0 2px 0 rgba(0,0,0,0.14),0 2px 2px 0 rgba(0,0,0,0.12),0 1px 3px 0 rgba(0,0,0,0.2); border: 1px solid #BF40BF; width: 96%',
	   },
       {
       title: 'Оск родни',
       content:
       "[B][CENTER][COLOR=#CCCCCC][ICODE]{{ greeting }}, уважаемый {{ user.name }} [/ICODE][/COLOR][/CENTER][/B]<br><br>" +
       "[CENTER][QUOTE] 3.04. Запрещено оскорбление или косвенное упоминание родных вне зависимости от чата (IC или OOC) | Mute 300 минут / Ban 7 дней [/QUOTE][/CENTER]<br><br>" +
       "[CENTER] Одобрено [/CENTER]<br><br>" +
       TotleEnd,
       prefix: OTKAZANO_PREFIX,
       status: false,
       },
       {
       title: 'DM',
       content:
       "[B][CENTER][COLOR=#CCCCCC][ICODE]{{ greeting }}, уважаемый {{ user.name }} [/ICODE][/COLOR][/CENTER][/B]<br><br>" +
       "[CENTER][QUOTE] 2.19. Запрещён DM (DeathMatch) — убийство или нанесение урона без веской IC-причины | Jail 90 минут [/QUOTE][/CENTER]<br><br>" +
       "[CENTER] Одобрено [/CENTER]<br><br>" +
       TotleEnd,
       prefix: ACCEPT_PREFIX,
       status: false,
       },
       {
       title: 'Nrp поведение',
       content:
       "[B][CENTER][COLOR=#CCCCCC][ICODE]{{ greeting }}, уважаемый {{ user.name }} [/ICODE][/COLOR][/CENTER][/B]<br><br>" +
       "[CENTER][QUOTE] 2.01. Запрещено поведение, нарушающее нормы Role Play процессов | Jail 30 минут [/QUOTE][/CENTER]<br><br>" +
       "[CENTER] Одобрено [/CENTER]<br><br>" +
       TotleEnd,
       prefix: ACCEPT_PREFIX,
       status: false
       },
       {
       title: 'Помеха рп процессу',
       content:
       "[B][CENTER][COLOR=#CCCCCC][ICODE]{{ greeting }}, уважаемый {{ user.name }} [/ICODE][/COLOR][/CENTER][/B]<br><br>" +
       "[CENTER][QUOTE] 2.04. Запрещены любые действия способные привести к помехам в игровом процессе, а также выполнению работ, если они этого не предусматривают и если эти действия выходят за рамки игрового процесса данной работы | Ban 10 дней [/QUOTE][/CENTER]<br><br>" +
       "[CENTER] Одобрено [/CENTER]<br><br>" +
       TotleEnd,
       prefix: ACCEPT_PREFIX,
       status: false,
       },
       ];

	$(document).ready(() => {
	// Загрузка скрипта для обработки шаблонов
	$('body').append('<script src="https://cdn.jsdelivr.net/npm/handlebars@latest/dist/handlebars.js"></script>');

	// Добавление кнопок при загрузке страницы
	addButton('На рассмотрении', 'pin', 'font-family: Georgia; font-weight: bold; font-style: italic; text-transform: none; font-size: 12px; border-radius: 15px; margin-right: 5px; border: 2px solid; border-color: rgb(255, 165, 0)');
    addButton('Главному Адм.', 'GA', 'font-family: Georgia; font-weight: bold; font-style: italic; text-transform: none; font-size: 12px; border-radius: 15px; margin-right: 5px; border: 2px solid; border-color: rgb(255, 0, 0)');
    addButton('Спец. Адм.', 'SA', 'font-family: Georgia; font-weight: bold; font-style: italic; text-transform: none; font-size: 12px; border-radius: 15px; margin-right: 5px; border: 2px solid; border-color: rgb(255, 0, 0)');
    addButton('Тех. спец', 'TEH', 'font-family: Georgia; font-weight: bold; font-style: italic; text-transform: none; font-size: 12px; border-radius: 15px; margin-right: 5px; border: 2px solid; border-color: rgb(17, 92, 208)');

	addAnswers();

	// Поиск информации о теме
	const threadData = getThreadData();

    $('button#pin').click(() => editThreadData(PIN_PREFIX, true));
	$('button#otkazno').click(() => editThreadData(OTKAZANO_PREFIX, false));
	$('button#accepted').click(() => editThreadData(ACCEPT_PREFIX, false));
	$('button#teamProject').click(() => editThreadData(KP_PREFIX, true));
	$('button#watched').click(() => editThreadData(WATCHED_PREFIX, false));
	$('button#resheno').click(() => editThreadData(RESHENO_PREFIX, false));
	$('button#closed').click(() => editThreadData(CLOSE_PREFIX, false));
	$('button#closed_complaint').click(() => editThreadData(CLOSE_PREFIX, false, false));
	$('button#TEH').click(() => editThreadData(TEH_PREFIX, true, true));
    $('button#GA').click(() => editThreadData(GA_PREFIX, true));
    $('button#SA').click(() => editThreadData(SA_PREFIX, true));

	$(`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, style) {
         $('.button--icon--reply').before(
	`<button type="button" class="button--primary button rippleButton" id="${id}" style="${style}">${name}</button>`,
	);
	}
	function addAnswers() {
		$('.button--icon--reply').after(`<button type="button" class="button--cta uix_quickReply--button button button--icon button--icon--write rippleButton" id="selectAnswer" style="oswald: 3px; margin-left: 10px; margin-top: 10px; border-radius: 20px; font-family: Georgia; font-weight: bold; font-style: italic; text-transform: none;">Выбрать ответ</button>`,
	);
	}

	function buttonsMarkup(buttons) {
	return `<div class="select_answer">${buttons
	.map(
	(btn, i) =>
	`<button id="answers-${i}" class="button--primary button ` +
	`rippleButton" style="margin:4px; ${btn.dpstyle}"><span class="button-text">${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: () =>
	'Здравствуйте'
	};
	}
          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;
            }
          })();