BGT API AI Distributed Offers BOT

node v6.17.1
version: 44.0.0
endpointsharetweet
const bodyParser = require('body-parser'), config = require('config'), crypto = require('crypto'), https = require('https'), request = require('request'), CryptoJS = require("crypto-js"), url = require('url'), requestPromise = require("request-promise"), endpoint = require("@runkit/runkit/json-endpoint/1.0.0"); const APP_MAC_ID = "d0625c4f2cc34b189379f3daeab8214e"; const APP_MAC_KEY = "9rYblk4BojCV8X9fcauTrzpoxmoq1VItpO9TR9Au4Y8"; function randomString(len, charSet) { charSet = charSet || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; var randomString = ''; for (var i = 0; i < len; i++) { var randomPoz = Math.floor(Math.random() * charSet.length); randomString += charSet.substring(randomPoz, randomPoz + 1); } return randomString; } function getLCPAuthHeader(macId, macKey, method, urlString, data) { var d = new Date(); var n = d.getTime() + ""; var ts = n.substring(0, n.length - 3); var nonce = randomString(8); var urlReader = url.parse(urlString); var ext = ""; if ("GET" != method && data !== undefined) { ext = CryptoJS.SHA1("application/json" + JSON.stringify(data)); } macKey = macKey.replace(new RegExp("-", 'g'), "+").replace(new RegExp("_", 'g'), "/"); var normalizedRequestString = ts + "\n" + nonce + "\n" + method + "\n" + urlReader.pathname + "\n" + urlReader.hostname + "\n443\n" + ext + "\n"; var secret = CryptoJS.enc.Base64.parse(macKey); var mac = CryptoJS.HmacSHA1(normalizedRequestString, secret).toString(CryptoJS.enc.Base64); var header = "MAC id=\"" + macId + "\", ts=\"" + ts + "\", nonce=\"" + nonce + "\", ext=\"" + ext + "\", mac=\"" + mac + "\""; return header; } exports.endpoint = async function(request, response) { var body = []; request.on('data', function(chunk) { body.push(chunk); }).on('end', async function() { body = JSON.parse(Buffer.concat(body).toString()); var name; var order; var contexts = body.result.contexts; for (var i = 0; contexts !== undefined && i < contexts.length; i++) { if (contexts[i].name == "name") { name = contexts[i].parameters.name; } else if (contexts[i].name == "order") { order = contexts[i].parameters; } } if (body.originalRequest.data.user.profile !== undefined) { name = body.originalRequest.data.user.profile.display_name; } var html; if (name == undefined) { html = { "contextOut": [{ "lifespan": 100, "name": "_actions_on_google_", "parameters": {} }, { "lifespan": 1, "name": "requesting_permission", "parameters": {} } ], "data": { "google": { "expect_user_response": true, "is_ssml": false, "no_input_prompts": [], "permissions_request": { "opt_context": "To check your personalized "+order["loyalty-program"]+" buy offers", "permissions": [ "NAME" ] } } }, "speech": "PLACEHOLDER_FOR_PERMISSION" }; } else if (body.originalRequest.data.device.location == undefined) { html = { "contextOut": [{ "lifespan": 100, "name": "_actions_on_google_", "parameters": {} }, { "lifespan": 1, "name": "requesting_permission", "parameters": {} }, { "lifespan": 1, "name": "name", "parameters": { "name": name } } ], "data": { "google": { "expect_user_response": true, "is_ssml": false, "no_input_prompts": [], "permissions_request": { "opt_context": "To see how many points it would take to get to " + order.destination + " from where you are right now", "permissions": [ "DEVICE_PRECISE_LOCATION" ] } } }, "speech": "PLACEHOLDER_FOR_PERMISSION" }; } else { /*var alaskaAwards = await requestPromise('https://www.alaskaair.com/content//~/media/Files/json/data-rewards.json', { json: true });*/ var alaskaAwards = [ { "StartSubRegion": "Dallas", "EndSubRegion": "Chicago", "NonRefundable": "18,864" }, { "StartSubRegion": "Dallas", "EndSubRegion": "San Francisco", "NonRefundable": "17,568" }, { "StartSubRegion": "Dallas", "EndSubRegion": "Belize City", "NonRefundable": "59,616" } ]; var leastExpensive = -1; var addressArray = body.originalRequest.data.device.location.formatted_address.split(","); for (var i = 0; alaskaAwards !== undefined && i < alaskaAwards.length; i++) { if (alaskaAwards[i].StartSubRegion == addressArray[1].trim() && alaskaAwards[i].EndSubRegion == order["destination"]) { var price = parseInt(alaskaAwards[i].NonRefundable.replace(/,/g, "")); if (leastExpensive == -1 || leastExpensive > price) { leastExpensive = price; } } } var mvRequest = { memberId: "132845", firstName: "Bobby Jean", lastName: "Blue" }; var authHeader = getLCPAuthHeader(APP_MAC_ID, APP_MAC_KEY, "POST", "https://staging.lcp.points.com/v1/lps/960ecb44-da5c-42d4-b8d8-47c1aa5c3f6b/mvs/", mvRequest); var mvResponse = await requestPromise({ uri: 'https://staging.lcp.points.com/v1/lps/960ecb44-da5c-42d4-b8d8-47c1aa5c3f6b/mvs/', method: 'POST', headers: { 'Authorization': authHeader, 'Content-Type': 'application/json' }, json: mvRequest, simple: false }); var speech = ""; if (mvResponse.balance == undefined) { speech = "Sorry, I could not validate your membership in "+order["loyalty-program"]; } else if (mvResponse.balance > leastExpensive) { speech = "You have enough " + order["loyalty-program"] + " points to get to " + order["destination"]; } else { var session = { "channel": "googleHome", "clientIpAddress": "0.0.0.0", "clientUserAgent": "Google Home", "referralCode": "Google Home" }; var user = { "loyaltyProgram": "https://staging.lcp.points.com/v1/lps/cdbda9ad-5294-40fa-ab35-6c21694e795a", "memberId": order["membership-number"] }; var messageData = { "offerTypes": ["BUY"], "session": session, "user": user }; var authHeader = getLCPAuthHeader(APP_MAC_ID, APP_MAC_KEY, "POST", "https://staging.lcp.points.com/v1/offer-sets/", messageData); var offerSet = await requestPromise({ uri: 'https://staging.lcp.points.com/v1/offer-sets/', method: 'POST', headers: { 'Authorization': authHeader, 'Content-Type': 'application/json' }, json: messageData }); var transactionQuantity = 0; var sms = ""; if (offerSet !== undefined && offerSet.offers !== undefined && offerSet.offers.length > 0) { var offer = offerSet.offers[0]; var quantity = leastExpensive - mvResponse.balance; for (var i = 0; i < offer.pricing.tiers.length; i++) { var tier = offer.pricing.tiers[i]; var realQuantity = Math.ceil(quantity / tier.blockSize) * tier.blockSize; if (realQuantity >= tier.minOfRange && realQuantity <= tier.maxOfRange) { var price = realQuantity * parseFloat(tier.retailRates[0].rate); speech = name.split(" ")[0]+", you have " + mvResponse.balance+" points in your account and you need an extra "+ (leastExpensive - mvResponse.balance) + " points to get to "+order["destination"]+". I was able to find you an offer that would allow you to buy these points for quot; + price; if (tier.bonusAmount > 0) { speech += " and get an additional " + tier.bonusAmount + "% bonus points!"; } speech += ". I am texting you your personalized offer link right now!"; transactionQuantity = realQuantity; sms = "Buy " + realQuantity.toLocaleString() + " points for quot; + price+ " to get to "+order["destination"]; break; } } if (speech == "") { speech = "You are short " + (leastExpensive - mvResponse.balance) + " points. However, there are no offers available for you at this time for that amount. Please try again later"; } } else { speech = "You are short " + (leastExpensive - mvResponse.balance) + " points. However, there are no offers available for you at this time. Please try again later"; } } html = { "speech": speech, "displayText": speech, "source": "bgt-distributed-offers-bot", data: { google: { expect_user_response: false, } } }; if (true) { var mvDelegateRequest = { memberValidation: { memberId: order["membership-number"], firstName: name.split(" ")[0], lastName: name.split(" ")[1] }, memberValidationResponse: { balance: mvResponse.balance, transactionQuantity: transactionQuantity, memberId: order["membership-number"], firstName: name.split(" ")[0], lastName: name.split(" ")[1], referralCode: "Google Home" }, application:"https://staging.lcp.points.com/v1/apps/344c0578-4350-4f39-a286-0da4ac33f7b2" }; var authHeader = getLCPAuthHeader(APP_MAC_ID, APP_MAC_KEY, "POST", "https://staging.lcp.points.com/v1/lps/960ecb44-da5c-42d4-b8d8-47c1aa5c3f6b/mv-delegates/", mvDelegateRequest); var mvDelegateResponse = await requestPromise({ uri: 'https://staging.lcp.points.com/v1/lps/960ecb44-da5c-42d4-b8d8-47c1aa5c3f6b/mv-delegates/', method: 'POST', headers: { 'Authorization': authHeader, 'Content-Type': 'application/json' }, json: mvDelegateRequest }); await requestPromise({ uri: 'https://AC352e0f6329e9bfbc91970216d793f017:24a289524d594347309134bc106637cd@api.twilio.com/2010-04-01/Accounts/AC352e0f6329e9bfbc91970216d793f017/Messages.json', method: 'POST', form: { To: '6478823441', From: '6479526246', Body:'Here is your offer https://storefront-staging.lxc.points.com/rapid-rewards.iframe/sso/mv-delegate/buy?token='+mvDelegateResponse.links.self.href, MediaUrl: 'https://media-cdn.tripadvisor.com/media/photo-s/07/72/27/a3/chicago.jpg' } }); } } response.setHeader('content-type', 'application/json'); response.end(JSON.stringify(html)); }); }
Loading…

no comments

    sign in to comment