BotFramework v4. NET SDK: индикатор набора текста отправки не работает должным образом - PullRequest
0 голосов
/ 03 февраля 2020

Использование. 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);
    }

Индикатор набора текста отображается для первого пользователя, но затем не появляется снова для следующих ответов.

Какое может быть решение? Спасибо!

1 Ответ

0 голосов
/ 04 февраля 2020

Я нашел решение.

Мы должны использовать dialogContext вместо turnContext .

В OnTurnAsyn c функция, используйте это:

DialogContext dc = await dialogs.CreateContextAsync(turnContext, cancellationToken);
Activity replyTyping = turnContext.Activity.CreateReply();
replyTyping.Type = ActivityTypes.Typing;
await dc.Context.SendActivityAsync(replyTyping);
await Task.Delay(3000);
...