Geoguessr average score display

Calculates average score from your last x amount of games. Restart of browser or refresh clears the currently saved scores.

目前为 2023-11-12 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name Geoguessr average score display
  3. // @namespace https://gf.qytechs.cn/en/users/1080671
  4. // @version 0.1.1
  5. // @description Calculates average score from your last x amount of games. Restart of browser or refresh clears the currently saved scores.
  6. // @author Lemson
  7. // @match https://www.geoguessr.com/game/*
  8. // @icon https://www.google.com/s2/favicons?sz=64&domain=geoguessr.com
  9. // @grant GM_setValue
  10. // @grant GM_getValue
  11. // @run-at document-idle
  12. // @license MIT
  13. // ==/UserScript==
  14.  
  15. (function () {
  16. "use strict";
  17. let score = GM_getValue('savedScores', []) || [];
  18. console.log(score);
  19. let totalScore = score.reduce((sum, value) => sum + value, 0);
  20.  
  21. //Edit maxEntries to however many rounds you want the average of.
  22. const maxEntries = 20;
  23. const targetSelector = '[data-qa="final-result-score"] > div';
  24. const averageScoreContainerSelector = 'div[class^="result-overlay_overlayContent__"]';
  25.  
  26. let elementDetected = false;
  27.  
  28. const observer = new MutationObserver((mutations) => {
  29. mutations.forEach((mutation) => {
  30. const targetElements = document.querySelectorAll(targetSelector);
  31.  
  32. if (targetElements.length > 0) {
  33. if (!elementDetected) {
  34. const childText = targetElements[0].innerText;
  35.  
  36. const scoreValue = parseInt(childText, 10);
  37.  
  38. score.push(scoreValue);
  39.  
  40. if (score.length > maxEntries) {
  41. score.shift();
  42. }
  43.  
  44. GM_setValue('savedScores', score);
  45.  
  46. totalScore = score.reduce((sum, value) => sum + value, 0);
  47.  
  48. const averageScore = totalScore / score.length;
  49.  
  50. displayAverageScore(averageScore);
  51.  
  52. elementDetected = true;
  53. }
  54. } else {
  55. elementDetected = false;
  56. }
  57. });
  58. });
  59.  
  60. const targetNode = document.body;
  61.  
  62. if (targetNode) {
  63. observer.observe(targetNode, { childList: true, subtree: true });
  64. } else {
  65. console.error("Target node not found!");
  66. }
  67.  
  68. function displayAverageScore(averageScore) {
  69. const parentElement = document.querySelector(averageScoreContainerSelector);
  70.  
  71. if (parentElement) {
  72.  
  73. const averageScoreDiv = document.createElement('div');
  74. averageScoreDiv.style.textAlign = "center";
  75. averageScoreDiv.innerHTML = `Average Score: ${averageScore.toFixed(2)}<br>(over ${maxEntries} rounds)`;
  76.  
  77. parentElement.appendChild(averageScoreDiv);
  78. } else {
  79. console.error("Parent element not found!");
  80. }
  81. }
  82. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址