special for faraway

vk.com/chris_wayne

// ==UserScript==
// @name        special for faraway
// @namespace   https://forum.arizona-rp.com/
// @match       https://forum.arizona-rp.com/*
// @grant       none
// @version     0.2
// @author      Christopher_Wayne vk.com/chris_wayne
// @description vk.com/chris_wayne
// @license MIT
// ==/UserScript==

var buttonname = "ЖБ НО";
var newButtonName = "ЖБ адм";
var settingsButtonName = "Settings";
var version = "0.2";
const RULES_LIST = [
    "2.1. ДМ (Нанесение урона без причины)ᴾᴿᴵᴹ ¹ - ТСР на 1-4 звезды | > 2 раз за 3 д. GUN BAN 7 д.",
    "2.2. ДМ сотрудника полиции или ФБР - ТСР на 3-5 звезд + GUN BAN 1 день | х2 за 5 суток GUN BAN 10 дней.",
    "2.3. ДМ(нанесение урона) в ЗЗᴾᴿᴵᴹ ² - ТСР на 6 звезд | > 2 раз за 3 д. GUN BAN 10 д.",
    "2.4. Массовый ДМ (нанесение урона 3 и более игрокам) - Бан акк + GUN BAN от 1 до 7 дней",
    "2.5. Массовый ДМ в ЗЗ (нанесение урона 3 и более игрокам) - Бан акк + GUN BAN от 1 до 15 дней",
    "2.6. Оружие в ЗЗ (держать в руке) - Изъятие оружия",
    "2.7. Оружие в ЗЗ (целиться) - 10-20 минут деморгана",
    "2.8. Оружие в ЗЗ (стрелять) - 60-120 минут деморгана",
    "2.9. ДБ (Нанесение урона машиной) - 120-240 минут деморгана",
    "2.10. ДБ в ЗЗ - 300 минут деморгана",
    "2.11. Массовое ДБ (нанесение урона 3 и более игрокам машиной) - Бан от 1 до 7 дней",
    "2.12. Массовое ДБ в ЗЗ (нанесение урона 3 и более игрокам машиной) - Бан от 1 до 15 дней",
    "2.13. СК (Нанесение урона игрокам на спавне)ᴾᴿᴵᴹ ³ - Варн",
    "2.14. ТК (Убийство или нанесение более 20 урона игрокам из своей фракции)ᴾᴿᴵᴹ ⁴ - Варн",
    "2.15. ПГ (Изображение из себя супер-героя)ᴾᴿᴵᴹ ⁵ - Варн",
    "2.16. Хил / Броня в боюᴾᴿᴵᴹ ⁶ - 120-180 минут деморгана",
    "2.17. ОФФ / АФК / Инта / Уход в ЗЗ / Аксессуар Шар / Машинка на Р/У от смерти - Варн",
    "2.18. ОФФ / АФК / Вода / Уход в ЗЗ / Инта / Аксессуар Шар / Машинка на Р/У от ареста - Варн",
    "2.19. Рп в свою сторону / Отказ / ОФФ / АФК от РП - Варн",
    "2.20. Отсутствие ответа от игрока, который не участвовал с вами в РП, на вопрос в /do не является отказом от РП. При отсутствии ответа от игрока необходимо повторить вопрос через 60 секунд. При дальнейшем отсутствии ответа необходимо уточнить у игрока в /b чат почему он не отвечает на вопрос.",
    "2.21. Сбив анимации выстрела любым способом(+ц, отводом, перекатом, сбив темпа стрельбы, и.т.п) в человека(исключение: Дм Арена) - 250-300 минут деморгана / Варн",
    "2.22. НонРП расположение переносной лавки(На дорогах,в стенке, точках спавна и так далее) - 20-30 минут деморгана",
    "2.23. НонРП дубинка на терракте - Варн",
    "2.24. НонРП медик - 120 минут деморгана",
    "2.25. НонРП сотр.тюрьмы - 120-400 минут деморгана / Варн",
    "2.26. НонРП на терракте - 120-300 минут деморгана / Варн",
    "2.27. НонРП поведение - 10-120 минут деморганаᴾᴿᴵᴹ ⁷",
    "2.28. Лёгкий багоюз (нонРП фермер и прочее) - 10-30 минут деморгана",
    "2.29. Багоюзᴾᴿᴵᴹ ⁸ - 120-300 минут деморгана / Бан",
    "2.30. Крыша автоᴾᴿᴵᴹ ⁹: - Слап/Кик при повторении",
    "2.31. Крыша палаткиᴾᴿᴵᴹ ⁹ - Слап/Кик при повторении",
    "2.32. Стол в казиноᴾᴿᴵᴹ ⁹ - Слап/Кик при повторении",
    "2.33. Сбив анимаций - 60-180 минут деморгана",
    "2.34. Сбив анимаций в ТСР - Варн",
    "2.35. Попытка избавиться от звезд путем получения деморгана (за крышу авто, стол казино и т.д.) - ТСР 1-6 звезд",
    "2.37. НонРП выполнение квеста - 60-120 минут деморгана",
    "2.38. НонРП/неадекватное название такси - 30-120 минут деморгана",
    "2.39. Серьезные нарушения в ТСР (например: дм, сбив и т.п) - Варн / Увеличение срока",
    "2.40. Неадекватное описание персонажа - Просьба поменять / Очистка описания (при отказе/неоднократно - бан на 2 дня)",
    "2.41. Бредовое описание персонажа - Просьба поменять / Очистка описания (при отказе/неоднократно - бан на 2 дня)",
    "2.41. Описание персонажа, нарушающее РП режим - Просьба поменять / Очистка описания (при отказе/неоднократно - бан на 2 дня)",
    "2.42. Реклама бизнесов, продажа имущества и т.п. через описание персонажа - Просьба поменять / Очистка описания (при отказе/неоднократно - бан на 2 дня)",
    "2.43. Уход от ареста в запрещенные места для проведения арестовᴾᴿᴵᴹ ¹⁰ - Варн игроку,коп который полез на респу арестовывать так же получит варн.",
    "2.44. Соучастие в ДМе(намеренная езда за игроками с целью их убийства вашей компанией) - Наказание как за ДМ",
    "2.45. Использование бага с бегом CJᴾᴿᴵᴹ ¹¹ - На перый раз - деморган 5 минут, дальше - 120 минут деморгана",
    "2.46. Помогать на облаве посторонним лицам(стрелять, дбшить, мешать) - Варн",
    "2.47. Употребление неадекватных выражений, матов, оскорблений, упоминания/оскорбления родных в содержимом стадии AFK - mute 300 / ban 30-2000 дней",
    "2.48. АФК на ДМ Арене в деморгане с целью сокращения срока - Удвоенное наказание/бан на 3 дня",
    "2.49. Угон авто DFT-30, которые используются для перевозки бочек с нефтевышек(машиной механиков, копов) - 400 минут деморгана / Если игрок уже получал деморган за этот пункт, то он получает бан на 5 дней.",
    "2.50. Использовать любые команды для помехи игрокам(также в бою) (Показывать паспорт, piss, kiss, iznas и т.п.) - 60-150 минут деморгана",
    "2.51. Во время каких-либо ивентов на сервере(будь то обновление хеллоуина, новый год, 8 марта и др) запрещено заезжать/залетать на любых транспортных средствах на главную площадь в честь обновления, дабы не создавать помеху игрокам - Кик / при повторном нарушении 30 минут деморгана",
    "2.52. Использование маскировки для мафий не по назначению(Вне организованных рп ситуаций, например просто так одеться, писать в орг чат бред или прост бегать в маскировке потому что захотелось) - Warn",
    "2.53. Запрещён арест на ивентовых зонах.ᴾᴿᴵᴹ 12 - 300 минут деморгана/Warn",
    "2.54. Запрещено использовать команды /iznas и /piss (в гетто и в мафиях) - Warn"
];  

function showNotification(message, color) {
  const notification = $(`<div style="
    position: fixed;
    bottom: 10px;
    right: 10px;
    background-color: ${color};
    color: white;
    padding: 10px 20px;
    border-radius: 5px;
    z-index: 9999;
    font-family: Comic Sans MS, sans-serif;
    font-size: 14px;
  ">${message}</div>`);

  $("body").append(notification);
  setTimeout(() => {
    notification.fadeOut(500, () => notification.remove());
  }, 5000);
}

if (window.location.pathname === "/") {
  const username = $(".p-navgroup-link").text().trim().split("\n")[0];
  showNotification(
    `Приветствую вас, ${username}.<br>Помощник следящих НО для<br>сервера Faraway готов к работе.<br>Версия: ${version}`,
    "green"
  );
}
/////////////////////////////////////////////////////////////////////
function createbuttons() {
  buttonsh_add("Опра момента");
  buttonsh_add("Фулл опра");
  buttonsh_add("Опра принята");
  buttonsh_add("Опра отказана");
  buttonsh_add("Выдам наказание");
}

function createNewButtonList() {
  buttonsh_add("Чит");
  buttonsh_add("Другое");
}
///////////////////////////////////////////////////////////////////////////////////////////////////
window.button_id = 0;
$(".button--icon--reply").after(
  '<input type="button" class="button shabs" value="' +
    buttonname +
    '" id="shabs" style="margin-left: 3px;">'
);
$(".button--icon--reply").after(
  '<input type="button" class="button shabs" value="' +
    newButtonName +
    '" id="newShabs" style="margin-left: 3px;">'
);
$(".button--icon--reply").after(
  '<input type="button" class="button shabs" value="' +
    settingsButtonName +
    '" id="settingsButton" style="margin-left: 3px;">'
);
$(document).ready(function () {
  $("#shabs").click(function () {
    $("div.overlay-container").remove();
    XF.alert(`<div id="shabscontent"></div>`, buttonname);
    createbuttons();
  });
  $("#newShabs").click(function () {
    $("div.overlay-container").remove();
    XF.alert(`<div id="newShabsContent"></div>`, newButtonName);
    createNewButtonList();
  });
  $("#settingsButton").click(function () {
    $("div.overlay-container").remove();
    XF.alert(`<div id="settingsContent"></div>`, settingsButtonName);
    createSettingsMenu();
  });
});
function createSettingsMenu() {
  const initialText = `
    <div style="font-family: Comic Sans MS;">
      <p>Скрипт "special for faraway".</p>
      <p>Версия скрипта: <span style="color: #90EE90;">${version}</span></p>
      <p>Разработчик скрипта: <a href="https://vk.com/chris_wayne" target="_blank" style="color: #AFEEEE;">Christopher_Wayne</a></p>
      <p>Помощник в разработке: <a href="https://vk.com/grsky" target="_blank" style="color: #AFEEEE;">James_Mustang</a></p>
      <p>Скрытие кнопок (галочка - кнопка активна):</p>
      <label><input type="checkbox" id="toggleNesost"> ЖБ НО</label><br>
      <label><input type="checkbox" id="toggleAdm"> ЖБ адм</label><br><br>
      <button id="saveSettings" class="button">Сохранить</button>
    </div>
  `;

  $("#settingsContent").html(initialText);

  $("#toggleNesost").prop("checked", localStorage.getItem("showNesost") !== "false");
  $("#toggleAdm").prop("checked", localStorage.getItem("showAdm") !== "false");

  $("#saveSettings").click(function () {
    const showNesost = $("#toggleNesost").is(":checked");
    const showAdm = $("#toggleAdm").is(":checked");

    localStorage.setItem("showNesost", showNesost);
    localStorage.setItem("showAdm", showAdm);

    toggleButtonVisibility();
    showNotification("Настройки сохранены!", "green");
    $("#exposeMask").click();
  });
}
function toggleButtonVisibility() {
 if (localStorage.getItem("showNesost") === "false") {
    $("#shabs").hide();
  } else {
    $("#shabs").show();
  }

  if (localStorage.getItem("showAdm") === "false") {
    $("#newShabs").hide();
  } else {
    $("#newShabs").show();
  }
}
$(document).ready(function () {
  toggleButtonVisibility();
});
function buttonsh_add(title) {
  const targetContent = $("#shabscontent, #newShabsContent");
  targetContent.append(
    '<input type="button" class="button js-overlayClose" value="' +
      title +
      '" id="shabs_' +
      window.button_id +
      '" style="margin-top: 3px;margin-left: -5px;">'
  );

  $(document).on("click", "#shabs_" + window.button_id, function () {
    let content = "";

    switch (title) {
        case "Опра момента":
            let ffinalText = `[CENTER][FONT=trebuchet ms]Приветствую<br>Опру момента 24ч[/FONT][/CENTER]`;

            $(".fr-element").html(ffinalText);
            $("#exposeMask").click();
          break;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        case "Фулл опра":
            let finalTText = `[CENTER][FONT=trebuchet ms]Приветствую<br>Фулл опру 24ч[/FONT][/CENTER]`;

            $(".fr-element").html(finalTText);
            $("#exposeMask").click();
          break;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        case "Опра принята":
            let fiinalTText = `[CENTER][FONT=trebuchet ms]Приветствую<br>Опра принята[/FONT][/CENTER]`;

            $(".fr-element").html(fiinalTText);
            $("#exposeMask").click();
          break;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      case "Опра отказана":
        content = `<div>
          <label>Причина отказа:</label><br>
          <input type="text" id="inputReason" style="width: 100%; margin-bottom: 10px;"><br>
          <button id="submitReason" class="button js-overlayClose">Добавить</button>
        </div>`;

        XF.alert(content, title);

        $(document).on("click", "#submitReason", function () {
          let reason = $("#inputReason").val();

          if (!reason) {
            showNotification("При создании ответа произошла ошибка:<br>Не добавлена причина отказа", "red");
            return;
          }

          let finalText = `[CENTER][FONT=trebuchet ms]Приветствую<br>Опра отказана<br>${reason}[/FONT][/CENTER]`;

          $(".fr-element").html(finalText);
          $("#exposeMask").click();
        });
        break;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      case "Выдам наказание":
        content = `<div>
          <label>Пункт правил, по которому выдается наказание (список):</label><br>
          <input type="text" id="searchRules" placeholder="Введите ключевые слова для поиска среди списка правил..." style="width: 100%; margin-bottom: 10px;"><br>
          <select id="rulesDropdown" style="width: 100%; margin-bottom: 10px;">
           <option value="">Выбор пункта правил из списка</option>
         </select>
         <label>Пункт правил, по которому выдается наказание (ручной ввод):</label><br>
         <input type="text" id="inputRules" placeholder="Ручной ввод пункта правил..." style="width: 100%; margin-bottom: 10px;"><br>
         <button id="submitManualInput" class="button js-overlayClose">Добавить</button>
       </div>`;

       XF.alert(content, title);

       RULES_LIST.forEach(rule => {
         $("#rulesDropdown").append(new Option(rule, rule));
       });

       $(document).on("input", "#searchRules", function () {
         const searchValue = $(this).val().toLowerCase();
         $("#rulesDropdown").empty().append(new Option("Выбор пункта правил из списка", ""));
    
         RULES_LIST.filter(rule => rule.toLowerCase().includes(searchValue)).forEach(filteredRule => {
           $("#rulesDropdown").append(new Option(filteredRule, filteredRule));
         });
       });

       $(document).on("change", "#rulesDropdown", function () {
         if ($(this).val()) {
           $("#inputRules").val("").prop("disabled", true);
         } else {
        $("#inputRules").prop("disabled", false);
         }
       });

       $(document).on("input", "#inputRules", function () {
         if ($(this).val()) {
           $("#rulesDropdown").val("").prop("disabled", true);
         } else {
           $("#rulesDropdown").prop("disabled", false);
         }
       });

       $(document).on("click", "#submitManualInput", function () {
         let rules = $("#rulesDropdown").val() || $("#inputRules").val();

         if (!rules) {
           showNotification("При создании ответа произошла ошибка:<br>Не добавлен пункт правил", "red");
           return;
         }

         let finalText = `[CENTER][FONT=trebuchet ms]Приветствую<br>Накажу игрока за:<br>${rules}[/FONT][/CENTER]`;

         $(".fr-element").html(finalText);
         $("#exposeMask").click();
       });
       break;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      case "Чит":
        content = `<div>
          <label>Видео-разбор вашего нарушения:</label><br>
          <input type="text" id="inputEvidence" style="width: 100%; margin-bottom: 10px;"><br>
          <label>Текст под хайдом</label><br>
          <input type="text" id="inputHide" style="width: 100%; margin-bottom: 10px;"><br>
          <button id="submitEvidence" class="button js-overlayClose">Добавить</button>
        </div>`;
 
        XF.alert(content, title);
 
        $(document).on("click", "#submitEvidence", function () {
          let evidence = $("#inputEvidence").val();
          let hide = $("#inputHide").val();
 
          if (!evidence) {
            showNotification("При создании ответа произошла ошибка:<br>Не добавлено доказательство нарушения", "red");
            return;
          }
 
          let finalText = `[CENTER][FONT=trebuchet ms]Приветствую<br>Видео-разбор вашего нарушения:<br>${evidence}<br>[USERS=Kalibr Corrigan, Alexei_Alekseev]${hide}[/USERS][/FONT][/CENTER]`;
 
          $(".fr-element").html(finalText);
          $("#exposeMask").click();
        });
        break;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      case "Другое":
        content = `<div>
          <label>Доказательства нарушения (прикрепляем ссылку, строго полный url):</label><br>
          <input type="text" id="inputEvidence" style="width: 100%; margin-bottom: 10px;"><br>
          <button id="submitEvidence" class="button js-overlayClose">Добавить</button>
        </div>`;
 
        XF.alert(content, title);
 
        $(document).on("click", "#submitEvidence", function () {
          let evidence = $("#inputEvidence").val();
 
          if (!evidence) {
            showNotification("При создании ответа произошла ошибка:<br>Не добавлено доказательство нарушения", "red");
            return;
          }
 
          let finalText = `[CENTER][FONT=trebuchet ms]Приветствую<br>Доказательства вашего нарушения: [URL='${evidence}']*тык*[/URL][/FONT][/CENTER]`;
 
          $(".fr-element").html(finalText);
          $("#exposeMask").click();
        });
        break;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      default:
        showNotification("Ошибка вывода ответа №1.<br>Обратитесь к разработчику скрипта.", "red");
    }
  });

  window.button_id++;
}