labels panel

labels panel from catliife

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

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

Tendrás que instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Tendrás que instalar una extensión como Tampermonkey antes de poder instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==UserScript==
// @name         labels panel
// @namespace    http://tampermonkey.net/
// @version      2025-01-19
// @description  labels panel from catliife
// @author       me
// @match        https://worldcats.ru/play/
// @match        https://worldcats.ru/play/?v=b
// @match        https://catlifeonline.com/play/
// @match        https://catlifeonline.com/play/?v=b
// @icon         https://www.google.com/s2/favicons?sz=64&domain=catlifeonline.com
// @grant        none
// ==/UserScript==

// Создаем контейнер для интерфейса
var mapUI = document.createElement('div');
mapUI.style.position = 'fixed';
mapUI.style.top = '10px';
mapUI.style.right = '80px';
mapUI.style.zIndex = '9999';
mapUI.style.background = 'rgba(0,0,0,0.7)';
mapUI.style.padding = '10px';
mapUI.style.borderRadius = '5px';
mapUI.style.color = 'white';
mapUI.style.fontFamily = 'Arial';
mapUI.style.width = '300px';
mapUI.style.display = 'none';

// Кнопка для показа/скрытия панели
var toggleBtn = document.createElement('button');
toggleBtn.textContent = 'Метки';
toggleBtn.style.position = 'fixed';
toggleBtn.style.top = '10px';
toggleBtn.style.right = '80px';
toggleBtn.style.zIndex = '9998';
toggleBtn.style.padding = '5px 10px';
toggleBtn.style.background = '#3498db';
toggleBtn.style.border = 'none';
toggleBtn.style.borderRadius = '3px';
toggleBtn.style.cursor = 'pointer';

toggleBtn.onclick = function() {
  mapUI.style.display = mapUI.style.display === 'none' ? 'block' : 'none';
};

document.body.appendChild(toggleBtn);

// Заголовок и кнопка закрытия
var header = document.createElement('div');
header.style.display = 'flex';
header.style.justifyContent = 'space-between';
header.style.alignItems = 'center';
header.style.marginBottom = '15px';

var title = document.createElement('h3');
title.textContent = 'Панель меток';
title.style.margin = '0';

var closeBtn = document.createElement('button');
closeBtn.textContent = '×';
closeBtn.style.background = 'transparent';
closeBtn.style.border = 'none';
closeBtn.style.color = 'white';
closeBtn.style.fontSize = '20px';
closeBtn.style.cursor = 'pointer';
closeBtn.style.padding = '0 5px';

closeBtn.onclick = function() {
  mapUI.style.display = 'none';
};

header.appendChild(title);
header.appendChild(closeBtn);
mapUI.appendChild(header);

// Секция для ввода названия
var nameSection = document.createElement('div');
nameSection.style.marginBottom = '10px';

var nameLabel = document.createElement('label');
nameLabel.textContent = 'Название локации:';
nameLabel.style.display = 'block';
nameLabel.style.marginBottom = '5px';

var nameInput = document.createElement('input');
nameInput.type = 'text';
nameInput.id = 'wcNameInput';
nameInput.placeholder = 'Введите название';
nameInput.style.width = '100%';
nameInput.style.padding = '5px';

nameSection.appendChild(nameLabel);
nameSection.appendChild(nameInput);
mapUI.appendChild(nameSection);

// Секция для ввода локации
var locSection = document.createElement('div');
locSection.style.marginBottom = '15px';

var locLabel = document.createElement('label');
locLabel.textContent = 'ID локации:';
locLabel.style.display = 'block';
locLabel.style.marginBottom = '5px';

var locInput = document.createElement('input');
locInput.type = 'text';
locInput.id = 'wcLocationInput';
locInput.placeholder = 'Введите ID';
locInput.style.width = '100%';
locInput.style.padding = '5px';

locSection.appendChild(locLabel);
locSection.appendChild(locInput);
mapUI.appendChild(locSection);

// Кнопки для меток
var btnContainer = document.createElement('div');
btnContainer.style.display = 'flex';
btnContainer.style.flexWrap = 'wrap';
btnContainer.style.gap = '5px';
btnContainer.style.marginBottom = '10px';

var btnResource = createButton('Ресурсы', '#2ecc71');
var btnDanger = createButton('Опасность', '#e74c3c');
var btnCustom = createButton('Своя метка', '#9b59b6');
var btnDelete = createButton('Удалить', '#e74c3c');

btnContainer.appendChild(btnResource);
btnContainer.appendChild(btnDanger);
btnContainer.appendChild(btnCustom);
btnContainer.appendChild(btnDelete);
mapUI.appendChild(btnContainer);// Кнопка для просмотра всех меток
var btnShowAll = createButton('Все метки', '#f39c12');
btnShowAll.style.marginTop = '10px';
mapUI.appendChild(btnShowAll);

// Блок для отображения информации
var infoDiv = document.createElement('div');
infoDiv.id = 'wcMarkerInfo';
infoDiv.style.marginTop = '15px';
infoDiv.style.padding = '10px';
infoDiv.style.background = 'rgba(255,255,255,0.1)';
infoDiv.style.borderRadius = '5px';
mapUI.appendChild(infoDiv);// Добавляем контейнер в документ
document.body.appendChild(mapUI);

// Функция создания кнопки
function createButton(text, color) {
  var btn = document.createElement('button');
  btn.textContent = text;
  btn.style.background = color;
  btn.style.border = 'none';
  btn.style.padding = '5px 10px';
  btn.style.borderRadius = '3px';
  btn.style.cursor = 'pointer';
  btn.style.flex = '1 1 auto';
  return btn;
}

// Загружаем сохраненные метки
var savedMarkers = loadMarkers();

// Функция загрузки меток
function loadMarkers() {
  try {
    var savedData = localStorage.getItem('wcMarkers');
    return savedData ? JSON.parse(savedData) : {};
  } catch (e) {
    console.error('Ошибка загрузки меток:', e);
    return {};
  }
}

// Функция сохранения меток
function saveMarkers() {
  try {
    localStorage.setItem('wcMarkers', JSON.stringify(savedMarkers));
    return true;
  } catch (e) {
    console.error('Ошибка сохранения меток:', e);
    return false;
  }
}

// Функция для добавления метки
function addMarker(type, color) {
  var locId = document.getElementById('wcLocationInput').value.trim();
  var name = document.getElementById('wcNameInput').value.trim();

  if (!locId) return alert('Введите ID локации!');
  if (!name) return alert('Введите название локации!');

  var details = prompt('Описание для метки "' + type + '":', type);
  if (details === null) return;

  if (type === 'Своя метка') {
    color = prompt('Цвет метки (HEX, например #ff0000):', color);
    if (color === null) return;
  }

  savedMarkers[locId] = {
    type: type,
    color: color,
    name: name,
    text: details,
    date: new Date().toLocaleString()
  };

  if (!saveMarkers()) {
    return alert('Ошибка сохранения! Возможно, закончилось место.');
  }

  alert('✅ Метка добавлена на локацию ' + locId + '!');
}

// Функция для удаления метки
function deleteMarker() {
  var locId = document.getElementById('wcLocationInput').value.trim();
  if (!locId) return alert('Введите ID локации!');

  if (!savedMarkers[locId]) return alert('Метка не найдена!');

  if (confirm('Удалить метку для локации ' + locId + '?')) {
    delete savedMarkers[locId];
    if (saveMarkers()) {
      alert('Метка удалена!');
    } else {
      alert('Ошибка при удалении!');
    }
  }
}

// Обработчики для кнопок
btnResource.onclick = function() { addMarker('Ресурсы', '#2ecc71'); };
btnDanger.onclick = function() { addMarker('Опасность', '#e74c3c'); };
btnCustom.onclick = function() { addMarker('Своя метка', '#9b59b6'); };
btnDelete.onclick = deleteMarker;

// Функция для показа всех меток
btnShowAll.onclick = showAllMarkers;

// Переменная для хранения текущего окна меток
var currentMarkersWindow = null;

function showAllMarkers() {
  // Закрываем предыдущее окно, если оно есть
  if (currentMarkersWindow) {
    document.body.removeChild(currentMarkersWindow);
  }

  currentMarkersWindow = document.createElement('div');
  currentMarkersWindow.style.position = 'fixed';
  currentMarkersWindow.style.top = '50%';
  currentMarkersWindow.style.left = '50%';
  currentMarkersWindow.style.transform = 'translate(-50%, -50%)';
  currentMarkersWindow.style.background = 'rgba(0,0,0,0.9)';
  currentMarkersWindow.style.padding = '20px';
  currentMarkersWindow.style.borderRadius = '5px';
  currentMarkersWindow.style.zIndex = '10000';
  currentMarkersWindow.style.width = '80%';
  currentMarkersWindow.style.maxWidth = '600px';
  currentMarkersWindow.style.maxHeight = '80vh';
  currentMarkersWindow.style.overflow = 'hidden';
  currentMarkersWindow.style.color = 'white';
  currentMarkersWindow.style.boxShadow = '0 0 20px rgba(0,0,0,0.5)';// Заголовок
  var header = document.createElement('div');
  header.style.display = 'flex';
  header.style.justifyContent = 'space-between';
  header.style.alignItems = 'center';header.style.marginBottom = '15px';

  var title = document.createElement('h3');
  title.textContent = 'Все метки (' + Object.keys(savedMarkers).length + ')';
  title.style.margin = '0';

  var closeBtn = document.createElement('button');
  closeBtn.textContent = '×';
  closeBtn.style.background = 'transparent';
  closeBtn.style.border = 'none';
  closeBtn.style.color = 'white';
  closeBtn.style.fontSize = '20px';
  closeBtn.style.cursor = 'pointer';
  closeBtn.style.padding = '0 5px';

  closeBtn.onclick = function() {
    document.body.removeChild(currentMarkersWindow);
    currentMarkersWindow = null;
  };

  header.appendChild(title);
  header.appendChild(closeBtn);
  currentMarkersWindow.appendChild(header);

  // Контейнер для списка меток
  var markersContainer = document.createElement('div');
  markersContainer.style.maxHeight = 'calc(80vh - 100px)';
  markersContainer.style.overflowY = 'auto';
  markersContainer.style.paddingRight = '10px';

  // Добавляем прокрутку колесиком мыши
  markersContainer.addEventListener('wheel', function(e) {
    this.scrollTop += e.deltaY;
  });

  if (Object.keys(savedMarkers).length === 0) {
    var emptyMsg = document.createElement('div');
    emptyMsg.textContent = 'Нет сохраненных меток';
    emptyMsg.style.textAlign = 'center';
    emptyMsg.style.padding = '20px';
    emptyMsg.style.color = '#aaa';
    markersContainer.appendChild(emptyMsg);
  } else {
    // Сортируем метки по дате (новые сверху)
    var sortedMarkers = Object.entries(savedMarkers).sort((a, b) => {
      return new Date(b[1].date) - new Date(a[1].date);
    });

    sortedMarkers.forEach(([locId, marker]) => {
      var markerElement = createMarkerElement(locId, marker);
      markersContainer.appendChild(markerElement);
    });
  }

  currentMarkersWindow.appendChild(markersContainer);
  document.body.appendChild(currentMarkersWindow);
}

// Функция создания элемента метки
function createMarkerElement(locId, marker) {
  var markerDiv = document.createElement('div');
  markerDiv.style.marginBottom = '15px';
  markerDiv.style.padding = '10px';
  markerDiv.style.background = 'rgba(255,255,255,0.1)';
  markerDiv.style.borderRadius = '5px';
  markerDiv.style.borderLeft = '4px solid ' + marker.color;
  markerDiv.style.position = 'relative';

  var locSpan = document.createElement('div');
  locSpan.textContent = 'ID: ' + locId;
  locSpan.style.fontWeight = 'bold';

  var nameSpan = document.createElement('div');
  nameSpan.textContent = 'Название: ' + marker.name;
  nameSpan.style.marginTop = '5px';

  var typeSpan = document.createElement('div');
  typeSpan.textContent = 'Тип: ' + marker.type;
  typeSpan.style.marginTop = '5px';

  var textSpan = document.createElement('div');
  textSpan.textContent = 'Описание: ' + marker.text;
  textSpan.style.marginTop = '5px';
  textSpan.style.fontStyle = 'italic';

  var dateSpan = document.createElement('div');
  dateSpan.textContent = 'Дата: ' + marker.date;
  dateSpan.style.marginTop = '5px';
  dateSpan.style.fontSize = '0.8em';
  dateSpan.style.color = '#ccc';

  // Кнопка удаления
  var deleteBtn = document.createElement('button');
  deleteBtn.textContent = 'Удалить';
  deleteBtn.style.position = 'absolute';
  deleteBtn.style.top = '10px';
  deleteBtn.style.right = '10px';
  deleteBtn.style.background = '#e74c3c';
  deleteBtn.style.border = 'none';
  deleteBtn.style.padding = '3px 8px';
  deleteBtn.style.borderRadius = '3px';
  deleteBtn.style.cursor = 'pointer';

  deleteBtn.onclick = function() {
    if (confirm('Удалить метку для локации ' + locId + '?')) {
      delete savedMarkers[locId];
      if (saveMarkers()) {
        markerDiv.style.opacity = '0.5';
        markerDiv.style.transition = 'opacity 0.3s';
        setTimeout(function() {markerDiv.remove();
          updateMarkersCount();
        }, 300);
      }
    }
  };markerDiv.appendChild(locSpan);
  markerDiv.appendChild(nameSpan);
  markerDiv.appendChild(typeSpan);
  markerDiv.appendChild(textSpan);
  markerDiv.appendChild(dateSpan);
  markerDiv.appendChild(deleteBtn);

  return markerDiv;
}

// Обновление счетчика меток
function updateMarkersCount() {
  if (!currentMarkersWindow) return;

  var title = currentMarkersWindow.querySelector('h3');
  if (title) {
    title.textContent = 'Все метки (' + Object.keys(savedMarkers).length + ')';
  }
}