// ==UserScript== // @name Geoguessr duel guess times & team duels player list // @version 1.3.1 // @description Display guess times, rating changes for duels, and a list of players for team duels // @match https://www.geoguessr.com/* // @author victheturtle#5159 // @grant none // @license MIT // @require https://greasyfork.org/scripts/460322-geoguessr-styles-scan/code/Geoguessr%20Styles%20Scan.js?version=1151654 // @icon https://www.svgrepo.com/show/139928/katana.svg // @namespace https://greasyfork.org/users/967692-victheturtle // @downloadURL none // ==/UserScript== let game = {}; let doingRequest = false; let done = false; const green = () => cn("game-summary_healing__"); const red = () => cn("game-summary_damage__"); const grey = () => cn("game-summary_smallText__"); const big_white = () => cn("game-summary_text__"); const summary_table = () => cn("game-summary_playedRounds__"); const summary_line = () => cn("game-summary_playedRound__"); const summary_text = () => cn("game-summary_text__"); const replay_header = () => cn("replay_playedRoundsHeader__"); const color = (diff) => (diff>=0) ? ((diff==0) ? grey() : green()) : red(); const greenOrGrey = (diff) => (diff>0) ? green() : grey(); const replay_compact = () => cn("game-summary_compact__"); const replay_table = () => cn("replay_playedRounds__"); const rounds_header = () => cn("game-summary_playedRoundsHeader__"); const best_guess_value = () => cn("game-summary_bestGuessValue__"); const user_nick_root = () => cn("user-nick_root__"); const user_nick_wrapper = () => cn("user-nick_nickWrapper__"); const user_nick_nick = () => cn("user-nick_nick__"); const user_nick_verified_wrapper = () => cn("user-nick_verifiedWrapper__"); const user_nick_verified = () => cn("user-nick_verified__"); const verified_badge_svg = "/_next/static/images/verified-badge-566f0efd4d90928c6e044cbe588456dc.svg" const ignore_list = ["633a8a81af04a94fb02d8b1b", "633c8040723d43ea09977ea2"]; // Plonk It bots function checkURL() { if (location.pathname.startsWith("/duels") && location.pathname.endsWith("/summary") && document.querySelector('[class*="game-summary_playedRounds__"]') != null) return 1 if (location.pathname.startsWith("/duels") && location.pathname.endsWith("/replay") && document.querySelector('[class*="replay_playedRoundsHeader__"]') != null) return 2 return 0 }; function round(x) { return Math.round(x*10)/10 } function handleTeamDuels() { let result_lines = document.getElementsByClassName(summary_line()); const inversion = document.querySelector(`#__next div.${rounds_header()} img`).alt.includes("blue"); let roundResults1 = game.teams[inversion ? 1 : 0].roundResults; let roundResults2 = game.teams[inversion ? 0 : 1].roundResults; let team1Players = game.teams[inversion ? 1 : 0].players; let team2Players = game.teams[inversion ? 0 : 1].players; for (let i = 0; i < result_lines.length; i++) { let time0 = new Date(game.rounds[i].startTime); // Check for no guess if (roundResults1[i].bestGuess == null) roundResults1[i].bestGuess = {created:NaN}; let time1 = new Date(roundResults1[i].bestGuess.created); let team1Earliest = time1; // Loop through players to check for earlier guess team1Players.forEach(player => { if (player.guesses.length <= i || player.guesses[i].roundNumber != i+1) player.guesses.splice(i,0,{created:NaN}); if (!isNaN(player.guesses[i]).created) { let tempTime = new Date(player.guesses[i].created); if ((tempTime - team1Earliest) < 0) { team1Earliest = tempTime; } } }) if (roundResults2[i].bestGuess == null) roundResults2[i].bestGuess = {created:NaN}; let time2 = new Date(roundResults2[i].bestGuess.created); let team2Earliest = time2; // Loop through players to check for earlier guess team2Players.forEach(player => { if (player.guesses.length <= i || player.guesses[i].roundNumber != i+1) player.guesses.splice(i,0,{created:NaN}); if (!isNaN(player.guesses[i]).created) { let tempTime = new Date(player.guesses[i].created); if ((tempTime - team2Earliest) < 0) { team2Earliest = tempTime; } } }) // If one team didn't guess, then the team that did has a green timestamp, otherwise compare let text1 = document.createElement("div"); text1.classList.add(grey()); text1.innerText = isNaN(time1) ? "-" : round((time1-time0)/1000.) + " s"; result_lines[i].childNodes[1].appendChild(text1); let text2 = document.createElement("div"); text2.classList.add(grey()); text2.innerText = isNaN(time2) ? "-" : round((time2-time0)/1000.) + " s"; result_lines[i].childNodes[2].appendChild(text2); // Add the earliest guess for each team let t1EarlyDiv = document.createElement("div"); t1EarlyDiv.classList.add(isNaN(team2Earliest) ? green() : greenOrGrey(team2Earliest-team1Earliest)); t1EarlyDiv.innerText = isNaN(team1Earliest) ? "-" : "Team Earliest: " + round((team1Earliest-time0)/1000.) + " s"; result_lines[i].childNodes[1].appendChild(t1EarlyDiv); let t2EarlyDiv = document.createElement("div"); t2EarlyDiv.classList.add(isNaN(team2Earliest) ? green() : greenOrGrey(team1Earliest-team2Earliest)); t2EarlyDiv.innerText = isNaN(team2Earliest) ? "-" : "Team Earliest: " + round((team2Earliest-time0)/1000.) + " s"; result_lines[i].childNodes[2].appendChild(t2EarlyDiv); }; addProfileLinks(); } function handleDuels(isReplay) { let result_lines = document.getElementsByClassName(summary_line()); let player2_link = document.getElementsByClassName((isReplay) ? replay_header() : rounds_header())[0].children[2].firstChild.href 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; let compact = (isReplay) ? " " + replay_compact() : "" for (let i = 0; i < result_lines.length; i++) { let time0 = (typeof game.rounds[i].startTime === "string") ? Date.parse(game.rounds[i].startTime) : game.rounds[i].startTime; // Check for no guess if (guesses1.length <= i || guesses1[i].roundNumber != i+1) guesses1.splice(i, 0, {created:NaN}); let time1 = (typeof guesses1[i].created === "string") ? Date.parse(guesses1[i].created) : guesses1[i].created; if (guesses2.length <= i || guesses2[i].roundNumber != i+1) guesses2.splice(i, 0, {created:NaN}); let time2 = (typeof guesses2[i].created === "string") ? Date.parse(guesses2[i].created) : guesses2[i].created; let text1 = document.createElement("div"); // If one team didn't guess, then the team that did has a green timestamp, otherwise compare text1.classList.add(isNaN(time2) ? green() : greenOrGrey(time2-time1)); if (isReplay) text1.classList.add(replay_compact()); text1.innerText = isNaN(time1) ? "-" : (time1-time0)/1000. + " s"; result_lines[i].childNodes[1].appendChild(text1); let text2 = document.createElement("div"); text2.classList.add(isNaN(time1) ? green() : greenOrGrey(time1-time2)); if (isReplay) text2.classList.add(replay_compact()); text2.innerText = isNaN(time2) ? "-" : (time2-time0)/1000. + " s"; result_lines[i].childNodes[2].appendChild(text2); } let summary = document.getElementsByClassName((isReplay) ? replay_table() : summary_table())[0]; let newRatingLine = document.createElement("div"); newRatingLine.classList.add(summary_line()); if (isReplay) newRatingLine.classList.add(replay_compact()); try { let oldRating1 = player1.progressChange.competitiveProgress.ratingBefore; let newRating1 = player1.progressChange.competitiveProgress.ratingAfter; let oldRating2 = player2.progressChange.competitiveProgress.ratingBefore; let newRating2 = player2.progressChange.competitiveProgress.ratingAfter; newRatingLine.innerHTML = `