// ==UserScript== // @name HRRR Windy // @description Default to 'HRRR' on windy.com to show 3km HRRR forecast // @namespace ludios // @author ludios // @license AGPL-3.0; https://www.gnu.org/licenses/agpl-3.0.en.html // @grant none // @version 1.0.1 // @match https://www.windy.com/* // ==/UserScript== // These functions were copied from Expand Everything function queryElements(selector, callback) { const elements = document.querySelectorAll(selector); elements.forEach(element => callback(element)); } const logPrefix = "HRRR Windy: "; let mutations = 0; let observer = null; // Observe some selectors and run a callback for each selected element. function observe(maxMutations, selectors, callback) { if (observer !== null) { throw new Error(`observe(...) called more than once`); } observer = new MutationObserver(() => { mutations++; if (mutations >= maxMutations) { console.log(`${logPrefix}disconnecting MutationObserver after ${mutations} mutations to avoid slowing down the page`); observer.disconnect(); } for (const selector of selectors) { queryElements(selector, callback); } }); function reobserve() { // Process elements that were present before MutationObserver for (const selector of selectors) { queryElements(selector, callback); } // Start observing observer.observe(document.documentElement, { childList: true, subtree: true, }); } reobserve(); } let alreadyClicked; function resetAlreadyClicked() { alreadyClicked = new WeakMap(); } resetAlreadyClicked(); // Click on something if it hasn't already been clicked. function clickIfUnclicked(el) { if (alreadyClicked.get(el)) { return; } alreadyClicked.set(el, true); el.click(); } // observe(100, [ 'div.switch__item.tooltip--up[data-tooltip="3km"]' ], el => { clickIfUnclicked(el); });