您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Opens the Requests module with precompiled fields to submit an request
当前为
// ==UserScript== // @name WME Requests // @namespace WME-Requests // @description Opens the Requests module with precompiled fields to submit an request // @include https://*.waze.com/editor/* // @include https://*.waze.com/*/editor/* // @include https://*.waze.com/map-editor/* // @include https://*.waze.com/beta_editor/* // @grant none // @author skirda // @version 1.9.2 // ==/UserScript== var wmer_Version = '1.9.2'; var wmer_Form = 'https://docs.google.com/forms/d/1QzvF3-lH8MuuEaSw0GA6LgLW62EiSHzQXBmG5-rQdIQ/viewform'; var wmer_FormCL = 'https://docs.google.com/forms/d/1ck0cCIV6vPy16YQZJvfmM0clOdAE2Z-kDsXn06ZwQ1s/viewform'; var wmer_Docs="https://docs.google.com/spreadsheet/ccc?key=0AtcEFFDNcic4dEE2UFh5X0lDdlRZbno3YVFYUkg0Unc"; var wmer_DocsCL="https://docs.google.com/spreadsheets/d/1ddcW8EmNjojJp7EQ4AYPdfBqNWe28WqRaQ_RtkB8JAU"; var wmer_CountDays = 5; var wmer_UserCache = new Array(); var wmer_LanguageRU = false; function wmer_bootstrap() { wmer_LanguageRU=window.location.href.indexOf("/ru/") > 0?true:false; if (typeof unsafeWindow === "undefined") { unsafeWindow = ( function () { var dummyElem = document.createElement('p'); dummyElem.setAttribute('onclick', 'return window;'); return dummyElem.onclick(); }) (); } /* begin running the code! */ wmer_Init(); } function consoleLog(text) { console.log('WMEUnlockRequest v. ' + wmer_Version + ': ' + text); } function dump(obj) { var out = ""; if(obj && typeof(obj) == "object"){ for (var i in obj) { out += i + ": " + obj[i] + "\n"; } } else { out = obj; } return out; } function wmer_getUsername() { var thisUser = Waze.loginManager.user; if (thisUser === null) { alert(wmer_LanguageRU?'Невозможно получить имя текущего пользователя':'Nobody\'s logged in.'); return ""; } return Waze.loginManager.user.userName; } function wmer_getCCSD(segment){ // BUBBUB!!! need use "hasOwnProperty" or "in" consoleLog("start wmer_getCCSD"); var oID=""; var streetName=""; var sityName=""; var countryName=""; var description=""; var typeName= ""; var cityID=""; var userID=""; var forumUserID=""; var userName=""; try { typeName=segment.type; /* "segment" "venue" "node" "camera" typeName: "Speed camera" */ oID=segment.fid; var attributesObj=segment.attributes; if (attributesObj.hasOwnProperty('primaryStreetID')) { //Waze.model.streets.get(Waze.selectionManager.selectedItems[0].attributes.primaryStreetID).cityID consoleLog("found street"); var sID=attributesObj.primaryStreetID; var streetsObj = wazeModel.streets.get(sID); cityID=streetsObj.cityID; streetName=streetsObj.name; } else if (typeName === "camera") { //Waze.selectionManager.selectedItems[0].model.segments.topCityID consoleLog("found camera"); streetName=segment.typeName; description="\rSpeed: "+attributesObj.speed+"\rValidated: "+attributesObj.validated + "\rAzymuth: "+attributesObj.azymuth+"\rType: "+attributesObj.type; cityID=segment.model.segments.topCityID; if (cityID == null) cityID=""; } else if (typeName === "node") { //Waze.selectionManager.selectedItems[0].model.segments.topCityID consoleLog("found node"); cityID=''+segment.model.segments.topCityID; if (cityID == null) cityID=""; description="count segment(s)="+attributesObj.segIDs.length; } else // "venue" { consoleLog("found POI ("+typeName+")"); //Waze.model.streets.get(Waze.selectionManager.selectedItems[0].attributes.streetID).cityID var sID=attributesObj.streetID; if (sID == null) cityID=""; else cityID=wazeModel.streets.get(sID).cityID; if (sID == null) cityID=""; description='\rCategories: '+Waze.selectionManager.selectedItems[0].attributes.categories.join(';') + '.\r' + attributesObj.description; if (Waze.selectionManager.selectedItems[0].attributes.categories.indexOf("GAS_STATION") != -1) // Gas Station { typeName="gas station" description="Brand: "+attributesObj.brand + "\rAddress: " + attributesObj.address + "\nDescription: " + attributesObj.description } streetName=attributesObj.name; } if (!(typeName === "camera" || typeName === "node" || cityID === "")) // BUGBUG!!! { console.log('WMEUnlockRequest v. ' + wmer_Version + ': cityID=' + cityID); var cityObj=wazeModel.cities.get(cityID); var countryID=cityObj.countryID; sityName=cityObj.name; var countriesObj=wazeModel.countries.get(countryID); countryName = countriesObj.name; } if (!(typeName === "node")) { userID=attributesObj.updatedBy; if (userID == null) userID=attributesObj.createdBy; if (userID==-1 || userID == null) { userID=attributesObj.createdBy; if (userID==-1) { consoleLog("Do not PM Admin!"); } } userName=wazeModel.users.get(userID).userName; consoleLog("userName="+userName); } else userID="-1"; consoleLog("userID=" +userID); } catch (err) { console.log('WMEUnlockRequest v. ' + wmer_Version + ': error: ' +err.name); } consoleLog("return from wmer_getCCSD"); return { objid : oID, type : typeName, street : streetName, sity : sityName, cityID : cityID, country : countryName, description : description, username : userName, userID : userID, forumuserID : forumUserID }; } function wmer_userRank(segment) { var usrRank = 0; if (segment.attributes.lockRank) { var updatedBy = wazeModel.users.get(segment.attributes.updatedBy); return updatedBy != null ? updatedBy.rank : 0; } return 0; } //It returns the maximum lock level function wmer_GetLevel() { //attributes.rank dovrebbe essere il road rank var sel = Waze.selectionManager.selectedItems; var maxR = wmer_userRank(sel[0]); for (i = 1; i < sel.length; i++) { if (maxR == 5) { return 6; } var usrRank = wmer_userRank(sel[i]); if (usrRank > maxR) { maxR = usrRank; } } return maxR + 1; } function click_WMERequest() { consoleLog("click_WMERequest()::Action: "+this.id); if (typeof Waze.selectionManager === "undefined") { consoleLog('Waze.selectionManager not found'); return; } if (Waze.selectionManager.selectedItems.length == 0) { alert(wmer_LanguageRU?'Нет выделенных объектов':'No selected segments.'); return; } if (Waze.selectionManager.selectedItems.length < 2 && this.id == 'wmerBtn_join') { alert(wmer_LanguageRU?'Вы должны выделить 2 сегмента':'You must select 2 segments.'); return; } var username = wmer_getUsername(); var sccObj = wmer_getCCSD(Waze.selectionManager.selectedItems[0]); var lockLevel = wmer_GetLevel(); if (lockLevel == 1 && this.id == 'wmerBtn_lock') { alert(wmer_LanguageRU?'Выбранные сегменты уже разблокированы':'Selected segments are already unlocked'); return; } consoleLog("My level: "+Waze.loginManager.user.normalizedLevel); consoleLog("Lock level: "+lockLevel); if (lockLevel <= Waze.loginManager.user.normalizedLevel && this.id == 'wmerBtn_lock') { alert(wmer_LanguageRU?'Выбранные сегменты имеют доступный вам уровень блокировки':'Selected segments have a lock level that is less or equal to yours') return; } var description='type: ' + sccObj.type + '\r' + 'country: '+ sccObj.country + '\r' + 'sity: ' + sccObj.sity + '\r' + 'street/name: ' + sccObj.street + '\r' + 'description: ' + sccObj.description; description = description.replace(/%/g, '%25'); description = description.replace(/\+/g, '%2B'); // + description = description.replace(' ', '%20'); // ' ' description = description.replace(/\r\n/g, '\r'); // '\r\n' description = description.replace(/\r/g, '%0A'); // '\n' description = description.replace(/&/g, '%26'); description = description.replace(/</g, '%3C'); description = description.replace(/\>/g, '%3E'); description = description.replace(/\?/g, '%3F'); description = description.replace(/=/g, '%3D'); var permalink = wmer_generate_permalink(); consoleLog("permalink=" + permalink); permalink = permalink.replace(/%/g, '%25'); //??? permalink = permalink.replace(/&/g, '%26'); permalink = permalink.replace(/\?/g, '%3F'); permalink = permalink.replace(/=/g, '%3D'); permalink = permalink.replace(/</g, '%3C'); permalink = permalink.replace(/\>/g, '%3E'); //You can get entry numbers in google stylesheet: "Answers->Get precompiled URL" var curDate=new Date(); curDate.setDate(curDate.getDate() + wmer_CountDays); var action=""; switch(this.id) { case 'wmerBtn_lock': action='lock'; break; case 'wmerBtn_join': action='join'; break; case 'wmerBtn_dir': action='direction'; break; } function zero2(d){ if((""+d).length == 1) d="0" + "" + d; return d; } var url = wmer_Form + '?entry.1230839078=' + username + '&entry.390417455=' + permalink + '&entry.1224334113=' + lockLevel + '&entry.1508498769=' + sccObj.country + '&entry.1856604039=' + action + '&entry.259824358=' + description + '&entry.571885954='+curDate.getFullYear()+'-'+zero2(curDate.getMonth()+1)+'-'+zero2(curDate.getDate()); //entry.1797072526=e-mail // https://docs.google.com/forms/d/1ck0cCIV6vPy16YQZJvfmM0clOdAE2Z-kDsXn06ZwQ1s/viewform? /* entry.1109766685=skirda [email protected] entry.1300384005=http://permalink entry.1967623256=name entry.1408672148=%D0%B3%D0%BE%D1%80%D0%BE%D0%B4 entry.327157830=state entry.677704585=region */ var urlCL = wmer_FormCL + '?entry.1109766685=' + username + '&entry.1300384005=' + permalink + ''; //consoleLog(url); window.open(this.id == 'wmerBtn_cl'?urlCL:url, '_blank'); } function wmer_generate_permalink() { var wcp=document.getElementsByClassName('WazeControlPermalink'); for(var i=0; i < wcp.length; ++i) for (var j=0; j < wcp[i].getElementsByTagName('a').length;++j) { var href=wcp[i].getElementsByTagName('a')[j].href; if (href.indexOf(".waze.com/") > 0 && href.indexOf("/editor") > 0) { return href; } } return ""; } function wmer_insertButton() { if(document.getElementById('WME.Request_' + wmer_Version) != null) document.getElementById('WME.Request_' + wmer_Version).setAttribute('style', 'display:'+(Waze.selectionManager && Waze.selectionManager.selectedItems.length == 0?'none':'')+';'); if(Waze.selectionManager.selectedItems.length == 0) return; var editPanelID=''; var disabled=false; var disabledLock=false; var disabledPM=false; if (document.getElementById('segment-edit-general') != null) { editPanelID='segment-edit-general'; disabled=false; disabledLock=false; } else if (document.getElementById('landmark-edit-general') != null) { editPanelID='landmark-edit-general'; disabledLock=false; disabled=true; } else if (document.getElementById('node-edit-general') != null) { editPanelID='node-edit-general'; disabled=true; disabledPM=true; disabledLock=true; } else if (document.getElementById('edit-panel') != null) { editPanelID='edit-panel'; disabled=true; disabledLock=true; } if(document.getElementById('WME.Request_' + wmer_Version) == null) { srsCtrl = document.createElement('section'); srsCtrl.id = 'WME.Request_' + wmer_Version; srsCtrl.innerHTML = '<hr>'+ '<a href="' + wmer_Docs + '" target="_gdocRequest">Requests:</a> '+ '(<a href="https://www.waze.com/forum/viewtopic.php?p=662218#p662218" title="WME Requests ' + wmer_Version + '" style="font-size: 10px" target="_blank">?</a>) / '+ '<a href="' + wmer_DocsCL + '" target="_gdocRequest">CityLock:</a> '+ '(<a href="https://www.waze.com/forum/viewtopic.php?f=787&t=105793" title="City Lock ' + wmer_Version + '" style="font-size: 10px" target="_blank">?</a>)'+ '</br>'+ '<button id="wmerBtn_lock" class="btn btn-default" style="font-size:9px;padding:6px 10px" title="'+ (wmer_LanguageRU?'Отправить запрос на изменение уровня блокировки объектов':'Send a request to lock/unlock segment(s)')+ '"><i class="icon-unlock"></i> Lock</button> ' + '<button id="wmerBtn_join" class="btn btn-default" style="font-size:9px;padding:6px 10px" title="'+ (wmer_LanguageRU?'Отправить запрос на присоединение сегментов':'Send a request to join several segments')+ '"><i class="icon-cogs"></i> Join</button> ' + '<button id="wmerBtn_dir" class="btn btn-default" style="font-size:9px;padding:6px 10px" title="'+ (wmer_LanguageRU?'Отправить запрос на изменение направления движения сегментов':'Send a request to change the direction of segment(s)')+ '"><i class="icon-random"></i> Dir</button> ' + '<button id="wmerBtn_pm" class="btn btn-default" style="font-size:9px;padding:6px 10px" title="'+ (wmer_LanguageRU?'Отправить приватное сообщение в форум авторам выделенных объектов':'Send (in forum) a Private Message to the author of the segment')+ '"><i class="icon-envelope"></i> PM</button> ' + '<button id="wmerBtn_cl" class="btn btn-default" style="font-size:9px;padding:6px 10px" title="'+ (wmer_LanguageRU?'Отправить запрос на изменение наименования населенного пункта':'Send a request to CityLock')+ '"><i class="icon-home"></i> City</button>' + '</br><span id="wmerCityID"></span>'+ '<hr>'; document.getElementById(editPanelID).appendChild(srsCtrl); document.getElementById('wmerBtn_lock').onclick = click_WMERequest; document.getElementById('wmerBtn_dir').onclick = click_WMERequest; document.getElementById('wmerBtn_join').onclick = click_WMERequest; document.getElementById('wmerBtn_pm').onclick = click_submitPMForm; document.getElementById('wmerBtn_cl').onclick = click_WMERequest; var sccObj = wmer_getCCSD(Waze.selectionManager.selectedItems[0]); consoleLog("WME.Request_" + wmer_Version +": " + sccObj.cityID); document.getElementById('wmerCityID').innerHTML='<small>cityID: '+sccObj.cityID+'</small>'; consoleLog("WME.Request_" + wmer_Version +" initialised"); } if(document.getElementById('WME.Request_' + wmer_Version) != null) { document.getElementById('wmerBtn_lock').disabled=disabledLock; document.getElementById('wmerBtn_dir').disabled=disabled; document.getElementById('wmerBtn_join').disabled=disabled; document.getElementById('wmerBtn_pm').disabled=disabledPM; document.getElementById('wmerBtn_cl').disabled=disabled; } } // <WME Fancy permalink> - http://userscripts.org/users/548866 function getId(node) { return document.getElementById(node); } function getForumUserIdFromID(wmeUserID) { consoleLog("call getForumUserIdFromID(" + wmeUserID + ")"); var userName=wazeModel.users.get(wmeUserID); console.dir(userName); return (getForumUserIdFromName(userName.userName)); } function getForumUserIdFromName(userName) { consoleLog("call getForumUserIdFromName(" + userName + ")"); var forumID=-1; var forumIDs=new Array(); if (userName.indexOf('/')!=-1) { var userNames=userName.split('/'); for (var i=0; i<userNames.length; i++) { forumID=getForumUserIdFromName(userNames[i]); forumIDs[i]=forumID[0]; } return forumIDs; } consoleLog("looking for " + userName + " in the forum."); var xhr3_object; if(window.XMLHttpRequest) // Firefox & Chrome xhr3_object = new XMLHttpRequest(); else if(window.ActiveXObject) // Internet Explorer xhr3_object = new ActiveXObject("Microsoft.XMLHTTP"); xhr3_object.open("GET", "https://www.waze.com/forum/memberlist.php?username=" + userName, false); xhr3_object.onreadystatechange = function() { if(xhr3_object.readyState == 4) { var test = xhr3_object.responseText.match(/u=([0-9]+)"/g); if (test==null) { consoleLog('Forum return null'); return(-1); // no match } if (test.length>1) { consoleLog('Forum return multiple match:'); console.dir(test); return(-2); // multiple match } forumID=test[0].substring(2, test[0].length-1); } }; console.dir(xhr3_object); try { xhr3_object.send(null); } catch (err) { consoleLog("XMLHttpRequest error: " +err.name); console.dir(err); return(-3); } forumIDs[0]=forumID; return (forumIDs); } function click_submitPMForm() { if (typeof Waze.selectionManager === "undefined") { consoleLog('Waze.selectionManager not found'); return; } if (Waze.selectionManager.selectedItems.length == 0) { alert(wmer_LanguageRU?'Сначала необходимо выделить сегмент':'Please, select one segment before'); return false; } //------------- var sccObjs=new Array(); for (var i=0; i < Waze.selectionManager.selectedItems.length; ++i) { var sccObj = wmer_getCCSD(Waze.selectionManager.selectedItems[i]); if (sccObj.userID==-1) { consoleLog("PM request - Do not PM Admin!"); alert("Can't PM admin!"); return false; } var j; for (j=0; j < wmer_UserCache.length; j+=2) { if (wmer_UserCache[j] === sccObj.userID) { sccObj.forumuserID=wmer_UserCache[j+1]; consoleLog("found ["+j+"]"+wmer_UserCache[j+1]); break; } } if (sccObj.forumuserID == "") { consoleLog("not found "+sccObj.userID); sccObj.forumuserID=getForumUserIdFromID(sccObj.userID); wmer_UserCache.push(sccObj.userID,sccObj.forumuserID); } sccObjs.push(sccObj); } var forumIDs=new Array(); for (var i=0; i < sccObjs.length; ++i) forumIDs[i]=sccObjs[i].forumuserID; //------------- if (forumIDs.length==1 && forumIDs[0]==-1) { consoleLog("PM request - User never logged to the forum..."); alert(wmer_LanguageRU?'Автор сегмента не найден на форуме':'Sorry: unable to find the user in the forum'); return false; } if (forumIDs.length==1 && forumIDs[0]==-2) { consoleLog("PM request - Several users match name. Should never happen :s"); alert(wmer_LanguageRU?'Найдено более одного пользователя\nОтправьте сообщение самостоятельно.':'Sorry: more than one user found in the forum.\nYou should look for him/her by yourself.'); return false; } if (forumIDs.length==1 && forumIDs[0]==-3) { consoleLog("A network error occurred."); alert(wmer_LanguageRU?'Сетевые проблемы\nОтправьте сообщение самостоятельно.':'Sorry: a network error occurred.\nYou should look for him/her by yourself.'); return false; } consoleLog("PM request - all OK. go to PM!"); var formID="WMER-PM-FORM"; var nodePM; if (getId("WMER-PM-Send") == null) { nodePM= document.createElement('div'); nodePM.id = 'WMER-PM-Send'; nodePM.style.display='hidden'; getId('WME.Request_' + wmer_Version).appendChild(nodePM); } else { nodePM=getId("WMER-PM-Send"); } var PMForm; PMForm='<form id="' + formID + '" target="_blank" method="post" style="display: inline">'; PMForm+='<input id="' + formID + '-subject" type="hidden" name="subject" value="" />'; PMForm+='<input type="hidden" name="addbbcode20" value="100" />'; PMForm+='<input id="' + formID + '-message" type="hidden" name="message" value="" />'; PMForm+='<input type="hidden" name="preview" value="Preview" />'; PMForm+='<input type="hidden" name="attach_sig" value="on" />'; PMForm+='<input id="' + formID + '-ct" type="hidden" name="creation_time" value="0" />'; PMForm+='<input id="' + formID + '-lc" type="hidden" name="lastclick" value="0" />'; for (var i=0; i<forumIDs.length; i++) { PMForm+='<input type="hidden" name="address_list[u]['+forumIDs[i]+']" value="to" />'; } PMForm+='</form>'; nodePM.innerHTML=PMForm; var permalink=wmer_generate_permalink(); linkParts=permalink.replace(/#/g, "").split('&'); for (var j=0; j<linkParts.length; j++) { if (linkParts[j].indexOf("segments=")==0) { linkParts.splice (j,1); break; } } //console.dir(linkParts); var message=wmer_LanguageRU? 'Есть вопросы по вашим правкам в [url=' + permalink + ']этой области редактирования[/url]:\n\n': 'Some questions about [url=' + permalink + ']this area[/url]:\n\n'; permalink=linkParts.join('&'); for (var i=0; i < sccObjs.length; ++i) { message += '[b]2' + sccObjs[i].username + '[/b]: '+ sccObjs[i].type+' ('+ '[url=' + permalink + '&segments=' + sccObjs[i].objid + ']'+ (sccObjs[i].country === ''?'':'country: [b]'+sccObjs[i].country+'[/b]/')+ (sccObjs[i].sity === ''?'':'sity: [b]'+sccObjs[i].sity+'[/b]/')+ 'name: [b]'+(sccObjs[i].street==null?'<<noname>>':sccObjs[i].street)+'[/b]'+ (sccObjs[i].description === ''?'':'/description: [b]'+sccObjs[i].description+'[/b]') + '[/url])\n\n'; } //consoleLog(message); getId(formID + '-message').value=message; var now=new Date().getTime(); now /= 1000; now = Math.floor(now); getId(formID + '-ct').value=now; getId(formID + '-lc').value=now; getId(formID).action="https://www.waze.com/forum/ucp.php?i=pm&mode=compose&action=post"; getId(formID + '-subject').value= wmer_LanguageRU? '[WME Request] Уточнение по вашим правкам.': '[WME Request] Question about your map edits'; //console.dir(getId(formID)); getId(formID).submit(); return true; // this forces to open in new tab! } // </WME Fancy permalink> function wmer_WazeBits() { if (typeof Waze === "undefined") Waze=unsafeWindow.Waze; if (typeof Waze === "undefined") Waze=window.Waze; } function wmer_FakeLoad() { wmer_WazeBits(); if (typeof Waze === "undefined") { consoleLog('Waze not found, retrying in 500ms...'); setTimeout(wmer_FakeLoad,500); return; } if (typeof Waze.selectionManager === "undefined") { consoleLog('Waze.selectionManager not found, retrying in 500ms...'); setTimeout(wmer_FakeLoad,500); return; } if (typeof Waze.model === "undefined") { consoleLog('Waze.model not found, retrying in 500ms...'); setTimeout(wmer_FakeLoad,500); return; } wazeModel = Waze.model; try { Waze.selectionManager.events.register("selectionchanged", null, wmer_insertButton); consoleLog('added event handler'); } catch (err) { consoleLog("added event handler error: " +err.name); } } function wmer_Init() { consoleLog('init'); setTimeout(wmer_FakeLoad, 500); } wmer_bootstrap();