JDNaCore All In One

All JDNaCore Script In One

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==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);
}