findChipAvia
// ==UserScript==
// @name findChipTickets
// @description findChipAvia
// @author Vovk Igor
// @license MIT
// @version 0.42
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js
// @include https://www.ryanair.com/*
// @namespace https://greasyfork.org/uk/scripts/377886-findchiptickets
// ==/UserScript==
//https://www.ryanair.com/* http://u.ua/*
var $ = window.jQuery;
var scope=[];
var plane=[];
function sleep(milliseconds) {
var start = new Date().getTime();
for (var i = 0; i < 1e7; i++) {
if ((new Date().getTime() - start) > milliseconds){
break;
}
}
}
var init=function(){
scope.ammount={};
scope.dates=[];
// $(".container23").append( '<button id="find" >finddd</button>');
// $(".container23").append( '<button id="find2" >getChipest</button>');
//scope.startDay="";
scope.AvailabilitiesDates={};
scope.airportsArray=[];
scope.countriesArray=[];
scope.currentRouteByCurrentAirpot=[];
scope.arrayCitiesByCurrentAirpot={};
scope.count=0;
scope.name="";
scope.AvailabilitiesDatesCount=0;
}
var clearScope=function(){
scope.ammount={};
scope.dates=[];
scope.name=""
scope.AvailabilitiesDates={};
scope.airportName="";
scope.airportsArray=[];
scope.countriesArray=[];
scope.currentRouteByCurrentAirpot=[];
scope.arrayCitiesByCurrentAirpot={};
scope.count=0;
scope.AvailabilitiesDatesCount=0;
}
var getCountries=function(f){
var callback=f || function(){};
$(".context").append("<p>waiting....</p>");
var url="https://www.ryanair.com/content/ryanair.markets.json";
$.get( url, function( data ) {
//console.log(data);
var arr = {};
for (var i = 0; i < data.length; i++) {
var name =data[i]["code"];
var val = data[i];
arr[name] = val;
}
console.log(arr);
scope.countriesArray=arr;
callback();// call getAirports
});
}
var getAirports=function(f){
// var deferred = $.Deffered();
var callback=f || function(){};
var url="https://desktopapps.ryanair.com/v4/en-ie/res/stations";
$.get( url, function( data ) {
//console.log(data);
scope.airportsArray=data;
callback();// call getRoutes
});
}
// get airports,countries,cities,regions by airportName(origin) Lviv(LWO)
var getRoutes=function(origin, f){
$(".context").append("<p>waiting get Routes.......");
// var deferred = $.Deffered();
var callback=f || function(){};
var url=" https://api.ryanair.com/aggregate/4/common?embedded=airports,countries,cities,regions,nearbyAirports,defaultAirport&market=en-gb";
scope.sendData = {"airportName": origin };
$.get( url, function( data ) {
//console.log(sendData);
var airportIataCode="";
for (var i = 0; i < data.airports.length; i++) {
if (data.airports[i].name == scope.sendData["airportName"]){
airportIataCode=data.airports[i]["iataCode"];
//console.log(data.airports[i].routes);
scope.currentRouteByCurrentAirpot=data.airports[i].routes;
}
}
var arrayCitiesByCurrentAirpot=[];
for (var j = 0; j < scope.currentRouteByCurrentAirpot.length; j++) {
var a=scope.currentRouteByCurrentAirpot[j].split(":");
if (a[0] == "airport"){
var minNameCountry=scope.airportsArray[a[1]]["country"];
var city=scope.airportsArray[a[1]]["name"];
var NameCountry=scope.countriesArray[minNameCountry.toLowerCase()].name;
arrayCitiesByCurrentAirpot.push({'airport':a[1], "city":city , "NameCountry":NameCountry });
}
}
scope.arrayCitiesByCurrentAirpot[airportIataCode]=arrayCitiesByCurrentAirpot;
//console.log(scope.arrayCitiesByCurrentAirpot);
$(".context").append("<p>getRoutes done</p>");
callback();
});
}
var getAvailabilities=function( f){
//var deferred = new $.Deferred();
$(".context").append("<p>waiting get Availabilities Dates..............</p>");
var callback=f || function(){};
var origin=Object.keys(scope.arrayCitiesByCurrentAirpot)[0];
scope.ammount[origin]={};
scope.ammount[origin]["origin"]=scope.sendData["airportName"];
scope.AvailabilitiesDates[origin]={};
scope.sendData=[];
for (var i = 0; i < scope.arrayCitiesByCurrentAirpot[origin].length; i++) {
var destination=scope.arrayCitiesByCurrentAirpot[origin][i]["airport"];
scope.ammount[origin][destination]={};
var url="https://services-api.ryanair.com/farfnd/3/oneWayFares/"+origin+"/"+destination+"/availabilities";
var a = {"origin": origin, "destination": destination };
scope.sendData.push(a);
$.get( url, function( data ) {
var t=scope.sendData[0];
scope.sendData = scope.sendData.splice(1,scope.sendData.length-1);
// console.log(scope.sendData);
//console.log(scope.sendData.length);
//scope.days= dates[0];
var day = new Date(data[0]);
day = new Date(day.setTime(new Date(day).getTime() + 6 * 86400000));
var temp_day = day.getUTCFullYear() +"-"+ (day.getUTCMonth()+1) +"-"+day.getUTCDate();
var AvailabilitiesDates=[];
AvailabilitiesDates.push(data[0]);
for (var i = 0; i < data.length; i++) {
var temp_dates=data[i];
if (Date.parse(temp_day)<=Date.parse(temp_dates)){
AvailabilitiesDates.push(temp_dates);
temp_day = new Date();
// var d = date.getDate();
// var m = date.getMonth();
// var y = date.getFullYear();
temp_day = new Date(temp_day.setTime(new Date(temp_dates).getTime() + 6 * 86400000));
}
}
scope.AvailabilitiesDates[t["origin"]][t["destination"]]={};
scope.AvailabilitiesDates[t["origin"]][t["destination"]]=AvailabilitiesDates;
//console.log(scope.AvailabilitiesDates);
if (scope.sendData.length == 0){
console.log(scope.AvailabilitiesDates);
var res=JSON.stringify(scope.AvailabilitiesDates);
$(".context").append(res);
//console.log(JSON.stringify(scope.AvailabilitiesDates));
// $(".context").append("<p>get Availabilities Dates done</p>");
}
callback();// call getChipAmmount
}).done();
}
}
var getChipAmmount= function( f ){
var callback=f || function(){};
var sleepTime=500;
scope.AvailabilitiesDatesCount =3; //scope.AvailabilitiesDates.length-1;
var seepWaitTime=sleepTime*scope.AvailabilitiesDatesCount;
//console.log("waiting "+ seepWaitTime/1000+" seconds");
// $(".context").append("<p>waiting "+ seepWaitTime/1000+" seconds</p>");
// startTimer(seepWaitTime/1000);
var key1=Object.keys(scope.AvailabilitiesDates)[0]; // LWO
var length1=Object.keys(scope.AvailabilitiesDates[key1]).length;
var dates=scope.AvailabilitiesDates[key1];
scope.AvailabilitiesDates[key1]={};
var key2=Object.keys(dates)[0]; // STN
var length2=Object.keys(dates[key2]).length;
var origin=key1;
var destination=key2;
// for one origin town, one destination airports
for (var i = 0; i < 2; i++) { //length2
//console.log(new Date().toLocaleString());
var url="https://desktopapps.ryanair.com/v4/en-ie/availability?ADT=1&CHD=0&DateOut="+dates[key2][i]+
"&Destination="+
destination+
"&FlexDaysOut=6&INF=0&IncludeConnectingFlights=true&Origin="+
origin+
"&RoundTrip=false&TEEN=0&ToUs=AGREED&exists=false";
$.get( url, function( data ) {
//console.log(new Date().toLocaleString());
var dates=data.trips[0].dates;
var origin=data.trips[0]["origin"];
var destinationName=data.trips[0]["destinationName"];
var destination=data.trips[0]["destination"];
var arr=[];
for (var i = 0; i < dates.length; i++) {
if (dates[i].flights.length>0){
var date = new Date(dates[i]["dateOut"]);
date = (date.getUTCDate()+1)+"-"+(date.getUTCMonth()+1) +"-"+date.getUTCFullYear();
console.log("from "+origin+" to "+ destinationName +" "+date+" amount="+dates[i].flights["0"].regularFare.fares["0"].amount);
arr.push({"date":date, "ammount": dates[i].flights["0"].regularFare.fares["0"].amount});
}
}
scope.ammount[origin][destination]["destinationName"]=destinationName;
scope.ammount[origin][destination]["dates"]=arr;
console.log(scope.ammount);
scope.count+=1;
//console.log(scope.count);
//var k=0;
callback(origin, destination);// call function sort
});
//console.log(new Date());
sleep(sleepTime);
//console.log(new Date());
//console.log($scope.ammount.length);
}
return true;
}
var sort=function(f, origin, destination){
var callback=f || function(){};
if (scope.count >= scope.AvailabilitiesDatesCount) ///scope.AvailabilitiesDates.length-1
{
//console.log(scope.ammount);
scope.ammount[origin][destination]["dates"].sort(function(a,b){
//Turn your strings into dates, and then subtract them
//to get a value that is either negative, positive, or zero.
return new Date(a.date) - new Date(b.date);
});
//console.log(scope.ammount);
scope.ammount[origin][destination]["dates"].sort(function(a, b) {
return ((a.ammount < b.ammount) ? -1 : ((a.ammount == b.ammount) ? 0 : 1));
});
console.log(scope.ammount);
callback(); // show
}
};
function startTimer(duration) {
var timer = duration, minutes, seconds;
setInterval(function () {
minutes = parseInt(timer / 60, 10)
seconds = parseInt(timer % 60, 10);
minutes = minutes < 10 ? "0" + minutes : minutes;
seconds = seconds < 10 ? "0" + seconds : seconds;
//display.textContent = minutes + ":" + seconds;
console.log(seconds+" seconds");
if (--timer <= 0) {
timer = duration;
}
}, 1000);
}
var initGui=function(){
$("body").empty();
$(".at-element-marker").hide();
$(".FR").hide();
$("body").after("<div class='plane'> <button id='find' >finddd</button><button id='find2' >getChipest</button> <button id='toggle' >toggle</button></div>");
$(".plane").append("<div class='context'> fewfwfewf</div>");
$(".context").html("<p>1</p>");
$(".context").append("<p>2</p>");
}
var showGui=function(){
for (var i = 0; i < scope.ammount.length-1; i++) {
var t="date:<b>"+scope.ammount[i]["date"]+"</b> ammount<b>: "+scope.ammount[i]["ammount"]+"</b>";
$(".context").append("<p>"+t+"</p>");
}
}
var main = function(){
$( "#find" ).click(function() {
console.clear();
//$(".FR").hide();
clearScope();
var destination="SOF"
var origin="KBP"
scope.name="plane from "+origin+" to "+ destination;
var day = new Date("2019-03-29");
scope.airportName="Lviv";
getCountries(getAirports.bind(null, getRoutes.bind(null,scope.airportName, getAvailabilities.bind(null, getChipAmmount.bind(null, sort.bind(null, showGui))))));
});
};
var toggle = function(){
$( "#toogle" ).click(function() {
$(".at-element-marker").show();
$(".FR").show();
});
};
initGui();
$(document).ready(function()
{
//alert("1");
init();
toggle();
//initGui();
main();
sort();
//func();
//setInterval(func,2000);
});