private async Task OnPickCabana(IDialogContext context, IAwaitable <string> result)
        {
            string optionSelected = await result;
            string cabanaIdText   = optionSelected.Substring(optionSelected.LastIndexOf(' ') + 1);
            int    cabanaId       = int.Parse(cabanaIdText);

            await context.PostAsync($"Booking your cabana '{optionSelected}', please wait ...");

            CabanaQuery searchQuery   = context.ConversationData.GetValue <CabanaQuery>("CabanaQuery");
            int         reservationId = 1;

            DateTime startDate = searchQuery.Start;
            int      days      = searchQuery.Days;

            UserProfile userInfo = context.ConversationData.GetValue <UserProfile>(UserSessionDataKey);
            ICabanaReservationOperations icro = ServiceLocator.GetCabanaReservationOperations();
            CabanaReservation            cres = await icro.ReserveCabana(reservationId, cabanaId, startDate, days);

            await context.PostAsync($"Cabana booked. Your Cabana Booking Id is {cres.CabanaBookingId}.");

            context.Done <object>(null);
        }
        private async Task ResumeAfterCabanaFormDialog(IDialogContext context, IAwaitable <CabanaQuery> result)
        {
            try
            {
                CabanaQuery searchQuery = await result;
                context.ConversationData.SetValue("CabanaQuery", searchQuery);

                await context.PostAsync($"Ok. Searching for Cabanas starting {searchQuery.Start.ToString("MM/dd")} " +
                                        $"to {searchQuery.Start.AddDays(searchQuery.Days).ToString("MM/dd")}...");

                ICabanaReservationOperations icro = ServiceLocator.GetCabanaReservationOperations();
                IList <Cabana> cabanas            = await icro.GetCabanaAvailability(reservationChoice, searchQuery);

                await context.PostAsync($"I found in total {cabanas.Count()} cabanas for your dates:");

                var resultMessage = context.MakeMessage();
                resultMessage.AttachmentLayout = AttachmentLayoutTypes.Carousel;
                resultMessage.Attachments      = new List <Attachment>();

                List <string> cabanaChoices = new List <string>();
                foreach (var cabana in cabanas)
                {
                    cabanaChoices.Add(cabana.Name);
                    HeroCard heroCard = new HeroCard()
                    {
                        Title    = cabana.Name,
                        Subtitle = $"{cabana.Rating} stars. {cabana.NumberOfReviews} reviews. From ${cabana.PriceStarting} per day.",
                        Images   = new List <CardImage>()
                        {
                            new CardImage()
                            {
                                Url = cabana.Image
                            }
                        },
                        Buttons = new List <CardAction>()
                        {
                            new CardAction()
                            {
                                Title = "More details",
                                Type  = ActionTypes.OpenUrl,
                                Value = $"https://www.bing.com/search?q=hotels+in+" + HttpUtility.UrlEncode(cabana.Location)
                            }
                        }
                    };

                    resultMessage.Attachments.Add(heroCard.ToAttachment());
                }

                await context.PostAsync(resultMessage);

                cabanaChoices.Sort((h1, h2) => h1.CompareTo(h2));

                PromptDialog.Choice(context, this.OnPickCabana, cabanaChoices,
                                    "Please pick your cabana:",
                                    "Not a valid option", 3);
            }
            catch (FormCanceledException ex)
            {
                string reply;

                if (ex.InnerException == null)
                {
                    reply = "You have canceled the operation. Quitting from the CabanaDialog";
                }
                else
                {
                    reply = $"Oops! Something went wrong :( Technical Details: {ex.InnerException.Message}";
                }

                await context.PostAsync(reply);
            }
        }
Пример #3
0
        private async Task AfterInitialAuthDialog(
            IDialogContext authContext,
            IAwaitable <AuthResult> awaitableAuthResult)
        {
            try
            {
                SD.Trace.TraceInformation("AppAuthDialog::AfterInitialAuthDialog");

                AuthResult authResult = await awaitableAuthResult;
                Activity   activity   = authContext.ConversationData.GetValue <Activity>("Activity");

                // return our reply to the user for debugging purposes
                if (displayAuthMessages)
                {
                    int length = (activity.Text ?? string.Empty).Length;
                    await authContext.PostAsync($"We see you sent {activity.Text} which was {length} characters");
                }

                if (authResult == null)
                {
                    await authContext.PostAsync("You didn't log in.");

                    authContext.Done(true);
                    return;
                }
                else
                {
                    if (displayAuthMessages)
                    {
                        await authContext.PostAsync($"Token: {authResult.AccessToken}");
                    }
                }

                // Use token to call into service
                JObject json = await new HttpClient().GetWithAuthAsync(
                    authResult.AccessToken, GraphUrl);

                // Two items to test
                // A -- Access Token Expires, do JUST [Part 1] Below
                // B -- Access Token Expires AND refresh fails, do [Part 1], [Part 2], and [Part 3].
                //
                // To test auth expiration null out json variable (uncomment next line) [Part 1]
                // json = null;
                if (json == null)
                {
                    var authProvider = new MSALAuthProvider();
                    AuthenticationOptions options =
                        authContext.UserData.GetValue <AuthenticationOptions>(
                            $"{authProvider.Name}{ContextConstants.AuthOptions}");

                    SD.Trace.TraceInformation("Attempting to refresh with token.");
                    if (displayAuthMessages)
                    {
                        await authContext.PostAsync($"Attempting to refresh with token: {authResult.RefreshToken}");
                    }

                    // To test auth expiration comment out next line [Part 2]
                    authResult = await authProvider.GetAccessToken(options, authContext);

                    // To test auth expiration uncomment out next two lines [Part 3]
                    // authResult = null;
                    // await authProvider.Logout(options, authContext);
                    if (authResult != null)
                    {
                        SD.Trace.TraceInformation("Token Refresh Succeeded.");
                        if (displayAuthMessages)
                        {
                            await authContext.PostAsync($"Token Refresh Succeeded. New Token: {authResult.AccessToken}");
                        }
                        json = await new HttpClient().GetWithAuthAsync(
                            authResult.AccessToken, "https://graph.microsoft.com/v1.0/me");
                    }
                    else
                    {
                        SD.Trace.TraceInformation("Token Refresh Failed. Trying full login.");

                        if (displayAuthMessages)
                        {
                            await authContext.PostAsync("Token Refresh Failed. Trying full login.");
                        }
                        await authContext.Forward(
                            new BotAuth.Dialogs.AuthDialog(new MSALAuthProvider(), options),
                            this.AfterInitialAuthDialog,
                            activity,
                            CancellationToken.None);

                        return;
                    }
                }

                SD.Trace.TraceInformation("Getting user data post auth.");
                string userName  = json.Value <string>("displayName");
                string userEmail = json.Value <string>("userPrincipalName");

                if (displayAuthMessages)
                {
                    await authContext.PostAsync($"I now know your name is {userName} " +
                                                $"and your UPN is {userEmail}");
                }

                ICabanaReservationOperations icro = ServiceLocator.GetCabanaReservationOperations();
                UserProfile userInfo = await icro.GetUserInformation(userName, userEmail);

                authContext.ConversationData.SetValue <UserProfile>(UserSessionDataKey, userInfo);
                authContext.Call(new CabanaReservationDialog(), this.ResumeAfterCabanaReservationDialog);
            }
            catch (Exception ex)
            {
                string fullError = ex.ToString();
                SD.Trace.TraceError(fullError);
                await authContext.PostAsync(fullError);
            }
        }