Advertisement
Guest User

Untitled

a guest
Jul 4th, 2018
430
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 84.38 KB | None | 0 0
  1. 'use strict';
  2. const express = require('express')
  3. const bodyParser = require('body-parser')
  4. const request = require('request')
  5. const app = express()
  6. //const admin = require("firebase-admin")
  7. const FBMessenger = require("fb-messenger")
  8. const co = require('co')
  9. const mail = require("mail")
  10. const nodemailer = require('nodemailer')
  11. const strsplit = require('strsplit')
  12. const Promise = require('promise')
  13. const date = require('date-and-time')
  14. const cheerio = require('cheerio')
  15. const moment = require('moment')
  16. const webshot = require('webshot')
  17. const movieTrailer = require('movie-trailer');
  18. const fs = require('fs')
  19. const _ = require('lodash')
  20. const GoogleImages = require('google-images');
  21. let googleSearchID = "009327818633961746179:cwk-w8npop0"
  22. let cse_api = "AIzaSyDnPDvihK5EHeY1EBMXgUeco2xgywkHqJg"
  23. const searchClient = new GoogleImages(googleSearchID, cse_api);
  24. require('dotenv').config()
  25. let server_url = process.env.server_url || "https://intense-shore-72911.herokuapp.com/"
  26. const aliEmail = 'alibookings2019@gmail.com'
  27. const aliPass = 'Sidibousaid1'
  28. ///////////////////
  29. //Token
  30. const token = "EAACNynhTBT0BAF75d1gH5imHDAudjIjKP4g2WFcdLkb37xExVG1fSkJXz24umf6re7xm6dZCAq8mleYqaB4pAJB6UxlW0uZBN43ZAjUTStIRrTeKMRha5oMviXYKTiAeaPmsvfBq5B5noNvYsQ0Ys369I762wv34vme7aZCJ4wZDZD"
  31. const NotUnderstanding = ["Samahni, je n'ai pas bien saisi,",
  32. "Samahni, je n'ai pas compris :(",
  33. "Mafhemtekch,",
  34. ]
  35. ////////
  36. let firebase = require('firebase'),
  37. fbaseEmail = "sami.boujbel@city.ac.uk",
  38. fbasePass = "Sidibousaid1"
  39. let messenger = new FBMessenger(token)
  40.  
  41. //// Here you add all Restaurants
  42. ///NOTE :: EVERY RESTAURANT IN HERE , ITS EMAIL HAS TO BE IN THE DATABASE...
  43. //DESCRIPTION AND IMAGES ARE OPTIONAL FOR EVERY RESTAURANT
  44. let Restaurants = []
  45. let Places = {}
  46. let database
  47. //START DATABSE
  48. startDB()
  49. .then(() => {
  50. database = firebase.database()
  51. console.log("database connected")
  52. let queryText = "Cesoir"
  53. getPlaces()
  54. co(scrape())
  55.  
  56. })
  57. .catch((err) => {
  58. console.log("error with the database", err)
  59. })
  60. //
  61. function getPlaces() {
  62. return database.ref('/restaurants/').on('value', (results) => {
  63. /*
  64. for (let i=0;i<names.length;i++) {
  65. let name=names[i]
  66. let restaurant=JSON.parse(JSON.stringify(restaurants[name]))
  67. restaurant.title=name
  68. Restaurants.push(restaurant)
  69. }
  70. */
  71. parsePlaces(results, "restaurant")
  72. Object.keys(results).forEach(restaurantName => {
  73. let url = "https://m.me/3amekAli/?ref=restaurant_" + encodeURIComponent(restaurantName)
  74. //console.log("restaurant link", url)
  75. })
  76. database.ref("cinemas/").on('value', (results) => {
  77. parsePlaces(results, "cinema")
  78.  
  79. //console.log("after cinema",Places)
  80. })
  81. })
  82. }
  83.  
  84. function parsePlaces(results, type) {
  85. let places = results.val()
  86. let names = Object.keys(places)
  87. Places[type] = names.map(name => {
  88. let place = JSON.parse(JSON.stringify(places[name]))
  89. place.title = name
  90. return place
  91. })
  92. }
  93. //let serviceAccount = require("path/to/serviceAccountKey.json")
  94. app.set('port', (process.env.PORT || 5000))
  95. // Set the configuration for your app
  96. app.use("/", express.static('public'))
  97. // Process application/x-www-form-urlencoded
  98. app.use(bodyParser.urlencoded({
  99. extended: false
  100. }))
  101. // Process application/json
  102. app.use(bodyParser.json())
  103. // Index route
  104. app.get('/', function (req, res) {
  105. res.send('Hello world, I am a chat bot')
  106. })
  107. // for Facebook verification
  108. app.get('/webhook/', function (req, res) {
  109. console.log("verifiying")
  110. if (req.query['hub.verify_token'] === 'verify_me') {
  111. console.log("TOKEN VERIFIED")
  112. res.send(req.query['hub.challenge'])
  113. }
  114. })
  115. // Spin up the server
  116. app.listen(app.get('port') || 5000, function () {
  117. console.log('running on port', app.get('port'))
  118. })
  119. // quand le consommateur commence a parler au bot
  120. app.post('/webhook/', function (req, res) {
  121. res.sendStatus(200);
  122. let messaging_events = req.body.entry[0].messaging
  123. for (let i = 0; i < messaging_events.length; i++) {
  124. let event = req.body.entry[0].messaging[i]
  125. let userId = event.sender.id
  126. getUser(userId)
  127. .then((user) => {
  128. let baseRef = database.ref('/booking-list/' + userId)
  129. if (event.message) {
  130. let messageText = event.message.text;
  131. let quick_reply = event.message.quick_reply;
  132. let text = event.message.text
  133. if (quick_reply) {
  134. console.log("QUICK REPLY CHECK")
  135. let payload = event.message.quick_reply.payload;
  136. console.log("Quick Reply is", JSON.stringify(event.message.quick_reply))
  137. receivedQuickReply(user, payload, baseRef)
  138. } else if (messageText) {
  139. if (text.match(new RegExp('Ali', "i"))) {
  140. let startingTexts = ["Salut, tu cherches a réserver quelquepart?", "3amek Ali s'en occupe", "Il suffit juste de cliquer sur 'Reserver une table' et répondre a mes questions."]
  141. console.log("sending texts in order")
  142. sendTextsInOrder(userId, startingTexts, 2)
  143. setTimeout(() => {
  144. sendGenericMessage(user)
  145. }, (6 * 2000) + 1000)
  146. //sendTextMessage(userId, "Salut, tu cherches a réserver quelquepart?")
  147. //sendTextMessage(userId, "3amek Ali s'en occupe")
  148. //sendTextMessage(userId, "Il suffit juste de cliquer sur 'Reserver une table' et répondre a mes questions.")
  149. } else {
  150. sendNotUnderstanding(user)
  151. }
  152. }
  153. } else if (event.postback) {
  154. console.log("POSTBACK CHECK", event.postback.payload)
  155. receivedPostback(user, event, baseRef)
  156. } else if (event.referral) {
  157. console.log("referral CHECK", event.referral.ref)
  158. receivedReferral(user, event, baseRef)
  159. } else {
  160. console.log("received unknown event", event)
  161. }
  162. })
  163. }
  164. })
  165. app.get('/booksRemove', (req, res) => {
  166. if (req.query.token = "verify_me") {
  167. removePastBookings((err, res) => {
  168. if (res) {
  169. res.sendStatus(200)
  170. res.send("I've sucessfuly deleted old bookings ")
  171. } else {
  172. res.sendStatus(403)
  173. res.send("something went wrong")
  174. }
  175. })
  176. }
  177. })
  178. //receiving a postback events
  179. function receivedPostback(user, event, baseRef) {
  180. let payload = event.postback.payload
  181. console.log("received postback event to be processed", event, payload)
  182. let sender = event.sender.id
  183. let boolRestaruant = payload.match(/^restaurant/)
  184. let boolMovie = payload.match(/^movie /)
  185. let boolCinema = payload.match(/^cinema /)
  186. let shareBot = payload.match(/^friendShare$/)
  187. let modifyUserBooking = payload.match(/^modifyUserBooking/)
  188. let modifyBooking = payload.match(/^modifyBooking/)
  189. let userId = user.id
  190. if (payload.indexOf("Reservez") > -1) {
  191. if ((payload.indexOf("restaurant") > -1) || payload.indexOf("cinem") < 0) {
  192. let type = "restaurant"
  193. let update = {
  194. type
  195. }
  196. baseRef.update(update).then((res) => {
  197. user.type = type
  198. checkBookingLimit(user).then(result => {
  199. let limit = result.limit
  200. let status = result.status
  201. if (status) {
  202. sendRestaurant(user)
  203. } else {
  204. sendBookingLimit(user, limit)
  205. }
  206. })
  207. })
  208. } else {
  209. let type = "cinema"
  210. let update = {
  211. type
  212. }
  213. user.type = type
  214. baseRef.update(update).then((res) => {
  215. sendRestaurant(user)
  216. })
  217. }
  218. return
  219. }
  220. switch (payload) {
  221. case "GET STARTED":
  222. sendTextMessage(userId, "Salut, tu cherches a réserver quelquepart? 3amek Ali s'en occupe :D ")
  223. sendGenericMessage(user)
  224. break;
  225. case "myBookings":
  226. sendUserBookings(user)
  227. break;
  228. case "Dejeuner":
  229. sendHourMessage(user, "Dejeuner")
  230. break;
  231. case "Diner":
  232. sendHourMessage(user, "Diner")
  233. break;
  234. case "ApresDemain": //Apresdemain= AfterTomorrow
  235. sendMomentMessage(user)
  236. break;
  237. //confirmation
  238. //code how do you want to cancel
  239.  
  240. case "DayHour1":
  241. sendTextMessage(userId, "Vous avez reservè une table a sakura entre 12h00 et 12h30")
  242. confirmDay1(sender)
  243. break;
  244.  
  245. case "DayHour2":
  246. sendTextMessage(userId, "Vous avez reservè une table a sakura entre 12h30 et 13h00")
  247. confirmDay2(user)
  248. break;
  249.  
  250. case "DayHour3":
  251. sendTextMessage(userId, "Vous avez reservè une table a sakura entre 13h et 13h30")
  252. confirmDay3(user)
  253. break;
  254.  
  255. case "NightHour1":
  256. sendTextMessage(userId, "Vous avez reservè une table a sakura entre 18h30 et 19h30")
  257. confirmNight1(user)
  258. break;
  259.  
  260. case "NightHour2":
  261. sendTextMessage(userId, "Vous avez reservè une table a sakura entre 19h30 et 20h30")
  262. confirmNight2(user)
  263. break;
  264.  
  265. case "NightHour3":
  266. sendTextMessage(userId, "Vous avez reservè une table a sakura entre 20h30 et 21h30")
  267. confirmNight3(user)
  268. break;
  269.  
  270. // If the user wants to cancel
  271. case "UnConfirmDay1":
  272. case "UnConfirmDay2":
  273. case "UnConfirmDay3":
  274. case "UnConfirmNight1":
  275. case "UnConfirmNight2":
  276. case "UnConfirmNight3":
  277. AnnulerReservation(sender)
  278. break;
  279. case "Annuler":
  280. sendTextMessage(sender, "J'ai annulè votre reservation. :(")
  281. sendTextMessage(sender, "Pour une future reservation, ecrivez 'Ali'.")
  282.  
  283. ///////////////////
  284.  
  285.  
  286. // for the promotion button
  287. case "Offres":
  288. sendPromotionMessage(sender)
  289. break;
  290.  
  291. case "Prom1":
  292. sendPeopleNum(sender)
  293. break;
  294.  
  295. case "Prom2":
  296. sendPeopleNum(sender)
  297. break;
  298. }
  299. if (boolRestaruant || boolCinema || boolMovie) {
  300. let newPayload = strsplit(payload, /\s+/)
  301. let restaurant = ""
  302. let place = ""
  303. let bookingId
  304. let modifing = false
  305. newPayload.forEach(word => {
  306. if (word.indexOf("modify") > -1) {
  307. modifing = true
  308. bookingId = word
  309. }
  310. })
  311. if (modifing) {
  312. restaurant = payload
  313. .replace(bookingId, "")
  314. .replace("restaurant ", "")
  315. bookingId = bookingId.replace("modify", "")
  316. } else {
  317. if (boolRestaruant) {
  318. place = payload.replace(/restaurant /, "")
  319. } else if (boolCinema) {
  320. place = payload.replace(/cinema /, "")
  321. } else if (boolMovie) {
  322. place = payload.replace(/movie /, "")
  323. }
  324. }
  325. //console.log("the restaurant", restaurant, "the bookingId", bookingId)
  326. if (bookingId) {
  327. let update = {
  328. restaurant: restaurant
  329. }
  330. modifyTheBooking(user, bookingId, update).then(err => {
  331. if (err) {
  332. console.log("error modiying restauratn", err)
  333. erroHandle(user)
  334. } else {
  335. SuccesfullyModifyed(user)
  336. }
  337. })
  338. return
  339. }
  340. let updateObj = {}
  341. if (boolMovie) {
  342. updateObj["movie"] = place
  343. } else {
  344. updateObj[user.type] = place
  345. }
  346. console.log("I'm gonna update Restuarant for " + userId + " to be" + place)
  347. baseRef.update(updateObj).then((res) => {
  348. user[user.type] = place
  349. if (boolRestaruant) {
  350. sendPeopleNum(user, null, place)
  351. } else if (boolCinema) {
  352. console.log("sending agenda", place)
  353. sendCinemaAgenda(user, place)
  354. } else if (boolMovie) {
  355. place = capitalizeFirstLetter(place.replace(/-/g, " "))
  356. sendPeopleNum(user, null, place, user.type)
  357. }
  358. })
  359. } else if (shareBot) {
  360. sendShareToFriend(user)
  361. } else if (payload.indexOf("Cancel Booking") > -1) {
  362. let bookingId = strsplit(payload, /\s+/)[2]
  363. cancelBooking(user, baseRef, bookingId)
  364. } else if (payload.indexOf("Confirm Booking") > -1) {
  365. let bookingId = strsplit(payload, /\s+/)[2]
  366. console.log("request to confrim ", bookingId)
  367. confirmBooking(user, baseRef, bookingId)
  368. } else if (modifyUserBooking) {
  369. let bookingId = payload.replace("modifyUserBooking ", "")
  370. sendWhatDoModify(user, bookingId)
  371. } else if (modifyBooking) {
  372. console.log("modify entity")
  373. payload = strsplit(payload, /\s+/)
  374. let entity = payload[1]
  375. let bookingId = payload[2]
  376. if (entity == "restaurant") {
  377. sendRestaurant(user, 0, null, bookingId)
  378. } else if (entity == "peopleNumber") {
  379. getBookingField(user.id,bookingId,"cinema").then(cinema=>{
  380. console.log("is cinema ?",cinema)
  381. if(cinema) {
  382. sendPeopleNum(user, bookingId,null,"cinema")
  383. } else {
  384. sendPeopleNum(user, bookingId,null,"restaurant")
  385. }
  386. })
  387. }
  388. }
  389. }
  390.  
  391. function sendWhatDoModify(user, bookingId) {
  392. let sentText = "What would you like to modify in the booking ?"
  393. let userId = user.id
  394. let quick_replies = [{
  395. content_type: "text",
  396. title: "Restaurant",
  397. payload: "modifyBooking restaurant " + bookingId
  398. },
  399. {
  400. content_type: "text",
  401. title: "People Number ",
  402. payload: "modifyBooking peopleNumber " + bookingId
  403. }
  404. ]
  405. getBookingField(user.id,bookingId,"restaurant").then(type=>{
  406. console.log("the booking type",type)
  407. if(!type) {
  408. quick_replies.shift()
  409. }
  410. messenger.sendQuickRepliesMessage(userId, sentText, quick_replies,(err,res)=>{
  411. if(err) {
  412. console.log("Error sending what to modify",err)
  413. }
  414.  
  415. })
  416. })
  417. }
  418.  
  419. function receivedReferral(user, event, baseRef) {
  420. console.log("Received referral event")
  421. let ref = event.referral.ref
  422. let userId = user.id
  423. if (ref.indexOf("restaurant") > -1) {
  424. let referralWords = strsplit(ref, /_/)
  425. console.log("after split", referralWords)
  426. let restaurant = referralWords[1]
  427. console.log("I'm gonna update Restuarant for " + userId + " to be" + restaurant)
  428. baseRef.update({
  429. restaurant: restaurant
  430. })
  431. .then((res) => {
  432. user.restaurant = restaurant
  433. sendPeopleNum(user, null, restaurant)
  434. })
  435.  
  436. } else {
  437. console.log("referral doesn't have restaurant")
  438. }
  439. }
  440.  
  441. function modifyTheBooking(user, bookingId, update) {
  442. return database.ref("booking-list/" + user.id + "/bookings/" + bookingId).update(update)
  443. }
  444.  
  445. function receivedQuickReply(user, payload, baseRef) {
  446. console.log(typeof payload)
  447. console.log("received Quick reply payload", payload)
  448. let boolRestaruant = payload.match(/^restaurant/)
  449. let boolCinemaType = payload.match(/^cinemaType/)
  450. let boolCinema = payload.match(/^cinema /)
  451. let boolPeopleNum = payload.match(/^peopleNumber/)
  452. let boolDay = payload.match(/^Day/)
  453. let boolHours = payload.match(/[0-9]:[0-9]/)
  454. let moreRestaurants = payload.match(/moreRestaurants/)
  455. let boolBookMovie = payload.match(/^bookMovie /)
  456. let reserving = payload.match(/^Reservez$/i)
  457. let myBookings = payload.match(/^myBookings$/)
  458. let modifyBooking = payload.match(/^modifyBooking/)
  459. let userId = user.id
  460. if (boolRestaruant || boolCinema) {
  461. console.log("we are in bool", boolCinema, boolRestaruant)
  462. let place = ""
  463. if (boolRestaruant) {
  464. place = payload.replace(/restaurant/, "")
  465. } else if (boolCinema) {
  466. place = payload.replace(/cinema/, "")
  467. }
  468. let updateObj = {}
  469. updateObj[user.type] = place
  470. console.log("I'm gonna update Restuarant for " + userId + " to be" + place)
  471. baseRef.update(updateObj).then((res) => {
  472. user[user.type] = place
  473. if (boolRestaruant) {
  474. sendPeopleNum(user, null, place)
  475. } else if (boolCinema) {
  476. console.log("sending agenda")
  477. sendCinemaAgenda(user, place)
  478. }
  479. })
  480. } else if (boolPeopleNum) {
  481. payload = strsplit(payload, /\s+/)
  482. let peopleNumber = payload[1]
  483. if (payload.length > 2) {
  484. let bookingId = payload[2]
  485. let update = {
  486. peopleNumber: peopleNumber
  487. }
  488. console.log("people numb", user.id, bookingId, update)
  489. modifyTheBooking(user, bookingId, update).then(err => {
  490. if (err) {
  491. console.log("error", err)
  492. erroHandle(user)
  493.  
  494. } else {
  495. SuccesfullyModifyed(user)
  496. }
  497.  
  498. })
  499. return
  500. }
  501. console.log("I'm gonna update people Number for " + userId + " to be" + peopleNumber)
  502. baseRef.update({
  503. peopleNumber: peopleNumber
  504. }).then((res) => {
  505. user.peopleNumber = peopleNumber
  506. DateMessage(user)
  507. })
  508. } else if (boolDay) {
  509. let day = strsplit(payload, /\s+/)[1]
  510. console.log("I'm gonna update day Number for " + userId + " to be" + day)
  511. baseRef.update({
  512. day: day
  513. }).then((res) => {
  514. user.day = day
  515. if (day.match(/Cesoir/, "i")) {
  516. sendHourMessage(user, "Diner")
  517. } else {
  518. sendMomentMessage(user)
  519. }
  520. })
  521. } else if (boolHours || boolBookMovie) {
  522. let updateObj = {}
  523. let hour = payload
  524. if (boolBookMovie) {
  525. let hourResult = /bookMovie \[(.*?)\]/g.exec(payload)
  526. if (hourResult) {
  527. updateObj.date = hourResult[1].trim()
  528. if (process.env.local) {
  529. updateObj.dateReserved = moment().subtract(1, "hour").format('x')
  530. } else {
  531. updateObj.dateReserved = moment().add(1, "hour").format('x')
  532. }
  533. updateObj.hour = moment(parseInt(updateObj.date)).format('LT')
  534. console.log("saving the book initially", updateObj)
  535. }
  536. } else {
  537. updateObj.hour = payload
  538. }
  539. baseRef.update(updateObj)
  540. .then((hourResp) => {
  541. if (boolBookMovie) {
  542. return getUser(user.id).then(user => {
  543. let booking = JSON.parse(JSON.stringify(user))
  544. saveBooking(booking, "cinema").then(pushedBooking => {
  545. console.log("the pushed booking", pushedBooking)
  546. sendConfirm(user, baseRef, pushedBooking)
  547. }).catch(err => {
  548. erroHandle(user)
  549. })
  550. })
  551. } else {
  552. user.hour = payload
  553. saveDate(user, payload, baseRef)
  554. .then((res) => {
  555. getUser(user.id).then(user => {
  556. let booking = JSON.parse(JSON.stringify(user))
  557. saveBooking(booking, "restaurant").then(pushedBooking => {
  558. console.log("the pushed booking", pushedBooking)
  559. sendConfirm(user, baseRef, pushedBooking)
  560. }).catch(err => {
  561. erroHandle(user)
  562. })
  563. })
  564. })
  565. }
  566. })
  567. } else if (moreRestaurants) {
  568. payload = strsplit(payload, /\s+/)
  569. let index = payload[1]
  570. sendRestaurant(user, index)
  571. } else if (reserving) {
  572. checkBookingLimit(user).then(result => {
  573. let limit = result.limit
  574. let status = result.status
  575. if (status) {
  576. sendRestaurant(user)
  577. } else {
  578. sendBookingLimit(user, limit)
  579. }
  580. })
  581. } else if (myBookings) {
  582. console.log("show user bookings")
  583. sendUserBookings(user)
  584. } else if (modifyBooking) {
  585. payload = strsplit(payload, /\s+/)
  586. let entity = payload[1]
  587. let bookingId = payload[2]
  588. console.log("modify entity", bookingId, entity)
  589. if (entity == "restaurant") {
  590. sendRestaurant(user, 0, null, bookingId)
  591. } else if (entity == "peopleNumber") {
  592. getBookingField(user.id,bookingId,"cinema").then(cinema=>{
  593. console.log("is cinema ?",cinema)
  594. if(cinema) {
  595. sendPeopleNum(user, bookingId,null,"cinema")
  596. } else {
  597. sendPeopleNum(user, bookingId,null,"restaurant")
  598. }
  599. })
  600. }
  601. } else if (boolCinemaType) {
  602. console.log("the cin")
  603. let cinemaTypeRe = /cinemaType \[(.*?)\]/g
  604. let placeRe = /cinema \[(.*?)\]/g
  605. let cinemaType, place
  606. let typeResult = cinemaTypeRe.exec(payload)
  607. let placeResult = placeRe.exec(payload)
  608. if (typeResult) {
  609. cinemaType = typeResult[1]
  610. }
  611. if (placeResult) {
  612. console.log(placeResult[1])
  613. place = placeResult[1]
  614. }
  615. sendMovies(user, place, cinemaType)
  616. }
  617. }
  618.  
  619. //Reponse message
  620. function sendTextMessage(userId, text) {
  621. let messageData = {
  622. recipient: {
  623. id: userId
  624. },
  625. message: {
  626. text: text
  627. },
  628. }
  629. return callSendAPI(messageData)
  630. }
  631. //Response Image
  632. function sendImageMessage(userId, url) {
  633. return new Promise((resolve, reject) => {
  634. messenger.sendImageMessage(userId, url, (err, res) => {
  635. if (!err) {
  636. resolve(res)
  637. } else {
  638. console.log("error sending image", err)
  639. resolve(err)
  640. }
  641. })
  642. })
  643. }
  644. //Reponse Generic
  645. function sendGenericMessage(user) {
  646. let userId = user.id
  647. let messageData = {
  648. "attachment": {
  649. "type": "template",
  650. "payload": {
  651. "template_type": "generic",
  652. "elements": [{
  653. "title": "Réservez Avec Ali",
  654. "subtitle": "A3mel doura, Chouf les restaurants ensuite appuie sur 'Réservez une table'",
  655. "image_url": "https://goo.gl/aoVTK5",
  656. "buttons": [{
  657. "type": "postback",
  658. "title": "Réservez une table",
  659. "payload": "Reservez restaurant"
  660. }, {
  661. "type": "postback",
  662. "title": "Voir un film",
  663. "payload": "Reservez cinema"
  664. }],
  665. }, {
  666. "title": "Besoin d'aide?",
  667. "subtitle": ":)",
  668. "image_url": "https://goo.gl/YsCq3e",
  669. "buttons": [{
  670. "type": "postback",
  671. "title": "Appelez nous",
  672. "payload": "Prom2",
  673. }, {
  674. "type": "web_url",
  675. "url": "http://www.le-paresseux.com",
  676. "title": "Laissez un Feedback",
  677. }]
  678. }]
  679. }
  680. }
  681. }
  682. request({
  683. url: 'https://graph.facebook.com/v2.6/me/messages',
  684. qs: {
  685. access_token: token
  686. },
  687. method: 'POST',
  688. json: {
  689. recipient: {
  690. id: userId
  691. },
  692. message: messageData,
  693. }
  694. }, function (error, response, body) {
  695. if (error) {
  696. console.log('Error sending messages: ', error)
  697. } else if (response.body.error) {
  698. console.log('Error: ', response.body.error)
  699. }
  700. })
  701. }
  702. //send the user restaurants
  703. function sendRestaurant(user, index, skippedRestaurant, bookingId) {
  704. let text = "Aya behi, Dans quel restaurant voudrais-tu manger? :"
  705. let userId = user.id
  706. user.type = user.type || "restaurant"
  707. let places = Places[user.type]
  708. let begin = index || 0
  709. let end = index + 9 || 9
  710. let morePush = true
  711. let elements = []
  712. if ((places.length - begin) <= 10) {
  713. end = places.length
  714. morePush = false
  715. }
  716.  
  717. for (let i = begin; i < end; i++) {
  718. let restaurantTitle = places[i].title
  719. let restaurantImage = places[i].image
  720. let restaurantDescription = places[i].description
  721. let restaurantLink = places[i].link
  722. if (skippedRestaurant) {
  723. if (skippedRestaurant == restaurantTitle) {
  724. continue
  725. }
  726. }
  727. let tableOrPlace = (user.type == "restaurant") ? "Réservez une Table" : "Réservez une Place"
  728. let buttons = [{
  729. title: tableOrPlace,
  730. type: "postback",
  731. payload: user.type + " " + restaurantTitle
  732. },
  733. {
  734. title: "Voir plus d'infos",
  735. type: "web_url",
  736. url: restaurantLink
  737. }
  738. ]
  739. if (bookingId) {
  740. buttons[0].payload += " modify" + bookingId
  741. }
  742. let element = {
  743. title: restaurantTitle,
  744. buttons: buttons
  745. }
  746. if (restaurantDescription) {
  747. element.subtitle = restaurantDescription
  748. }
  749. if (restaurantImage) {
  750. element.image_url = restaurantImage
  751. }
  752. elements.push(element)
  753. }
  754. if (morePush) {
  755. let messageData = {
  756. recipient: {
  757. id: userId
  758. },
  759. message: {}
  760. }
  761. let attachment = {
  762. type: "template",
  763. payload: {
  764. template_type: "generic",
  765. elements: elements
  766. }
  767. }
  768. let quickReplies = [{
  769. content_type: "text",
  770. title: "More Restaurants",
  771. payload: "moreRestaurants " + end
  772. }]
  773. messageData.message.attachment = attachment
  774. messageData.message.quick_replies = quickReplies
  775. callSendAPI(messageData)
  776. } else {
  777. messenger.sendHScrollMessage(userId, elements, "REGULAR", (err, res) => {
  778. if (err) {
  779. console.log("error sending restaurants", err)
  780. }
  781. })
  782. }
  783.  
  784. }
  785. //Reponse Bouton
  786. function sendPeopleNum(user, bookingId, restaurant, type) {
  787. let text = ""
  788. if (restaurant) {
  789. text = restaurant.replace(/ cinemaType \[(.*?)\]/g, "") + "!, Excellent choix! Pour combien de personnes ?"
  790. } else {
  791. text = "Excellent choix! Pour combien de personnes ?"
  792. }
  793. let userId = user.id
  794. let end = 11
  795. if (type == "cinema") end = 3
  796. let quickReplies = []
  797. for (let i = 0; i < end; i++) {
  798. let number = i + 1
  799. let quick_reply = {
  800. "content_type": "text",
  801. "title": number,
  802. "payload": "peopleNumber " + number
  803. }
  804. if (bookingId) {
  805. quick_reply.payload += " " + bookingId
  806. }
  807. quickReplies.push(quick_reply)
  808. }
  809. messenger.sendQuickRepliesMessage(userId, text, quickReplies, (err, res) => {
  810. if (err) {
  811. console.log("Error sendin number", err)
  812. }
  813. })
  814. }
  815.  
  816. //Definir la date
  817. function DateMessage(user) {
  818. if (user.type == "cinema") {
  819. let moviePath = user.movie
  820. if (user.movie !== "") {
  821. let cinemaType = /cinemaType \[(.*?)\]/g.exec(user.movie)
  822. if (cinemaType) {
  823. let text = "Here are the times available"
  824. cinemaType = cinemaType[1]
  825. let movieId = user.movie.replace("cinemaType [" + cinemaType + "]", "").trim()
  826. let weekId = getWeekId()
  827. moviePath = "movies/" + user.cinema + "/" + weekId + "/" + cinemaType + "/" + movieId
  828. console.log("the path", moviePath)
  829. getMovie(user, weekId, cinemaType, movieId).then(movie => {
  830. let quick_replies = []
  831. console.log("the movie", movie)
  832. if(movie.times) {
  833. if(!checkMovieTimes(movie.times)) return sendNoRestaurants(user)
  834. } else if(movie.times) {
  835. return sendNoRestaurants(user)
  836. }
  837. movie.times.forEach(time => {
  838. let title = getTimesFormat(time)
  839. console.log("the title", title)
  840. let quick_reply = {
  841. content_type: "text",
  842. title: title,
  843. payload: "bookMovie [" + time + "] "
  844. }
  845. quick_replies.push(quick_reply)
  846. })
  847. messenger.sendQuickRepliesMessage(user.id, text, quick_replies, (err, res) => {
  848. if (err) {
  849. console.log("Error sending times", err)
  850. }
  851. })
  852. })
  853. }
  854. }
  855.  
  856. } else {
  857. let text = "Marhbe, je vous réserve une table pour quand?"
  858. let userId = user.id
  859. let buttons = [{
  860. "type": "postback",
  861. "title": "Ce soir",
  862. "payload": "Day Cesoir"
  863. },
  864. {
  865. "type": "postback",
  866. "title": "Demain",
  867. "payload": "Day Demain"
  868. },
  869. {
  870. "type": "postback",
  871. "title": "Aprés demain",
  872. "payload": "Day ApresDemain"
  873. }
  874. ]
  875. let quickReplies = [{
  876. "content_type": "text",
  877. "title": "Ce soir",
  878. "payload": "Day Cesoir"
  879. },
  880. {
  881. "content_type": "text",
  882. "title": "Demain",
  883. "payload": "Day Demain"
  884. },
  885. {
  886. "content_type": "text",
  887. "title": "Aprés demain",
  888. "payload": "Day ApresDemain"
  889. }
  890. ]
  891. let lastDate = generateReservationDate(user, "21:30", "check")
  892. let now = new Date()
  893. let tunisiaNow = date.addHours(now, 1)
  894. console.log("this days last date", new Date(lastDate).toString())
  895. console.log("this days last today", tunisiaNow.toString())
  896. console.log("the difference in minues", date.subtract(new Date(lastDate), tunisiaNow).toMinutes())
  897. if (date.subtract(new Date(lastDate), tunisiaNow).toMinutes() <= 15) {
  898. quickReplies.splice(0, 1)
  899. }
  900. //messenger.sendButtonsMessage(sender,text,buttons)
  901. messenger.sendQuickRepliesMessage(userId, text, quickReplies)
  902. }
  903. }
  904.  
  905.  
  906. //Difference Dejeuner/diner
  907. function sendMomentMessage(user) {
  908. getRestaurant(user.restaurant).then(restaurant => {
  909. if (!restaurant) {
  910. erroHandle(user)
  911. return
  912. }
  913. let title = "Déjeuner ou dîner"
  914. let userId = user.id
  915. let subTitle = "Tu veux 'déjeuner' wala 'diner' ?"
  916. let imageUrl = restaurant.image || "https://assets3.thrillist.com/v1/image/1579997/size/tmg-slideshow_l.jpg"
  917. let buttons = [{
  918. "type": "postback",
  919. "title": "Dejeuner",
  920. "payload": "Dejeuner"
  921. },
  922. {
  923. "type": "postback",
  924. "title": "Diner",
  925. "payload": "Diner"
  926. }
  927. ]
  928. let elements = [{
  929. "title": title,
  930. "subtitle": subTitle,
  931. "image_url": imageUrl,
  932. buttons: buttons
  933. }]
  934. messenger.sendHScrollMessage(userId, elements)
  935. })
  936. }
  937.  
  938. // Bouton pour lheure Jour
  939. function sendHourMessage(user, timing) {
  940. console.log("GONNA send hour messages")
  941. let userId = user.id
  942. let hoursText = "À quel heure voulez vous " + timing + "?"
  943. let start = 0
  944. let end = 5
  945. let quickReplies = []
  946. let hours = []
  947. let restaurant = user.restaurant
  948. let flag
  949. let now = new Date()
  950. let userTime = date.addHours(now, 1);
  951. let year = now.getFullYear()
  952. let month = now.getMonth()
  953. let day = now.getDate()
  954. console.log("month", month)
  955. console.log("user day", user.day)
  956. if (user.day == "Cesoir") {
  957. console.log("time where user is", userTime.toString())
  958. console.log("the now time", now.toString())
  959. flag = "Cesoir"
  960. }
  961. // console.log("the current time is ",new Date(user.timezone))
  962. switch (timing) {
  963. case "Dejeuner":
  964. start = 12
  965. end = 14
  966. break;
  967. case "Diner":
  968. start = 19
  969. end = 22
  970. break;
  971. }
  972. for (let i = start; i < end; i += (1 / 2)) {
  973. let title = i.toString()
  974. console.log("for title", title)
  975. if (!(title.match(/.5+$/))) {
  976. title += ':00'
  977. if (user.day == "Cesoir") {
  978. let minutes = 0
  979. console.log("timezone", parseInt(user.timezone))
  980. let hours = parseInt(title.replace(":00", "")) + 2
  981. let timeOfReserve = new Date(year, month, day, hours, minutes)
  982. console.log("the user time ", userTime.toString())
  983. console.log("the time of reserve is", timeOfReserve.toString())
  984. console.log("the minute abstracting", date.subtract(timeOfReserve, userTime).toMinutes())
  985. if (date.subtract(timeOfReserve, userTime).toMinutes() < 15) {
  986. console.log("i'm not gonna send", title, "hour")
  987. continue
  988. }
  989. }
  990. } else {
  991. title = i.toString().replace(/.5+$/, ":30")
  992. if (user.day == "Cesoir") {
  993. let minutes = 30
  994. let hours = parseInt(title.replace(":30", "")) + 2
  995. let timeOfReserve = new Date(year, month, day, hours, minutes)
  996. console.log("the user time ", userTime.toString())
  997. console.log("the time of reserve is", timeOfReserve.toString())
  998. console.log("the minute abstracting", date.subtract(timeOfReserve, userTime).toMinutes())
  999. console.log("the user time ", userTime.toString())
  1000. console.log("the time of reserve is", timeOfReserve.toString())
  1001. if (date.subtract(timeOfReserve, userTime).toMinutes() < 30) {
  1002. console.log("i'm not gonna send", title, "hour")
  1003. continue
  1004. }
  1005. }
  1006. }
  1007. let quick_reply = {
  1008. "content_type": "text",
  1009. "title": title,
  1010. "payload": title
  1011. }
  1012. hours.push(title)
  1013. quickReplies.push(quick_reply)
  1014. }
  1015. getRestaurantsBookers(restaurant)
  1016. .then((bookers) => {
  1017. //console.log("bookers in ", restaurant, "are", bookers)
  1018. bookers = bookers.filter(booker => {
  1019. if (booker) {
  1020. return true
  1021. } else {
  1022. return false
  1023. }
  1024. })
  1025. database.ref("/restaurants/" + restaurant)
  1026. .child("tablesNumber")
  1027. .once("value")
  1028. .then((res) => {
  1029. let tablesNumber = res.val()
  1030. quickReplies = quickReplies.filter(((quickReplies) => {
  1031. let userDate = generateReservationDate(user, quickReplies.title)
  1032. //console.log("the generated date", date)
  1033. let options = {
  1034. date: userDate,
  1035. tablesNumber: tablesNumber
  1036. }
  1037. let sendButton = checkTime(user, bookers, options)
  1038. console.log("save to send time ? ", sendButton)
  1039. return sendButton
  1040. }))
  1041. if (quickReplies.length == 0) {
  1042. erroHandle(user, "You can't reserve in this restaurant this current time ", (err, res) => {
  1043. checkBookingLimit(user).then(result => {
  1044. let limit = result.limit
  1045. let status = result.status
  1046. if (status) {
  1047. sendRestaurant(user, 0, restaurant)
  1048. } else {
  1049. sendBookingLimit(user, limit)
  1050. }
  1051. })
  1052. })
  1053. return
  1054. }
  1055. messenger.sendQuickRepliesMessage(userId, hoursText, quickReplies, 'REGULAR', (err, res) => {
  1056. if (err) {
  1057. console.log("error sendign hour messages", err)
  1058. }
  1059. })
  1060. })
  1061. })
  1062.  
  1063. }
  1064.  
  1065. // Bouton pour lheure soir
  1066. function sendHourNightMessage(user) {
  1067. let userId = user.id
  1068. let nightHourText = "A quel heure voulez vous diner?"
  1069. let buttons = [{
  1070. "type": "postback",
  1071. "title": "entre 18h30 et 19h30",
  1072. "payload": "NightHour1"
  1073. },
  1074. {
  1075. "type": "postback",
  1076. "title": "entre 19h30 et 20h30",
  1077. "payload": "NightHour2"
  1078. },
  1079. {
  1080. "type": "postback",
  1081. "title": "entre 20h30 et 21h30",
  1082. "payload": "NightHour3"
  1083. }
  1084. ]
  1085. messenger.sendButtonsMessage(userId, nightHourText, buttons)
  1086.  
  1087. }
  1088.  
  1089. //Function for sending confirmation
  1090. function sendConfirm(user, baseRef, booking) {
  1091. console.log("gonna call from databse and confirm stuff")
  1092. let userId = user.id
  1093. let bookingId = booking.key || user.lastBookingId
  1094. baseRef.once('value').then((userData) => {
  1095. console.log("restuarants edited")
  1096. userData = userData.val()
  1097. // console.log("received Data from datbase",JSON.stringify(userData))
  1098. let username = userData.username
  1099. let movieTitle = (userData.movie) ? capitalizeFirstLetter(user.movie.substring(0, user.movie.indexOf("cinemaType") - 1).replace(/-/, " ")) : ""
  1100. let hour = userData.hour
  1101. let day = userData.day
  1102. let timing = getTimesFormat(user.date)
  1103. let place = userData[user.type]
  1104. let peopleNumber = userData.peopleNumber
  1105. // let confirmationText=userData.hour
  1106. let confirmationText = "Merci " + username + ", Mriguel, je réserve une table pour " + peopleNumber + " à " + place + " " + day + " à " + hour + " . Peux-tu confirmer pour moi ?"
  1107. if (userData.type == "cinema") {
  1108. confirmationText = "Merci " + username + ", Mriguel, je réserve une table pour " + peopleNumber + " à " + place + "for the movie " + movieTitle + " at " + " " + timing + " . Peux-tu confirmer pour moi ?"
  1109. }
  1110. let buttons = [{
  1111. "type": "postback",
  1112. "title": "Confirmer",
  1113. "payload": "Confirm Booking " + bookingId
  1114. },
  1115. {
  1116. "type": "postback",
  1117. "title": "Annuler",
  1118. "payload": "Cancel Booking " + bookingId
  1119. }
  1120. ]
  1121. messenger.sendButtonsMessage(userId, confirmationText, buttons, 'REGULAR', (err, res) => {
  1122. if (err) {
  1123. console.log("error sending confirmation", err)
  1124. } else {
  1125. console.log("success confirmation sent")
  1126. }
  1127. })
  1128. })
  1129. }
  1130. //to confirm and send Emai
  1131. function confirmBooking(user, baseRef, bookingId) {
  1132. console.log("going to confirm booking", bookingId)
  1133. getBookingStatus(user.id, bookingId).then(bookingStatus => {
  1134. if (bookingStatus == "confirmed") {
  1135. sendAlreadyConfirmed(user)
  1136. return
  1137. }
  1138. let userId = user.id
  1139. bookingId = bookingId || user.lastBookingId
  1140. baseRef.once('value').then((userData) => {
  1141. console.log("reference is calling me ")
  1142. userData = userData.val()
  1143. let userRestaurant = userData.restaurant
  1144. getEmail(user[user.type], user.type, (restaurantEmail) => {
  1145. let username = userData.username
  1146. let hour = userData.hour
  1147. let day = userData.day
  1148. let toEmail1 = "Sami.Boujbel@city.ac.uk"
  1149. let toEmail2 = restaurantEmail
  1150. let subject = "Ali Bookings " + username + " Booking"
  1151. let confirmationEmail = ""
  1152. if (userData.type == "cinema") {
  1153. confirmationEmail = username + " a reservè dans votre film: " + userData[userData.type] + ", " + getTimesFormat(userData.date) + " . Ceci est une confirmation , ISLAM C EST MR BOJ "
  1154. } else {
  1155. userRestaurant
  1156. confirmationEmail = username + " a reservè dans votre restaurant: " + userData[userData.type] + ", " + day + " a " + hour + " . Ceci est une confirmation , ISLAM C EST MR BOJ "
  1157. }
  1158.  
  1159. sendEmail(toEmail1, subject, confirmationEmail, (err, res) => {
  1160. if (err) {
  1161. console.log("Error sending email", err)
  1162. }
  1163. })
  1164. sendEmail(toEmail2, subject, confirmationEmail)
  1165. let bookingUpdate = {
  1166. status: "confirmed"
  1167. }
  1168. console.log("updating booking", bookingId, bookingUpdate)
  1169. updateBooking(user, bookingId, bookingUpdate)
  1170. //console.log("I'm called to confirm")
  1171. messenger.sendTextMessage(userId, "Merci " + username + "! le " + userData.type + " a etè notifiè et Jawek ahla jaw.", (err, res) => {
  1172. messenger.sendTextMessage(userId, "Pour modifier la réservation, contact mon équipe sur le 29 000 000 . À Bientôt ^_^ ")
  1173. })
  1174. })
  1175. })
  1176. })
  1177. }
  1178.  
  1179. //to confirm and send Emai
  1180. function cancelBooking(user, baseRef, bookingId) {
  1181. console.log("going to cancel booking")
  1182. let userId = user.id
  1183. bookingId = bookingId || user.lastBookingId
  1184. baseRef.once('value').then((userData) => {
  1185. console.log("reference is calling me ")
  1186. userData = userData.val()
  1187. let userPlace = userData[userData.type]
  1188. getEmail(userPlace, user.type, (placeEmail) => {
  1189. let username = userData.username
  1190. let hour = userData.hour
  1191. let day = userData.day
  1192. let toEmail1 = "Sami.Boujbel@city.ac.uk"
  1193. let toEmail2 = placeEmail
  1194. let subject = "Ali Bookings " + username + " Booking"
  1195. let confirmationEmail = username + "Canceled reservation in restaurant: " + userPlace + ", " + day + " a " + hour
  1196. sendEmail(toEmail1, subject, confirmationEmail)
  1197. sendEmail(toEmail2, subject, confirmationEmail)
  1198. let bookingUpdate = {
  1199. status: "canceled"
  1200. }
  1201. updateBooking(user, bookingId, bookingUpdate)
  1202. //console.log("I'm called to confirm")
  1203. console.log("Going to cancel booking", bookingId)
  1204. messenger.sendTextMessage(userId, "J'ai annulè votre réservation. :(", 'REGULAR', (err, res) => {
  1205. if (!err) {
  1206. sendTextMessage(userId, "Pour une future réservation, écrivez 'Ali'.")
  1207. }
  1208. })
  1209. })
  1210. })
  1211. }
  1212. //to cancel the booking
  1213. /*
  1214. function cancelBookingWithoutEmail(sender, baseRef) {
  1215. console.log("Going to cancel booking")
  1216. messenger.getProfile(sender, function(err, res) {
  1217. baseRef.set({
  1218. username: res.first_name + ' ' + res.last_name
  1219. })
  1220. }) // Gets user information
  1221.  
  1222. messenger.sendTextMessage(sender, "J'ai annulè votre reservation. :(", 'REGULAR', (err, res) => {
  1223. if (!err) {
  1224. sendTextMessage(sender, "Pour une future reservation, ecrivez 'Ali'.")
  1225. }
  1226. })
  1227.  
  1228. }
  1229. */
  1230. //En cas d'annulation
  1231. function AnnulerReservation(user) {
  1232. let userId = user.id
  1233. let messageData = {
  1234. "attachment": {
  1235. "type": "template",
  1236. "payload": {
  1237. "template_type": "button",
  1238. "text": "Etes vous sur de vouloir annuler la reservation?",
  1239. "buttons": [{
  1240. "type": "postback",
  1241. "title": "Oui",
  1242. "payload": "Annuler"
  1243. },
  1244. {
  1245. "type": "postback",
  1246. "title": "j'ai changè d'avis",
  1247. "payload": "NePasAnnuler"
  1248. }
  1249. ]
  1250. }
  1251. }
  1252. }
  1253. request({
  1254. url: 'https://graph.facebook.com/v2.6/me/messages',
  1255. qs: {
  1256. access_token: token
  1257. },
  1258. method: 'POST',
  1259. json: {
  1260. recipient: {
  1261. id: userId
  1262. },
  1263. message: messageData,
  1264. }
  1265. }, function (error, response, body) {
  1266. if (error) {
  1267. console.log('Error sending messages: ', error)
  1268. } else if (response.body.error) {
  1269. console.log('Error: ', response.body.error)
  1270. }
  1271. })
  1272. }
  1273.  
  1274. //Bouton for promotions.
  1275. function sendPromotionMessage(user) {
  1276. let userId = user.id
  1277. let elements = [{
  1278. "title": "Une entrée, Un plat et un dessert a 20DT seulement",
  1279. "subtitle": "Sakura",
  1280. "image_url": "https://goo.gl/sZESxq",
  1281. "buttons": [{
  1282. "type": "postback",
  1283. "title": "reservez",
  1284. "payload": "Prom1"
  1285. }, {
  1286. "type": "web_url",
  1287. "url": "http://www.le-paresseux.com",
  1288. "title": "Plus de details",
  1289. }],
  1290. }, {
  1291. "title": "Déjeuner ou dîner pour 2 personnes a 'Tam Tam' partir de 25 DT Seulement",
  1292. "subtitle": "Tam Tam",
  1293. "image_url": "https://scontent-sin6-1.xx.fbcdn.net/v/t1.0-9/18739884_1348910391812983_7103657927127446030_n.jpg?oh=63bb601b4b1cd15722ee93c47c6b8526&oe=5A0C4AF8",
  1294. "buttons": [{
  1295. "type": "postback",
  1296. "title": "Reservez",
  1297. "payload": "Prom2",
  1298. }, {
  1299. "type": "web_url",
  1300. "url": "http://www.le-paresseux.com",
  1301. "title": "Plus de details",
  1302. }],
  1303. }]
  1304. messenger.sendHScrollMessage(userId, elements)
  1305.  
  1306. }
  1307. //CallsendAPI for messages
  1308. function callSendAPI(messageData) {
  1309. return new Promise((resolve, reject) => {
  1310. request({
  1311. url: 'https://graph.facebook.com/v2.6/me/messages',
  1312. qs: {
  1313. access_token: token
  1314. },
  1315. method: 'POST',
  1316. json: messageData
  1317. }, function (error, response, body) {
  1318. if (error) {
  1319. console.log('Error sending messages: ', error)
  1320. reject(error)
  1321. } else if (response.body.error) {
  1322. console.log('Error: ', response.body.error)
  1323. reject(response.body.error)
  1324. } else {
  1325. resolve(response.body)
  1326. }
  1327. })
  1328. })
  1329. }
  1330. /*
  1331. sendEmail("sami.boujbel@city.ac.uk", "This is a template test", "Here will be the info of who reserver and what would be the time", (err, res) => {
  1332. if (err) {
  1333. console.log("Error sending email", err)
  1334. }
  1335. })
  1336. */
  1337. function getTemplate(confirmationEmail) {
  1338. let html = fs.readFileSync("./email/template.html", {
  1339. encoding: "utf-8"
  1340. })
  1341. html = html.replace("{{confirmation}}", confirmationEmail)
  1342. return html
  1343. }
  1344. //writeUserData("1","Ahmed","mpghknown@gmail.com","somewhere","23","today")
  1345. function writeUserData(userId, name, email, restaurant, hour, day) {
  1346. database.ref('/booking-list/' + userId)
  1347. .update({
  1348. username: name,
  1349. email: email,
  1350. restaurant: restaurant,
  1351. hour: hour,
  1352. day: day
  1353. });
  1354. }
  1355.  
  1356.  
  1357. /*
  1358. addRestaurant("Sakura", "Boujbelsamy@gmail.com")
  1359. */
  1360.  
  1361. function addRestaurant(restaurants, email) {
  1362. //Write Email
  1363. database.ref('/restaurants/' + restaurants).set({
  1364. Email: email
  1365. })
  1366. }
  1367.  
  1368. function getEmail(place, type, callback) {
  1369. //Read Email
  1370. database.ref('/' + type + 's/' + place).once('value').then(function (restaurant) {
  1371. let Email = restaurant.val().Email
  1372. callback(Email)
  1373. })
  1374. }
  1375.  
  1376.  
  1377. //
  1378.  
  1379. function readUserData(uid) {
  1380. var userBooking = database.ref('booking-list/' + uid);
  1381. userBooking.once('value').then(function (snapshot) {
  1382. console.log("The value", snapshot.val())
  1383. });
  1384. }
  1385.  
  1386. function createMailTrans() {
  1387. // create reusable transporter object using the default SMTP transport
  1388. let transporter = nodemailer.createTransport({
  1389. host: 'smtp.gmail.com',
  1390. port: 465,
  1391. secure: true, // secure:true for port 465, secure:false for port 587
  1392. auth: {
  1393. user: aliEmail,
  1394. pass: aliPass
  1395. }
  1396. })
  1397. return transporter
  1398. }
  1399.  
  1400. function sendEmail(To, Subject, Body, callback) {
  1401. // setup email data with unicode symbols
  1402. let mailOptions = {
  1403. from: '"Ali Booking 🍔 🍟" <alibookingtn@gmail.com>', // sender address
  1404. to: To, // list of receivers
  1405. subject: Subject, // Subject line
  1406. text: Body, // plain text body
  1407. html: getTemplate(Body) // html body
  1408. };
  1409. let transporter = createMailTrans()
  1410. transporter.sendMail(mailOptions, (error, info) => {
  1411. if (error) {
  1412. if (callback)
  1413. return callback(error, null)
  1414. }
  1415. if (info) {
  1416. console.log('Message %s sent: %s', info.messageId, info.response);
  1417. if (callback)
  1418. return callback(null, info)
  1419. }
  1420.  
  1421. });
  1422.  
  1423. }
  1424.  
  1425. function startDB() {
  1426. // TODO: Replace with your project's config object
  1427. var config = {
  1428. apiKey: "AIzaSyAvswhkjV-Ts4uEEYvQZSfyLhD5I9v9QPA",
  1429. authDomain: "bookings-7592e.firebaseapp.com",
  1430. databaseURL: "https://bookings-7592e.firebaseio.com",
  1431. storageBucket: "bookings-7592e.appspot.com"
  1432. };
  1433. firebase.initializeApp(config);
  1434. return firebase.auth().signInWithEmailAndPassword(fbaseEmail, fbasePass)
  1435. .catch(function (error) {
  1436. // Handle Errors here.
  1437. var errorCode = error.code;
  1438. var errorMessage = error.message;
  1439. if (error) {
  1440. console.log("Can't sign in to database because", errorMessage)
  1441. console.log("here")
  1442. } else {
  1443. console.log("resolving")
  1444.  
  1445. }
  1446. });
  1447. // Get a reference to the database service
  1448.  
  1449.  
  1450. }
  1451.  
  1452. function test(payload) {
  1453. //Check if the payload is onlyyyy numbers or '-' like 1-2 or 3-4 or so
  1454. let Numerics = /^[0-9]-+$/
  1455. let userId = "1"
  1456. if (Numerics.test(payload)) {
  1457. // DateMessage(sender)
  1458. database.ref('/booking-list/' + userId).update({
  1459. peopleNumber: payload
  1460. })
  1461. }
  1462. }
  1463. //Send to tell the user I don't understand
  1464. function sendNotUnderstanding(user) {
  1465. let userId = user.id
  1466. var Random = Math.floor(Math.random() * (NotUnderstanding.length - 1));
  1467. let text = NotUnderstanding[Random] + " " + 'écrit "Ali" pour commencer'
  1468.  
  1469. messenger.sendTextMessage(userId, text)
  1470.  
  1471. }
  1472.  
  1473. function sendShareToFriend(user) {
  1474. let userId = user.id
  1475. let eatingFoodImage = "https://bookbookbot.com/image/app/home/heroimage_landing_large_compressed.jpg"
  1476. let elements = [{
  1477. title: "Ali - Le bot utile",
  1478. subtitle: "AliBot is Restaurants booking bot, where you can book your favorite restaurant",
  1479. image_url: eatingFoodImage,
  1480. buttons: [{
  1481. type: "element_share"
  1482. }],
  1483. default_action: {
  1484. type: "web_url",
  1485. url: "https://m.me/3amekAli/"
  1486. }
  1487. }]
  1488. console.log(JSON.stringify(elements), userId)
  1489. messenger.sendHScrollMessage(userId, elements, 'REGULAR', (err, res) => {
  1490. if (err) {
  1491. console.log(err)
  1492. }
  1493. })
  1494. }
  1495.  
  1496. function getUser(userId) {
  1497.  
  1498. return new Promise((resolve, reject) => {
  1499.  
  1500. database.ref('/booking-list/' + userId).once('value').then((user) => {
  1501. user = user.val()
  1502. if (!user) {
  1503. insertUser(userId, (err, user) => {
  1504. resolve(user)
  1505. })
  1506. } else {
  1507. if (!user.id) {
  1508. insertUser(userId, (err, user) => {
  1509. resolve(user)
  1510. })
  1511. } else {
  1512. resolve(user)
  1513. }
  1514. }
  1515. console.log("user eventualy", user.id)
  1516. })
  1517. })
  1518. }
  1519.  
  1520. function insertUser(userId, callback) {
  1521. messenger.getProfile(userId, function (err, res) {
  1522. let baseRef = database.ref('/booking-list/' + userId)
  1523. let user = {
  1524. id: userId,
  1525. username: res.first_name + ' ' + res.last_name,
  1526. profile_pic: res.profile_pic,
  1527. gender: res.gender,
  1528. locale: res.locale,
  1529. timezone: res.timezone
  1530. }
  1531. baseRef.update(user).then((res) => {
  1532. callback(null, user)
  1533. })
  1534. })
  1535. }
  1536. //save date of reservation in precise
  1537. function saveDate(user, hour, baseRef) {
  1538. let userDate = generateReservationDate(user, hour)
  1539. let now = new Date()
  1540. let tunisiaNow
  1541. if (process.env.local) {
  1542. tunisiaNow = moment().subtract(1, "hour").toDate()
  1543. } else {
  1544. tunisiaNow = date.addHours(now, 1)
  1545. }
  1546.  
  1547. return baseRef.update({
  1548. date: userDate,
  1549. dateReserved: tunisiaNow.getTime()
  1550. }).then(res => {
  1551. return res
  1552. })
  1553. }
  1554.  
  1555. function checkTime(user, bookers, options) {
  1556. let bookersIds = Object.keys(bookers)
  1557. let PeopleInThat = bookersIds.filter((bookerId) => {
  1558. // console.log("doing compartion", bookers[userId].date == options.date, "user date", bookers[userId].date, "the button date", options.date)
  1559. return bookers[bookerId].date == options.date
  1560. })
  1561. console.log(PeopleInThat.length, "people reserved in that date", options.date, "and peoples number", parseInt(options.tablesNumber))
  1562. if (PeopleInThat.length >= parseInt(options.tablesNumber)) {
  1563. return false
  1564. } else {
  1565. return true
  1566. }
  1567. }
  1568.  
  1569. function getRestaurantsBookers(restaurant) {
  1570. return database.ref("booking-list").once("value").then(users => {
  1571. users = users.val()
  1572. if (!users) {
  1573. return []
  1574. } else {
  1575. let userIds = Object.keys(users)
  1576. let resultsPromise = []
  1577. userIds.forEach(userId => {
  1578. console.log(userId)
  1579. let bookingPromise = database.ref("booking-list/" + userId + "/bookings")
  1580. .orderByChild("restaurant")
  1581. .equalTo(restaurant)
  1582. .once("value")
  1583. .then(res => {
  1584. if (res.val())
  1585. return res.val()
  1586. })
  1587. resultsPromise.push(bookingPromise)
  1588. })
  1589. return Promise.all(resultsPromise)
  1590. }
  1591. })
  1592. /*
  1593. return database.ref().child("/booking-list/")
  1594. .orderByChild("restaurant")
  1595. .equalTo(restaurant)
  1596. .once("value")
  1597. .then((res) => {
  1598. if(res.val())
  1599. return res.val()
  1600. })
  1601. */
  1602. }
  1603.  
  1604. //generate reservation dates
  1605. function generateReservationDate(user, hour, flag) {
  1606. let now = new Date()
  1607. let tunisiaNow
  1608. if (process.env.local) {
  1609. tunisiaNow = moment().subtract(1, "hour").toDate()
  1610. } else {
  1611. tunisiaNow = date.addHours(now, 1)
  1612. }
  1613. console.log("now ", now.toString())
  1614. console.log("now ", tunisiaNow.toString())
  1615. let addedDays
  1616. let reservationDay
  1617. let userDay
  1618. if (flag) {
  1619. userDay = "Cesoir"
  1620. } else {
  1621. userDay = user.day
  1622. }
  1623. let userHour = parseInt(strsplit(hour, /:/)[0])
  1624. let userMinutes = strsplit(hour, /:/)[1]
  1625. if (userMinutes == "30") {
  1626. userMinutes = 30
  1627. } else {
  1628. userMinutes = 0
  1629. }
  1630. if (userDay == "Demain") {
  1631. addedDays = 1
  1632. } else if (userDay == "ApresDemain") {
  1633. addedDays = 2
  1634. }
  1635. //addedDays = 0
  1636. if (!addedDays) {
  1637. reservationDay = tunisiaNow
  1638. } else if (!reservationDay) {
  1639. reservationDay = date.addDays(tunisiaNow, addedDays)
  1640. }
  1641. let year = reservationDay.getFullYear()
  1642. let month = reservationDay.getMonth()
  1643. let day = reservationDay.getDate()
  1644. console.log("The user hour ", userHour)
  1645. console.log("the added days", day)
  1646. let reservationDate = new Date(year, month, day, userHour, userMinutes)
  1647. console.log("the user reservation date is ", reservationDate.toString())
  1648. console.log("thee user reserved on ", tunisiaNow.toString())
  1649. return reservationDate.getTime()
  1650. }
  1651. //Handle when an error happens
  1652. function erroHandle(user, addedText, callback) {
  1653. let userId = user.ID
  1654. if (callback) {
  1655. messenger.sendTextMessage(userId, "Sorry! but " + addedText, "REGULAR", callback)
  1656. } else {
  1657. messenger.sendTextMessage(userId, "Sorry! but " + addedText, "REGULAR")
  1658. }
  1659. }
  1660.  
  1661. function removePastBookings(callback) {
  1662. let now = new Date()
  1663.  
  1664. let tunisiaNow
  1665. if (process.env.local) {
  1666. tunisiaNow = moment().subtract(1, "hour").toDate()
  1667. } else {
  1668. tunisiaNow = date.addHours(now, 1)
  1669. }
  1670. database.ref('/booking-list/').once('value').then((bookers) => {
  1671. bookers = bookers.val()
  1672. let bookerIds = Object.keys(bookers)
  1673. bookerIds.map((bookerId, i) => {
  1674. let booker = bookers[bookerId]
  1675. if (!booker.date) {
  1676. return
  1677. }
  1678. let userDate = new Date(booker.date)
  1679. if (date.subtract(tunisiaNow, userDate).toMinutes() <= 0) {
  1680. database.ref('/booking-list/' + bookerId).remove()
  1681. }
  1682. if (i == bookerIds.length - 1) {
  1683. callback(null, "done")
  1684. }
  1685. })
  1686. })
  1687. }
  1688.  
  1689. function sendUserBookings(user) {
  1690. let userId = user.id
  1691. return getUserBookings(userId).then(bookings => {
  1692. if (bookings.length > 0) {
  1693. console.log("the bookings length",bookings.length)
  1694. let elements = []
  1695. let images_promises = []
  1696. bookings.forEach(booking => {
  1697. let type = booking.cinema ? "movie" : "restaurant"
  1698. let image_promise = getPlace(booking, type).then(restaurant => {
  1699. return restaurant.image
  1700. })
  1701. images_promises.push(image_promise)
  1702. })
  1703. Promise.all(images_promises).then(images => {
  1704. bookings.forEach((booking, index) => {
  1705. let title = booking[booking.type]
  1706. let bookingDate = date.format(new Date(booking.date), 'YYYY/MM/DD HH:mm')
  1707. let subtitle = "You've reserved in " + booking.restaurant + " for " + booking.peopleNumber + " at " + bookingDate;
  1708. let image_url = images[index]
  1709. //getRestaurant(booking.restaurant)
  1710. let buttons = getBookingButtons(booking)
  1711. if(buttons.length==2) {
  1712. subtitle+="\n You've canceled this booking"
  1713. }
  1714. let element = {
  1715. title,
  1716. subtitle,
  1717. buttons,
  1718. image_url
  1719. }
  1720. elements.push(element)
  1721. })
  1722. messenger.sendHScrollMessage(userId, elements, (err, res) => {
  1723. if (err) {
  1724. console.log("error with sending user bookings", err)
  1725. }
  1726. })
  1727. })
  1728. } else {
  1729. console.log("sending sorry no bookings")
  1730. let sorryText = "Sorry but you don't have any bookings"
  1731. let bookButton = {
  1732. content_type: "text",
  1733. title: "Reservez",
  1734. payload: "Reservez"
  1735. }
  1736. messenger.sendQuickRepliesMessage(userId, sorryText, [bookButton], (err, res) => {
  1737. if (err) {
  1738. console.log(err)
  1739. }
  1740. })
  1741. }
  1742. })
  1743. }
  1744.  
  1745. function getUserBookings(userId) {
  1746. return database.ref("booking-list/" + userId + "/bookings").once("value").then(snapshot => {
  1747. console.log("sendingew")
  1748. if (!snapshot.val()) {
  1749. console.log("no bookings")
  1750. return []
  1751. }
  1752. let userBookings = snapshotToArray(snapshot)
  1753. userBookings = sort(userBookings, "date")
  1754. userBookings = userBookings.filter(booking => {
  1755. return parseInt(booking.date) >= new Date().getTime()
  1756. })
  1757. return userBookings
  1758. })
  1759. }
  1760.  
  1761. function checkBookingLimit(user) {
  1762. return getUserBookings(user.id).then(bookings => {
  1763. return database.ref("admin_panel/bookingLimit").once("value").then(limit => {
  1764. console.log("limit", limit.val())
  1765. let bookingLimit = limit.val()
  1766. let liveBookings = bookings.filter(booking => {
  1767. return booking.status == "confirmed"
  1768. })
  1769. console.log("bookinglimit", bookingLimit)
  1770. if (liveBookings.length == bookingLimit) {
  1771. return {
  1772. status: false,
  1773. limit: bookingLimit
  1774. }
  1775. } else {
  1776. return {
  1777. status: true,
  1778. limit: bookingLimit
  1779. }
  1780. }
  1781. })
  1782. })
  1783. }
  1784.  
  1785. function sendBookingLimit(user, limit) {
  1786. let sorryText = "Sorry but you're limit with on only to " + limit + " bookings "
  1787. let quick_replies = [{
  1788. content_type: "text",
  1789. title: "My Bookings 💾",
  1790. payload: "myBookings"
  1791. }]
  1792. messenger.sendQuickRepliesMessage(user.id, sorryText, quick_replies, (err, res) => {
  1793. if (err) {
  1794. console.log("Error sending sorry", err)
  1795. }
  1796. })
  1797. }
  1798.  
  1799. function sort(array, key) {
  1800. array.sort(function (a, b) {
  1801. return new Date(b[key]) - new Date(a[key]);
  1802. });
  1803. return array
  1804. }
  1805.  
  1806. function saveBooking(user, type) {
  1807. let userId = user.id
  1808. let booking = {
  1809. date: user.date,
  1810. dateReserved: user.dateReserved,
  1811. peopleNumber: user.peopleNumber,
  1812. type: type
  1813. }
  1814. booking.status = "pending"
  1815. if (type == "restaurant") {
  1816. booking.day = user.day
  1817. booking.hour = user.hour
  1818. booking.restaurant = user.restaurant
  1819. } else if (type == "cinema") {
  1820. booking.day = user.day
  1821. booking.hour = user.hour
  1822. booking.cinema = user.cinema
  1823. booking.movie = user.movie.replace(/ cinemaType \[(.*?)\]/g, "").trim()
  1824. }
  1825. let pushingReference = database.ref("booking-list/" + userId + "/bookings")
  1826. return pushingReference.push(booking).then(ref => {
  1827. let key = ref.key
  1828. return ref.update({
  1829. key
  1830. }).then(ref => {
  1831. console.log("updated the booking reference key ")
  1832. return database.ref("booking-list/" + userId).update({
  1833. lastBookingId: key
  1834. }).then(done => {
  1835. booking.key = key
  1836. return booking
  1837. })
  1838. })
  1839. })
  1840. }
  1841.  
  1842. function snapshotToArray(snapshot, object) {
  1843. let returnArr = [];
  1844. if (object) {
  1845. let snapKeys = Object.keys(snapshot)
  1846. snapKeys.forEach(snapKey => {
  1847. let item = snapshot[snapKey];
  1848. item.key = snapshot;
  1849. returnArr.push(item);
  1850. });
  1851. return returnArr
  1852. }
  1853. snapshot.forEach(childSnapshot => {
  1854. let item = childSnapshot.val();
  1855. item.key = childSnapshot.key;
  1856. returnArr.push(item);
  1857. });
  1858.  
  1859. return returnArr;
  1860. };
  1861.  
  1862. function getBookingButtons(booking) {
  1863. let buttons = [{
  1864. type: "postback",
  1865. title: "Modify ⚠",
  1866. payload: "modifyUserBooking " + booking.key
  1867. },
  1868. {
  1869. type: "postback",
  1870. title: "Contact "+booking.type+ " 🏬",
  1871. payload: "contactRestaurant " + booking[booking.type]
  1872. }
  1873. ]
  1874. if (booking.status == "pending") {
  1875. buttons.push({
  1876. type: "postback",
  1877. title: "Confirm ✔",
  1878. payload: "Confirm Booking " + booking.key
  1879. })
  1880. } else if (booking.status == "confirmed") {
  1881. buttons.push({
  1882. type: "postback",
  1883. title: "Cancel ❌",
  1884. payload: "Cancel Booking " + booking.key
  1885. })
  1886. }
  1887. return buttons
  1888. }
  1889.  
  1890. function getRestaurant(name) {
  1891. return database.ref('/restaurants/' + name).once('value').then((restaurant) => {
  1892. return restaurant.val()
  1893. })
  1894. }
  1895.  
  1896. function getPlace(booking, type) {
  1897. let reference = ""
  1898. if (type == "movie") {
  1899. let weekId = moment(booking.data).startOf('week').format('LL').toString()
  1900. reference = "movies/" + booking.cinema + "/" + weekId+"/"+ booking.type
  1901. } else {
  1902. reference = type + "s"
  1903. }
  1904. console.log("everything", reference)
  1905. return database.ref(reference + '/' + booking[type]).once('value').then((place) => {
  1906. console.log("place",place.val() )
  1907. return place.val()
  1908. })
  1909. }
  1910.  
  1911. function updateBooking(user, bookingId, update) {
  1912. console.log("updating booking", bookingId, update)
  1913. return database.ref("booking-list/" + user.id + "/bookings/" + bookingId).update(update)
  1914. }
  1915.  
  1916. function getBookingStatus(userId, bookingId) {
  1917. console.log("here right")
  1918. return database.ref("booking-list/" + userId + "/bookings/" + bookingId + "/status").once("value").then(status => {
  1919. return status.val()
  1920. })
  1921. }
  1922. function getBookingField(userId, bookingId,field) {
  1923. console.log("here right")
  1924. return database.ref("booking-list/" + userId + "/bookings/" + bookingId + "/"+field).once("value").then(status => {
  1925. return status.val()
  1926. })
  1927. }
  1928. function sendAlreadyConfirmed(user) {
  1929. let text = "You've already confirmed this booking ^_^"
  1930. messenger.sendTextMessage(user.id, text)
  1931. }
  1932.  
  1933. function SuccesfullyModifyed(user) {
  1934. let sentText = "You've sucessfuly modifyed your booking"
  1935. let userId = user.id
  1936. messenger.sendTextMessage(userId, sentText, (err, res) => {
  1937. if (err) {
  1938. console.log("error sending succes of modify", err)
  1939. }
  1940. })
  1941. }
  1942.  
  1943. function keepAlive() {
  1944. setInterval(() => {
  1945. request({
  1946. url: "https://intense-shore-72911.herokuapp.com"
  1947. }, (err, res) => {
  1948.  
  1949. })
  1950. }, 300000)
  1951. }
  1952.  
  1953. function sendCinemaAgenda(user, place) {
  1954. let hereText = "Here's todays week agenda for the " + place + " cinema ^_^"
  1955. if (place == "lagora") {
  1956. takeAgendaScreen().then(url => {
  1957. console.log("the url", url)
  1958. sendImageMessage(user.id, url).then(done => {
  1959. //sendTextMessage(user.id,hereText)
  1960. let weekId = moment().startOf('week').format('LL').toString()
  1961. getWeekAgenda(weekId, place).then(types => {
  1962. let quick_replies = []
  1963. types.forEach(type => {
  1964. quick_replies.push({
  1965. "content_type": "text",
  1966. "title": type,
  1967. "payload": "cinemaType [" + type + "] cinema [" + place + "]"
  1968. })
  1969. })
  1970. messenger.sendQuickRepliesMessage(user.id, hereText, quick_replies, (err, res) => {
  1971. if (err) {
  1972. console.log("error sending cinemas events types", err)
  1973. } else {
  1974. console.log("sent cinemas events types")
  1975. }
  1976.  
  1977. })
  1978. })
  1979. })
  1980. })
  1981. }
  1982. }
  1983.  
  1984. function sendTextsInOrder(recipientId, texts, seconds) {
  1985. seconds = 0 || seconds * 1000
  1986. console.log("the damn received", recipientId)
  1987. let textsPromise = []
  1988. texts.forEach((text, index) => {
  1989. let intervalStart = index + 1
  1990. console.log("the user ", recipientId)
  1991. setTimeout((recipientId, text, intervalStart) => {
  1992. console.log("the recipient ", recipientId, text, index)
  1993. sendTypingOn(recipientId)
  1994. setTimeout((recipientId, text) => {
  1995. sendTextMessage(recipientId, text)
  1996. sendTypingOff(recipientId)
  1997. }, intervalStart * seconds, recipientId, text)
  1998. }, (intervalStart * seconds) + 1000, recipientId, text, intervalStart)
  1999. })
  2000. //Promise.all(textsPromise)
  2001. }
  2002.  
  2003. function sendTypingInterval(recipientId, text, index, seconds) {
  2004. return new Promise((resolve, reject) => {
  2005. sendTypingOn(recipientId).then(done => {
  2006. setTimeout((resolve, reject, recipientId) => {
  2007. sendTextMessage(recipientId, text).then(done => {
  2008. return sendTypingOff(recipientId).then(done => {
  2009. resolve()
  2010. })
  2011. })
  2012. .catch(err => {
  2013. console.log("Error sending typing off")
  2014. resolve()
  2015. })
  2016. }, index * seconds, resolve, reject, recipientId)
  2017. }).catch(err => {
  2018. console.log("Error sending typing on")
  2019. resolve()
  2020. })
  2021. })
  2022. }
  2023.  
  2024. function sendTypingOn(recipientId) {
  2025. console.log("Turning typing indicator on");
  2026.  
  2027. var messageData = {
  2028. recipient: {
  2029. id: recipientId
  2030. },
  2031. sender_action: "typing_on"
  2032. };
  2033.  
  2034. return callSendAPI(messageData);
  2035. }
  2036.  
  2037. function sendTypingOff(recipientId) {
  2038. console.log("Turning typing indicator off");
  2039. var messageData = {
  2040. recipient: {
  2041. id: recipientId
  2042. },
  2043. sender_action: "typing_off"
  2044. };
  2045. return callSendAPI(messageData);
  2046. }
  2047. /*
  2048. let now=date.addHours(new Date(),2)
  2049. let year=now.getFullYear()
  2050. let month=now.getMonth()
  2051. let day=now.getDate()
  2052. let twelvePm=new Date(year,month,day,21+2,30)
  2053. let hour="!2"
  2054. let minute="00"
  2055.  
  2056. console.log(date.subtract(twelvePm,now).toMinutes())
  2057. console.log("the now with user time is ",now.toString())
  2058. console.log("twelvePm is ",twelvePm.toString())
  2059. */
  2060. function* scrape() {
  2061. let weekId = moment().startOf('week').format('LL').toString()
  2062. let week = yield getWeek("lagora", weekId)
  2063. console.log("the week", week)
  2064. if (!week) {
  2065. let movies = yield scrapeWeekData()
  2066. console.log("this week mooveis", movies)
  2067. for (let i = 0; i < movies.length; i++) {
  2068. let movie = yield getTimesForMovie(movies[i])
  2069. if (Object.keys(movie).length > 0) {
  2070. database.ref("movies/lagora/" + weekId + "/" + movie.type + "/" + movie.id).set(movie)
  2071. saveWeek("lagora", weekId)
  2072. console.log("the movie", movie)
  2073. }
  2074. }
  2075. }
  2076. }
  2077.  
  2078. function getWeek(cinema, weekId) {
  2079. return database.ref('weeks/' + cinema + '/' + weekId).once("value").then(res => {
  2080. if (res.val()) {
  2081. return true
  2082. } else {
  2083. return false
  2084. }
  2085. })
  2086. }
  2087.  
  2088. function saveWeek(cinema, weekId) {
  2089. return database.ref('weeks/' + cinema + '/' + weekId).set({
  2090. weekId: weekId
  2091. })
  2092. }
  2093.  
  2094.  
  2095.  
  2096. setTimeout(() => {
  2097. co(scrape())
  2098. }, 5000)
  2099. //takeAgendaScreen()
  2100. function takeAgendaScreen() {
  2101. return new Promise((resolve, reject) => {
  2102. let weekId = moment().startOf('week').format('LL').toString()
  2103. let path = "public/" + weekId + ".png"
  2104. let route = weekId + ".png"
  2105. let url = server_url + encodeURIComponent(route)
  2106. if (!fs.existsSync(path)) {
  2107. console.log("taking the screenshot")
  2108. webshot("https://www.lagora.tn/agenda", path, {
  2109. shotOffset: {
  2110. top: 480
  2111. }
  2112. }, (err) => {
  2113. console.log("Error savign the screenshot", err)
  2114. resolve(url)
  2115. })
  2116. } else {
  2117. console.log("that screenshot already there", weekId)
  2118. resolve(url)
  2119. }
  2120. })
  2121. }
  2122.  
  2123. function scrapeWeekData() {
  2124. return new Promise((resolve, reject) => {
  2125. request({
  2126. url: "https://www.lagora.tn/agenda"
  2127. }, (err, res) => {
  2128. if (err) {
  2129. console.log("Error fetching movies", err)
  2130. resolve([])
  2131. } else {
  2132. let $ = cheerio.load(res.body)
  2133. let movies_set = new Set()
  2134. let movies = []
  2135. $("span.field-content a").each((index, element) => {
  2136. let movieId = decodeURIComponent($(element).attr("href").replace("/event/", ""))
  2137. let imagesDiv = $(element).parent().parent().parent().children('.views-field-field-background-image')
  2138. if (imagesDiv.html() && imagesDiv.html().indexOf("cine") > -1) {
  2139. if (movieId && movieId !== "") {
  2140. movies_set.add(movieId)
  2141. }
  2142. }
  2143. })
  2144. movies = Array.from(movies_set)
  2145. resolve(movies)
  2146. }
  2147. })
  2148. })
  2149. }
  2150.  
  2151. function getTimesForMovie(movieId) {
  2152. return new Promise((resolve, reject) => {
  2153. let url = "https://www.lagora.tn/event/" + encodeURIComponent(movieId)
  2154. console.log("movie url", url)
  2155. request({
  2156. url: url
  2157. }, (err, res) => {
  2158. if (err) {
  2159. console.log("error getting movie data", err)
  2160. resolve({})
  2161. } else {
  2162. let movie = {
  2163. times: []
  2164. }
  2165. let $ = cheerio.load(res.body)
  2166. if (!$(".field-date")) {
  2167. resolve({})
  2168. }
  2169. $(".taxonomy-term-reference-0").each((index, element) => {
  2170. let type = $(element).html()
  2171. if (type) {
  2172. console.log(type)
  2173. movie.type = type.toLowerCase()
  2174. return false
  2175. }
  2176. })
  2177. $(".field-date").each((index, element) => {
  2178. let timestamp = $(element).attr("id")
  2179. console.log(timestamp)
  2180. if (timestamp) {
  2181. timestamp = timestamp + "000"
  2182. let tunisita_timestamp = ""
  2183.  
  2184. if (process.env.local) {
  2185. console.log("before for timestampe", timestamp)
  2186. tunisita_timestamp = moment(parseInt(timestamp)).subtract(1, "hour").format('x')
  2187. console.log("after for timestampe", tunisita_timestamp)
  2188. } else {
  2189. tunisita_timestamp = moment(parseInt(timestamp)).add(1, "hour").format('x')
  2190. }
  2191. movie.times.push(tunisita_timestamp)
  2192. }
  2193. })
  2194. $(".event-group-description.field-group-div").each((index, element) => {
  2195. let description = $(element).text()
  2196. if (description) {
  2197. description = description.replace("Description", "")
  2198. movie.description = description
  2199. console.log("description", description)
  2200. }
  2201. })
  2202. movie.id = movieId
  2203. movieId = movieId.replace(/-/g, " ")
  2204. movie.title = capitalizeFirstLetter(movieId)
  2205. console.log("getting poster image", movie.title)
  2206. getPosterImage(movie.title).then(imageUrl => {
  2207. console.log("images repose", imageUrl)
  2208. movie.image = imageUrl
  2209. getTrailer(movie.title).then(trailerUrl => {
  2210. movie.trailer = trailerUrl
  2211. resolve(movie)
  2212. })
  2213. })
  2214.  
  2215. }
  2216. })
  2217. })
  2218. }
  2219.  
  2220. function capitalizeFirstLetter(string) {
  2221. return string.charAt(0).toUpperCase() + string.slice(1);
  2222. }
  2223.  
  2224. function getWeekAgenda(weekId, place, type) {
  2225. let dataRef
  2226. if (type) {
  2227. dataRef = database.ref("movies/" + place + "/" + weekId + "/" + type)
  2228. } else {
  2229. dataRef = database.ref("movies/" + place + "/" + weekId)
  2230. }
  2231.  
  2232. return dataRef.once("value").then(results => {
  2233. if (!type) {
  2234. let value = results.val()
  2235. console.log("the value", Object.keys(value))
  2236. return Object.keys(value)
  2237. }
  2238. })
  2239. }
  2240.  
  2241. function getMovies(place, cinemaType) {
  2242. let weekId = moment().startOf('week').format('LL').toString()
  2243. return database.ref("movies/" + place + "/" + weekId + "/" + cinemaType).once('value').then(res => {
  2244. if (!res.val()) return []
  2245. return snapshotToArray(res)
  2246. })
  2247. }
  2248.  
  2249. function getMovie(user, weekId, cinemaType, movieId) {
  2250. let moviePath = "movies/" + user.cinema + "/" + weekId + "/" + cinemaType + "/" + movieId
  2251. console.log("the path", moviePath)
  2252. return database.ref("movies/" + user.cinema + "/" + weekId + "/" + cinemaType + "/" + movieId).once('value').then(res => {
  2253. if (!res.val()) return {
  2254. times: []
  2255. }
  2256. return res.val()
  2257. })
  2258. }
  2259. //send the user restaurants
  2260. function sendMovies(user, place, cinemaType, index) {
  2261. console.log("getting movies and sending them", place, cinemaType)
  2262. return getMovies(place, cinemaType).then(movies => {
  2263. let text = "Aya behi, Dans quel cinema voudrais-tu manger? :"
  2264. let userId = user.id
  2265. user.type = user.type || "cinema"
  2266. let places = Places[user.type]
  2267. let begin = index || 0
  2268. let end = index + 9 || 9
  2269. let morePush = true
  2270. let elements = []
  2271. if ((movies.length - begin) <= 10) {
  2272. end = movies.length
  2273. morePush = false
  2274. }
  2275.  
  2276. for (let i = begin; i < end; i++) {
  2277. if (movies[i].times) {
  2278. if(!checkMovieTimes(movies[i].times)) continue
  2279. } else if (!movies[i].times) {
  2280. continue
  2281. }
  2282. let movieTitle = movies[i].title
  2283. let movieId = movies[i].id
  2284. let movieImage = movies[i].image
  2285. let movieDescription = movies[i].description
  2286. let movieLink = movies[i].link || "https://lagora.tn/event/" + encodeURIComponent(movies[i].id)
  2287. let trailerLink = movies[i].trailer
  2288. let tableOrPlace = "Book a Seat"
  2289. let buttons = [{
  2290. title: tableOrPlace,
  2291. type: "postback",
  2292. payload: "movie " + movieId + " cinemaType [" + cinemaType + "]"
  2293. }]
  2294. if (trailerLink) {
  2295. buttons.push({
  2296. title: "Watch Trailer",
  2297. type: "web_url",
  2298. url: trailerLink
  2299. }, )
  2300. }
  2301. buttons.push({
  2302. title: "Voir plus d'infos",
  2303. type: "web_url",
  2304. url: movieLink
  2305. })
  2306. /* //MODIFY FOR MOVIE RESERVATION
  2307. if (bookingId) {
  2308. buttons[0].payload += " modify" + bookingId
  2309. }
  2310. */
  2311. let element = {
  2312. title: movieTitle,
  2313. buttons: buttons
  2314. }
  2315. if (movieDescription) {
  2316. element.subtitle = movieDescription
  2317. }
  2318. if (movieImage) {
  2319. element.image_url = movieImage
  2320. }
  2321. elements.push(element)
  2322. }
  2323. if(elements.length<=0 ) {
  2324. let sorryText="Sorry But No upcoming movies to reserve"
  2325. return messenger.sendTextMessage(user.id,sorryText,(err,res)=>{
  2326. if(err) {
  2327. console.log("error sending text message",err)
  2328. }
  2329. })
  2330. }
  2331. if (morePush) {
  2332. let messageData = {
  2333. recipient: {
  2334. id: userId
  2335. },
  2336. message: {}
  2337. }
  2338. let attachment = {
  2339. type: "template",
  2340. payload: {
  2341. template_type: "generic",
  2342. elements: elements
  2343. }
  2344. }
  2345. let quickReplies = [{
  2346. content_type: "text",
  2347. title: "More Movies",
  2348. payload: "moreMovies " + end
  2349. }]
  2350. messageData.message.attachment = attachment
  2351. messageData.message.quick_replies = quickReplies
  2352. callSendAPI(messageData)
  2353. } else {
  2354. messenger.sendHScrollMessage(userId, elements, "REGULAR", (err, res) => {
  2355. if (err) {
  2356. console.log("error sending restaurants", err)
  2357. }
  2358. })
  2359. }
  2360. })
  2361. }
  2362.  
  2363. function getPosterImage(movieTitle) {
  2364. return searchClient.search(movieTitle).then(images => {
  2365. if (images.length > 0) {
  2366. return images[0].url
  2367. } else {
  2368. return null
  2369. }
  2370.  
  2371. })
  2372. }
  2373.  
  2374. function getTrailer(movieTitle) {
  2375. return movieTrailer(movieTitle).then(trailer => {
  2376. console.log("trailer", trailer)
  2377. return trailer
  2378. })
  2379. }
  2380.  
  2381. function getTimesFormat(timestamp) {
  2382. return moment(parseInt(timestamp)).format('ddd, MMM D LT')
  2383. }
  2384.  
  2385. function getWeekId() {
  2386. return moment().startOf('week').format('LL').toString()
  2387. }
  2388. function checkMovieTimes(times) {
  2389. for (let i = 0; i < times; i++) {
  2390. let time = times[i]
  2391. if (process.local.env) {
  2392. let nowTimeStamp = parseInt(moment().subtract(1, "hour").format('x'))
  2393. if (nowTimeStamp > parseInt(time)) {
  2394. return false
  2395. }
  2396. }
  2397. }
  2398. return true
  2399. }
  2400. function sendNoRestaurants(user) {
  2401. let sorryText="Sorry But No upcoming movies to reserve"
  2402. return messenger.sendTextMessage(user.id,sorryText,(err,res)=>{
  2403. if(err) {
  2404. console.log("error sending text message",err)
  2405. }
  2406. })
  2407. }
  2408. let now = new Date()
  2409. let tunisiaNow = date.addHours(now, 1)
  2410. let reservationDay = date.addDays(tunisiaNow, 0)
  2411. let year = reservationDay.getFullYear()
  2412. let month = reservationDay.getMonth()
  2413. let day = reservationDay.getDate()
  2414. console.log(now.toString())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement