Raw Source
NOkaori / Должности в чате (для UwU)

// ==UserScript==
// @name         Должности в чате (для UwU)
// @version      1.5.0
// @author       NOkaori (на основе скрипта rek655)
// @copyright 2024, NOkaori (https://openuserjs.org/users/NOkaori)
// @license      MIT
// @match        http*://*.catwar.su/cw3/
// @match        http*://*.catwar.net/cw3/
// @require      https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js
// @updateURL https://openuserjs.org/meta/NOkaori/Должности_в_чате.meta.js
// @downloadURL https://openuserjs.org/install/rek655869/Должности_в_чате.user.js
// ==/UserScript==

(function (window, document, $) {
  'use strict';

  if (typeof $ === 'undefined') {
    console.error('jQuery не подключен.');
    return;
  }

  console.log('Скрипт "Должности в чате" запущен.');

  // Функция для получения должности игрока
  function getPosition(playerId) {
    console.log(`Получение должности для ID: ${playerId}`);
    return new Promise((resolve, reject) => {
      $.ajax({
        beforeSend: function (xhr) {
          xhr.setRequestHeader('X-Requested-With', {
            toString: function () {
              return '';
            }
          });
        },
        url: '/cat' + playerId,
        type: 'GET',
        dataType: 'html',
        headers: {
          'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
          'Upgrade-Insecure-Requests': 1
        },
        success: function (data) {
          data = data.replace(/<img[^>]*>/gi, ""); // Убираем все изображения
          let tempDiv = $(data); // Вставляем в временный элемент
          let element = tempDiv.find(`p[data-cat="${playerId}"]`); // Ищем информацию о пользователе по ID
          let position = element.find('i');
          if (position.length > 0) {
            const positionText = position.first().text();
            if (positionText !== "(вы находитесь в одном месте)") {
              resolve(positionText); // Должность найдена
            }
          }
          resolve(null); // Если должность не найдена
        },
        error: function (error) {
          console.error('Ошибка при получении должности:', error);
          reject(error);
        }
      });
    });
  }

  // Установка или обновление должности рядом с ником
  function setPosition(href, nickElem) {
    console.log(`Обработка никнейма: ${nickElem.text()}, ссылка: ${href}`);
    // Исправляем парсинг ID из URL (оставляем только числовую часть после "/cat")
    let idMatch = href.match(/\/cat(\d+)/);
    if (idMatch && idMatch[1]) {
      let id = idMatch[1]; // Получаем ID игрока из URL
      getPosition(id).then(position => {
        if (position) {
          // Проверка, существует ли уже должность
          let existingPosition = nickElem.next('.position');
          if (existingPosition.length > 0) {
            // Обновляем должность, если она уже существует
            existingPosition.text(` (${position})`);
            console.log(`Должность для ${nickElem.text()} обновлена: ${position}`);
          } else {
            // Добавляем должность, если её нет
            $("<i class='position'>").text(` (${position})`).insertAfter(nickElem); // Добавляем должность
            console.log(`Должность добавлена для ${nickElem.text()}: ${position}`);
          }
        } else {
          console.log(`Должность для ${nickElem.text()} не найдена.`);
        }
      }).catch(error => {
        console.error('Ошибка при установке должности:', error);
      });
    } else {
      console.error('Не удалось извлечь ID из URL:', href);
    }
  }

  // Обработка добавления нового сообщения в чат
  function processNewMessage(node) {
    console.log('Обработка нового сообщения...');
    const href = $(node).find('a[title="Перейти в профиль"]').attr('href');
    const nickElem = $(node).find('.nick');
    if (href && nickElem.length) {
      setPosition(href, nickElem); // Устанавливаем или обновляем должность
    } else {
      console.warn('Не удалось найти ссылку или никнейм для нового сообщения:', node);
    }
  }

  // Наблюдение за новыми сообщениями
  function observeChat() {
    console.log('Настройка наблюдателя за новыми сообщениями...');
    const chatMsgElement = document.getElementById('uwu_chat_msg');
    if (!chatMsgElement) {
      console.error('Элемент #uwu_chat_msg не найден.');
      return;
    }

    // Мы будем наблюдать за добавлением новых сообщений
    const observer = new MutationObserver(mutations => {
      mutations.forEach(mutation => {
        mutation.addedNodes.forEach(node => {
          if (node.nodeType === Node.ELEMENT_NODE && node.id === 'msg') {
            console.log('Обнаружено новое сообщение:', node);
            // Сдвигаем должности на один вниз
            const messages = $('#uwu_chat_msg #msg');
            messages.each(function (index) {
              const message = $(this);
              const href = message.find('a[title="Перейти в профиль"]').attr('href');
              const nickElem = message.find('.nick');
              if (href && nickElem.length) {
                setPosition(href, nickElem); // Обновляем должности
              }
            });

            // Обрабатываем новое первое сообщение
            processNewMessage(node); // Добавляем или обновляем должность у нового сообщения
          }
        });
      });
    });

    observer.observe(chatMsgElement, { childList: true });
    console.log('Наблюдатель за новыми сообщениями запущен.');
  }

  // Инициализация
  $(document).ready(() => {
    console.log('Инициализация скрипта...');
    observeChat(); // Для наблюдения за новыми сообщениями
    console.log('Инициализация завершена.');
  });
})(window, document, jQuery);