WME Simple Alert Messages

changes the styling of the segment and venue messages

目前為 2022-10-19 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         WME Simple Alert Messages
// @namespace    https://fxzfun.com/
// @version      1.2
// @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"></i> Locked to L${maxLock}</span>`);
        document.querySelector(".fxzMessage.locked").addEventListener("click", () => {
            var url = fxzGetUrl();
            var city = document.querySelector(".location-info").innerText.split(",")[0];
            var discordFormat = `:unlock${maxLock}: ${city} - *reason* - <${url}>`;
            copyText(discordFormat);
        });
        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"></i> Out of your EA</span>`);
    }

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

    function fxzAddPurMessage() {
        document.querySelector("#fxzMessages").insertAdjacentHTML("beforeEnd", `<span class="fxzMessage pur"><i class="w-icon"></i> PUR Request</span>`);
        document.querySelector(".fxzMessage.pur").addEventListener("click", () => { document.querySelector(".venue-alert-pending-changes span").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"></i> Has Closures</span>`);
    }

    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;

                fxzAddSimpleMessagesContainer(mode);

                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");

                // TODO: add better out of EA matching, currently will not alert for segments above your rank out of your ea
                if (mode == "segment" && (segDetails.innerText.includes("driving area") || segDetails.innerText.includes("editing area")) && W.loginManager.user.rank >= maxLock) {
                    fxzAddEAMessage();
                }

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

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

                // pur
                var purAlert = document.querySelector(".venue-alert-pending-changes");
                if (purAlert && purAlert.style.display != "none") {
                    purAlert.style.display = "none";
                    fxzAddPurMessage();
                }

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

    // bootstrap
    if (location.href.match(/^https:\/\/(www|beta)\.waze\.com\/(?!user\/)(.{2,6}\/)?editor\/?.*$/) != null) {
        var i = setInterval(() => {
            if (W.selectionManager.events) {
                clearInterval(i);
                console.log("WME Simple Alert Messages Styling 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;}`;
                document.body.appendChild(style);
            }
        }, 1000);
    }

})();