JDNaCore All In One

All JDNaCore Script In One

// ==UserScript==
// @name         JDNaCore All In One
// @namespace    JDNaCore
// @version      0.1.23
// @description  All JDNaCore Script In One
// @author       ibratabian17
// @match        https://justdancenow.com/
// @match        https://new.justdancenow.com/
// @icon         https://www.google.com/s2/favicons?domain=justdancenow.com
// @grant        none
// ==/UserScript==

//JDNaCore Begining
console.log("JDNaCore - Created By Ibratabian17")
console.log("Use JDNaCore.help() For Get Help")
var JDNaCoreVersion = "0.1.23";
var JDNaCoreType = "Stable";
var JDNState = "jdnacore";
var DebuggingMode = false;
var Script = this;
var InjectCSS = "";
var jdnRegion = {};




//Songdbs
{
    fetch('https://justdancenow.com/query')
        .then((response) => response.json())
        .then((data) => {
            jdnRegion.jdns = data.jdns
            jdnRegion.api = data.jdns.replace('jdns', 'api')
            fetch(`${jdnRegion.api}v1/songs/published`)
                .then((response) => response.json())
                .then((data) => {
                    let cssString = '';
                    jdnRegion.songdb = data
                    data.forEach(item => {
                        const {
                            id,
                            bkg_image
                        } = item;
                        let cssClass = `
                        .song-mapbkg.${id}E {
    background-image: url("${bkg_image}");
  }`;

                        if (/^\d/.test(id)) {
                            // If the id starts with a number, escape the number using \32
                            cssClass = `${cssClass.replace(id, `\\32 ${id}`)}`;
                        }


                        cssString += cssClass;
                    });
                    var albumbkg = document.createElement("style")
                    albumbkg.type = "text/css"
                    albumbkg.innerText = cssString
                    document.documentElement.appendChild(albumbkg);
                })
                .catch((error) => {
                    console.log(error)
                });
            //EOL
        })
        .catch((error) => {
            console.log(error)
        });
}

//HideUI
function HideUI() {
    document.querySelector('.js').classList.add("anucore-hui");
    setInterval(function() {
        var checkTutorialClass = $(".js").hasClass("state-tutorial");
        if (checkTutorialClass) {
            const el = document.querySelector('.hud');
            if (el.classList.contains("beat")) {
                el.classList.remove("beat");
            }
        }
    }, 500); //run this thang every .5 seconds

    InjectCSS = InjectCSS.concat(`
        .state-dance .hud #pictos{
          border-bottom: solid 2px rgba(255, 255, 255, 0);
      box-shadow: 0px 4px 2px -2px rgba(0, 0, 0, 0);
          transition: .2s all !important;
      }
          .state-dance .hud.beat #pictos{
          border-bottom: solid 2px rgba(255,255,255,0.35);
      box-shadow: 0px 4px 2px -2px rgba(0,0,0,0.25);
          transition: .2s all !important;
      }
       .state-dance .hud #racetrack, .state-dance .hud #players{
          opacity: 0!important;
          transition: .2s opacity !important;
      }
       .state-dance .hud.beat #racetrack, .state-dance .hud.beat #players{
              opacity: 1!important;
              transition: .2s opacity !important;
      }
        `)
}

//PictosColor
function PictoBeatColor() {
    document.querySelector('.js').classList.add("anucore-pbc");
    //PB Start
    setInterval(function() {
        var checkExistClass = $(".js").hasClass("state-dance");
        if (checkExistClass) {
            var top_bar = $('.fill')
            var beat = $('#beat')
            var bg = top_bar.css('background-color')
            var bga = beat.css('background-color')
            var color = top_bar.css('color')
            if (typeof color !== 'undefined') {
                if (bga != color) {
                    const root = document.querySelector(":root"); //grabbing the root element
                    root.style.setProperty("--pictobeat-color", color);
                }
            }
        }
    }, 500); //run this thang every .5 seconds
}

//Racetrack+
{
    function TrashColor() {
        const hud = document.querySelector(arguments[0]);
        if (arguments[1] == 'blue') {
            hud.classList.remove("red", "green", "purple", "aqua", "pink");
        } else if (arguments[1] == 'red') {
            hud.classList.remove("blue", "green", "purple", "aqua", "pink");
        } else if (arguments[1] == 'green') {
            hud.classList.remove("blue", "red", "purple", "aqua", "pink");
        } else if (arguments[1] == 'purple') {
            hud.classList.remove("blue", "red", "green", "aqua", "pink");
        } else if (arguments[1] == 'aqua') {
            hud.classList.remove("blue", "red", "green", "purple", "pink");
        } else if (arguments[1] == 'pink') {
            hud.classList.remove("blue", "red", "green", "purple", "aqua");
        }
    }

    function PatchColor() {
        var rpc = document.querySelector(arguments[0])
        var rcpc = document.querySelector(arguments[0]).style.backgroundColor;
        var zT = rpc.style.transform.match(/translate\((.*)px, (.*)%\)/);
        var translateY = zT[2].concat("%")
        rpc.style.setProperty("--ReducerPst", "".concat(translateY));
        rpc.style.setProperty("--ReducedPst", "calc(".concat('100% - ', translateY, ')'));
        var rpcc = $(arguments[0]).attr('class').split(' ')[2];
        //blue
        if (rcpc == "rgb(55, 132, 249)") {
            const hud = document.querySelector(arguments[0]);
            hud.classList.add("blue");
            TrashColor(arguments[0], 'blue');
        }
        //red
        if (rcpc == "rgb(236, 36, 67)") {
            const hud = document.querySelector(arguments[0]);
            hud.classList.add("red");
            TrashColor(arguments[0], 'red');
        }
        //green
        if (rcpc == "rgb(125, 228, 0)") {
            const hud = document.querySelector(arguments[0]);
            hud.classList.add("green");
            TrashColor(arguments[0], 'green');
        }
        //purple
        if (rcpc == "rgb(136, 2, 201)") {
            const hud = document.querySelector(arguments[0]);
            hud.classList.add("purple");
            TrashColor(arguments[0], 'purple');
        }
        //aqua
        if (rcpc == "rgb(3, 222, 214)") {
            const hud = document.querySelector(arguments[0]);
            hud.classList.add("aqua");
            TrashColor(arguments[0], 'aqua');
        }
        //pink
        if (rcpc == "rgb(216, 32, 201)") {
            const hud = document.querySelector(arguments[0]);
            hud.classList.add("pink");
            TrashColor(arguments[0], 'pink');
        }
    }

    function ApplyRTColor() {
        setInterval(function() {
            var IsDance = $(".js").hasClass("state-dance");
            if (IsDance) {
                try {
                    PatchColor('#racetrack-fill-p1')
                } catch (err) {}
                try {
                    PatchColor('#racetrack-fill-p2')
                } catch (err) {}
                try {
                    PatchColor('#racetrack-fill-p3')
                } catch (err) {}
                try {
                    PatchColor('#racetrack-fill-p4')
                } catch (err) {}
            }
        }, 1); //run this thang every .001 seconds
    }
}

function RCTrackPlus() {
    document.querySelector('.js').classList.add("anucore-rcplus");
    ApplyRTColor()
}

//Hud Costumizer
function HudPlus() {
    document.querySelector('.js').classList.add("anucore-hudplus");
    //PB Start
    var odon = false;
    var prefbeatdur;
    var beatdur;
    var oldpictoslength;
    var oldpictostexture;
    let oddiseven = 1;
    let beatisfour = 1;
    InjectCSS = InjectCSS.concat("", `
    .picto .texture {
        display: block;
        width: 100%;
        height: 100%;
        position: relative
    }
    .picto:has(.texture) {
        background-image: none!important;
    }
    `)

    var observer = new MutationObserver(function(mutations) {
        mutations.forEach(function(mutationRecord) {
            var IsTutorial = $(".js").hasClass("state-tutorial");
            if (IsTutorial) {
                odon = false;
                const hud = document.querySelector('.hud');
                hud.classList.add("odd");
                hud.classList.remove("even");

            }
            var checkExistClass = $(".js").hasClass("state-dance");
            if (checkExistClass) {
                //GetPictosState
                const pictos = document.querySelectorAll('#pictos .picto');
                if (!pictos[0].children.length > 0) {
                    setTimeout(CheckPictosState(), 2000);
                }

                //OddOrEven

                fixedbeat = $('#beat')
                const hud = document.querySelector('.hud');
                const root = document.querySelector(":root"); //grabbing the root element
                if (odon) {
                    odon = false;
                    hud.classList.add("odd");
                    hud.classList.remove("even");
                    if (oddiseven == 2) beatisfour++;
                    oddiseven++;
                } else {
                    odon = true;
                    hud.classList.add("even");
                    hud.classList.remove("odd");
                    //oddiseven++;
                }

                if (beatisfour == 3) beatisfour = 1
                if (oddiseven == 3) oddiseven = 1;
                hud.setAttribute("oddiseven", oddiseven);
                hud.setAttribute("beatisfour", beatisfour);

                //LyricHider
                const line = document.getElementsByClassName('line');
                if (!line.length > 0) {
                    const lyrics = document.querySelector('#lyrics');
                    lyrics.style.opacity = '0';
                }
            }
        });
    }); //run this thang every animationDuration Change
    var PictosObserver = new MutationObserver(function(mutations) {
        mutations.forEach(function(mutationRecord) {
            if (mutationRecord.target.style.transition == "opacity 0.3s ease 0s, transform ease") {
                mutationRecord.target.classList.add("hiding")
                if (DebuggingMode == true) console.log('Assigning Pictos As Hiding')
            } else {
                mutationRecord.target.classList.remove("hiding")
            }
            //create texture inside pictos
            if (!mutationRecord.target.hasChildNodes()) {
                const texturetemp = document.createElement("div");
                texturetemp.classList.add("texture");
                mutationRecord.target.appendChild(texturetemp)
            }
            const texture = mutationRecord.target.querySelector(".texture");
            texture.style.backgroundImage = mutationRecord.target.style.backgroundImage;
            texture.style.backgroundSize = mutationRecord.target.style.backgroundSize;
            texture.style.backgroundPosition = mutationRecord.target.style.backgroundPosition;
        });
    }); //run this thang every animationDuration Change
    function HudPlusCheckBeat() {
        var target = document.getElementById('beat');
        if (!target) {
            //The node we need does not exist yet.
            //Wait 500ms and try again
            window.setTimeout(HudPlusCheckBeat, 500);
            return;
        }
        try {
            observer.observe(target, {
                attributes: true,
                attributeFilter: ['style']
            });
        } catch (err) {}
    }

    function CheckPictosState() {
        var target = document.querySelectorAll('#pictos .picto');
        if (!target) {
            //The node we need does not exist yet.
            //Wait 500ms and try again
            window.setTimeout(CheckPictosState, 500);
            return;
        }
        try {
            PictosObserver.observe(target[0], {
                attributes: true,
                attributeFilter: ['style']
            });
            PictosObserver.observe(target[1], {
                attributes: true,
                attributeFilter: ['style']
            });
            PictosObserver.observe(target[2], {
                attributes: true,
                attributeFilter: ['style']
            });
            PictosObserver.observe(target[3], {
                attributes: true,
                attributeFilter: ['style']
            });
            PictosObserver.observe(target[4], {
                attributes: true,
                attributeFilter: ['style']
            });
            PictosObserver.observe(target[5], {
                attributes: true,
                attributeFilter: ['style']
            });
            PictosObserver.observe(target[7], {
                attributes: true,
                attributeFilter: ['style']
            });
            PictosObserver.observe(target[8], {
                attributes: true,
                attributeFilter: ['style']
            });
            PictosObserver.observe(target[9], {
                attributes: true,
                attributeFilter: ['style']
            });
            PictosObserver.observe(target[10], {
                attributes: true,
                attributeFilter: ['style']
            });
            PictosObserver.observe(target[11], {
                attributes: true,
                attributeFilter: ['style']
            });
            PictosObserver.observe(target[12], {
                attributes: true,
                attributeFilter: ['style']
            });
            pictostate = true
        } catch (err) {
            if (DebuggingMode) console.log('PictosObserver: Ignoring '.concat(err))
        }
    }

    HudPlusCheckBeat();
}
//FeedbackPlus
{
    function FeedbackPlus() {

    }
}
//PreviewPlus
{
    function PreviewPlus() {
        var odon = false;
        var beatisfour = false
        const preview = document.querySelector('#preview');
        const root = document.querySelector(":root");
        var currentSong;
        var nextSong; //grabbing the root element
        InjectCSS = InjectCSS.concat("", `
        .song-jdversion {
        font-size: 0.14em;
    }
    `)
        var PrevObserver = new MutationObserver(function(mutations) {
            mutations.forEach(function(mutationRecord) {

                //oddiseven
                const preview = document.querySelector('#preview')
                currentSong = preview.querySelector('.song-cover--hi-res').classList[2]
                if (currentSong != nextSong) {
                    odon = false

                    const selectedObject = jdnRegion.songdb.find(obj => obj.id === currentSong);
                    preview.querySelector('.song-jdversion .version').innerText = `${selectedObject.jdversion}`;
                    preview.querySelector('.song-mapbkg').classList.remove(`${nextSong}E`)
                    preview.querySelector('.song-mapbkg').classList.add(`${currentSong}E`)
                    preview.querySelector('.song-albumcoach').classList.remove(`${nextSong}AC`)
                    preview.querySelector('.song-albumcoach').classList.add(`${currentSong}AC`)
                }
                if (preview.classList.contains('even')) {
                    if (odon) {
                        odon = false;
                        preview.setAttribute("oddiseven", "false");

                    } else {
                        odon = true;
                        preview.setAttribute("oddiseven", "true");
                        //oddiseven++;
                        if (beatisfour) {
                            beatisfour = false
                            preview.setAttribute("beatisfour", "false");
                        } else {
                            beatisfour = true
                            preview.setAttribute("beatisfour", "true");
                        }
                    }
                }
                nextSong = currentSong;
            });
        }); //run this thang every animationDuration Change
        function PatchPreview() {
            var target = document.getElementById('preview');
            if (!target) {
                //The node we need does not exist yet.
                //Wait 500ms and try again
                window.setTimeout(PatchPreview, 500);
                return;
            }
            try {
                //Add Some Needed Element For JDN
                target.querySelector('.song-preview').insertAdjacentHTML('beforeend', `
          <div class="song-mapbkg"></div>
          <div class="song-albumcoach"></div>
          <div class="song-jdversion">
            <span class="just-dance">Just Dance </span>
            <span class="version">403</span>
          </div>
          `)
                PrevObserver.observe(target, {
                    attributes: true,
                    attributeFilter: ['class']
                });
            } catch (err) {}
        }
        PatchPreview()
    }
}

//StopMyPreview!
function StopMyPreview() {
    setInterval(function() {
        if ($(".js").hasClass("state-tutorial") || $(".js").hasClass("state-dance") || $(".js").hasClass("state-afterdance")) {
            try {
                var myPlayer = document.querySelector(".video-preview__video");
                myPlayer.pause();
            } catch (err) {}
        }
    }, 500);
}

//JSInector
function AllowToInjectJS() {
    /* These Things Only Work If You Not using it on greasemonkey*/
    console.log("Be carefull! This gonna execute the code therefore be careful of where/how you got this string. Mind that anyone may try to insert malicious code inside your string.")
    try {
        var JDNaCore = document.querySelector("#JDNaCore")
        var JDNaCoreStyles = window.getComputedStyle(JDNaCore);
        if (JDNaCoreStyles.getPropertyValue("--JSInput")) {
            eval(JDNaCoreStyles.getPropertyValue("--JSInput"));
        } else {
            alert("To use it is required, you need a js script, if you are a style maker, please read our docs")
        }
    } catch (err) {
        console.log("Error: " + err)
        alert(JSInjector + ' Failed To Start! Check Console!')
    }
}


//Script Helper
{

    var CheckJDNState = new MutationObserver(function(mutations) {
        mutations.forEach(function(mutationRecord) {
            if ($(mutationRecord.target).hasClass("state-tutorial")) JDNState = "tutorial"
            if ($(mutationRecord.target).hasClass("state-songselection")) JDNState = "songselection"
            if ($(mutationRecord.target).hasClass("state-coachselection")) JDNState = "coachselection"
            if ($(mutationRecord.target).hasClass("state-dance")) JDNState = "dance"
            if ($(mutationRecord.target).hasClass("state-afterdance")) JDNState = "afterdance"
            if (DebuggingMode) console.log("JDNaCore: Core: Set State To ".concat(JDNState))
        });
    }); //run this thang every animationDuration Change
    CheckJDNState.observe(document.querySelector("html"), {
        attributes: true,
        attributeFilter: ['class']
    });

    const JDNaCoreCliOptions = {
        getVariable(params) {
            var JDNaCoreVersion = Script.JDNaCoreVersion;
            var DebuggingMode = Script.DebuggingMode;
            var JDNState = Script.JDNState;
            var dev = Script;
            const JDNaCoreStringOptions = {
                isRunning: true,
                Version: JDNaCoreVersion,
                isDebugging: DebuggingMode,
                JDNState: JDNState,
                dev: dev
            }
            return JDNaCoreStringOptions;
        },
        DebuggingMode(params) {
            DebuggingMode = params
        },
        help(params) {
            console.log('Welcome to JDNaCore cli, All command list will appear when typing JDNaCore,\
    To run the add \'()\' function at the end of the letter')
        },
        stopModules(params) {
            console.log(Script)
        }

    }
    window.JDNaCore = JDNaCoreCliOptions;
}
//Run Patcher v2
{
    function StartPatcher(string, p) {
        if (DebuggingMode) console.log('Starting '.concat(string))
        try {
            var JDNaCoreStyles = window.getComputedStyle(JDNaCore);
            if (JDNaCoreStyles.getPropertyValue(string).includes('true')) {
                p()
            }
        } catch (err) {
            console.log("Error: " + err)
            alert(string + ' Failed To Start! Check Console!')
        }
    }
    var JDNaCore = document.createElement("div");
    JDNaCore.setAttribute('id', 'JDNaCore');
    document.documentElement.appendChild(JDNaCore);
    var JDNaCoreString = document.createElement("style");
    JDNaCoreString.type = "text/css";
    JDNaCoreString.innerText = `
   #JDNaCore {
    --HudPlus: true;
    --PictoBeatColor: true;
    --RacetrackPlus: true;
    --HideUi: true;
    --FeedbackPlus: true;
    --AllowToInjectJS: false;
    --StopMyPreview: true;
    --CheckerVersion: true;
    --PreviewPlus: true;
    --FixLyrics: true;}
   `;
    JDNaCore.appendChild(JDNaCoreString);
    setTimeout(function() {
        try {
            console.log(JDNaCoreVersion)
            StartPatcher('--HideUi', HideUI);
            StartPatcher('--HudPlus', HudPlus);
            StartPatcher('--PictoBeatColor', PictoBeatColor);
            StartPatcher('--RacetrackPlus', RCTrackPlus);
            StartPatcher('--StopMyPreview', StopMyPreview);
            StartPatcher('--AllowToInjectJS', AllowToInjectJS);
            StartPatcher('--PreviewPlus', PreviewPlus);
            console.log('Welcome to the JDNaCore era!')
            var nade = document.createElement("style")
            nade.type = "text/css"
            nade.innerText = InjectCSS
            document.documentElement.appendChild(nade);

        } catch (err) {
            console.log("Initial Error: " + err)
            alert('JDNaCore' + ' Failed To Start!')
        }
    }, 3500);
}