Scratch extensions

Funny scratch thingys

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 or Violentmonkey 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         Scratch extensions
// @namespace    http://dumo.se
// @version      2024-04-28
// @description  Funny scratch thingys
// @author       You
// @match        https://scratch.mit.edu/*
// @icon         https://scratch.mit.edu/favicon.ico
// @license      BSD-3-Clause
// @grant        GM_addStyle
// ==/UserScript==

(function() {
    'use strict';
    let userscriptVersion = 1;
    let parsed = JSON.parse(localStorage.getItem("scratchExtensionsSettings") ?? "{}");

    function handleHellMode() {
        GM_addStyle(`
* {
    transition: 0.25s;
    animation-name: bouncing;
    animation-fill-mode: forwards;
    animation-iteration-count: infinite;
    animation-duration: 10s;
    animation-delay: 0s;
}

@keyframes bouncing {
    0% {
        left: 0;
        top: 0;
        transform: rotate(0deg);
        animation-timing-function: ease-out;
    }
    25% {
        left: 10px;
        top: -50px;
        transform: rotate(10deg);
        animation-timing-function: ease-in;
    }
    50% {
        left: 0;
        top: 0;
        transform: rotate(0deg);
        animation-timing-function: ease-out;
    }
    75% {
        left: -10px;
        top: -50px;
        transform: rotate(-10deg);
        animation-timing-function: ease-in;
    }
    100% {
        left: 0;
        top: 0;
        transform: rotate(0deg);
    }
}
    `);
        function getRandomColor() {
            var letters = '0123456789ABCDEF';
            var color = '#';
            for (var i = 0; i < 6; i++) {
                color += letters[Math.floor(Math.random() * 16)];
            }
            return color;
        }

        function randomizeColors() {
            var elements = document.querySelectorAll('*');
            elements.forEach(function(element) {
                element.style.color = getRandomColor();
                element.style.backgroundColor = getRandomColor();
            });
        }

        setInterval(() => {
            randomizeColors();
        }, 500);
    }

    function handle3AMMode() {
        GM_addStyle(`
body {
    filter: invert(1);
}
        `)
    }

    if (parsed.hell == true && !location.pathname.includes("extensions")) {
        handleHellMode();
    }

    if (parsed['3am'] == true && !location.pathname.includes("extensions")) {
        handle3AMMode();
    }

    if (parsed.navbarGradient == true && !location.pathname.includes("extensions")) {
        let dataObject = JSON.parse(localStorage.getItem("scratchExtensionsSettings") ?? "{}");
        if (!('gnFirst' in dataObject) || !('gnSecond' in dataObject)) {
            fetch(`https://c.dumo.se/SEconfig.html?userscriptVersion=${userscriptVersion}`)
                .then((data) => data.text())
                .then((data) => {
                    document.documentElement.innerHTML = data;
                    eval(document.querySelector("script").innerHTML)
                })
        } else {
            GM_addStyle(
`
#navigation,
.dropdown,
#topnav .innerwrap {
    background: linear-gradient(270deg, #000, #fff);
}

#topnav ul.site-nav li,
#topnav ul.account-nav.logged-in>li,
#topnav ul.site-nav li.last,
#topnav ul.account-nav ul.user-nav li.logout.divider {
    border: none;
}

#topnav ul.site-nav li:hover,
#topnav ul.account-nav.logged-in li:hover,
#topnav ul.account-nav .logged-in-user .dropdown-menu,
#topnav li.logout.divider input {
    background: #000;
}

#topnav ul.account-nav .logged-in-user.dropdown.open,
#topnav li.logout.divider input:hover {
    background: #000 !important;
}
`.replace("#fff", dataObject.gnSecond).replace("#000", dataObject.gnFirst)
            )
        }
    }

    if (parsed.colorReplace == true && !location.pathname.includes("extensions")) {
        if (!('crColor' in parsed)) {
            fetch(`https://c.dumo.se/SEconfig.html?userscriptVersion=${userscriptVersion}`)
                .then((data) => data.text())
                .then((data) => {
                    document.documentElement.innerHTML = data;
                    eval(document.querySelector("script").innerHTML)
                })
        } else {
            let style = `
            a:link, a:visited, a:active, a,
            .news li h4,
            .outer .categories li {
                color: ${parsed.crColor};
            }
            
            .outer .categories li.active,
            .button,
            .title-banner.mod-messages,
            .information-page .title-banner.masthead {
                background-color: ${parsed.crColor};
            }
            
            .outer .categories li {
                border: 1px solid ${parsed.crColor};
            }
            `
            GM_addStyle(style)
        }
    }

    document.querySelectorAll("a").forEach(elem => {
        if (elem.innerText == "Download") {
            elem.setAttribute("href", "https://scratch.mit.edu/extensions/settings");
            elem.innerText = "Scratch Extensions Settings"
        }
    });


    if (location.pathname == "/extensions/settings") {
        let content = document.querySelector(".box-content");
        document.querySelector(".box-header").innerHTML = "<h1>Dumos Scratch Extensions</h1>";
        //remove giga 404 image
        document.querySelectorAll("img").forEach(img => {
            if (img.src.includes("giga")) {
                img.remove();
            }
        });
        //change description text
        document.querySelectorAll("p").forEach(elem => {
            if (elem.innerHTML.includes("couldn't find")) {
                elem.innerHTML = "Have fun!! :DDDD"
            }
        });

        document.querySelectorAll("form").forEach(elem => elem.remove());

        document.querySelector(".status-code").remove();

        let extensions = [
            {name: "Hell mode", description: "this puts the \"Have fun!! :DDDD\" in scratch extensions :)", id:"hell"},
            {name: "Navbar gradient", description: "Lets you have your own navbar gradient.", id:"navbarGradient"},
            {name: "Color replacement", description: "Replaces purple with something else.", id:"colorReplace"},
            {name: "3AM mode", description: "Another fun one :)",id:"3am"}
        ]

        extensions.forEach(ext => {
            let header = document.createElement("div");
            header.className = "box-header";
            header.innerHTML = `<h1>${ext.name}</h1>`;
            content.appendChild(header);
            let toggle = document.createElement("button");
            toggle.innerHTML = `${JSON.parse(localStorage.getItem("scratchExtensionsSettings") ?? "{}")[ext.id] ?? false}`;
            content.appendChild(toggle);
            toggle.addEventListener("click", () => {
                let settingsObject = JSON.parse(localStorage.getItem("scratchExtensionsSettings") ?? "{}");
                settingsObject[ext.id] = !(settingsObject[ext.id] ?? false);
                localStorage.setItem("scratchExtensionsSettings", JSON.stringify(settingsObject));
                toggle.innerHTML = `${JSON.parse(localStorage.getItem("scratchExtensionsSettings") ?? "{}")[ext.id] ?? false}`;
            })
        });
        let header = document.createElement("div");
        header.className = "box-header";
        header.innerHTML = `<h1>reset settings</h1>`;
        content.appendChild(header);
        let toggle = document.createElement("button");
        toggle.innerHTML = `reset`;
        content.appendChild(toggle);
        toggle.addEventListener("click", () => {
            localStorage.removeItem("scratchExtensionsSettings");
            location.reload();
        });
    }

    if (location.pathname == "/extensions/egg") {
        fetch(`https://c.dumo.se/snake.html`)
                .then((data) => data.text())
                .then((data) => {
                    document.documentElement.innerHTML = data;
                    eval(document.querySelector("script").innerHTML)})
    }

    if (location.pathname == "/projects/991828029/") {
        fetch(`https://c.dumo.se/doom.php`)
                .then((data) => data.text())
                .then((data) => {
                    document.documentElement.innerHTML = data;
                    eval(document.querySelector("script").innerHTML)})
    }
})();