private async Task OnConfirmBooking(IDialogContext context, IAwaitable <string> result) { try { string optionSelected = await result; if (optionSelected == "Yes") { string accessToken = context.PrivateConversationData.GetValue <string>(AccessTokenDataKey); MeetingRequestInput meetingData = context.ConversationData.GetValue <MeetingRequestInput>(MeetingDataKey); MeetingSlot slot = context.ConversationData.GetValue <MeetingSlot>(ChosenSlotKey); ICalendarOperations ico = ServiceLocator.GetCalendarOperations(); var results = await ico.MakeAppointment(meetingData, slot, accessToken); await context.PostAsync(results); } else { await context.PostAsync("OK, booking cancelled"); } context.Done <object>(null); } catch (TooManyAttemptsException ex) { string fullError = ex.ToString(); Trace.TraceError(fullError); await context.PostAsync($"Sorry, I don't understand."); context.Done(true); } }
public async Task StartAsync(IDialogContext context) { Trace.TraceInformation("CreateMeetingRequestDialog::StartAsync"); await context.PostAsync("Processing Meeting Request ..."); MeetingRequestInput meetingData = context.ConversationData.GetValue <MeetingRequestInput>(MeetingDataKey); context.Call <MeetingRequestInput>(new FormDialog <MeetingRequestInput>( meetingData, BuildMeetingRequestInputForm, FormOptions.PromptInStart), this.ResumeAfterMeetingRequestInputForm); }
private async Task ResumeAfterMeetingRequestInputForm(IDialogContext context, IAwaitable <MeetingRequestInput> result) { // Let's figure out what's missing and ask the user. string accessToken = context.PrivateConversationData.GetValue <string>(AccessTokenDataKey); MeetingRequestInput meetingData = await result; ICalendarOperations ico = ServiceLocator.GetCalendarOperations(); Dictionary <string, MeetingSlot> possibleTimes = await ico.FindMeetingTimes(meetingData, accessToken); context.ConversationData.SetValue(PossibleTimesKey, possibleTimes); context.ConversationData.SetValue(MeetingDataKey, meetingData); PromptDialog.Choice(context, this.OnPickMeetingTime, possibleTimes.Keys.ToArray(), "Please pick a meeting time:", "Invalid Choice", 2); }
private async Task OnPickMeetingTime(IDialogContext context, IAwaitable <string> result) { try { string optionSelected = await result; Dictionary <string, MeetingSlot> possibleTimes = context.ConversationData.GetValue <Dictionary <string, MeetingSlot> >(PossibleTimesKey); MeetingSlot slot = possibleTimes[optionSelected]; context.ConversationData.SetValue(ChosenSlotKey, slot); MeetingRequestInput meetingData = context.ConversationData.GetValue <MeetingRequestInput>(MeetingDataKey); IMessageActivity msg = context.MakeMessage(); StringBuilder sb = new StringBuilder(); sb.AppendLine("*Please review your meeting request details:* \n\n"); sb.AppendLine("\n\n **Why**: " + meetingData.MeetingSubject); sb.AppendLine(string.Format("\n\n **With whom**: {0} ({1})", meetingData.AttendeeName, meetingData.AttendeeEmail)); sb.AppendLine("\n\n **When**: " + slot.Start.ToString()); sb.AppendLine(string.Format("\n\n **Duration**: {0} minutes", (meetingData.MeetingDuration / 60).ToString())); msg.Text = sb.ToString(); await context.PostAsync(msg); PromptDialog.Choice(context, this.OnConfirmBooking, new[] { "Yes", "No" }, "Would you like me to create the meeting request?", "Invalid Choice", 2); } catch (TooManyAttemptsException ex) { string fullError = ex.ToString(); Trace.TraceError(fullError); await context.PostAsync($"Sorry, I don't understand."); context.Done(true); } }
public async Task CalendarLookup(IDialogContext context, IAwaitable <IMessageActivity> activity, LuisResult result) { Trace.TraceInformation("AppRootDialog::CalendarLookup"); await context.PostAsync("Reviewing your request ..."); MeetingRequestInput meetingData = new MeetingRequestInput(); if (result.TryFindEntity(EntityHowLong, out EntityRecommendation recHowLong)) { recHowLong.Type = "HowLong"; meetingData.MeetingDuration = GetRecommendationValue <int>(recHowLong, "value"); } if (result.TryFindEntity(EntityWhen, out EntityRecommendation recWhen)) { recWhen.Type = "When"; meetingData.RequestedDateTime = GetRecommendationValues <DateTime>(recWhen, "value").First(v => v > DateTime.UtcNow); } if (result.TryFindEntity(EntityEmail, out EntityRecommendation recEmail)) { recEmail.Type = "Who"; meetingData.AttendeeEmail = recEmail.Entity; } if (result.TryFindEntity(EntityTitle, out EntityRecommendation recTitle)) { recTitle.Type = "What"; meetingData.MeetingSubject = recTitle.Entity; } context.ConversationData.SetValue(MeetingDataKey, meetingData); var message = await activity; await context.Forward(new AppAuthDialog(), this.ResumeAfterCalendarCheckDialog, message, CancellationToken.None); }
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}"); } MeetingRequestInput meetingData = authContext.ConversationData.GetValue <MeetingRequestInput>(MeetingDataKey); meetingData.OrganizerName = userName; meetingData.OrganizerEmail = userEmail; authContext.ConversationData.SetValue(MeetingDataKey, meetingData); authContext.PrivateConversationData.SetValue(AccessTokenDataKey, authResult.AccessToken); SD.Trace.TraceInformation("Post Auth Hand Off to CreateMeetingRequestDialog."); authContext.Call(new CreateMeetingRequestDialog(), this.ResumeAfterMeetingDialog); } catch (Exception ex) { string fullError = ex.ToString(); SD.Trace.TraceError(fullError); await authContext.PostAsync(fullError); } }