Ada1oov

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

Bu betiği kurabilmeniz için Tampermonkey, Greasemonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği yüklemek için Tampermonkey gibi bir uzantı yüklemeniz gerekir.

Bu betiği kurabilmeniz için Tampermonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Userscripts gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği indirebilmeniz için ayrıca Tampermonkey gibi bir eklenti kurmanız gerekmektedir.

Bu komut dosyasını yüklemek için bir kullanıcı komut dosyası yöneticisi uzantısı yüklemeniz gerekecek.

(Zaten bir kullanıcı komut dosyası yöneticim var, kurmama izin verin!)

Bu stili yüklemek için Stylus gibi bir uzantı yüklemeniz gerekir.

Bu stili yüklemek için Stylus gibi bir uzantı kurmanız gerekir.

Bu stili yükleyebilmek için Stylus gibi bir uzantı yüklemeniz gerekir.

Bu stili yüklemek için bir kullanıcı stili yöneticisi uzantısı yüklemeniz gerekir.

Bu stili yüklemek için bir kullanıcı stili yöneticisi uzantısı kurmanız gerekir.

Bu stili yükleyebilmek için bir kullanıcı stili yöneticisi uzantısı yüklemeniz gerekir.

(Zateb bir user-style yöneticim var, yükleyeyim!)

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