Catwar Mark as Unread (with storage)

Добавляет кнопку, позволяющую помечать сообщения.

当前为 2025-02-07 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

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

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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);
        });
    }
})();