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");
            };
        }
Example #3
0
        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));
        }