您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
forward-only!
当前为
// ==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