积分记录

记录积分变化

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         积分记录
// @namespace    http://tampermonkey.net/
// @version      0.2.4.1
// @description  记录积分变化
// @author       You
// @match        https://www.gamemale.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=gamemale.com
// @require      https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js
// @grant        GM_setValue
// @grant        GM_getValue
// ==/UserScript==
this.$ = this.jQuery = jQuery.noConflict(true);

(function () {
    'use strict';
    //进入帖子时更新
    let counted = false;
    var button = document.querySelector("#fastpostsubmit")
    // if (window.location.href.slice(25, 31) == "thread") {
    if (button != null && button != undefined) {
        // console.log("脚本已生效");
        checkCredits()
        showReply()
        showCredits()
        button.addEventListener("click", function () {
            setTimeout(() => {
                replycount(counted)
                updateShow()
                counted = true
            }, 3000);
        });
    }
})();
//已回贴
function replycount(counted) {
    let reply = JSON.parse(localStorage.getItem("reply"))
    if (checkReply() == true && counted == false) {
        reply.count++;
        localStorage.setItem("reply", JSON.stringify(reply));
    }
}

//未回帖
//已回贴

//未回帖
function checkReply() {
    let len = document.querySelector("#postlistreply").childNodes.length;
    if (len == 1) {
        return false;
    } else {
        return true;
    }
}

function showReply() {
    let reply = JSON.parse(localStorage.getItem("reply"))
    let today = new Date().toLocaleDateString()
    if (reply == null || reply == undefined || reply.date != today) {
        reply = {
            "date": today,
            "count": 0
        }
        console.log("reply init");
    }
    localStorage.setItem("reply", JSON.stringify(reply));

    if (document.getElementsByClassName("showReply")[0] != null || document.getElementsByClassName("showReply")[0] != undefined) {
        document.getElementsByClassName("showReply")[0].remove()
    }

    let e = document.querySelector(`#fastpostform > table > tbody > tr > td.plc`)


    if(e!=null&&e!=undefined){
        let div = document.createElement("div")
        div.setAttribute('class', 'showReply')
        div.innerHTML = "【累计回帖】:" + reply.count
        e.appendChild(div)



    }

}

function updateShow() {
    document.getElementsByClassName("showCredits")[0].remove()
    document.getElementsByClassName("showCredits")[0].remove()
    document.getElementsByClassName("showReply")[0].remove()
    document.getElementsByClassName("resetbutton")[0].remove()
    
    checkCredits()
    showReply()
    showCredits()

}
function showCredits() {
    let change = JSON.parse(localStorage.getItem("change"))
    let sum = JSON.parse(localStorage.getItem("sum"))
    delete change.日期
    delete sum.日期

    let e = document.querySelector(`#fastpostform > table > tbody > tr > td.plc`)
    if (e != null && e != undefined) {
        let div1 = document.createElement("div")
        div1.innerHTML = "【积分变动】:" + getHtmlText(change)
        div1.setAttribute('class', 'showCredits')
        e.appendChild(div1)
        let div2 = document.createElement("div")
        div2.innerHTML = "【当日累积】:" + getHtmlText(sum)
        div2.setAttribute('class', 'showCredits')
        e.appendChild(div2)

        let a1 = document.createElement("a")
        a1.innerHTML = "【记录重置】"
        a1.setAttribute('class', 'resetbutton')
        a1.style.cursor="pointer"
        a1.addEventListener("click", function () {
            localStorage.removeItem("latest")
            localStorage.removeItem("change")
            localStorage.removeItem("sum")
            localStorage.removeItem("reply")
            updateShow()
        });
        e.appendChild(a1)

    }

}

function getHtmlText(credit){
    return `<a class="bbda mbn pbn"><a style="margin:2px"><img style="vertical-align:middle" src="https://img.gamemale.com/album/201404/12/023041d2ow7j3gifb55ifo.jpg" /> 旅程: <span id="hcredit_1">${credit["旅程"]}</span></a><a style="margin:2px"><img style="vertical-align:middle" src="https://img.gamemale.com/album/201404/12/023039r465s6wuz65a5sx4.jpg" /> 金币: <span id="hcredit_2">${credit["金币"]}</span></a><a style="margin:2px"><img style="vertical-align:middle" src="https://img.gamemale.com/album/201404/12/023033uxlbvypbeqlzjyy5.jpg" /> 血液: <span id="hcredit_3">${credit["血液"]}</span></a><a style="margin:2px"><img style="vertical-align:middle" src="https://img.gamemale.com/album/201404/12/023043vji23ad4jinid9jn.jpg" /> 追随: <span id="hcredit_4">${credit["追随"]}</span></a><a style="margin:2px"><img style="vertical-align:middle" src="https://img.gamemale.com/album/201404/12/023035iqtc01s1kmcth4rn.jpg" /> 咒术: <span id="hcredit_5">${credit["咒术"]}</span></a><a style="margin:2px"><img style="vertical-align:middle" src="https://img.gamemale.com/album/201404/12/023037obuzvrurwdtlcsnr.jpg" /> 知识: <span id="hcredit_6">${credit["知识"]}</span></a><a style="margin:2px"><img style="vertical-align:middle" src="https://img.gamemale.com/album/201404/12/023047w6n62fn6mm4k3mpk.jpg" /> 灵魂: <span id="hcredit_7">${credit["灵魂"]}</span></a><a style="margin:2px"><img style="vertical-align:middle" src="https://img.gamemale.com/album/201404/12/023045jmv454mfvzo2fmpm.jpg" /> 堕落: <span id="hcredit_8">${credit["堕落"]}</span></a></a>`
}


//上一次积分变动:change-{}
function checkCredits() {
    let old = JSON.parse(localStorage.getItem("latest"))
    let today = new Date().toLocaleDateString()
    if (old == null || old == undefined || old["日期"] != today) {
        console.log("初始化积分信息");
        creditsDataInit();
    } else {
        let latest = getRecord()
        //遍历对象属性
        let change = shallowEqual(old, latest)
        if (change == true) {
            console.log("积分未发生变动");
            //清空change?
        } else {
            localStorage.setItem("change", JSON.stringify(change))
            let sum = sumCredits()//需要用到change
            localStorage.setItem("sum", JSON.stringify(sum))
            console.log("积分存在变动,change:", change, "累积变动:", sum);

            localStorage.setItem("latest", JSON.stringify(latest))
            console.log("更新当前积分:", latest);
        }
    }

}
function creditsDataInit() {
    let latest = getRecord()
    localStorage.setItem("latest", JSON.stringify(latest))
    let change = latest
    let keys = Object.keys(change);
    for (let index = 0; index < keys.length; index++) {
        if (keys[index] != "日期") {
            change[keys[index]] = 0
        }
    }
    localStorage.setItem("change", JSON.stringify(change))
    localStorage.setItem("sum", JSON.stringify(change))
}

//累积积分变动
function sumCredits() {
    let sum = JSON.parse(localStorage.getItem("sum"));
    let change = JSON.parse(localStorage.getItem("change"));
    let keys = Object.keys(change);
    //sum的日期(sum["日期"])与今天不同时,初始化
    let dateStr = new Date().toLocaleDateString()
    if (sum["日期"] != dateStr) {
        sum = getRecord()
        for (let index = 0; index < keys.length; index++) {
            if (keys[index] != "日期") {
                sum[keys[index]] = 0
            }
        }
        console.log("变化累积不是当日的,初始化:", sum);
    }
    //change累加到sum
    for (let index = 0; index < keys.length; index++) {
        if (keys[index] != "日期") {
            sum[keys[index]] = sum[keys[index]] + change[keys[index]]
        }
    }
    console.log("sum:", sum);
    return sum;
}

function shallowEqual(old, latest) {
    let equal = true;
    const keys1 = Object.keys(old);
    const keys2 = Object.keys(latest);
    if (keys1.length !== keys2.length) {
        equal = false;
    } else {
        for (let index = 0; index < keys1.length; index++) {
            const val1 = old[keys1[index]];
            const val2 = latest[keys2[index]];
            if (val1 !== val2) {
                equal = false;
                break;
            }
        }
    }
    if (equal == true) {
        return true;
    } else {
        let result = old
        for (let index = 0; index < keys1.length; index++) {
            if (keys1[index] != "日期") {
                result[keys1[index]] = latest[keys2[index]] - old[keys1[index]]
            } else {
                result[keys1[index]] = latest[keys2[index]]
            }
        }
        return result;
    }
}

//【同步】网络请求并本地存储
function getRecord() {
    let result = null;
    let re = /\d+/g//g:查询多次,而不是查询第一个符合
    $.ajax({
        type: "get",
        url: "https://www.gamemale.com/home.php?mod=spacecp&ac=credit&showcredit=1&inajax=1&ajaxtarget=extcreditmenu_menu",
        cache: false,
        async: false,//同步请求
        dataType: "text",
        success: function (data) {   // data是形参名,代表返回的数据
            var dom = document.createElement('div');
            dom.innerHTML = data;
            let lis = dom.firstElementChild.firstElementChild.children;
            let credits = {};
            let dateString = new Date().toLocaleDateString()// =>2023/5/4.
            credits["日期"] = dateString;
            for (let i = 0; i < lis.length; i++) {
                let credit = Number(lis[i].children[1].innerHTML.match(re)[0])
                switch (i) {
                    case 0:
                        credits["旅程"] = credit
                        break;
                    case 1:
                        credits["金币"] = credit
                        break;
                    case 2:
                        credits["血液"] = credit
                        break;
                    case 3:
                        credits["追随"] = credit
                        break;
                    case 4:
                        credits["咒术"] = credit
                        break;
                    case 5:
                        credits["知识"] = credit
                        break;
                    case 6:
                        credits["灵魂"] = credit
                        break;
                    case 7:
                        credits["堕落"] = credit
                        break;
                    default:
                        break;
                }
            }
            result = credits;
            // window.localStorage.setItem("record", data)
        },
        error: function (error) {
            console.log(error);
            result = error
        }
    });
    return result;
}