WME Simple Alert Messages

changes the styling of the segment and venue messages

当前为 2023-03-15 提交的版本,查看 最新版本

// ==UserScript==
// @name         WME Simple Alert Messages
// @namespace    https://fxzfun.com/
// @version      2.0
// @description  changes the styling of the segment and venue messages
// @author       FXZFun
// @match        https://*.waze.com/*/editor*
// @match        https://*.waze.com/editor*
// @exclude      https://*.waze.com/user/editor*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=waze.com
// @grant        none
// @license      GNU GPL v3
// ==/UserScript==

/* global W, OpenLayers */

(function() {
    'use strict';

    function fxzAddLockMessage(maxLock) {
        document.querySelector("#fxzMessages").insertAdjacentHTML("beforeEnd", `<span class="fxzMessage locked"><i class="w-icon w-icon-lock-fill"></i> Locked to L${maxLock}</span>`);
        document.querySelector(".fxzMessage.locked").addEventListener("click", () => {
            var url = fxzGetUrl();
            var city = document.querySelector(".location-info").innerText.split(",")[0];
            if (document.querySelector(".wmecitiesoverlay-region") != null) city = document.querySelector(".wmecitiesoverlay-region").innerText;
            var discordFormat = `:unlock${maxLock}: ${city} - *reason* - <${url}>`;
            copyText(discordFormat);
            document.querySelector(".fxzMessage.locked").innerHTML = `<span class="fxzMessage locked"><i class="w-icon w-icon-copy"></i> Copied!</span>`;
        });
        document.querySelector(".fxzMessage.locked").title = "Copy unlock request for Discord";
    }

    function fxzAddEAMessage() {
        document.querySelector("#fxzMessages").insertAdjacentHTML("beforeEnd", `<span class="fxzMessage ea"><i class="w-icon w-icon-alert-fill"></i> Out of your EA</span>`);
    }

    function fxzAddMixedMessage() {
        document.querySelector("#fxzMessages").insertAdjacentHTML("beforeEnd", `<span class="fxzMessage mixed"><i class="w-icon w-icon-round-trip"></i> Mixed A/B</span>`);
    }

    function fxzAddPurMessage() {
        document.querySelector("#fxzMessages").insertAdjacentHTML("beforeEnd", `<span class="fxzMessage pur"><i class="w-icon w-icon-location-update-fill"></i> PUR Request</span>`);
        document.querySelector(".fxzMessage.pur").addEventListener("click", () => { document.querySelector(".venue-alerts wz-alert span[slot=action]").click(); });
        document.querySelector(".fxzMessage.pur").title = JSON.parse(document.querySelector("#localeStrings").innerText).edit.venue.update_requests.pending;
    }

    function fxzAddClosureMessage() {
        document.querySelector("#fxzMessages").insertAdjacentHTML("beforeEnd", `<span class="fxzMessage closure"><i class="w-icon w-icon-closure"></i> Has Closures</span>`);
        document.querySelector(".fxzMessage.closure").addEventListener("click", () => { document.querySelector("wz-tabs").shadowRoot.querySelectorAll(".wz-tab-label")[1].click(); });
    }

    function fxzAddSimpleMessagesContainer(mode) {
        var fxzMessagesDiv = document.createElement("div");
        fxzMessagesDiv.id = "fxzMessages";
        if (mode == "segment") document.querySelector("#edit-panel .panel-header-component").insertAdjacentElement("afterEnd", fxzMessagesDiv);
        else if (mode == "venue") document.querySelector(".venue-panel-header").insertAdjacentElement("afterEnd", fxzMessagesDiv);
    }

    function fxzGetUrl() {
        var lonlat = new OpenLayers.LonLat(W.map.getCenter().lon, W.map.getCenter().lat);
        lonlat.transform(new OpenLayers.Projection('EPSG:900913'), new OpenLayers.Projection('EPSG:4326'));
        var zoom = W.map.getZoom();

        var segments = [];
        var venues = [];
        W.selectionManager.getSelectedFeatures().forEach(item => {
            if (item.model.type == "segment") {
                segments.push(item.model.attributes.id);
            } else if (item.model.type == "venue") {
                venues.push(item.model.attributes.id);
            }
        });

        var url = location.href.split("?")[0] + `?env=${W.map.wazeMap.regionCode}&lat=${lonlat.lat}&lon=${lonlat.lon}&zoomLevel=${zoom}`;
        if (segments.length > 0) url += "&segments=" + segments.join(",");
        if (venues.length > 0) url += "&venues=" + venues.join(",");
        return url;
    }

    function copyText(textContent) {
        var text = document.createElement("textarea");
        text.style = "position: fixed;top:0;left:0;width:2px;height:2px;";
        text.innerHTML = textContent;
        document.body.appendChild(text);
        text.select();
        document.execCommand("copy");
        text.style = "display: none";
    }

    function fxzSelectionChange() {
        if (W.selectionManager.getSelectedFeatures().length > 0) {
            var mode = W.selectionManager.getSelectedFeatures()[0].model.type;

            // wait for panel to open
            var i2Count = 0;
            var i2 = setInterval(()=>{
                if (document.querySelector("#edit-panel").style.display != "none" || i2Count++ > 20) clearInterval(i2);
                else return;

                var msgBox = document.getElementById("fxzMessages");
                if (msgBox) msgBox.innerHTML = "";
                else fxzAddSimpleMessagesContainer(mode);

                // clear other messages
                if (mode == "segment") document.querySelector(".segment-alerts").style.display = "none";
                else if (mode == "venue") document.querySelector(".venue-alerts").style.display = "none";

                // locked message
                var maxLock = Math.max(...Array.from(W.selectionManager.getSelectedFeatures()).map(item => item.model.attributes.lockRank));
                var segDetails = document.querySelector(".segment-alerts");

                // out of ea
                if (mode == "segment" && segDetails.innerText.includes("You can only edit segments in your driven area")) {
                    fxzAddEAMessage();
                }

                if (W.loginManager.user.rank < maxLock) {
                    fxzAddLockMessage(maxLock + 1);
                }

                // mixed segments
                if (document.querySelector("wz-alerts-group").innerText.includes("not in the same direction")) {
                    fxzAddMixedMessage();
                }

                // pur
                if (document.querySelector("wz-alerts-group").innerText.includes("pending update")) {
                    fxzAddPurMessage();
                }

                // closure
                if (document.querySelector("wz-alerts-group").innerText.includes("closure")) {
                    fxzAddClosureMessage();
                }
            }, 100);
        }
    }

    function initialize() {
        console.log("WME Simple Alert Messages Loaded");
        W.selectionManager.events.register('selectionchanged', this, fxzSelectionChange);
        // run preselected from url
        if (W.selectionManager.getSelectedFeatures().length > 0) fxzSelectionChange();
        // add styling
        var style = document.createElement("style");
        style.innerHTML = `/* WME Simple Alert Messages Styling */
            #fxzMessages {margin-top: 5px; margin-left: 10px;}
            .fxzMessage {padding: 7px 10px; border-radius: 10px; width: fit-content; margin-left: 5px; white-space: nowrap;}
            .fxzMessage .w-icon {font-size: 20px;vertical-align: middle;}
            .fxzMessage.locked {background-color: #FE5F5D; cursor: pointer;}
            .fxzMessage.ea {background-color: #FF9800;}
            .fxzMessage.mixed {background-color: #42A5F5;}
            .fxzMessage.pur {background-color: #C9B5FF; cursor: pointer;}
            .fxzMessage.closure {background-color: #FE5F5D; cursor: pointer;}`;
        document.body.appendChild(style);
    }

    // bootstrap
    W?.userscripts?.state?.isReady ? initialize() : document.addEventListener("wme-ready", initialize, { once: true });
})();

QingJ © 2025

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