{"version":3,"sources":["jsdelivr-header.js","/npm/hp_pricebot@1.7.62/index.js"],"names":[],"mappings":"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","file":"/npm/hp_pricebot@1.7.62/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/hp_pricebot@1.7.62/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/*\r\nHOTELPARTNER\r\nAutor:          HotelPartner WDS\r\nAuthor's note:  “Clean code always looks like it was written by someone who cares.” ― Robert C. Martin,\r\n\r\nDate:           16.08.2017\r\nVersion:        2.0\r\nNotes:          Make sure that the hostname is set correct!\r\n===============================\r\n\r\n */\r\n\r\n\r\n//HP LIBARIES\r\nconst _HP           = require(\"./classHotels.js\");\r\nconst _CONTROLLER   = require(\"./bot_controller.js\");\r\n\r\nconst slave         = _CONTROLLER.os.hostname().replace('slave','');\r\nconst socket        = _CONTROLLER.io.connect('http://192.168.254.89:88/', {\r\n    query:'slave='+slave,\r\n    reconnect: true\r\n});\r\n\r\n//Global Variables\r\nlet currentip       = '0.0.0.0';\r\nlet errjobcounter   = 0;\r\nlet ipischanging    = false;\r\nlet client;\r\nlet mobile;\r\nlet api;\r\nlet hostip;\r\nlet hostport;\r\n\r\n\r\n// ##ENUMS\r\nconst ADULT = {\r\n    ERROR: 0,\r\n    ONE  : 1,\r\n    TWO  : 2\r\n};\r\nconst JOB   = {\r\n    ERROR: 0,\r\n    DONE:1,\r\n    CITY_ID_LEFT:0\r\n};\r\n\r\n// ## PROTOTYPING\r\nNumber.prototype.isActive           = function () {\r\n    return(this!=-1)\r\n};\r\nObject.prototype.prepareNextRequest = function (callback) {\r\n\r\n    const arg = this;\r\n\r\n    //check if job is valid\r\n    if(arg.cityid[0]=='' || !arg.cityid[0] || !arg.dates[0]){\r\n        hp_bot.job.getNewJob(true)\r\n        // _CONTROLLER.reboot();\r\n        return null;\r\n    }\r\n\r\n    //repace all spaces with +\r\n    let city        = arg.name.split(' ').join('+');\r\n    let countcity   =  arg.cityid.length-1;\r\n    let countdate   =  arg.dates.length-1;\r\n\r\n\r\n    callback(arg.dates[countdate], city ,arg.cityid[countcity]);\r\n};\r\n\r\n\r\nconst hp_bot = {\r\n    \"constructor\": function JOB(_api=-1,_mobile=-1,_client='WDS',_host='192.168.56.1',_port='88') {\r\n\r\n        //Set Variables\r\n        api      = _api;\r\n        mobile   = _mobile;\r\n        client   = _client;\r\n        hostip   = _host;\r\n        hostport = _port;\r\n\r\n\r\n        //START SERVER\r\n        _CONTROLLER.start();\r\n        //Tell Host we are online\r\n        socket.emit('slaves',slave +\" \"+ _CONTROLLER.time().format('HH:mm'))\r\n\r\n\r\n\r\n    },\r\n    \"init\":        function init() {\r\n        setTimeout( async function start(){\r\n\r\n            //get job\r\n            let job = await hp_bot.job.searchJob()\r\n          currentip = await _CONTROLLER.showExternalIP(true);\r\n            // here we should do a foreach to get each cityid and each Date\r\n            async function startForeach()\r\n            {\r\n                job.prepareNextRequest(async function (startdate,cityname,cityid) {\r\n\r\n                    var bot = -5;\r\n\r\n                    if(mobile.isActive())\r\n                        bot =  await hp_bot.bot.mobile(job,startdate,cityname,cityid);\r\n\r\n                    else if(api.isActive())\r\n                        bot = await hp_bot.bot.api(job,startdate,cityname,cityid)\r\n\r\n                    else\r\n                        bot = await hp_bot.bot.standart(job,startdate,cityname,cityid);\r\n\r\n                    //get next job\r\n\r\n                    if( bot == JOB.DONE )\r\n                    {\r\n\r\n                        console.log(\"=> JOB done <=\")\r\n                        _HP.hotels.Booking = []\r\n\r\n                        hp_bot.job.saveJob([])\r\n                        hp_bot.job.nextJob(hp_bot.init)\r\n                    }\r\n\r\n                   else if( bot == JOB.CITY_ID_LEFT)\r\n                    {\r\n                        setTimeout(async function(){\r\n                            console.log(\"== next => \")\r\n                            job = await hp_bot.job.getOldJob();\r\n                            console.log(job)\r\n                            startForeach();\r\n                        },1000)\r\n\r\n                    }\r\n\r\n                })\r\n            }\r\n\r\n            startForeach();\r\n\r\n        },1800)\r\n    },\r\n    job:    {\r\n        'getNewJob'    :       function getNewJob(rebootOnError=true)      {\r\n            console.log(\"\");\r\n            console.log(\"GETTING NEW JOB FROM DB... CLIENT:\" +client );\r\n\r\n            let data = \"\";\r\n            let clientVersion = '2217'\r\n\r\n            return new Promise(resolve=>{\r\n\r\n                //check clientverison and callback to _clientVersionCallB\r\n                // with the correct clientVersion\r\n                function makeRequest(clientversion){\r\n                    console.log('clientversion '+clientversion)\r\n\r\n                    _CONTROLLER.http.get('http://www.yieldagent.ch/relay/cityov/requestJobV8.php?version='+clientVersion+'&client='+client, function(res) {\r\n                        if (res.statusCode >= 200 && res.statusCode < 400)\r\n                        {\r\n                            res.on('data', function(data_) { data += data_.toString(); });\r\n                            res.on('end', function() {\r\n                                _CONTROLLER.parseXML(data, function (err, result) {\r\n\r\n                                    try\r\n                                    {\r\n                                        if (result)\r\n                                        {\r\n                                            //set newclient version\r\n                                            clientVersion = result.Request.$.clientVersion;\r\n\r\n                                            //save client version\r\n                                            _CONTROLLER.fs.writeFile('./clientVersion.txt', clientVersion, 'utf8', function readFileCallback(err, data) {\r\n                                                if (err)\r\n                                                    console.log(err);\r\n\r\n                                                else\r\n                                                    console.log(\"new Client Version \"+clientVersion)\r\n\r\n                                            });\r\n\r\n                                            //Parse XML\r\n                                            let ids     = [];\r\n                                            let city    = result.Request.CityConfig[0].URLArguments[0];\r\n                                                city    = city.split(';city=');\r\n                                            //remove unnecessary elements\r\n                                            city.shift();\r\n                                            city.forEach(t => {\r\n                                                t = t.substr(0, t.indexOf(';'))\r\n                                                ids.push(t)\r\n                                            });\r\n\r\n                                            //build json\r\n                                            let job = {\r\n                                                \"id\": result.Request.CityConfig[0].CityID[0],\r\n                                                \"cityid\": ids,\r\n                                                \"name\": result.Request.CityConfig[0].CityName[0],\r\n                                                \"dates\": result.Request.Dates[0].Date,\r\n                                                \"backup\": result.Request.Dates[0].Date,\r\n                                                \"job\": result.Request.JobID[0],\r\n                                                \"los\": result.Request.$.los\r\n                                            };\r\n\r\n                                            //save job\r\n                                            hp_bot.job.saveJob(job);\r\n\r\n                                            //check for errors in JOB\r\n                                            if(!result.Request.Dates[0].Date){\r\n                                                hp_bot.general.errorHandler(job,1,_CONTROLLER.time().format('YYYY-MM-DD'),job.name,job.cityid,'{\"error\":\"no date\"}')\r\n                                                hp_bot.job.saveJob([]);\r\n                                            }\r\n                                            if(!result.Request.CityConfig[0].CityName[0]){\r\n                                                hp_bot.general.errorHandler(job,1,moment().format('YYYY-MM-DD'),'null',0,'{\"error\":\"city\"}')\r\n                                                hp_bot.job.saveJob([]);\r\n                                            }\r\n\r\n                                            resolve(job)\r\n                                        }\r\n                                        if(err)\r\n                                        {\r\n                                            console.log(err)\r\n                                            setTimeout(()=>{\r\n                                                _CONTROLLER.reboot();\r\n                                            },680000)\r\n                                        }\r\n                                    }\r\n                                    catch (TypeError)\r\n                                    {\r\n                                        //make request with the new clienversion\r\n                                        setTimeout( makeRequest(clientversion),8000);\r\n\r\n                                        //LOG\r\n                                        console.log(\"JOB parsing error\")\r\n                                        console.log(result.Request)\r\n                                        console.log(\" \")\r\n                                        console.log(\"getting new jeb with new clientVersion:\" +clientVersion)\r\n\r\n\r\n                                    }\r\n\r\n                                });\r\n                            });\r\n                        }\r\n                    }).on('error',\r\n                        async function(err) {\r\n\r\n                            //Get current bot version\r\n                            let version = await _CONTROLLER.version(false);\r\n\r\n                            //Handle error\r\n                            console.log(\"Error while fetching new Job\");\r\n                            console.log(err);\r\n\r\n                            //request new ip\r\n                            let hosturl = 'http://'+hostip+':'+hostport;\r\n                            _CONTROLLER.fetch(hosturl+'/newip?gateway='+slave+'&client='+client+'&job=-1&version='+version);\r\n\r\n                            // reboot if needed\r\n                            setTimeout(()=>\r\n                            {\r\n                                if(errjobcounter >=3 && rebootOnError == true)\r\n                                    _CONTROLLER.fetch(hosturl+'/reboot?gateway='+slave+'&client='+client+'&job=error&version='+version);\r\n\r\n                                else\r\n                                    _CONTROLLER.fetch(hosturl+'/newip?gateway='+slave+'&client='+client+'&version='+version).then(newIP=>{\r\n                                        hp_bot.job.getNewJob();\r\n                                    })\r\n\r\n                                errjobcounter++;\r\n                            },30000)\r\n                        }\r\n                    );\r\n                }\r\n\r\n                //Read clientsversion\r\n                _CONTROLLER.fs.readFile('./clientVersion.txt','utf8', function read(err, data)\r\n                {\r\n                    if (err)\r\n                    {\r\n                        console.log('no file: clientVersion.txt')\r\n                        makeRequest(clientVersion);\r\n                        return;\r\n                    }\r\n                    else\r\n                    {\r\n                        clientVersion = data;\r\n                        makeRequest(data)\r\n                    }\r\n\r\n                });\r\n            })\r\n\r\n        },\r\n        'getOldJob'    :       function getOldJob()                        {\r\n            console.log(\"searching for old job\");\r\n            try{\r\n                //Look for a backup file\r\n                const backup = JSON.parse(_CONTROLLER.fs.readFileSync('./backup.json', 'utf8'));\r\n\r\n                //Check if the file contains valid data\r\n                const checkforid = backup.cityid[0];\r\n                const checkfordate = backup.dates[0];\r\n                return backup;\r\n            }\r\n            catch (TypeError)\r\n            {\r\n                console.log(\"no Job found..\")\r\n                return null\r\n            }\r\n        },\r\n        'searchJob'    :      async function () {\r\n            var job    = hp_bot.job.getOldJob();\r\n\r\n            if(!job)\r\n                job    = await hp_bot.job.getNewJob();\r\n            else\r\n                console.log(\"BACKUP JOB FOUND\");\r\n\r\n            return job;\r\n        },\r\n        'updateOldJob' :       function (date,cityid,resetdate=false)      {\r\n            return new Promise(resolve=>{\r\n\r\n            try{\r\n\r\n                let backup          =  JSON.parse(_CONTROLLER.fs.readFileSync('./backup.json', 'utf8'));\r\n\r\n                let indx = -1;\r\n                if(date)\r\n                    indx          = backup.dates.indexOf(date);\r\n\r\n\r\n                //Update dates\r\n                if (indx > -1 && backup.dates.length>=1)\r\n                {\r\n                    console.log(\"removing date\")\r\n                    backup.dates.splice(indx, 1);\r\n                    console.log( \" \")\r\n                    console.log(\"****dates left: \"+ backup.dates.length)\r\n                    console.log( \" \")\r\n                }\r\n\r\n                //Update cityid\r\n                if( backup.dates.length==0 || !date)\r\n                {\r\n                    console.log(\"removing city id\")\r\n                    const indx2= backup.cityid.indexOf(cityid)\r\n                    if (indx2 > -1){\r\n                        backup.cityid.splice(indx2, 1);\r\n                        backup.dates = backup.backup;\r\n                    }\r\n\r\n                    if(backup.cityid.length==0){\r\n                        console.log(\"Clearing JOB\")\r\n                        hp_bot.job.saveJob([]).then(r=>{\r\n                            resolve(JOB.DONE)\r\n                        });\r\n\r\n                    }\r\n\r\n\r\n                }\r\n\r\n                //Save the new Backup\r\n                hp_bot.job.saveJob(backup).then(r=>{\r\n                    resolve(JOB.CITY_ID_LEFT)\r\n                });\r\n\r\n            }\r\n            catch (TypeError)\r\n            {\r\n                console.log('!!! JOB NOT SAVED !!!')\r\n                console.log(TypeError)\r\n                resolve(false)\r\n            }\r\n            })\r\n        },\r\n        'nextJob'      : async function nextJob(callback)                  {\r\n            console.log(\"get new Job\")\r\n            const newjob = await hp_bot.job.getNewJob();\r\n            callback(newjob);\r\n        },\r\n        'saveJob'      :       function (json)                             {\r\n            if(!json)return;\r\n            return new Promise(resolve=>{\r\n\r\n\r\n            console.log(\" \")\r\n            console.log(\"Saving Job | backup.json\");\r\n            _CONTROLLER.fs.writeFile('./backup.json', JSON.stringify(json), 'utf8', function readFileCallback(err, data) {\r\n                if (err)\r\n                    console.log(err);\r\n                else\r\n                    console.log(\"JOB is SAVED\")\r\n\r\n                console.log(\" \")\r\n                resolve(true)\r\n            })\r\n            });\r\n        },\r\n        'sendJobToHost':       function (json_job,httpOrSocket='socket')   {\r\n            return new Promise(resolve => {\r\n                if (httpOrSocket == 'socket') {\r\n                    socket.emit('jobdone', JSON.stringify(json_job), function (response) {\r\n                        console.log(response);\r\n                        resolve(response)\r\n                    });\r\n                }\r\n            })\r\n        },\r\n    },\r\n    bot:    {\r\n        \"mobile\"      : async function startMobileJob  (arg,startdate,cityname,cityid,API=null)              {\r\n\r\n            console.log(\"->Fetching Mobile Version\");\r\n            const end = _CONTROLLER.time(startdate,'YYYY-MM-DD').add(1, 'day').format('YYYY-MM-DD');\r\n            let counterror  =  0;\r\n            return new Promise(resolve=>{\r\n                 let adult =1;\r\n\r\n                 async function startFetch(adult) {\r\n                     console.log(startdate,cityname,cityid,adult);\r\n\r\n                        const xmlresult = await hp_bot.general.getXMLData(adult,startdate,end,cityname,cityid);\r\n\r\n                        const isvalid   =  hp_bot.general.validateXmlResult(xmlresult,arg,adult,startdate,cityname,cityid);\r\n                        if(!isvalid)return;\r\n\r\n                        //Parse Data\r\n                        const parsed = await _HP.methods.Booking.parsemobile(xmlresult.result,adult,startdate,end,cityname,cityid);\r\n\r\n                        if(parsed==ADULT.ONE) {\r\n                            startFetch(2)\r\n                        }\r\n                        if(parsed==ADULT.TWO) {\r\n                            counterror = 0;\r\n                            const json = await _HP.methods.general.generateJson(_HP.hotels.Booking, arg.job, arg.id, startdate, slave);\r\n\r\n                            if(API)\r\n                            {\r\n                                API(json)\r\n                                resolve(json)\r\n                            }\r\n                            else\r\n                            {\r\n                                const answer = await hp_bot.job.sendJobToHost(json, 'socket');\r\n                                if (answer == 'OK')\r\n                                {\r\n                                    console.log(\"SENDED: OK\")\r\n                                   let _status = await hp_bot.job.updateOldJob(startdate, cityid);\r\n                                    resolve(_status)\r\n                                }\r\n                                else {\r\n                                    startFetch(adult);\r\n                                }\r\n                            }\r\n\r\n                        }\r\n                        if(parsed==JOB.ERROR) {\r\n\r\n                            console.log(\"ip got blocked\")\r\n\r\n                            //check if there is a error with the url\r\n                            if(4<counterror)\r\n                            {\r\n                                let message;\r\n                                try{\r\n                                    message = xmlresult.errors[0].message;\r\n                                    hp_bot.general.errorHandler(arg,adult,startdate,cityname,cityid,message,'Mobile Parser',true)\r\n                                }catch (TypeError)\r\n                                {\r\n\r\n                                    if(JSON.stringify(xmlresult).indexOf('in_city_translation')>=0)\r\n                                    {\r\n                                        message = {'error':'in_city_translation no results found'}\r\n                                        hp_bot.general.errorHandler(arg,adult,startdate,cityname,cityid,message,'Mobile Parser',true)\r\n                                    }\r\n                                    else\r\n                                    {\r\n                                        message = {'info':'no results found'}\r\n                                        hp_bot.general.errorHandler(arg,adult,startdate,cityname,cityid,message,'Mobile Parser',false)\r\n                                    }\r\n                                }\r\n\r\n                                counterror = 0;\r\n                            }\r\n\r\n                            //standart IP: 192.168.56.1\r\n                            setTimeout(()=>{\r\n                                hp_bot.general.getNewIP(ipischanging).then(gotNewIP=>\r\n                                {\r\n                                    counterror++\r\n                                    console.log('IP changes counter : '+counterror)\r\n                                    ipischanging=false;\r\n                                    startFetch(adult);\r\n\r\n                                })\r\n                            },1000)\r\n                            ipischanging =true;\r\n\r\n                        }\r\n\r\n                        console.log(\"PARSED RESULT \"+ parsed)\r\n\r\n\r\n                    }\r\n                 startFetch(adult);\r\n\r\n            })\r\n        },\r\n        \"standart\"    : async function startSeleniumJOB(arg)              {\r\n            let isfetching = true;\r\n            console.log(\"->Fetching Selenium Version\");\r\n            console.log(\"Selenium is still in testing mode.. \");\r\n\r\n            //IF NO CITY ID go to NEXT JOB\r\n            if(arg.cityid[0]=='' || !arg.cityid[0])\r\n            {\r\n                hp_bot.job.nextJob(startSeleniumJOB);\r\n                return\r\n            }\r\n\r\n            console.log(\"JOB FOUND:\");\r\n            console.log(arg);\r\n            console.log(\"=====================\");\r\n            currentip = await _CONTROLLER.showExternalIP(true)\r\n\r\n            let city        = arg.name.replace(\" \", '+');\r\n            let icity       =  0;\r\n            let countcity   =  arg.cityid.length;\r\n\r\n            let idate       =  0;\r\n            let countdate   =  arg.dates.length;\r\n\r\n\r\n            nextCityId();\r\n            function nextCityId()     {\r\n                //Check if we have made all CityID\r\n                if(icity==countcity && isfetching){\r\n                    console.log(\"Job Done\");\r\n                    console.log(JSON.stringify(_HP.hotels.Booking));\r\n                    hp_bot.job.nextJob(startSeleniumJOB);\r\n                }\r\n                //Start fetching next CityID\r\n                if(icity<countcity)\r\n                {\r\n                    idate=0;\r\n                    nextDate(arg.cityid[icity])\r\n                    icity++;\r\n                }\r\n\r\n            }\r\n            function nextDate(cityid) {\r\n                //Clear after new date\r\n                _HP.hotels.Booking = [];\r\n                const start        = arg.dates[idate];\r\n                fetchData(1,start,city,cityid);\r\n                idate++;\r\n            }\r\n            function fetchData(adult,start,city,cityid) {\r\n\r\n                const end  = _CONTROLLER.time(start,'YYYY-MM-DD').add(1, 'day').format('YYYY-MM-DD');\r\n                let room  = 1;\r\n                let child  = 1;\r\n\r\n                _HP.methods.Booking.get(cityid,city,start,end,room,adult,child,false,arg.job,arg.id).then(result=>{\r\n\r\n                    let isok = -1;\r\n\r\n                    //go to next adult\r\n                    if(isok==1||isok=='1'){\r\n                        fetchData(2,start,city,cityid);\r\n                    }\r\n\r\n                    //got to next date\r\n                    //send result to server\r\n                    if(isok==2||isok=='2')\r\n                    {\r\n                        //send job\r\n                        _HP.methods.general.generateJson(_HP.hotels.Booking,arg.job,arg.id,start,slave).then(answer=>{\r\n\r\n                            //next cityid\r\n                            if(idate==countdate){\r\n                                hp_bot.job.updateOldJob(start,cityid,arg.dates);\r\n                                nextCityId()\r\n                            }\r\n\r\n                            //next cityid\r\n                            if(idate<countdate){\r\n                                //Go to Nekt Date\r\n                                console.log(\"=> going to next date: \"+idate);\r\n                                hp_bot.job.updateOldJob(start,null,null);\r\n                                nextDate(cityid)\r\n                            }\r\n\r\n                        })\r\n                    }\r\n\r\n                    //Get new IP Address\r\n                    if(isok==0||isok=='0'){\r\n                        //standart IP: 192.168.56.1\r\n                        hp_bot.general.getNewIP().then(gotNewIP=>{\r\n                            fetchData(adult,start,city,cityid);\r\n                        })\r\n                    }\r\n\r\n                })\r\n\r\n            }\r\n\r\n        },\r\n        \"api\"         : async function startApiJob()                      {\r\n\r\n        }\r\n    },\r\n    general:{\r\n        \"generateDeviceID\":   function generateDeviceID(show = false)     {\r\n            //\r\n\r\n            let nr1 = Math.floor((Math.random() * 9999) + 1000);\r\n            let nr2 = Math.floor((Math.random() * 9999) + 1000);\r\n            let nr3 = Math.floor((Math.random() * 1) + 10);\r\n            if(show)\r\n                console.log('generateDeviceID: '+ `72331403-${nr1}-${nr2}-${nr3}`)\r\n\r\n            return `72331403-${nr1}-${nr2}-${nr3}`\r\n        },\r\n        \"getNewIP\":           function getNewIP(ischanging=false)                         {\r\n\r\n            return new Promise(resolve=>{\r\n\r\n                console.log('old ip: ' + currentip);\r\n\r\n                hp_bot.general.generateDeviceID(true);\r\n\r\n                _CONTROLLER.tor.newTorSession(async function(err){\r\n                    if(err)console.log(err)\r\n                    currentip    =  await _CONTROLLER.showExternalIP(false);\r\n                    console.log(\"new ip:\"+currentip);\r\n                    setTimeout(()=>{\r\n                        resolve(currentip)\r\n                    },5000)\r\n\r\n                })\r\n\r\n                /*\r\n                if(ischanging)\r\n                    socket.emit('newip',slave, async function(status) {\r\n                        console.log(\"callback\")\r\n                        currentip    =  await _CONTROLLER.showExternalIP(false)\r\n\r\n                        if(!currentip)\r\n                            setTimeout(()=>{getNewIP();},1000);\r\n                        else\r\n                        {\r\n                            console.log(\"new ip:\"+currentip)\r\n                            resolve(currentip)\r\n                        }\r\n                    });\r\n\r\n                else{\r\n                    setTimeout(()=>{\r\n                        resolve(currentip)\r\n                    },40000)\r\n                }\r\n                */\r\n            })\r\n        },\r\n        \"getXMLData\":         function fetchIphoneXMLData(adult,start,end,city,cityid) {\r\n            return new Promise(resolve=>{\r\n             let conuter = 0;\r\n             function _fetch() {\r\n\r\n                    const devid = hp_bot.general.generateDeviceID();\r\n                    const _url    = `https://iphone-xml.booking.com/json/bookings.getHotelAvailabilityMobile?detail_level=1&genius_freebies=2&show_distance_cc=1&request_less_fields=2&show_facilities_review_score=1&show_last_minute_saving=1&include_translations=2&add_bh_info=1&languagecode=de&urgency=1&include_taxes=1&include_count=1&location_source=autocomplete&show_price_trend=1&show_deals=flash%2Clastm%2Csmart%2Cgenius&children_qty=0&low_av_alternatives=0&&&order_by=popularity&show_if_class_is_estimated=1&show_categories=v3&show_location_score=1&show_last_reservation_text=1&show_reinforcement_text=v2&show_filtered_facilities=1&show_if_no_cc_allowed=2&show_soldout=1&show_is_personalized_result=0&show_flash_saving=1&max_persons=-2&use_direct_payment=1&add_ctrip_info=1&include_rack_rate_savings=1&&include_url=1&bh_alt_urgency_msg=1&show_refundable=1&check_price_is_final=1&show_extra_charges=1&room_qty=1&show_if_city_center=1&available_rooms=0&price_buckets=100&flash_deals_amount_if_unsigned=2&show_low_availability=2&show_business_badge=1&autoextend=1&user_os=6.0.1&user_version=11.3.1-android&network_type=wifi&bt=1&arrival_date=${start}&departure_date=${end}&city_ids=${cityid.replace('city=', '').replace('|si=ai%2Cco%2Cci%2Cre%2Cdi', '')}&rows=5000&device_id=${devid}da-ef8edab1ad7f&guest_qty=${adult}`;\r\n                    const options =  {\r\n                        headers: {\r\n                            'Content-Type' : 'application/x-www-form-urlencoded',\r\n                            'Authorization': 'Basic dGhlc2FpbnRzYnY6ZGdDVnlhcXZCeGdN'\r\n                        },\r\n                        url: _url,\r\n                        timeout: 900000\r\n                    };\r\n\r\n                    //Send request\r\n                    _CONTROLLER.tor.request(options, function (err, resp, body) {\r\n                        if(body)\r\n                            resolve(JSON.parse(body));\r\n                        else{\r\n                            if(conuter>=4){\r\n                                hp_bot.job.saveJob([]);\r\n                                _CONTROLLER.restart();\r\n                            }\r\n                            conuter++;\r\n                            console.log('no data')\r\n                            _fetch()\r\n                        }\r\n\r\n                    })\r\n            }\r\n             _fetch();\r\n            })\r\n        },\r\n        \"validateXmlResult\":  function (xml,arg,adult,start,_city,cityid) {\r\n\r\n            console.log(\"check validate\");\r\n\r\n            let xmlcity = null;\r\n            let loop    = 0;\r\n\r\n            //remove space and + at start and at the end\r\n            const cityname = arg.name.trim().replace('/+/g','');\r\n            const listcity = [];\r\n\r\n            try\r\n            {\r\n                let found       = false;\r\n                xmlcity         = xml.filter;\r\n\r\n                function searchForCityName(cityname) {\r\n                    if(xmlcity)\r\n                        xmlcity.forEach(fitler=>\r\n                        {\r\n                            if(fitler.id == 'city')\r\n                            {\r\n                                if(fitler.categories)\r\n                                    fitler.categories.forEach(categorycity=>{\r\n                                        listcity.push(categorycity.name);\r\n                                        if(categorycity.name.toUpperCase().indexOf(cityname.toUpperCase())>=0)\r\n                                            found = categorycity;\r\n                                    })\r\n                            }\r\n                        });\r\n\r\n                    if(loop==0 && !found){\r\n                        cityname = cityname.replace('/ /g','-');\r\n                        loop++;\r\n                        searchForCityName(cityname)\r\n                    }\r\n                }\r\n\r\n                searchForCityName(cityname);\r\n\r\n                if(found==false && listcity.length>1)\r\n                {\r\n                    hp_bot.job.saveJob([])\r\n                    let message = {'warrning':'city_ids did not match cityname '+cityname,\r\n                        'list':listcity}\r\n\r\n                    hp_bot.general.errorHandler(arg,adult,start,cityname,cityid,message,'Mobile Parser',true);\r\n                    return null;\r\n                }\r\n                else\r\n                {\r\n                    console.log(\"Data is valid\")\r\n                    return true;\r\n                }\r\n\r\n            }\r\n            catch (TypeError)\r\n            {\r\n                console.log(\" error validate date \");\r\n                console.log(xmlcity);\r\n                console.log(TypeError);\r\n                return true;\r\n            }\r\n\r\n        },\r\n        \"errorHandler\":       function (arg,adult,start,city,cityid,message,type='mobile',rebootanddelete=false) {\r\n\r\n            console.log( \"errorHandler \" + type)\r\n            city = city.replace('/+/g','');\r\n\r\n            let log = {\r\n                \"job\"    :   JSON.stringify(arg),\r\n                \"jobid\"  :   arg.job,\r\n                \"message\":   JSON.stringify(message) + ',{ \"cityid\":'+cityid+',\"city\":\"'+city+'\" }',\r\n                \"cityid\" :   cityid,\r\n                \"city\"   :   city,\r\n                \"slave\"  :   slave,\r\n                \"client\" :   client,\r\n            };\r\n\r\n            socket.emit('joberror',JSON.stringify(log),function () {\r\n\r\n                if(rebootanddelete)\r\n                {\r\n\r\n                    _CONTROLLER.exec('rm /var/node/backup.json');\r\n                    _CONTROLLER.exec('echo 123 | sudo -S rm /var/node/backup.json');\r\n\r\n                     hp_bot.job.saveJob([]);\r\n                    _CONTROLLER.restart();\r\n                }\r\n                else\r\n                {\r\n\r\n                    hp_bot.job.updateOldJob(null, cityid);\r\n\r\n                    _CONTROLLER.version();\r\n                    _CONTROLLER.restart();\r\n\r\n                }\r\n            })\r\n\r\n        }\r\n    },\r\n};\r\n\r\n//EXPORT Functions\r\nhp_bot.constructor.prototype.start       = hp_bot.init;\r\nhp_bot.constructor.prototype.getNewJob   = hp_bot.job.getNewJob;\r\nmodule.exports                           = hp_bot.constructor;\r\n\r\n\r\n//###Error Output\r\nprocess.on('uncaughtException', function (error) {\r\n    console.log(error.stack);\r\n});\r\n\r\n// Add a connect listener\r\nsocket.on('connect',            function (socket) {\r\n    console.log('Connected!');\r\n});\r\nsocket.on('disconnect',         function(){\r\n    console.log(\"lost connection to server\")\r\n    socket.connect()\r\n    socket.emit('slaves',slave)\r\n    hp_bot.init();\r\n    // reconnect\r\n});\r\n"]}