@asahelk/pogo-script
Version:
Script to get cc from pokemap web. Only works with grunts(pokestops)
404 lines (299 loc) • 15.8 kB
JavaScript
import './utils.js';
generateFilterList();
$("#search_pokemon").val("$").trigger("input")
let resultFilter = [];
let pokeRoute = [];
window.filter = (minTime) => {
return pokemons.filter(e => e.remainingTime() > minTime * 60)
}
window.handleCheckbox = (elem) => {
if (elem.checked) {
let secondsLeft = elem.dataset.remainingTime
setCookie(`CC_${elem.value}`, `${elem.value}`, secondsLeft)
navigator.clipboard.writeText(elem.value)
} else {
deleteCookie(`CC_${elem.value}`);
navigator.clipboard.writeText("")
}
}
window.handleFilter = () => {
resultFilter = filter($("#minutesFilter").val()).sort((a, b) => a.remainingTime() - b.remainingTime());
filterBoosted();
let resultHTML = "";
resultFilter.forEach(e => {
resultHTML += `<div class='filter_checkbox2'><input type='checkbox' onclick='handleCheckbox(this);' id='${e.center.lat}, ${e.center.lng}' value='${e.center.lat}, ${e.center.lng}' data-remaining-time="${e.remainingTime()}"> <label for='${e.center.lat}, ${e.center.lng}'>${e.center.lat}, ${e.center.lng} - DSP:${Math.round(e.remainingTime()/60)}min </label></div><br/>`;
});
$("#filter_result").html("").append(resultHTML);
getCheckboxes();
return false;
}
getCheckboxes();
window.onSubmitCopyNext = (event) => {
event.preventDefault();
handleFilter();
let quantity = +$("#quantityNext").val();
navigator.clipboard.writeText(`_____________________`)
let checkboxes = $(".filter_checkbox2 > input:not(:checked)");
for (let i = 0; i < checkboxes.length && i < quantity; i++) {
let elem = checkboxes[i];
elem.checked = true;
handleCheckbox(elem);
}
navigator.clipboard.writeText(`---------------------`);
}
window.sortCCByNode = async (origLat, origLong, array) => {
array.sort(function (a, b) {
return distance(origLat, origLong, a[0], a[1]) - distance(origLat, origLong, b[0], b[1]) || a[2] - b[2];
});
}
window.groupCoordinates = (array) =>{
let grouped = array.reduce(function(rv, x) {
(rv[x[0].toFixedNoRounding(2) +x[1].toFixedNoRounding(2)] = rv[x[0].toFixedNoRounding(2)+x[1].toFixedNoRounding(2)] || []).push(x);
return rv;
}, {})
return Object.values(grouped);
}
window.getOptimizeRouteTime = (ccArray, speed, isTeleported) =>{
let pokeRoute = [];
let acc = 0;
while(ccArray.length > 0){
let element = ccArray[0];
//------------
let realDistance = distance(pokeRoute.at(-1)?.[0], pokeRoute.at(-1)?.[1], element[0], element[1]) || 0;
acc += realDistance;
let remaningTimeByKmWalked = element[2] - acc * 60 / speed * 60 + 60;
if(remaningTimeByKmWalked <= 0){
acc -= realDistance;
ccArray.shift();
continue;
}
//--------------
pokeRoute.push([
element[0],
element[1],
element[2],
element[3],
realDistance,
acc,
remaningTimeByKmWalked
]);
ccArray.shift();
sortCCByNode(element[0], element[1], ccArray);
}
return pokeRoute.filter(e=> e[6] > 0 );
};
window.filterBoosted = () => {
if($("#weatherBoost")[0].checked){
resultFilter = resultFilter.filter(e=> e.weather);
}
}
window.onSubmitBestRoute = async (event) => {
event?.preventDefault()
handleFilter();
let lat = $("#originCoordinates").val()?.split(",")[0] || '40.7540146581032';
let lng = $("#originCoordinates").val()?.split(",")[1] || '-73.98443256207203';
let speed = $("#kmPerHour").val() || 60;
let isTeleported = speed < 0;
let resultMap = resultFilter.map((e) => [
e.center.lat,
e.center.lng,
e.remainingTime(),
distance(lat, lng, e.center.lat, e.center.lng)
]);
//sort by time
resultMap = resultMap.sort((a,b) => a[3] - b[3] || a[2] - b[2]);
let origin0 = JSON.parse(JSON.stringify(resultMap));
let origin1 = JSON.parse(JSON.stringify(resultMap));
let origin2 = JSON.parse(JSON.stringify(resultMap));
console.log("origin0",origin0);
//-----------------------------------------------
origin1.sort((a,b) => a[3] - b[3] || a[2] - b[2])
pokeRoute = getOptimizeRouteTime(origin1, speed, isTeleported)
//-------------------------------------------------
let groupedArray = groupCoordinates(origin2);
let maxIndex = groupedArray.map(a=>a.length).indexOf(Math.max(...groupedArray.map(a=>a.length)));
let chosenGroup = groupedArray[maxIndex];
let finalShortestRoute = getOptimizeRouteTime(chosenGroup, speed, isTeleported);
let pokeRoute2 = finalShortestRoute;
//-------------------------------------------------
console.log("pokeRoute1",pokeRoute);
console.log("pokeRoute2",pokeRoute2);
let totalDistance1 = pokeRoute.reduce((prevValue, currValue, index, array) => prevValue + distance(array[index-1]?.[0], array[index-1]?.[1], currValue[0], currValue[1]) || 0, 0)
let totalDistance2 = pokeRoute2.reduce((prevValue, currValue, index, array) => prevValue + distance(array[index-1]?.[0], array[index-1]?.[1], currValue[0], currValue[1]) || 0, 0)
console.log("totalDistance1", totalDistance1);
console.log("totalDistance2",totalDistance2);
if(pokeRoute2.length > pokeRoute.length){
pokeRoute = pokeRoute2
}
else if(pokeRoute2.length == pokeRoute.length && totalDistance2 < totalDistance1){
pokeRoute = pokeRoute2;
}
let resultHTML = "";
pokeRoute.forEach(e => {
resultHTML += `<div class='filter_checkbox2'><input type='checkbox' onclick='handleCheckbox(this);' id='${e[0]}, ${e[1]}' value='${e[0]}, ${e[1]}' data-remaining-time="${e[2]}"> <label for='${e[0]}, ${e[1]}'>${e[0]}, ${e[1]} - DSP:${Math.round(e[2]/60)}min </label></div><br/>`;
});
$("#filter_result").html("").append(resultHTML);
getCheckboxes();
}
window.infoWindowString = (pokemon) => {
var disguiseString = "";
if (pokemon.disguise != 0) {
disguiseString = " (" + getDisguisePokemonName(pokemon) + ")";
}
var genderString = getGenderString(pokemon);
var formString = getFormString(pokemon);
var ivString = "";
var movesetString = "";
var cpString = "";
var weatherString = "";
weatherString = "<a href='faq.html#weather'><b>Weather boost</b>: ";
switch (pokemon.weather) {
case 0:
weatherString += "None<br /></a>";
break;
case 1:
weatherString += "Clear<br /></a>";
break;
case 2:
weatherString += "Rainy<br /></a>";
break;
case 3:
weatherString += "Partly Cloudy<br /></a>";
break;
case 4:
weatherString += "Cloudy<br /></a>";
break;
case 5:
weatherString += "Windy<br /></a>";
break;
case 6:
weatherString += "Snow<br /></a>";
break;
case 7:
weatherString += "Fog<br /></a>";
break;
default:
weatherString = "";
break;
}
if (pokemon.attack != -1 && pokemon.defence != -1 && pokemon.stamina != -1 && pokemon.move1 != -1 && pokemon.move2 != -1 && pokemon.cp != -1) {
ivString = "<b>L30+ IV:</b> "+ pokemon.attack + " | " + pokemon.defence + " | " + pokemon.stamina + " (" + Math.floor((pokemon.attack + pokemon.defence + pokemon.stamina)/45 * 100) + "%)<br />";
movesetString = "<b>L30+ Moveset:</b><br />" + getMoveName(pokemon.move1) + " | " + getMoveName(pokemon.move2) + "<br />";
cpString = "<b>L30+ CP:</b> " + pokemon.cp + " (Level: " + pokemon.level + ")<br /><br />";
}
let coordinates = pokemon.center.lat + ', ' + pokemon.center.lng;
let exists = !!getCookie(`CC_${coordinates}`);
let copyMarker = `<button id="copyMarker" data-exists="${exists}" data-remaining-time="${pokemon.remainingTime()}" data-coordinates="${coordinates}" style="margin:0 auto;display:block;color:${exists ? 'violet' : ''}" type="button" class="btn-primary"><i class="material-icons">content_copy</i></button>`;
return '<b>' + getPokemonName(pokemon) + disguiseString + genderString + formString + "</b><br /><br />" + weatherString + ivString + movesetString + cpString + timeToString(pokemon.remainingTime()) + '<br /><br /><a target="_blank" href="https://maps.google.com/maps?q=' + pokemon.center.lat + ',' + pokemon.center.lng + '">Maps</a><br />'+ copyMarker;
}
$('#filter').css('display', 'block');
ga('send', 'event', 'Filter', 'click');
$("#close").css("left", 330)
$("#reset_btn").css("left", 330)
$("#deselect_all_btn").css("left", 330)
$("#select_all_btn").css("left", 330)
$("body").toggleClass("opaque-mode");
$(`<input id='weatherBoost' data-key=${keyType.boosted} type='checkbox'><label style='display:inline-block;margin-left:10px' for='weatherBoost'>Filter Boosted</label>`).insertAfter("#search_pokemon")
$("#filter_list_top").append("<form autocomplete='off' onsubmit='return handleFilter();' id='filterContainer' class='filter-form'></form>");
$("#filterContainer").append("<button type='submit' id='ccFilter' class='btn-primary'>Filter CC</button>");
$("#filterContainer").append(`<input id='minutesFilter' data-key=${keyType.minutesCC} type='number' style='height: 2rem; padding-left: 8px;' placeholder='Minutes'>`);
$("#filterContainer").append("<button id='copyCC' type='button' class='btn-primary'><i class='material-icons'>content_copy</i></button>");
$("#filterContainer").append("<button id='copyTextResult' type='button' class='btn-primary'><i class='material-icons'>copy_all</i></button>");
$("#filter_list_top").append("<form autocomplete='off' onsubmit='return onSubmitCopyNext(event);' id='formNext' class='filter-form'></form>");
$("#formNext").append("<button id='copyNext' type='submit' class='btn-primary'>CB Next : </button>");
$("#formNext").append(`<input id='quantityNext' data-key=${keyType.filterQuantityNext} type='number' style='height: 2rem; padding-left: 8px;width: 100px;' placeholder='Quantity' value='6'>`);
$("#filter_list_top").append("<form autocomplete='off' onsubmit='return onSubmitBestRoute(event);' id='formRoute' class='filter-form'></form>");
$("#formRoute").append("<button type='submit' class='btn-primary'>Best Route</button>");
$("#formRoute").append(`<input id='originCoordinates' data-key=${keyType.originCoordinates} type='text' style='height: 2rem; padding-left: 8px;' placeholder='Origin: e.g 40.742586,-74.000489'>`);
$("#formRoute").append(`<input id='kmPerHour' data-key=${keyType.kmPerHour} type='text' style='height: 2rem; padding-left: 8px;' placeholder='e.g. 9.3km/h'>`);
$("#formRoute").append("<button id='generateGPX' type='button' class='btn-primary'><i class='material-icons'>description</i></button>");
$("#filter_list_top").append("<div id='filter_result'></div>");
let loading = `
<svg id="loading" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="margin: auto; background: transparent; display: block; shape-rendering: auto;" width="32px" height="32px" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid">
<circle cx="50" cy="50" fill="none" stroke="#689cc5" stroke-width="10" r="35" stroke-dasharray="164.93361431346415 56.97787143782138">
<animateTransform attributeName="transform" type="rotate" repeatCount="indefinite" dur="1s" values="0 50 50;360 50 50" keyTimes="0;1"/>
</circle>
</svg>`
$("#copyCC").click(function () {
handleFilter();
let resultCC = "";
resultFilter.forEach(e => {
resultCC += `${e.center.lat}, ${e.center.lng}\n`;
});
navigator.clipboard.writeText(resultCC);
});
$("#copyTextResult").click(function () {
handleFilter();
let resultText = "";
resultFilter.forEach(e => {
resultText += `${e.center.lat}, ${e.center.lng} - DSP:${Math.round(e.remainingTime()/60)}min\n`;
});
navigator.clipboard.writeText(resultText)
});
getMinutes();
getQuantityNext();
getCoordinates();
getKmPerHour();
getBoosted();
$('#generateGPX').click(function () {
onSubmitBestRoute();
buildGPX(pokeRoute);
});
window.enableLocalStorage = (element) => {
$(element).change(function () {
let value = "";
switch(element.type){
case 'text':
case 'number':
value = this.value; break;
case 'checkbox':
value = this.checked; break;
}
localStorage.setItem(element.dataset.key, value);
});
}
window.setupInputs = () =>{
let inputs = document.querySelectorAll("[data-key]")
inputs.forEach(element => {
enableLocalStorage(element)
});
}
setupInputs();
window.reloadBoostedPokemon = async () => {
let response = await fetch(`${window.location.origin}/${window.fetchAllURL}`);
if(!response.ok)
console.warn("something went wrong! On fetch");
const data = await response.json();
let boostedPokemonIds = data.pokemons.filter(e=> e.weather).map(e=> e.pokemon_id);
boostedPokemonIds = Array.from(new Set(boostedPokemonIds));
$(".filter_checkbox").hide()
boostedPokemonIds.forEach(id => {
let pokemonFilterElement = $('#checkbox_' + id).parent();
pokemonFilterElement.show();
});
}
$('#search_pokemon').on('input',debounce(function(e) {
let searchString = e.target.value;
if(searchString?.toLowerCase() !== 'boosted')
return;
reloadBoostedPokemon();
}, 250));
$('#filter').width(400)
$('#filter_result').get(0).scrollIntoView();
$("#ccFilter").click();
//STYLE
var css = '.btn-primary { align-items: center; background-color: #FFFFFF; border: 1px solid rgba(0, 0, 0, 0.1); border-radius: .25rem; box-shadow: rgba(0, 0, 0, 0.02) 0 1px 3px 0; box-sizing: border-box; color: rgba(0, 0, 0, 0.85); cursor: pointer; display: inline-flex; font-family: system-ui,-apple-system,system-ui,"Helvetica Neue",Helvetica,Arial,sans-serif; justify-content: center; margin: 0; min-height: 2.5rem; padding: 0 1rem; position: relative; text-decoration: none; transition: all 250ms; user-select: none; -webkit-user-select: none; touch-action: manipulation; vertical-align: baseline; width: auto;}.btn-primary:hover,.btn-primary:focus { border-color: rgba(0, 0, 0, 0.15); box-shadow: rgba(0, 0, 0, 0.1) 0 4px 12px; color: rgba(0, 0, 0, 0.65);}.btn-primary:hover { transform: translateY(-1px);}.btn-primary:active { background-color: #F0F0F1; border-color: rgba(0, 0, 0, 0.15); box-shadow: rgba(0, 0, 0, 0.06) 0 2px 4px; color: rgba(0, 0, 0, 0.65); transform: translateY(0);}.opaque-mode{ filter: brightness(70%); } .filter-form { display: grid; grid-template-columns: 80px 155px 40px 40px; grid-gap: 8px; margin-bottom: 12px; }',
head = document.head || document.getElementsByTagName('head')[0],
style = document.createElement('style');
head.appendChild(style);
style.type = 'text/css';
if (style.styleSheet) {
style.styleSheet.cssText = css;
} else {
style.appendChild(document.createTextNode(css));
}
//SCRIPTS
document.head.innerHTML += `<link href="https://fonts.googleapis.com/icon?family=Material+Icons"rel="stylesheet">`;
//Remove unnecessary elements
//$("#map").remove();
$("body").css("backgroundColor","#0d0d0d")