import { getUserIconUrl, getCourseParticipantsUrl } from "./config.js"; /** * Class to represent Students. */ class Student { constructor(id, name, group) { this.id = id; this.name = name; this.group = group; } async getIconUrl() { return await getUserIconUrl(this.id); } } async function fetchStudent(nameFilter, groupFilter) { return await fetchStudents(nameFilter, groupFilter)[0]; } const idRegex = /id=(\d+)/; async function fetchStudents(nameFilter, groupFilter) { const res = await fetch(getCourseParticipantsUrl()); const doc = new DOMParser().parseFromString(await res.text(), "text/html"); const table = doc.querySelector("tbody"); let students = []; table.querySelectorAll("tr").forEach(row => { if (row.classList.contains("emptyrow")) return; const roleCell = row.querySelector(".c4"); // TODO(muhq): Is this locale dependent? if (roleCell.innerHTML.includes("Lehrer")) { return; } const nameCell = row.querySelector(".c1"); let name; if (nameCell.firstChild.firstChild.tagName == "SPAN") name = nameCell.firstChild.firstChild.title; else name = nameCell.innerText; const profileUrl = nameCell.querySelector("a.aabtn").href; const match = idRegex.exec(profileUrl); const id = match[1]; const groupCell = row.querySelector(".c5"); const groupsText = groupCell.querySelector("a.quickeditlink").textContent; const group = groupsText.trim(); if ((!nameFilter || name.includes(nameFilter)) && (!groupFilter || groupFilter === group)) { students.push(new Student(id, name, group)); } }); return students; } export { Student, fetchStudents, fetchStudent };