// ==UserScript== // @name Geoguessr duel guess times & team duels player list // @version 1.2.0 // @description Display guess times and rating changes to the summary page of duels, and a list of players in team duels to be able to check their profile // @match https://www.geoguessr.com/* // @author victheturtle#5159 // @grant none // @license MIT // @icon https://www.svgrepo.com/show/139928/katana.svg // @namespace https://greasyfork.org/users/967692-victheturtle // @downloadURL none // ==/UserScript== let game = {}; let done = false; let green = "game-summary_healing__qWCZd"; let red = "game-summary_damage__XQS1o"; let grey = "game-summary_smallText__SBEuX"; let big_white = "game-summary_text__AMDNt"; let summary_table = "game-summary_playedRounds__QLFcJ"; let summary_line = "game-summary_playedRound__zFmlo"; let color = (diff) => (diff>=0) ? ((diff==0)?grey:green) : red; function checkURL() { return location.pathname.startsWith("/duels") && location.pathname.endsWith("/summary") && document.getElementsByClassName(summary_table)[0] != null; }; function addGuessTimesSummary() { if (checkURL() && game != {} && !done) { let result_lines = document.getElementsByClassName(summary_line); let player2_link = document.getElementsByClassName("game-summary_playedRoundsHeader__86HiG")[0].children[2].firstChild.href; if (player2_link == null) return false done = true; let player2_id = player2_link.slice(player2_link.lastIndexOf("/")+1); let inversion = game.teams[1].players[0].playerId != player2_id; let player1 = game.teams[inversion ? 1 : 0].players[0]; let player2 = game.teams[inversion ? 0 : 1].players[0]; let guesses1 = player1.guesses; let guesses2 = player2.guesses; for (let i=0; i
Rating change
New rating
${newRating1-oldRating1}
${newRating1}
${newRating2-oldRating2}
${newRating2}
`; } catch { let oldRating1 = player1.rating; let oldRating2 = player2.rating; newRatingLine.innerHTML = `
Rating change
New rating
0
${oldRating1}
0
${oldRating2}
`; }; summary.appendChild(newRatingLine); }; return true; }; function addProfileLinks() { if (checkURL() && game != {} && !done) { done = true; const nameMap = {}; const teamMap = {}; const verifiedMap = {}; __NEXT_DATA__.props.pageProps.game.teams[0].players.map(y => { nameMap[y.playerId]=y.nick; verifiedMap[y.playerId] = y.isVerified; teamMap[y.playerId] = "red"; }); __NEXT_DATA__.props.pageProps.game.teams[1].players.map(y => { nameMap[y.playerId]=y.nick; verifiedMap[y.playerId] = y.isVerified; teamMap[y.playerId] = "blue"; }); const playerTemplate = (playerId) => `
${verifiedMap[playerId] ? '
Verified user
' : ''}
` const teamTemplate = (team) => { let s = ""; for (let playerId in nameMap) { if (teamMap[playerId] == team && playerId != "633a8a81af04a94fb02d8b1b" && playerId != "633c8040723d43ea09977ea2") { s = s + playerTemplate(playerId); } } return s } let playersLine = document.createElement("div"); playersLine.classList.add(summary_line); const inversion = document.querySelector("#__next div.game-summary_playedRoundsHeader__86HiG img").alt.includes("blue") playersLine.innerHTML = `
Players
${teamTemplate((inversion) ? "blue" : "red")}
${teamTemplate((inversion) ? "red" : "blue")}
` let summary = document.getElementsByClassName(summary_table)[0]; summary.insertBefore(playersLine, summary.firstChild) }; return true; }; function check() { let game_url = window.location.href; fetch(game_url) .then(res => res.text()) .then(str => { let parser = new DOMParser(); let html = parser.parseFromString(str, "text/html"); let dataHTML = html.getElementById("__NEXT_DATA__"); let dataJson = JSON.parse(dataHTML.innerHTML); game = dataJson.props.pageProps.game; const isDuel = addGuessTimesSummary(); if (!isDuel) { // it's a team duel addProfileLinks(); } }).catch(err => {throw(err);}); }; function doCheck() { if (!checkURL()) { done = false; } else if (game != {} && !done) { check(); } }; function tryAddGuessTimesOnRefresh() { setTimeout(doCheck, 50); setTimeout(doCheck, 300); }; function tryAddGuessTimes() { doCheck(); for (let timeout of [250,500,1200,2000]) { setTimeout(doCheck, timeout); } }; document.addEventListener('click', tryAddGuessTimes, false); document.addEventListener('load', tryAddGuessTimesOnRefresh(), false); window.addEventListener('popstate', tryAddGuessTimes, false);