edupage-api
Version:
Simple node.js package to manage your EduPage account.
203 lines (173 loc) • 5.01 kB
JavaScript
const debug = require("debug")("edupage:log");
const error = require("debug")("edupage:error");
const {FatalError, EdupageError} = require("./exceptions");
const RawData = require("../lib/RawData");
const Assignment = require("./Assignment");
const Class = require("./Class");
const Classroom = require("./Classroom");
const Edupage = require("./Edupage");
const {ENDPOINT} = require("./enums");
const Period = require("./Period");
const Student = require("./Student");
const Subject = require("./Subject");
const Teacher = require("./Teacher");
/**
* @typedef {import("../lib/RawData").RawDataObject} RawDataObject
*/
class Lesson extends RawData {
/**
* Creates an instance of Lesson.
* @param {RawDataObject} [data={}]
* @param {Edupage} [edupage=null]
* @memberof Lesson
*/
constructor(data = {}, edupage = null) {
super(data);
/**
* Edupage instance associated to this object
* @type {Edupage}
*/
this.edupage = edupage;
/**
* @type {string}
*/
this.id = data.flags.dp0.id;
/**
* @type {string}
*/
this.lid = data.flags.dp0.lid;
/**
* @type {Date}
*/
this.date = new Date(data.flags.dp0.date);
/**
* @type {string}
*/
this.homeworkNote = data.flags.dp0.note_homework;
/**
* @type {string}
*/
this.absentNote = data.flags.dp0.note_student_absent;
/**
* @type {string}
*/
this.curriculum = data.flags.dp0.note_wd || null;
/**
* @type {string}
*/
this.onlineLessonURL = data.flags.dp0.ol_url || null;
/**
* @type {boolean}
*/
this.isOnlineLesson = !!this.onlineLessonURL;
/**
* @type {Period}
*/
this.period = null;
/**
* @type {Subject}
*/
this.subject = null;
/**
* @type {Class[]}
*/
this.classes = [];
/**
* @type {Classroom[]}
*/
this.classrooms = [];
/**
* @type {Student[]}
*/
this.students = [];
/**
* @type {Teacher[]}
*/
this.teachers = [];
/**
* @type {Assignment[]}
*/
this.assignments = [];
if(this.edupage) Lesson.prototype.init.call(this);
}
/**
*
* @param {Edupage} [edupage=null]
* @memberof Lesson
* @returns {void}
*/
init(edupage = null) {
if(edupage) this.edupage = edupage;
this.period = this.edupage.periods.find(e => e.id == this._data.flags.dp0.period);
this.subject = this.edupage.subjects.find(e => e.id == this._data.flags.dp0.subjectid);
this.classes = this._data.flags.dp0.classids.map(id => this.edupage.classes.find(e => e.id == id));
this.classrooms = this._data.flags.dp0.classroomids.map(id => this.edupage.classrooms.find(e => e.id == id));
this.students = this._data.flags.dp0.studentids.map(id => this.edupage.students.find(e => e.id == id));
this.teachers = this._data.flags.dp0.teacherids.map(id => this.edupage.teachers.find(e => e.id == id));
this.assignments = this._data.flags.dp0.homeworkids.map(id =>
this.edupage.assignments.find(e => e.hwkid && e.hwkid.includes(id.split(":")[1] || id))
);
//In case the period is not specified
if(!this.period) {
const periodId = this._data.flags.dp0.period;
//There is a period id, but it's not in the periods list
if(periodId) return FatalError.warn(new ReferenceError("Failed to find period for lesson"), {
query: periodId,
periods: this.edupage.periods,
_data_lesson: this._data,
_data_edupage: this.edupage._data.dbi?.periods
});
//There is no period id specified, so use time at least
this.period = Period.getInvalid({
startTime: this._data.flags.dp0.starttime,
endTime: this._data.flags.dp0.endtime,
});
}
//Set the lesson start time
if(this.period.startTime) {
const d = this.period.startTime.split(":");
this.date.setHours(+d[0], +d[1]);
}
}
/**
*
* @return {Promise<boolean>}
* @memberof Lesson
*/
async signIntoLesson() {
return new Promise((resolve, reject) => {
if(!this.isOnlineLesson) return reject(new Error(`Cannot sign into this lesson`));
const tryFetch = async _count => {
const payload = {
"__args": [
null,
{
"click": true,
"date": this.date.toISOString().slice(0, 10),
"ol_url": this.onlineLessonURL,
"subjectid": this.subject.id
}
],
"__gsh": this.edupage.ASC.gsecHash
};
this.edupage.api({
url: ENDPOINT.DASHBOARD_SIGN_ONLINE_LESSON,
data: payload,
encodeBody: false
}).then(res => {
resolve(res.reload != true);
}).catch(err => {
if(err.retry) {
debug(`[Timetable] Got retry signal, retrying...`);
tryFetch(err.count + 1);
} else {
error(`[Timetable] Could not fetch timetables`, err);
reject(new EdupageError("Failed to fetch timetables: " + err.message));
}
});
};
tryFetch(-1);
});
}
}
module.exports = Lesson;