Использование. NET SDK BotFramework v4. Я пытаюсь добавить индикатор ввода для каждого ответа от бота.
1) Первый метод:
var reply = MessageFactory.Attachment(attachments);
reply.AttachmentLayout = AttachmentLayoutTypes.Carousel;
reply.Type = ActivityTypes.Typing;
await turnContext.SendActivityAsync(reply, cancellationToken);
Также пробовал:
var typingMsg = stepContext.Context.Activity.CreateReply();
typingMsg.Type = ActivityTypes.Typing;
typingMsg.Text = "some text";
await stepContext.Context.SendActivityAsync(typingMsg);
Но для обоих , бот просто отвечает индикатором набора текста, без текста, и продолжает посылать его бесконечно l oop без остановки
2) Второй метод: я использовал ShowTypingMiddleware
public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default)
{
CancellationTokenSource cts = null;
if (turnContext.Activity.Type == ActivityTypes.Message)
{
cts = new CancellationTokenSource();
cancellationToken.Register(() => cts.Cancel());
var task = Task.Run(() => SendTypingAsync(turnContext, _delay, _period, cts.Token), cancellationToken);
DialogContext dc = await dialogs.CreateContextAsync(turnContext, cancellationToken);
// Continue any current dialog.
DialogTurnResult dialogTurnResult = await dc.ContinueDialogAsync();
var conversationStateAccessors = ConversationState.CreateProperty<ConversationData>(nameof(ConversationData));
var conversationData = await conversationStateAccessors.GetAsync(turnContext, () => new ConversationData());
if (conversationData != null)
{
var messageTimeOffset = (DateTimeOffset)turnContext.Activity.Timestamp;
var localMessageTime = messageTimeOffset.ToLocalTime();
conversationData.Timestamp = localMessageTime.ToString();
conversationData.ChannelId = turnContext.Activity.ChannelId.ToString();
}
var dialogsExist = dialogs.GetDialogs();
// First, we use the dispatch model to determine which cognitive service (LUIS or QnA) to use.
var recognizerResult = await _botServices.Dispatch.RecognizeAsync(turnContext, cancellationToken);
// Top intent tell us which cognitive service to use.
var (intent, _) = recognizerResult.GetTopScoringIntent();
// Next, we call the dispatcher with the top intent.
await DispatchToTopIntentAsync(turnContext, dc, intent, recognizerResult, cancellationToken);
}
if (cts != null)
{
cts.Cancel();
}
await _accessors.ConversationState.SaveChangesAsync(turnContext, false, cancellationToken);
}
Индикатор набора текста отображается для первого пользователя, но затем не появляется снова для следующих ответов.
Какое может быть решение? Спасибо!