diff options
author | Minteck <contact@minteck.org> | 2022-10-18 08:59:09 +0200 |
---|---|---|
committer | Minteck <contact@minteck.org> | 2022-10-18 08:59:09 +0200 |
commit | 2c4ae43e688a9873e86211ea0e7aeb9ba770dd77 (patch) | |
tree | 17848d95522dab25d3cdeb9c4a6450e2a234861f /alarm/node_modules/pronote-api/src/fetch/timetable.js | |
parent | 108525534c28013cfe1897c30e4565f9893f3766 (diff) | |
download | pluralconnect-2c4ae43e688a9873e86211ea0e7aeb9ba770dd77.tar.gz pluralconnect-2c4ae43e688a9873e86211ea0e7aeb9ba770dd77.tar.bz2 pluralconnect-2c4ae43e688a9873e86211ea0e7aeb9ba770dd77.zip |
Update
Diffstat (limited to 'alarm/node_modules/pronote-api/src/fetch/timetable.js')
-rw-r--r-- | alarm/node_modules/pronote-api/src/fetch/timetable.js | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/alarm/node_modules/pronote-api/src/fetch/timetable.js b/alarm/node_modules/pronote-api/src/fetch/timetable.js new file mode 100644 index 0000000..059b849 --- /dev/null +++ b/alarm/node_modules/pronote-api/src/fetch/timetable.js @@ -0,0 +1,95 @@ +const { toPronoteWeek } = require('../data/dates'); +const { withId, checkDuplicates } = require('../data/id'); + +const { getFilledDaysAndWeeks, getTimetable } = require('./pronote/timetable'); + +async function timetable(session, user, from = new Date(), to = null) +{ + if (!to || to < from) { + to = new Date(from.getTime()); + to.setDate(to.getDate() + 1); + } + + const filled = await getFilledDaysAndWeeks(session, user); + if (!filled) { + return null; + } + + const fromWeek = toPronoteWeek(session, from); + const toWeek = toPronoteWeek(session, to); + + const weeks = []; + for (let i = fromWeek; i <= toWeek; i++) { + weeks.push(i); + } + + const result = []; + for (const week of weeks) { + const timetable = await getTimetable(session, user, week); + const lessons = getTimetableWeek(session, timetable); + + if (lessons) { + lessons.filter(l => l.from >= from && l.from <= to).forEach(lesson => { + if (!filled.filledWeeks.includes(week)) { + lesson.isCancelled = true; + } + + result.push(lesson); + }); + } + } + + return result.sort((a, b) => a.from - b.from); +} + +function getTimetableWeek(session, table) { + const result = []; + if (!table || !table.lessons) { + return + } + + for (const lesson of table.lessons) { + const from = lesson.date; + const to = new Date(from.getTime() + (lesson.duration / session.params.ticksPerHour * 3600000)); + + const res = { + from, + to, + isDetention: lesson.isDetention, + remoteLesson: lesson.remoteLesson, + status: lesson.status, + hasDuplicate: !!table.lessons.find(l => l.date.getTime() === from.getTime() && l !== lesson) + }; + + let room, subject, teacher; + if (lesson.isDetention) { + subject = lesson.content[0]; + teacher = lesson.content[1]; + room = lesson.content[2]; + } else { + if (lesson.content) { + subject = lesson.content.find(o => o.type === 16); + teacher = lesson.content.find(o => o.type === 3); + room = lesson.content.find(o => o.type === 17); + } else { + subject = 'Non défini'; + room = 'Non défini'; + teacher = 'Non défini'; + } + + res.isAway = (lesson.status || false) && !!lesson.status.match(/(.+)?prof(.+)?absent(.+)?/giu); + res.isCancelled = !res.isAway && lesson.isCancelled; + res.color = lesson.color; + } + + res.subject = subject && subject.name || null; + res.teacher = teacher && teacher.name || null; + res.room = room && room.name || null; + + result.push(withId(res, ['from', 'to', 'subject'])); + } + + return checkDuplicates(result); +} + +module.exports = timetable; |