积分记录

记录积分变化

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 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;
}