in lambda/fulfillment/lib/middleware/lexRouter.js [208:324]
async function processResponse(req, res, hook, msg) {
function indicateFailure(req, res, errmsg) {
let namespace = _.get(res,'session.qnabotcontext.elicitResponse.namespace', undefined);
if (namespace) {
_.set(res.session,namespace + '.boterror','true');
}
_.set(res,'session.qnabotcontext.elicitResponse.progress','Failed');
_.set(res,'session.qnabotcontext.elicitResponse.responsebot',undefined);
_.set(res,'session.qnabotcontext.elicitResponse.namespace',undefined);
_.set(res,'session.qnabotcontext.elicitResponse.loopCount',0);
res.card = undefined;
let chainingConfig = _.get(res,'session.qnabotcontext.elicitResponse.chainingConfig',undefined);
if (chainingConfig === undefined) {
res.message = errmsg;
res.plainMessage = errmsg;
}
}
const maxElicitResponseLoopCount = _.get(req, '_settings.ELICIT_RESPONSE_MAX_RETRIES', 5);
const elicit_Response_Retry_Message = _.get(req, '_settings.ELICIT_RESPONSE_RETRY_MESSAGE', "Please try again.");
let botResp = await handleRequest(req, res, hook, "live");
qnabot.log("botResp: " + JSON.stringify(botResp,null,2));
var plainMessage = botResp.message;
var ssmlMessage = undefined;
// if messsage contains SSML tags, strip tags for plain text, but preserve tags for SSML
if (plainMessage && plainMessage.includes("<speak>")) {
ssmlMessage = botResp.message ;
plainMessage = plainMessage.replace(/<\/?[^>]+(>|$)/g, "");
}
let elicitResponseLoopCount =_.get(res,"session.qnabotcontext.elicitResponse.loopCount", 0);
if (botResp.dialogState === 'ConfirmIntent') {
_.set(res,'session.qnabotcontext.elicitResponse.progress','ConfirmIntent');
res.plainMessage = plainMessage;
// if SSML tags were present and client supports SSML then build SSML response
if (ssmlMessage && req._preferredResponseType == "SSML") {
res.type = "SSML";
res.message = ssmlMessage;
} else {
res.message = plainMessage;
}
res.card = {
"send": true,
"title": "Info",
"buttons": [
{
"text": "Yes",
"value": "Yes"
},
{
"text": "No",
"value": "No"
}
]
};
} else if (botResp.dialogState === 'Failed') {
_.set(res,'session.qnabotcontext.elicitResponse.loopCount',++elicitResponseLoopCount);
if (elicitResponseLoopCount >= maxElicitResponseLoopCount) {
indicateFailure(req, res, _.get(req, '_settings.ELICIT_RESPONSE_BOT_FAILURE_MESSAGE', 'Your response was not understood. Please start again.'));
} else {
_.set(res,'session.qnabotcontext.elicitResponse.progress','ErrorHandling');
res.message = elicit_Response_Retry_Message;
res.plainMessage = elicit_Response_Retry_Message;
res.card = undefined;
}
} else if (botResp.dialogState === 'ElicitIntent' || botResp.dialogState === 'ElicitSlot') {
_.set(res,'session.qnabotcontext.elicitResponse.progress',botResp.dialogState);
if (botResp.message) {
res.message = botResp.message;
res.plainMessage = botResp.message;
} else {
res.message = elicit_Response_Retry_Message;
res.plainMessage = elicit_Response_Retry_Message;
}
res.card = undefined;
} else if (botResp.dialogState === 'Fulfilled' || botResp.dialogState === 'ReadyForFulfillment' || botResp.dialogState === 'Close') {
if (botResp.message) {
res.message = botResp.message;
res.plainMessage = botResp.message;
} else {
res.message = undefined;
res.plainMessage = undefined;
}
_.set(res,'session.qnabotcontext.elicitResponse.progress',botResp.dialogState);
_.set(res.session,res.session.qnabotcontext.elicitResponse.namespace,botResp.slots);
_.set(res,'session.qnabotcontext.elicitResponse.responsebot',undefined);
_.set(res,'session.qnabotcontext.elicitResponse.namespace',undefined);
} else {
if (botResp.message) {
res.message = botResp.message;
res.plainMessage = botResp.message;
} else {
res.message = elicit_Response_Retry_Message;
res.plainMessage = elicit_Response_Retry_Message;
}
_.set(res,'session.qnabotcontext.elicitResponse.progress',botResp.dialogState);
}
// as much as we'd like to return an empty message, QnABot semantics requires some message to
// be returned.
res.message = res.message ? res.message : _.get(req, '_settings.ELICIT_RESPONSE_DEFAULT_MSG', 'Ok. ');
res.plainMessage = res.plainMessage ? res.plainMessage : _.get(req, '_settings.ELICIT_RESPONSE_DEFAULT_MSG', 'Ok. ');
// autotranslate res fields
res = await translate_res(req,res);
// set res.session.qnabot_gotanswer
_.set(res,'session.qnabot_gotanswer',true) ;
const resp = {};
resp.req = req;
resp.res = res;
return resp;
}