您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Скрипт для ГС/ЗГС ГОСС/ОПГ
// ==UserScript== // @name Ulyanovsk | Скрипт для ГС/ЗГС // @namespace /// // @version 1.0 // @description Скрипт для ГС/ЗГС ГОСС/ОПГ // @author Dimitry_Walter // @match https://forum.blackrussia.online/threads/* // @include https://forum.blackrussia.online/threads/ // @icon https://icons.iconarchive.com/icons/custom-icon-design/flatastic-7/256/Highlightmarker-blue-icon.png // @grant none // @license none // ==/UserScript== (async function () { `use strict`; const UNACCEPT_PREFIX = 4; // Префикс отказана const ACCEPT_PREFIX = 8; // Префикс одобрено const PIN_PREFIX = 2; // Префикс закрепляет const WATCHED_PREFIX = 9; const CLOSE_PREFIX = 7; const data = await getThreadData(), greeting = data.greeting, user = data.user; const buttons = [ { title: `На рассмотрении`, content: `[SIZE=4][FONT=georgia][CENTER]${greeting}, уважаемый(ая) ${user.mention}.<br>` + `Ваша жалоба взята на рассмотрение.<br>` + `Пожалуйста, ожидайте ответа.<br>`+ `[COLOR=orange]На рассмотрении...[/color][/CENTER][/FONT][/SIZE]`, prefix: PIN_PREFIX, status: true, }, { title: `Проведена беседа`, content: ` [SIZE=4][FONT=georgia][CENTER]${greeting}, уважаемый(ая) ${user.mention}.<br>` + `С лидером будет проведена профилактическая беседа.<br>` + `[COLOR=green]Одобрено[/color], закрыто.[/CENTER][/FONT][/SIZE]`, prefix: ACCEPT_PREFIX, status: false, }, { title: `Получит наказание`, content: `[SIZE=4][FONT=georgia][CENTER]${greeting}, уважаемый(ая) ${user.mention}.<br>` + `Лидер получит соответствующее наказание<br>` + `[COLOR=green]Одобрено[/color], закрыто.[/CENTER][/FONT][/SIZE]`, prefix: ACCEPT_PREFIX, status: false, }, { title: `Жалоба не по форме`, content: `[SIZE=4][FONT=georgia][CENTER]${greeting}, уважаемый(ая) ${user.mention}.<br><br>` + "Жалоба составлена не по форме. Внимательно прочитайте правила составления жалобы, которые закреплены в этом разделе. <br><br>" + `[COLOR=red]Отказано[/color], закрыто.[/CENTER][/FONT][/SIZE]`, prefix: CLOSE_PREFIX, status: false, }, { title: `В раздел ЖБ на сотрудников`, content: `[SIZE=4][FONT=georgia][CENTER]${greeting}, уважаемый(ая) ${user.mention}.<br><br>` + `Вы ошиблись разделом,пожалуйста напишите свою жалобу в раздел «Жалобы на сотрудников»<br>` + `[COLOR=red]Отказано[/color], закрыто.[/CENTER][/FONT][/SIZE]`, prefix: CLOSE_PREFIX, status: false, }, { title: ` Не является ЛД`, content: `[SIZE=4][FONT=georgia][CENTER]${greeting}, уважаемый(ая) ${user.mention}.<br><br>` + `Данный игрок не является лидером фракции.<br>` + `[COLOR=red]Отказано[/color], закрыто.[/CENTER][/FONT][/SIZE]`, prefix: CLOSE_PREFIX, status: false, }, { title: `Лидер будет снят`, content: `[SIZE=4][FONT=georgia][CENTER]${greeting}, уважаемый(ая) ${user.mention}.<br><br>` + `Лидер будет снят со своего поста.<br>` + `[COLOR=green]Одобрено[/color], закрыто.[/CENTER][/FONT][/SIZE]`, prefix: CLOSE_PREFIX, status: false, }, { title: `Недостаточно доков`, content:`[SIZE=4][FONT=georgia][CENTER]${greeting}, уважаемый(ая) ${user.mention}.<br><br>` + `Недостаточно доказательств, которые потверждают нарушение.<br>`+ `Если у вас есть дополнительные доказательства, которые могут помочь в рассмотрении жалобы - создайте новую тему, прикрепив их.<br>`+ `[COLOR=red]Отказано[/color], закрыто.[/CENTER][/FONT][/SIZE]`, prefix: UNACCEPT_PREFIX, status: false, }, { title: `Нет нарушения ЛД`, content:`[SIZE=4][FONT=georgia][CENTER]${greeting}, уважаемый(ая) ${user.mention}.<br><br>` + `Исходя из выше приложенных доказательств, нарушений со стороны лидера нет.<br>`+ `Если у вас есть дополнительные доказательства, которые могут помочь в рассмотрении жалобы - создайте новую тему, прикрепив данные док-ва.<br>`+ `[COLOR=red] Отказано[/color],закрыто. [/CENTER][/FONT][/SIZE]`, prefix: UNACCEPT_PREFIX, status: false, }, { title: `Опра вне фотохостинга`, content:`[CENTER][SIZE=4][FONT=georgia]${greeting}, уважаемый(ая) ${user.mention}.<br><br>`+ "Внимательно прочитайте тему «[URL=`https://forum.blackrussia.online/index.php?threads/Правила-подачи-жалоб-на-лидеров.2639616/`]Правила подачи жалоб на лидеров[/URL]»<br><br>"+ "Также следует обратить внимание на данный пункт правил:[QUOTE]3.6 Прикрепление доказательств обязательно.Примечание: загрузка доказательств в соц. сети (ВКонтакте, instagram) запрещается, доказательства должны быть загружены на фото/видео хостинги (YouTube, Япикс, imgur).[/QUOTE]"+ `[COLOR=red]Отказано[/color], закрыто.[/FONT][/SIZE][/CENTER]`, prefix: UNACCEPT_PREFIX, status: false, }, { title: `Ошибка разделом`, content:`[SIZE=4][FONT=georgia][CENTER]${greeting}, уважаемый(ая) ${user.mention}.<br><br>` + `Ваше обращение не имеет отношения к данному форумному разделу.<br>`+ `Возможно, вы ошиблись форумным разделом.<br>`+ `[COLOR=red]Отказано[/color], закрыто.[/CENTER][/FONT]<br><br>`, prefix: UNACCEPT_PREFIX, status:false, }, ]; $(document).ready(() => { // Загрузка скрипта для работы шаблонов $(`body`).append(`<script src="https://cdn.jsdelivr.net/npm/handlebars@latest/dist/handlebars.js"></script>`); // Добавление кнопок при загрузке страницы addButton(`На рассмотрение`, `pin`); addButton(`Одобрено`, `accepted`); addButton(`Отказано`, `unaccept`); addButton(`Ответы`, `selectAnswer`); // Поиск информации о теме const threadData = getThreadData(); $(`button#pin`).click(() => editThreadData(PIN_PREFIX, true)); $(`button#accepted`).click(() => editThreadData(ACCEPT_PREFIX, false)); $(`button#unaccept`).click(() => editThreadData(UNACCEPT_PREFIX, false)); $(`button#selectAnswer`).click(() => { XF.alert(buttonsMarkup(buttons), null, `Выберите ответ:`); buttons.forEach((btn, id) => { if (id > 2) { $(`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; } })();