static async Task <bool> StartClass(ClassSchedule c) { bool hasJoined = await JoinClass(c); if (!hasJoined) { throw new UnhandledAlertException(); } DateTime joinDate = DateTime.Now; //wait for teacher to enter call bool TeacherIsInclass; for (; ;) { TeacherIsInclass = IsTeacherPresent(c.Teacher); if (!TeacherIsInclass && (DateTime.Now - joinDate).TotalMinutes > JoinWaitingTime) { goto ILexit; } if (TeacherIsInclass) { joinDate = DateTime.Now; break; } } //when teacher has entered call, and when the teacher left and 1 min passed, leave call. for (; ;) { TeacherIsInclass = IsTeacherPresent(c.Teacher); if (!TeacherIsInclass && (DateTime.Now - joinDate).TotalMinutes > OvertimeWaitingTime) { goto ILexit; } else if (TeacherIsInclass) { joinDate = DateTime.Now; } } ILexit: await hangUpcall(); return(true); }
static async Task <bool> JoinClass(ClassSchedule c) { bool found = false; await ClickCalendar(); var calendarItems = driver.FindElementsByXPath(GetID("class", "node_modules--msteams-bridges-components-calendar-grid-dist-es-src-renderers-calendar-multi-day-renderer-calendar-multi-day-renderer__eventCard--3NBeS")); foreach (var element in calendarItems) { try { element.Click(); await Task.Delay(10); var titleElement = driver.FindElementByXPath(GetID("class", "node_modules--msteams-bridges-components-calendar-grid-dist-es-src-renderers-peek-renderer-peek-meeting-header-peek-meeting-header__subject--24TzV")); var dateElement = driver.FindElementByXPath(GetID("data-tid", "calv2-peek-date")); IWebElement SubjectChannelElement = null; try { SubjectChannelElement = driver.FindElementByXPath(GetID("data-tid", "calv2-peek-channel")); } catch { } var TeacherNameElement = driver.FindElementByXPath(GetID("data-tid", "calv2-peek-organizer")); IWebElement cancelledElement = null; try { cancelledElement = driver.FindElementByXPath(GetID("class", "node_modules--msteams-bridges-components-calendar-grid-dist-es-src-renderers-peek-renderer-peek-meeting-header-peek-meeting-header__cancelled--16Gar")); } catch { } if (cancelledElement != null) { continue; } string title = titleElement.Text; if (!dateElement.Text.Contains("-")) { throw new NotSupportedException(); } string[] split = dateElement.Text.Split('-'); split[0] = split[0].TrimEnd(' '); split[1] = split[1].TrimStart(' '); DateTime start = DateTime.ParseExact(split[0], "MMM d, yyyy h:mm tt", CultureInfo.InvariantCulture); DateTime end = DateTime.ParseExact($"{start.ToString("MMM d, yyyy")} {split[1]}", "MMM d, yyyy h:mm tt", CultureInfo.InvariantCulture); if (c.GetTuple() == (title, SubjectChannelElement == null ? "<Unknown>" : SubjectChannelElement.Text, TeacherNameElement.Text, start, end)) { found = true; break; } } catch { } RightClick(calendarBtn); await Task.Delay(1000); } if (!found) { return(false); } await Task.Delay(10); var joinbtn = driver.FindElementByXPath(GetID("data-tid", "calv2-peek-join-button")); joinbtn.Click(); await Task.Delay(2000); var toggles = driver.FindElementsByXPath(GetID("class", "style-layer")); foreach (var e in toggles) { var txt = e.GetAttribute("title"); if (txt.Contains("Turn camera off") || txt.Contains("Mute microphone")) { e.Click(); } await Task.Delay(100); } await Task.Delay(500); var joinNow = driver.FindElementByXPath(GetID("class", "join-btn ts-btn inset-border ts-btn-primary")); joinNow.Click(); await Task.Delay(5000); again: try { var ShowParticipants = driver.FindElementByXPath(GetID("id", "roster-button")); ShowParticipants.Click(); } catch { goto again; } return(true); }