Microsoft Bot Framework — добавление индикатора "пишет ответ" в чат-бот

В чат-бот можно передавать событие "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 бывает полезно, но не в данном случае.

Результат работы будет следующий.

Событие Typing в чат-ботах. Пользователь пишет ответ.

Если ваши запросы обрабатываются очень долго, то можно отправлять данное событие несколько раз. Если наоборот — очень быстро и вы хотите замедлить это, то вы всегда можете добавить задержку через Task.Delay

Помимо "Typing" класс ActivityTypes сожержит еще множество значений, которые можно использовать. Вот список наиболее распространённых:

  • Message — обычное сообщение, оно создано для передачи сообщений между ботом и пользователем.
  • ContactRelationUpdate — указывает что чат-бот был добавлен или удалён из списка контактов пользователя.
  • ConversationUpdate — кто-то был добавлен в беседу или поменялись мета данные беседы.
  • Typing — указывает что кто-то пишет ответ. Именно то, о чем говорили выше.
  • Ping — попытка определить, доступна ли конечная точка для связи с ботом.
  • EndOfConversation — указывает, что беседа была завершена.
  • Event — сообщение отпра��ленное чат-боту, которое не отображается пользователю.
  • DeleteUserData — указывает боту что пользователь запросил удалить все данные о нём которые имеются.
  • MessageUpdate, MessageDelete — обновление и удаление сообщения
  • InstallationUpdate — чат-бот добавлен или удалён из канала.

Это всё, что я хотел здесь показать. Создавайте удобные чат-боты используя Bot Framework, при возникновении сложных вопросов пишите в Issues Bot Builder SDK, либо можете присылать их мне.

Приятного программирования.

Добавить комментарий