WME Simple Alert Messages

changes the styling of the segment and venue messages

当前为 2022-12-06 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         WME Simple Alert Messages
// @namespace    https://fxzfun.com/
// @version      1.3
// @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);

                // 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("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);
    }

})();