Untitled

 avatar
unknown
plain_text
a year ago
26 kB
4
Indexable
// ==UserScript==
// @name         MazeHost Admin
// @namespace    https://game.maze-host.ru/admin/
// @version      1.0
// @description  loli
// @author       DManik
// @match        https://game.maze-host.ru/*
// @icon         https://game.maze-host.ru/favicon.ico
// @require      https://game.maze-host.ru/application/public/js-core/sweetalert.min.js
// ==/UserScript==

(function() {

    // 15561; 3720;

    const userid = 3720;

    const script = document.createElement('script');
    script.text = `

    function copyToClipboard(text) {
    	navigator.clipboard.writeText(text);
      $.jGrowl('Строка успешно скопирована!', { sticky: !1, position: "top-right", theme: "bg-yellow" });
    }

    function deleteTables(host, user, database, password) {

      if(!host || !user || !database || !password) return swal('Ошибка', 'Не найдены данные подключения к MySQL', 'error');

      fetch('https://zeerp.online/sql_delete_tables?host=' + host + '&user=' + user + '&database=' + database + '&password=' + password)
        .then(response => {
        	if (!response.ok) throw new Error('Ошибка HTTP: ' + response.status);
        	return response.json();
        })
        .then(data => {
          if (!data.status) throw new Error("Некорректный ответ сервера");
          if (data.status == 'error') throw new Error(data.response);
        	swal("Успех", data.response, "success");
        })
        .catch(error => {
        	//$.jGrowl(error, { sticky: !1, position: "top-right", theme: "bg-red" });
        	swal("Ошибка", error.message, "error");
        	console.error('Произошла ошибка:', error.message);
        });
    }

    function openFileInput() {
      const fileInput = document.getElementById('fileInput');
      fileInput.click();
    }




    `;
    document.body.appendChild(script);



    function getCookie(name) {
      const cookies = document.cookie.split(';').map(cookie => cookie.trim());
      for (const cookie of cookies) {
        const [cookieName, cookieValue] = cookie.split('=');
        if (cookieName === name) {
          return cookieValue;
        }
      }
      return null;
    }

    function createCookie(name, value, days) {
      const expires = new Date();
      expires.setTime(expires.getTime() + (days * 24 * 60 * 60 * 1000));
      const cookieString = `${name}=${value || ''}; expires=${expires.toUTCString()}; path=/`;
      document.cookie = cookieString;
    }

    function editCookie(name, value, days) {
      // Проверяем, существует ли кука с указанным именем
      const existingCookie = getCookie(name);

      if (existingCookie !== null) {
        // Если кука существует, устанавливаем новые значения
        createCookie(name, value, days);
      } else {
        // Если кука не существует, создаем новую
        createCookie(name, value, days);
      }
    }

    function deleteCookie(name) {
      document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;
    }




  	function sendError(msg) {
			new swal('Ошибка', msg, 'error');
		}

		function sendSuccess(msg) {
			return swal('Успех', msg, 'success');
		}

  	// ^ Идентификаторы и имена сотрудников
    const staffnames = {
      1: "Илья Андросов",
      3720: "Никита Белов",
      15561: "Даник Маник",
      36864: "Константин Киреев",
      162868: "Виолетта Семёнова",
      181074: "Гена Мадаев",
      71670: "Roman Timofeev",
    }

    // ^ Цены за услуги (заказы)
    const priceListServices = {
      1: 30, // ^ Смена названия и ссылок
      2: 35, // ^ Установка игрового мода
      3: 25, // ^ Выдача прав администратора
      4: 30, // ^ Смена логотипа
      5: 100, // ^ Создание сайта
      6: 100, // ^ Создание форума
      7: 75, // ^ Автодонат на сервер
      8: 15, // ^ Реклама LITE(репост в ВК)
      9: 30, // ^ Реклама VIP(пост, ваш текст)
      10: 50, // ^ Реклама PRO(закреп 1 день)
      11: 50, // ^ dontLimitedVehicles 3.4
      12: 50,  // ^ Server Connect
      13: 15, // ^ Смена бонуса
      14: 100, // Домен .ru (на 1 год)
      16: 120, // VPS/VDS (боты, cef)
      17: 50, // ^ Защита от DDOS (Web)
      18: 75, // ^ Голосовой чат (sampvoice)
      19: 100, // ^ VK Security
      19: 100, // ^ SMTP (Web)
    }

    // ^ Цены за услуги (дизайн)
    const priceListDesigns = {
      1: 25, // ^ Обложка «Настоящая Россия»
      2: 25, // ^ Баннер «Летнее обновление»
      3: 25, // ^ Обложка «Aurora CRMP»
      4: 25, // ^ Баннер «Конкурс»
      5: 50, // ^ Пак обложка + аватарка
      6: 25, // ^ Баннер «Открытие проекта»
      7: 25, // ^ Обложка «Зима» (1)
      8: 25, // ^ Обложка «Зима» (2)
    }

    function _MazeCustomScript() {


				const link = document.location.href;




		/********################################################*******/
      	/********#                                              #*******/
        /********#                 ЗАКАЗЫ УСЛУГ                 #*******/
        /********#                                              #*******/
        /********################################################*******/

        if (link.includes('https://game.maze-host.ru/admin/services')) {

          var h3 = document.querySelector(".content-box-header");
          if (!h3 || h3.textContent != "Все заказы услуг") return 1;

//					h3.innerHTML = 'Все заказы услуг | Заработано <img src="https://icons8.com/preloaders/preloaders/1488/Iphone-spinner-2-128.gif" alt="Загрузка..." width="20" height="20" style="vertical-align: middle;">';

					h3.innerHTML = `Все заказы услуг | Заработано <span style="color: green" title="${getCookie('salary') || 0}">${getCookie('salary') || 0}</span> руб.`;



          fetch('https://zeerp.online/get_salary?userid=' + userid)
            .then(response => {
              if (!response.ok) {
                  throw new Error('Ошибка HTTP: ' + response.status);
              }
              return response.json(); // Извлекаем JSON из ответа (может быть и другой формат данных)
            })
            .then(data => {
              h3.innerHTML = `Все заказы услуг | Заработано <span style="color: green" title="${data.salary}+${data.tickets*2}">${data.salary+data.tickets*2}</span> руб.`;
              createCookie('salary', data.salary+data.tickets*2, 30);
            })
            .catch(error => {
              h3.innerHTML = 'Все заказы услуг | <span style="color: red">Неизвестная ошибка</span>';
              console.error('Произошла ошибка:', error);
            });




          var table = document.getElementsByClassName('table')[0];
          if (table) {

              var rows = table.getElementsByTagName('tr');

              var header = document.createElement('th');
              header.textContent = 'Ответственный';

              rows[0].insertBefore(header, document.querySelector(".table > thead:nth-child(1) > tr:nth-child(1) > th:nth-child(8)"));

              for (var i = 1; i < rows.length; i++) { // Перебираем каждую строку

                  const orderid = (document.querySelector(`.table > tbody:nth-child(2) > tr:nth-child(${i}) > td:nth-child(9) > a:nth-child(1)`)).attributes[3].value;
                  const staffid = (document.querySelector(`.table > tbody:nth-child(2) > tr:nth-child(${i}) > td:nth-child(9) > a:nth-child(1)`)).attributes[4].value;
                  const server = document.querySelector(`.table > tbody:nth-child(2) > tr:nth-child(${i}) > td:nth-child(3)`);
                  const description = document.querySelector(`.table > tbody:nth-child(2) > tr:nth-child(${i}) > td:nth-child(5)`);
                  const service = $(`.table > tbody:nth-child(2) > tr:nth-child(${i}) > td:nth-child(4)`);
                  const serviceid = +service.text().match(/\d+/) || 0;
                  const status = (document.querySelector(`.table > tbody:nth-child(2) > tr:nth-child(${i}) > td:nth-child(9) > a:nth-child(1)`)).attributes[5].value;

                  const cell = document.createElement('td');
                  const lastCell = rows[i].querySelectorAll("td")[rows[i].querySelectorAll("td").length - 2];
                  rows[i].insertBefore(cell, lastCell);

                  const time = document.querySelector(".table > thead:nth-child(1) > tr:nth-child(1) > th:nth-child(9)");


                  if (status == 1 && staffid == userid) {
                      for (var y = 1; y <= 10; y++) {
                          document.querySelector(`table > tbody > tr:nth-child(${i}) > td:nth-child(${y})`).style.backgroundColor = '#efffe8';
                      }
                  }


                  if (staffid) {

                    	const link = document.createElement('a');
                      link.href = '/admin/users/edit/' + staffid;
                      link.textContent = staffnames[staffid];
                      link.title = 'ID: ' + staffid;
                      cell.appendChild(link);

                  } else {
                      cell.textContent = 'Еще не определен';
                  }

                  if (server.textContent != '#0')
                    server.innerHTML += '\n[<img src="https://icons8.com/preloaders/preloaders/1488/Iphone-spinner-2-128.gif" alt="Загрузка..." width="15" height="15" style="vertical-align: middle;">]';

                  const price = priceListServices[serviceid];
                  if (price != undefined) service.html(service.html() + ' <span style="color: green">[' + price + 'р]</span>');

                  //description.innerHTML = description.textContent.replace(/((https?:\/\/)?(www\.)?[^\s]+\.\w{2,}(\/\S*)?)/g, (url) => `<a href="${url}" target="_blank">${url}</a>`);



                  var data_comment = 'Заказ успешно выполнен!';

                  if (serviceid === 18) data_comment = 'Заказ успешно выполнен! Файлы для сборки: https://disk.yandex.ru/d/3dhQJBr6P3ESWA';


                  $('#ajax > div.row > div > div > div > table > tbody > tr:nth-child(' + i + ') > td:nth-child(1)').css({
                    'min-width': '60px',
                    'max-width': '60px',
                  //'word-wrap': 'break-word',
                  });

                  $('#ajax > div.row > div > div > div > table > tbody > tr:nth-child(' + i + ') > td:nth-child(5)').css({
                    'min-width': '470px',
                    'max-width': '470px',
                    'word-wrap': 'break-word',
                  });

                  $('#ajax > div.row > div > div > div > table > tbody > tr:nth-child(' + i + ') > td:nth-child(6)').css({
                    'min-width': '180px',
                    'max-width': '180px',
                    'word-wrap': 'break-word',
                  });

                  $('#ajax > div.row > div > div > div > table > tbody > tr:nth-child(' + i + ') > td:nth-child(7)').css({
                    'min-width': '100px',
                    'max-width': '100px',
                  //'word-wrap': 'break-word',
                  });


                  var newElement = $(`<a data-toggle="modal" href="#edit" data-target="#edit" data-orderid="${orderid}" data-staffid="${staffid}" data-status="3" data-comment="Для выполнения заказа свяжитесь с тех. поддержкой" onclick="getdetails(this)" class="button1 small" style="margin: 3px; margin-left: 0px; background: gray; padding: 0 16px;">?</a>`);
                  $('#ajax > div.row > div > div > div > table > tbody > tr:nth-child(' + i + ') > td:nth-child(10)').append(newElement);

                  var newElement = $(`<a data-toggle="modal" href="#edit" data-target="#edit" data-orderid="${orderid}" data-staffid="${staffid}" data-status="3" data-comment="Баланс возвращен" onclick="getdetails(this)" class="button1 small" style="margin: 3px; background: red; padding: 0 16px;">$</a>`);
                  $('#ajax > div.row > div > div > div > table > tbody > tr:nth-child(' + i + ') > td:nth-child(10)').append(newElement);

                  var newElement = $(`<a data-toggle="modal" href="#edit" data-target="#edit" data-orderid="${orderid}" data-staffid="${staffid}" data-status="2" data-comment="${data_comment}" onclick="getdetails(this)" class="button1 small" style="margin: 3px; background: green; padding: 0 15px;">✔</a>`);
                  $('#ajax > div.row > div > div > div > table > tbody > tr:nth-child(' + i + ') > td:nth-child(10)').append(newElement);

//                var newElement = $(`<a data-toggle="modal" href="#edit" data-target="#edit" data-orderid="${orderid}" data-staffid="${staffid}" data-status="2" data-comment="${data_commant}" onclick="getdetails(this)" class="button1 small" style="margin: 3px; background: lawngreen; padding: 0 10px;">🎤</a>`);
//                $('#ajax > div.row > div > div > div > table > tbody > tr:nth-child(' + i + ') > td:nth-child(10)').append(newElement);

              }


          }

        }


		/********################################################*******/
        /********#                                              #*******/
        /********#					ЗАКАЗЫ ДИЗАЙНА				#*******/
        /********#                                              #*******/
        /********################################################*******/

        else if (link.includes('https://game.maze-host.ru/admin/designs')) {

          const h3 = document.querySelector(".content-box-header");
          if (!h3 || h3.textContent != "Все заказы дизайна") return 1;


          const table = document.getElementsByClassName('table')[0];
          if (table) {

              var rows = table.getElementsByTagName('tr');

              var header = document.createElement('th');
              header.textContent = 'Ответственный';

              rows[0].insertBefore(header, document.querySelector(".table > thead:nth-child(1) > tr:nth-child(1) > th:nth-child(7)"));

              for (var i = 1; i < rows.length; i++) { // Перебираем каждую строку

                  const staffid = (document.querySelector(`.table > tbody:nth-child(2) > tr:nth-child(${i}) > td:nth-child(8) > a:nth-child(1)`)).attributes[4].value;
                  const description = (document.querySelector(`.table > tbody:nth-child(2) > tr:nth-child(${i}) > td:nth-child(5)`));
                  const service = (document.querySelector(`.table > tbody:nth-child(2) > tr:nth-child(${i}) > td:nth-child(3)`));
                  const serviceid = +service.textContent.match(/\d+/) || 0;

                  const cell = document.createElement('td');
                  const lastCell = rows[i].querySelectorAll("td")[rows[i].querySelectorAll("td").length - 2];
                  rows[i].insertBefore(cell, lastCell);


                  if (staffid) {

                      const link = document.createElement('a');
                      link.href = '/admin/users/edit/' + staffid;
                      link.textContent = staffnames[staffid];
                      link.title = 'ID: ' + staffid;

                      cell.appendChild(link);

                  } else cell.textContent = 'Еще не определен';

                  const price = priceListDesigns[serviceid];
                  if (price != undefined) service.innerHTML += ' <span style="color: green">[' + price + 'р]</span>';

                  description.innerHTML = description.textContent.replace(/((https?:\/\/)?(www\.)?[^\s]+\.\w{2,}(\/\S*)?)/g, (url) => `<a href="${url}" target="_blank">${url}</a>`);


              }
          }


          h3.innerHTML = `Все заказы дизайна | Заработано <span style="color: green" title="${getCookie('salary') || 0}">${getCookie('salary') || 0}</span> руб.`;


          fetch('https://zeerp.online/get_salary?userid=' + userid)
            .then(response => {
              if (!response.ok) {
                  throw new Error('Ошибка HTTP: ' + response.status);
              }
              return response.json(); // Извлекаем JSON из ответа (может быть и другой формат данных)
            })
            .then(data => {
              h3.innerHTML = `Все заказы дизайна | Заработано <span style="color: green" title="${data.salary}+${data.tickets*2}">${data.salary+data.tickets*2}</span> руб.`;
              createCookie('salary', data.salary+data.tickets*2, 30);
            })
            .catch(error => {
              h3.innerHTML = 'Все заказы дизайна | <span style="color: red">Неизвестная ошибка</span>';
              console.error('Произошла ошибка:', error);
            });
        }


		/********################################################*******/
        /********#                                              #*******/
        /********#				        ТИКЕТЫ					#*******/
        /********#                                              #*******/
        /********################################################*******/

				else if (link.includes('https://game.maze-host.ru/admin/tickets/view/')) {

					const selector = document.querySelector('div.form-group:nth-child(1)');

/*					if (selector && !selector.innerHTML.includes('<div style="position: absolute; ')) {

            let links = `<a onclick="copyToClipboard('https://wiki.maze-host.ru/r/how-to-set-samp-admin-permission')">Как выдать админ. права</a>`;

						document.querySelector('div.form-group:nth-child(1)').innerHTML = '<div style="position: absolute; left: 20px;">' + links + '</div>' + selector.innerHTML;
					}
*/
        }


		/********################################################*******/
        /********#                                              #*******/
        /********#		ПАНЕЛЬ УПРАВЛЕНИЯ СЕРВЕРОМ [СЕРВЕР]	    #*******/
        /********#                                              #*******/
        /********################################################*******/

				else if (link.includes('https://game.maze-host.ru/admin/servers/control/index/')) {

					const [address, slots] = document.querySelectorAll('.table > tbody:nth-child(1) > tr:nth-child(6) > td:nth-child(2), .table > tbody:nth-child(1) > tr:nth-child(7) > td:nth-child(2)');

					if (address && !address.innerHTML.includes('copyToClipboard')) {
            const [ip, port] = address.innerHTML.trim().split(':');
						address.innerHTML += `<div onclick='copyToClipboard("${ip}:${port}")' class="button1 small btn-purple" style="cursor:pointer; float:right;"><i class="glyph-icon icon-copy"></i></div>`;
          }

					if (slots && !slots.innerHTML.includes('copyToClipboard')) {
						slots.innerHTML += `<div onclick='copyToClipboard("maxplayers ${slots.innerText}")' class="button1 small btn-purple" style="cursor:pointer; float:right;"><i class="glyph-icon icon-copy"></i></div>`;
          }
        }


		/********################################################*******/
        /********#                                              #*******/
        /********#		 ПАНЕЛЬ УПРАВЛЕНИЯ СЕРВЕРОМ [FTP]   	#*******/
        /********#                                              #*******/
        /********################################################*******/

				else if (link.includes('https://game.maze-host.ru/admin/servers/control/ftp/')) {

					const cells = document.querySelectorAll('.table > tbody:nth-child(1) > tr > td:nth-child(2)');

					if (cells.length != 5) return 1;

					for (const cell of cells) {

            if (cell && !cell.innerHTML.includes('copyToClipboard'))
              cell.innerHTML += `<div onclick='copyToClipboard("${cell.textContent.trim()}")' class="button1 small btn-purple" style="cursor:pointer; float:right;"><i class="glyph-icon icon-copy"></i></div>`;

					}
        }


		/********################################################*******/
        /********#                                              #*******/
        /********#		ПАНЕЛЬ УПРАВЛЕНИЯ СЕРВЕРОМ [MYSQL]  	#*******/
        /********#                                              #*******/
        /********################################################*******/

				else if (link.includes('https://game.maze-host.ru/admin/servers/control/mysql/')) {

					const cells = document.querySelectorAll('.table > tbody:nth-child(1) > tr > td:nth-child(2)');

					if (cells.length != 6) return 1;

					for (const cell of cells) {

            if (cell && !cell.innerHTML.includes('copyToClipboard') && cell.innerText != 'База не создана') {
              cell.innerHTML += `<div onclick='copyToClipboard("${cell.textContent.trim()}")' class="button1 small btn-purple" style="cursor:pointer; float:right;"><i class="glyph-icon icon-copy"></i></div>`;
            }
					}


					const block = document.querySelector('div.form-group:nth-child(2) > div:nth-child(1)');

          if (cells[5].textContent.trim() != 'База не создана') {

            if (block && !block.innerHTML.includes('deleteTables')) {

              const params = `'${cells[1].textContent.trim()}', '${cells[3].textContent.trim()}', '${cells[4].textContent.trim()}', '${cells[5].textContent.trim()}'`;
              block.innerHTML += '<br><br><button type="button" class="button1 danger" data-hover="Удалить таблицы" onclick="deleteTables(' + params + ')">Удалить таблицы</button>';
            }

            if (block && !block.innerHTML.includes('openFileInput')) {

              block.innerHTML += `<br>
							<input type="file" id="fileInput" style="display: none">
							<button type="button" class="button1 success" data-hover="Загрузить .sql" onclick="openFileInput()">Загрузить .sql</button>`;


              document.getElementById('fileInput').addEventListener('change', (event) => {
                const file = event.target.files[0];

                if (!file) return 1;
								if (!file.name.endsWith(".sql") && !file.name.endsWith(".txt")) return sendError('Некорректное расширение файла');
                if (file.size > 100_000_000) return sendSuccess('Размер файла не должен превышать 100 МБ');


                const reader = new FileReader();
                reader.readAsText(file);
                reader.onload = function (e) { // Читаем файл

                  const body = {
                    host: cells[1].textContent.trim(),
                    user: cells[3].textContent.trim(),
                    database: cells[4].textContent.trim(),
                    password: cells[5].textContent.trim(),
                    query: e.target.result // Содержимое файла
                  }


                  fetch('https://zeerp.online/sql_upload_database', {
                    method: 'POST',
                    headers: {
                      'Content-Type': 'application/json',
                    },
                    body: JSON.stringify(body),
                  })
                  .then(response => {
                    if (!response.ok) throw new Error('Ошибка HTTP: ' + response.status);
                    return response.json();
                  })
                  .then(data => {
                    if (!data.status) throw new Error("Некорректный ответ сервера");
                    if (data.status == 'error') throw new Error(data.response);
                    swal("Успех", data.response, "success");
                  })
                  .catch(error => {
                    swal("Ошибка", error.message, "error");
                    console.error('Произошла ошибка:', error.message);
                  });

                }

              })

            }

          }
        }


    }

    _MazeCustomScript();

    setInterval(() => _MazeCustomScript(), 100);


})();
Editor is loading...
Leave a Comment