// ==UserScript==
// @name Script for appeals
// @namespace https://forum.blackrussia.online
// @version 4.1
// @description forward-only!
// @author Jaden Young
// @match https://forum.blackrussia.online/index.php?threads/*
// @include https://forum.blackrussia.online/index.php?threads/
// @icon https://forum.blackrussia.online/data/avatars/l/304/304304.jpg?1646559749
// @grant none
// @license MIT
// ==/UserScript==
(async function () {
`use strict`;
const UNACCEPT_PREFIX = 4; // Prefix that will be set when thread closes
const ACCEPT_PREFIX = 8; // Prefix that will be set when thread accepted
const PIN_PREFIX = 2; // Prefix that will be set when thread pins
const COMMAND_PREFIX = 10; // Prefix that will be set when thread send to project team
const WATCHED_PREFIX = 9;
const CLOSE_PREFIX = 7;
const TECH_PREFIX = 13;
const RESHENO_PREFIX = 6;
const data = await getThreadData(),
greeting = data.greeting,
user = data.user;
const buttons = [
{
title: `-------------------------------------------------- РАССМОТРЕНИЕ --------------------------------------------------`,
content: ``,
},
{
title: `На рассмотрении`,
content:
`[SIZE=4][CENTER]Приветствую, уважаемый игрок!.[/CENTER]<br><br>` +
`[SIZE=4][CENTER]На рассмотрении.[/SIZE][/CENTER]`,
prefix: PIN_PREFIX,
status: true,
},
{
title: `Свяжитесь со мной во ВКонтакте`,
content:
`[SIZE=4][CENTER]Приветствую, уважаемый игрок!.[/CENTER]<br><br>` +
`[CENTER][SIZE=4]Свяжитесь со мной ВКонтакте по следующей форме:[/CENTER]<br><br>` +
`[CENTER][SIZE=4]1. Ваш NickName:[/CENTER]<br>` +
`[CENTER][SIZE=4]2. Ссылка на обжалование:[/CENTER]<br><br>` +
`[CENTER][SIZE=4]VK: https://vk.com/iyghjiyfcbjkk <br><br>` +
`[CENTER][SIZE=4]На рассмотрении.<br>`,
prefix: PIN_PREFIX,
status: true,
},
{
title: `Разблокировка для передачи украденного имущества`,
content:
`[SIZE=4][CENTER]Приветствую, уважаемый игрок!.[/CENTER]<br><br>` +
`[CENTER][SIZE=4]Ваш аккаунт разблокирован на 24 часа.
За это время Вы должны успеть вернуть украденное имущество пострадавшему игроку.
Если условие не будет выполнено, то аккаунт вновь будет заблокирован.[/CENTER][/SIZE]`,
prefix: PIN_PREFIX,
status: true,
},
{
title: `-------------------------------------------------- ОТКАЗ --------------------------------------------------`,
content: ``,
},
{
title: `Не готов пойти навстречу`,
content:
`[CENTER][SIZE=4]Приветствую, уважаемый игрок!.[/CENTER]<br><br>` +
`[CENTER][SIZE=4]Пока я не готов пойти к Вам навстречу.[/CENTER]<br><br>` +
`[CENTER][SIZE=4]Закрыто.[/SIZE][/CENTER]`,
prefix: UNACCEPT_PREFIX,
status: false,
},
{
title: `Не готов пойти навстречу (напишите через 2 дня)`,
content:
`[SIZE=4][CENTER]Приветствую, уважаемый игрок!.[/CENTER]<br><br>` +
`[CENTER][SIZE=4]Пока я не готов пойти к Вам навстречу, напишите обжалование спустя два дня.[/CENTER]<br><br>` +
`[CENTER][SIZE=4]Закрыто.[/SIZE][/CENTER]`,
prefix: UNACCEPT_PREFIX,
status: false,
},
{
title: `Не готов пойти навстречу (напишите через 3 дня)`,
content:
`[SIZE=4][CENTER]Приветствую, уважаемый игрок!.[/CENTER]<br><br>` +
`[CENTER][SIZE=4]Пока я не готов пойти к Вам навстречу, напишите обжалование спустя три дня.[/CENTER]<br><br>` +
`[CENTER][SIZE=4]Закрыто.[/SIZE][/CENTER]`,
prefix: UNACCEPT_PREFIX,
status: false,
},
{
title: `Не готов пойти навстречу (напишите через 4 дня)`,
content:
`[SIZE=4][CENTER]Приветствую, уважаемый игрок!.[/CENTER]<br><br>` +
`[CENTER][SIZE=4]Пока я не готов пойти к Вам навстречу, напишите обжалование спустя четыре дня.[/CENTER]<br><br>` +
`[CENTER][SIZE=4]Закрыто.[/SIZE][/CENTER]`,
prefix: UNACCEPT_PREFIX,
status: false,
},
{
title: `Не готов пойти навстречу (напишите через 4 дня)`,
content:
`[SIZE=4][CENTER]Приветствую, уважаемый игрок!.[/CENTER]<br><br>` +
`[CENTER][SIZE=4]Пока я не готов пойти к Вам навстречу, напишите обжалование спустя пять дней.<br><br>` +
`[CENTER][SIZE=4]Закрыто.[/SIZE][/CENTER]`,
prefix: UNACCEPT_PREFIX,
status: false,
},
{
title: `В обжаловании отказано`,
content:
`[SIZE=4][CENTER]Приветствую, уважаемый игрок!.[/CENTER]<br><br>` +
`[CENTER][SIZE=4]В обжаловании отказано.[/CENTER]<br><br>` +
`[CENTER][SIZE=4]Закрыто.[/SIZE][/CENTER]`,
prefix: UNACCEPT_PREFIX,
status: false,
},
{
title: `Не подлежит обжалованию`,
content:
`[SIZE=4][CENTER]Приветствую, уважаемый игрок!.[/CENTER]<br><br>` +
`[CENTER][SIZE=4]Данное наказание не подлежит обжалованию.[/CENTER]<br><br>` +
`[CENTER][SIZE=4]Закрыто. [/SIZE][/CENTER]`,
prefix: UNACCEPT_PREFIX,
status: false,
},
{
title: `Блокировка была выдана от Тех. спец-а`,
content:
`[SIZE=4][CENTER]Приветствую, уважаемый игрок!.[/CENTER]<br><br>` +
`[CENTER][SIZE=4]Блокировка была выдана от технического специалиста, собственно все дальнейшие разбирательства будут происходить в техническом разделе > жалобы на технических специалистов.[/CENTER]<br><br>` +
`[CENTER][SIZE=4]Закрыто.[/SIZE][/CENTER]`,
prefix: UNACCEPT_PREFIX,
status: false,
},
{
title: `Блокировка была выдана по наводке от Тех. спец-а`,
content:
`[SIZE=4][CENTER]Приветствую, уважаемый игрок!.[/CENTER]<br><br>` +
`[CENTER][SIZE=4]Блокировка была выдана по наводке от технического специалиста, соответственно Вам требуется обратиться в технический раздел => жалобы на технических специалистов.[/CENTER]<br><br>` +
`[CENTER][SIZE=4]Закрыто.[/SIZE][/CENTER]`,
prefix: UNACCEPT_PREFIX,
status: false,
},
{
title: `Обжалование составлено не по форме`,
content:
`[SIZE=4][CENTER]Приветствую, уважаемый игрок!.[/CENTER]<br><br>` +
`[CENTER][SIZE=4]Обжалование составлено не по форме.[/CENTER]<br><br>` +
`[CENTER][SIZE=4]Закрыто.[/SIZE][/CENTER]`,
prefix: UNACCEPT_PREFIX,
status: false,
},
{
title: `Обращайтесь в раздел жалоб на администрацию`,
content:
`[SIZE=4][CENTER]Приветствую, уважаемый игрок!.[/CENTER]<br><br>` +
`[CENTER][SIZE=4]Если вы не согласны с выданным наказанием, то Вам следует обратиться в раздел > жалобы на администрацию.[/CENTER]<br><br>` +
`[CENTER][SIZE=4]Закрыто.[/SIZE][/CENTER]`,
prefix: UNACCEPT_PREFIX,
status: false,
},
{
title: `Отсутствуют док-ва`,
content:
`[SIZE=4][CENTER]Приветствую, уважаемый игрок!.[/CENTER]<br><br>` +
`[CENTER][SIZE=4]В Вашем обжаловании отсутствуют доказательства выдачи наказания.[/CENTER][/SIZE]<br><br>` +
`[CENTER][SIZE=4]Закрыто.[/SIZE][/CENTER]`,
prefix: UNACCEPT_PREFIX,
status: false,
},
{
title: `Отсутствуют док-ва с пострадавшим на его согласие в получении украденного имущества`,
content:
`[SIZE=4][CENTER]Приветствую, уважаемый игрок!.[/CENTER]<br><br>` +
`[CENTER][SIZE=4]В обжаловании отсутствуют доказательства переписки с пострадавшим игроком на его согласие в получении украденного имущества.[/CENTER][/SIZE]<br><br>` +
`[CENTER][SIZE=4]Закрыто.[/SIZE][/CENTER]`,
prefix: UNACCEPT_PREFIX,
status: false,
},
{
title: `Вы ошиблись разделом сервера`,
content:
`[SIZE=4][CENTER]Приветствую, уважаемый игрок!.[/CENTER]<br><br>` +
`[CENTER][SIZE=4]Вы ошиблись разделом сервера.[/CENTER][/SIZE]<br><br>` +
`[CENTER][SIZE=4]Закрыто.[/SIZE][/CENTER]`,
prefix: UNACCEPT_PREFIX,
status: false,
},
{
title: `Прошло 2 дня с момента выдачи наказания`,
content:
`[SIZE=4][CENTER]Приветствую, уважаемый игрок!.[/CENTER]<br><br>` +
`[CENTER][SIZE=4]Ваша жалоба не может быть рассмотрена по причине несоблюдения обязательного условия:<br>` +
`[QUOTE]3.1. Срок написания жалобы составляет два дня (48 часов) с момента совершенного нарушения со стороны администратора сервера.<br><br>` +
`Примечание: в случае истечения срока жалоба рассмотрению не подлежит.[/QUOTE][/CENTER]<br><br><br>` +
`[CENTER][SIZE=4]Закрыто.[/SIZE][/CENTER]`,
prefix: UNACCEPT_PREFIX,
status: false,
},
{
title: `-------------------------------------------------- Для жалоб на администрацию --------------------------------------------------`,
},
{
title: `Жалоба составлена не по форме`,
content:
`[SIZE=4][FONT=times new roman][CENTER]${greeting},[SIZE=4][FONT=times new roman] уважаемый (ая) ${user.mention}.[/CENTER]<br><br>` +
`[CENTER][SIZE=4][FONT=times new roman]Жалоба составлена не по форме. Внимательно прочитайте правила составления жалобы, которые закреплены в этом разделе. <br><br>` +
`[COLOR=rgb(255, 0, 13)]Закрыто[/COLOR].[/SIZE][/FONT][/CENTER]`,
prefix: UNACCEPT_PREFIX,
status: false,
},
];
$(document).ready(() => {
// Загрузка скрипта для обработки шаблонов
$(`body`).append(
`<script src="https://cdn.jsdelivr.net/npm/handlebars@latest/dist/handlebars.js"></script>`
);
// Добавление кнопок при загрузке страницы
addButton(`На рассмотрении`, `pinned`);
addButton(`Одобрено`, `accepted`);
addButton(`Отказано`, `unaccepted`);
addButton(`Закрыто`, `closed`);
addButton(`Тех специалисту`, `tech`);
addButton(`Рассмотрено`, `watched`);
addButton(`Решено`, `resheno`);
addButton(`Ответы`, `selectAnswer`);
// Поиск информации о теме
const threadData = getThreadData();
$(`button#pinned`).click(() => editThreadData(PIN_PREFIX, true));
$(`button#accepted`).click(() => editThreadData(ACCEPT_PREFIX, false));
$(`button#unaccepted`).click(() => editThreadData(UNACCEPT_PREFIX, false));
$(`button#closed`).click(() => editThreadData(CLOSE_PREFIX, false));
$(`button#tech`).click(() => editThreadData(TECH_PREFIX, true));
$(`button#watched`).click(() => editThreadData(WATCHED_PREFIX, false));
$(`button#resheno`).click(() => editThreadData(RESHENO_PREFIX, false));
$(`button#selectAnswer`).click(() => {
XF.alert(buttonsMarkup(buttons), null, `Выберите ответ:`);
buttons.forEach((btn, id) => {
if (id > 0) {
$(`button#answers-${id}`).click(() =>
pasteContent(id, threadData, true)
);
} else {
$(`button#answers-${id}`).click(() =>
pasteContent(id, threadData, false)
);
}
});
});
});
function addButton(name, id) {
$(`.button--icon--reply`).before(
`<button type="button" class="button rippleButton" id="${id}" style="margin: 3px;">${name}</button>`
);
}
function buttonsMarkup(buttons) {
return `<div class="select_answer">${buttons
.map(
(btn, i) =>
`<button id="answers-${i}" class="button--primary button ` +
`rippleButton" style="margin:5px"><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`);
}
}
async function getThreadData() {
const authorID = $(`a.username`)[0].attributes[`data-user-id`].nodeValue;
const authorName = $(`a.username`).html();
const hours = new Date().getHours();
const greeting =
4 < hours && hours <= 11
? `Доброе утро`
: 11 < hours && hours <= 15
? `Добрый день`
: 15 < hours && hours <= 21
? `Добрый вечер`
: `Доброй ночи`;
return {
user: {
id: authorID,
name: authorName,
mention: `[USER=${authorID}]${authorName}[/USER]`,
},
greeting: 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;
}
})();