Невозможно использовать метод CancelAllDialogsAsyn c в методе Onturnasyn c - PullRequest
0 голосов
/ 27 января 2020

У меня бот сделан с использованием framework v4 с использованием c#. Я включил в него функцию luis для выхода, в моем боте, когда пользователь вводит текст, он уберет вас из разговора, и весь бот начнет работать. В моем случае бот может выйти, но не может начать существовать. Я думал, что могу использовать метод CancelallDialogAsyn c, но я не могу сделать его доступным в методе onturnasyn c, где я написал код для функции выхода.

public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
    {
        var activity = turnContext.Activity;
       // var activity = turnContext.Activity;
        var recognizerResult = await _botServices.Dispatch.RecognizeAsync(turnContext, cancellationToken);

        // Top intent tell us which cognitive service to use.
        var topIntent = recognizerResult.GetTopScoringIntent();

        var attachments = new List<Attachment>();
        var reply = MessageFactory.Attachment(attachments);
        reply.AttachmentLayout = AttachmentLayoutTypes.Carousel;


        // First, we use the dispatch model to determine which cognitive service (LUIS or QnA) to use.

        if (string.IsNullOrWhiteSpace(activity.Text) && activity.Value != null)
        {
            activity.Text = JsonConvert.SerializeObject(activity.Value);
        }
        if (turnContext.Activity.Text == "Yes")
        {

            await turnContext.SendActivityAsync($"Good bye. I will be here if you need me. ", cancellationToken: cancellationToken);
            await turnContext.SendActivityAsync($"Say Hi to wake me up.", cancellationToken: cancellationToken);
        }
        else  if (topIntent.intent == "OrderStatusintent")
            {
                reply.Attachments.Add(Cards.GetHeroCard6().ToAttachment());
                await turnContext.SendActivityAsync(reply, cancellationToken);
            }
        else if (topIntent.intent == "Exitintent")
        {
            await turnContext.SendActivityAsync($"Good bye. Say Hi if you need more help.", cancellationToken: cancellationToken);

        }

        else if (activity.ChannelId != "webchat")
        {
            await base.OnTurnAsync(turnContext, cancellationToken);
        }
        await ConversationState.SaveChangesAsync(turnContext, false, cancellationToken);
        await UserState.SaveChangesAsync(turnContext, false, cancellationToken);
    }

1 Ответ

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

Мне немного трудно следить за работой бота, но я считаю, что вам нужен диалог контекст. Моя структура бота отличается от вашей, но у меня есть функция onMessage, которая вызывает моего диспетчера намерений и передает turnContext. Я использую DialogSet (из botbuilder-dialogs) для создания контекста диалога через (nodejs)

this.dialogs = new DialogSet(this.dialogState) // in constructor

const dc = await this.dialogs.createContext(turnContext) // in function called from onMessage

await dc.cancelAllDialogs(); // from wherever I want to cancel

. Я не вижу нигде, где вы создали контекст диалога, поэтому, возможно, вы невозможно вызвать этот метод из вашего обработчика onTurn. Это может быть возможно, но везде, где я называю cancelAllDialogs(), это либо из этого диалогового контекста, либо из диалогового окна водопада. Я использую контекст шага и отменяю на родительском уровне через stepContext.parent.cancelAllDialogs().

...