Greasy Fork is available in English.

Greasy Fork: Mark script discussions as read

Mark feedback on your scripts as read

// ==UserScript==
// @name        Greasy Fork: Mark script discussions as read
// @namespace   xbenpm8g5fr72kx7s3w4
// @match       https://greasyfork.org/*/users/*
// @grant       GM.getValue
// @grant       GM.setValue
// @grant       GM.deleteValue
// @version     1.1
// @description Mark feedback on your scripts as read
// @run-at      document-end
// @inject-into content
// @license     MIT
// ==/UserScript==

(function () {
	"use strict";

	// Get list of discussions
	const context = document.getElementById("user-discussions-on-scripts-written");
	if (!context) {
		return;
	}

	// Get user ID
	const uid = location.pathname.match(/\/users\/(\d+)/);
	if (!uid) {
		return;
	}


	const discussions = context.getElementsByClassName("discussion-list-container");
	const prefKey = "markedReadTime" + uid[1];


	function markDiscussions(seenTime) {
		seenTime = new Date(seenTime);

		checkDiscussions:
		for (const discussion of discussions) {
			const times = discussion.getElementsByTagName("relative-time");

			for (let time of times) {
				time = new Date(time.getAttribute("datetime"));
				if (time > seenTime) {
					// newer datetime found, skip marking this discussion
					continue checkDiscussions;
				}
			}

			// no newer datetime found, mark it
			discussion.style.opacity = "0.3";
		}
	}


	function unmarkDiscussions() {
		for (const discussion of discussions) {
			discussion.style.opacity = "";
		}
	}


	GM.getValue(prefKey).then(seenTime => {
		if (seenTime !== undefined) {
			markDiscussions(seenTime);
		}
	});


	const BTN_MARK = "mark as read";
	const TITLE_MARK = "mark all script discussions as read up to the current point in time";
	const BTN_UNMARK = "clear read status";
	const TITLE_UNMARK = "remove the read indicator on all discussions";


	function setButtonText(btn, marked) {
		if (marked) {
			btn.textContent = BTN_UNMARK;
			btn.title = TITLE_UNMARK;
		} else {
			btn.textContent = BTN_MARK;
			btn.title = TITLE_MARK;
		}
	}

	const markButton = document.createElement("button");
	markButton.type = "button";

	const pageLoad = Math.floor(performance.timeOrigin);
	let marked = false;

	setButtonText(markButton, false);

	markButton.addEventListener("click", function () {
		if (!marked) {
			markDiscussions(pageLoad);
			GM.setValue(prefKey, pageLoad);
		} else {
			unmarkDiscussions();
			GM.deleteValue(prefKey);
		}

		marked = !marked;
		setButtonText(this, marked);
	});

	context.getElementsByTagName("h3")[0].append(" ", markButton);
})();