Files
moodle/index.js

146 lines
4.1 KiB
JavaScript

require('dotenv').config()
const luxon = require('luxon');
const { WebUntis } = require('webuntis');
const PocketBase = require('pocketbase/cjs');
const pb = new PocketBase('https://fsae41.de');
async function getTimetabe() {
const untis = new WebUntis(process.env.WEBUNTIS_SCHOOL, process.env.WEBUNTIS_USER, process.env.WEBUNTIS_PASS, process.env.WEBUNTIS_URL);
let timetable;
try {
await untis.login();
// Start und Ende der aktuellen Woche bestimmen
const now = luxon.DateTime.local();
const startOfWeek = now.startOf('week').toJSDate(); // Montag
const endOfWeek = now.endOf('week').plus({ days: 7 * 4 * 4 }).toJSDate(); // Sonntag
// Stundenplan für diese Woche abrufen
timetable = await untis.getOwnTimetableForRange(startOfWeek, endOfWeek);
await untis.logout();
} catch (error) {
console.log(error);
}
return timetable;
}
async function main() {
const timetable = await getTimetabe();
if (!timetable || timetable.length === 0) {
console.log("No timetable data available.");
return;
}
let created = 0;
let updated = 0;
let skipped = 0;
const sorted = timetable.sort((a, b) => {
// Zuerst nach Datum
if (a.date !== b.date) {
return a.date - b.date;
}
// Falls Datum gleich, nach Startzeit
if (a.startTime !== b.startTime) {
return a.startTime - b.startTime;
}
// Falls Startzeit gleich, nach Endzeit
return a.endTime - b.endTime;
});
let final = []
for (let i = 0; i < sorted.length - 1; i++) {
let now = sorted[i];
let next = sorted[i + 1];
//gleicher tag
if (now.date == next.date) {
if (now.endTime == next.startTime) {
now.endTime = next.endTime;
final.push(now);
}
}
}
pb.autoCancellation(false);
const records = await pb.collection('classes').getFullList();
//console.log(records);
for (let i = 0; i < final.length; i++) {
let existingRecords;
try {
existingRecords = await pb.collection('classes').getList(1, 0, {
filter: 'untis_id = "' + final[i].id + '"',
});
existingRecords = existingRecords.items[0];
} catch (error) {
}
//console.log(typeof existingRecords);
if (!existingRecords) {
// Neu erstellen
const data = {
"untis_id": final[i].id,
"date": final[i].date,
"startTime": final[i].startTime,
"endTime": final[i].endTime,
"ro": JSON.stringify(final[i].ro),
"su": JSON.stringify(final[i].su),
"kl": JSON.stringify(final[i].kl),
"raw": JSON.stringify(final[i]),
"old_version": "JSON"
};
const record = await pb.collection('classes').create(data);
created++;
continue; // Überspringe die Erstellung, wenn der Datensatz bereits existiert
}
//console.log("Record with untis_id " + final[i].id + " already exists. Skipping creation.");
// Prüfe, ob etwas geändert wurde
const isChanged =
existingRecords.date != final[i].date ||
existingRecords.startTime != final[i].startTime ||
existingRecords.endTime != final[i].endTime ||
(existingRecords.kl[0].id != final[i].kl[0].id) ||
(existingRecords.ro[0].id != final[i].ro[0].id) ||
(existingRecords.su[0].id != final[i].su[0].id);
if (!isChanged) {
skipped++;
continue;
}
// Aktualisiere den bestehenden Datensatz
existingRecords.old_version = existingRecords.raw;
existingRecords.raw = JSON.stringify(final[i]);
existingRecords.date = final[i].date;
existingRecords.startTime = final[i].startTime;
existingRecords.endTime = final[i].endTime;
existingRecords.kl = final[i].kl;
existingRecords.ro = final[i].ro;
existingRecords.su = final[i].su;
existingRecords.last_update = new Date().toISOString();
const record = await pb.collection('classes').update(existingRecords.id, existingRecords);
updated++;
}
console.log(`✅ Sync done — Created: ${created}, Updated: ${updated}, Skipped: ${skipped}`);
}
main();
setInterval(async () => {
await main();
}, 1000 * 60 * 30); // Alle 30 Minuten aktualisieren