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); } }
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); } }