Ada1oov

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

スクリプトをインストールするには、Tampermonkey, GreasemonkeyViolentmonkey のような拡張機能のインストールが必要です。

You will need to install an extension such as Tampermonkey to install this script.

スクリプトをインストールするには、TampermonkeyViolentmonkey のような拡張機能のインストールが必要です。

スクリプトをインストールするには、TampermonkeyUserscripts のような拡張機能のインストールが必要です。

このスクリプトをインストールするには、Tampermonkeyなどの拡張機能をインストールする必要があります。

このスクリプトをインストールするには、ユーザースクリプト管理ツールの拡張機能をインストールする必要があります。

(ユーザースクリプト管理ツールは設定済みなのでインストール!)

このスタイルをインストールするには、Stylusなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus などの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus tなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

(ユーザースタイル管理ツールは設定済みなのでインストール!)

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください
// ==UserScript==
// @name         Ada1oov
// @namespace    https://forum.blackrussia.online/
// @version      1.8
// @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: 'ᅠ ᅠ ᅠ ᅠ ᅠ ᅠ                                ᅠ⠀             ⠀ Ст.Куратор Форума   ⠀        ⠀    ⠀      ⠀ᅠ     ᅠ ᅠ     ᅠ ᅠ ᅠ ',
       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;
            }
          })();