in lambda/fulfillment/lib/middleware/specialtyBotRouter.js [278:351]
async function processResponse(req, res, hook, alias) {
qnabot.log('specialtyBotRouter request: ' + JSON.stringify(req, null, 2));
qnabot.log('specialtyBotRouter response: ' + JSON.stringify(res, null, 2));
const welcomeBackMessage = _.get(req._settings, 'BOT_ROUTER_WELCOME_BACK_MSG', 'Welcome back to QnABot.');
const exitResponseDefault = _.get(req._settings, 'BOT_ROUTER_EXIT_MSGS', 'exit,quit,goodbye,leave');
let exitResponses = exitResponseDefault.split(',');
exitResponses.map(entry => entry.trim());
let currentUtterance = req.question.toLowerCase();
qnabot.log(`current utterance: ${currentUtterance}`);
qnabot.log('exit responses are: ' + JSON.stringify(exitResponses,null,2));
if (_.indexOf(exitResponses, currentUtterance)>=0) {
qnabot.log('user provided exit response given');
let resp = endUseOfSpecialtyBot(req, res, welcomeBackMessage);
resp.res = await translate_res(resp.req, resp.res);
qnabot.log("returning resp for user requested exit: " + JSON.stringify(resp,null,2));
return resp;
} else {
let botResp = await handleRequest(req, res, hook, alias);
qnabot.log("specialty botResp: " + JSON.stringify(botResp, null, 2));
let lexBotIsFulfilled = false;
if (botResp.message || _.get(botResp,'dialogState', "") === 'ReadyForFulfillment') {
if (_.get(botResp,'dialogState', "") === 'ReadyForFulfillment') {
botResp.message = JSON.stringify(botResp.slots,null,2);
lexBotIsFulfilled = true;
}
let ssmlMessage = undefined;
if (botResp.sessionAttributes && botResp.sessionAttributes.appContext) {
const appContext = ( isString(botResp.sessionAttributes.appContext) ? JSON.parse(botResp.sessionAttributes.appContext) : botResp.sessionAttributes.appContext);
// if alt.messsages contains SSML tags setup to return ssmlMessage
if (appContext && _.has(appContext,'altMessages.ssml') && appContext.altMessages.ssml.includes("<speak>")) {
ssmlMessage = appContext.altMessages.ssml;
}
_.set(res.session, "appContext.altMessages", appContext.altMessages);
}
_.set(res, "session.qnabotcontext.specialtySessionAttributes", botResp.sessionAttributes);
_.set(res, "message", botResp.message);
_.set(res, "plainMessage", botResp.message);
_.set(res, "messageFormat", botResp.messageFormat);
if (_.get(botResp,'responseCard')) {
qnabot.log("found a response card. attached to res. only one / first response card will be used");
if (botResp.responseCard.genericAttachments[0].subTitle === null) botResp.responseCard.genericAttachments[0].subTitle = '';
if (botResp.responseCard.genericAttachments[0].attachmentLinkUrl === null) botResp.responseCard.genericAttachments[0].attachmentLinkUrl = '';
if (botResp.responseCard.genericAttachments[0].imageUrl === null) botResp.responseCard.genericAttachments[0].imageUrl = '';
_.set(res, "result.r", botResp.responseCard.genericAttachments[0]);
_.set(res, "card", botResp.responseCard.genericAttachments[0]);
_.set(res, "card.send", true);
qnabot.log(`res is ${JSON.stringify(res,null,2)}`);
}
if (ssmlMessage && req._preferredResponseType === "SSML") {
res.type = "SSML";
res.message = ssmlMessage;
}
const isFromQnABot = _.has(botResp, 'sessionAttributes.qnabot_gotanswer');
if (_.get(botResp,'dialogState', "") === 'Fulfilled' && !isFromQnABot) {
lexBotIsFulfilled = true;
}
if (botResp.sessionAttributes.QNABOT_END_ROUTING || lexBotIsFulfilled) {
qnabot.log("specialtyBot requested exit");
let resp = endUseOfSpecialtyBot(req, res, undefined);
resp.res = await translate_res(resp.req, resp.res);
return resp;
}
}
// autotranslate res fields
res = await translate_res(req, res);
const resp = {};
resp.req = req;
resp.res = res;
return resp;
}
}