Neopets Topic Tracker

Highlight visited topics on Neopets forums

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

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

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

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

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

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         Neopets Topic Tracker
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Highlight visited topics on Neopets forums
// @author       Moxsee
// @match        https://www.neopets.com/neoboards/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // Function to get the visited topics from localStorage
    function getVisitedTopics() {
        let visited = localStorage.getItem('neopetsVisitedTopics');
        return visited ? JSON.parse(visited) : [];
    }

    // Function to save visited topics to localStorage
    function saveVisitedTopic(topicId) {
        let visited = getVisitedTopics();
        if (!visited.includes(topicId)) {
            visited.push(topicId);
            localStorage.setItem('neopetsVisitedTopics', JSON.stringify(visited));
        }
    }

    // Function to highlight visited topics
    function highlightVisitedTopics() {
        const visited = getVisitedTopics();
        visited.forEach(topicId => {
            const topicElement = document.querySelector(`a[href*="topic=${topicId}"]`);
            if (topicElement) {
                topicElement.style.backgroundColor = '#E6E6FA'; // Highlight color
                topicElement.style.color = '#000'; // Text color
            }
        });
    }

    // Add an event listener to track when a topic is clicked
    function trackTopicVisit() {
        const topics = document.querySelectorAll('a[href*="topic="]');
        topics.forEach(topic => {
            topic.addEventListener('click', function() {
                const topicId = this.href.match(/topic=(\d+)/)[1]; // Extract the topic ID
                saveVisitedTopic(topicId);
            });
        });
    }

    // Run highlighting and tracking functions when the page loads or changes
    document.addEventListener('DOMContentLoaded', function() {
        highlightVisitedTopics();
        trackTopicVisit();
    });

    // Also observe for dynamically loaded content
    const observer = new MutationObserver(() => {
        highlightVisitedTopics();
        trackTopicVisit();
    });

    observer.observe(document.body, { childList: true, subtree: true });
})();