GeoGuessr Team Duels Ping on right click

Ping your teammate in order to freak him out. Do not use in ranked games.

// ==UserScript==
// @name          GeoGuessr Team Duels Ping on right click
// @description   Ping your teammate in order to freak him out. Do not use in ranked games.
// @version       0.0.1
// @author        MiniKochi
// @license       MIT
// @match         *://*.geoguessr.com/*
// @run-at        document-start
// @icon          https://www.geoguessr.com/_next/static/media/favicon.bffdd9d3.png
// @namespace	  MiniKochi
// ==/UserScript==

// Injection

function overrideOnLoad(googleScript, observer, overrider) {
	const oldOnload = googleScript.onload
	googleScript.onload = event => {
		const google = unsafeWindow.google
		if (google) {
			observer.disconnect()
			overrider(google)
		}
		if (oldOnload) {
			oldOnload.call(googleScript, event)
		}
	}
}

function grabGoogleScript(mutations) {
	for (const mutation of mutations) {
		for (const newNode of mutation.addedNodes) {
			const asScript = newNode
			if (asScript && asScript.src && asScript.src.startsWith("https://maps.googleapis.com/")) {
				return asScript
			}
		}
	}
	return null
}

function injecter(overrider) {
	if (document.documentElement) {
		injecterCallback(overrider)
	}
}

function injecterCallback(overrider) {
	new MutationObserver((mutations, observer) => {
		const googleScript = grabGoogleScript(mutations)
		if (googleScript) {
			overrideOnLoad(googleScript, observer, overrider)
		}
	}).observe(document.documentElement, { childList: true, subtree: true })
}

// Get gogole map instance

let myMap
function initiateMap() {
	const google = unsafeWindow.google
	google.maps.Map = class extends google.maps.Map {
		constructor(...args) {
			super(...args)
			myMap = this

			google.maps.event.addListener(myMap, "rightclick", function (event) {
				const lat = event.latLng.lat()
				const lng = event.latLng.lng()
				ping(lat, lng)
			})
		}
	}
}

// Launch

if (document.readyState === "loading") {
	document.addEventListener("DOMContentLoaded", afterDOMLoaded)
} else {
	afterDOMLoaded()
}

function afterDOMLoaded() {
	injecter(() => {
		initiateMap()
	})
}

// PING

function ping(lat, lng) {
	if (window.location.href.includes("/team-duels/")) {
		const tag = window.location.href.substring(window.location.href.lastIndexOf("/") + 1)
		fetch(`https://game-server.geoguessr.com/api/duels/${tag}/location/ping`, {
			method: "POST",
			credentials: "include",
			headers: {
				"Content-Type": "application/json",
			},
			body: JSON.stringify({
				lat: lat,
				lng: lng,
			}),
		})
	}
}

QingJ © 2025

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