您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Добавляет кнопку, позволяющую помечать сообщения.
// ==UserScript== // @name Catwar Mark as Unread (with storage) // @namespace https://catwar.net/ // @version 1.2 // @description Добавляет кнопку, позволяющую помечать сообщения. // @match https://catwar.net/* // @grant none // ==/UserScript== (function() { 'use strict'; // Функция для получения номера текущей страницы из URL function getCurrentPage() { const urlParams = new URLSearchParams(window.location.search); return parseInt(urlParams.get('page') || '1', 10); } // Считаем из localStorage список помеченных ID для каждой страницы function getMarkedMessagesForPage(page) { const stored = JSON.parse(localStorage.getItem('markedMessages') || '{}'); return stored[page] || []; } // Сохраняем состояние помеченных сообщений для каждой страницы function saveMarkedMessagesForPage(page, messages) { const stored = JSON.parse(localStorage.getItem('markedMessages') || '{}'); stored[page] = messages; localStorage.setItem('markedMessages', JSON.stringify(stored)); } // Логика работы с сообщениями после загрузки страницы window.addEventListener('load', () => { const currentPage = getCurrentPage(); let markedMessages = getMarkedMessagesForPage(currentPage); // Функция сохранения актуального состояния function saveState() { saveMarkedMessagesForPage(currentPage, markedMessages); } // После загрузки страницы ищем все строки с классом .msg_read const rows = document.querySelectorAll('tr.msg_read'); rows.forEach(row => { // Ищем ID сообщения const delBtn = row.querySelector('.del, .msg_open'); if (!delBtn) { return; } const msgID = delBtn.dataset.id; if (!msgID) { return; } // Если ID уже в списке помеченных, красим фон в желтый if (markedMessages.includes(msgID)) { row.style.backgroundColor = 'yellow'; } // Создаем кнопку переключения const toggleBtn = document.createElement('button'); toggleBtn.textContent = markedMessages.includes(msgID) ? 'Снять пометку' : 'Пометить'; // Логика переключения toggleBtn.addEventListener('click', () => { // Если строка НЕ закрашена желтым => помечаем if (row.style.backgroundColor !== 'yellow') { row.style.backgroundColor = 'yellow'; markedMessages.push(msgID); toggleBtn.textContent = 'Снять пометку'; } else { // Иначе (если уже желтая) => снимаем пометку row.style.backgroundColor = ''; markedMessages = markedMessages.filter(id => id !== msgID); toggleBtn.textContent = 'Пометить'; } saveState(); // Обновляем состояние в localStorage }); // Вставляем кнопку в последнюю ячейку const lastTd = row.querySelector('td:last-of-type'); if (lastTd) { lastTd.appendChild(document.createTextNode(' ')); // пробел lastTd.appendChild(toggleBtn); } }); }); // Добавление обработчика события для изменения страницы (в форме выбора страницы) const pageSelect = document.querySelector('#page'); if (pageSelect) { pageSelect.addEventListener('change', () => { // При изменении страницы сохраняем актуальное состояние const currentPage = getCurrentPage(); let markedMessages = getMarkedMessagesForPage(currentPage); saveMarkedMessagesForPage(currentPage, markedMessages); }); } })();