async function processResponse()

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