user6269864
user6269864

Reputation:

How to schedule tasks in Microsoft Bot Framework + C#?

I am building a test bot using Microsoft's Bot Framework / Bot Builder for C#.NET / LUIS. It is deployed on Azure. The idea for my test project is to send a reminder to the user.

For example, when the user asks "remind me in two hours to buy milk", it should initiate a conversation or send a reply to the existing conversation in two hours.

I have no problem parsing natural language into date and task using LUIS, however I have no idea how to schedule a task so that the framework would somehow send a reply to the user later on.

I've read the docs and checked the examples at https://docs.botframework.com/en-us/csharp/builder/sdkreference/, and also searched on StackOverflow, but it seems that the framework doesn't support it. I've also looked at Azure Scheduler, but it seems insanely expensive, even if my bot would only have 100 users with one scheduled task each.

What is another way to schedule tasks so that the bot sends a message to the user at an appointed time?

Upvotes: 4

Views: 6302

Answers (2)

user6269864
user6269864

Reputation:

Quartz.NET seems to be a popular solution for scheduling tasks. It can store them in a database in Azure.

Upvotes: 1

Kien Chu
Kien Chu

Reputation: 4895

So if I understand correctly, your question involves two parts:

1. How to start a conversation

In v3.0, MS introduced a new way to start a new conversation (group or 1-on-1). Reference: https://docs.botframework.com/en-us/csharp/builder/sdkreference/routing.html#conversation

Sample code:

var connector = new ConnectorClient(incomingMessage.ServiceUrl);
var ConversationId = await connector.Conversations.CreateDirectConversationAsync(incomingMessage.Recipient, incomingMessage.From);
IMessageActivity message =  Activity.CreateMessageActivity();
message.From = botChannelAccount;
message.Recipient = new ChannelAccount() { name: "Larry", "id":"@UV357341"};
message.Conversation = new ConversationAccount(id: ConversationId.Id);
message.Text = "Hello";
message.Locale = "en-Us";
var reply = await connector.Conversations.ReplyToActivityAsync(message);

2. How to schedule a job

There are multiple ways of doing it, you can use an external queue service, Azure web jobs, web roles, or try to register in the ASP.NET itself.

Hangfire (http://hangfire.io/) is what I'm using for my bot.

Code sample:

BackgroundJob.Schedule(
() => TriggerConversation(), // <= the start conversation code here
TimeSpan.FromDays(1)); // <= when the job should be ran

Upvotes: 15

Related Questions