Я строю бота с расширением Bot Dialogs, но у меня возникла проблема с Waterfall Dialog в моем проекте. Если пользователь говорит боту «я хочу ввести новое сообщение», бот ответит серией вопросов, таких как «когда вы хотите, чтобы сообщение было доставлено пользователю», «что вы хотите, чтобы сообщение говорило ", et c. Что я ищу, так это то, что когда пользователя просят о дате, если он отвечает «завтра», luis вернет соответствующую дату, но если пользователь говорит «foo», бот снова запросит дату.
То, что я пришел сделать, это такой код:
public class NewMessageDialog : ComponentDialog
{
private readonly BotStateService _botStateService;
private readonly BotServices _botServices;
public NewMessageDialog(string dialogId, BotStateService botStateService, BotServices botServices) : base(dialogId)
{
_botStateService = botStateService ?? throw new ArgumentNullException(nameof(botStateService));
_botServices = botServices ?? throw new ArgumentNullException(nameof(botServices));
InitializeWaterfalls();
}
private void InitializeWaterfalls()
{
var waterfallSteps = new WaterfallStep[]
{
DateToSendStep,
ExpirationTimeStep,
BodyContentStep,
SummaryStep
};
AddDialog(new WaterfallDialog($"{nameof(NewMessageDialog)}.mainFlow", waterfallSteps));
AddDialog(new DateTimePrompt($"{nameof(NewMessageDialog)}.dateCreation")); //tb
AddDialog(new NumberPrompt<double>($"{nameof(NewMessageDialog)}.expirationTime"));
AddDialog(new TextPrompt($"{nameof(NewMessageDialog)}.body.content"));
InitialDialogId = $"{nameof(NewMessageDialog)}.mainFlow";
}
private async Task<DialogTurnResult> DateCreatedStep(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
return await stepContext.PromptAsync($"{nameof(NewMessageDialog)}.dateCreation", new PromptOptions
{
Prompt = MessageFactory.Text("What is the date you want to send the message?"),
RetryPrompt = MessageFactory.Text("Please enter a date")
}, cancellationToken);
}
private async Task<DialogTurnResult> ExpirationTimeStep(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
stepContext.Values["dateToSend"] = Convert.ToDateTime(((List<DateTimeResolution>)stepContext.Result).FirstOrDefault().Value);
return await stepContext.PromptAsync($"{nameof(NewMessageDialog)}.expirationTime", new PromptOptions
{
Prompt = MessageFactory.Text("What is the expiration time?"),
RetryPrompt = MessageFactory.Text("Please enter a decimal number")
}, cancellationToken);
}
private async Task<DialogTurnResult> BodyContentStep(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
stepContext.Values["expirationTime"] = Convert.ToDateTime(((List<DateTimeResolution>)stepContext.Result).FirstOrDefault().Value);
return await stepContext.PromptAsync($"{nameof(NewMessageDialog)}.body.content", new PromptOptions
{
Prompt = MessageFactory.Text("What is the message body?")
}, cancellationToken);
}
И так далее ...
Я не нашел правильного пути чтобы сделать это: я мог бы дважды спросить LUIS (один раз в валидаторе, чтобы узнать, намеревается ли установить дату, и один раз на следующем шаге, чтобы получить правильную дату и время от сущности), я мог бы спросить luis в валидаторе, а затем сохраните его в свойстве класса, чтобы наконец получить значение даты оттуда ... Есть ли эффективный способ сделать это?
Также я ничего не знаю о создателе чата, я видел это на других сайтах во время поиска ...