// ==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 // @downloadURL https://update.greasyfork.icu/scripts/493655/Scratch%20extensions.user.js // @updateURL https://update.greasyfork.icu/scripts/493655/Scratch%20extensions.meta.js // ==/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 = "