Test

Show more information about a geoguessr player on their profile page

目前為 2025-05-28 提交的版本,檢視 最新版本

// ==UserScript==
// @name         Test
// @namespace    http://tampermonkey.net/
// @version      0.0.2
// @description  Show more information about a geoguessr player on their profile page
// @author       btastic
// @match        https://www.geoguessr.com/user/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=geoguessr.com
// @grant        none
// @license      MIT
// ==/UserScript==

function checkURL() {
    if (location.pathname.includes("/user") || location.pathname.includes("/me/profile")) return 1;
    return 0;
}

function insertAfter(newNode, existingNode) {
    existingNode.parentNode.insertBefore(newNode, existingNode.nextSibling);
}

async function checkUser(profileId) {
    return fetch(location.origin + "/api/v4/ranked-system/progress/" + profileId)
        .then(out => out.json())
        .catch(err => { console.log(err); return null; });
}

async function getUserStats(profileId) {
    return fetch(location.origin + "/api/v3/users/" + profileId + "/stats")
        .then(out => out.json())
        .catch(err => { console.log(err); return null; });
}

let observer = new MutationObserver((mutations) => {
    if (checkURL() == 1) {
        const profileLink = (location.pathname.includes("/me/profile")) ? document.querySelector('[name="copy-link"]').value : location.href;
        const profileId = profileLink.substr(profileLink.lastIndexOf("/") + 1);
        checkUser(profileId).then(user => {
            if(document.getElementById("more-info") == null)
            {
                getUserStats(profileId).then(stats => {
                    if(document.getElementById("more-info") == null)
                    {
                        let proDiv = document.querySelector("[class*='profile-header_proBadgeWrapper__']");
                        let baseDiv = (proDiv) ? proDiv.firstChild : document.querySelector("[data-qa='user-card-title']");

                        let moreInfoDiv = document.createElement("div");
                        moreInfoDiv.innerHTML = `<div id="more-info"></div>`;
                        if (proDiv) {
                            baseDiv.style = "display: inline-block; margin-right: 10px";
                            moreInfoDiv.style.display = "inline-block";
                        }
                        insertAfter(moreInfoDiv, baseDiv);

                        let averageGameScoreDiv = document.createElement("div");
                        averageGameScoreDiv.innerHTML = '<div id="average-gs"></div>';
                        insertAfter(averageGameScoreDiv, moreInfoDiv);

                        let averageGameScoreText = "Average game score: " + stats.averageGameScore.amount + " " + stats.averageGameScore.unit + " (" + Math.round(stats.averageGameScore.percentage, 2) + "%)";
                        document.getElementById("average-gs").innerText = averageGameScoreText;

                        let averageTimeToPlonk = document.createElement("div");
                        averageTimeToPlonk.innerHTML = '<div id="average-ttp"></div>';
                        insertAfter(averageTimeToPlonk, moreInfoDiv);

                        let averageTimeToPlonkText = "Average time to plonk: " + stats.averageTime;
                        document.getElementById("average-ttp").innerText = averageTimeToPlonkText;


                        let averageDistanceDiv = document.createElement("div");
                        averageDistanceDiv.innerHTML = '<div id="average-distance"></div>';
                        insertAfter(averageDistanceDiv, moreInfoDiv);

                        let averageDistanceText = "Average guess distance: " + stats.averageDistance.meters.amount + stats.averageDistance.meters.unit;
                        document.getElementById("average-distance").innerText = averageDistanceText;

                        let firstGuessStatsDiv = document.createElement("div");
                        insertAfter(firstGuessStatsDiv, moreInfoDiv);
                        firstGuessStatsDiv.innerHTML = '<div id="guesses-first"></div>';

                        let guessFirstPercentage =  user ? "Guesses first: " +  Math.round(user.guessedFirstRate * 100) + "%" : "Guesses first: N/A";
                        document.getElementById("guesses-first").innerText = guessFirstPercentage;

                    }
                });

            }
        });


    }
})

observer.observe(document.body, { subtree: true, childList: true });