Ejemplo n.º 1
0
        public async System.Threading.Tasks.Task EventFindMeetingsTimes()
        {
            try
            {
                User me = await graphClient.Me.Request().GetAsync();

                // Get the first three users in the org as attendees unless user is the organizer.
                var orgUsers = await graphClient.Users.Request().GetAsync();

                List <Attendee> attendees = new List <Attendee>();
                for (int i = 0; i < 3; ++i)
                {
                    if (orgUsers[i].Mail == me.Mail)
                    {
                        continue; // Skip the organizer.
                    }
                    Attendee attendee = new Attendee();
                    attendee.EmailAddress         = new EmailAddress();
                    attendee.EmailAddress.Address = orgUsers[i].Mail;
                    attendees.Add(attendee);
                }

                // Create a duration with an ISO8601 duration.
                Duration durationFromISO8601 = new Duration("PT1H");
                MeetingTimeSuggestionsResult resultsFromISO8601 = await graphClient.Me.FindMeetingTimes(attendees,
                                                                                                        null,
                                                                                                        null,
                                                                                                        durationFromISO8601,
                                                                                                        2,
                                                                                                        true,
                                                                                                        false,
                                                                                                        10.0).Request().PostAsync();

                // Create a duration with a TimeSpan.
                Duration durationFromTimeSpan = new Duration(new TimeSpan(1, 0, 0));
                MeetingTimeSuggestionsResult resultsFromTimeSpan = await graphClient.Me.FindMeetingTimes(attendees,
                                                                                                         null,
                                                                                                         null,
                                                                                                         durationFromTimeSpan,
                                                                                                         2,
                                                                                                         true,
                                                                                                         false,
                                                                                                         10.0).Request().PostAsync();

                Assert.NotNull(resultsFromTimeSpan);
                // Make sure that our custom serialization results are the same for both scenarios.
                // DurationConverter.cs and Duration.cs


                List <MeetingTimeSuggestion> suggestionsFromISO8601  = new List <MeetingTimeSuggestion>(resultsFromISO8601.MeetingTimeSuggestions);
                List <MeetingTimeSuggestion> suggestionsFromTimeSpan = new List <MeetingTimeSuggestion>(resultsFromTimeSpan.MeetingTimeSuggestions);

                Assert.Equal(suggestionsFromISO8601[0].MeetingTimeSlot.Start.DateTime,
                             suggestionsFromTimeSpan[0].MeetingTimeSlot.Start.DateTime);
            }
            catch (Microsoft.Graph.ServiceException e)
            {
                Assert.True(false, $"Something happened, check out a trace. Error code: {e.Error.Code}");
            }
        }
Ejemplo n.º 2
0
        /// <inheritdoc />
        internal override async Task <List <CalendarSkillTimeSlotModel> > CallGraphServiceWithResultAsync(IGraphServiceClient client, IReadOnlyDictionary <string, object> parameters, CancellationToken cancellationToken)
        {
            var attendees = (List <Attendee>)parameters["Attendees"];
            var duration  = (int)parameters["Duration"];
            var timeZone  = GraphUtils.ConvertTimeZoneFormat((string)parameters["Timezone"]);

            MeetingTimeSuggestionsResult meetingTimesResult = await client.Me
                                                              .FindMeetingTimes(attendees : attendees, minimumAttendeePercentage : 100, meetingDuration : new Duration(new TimeSpan(0, duration, 0)), maxCandidates : 10)
                                                              .Request()
                                                              .PostAsync(cancellationToken)
                                                              .ConfigureAwait(false);

            var results = new List <CalendarSkillTimeSlotModel>();

            foreach (var timeSlot in meetingTimesResult.MeetingTimeSuggestions)
            {
                if (timeSlot.Confidence >= 1)
                {
                    var start = DateTime.Parse(timeSlot.MeetingTimeSlot.Start.DateTime);
                    var end   = DateTime.Parse(timeSlot.MeetingTimeSlot.End.DateTime);
                    results.Add(new CalendarSkillTimeSlotModel()
                    {
                        Start = TimeZoneInfo.ConvertTimeFromUtc(start, timeZone),
                        End   = TimeZoneInfo.ConvertTimeFromUtc(end, timeZone),
                    });
                }
            }

            return(results.OrderBy(s => s.Start).ToList());
        }
        public async System.Threading.Tasks.Task EventFindMeetingsTimes()
        {
            try
            {
                User me = await graphClient.Me.Request().GetAsync();

                // Get the first three users in the org as attendees unless user is the organizer.
                var orgUsers = await graphClient.Users.Request().GetAsync();

                List <Attendee> attendees = new List <Attendee>();
                for (int i = 0; i < 3; ++i)
                {
                    if (orgUsers[i].Mail == me.Mail)
                    {
                        continue; // Skip the organizer.
                    }
                    Attendee attendee = new Attendee();
                    attendee.EmailAddress         = new EmailAddress();
                    attendee.EmailAddress.Address = orgUsers[i].Mail;
                    attendees.Add(attendee);
                }

                // Create a duration with an ISO8601 duration.
                Duration durationFromISO8601 = new Duration("PT1H");
                MeetingTimeSuggestionsResult suggestionsFromISO8601 = await graphClient.Me.FindMeetingTimes(attendees,
                                                                                                            null,
                                                                                                            null,
                                                                                                            durationFromISO8601,
                                                                                                            10,
                                                                                                            true,
                                                                                                            false,
                                                                                                            10.0).Request().PostAsync();

                // Create a duration with a TimeSpan.
                Duration durationFromTimeSpan = new Duration(new TimeSpan(1, 0, 0));
                MeetingTimeSuggestionsResult suggestionsFromTimeSpan = await graphClient.Me.FindMeetingTimes(attendees,
                                                                                                             null,
                                                                                                             null,
                                                                                                             durationFromTimeSpan,
                                                                                                             10,
                                                                                                             true,
                                                                                                             false,
                                                                                                             10.0).Request().PostAsync();

                Assert.IsNotNull(suggestionsFromTimeSpan, "The results object is null. Check that the IUserFindMeetingTimesRequestBuilder operates as expected.");
                // Make sure that our custom serialization results are the same for both scenarios.
                // DurationConverter.cs and Duration.cs
                Assert.AreEqual(suggestionsFromISO8601, suggestionsFromTimeSpan, "The meeting suggestion results don't match as expected.");
            }
            catch (Microsoft.Graph.ServiceException e)
            {
                Assert.Fail("Something happened, check out a trace. Error code: {0}", e.Error.Code);
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Returns meeting schedule suggestions
        /// </summary>
        /// <param name="meetingTimeSuggestion">Instance of <see cref="MeetingTimeSuggestionsResult"/></param>
        /// <param name="roomsDictionary">Room dictionalry</param>
        /// <returns>List of <see cref="List<MeetingSchedule>"/></returns>
        public static List <MeetingSchedule> GetMeetingScheduleSuggestions(MeetingTimeSuggestionsResult meetingTimeSuggestion, Dictionary <string, string> roomsDictionary)
        {
            var meetingScheduleSuggestions = new List <MeetingSchedule>();
            var counter = 1;

            foreach (var suggestion in meetingTimeSuggestion.MeetingTimeSuggestions)
            {
                DateTime.TryParse(suggestion.MeetingTimeSlot.Start.DateTime, out DateTime startTime);
                DateTime.TryParse(suggestion.MeetingTimeSlot.End.DateTime, out DateTime endTime);

                meetingScheduleSuggestions.Add(new MeetingSchedule()
                {
                    StartTime = startTime,
                    EndTime   = endTime,
                    Time      = GetFormatedTime(startTime, endTime, counter++),
                    Rooms     = GetMeetingSuggestionRooms(suggestion, roomsDictionary)
                });
            }

            return(meetingScheduleSuggestions);
        }
Ejemplo n.º 5
0
        private async Task <MeetingTimeSuggestionsResult> FindMeetingSuggestions(DateTimeTimeZone start, DateTimeTimeZone end)
        {
            var timeZone = User.GetUserGraphTimeZone();

            var attendees = new List <AttendeeBase>()
            {
                new AttendeeBase
                {
                    Type         = AttendeeType.Required,
                    EmailAddress = new EmailAddress
                    {
                        Name    = "seetharam konda",
                        Address = "*****@*****.**"
                    }
                }
            };

            var locationConstraint = new LocationConstraint
            {
                IsRequired      = false,
                SuggestLocation = false,
                Locations       = new List <LocationConstraintItem>()
                {
                    new LocationConstraintItem
                    {
                        ResolveAvailability = false,
                        DisplayName         = "Conf room Hood"
                    }
                }
            };

            var timeConstraint = new TimeConstraint
            {
                ActivityDomain = ActivityDomain.Work,
                TimeSlots      = new List <TimeSlot>()
                {
                    new TimeSlot
                    {
                        Start = start,
                        End   = end
                                //Start = new DateTimeTimeZone
                                //{
                                //    DateTime = "2019-04-16T09:00:00",
                                //    TimeZone = "Pacific Standard Time"
                                //},
                                //End = new DateTimeTimeZone
                                //{
                                //    DateTime = "2019-04-18T17:00:00",
                                //    TimeZone = "Pacific Standard Time"
                                //}
                    }
                }
            };

            var isOrganizerOptional = false;

            var meetingDuration = new Duration("PT1H");

            var returnSuggestionReasons = true;

            var minimumAttendeePercentage = (double)100;

            MeetingTimeSuggestionsResult x = await _graphClient.Me
                                             .FindMeetingTimes(attendees, locationConstraint, timeConstraint, meetingDuration, null, isOrganizerOptional, returnSuggestionReasons, minimumAttendeePercentage)
                                             .Request()
                                             .Header("Prefer", "outlook.timezone=\"India Standard Time\"")
                                             .PostAsync();

            return(x);
        }
        public async Task <List <MeetingTimeCandidate> > FindMeetingTime()
        {
            // Get the group id.
            //var group = await graphClient.Groups[id].Request().GetAsync();

            User me = await graphClient.Me.Request().Select("mail,userPrincipalName").GetAsync();


            //Build the list of attendees
            List <Attendee> attendees = new List <Attendee>();

            Attendee     attendee     = new Attendee();
            EmailAddress mailaddress1 = new EmailAddress();

            mailaddress1.Address  = me.Mail;
            attendee.EmailAddress = mailaddress1;
            attendees.Add(attendee);

            //Build the list of locationcontraints
            LocationConstraint location = new LocationConstraint();

            location.IsRequired      = false;
            location.SuggestLocation = false;

            List <LocationConstraintItem> locationConstraints = new List <LocationConstraintItem>();

            locationConstraints.Add(new LocationConstraintItem {
                DisplayName = "", LocationEmailAddress = "*****@*****.**"
            });

            //Build the duration
            Duration        duration       = new Duration("PT1H");
            TimeConstraint  timeConstraint = new TimeConstraint();
            List <TimeSlot> timeSlots      = new List <TimeSlot>();
            TimeSlot        slot1          = new TimeSlot();

            Microsoft.Graph.DateTimeTimeZone start = new Microsoft.Graph.DateTimeTimeZone();
            start.DateTime = @"2017-06-10T15:30:00.000";
            start.TimeZone = @"W. Europe Standard Time";

            Microsoft.Graph.DateTimeTimeZone end = new Microsoft.Graph.DateTimeTimeZone();
            end.DateTime = @"2017-06-14T18:00:00.000";
            end.TimeZone = @"W. Europe Standard Time";
            slot1.Start  = start;
            slot1.End    = end;

            timeSlots.Add(slot1);
            timeConstraint.Timeslots = timeSlots;

            //Execute the request
            var request = graphClient.Me.FindMeetingTimes(attendees, location, timeConstraint, duration, 3, false, false, 50).Request();
            MeetingTimeSuggestionsResult meetingSuggestions = await request.PostAsync();

            List <MeetingTimeCandidate> meetingTimeCandidates = new List <MeetingTimeCandidate>();

            // Create model objects
            foreach (MeetingTimeSuggestion meetingJson in meetingSuggestions.MeetingTimeSuggestions)
            {
                MeetingTimeCandidate candidate = new MeetingTimeCandidate
                {
                    Confidence            = meetingJson.Confidence.Value,
                    MeetingTimeSlotStart  = meetingJson.MeetingTimeSlot.Start.DateTime,
                    MeetingTimeSlotEnd    = meetingJson.MeetingTimeSlot.End.DateTime,
                    OrganizerAvailability = meetingJson.OrganizerAvailability.Value.ToString() ?? string.Empty,
                    SuggestionHint        = meetingJson.SuggestionReason
                };
                meetingTimeCandidates.Add(candidate);
            }

            return(meetingTimeCandidates);
        }
Ejemplo n.º 7
0
        private async void CalendarInviteButton_Click(object sender, RoutedEventArgs e)
        {
            // Call app specific code to subscribe to the service. For example:
            //BigTextArea.Text = PersonName.Text;
            try
            {
                GraphServiceClient graphClient = ProviderManager.Instance.GlobalProvider.Graph;
                var user = await graphClient.Users[PersonEmail.Text.ToString()]
                           .Request()
                           .GetAsync();

                var attendees = new List <AttendeeBase>()
                {
                    new AttendeeBase
                    {
                        EmailAddress = new EmailAddress
                        {
                            Address = user.Mail,
                            Name    = user.DisplayName
                        },
                        Type = AttendeeType.Required
                    }
                };

                var timeConstraint = new TimeConstraint
                {
                    TimeSlots = new List <TimeSlot>()
                    {
                        new TimeSlot
                        {
                            Start = new DateTimeTimeZone
                            {
                                DateTime = "2020-07-12T19:58:00.557Z",
                                TimeZone = "Pacific Standard Time"
                            },
                            End = new DateTimeTimeZone
                            {
                                DateTime = "2020-07-19T19:58:00.557Z",
                                TimeZone = "Pacific Standard Time"
                            }
                        }
                    }
                };

                var locationConstraint = new LocationConstraint
                {
                    IsRequired      = false,
                    SuggestLocation = true,
                    Locations       = new List <LocationConstraintItem>()
                    {
                        new LocationConstraintItem
                        {
                            DisplayName          = "Conf Room 32/1368",
                            LocationEmailAddress = "*****@*****.**"
                        }
                    }
                };

                var meetingDuration = new Microsoft.Graph.Duration("PT1H");

                MeetingTimeSuggestionsResult response = await graphClient.Me
                                                        .FindMeetingTimes(attendees, null, null, meetingDuration, null, null, null, null)
                                                        //.FindMeetingTimes(attendees, locationConstraint, timeConstraint, meetingDuration, null, null, null, null)
                                                        .Request()
                                                        .PostAsync();

                if (response.MeetingTimeSuggestions.Count() == 0)
                {
                    BigTextArea.Text = "No common meeting time found";
                }
                else
                {
                    var StartTime = response.MeetingTimeSuggestions.First().MeetingTimeSlot.Start;
                    var EndTime   = response.MeetingTimeSuggestions.First().MeetingTimeSlot.End;

                    // Calendar Invite
                    var @event = new Event
                    {
                        Subject   = "My Calendar Invite via code",
                        Start     = StartTime,
                        End       = EndTime,
                        Attendees = new List <Attendee>()
                        {
                            new Attendee
                            {
                                EmailAddress = new EmailAddress
                                {
                                    Address = user.Mail,
                                    Name    = user.DisplayName
                                },
                                Type = AttendeeType.Required
                            }
                        },
                        IsOnlineMeeting       = true,
                        OnlineMeetingProvider = OnlineMeetingProviderType.TeamsForBusiness
                    };

                    await graphClient.Me.Events
                    .Request()
                    .AddAsync(@event);

                    var dateconvertinstance = new GraphDateTimeTimeZoneConverter();
                    BigTextArea.Text = "Calendar invite sent from " + dateconvertinstance.Convert(StartTime, null, null, null) + " to " + dateconvertinstance.Convert(EndTime, null, null, null) + "\n\n" +
                                       "Please check your calendar for teams meeting.";
                }
            }
            catch (Microsoft.Graph.ServiceException ex)
            {
                if (ex.Error.Code == "Request_ResourceNotFound")
                {
                    BigTextArea.Text = "This user does not exit in the directory";
                }
                else
                {
                    BigTextArea.Text = "Error message - \n" + ex.Message;
                }
            }
        }