1

I have 3 Dialogs, there is an InitialDialog, StepOneDialog and finally a EndDialog. Each Dialog invokes it's child by executing something like this:

await context.Forward(dialog, ResumeAfter, new Activity { }, CancellationToken.None);

This works perfectly locally, but there is an issue when I publish this. It just get's stuck in a loop and I think it's because the Dialog doesn't exit properly. The InitialDialog is inheriting a LuisDialog. I have this code for one of the methods:

[LuisIntent("")]
public async Task None(IDialogContext context, LuisResult result)
{

    // Create our response
    var response = $"Sorry I did not understand your question.";

    // Post our response back to the user
    await context.PostAsync(response);

    // Exit the application
    context.Done(this);
}

As you can see, I invoke context.Done(this) to exit the Dialog, but I am not sure if that is correct. In other examples, they seem to use context.Wait(MessageReceived);

My other Dialogs implement IDialog<object> so I can't invoke MessageReceived. So in that case, I have set up a method like this:

private async Task ResumeAfter(IDialogContext context, IAwaitable<object> result) => context.Done(this);

which I invoke like this:

private async Task GetAnswer(IDialogContext context, IAwaitable<string> result)
{

    // Get our quest
    var questions = _group.Questions;
    var length = questions.Count;
    var question = _group.Questions[_currentQuestion];
    var selectedAnswer = await result;

    // Assign our answer to our question
    foreach (var answer in question.Answers)
        if (answer.Text == selectedAnswer)
            question.Answer = answer;

    // If we have an answer, filter the products
    if (question.Answer != null)
        _productProvider.Score(await GetCurrentProducts(), _groups);

    // Increase our index
    _currentQuestion++;

    // If our current index is greater or equal than the length of the questions
    if (_currentQuestion == length)
    {

        // Create our dialog
        var dialog = _dialogFactory.CreateSecondStepDialog(_dialogFactory, _groupProvider, _questionProvider, _productProvider, await GetCurrentProducts());

        // Otherwise, got to the next step
        await context.Forward(dialog, ResumeAfter, new Activity { }, CancellationToken.None);
        return;
    }

    // Ask our next question
    await AskQuestion(context, null);
}

As you can see, the context.Forward passes the method as a Delegate and is executed after the child Dialog is created. Can someone tell me if I am doing this right? Or if I need to change something.

r3plica
  • 13,017
  • 23
  • 128
  • 290
  • 2
    Possible duplicate of [Terminate all dialogs and exit conversation in MS Bot Framework when the user types "exit", "quit" etc](http://stackoverflow.com/questions/39113403/terminate-all-dialogs-and-exit-conversation-in-ms-bot-framework-when-the-user-ty) –  Dec 13 '16 at 04:58
  • Don't agree with the duplicate: here the user is not looking for solitons to exit with a keyword, it should be done through normal dialog behaviors – Nicolas R Jan 30 '18 at 08:00

1 Answers1

0

In case forward to Luis dialog message from current dialog you can use:

var _message = context.MakeMessage();
_message.Text = "Custom user query";
await context.Forward(new MyRootLuisDialog(), MyRootLuisDialogComplete, _message);

In case open Luis (child) dialog you can use:

context.Call(new MyRootLuisDialog(), MyRootLuisDialogComplete); 

Callbacks example:

public virtual async Task MyRootLuisDialogComplete(IDialogContext context, IAwaitable<object> response)
{
    var _response = (MyDialogData)await response;
    ...
}

Child dialog exit:

...
context.Done(_dialogData); // type of _dialogData is MyDialogData
...
Bobahqwer
  • 71
  • 7