diff --git a/src/client.ts b/src/client.ts index 11e1072..3a451ba 100644 --- a/src/client.ts +++ b/src/client.ts @@ -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 { - const { mainRoute, timetableRoute, teacherCode, dayCode, subjectCode } = - await this.dataManager.getData() + private async getRawTimetable( + schoolCode: number, + ): Promise { + 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 + async getTimetable( + schoolCode: number, + grade: number, + ): Promise + async getTimetable( + schoolCode: number, + grade: number, + cls: number, + ): Promise + async getTimetable( + schoolCode: number, + grade: number, + cls: number, + day: number, + ): Promise + async getTimetable( + schoolCode: number, + grade: number, + cls: number, + day: number, + period: number, + ): Promise + /** 학교 코드를 이용해 학교 시간표를 불러옵니다. */ + 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] } } diff --git a/src/index.ts b/src/index.ts index e28a04c..360aa9c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,9 @@ import Comcigan from './client' +import School from './models/School' export default Comcigan +export { School } export * from './models/Region' export * from './models/School' export * from './models/Timetable' diff --git a/src/models/Fetcher.ts b/src/models/Fetcher.ts new file mode 100644 index 0000000..d1722da --- /dev/null +++ b/src/models/Fetcher.ts @@ -0,0 +1,9 @@ +import type Comcigan from '../client' + +export default class Fetcher { + protected client!: Comcigan + + constructor(client: Comcigan) { + Object.defineProperty(this, 'client', { value: client, enumerable: false }) + } +} diff --git a/src/models/Region.ts b/src/models/Region.ts index 8be4743..4223ad0 100644 --- a/src/models/Region.ts +++ b/src/models/Region.ts @@ -1,4 +1,4 @@ -export interface Region { +export default interface Region { /** 지역 코드 // TODO: 지역 코드가 아닌 것으로 보임 */ code: number /** 지역 이름 */ diff --git a/src/models/School.ts b/src/models/School.ts index 229b945..97e61f4 100644 --- a/src/models/School.ts +++ b/src/models/School.ts @@ -1,6 +1,9 @@ -import type { Region } from './Region' +import Comcigan from '../client' +import Fetcher from './Fetcher' +import type Region from './Region' +import type Timetable from './Timetable' -export interface School { +interface ISchool { /** 학교 코드 */ code: number /** 학교 이름 */ @@ -8,3 +11,54 @@ export interface School { /** 학교 지역 */ region: Region } + +export default class School extends Fetcher implements ISchool { + code: number + name: string + region: Region + + constructor(client: Comcigan, data: ISchool) { + super(client) + + this.code = data.code + this.name = data.name + this.region = data.region + } + + /** 이름으로 학교를 불러옵니다 */ + static async fromName(name: string, client?: Comcigan) { + const cls = client ?? new Comcigan() + const res = await cls.searchSchools(name) + return res[0] + } + + async getTimetable(): Promise + async getTimetable(grade: number): Promise + async getTimetable(grade: number, cls: number): Promise + async getTimetable( + grade: number, + cls: number, + day: number, + ): Promise + async getTimetable( + grade: number, + cls: number, + day: number, + period: number, + ): Promise + /** 시간표를 불러옵니다. */ + async getTimetable( + grade?: number, + cls?: number, + day?: number, + period?: number, + ) { + if (grade === undefined) return this.client.getTimetable(this.code) + if (cls === undefined) return this.client.getTimetable(this.code, grade) + if (day === undefined) + return this.client.getTimetable(this.code, grade, cls) + if (period === undefined) + return this.client.getTimetable(this.code, grade, cls, day) + return this.client.getTimetable(this.code, grade, cls, day, period) + } +} diff --git a/src/models/Timetable.ts b/src/models/Timetable.ts index 5fb043e..c807b21 100644 --- a/src/models/Timetable.ts +++ b/src/models/Timetable.ts @@ -1,30 +1,8 @@ -export interface Timetable { +export default interface Timetable { /** 과목 */ subject: string /** 교사 */ teacher: string -} - -export class TimetableManager { - constructor(private readonly timetables: Timetable[][][][]) {} - - /** 특정 학년의 시간표를 가져옵니다. */ - getByGrade(grade: number) { - return this.timetables[grade - 1] - } - - /** 특정 반의 시간표를 가져옵니다. */ - getByClass(grade: number, cls: number) { - return this.timetables[grade - 1][cls - 1] - } - - /** 특정 반의 특정 요일 시간표를 가져옵니다. */ - getByDay(grade: number, cls: number, day: number) { - return this.timetables[grade - 1][cls - 1][day - 1] - } - - /** 특정 반의 특정 요일의 특정 교시 시간표를 가져옵니다. */ - getByPeriod(grade: number, cls: number, day: number, period: number) { - return this.timetables[grade - 1][cls - 1][day - 1][period - 1] - } + /** 변경 여부 */ + changed: boolean }