Greasy Fork

Greasy Fork is available in English.

Steam亲子鉴定(游戏库比较)

比较TA与自己的游戏库,测测TA是否有资格做自己的义父

目前为 2024-03-20 提交的版本,查看 最新版本

// ==UserScript==
// @name         Steam亲子鉴定(游戏库比较)
// @license      MIT
// @namespace    http://tampermonkey.net/
// @version      0.1.0
// @description  比较TA与自己的游戏库,测测TA是否有资格做自己的义父
// @author       Rawwiin
// @match        https://steamcommunity.com/id/*/games/*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        GM_xmlhttpRequest
// ==/UserScript==

const url_my_wishlist = "https://steamcommunity.com/my/wishlist/";
// const wishlistUrl = "https://store.steampowered.com/wishlist"
const url_my_games = "https://steamcommunity.com/my/games?tab=all";
const color_own = "#54662f";
const color_wish = "#4c90b6";

var isMarkOwn = true;
var isMarkWish = true;
var isHideOwn = false;
var shownCount = 0;

var myAppidList;
var myWishAppidList;
var hisAppidList;
var hisGameMap;
(function () {
    "use strict";
    console.log("steam...");

    const promise1 = new Promise((resolve, reject) => {
        load(url_my_games, (res) => {
            myAppidList = getAppids(res);
            resolve();
        });
    });

    const promise2 = new Promise((resolve, reject) => {
        load(url_my_wishlist, (res) => {
            myWishAppidList = getAppids(res);
            resolve();
        });
    });
    const promise3 = loadHisGameList(1000);

    Promise.all([promise1, promise2, promise3])
        .then(() => {
            console.log(myAppidList, myWishAppidList);
            console.log("请求都已完成");
            initHisAppidMap();

            markMyOwn(isMarkOwn);
            markMyWish(isMarkWish);
            addStatusElement();
        })
        .catch((error) => {
            // console.error("至少一个请求失败:", error);
        });
})();

function loadHisGameList(interval) {
    return new Promise((resolve) => {
        let count = 0;
        const intervalId = setInterval(() => {
            if (++count > 10 || (hisGameMap && hisAppidList)) {
                // 结束定时器
                clearInterval(intervalId);
                resolve();
                return;
            }
            let gameslist_config = document.getElementById("gameslist_config");
            if (gameslist_config) {
                let data_profile_gameslist = gameslist_config.getAttribute(
                    "data-profile-gameslist"
                );
                hisAppidList = getAppids(data_profile_gameslist);
                clearInterval(intervalId);
                resolve();
                let appidRegex = /app\/(\d+)/;
                var targetNode = document.getElementsByClassName(
                    "_3tY9vKLCmyG2H2Q4rUJpkr"
                )[0];
                // 创建一个观察者对象
                var observer = new MutationObserver(function (mutations) {
                    mutations.forEach(function (mutation) {
                        if (mutation.type === "childList") {
                            if (hisGameMap == null) {
                                initHisAppidMap();
                            } else {
                                mutation.addedNodes.forEach((addedNode) => {
                                    let appid = getAppidFromElement(addedNode);
                                    hisGameMap.set(appid, addedNode);
                                    handleNewGameDiv(appid, addedNode);
                                });
                            }
                        }
                    });
                });
                // 传入目标节点和观察选项
                observer.observe(targetNode, {
                    // attributes: true,
                    childList: true,
                    // subtree: true,
                });
                // observer.disconnect();
            }
            initHisAppidMap();
        }, interval);
    });
}
function initHisAppidMap() {
    if (hisGameMap) {
        return;
    }
    var gameListElement = document.getElementsByClassName(
        "_29H3o3m-GUmx6UfXhQaDAm"
    );
    if (gameListElement) {
        hisGameMap = new Map();
        shownCount = 0;
        for (var i = 0; i < gameListElement.length; ++i) {
            let appid = getAppidFromElement(gameListElement[i]);
            hisGameMap.set(appid, gameListElement[i]);
        }
    }
}

function addStatusElement() {
    let element = document.getElementsByClassName("_2_BHLBIwWKIyKmoabfDFH-");
    if (!element || !element.length) {
        return;
    }

    let notHave = 0;
    let inWish = 0;
    hisAppidList.forEach(function (appid) {
        if (!myAppidList.includes(appid)) {
            notHave++;
        }
        if (myWishAppidList.includes(appid)) {
            inWish++;
        }
    });
    element[0].innerHTML +=
        // "<div style='padding-top: 5px;'>" +
        "<label style='padding-top: 5px;'>TA拥有但我没有的游戏数:" +
        "<span id='notHave'>" +
        notHave +
        "</span>" +
        "</label>" +
        "<label style='padding-left: 5px;padding-top: 5px;'>TA拥有我愿望单中的游戏数:" +
        "<span id='inWish'>" +
        inWish +
        "</span>" +
        "</label>" +
        "<label style='padding-top: 5px;'>隐藏我已拥有的游戏" +
        '<input type="checkbox" name="myCheckbox" value="1" id="checkbox_hideMine" style="margin: 3px 3px 3px 4px;">' +
        "</label>";
    // +"<div>"
    var checkbox = document.getElementById("checkbox_hideMine");
    if (checkbox) {
        checkbox.addEventListener("change", function () {
            isHideOwn = checkbox.checked;
            hideGameList(isHideOwn);
        });
    }

    // let span_notHave = document.getElementById("notHave");
    // if (span_notHave) span_notHave.textContent = notHave;
    // let span_inWish = document.getElementById("inWish");
    // if (span_inWish) span_inWish.textContent = inWish;
}

function hideGameList(hide) {
    shownCount = 0;
    hisGameMap.forEach(function (gameDiv, appid) {
        hideGame(hide, appid, gameDiv);
    });
}

function hideGame(hide, appid, gameDiv) {
    if (hide && myAppidList.includes(appid)) {
        gameDiv.style.display = "none";
        gameDiv.style.top = "0px";
    } else {
        gameDiv.style.display = "block";
        gameDiv.style.top = shownCount++ * 150 + "px";
    }
}

function handleNewGameDiv(appid, gameDiv) {
    hideGame(isHideOwn, appid, gameDiv);
    markGame(appid, gameDiv);
}

function markMyOwn(mark) {
    markHisGameList(myAppidList, mark, color_own);
}

function markMyWish(mark) {
    markHisGameList(myWishAppidList, mark, color_wish);
}

function markHisGameList(appidList, mark, color) {
    hisGameMap.forEach(function (gameDiv, appid) {
        if (appidList.includes(appid)) {
            gameDiv.style.backgroundColor = mark ? color : "";
        }
    });
}

function markGame(appid, gameDiv) {
    let color = "";
    if (isMarkOwn && myAppidList.includes(appid)) {
        color =color_own;
    } else if (isMarkWish && myWishAppidList.includes(appid)) {
        color = color_wish;
    }
    gameDiv.style.backgroundColor = color;
}

function load(url, resolve) {
    try {
        return GM_xmlhttpRequest({
            method: "GET",
            url: url,
            onload: function (xhr) {
                // console.log(xhr);
                resolve(xhr.responseText);
            },
        });
    } catch (e) {
        // location.href = 'https://keylol.com';
    }
}

function getAppids(res) {
    let appidRegex = /appid("|\\"|&quot;):(\d+)/g;
    let appidList = [];
    let appid = "";
    while ((appid = appidRegex.exec(res))) {
        // console.log(appid[1]);
        appidList.push(appid[2]);
    }
    return appidList;
}

function getAppidFromElement(element) {
    let appidRegex = /app\/(\d+)/;
    let href = element
        .getElementsByClassName("_22awlPiAoaZjQMqxJhp-KP")[0]
        .getAttribute("href");
    let appid = appidRegex.exec(href);
    return appid[1];
}