Скрипты для Модератор Форума CHEREPOVETS
// ==UserScript==
// @name Скрипт для МФ by E.Sailauov // CHEREPOVETS
// @namespace http://tampermonkey.net/
// @version 4.0
// @description Скрипты для Модератор Форума CHEREPOVETS
// @author Erasyl_Sailauov
// @match https://forum.blackrussia.online/threads/*
// @grant none
// @license MIT
// ==/UserScript==
(function () {
'use strict';
// -------------------------------
// Префиксы тем
// -------------------------------
const UNACCEPT_PREFIX = 4;
const ACCEPT_PREFIX = 8;
const PIN_PREFIX = 2;
const CLOSE_PREFIX = 7;
const WAIT_PREFIX = 14;
const NO_PREFIX = 0;
// -------------------------------
// Баннеры для RP ответов
// -------------------------------
const BANNER = 'https://i.postimg.cc/QC0bfZff/5091-DADF-C098-41-B5-B63-A-48-D035-EEC282.png';
const DIVIMG = 'https://i.postimg.cc/fTh4W2B3/RLwzo.png';
// -------------------------------
// RP шаблоны для Ответов
// -------------------------------
const buttons = [
// Одобрено
{
title: 'Одобрено',
content:
"[B][CENTER][IMG]" + BANNER + "[/IMG]" +
"[SIZE=4][FONT=arial][COLOR=#0099ff]{{ greeting }}, уважаемый {{ user.mention }}.[/COLOR][/FONT][/SIZE][/B]" +
"[IMG]" + DIVIMG + "[/IMG]<br>" +
"[B][FONT=arial][COLOR=#FFFFFF][SIZE=4]Ваша RP биография получает статус: [COLOR=#00FF00]Одобрено[/COLOR].[/SIZE][/FONT][/B]" +
"[IMG]" + DIVIMG + "[/IMG]<br><br>" +
"[CENTER][FONT=arial][SIZE=4][COLOR=#00FF00]ОДОБРЕНО[/COLOR]<br><br>" +
"[RIGHT]Приятной игры на сервере [COLOR=#0099FF]CHEREPOVETS[/COLOR].[/RIGHT][/SIZE][/FONT][/CENTER]"
},
// На рассмотрение
{
title: 'На рассмотрение',
content:
"[B][CENTER][IMG]" + BANNER + "[/IMG]" +
"[SIZE=4][FONT=arial][COLOR=#0099ff]{{ greeting }}, уважаемый {{ user.mention }}.[/COLOR][/FONT][/SIZE][/B]" +
"<br>[B][COLOR=#FFFF00][SIZE=4]Ваша RP биография принята на рассмотрение.[/SIZE][/COLOR][/B]" +
"<br><br>[FONT=arial][SIZE=4]Ожидайте ответа от администрации в течение 72 часов. Просьба не создавать дубликатов.[/SIZE][/FONT][/CENTER]"
},
// На доработку
{
title: 'На доработку',
content:
"[B][CENTER][IMG]" + BANNER + "[/IMG]" +
"[SIZE=4][FONT=arial][COLOR=#0099ff]{{ greeting }}, уважаемый {{ user.mention }}.[/COLOR][/FONT][/SIZE][/B]" +
"[IMG]" + DIVIMG + "[/IMG]<br>" +
"[B][FONT=arial][COLOR=#FFFFFF][SIZE=4]Ваша RP биография получает статус: [COLOR=#FFA500]На доработку[/COLOR].[/SIZE][/FONT][/B]" +
"[IMG]" + DIVIMG + "[/IMG]<br><br>" +
"[CENTER][FONT=arial][SIZE=4][COLOR=#FFA500]НА ДОРАБОТКУ[/COLOR]<br><br>" +
"Причина: (перечислите замечания: орфография, не хватает информации, нет фото и пр.).<br>" +
"На исправление даётся 24 часа. Если правки не внесёте — тема будет отказана.[/FONT][/CENTER]"
},
// =======================
// 14 Отказов
// =======================
// 1
{
title:'Отказано | Не по форме (заголовок)',
content:"[B][CENTER][IMG]"+BANNER+"[/IMG][SIZE=4][FONT=arial][COLOR=#0099ff]{{ greeting }}, уважаемый {{ user.mention }}.[/COLOR][/FONT][/SIZE][/B]" +
"[IMG]"+DIVIMG+"[/IMG]<br>[B][FONT=arial][COLOR=#FFFFFF][SIZE=4]Ваша RP биография получает статус: [COLOR=#FF0000]Отказано[/COLOR].[/SIZE][/FONT][/B]" +
"[IMG]"+DIVIMG+"[/IMG]<br><br>[CENTER][FONT=arial][SIZE=4][COLOR=#FF0000]ОТКАЗАНО[/COLOR]<br><br>" +
"Причина: Заголовок темы составлен не по форме.<br>" +
"Примечание: Заголовок RP биографии должен быть: [B]Биография | Nick_Name[/B].<br>" +
"[COLOR=#00FFFF]Пожелание:[/COLOR] Следуйте правилам.<br>" +
"[COLOR=#FFFF00]Мотивация:[/COLOR] \"Дисциплина — путь к успеху.\"[/FONT][/CENTER]"
},
// 2
{
title:'Отказано | Нереалистично',
content:"[B][CENTER][IMG]"+BANNER+"[/IMG][SIZE=4][FONT=arial][COLOR=#0099ff]{{ greeting }}, уважаемый {{ user.mention }}.[/COLOR][/FONT][/SIZE][/B]" +
"[IMG]"+DIVIMG+"[/IMG]<br>[B][FONT=arial][COLOR=#FFFFFF][SIZE=4]Ваша RP биография получает статус: [COLOR=#FF0000]Отказано[/COLOR].[/SIZE][/FONT][/B]" +
"[IMG]"+DIVIMG+"[/IMG]<br><br>[CENTER][FONT=arial][SIZE=4][COLOR=#FF0000]ОТКАЗАНО[/COLOR]<br><br>" +
"Причина: Биография нереалистична (сверхспособности и т.д.).<br>" +
"[COLOR=#00FFFF]Пожелание:[/COLOR] Составляйте реалистичные биографии.<br>" +
"[COLOR=#FFFF00]Мотивация:[/COLOR] \"Реальность делает историю живой.\"[/FONT][/CENTER]"
},
// 3
{
title:'Отказано | Существующий человек',
content:"[B][CENTER][IMG]"+BANNER+"[/IMG][SIZE=4][FONT=arial][COLOR=#0099ff]{{ greeting }}, уважаемый {{ user.mention }}.[/COLOR][/FONT][/SIZE][/B]" +
"[IMG]"+DIVIMG+"[/IMG]<br>[B][FONT=arial][COLOR=#FFFFFF][SIZE=4]Ваша RP биография получает статус: [COLOR=#FF0000]Отказано[/COLOR].[/SIZE][/FONT][/B]" +
"[IMG]"+DIVIMG+"[/IMG]<br><br>[CENTER][FONT=arial][SIZE=4][COLOR=#FF0000]ОТКАЗАНО[/COLOR]<br><br>" +
"Причина: Запрещено составлять биографии реальных людей.<br>" +
"[COLOR=#00FFFF]Пожелание:[/COLOR] Создавайте уникальных персонажей.<br>" +
"[COLOR=#FFFF00]Мотивация:[/COLOR] \"Творчество рождает уникальность.\"[/FONT][/CENTER]"
},
// 4
{
title:'Отказано | Плагиат',
content:"[B][CENTER][IMG]"+BANNER+"[/IMG][SIZE=4][FONT=arial][COLOR=#0099ff]{{ greeting }}, уважаемый {{ user.mention }}.[/COLOR][/FONT][/SIZE][/B]" +
"[IMG]"+DIVIMG+"[/IMG]<br>[B][FONT=arial][COLOR=#FFFFFF][SIZE=4]Ваша RP биография получает статус: [COLOR=#FF0000]Отказано[/COLOR].[/SIZE][/FONT][/B]" +
"[IMG]"+DIVIMG+"[/IMG]<br><br>[CENTER][FONT=arial][SIZE=4][COLOR=#FF0000]ОТКАЗАНО[/COLOR]<br><br>" +
"Причина: Обнаружено копирование чужой RP биографии.<br>" +
"[COLOR=#00FFFF]Пожелание:[/COLOR] Пишите свои тексты сами.<br>" +
"[COLOR=#FFFF00]Мотивация:[/COLOR] \"Честность — ключ к уважению.\"[/FONT][/CENTER]"
},
// 5
{
title:'Отказано | Грамматика / Орфография',
content:"[B][CENTER][IMG]"+BANNER+"[/IMG][SIZE=4][FONT=arial][COLOR=#0099ff]{{ greeting }}, уважаемый {{ user.mention }}.[/COLOR][/FONT][/SIZE][/B]" +
"[IMG]"+DIVIMG+"[/IMG]<br>[B][FONT=arial][COLOR=#FFFFFF][SIZE=4]Ваша RP биография получает статус: [COLOR=#FF0000]Отказано[/COLOR].[/SIZE][/FONT][/B]" +
"[IMG]"+DIVIMG+"[/IMG]<br><br>[CENTER][FONT=arial][SIZE=4][COLOR=#FF0000]ОТКАЗАНО[/COLOR]<br><br>" +
"Причина: Биография содержит орфографические или грамматические ошибки.<br>" +
"[COLOR=#00FFFF]Пожелание:[/COLOR] Проверяйте текст перед отправкой.<br>" +
"[COLOR=#FFFF00]Мотивация:[/COLOR] \"Грамотность украшает текст.\"[/FONT][/CENTER]"
},
// 6
{
title:'Отказано | Шрифт / Размер',
content:"[B][CENTER][IMG]"+BANNER+"[/IMG][SIZE=4][FONT=arial][COLOR=#0099ff]{{ greeting }}, уважаемый {{ user.mention }}.[/COLOR][/FONT][/SIZE][/B]" +
"[IMG]"+DIVIMG+"[/IMG]<br>[B][FONT=arial][COLOR=#FFFFFF][SIZE=4]Ваша RP биография получает статус: [COLOR=#FF0000]Отказано[/COLOR].[/SIZE][/FONT][/B]" +
"[IMG]"+DIVIMG+"[/IMG]<br><br>[CENTER][FONT=arial][SIZE=4][COLOR=#FF0000]ОТКАЗАНО[/COLOR]<br><br>" +
"Причина: Использован неправильный шрифт или размер текста.<br>" +
"[COLOR=#00FFFF]Пожелание:[/COLOR] Соблюдайте единый стиль оформления.<br>" +
"[COLOR=#FFFF00]Мотивация:[/COLOR] \"Чистота формы — часть красоты содержания.\"[/FONT][/CENTER]"
},
// 7
{
title:'Отказано | Нет фото / материалов',
content:"[B][CENTER][IMG]"+BANNER+"[/IMG][SIZE=4][FONT=arial][COLOR=#0099ff]{{ greeting }}, уважаемый {{ user.mention }}.[/COLOR][/FONT][/SIZE][/B]" +
"[IMG]"+DIVIMG+"[/IMG]<br>[B][FONT=arial][COLOR=#FFFFFF][SIZE=4]Ваша RP биография получает статус: [COLOR=#FF0000]Отказано[/COLOR].[/SIZE][/FONT][/B]" +
"[IMG]"+DIVIMG+"[/IMG]<br><br>[CENTER][FONT=arial][SIZE=4][COLOR=#FF0000]ОТКАЗАНО[/COLOR]<br><br>" +
"Причина: В биографии отсутствуют фотографии или иные материалы.<br>" +
"[COLOR=#00FFFF]Пожелание:[/COLOR] Добавляйте необходимые материалы.<br>" +
"[COLOR=#FFFF00]Мотивация:[/COLOR] \"Визуальная информация усиливает текст.\"[/FONT][/CENTER]"
},
// 8
{
title:'Отказано | Пропаганда нарушений',
content:"[B][CENTER][IMG]"+BANNER+"[/IMG][SIZE=4][FONT=arial][COLOR=#0099ff]{{ greeting }}, уважаемый {{ user.mention }}.[/COLOR][/FONT][/SIZE][/B]" +
"[IMG]"+DIVIMG+"[/IMG]<br>[B][FONT=arial][COLOR=#FFFFFF][SIZE=4]Ваша RP биография получает статус: [COLOR=#FF0000]Отказано[/COLOR].[/SIZE][/FONT][/B]" +
"[IMG]"+DIVIMG+"[/IMG]<br><br>[CENTER][FONT=arial][SIZE=4][COLOR=#FF0000]ОТКАЗАНО[/COLOR]<br><br>" +
"Причина: Биография содержит элементы, оправдывающие или поощряющие нарушения правил сервера.<br>" +
"[COLOR=#00FFFF]Пожелание:[/COLOR] Соблюдайте правила сервера.<br>" +
"[COLOR=#FFFF00]Мотивация:[/COLOR] \"Правила созданы для честной игры.\"[/FONT][/CENTER]"
},
// 9
{
title:'Отказано | Неверный объём',
content:"[B][CENTER][IMG]"+BANNER+"[/IMG][SIZE=4][FONT=arial][COLOR=#0099ff]{{ greeting }}, уважаемый {{ user.mention }}.[/COLOR][/FONT][/SIZE][/B]" +
"[IMG]"+DIVIMG+"[/IMG]<br>[B][FONT=arial][COLOR=#FFFFFF][SIZE=4]Ваша RP биография получает статус: [COLOR=#FF0000]Отказано[/COLOR].[/SIZE][/FONT][/B]" +
"[IMG]"+DIVIMG+"[/IMG]<br><br>[CENTER][FONT=arial][SIZE=4][COLOR=#FF0000]ОТКАЗАНО[/COLOR]<br><br>" +
"Причина: Текст не соответствует требованиям по объёму (200–600 слов).<br>" +
"[COLOR=#00FFFF]Пожелание:[/COLOR] Старайтесь уложиться в лимит.<br>" +
"[COLOR=#FFFF00]Мотивация:[/COLOR] \"Правильный объём делает текст читаемым.\"[/FONT][/CENTER]"
},
// 10
{
title:'Отказано | Логические противоречия',
content:"[B][CENTER][IMG]"+BANNER+"[/IMG][SIZE=4][FONT=arial][COLOR=#0099ff]{{ greeting }}, уважаемый {{ user.mention }}.[/COLOR][/FONT][/SIZE][/B]" +
"[IMG]"+DIVIMG+"[/IMG]<br>[B][FONT=arial][COLOR=#FFFFFF][SIZE=4]Ваша RP биография получает статус: [COLOR=#FF0000]Отказано[/COLOR].[/SIZE][/FONT][/B]" +
"[IMG]"+DIVIMG+"[/IMG]<br><br>[CENTER][FONT=arial][SIZE=4][COLOR=#FF0000]ОТКАЗАНО[/COLOR]<br><br>" +
"Причина: В тексте обнаружены логические противоречия.<br>" +
"[COLOR=#00FFFF]Пожелание:[/COLOR] Проверяйте связность текста.<br>" +
"[COLOR=#FFFF00]Мотивация:[/COLOR] \"Логика делает историю убедительной.\"[/FONT][/CENTER]"
},
// 11
{
title:'Отказано | Возраст не совпадает с датой',
content:"[B][CENTER][IMG]"+BANNER+"[/IMG][SIZE=4][FONT=arial][COLOR=#0099ff]{{ greeting }}, уважаемый {{ user.mention }}.[/COLOR][/FONT][/SIZE][/B]" +
"[IMG]"+DIVIMG+"[/IMG]<br>[B][FONT=arial][COLOR=#FFFFFF][SIZE=4]Ваша RP биография получает статус: [COLOR=#FF0000]Отказано[/COLOR].[/SIZE][/FONT][/B]" +
"[IMG]"+DIVIMG+"[/IMG]<br><br>[CENTER][FONT=arial][SIZE=4][COLOR=#FF0000]ОТКАЗАНО[/COLOR]<br><br>" +
"Причина: Указанный возраст не соответствует дате рождения.<br>" +
"[COLOR=#00FFFF]Пожелание:[/COLOR] Проверьте дату и возраст.<br>" +
"[COLOR=#FFFF00]Мотивация:[/COLOR] \"Точность — основа достоверности.\"[/FONT][/CENTER]"
},
// 12
{
title:'Отказано | Не дополнил',
content:"[B][CENTER][IMG]"+BANNER+"[/IMG][SIZE=4][FONT=arial][COLOR=#0099ff]{{ greeting }}, уважаемый {{ user.mention }}.[/COLOR][/FONT][/SIZE][/B]" +
"[IMG]"+DIVIMG+"[/IMG]<br>[B][FONT=arial][COLOR=#FFFFFF][SIZE=4]Ваша RP биография получает статус: [COLOR=#FF0000]Отказано[/COLOR].[/SIZE][/FONT][/B]" +
"[IMG]"+DIVIMG+"[/IMG]<br><br>[CENTER][FONT=arial][SIZE=4][COLOR=#FF0000]ОТКАЗАНО[/COLOR]<br><br>" +
"Причина: Не все пункты заполнены.<br>" +
"[COLOR=#00FFFF]Пожелание:[/COLOR] Дополните все обязательные поля.<br>" +
"[COLOR=#FFFF00]Мотивация:[/COLOR] \"Полнота информации делает биографию убедительной.\"[/FONT][/CENTER]"
},
// 13
{
title:'Отказано | Не от первого лица',
content:"[B][CENTER][IMG]"+BANNER+"[/IMG][SIZE=4][FONT=arial][COLOR=#0099ff]{{ greeting }}, уважаемый {{ user.mention }}.[/COLOR][/FONT][/SIZE][/B]" +
"[IMG]"+DIVIMG+"[/IMG]<br>[B][FONT=arial][COLOR=#FFFFFF][SIZE=4]Ваша RP биография получает статус: [COLOR=#FF0000]Отказано[/COLOR].[/SIZE][/FONT][/B]" +
"[IMG]"+DIVIMG+"[/IMG]<br><br>[CENTER][FONT=arial][SIZE=4][COLOR=#FF0000]ОТКАЗАНО[/COLOR]<br><br>" +
"Причина: Биография написана не от первого лица.<br>" +
"[COLOR=#00FFFF]Пожелание:[/COLOR] Перепишите биографию от первого лица.<br>" +
"[COLOR=#FFFF00]Мотивация:[/COLOR] \"Первое лицо делает историю живой.\"[/FONT][/CENTER]"
},
// 14
{
title:'Отказано | Оффтоп',
content:"[B][CENTER][IMG]"+BANNER+"[/IMG][SIZE=4][FONT=arial][COLOR=#0099ff]{{ greeting }}, уважаемый {{ user.mention }}.[/COLOR][/FONT][/SIZE][/B]" +
"[IMG]"+DIVIMG+"[/IMG]<br>[B][FONT=arial][COLOR=#FFFFFF][SIZE=4]Ваша RP биография получает статус: [COLOR=#FF0000]Отказано[/COLOR].[/SIZE][/FONT][/B]" +
"[IMG]"+DIVIMG+"[/IMG]<br><br>[CENTER][FONT=arial][SIZE=4][COLOR=#FF0000]ОТКАЗАНО[/COLOR]<br><br>" +
"Причина: Тема является оффтопом и не соответствует формату RP биографии.<br>" +
"Примечание: Пожалуйста, создавайте темы только для RP биографий.<br><br>" +
"[COLOR=#00FFFF]Пожелание:[/COLOR] Будьте внимательны и следуйте правилам форума.<br>" +
"[COLOR=#FFFF00]Мотивация:[/COLOR] \"Настоящая сила в дисциплине и внимании к деталям.\"<br>" +
"[/FONT][/CENTER]"
}
];
// -------------------------------
// Инициализация кнопок на странице
// -------------------------------
$(document).ready(() => {
const script = document.createElement('script');
script.src = "https://cdn.jsdelivr.net/npm/handlebars@latest/dist/handlebars.js";
document.body.appendChild(script);
script.onload = () => {
const buttonList = [
{name: 'На рассмотрение', id: 'btn_pin', prefix: PIN_PREFIX},
{name: 'Отказано⛔', id: 'btn_unaccept', prefix: UNACCEPT_PREFIX},
{name: 'Одобрено✅', id: 'btn_accept', prefix: ACCEPT_PREFIX},
{name: 'Закрыто⛔', id: 'btn_close', prefix: CLOSE_PREFIX},
{name: 'Ожидание', id: 'btn_wait', prefix: WAIT_PREFIX},
{name: 'Без префикса⛔', id: 'btn_no', prefix: NO_PREFIX},
{name: 'Ответы💥', id: 'btn_answers'}
];
buttonList.forEach(btn => addButton(btn.name, btn.id));
buttonList.forEach(btn => {
$(`#${btn.id}`).click(() => {
if(btn.id === 'btn_answers'){
showAnswerButtons();
} else {
editThreadData(btn.prefix, false);
}
});
});
};
});
function addButton(name, id) {
$('.button--icon--reply').first().before(
`<button type="button" class="button rippleButton" id="${id}" style="margin: 3px;">${name}</button>`
);
}
function showAnswerButtons() {
const markup = buttons.map((btn, i) =>
`<button id="answer-${i}" class="button--primary rippleButton" style="margin:5px">${btn.title}</button>`
).join('');
XF.alert(`<div class="select_answer">${markup}</div>`, null, 'Выберите ответ:');
buttons.forEach((btn, i) => {
$(`#answer-${i}`).click(() => pasteContent(i));
});
}
function pasteContent(id) {
const threadData = getThreadData();
const template = Handlebars.compile(buttons[id].content);
$('.fr-element.fr-view p').empty().append(template(threadData));
$('a.overlay-titleCloser').trigger('click');
}
function getThreadData() {
const authorID = $('a.username').first().attr('data-user-id');
const authorName = $('a.username').first().text();
const hours = new Date().getHours();
return {
user: {id: authorID, name: authorName, mention: `[USER=${authorID}]${authorName}[/USER]`},
greeting:
(hours > 4 && hours <= 11) ? 'Доброе утро' :
(hours > 11 && hours <= 15) ? 'Добрый день' :
(hours > 15 && hours <= 21) ? 'Добрый вечер' :
'Доброй ночи'
};
}
function editThreadData(prefix, pin = false) {
const threadTitle = $('.p-title-value').first().text().trim();
const formData = new FormData();
formData.append('prefix_id', prefix);
formData.append('title', threadTitle);
if(pin) formData.append('sticky', 1);
formData.append('_xfToken', XF.config.csrf);
formData.append('_xfRequestUri', document.URL.split(XF.config.url.fullBase)[1]);
formData.append('_xfWithData', 1);
formData.append('_xfResponseType', 'json');
fetch(`${document.URL}edit`, {method: 'POST', body: formData}).then(() => location.reload());
}
})();