NL显示能量

https://www.nodeloc.com 论坛在首页显示能量的脚本

// ==UserScript==
// @name         NL显示能量
// @namespace    http://tampermonkey.net/
// @version      2025-08-15 001
// @description  https://www.nodeloc.com 论坛在首页显示能量的脚本
// @author       IWLZ
// @match        https://www.nodeloc.com/*
// @match        https://linux.do/*
// @match        https://clochat.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=nodeloc.com
// @grant        none
// @license      MIT
// ==/UserScript==



(function () {

    'use strict';
    console.log("NL能量显示脚本")
    let ifShowUpgradeProgress = false
    let userID = null
    if (window.location.origin == "https://www.nodeloc.com") {
        ifShowUpgradeProgress = true
    }
    function insertPowerEL() {
        let headerUL = document.getElementsByClassName("icons d-header-icons")[0]
        let newEle = document.createElement('li');
        newEle.setAttribute('id', 'nodeScoreHeader_score_id');
        newEle.setAttribute('style', `margin-left:12px;display: flex; align-items: center; justify-content: center;`)
        newEle.setAttribute('class', 'icon-header icon-header-small icon-header-link');
        newEle.innerHTML = `
        <button  style='    color: green;
            width: auto;' id="nodeScoreHeader_id_val" class="btn no-text btn-icon ai-bot-button icon btn-flat" title="当前能量" type="button">

                </button>

       `
        newEle.addEventListener("mouseenter", () => {
            //   console.log("鼠标移入 div");
            getPower(userID)
        });
        let upgradeIcon = null
        if (ifShowUpgradeProgress == true) {
            upgradeIcon = document.createElement('div');
            upgradeIcon.setAttribute('style', ' width: 42px;')
            upgradeIcon.id = `upgradeIcon_id`
            upgradeIcon.innerHTML = `
            <a role="tab" class="btn btn-flat btn-icon no-text user-menu-tab" id="home-user-menu-button-upgrade-progress" tabindex="-1" title="升级进度" aria-label="升级进度" aria-selected="false" aria-controls="quick-access-upgrade-progress" data-tab-number="6">
                    <svg class="fa d-icon d-icon-arrow-up svg-icon svg-string" aria-hidden="true" xmlns="http://www.w3.org/2000/svg">
                    <use href="#arrow-up"></use></svg>
                <!---->      
            </a>
       `
            upgradeIcon.addEventListener("mouseenter", () => {
                //   console.log("鼠标移入 div");
                showUpgradeDetail()
            });
            upgradeIcon.addEventListener("mouseleave", () => {
                //   console.log("鼠标移出 div");
                hideUpgradeDetail()
            });
        }


        if (headerUL) {
            if (ifShowUpgradeProgress == true) {
                headerUL.insertBefore(upgradeIcon, headerUL.firstChild);
            }

            headerUL.insertBefore(newEle, headerUL.firstChild);
        }


        if (ifShowUpgradeProgress == true) {
            insertUpgradeDetailEL()
        }


    }

    insertPowerEL()

    function getUserID() {
        let retryCount = 0;
        const maxRetries = 60; // 1分钟(60次)
        const retryInterval = setInterval(() => {
            try {
                let userImgBTN = document.getElementById("toggle-current-user");
                if (userImgBTN) {
                    let srcURL = userImgBTN.getElementsByTagName("img")[0].src;
                    let srcArr = srcURL.split('/');
                    userID = srcArr[srcArr.length - 3];
                    clearInterval(retryInterval);
                    if (typeof getPower === 'function') {
                        getPower(userID);
                    }
                } else if (retryCount >= maxRetries) {
                    clearInterval(retryInterval);
                    console.error("未找到userImgBTN元素,重试超时");
                }
                retryCount++;
            } catch (err) {
                console.error(err);
                if (retryCount >= maxRetries) {
                    clearInterval(retryInterval);
                }
            }
        }, 1000); // 每秒重试一次
    }
    getUserID()
    getPower(userID)

    function getPower(userID) {
        if (userID == null) {
            //  console.log("userID 为空")
            return
        }
        let url = `${window.location.origin}/u/${userID}.json`
        fetch(url) // 替换为实际的 URL
            .then(response => {
                if (!response.ok) {
                    throw new Error('网络请求失败');
                }
                return response.json(); // 或 response.text() 等
            })
            .then(data => {
                console.log(data.user.gamification_score);
                let score = data.user.gamification_score
                if (score) {
                    if (document.getElementById("nodeScoreHeader_id_val")) {
                        document.getElementById("nodeScoreHeader_id_val").innerText = score;
                    }


                }

            })
            .catch(error => {
                console.error('发生错误:', error);
            });
    }


    function getUpgradeProgress(userID) {
        let url = `${window.location.origin}/u/${userID}/upgrade-progress.json`
        let divEL = document.getElementById('home-quick-access-upgrade-progress')
        divEL.innerHTML=`Loading...`
        fetch(url) // 替换为实际的 URL
            .then(response => {
                if (!response.ok) {
                    throw new Error('网络请求失败');
                }
                return response.json(); // 或 response.text() 等
            })
            .then(data => {

                //  console.log(data);


                
                let unmet_conditionsEL = `
                `
                let met_conditionsEL = `
                `
                for (let i = 0; i < data.unmet_conditions.length; i++) {
                    //  console.log(i);
                    unmet_conditionsEL += `
                     <li>${data.unmet_conditions[i]}</li>
                    `
                }
                for (let i = 0; i < data.met_conditions.length; i++) {
                    met_conditionsEL += `
                     <li>${data.met_conditions[i]}</li>
                    `
                }
                divEL.innerHTML = `
                <div class="upgrade-progress-panel">
                <h3>下一等级:${data.next_level_name}</h3>
                
                <div class="upgrade-progress-bar">
                    <div class="progress" style="width: 86%;"></div>
                </div>
                
                    <h4>未满足条件</h4>
                    <ul>
                         ${unmet_conditionsEL}
                    </ul>
                
                    <h4>已满足条件</h4>
                    <ul>
                       ${met_conditionsEL}
                    </ul>
                    </div>

                
                `

            })
            .catch(error => {
                console.error('发生错误:', error);
            });

    }



    function insertUpgradeDetailEL() {
        let div = document.createElement("div");
        div.id = `showUpgradeDetail_div`
        div.innerHTML = `
            <div id="home-quick-access-upgrade-progress" class="quick-access-panel">
            
                    </div>

            `
        div.setAttribute('style', `
            position: absolute;
            background-color: #fafafa;
            box-shadow: rgba(0, 0, 0, 0.12) 0px 4px 16px;
            display:none;
            
            `)
        let upgradeIconEL = document.getElementById(`upgradeIcon_id`)
        upgradeIconEL.appendChild(div)

    }
    function showUpgradeDetail() {
        getUpgradeProgress(userID)
        //  console.log(`showUpgradeDetail`)
        document.getElementById('showUpgradeDetail_div').style.display = 'flex'
    }
    function hideUpgradeDetail() {
        document.getElementById('showUpgradeDetail_div').style.display = 'none'
    }

    // Your code here...
})();