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; } setInterval(async () => { 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}`); }, 1000 * 60 * 30); // Alle 30 Minuten aktualisieren