zdu-student-api 1.1.6 → 1.1.8

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.
Files changed (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +231 -18
  3. package/dist/cabinet/cabinet.d.ts +79 -79
  4. package/dist/cabinet/cabinet.js +162 -162
  5. package/dist/cabinet/data.d.ts +33 -4
  6. package/dist/cabinet/data.js +52 -6
  7. package/dist/cabinet/disciplines.d.ts +19 -19
  8. package/dist/cabinet/disciplines.js +87 -87
  9. package/dist/cabinet/index.d.ts +2 -5
  10. package/dist/cabinet/index.js +2 -5
  11. package/dist/cabinet/parsers.d.ts +22 -3
  12. package/dist/cabinet/parsers.js +118 -0
  13. package/dist/cabinet/scores.d.ts +12 -12
  14. package/dist/cabinet/scores.js +101 -101
  15. package/dist/cabinet/sesId.d.ts +10 -10
  16. package/dist/cabinet/sesId.js +40 -40
  17. package/dist/cabinet/session.d.ts +33 -0
  18. package/dist/cabinet/session.js +99 -0
  19. package/dist/cabinet/types.d.ts +0 -137
  20. package/dist/cabinet/utils.d.ts +6 -6
  21. package/dist/cabinet/utils.js +16 -19
  22. package/dist/cabinet/validSession.d.ts +8 -8
  23. package/dist/cabinet/validSession.js +29 -29
  24. package/dist/cabinetStudent/cabinetStudent.d.ts +87 -0
  25. package/dist/cabinetStudent/cabinetStudent.js +185 -0
  26. package/dist/cabinetStudent/disciplines.d.ts +19 -0
  27. package/dist/cabinetStudent/disciplines.js +86 -0
  28. package/dist/cabinetStudent/index.d.ts +4 -0
  29. package/dist/cabinetStudent/index.js +4 -0
  30. package/dist/cabinetStudent/scores.d.ts +12 -0
  31. package/dist/cabinetStudent/scores.js +103 -0
  32. package/dist/cabinetStudent/types.d.ts +137 -0
  33. package/dist/cabinetStudent/types.js +1 -0
  34. package/dist/cabinetTeacher/academicGroups.d.ts +10 -0
  35. package/dist/cabinetTeacher/academicGroups.js +36 -0
  36. package/dist/cabinetTeacher/cabinetTeacher.d.ts +71 -0
  37. package/dist/cabinetTeacher/cabinetTeacher.js +132 -0
  38. package/dist/cabinetTeacher/index.d.ts +3 -0
  39. package/dist/cabinetTeacher/index.js +3 -0
  40. package/dist/cabinetTeacher/types.d.ts +68 -0
  41. package/dist/cabinetTeacher/types.js +1 -0
  42. package/dist/examples.d.ts +1 -1
  43. package/dist/examples.js +50 -38
  44. package/dist/index.d.ts +2 -0
  45. package/dist/index.js +2 -0
  46. package/dist/types.d.ts +4 -3
  47. package/package.json +35 -34
@@ -0,0 +1,132 @@
1
+ import { getSesId } from '../cabinet/session.js';
2
+ import { isValidSession } from '../cabinet/session.js';
3
+ import { getAcademicGroups } from './academicGroups.js';
4
+ import { getDataTeacher } from '../cabinet/data.js';
5
+ import { getSemester } from '../cabinet/utils.js';
6
+ /**
7
+ * Клас кабінету викладача
8
+ * @category CabinetTeacher
9
+ */
10
+ export class CabinetTeacher {
11
+ /**
12
+ * Логін користувача
13
+ */
14
+ login;
15
+ /**
16
+ * Пароль від кабінету викладача
17
+ */
18
+ password;
19
+ /**
20
+ * ID сесії викладача
21
+ */
22
+ sesID;
23
+ /**
24
+ * GUID сесії з cookie
25
+ */
26
+ sessGUID;
27
+ /**
28
+ * Семестр для пошуку оцінок (0 - перший, 1 - другий)
29
+ */
30
+ semester = 1;
31
+ /**
32
+ * Данні викладача {@link DataTeacher}
33
+ */
34
+ data;
35
+ /**
36
+ * Список академічних груп {@link AcademicGroup}
37
+ */
38
+ academicGroups = [];
39
+ /**
40
+ * Конструктор
41
+ * @param login - Логін користувача
42
+ * @param password - Пароль
43
+ */
44
+ constructor(login, password) {
45
+ this.login = login;
46
+ this.password = password;
47
+ }
48
+ /**
49
+ * Авторизація
50
+ */
51
+ async auth(login, password) {
52
+ const accountData = await getSesId(login ?? this.login, password ?? this.password, 'teacher');
53
+ this.setSemester();
54
+ if (accountData.ok) {
55
+ this.sesID = accountData.sesID;
56
+ this.sessGUID = accountData.sessGUID;
57
+ return true;
58
+ }
59
+ return false;
60
+ }
61
+ /**
62
+ * Базове значення семестру
63
+ */
64
+ setSemester() {
65
+ this.semester = getSemester();
66
+ }
67
+ /**
68
+ * Отримання всіх данних
69
+ */
70
+ async loadData() {
71
+ const one = (await this.getAcademicGroups()).ok;
72
+ const two = (await this.getData()).ok;
73
+ return one && two;
74
+ }
75
+ /**
76
+ * Відновлення сесії
77
+ */
78
+ async setSession(sesID, sessGUID) {
79
+ this.setSemester();
80
+ const ses = await isValidSession(sesID, sessGUID, 'teacher');
81
+ if (ses) {
82
+ this.sesID = sesID;
83
+ this.sessGUID = sessGUID;
84
+ }
85
+ return ses;
86
+ }
87
+ /**
88
+ * Перевірка валідності сесії
89
+ */
90
+ async isValidSession() {
91
+ if (!this.sesID || !this.sessGUID)
92
+ return false;
93
+ return await isValidSession(this.sesID, this.sessGUID, 'teacher');
94
+ }
95
+ /**
96
+ * Отримати всі академічні групи
97
+ * @returns Об'єкт академічних груп {@link AcademicGroups}
98
+ */
99
+ async getAcademicGroups() {
100
+ if (!this.sesID || !this.sessGUID)
101
+ return { ok: false, groups: [] };
102
+ try {
103
+ const academicGroupsData = await getAcademicGroups(this.sesID, this.sessGUID);
104
+ if (academicGroupsData.ok) {
105
+ this.academicGroups = academicGroupsData.groups;
106
+ }
107
+ return academicGroupsData;
108
+ }
109
+ catch {
110
+ return { ok: false, groups: [] };
111
+ }
112
+ }
113
+ /**
114
+ * Отримати анкетні данні викладача
115
+ * @returns Об'єкт {@link Data}
116
+ */
117
+ async getData() {
118
+ if (!this.sesID || !this.sessGUID)
119
+ return { ok: false };
120
+ try {
121
+ const data = await getDataTeacher(this.sesID, this.sessGUID);
122
+ if (data.ok) {
123
+ this.data = data;
124
+ }
125
+ return data;
126
+ }
127
+ catch (err) {
128
+ console.log(err);
129
+ return { ok: false };
130
+ }
131
+ }
132
+ }
@@ -0,0 +1,3 @@
1
+ export * from './types.js';
2
+ export * from './academicGroups.js';
3
+ export * from './cabinetTeacher.js';
@@ -0,0 +1,3 @@
1
+ export * from './types.js';
2
+ export * from './academicGroups.js';
3
+ export * from './cabinetTeacher.js';
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Дані викладача з головної сторінки кабінету
3
+ * @category CabinetTeacher
4
+ * @remarks
5
+ * **Статус запиту:**
6
+ * - `ok` — Успіх отримання даних (true/false)
7
+ *
8
+ * **ПІБ викладача:**
9
+ * - `fullName` — Повне ім'я викладача (Прізвище Ім'я По батькові)
10
+ * - `lastName` — Прізвище
11
+ * - `firstName` — Ім'я
12
+ * - `middleName` — По батькові
13
+ *
14
+ * **Інформація про роботу:**
15
+ * - `department` — Назва кафедри
16
+ * - `partTimeHours` — Кількість годин за сумісництвом (число без "год.")
17
+ * - `workDurationMonths` — Тривалість роботи в навчальному році (місяців)
18
+ * - `totalPositionHours` — Загальна кількість годин за ставками (число без "год.")
19
+ * - `workloadByStaff` — Розподілене навантаження за штатом (число без "год.")
20
+ * - `totalWorkload` — Загальне розподілене навантаження (число без "год.")
21
+ */
22
+ export interface DataTeacher {
23
+ ok: boolean;
24
+ fullName?: string;
25
+ lastName?: string;
26
+ firstName?: string;
27
+ middleName?: string;
28
+ department?: string;
29
+ partTimeHours?: number;
30
+ workDurationMonths?: number;
31
+ totalPositionHours?: number;
32
+ workloadByStaff?: number;
33
+ totalWorkload?: number;
34
+ }
35
+ /**
36
+ * Інформація про академічну групу
37
+ * @category CabinetTeacher
38
+ * @remarks
39
+ * - `name` — Назва групи (наприклад: "23Мд-СОфіз")
40
+ * - `semester` — Семестр: "1" (перше), "2" (друге)
41
+ * - `encodedName` — URL-encoded назва групи для запитів
42
+ * - `course` — Номер курсу (1-4)
43
+ * - `specialty` — Повна назва спеціальності з кодом
44
+ * - `faculty` — Назва факультету
45
+ * - `teacherId` — ID викладача з параметра teacher в URL
46
+ * - `journalUrl` — Відносний URL для переходу до журналу групи
47
+ */
48
+ export interface AcademicGroup {
49
+ name: string;
50
+ semester: number;
51
+ encodedName: string;
52
+ course: number;
53
+ specialty: string;
54
+ faculty: string;
55
+ teacherId: string;
56
+ journalUrl: string;
57
+ }
58
+ /**
59
+ * Список академічних груп викладача
60
+ * @category CabinetTeacher
61
+ * @remarks
62
+ * - `ok` — Успіх отримання даних (true/false)
63
+ * - `groups` — Масив груп {@link Group}
64
+ */
65
+ export interface AcademicGroups {
66
+ ok: boolean;
67
+ groups: AcademicGroup[];
68
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -1 +1 @@
1
- export {};
1
+ import 'dotenv/config';
package/dist/examples.js CHANGED
@@ -1,4 +1,4 @@
1
- import { Cabinet } from './index.js';
1
+ import 'dotenv/config';
2
2
  // const schedule = new Schedule();
3
3
  // schedule.group = '23Бд-СОінф123'
4
4
  // schedule.type = 'group'
@@ -23,9 +23,9 @@ import { Cabinet } from './index.js';
23
23
  // } catch (err: any) {
24
24
  // console.error(err.message);
25
25
  // }
26
- //console.log((await getGroups('25Бд-Комп'))) // -3158
27
- // console.log((await getTeachers('Кривонос Олександр')))
28
- // console.log((await getRooms('319')))
26
+ // console.log(await getGroups('25Бд-Комп')); // -3158
27
+ // console.log(await getTeachers('Кривонос Олександр'));
28
+ // console.log(await getRooms('319'));
29
29
  // const audience = new Audience();
30
30
  // audience.blockName = "гуртож №3"
31
31
  // try {
@@ -39,10 +39,10 @@ import { Cabinet } from './index.js';
39
39
  // console.log((await getSesId("FFFFF", "123456789")))
40
40
  // console.log(cb.data);
41
41
  // console.log(cb.disciplines);
42
- // const { sesID, sessGUID } = await getSesId('Хоречко', '1357900');
42
+ // const { sesID, sessGUID } = await getSesId(process.env.LOGIN!, process.env.PASSWORD!);
43
43
  // console.log(sesID, sessGUID);
44
- // const sesID = '2850142C-AF52-4291-90C6-7EF356F90530';
45
- // const sessGUID = '20225423078dcb37d97904b76ba534af';
44
+ // const sesID = '';
45
+ // const sessGUID = '';
46
46
  // const data = await getData(sesID, sessGUID);
47
47
  // const data = await getDisciplines(sesID, sessGUID);
48
48
  // const data = await getСurrentDisciplines(sesID, sessGUID);
@@ -50,35 +50,47 @@ import { Cabinet } from './index.js';
50
50
  // const data2 = await getScores(sesID, sessGUID, '43910', 0);
51
51
  // // console.log(data2);
52
52
  // const me = data2.studentScores.find((s) => s.id === data2.studentId)!;
53
- const sesID = '2850142C-AF52-4291-90C6-7EF356F90530';
54
- const sessGUID = '20225423078dcb37d97904b76ba534af';
55
- const cb = new Cabinet('Хоречко', '1357900');
56
- // await cb.auth();
57
- await cb.setSession(sesID, sessGUID);
58
- // console.log(cb.sesID, cb.sessGUID);
59
- console.log(await cb.loadData());
53
+ // const sesID = '';
54
+ // const sessGUID = '';
55
+ // //const cb = new CabinetStudent(process.env.LOGIN!, process.env.PASSWORD!);
56
+ // //await cb.auth();
57
+ // // console.log(cb.sesID, cb.sessGUID);
58
+ // console.log(await cb.setSession(sesID, sessGUID));
59
+ // // console.log(cb.sesID, cb.sessGUID);
60
+ // console.log(await cb.loadData());
61
+ // await cb.getDisciplines();
62
+ // console.log(await cb.getId());
60
63
  // console.log(cb.allScores);
61
- printFinalScores(cb.allScores, cb.disciplines);
62
- function printFinalScores(scoresArray, disciplines) {
63
- // Створюємо мапу prId → name для швидкого доступу
64
- const disciplineMap = {};
65
- for (const d of disciplines) {
66
- disciplineMap[d.prId] = d.name;
67
- }
68
- const result = {};
69
- for (const scoresObj of scoresArray) {
70
- const disciplineId = scoresObj.prId;
71
- const disciplineName = disciplineMap[disciplineId] ?? disciplineId;
72
- for (const student of scoresObj.studentScores) {
73
- if (!result[student.id])
74
- result[student.id] = {};
75
- result[student.id][disciplineName] = student.finalScore;
76
- }
77
- }
78
- for (const studentId in result) {
79
- console.log(`Student ${studentId}:`);
80
- for (const disciplineName in result[studentId]) {
81
- console.log(` ${disciplineName}: ${result[studentId][disciplineName]}`);
82
- }
83
- }
84
- }
64
+ // printFinalScores(cb.allScores!, cb.disciplines);
65
+ // function printFinalScores(scoresArray: Scores[], disciplines: Discipline[]) {
66
+ // // Створюємо мапу prId → name для швидкого доступу
67
+ // const disciplineMap: Record<string, string> = {};
68
+ // for (const d of disciplines) {
69
+ // disciplineMap[d.prId] = d.name;
70
+ // }
71
+ // const result: Record<string, Record<string, string>> = {};
72
+ // for (const scoresObj of scoresArray) {
73
+ // const disciplineId = scoresObj.prId;
74
+ // const disciplineName = disciplineMap[disciplineId] ?? disciplineId;
75
+ // for (const student of scoresObj.studentScores) {
76
+ // if (!result[student.id]) result[student.id] = {};
77
+ // result[student.id][disciplineName] = student.finalScore;
78
+ // }
79
+ // }
80
+ // for (const studentId in result) {
81
+ // console.log(`Student ${studentId}:`);
82
+ // for (const disciplineName in result[studentId]) {
83
+ // console.log(` ${disciplineName}: ${result[studentId][disciplineName]}`);
84
+ // }
85
+ // }
86
+ // }
87
+ // const sesID = '';
88
+ // const sessGUID = '';
89
+ // const cb = new CabinetTeacher(process.env.LOGINT!, process.env.PASSWORDT!);
90
+ // // console.log(await cb.auth());
91
+ // //console.log(cb.sesID, cb.sessGUID);
92
+ // console.log(await cb.setSession(sesID, sessGUID));
93
+ // console.log(cb.sesID, cb.sessGUID);
94
+ // console.log(await cb.loadData());
95
+ // console.log(cb.data);
96
+ // console.log(cb.academicGroups);
package/dist/index.d.ts CHANGED
@@ -8,3 +8,5 @@ export * from './audience.js';
8
8
  export * from './utility/types-audience.js';
9
9
  export * from './utility/dops.js';
10
10
  export * from './cabinet/index.js';
11
+ export * from './cabinetStudent/index.js';
12
+ export * from './cabinetTeacher/index.js';
package/dist/index.js CHANGED
@@ -8,3 +8,5 @@ export * from './audience.js';
8
8
  export * from './utility/types-audience.js';
9
9
  export * from './utility/dops.js';
10
10
  export * from './cabinet/index.js';
11
+ export * from './cabinetStudent/index.js';
12
+ export * from './cabinetTeacher/index.js';
package/dist/types.d.ts CHANGED
@@ -94,16 +94,17 @@ export interface BaseLesson {
94
94
  * @category Schedule
95
95
  *
96
96
  * @remarks
97
- * - `half` — Номер підгрупи
97
+ * - `half` — Половина пари (не використовується)
98
98
  * - `teacher` — Основний викладач
99
99
  * - `teachers_add` — Додаткові викладачі
100
100
  * - `room` — Аудиторія, наприклад "319/№1"
101
- * - `group` — Список груп, які відвідують заняття
101
+ * - `group` — Список груп, які відвідують заняття / підгрупа
102
102
  * - `title` — Повна назва предмету або його код
103
103
  * - `type` — Тип заняття
104
104
  * - `replacement` — Позначка про заміну пари
105
+ * - `reservation` — Зарезервована пара
105
106
  * - `online` — Чи є онлайн-посилання / онлайн-режим
106
- * - `comment4link` — Коментар до посилання (іноді використовується для Zoom/Meet)
107
+ * - `comment4link` — Коментар до посилання (іноді використовується для Zoom/Meet) / підгрупа / коментар
107
108
  * - `link` — Посилання на онлайн-заняття
108
109
  */
109
110
  export interface DetailedLesson extends BaseLesson {
package/package.json CHANGED
@@ -1,36 +1,37 @@
1
1
  {
2
- "name": "zdu-student-api",
3
- "version": "1.1.6",
4
- "description": "API client for ZDU student services",
5
- "author": "Nicita3 <ni596157@gmail.com> (https://github.com/Nicita-3)",
6
- "main": "dist/index.js",
7
- "types": "dist/index.d.ts",
8
- "type": "module",
9
- "files": [
10
- "dist"
11
- ],
12
- "scripts": {
13
- "build": "tsc",
14
- "docs": "typedoc --out docs src",
15
- "test": "node --loader ts-node/esm src/examples.ts",
16
- "publish:all": "npm run build && npm run docs && npm publish"
17
- },
18
- "license": "MIT",
19
- "repository": {
20
- "type": "git",
21
- "url": "https://github.com/Nicita-3/zdu-student-api"
22
- },
23
- "homepage": "https://nicita-3.github.io/zdu-student-api",
24
- "devDependencies": {
25
- "@types/node": "^24.10.1",
26
- "prettier": "^3.7.4",
27
- "ts-node": "^10.9.2",
28
- "typedoc": "^0.28.14",
29
- "typescript": "^5.9.3"
30
- },
31
- "dependencies": {
32
- "buffer": "^6.0.3",
33
- "cross-fetch": "^4.1.0",
34
- "iconv-lite": "^0.7.0"
35
- }
2
+ "name": "zdu-student-api",
3
+ "version": "1.1.8",
4
+ "description": "API client for ZDU student services",
5
+ "author": "Nicita3 <ni596157@gmail.com> (https://github.com/Nicita-3)",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "type": "module",
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "scripts": {
13
+ "build": "tsc",
14
+ "docs": "typedoc --out docs src",
15
+ "test": "node --loader ts-node/esm src/examples.ts",
16
+ "publish:all": "npm run build && npm run docs && npm publish"
17
+ },
18
+ "license": "MIT",
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "https://github.com/Nicita-3/zdu-student-api"
22
+ },
23
+ "homepage": "https://nicita-3.github.io/zdu-student-api",
24
+ "devDependencies": {
25
+ "@types/node": "^24.10.1",
26
+ "prettier": "^3.7.4",
27
+ "ts-node": "^10.9.2",
28
+ "typedoc": "^0.28.14",
29
+ "typescript": "^5.9.3"
30
+ },
31
+ "dependencies": {
32
+ "buffer": "^6.0.3",
33
+ "cross-fetch": "^4.1.0",
34
+ "dotenv": "^17.2.3",
35
+ "iconv-lite": "^0.7.0"
36
+ }
36
37
  }