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:
[email protected]/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));
});
}