WAZEPT Segments

Facilitates the standardization of segments

目前為 2020-08-23 提交的版本,檢視 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         WAZEPT Segments
// @version      2020.08.23
// @description  Facilitates the standardization of segments
// @author       J0N4S13 ([email protected])
// @include 	   /^https:\/\/(www|beta)\.waze\.com\/(?!user\/)(.{2,6}\/)?editor.*$/
// @exclude        https://www.waze.com/user/*editor/*
// @exclude        https://www.waze.com/*/user/*editor/*
// @grant        none
// @namespace https://greasyfork.org/users/218406
// ==/UserScript==

(function() {
    var version = GM_info.script.version;
    setTimeout(function() {var myVar = setInterval(myTimer ,500);}, 2000);
    var indexselected = "";
    var valueselected = "";
    var array_data = {};
    var array_roads = {};

    function receivedata() {
        return new Promise(resolve => {
            var url_data = "https://spreadsheets.google.com/feeds/list/1s_vcC-ENS7JdkVmVH2QceGMA058tan2UUPlQGd6AhwU/1/public/values?alt=json";

            $.getJSON(url_data, function(data) {

                var entry = data.feed.entry;

                $(entry).each(function(){
                    var elem = [this.gsx$emoji.$t, this.gsx$descricao.$t, this.gsx$bloqueio.$t];
                    array_data[ this.gsx$funcionalidade.$t ] = elem;
                    array_roads[this.gsx$funcionalidade.$t] = [this.gsx$emoji.$t, this.gsx$descricao.$t];
                });
            });
            var timer = setInterval(check_data, 100);

            function check_data() {
                if(eval("array_data['SEG_ESTACIONAMENTO'] !== undefined"))
                {
                    clearInterval(timer);
                    resolve('true');
                }
            }

        });
    }

    function optionsUser() {

        var $auto_link;
        var $settings = $('<li><a href="#sidepanel-LAND" data-toggle="tab" aria-expanded="true">LAND</a></li>');
        $("#user-tabs ul").append($settings);

        var $home = $('<div id="sidepanel-LAND" class="tab-pane"><b>WME Landmark</b><br><br><b><i>Definições</i></b><br><br>');
        var div_sidepnale = document.createElement("div");
        div_sidepnale.id = "sidepanel-LAND";
        div_sidepnale.className = "tab-pane";

        var label_home = document.createElement("label");
        label_home.innerHTML = 'WAZEPT Landmark (Version: ' + version + ")";
        label_home.style.cssText = 'font-size: 15px;color:blue;';
        div_sidepnale.appendChild(label_home);

        $("div.tab-content")[0].prepend(div_sidepnale);
    }

    async function dataCall() {
        var result = await receivedata();
        //optionsUser();
    }

    setTimeout(() => {
        dataCall();
    }, 500);

    function myTimer() {
        var n_bloqueio;
        var nivel;
        var lvl_atual;
        var lvl_max;

        var typeData = null;
        if(eval("W.selectionManager.getSelectedFeatures()[0] !== undefined"))
            typeData = W.selectionManager.getSelectedFeatures()[0].model.type;

        if(typeData == "segment")
        {

            if (!$("#signsroad").length) {
                var signsroad = document.createElement("div");
                signsroad.id = 'signsroad';

                $.each(array_roads, function(func , emoji) {

                    // The sign background
                    var addsign = document.createElement("div");
                    addsign.id = 'sign_' + func;

                    // Get width/height of sign background img
                    addsign.style.cssText = 'cursor:pointer;float:left;width:34px;height:34px;';
                    // Credits for some of these parts go to t0cableguy & Rickzabel
                    addsign.onclick = function() {

                        indexselected = func;

                        if(indexselected == 'SEG_ESTACIONAMENTO')
                        {
                            defineRoadType(20);
                            defineSpeed("30");
                            defineLockRankRoad(array_data['SEG_ESTACIONAMENTO'][0]);
                            defineStreetRoad("");
                        }

                        if(indexselected == 'SEG_SECUNDARIA')
                        {
                            defineRoadType(1);
                            defineSpeed("50");
                            defineLockRankRoad(array_data['SEG_SECUNDARIA'][0]);
                        }

                        if(indexselected == 'SEG_PRINCIPAL')
                        {
                            defineRoadType(2);
                            defineSpeed("50");
                            defineLockRankRoad(array_data['SEG_PRINCIPAL'][0]);
                        }

                        if(indexselected == 'SEG_MUNICIPAL')
                        {
                            defineRoadType(7);
                            defineSpeed("90");
                            defineLockRankRoad(array_data['SEG_MUNICIPAL'][0]);
                        }

                        if(indexselected == 'SEG_NACIONAL')
                        {
                            defineRoadType(6);
                            defineSpeed("90");
                            defineLockRankRoad(array_data['SEG_NACIONAL'][0]);
                        }

                        if(indexselected == 'SEG_RESERVADA')
                        {
                            defineRoadType(3);
                            defineSpeed("100");
                            defineLockRankRoad(array_data['SEG_RESERVADA'][0]);
                        }

                        if(indexselected == 'SEG_AUTOESTRADA')
                        {
                            defineRoadType(3);
                            defineSpeed("120");
                            defineLockRankRoad(array_data['SEG_AUTOESTRADA'][0]);
                        }

                        if(indexselected == 'LD_ROTUNDA')
                        {
                            let coords = [];
                            let segsfeitos = [];
                            let segmentos = W.selectionManager.getSelectedFeatures()[0].model.getRoundabout().attributes.segIDs;
                            let primeiro = W.selectionManager.getSelectedFeatures()[0].model.attributes.id;
                            let segmento = primeiro;
                            let feitos = 0;

                            do{
                                let seg = W.selectionManager.model.segments.getObjectById(segmento);
                                let geo = seg.geometry.components
                                for (let i=0; i<geo.length - 1; i++) {
                                    let linha = [geo[i].x, geo[i].y];
                                    coords.push(linha);
                                }

                                W.selectionManager.model.nodes.getObjectById(seg.attributes.toNodeID).attributes.segIDs.forEach(function(aux){
                                    if(aux != segmento && segmentos.includes(aux) && !segsfeitos.includes(aux))
                                    {
                                        segsfeitos.push(segmento);
                                        segmento = aux;
                                    }
                                });
                                feitos++;
                            } while (feitos < segmentos.length)

                                let AddLandmark= require("Waze/Action/AddLandmark");
                            var wazefeatureVectorLandmark = require("Waze/Feature/Vector/Landmark");

                            var poi = new wazefeatureVectorLandmark();
                            var geometry = new OpenLayers.Geometry.Polygon();

                            var TabLine2 = [];

                            for (var n=0; n < coords.length; n++)
                            {
                                var point = new OpenLayers.Geometry.Point(coords[n][0] ,coords[n][1]);
                                TabLine2.push(point);
                            }


                            var LineString2 = new OpenLayers.Geometry.LinearRing(TabLine2);
                            poi.geometry = new OpenLayers.Geometry.Polygon(LineString2);
                            poi.attributes.categories = new Array("FARM","JUNCTION_INTERCHANGE");

                            let rank = array_data['LD_ROTUNDA'][0];
                            rank--;
                            let bloquear;
                            if(W.loginManager.user.rank >= rank)
                                bloquear = rank;
                            else
                                bloquear = W.loginManager.user.rank;
                            poi.attributes.lockRank = bloquear;

                            W.model.actionManager.add(new AddLandmark(poi));

                        }

                        if(indexselected == 'DATA_PORTAGENS')
                        {

                            let myRoad = W.selectionManager.getSelectedFeatures()[0].model.attributes;

                            var from = "";
                            var to = "";
                            var sentido = "";

                            if(myRoad.fwdDirection == true && myRoad.revDirection == true)
                            {
                                $( "#divSentidos" ).show();
                            }
                            else
                            {
                                if(myRoad.fwdDirection == true) //A to B
                                {
                                    from = myRoad.fromNodeID;
                                    to = myRoad.toNodeID;
                                    sentido = "TRUE";
                                }

                                else if(myRoad.revDirection == true)//B to A
                                {
                                    from = myRoad.toNodeID;
                                    to = myRoad.fromNodeID;
                                    sentido = "FALSE";
                                }
                                var $temp = $("<input>");
                                $("body").append($temp);
                                $temp.val(sentido + "|" + $('a[class=permalink]').attr('href') + "|" + from + "|" + to).select();
                                document.execCommand("copy");
                                $temp.remove();
                            }

                        }

                    }
                    if($('span[class=full-address]').text().indexOf('Portugal') != -1 || func == "DATA_PORTAGENS")
                    {
                        var emojivalue = document.createElement("div");
                        emojivalue.id = 'emoji_' + func;
                        emojivalue.style.cssText = 'text-align:center;font-size:14px;visibility:visible;';
                        emojivalue.innerHTML = emoji[0];
                        emojivalue.title = emoji[1];
                        addsign.appendChild(emojivalue);
                        signsroad.appendChild(addsign);
                    }
                });

                var btnAB = document.createElement("button");
                btnAB.innerHTML = 'A->B';
                btnAB.id = 'btnAB';
                btnAB.style.cssText = 'height: 20px;font-size:11px';

                btnAB.onclick = function() {
                    let myRoad = W.selectionManager.getSelectedFeatures()[0].model.attributes;
                    if(myRoad.fwdDirection == true) //A to B
                    {
                        var $temp = $("<input>");
                        $("body").append($temp);
                        $temp.val("TRUE" + "|" + $('a[class=permalink]').attr('href') + "|" + myRoad.fromNodeID + "|" + myRoad.toNodeID).select();
                        document.execCommand("copy");
                        $temp.remove();
                    }
                }

                var btnBA = document.createElement("button");
                btnBA.innerHTML = 'B->A';
                btnBA.id = 'btnBA';
                btnBA.style.cssText = 'height: 20px;font-size:11px';

                btnBA.onclick =  function() {
                    let myRoad = W.selectionManager.getSelectedFeatures()[0].model.attributes;
                    if(myRoad.revDirection == true) //B to A
                    {
                        var $temp = $("<input>");
                        $("body").append($temp);
                        $temp.val("FALSE" + "|" + $('a[class=permalink]').attr('href') + "|" + myRoad.toNodeID + "|" + myRoad.fromNodeID).select();
                        document.execCommand("copy");
                        $temp.remove();
                    }
                }

                var divSentidos = document.createElement("div");
                divSentidos.id = 'divSentidos';
                divSentidos.appendChild(btnAB);
                divSentidos.appendChild(btnBA);

                var divLandmarkScript = document.createElement("div");
                divLandmarkScript.id = 'divLandmarkScript';
                divLandmarkScript.style.cssText = 'float:left;';
                divLandmarkScript.appendChild(signsroad);
                divLandmarkScript.appendChild(divSentidos);

                $("div #segment-edit-general").prepend(divLandmarkScript);
                $( "#divSentidos" ).hide();
            }
        }
    }

    function getSelectedVenue() {
        const features = WazeWrap.getSelectedFeatures();
        // Be sure to check for features.length === 1, in case multiple venues are currently selected.
        return features.length === 1 && features[0].model.type === 'venue'
            ? features[0].model : undefined;
    }

    function defineSpeed (speed) {
        let UpdateObject= require("Waze/Action/UpdateObject");
        $.each(W.selectionManager.getSelectedFeatures(), function(i, segment) {
            var seg_id = segment.model.getID();
            var seg = W.model.segments.getObjectById(seg_id);
            if(segment.model.attributes.fwdMaxSpeed == null && segment.model.attributes.fwdMaxSpeed == null)
                W.model.actionManager.add(new UpdateObject(seg, {'fwdMaxSpeed': speed, 'revMaxSpeed': speed}));
            else if(segment.model.attributes.fwdMaxSpeed == null)
                W.model.actionManager.add(new UpdateObject(seg, {'fwdMaxSpeed': speed}));
            else if(segment.model.attributes.fwdMaxSpeed == null)
                W.model.actionManager.add(new UpdateObject(seg, {'revMaxSpeed': speed}));
        });
    }

    function defineRoadType (type) {
        let UpdateObject= require("Waze/Action/UpdateObject");
        $.each(W.selectionManager.getSelectedFeatures(), function(i, segment) {
            var seg_id = segment.model.getID();
            var seg = W.model.segments.getObjectById(seg_id);
            W.model.actionManager.add(new UpdateObject(seg, {'roadType': type}));
        });
    }

    function defineLockRankRoad (rank) {
        let UpdateObject= require("Waze/Action/UpdateObject");
        rank--;
        var bloquear;
        if(W.loginManager.user.rank >= rank)
            bloquear = rank;
        else
            bloquear = W.loginManager.user.rank;
        $.each(W.selectionManager.getSelectedFeatures(), function(i, segment) {
            let lock = segment.model.attributes.lockRank;
            var seg_id = segment.model.getID();
            var seg = W.model.segments.getObjectById(seg_id);
            if(lock < bloquear)
                W.model.actionManager.add(new UpdateObject(seg, {'lockRank': bloquear}));
        });
    }

    function defineStreetRoad(street) {
        let UpdateFeatureAddress = require("Waze/Action/UpdateFeatureAddress");
        $.each(W.selectionManager.getSelectedFeatures(), function(i, segment) {
            var seg_id = segment.model.getID();
            if(seg_id == "-100")
            {
                $("input[id=empty-street]").prop('checked', true).change().focusout();
                $("input[id=empty-city]").prop('checked', true).change().focusout();
                $(".save-button.waze-btn.waze-btn-blue.waze-btn-smaller").trigger('click');
            }
            else
            {
                var seg = W.model.segments.getObjectById(seg_id);
                var address = segment.model.getAddress().attributes;
                var newAddressAtts = {
                    streetName: street,
                    emptyStreet: street==""?true:false,
                    cityName: "",
                    emptyCity: true,
                    countryID: address.country.id
                };
                W.model.actionManager.add(new UpdateFeatureAddress(seg, newAddressAtts,{streetIDField:"primaryStreetID"}));
            }
        });
    }

})();