"use strict"; export const DATE_FMT = new Intl.DateTimeFormat("de-DE", { month: "numeric", day: "numeric", year: "numeric", }); export const DATETIME_FMT = new Intl.DateTimeFormat("de-DE", { month: "numeric", day: "numeric", year: "numeric", hour: "numeric", minute: "numeric", }); export function dateStringNow() { return DATE_FMT.format(new Date()); } export function datetimeStringNow() { return DATETIME_FMT.format(new Date()); } declare global { var M: { cfg: { userId: number; courseId: number } }; } export function getUserId(): number { // M is exported by Moodle return globalThis.M.cfg.userId; } export function getCourseId(): number { // M is exported by Moodle return globalThis.M.cfg.courseId; } export class CourseLocalStorage { static getItem(key: string) { return localStorage.getItem(`${key}-${getCourseId()}`); } static setItem(key: string, val: string) { return localStorage.setItem(`${key}-${getCourseId()}`, val); } } export async function getUserIconUrl(userId: number): Promise { let url = CourseLocalStorage.getItem(`bycs-sol-user-icon-${userId}`); if (url) return url; const userRes = await fetch(`https://lernplattform.bycs.de/user/profile.php?id=${userId}`); const userDoc = new DOMParser().parseFromString(await userRes.text(), "text/html"); const userpicture = userDoc.querySelector(".userpicture"); if (userpicture === null) { return ""; } url = (userpicture as HTMLImageElement).src ?? ""; CourseLocalStorage.setItem(`bycs-sol-user-icon-${userId}`, url); return url; } // SplitMix32 implementation taken from: // https://github.com/bryc/code/blob/master/jshash/PRNGs.md // We only need a seeded PRNG to choose students to observe. export function splitmix32(a: number) { return function () { a |= 0; a = (a + 0x9e3779b9) | 0; let t = a ^ (a >>> 16); t = Math.imul(t, 0x21f0aaad); t = t ^ (t >>> 15); t = Math.imul(t, 0x735a2d97); return ((t = t ^ (t >>> 15)) >>> 0) / 4294967296; }; } const MOODLE_DATE_REGEX = /\w+, (\d+)\. (\w+) (\d+), (\d\d):(\d\d)/; const MONTHS: { [m: string]: number } = { Januar: 1, Februar: 2, März: 3, April: 4, Mai: 5, Juni: 6, Juli: 7, August: 8, September: 9, Oktober: 10, November: 11, Dezember: 12, }; export function parseMoodleDate(s: string) { const match = MOODLE_DATE_REGEX.exec(s); if (!match) { return new Date(-1); } const month = MONTHS[match[2]]; return new Date(Number(match[3]), month, Number(match[1]), Number(match[4]), Number(match[4])); }