Как я могу управлять диалоговым окном Microsoft Bot Framework, чтобы повторять последовательность диалогов, начиная сначала или переходя на определенный шаг? - PullRequest
1 голос
/ 30 мая 2019

Когда начинается диалог с ботом, кажется, что он идет по пути, т.е. 1 2 3 4. Я бы хотел в точке 2 как таковой вернуться к метке пути 1 и начать процесс заново или даже потенциально перейти к маркеру.2 из 3, чтобы переадресовать / ответить на маркер 2 снова ...

Я попытался сделать это с помощью оператора if (== "Pittsburgh"), который возвращается к предыдущему методу, но я замечаю, что черезэмулятор бота движется независимо от переадресации предыдущего метода.

Короче говоря, я спрашиваю, как пройти через waterfalldialog и вернуться к любой точке диалога, которую я выберу, основываясь на результатах разговора с ответами бота и luis.То есть, если я перехожу с 1 на 5, а на 3 мне нужно начинать сначала, как я могу настроить waterfalldialog, чтобы конкретно это сделать?Проблема, с которой я столкнулся, заключается в том, что, хотя я вызываю предыдущий метод в цепочке диалогов, он официально не начинается с этого метода, вызываемого и далее.Это моя забота конкретно.

       private async Task<DialogTurnResult> DestinationStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            var bookingDetails = (BookingDetails)stepContext.Options;

            if (bookingDetails.Destination == null)
            {
                return await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions { Prompt = MessageFactory.Text("Where would you like to travel to Christian?") }, cancellationToken);
            }
            else
            {
                Console.WriteLine("testing christian" + bookingDetails);
                return await stepContext.NextAsync(bookingDetails.Destination, cancellationToken);
            }
        }

        private async Task<DialogTurnResult> OriginStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            Console.WriteLine("testing paul");
            var bookingDetails = (BookingDetails)stepContext.Options;

            //await LuisHelper.ExecuteLuisQuery(Configuration, Logger, stepContext.Context, cancellationToken);

            if ((string)stepContext.Result == "Pittsburgh")
            {
               return await DestinationStepAsync(stepContext, cancellationToken);
            }

            bookingDetails.Destination = (string)stepContext.Result;

            if (bookingDetails.Origin == null)
            {
                Console.WriteLine("testing tall" + bookingDetails.Destination);
                return await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions { Prompt = MessageFactory.Text("Where are you traveling from?") }, cancellationToken);
            }
            else
            {
                return await stepContext.NextAsync(bookingDetails.Origin, cancellationToken);
            }
        }

1 Ответ

0 голосов
/ 31 мая 2019

Чтобы уложить это в ответ и получить его из комментариев:

Водопады не предназначены для прохождения в любом случае, но шаг за шагом / вниз.Вы можете вложить мини-водопады внутри каждого шага водопада, которые позволят зацикливать отдельные шаги , показанные здесь , или иметь условные проверки для пропуска определенных шагов , показанных здесь .

Что выпохоже ищет ComponentDialogs или использует ReplaceDialogAsync.Компонент Dialogs, часть библиотеки botbuilder-dialogs, позволяет вам разбить логику вашего бота на компоненты (части), которые могут быть добавлены либо в DialogSet, либо даже в другой диалог компонента.Например, это компонент Cancel / Help примера Core-Bot из примеров github-репозитория платформы ботов.Этот компонент предназначен для того, что происходит, если посреди другого водопада пользователь говорит «отмена» или «помощь»

public class CancelAndHelpDialog : ComponentDialog
    {
        public CancelAndHelpDialog(string id)
            : base(id)
        {
        }

        protected override async Task<DialogTurnResult> OnBeginDialogAsync(DialogContext innerDc, object options, CancellationToken cancellationToken)
        {
            var result = await InterruptAsync(innerDc, cancellationToken);
            if (result != null)
            {
                return result;
            }

            return await base.OnBeginDialogAsync(innerDc, options, cancellationToken);
        }

        protected override async Task<DialogTurnResult> OnContinueDialogAsync(DialogContext innerDc, CancellationToken cancellationToken)
        {
            var result = await InterruptAsync(innerDc, cancellationToken);
            if (result != null)
            {
                return result;
            }

            return await base.OnContinueDialogAsync(innerDc, cancellationToken);
        }

        private async Task<DialogTurnResult> InterruptAsync(DialogContext innerDc, CancellationToken cancellationToken)
        {
            if (innerDc.Context.Activity.Type == ActivityTypes.Message)
            {
                var text = innerDc.Context.Activity.Text.ToLowerInvariant();

                switch (text)
                {
                    case "help":
                    case "?":
                        await innerDc.Context.SendActivityAsync($"Show Help...");
                        return new DialogTurnResult(DialogTurnStatus.Waiting);

                    case "cancel":
                    case "quit":
                        await innerDc.Context.SendActivityAsync($"Cancelling");
                        return await innerDc.CancelAllDialogsAsync();
                }
            }

            return null;
        }
    }

Как упоминал @ Matt-Stannett: на 5/22 / есть учебник19 здесь о том, как создавать сложные диалоги, включая диалоги компонентов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...