async function processResponse()

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;
    }
}