aboutsummaryrefslogtreecommitdiff
path: root/src/moodle-prod.ts
blob: 39bb1906944b66d6042875296f0a1326eec91c05 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import { getCourseId, getSesskey } from "./utils-ENV.js";

export class Activity {
	id: number;
	title: string;

	constructor(id: number, title: string) {
		this.id = id;
		this.title = title;
	}

	async update(text: string) {
		const url = `https://lernplattform.bycs.de/course/modedit.php?update=${this.id}`;
		const editRes = await fetch(url);
		const editDoc = new DOMParser().parseFromString(await editRes.text(), "text/html");
		const form = editDoc.querySelector<HTMLFormElement>('div[role="main"] > form');
		const formData = new FormData(form!);

		formData.set("page[text]", text);
		formData.set("submitbutton", "Speichern und anzeigen");
		return await fetch("/course/modedit.php", {
			method: "POST",
			body: formData,
		});
	}
}

export class Course {
	id: Number;
	title: string;
	activities: Promise<Array<Activity>>;

	constructor(id: number, title: string, courseDoc?: Document) {
		this.id = id;
		this.title = title;
		this.activities = this.fetchActivities(courseDoc);
	}

	async fetchActivities(courseDoc?: Document) {
		if (typeof courseDoc === "undefined") {
			const courseUrl = `https://lernplattform.bycs.de/course/view.php?id=${this.id}`;
			const courseRes = await fetch(courseUrl);
			courseDoc = new DOMParser().parseFromString(await courseRes.text(), "text/html");
		}

		const activities = [];
		for (const n of courseDoc.querySelectorAll(".activity-name-area")) {
			const url = n.querySelector<HTMLAnchorElement>(".aalink")?.href!;
			const match = /id=(\d+)/.exec(url);
			const a = new Activity(Number(match![1]), n.textContent.trim());
			activities.push(a);
		}

		return activities;
	}

	async getActivity(name: string) {
		const activities = await this.activities;
		for (const a of activities) {
			if (a.title.includes(name)) {
				return a;
			}
		}
		return null;
	}
}

export async function fetchCourse(courseId?: number) {
	if (typeof courseId === "undefined") {
		courseId = Number(getCourseId());
	}

	const courseUrl = `https://lernplattform.bycs.de/course/view.php?id=${courseId}`;
	const courseRes = await fetch(courseUrl);
	const courseDoc = new DOMParser().parseFromString(await courseRes.text(), "text/html");

	return new Course(courseId, courseDoc.querySelector("h1")?.innerText!, courseDoc);
}

export async function fetchCourses(pattern: string) {
	const params = {
		index: 0,
		methodname: "core_course_get_enrolled_courses_by_timeline_classification",
		args: {
			offset: 0,
			limit: 0,
			classification: "search",
			sort: "fullname",
			customfieldname: "schule",
			customfieldvalue: "Gymnasium Messestadt Riem",
			searchvalue: pattern,
			requiredfields: [
				"id",
				"fullname",
				"shortname",
				"showcoursecategory",
				"showshortname",
				"visible",
				"enddate",
			],
		},
	};

	const coursesRes = await fetch(
		`/lib/ajax/service.php?sesskey=${getSesskey()}&info=core_course_get_enrolled_courses_by_timeline_classification`,
		{
			method: "POST",
			body: JSON.stringify([params]),
		},
	);

	const coursesJSON = JSON.parse(await coursesRes.text());
	const courses = [];
	for (const o of coursesJSON[0].data.courses) {
		const c = new Course(o.id, o.fullname);
		courses.push(c);
	}

	return courses;
}