feat: interactive School class
This commit is contained in:
parent
27874fad37
commit
1671dda26e
6 changed files with 130 additions and 43 deletions
|
|
@ -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]) => ({
|
||||
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]
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
|
|||
9
src/models/Fetcher.ts
Normal file
9
src/models/Fetcher.ts
Normal file
|
|
@ -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 })
|
||||
}
|
||||
}
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
export interface Region {
|
||||
export default interface Region {
|
||||
/** 지역 코드 // TODO: 지역 코드가 아닌 것으로 보임 */
|
||||
code: number
|
||||
/** 지역 이름 */
|
||||
|
|
|
|||
|
|
@ -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<Timetable[][][][]>
|
||||
async getTimetable(grade: number): Promise<Timetable[][][]>
|
||||
async getTimetable(grade: number, cls: number): Promise<Timetable[][]>
|
||||
async getTimetable(
|
||||
grade: number,
|
||||
cls: number,
|
||||
day: number,
|
||||
): Promise<Timetable[]>
|
||||
async getTimetable(
|
||||
grade: number,
|
||||
cls: number,
|
||||
day: number,
|
||||
period: number,
|
||||
): Promise<Timetable>
|
||||
/** 시간표를 불러옵니다. */
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue