В чат-бот можно передавать событие "Typing"(получать от пользователя тоже), которое служит индикатором того, что пользователь/чат-бот печатает сообщение. Данная возможность бывает полезна, когда ваш чат-бот должен выполнить какую-то длительную операцию, например, получить данные со стороннего сервиса. В таком случае вы можете не просто заставить пользователя ждать ответ, а позволить ему увидеть, что идёт процесс его набора, как было бы если бы он общался с реальным человеком.
У пользователя @deepumi возникла проблема с которой я пытался ему помочь. Почему-то оказалось, что все примеры передачи данного индикатора были связаны с созданием нового ConnectorClient и использования его для передачи. При этом у многих вылезали новые проблемы.
Код, при этом был, примерно таким:
internal static async Task ShowTypingEvent(IDialogContext context)
{
if (!(context.Activity is Activity activity)) return;
var connector = new ConnectorClient(new Uri(activity.ServiceUrl));
var reply = activity.CreateReply();
reply.Text = null;
reply.Type = ActivityTypes.Typing;
await connector.Conversations.ReplyToActivityAsync(reply);
}
Но использование ConnectorClient
здесь не обязательно и даже излишне! Ведь можно использовать следующих подход:
internal async Task ShowTypingEvent(IDialogContext context)
{
if (!(context.Activity is Activity activity)) return;
var reply = activity.CreateReply();
reply.Text = null;
reply.Type = ActivityTypes.Typing;
await context.PostAsync(reply);
}
И всё. Создавать новый ConnectorClient
бывает полезно, но не в данном случае.
Результат работы будет следующий.
Если ваши запросы обрабатываются очень долго, то можно отправлять данное событие несколько раз. Если наоборот — очень быстро и вы хотите замедлить это, то вы всегда можете добавить задержку через Task.Delay
Помимо "Typing" класс ActivityTypes
сожержит еще множество значений, которые можно использовать. Вот список наиболее распространённых:
Message
— обычное сообщение, оно создано для передачи сообщений между ботом и пользователем.
ContactRelationUpdate
— указывает что чат-бот был добавлен или удалён из списка контактов пользователя.
ConversationUpdate
— кто-то был добавлен в беседу или поменялись мета данные беседы.
Typing
— указывает что кто-то пишет ответ. Именно то, о чем говорили выше.
Ping
— попытка определить, доступна ли конечная точка для связи с ботом.
EndOfConversation
— указывает, что беседа была завершена.
Event
— сообщение отправленное чат-боту, которое не отображается пользователю.
DeleteUserData
— указывает боту что пользователь запросил удалить все данные о нём которые имеются.
MessageUpdate, MessageDelete
— обновление и удаление сообщения
InstallationUpdate
— чат-бот добавлен или удалён из канала.
Это всё, что я хотел здесь показать. Создавайте удобные чат-боты используя Bot Framework, при возникновении сложных вопросов пишите в Issues Bot Builder SDK, либо можете присылать их мне.
Приятного программирования.