Как генерировать шаги водопада во время выполнения в Bot Framework C#? - PullRequest
1 голос
/ 25 апреля 2020

У меня есть чат-бот из Bot Framework v4, где я читаю ответ бота и вопрос, который он хочет задать пользователю.

Это отдельный файл:

BotQuestions.cs

 public class BotQuestions{

    public string Intro = "Welcome to Chat Session! I am Mr. A, your assistant.";

    public string AskFood = "How was your experience with our food?";

    public string Acknowledge = "I am glad that you liked our food!";

    public string Sad = "We apologize that you didn't enjoy our food. We will take care of it next time";
 }

И затем я вызываю этот класс в своем классе бота, где определены шаги WaterFall.

ChatBotDialog.cs

public class ChatBotDialog : CancelAndHelpDialog
{

   public static BotQuestions question = new BotQuestions();

   public ChatBotDialog(UserState userState, ConversationState conversationState) : 

   base(nameof(ChatBotDialog))
   {
       memoryStorage = new MemoryStorage();

       _conversationState = conversationState;

       // the waterfall method to maintain the order of the chat
       var waterfallSteps = new WaterfallStep[]
       {
           IntroStepAsync,
           AskFoodStepAsync,
           AckStepAsync,
           SadAsync
       }; 

    // adding named dialogs to the Dialog Set. These names are saved in dialog set
    AddDialog(new WaterfallDialog(nameof(WaterfallDialog), waterfallSteps));
    AddDialog(new TextPrompt(nameof(TextPrompt)));


    // run the initial child dialog
    InitialDialogId = nameof(WaterfallDialog);
   }

  private static async Task<DialogTurnResult> IntroStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
  {
      Activity reply = stepContext.Context.Activity.CreateReply();
        reply.Type = ActivityTypes.Typing;
        ConnectorClient connector = new ConnectorClient(new Uri(stepContext.Context.Activity.ServiceUrl));
        await connector.Conversations.ReplyToActivityAsync(reply);


        //BotReplyTime();
        var promptOptions = new PromptOptions
        {
            Prompt = MessageFactory.Text(questions.Intro) // here I am accessing the Bot Question class string property and its value.
        };
        return await stepContext.PromptAsync(nameof(TextPrompt), promptOptions, cancellationToken);

     }


private static async Task<DialogTurnResult> AskFoodStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken){
  // similar logic
 }


private static async Task<DialogTurnResult> AcknowledgeStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken){
  // similar logic
}


private static async Task<DialogTurnResult> SadStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken){
  // similar logic
  }
 }

Как видите, ChatBotDialog имеет шаги с водопадом, и каждый шаг вызывает BotQuestions класс для доступа к строковому значению.

Теперь ситуация , если я хочу добавить новый вопрос в BotQuestions.cs , мне нужно снова сгенерировать строковое значение, сгенерировать соответствующий шаг водопада и затем запустить диалоговое окно, которое выглядит очень неуклюжий ... Так есть ли способ динамически генерировать шаги водопада во время выполнения ?? ( Только в C#) Если я добавлю новый вопрос где-нибудь между BotQuestions.cs , есть ли способ, которым бот может обнаружить изменение и соответственно отрегулировать его? Это возможно?

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