poserver
Version:
Server for JD Bot
160 lines (139 loc) • 5.55 kB
JavaScript
/**
* Created by tomdaley on 10/2/16.
*/
/**
* G E T A D D R E S S
*
* Try to get a valid address from the user.
*/
/**
* @namespace
* @property {object} results
* @property {object} results.response
* @property {number} results.response.index
* @property {string} results.response.entity
*/
var prompts = require("./../const/prompts");
var builder = require('botbuilder');
var Util = require('./../JdBotUtil');
const library = new builder.Library('getAddress');
library.dialog('/',
[
//Prompt for an address
function (session, args)
{
args = args || {};
if (!session.dialogData.hasOwnProperty("prompts"))
{
session.dialogData.prompts = {};
session.dialogData.prompts.prompt = args.prompt || prompts.askAddressFull;
session.dialogData.prompts.invalidPrompt = args.invalidPrompt || prompts.askAddressFullReprompt;
session.dialogData.prompts.repromptMax = args.repromptMax || 5;
session.dialogData.prompts.repromptsRemaining = args.repromptMax || 5;
session.dialogData.prompts.editChoice = args.editChoice || prompts.changeChoice;
session.dialogData.prompts.confirmChoice = args.confirmChoice || prompts.confirmChoice;
}
session.dialogData.prompts.reprompt = args.reprompt || false;
var prompt;
if (session.dialogData.prompts.reprompt)
{
prompt = session.dialogData.prompts.invalidPrompt;
session.dialogData.prompts.repromptMax--;
if (session.dialogData.prompts.repromptMax <= 0)
{
session.send(prompts.sayFullAddressIQuit);
session.endDialogWithResult({"status": "GIVEUP"});
}
}
else
{
prompt = session.dialogData.prompts.prompt;
}
builder.Prompts.text(session, prompt);
},
//Validate the address and see what we get back.
function (session, results, next)
{
var callback = function (session, response)
{
var parsedAddresses = response.addresses || [];
if (parsedAddresses.length === 0 || response.status == "ZERO_RESULTS" || parsedAddresses[0].hasCompleteCsz === false)
{
session.dialogData.prompts.reprompt = true;
session.replaceDialog("/", session.dialogData.prompts);
}
else if (parsedAddresses.length === 1)
{
var result = {"status": "OK", "response": parsedAddresses[0]};
result.response.userString = results.response;
next(result);
}
else
{
session.beginDialog("/choose", {parsedAddresses});
}
};
Util.gparseAddress(session, results.response, callback);
},
//Confirm address
function (session, results)
{
var address = results.response.fullAddress;
session.dialogData.address = results.response;
builder.Prompts.choice(session, address,
[session.dialogData.prompts.editChoice, session.dialogData.prompts.confirmChoice],
session.userData.config.PromptChoiceOptions);
},
//Did the human confirm the address or reject it?
function (session, results)
{
if (results.response.entity === session.dialogData.prompts.confirmChoice)
{
var result = {"status": "OK", "response": session.dialogData.address};
session.endDialogWithResult(result);
}
else
{
session.replaceDialog("/", session.dialogData.prompts);
}
}
]);
library.dialog("/choose",
function (session, args)
{
args = args || {};
console.log(args);
var addresses = args.parsedAddresses;
if (addresses)
{
//Select from list
session.dialogData.addresses = addresses;
var message = new builder.Message(session)
.attachmentLayout(builder.AttachmentLayout.carousel)
.attachments(addresses.map((addr) =>
new builder.HeroCard(session)
.title(prompts.sayDidYouMean)
.subtitle(addr.fullAddress)
.buttons([builder.CardAction.imBack(session, addr.fullAddress, prompts.sayUseThisAddress)])));
session.send(message);
}
else
{
//Process selected address
var address = session.message.text;
addresses = session.dialogData.addresses.map((addr) =>
addr.fullAddress);
var addressIdx = addresses.indexOf(address);
if (addressIdx === -1)
{
session.replaceDialog("/choose", {addresses});
}
else
{
//We got a good one
var result = {"status": "OK", "response": addresses[addressIdx]};
session.endDialogWithResult(result);
}
}
});
module.exports = library;