AIdungeon Tag Blacklist

Get those scenarios outta here!

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name         AIdungeon Tag Blacklist
// @namespace    AIDTagBlacklist
// @version      1.1
// @description  Get those scenarios outta here!
// @author       pitaden
// @match        https://play.aidungeon.io/main/*
// @grant        none
// ==/UserScript==

/*
some ideas for me to implement later, maybe:

add a "hard" blacklist, which replaces the desc with "This scenario was blocked due to hard blacklist" or removes the scenario from the list entirely
    sometimes, you don't even want to see what the tag is

add a whitelist, if a scenario has a normal blacklisted tag and a whitelisted tag, it will stay unblocked.
    the scenario will still be blocked for hard blacklist tags.

make an interface in-browser so you don't have to fuck with code to make this work
    the problem is... how the fuck does website design work. how do I do this.
    could try to copy AIdungeon's scenario tagging screen? somehow?

now that I sorta know how javascript works: rewrite ALLLL of this code.
*/

(function() {
    'use strict';

    // full block means the scenario is removed entirely, as if it was never there
    // if it's false, it replaces the scenario with grey text that shows why it was blocked
    var fullBlock = true;

    var blockedTags = [
        "smut",
        "femboy",
        "monstergirl",
        "monster girl",
        "monster girls",
        "monsterboy",
        "monster boy",
        "monster boys",
        "femdom",
        "meme",
        "incest",
        "nnn",
        "milf",
        "dilf",
        "gilf",
        "age gap",
        "age difference",
        "sugar daddy",
        "romance",
        "passionate",
        "impregnation",
        "bondage",
        "dating",
        "degenerate",
        "naked",
        "nude",
        "sex",
        "slut",
        "furry",
        "abuse",
        "yuri",
        "submission",
        "corruption",
        "feminization",
        "slavery",
        "watersports",
        "piss",
        "peeing",
        "horny",
        "lewd",
        "gay", // not nsfw on its own, but i've yet to see a gay scenario that isn't written to be NSFW
        "m/m",
        "waifu",
        "bimbo",
        "transformation",
        "yandere",
        "dick",
        "femsub",
        "petplay",
        "pet play",
        "sempai",
        "senpai",
        "slave",
        "herm",
        "futa",
        "blowjob",
        "edging",
        "porn",
        "arousal",
        "aroused",
        "teasing",
        "tomboy",
        "bestiality",
        "zoophilia",
        "femdom",
        "mommy",
        "succubus",
        "vanilla",
        "rule 34",
        "dumb idiot",
        " x ",
        "slime",
        "vore",
        "drowning",
        "cannibal",
        "pervert",
        "tentacle",
        "living suit",
        "weight",
        "feed",
        "stuffing",
        "bbw",
        "feet",
        "foot",
        "fetish",
        "maledom",
        "submissive",
        "hypnosis",
        "kidnapping"
    ];
    
    // if I remember correctly, this doesn't actually work right now?
    var blockedAuthors = [

    ];

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    // There's probably a better way to do this but interval seems to work fine
    setInterval(function() {
        var scenarios = document.getElementsByClassName("css-1dbjc4n r-18u37iz");
        Array.from(scenarios).forEach(function(element, index, array) {
            if(element.checked != "true"){
                blockedTags.forEach(function(a, b, c){
                    var tagText = element.childNodes[0].childNodes[0];
                    //console.log(tagText)
                    if (tagText.innerHTML != undefined){
                        if(b%50 == 0){console.log(tagText)}
                        var tagsHaveBlacklist = tagText.innerHTML.toLowerCase().indexOf(a)>=0 && element.getAttribute('style') == "border-color: rgb(153, 153, 153); border-radius: 20px; border-width: 0.5px; display: flex; margin: 4px; padding: 4px 8px;"
                        if (tagsHaveBlacklist){
                            var scenarioBase = element.parentElement.parentElement.getElementsByClassName("css-18t94o4 css-1dbjc4n r-1loqt21 r-1otgn73 r-1i6wzkk r-lrvibr")[0];
                            var desc = scenarioBase.getElementsByClassName("css-901oao css-cens5h")[0];
                            var title = scenarioBase.childNodes[1];
                            var author = scenarioBase.getElementsByClassName("css-1dbjc4n r-18u37iz")[0].childNodes[0].childNodes[1];
                            if (fullBlock == true){
                                // contributed by thrwaway777
                                element.parentElement.parentElement.style.display = "none"
                            }else{
                                if (element.parentElement.tagsFound == "true"){
                                    desc.innerHTML = desc.innerHTML+", '"+tagText.innerHTML.slice(1,tagText.innerHTML.length)+"'";
                                }
                                else{

                                    element.parentElement.tagsFound = "true";
                                    // To any javascript developers looking at this code:
                                    // sorry.
                                    title.innerHTML = "Blocked";
                                    title.style.color = "rgb(128,128,128)";
                                    title.style.fontSize = "18px";
                                    title.style.marginBottom = "15px";

                                    desc.innerHTML = "This scenario was blocked because of the tag(s) '"+tagText.innerHTML.slice(1,tagText.innerHTML.length)+"'";
                                    desc.style.color = "rgb(128,128,128)"
                                    desc.style.fontSize = "15px"

                                    author.style.display = "none";
                                    author.innerHTML = "[Blocked Author]";
                                    author.style.color = "rgb(128,128,128)"
                                    author.style.fontSize = "15px"

                                    // because the profile picture and tag are still possibly recognizable, scrub those too
                                    scenarioBase.getElementsByClassName("css-1dbjc4n r-18u37iz")[0].childNodes[0].childNodes[0].style.display = "none";
                                    // if there isn't a tag, pretend we don't see the undefined and carry on
                                    try{scenarioBase.getElementsByClassName("css-1dbjc4n r-18u37iz")[0].childNodes[0].childNodes[2].style.display = "none";}catch(err){}

                                    scenarioBase.parentElement.childNodes[1].style.display = 'none'; // hides tags
                                    scenarioBase.parentElement.childNodes[2].style.display = "none"; // hides upload/edit dates
                                    scenarioBase.parentElement.childNodes[3].style.display = "none";
                                }
                            }
                        }
                    }
                });
                element.checked = "true";
            }
        });
        var authors = document.getElementsByClassName("css-901oao css-bfa6kz");
        Array.from(authors).forEach(function(element, index, array) {
            if(element.checked != "true"){
                blockedAuthors.forEach(function(a, b, c){
                    if (element.innerHTML.toLowerCase().indexOf(a.toLowerCase())>=0 && element.getAttribute('style') == "color: rgb(224, 224, 224); font-family: HelveticaNeue-Light, Helvetica, sans-serif, Classic; font-size: 20px; margin-left: 8px;"){

                            var scenarioBase = element.parentElement.parentElement.parentElement.parentElement.getElementsByClassName("css-18t94o4 css-1dbjc4n r-1loqt21 r-1otgn73 r-1i6wzkk r-lrvibr")[0];
                            var desc = scenarioBase.getElementsByClassName("css-901oao css-cens5h")[0];
                            var title = scenarioBase.childNodes[1];
                            var author = scenarioBase.getElementsByClassName("css-1dbjc4n r-18u37iz")[0].childNodes[0].childNodes[1];

                            title.innerHTML = "Blocked";
                            title.style.color = "rgb(128,128,128)";
                            title.style.fontSize = "18px";
                            title.style.marginBottom = "15px";

                            desc.innerHTML = "This scenario was blocked because of the author.";
                            desc.style.color = "rgb(128,128,128)"
                            desc.style.fontSize = "15px"

                            author.style.display = "none";
                            author.innerHTML = "[Blocked Author]";
                            author.style.color = "rgb(128,128,128)"
                            author.style.fontSize = "15px"

                            // because the profile picture and tag are still possibly recognizable, scrub those too
                            scenarioBase.getElementsByClassName("css-1dbjc4n r-18u37iz")[0].childNodes[0].childNodes[0].style.display = "none";
                            // if there isn't a tag, pretend we don't see the undefined and carry on
                            try{scenarioBase.getElementsByClassName("css-1dbjc4n r-18u37iz")[0].childNodes[0].childNodes[2].style.display = "none";}catch(err){}

                            scenarioBase.parentElement.childNodes[1].style.display = "none"; // hides tags
                            scenarioBase.parentElement.childNodes[2].style.display = "none"; // hides upload/edit dates
                            scenarioBase.parentElement.childNodes[3].style.display = "none"; // I forgot what this hides
                    }
                });
                element.checked = "true";
            }
        });
    }, 200);
})();