Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
            }
        }