Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 'use strict';
- const express = require('express')
- const bodyParser = require('body-parser')
- const request = require('request')
- const app = express()
- //const admin = require("firebase-admin")
- const FBMessenger = require("fb-messenger")
- const co = require('co')
- const mail = require("mail")
- const nodemailer = require('nodemailer')
- const strsplit = require('strsplit')
- const Promise = require('promise')
- const date = require('date-and-time')
- const cheerio = require('cheerio')
- const moment = require('moment')
- const webshot = require('webshot')
- const movieTrailer = require('movie-trailer');
- const fs = require('fs')
- const _ = require('lodash')
- const GoogleImages = require('google-images');
- let googleSearchID = "009327818633961746179:cwk-w8npop0"
- let cse_api = "AIzaSyDnPDvihK5EHeY1EBMXgUeco2xgywkHqJg"
- const searchClient = new GoogleImages(googleSearchID, cse_api);
- require('dotenv').config()
- let server_url = process.env.server_url || "https://intense-shore-72911.herokuapp.com/"
- const aliEmail = 'alibookings2019@gmail.com'
- const aliPass = 'Sidibousaid1'
- ///////////////////
- //Token
- const token = "EAACNynhTBT0BAF75d1gH5imHDAudjIjKP4g2WFcdLkb37xExVG1fSkJXz24umf6re7xm6dZCAq8mleYqaB4pAJB6UxlW0uZBN43ZAjUTStIRrTeKMRha5oMviXYKTiAeaPmsvfBq5B5noNvYsQ0Ys369I762wv34vme7aZCJ4wZDZD"
- const NotUnderstanding = ["Samahni, je n'ai pas bien saisi,",
- "Samahni, je n'ai pas compris :(",
- "Mafhemtekch,",
- ]
- ////////
- let firebase = require('firebase'),
- fbaseEmail = "sami.boujbel@city.ac.uk",
- fbasePass = "Sidibousaid1"
- let messenger = new FBMessenger(token)
- //// Here you add all Restaurants
- ///NOTE :: EVERY RESTAURANT IN HERE , ITS EMAIL HAS TO BE IN THE DATABASE...
- //DESCRIPTION AND IMAGES ARE OPTIONAL FOR EVERY RESTAURANT
- let Restaurants = []
- let Places = {}
- let database
- //START DATABSE
- startDB()
- .then(() => {
- database = firebase.database()
- console.log("database connected")
- let queryText = "Cesoir"
- getPlaces()
- co(scrape())
- })
- .catch((err) => {
- console.log("error with the database", err)
- })
- //
- function getPlaces() {
- return database.ref('/restaurants/').on('value', (results) => {
- /*
- for (let i=0;i<names.length;i++) {
- let name=names[i]
- let restaurant=JSON.parse(JSON.stringify(restaurants[name]))
- restaurant.title=name
- Restaurants.push(restaurant)
- }
- */
- parsePlaces(results, "restaurant")
- Object.keys(results).forEach(restaurantName => {
- let url = "https://m.me/3amekAli/?ref=restaurant_" + encodeURIComponent(restaurantName)
- //console.log("restaurant link", url)
- })
- database.ref("cinemas/").on('value', (results) => {
- parsePlaces(results, "cinema")
- //console.log("after cinema",Places)
- })
- })
- }
- function parsePlaces(results, type) {
- let places = results.val()
- let names = Object.keys(places)
- Places[type] = names.map(name => {
- let place = JSON.parse(JSON.stringify(places[name]))
- place.title = name
- return place
- })
- }
- //let serviceAccount = require("path/to/serviceAccountKey.json")
- app.set('port', (process.env.PORT || 5000))
- // Set the configuration for your app
- app.use("/", express.static('public'))
- // Process application/x-www-form-urlencoded
- app.use(bodyParser.urlencoded({
- extended: false
- }))
- // Process application/json
- app.use(bodyParser.json())
- // Index route
- app.get('/', function (req, res) {
- res.send('Hello world, I am a chat bot')
- })
- // for Facebook verification
- app.get('/webhook/', function (req, res) {
- console.log("verifiying")
- if (req.query['hub.verify_token'] === 'verify_me') {
- console.log("TOKEN VERIFIED")
- res.send(req.query['hub.challenge'])
- }
- })
- // Spin up the server
- app.listen(app.get('port') || 5000, function () {
- console.log('running on port', app.get('port'))
- })
- // quand le consommateur commence a parler au bot
- app.post('/webhook/', function (req, res) {
- res.sendStatus(200);
- let messaging_events = req.body.entry[0].messaging
- for (let i = 0; i < messaging_events.length; i++) {
- let event = req.body.entry[0].messaging[i]
- let userId = event.sender.id
- getUser(userId)
- .then((user) => {
- let baseRef = database.ref('/booking-list/' + userId)
- if (event.message) {
- let messageText = event.message.text;
- let quick_reply = event.message.quick_reply;
- let text = event.message.text
- if (quick_reply) {
- console.log("QUICK REPLY CHECK")
- let payload = event.message.quick_reply.payload;
- console.log("Quick Reply is", JSON.stringify(event.message.quick_reply))
- receivedQuickReply(user, payload, baseRef)
- } else if (messageText) {
- if (text.match(new RegExp('Ali', "i"))) {
- 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."]
- console.log("sending texts in order")
- sendTextsInOrder(userId, startingTexts, 2)
- setTimeout(() => {
- sendGenericMessage(user)
- }, (6 * 2000) + 1000)
- //sendTextMessage(userId, "Salut, tu cherches a réserver quelquepart?")
- //sendTextMessage(userId, "3amek Ali s'en occupe")
- //sendTextMessage(userId, "Il suffit juste de cliquer sur 'Reserver une table' et répondre a mes questions.")
- } else {
- sendNotUnderstanding(user)
- }
- }
- } else if (event.postback) {
- console.log("POSTBACK CHECK", event.postback.payload)
- receivedPostback(user, event, baseRef)
- } else if (event.referral) {
- console.log("referral CHECK", event.referral.ref)
- receivedReferral(user, event, baseRef)
- } else {
- console.log("received unknown event", event)
- }
- })
- }
- })
- app.get('/booksRemove', (req, res) => {
- if (req.query.token = "verify_me") {
- removePastBookings((err, res) => {
- if (res) {
- res.sendStatus(200)
- res.send("I've sucessfuly deleted old bookings ")
- } else {
- res.sendStatus(403)
- res.send("something went wrong")
- }
- })
- }
- })
- //receiving a postback events
- function receivedPostback(user, event, baseRef) {
- let payload = event.postback.payload
- console.log("received postback event to be processed", event, payload)
- let sender = event.sender.id
- let boolRestaruant = payload.match(/^restaurant/)
- let boolMovie = payload.match(/^movie /)
- let boolCinema = payload.match(/^cinema /)
- let shareBot = payload.match(/^friendShare$/)
- let modifyUserBooking = payload.match(/^modifyUserBooking/)
- let modifyBooking = payload.match(/^modifyBooking/)
- let userId = user.id
- if (payload.indexOf("Reservez") > -1) {
- if ((payload.indexOf("restaurant") > -1) || payload.indexOf("cinem") < 0) {
- let type = "restaurant"
- let update = {
- type
- }
- baseRef.update(update).then((res) => {
- user.type = type
- checkBookingLimit(user).then(result => {
- let limit = result.limit
- let status = result.status
- if (status) {
- sendRestaurant(user)
- } else {
- sendBookingLimit(user, limit)
- }
- })
- })
- } else {
- let type = "cinema"
- let update = {
- type
- }
- user.type = type
- baseRef.update(update).then((res) => {
- sendRestaurant(user)
- })
- }
- return
- }
- switch (payload) {
- case "GET STARTED":
- sendTextMessage(userId, "Salut, tu cherches a réserver quelquepart? 3amek Ali s'en occupe :D ")
- sendGenericMessage(user)
- break;
- case "myBookings":
- sendUserBookings(user)
- break;
- case "Dejeuner":
- sendHourMessage(user, "Dejeuner")
- break;
- case "Diner":
- sendHourMessage(user, "Diner")
- break;
- case "ApresDemain": //Apresdemain= AfterTomorrow
- sendMomentMessage(user)
- break;
- //confirmation
- //code how do you want to cancel
- case "DayHour1":
- sendTextMessage(userId, "Vous avez reservè une table a sakura entre 12h00 et 12h30")
- confirmDay1(sender)
- break;
- case "DayHour2":
- sendTextMessage(userId, "Vous avez reservè une table a sakura entre 12h30 et 13h00")
- confirmDay2(user)
- break;
- case "DayHour3":
- sendTextMessage(userId, "Vous avez reservè une table a sakura entre 13h et 13h30")
- confirmDay3(user)
- break;
- case "NightHour1":
- sendTextMessage(userId, "Vous avez reservè une table a sakura entre 18h30 et 19h30")
- confirmNight1(user)
- break;
- case "NightHour2":
- sendTextMessage(userId, "Vous avez reservè une table a sakura entre 19h30 et 20h30")
- confirmNight2(user)
- break;
- case "NightHour3":
- sendTextMessage(userId, "Vous avez reservè une table a sakura entre 20h30 et 21h30")
- confirmNight3(user)
- break;
- // If the user wants to cancel
- case "UnConfirmDay1":
- case "UnConfirmDay2":
- case "UnConfirmDay3":
- case "UnConfirmNight1":
- case "UnConfirmNight2":
- case "UnConfirmNight3":
- AnnulerReservation(sender)
- break;
- case "Annuler":
- sendTextMessage(sender, "J'ai annulè votre reservation. :(")
- sendTextMessage(sender, "Pour une future reservation, ecrivez 'Ali'.")
- ///////////////////
- // for the promotion button
- case "Offres":
- sendPromotionMessage(sender)
- break;
- case "Prom1":
- sendPeopleNum(sender)
- break;
- case "Prom2":
- sendPeopleNum(sender)
- break;
- }
- if (boolRestaruant || boolCinema || boolMovie) {
- let newPayload = strsplit(payload, /\s+/)
- let restaurant = ""
- let place = ""
- let bookingId
- let modifing = false
- newPayload.forEach(word => {
- if (word.indexOf("modify") > -1) {
- modifing = true
- bookingId = word
- }
- })
- if (modifing) {
- restaurant = payload
- .replace(bookingId, "")
- .replace("restaurant ", "")
- bookingId = bookingId.replace("modify", "")
- } else {
- if (boolRestaruant) {
- place = payload.replace(/restaurant /, "")
- } else if (boolCinema) {
- place = payload.replace(/cinema /, "")
- } else if (boolMovie) {
- place = payload.replace(/movie /, "")
- }
- }
- //console.log("the restaurant", restaurant, "the bookingId", bookingId)
- if (bookingId) {
- let update = {
- restaurant: restaurant
- }
- modifyTheBooking(user, bookingId, update).then(err => {
- if (err) {
- console.log("error modiying restauratn", err)
- erroHandle(user)
- } else {
- SuccesfullyModifyed(user)
- }
- })
- return
- }
- let updateObj = {}
- if (boolMovie) {
- updateObj["movie"] = place
- } else {
- updateObj[user.type] = place
- }
- console.log("I'm gonna update Restuarant for " + userId + " to be" + place)
- baseRef.update(updateObj).then((res) => {
- user[user.type] = place
- if (boolRestaruant) {
- sendPeopleNum(user, null, place)
- } else if (boolCinema) {
- console.log("sending agenda", place)
- sendCinemaAgenda(user, place)
- } else if (boolMovie) {
- place = capitalizeFirstLetter(place.replace(/-/g, " "))
- sendPeopleNum(user, null, place, user.type)
- }
- })
- } else if (shareBot) {
- sendShareToFriend(user)
- } else if (payload.indexOf("Cancel Booking") > -1) {
- let bookingId = strsplit(payload, /\s+/)[2]
- cancelBooking(user, baseRef, bookingId)
- } else if (payload.indexOf("Confirm Booking") > -1) {
- let bookingId = strsplit(payload, /\s+/)[2]
- console.log("request to confrim ", bookingId)
- confirmBooking(user, baseRef, bookingId)
- } else if (modifyUserBooking) {
- let bookingId = payload.replace("modifyUserBooking ", "")
- sendWhatDoModify(user, bookingId)
- } else if (modifyBooking) {
- console.log("modify entity")
- payload = strsplit(payload, /\s+/)
- let entity = payload[1]
- let bookingId = payload[2]
- if (entity == "restaurant") {
- sendRestaurant(user, 0, null, bookingId)
- } else if (entity == "peopleNumber") {
- getBookingField(user.id,bookingId,"cinema").then(cinema=>{
- console.log("is cinema ?",cinema)
- if(cinema) {
- sendPeopleNum(user, bookingId,null,"cinema")
- } else {
- sendPeopleNum(user, bookingId,null,"restaurant")
- }
- })
- }
- }
- }
- function sendWhatDoModify(user, bookingId) {
- let sentText = "What would you like to modify in the booking ?"
- let userId = user.id
- let quick_replies = [{
- content_type: "text",
- title: "Restaurant",
- payload: "modifyBooking restaurant " + bookingId
- },
- {
- content_type: "text",
- title: "People Number ",
- payload: "modifyBooking peopleNumber " + bookingId
- }
- ]
- getBookingField(user.id,bookingId,"restaurant").then(type=>{
- console.log("the booking type",type)
- if(!type) {
- quick_replies.shift()
- }
- messenger.sendQuickRepliesMessage(userId, sentText, quick_replies,(err,res)=>{
- if(err) {
- console.log("Error sending what to modify",err)
- }
- })
- })
- }
- function receivedReferral(user, event, baseRef) {
- console.log("Received referral event")
- let ref = event.referral.ref
- let userId = user.id
- if (ref.indexOf("restaurant") > -1) {
- let referralWords = strsplit(ref, /_/)
- console.log("after split", referralWords)
- let restaurant = referralWords[1]
- console.log("I'm gonna update Restuarant for " + userId + " to be" + restaurant)
- baseRef.update({
- restaurant: restaurant
- })
- .then((res) => {
- user.restaurant = restaurant
- sendPeopleNum(user, null, restaurant)
- })
- } else {
- console.log("referral doesn't have restaurant")
- }
- }
- function modifyTheBooking(user, bookingId, update) {
- return database.ref("booking-list/" + user.id + "/bookings/" + bookingId).update(update)
- }
- function receivedQuickReply(user, payload, baseRef) {
- console.log(typeof payload)
- console.log("received Quick reply payload", payload)
- let boolRestaruant = payload.match(/^restaurant/)
- let boolCinemaType = payload.match(/^cinemaType/)
- let boolCinema = payload.match(/^cinema /)
- let boolPeopleNum = payload.match(/^peopleNumber/)
- let boolDay = payload.match(/^Day/)
- let boolHours = payload.match(/[0-9]:[0-9]/)
- let moreRestaurants = payload.match(/moreRestaurants/)
- let boolBookMovie = payload.match(/^bookMovie /)
- let reserving = payload.match(/^Reservez$/i)
- let myBookings = payload.match(/^myBookings$/)
- let modifyBooking = payload.match(/^modifyBooking/)
- let userId = user.id
- if (boolRestaruant || boolCinema) {
- console.log("we are in bool", boolCinema, boolRestaruant)
- let place = ""
- if (boolRestaruant) {
- place = payload.replace(/restaurant/, "")
- } else if (boolCinema) {
- place = payload.replace(/cinema/, "")
- }
- let updateObj = {}
- updateObj[user.type] = place
- console.log("I'm gonna update Restuarant for " + userId + " to be" + place)
- baseRef.update(updateObj).then((res) => {
- user[user.type] = place
- if (boolRestaruant) {
- sendPeopleNum(user, null, place)
- } else if (boolCinema) {
- console.log("sending agenda")
- sendCinemaAgenda(user, place)
- }
- })
- } else if (boolPeopleNum) {
- payload = strsplit(payload, /\s+/)
- let peopleNumber = payload[1]
- if (payload.length > 2) {
- let bookingId = payload[2]
- let update = {
- peopleNumber: peopleNumber
- }
- console.log("people numb", user.id, bookingId, update)
- modifyTheBooking(user, bookingId, update).then(err => {
- if (err) {
- console.log("error", err)
- erroHandle(user)
- } else {
- SuccesfullyModifyed(user)
- }
- })
- return
- }
- console.log("I'm gonna update people Number for " + userId + " to be" + peopleNumber)
- baseRef.update({
- peopleNumber: peopleNumber
- }).then((res) => {
- user.peopleNumber = peopleNumber
- DateMessage(user)
- })
- } else if (boolDay) {
- let day = strsplit(payload, /\s+/)[1]
- console.log("I'm gonna update day Number for " + userId + " to be" + day)
- baseRef.update({
- day: day
- }).then((res) => {
- user.day = day
- if (day.match(/Cesoir/, "i")) {
- sendHourMessage(user, "Diner")
- } else {
- sendMomentMessage(user)
- }
- })
- } else if (boolHours || boolBookMovie) {
- let updateObj = {}
- let hour = payload
- if (boolBookMovie) {
- let hourResult = /bookMovie \[(.*?)\]/g.exec(payload)
- if (hourResult) {
- updateObj.date = hourResult[1].trim()
- if (process.env.local) {
- updateObj.dateReserved = moment().subtract(1, "hour").format('x')
- } else {
- updateObj.dateReserved = moment().add(1, "hour").format('x')
- }
- updateObj.hour = moment(parseInt(updateObj.date)).format('LT')
- console.log("saving the book initially", updateObj)
- }
- } else {
- updateObj.hour = payload
- }
- baseRef.update(updateObj)
- .then((hourResp) => {
- if (boolBookMovie) {
- return getUser(user.id).then(user => {
- let booking = JSON.parse(JSON.stringify(user))
- saveBooking(booking, "cinema").then(pushedBooking => {
- console.log("the pushed booking", pushedBooking)
- sendConfirm(user, baseRef, pushedBooking)
- }).catch(err => {
- erroHandle(user)
- })
- })
- } else {
- user.hour = payload
- saveDate(user, payload, baseRef)
- .then((res) => {
- getUser(user.id).then(user => {
- let booking = JSON.parse(JSON.stringify(user))
- saveBooking(booking, "restaurant").then(pushedBooking => {
- console.log("the pushed booking", pushedBooking)
- sendConfirm(user, baseRef, pushedBooking)
- }).catch(err => {
- erroHandle(user)
- })
- })
- })
- }
- })
- } else if (moreRestaurants) {
- payload = strsplit(payload, /\s+/)
- let index = payload[1]
- sendRestaurant(user, index)
- } else if (reserving) {
- checkBookingLimit(user).then(result => {
- let limit = result.limit
- let status = result.status
- if (status) {
- sendRestaurant(user)
- } else {
- sendBookingLimit(user, limit)
- }
- })
- } else if (myBookings) {
- console.log("show user bookings")
- sendUserBookings(user)
- } else if (modifyBooking) {
- payload = strsplit(payload, /\s+/)
- let entity = payload[1]
- let bookingId = payload[2]
- console.log("modify entity", bookingId, entity)
- if (entity == "restaurant") {
- sendRestaurant(user, 0, null, bookingId)
- } else if (entity == "peopleNumber") {
- getBookingField(user.id,bookingId,"cinema").then(cinema=>{
- console.log("is cinema ?",cinema)
- if(cinema) {
- sendPeopleNum(user, bookingId,null,"cinema")
- } else {
- sendPeopleNum(user, bookingId,null,"restaurant")
- }
- })
- }
- } else if (boolCinemaType) {
- console.log("the cin")
- let cinemaTypeRe = /cinemaType \[(.*?)\]/g
- let placeRe = /cinema \[(.*?)\]/g
- let cinemaType, place
- let typeResult = cinemaTypeRe.exec(payload)
- let placeResult = placeRe.exec(payload)
- if (typeResult) {
- cinemaType = typeResult[1]
- }
- if (placeResult) {
- console.log(placeResult[1])
- place = placeResult[1]
- }
- sendMovies(user, place, cinemaType)
- }
- }
- //Reponse message
- function sendTextMessage(userId, text) {
- let messageData = {
- recipient: {
- id: userId
- },
- message: {
- text: text
- },
- }
- return callSendAPI(messageData)
- }
- //Response Image
- function sendImageMessage(userId, url) {
- return new Promise((resolve, reject) => {
- messenger.sendImageMessage(userId, url, (err, res) => {
- if (!err) {
- resolve(res)
- } else {
- console.log("error sending image", err)
- resolve(err)
- }
- })
- })
- }
- //Reponse Generic
- function sendGenericMessage(user) {
- let userId = user.id
- let messageData = {
- "attachment": {
- "type": "template",
- "payload": {
- "template_type": "generic",
- "elements": [{
- "title": "Réservez Avec Ali",
- "subtitle": "A3mel doura, Chouf les restaurants ensuite appuie sur 'Réservez une table'",
- "image_url": "https://goo.gl/aoVTK5",
- "buttons": [{
- "type": "postback",
- "title": "Réservez une table",
- "payload": "Reservez restaurant"
- }, {
- "type": "postback",
- "title": "Voir un film",
- "payload": "Reservez cinema"
- }],
- }, {
- "title": "Besoin d'aide?",
- "subtitle": ":)",
- "image_url": "https://goo.gl/YsCq3e",
- "buttons": [{
- "type": "postback",
- "title": "Appelez nous",
- "payload": "Prom2",
- }, {
- "type": "web_url",
- "url": "http://www.le-paresseux.com",
- "title": "Laissez un Feedback",
- }]
- }]
- }
- }
- }
- request({
- url: 'https://graph.facebook.com/v2.6/me/messages',
- qs: {
- access_token: token
- },
- method: 'POST',
- json: {
- recipient: {
- id: userId
- },
- message: messageData,
- }
- }, function (error, response, body) {
- if (error) {
- console.log('Error sending messages: ', error)
- } else if (response.body.error) {
- console.log('Error: ', response.body.error)
- }
- })
- }
- //send the user restaurants
- function sendRestaurant(user, index, skippedRestaurant, bookingId) {
- let text = "Aya behi, Dans quel restaurant voudrais-tu manger? :"
- let userId = user.id
- user.type = user.type || "restaurant"
- let places = Places[user.type]
- let begin = index || 0
- let end = index + 9 || 9
- let morePush = true
- let elements = []
- if ((places.length - begin) <= 10) {
- end = places.length
- morePush = false
- }
- for (let i = begin; i < end; i++) {
- let restaurantTitle = places[i].title
- let restaurantImage = places[i].image
- let restaurantDescription = places[i].description
- let restaurantLink = places[i].link
- if (skippedRestaurant) {
- if (skippedRestaurant == restaurantTitle) {
- continue
- }
- }
- let tableOrPlace = (user.type == "restaurant") ? "Réservez une Table" : "Réservez une Place"
- let buttons = [{
- title: tableOrPlace,
- type: "postback",
- payload: user.type + " " + restaurantTitle
- },
- {
- title: "Voir plus d'infos",
- type: "web_url",
- url: restaurantLink
- }
- ]
- if (bookingId) {
- buttons[0].payload += " modify" + bookingId
- }
- let element = {
- title: restaurantTitle,
- buttons: buttons
- }
- if (restaurantDescription) {
- element.subtitle = restaurantDescription
- }
- if (restaurantImage) {
- element.image_url = restaurantImage
- }
- elements.push(element)
- }
- if (morePush) {
- let messageData = {
- recipient: {
- id: userId
- },
- message: {}
- }
- let attachment = {
- type: "template",
- payload: {
- template_type: "generic",
- elements: elements
- }
- }
- let quickReplies = [{
- content_type: "text",
- title: "More Restaurants",
- payload: "moreRestaurants " + end
- }]
- messageData.message.attachment = attachment
- messageData.message.quick_replies = quickReplies
- callSendAPI(messageData)
- } else {
- messenger.sendHScrollMessage(userId, elements, "REGULAR", (err, res) => {
- if (err) {
- console.log("error sending restaurants", err)
- }
- })
- }
- }
- //Reponse Bouton
- function sendPeopleNum(user, bookingId, restaurant, type) {
- let text = ""
- if (restaurant) {
- text = restaurant.replace(/ cinemaType \[(.*?)\]/g, "") + "!, Excellent choix! Pour combien de personnes ?"
- } else {
- text = "Excellent choix! Pour combien de personnes ?"
- }
- let userId = user.id
- let end = 11
- if (type == "cinema") end = 3
- let quickReplies = []
- for (let i = 0; i < end; i++) {
- let number = i + 1
- let quick_reply = {
- "content_type": "text",
- "title": number,
- "payload": "peopleNumber " + number
- }
- if (bookingId) {
- quick_reply.payload += " " + bookingId
- }
- quickReplies.push(quick_reply)
- }
- messenger.sendQuickRepliesMessage(userId, text, quickReplies, (err, res) => {
- if (err) {
- console.log("Error sendin number", err)
- }
- })
- }
- //Definir la date
- function DateMessage(user) {
- if (user.type == "cinema") {
- let moviePath = user.movie
- if (user.movie !== "") {
- let cinemaType = /cinemaType \[(.*?)\]/g.exec(user.movie)
- if (cinemaType) {
- let text = "Here are the times available"
- cinemaType = cinemaType[1]
- let movieId = user.movie.replace("cinemaType [" + cinemaType + "]", "").trim()
- let weekId = getWeekId()
- moviePath = "movies/" + user.cinema + "/" + weekId + "/" + cinemaType + "/" + movieId
- console.log("the path", moviePath)
- getMovie(user, weekId, cinemaType, movieId).then(movie => {
- let quick_replies = []
- console.log("the movie", movie)
- if(movie.times) {
- if(!checkMovieTimes(movie.times)) return sendNoRestaurants(user)
- } else if(movie.times) {
- return sendNoRestaurants(user)
- }
- movie.times.forEach(time => {
- let title = getTimesFormat(time)
- console.log("the title", title)
- let quick_reply = {
- content_type: "text",
- title: title,
- payload: "bookMovie [" + time + "] "
- }
- quick_replies.push(quick_reply)
- })
- messenger.sendQuickRepliesMessage(user.id, text, quick_replies, (err, res) => {
- if (err) {
- console.log("Error sending times", err)
- }
- })
- })
- }
- }
- } else {
- let text = "Marhbe, je vous réserve une table pour quand?"
- let userId = user.id
- let buttons = [{
- "type": "postback",
- "title": "Ce soir",
- "payload": "Day Cesoir"
- },
- {
- "type": "postback",
- "title": "Demain",
- "payload": "Day Demain"
- },
- {
- "type": "postback",
- "title": "Aprés demain",
- "payload": "Day ApresDemain"
- }
- ]
- let quickReplies = [{
- "content_type": "text",
- "title": "Ce soir",
- "payload": "Day Cesoir"
- },
- {
- "content_type": "text",
- "title": "Demain",
- "payload": "Day Demain"
- },
- {
- "content_type": "text",
- "title": "Aprés demain",
- "payload": "Day ApresDemain"
- }
- ]
- let lastDate = generateReservationDate(user, "21:30", "check")
- let now = new Date()
- let tunisiaNow = date.addHours(now, 1)
- console.log("this days last date", new Date(lastDate).toString())
- console.log("this days last today", tunisiaNow.toString())
- console.log("the difference in minues", date.subtract(new Date(lastDate), tunisiaNow).toMinutes())
- if (date.subtract(new Date(lastDate), tunisiaNow).toMinutes() <= 15) {
- quickReplies.splice(0, 1)
- }
- //messenger.sendButtonsMessage(sender,text,buttons)
- messenger.sendQuickRepliesMessage(userId, text, quickReplies)
- }
- }
- //Difference Dejeuner/diner
- function sendMomentMessage(user) {
- getRestaurant(user.restaurant).then(restaurant => {
- if (!restaurant) {
- erroHandle(user)
- return
- }
- let title = "Déjeuner ou dîner"
- let userId = user.id
- let subTitle = "Tu veux 'déjeuner' wala 'diner' ?"
- let imageUrl = restaurant.image || "https://assets3.thrillist.com/v1/image/1579997/size/tmg-slideshow_l.jpg"
- let buttons = [{
- "type": "postback",
- "title": "Dejeuner",
- "payload": "Dejeuner"
- },
- {
- "type": "postback",
- "title": "Diner",
- "payload": "Diner"
- }
- ]
- let elements = [{
- "title": title,
- "subtitle": subTitle,
- "image_url": imageUrl,
- buttons: buttons
- }]
- messenger.sendHScrollMessage(userId, elements)
- })
- }
- // Bouton pour lheure Jour
- function sendHourMessage(user, timing) {
- console.log("GONNA send hour messages")
- let userId = user.id
- let hoursText = "À quel heure voulez vous " + timing + "?"
- let start = 0
- let end = 5
- let quickReplies = []
- let hours = []
- let restaurant = user.restaurant
- let flag
- let now = new Date()
- let userTime = date.addHours(now, 1);
- let year = now.getFullYear()
- let month = now.getMonth()
- let day = now.getDate()
- console.log("month", month)
- console.log("user day", user.day)
- if (user.day == "Cesoir") {
- console.log("time where user is", userTime.toString())
- console.log("the now time", now.toString())
- flag = "Cesoir"
- }
- // console.log("the current time is ",new Date(user.timezone))
- switch (timing) {
- case "Dejeuner":
- start = 12
- end = 14
- break;
- case "Diner":
- start = 19
- end = 22
- break;
- }
- for (let i = start; i < end; i += (1 / 2)) {
- let title = i.toString()
- console.log("for title", title)
- if (!(title.match(/.5+$/))) {
- title += ':00'
- if (user.day == "Cesoir") {
- let minutes = 0
- console.log("timezone", parseInt(user.timezone))
- let hours = parseInt(title.replace(":00", "")) + 2
- let timeOfReserve = new Date(year, month, day, hours, minutes)
- console.log("the user time ", userTime.toString())
- console.log("the time of reserve is", timeOfReserve.toString())
- console.log("the minute abstracting", date.subtract(timeOfReserve, userTime).toMinutes())
- if (date.subtract(timeOfReserve, userTime).toMinutes() < 15) {
- console.log("i'm not gonna send", title, "hour")
- continue
- }
- }
- } else {
- title = i.toString().replace(/.5+$/, ":30")
- if (user.day == "Cesoir") {
- let minutes = 30
- let hours = parseInt(title.replace(":30", "")) + 2
- let timeOfReserve = new Date(year, month, day, hours, minutes)
- console.log("the user time ", userTime.toString())
- console.log("the time of reserve is", timeOfReserve.toString())
- console.log("the minute abstracting", date.subtract(timeOfReserve, userTime).toMinutes())
- console.log("the user time ", userTime.toString())
- console.log("the time of reserve is", timeOfReserve.toString())
- if (date.subtract(timeOfReserve, userTime).toMinutes() < 30) {
- console.log("i'm not gonna send", title, "hour")
- continue
- }
- }
- }
- let quick_reply = {
- "content_type": "text",
- "title": title,
- "payload": title
- }
- hours.push(title)
- quickReplies.push(quick_reply)
- }
- getRestaurantsBookers(restaurant)
- .then((bookers) => {
- //console.log("bookers in ", restaurant, "are", bookers)
- bookers = bookers.filter(booker => {
- if (booker) {
- return true
- } else {
- return false
- }
- })
- database.ref("/restaurants/" + restaurant)
- .child("tablesNumber")
- .once("value")
- .then((res) => {
- let tablesNumber = res.val()
- quickReplies = quickReplies.filter(((quickReplies) => {
- let userDate = generateReservationDate(user, quickReplies.title)
- //console.log("the generated date", date)
- let options = {
- date: userDate,
- tablesNumber: tablesNumber
- }
- let sendButton = checkTime(user, bookers, options)
- console.log("save to send time ? ", sendButton)
- return sendButton
- }))
- if (quickReplies.length == 0) {
- erroHandle(user, "You can't reserve in this restaurant this current time ", (err, res) => {
- checkBookingLimit(user).then(result => {
- let limit = result.limit
- let status = result.status
- if (status) {
- sendRestaurant(user, 0, restaurant)
- } else {
- sendBookingLimit(user, limit)
- }
- })
- })
- return
- }
- messenger.sendQuickRepliesMessage(userId, hoursText, quickReplies, 'REGULAR', (err, res) => {
- if (err) {
- console.log("error sendign hour messages", err)
- }
- })
- })
- })
- }
- // Bouton pour lheure soir
- function sendHourNightMessage(user) {
- let userId = user.id
- let nightHourText = "A quel heure voulez vous diner?"
- let buttons = [{
- "type": "postback",
- "title": "entre 18h30 et 19h30",
- "payload": "NightHour1"
- },
- {
- "type": "postback",
- "title": "entre 19h30 et 20h30",
- "payload": "NightHour2"
- },
- {
- "type": "postback",
- "title": "entre 20h30 et 21h30",
- "payload": "NightHour3"
- }
- ]
- messenger.sendButtonsMessage(userId, nightHourText, buttons)
- }
- //Function for sending confirmation
- function sendConfirm(user, baseRef, booking) {
- console.log("gonna call from databse and confirm stuff")
- let userId = user.id
- let bookingId = booking.key || user.lastBookingId
- baseRef.once('value').then((userData) => {
- console.log("restuarants edited")
- userData = userData.val()
- // console.log("received Data from datbase",JSON.stringify(userData))
- let username = userData.username
- let movieTitle = (userData.movie) ? capitalizeFirstLetter(user.movie.substring(0, user.movie.indexOf("cinemaType") - 1).replace(/-/, " ")) : ""
- let hour = userData.hour
- let day = userData.day
- let timing = getTimesFormat(user.date)
- let place = userData[user.type]
- let peopleNumber = userData.peopleNumber
- // let confirmationText=userData.hour
- let confirmationText = "Merci " + username + ", Mriguel, je réserve une table pour " + peopleNumber + " à " + place + " " + day + " à " + hour + " . Peux-tu confirmer pour moi ?"
- if (userData.type == "cinema") {
- confirmationText = "Merci " + username + ", Mriguel, je réserve une table pour " + peopleNumber + " à " + place + "for the movie " + movieTitle + " at " + " " + timing + " . Peux-tu confirmer pour moi ?"
- }
- let buttons = [{
- "type": "postback",
- "title": "Confirmer",
- "payload": "Confirm Booking " + bookingId
- },
- {
- "type": "postback",
- "title": "Annuler",
- "payload": "Cancel Booking " + bookingId
- }
- ]
- messenger.sendButtonsMessage(userId, confirmationText, buttons, 'REGULAR', (err, res) => {
- if (err) {
- console.log("error sending confirmation", err)
- } else {
- console.log("success confirmation sent")
- }
- })
- })
- }
- //to confirm and send Emai
- function confirmBooking(user, baseRef, bookingId) {
- console.log("going to confirm booking", bookingId)
- getBookingStatus(user.id, bookingId).then(bookingStatus => {
- if (bookingStatus == "confirmed") {
- sendAlreadyConfirmed(user)
- return
- }
- let userId = user.id
- bookingId = bookingId || user.lastBookingId
- baseRef.once('value').then((userData) => {
- console.log("reference is calling me ")
- userData = userData.val()
- let userRestaurant = userData.restaurant
- getEmail(user[user.type], user.type, (restaurantEmail) => {
- let username = userData.username
- let hour = userData.hour
- let day = userData.day
- let toEmail1 = "Sami.Boujbel@city.ac.uk"
- let toEmail2 = restaurantEmail
- let subject = "Ali Bookings " + username + " Booking"
- let confirmationEmail = ""
- if (userData.type == "cinema") {
- confirmationEmail = username + " a reservè dans votre film: " + userData[userData.type] + ", " + getTimesFormat(userData.date) + " . Ceci est une confirmation , ISLAM C EST MR BOJ "
- } else {
- userRestaurant
- confirmationEmail = username + " a reservè dans votre restaurant: " + userData[userData.type] + ", " + day + " a " + hour + " . Ceci est une confirmation , ISLAM C EST MR BOJ "
- }
- sendEmail(toEmail1, subject, confirmationEmail, (err, res) => {
- if (err) {
- console.log("Error sending email", err)
- }
- })
- sendEmail(toEmail2, subject, confirmationEmail)
- let bookingUpdate = {
- status: "confirmed"
- }
- console.log("updating booking", bookingId, bookingUpdate)
- updateBooking(user, bookingId, bookingUpdate)
- //console.log("I'm called to confirm")
- messenger.sendTextMessage(userId, "Merci " + username + "! le " + userData.type + " a etè notifiè et Jawek ahla jaw.", (err, res) => {
- messenger.sendTextMessage(userId, "Pour modifier la réservation, contact mon équipe sur le 29 000 000 . À Bientôt ^_^ ")
- })
- })
- })
- })
- }
- //to confirm and send Emai
- function cancelBooking(user, baseRef, bookingId) {
- console.log("going to cancel booking")
- let userId = user.id
- bookingId = bookingId || user.lastBookingId
- baseRef.once('value').then((userData) => {
- console.log("reference is calling me ")
- userData = userData.val()
- let userPlace = userData[userData.type]
- getEmail(userPlace, user.type, (placeEmail) => {
- let username = userData.username
- let hour = userData.hour
- let day = userData.day
- let toEmail1 = "Sami.Boujbel@city.ac.uk"
- let toEmail2 = placeEmail
- let subject = "Ali Bookings " + username + " Booking"
- let confirmationEmail = username + "Canceled reservation in restaurant: " + userPlace + ", " + day + " a " + hour
- sendEmail(toEmail1, subject, confirmationEmail)
- sendEmail(toEmail2, subject, confirmationEmail)
- let bookingUpdate = {
- status: "canceled"
- }
- updateBooking(user, bookingId, bookingUpdate)
- //console.log("I'm called to confirm")
- console.log("Going to cancel booking", bookingId)
- messenger.sendTextMessage(userId, "J'ai annulè votre réservation. :(", 'REGULAR', (err, res) => {
- if (!err) {
- sendTextMessage(userId, "Pour une future réservation, écrivez 'Ali'.")
- }
- })
- })
- })
- }
- //to cancel the booking
- /*
- function cancelBookingWithoutEmail(sender, baseRef) {
- console.log("Going to cancel booking")
- messenger.getProfile(sender, function(err, res) {
- baseRef.set({
- username: res.first_name + ' ' + res.last_name
- })
- }) // Gets user information
- messenger.sendTextMessage(sender, "J'ai annulè votre reservation. :(", 'REGULAR', (err, res) => {
- if (!err) {
- sendTextMessage(sender, "Pour une future reservation, ecrivez 'Ali'.")
- }
- })
- }
- */
- //En cas d'annulation
- function AnnulerReservation(user) {
- let userId = user.id
- let messageData = {
- "attachment": {
- "type": "template",
- "payload": {
- "template_type": "button",
- "text": "Etes vous sur de vouloir annuler la reservation?",
- "buttons": [{
- "type": "postback",
- "title": "Oui",
- "payload": "Annuler"
- },
- {
- "type": "postback",
- "title": "j'ai changè d'avis",
- "payload": "NePasAnnuler"
- }
- ]
- }
- }
- }
- request({
- url: 'https://graph.facebook.com/v2.6/me/messages',
- qs: {
- access_token: token
- },
- method: 'POST',
- json: {
- recipient: {
- id: userId
- },
- message: messageData,
- }
- }, function (error, response, body) {
- if (error) {
- console.log('Error sending messages: ', error)
- } else if (response.body.error) {
- console.log('Error: ', response.body.error)
- }
- })
- }
- //Bouton for promotions.
- function sendPromotionMessage(user) {
- let userId = user.id
- let elements = [{
- "title": "Une entrée, Un plat et un dessert a 20DT seulement",
- "subtitle": "Sakura",
- "image_url": "https://goo.gl/sZESxq",
- "buttons": [{
- "type": "postback",
- "title": "reservez",
- "payload": "Prom1"
- }, {
- "type": "web_url",
- "url": "http://www.le-paresseux.com",
- "title": "Plus de details",
- }],
- }, {
- "title": "Déjeuner ou dîner pour 2 personnes a 'Tam Tam' partir de 25 DT Seulement",
- "subtitle": "Tam Tam",
- "image_url": "https://scontent-sin6-1.xx.fbcdn.net/v/t1.0-9/18739884_1348910391812983_7103657927127446030_n.jpg?oh=63bb601b4b1cd15722ee93c47c6b8526&oe=5A0C4AF8",
- "buttons": [{
- "type": "postback",
- "title": "Reservez",
- "payload": "Prom2",
- }, {
- "type": "web_url",
- "url": "http://www.le-paresseux.com",
- "title": "Plus de details",
- }],
- }]
- messenger.sendHScrollMessage(userId, elements)
- }
- //CallsendAPI for messages
- function callSendAPI(messageData) {
- return new Promise((resolve, reject) => {
- request({
- url: 'https://graph.facebook.com/v2.6/me/messages',
- qs: {
- access_token: token
- },
- method: 'POST',
- json: messageData
- }, function (error, response, body) {
- if (error) {
- console.log('Error sending messages: ', error)
- reject(error)
- } else if (response.body.error) {
- console.log('Error: ', response.body.error)
- reject(response.body.error)
- } else {
- resolve(response.body)
- }
- })
- })
- }
- /*
- 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) => {
- if (err) {
- console.log("Error sending email", err)
- }
- })
- */
- function getTemplate(confirmationEmail) {
- let html = fs.readFileSync("./email/template.html", {
- encoding: "utf-8"
- })
- html = html.replace("{{confirmation}}", confirmationEmail)
- return html
- }
- //writeUserData("1","Ahmed","mpghknown@gmail.com","somewhere","23","today")
- function writeUserData(userId, name, email, restaurant, hour, day) {
- database.ref('/booking-list/' + userId)
- .update({
- username: name,
- email: email,
- restaurant: restaurant,
- hour: hour,
- day: day
- });
- }
- /*
- addRestaurant("Sakura", "Boujbelsamy@gmail.com")
- */
- function addRestaurant(restaurants, email) {
- //Write Email
- database.ref('/restaurants/' + restaurants).set({
- Email: email
- })
- }
- function getEmail(place, type, callback) {
- //Read Email
- database.ref('/' + type + 's/' + place).once('value').then(function (restaurant) {
- let Email = restaurant.val().Email
- callback(Email)
- })
- }
- //
- function readUserData(uid) {
- var userBooking = database.ref('booking-list/' + uid);
- userBooking.once('value').then(function (snapshot) {
- console.log("The value", snapshot.val())
- });
- }
- function createMailTrans() {
- // create reusable transporter object using the default SMTP transport
- let transporter = nodemailer.createTransport({
- host: 'smtp.gmail.com',
- port: 465,
- secure: true, // secure:true for port 465, secure:false for port 587
- auth: {
- user: aliEmail,
- pass: aliPass
- }
- })
- return transporter
- }
- function sendEmail(To, Subject, Body, callback) {
- // setup email data with unicode symbols
- let mailOptions = {
- from: '"Ali Booking 🍔 🍟" <alibookingtn@gmail.com>', // sender address
- to: To, // list of receivers
- subject: Subject, // Subject line
- text: Body, // plain text body
- html: getTemplate(Body) // html body
- };
- let transporter = createMailTrans()
- transporter.sendMail(mailOptions, (error, info) => {
- if (error) {
- if (callback)
- return callback(error, null)
- }
- if (info) {
- console.log('Message %s sent: %s', info.messageId, info.response);
- if (callback)
- return callback(null, info)
- }
- });
- }
- function startDB() {
- // TODO: Replace with your project's config object
- var config = {
- apiKey: "AIzaSyAvswhkjV-Ts4uEEYvQZSfyLhD5I9v9QPA",
- authDomain: "bookings-7592e.firebaseapp.com",
- databaseURL: "https://bookings-7592e.firebaseio.com",
- storageBucket: "bookings-7592e.appspot.com"
- };
- firebase.initializeApp(config);
- return firebase.auth().signInWithEmailAndPassword(fbaseEmail, fbasePass)
- .catch(function (error) {
- // Handle Errors here.
- var errorCode = error.code;
- var errorMessage = error.message;
- if (error) {
- console.log("Can't sign in to database because", errorMessage)
- console.log("here")
- } else {
- console.log("resolving")
- }
- });
- // Get a reference to the database service
- }
- function test(payload) {
- //Check if the payload is onlyyyy numbers or '-' like 1-2 or 3-4 or so
- let Numerics = /^[0-9]-+$/
- let userId = "1"
- if (Numerics.test(payload)) {
- // DateMessage(sender)
- database.ref('/booking-list/' + userId).update({
- peopleNumber: payload
- })
- }
- }
- //Send to tell the user I don't understand
- function sendNotUnderstanding(user) {
- let userId = user.id
- var Random = Math.floor(Math.random() * (NotUnderstanding.length - 1));
- let text = NotUnderstanding[Random] + " " + 'écrit "Ali" pour commencer'
- messenger.sendTextMessage(userId, text)
- }
- function sendShareToFriend(user) {
- let userId = user.id
- let eatingFoodImage = "https://bookbookbot.com/image/app/home/heroimage_landing_large_compressed.jpg"
- let elements = [{
- title: "Ali - Le bot utile",
- subtitle: "AliBot is Restaurants booking bot, where you can book your favorite restaurant",
- image_url: eatingFoodImage,
- buttons: [{
- type: "element_share"
- }],
- default_action: {
- type: "web_url",
- url: "https://m.me/3amekAli/"
- }
- }]
- console.log(JSON.stringify(elements), userId)
- messenger.sendHScrollMessage(userId, elements, 'REGULAR', (err, res) => {
- if (err) {
- console.log(err)
- }
- })
- }
- function getUser(userId) {
- return new Promise((resolve, reject) => {
- database.ref('/booking-list/' + userId).once('value').then((user) => {
- user = user.val()
- if (!user) {
- insertUser(userId, (err, user) => {
- resolve(user)
- })
- } else {
- if (!user.id) {
- insertUser(userId, (err, user) => {
- resolve(user)
- })
- } else {
- resolve(user)
- }
- }
- console.log("user eventualy", user.id)
- })
- })
- }
- function insertUser(userId, callback) {
- messenger.getProfile(userId, function (err, res) {
- let baseRef = database.ref('/booking-list/' + userId)
- let user = {
- id: userId,
- username: res.first_name + ' ' + res.last_name,
- profile_pic: res.profile_pic,
- gender: res.gender,
- locale: res.locale,
- timezone: res.timezone
- }
- baseRef.update(user).then((res) => {
- callback(null, user)
- })
- })
- }
- //save date of reservation in precise
- function saveDate(user, hour, baseRef) {
- let userDate = generateReservationDate(user, hour)
- let now = new Date()
- let tunisiaNow
- if (process.env.local) {
- tunisiaNow = moment().subtract(1, "hour").toDate()
- } else {
- tunisiaNow = date.addHours(now, 1)
- }
- return baseRef.update({
- date: userDate,
- dateReserved: tunisiaNow.getTime()
- }).then(res => {
- return res
- })
- }
- function checkTime(user, bookers, options) {
- let bookersIds = Object.keys(bookers)
- let PeopleInThat = bookersIds.filter((bookerId) => {
- // console.log("doing compartion", bookers[userId].date == options.date, "user date", bookers[userId].date, "the button date", options.date)
- return bookers[bookerId].date == options.date
- })
- console.log(PeopleInThat.length, "people reserved in that date", options.date, "and peoples number", parseInt(options.tablesNumber))
- if (PeopleInThat.length >= parseInt(options.tablesNumber)) {
- return false
- } else {
- return true
- }
- }
- function getRestaurantsBookers(restaurant) {
- return database.ref("booking-list").once("value").then(users => {
- users = users.val()
- if (!users) {
- return []
- } else {
- let userIds = Object.keys(users)
- let resultsPromise = []
- userIds.forEach(userId => {
- console.log(userId)
- let bookingPromise = database.ref("booking-list/" + userId + "/bookings")
- .orderByChild("restaurant")
- .equalTo(restaurant)
- .once("value")
- .then(res => {
- if (res.val())
- return res.val()
- })
- resultsPromise.push(bookingPromise)
- })
- return Promise.all(resultsPromise)
- }
- })
- /*
- return database.ref().child("/booking-list/")
- .orderByChild("restaurant")
- .equalTo(restaurant)
- .once("value")
- .then((res) => {
- if(res.val())
- return res.val()
- })
- */
- }
- //generate reservation dates
- function generateReservationDate(user, hour, flag) {
- let now = new Date()
- let tunisiaNow
- if (process.env.local) {
- tunisiaNow = moment().subtract(1, "hour").toDate()
- } else {
- tunisiaNow = date.addHours(now, 1)
- }
- console.log("now ", now.toString())
- console.log("now ", tunisiaNow.toString())
- let addedDays
- let reservationDay
- let userDay
- if (flag) {
- userDay = "Cesoir"
- } else {
- userDay = user.day
- }
- let userHour = parseInt(strsplit(hour, /:/)[0])
- let userMinutes = strsplit(hour, /:/)[1]
- if (userMinutes == "30") {
- userMinutes = 30
- } else {
- userMinutes = 0
- }
- if (userDay == "Demain") {
- addedDays = 1
- } else if (userDay == "ApresDemain") {
- addedDays = 2
- }
- //addedDays = 0
- if (!addedDays) {
- reservationDay = tunisiaNow
- } else if (!reservationDay) {
- reservationDay = date.addDays(tunisiaNow, addedDays)
- }
- let year = reservationDay.getFullYear()
- let month = reservationDay.getMonth()
- let day = reservationDay.getDate()
- console.log("The user hour ", userHour)
- console.log("the added days", day)
- let reservationDate = new Date(year, month, day, userHour, userMinutes)
- console.log("the user reservation date is ", reservationDate.toString())
- console.log("thee user reserved on ", tunisiaNow.toString())
- return reservationDate.getTime()
- }
- //Handle when an error happens
- function erroHandle(user, addedText, callback) {
- let userId = user.ID
- if (callback) {
- messenger.sendTextMessage(userId, "Sorry! but " + addedText, "REGULAR", callback)
- } else {
- messenger.sendTextMessage(userId, "Sorry! but " + addedText, "REGULAR")
- }
- }
- function removePastBookings(callback) {
- let now = new Date()
- let tunisiaNow
- if (process.env.local) {
- tunisiaNow = moment().subtract(1, "hour").toDate()
- } else {
- tunisiaNow = date.addHours(now, 1)
- }
- database.ref('/booking-list/').once('value').then((bookers) => {
- bookers = bookers.val()
- let bookerIds = Object.keys(bookers)
- bookerIds.map((bookerId, i) => {
- let booker = bookers[bookerId]
- if (!booker.date) {
- return
- }
- let userDate = new Date(booker.date)
- if (date.subtract(tunisiaNow, userDate).toMinutes() <= 0) {
- database.ref('/booking-list/' + bookerId).remove()
- }
- if (i == bookerIds.length - 1) {
- callback(null, "done")
- }
- })
- })
- }
- function sendUserBookings(user) {
- let userId = user.id
- return getUserBookings(userId).then(bookings => {
- if (bookings.length > 0) {
- console.log("the bookings length",bookings.length)
- let elements = []
- let images_promises = []
- bookings.forEach(booking => {
- let type = booking.cinema ? "movie" : "restaurant"
- let image_promise = getPlace(booking, type).then(restaurant => {
- return restaurant.image
- })
- images_promises.push(image_promise)
- })
- Promise.all(images_promises).then(images => {
- bookings.forEach((booking, index) => {
- let title = booking[booking.type]
- let bookingDate = date.format(new Date(booking.date), 'YYYY/MM/DD HH:mm')
- let subtitle = "You've reserved in " + booking.restaurant + " for " + booking.peopleNumber + " at " + bookingDate;
- let image_url = images[index]
- //getRestaurant(booking.restaurant)
- let buttons = getBookingButtons(booking)
- if(buttons.length==2) {
- subtitle+="\n You've canceled this booking"
- }
- let element = {
- title,
- subtitle,
- buttons,
- image_url
- }
- elements.push(element)
- })
- messenger.sendHScrollMessage(userId, elements, (err, res) => {
- if (err) {
- console.log("error with sending user bookings", err)
- }
- })
- })
- } else {
- console.log("sending sorry no bookings")
- let sorryText = "Sorry but you don't have any bookings"
- let bookButton = {
- content_type: "text",
- title: "Reservez",
- payload: "Reservez"
- }
- messenger.sendQuickRepliesMessage(userId, sorryText, [bookButton], (err, res) => {
- if (err) {
- console.log(err)
- }
- })
- }
- })
- }
- function getUserBookings(userId) {
- return database.ref("booking-list/" + userId + "/bookings").once("value").then(snapshot => {
- console.log("sendingew")
- if (!snapshot.val()) {
- console.log("no bookings")
- return []
- }
- let userBookings = snapshotToArray(snapshot)
- userBookings = sort(userBookings, "date")
- userBookings = userBookings.filter(booking => {
- return parseInt(booking.date) >= new Date().getTime()
- })
- return userBookings
- })
- }
- function checkBookingLimit(user) {
- return getUserBookings(user.id).then(bookings => {
- return database.ref("admin_panel/bookingLimit").once("value").then(limit => {
- console.log("limit", limit.val())
- let bookingLimit = limit.val()
- let liveBookings = bookings.filter(booking => {
- return booking.status == "confirmed"
- })
- console.log("bookinglimit", bookingLimit)
- if (liveBookings.length == bookingLimit) {
- return {
- status: false,
- limit: bookingLimit
- }
- } else {
- return {
- status: true,
- limit: bookingLimit
- }
- }
- })
- })
- }
- function sendBookingLimit(user, limit) {
- let sorryText = "Sorry but you're limit with on only to " + limit + " bookings "
- let quick_replies = [{
- content_type: "text",
- title: "My Bookings 💾",
- payload: "myBookings"
- }]
- messenger.sendQuickRepliesMessage(user.id, sorryText, quick_replies, (err, res) => {
- if (err) {
- console.log("Error sending sorry", err)
- }
- })
- }
- function sort(array, key) {
- array.sort(function (a, b) {
- return new Date(b[key]) - new Date(a[key]);
- });
- return array
- }
- function saveBooking(user, type) {
- let userId = user.id
- let booking = {
- date: user.date,
- dateReserved: user.dateReserved,
- peopleNumber: user.peopleNumber,
- type: type
- }
- booking.status = "pending"
- if (type == "restaurant") {
- booking.day = user.day
- booking.hour = user.hour
- booking.restaurant = user.restaurant
- } else if (type == "cinema") {
- booking.day = user.day
- booking.hour = user.hour
- booking.cinema = user.cinema
- booking.movie = user.movie.replace(/ cinemaType \[(.*?)\]/g, "").trim()
- }
- let pushingReference = database.ref("booking-list/" + userId + "/bookings")
- return pushingReference.push(booking).then(ref => {
- let key = ref.key
- return ref.update({
- key
- }).then(ref => {
- console.log("updated the booking reference key ")
- return database.ref("booking-list/" + userId).update({
- lastBookingId: key
- }).then(done => {
- booking.key = key
- return booking
- })
- })
- })
- }
- function snapshotToArray(snapshot, object) {
- let returnArr = [];
- if (object) {
- let snapKeys = Object.keys(snapshot)
- snapKeys.forEach(snapKey => {
- let item = snapshot[snapKey];
- item.key = snapshot;
- returnArr.push(item);
- });
- return returnArr
- }
- snapshot.forEach(childSnapshot => {
- let item = childSnapshot.val();
- item.key = childSnapshot.key;
- returnArr.push(item);
- });
- return returnArr;
- };
- function getBookingButtons(booking) {
- let buttons = [{
- type: "postback",
- title: "Modify ⚠",
- payload: "modifyUserBooking " + booking.key
- },
- {
- type: "postback",
- title: "Contact "+booking.type+ " 🏬",
- payload: "contactRestaurant " + booking[booking.type]
- }
- ]
- if (booking.status == "pending") {
- buttons.push({
- type: "postback",
- title: "Confirm ✔",
- payload: "Confirm Booking " + booking.key
- })
- } else if (booking.status == "confirmed") {
- buttons.push({
- type: "postback",
- title: "Cancel ❌",
- payload: "Cancel Booking " + booking.key
- })
- }
- return buttons
- }
- function getRestaurant(name) {
- return database.ref('/restaurants/' + name).once('value').then((restaurant) => {
- return restaurant.val()
- })
- }
- function getPlace(booking, type) {
- let reference = ""
- if (type == "movie") {
- let weekId = moment(booking.data).startOf('week').format('LL').toString()
- reference = "movies/" + booking.cinema + "/" + weekId+"/"+ booking.type
- } else {
- reference = type + "s"
- }
- console.log("everything", reference)
- return database.ref(reference + '/' + booking[type]).once('value').then((place) => {
- console.log("place",place.val() )
- return place.val()
- })
- }
- function updateBooking(user, bookingId, update) {
- console.log("updating booking", bookingId, update)
- return database.ref("booking-list/" + user.id + "/bookings/" + bookingId).update(update)
- }
- function getBookingStatus(userId, bookingId) {
- console.log("here right")
- return database.ref("booking-list/" + userId + "/bookings/" + bookingId + "/status").once("value").then(status => {
- return status.val()
- })
- }
- function getBookingField(userId, bookingId,field) {
- console.log("here right")
- return database.ref("booking-list/" + userId + "/bookings/" + bookingId + "/"+field).once("value").then(status => {
- return status.val()
- })
- }
- function sendAlreadyConfirmed(user) {
- let text = "You've already confirmed this booking ^_^"
- messenger.sendTextMessage(user.id, text)
- }
- function SuccesfullyModifyed(user) {
- let sentText = "You've sucessfuly modifyed your booking"
- let userId = user.id
- messenger.sendTextMessage(userId, sentText, (err, res) => {
- if (err) {
- console.log("error sending succes of modify", err)
- }
- })
- }
- function keepAlive() {
- setInterval(() => {
- request({
- url: "https://intense-shore-72911.herokuapp.com"
- }, (err, res) => {
- })
- }, 300000)
- }
- function sendCinemaAgenda(user, place) {
- let hereText = "Here's todays week agenda for the " + place + " cinema ^_^"
- if (place == "lagora") {
- takeAgendaScreen().then(url => {
- console.log("the url", url)
- sendImageMessage(user.id, url).then(done => {
- //sendTextMessage(user.id,hereText)
- let weekId = moment().startOf('week').format('LL').toString()
- getWeekAgenda(weekId, place).then(types => {
- let quick_replies = []
- types.forEach(type => {
- quick_replies.push({
- "content_type": "text",
- "title": type,
- "payload": "cinemaType [" + type + "] cinema [" + place + "]"
- })
- })
- messenger.sendQuickRepliesMessage(user.id, hereText, quick_replies, (err, res) => {
- if (err) {
- console.log("error sending cinemas events types", err)
- } else {
- console.log("sent cinemas events types")
- }
- })
- })
- })
- })
- }
- }
- function sendTextsInOrder(recipientId, texts, seconds) {
- seconds = 0 || seconds * 1000
- console.log("the damn received", recipientId)
- let textsPromise = []
- texts.forEach((text, index) => {
- let intervalStart = index + 1
- console.log("the user ", recipientId)
- setTimeout((recipientId, text, intervalStart) => {
- console.log("the recipient ", recipientId, text, index)
- sendTypingOn(recipientId)
- setTimeout((recipientId, text) => {
- sendTextMessage(recipientId, text)
- sendTypingOff(recipientId)
- }, intervalStart * seconds, recipientId, text)
- }, (intervalStart * seconds) + 1000, recipientId, text, intervalStart)
- })
- //Promise.all(textsPromise)
- }
- function sendTypingInterval(recipientId, text, index, seconds) {
- return new Promise((resolve, reject) => {
- sendTypingOn(recipientId).then(done => {
- setTimeout((resolve, reject, recipientId) => {
- sendTextMessage(recipientId, text).then(done => {
- return sendTypingOff(recipientId).then(done => {
- resolve()
- })
- })
- .catch(err => {
- console.log("Error sending typing off")
- resolve()
- })
- }, index * seconds, resolve, reject, recipientId)
- }).catch(err => {
- console.log("Error sending typing on")
- resolve()
- })
- })
- }
- function sendTypingOn(recipientId) {
- console.log("Turning typing indicator on");
- var messageData = {
- recipient: {
- id: recipientId
- },
- sender_action: "typing_on"
- };
- return callSendAPI(messageData);
- }
- function sendTypingOff(recipientId) {
- console.log("Turning typing indicator off");
- var messageData = {
- recipient: {
- id: recipientId
- },
- sender_action: "typing_off"
- };
- return callSendAPI(messageData);
- }
- /*
- let now=date.addHours(new Date(),2)
- let year=now.getFullYear()
- let month=now.getMonth()
- let day=now.getDate()
- let twelvePm=new Date(year,month,day,21+2,30)
- let hour="!2"
- let minute="00"
- console.log(date.subtract(twelvePm,now).toMinutes())
- console.log("the now with user time is ",now.toString())
- console.log("twelvePm is ",twelvePm.toString())
- */
- function* scrape() {
- let weekId = moment().startOf('week').format('LL').toString()
- let week = yield getWeek("lagora", weekId)
- console.log("the week", week)
- if (!week) {
- let movies = yield scrapeWeekData()
- console.log("this week mooveis", movies)
- for (let i = 0; i < movies.length; i++) {
- let movie = yield getTimesForMovie(movies[i])
- if (Object.keys(movie).length > 0) {
- database.ref("movies/lagora/" + weekId + "/" + movie.type + "/" + movie.id).set(movie)
- saveWeek("lagora", weekId)
- console.log("the movie", movie)
- }
- }
- }
- }
- function getWeek(cinema, weekId) {
- return database.ref('weeks/' + cinema + '/' + weekId).once("value").then(res => {
- if (res.val()) {
- return true
- } else {
- return false
- }
- })
- }
- function saveWeek(cinema, weekId) {
- return database.ref('weeks/' + cinema + '/' + weekId).set({
- weekId: weekId
- })
- }
- setTimeout(() => {
- co(scrape())
- }, 5000)
- //takeAgendaScreen()
- function takeAgendaScreen() {
- return new Promise((resolve, reject) => {
- let weekId = moment().startOf('week').format('LL').toString()
- let path = "public/" + weekId + ".png"
- let route = weekId + ".png"
- let url = server_url + encodeURIComponent(route)
- if (!fs.existsSync(path)) {
- console.log("taking the screenshot")
- webshot("https://www.lagora.tn/agenda", path, {
- shotOffset: {
- top: 480
- }
- }, (err) => {
- console.log("Error savign the screenshot", err)
- resolve(url)
- })
- } else {
- console.log("that screenshot already there", weekId)
- resolve(url)
- }
- })
- }
- function scrapeWeekData() {
- return new Promise((resolve, reject) => {
- request({
- url: "https://www.lagora.tn/agenda"
- }, (err, res) => {
- if (err) {
- console.log("Error fetching movies", err)
- resolve([])
- } else {
- let $ = cheerio.load(res.body)
- let movies_set = new Set()
- let movies = []
- $("span.field-content a").each((index, element) => {
- let movieId = decodeURIComponent($(element).attr("href").replace("/event/", ""))
- let imagesDiv = $(element).parent().parent().parent().children('.views-field-field-background-image')
- if (imagesDiv.html() && imagesDiv.html().indexOf("cine") > -1) {
- if (movieId && movieId !== "") {
- movies_set.add(movieId)
- }
- }
- })
- movies = Array.from(movies_set)
- resolve(movies)
- }
- })
- })
- }
- function getTimesForMovie(movieId) {
- return new Promise((resolve, reject) => {
- let url = "https://www.lagora.tn/event/" + encodeURIComponent(movieId)
- console.log("movie url", url)
- request({
- url: url
- }, (err, res) => {
- if (err) {
- console.log("error getting movie data", err)
- resolve({})
- } else {
- let movie = {
- times: []
- }
- let $ = cheerio.load(res.body)
- if (!$(".field-date")) {
- resolve({})
- }
- $(".taxonomy-term-reference-0").each((index, element) => {
- let type = $(element).html()
- if (type) {
- console.log(type)
- movie.type = type.toLowerCase()
- return false
- }
- })
- $(".field-date").each((index, element) => {
- let timestamp = $(element).attr("id")
- console.log(timestamp)
- if (timestamp) {
- timestamp = timestamp + "000"
- let tunisita_timestamp = ""
- if (process.env.local) {
- console.log("before for timestampe", timestamp)
- tunisita_timestamp = moment(parseInt(timestamp)).subtract(1, "hour").format('x')
- console.log("after for timestampe", tunisita_timestamp)
- } else {
- tunisita_timestamp = moment(parseInt(timestamp)).add(1, "hour").format('x')
- }
- movie.times.push(tunisita_timestamp)
- }
- })
- $(".event-group-description.field-group-div").each((index, element) => {
- let description = $(element).text()
- if (description) {
- description = description.replace("Description", "")
- movie.description = description
- console.log("description", description)
- }
- })
- movie.id = movieId
- movieId = movieId.replace(/-/g, " ")
- movie.title = capitalizeFirstLetter(movieId)
- console.log("getting poster image", movie.title)
- getPosterImage(movie.title).then(imageUrl => {
- console.log("images repose", imageUrl)
- movie.image = imageUrl
- getTrailer(movie.title).then(trailerUrl => {
- movie.trailer = trailerUrl
- resolve(movie)
- })
- })
- }
- })
- })
- }
- function capitalizeFirstLetter(string) {
- return string.charAt(0).toUpperCase() + string.slice(1);
- }
- function getWeekAgenda(weekId, place, type) {
- let dataRef
- if (type) {
- dataRef = database.ref("movies/" + place + "/" + weekId + "/" + type)
- } else {
- dataRef = database.ref("movies/" + place + "/" + weekId)
- }
- return dataRef.once("value").then(results => {
- if (!type) {
- let value = results.val()
- console.log("the value", Object.keys(value))
- return Object.keys(value)
- }
- })
- }
- function getMovies(place, cinemaType) {
- let weekId = moment().startOf('week').format('LL').toString()
- return database.ref("movies/" + place + "/" + weekId + "/" + cinemaType).once('value').then(res => {
- if (!res.val()) return []
- return snapshotToArray(res)
- })
- }
- function getMovie(user, weekId, cinemaType, movieId) {
- let moviePath = "movies/" + user.cinema + "/" + weekId + "/" + cinemaType + "/" + movieId
- console.log("the path", moviePath)
- return database.ref("movies/" + user.cinema + "/" + weekId + "/" + cinemaType + "/" + movieId).once('value').then(res => {
- if (!res.val()) return {
- times: []
- }
- return res.val()
- })
- }
- //send the user restaurants
- function sendMovies(user, place, cinemaType, index) {
- console.log("getting movies and sending them", place, cinemaType)
- return getMovies(place, cinemaType).then(movies => {
- let text = "Aya behi, Dans quel cinema voudrais-tu manger? :"
- let userId = user.id
- user.type = user.type || "cinema"
- let places = Places[user.type]
- let begin = index || 0
- let end = index + 9 || 9
- let morePush = true
- let elements = []
- if ((movies.length - begin) <= 10) {
- end = movies.length
- morePush = false
- }
- for (let i = begin; i < end; i++) {
- if (movies[i].times) {
- if(!checkMovieTimes(movies[i].times)) continue
- } else if (!movies[i].times) {
- continue
- }
- let movieTitle = movies[i].title
- let movieId = movies[i].id
- let movieImage = movies[i].image
- let movieDescription = movies[i].description
- let movieLink = movies[i].link || "https://lagora.tn/event/" + encodeURIComponent(movies[i].id)
- let trailerLink = movies[i].trailer
- let tableOrPlace = "Book a Seat"
- let buttons = [{
- title: tableOrPlace,
- type: "postback",
- payload: "movie " + movieId + " cinemaType [" + cinemaType + "]"
- }]
- if (trailerLink) {
- buttons.push({
- title: "Watch Trailer",
- type: "web_url",
- url: trailerLink
- }, )
- }
- buttons.push({
- title: "Voir plus d'infos",
- type: "web_url",
- url: movieLink
- })
- /* //MODIFY FOR MOVIE RESERVATION
- if (bookingId) {
- buttons[0].payload += " modify" + bookingId
- }
- */
- let element = {
- title: movieTitle,
- buttons: buttons
- }
- if (movieDescription) {
- element.subtitle = movieDescription
- }
- if (movieImage) {
- element.image_url = movieImage
- }
- elements.push(element)
- }
- if(elements.length<=0 ) {
- let sorryText="Sorry But No upcoming movies to reserve"
- return messenger.sendTextMessage(user.id,sorryText,(err,res)=>{
- if(err) {
- console.log("error sending text message",err)
- }
- })
- }
- if (morePush) {
- let messageData = {
- recipient: {
- id: userId
- },
- message: {}
- }
- let attachment = {
- type: "template",
- payload: {
- template_type: "generic",
- elements: elements
- }
- }
- let quickReplies = [{
- content_type: "text",
- title: "More Movies",
- payload: "moreMovies " + end
- }]
- messageData.message.attachment = attachment
- messageData.message.quick_replies = quickReplies
- callSendAPI(messageData)
- } else {
- messenger.sendHScrollMessage(userId, elements, "REGULAR", (err, res) => {
- if (err) {
- console.log("error sending restaurants", err)
- }
- })
- }
- })
- }
- function getPosterImage(movieTitle) {
- return searchClient.search(movieTitle).then(images => {
- if (images.length > 0) {
- return images[0].url
- } else {
- return null
- }
- })
- }
- function getTrailer(movieTitle) {
- return movieTrailer(movieTitle).then(trailer => {
- console.log("trailer", trailer)
- return trailer
- })
- }
- function getTimesFormat(timestamp) {
- return moment(parseInt(timestamp)).format('ddd, MMM D LT')
- }
- function getWeekId() {
- return moment().startOf('week').format('LL').toString()
- }
- function checkMovieTimes(times) {
- for (let i = 0; i < times; i++) {
- let time = times[i]
- if (process.local.env) {
- let nowTimeStamp = parseInt(moment().subtract(1, "hour").format('x'))
- if (nowTimeStamp > parseInt(time)) {
- return false
- }
- }
- }
- return true
- }
- function sendNoRestaurants(user) {
- let sorryText="Sorry But No upcoming movies to reserve"
- return messenger.sendTextMessage(user.id,sorryText,(err,res)=>{
- if(err) {
- console.log("error sending text message",err)
- }
- })
- }
- let now = new Date()
- let tunisiaNow = date.addHours(now, 1)
- let reservationDay = date.addDays(tunisiaNow, 0)
- let year = reservationDay.getFullYear()
- let month = reservationDay.getMonth()
- let day = reservationDay.getDate()
- console.log(now.toString())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement