GeoGuessr Party Settings Bookmarklet Generator

Generate bookmarklets to save your current GeoGuessr party settings and share them

// ==UserScript==
// @name GeoGuessr Party Settings Bookmarklet Generator
// @namespace   ggpsbg
// @description Generate bookmarklets to save your current GeoGuessr party settings and share them
// @version 0.2
// @match https://www.geoguessr.com/*
// @require https://update.greasyfork.org/scripts/460322/1408713/Geoguessr%20Styles%20Scan.js
// @run-at document-start
// @license MIT
// ==/UserScript==

function generateLink() {
  fetch("https://www.geoguessr.com/api/v4/parties/v2")
    .then((response) => response.json())
    .then((response) => {
      let parent = document.querySelectorAll("[class^=settings-modal_column]")[2].querySelector("[class^=settings-modal_section]")
    
      parent.querySelector(".ggpsbg-message").innerText = "Here is a bookmarklet to the current settings, you can copy it or drag and drop it yo your bookmarks"
    
      parent.querySelector(".ggpsbg-link").innerText = "Settings"
      parent.querySelector(".ggpsbg-link").href = "javascript: fetch('https://www.geoguessr.com/api/v4/parties/v2/game-settings', { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(" + JSON.stringify(response.gameSettings).replaceAll('"', "'") + ") });"
    })
}

function onMutations(mutations) {
  if (!location.pathname.includes("/party")) return

  for (let mutation of mutations) {
    if (mutation.type === "childList") {
      if (mutation.addedNodes && mutation.addedNodes.length == 1 && mutation.addedNodes[0].className && mutation.addedNodes[0].className.startsWith && mutation.addedNodes[0].className.startsWith("overlay-modal_contentCon")) {
        scanStyles()
          .then(() => {
            let parent = document.querySelectorAll("[class^=settings-modal_column]")[2].querySelector("[class^=settings-modal_section]")

            let buttonGroup = document.createElement("div")
            buttonGroup.className = cn("status-section_buttonGroup__")

            let button = document.createElement("button")
            button.className = cn("button_button__") + " " + cn("button_variantTertiary__")
            button.addEventListener("click", generateLink)
            button.innerText = "Generate bookmarklet "

            buttonGroup.appendChild(button)
            parent.appendChild(buttonGroup)

            let div = document.createElement("div")
            div.className = "ggpsbg-message"
            parent.appendChild(div)

            let a = document.createElement("a")
            a.className = "ggpsbg-link"
            parent.appendChild(a)
         })
      }
    }
  }
}

window.addEventListener("load", (event) => {
  let observer = new MutationObserver(onMutations)

  let config = {
    subtree: true,
    childList: true,
    attributes: true,
    attributeFilter: ["title"],
  }

  observer.observe(document.body, config)
})