Soutong Forum Read Marker

给搜同网站的帖子标题添加已读标识

// ==UserScript==
// @name         Soutong Forum Read Marker
// @namespace    https://felixchristian.dev/userscripts/soutong-read-marker
// @version      1.0.5
// @description  给搜同网站的帖子标题添加已读标识
// @author       FelixChristian
// @license      MIT
// @match        https://soutong.men/forum.php?mod=forumdisplay&fid=*
// @match        https://soutong.men/forum.php?mod=viewthread&tid=*
// @grant        GM_getValue
// @grant        GM_setValue
// ==/UserScript==

(function () {
    'use strict';

    const STORAGE_KEY = 'visitedTids';
    let visitedTids = GM_getValue(STORAGE_KEY, {});

    const url = new URL(location.href);
    const mod = url.searchParams.get('mod');

    if (mod === 'viewthread') {
        const tid = url.searchParams.get('tid');
        if (tid) {
            visitedTids[tid] = Date.now();
            GM_setValue(STORAGE_KEY, visitedTids);
        }
        return;
    }

    if (mod === 'forumdisplay') {
        const tryMark = () => {
            const threadLinks = document.querySelectorAll('a.xst');

            if (threadLinks.length === 0) {
                setTimeout(tryMark, 500);
                return;
            }

            threadLinks.forEach(link => {
                const href = link.getAttribute('href');
                let tid;

                try {
                    const fullUrl = new URL(href, location.origin);
                    tid = fullUrl.searchParams.get('tid');
                } catch (e) {
                    return;
                }

                if (tid && visitedTids[tid] && !link.dataset.markedVisited) {
                    const tag = document.createElement('span');
                    tag.textContent = '[已读] ';
                    tag.style.color = 'red';
                    tag.style.fontWeight = 'bold';
                    tag.style.marginRight = '4px';
                    link.insertBefore(tag, link.firstChild); // ✅ 标记放左边
                    link.dataset.markedVisited = 'true';
                }
            });
        };

        window.addEventListener('load', tryMark);
        const observer = new MutationObserver(tryMark);
        observer.observe(document.body, { childList: true, subtree: true });
    }
})();