0
votes

I have implement a bot using Microsoft Bot builder SDK v-4 (pre-release). To manage the conversation flow I have used two simple dialogs-

GreetingDialog - DialogBegin: To greet the user first time

public Task DialogBegin(DialogContext dc, IDictionary<string, object> dialogArgs = null)
{
    var state = dc.Context.GetConversationState<EchoState>();
    string greetMessage = string.Format("Hi, I am {0}.", _botName);
    dc.Context.SendActivity(greetMessage);
    IList<CardAction> suggestedActions = new List<CardAction>
    {
        //some card action suggestions
    };
    var activity = MessageFactory.SuggestedActions(suggestedActions, text: "Please select the area of conversation.");
    dc.Context.SendActivity(activity);
    dc.End();
    return Task.CompletedTask;
}

ConversationDialog - DialogBegin: To continue the subsequent conversation after the user has been greeted

public Task DialogBegin(DialogContext dc, IDictionary<string, object> dialogArgs = null)
{
    string activity = "test";
    dc.Context.SendActivity(activity);
    dc.Continue();
    return Task.CompletedTask;
}

I am calling the GreetingDialog in the ConversationUpdate event and the ConversationDialog in the subsequent message received event, within the OnTurn method in my Bot class.

OnTurn event in my Bot class:

public async Task OnTurn(ITurnContext context)
{
    var state = context.GetConversationState<EchoState>();
    var dialogCtx = _dialogs.CreateContext(context, state);
    if (context.Activity.Type == ActivityTypes.ConversationUpdate)
    {
        //Greet user first time
        if (context.Activity.MembersAdded[0].Id == "default-user")
        {
            return;
        }
        if (!context.Responded)
        {
            var args = new Dictionary<string, object>
            {
                ["greetingArgs"] = context.Activity.Text
            };
            await dialogCtx.Begin("greetingDialog", args);
        }
    }
    else if (context.Activity.Type == ActivityTypes.Message)
    {
        await dialogCtx.Continue(); //this line is supposed to execute Begin the active dialog again??
        //if (!context.Responded)
        if(dialogCtx.ActiveDialog == null || !dialogCtx.Context.Responded)
        {
            var args = new Dictionary<string, object>
            {
                ["conversationArgs"] = context.Activity.Text
            };
            await dialogCtx.Begin("conversationDialog", args);
        }
    }
}

Using the above code, I get redirected to ConversationDialog but it only happens through await dialogCtx.Begin("conversationDialog", args);. Isn't it supposed to redirect to DialogBegin of the Active dialog when I do await dialogCtx.Continue();? I can see the Active dialog is 'conversationDialog' and the debugger steps over through await dialogCtx.Continue();. Any help with this please?

1

1 Answers

0
votes

I think I figured it out. We can implement the IDialogContinue interface for our Dialog class like this-

public class QnADialog : IDialog, IDialogContinue
{
    public Task DialogBegin(DialogContext dc, IDictionary<string, object> dialogArgs = null)
    {
        string activity = "test";
        dc.Context.SendActivity(activity);
        //dc.Continue();
        return Task.CompletedTask;
    }

    public Task DialogContinue(DialogContext dc)
    {
        dc.Context.SendActivity("dc continue");
        dc.Context.Responded = true;
        return Task.CompletedTask;
    }
}

Then we can use the DialogContinue method to handle the DialogContext.Continue() from the calling code.