Как stepContext.prompt () выполняется и автоматически переходит к следующему шагу в waterfallDialog с помощью BotFramework SDK V4 NodeJS - PullRequest
0 голосов
/ 05 ноября 2019

Я использую Microsoft BotBuilder V4 NodeJs SDK для разработки ботов. Я столкнулся с проблемой, когда я вспоминаю диалог с водопадом. Внутри один из асинхронных step () - я вызываю call для prompt (), который имеет тип textPrompt. Вот что я столкнулся с проблемой: На первом начальном цикле выполнения диалога водопада - prompt () работает надлежащим образом. Но при втором вызове того же диалогового окна с водопадом - prompt () не ожидает ввода текста пользователем. Вместо этого он автоматически перемещается к следующему асинхронному шагу ().

Как перейти к следующему асинхронному шагу () в диалоговом окне водопада, не отправляя еще одно сообщение боту?

 const { ComponentDialog, TextPrompt, WaterfallDialog } = 
 require('botbuilder-dialogs');
 const { CardFactory, ActionTypes } = require('botbuilder');
 const initialId = 'Main_Dialog';
 const MAIN_WATERFALL_DIALOG = 'mainDWaterfallDialog';
class Main_Dialog extends ComponentDialog {
constructor(conversationState, userState, luisApplication, luisPredictionOptions) {
    super('Main_Dialog');

    this.luisRecognizer = new LuisRecognizer(luisApplication, luisPredictionOptions, true);

    this.conversationData = conversationState.createProperty("mainDialog");
    this.userProfile = userState.createProperty("mainDialog");

    // Create our bot's dialog set, adding a main dialog and their component dialogs.
    this.addDialog(new TextPrompt('PromptTextPrompt', this.waitForUserPromptValidator))
        .addDialog(new MyAdaptiveBot('MyAdaptiveBot'))
        .addDialog(new Welcome_C_Dialog('Welcome_C_Dialog'))
        .addDialog(new WaterfallDialog(MAIN_WATERFALL_DIALOG, [
            this.introStep.bind(this),
            this.actStep.bind(this),
            this.finalStep.bind(this)
        ]));

    this.initialDialogId = MAIN_WATERFALL_DIALOG;
    this.query_flag = false;
    this.process_flag = false;
}


async run(turnContext, accessor) {
    const dialogSet = new DialogSet(accessor);
    dialogSet.add(this);

    const dialogContext = await dialogSet.createContext(turnContext);
    const results = await dialogContext.continueDialog();
    if (results.status === DialogTurnStatus.empty) {
        await dialogContext.beginDialog(this.id);
    }
}

async introStep(stepContext) {
    if (this.recognizer !== undefined) {
        throw new Error('[MainDialog]: LUIS LuisRecognizer not configured properly');
    }

    return await stepContext.prompt('PromptTextPrompt', 'What can I do for you?', {retryPrompt: 'Sorry, please submit your adverse event case. Otherwise, say cancel.'});
}


async actStep(stepContext) {


        const luisResult = await this.luisRecognizer.recognize(stepContext.context);
        let switch_case = LuisRecognizer.topIntent(luisResult);

        switch (switch_case) {
            case "Greetings":
                // await turnContext.sendActivity(`Welcome to AECaseBuilder!`);
                this.query_flag = true;    // set - true query_flag
                await stepContext.beginDialog('Welcome_C_Dialog');
                break;

            case "Enquiry":
                //const user_inp = turnContext.activity.text;
                await stepContext.beginDialog('MyAdaptiveBot', null);
                this.query_flag = false;    // reset query_flag
                break;


            default:
                // Catch all for unhandled intents
                break;
        }

    return await stepContext.next();
}

async finalStep(stepContext) {

    // Restart the main dialog with a different message the second time around
    const messageText = "Whats else can I do for you?";
    return await stepContext.replaceDialog(this.initialDialogId, { restartMsg: messageText });
}
async waitForUserPromptValidator(promptContext){
    console.log(`prompt : ${promptContext.recognized.value}`);
    if(promptContext.recognized.value.trim() === ''){
            return false;
    }
    return true;
}
}

module.exports.Main_Dialog = Main_Dialog;




 //@File: Welcome_C_Dialog

 const { ComponentDialog, TextPrompt, WaterfallDialog } = require('botbuilder-dialogs');
 const { CardFactory, ActionTypes } = require('botbuilder');

 const initialId = 'Welcome_C_Dialog';
 const welcomeCard = require('./resources/welcome_acb.json');

 class Welcome_C_Dialog extends ComponentDialog {
    /**
     * 
     * @param {*} id
     * @method - constructor()
     * @returns - void 
     */
   constructor(id){
           super(id);

           // ID of the child dialog that should be started anytime the component is started.
           this.initialDialogId = initialId;

           // Define the prompts used in this conversation flow.
           this.addDialog(new TextPrompt('textPrompt', this.waitForInputValidator));

           // Define the conversation flow using a waterfall model.
           this.addDialog(new WaterfallDialog(initialId,[
                       // dialog steps
                       async function(step){
                               // Clear the case information and prompt for user to submit new case intake.
                               step.values.caseInfo = {};
                               await step.context.sendActivity({
                                   text: "",
                                   attachments: [CardFactory.adaptiveCard(welcomeCard)]
                               });

                            //    return await step.prompt('textPrompt', 'Waiting for your case intake...',{ 
                            //            retryPrompt: 'Sorry, please submit your case for AECaseBuilder or say cancel.'
                            //    });
                            //    return MyAdaptiveDialog.EndOfTurn;
                               return await step.endDialog();
                       }/*, 
                       async function(step){
                               await step.context.sendActivity('received case...');
                               const resultValue = step.result;
                               //console.log(` input text: ${resultValue}`);
                               step.values.caseInfo.inputText = resultValue;

                               return await step.endDialog({inputText: resultValue});
                       }*/
           ]));

   }

   /**
    * 
    * @param {*} promptContext 
    * @method waitForInputValidator()
    * @returns true if case input received successfully. Otherwise, returs false.
    */
   async waitForInputValidator(promptContext){
           //console.log(`prompt : ${promptContext.recognized.value}`);
            if(promptContext.recognized.value.trim() === ''){
                    return false;
            }
            return true;
   }
}

exports.Welcome_C_Dialog = Welcome_C_Dialog;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...