OpenStreetMap IP Geolocation

Overrides the "Show My Location" button to provide location from IP geolocation

// ==UserScript==
// @name        OpenStreetMap IP Geolocation
// @namespace   Violentmonkey Scripts
// @match       *://www.openstreetmap.org/*
// @grant       GM.xmlhttpRequest
// @connect     ip-api.com
// @version     1.2
// @author      CyrilSLi
// @description Overrides the "Show My Location" button to provide location from IP geolocation
// @license     MIT
// @require     https://update.greasyfork.org/scripts/533461/1574689/Get%20OpenStreetMap%20Leaflet%20object.js
// ==/UserScript==

window.addEventListener("load", () => {
    if (!unsafeWindow.userscriptMap) {
        return;
    }
    GM.xmlhttpRequest({
        method: "GET",
        url: "http://ip-api.com/json/",
        onload: function(response) {
            ipJSON = JSON.parse(response.responseText);
            geoButton = document.getElementsByClassName("icon geolocate")[0].parentElement;
            geoButton.parentNode.replaceChild(geoButton.cloneNode(true), geoButton);
            tooltips = document.getElementsByClassName("tooltip-inner");
            while(tooltips[0]) {
                container = tooltips[0].parentNode;
                container.parentNode.removeChild(container);
            }
            geoButton = document.getElementsByClassName("icon geolocate")[0].parentElement;
            geoButton.addEventListener("click", ev => {
                unsafeWindow.userscriptMap.setView([ipJSON["lat"], ipJSON["lon"]], 12);
            })
            keyButton = document.getElementsByClassName("control-key")[0].children[0];
            keyButton.click();
            keyButton.click();
        }
    });
});