Скрипт для модерирования форума BlackRussia
// ==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;
}
})();