private async Task <DialogTurnResult> ActStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) { var showActivitiesAsCards = true; if (!_luisRecognizer.IsConfigured) { // LUIS is not configured, we just run the BookingDialog path with an empty BookingDetailsInstance. return(await stepContext.BeginDialogAsync(nameof(BookingDialog), new BookingDetails(), cancellationToken)); } // Call LUIS and gather any potential booking details. (Note the TurnContext has the response to the prompt.) var luisResult = await _luisRecognizer.RecognizeAsync <CircleIntent>(stepContext.Context, cancellationToken); switch (luisResult.TopIntent().intent) { case CircleIntent.Intent.ActivitiesEnquiry: if (luisResult.Entities?.ActivityTime?.Length > 0) { List <string> activityNames = Activities.GetActivityNamesByTimeEntityFilter(luisResult.Entities.ActivityTime.First()) .ToList(); if (showActivitiesAsCards) { var activitiesEnquiryText = "I found the following activities. Let me know if you would like to be booked on any of these."; var enquiryMessageSpeak = VoiceMessageHelpers.WrapMessageInVoice(activitiesEnquiryText); var activitiesEnquiryMessage = MessageFactory.Text(activitiesEnquiryText, enquiryMessageSpeak, InputHints.IgnoringInput); await stepContext.Context.SendActivityAsync(activitiesEnquiryMessage, cancellationToken); activitiesEnquiryMessage.AttachmentLayout = AttachmentLayoutTypes.Carousel; foreach (var activityName in activityNames) { if (activityName.Contains("aquarium", StringComparison.InvariantCultureIgnoreCase)) { activitiesEnquiryMessage.Attachments.Add(Cards.GetActivityCard(Activities.AquariumActivityId).ToAttachment()); } else if (activityName.Contains("bus tour", StringComparison.InvariantCultureIgnoreCase)) { activitiesEnquiryMessage.Attachments.Add(Cards.GetActivityCard(Activities.BusTourActivityId).ToAttachment()); } else if (activityName.Contains("choir", StringComparison.InvariantCultureIgnoreCase)) { activitiesEnquiryMessage.Attachments.Add(Cards.GetActivityCard(Activities.ChoirShowActivityId).ToAttachment()); } else if (activityName.Contains("dinner", StringComparison.InvariantCultureIgnoreCase)) { activitiesEnquiryMessage.Attachments.Add(Cards.GetActivityCard(Activities.DinnerActivityId).ToAttachment()); } } await stepContext.Context.SendActivityAsync(activitiesEnquiryMessage, cancellationToken); } else { var activitiesEnquiryText = Activities.BuildActivitiesString(activityNames); var enquiryMessageSpeak = VoiceMessageHelpers.WrapMessageInVoice(activitiesEnquiryText); var activitiesEnquiryMessage = MessageFactory.Text(activitiesEnquiryText, enquiryMessageSpeak, InputHints.IgnoringInput); await stepContext.Context.SendActivityAsync(activitiesEnquiryMessage, cancellationToken); } } else { var activitiesEnquiryText = "There are some interesting activities coming up! Give us a call at the front desk and we will help find something to suit you."; var enquiryMessageSpeak = VoiceMessageHelpers.WrapMessageInVoice(activitiesEnquiryText); var activitiesEnquiryMessage = MessageFactory.Text(activitiesEnquiryText, enquiryMessageSpeak, InputHints.IgnoringInput); await stepContext.Context.SendActivityAsync(activitiesEnquiryMessage, cancellationToken); } break; case CircleIntent.Intent.ActivityBooking: var activityBookingText = "No problem! I've sent that through to the front desk and they'll be in touch soon with details."; if (luisResult.Entities?.ActivityName?.Length > 0) { var activityName = luisResult.Entities.ActivityName.First(); activityBookingText = $"No problem! I've let the front desk know that you are interested in the {activityName}. They'll be in touch soon with details."; } var activityBookingSpeak = VoiceMessageHelpers.WrapMessageInVoice(activityBookingText); var activityBookingMessage = MessageFactory.Text(activityBookingText, activityBookingSpeak, InputHints.IgnoringInput); await stepContext.Context.SendActivityAsync(activityBookingMessage, cancellationToken); break; case CircleIntent.Intent.FinishConversation: var finishConversationText = $"Okay! I'm here if you need me for anything else."; var finishConversationSpeak = VoiceMessageHelpers.WrapMessageInVoice(finishConversationText); var finishConversationMessage = MessageFactory.Text(finishConversationText, finishConversationSpeak, InputHints.IgnoringInput); await stepContext.Context.SendActivityAsync(finishConversationMessage, cancellationToken); break; default: // Catch all for unhandled intents var didntUnderstandMessageText = $"Sorry, I didn't get that. Please try asking in a different way (intent was {luisResult.TopIntent().intent})"; var didntUnderstandMessageSpeak = VoiceMessageHelpers.WrapMessageInVoice(didntUnderstandMessageText); var didntUnderstandMessage = MessageFactory.Text(didntUnderstandMessageText, didntUnderstandMessageSpeak, InputHints.IgnoringInput); await stepContext.Context.SendActivityAsync(didntUnderstandMessage, cancellationToken); break; } return(await stepContext.NextAsync(null, cancellationToken)); }