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