Tech

Для борьбы с техническими шоколадками

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         Tech 
// @namespace    https://wh10919.web1.maze-host.ru/index.php
// @version      1.2.0
// @description  Для борьбы с техническими шоколадками
// @author       tech10
// @match        https://wh10919.web1.maze-host.ru/index.php*
// @include      https://wh10919.web1.maze-host.ru/index.php
// @grant        none
// @license 	 MIT
// @collaborator Basis of Antonio Carrizo and consultant Rosenfeld
// @icon https://icons.iconarchive.com/icons/thesquid.ink/free-flat-sample/128/support-icon.png
// @copyright 2024, MIDDLE RP
// ==/UserScript==
(function () {
  'use strict';
const UNACCEPT_PREFIX = 4; // Prefix that will be set when thread closes
const ACCEPT_PREFIX = 6; // Prefix that will be set when thread solved
const PIN_PREFIX = 2; // Prefix that will be set when thread pins
const COMMAND_PREFIX = 10; // Prefix that will be set when thread send to project team
const WATCHED_PREFIX = 9;
const CLOSE_PREFIX = 7;
const buttons = [
	{
	  title: 'Приветствие',
	  content:
		'[CENTER]{{ greeting }}, уважаемый игрок![B][/B][/CENTER]<br><br>' +
        '[CENTER][/CENTER]'
	},
	{
	  title: 'Правила раздела',
	  content:
		'[CENTER]{{ greeting }}, уважаемый игрок![B][/B][/CENTER]<br><br>' +
		"[CENTER]Пожалуйста, убедительная просьба, ознакомиться с назначением данного раздела в котором Вы создали тему, так как Ваш запрос никоим образом не относится к технической проблеме.[/CENTER]<br><br>" +
        '[CENTER] [Color=red]Отказано, закрыто.[/CENTER]',
 
        status: false,
	},
{
	  title: 'Сервер не отвечает',
	  content:
	  '[CENTER]{{ greeting }}, уважаемый игрок![B][/B][/CENTER]<br><br>' +
	    "[CENTER]Если у Вас встречаются такие проблемы, как «Сервер не отвечает», не отображаются сервера в лаунчере, не удаётся выполнить вход на сайт/форум, попробуйте совершить следующие действия: <br><br>" +
	    "[LEFT]• Сменить IP-адрес любыми средствами; <br>" +
   "[LEFT]• Переключиться на Wi-Fi/мобильный интернет или на любую доступную сеть; <br>"+
    "[LEFT]• Использование VPN; <br>"+
    "[LEFT]• Перезагрузка роутера.<br><br>" +
 
"[CENTER]Если методы выше не помогли, то переходим к следующим шагам: <br><br>" +
 
  '[LEFT]1. Устанавливаем приложение «1.1.1.1: Faster & Safer Internet» Ссылка: https://clck.ru/ZP6Av и переходим в него.<br>'+
  '[LEFT]2. Соглашаемся со всей политикой приложения.<br>'+
  '[LEFT]3. Нажимаем на ползунок и ждем, когда текст изменится на «Подключено».<br>'+
  '[LEFT]4. Проверяем: Отображаются ли серверы? Удается ли выполнить вход в игру? Работают ли другие источники (сайт, форум)? <br><br>' +
 
  "[CENTER]📹 Включение продемонстрировано на видео: https://youtu.be/Wft0j69b9dk <br><br>" +
	    '[CENTER] [color=#00FF00]Рассмотрено.[/CENTER]',
	},
	{
	  title: 'Форма темы',
	  content:
		'[CENTER]{{ greeting }}, уважаемый игрок![B][/B][/CENTER]<br><br>' +
		"[CENTER]Пожалуйста, заполните форму, создав новую тему: <br>[CODE]01. Ваш игровой никнейм:<br>02. Сервер, на котором Вы играете:<br>03. Суть Вашей возникшей проблемы (описать максимально подробно и раскрыто): <br>04. Любые скриншоты, которые могут помочь в решении проблемы (если таковые имеются):<br>05. Дата и время произошедшей технической проблемы (постарайтесь указать максимально точно):[/CODE]<br><br>" +
		'[CENTER] [color=red]Отказано, закрыто.[/CENTER]',
	},
{
	  title: 'Восстановление аккаунта',
	  content:
		'[CENTER]{{ greeting }}, уважаемый игрок![B][/B][/CENTER]<br><br>' +
		"[CENTER]Если Вы обезопасили Ваш аккаунт и [U]привязали его к почте[/U], то сбросить пароль или пин-код Вы всегда сможете при вводе пароля на сервере. Выберите кнопку «восст», затем выберите нужные Вам функции.<br><br>" +
        "[CENTER]Если Вы [U]не обезопасили свой аккаунт - его невозможно вернуть[/U]. Игрок самостоятельно несет отвественность за безопаность своего аккаунта. Аккаунт будет заблокирован навсегда.<br><br>" +
        '[CENTER]К сожалению, иногда решение подобных вопросов требует много времени. Надеемся, что Вы сможете восстановить доступ к аккаунту! [color=#00FF00] Рассмотрено.[/CENTER]',
	},
{
	  title: 'Слетел аккаунт',
	  content:
        '[CENTER]{{ greeting }}, уважаемый игрок![B][/B][/CENTER]<br><br>' +
        "[CENTER]Аккаунт не может пропасть или аннулироваться просто так. Даже если Вы меняете ник, используете кнопки «починить игру» или «сброс настроек» - Ваш аккаунт не удаляется. Система работает иначе.<br><br>" +
        "[CENTER]Проверьте ввод своих данных: пароль, никнейм и сервер. Зачастую игроки просто забывают ввести актуальные данные и считают, что их аккаунт был удален. Будьте внимательны! Рассмотрено.<br><br>" +
        '[CENTER]Как ввести никнейм (на случай, если сменили в игре, но не поменяли в клиенте): https://youtu.be/c8rhVwkoFaU[/CENTER]'
	},
    {
	  title: 'Проблема будет исправлена',
	  content:
		'[CENTER]{{ greeting }}, уважаемый игрок![B][/B][/CENTER]<br><br>' +
		"[CENTER]Данная недоработка будет проверена и исправлена. Спасибо, ценим Ваш вклад.<br><br>" +
		'[CENTER] [color=#00FF00]Рассмотрено.[/CENTER]',
	},
	{
	  title: 'Известно о проблеме',
	  content:
		'[CENTER]{{ greeting }}, уважаемый игрок![B][/B][/CENTER]<br><br>' +
		"[CENTER]Команде проекта уже известно о данной проблеме, она обязательно будет рассмотрена и исправлена. Спасибо за Ваше обращение!<br><br>" +
		'[CENTER] [color=red]Закрыто.[/CENTER]',
	},
  {
	  title: 'Передано на тестирование',
	  content:
		'[CENTER]{{ greeting }}, уважаемый игрок![B][/B][/CENTER]<br><br>' +
		"[CENTER]Благодарим за уведомление о недоработке. Ваша тема  находится в процессе тестирования.<br><br>" +
		'[CENTER] [color=orange]На рассмотрении.[/CENTER]',
	},
	{
	  title: 'Команде проекта',
	  content:
		'[CENTER]{{ greeting }}, уважаемый игрок![B][/B][/CENTER]<br><br>' +
		"[CENTER]Ваша тема закреплена и находится на рассмотрении. Пожалуйста, ожидайте выноса вердикта команды проекта.<br><br>" +
		'[CENTER]Создавать новые темы с данной проблемой — не нужно, ожидайте ответа в данной теме. Если проблема решится - Вы всегда можете уведомить нас о ее решении.[/CENTER]',
	},
	{
	  title: 'Логировщику',
	  content:
	   '[CENTER]{{ greeting }}, уважаемый игрок![B][/B][/CENTER]<br><br>' +
	    "[CENTER]Ваша тема закреплена и находится на проверке и выявление недоработки. Пожалуйста, ожидайте ответа в данной теме.<br><br>" +
	    '[CENTER]Создавать новые темы с данной проблемой — не нужно.[/CENTER]',
	},
	{
	  title: 'Компенсация',
	  content:
		'[CENTER]{{ greeting }}, уважаемый игрок![B][/B][/CENTER]<br><br>' +
		"[CENTER]Ваше игровое имущество/денежные средства будут восстановлены в течение месяца. Убедительная просьба, не менять никнейм до момента восстановления.<br><br>" +
        '[CENTER]Для активации восстановления используйте команды: /roulette, /recovery.[/CENTER]<br><br>' +
		'[CENTER] [color=#00FF00]Решено.[/CENTER]',
	},
	{
	  title: 'Нет доказательств',
	  content:
		'[CENTER]{{ greeting }}, уважаемый игрок![B][/B][/CENTER]<br><br>' +
		"[CENTER]Без доказательств (в частности скриншоты или видео) – решить проблему не получится. Если доказательства найдутся - создайте новую тему, приложив доказательства с фото-хостинга yapx.ru или imgur.com<br><br>" +
		'[CENTER] [color=red]Отказано, закрыто.[/CENTER]',
	},
    	{
	  title: 'Правила восстановления',
	  content:
		'[CENTER]{{ greeting }}, уважаемый игрок![B][/B][/CENTER]<br><br>' +
		"[CENTER]Пожалуйста, убедительная просьба, ознакомьтесь с правилами восстановлений: http://wh10919.web1.maze-host.ru/index.php?threads/Правила-восстановления-игровых-ценностей.100/unread. Вы создали тему, которая никоим образом не относится к технической проблеме. Имущество не будет восстановлено.[/CENTER]<br><br>" +
		'[CENTER] [color=red]Отказано, закрыто.[/CENTER]',
	},
    {
	  title: 'Хочу стать администратором',
	  content:
		'[CENTER]{{ greeting }}, уважаемый игрок![B][/B][/CENTER]<br><br>' +
		"[CENTER]Команда технических специалистов не решает назначение на какую-либо должность, которая присутствует на проекте. Для этого существуют заявления в главном разделе Вашего игрового сервера, где Вы можете ознакомиться с открытыми должностями и формами подач. Приятной игры и желаем удачи в карьерной лестнице!<br><br>" +
		'[CENTER] [color=red]Закрыто.[/CENTER]',
	},
    {
	  title: 'Жалобы на технического специалиста',
	  content:
		'[CENTER]{{ greeting }}, уважаемый игрок![B][/B][/CENTER]<br><br>' +
		'[CENTER]Вы получили наказание от технического специалиста Вашего сервера. Вам следует обратиться в раздел «Жалобы на технических специалистов» — в случае, если Вы не согласны с наказанием.<br><br>' +
        '[CENTER]Ссылка на раздел, где можно оформить жалобу на технического специалиста: http://wh10919.web1.maze-host.ru/index.php?forums/Жалобы-на-Технических-Специалистов.14/' +
        '[CENTER][color=red]Закрыто.[/CENTER]'
	},
    	{
	  title: 'ППВ+',
	  content:
		'[CENTER]{{ greeting }}, уважаемый игрок![B][/B][/CENTER]<br><br>' +
		"[CENTER]Аккаунт будет заблокирован по причине Продан/Передан/Взломан(П/П/В)[/CENTER]<br><br>" +
		'[CENTER][COLOR=chartreuse] [color=#00FF00]Одобрено![COLOR=red] Закрыто.[/CENTER]',
	},
       	{
	  title: 'ППВ-',
	  content:
		'[CENTER]{{ greeting }}, уважаемый игрок![B][/B][/CENTER]<br><br>' +
		"[CENTER] Продажи/Передачи/Взлома не найдено(П/П/В)[/CENTER]<br><br>" +
		'[CENTER][COLOR=red]Отказано![COLOR=red] Закрыто.[/CENTER]',
	},
   	{
	  title: 'Сборка+',
	  content:
		'[CENTER]{{ greeting }}, уважаемый игрок![B][/B][/CENTER]<br><br>' +
		"[CENTER] Игрок будет наказан по пункту:[/CENTER]<br><br>" +
		"[CENTER]2.22. Запрещено хранить / использовать / распространять стороннее программное обеспечение или любые другие средства, позволяющие получить преимущество над другими игроками | Ban 15 - 30 дней / PermBan[/CENTER]<br><br>" +
        "[CENTER]Примечание: запрещено внесение любых изменений в оригинальные файлы игры.[/CENTER]<br><br>" +
        "[CENTER]Исключение: разрешено изменение шрифта, его размера и длины чата (кол-во строк).[/CENTER]<br><br>" +
        '[CENTER][COLOR=#00FF00]Одобрено![COLOR=red] Закрыто.[/CENTER]',
	},
    {
	  title: 'Сборки -',
	  content:
		'[CENTER]{{ greeting }}, уважаемый игрок![B][/B][/CENTER]<br><br>' +
		"[CENTER]Сборки не найдено не найдено[/CENTER]<br><br>" +
		'[CENTER][COLOR=red]Отказано![COLOR=red] Закрыто.[/CENTER]',
	},
   	{
	  title: 'ППИВ+',
	  content:
		'[CENTER]{{ greeting }}, уважаемый игрок![B][/B][/CENTER]<br><br>' +
		"[CENTER] Игрок будет наказан по пункту:[/CENTER]<br><br>" +
		"[CENTER]2.28. Запрещена покупка/продажа внутриигровой валюты в любых ее проявлениях за реальные деньги | PermBan с обнулением аккаунта + ЧС проекта[/CENTER]<br><br>" +
        "[CENTER]Примечание: любые попытки покупки/продажи, попытки поинтересоваться о ней у другого игрока и прочее - наказуемы.[/CENTER]<br><br>" +
        "[CENTER]Исключение: официальная покупка через сайт.[/CENTER]<br><br>" +
        '[CENTER][COLOR=#00FF00]Одобрено![COLOR=red] Закрыто.[/CENTER]',
	 prefix: ACCEPT_PREFIX,
            status:false,
        },
{
title: 'Известно КП',
content:
		'[CENTER]{{ greeting }}, уважаемый игрок![B][/B][/CENTER]<br><br>' +
		"[CENTER]Команде проекта уже известно о данной проблеме, она обязательно будет рассмотрена и исправлена. Спасибо за Ваше обращение!<br><br>" +
		'[CENTER][color=red]Закрыто. [/CENTER]',
	prefix: CLOSE_PREFIX,
	status: false,
},
{
title: 'Актуально?',
content: '[CENTER][B]{{ greeting }}![/B][/CENTER]<br><br>' +
"[CENTER]Ваше обращение актуально?",
    prefix: PIN_PREFIX,
	status: true,
},
{
title: 'Отсутствие ответа',
content:
'[CENTER]{{ greeting }}, уважаемый игрок![B][/B][/CENTER]<br><br>' +
"[CENTER]По техническими соображениям было принято решение закрыть данное обращение.<br><br>" +
"[CENTER] Пожалуйста, если данная проблема все ещё актуальна, оставьте новую заявку в данном разделе." +
'[CENTER][color=red]Закрыто. [/CENTER]',
	prefix: CLOSE_PREFIX,
	status: false,
},
{
	  title: 'Ответ от ТЕСТЕРОВ',
	  content:
		'[CENTER]{{ greeting }}, уважаемый игрок![B][/B][/CENTER]<br><br>' +
		'[CENTER]Ответ от тестерского отдела дан выше. <br><br>' +
        '[CENTER][color=red]Закрыто. [/CENTER]',
	prefix: CLOSE_PREFIX,
	status: false,
	},
        {
	  title: 'КП без закрепа',
	  content:
		'[CENTER]{{ greeting }}, уважаемый игрок![B][/B][/CENTER]<br><br>' +
		'[CENTER]Ваша тема перадана команде проекта. <br><br>' +
        '[CENTER][color=#00FF00]Рассмотрено. [/CENTER]',
	prefix: WATCHED_PREFIX,
	status: false,
},
{
	  title: 'Передано Куратору Техов / Руководству Техов',
	  content:
		'[CENTER]{{ greeting }}, уважаемый игрок![B][/B][/CENTER]<br><br>' +
		'[CENTER]Ваша тема закреплена и ожидает вердикта моего руководства. <br><br>' +
                '[CENTER]Создавать подобные темы не нужно. <br><br>' +
        '[CENTER][color=#FFD700]На рассмотрении. [/CENTER]',
	prefix: WATCHED_PREFIX,
	status: false,
},
{
	  title: 'На рассмотрении',
	  content:
		'[CENTER]{{ greeting }}, уважаемый игрок![B][/B][/CENTER]<br><br>' +
		'[CENTER]Ваша тема взята на рассмотрение, ожидайте ответ в ближайшее время <br><br>' +
                '[CENTER]Часто рассмотрение темы может занять определенное время. <br><br>' +
        '[CENTER][color=orange]На рассмотрении.[/CENTER]',
	prefix: WATCHED_PREFIX,
	status: false,
},
];
$(document).ready(() => {
// Загрузка скрипта для обработки шаблонов
$('body').append('<script src="https://cdn.jsdelivr.net/npm/handlebars@latest/dist/handlebars.js"></script>');
 
// Добавление кнопок при загрузке страницы
addButton('Ответы', 'selectAnswer');
 
 
// Поиск информации о теме
const threadData = getThreadData();
 
$('button#unaccept').click(() => editThreadData(UNACCEPT_PREFIX, false));
$('button#pin').click(() => editThreadData(PIN_PREFIX, true));
$('button#accepted').click(() => editThreadData(ACCEPT_PREFIX, false));
$('button#teamProject').click(() => editThreadData(COMMAND_PREFIX, true));
$('button#watched').click(() => editThreadData(WATCHED_PREFIX, false));
$('button#closed').click(() => editThreadData(CLOSE_PREFIX, false));
 
$(`button#selectAnswer`).click(() => {
  XF.alert(buttonsMarkup(buttons), null, 'Добавьте ответ:');
  buttons.forEach((btn, id) => {
	$(`button#answers-${id}`).click(() => pasteContent(id, threadData));
  });
});
});
 
 
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 = {}) {
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');
}
 
// Приветствие и время суток
function getThreadData() {
const authorID = $('a.username')[0].attributes['data-user-id'].nodeValue;
const authorName = $('a.username').html();
const hours = new Date().getHours();
return {
  user: {
	id: authorID,
	name: authorName,
	mention: `[USER=${authorID}]${authorName}[/USER]`,
  },
  greeting: () =>
	4 < hours && hours <= 11
	  ? 'Доброе утро'
	  : 11 < hours && hours <= 17
	  ? 'Добрый день'
	  : 17 < hours && hours <= 23
	  ? 'Добрый вечер'
	  : 'Доброй ночи',
};
}
 
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,
            discussion_open: 1,
			sticky: 1,
			_xfToken: XF.config.csrf,
			_xfRequestUri: document.URL.split(XF.config.url.fullBase)[1],
			_xfWithData: 1,
			_xfResponseType: 'json',
		  }),
		}).then(() => location.reload());
	}
	if(prefix == UNACCEPT_PREFIX || prefix == ACCEPT_PREFIX || prefix == CLOSE_PREFIX || prefix == WATCHED_PREFIX) {
		moveThread(prefix, 230);
	}
}
 
function moveThread(prefix, type) {
// Перемещение темы в раздел окончательных ответов
const threadTitle = $('.p-title-value')[0].lastChild.textContent;
 
fetch(`${document.URL}move`, {
  method: 'POST',
  body: getFormData({
	prefix_id: prefix,
	title: threadTitle,
	target_node_id: type,
	redirect_type: 'none',
	notify_watchers: 1,
	starter_alert: 1,
	starter_alert_reason: "",
	_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;
  }
})();