Mazen Abu Taweelih
Mazen Abu Taweelih

Reputation: 647

Handling multiple dialogs in Microsoft bot framework

I am creating a bot using Microsoft bot framework , the bot will be receiving orders for a restaurant , I want to know how can I handle multiple dialogs , like for example the customer makes the first order , then i want the bot to ask do you want something else? then the customer says yes/no , incase of yes to repeat the same dailog again with keeping the state of the first one , what I am seeing in the documentation now is only one conversation and one dialog.

Thanks a lot

Upvotes: 15

Views: 12656

Answers (3)

Gnyasha
Gnyasha

Reputation: 684

The above answers are good but I noticed some of the links provided are no longer working. Here is how I managed to navigate among different dialogs

    public MakeChoiceDialog() : base (nameof(MakeChoiceDialog))
    {
        AddDialog(new ChoicePrompt(nameof(ChoicePrompt)));
        AddDialog(new LoginDialog());
        AddDialog(new SignUpDialog());

        AddDialog(new WaterfallDialog(nameof(WaterfallDialog), new WaterfallStep[]
            {
                LoginStepAsync,
                LoginSignUpStepAsync,
                //Other Steps here
            }));

        InitialDialogId = nameof(WaterfallDialog);
    }

The method call will be

    private async Task<DialogTurnResult> LoginSignUpStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
    {
        string userChoice = ((FoundChoice)stepContext.Result).Value;
        var msg = string.Empty;
        switch (userChoice)//You can use if statement here
        {
            case "Login":
                return await stepContext.BeginDialogAsync(nameof(LoginDialog), null, cancellationToken);
            default:                  
              return await stepContext.BeginDialogAsync(nameof(SignUpDialog), null, cancellationToken);
        }
        return await stepContext.EndDialogAsync(null, cancellationToken);
    }

In the Startup.cs add the following

services.AddSingleton<LoginDialog>();
services.AddSingleton<SignUpDialog>();

Upvotes: 0

Sandeep Kumar Mahala
Sandeep Kumar Mahala

Reputation: 63

With version V4 of Microsoft Bot Framework, FormFlow needs to be replaced by Waterfall Dialog. Here we can use stepContext.Values (dictionary) to maintain state across waterfall steps and present user with choice prompt for Yes or No response and then repeat the waterfall dialog in case of Yes response else end the dialog in last waterfall step.

Add below waterfall in constructor of your base Component dialog and repeat the waterfall as per user choice.

WaterfallStep[] myWaterfallDialog = new WaterfallStep[]
{ 
    this.waterfallStepToGetUserOrder,
    .......
    this.promptUserForChoiceStep,
    this.EndDialogStep
}
AddDialog(new WaterfallDialog("mydialog", myWaterfallDialog);

Upvotes: 1

Ezequiel Jadib
Ezequiel Jadib

Reputation: 14787

To manage multiple dialogs you need to use the Dialog Chains. You can either manage the stack of dialogs explicitly (using Call/Done) or implicitly using the Chain fluent methods. Here is sample of how to use it.

If the set of things that the user can select are already predefined I would then recommend using FormFlow. The Pizza & Sandwich samples are good examples of how to handle orders with a predefined set of options.

Upvotes: 15

Related Questions