findChipTickets

findChipAvia

K instalaci tototo skriptu si budete muset nainstalovat rozšíření jako Tampermonkey, Greasemonkey nebo Violentmonkey.

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

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Violentmonkey.

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Userscripts.

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

K instalaci tohoto skriptu si budete muset nainstalovat manažer uživatelských skriptů.

(Už mám manažer uživatelských skriptů, nechte mě ho nainstalovat!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Už mám manažer uživatelských stylů, nechte mě ho nainstalovat!)

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