Kemono Party Blacklist

Blacklists posts by Creator ID

// ==UserScript==
// @name         Kemono Party Blacklist
// @namespace    https://MeusArtis.ca
// @version      2.0.2
// @author       Meus Artis
// @description  Blacklists posts by Creator ID
// @icon         https://www.google.com/s2/favicons?domain=kemono.cr
// @match        https://coomer.st/*/user/*
// @match        https://coomer.st/artists*
// @match        https://coomer.st/account/favorites/*
// @match        https://coomer.st/posts*
// @match        https://kemono.cr/*/user/*
// @match        https://kemono.cr/artists*
// @match        https://kemono.cr/account/favorites/*
// @match        https://kemono.cr/dms*
// @match        https://kemono.cr/posts*
// @require      https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_registerMenuCommand
// @license      CC BY-NC-SA 4.0
// @run-at       document-end
// ==/UserScript==
(function () {
    const styleSheet = document.createElement("style");
    const styles = `.creator__blacklist{color:#ddd;font-weight:700;text-shadow:#000 0 0 3px,#000 -1px -1px 0px,#000 1px 1px 0;background-color:transparent;border:transparent}.user-header__blacklist{box-sizing:border-box;font-weight:700;color:#fff;text-shadow:#000 0 0 3px,#000 -1px -1px 0px,#000 1px 1px 0;background-color:transparent;border:transparent;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}`;
    document.head.appendChild(styleSheet);
    styleSheet.innerText = styles;
    styleSheet.type = "text/css";
    if (GM_getValue("Blacklist") === undefined) {
        const BlacklistStorage = window.localStorage.getItem("blacklist");
        if (BlacklistStorage) {
            try {
                alert("Migrating Blacklist to GreaseMonkey storage");
                const OldBlacklist = JSON.parse(BlacklistStorage);
                const NewBlacklist = Array.isArray(OldBlacklist)
                    ? OldBlacklist.filter(id => typeof id === "string" && id.length > 0)
                    : [];
                GM_setValue("Blacklist", NewBlacklist.join(','));
                if (confirm("Migration complete! Remove old localStorage entry?")) {
                    window.localStorage.removeItem("blacklist");
                    console.log("LocalStorage Blacklist removed");
                } else {
                    console.log("LocalStorage Blacklist retained");
                }
            } catch (e) {
                console.error("Migration failed:", e);
                alert("Error migrating Blacklist, Creating a new one");
                GM_setValue("Blacklist", "");
            }
        } else {
            alert("Blacklist does not exist, creating a new one");
            GM_setValue("Blacklist", "");
        }
    }
    function getBlacklist() {
        return GM_getValue("Blacklist", "").split(',').filter(Boolean);
    }
    function saveBlacklist(list) {
        GM_setValue("Blacklist", list.join(','));
    }
    let Blacklisted = getBlacklist();
    function applyBlacklist() {
        Blacklisted.forEach((item) => {
            $(`article[data-user='${item}']`).css({ display: "none" });
            $(`a[data-id='${item}']`).css({ display: "none" });
            $(`article.dm-card header a[href='/patreon/user/${item}']`).closest("article").css({ display: "none" });
        });
    }
    function setupBlacklistButtons() {
        const HeadMetaPost = document.querySelector("meta[name='user']");
        const HeadMetaArtist = document.querySelector("meta[name='artist_name']");
        const HeadMetaID = HeadMetaPost ? HeadMetaPost.getAttribute("content") : null;
        const HeadMetaArtistID = document.querySelector("meta[name='id']").getAttribute("content");
        const ButtonArea = document.querySelector('.post__actions');
        const ButtonAreaArtist = document.querySelector('.user-header__actions');
        const BlacklistButton = document.createElement("BUTTON");
        BlacklistButton.classList.add("creator__blacklist");
        BlacklistButton.type = "button";
        if (HeadMetaID) {
            const isBlacklisted = Blacklisted.includes(HeadMetaID);
            BlacklistButton.innerHTML = isBlacklisted
                ? '<span class="creator__blacklist-icon">⛒</span><span>Blacklisted</span>'
                : '<span class="creator__blacklist-icon">⛔</span><span>Blacklist</span>';
            BlacklistButton.onclick = () => {
                Blacklisted = getBlacklist();
                if (isBlacklisted) {
                    Blacklisted = Blacklisted.filter(id => id !== HeadMetaID);
                    console.log("Creator Unblacklisted");
                } else {
                    Blacklisted.push(HeadMetaID);
                    console.log("Creator Blacklisted");
                }
                saveBlacklist(Blacklisted);
                history.back();
            };
            if (ButtonArea) {
                console.log("Post Page");
                ButtonArea.appendChild(BlacklistButton);
            }
        } else {
            const isBlacklisted = Blacklisted.includes(HeadMetaArtistID);
            BlacklistButton.innerHTML = isBlacklisted
                ? '<span class="creator__blacklist-icon">⛒</span><span>Blacklisted</span>'
                : '<span class="creator__blacklist-icon">⛔</span><span>Blacklist</span>';
            BlacklistButton.onclick = () => {
                Blacklisted = getBlacklist();
                if (isBlacklisted) {
                    Blacklisted = Blacklisted.filter(id => id !== HeadMetaArtistID);
                    console.log("Creator Unblacklisted");
                } else {
                    Blacklisted.push(HeadMetaArtistID);
                    console.log("Creator Blacklisted");
                }
                saveBlacklist(Blacklisted);
                history.back();
            };
            if (ButtonAreaArtist) {
                console.log("Artist Page");
                ButtonAreaArtist.appendChild(BlacklistButton);
            }
        }
    }
    function observeUrlChange(callback) {
        let lastUrl = location.href;
        new MutationObserver(() => {
            const currentUrl = location.href;
            if (currentUrl !== lastUrl) {
                lastUrl = currentUrl;
                callback();
            }
        }).observe(document.body, { childList: true, subtree: true });
    }
    function initializeScript() {
        setTimeout(() => {
            Blacklisted = getBlacklist();
            applyBlacklist();
            setupBlacklistButtons();
        }, 333);
    }
    function donate() {
        window.open("https://ko-fi.com/meusartis", '_blank')
    }
    GM_registerMenuCommand("Donate", donate);
    window.addEventListener("DOMContentLoaded", initializeScript);
    observeUrlChange(initializeScript);
})();