feat: interactive School class

This commit is contained in:
Starcea 2024-06-28 16:34:37 +09:00
commit 1671dda26e
No known key found for this signature in database
GPG key ID: B7A77E32374911E1
6 changed files with 130 additions and 43 deletions

View file

@ -1,8 +1,7 @@
import { BASE_URL, USER_AGENT } from './constants'
import DataManager from './data'
import type { School } from './models/School'
import type { Timetable } from './models/Timetable'
import { TimetableManager } from './models/Timetable'
import School from './models/School'
import type Timetable from './models/Timetable'
import { encodeBase64, encodeEUCKR } from './utils/encode'
import { log10int } from './utils/math'
import { parseResponse } from './utils/parse'
@ -28,17 +27,27 @@ export default class Comcigan {
: [number, string, string, number][]
}>(res.data)
return data.map(([regionCode, regionName, schoolName, schoolCode]) => ({
code: schoolCode,
name: schoolName,
region: { code: regionCode, name: regionName },
}))
return data.map(
([regionCode, regionName, schoolName, schoolCode]) =>
new School(this, {
code: schoolCode,
name: schoolName,
region: { code: regionCode, name: regionName },
}),
)
}
/** 학교 코드를 이용해 학교 시간표를 불러옵니다. */
async getRawTimetable(schoolCode: number): Promise<Timetable[][][][]> {
const { mainRoute, timetableRoute, teacherCode, dayCode, subjectCode } =
await this.dataManager.getData()
private async getRawTimetable(
schoolCode: number,
): Promise<Timetable[][][][]> {
const {
mainRoute,
timetableRoute,
teacherCode,
originalCode,
dayCode,
subjectCode,
} = await this.dataManager.getData()
const res = await this.rest.get(
`${mainRoute}_T?${encodeBase64(`${timetableRoute}_${schoolCode}_0_1`)}`,
)
@ -64,8 +73,43 @@ export default class Comcigan {
)
}
/** 학교 코드를 이용해 학교 시간표를 불러오고, `TimetableManager`로 변환해 사용할 수 있는 형태로 제공합니다. */
async getTimetable(schoolCode: number) {
return new TimetableManager(await this.getRawTimetable(schoolCode))
async getTimetable(schoolCode: number): Promise<Timetable[][][][]>
async getTimetable(
schoolCode: number,
grade: number,
): Promise<Timetable[][][]>
async getTimetable(
schoolCode: number,
grade: number,
cls: number,
): Promise<Timetable[][]>
async getTimetable(
schoolCode: number,
grade: number,
cls: number,
day: number,
): Promise<Timetable[]>
async getTimetable(
schoolCode: number,
grade: number,
cls: number,
day: number,
period: number,
): Promise<Timetable>
/** 학교 코드를 이용해 학교 시간표를 불러옵니다. */
async getTimetable(
schoolCode: number,
grade?: number,
cls?: number,
day?: number,
period?: number,
) {
const raw = await this.getRawTimetable(schoolCode)
if (grade === undefined) return raw
if (cls === undefined) return raw[grade - 1]
if (day === undefined) return raw[grade - 1][cls - 1]
if (period === undefined) return raw[grade - 1][cls - 1][day - 1]
return raw[grade - 1][cls - 1][day - 1][period - 1]
}
}