コード例 #1
0
        // Check the availability of people/rooms with corresponding emails on condition of startTime and duration.
        public async Task <List <bool> > CheckAvailableAsync(List <string> users, DateTime startTime, int availabilityViewInterval)
        {
            try
            {
                List <bool> availability = new List <bool>();
                var         schedules    = users;

                var intervalStartTime = new DateTimeTimeZone
                {
                    DateTime = startTime.ToString(),
                    TimeZone = "UTC"
                };

                var intervalEndTime = new DateTimeTimeZone
                {
                    DateTime = startTime.AddDays(1).ToString(),
                    TimeZone = "UTC"
                };

                ICalendarGetScheduleCollectionPage collectionPage = await _graphClient.Me.Calendar
                                                                    .GetSchedule(schedules, intervalEndTime, intervalStartTime, availabilityViewInterval)
                                                                    .Request()
                                                                    .PostAsync();

                // AvailabilityView[0] == '0' means available, while others mean not available.
                foreach (var page in collectionPage)
                {
                    // Can't find this room.
                    if (page.AvailabilityView == null)
                    {
                        availability.Add(false);
                        continue;
                    }

                    // AvailabilityViem is empty, should not get into this state.
                    if (page.AvailabilityView.Length == 0)
                    {
                        throw new Exception("There is no elements in AvailabilityView");
                    }

                    availability.Add(page.AvailabilityView.Length > 0 && page.AvailabilityView[0] == '0');
                }

                return(availability);
            }
            catch (ServiceException ex)
            {
                throw GraphClient.HandleGraphAPIException(ex);
            }
        }
コード例 #2
0
        /// <inheritdoc/>
        internal override async Task <WorkingHours> CallGraphServiceWithResultAsync(IGraphServiceClient client, IReadOnlyDictionary <string, object> parameters, CancellationToken cancellationToken)
        {
            var addressProperty = (string)parameters["Address"];
            var startProperty   = DateTime.UtcNow.Date;
            var endProperty     = startProperty.Date.AddHours(23).AddMinutes(59);

            ICalendarGetScheduleCollectionPage schedule = await client.Me.Calendar.GetSchedule(
                Schedules : new[] { addressProperty },
                StartTime : DateTimeTimeZone.FromDateTime(startProperty, "UTC"),
                EndTime : DateTimeTimeZone.FromDateTime(endProperty, "UTC"))
                                                          .Request()
                                                          .PostAsync()
                                                          .ConfigureAwait(false);

            var workingHours = schedule.First().WorkingHours;

            return(workingHours);
        }
コード例 #3
0
        public async Task <AvailabilityResult> GetUserAvailabilityAsync(string userEmail, List <string> attendees, DateTime startTime, int availabilityViewInterval)
        {
            List <bool> availability = new List <bool>();

            attendees.Add(userEmail);
            var schedules = attendees;
            var endTime   = startTime.AddDays(1);

            var intervalStartTime = new DateTimeTimeZone
            {
                DateTime = startTime.ToString(),
                TimeZone = "UTC"
            };

            var intervalEndTime = new DateTimeTimeZone
            {
                DateTime = endTime.ToString(),
                TimeZone = "UTC"
            };

            ICalendarGetScheduleCollectionPage collectionPage = await _graphClient.Me.Calendar
                                                                .GetSchedule(schedules, intervalEndTime, intervalStartTime, availabilityViewInterval)
                                                                .Request()
                                                                .PostAsync();

            var result = new AvailabilityResult();

            // set non-working time as 3 in availability view
            foreach (var collection in collectionPage)
            {
                var availabilityView = collection.AvailabilityView.ToCharArray();
                if (collection.WorkingHours != null)
                {
                    var workingTimeZone           = TimeZoneInfo.FindSystemTimeZoneById(collection.WorkingHours.TimeZone.Name);
                    var startTimeInWorkTimeZone   = TimeConverter.ConvertUtcToUserTime(startTime, workingTimeZone);
                    var workingStartTimeTimeOfDay = collection.WorkingHours.StartTime;
                    var workingStartTime          = new DateTime(
                        startTimeInWorkTimeZone.Year,
                        startTimeInWorkTimeZone.Month,
                        startTimeInWorkTimeZone.Day,
                        workingStartTimeTimeOfDay.Hour,
                        workingStartTimeTimeOfDay.Minute,
                        workingStartTimeTimeOfDay.Second);

                    var workingEndTimeTimeOfDay = collection.WorkingHours.EndTime;
                    var workingEndTime          = new DateTime(
                        startTimeInWorkTimeZone.Year,
                        startTimeInWorkTimeZone.Month,
                        startTimeInWorkTimeZone.Day,
                        workingEndTimeTimeOfDay.Hour,
                        workingEndTimeTimeOfDay.Minute,
                        workingEndTimeTimeOfDay.Second);

                    var workDays = collection.WorkingHours.DaysOfWeek.Select(li => (int)li);
                    for (int i = 0; i < availabilityView.Length; i++)
                    {
                        if (availabilityView[i] == '0')
                        {
                            var availabilityViewStartTime = startTime.AddMinutes(i * CalendarCommonUtil.AvailabilityViewInterval);
                            availabilityViewStartTime = TimeConverter.ConvertUtcToUserTime(availabilityViewStartTime, workingTimeZone);

                            if (!workDays.Contains((int)availabilityViewStartTime.DayOfWeek))
                            {
                                availabilityView[i] = '3';
                                continue;
                            }

                            var availabilityViewEndTime = availabilityViewStartTime.AddMinutes(CalendarCommonUtil.AvailabilityViewInterval);

                            if (!((availabilityViewStartTime.TimeOfDay >= workingStartTime.TimeOfDay && availabilityViewStartTime.TimeOfDay < workingEndTime.TimeOfDay) ||
                                  (availabilityViewEndTime.TimeOfDay > workingStartTime.TimeOfDay && availabilityViewEndTime.TimeOfDay <= workingEndTime.TimeOfDay)))
                            {
                                availabilityView[i] = '3';
                            }
                        }
                    }
                }

                result.AvailabilityViewList.Add(new string(availabilityView));
            }

            result.MySchedule.AddRange(collectionPage.Last().ScheduleItems.Select(li => new EventModel(EventSource.Microsoft)
            {
                Title     = li.Subject,
                StartTime = DateTime.Parse(li.Start.DateTime + "Z").ToUniversalTime(),
                EndTime   = DateTime.Parse(li.End.DateTime + "Z").ToUniversalTime(),
                Location  = li.Location
            }));

            return(result);
        }