// ==UserScript==
// @name Script for appeals for LEGENDA | GREEN
// @namespace https://forum.blackrussia.online
// @version 4.0
// @description forward-only!
// @author Jaden Young
// @match https://forum.blackrussia.online/index.php?threads/*
// @include https://forum.blackrussia.online/index.php?threads/
// @icon https://sun6-21.userapi.com/s/v1/ig2/oGqGPWAP3wW3Q13LUoUsJpo9M7yaq9JFQs-_x0Wg9PP1dfihP2Nwgzy4FzxxhVD3M5LEydgQcfni_GqFWZIz10wf.jpg?size=603x604&quality=95&crop=1,0,603,604&ava=1
// @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 = 6; // Prefix that will be set when thread pins
const CLOSE_PREFIX = 10;
const TECH_PREFIX = 7;
const data = await getThreadData(),
greeting = data.greeting,
user = data.user;
const buttonsOverlay = [
{
title: "Ответы с префиксом рассмотрения",
content: "",
},
{
title: "Ответы с отказом",
content: "",
},
{
title: "Поставить префикс",
content: "",
},
];
const buttonsPin = [
{
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,
},
];
const buttonsUnaccept = [
{
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,
},
];
const buttonsPrefix = [
{
title: "На рассмотрении",
content: "",
prefix: PIN_PREFIX,
status: true,
},
{
title: "Одобрено",
content: "",
prefix: ACCEPT_PREFIX,
status: false,
},
{
title: "Отказано",
content: "",
prefix: UNACCEPT_PREFIX,
status: false,
},
{
title: "Закрыто",
content: "",
prefix: CLOSE_PREFIX,
status: false,
},
{
title: "Тех. Специалисту",
content: "",
prefix: TECH_PREFIX,
status: false,
},
];
$(document).ready(() => {
// Загрузка скрипта для обработки шаблонов
$(`body`).append(
`<script src="https://cdn.jsdelivr.net/npm/handlebars@latest/dist/handlebars.js"></script>`,
`<script
src="https://code.jquery.com/jquery-migrate-3.3.1.min.js"
integrity="sha256-APllMc0V4lf/Rb5Cz4idWUCYlBDG3b0EcN1Ushd3hpE="
crossorigin="anonymous"></script>`
);
var styles = `.Folder {
color: #fff;
background: #46597f;
box-shadow: 0 4px 15px 0 rgb(0 0 0 / 20%);
border: none;
border-color: #d15656;
margin: 10px 9px;
height: 100px;
width: 45%;
}
.Answer {
color: #fff;
background: #c83637;
box-shadow: 0 4px 15px 0 rgb(0 0 0 / 20%);
border: none;
background: linear-gradient(#c83637, #a02b2c);
border-color: #d15656;
margin: 10px 9px;
height: 100px;
width: 95%;
}
body.is-modalOpen .overlay-container, body.is-modalOpen .offCanvasMenu {
overflow-y: scroll !important;
}
::-webkit-resizer {
background-repeat: no-repeat;
width: 10px;
height: 0px;
}
::-webkit-scrollbar {
width: 10px;
}
::-webkit-scrollbar-thumb {
-webkit-border-radius: 0px;
border-radius: 0px;
background-color: #993435;
}
::-webkit-scrollbar-track {
background-color: rgb(34,36,43);
}
.blockMessage {
background: #22242b;
}
overlay-title {
background: #31333a;
}
`;
var styleSheet = document.createElement("style");
styleSheet.innerText = styles;
document.head.appendChild(styleSheet);
// Добавление кнопок при загрузке страницы
addButton(`Быстрые ответы`, `buttonAnswers`);
// Поиск информации о теме
const threadData = getThreadData();
$(`button#buttonAnswers`).click(() => {
XF.alert(
buttonsMarkup(buttonsOverlay),
null,
`Выберите подходящую папку с ответами:`
);
buttonsOverlay.forEach((btn, id) => {
if (id === 0) {
$(`button#folders-${id}`).click(() => {
XF.alert(
buttonsMarkupAnswersPin(buttonsPin),
null,
`Выберите подходящий ответ:`
);
buttonsPin.forEach((btn, id) => {
if (id > 0) {
$(`button#answers-${id}`).click(() =>
pasteContentPin(id, threadData, true)
);
} else {
$(`button#answers-${id}`).click(() =>
pasteContentPin(id, threadData, false)
);
}
});
});
} else if (id === 1) {
$(`button#folders-${id}`).click(() => {
XF.alert(
buttonsMarkupAnswersUnaccept(buttonsUnaccept),
null,
`Выберите подходящий ответ:`
);
buttonsUnaccept.forEach((btn, id) => {
if (id > 0) {
$(`button#answers-${id}`).click(() =>
pasteContentUnaccept(id, threadData, true)
);
} else {
$(`button#answers-${id}`).click(() =>
pasteContentUnaccept(id, threadData, false)
);
}
});
});
} else {
$(`button#folders-${id}`).click(() => {
XF.alert(
buttonsMarkupAnswersPrefix(buttonsPrefix),
null,
`Выберите подходящий префикс:`
);
buttonsPrefix.forEach((btn, id) => {
if (id > 0) {
$(`button#answers-${id}`).click(() =>
pasteContentPrefix(id, threadData, true)
);
} else {
$(`button#answers-${id}`).click(() =>
pasteContentPrefix(id, threadData, false)
);
}
});
});
}
});
});
});
function addButton(name, id) {
$(`.button--icon--reply`).before(
`<button type="button" class="button--primary button rippleButton" id="${id}" style="margin: 10px;">${name}</button>`
);
}
function buttonsMarkupAnswersPin(buttonsPin) {
return `${buttonsPin
.map(
(btn, i) =>
`<button id="answers-${i}" class="button button--icon rippleButton rippleButton Answer">` +
`<span class="button-text">${btn.title}</span></button>`
)
.join(``)}</div>`;
}
function buttonsMarkupAnswersUnaccept(buttonsUnaccept) {
return `${buttonsUnaccept
.map(
(btn, i) =>
`<button id="answers-${i}" class="button button--icon rippleButton rippleButton Answer">` +
`<span class="button-text">${btn.title}</span></button>`
)
.join(``)}</div>`;
}
function buttonsMarkupAnswersPrefix(buttonsPrefix) {
return `${buttonsPrefix
.map(
(btn, i) =>
`<button id="answers-${i}" class="button button--icon rippleButton rippleButton Answer">` +
`<span class="button-text">${btn.title}</span></button>`
)
.join(``)}</div>`;
}
function buttonsMarkup(buttonsOverlay) {
return `${buttonsOverlay
.map(
(btn, i) =>
`<button id="folders-${i}" class="button button--icon rippleButton rippleButton Folder">` +
`<span class="button-text">${btn.title}</span></button>`
)
.join(``)}</div>`;
}
function pasteContentPin(id, data = {}, send = false) {
const template = Handlebars.compile(buttonsPin[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(buttonsPin[id].prefix, buttonsPin[id].status);
$(`.button--icon.button--icon--reply.rippleButton`).trigger(`click`);
}
}
function pasteContentUnaccept(id, data = {}, send = false) {
const template = Handlebars.compile(buttonsUnaccept[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(buttonsUnaccept[id].prefix, buttonsUnaccept[id].status);
$(`.button--icon.button--icon--reply.rippleButton`).trigger(`click`);
}
}
function pasteContentPrefix(id, data = {}, send = false) {
editThreadData(buttonsPrefix[id].prefix, buttonsPrefix[id].status);
$(`.button--icon.button--icon--reply.rippleButton`).trigger(`click`);
if (send == true) {
editThreadData(buttonsPrefix[id].prefix, buttonsPrefix[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 <= 17
? `Добрый день`
: 17 < 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;
}
})();
// IT'S NOT FUCKING COPY