protected override async Task OnMembersAddedAsync(IList <ChannelAccount> membersAdded, ITurnContext <IConversationUpdateActivity> turnContext, CancellationToken cancellationToken) { var welcomeText = "Hello and welcome! What can I help you with today?"; var welcomeSpeak = VoiceMessageHelpers.WrapMessageInVoice(welcomeText); foreach (var member in membersAdded) { if (member.Id != turnContext.Activity.Recipient.Id) { await turnContext.SendActivityAsync(MessageFactory.Text(welcomeText, welcomeSpeak), cancellationToken); } } }
public AdapterWithErrorHandler(IConfiguration configuration, ILogger <BotFrameworkHttpAdapter> logger, ConversationState conversationState = null) : base(configuration, logger) { OnTurnError = async(turnContext, exception) => { // Log any leaked exception from the application. logger.LogError(exception, $"[OnTurnError] unhandled error : {exception.Message}"); // Send a message to the user var errorMessageText = "I'm sorry, I seem to have encountered an error."; var errorMessageSpeak = VoiceMessageHelpers.WrapMessageInVoice(errorMessageText); var errorMessage = MessageFactory.Text(errorMessageText, errorMessageSpeak, InputHints.IgnoringInput); await turnContext.SendActivityAsync(errorMessage); errorMessageText = "Please tell your bot developer that they need to fix me!"; errorMessageSpeak = VoiceMessageHelpers.WrapMessageInVoice(errorMessageText); errorMessage = MessageFactory.Text(errorMessageText, errorMessageSpeak, InputHints.ExpectingInput); await turnContext.SendActivityAsync(errorMessage); if (conversationState != null) { try { // Delete the conversationState for the current conversation to prevent the // bot from getting stuck in a error-loop caused by being in a bad state. // ConversationState should be thought of as similar to "cookie-state" in a Web pages. await conversationState.DeleteAsync(turnContext); } catch (Exception e) { logger.LogError(e, $"Exception caught on attempting to Delete ConversationState : {e.Message}"); } } // Send a trace activity, which will be displayed in the Bot Framework Emulator await turnContext.TraceActivityAsync("OnTurnError Trace", exception.Message, "https://www.botframework.com/schemas/error", "TurnError"); }; }
private async Task <DialogTurnResult> FinalStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) { // If the child dialog ("BookingDialog") was cancelled, the user failed to confirm or if the intent wasn't BookFlight // the Result here will be null. if (stepContext.Result is BookingDetails result) { // Now we have all the booking details call the booking service. // If the call to the booking service was successful tell the user. var timeProperty = new TimexProperty(result.TravelDate); var travelDateMsg = timeProperty.ToNaturalLanguage(DateTime.Now); var messageText = $"I have you booked to {result.Destination} from {result.Origin} on {travelDateMsg}"; var messageSpeak = VoiceMessageHelpers.WrapMessageInVoice(messageText); var message = MessageFactory.Text(messageText, messageSpeak, InputHints.IgnoringInput); await stepContext.Context.SendActivityAsync(message, cancellationToken); } // Restart the main dialog with a different message the second time around var promptMessage = "What else can I do for you?"; return(await stepContext.ReplaceDialogAsync(InitialDialogId, promptMessage, cancellationToken)); }
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)); }