Script for appeals for LEGENDA | GREEN

forward-only!

目前為 2023-01-11 提交的版本,檢視 最新版本

// ==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