Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I give a delayed response in Microsoft Bot Framework

I am using Microsoft Bot Framework FormFlow to get a user to complete a form. Having completed it that Dialog ends and the method specified for the ResumeWith parameter (in this case quoteComplete) is executed:

var quoteForm = new FormDialog<Quote>(new Quote(), 
    quoteFormBuilder.BuildForm, FormOptions.PromptInStart);

context.Call<Quote>(quoteForm, quoteComplete);

In quoteComplete I want the bot to tell the user that it is getting a quote and that it may takes a few seconds. An async call to perform the quote is then done and on it's return I want the bot to show another message with the value of the quote:

await context.PostAsync("I will now calculate your quote. I won't be long...");
context.Wait(MessageReceived);

//Simulate getting the quote
Task.Delay(5000).ContinueWith(t =>
{
    context.PostAsync("Your quote is £133.54");
});

I also tried following advice in the documentation for sending multiple replies by putting this in the Delay().ContinueWith:

var message = context.MakeMessage();
message.Text = "Your quote is for £133.54";
var connector = new ConnectorClient();
connector.Messages.SendMessage(message);

However I get an Access Denied error for this.

like image 348
Jason Steele Avatar asked May 15 '16 20:05

Jason Steele


People also ask

How do you end a conversation in bot framework?

endDialogAsync() ends the current dialog on the stack returning control to the parent dialog, if present, or to the turn handler. Additionally, it can be called from anywhere the dialog context is accessible. Best practice is to call it at the end of every dialog.

What is prompt in bot framework?

The prompt is used whenever a bot needs input from the user. You can use prompts to ask a user for a series of inputs by chaining the prompts. In this article, we will understand how to use prompts and how you can use them to collect information from the users.


1 Answers

Try instantiating the client in the following way

using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, message))
{
     var client = scope.Resolve<IConnectorClient>();
     client.Messages.SendMessage(message);
}
like image 136
Ezequiel Jadib Avatar answered Nov 14 '22 23:11

Ezequiel Jadib