Ada1oov

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

Vous devrez installer une extension telle que Tampermonkey, Greasemonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Userscripts pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension de gestionnaire de script utilisateur pour installer ce script.

(J'ai déjà un gestionnaire de scripts utilisateur, laissez-moi l'installer !)

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

(J'ai déjà un gestionnaire de style utilisateur, laissez-moi l'installer!)

// ==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;
            }
          })();