NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==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);