WAZEPT Livemap Routes

Displays the toll price, the number of alerts and jams (and the total length of jams) for the alternative routes on the Waze Live Map.

目前為 2025-05-14 提交的版本,檢視 最新版本

// ==UserScript==
// @name         WAZEPT Livemap Routes
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  Displays the toll price, the number of alerts and jams (and the total length of jams) for the alternative routes on the Waze Live Map.
// @author       J0N4S13
// @include      /^https:\/\/www.waze.com\/.*live-map/
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // Portagens: SVG do Waze
    const imgToll = 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMzIgMzIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+Cgk8ZyBjbGlwLXBhdGg9InVybCgjY2xpcDBfNzQzN18zNDA1KSI+CgkJPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAxXzc0MzdfMzQwNSkiPgoJCQk8cGF0aAoJCQkJZD0iTTEgNEMxIDQuNzQwMjggMS40MDIyIDUuMzg2NjMgMiA1LjczMjQ0TDIgMjMuNzY0MUMxLjM4NzMxIDI0LjMxMjUgMSAyNS4xMTA3IDEgMjZWMjhDMSAyOS42NTY5IDIuMzQzMTUgMzEgNCAzMUgxOEMxOS42NTY5IDMxIDIxIDI5LjY1NjkgMjEgMjhWMjZDMjEgMjUuMTEwNyAyMC42MTI3IDI0LjMxMjUgMjAgMjMuNzY0MVYyM0gyNkMyOC43NjE0IDIzIDMxIDIwLjc2MTQgMzEgMThDMzEgMTUuMjM4NiAyOC43NjE0IDEzIDI2IDEzSDIwVjUuNzMyNDRDMjAuNTk3OCA1LjM4NjYzIDIxIDQuNzQwMjggMjEgNFYzQzIxIDEuODk1NDMgMjAuMTA0NiAxIDE5IDFIM0MxLjg5NTQzIDEgMSAxLjg5NTQzIDEgM1Y0WiIKCQkJCWZpbGw9IndoaXRlIiBzdHJva2U9IndoaXRlIiBzdHJva2Utd2lkdGg9IjIiIC8+CgkJCTxwYXRoCgkJCQlkPSJNMyAyNkMzIDI1LjQ0NzcgMy40NDc3MiAyNSA0IDI1SDE4QzE4LjU1MjMgMjUgMTkgMjUuNDQ3NyAxOSAyNlYyOEMxOSAyOC41NTIzIDE4LjU1MjMgMjkgMTggMjlINEMzLjQ0NzcyIDI5IDMgMjguNTUyMyAzIDI4VjI2WiIKCQkJCWZpbGw9IiM1NTU5NUUiIC8+CgkJCTxwYXRoCgkJCQlkPSJNNiAzQzQuODk1NDMgMyA0IDMuODk1NDMgNCA1VjI1SDE4VjIxSDExQzkuMzQzMTUgMjEgOCAxOS42NTY5IDggMThDOCAxNi4zNDMxIDkuMzQzMTUgMTUgMTEgMTVIMThWNUMxOCAzLjg5NTQzIDE3LjEwNDYgMyAxNiAzSDZaIgoJCQkJZmlsbD0iI0I3QkFCRiIgLz4KCQkJPHBhdGggZD0iTTEyIDE2SDE1TDEyIDIwSDlMMTIgMTZaIiBmaWxsPSIjRkY1MjUyIiAvPgoJCQk8cGF0aCBkPSJNMTggMTZIMjFMMTggMjBIMTVMMTggMTZaIiBmaWxsPSIjRkY1MjUyIiAvPgoJCQk8cGF0aCBkPSJNMjcgMTZIMjRMMjEgMjBIMjRMMjcgMTZaIiBmaWxsPSIjRkY1MjUyIiAvPgoJCQk8cGF0aAoJCQkJZD0iTTggN0M3LjQ0NzcyIDcgNyA3LjQ0NzcyIDcgOFYxMUM3IDExLjU1MjMgNy40NDc3MiAxMiA4IDEySDE0QzE0LjU1MjMgMTIgMTUgMTEuNTUyMyAxNSAxMVY4QzE1IDcuNDQ3NzIgMTQuNTUyMyA3IDE0IDdIOFoiCgkJCQlmaWxsPSJibGFjayIgLz4KCQkJPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiCgkJCQlkPSJNMyAyQzIuNDQ3NzIgMiAyIDIuNDQ3NzIgMiAzVjRDMiA0LjU1MjI4IDIuNDQ3NzIgNSAzIDVWMjQuMjY3NkMyLjQwMjIgMjQuNjEzNCAyIDI1LjI1OTcgMiAyNlYyOEMyIDI5LjEwNDYgMi44OTU0MyAzMCA0IDMwSDE4QzE5LjEwNDYgMzAgMjAgMjkuMTA0NiAyMCAyOFYyNkMyMCAyNS4yNTk3IDE5LjU5NzggMjQuNjEzNCAxOSAyNC4yNjc2VjIySDI2QzI4LjIwOTEgMjIgMzAgMjAuMjA5MSAzMCAxOEMzMCAxNS43OTA5IDI4LjIwOTEgMTQgMjYgMTRIMTlWNUMxOS41NTIzIDUgMjAgNC41NTIyOCAyMCA0VjNDMjAgMi40NDc3MiAxOS41NTIzIDIgMTkgMkgzWk0xNyA1SDVWMjRIMTdWMjJIMTFDOC43OTA4NiAyMiA3IDIwLjIwOTEgNyAxOEM3IDE1Ljc5MDkgOC43OTA4NiAxNCAxMSAxNEgxN1Y1Wk00IDI2VjI4SDE4VjI2SDRaTTExIDE2QzkuODk1NDMgMTYgOSAxNi44OTU0IDkgMThDOSAxOS4xMDQ2IDkuODk1NDMgMjAgMTEgMjBIMjZDMjcuMTA0NiAyMCAyOCAxOS4xMDQ2IDI4IDE4QzI4IDE2Ljg5NTQgMjcuMTA0NiAxNiAyNiAxNkgxMVoiCgkJCQlmaWxsPSJibGFjayIgLz4KCQk8L2c+Cgk8L2c+Cgk8ZGVmcz4KCQk8Y2xpcFBhdGggaWQ9ImNsaXAwXzc0MzdfMzQwNSI+CgkJCTxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIC41OTdoMzJ2MzJIMHoiIC8+CgkJPC9jbGlwUGF0aD4KCQk8Y2xpcFBhdGggaWQ9ImNsaXAxXzc0MzdfMzQwNSI+CgkJCTxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIC41OTdoMzJ2MzJIMHoiIC8+CgkJPC9jbGlwUGF0aD4KCTwvZGVmcz4KPC9zdmc+';
    // Alertas: círculo amarelo
    const imgAlert = 'data:image/png;base64,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';
    // Jams: círculo vermelho
    const imgJam = 'data:image/png;base64,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';

    // Haversine formula to calculate distance between two lat/lon points in km
    function haversine(lat1, lon1, lat2, lon2) {
        const R = 6371; // Earth radius in km
        const toRad = x => x * Math.PI / 180;
        const dLat = toRad(lat2 - lat1);
        const dLon = toRad(lon2 - lon1);
        const a = Math.sin(dLat/2) * Math.sin(dLat/2) +
              Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) *
              Math.sin(dLon/2) * Math.sin(dLon/2);
        const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
        return R * c;
    }

    // Calcula o comprimento total dos jams (em km)
    function totalJamLength(jams) {
        let total = 0;
        if (!Array.isArray(jams)) return 0;
        jams.forEach(jam => {
            if (Array.isArray(jam.line)) {
                for (let i = 0; i < jam.line.length - 1; i++) {
                    const p1 = jam.line[i], p2 = jam.line[i+1];
                    total += haversine(p1.y, p1.x, p2.y, p2.x);
                }
            }
        });
        return total;
    }

    const origFetch = window.fetch;

    window.fetch = function(...args) {
        return origFetch.apply(this, args).then(response => {
            if (response.url.includes("/live-map/api/user-drive")) {
                response.clone().json().then(function(data) {
                    const infoArr = [];
                    (data["alternatives"] || []).forEach(function(route, index) {
                        const tollInfo = route?.response?.tollPriceInfo;
                        const tollText = (tollInfo && Object.keys(tollInfo).length > 0)
                        ? `${tollInfo.tollPrice} ${tollInfo.tollPriceCurrencyCode}`
                            : null;
                        const jamsArr = Array.isArray(route?.response?.jams) ? route.response.jams : [];
                        const jams = jamsArr.length;
                        const jamLength = totalJamLength(jamsArr);
                        const alerts = Array.isArray(route?.response?.alerts) ? route.response.alerts.length : 0;
                        infoArr[index] = { tollText, jams, jamLength, alerts };
                    });

                    setTimeout(function() {
                        document.querySelectorAll('.wm-routes-item-desktop__details').forEach(function(el, idx) {
                            if (typeof infoArr[idx] !== 'undefined') {
                                const span = el.querySelector("span[dir='auto']");
                                if (span) {
                                    // Evitar duplicação se o script correr mais que uma vez
                                    if (!span.innerHTML.includes(imgToll) && !span.innerHTML.includes(imgAlert) && !span.innerHTML.includes(imgJam)) {
                                        if (infoArr[idx].tollText != null) {
                                            span.innerHTML += `<br><img src="${imgToll}" alt="Tolls" style="width:21px;height:21px;vertical-align:middle;"> <b>${infoArr[idx].tollText}</b>`;
                                        }
                                        span.innerHTML += `<br><img src="${imgAlert}" alt="Alerts" style="width:21px;height:21px;vertical-align:middle;"> <b>${infoArr[idx].alerts}</b>`;
                                        if (infoArr[idx].jams > 0) {
                                            span.innerHTML += `<br><img src="${imgJam}" alt="Jams" style="width:21px;height:21px;vertical-align:middle;"> <b>${infoArr[idx].jams} (${infoArr[idx].jamLength.toFixed(2)} km)</b>`;
                                        } else {
                                            span.innerHTML += `<br><img src="${imgJam}" alt="Jams" style="width:21px;height:21px;vertical-align:middle;"> <b>0</b>`;
                                        }

                                    }
                                }
                            }
                        });
                    }, 500);
                });
            }
            return response;
        });
    };
})();