как TurnContext Respond работает с помощью Waterfalldialogs?

У меня проблема с моим методом TaskOnTurn. Когда я запускаю бота, он отправляет приветственное сообщение и запускается новый диалог из-за

if(!turnContext.Responded)

Теперь, пока im находится в диалоговом окне, он снова переходит к последнему оператору if, и запускается новый диалог, в то время как im уже находится в одном. Как работает! TurnContext.Responded? Затем я попытался запустить диалог в if (turnContext.Activity.MembersAdded! = Null) в await SendWecomeMessage. Это не сработало. Затем он отправил 1 приветственное сообщение и запустил 2 диалога. Это меня тоже смутило.

public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (turnContext == null)
            {
                throw new ArgumentNullException(nameof(turnContext));
            }

            var activity = turnContext.Activity;
            var dc = await _dialogs.CreateContextAsync(turnContext, cancellationToken);
            if (turnContext.Activity.Type == ActivityTypes.Message)
            {
                await dc.ContinueDialogAsync(cancellationToken);
            }
            else if (turnContext.Activity.Type == ActivityTypes.ConversationUpdate)
            {
                if (turnContext.Activity.MembersAdded != null)
                {
                    await SendWelcomeMessageAsync(turnContext, cancellationToken);
                }
            }
            else
            {
                await turnContext.SendActivityAsync($"{turnContext.Activity.Type} event detected", cancellationToken: cancellationToken);
            }

            if (!turnContext.Responded)
            {
                await dc.BeginDialogAsync(ReservationDialog, cancellationToken);
            }
        }

person Max Rowe    schedule 27.02.2019    source источник


Ответы (1)


указывает, был ли отправлен хотя бы один ответ для текущего хода. OnTurnAsync запускается между каждым шагом Waterfall, поэтому, если ReservationDialog имеет приглашение, как только пользователь отвечает на приглашение, запускается OnTurnAsync, а поскольку бот не ответил в рамках этого StepContext, TurnContext.Responded равно false. Вот почему вы получаете диалог в середине другого диалога.

В пределах OnTurnAsync можно пройти МНОГО разных маршрутов. Я определенно рекомендую ознакомиться с некоторыми из примеров, чтобы узнать, как они что-то делают - большинство из них довольно хорошо комментируются.

public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
{
    var activity = turnContext.Activity;

    var dc = await Dialogs.CreateContextAsync(turnContext);

    // Execute on incoming messages
    if (activity.Type == ActivityTypes.Message)
    {
        if (string.IsNullOrWhiteSpace(activity.Text) && activity.Value != null)
        {
            activity.Text = JsonConvert.SerializeObject(activity.Value);
        }
    }

    var dialogResult = await dc.ContinueDialogAsync();

    // Execute based on different situations within a Dialog. See BasicBot for examples:
    // https://github.com/Microsoft/BotBuilder-Samples/blob/master/samples/csharp_dotnetcore/13.basic-bot/BasicBot.cs#L112
    if (!dc.Context.Responded)
    {
        switch (dialogResult.Status)
        {
            case DialogTurnStatus.Empty:
            case DialogTurnStatus.Waiting:
                break;
            case DialogTurnStatus.Complete:
                await dc.EndDialogAsync();
                break;
            default:
                await dc.CancelAllDialogsAsync();
                break;

        }
    }

    // Here's where we show welcome messages
    if (activity.Type == ActivityTypes.ConversationUpdate)
    {
        if (activity.MembersAdded != null)
        {
            foreach (var member in activity.MembersAdded)
            {
                // This makes sure the new user isn't the bot. It's a little different from some of the samples
                // because code has changed in the SDK and emulator
                if (member.Name != "Bot" && member.Name != null)
                {
                    await SendWelcomeMessageAsync(turnContext, cancellationToken);
                    await dc.BeginDialogAsync(ReservationDialog, cancellationToken);
                }
            }
        }
    }

    // Be sure you're saving ConversationState at the end since DialogContext derives from it
    await _conversationState.SaveChangesAsync(turnContext);
}
person mdrichardson    schedule 27.02.2019