parse-comcigan 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -9
- package/package.json +3 -3
- package/src/cache.ts +32 -0
- package/src/index.ts +33 -82
- package/src/types/index.d.ts +45 -0
- package/tsconfig.json +8 -1
- package/dist/index.d.ts +0 -106
- package/dist/index.js +0 -238
- package/dist/index.js.map +0 -1
package/README.md
CHANGED
|
@@ -31,7 +31,7 @@ import Comcigan from 'parse-comcigan';
|
|
|
31
31
|
|
|
32
32
|
const comci = new Comcigan({
|
|
33
33
|
"cacheMs": 10000, // 10초동안 캐시됩니다.
|
|
34
|
-
"doNotThrow":
|
|
34
|
+
"doNotThrow": false, // false일때, status가 4 또는 5로 시작하면 throw 됩니다.
|
|
35
35
|
"debug": (msg) => console.log(msg) // 모듈에서 디버그 메시지를 보내면 콘솔에 출력합니다.
|
|
36
36
|
});
|
|
37
37
|
```
|
|
@@ -70,17 +70,27 @@ comci.SearchSchool("서울").then(data => {
|
|
|
70
70
|
|
|
71
71
|
|파라메터|타입|필수|설명|
|
|
72
72
|
|------|------|------|-----------|
|
|
73
|
-
|
|
|
74
|
-
|criteria|"weekday" or "period"|Yes|리스트 반환을 어떻게 할지 여부입니다.|
|
|
75
|
-
|grade|number|Yes|학년|
|
|
76
|
-
|classN|number|Yes|반|
|
|
73
|
+
|options|[GetTimetableOptions](#gettimetableoptions)|Yes|옵션|
|
|
77
74
|
|
|
78
75
|
```typescript
|
|
79
|
-
comci.GetTimetable(
|
|
80
|
-
|
|
76
|
+
comci.GetTimetable({
|
|
77
|
+
"schoolCode": 96211,
|
|
78
|
+
"criteria": "period",
|
|
79
|
+
"grade": 3,
|
|
80
|
+
"classN": 5,
|
|
81
|
+
"without8th": false
|
|
82
|
+
}).then(data => {
|
|
83
|
+
console.log(data.timetable[0][7]); // [요일][교시] 월요일 8교시
|
|
81
84
|
});
|
|
82
|
-
comci.GetTimetable(
|
|
83
|
-
|
|
85
|
+
comci.GetTimetable({
|
|
86
|
+
"schoolCode": 96211,
|
|
87
|
+
"criteria": "weekday",
|
|
88
|
+
"grade": 3,
|
|
89
|
+
"classN": 5,
|
|
90
|
+
"without8th": true
|
|
91
|
+
}).then(data => {
|
|
92
|
+
console.log(data.timetable[4][0]); // [교시][요일] 월요일 5교시
|
|
93
|
+
console.log(data.timetable[7]); // undefined
|
|
84
94
|
});
|
|
85
95
|
```
|
|
86
96
|
|
|
@@ -120,8 +130,22 @@ comci.GetClassList(96211).then(data => {
|
|
|
120
130
|
|changed|string|교사|Yes|
|
|
121
131
|
|original|여기서 original만 빠진 오브젝트|원래 시간표|No|
|
|
122
132
|
|
|
133
|
+
### GetTimetableOptions
|
|
134
|
+
|
|
135
|
+
|파라메터|타입|필수|설명|
|
|
136
|
+
|------|------|------|-----------|
|
|
137
|
+
|schoolCode|number|Yes|학교 코드|
|
|
138
|
+
|criteria|"weekday" or "period"|Yes|리스트 반환을 어떻게 할지 여부입니다.|
|
|
139
|
+
|grade|number|Yes|학년|
|
|
140
|
+
|classN|number|Yes|반|
|
|
141
|
+
|
|
123
142
|
## 업데이트 로그
|
|
124
143
|
|
|
144
|
+
### 0.0.5
|
|
145
|
+
|
|
146
|
+
- 문서의 많은 오류 수정
|
|
147
|
+
- 8교시 제외 추가
|
|
148
|
+
|
|
125
149
|
### 0.0.4
|
|
126
150
|
|
|
127
151
|
- 모듈이 불러와지지 않던 버그 수정
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "parse-comcigan",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.5",
|
|
4
4
|
"description": "컴시간 알리미에서 시간표를 가져오는 라이브러리입니다.",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"dev": "nodemon --exec ts-node src/index.ts"
|
|
15
15
|
},
|
|
16
16
|
"devDependencies": {
|
|
17
|
-
"@types/node": "^22.
|
|
17
|
+
"@types/node": "^22.15.30",
|
|
18
18
|
"nodemon": "^3.1.9",
|
|
19
19
|
"ts-node": "^10.9.2",
|
|
20
20
|
"typescript": "^5.8.3"
|
|
@@ -36,4 +36,4 @@
|
|
|
36
36
|
"bugs": {
|
|
37
37
|
"url": "https://github.com/Pro203S/parse-comcigan/issues"
|
|
38
38
|
}
|
|
39
|
-
}
|
|
39
|
+
}
|
package/src/cache.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export default class Cache {
|
|
2
|
+
private _cacheStorage: Collection<{
|
|
3
|
+
"timeout": NodeJS.Timeout;
|
|
4
|
+
"data": any;
|
|
5
|
+
}> = {};
|
|
6
|
+
|
|
7
|
+
public register(id: string, data: any, duration: number) {
|
|
8
|
+
this._cacheStorage[id] = {
|
|
9
|
+
"timeout": setTimeout(() => {
|
|
10
|
+
delete this._cacheStorage[id];
|
|
11
|
+
}, duration),
|
|
12
|
+
"data": data
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
public delete(id: string) {
|
|
16
|
+
clearTimeout(this._cacheStorage[id].timeout);
|
|
17
|
+
delete this._cacheStorage[id];
|
|
18
|
+
}
|
|
19
|
+
public clear() {
|
|
20
|
+
const caches = Object.keys(this._cacheStorage);
|
|
21
|
+
for (let cache of caches) {
|
|
22
|
+
clearTimeout(this._cacheStorage[cache].timeout);
|
|
23
|
+
delete this._cacheStorage[cache];
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
public has(id: string) {
|
|
27
|
+
return Boolean(this._cacheStorage[id]);
|
|
28
|
+
}
|
|
29
|
+
public get(id: string) {
|
|
30
|
+
return this._cacheStorage[id]?.data;
|
|
31
|
+
}
|
|
32
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -1,84 +1,33 @@
|
|
|
1
1
|
import axios from 'axios';
|
|
2
2
|
import iconv from 'iconv-lite';
|
|
3
|
+
import Cache from './cache.js';
|
|
3
4
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
public has(id: string) {
|
|
32
|
-
return Boolean(this._cacheStorage[id]);
|
|
33
|
-
}
|
|
34
|
-
public get(id: string) {
|
|
35
|
-
return this._cacheStorage[id]?.data;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
//#region 내부 타입
|
|
40
|
-
type RawComciganSearched = {
|
|
41
|
-
"학교검색": [
|
|
42
|
-
number,
|
|
43
|
-
string,
|
|
44
|
-
string,
|
|
45
|
-
number
|
|
46
|
-
][];
|
|
47
|
-
};
|
|
48
|
-
type RawComciganTimetable = {
|
|
49
|
-
교사수: number;
|
|
50
|
-
성명: string[];
|
|
51
|
-
학급수: number[];
|
|
52
|
-
요일별시수: number[][];
|
|
53
|
-
과목명: any[];
|
|
54
|
-
시간표: any;
|
|
55
|
-
전일제: number[];
|
|
56
|
-
버젼: string;
|
|
57
|
-
동시수업수: number;
|
|
58
|
-
담임: number[][];
|
|
59
|
-
가상학급수: number[];
|
|
60
|
-
특별실수: number;
|
|
61
|
-
열람제한일: string;
|
|
62
|
-
저장일: string;
|
|
63
|
-
학기시작일자: string;
|
|
64
|
-
학교명: string;
|
|
65
|
-
지역명: string;
|
|
66
|
-
학년도: number;
|
|
67
|
-
분리?: number;
|
|
68
|
-
강의실: number;
|
|
69
|
-
시작일: string;
|
|
70
|
-
일과시간: string[];
|
|
71
|
-
일자자료: [number, string][];
|
|
72
|
-
오늘r: number;
|
|
73
|
-
학급시간표: any;
|
|
74
|
-
교사시간표: any[];
|
|
75
|
-
강의실시간표: any;
|
|
76
|
-
동시그룹: number[][];
|
|
77
|
-
컴시간?: string;
|
|
5
|
+
//#region 타입 export
|
|
6
|
+
export type GetTimetableOptions = {
|
|
7
|
+
/**
|
|
8
|
+
* 컴시간 학교 코드입니다.
|
|
9
|
+
*/
|
|
10
|
+
"schoolCode": number,
|
|
11
|
+
/**
|
|
12
|
+
* 구분을 어떻게 할지 여부입니다.
|
|
13
|
+
*
|
|
14
|
+
* - weekday로 설정하면 시간표[교시][요일]로 과목과 선생님을 불러옵니다.
|
|
15
|
+
* - period로 설정하면 시간표[요일][교시]로 과목과 선생님을 불러옵니다.
|
|
16
|
+
*/
|
|
17
|
+
"criteria": "weekday" | "period",
|
|
18
|
+
/**
|
|
19
|
+
* 학년입니다.
|
|
20
|
+
*/
|
|
21
|
+
"grade": number,
|
|
22
|
+
/**
|
|
23
|
+
* 반입니다.
|
|
24
|
+
*/
|
|
25
|
+
"classN": number,
|
|
26
|
+
/**
|
|
27
|
+
* 8교시를 빼고 리턴할지 여부입니다.
|
|
28
|
+
*/
|
|
29
|
+
"without8th"?: boolean,
|
|
78
30
|
};
|
|
79
|
-
//#endregion
|
|
80
|
-
|
|
81
|
-
//#region 외부 타입
|
|
82
31
|
export interface ComciganInitializeType {
|
|
83
32
|
/**
|
|
84
33
|
* 이 기간동안 컴시간과 통신한 데이터가 캐시됩니다.
|
|
@@ -230,7 +179,9 @@ export default class Comcigan {
|
|
|
230
179
|
* @param schoolCode
|
|
231
180
|
* @param criteria
|
|
232
181
|
*/
|
|
233
|
-
public async GetTimetable(
|
|
182
|
+
public async GetTimetable(options: GetTimetableOptions): Promise<ComciganTimetable | undefined> {
|
|
183
|
+
const { schoolCode, criteria, grade, classN, without8th } = options;
|
|
184
|
+
|
|
234
185
|
const str = `36174_${schoolCode}_1_4_0_3_1.00`;
|
|
235
186
|
const route = (str.substring(9) + str.substring(0, 9)).split("").reverse().join("");
|
|
236
187
|
const data = await this.request<string>(`7813?${route}`, true);
|
|
@@ -254,7 +205,7 @@ export default class Comcigan {
|
|
|
254
205
|
if (criteria === "period") {
|
|
255
206
|
for (let weekday = 1; weekday < WEEKDAY.length + 1; weekday++) {
|
|
256
207
|
const weekdayList: ComciganTimetableObject[] = [];
|
|
257
|
-
for (let period = 1; period < 9; period++) {
|
|
208
|
+
for (let period = 1; period < (without8th ? 8 : 9); period++) {
|
|
258
209
|
const o = origin[weekday][period];
|
|
259
210
|
const t = today[weekday][period];
|
|
260
211
|
|
|
@@ -292,7 +243,7 @@ export default class Comcigan {
|
|
|
292
243
|
toReturn.push(weekdayList);
|
|
293
244
|
}
|
|
294
245
|
} else {
|
|
295
|
-
for (let period = 1; period < 9; period++) {
|
|
246
|
+
for (let period = 1; period < (without8th ? 8 : 9); period++) {
|
|
296
247
|
const periodList: ComciganTimetableObject[] = [];
|
|
297
248
|
for (let weekday = 1; weekday < WEEKDAY.length + 1; weekday++) {
|
|
298
249
|
const o = origin[weekday][period];
|
|
@@ -356,9 +307,9 @@ export default class Comcigan {
|
|
|
356
307
|
const json: RawComciganTimetable = JSON.parse(step2.slice(0, step2.indexOf("}") + 1));
|
|
357
308
|
const rawClasses = json.학급수;
|
|
358
309
|
if (!rawClasses) return [];
|
|
359
|
-
|
|
310
|
+
|
|
360
311
|
const toReturn: string[] = [];
|
|
361
|
-
|
|
312
|
+
|
|
362
313
|
for (let g = 1; g < rawClasses.length; g++) {
|
|
363
314
|
for (let c = 1; c < rawClasses[g] + 1; c++) {
|
|
364
315
|
toReturn.push(`${g}-${c}`);
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
declare global {
|
|
2
|
+
type Collection<V = any> = { [key: string]: V };
|
|
3
|
+
|
|
4
|
+
type RawComciganSearched = {
|
|
5
|
+
"학교검색": [
|
|
6
|
+
number,
|
|
7
|
+
string,
|
|
8
|
+
string,
|
|
9
|
+
number
|
|
10
|
+
][];
|
|
11
|
+
};
|
|
12
|
+
type RawComciganTimetable = {
|
|
13
|
+
교사수: number;
|
|
14
|
+
성명: string[];
|
|
15
|
+
학급수: number[];
|
|
16
|
+
요일별시수: number[][];
|
|
17
|
+
과목명: any[];
|
|
18
|
+
시간표: any;
|
|
19
|
+
전일제: number[];
|
|
20
|
+
버젼: string;
|
|
21
|
+
동시수업수: number;
|
|
22
|
+
담임: number[][];
|
|
23
|
+
가상학급수: number[];
|
|
24
|
+
특별실수: number;
|
|
25
|
+
열람제한일: string;
|
|
26
|
+
저장일: string;
|
|
27
|
+
학기시작일자: string;
|
|
28
|
+
학교명: string;
|
|
29
|
+
지역명: string;
|
|
30
|
+
학년도: number;
|
|
31
|
+
분리?: number;
|
|
32
|
+
강의실: number;
|
|
33
|
+
시작일: string;
|
|
34
|
+
일과시간: string[];
|
|
35
|
+
일자자료: [number, string][];
|
|
36
|
+
오늘r: number;
|
|
37
|
+
학급시간표: any;
|
|
38
|
+
교사시간표: any[];
|
|
39
|
+
강의실시간표: any;
|
|
40
|
+
동시그룹: number[][];
|
|
41
|
+
컴시간?: string;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export { }
|
package/tsconfig.json
CHANGED
|
@@ -11,7 +11,14 @@
|
|
|
11
11
|
"esModuleInterop": true,
|
|
12
12
|
"declaration": true,
|
|
13
13
|
"strict": true,
|
|
14
|
-
"sourceMap": true
|
|
14
|
+
"sourceMap": true,
|
|
15
|
+
"types": [
|
|
16
|
+
"node"
|
|
17
|
+
],
|
|
18
|
+
"typeRoots": [
|
|
19
|
+
"./src/types",
|
|
20
|
+
"./node_modules/@types"
|
|
21
|
+
]
|
|
15
22
|
},
|
|
16
23
|
"include": [
|
|
17
24
|
"src/**/*"
|
package/dist/index.d.ts
DELETED
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
export interface ComciganInitializeType {
|
|
2
|
-
/**
|
|
3
|
-
* 이 기간동안 컴시간과 통신한 데이터가 캐시됩니다.
|
|
4
|
-
*
|
|
5
|
-
* 기본값은 0ms이며, 0ms일때는 캐시를 하지 않습니다.
|
|
6
|
-
*/
|
|
7
|
-
cacheMs?: number;
|
|
8
|
-
/**
|
|
9
|
-
* axios에서 요청을 보내고 status가 오류 status일 때 throw할 지 여부입니다.
|
|
10
|
-
* 만약 false일 때 요청에 status가 오류 status면 그 타입에서 빈 값을 리턴합니다.
|
|
11
|
-
*
|
|
12
|
-
* 기본값은 false입니다.
|
|
13
|
-
*/
|
|
14
|
-
doNotThrow?: boolean;
|
|
15
|
-
/**
|
|
16
|
-
* 디버그 메시지를 파라메터로 받습니다.
|
|
17
|
-
*
|
|
18
|
-
* 기본값은 없습니다.
|
|
19
|
-
*/
|
|
20
|
-
debug?: (msg: string) => any;
|
|
21
|
-
}
|
|
22
|
-
export type ComciganSearched = {
|
|
23
|
-
/**
|
|
24
|
-
* 학교의 지역입니다.
|
|
25
|
-
*/
|
|
26
|
-
region: string;
|
|
27
|
-
/**
|
|
28
|
-
* 학교의 이름입니다.
|
|
29
|
-
*/
|
|
30
|
-
name: string;
|
|
31
|
-
/**
|
|
32
|
-
* 학교의 코드입니다.
|
|
33
|
-
*/
|
|
34
|
-
code: number;
|
|
35
|
-
};
|
|
36
|
-
export type ComciganTimetableObject = {
|
|
37
|
-
/**
|
|
38
|
-
* 과목입니다.
|
|
39
|
-
*/
|
|
40
|
-
subject: string;
|
|
41
|
-
/**
|
|
42
|
-
* 교사 성명입니다.
|
|
43
|
-
*/
|
|
44
|
-
teacher: string;
|
|
45
|
-
/**
|
|
46
|
-
* 만약 변경되었을때 이 값이 주어집니다.
|
|
47
|
-
*/
|
|
48
|
-
original?: {
|
|
49
|
-
/**
|
|
50
|
-
* 과목입니다.
|
|
51
|
-
*/
|
|
52
|
-
subject: string;
|
|
53
|
-
/**
|
|
54
|
-
* 교사 성명입니다.
|
|
55
|
-
*/
|
|
56
|
-
teacher: string;
|
|
57
|
-
};
|
|
58
|
-
};
|
|
59
|
-
export type ComciganTimetable = {
|
|
60
|
-
/**
|
|
61
|
-
* 컴시간알리미 앱의 최신 버전입니다.
|
|
62
|
-
*/
|
|
63
|
-
latestVersion: string;
|
|
64
|
-
/**
|
|
65
|
-
* 수정일입니다.
|
|
66
|
-
*/
|
|
67
|
-
changed: string;
|
|
68
|
-
/**
|
|
69
|
-
* 시간표입니다.
|
|
70
|
-
*/
|
|
71
|
-
timetable: ComciganTimetableObject[][];
|
|
72
|
-
};
|
|
73
|
-
export default class Comcigan {
|
|
74
|
-
private _options;
|
|
75
|
-
private _cache;
|
|
76
|
-
private mSb;
|
|
77
|
-
private mTh;
|
|
78
|
-
private request;
|
|
79
|
-
private EUC_KR_encodeURI;
|
|
80
|
-
/**
|
|
81
|
-
* 파서를 초기화 합니다.
|
|
82
|
-
* @param options 파서의 옵션입니다.
|
|
83
|
-
*/
|
|
84
|
-
constructor(options?: ComciganInitializeType);
|
|
85
|
-
/**
|
|
86
|
-
* 학교를 검색합니다.
|
|
87
|
-
* 마지막 "없으면 추가 검색 하세요" 문구는 빠져서 나옵니다.
|
|
88
|
-
* @param query 검색어
|
|
89
|
-
* @returns 검색된 학교들
|
|
90
|
-
*/
|
|
91
|
-
SearchSchool(query: string): Promise<ComciganSearched[]>;
|
|
92
|
-
/**
|
|
93
|
-
* 시간표를 가져옵니다.
|
|
94
|
-
*
|
|
95
|
-
* @param schoolCode
|
|
96
|
-
* @param criteria
|
|
97
|
-
*/
|
|
98
|
-
GetTimetable(schoolCode: number, criteria: "weekday" | "period", grade: number, classN: number): Promise<ComciganTimetable | undefined>;
|
|
99
|
-
/**
|
|
100
|
-
* 학급 목록을 가져옵니다.
|
|
101
|
-
*
|
|
102
|
-
* @param schoolCode 학교 코드입니다.
|
|
103
|
-
* @returns (학년)-(반) 문자열이 모인 배열
|
|
104
|
-
*/
|
|
105
|
-
GetClassList(schoolCode: number): Promise<string[]>;
|
|
106
|
-
}
|
package/dist/index.js
DELETED
|
@@ -1,238 +0,0 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
import axios from 'axios';
|
|
11
|
-
import iconv from 'iconv-lite';
|
|
12
|
-
class Cache {
|
|
13
|
-
constructor() {
|
|
14
|
-
this._cacheStorage = {};
|
|
15
|
-
}
|
|
16
|
-
register(id, data, duration) {
|
|
17
|
-
this._cacheStorage[id] = {
|
|
18
|
-
"timeout": setTimeout(() => {
|
|
19
|
-
delete this._cacheStorage[id];
|
|
20
|
-
}, duration),
|
|
21
|
-
"data": data
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
delete(id) {
|
|
25
|
-
clearTimeout(this._cacheStorage[id].timeout);
|
|
26
|
-
delete this._cacheStorage[id];
|
|
27
|
-
}
|
|
28
|
-
clear() {
|
|
29
|
-
const caches = Object.keys(this._cacheStorage);
|
|
30
|
-
for (let cache of caches) {
|
|
31
|
-
clearTimeout(this._cacheStorage[cache].timeout);
|
|
32
|
-
delete this._cacheStorage[cache];
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
has(id) {
|
|
36
|
-
return Boolean(this._cacheStorage[id]);
|
|
37
|
-
}
|
|
38
|
-
get(id) {
|
|
39
|
-
var _a;
|
|
40
|
-
return (_a = this._cacheStorage[id]) === null || _a === void 0 ? void 0 : _a.data;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
//#endregion
|
|
44
|
-
export default class Comcigan {
|
|
45
|
-
mSb(mm, m2) { if (m2 == 100) {
|
|
46
|
-
return mm % m2;
|
|
47
|
-
} return Math.floor(mm / m2); }
|
|
48
|
-
mTh(mm, m2) { if (m2 == 100) {
|
|
49
|
-
return Math.floor(mm / m2);
|
|
50
|
-
} return mm % m2; }
|
|
51
|
-
request(route, doNotParse) {
|
|
52
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
53
|
-
if (this._cache.has(route)) {
|
|
54
|
-
this._options.debug ? this._options.debug(`[request] Return cache with id registered as ${route}`) : 0;
|
|
55
|
-
return this._cache.get(route);
|
|
56
|
-
}
|
|
57
|
-
this._options.debug ? this._options.debug(`[request] Requesting to http://comci.kr:4081/${route}`) : 0;
|
|
58
|
-
const r = yield axios.get(`http://comci.kr:4081/${route}`, Object.assign({}, (this._options.doNotThrow && { "validateStatus": () => true })));
|
|
59
|
-
if (doNotParse) {
|
|
60
|
-
if (this._options.cacheMs && this._options.cacheMs !== 0) {
|
|
61
|
-
this._options.debug ? this._options.debug(`[request] Registered cache with id ${route}`) : 0;
|
|
62
|
-
this._cache.register(route, r.data, this._options.cacheMs);
|
|
63
|
-
}
|
|
64
|
-
return r.data;
|
|
65
|
-
}
|
|
66
|
-
const data = JSON.parse(r.data.slice(0, r.data.indexOf("}") + 1));
|
|
67
|
-
if (this._options.cacheMs && this._options.cacheMs !== 0) {
|
|
68
|
-
this._options.debug ? this._options.debug(`[request] Registered cache with id ${route}`) : 0;
|
|
69
|
-
this._cache.register(route, data, this._options.cacheMs);
|
|
70
|
-
}
|
|
71
|
-
return data;
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
EUC_KR_encodeURI(str) {
|
|
75
|
-
const buffer = iconv.encode(str, 'euc-kr');
|
|
76
|
-
return Array.from(buffer)
|
|
77
|
-
.map((byte) => '%' + byte.toString(16).toUpperCase().padStart(2, '0'))
|
|
78
|
-
.join('');
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* 파서를 초기화 합니다.
|
|
82
|
-
* @param options 파서의 옵션입니다.
|
|
83
|
-
*/
|
|
84
|
-
constructor(options) {
|
|
85
|
-
this._options = {
|
|
86
|
-
"cacheMs": 0,
|
|
87
|
-
"doNotThrow": false
|
|
88
|
-
};
|
|
89
|
-
this._cache = new Cache();
|
|
90
|
-
this._options = Object.assign(Object.assign({}, this._options), options);
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* 학교를 검색합니다.
|
|
94
|
-
* 마지막 "없으면 추가 검색 하세요" 문구는 빠져서 나옵니다.
|
|
95
|
-
* @param query 검색어
|
|
96
|
-
* @returns 검색된 학교들
|
|
97
|
-
*/
|
|
98
|
-
SearchSchool(query) {
|
|
99
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
100
|
-
const r = yield this.request(`sc_${this.EUC_KR_encodeURI(query)}`);
|
|
101
|
-
return r.학교검색.map(v => ({
|
|
102
|
-
"region": v[1],
|
|
103
|
-
"name": v[2],
|
|
104
|
-
"code": v[3]
|
|
105
|
-
})).filter(v => v.code !== 0);
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* 시간표를 가져옵니다.
|
|
110
|
-
*
|
|
111
|
-
* @param schoolCode
|
|
112
|
-
* @param criteria
|
|
113
|
-
*/
|
|
114
|
-
GetTimetable(schoolCode, criteria, grade, classN) {
|
|
115
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
116
|
-
var _a;
|
|
117
|
-
const str = `36174_${schoolCode}_1_4_0_3_1.00`;
|
|
118
|
-
const route = (str.substring(9) + str.substring(0, 9)).split("").reverse().join("");
|
|
119
|
-
const data = yield this.request(`7813?${route}`, true);
|
|
120
|
-
const [latestVersion, step1] = data.split("^");
|
|
121
|
-
const edited = step1.substring(0, step1.indexOf("{"));
|
|
122
|
-
const step2 = step1.slice(step1.indexOf("{"));
|
|
123
|
-
const json = JSON.parse(step2.slice(0, step2.indexOf("}") + 1));
|
|
124
|
-
const WEEKDAY = ["월", "화", "수", "목", "금"];
|
|
125
|
-
const sep = (_a = json.분리) !== null && _a !== void 0 ? _a : 100;
|
|
126
|
-
if (!json.시간표)
|
|
127
|
-
return undefined;
|
|
128
|
-
// 시간표[학년][반][요일][교시]
|
|
129
|
-
const origin = json.시간표[grade][classN];
|
|
130
|
-
const today = json.학급시간표[grade][classN];
|
|
131
|
-
const toReturn = [];
|
|
132
|
-
if (criteria === "period") {
|
|
133
|
-
for (let weekday = 1; weekday < WEEKDAY.length + 1; weekday++) {
|
|
134
|
-
const weekdayList = [];
|
|
135
|
-
for (let period = 1; period < 9; period++) {
|
|
136
|
-
const o = origin[weekday][period];
|
|
137
|
-
const t = today[weekday][period];
|
|
138
|
-
if (!o || !t) {
|
|
139
|
-
weekdayList.push({
|
|
140
|
-
"subject": "-",
|
|
141
|
-
"teacher": "-"
|
|
142
|
-
});
|
|
143
|
-
continue;
|
|
144
|
-
}
|
|
145
|
-
const originSubject = json.과목명[this.mSb(o, sep) % sep];
|
|
146
|
-
const originTeacher = json.성명[this.mTh(o, sep) % sep];
|
|
147
|
-
if (o === t) {
|
|
148
|
-
weekdayList.push({
|
|
149
|
-
"subject": originSubject,
|
|
150
|
-
"teacher": originTeacher
|
|
151
|
-
});
|
|
152
|
-
continue;
|
|
153
|
-
}
|
|
154
|
-
const changedSubject = json.과목명[this.mSb(t, sep) % sep];
|
|
155
|
-
const changedTeacher = json.성명[this.mTh(t, sep) % sep];
|
|
156
|
-
weekdayList.push({
|
|
157
|
-
"subject": originSubject,
|
|
158
|
-
"teacher": originTeacher,
|
|
159
|
-
"original": {
|
|
160
|
-
"subject": changedSubject,
|
|
161
|
-
"teacher": changedTeacher
|
|
162
|
-
}
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
toReturn.push(weekdayList);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
else {
|
|
169
|
-
for (let period = 1; period < 9; period++) {
|
|
170
|
-
const periodList = [];
|
|
171
|
-
for (let weekday = 1; weekday < WEEKDAY.length + 1; weekday++) {
|
|
172
|
-
const o = origin[weekday][period];
|
|
173
|
-
const t = today[weekday][period];
|
|
174
|
-
if (!o || !t) {
|
|
175
|
-
periodList.push({
|
|
176
|
-
"subject": "-",
|
|
177
|
-
"teacher": "-"
|
|
178
|
-
});
|
|
179
|
-
continue;
|
|
180
|
-
}
|
|
181
|
-
const originSubject = json.과목명[this.mSb(o, sep) % sep];
|
|
182
|
-
const originTeacher = json.성명[this.mTh(o, sep) % sep];
|
|
183
|
-
if (o === t) {
|
|
184
|
-
periodList.push({
|
|
185
|
-
"subject": originSubject,
|
|
186
|
-
"teacher": originTeacher
|
|
187
|
-
});
|
|
188
|
-
continue;
|
|
189
|
-
}
|
|
190
|
-
const changedSubject = json.과목명[this.mSb(t, sep) % sep];
|
|
191
|
-
const changedTeacher = json.성명[this.mTh(t, sep) % sep];
|
|
192
|
-
periodList.push({
|
|
193
|
-
"subject": originSubject,
|
|
194
|
-
"teacher": originTeacher,
|
|
195
|
-
"original": {
|
|
196
|
-
"subject": changedSubject,
|
|
197
|
-
"teacher": changedTeacher
|
|
198
|
-
}
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
toReturn.push(periodList);
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
return {
|
|
205
|
-
"changed": edited,
|
|
206
|
-
latestVersion,
|
|
207
|
-
"timetable": toReturn
|
|
208
|
-
};
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
/**
|
|
212
|
-
* 학급 목록을 가져옵니다.
|
|
213
|
-
*
|
|
214
|
-
* @param schoolCode 학교 코드입니다.
|
|
215
|
-
* @returns (학년)-(반) 문자열이 모인 배열
|
|
216
|
-
*/
|
|
217
|
-
GetClassList(schoolCode) {
|
|
218
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
219
|
-
const str = `36174_${schoolCode}_1_4_0_3_1.00`;
|
|
220
|
-
const route = (str.substring(9) + str.substring(0, 9)).split("").reverse().join("");
|
|
221
|
-
const data = yield this.request(`7813?${route}`, true);
|
|
222
|
-
const step1 = data.split("^")[1];
|
|
223
|
-
const step2 = step1.slice(step1.indexOf("{"));
|
|
224
|
-
const json = JSON.parse(step2.slice(0, step2.indexOf("}") + 1));
|
|
225
|
-
const rawClasses = json.학급수;
|
|
226
|
-
if (!rawClasses)
|
|
227
|
-
return [];
|
|
228
|
-
const toReturn = [];
|
|
229
|
-
for (let g = 1; g < rawClasses.length; g++) {
|
|
230
|
-
for (let c = 1; c < rawClasses[g] + 1; c++) {
|
|
231
|
-
toReturn.push(`${g}-${c}`);
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
return toReturn;
|
|
235
|
-
});
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|