@robertying/thu-learn-lib 0.0.0-stage → 4.1.0

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 (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +324 -2
  3. package/lib/auth.d.ts +11 -0
  4. package/lib/auth.d.ts.map +1 -0
  5. package/lib/auth.js +99 -0
  6. package/lib/auth.js.map +1 -0
  7. package/lib/calendar.d.ts +16 -0
  8. package/lib/calendar.d.ts.map +1 -0
  9. package/lib/calendar.js +81 -0
  10. package/lib/calendar.js.map +1 -0
  11. package/lib/contents.d.ts +9 -0
  12. package/lib/contents.d.ts.map +1 -0
  13. package/lib/contents.js +52 -0
  14. package/lib/contents.js.map +1 -0
  15. package/lib/courses.d.ts +9 -0
  16. package/lib/courses.d.ts.map +1 -0
  17. package/lib/courses.js +82 -0
  18. package/lib/courses.js.map +1 -0
  19. package/lib/discussions.d.ts +11 -0
  20. package/lib/discussions.d.ts.map +1 -0
  21. package/lib/discussions.js +56 -0
  22. package/lib/discussions.js.map +1 -0
  23. package/lib/favorites.d.ts +35 -0
  24. package/lib/favorites.d.ts.map +1 -0
  25. package/lib/favorites.js +150 -0
  26. package/lib/favorites.js.map +1 -0
  27. package/lib/files.d.ts +13 -0
  28. package/lib/files.d.ts.map +1 -0
  29. package/lib/files.js +167 -0
  30. package/lib/files.js.map +1 -0
  31. package/lib/homework.d.ts +9 -0
  32. package/lib/homework.d.ts.map +1 -0
  33. package/lib/homework.js +193 -0
  34. package/lib/homework.js.map +1 -0
  35. package/lib/index.d.ts +105 -0
  36. package/lib/index.d.ts.map +1 -0
  37. package/lib/index.js +181 -0
  38. package/lib/index.js.map +1 -0
  39. package/lib/notices.d.ts +6 -0
  40. package/lib/notices.d.ts.map +1 -0
  41. package/lib/notices.js +84 -0
  42. package/lib/notices.js.map +1 -0
  43. package/lib/questionnaires.d.ts +7 -0
  44. package/lib/questionnaires.d.ts.map +1 -0
  45. package/lib/questionnaires.js +62 -0
  46. package/lib/questionnaires.js.map +1 -0
  47. package/lib/request.d.ts +31 -0
  48. package/lib/request.d.ts.map +1 -0
  49. package/lib/request.js +90 -0
  50. package/lib/request.js.map +1 -0
  51. package/lib/types.d.ts +392 -0
  52. package/lib/types.d.ts.map +1 -0
  53. package/lib/types.js +97 -0
  54. package/lib/types.js.map +1 -0
  55. package/lib/urls.d.ts +78 -0
  56. package/lib/urls.d.ts.map +1 -0
  57. package/lib/urls.js +160 -0
  58. package/lib/urls.js.map +1 -0
  59. package/lib/user.d.ts +7 -0
  60. package/lib/user.d.ts.map +1 -0
  61. package/lib/user.js +22 -0
  62. package/lib/user.js.map +1 -0
  63. package/lib/utils.d.ts +13 -0
  64. package/lib/utils.d.ts.map +1 -0
  65. package/lib/utils.js +115 -0
  66. package/lib/utils.js.map +1 -0
  67. package/package.json +67 -4
  68. package/src/auth.ts +121 -0
  69. package/src/calendar.ts +102 -0
  70. package/src/contents.ts +67 -0
  71. package/src/courses.ts +97 -0
  72. package/src/discussions.ts +80 -0
  73. package/src/favorites.ts +167 -0
  74. package/src/files.ts +197 -0
  75. package/src/homework.ts +279 -0
  76. package/src/index.ts +282 -0
  77. package/src/notices.ts +110 -0
  78. package/src/questionnaires.ts +76 -0
  79. package/src/request.ts +101 -0
  80. package/src/types.ts +445 -0
  81. package/src/urls.ts +257 -0
  82. package/src/user.ts +28 -0
  83. package/src/utils.ts +120 -0
@@ -0,0 +1,193 @@
1
+ // Homework (课程作业), excellent homework and homework submission.
2
+ import { Base64 } from 'js-base64';
3
+ import { $, YES } from './request.js';
4
+ import { ContentType, CourseType, FailReason } from './types.js';
5
+ import * as URLS from './urls.js';
6
+ import { GRADE_LEVEL_MAP, decodeHTML, trimAndDefine } from './utils.js';
7
+ export async function getHomeworkList(s, courseID, courseType = CourseType.STUDENT) {
8
+ if (courseType === CourseType.TEACHER) {
9
+ const json = await (await s.fetchWithToken(URLS.LEARN_HOMEWORK_LIST_TEACHER, {
10
+ method: 'POST',
11
+ body: URLS.LEARN_PAGE_LIST_FORM_DATA(courseID),
12
+ })).json();
13
+ if (json.result !== 'success') {
14
+ return Promise.reject({
15
+ reason: FailReason.INVALID_RESPONSE,
16
+ extra: json,
17
+ });
18
+ }
19
+ const result = (json.object?.aaData ?? []);
20
+ return result.map((d) => ({
21
+ id: d.zyid,
22
+ index: d.wz,
23
+ title: decodeHTML(d.bt),
24
+ description: decodeHTML(Base64.decode(d.nr)),
25
+ publisherId: d.fbr,
26
+ publishTime: d.fbsj,
27
+ startTime: d.kssj,
28
+ deadline: d.jzsj,
29
+ lateSubmissionDeadline: d.bjjzsj ?? undefined,
30
+ url: URLS.LEARN_HOMEWORK_DETAIL_TEACHER(courseID, d.zyid),
31
+ completionType: d.zywcfs,
32
+ submissionType: d.zytjfs,
33
+ gradedCount: d.ypys,
34
+ submittedCount: d.yjs,
35
+ unsubmittedCount: d.wjs,
36
+ }));
37
+ }
38
+ else {
39
+ return Promise.all(URLS.LEARN_HOMEWORK_LIST_SOURCE.map((source) => getHomeworkListAtUrl(s, courseID, source.url, source.status))).then((r) => r.flat());
40
+ }
41
+ }
42
+ async function getHomeworkListAtUrl(s, courseID, url, status) {
43
+ const json = await (await s.fetchWithToken(url, {
44
+ method: 'POST',
45
+ body: URLS.LEARN_PAGE_LIST_FORM_DATA(courseID),
46
+ })).json();
47
+ if (json.result !== 'success') {
48
+ return Promise.reject({
49
+ reason: FailReason.INVALID_RESPONSE,
50
+ extra: json,
51
+ });
52
+ }
53
+ const result = (json.object?.aaData ?? []);
54
+ let excellentHomeworkListByHomework = {};
55
+ try {
56
+ excellentHomeworkListByHomework = await getExcellentHomeworkListByHomework(s, courseID);
57
+ }
58
+ catch (e) {
59
+ // Don't block the whole process if excellent homework list cannot be fetched
60
+ }
61
+ return Promise.all(result
62
+ .map((h) => ({
63
+ id: h.xszyid,
64
+ studentHomeworkId: h.xszyid,
65
+ baseId: h.zyid,
66
+ title: decodeHTML(h.bt),
67
+ url: URLS.LEARN_HOMEWORK_PAGE(h.wlkcid, h.xszyid),
68
+ deadline: h.jzsj,
69
+ lateSubmissionDeadline: h.bjjzsj ? h.bjjzsj : undefined,
70
+ isLateSubmission: h.sfbj === YES,
71
+ completionType: h.zywcfs,
72
+ submissionType: h.zytjfs,
73
+ submitUrl: URLS.LEARN_HOMEWORK_SUBMIT_PAGE(h.wlkcid, h.xszyid),
74
+ submitTime: h.scsj === null ? undefined : h.scsj,
75
+ grade: h.cj === null ? undefined : h.cj,
76
+ gradeLevel: GRADE_LEVEL_MAP.get(h.cj),
77
+ graderName: trimAndDefine(h.jsm),
78
+ gradeContent: trimAndDefine(h.pynr),
79
+ gradeTime: h.pysj === null ? undefined : h.pysj,
80
+ isFavorite: h.sfsc === YES,
81
+ favoriteTime: h.scsj === null || h.sfsc !== YES ? undefined : h.scsj,
82
+ comment: h.bznr ?? undefined,
83
+ excellentHomeworkList: excellentHomeworkListByHomework[h.zyid],
84
+ ...status,
85
+ }))
86
+ .map(async (h) => ({
87
+ ...h,
88
+ ...(await parseHomeworkAtUrl(s, h.url)),
89
+ ...(await getHomeworkDetail(s, h.baseId)),
90
+ })));
91
+ }
92
+ async function getExcellentHomeworkListByHomework(s, courseID) {
93
+ const json = await (await s.fetchWithToken(URLS.LEARN_HOMEWORK_LIST_EXCELLENT, {
94
+ method: 'POST',
95
+ body: URLS.LEARN_PAGE_LIST_FORM_DATA(courseID),
96
+ })).json();
97
+ if (json.result !== 'success') {
98
+ return Promise.reject({
99
+ reason: FailReason.INVALID_RESPONSE,
100
+ extra: json,
101
+ });
102
+ }
103
+ const result = (json.object?.aaData ?? []);
104
+ return (await Promise.all(result
105
+ .map((h) => ({
106
+ id: h.xszyid,
107
+ baseId: h.zyid,
108
+ title: decodeHTML(h.bt),
109
+ url: URLS.LEARN_HOMEWORK_EXCELLENT_PAGE(h.wlkcid, h.xszyid),
110
+ completionType: h.zywcfs,
111
+ author: {
112
+ id: h.cy?.split(' ')?.[0],
113
+ name: h.cy?.split(' ')?.[1],
114
+ anonymous: h.sfzm === YES,
115
+ },
116
+ }))
117
+ .map(async (h) => ({
118
+ ...h,
119
+ ...(await parseHomeworkAtUrl(s, h.url)),
120
+ ...(await getHomeworkDetail(s, h.baseId)),
121
+ })))).reduce((acc, cur) => {
122
+ if (!acc[cur.baseId]) {
123
+ acc[cur.baseId] = [];
124
+ }
125
+ acc[cur.baseId].push(cur);
126
+ return acc;
127
+ }, {});
128
+ }
129
+ async function parseHomeworkAtUrl(s, url) {
130
+ const response = await s.fetchWithToken(url);
131
+ const result = $(await response.text());
132
+ const fileDivs = result('div.list.fujian.clearfix');
133
+ return {
134
+ description: trimAndDefine(result('div.list.calendar.clearfix > div.fl.right > div.c55').slice(0, 1).html()),
135
+ answerContent: trimAndDefine(result('div.list.calendar.clearfix > div.fl.right > div.c55').slice(1, 2).html()),
136
+ submittedContent: trimAndDefine($(result('div.boxbox').slice(1, 2).toArray())('div.right').slice(2, 3).html()),
137
+ attachment: parseHomeworkFile(s, fileDivs[0]),
138
+ answerAttachment: parseHomeworkFile(s, fileDivs[1]),
139
+ submittedAttachment: parseHomeworkFile(s, fileDivs[2]),
140
+ gradeAttachment: parseHomeworkFile(s, fileDivs[3]),
141
+ };
142
+ }
143
+ async function getHomeworkDetail(s, baseId) {
144
+ const json = await (await s.fetchWithToken(URLS.LEARN_HOMEWORK_DETAIL, {
145
+ method: 'POST',
146
+ body: URLS.LEARN_HOMEWORK_DETAIL_FORM_DATA(baseId),
147
+ })).json();
148
+ if (json.result !== 'success') {
149
+ throw {
150
+ reason: FailReason.INVALID_RESPONSE,
151
+ extra: json,
152
+ };
153
+ }
154
+ return {
155
+ description: trimAndDefine(json.msg),
156
+ };
157
+ }
158
+ function parseHomeworkFile(s, fileDiv) {
159
+ const fileNode = $(fileDiv)('.ftitle').children('a')[0] ?? $(fileDiv)('.fl').children('a')[0];
160
+ if (fileNode !== undefined) {
161
+ const size = trimAndDefine($(fileDiv)('.fl > span[class^="color"]').first().text());
162
+ const params = new URLSearchParams(fileNode.attribs.href.split('?').slice(-1)[0]);
163
+ const attachmentId = params.get('fileId');
164
+ // so dirty here...
165
+ let downloadUrl = URLS.LEARN_PREFIX + fileNode.attribs.href;
166
+ if (params.has('downloadUrl')) {
167
+ downloadUrl = URLS.LEARN_PREFIX + params.get('downloadUrl');
168
+ }
169
+ return {
170
+ id: attachmentId,
171
+ name: fileNode.children[0].data,
172
+ downloadUrl,
173
+ previewUrl: URLS.LEARN_FILE_PREVIEW(ContentType.HOMEWORK, attachmentId, CourseType.STUDENT, s.previewFirstPage),
174
+ size,
175
+ };
176
+ }
177
+ else {
178
+ return undefined;
179
+ }
180
+ }
181
+ export async function submitHomework(s, id, content = '', attachment, removeAttachment = false) {
182
+ const json = await (await s.fetchWithToken(URLS.LEARN_HOMEWORK_SUBMIT(), {
183
+ method: 'POST',
184
+ body: URLS.LEARN_HOMEWORK_SUBMIT_FORM_DATA(id, content, attachment, removeAttachment),
185
+ })).json();
186
+ if (json.result !== 'success') {
187
+ return Promise.reject({
188
+ reason: FailReason.OPERATION_FAILED,
189
+ extra: json,
190
+ });
191
+ }
192
+ }
193
+ //# sourceMappingURL=homework.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"homework.js","sourceRoot":"","sources":["../src/homework.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,105 @@
1
+ import type { CalendarOptions, CalendarResult, CommentItem, CourseInfo, Discussion, FavoriteItem, File, FileCategory, HelperConfig, Homework, HomeworkTA, IHomeworkSubmitAttachment, Language, Notification, Question, Questionnaire, SemesterInfo, UserInfo, ContentType } from './types.ts';
2
+ import { CourseType } from './types.ts';
3
+ export { addCSRFTokenToUrl } from './request.ts';
4
+ export * from './types.ts';
5
+ /** the main helper class */
6
+ export declare class Learn2018Helper {
7
+ #private;
8
+ /** you can provide a CookieJar and / or CredentialProvider in the configuration */
9
+ constructor(config?: HelperConfig);
10
+ /** whether preview URLs open the first page only (`HelperConfig.generatePreviewUrlForFirstPage`) */
11
+ get previewFirstPage(): boolean;
12
+ set previewFirstPage(value: boolean);
13
+ /** fetch CSRF token from helper (invalid after login / re-login), might be '' if not logged in */
14
+ getCSRFToken(): string;
15
+ /** manually set CSRF token (useful when you want to reuse previous token) */
16
+ setCSRFToken(csrfToken: string): void;
17
+ /**
18
+ * If using alternative cookie management systems,
19
+ * be sure to clear id.tsinghua.edu.cn cookies before calling this function
20
+ */
21
+ getRoamingTicket(username: string, password: string, fingerPrint: string, fingerGenPrint?: string, fingerGenPrint3?: string): Promise<string>;
22
+ /** login is necessary if you do not provide a `CredentialProvider` */
23
+ login(username?: string, password?: string, fingerPrint?: string, fingerGenPrint?: string, fingerGenPrint3?: string): Promise<void>;
24
+ /** logout (to make everyone happy) */
25
+ logout(): Promise<void>;
26
+ /** get user's name and department */
27
+ getUserInfo(courseType?: CourseType): Promise<UserInfo>;
28
+ /**
29
+ * Get calendar items during the specified period (in yyyymmdd format, both inclusive).
30
+ * Ranges longer than 28 days are fetched in windows and merged; windows that fail even after a retry are listed in
31
+ * `failedRanges`. Rejects only when every window fails (usually with `FailReason.INVALID_RESPONSE`).
32
+ */
33
+ getCalendar(startDate: string, endDate: string, options?: CalendarOptions): Promise<CalendarResult>;
34
+ getSemesterIdList(): Promise<string[]>;
35
+ getCurrentSemester(): Promise<SemesterInfo>;
36
+ /** get all courses in the specified semester */
37
+ getCourseList(semesterID: string, courseType?: CourseType, lang?: Language): Promise<CourseInfo[]>;
38
+ /**
39
+ * Get certain type of content of all specified courses.
40
+ * It actually wraps around other `getXXX` functions. You can ignore the failure caused by certain courses.
41
+ */
42
+ getAllContents<T extends ContentType>(courseIDs: string[], type: T, courseType?: CourseType, allowFailure?: boolean): Promise<import("./types.ts").CourseContent<T>>;
43
+ /** Get all notifications (课程公告) of the specified course. */
44
+ getNotificationList(courseID: string, courseType?: CourseType): Promise<Notification[]>;
45
+ /** Get all files (课程文件) of the specified course. */
46
+ getFileList(courseID: string, courseType?: CourseType): Promise<File[]>;
47
+ /** Get file categories of the specified course. */
48
+ getFileCategoryList(courseID: string, courseType?: CourseType): Promise<FileCategory[]>;
49
+ /**
50
+ * Get all files of the specified category of the specified course.
51
+ * Note: this cannot get correct `visitCount` and `downloadCount` for student
52
+ */
53
+ getFileListByCategory(courseID: string, categoryId: string, courseType?: CourseType): Promise<File[]>;
54
+ /** Get all homeworks (课程作业) of the specified course. */
55
+ getHomeworkList(courseID: string): Promise<Homework[]>;
56
+ getHomeworkList(courseID: string, courseType: CourseType.STUDENT): Promise<Homework[]>;
57
+ getHomeworkList(courseID: string, courseType: CourseType.TEACHER): Promise<HomeworkTA[]>;
58
+ /** Get all discussions (课程讨论) of the specified course. */
59
+ getDiscussionList(courseID: string, courseType?: CourseType): Promise<Discussion[]>;
60
+ /**
61
+ * Get all notifications (课程答疑) of the specified course.
62
+ * The student version supports only answered questions, while the teacher version supports all questions.
63
+ */
64
+ getAnsweredQuestionList(courseID: string, courseType?: CourseType): Promise<Question[]>;
65
+ /**
66
+ * Get all questionnaires (课程问卷/QNR) of the specified course.
67
+ */
68
+ getQuestionnaireList(courseID: string): Promise<Questionnaire[]>;
69
+ /**
70
+ * Add an item to favorites. (收藏)
71
+ */
72
+ addToFavorites(type: ContentType, id: string): Promise<void>;
73
+ /**
74
+ * Remove an item from favorites. (取消收藏)
75
+ */
76
+ removeFromFavorites(id: string): Promise<void>;
77
+ /**
78
+ * Get favorites. (我的收藏)
79
+ * If `courseID` or `type` is specified, only return favorites of that course or type.
80
+ */
81
+ getFavorites(courseID?: string, type?: ContentType): Promise<FavoriteItem[]>;
82
+ /**
83
+ * Pin a favorite item. (置顶)
84
+ */
85
+ pinFavoriteItem(id: string): Promise<void>;
86
+ /**
87
+ * Unpin a favorite item. (取消置顶)
88
+ */
89
+ unpinFavoriteItem(id: string): Promise<void>;
90
+ /**
91
+ * Set a comment. (备注)
92
+ * Set an empty string to remove the comment.
93
+ */
94
+ setComment(type: ContentType, id: string, content: string): Promise<void>;
95
+ /**
96
+ * Get comments. (我的备注)
97
+ * If `courseID` or `type` is specified, only return favorites of that course or type.
98
+ */
99
+ getComments(courseID?: string, type?: ContentType): Promise<CommentItem[]>;
100
+ sortCourses(courseIDs: string[]): Promise<void>;
101
+ submitHomework(id: string, content?: string, attachment?: IHomeworkSubmitAttachment, removeAttachment?: boolean): Promise<void>;
102
+ setLanguage(lang: Language): Promise<void>;
103
+ getCurrentLanguage(): Language;
104
+ }
105
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/lib/index.js ADDED
@@ -0,0 +1,181 @@
1
+ import * as auth from './auth.js';
2
+ import * as calendar from './calendar.js';
3
+ import * as contents from './contents.js';
4
+ import * as courses from './courses.js';
5
+ import * as discussions from './discussions.js';
6
+ import * as favorites from './favorites.js';
7
+ import * as files from './files.js';
8
+ import * as homework from './homework.js';
9
+ import * as notices from './notices.js';
10
+ import * as questionnaires from './questionnaires.js';
11
+ import { Session } from './request.js';
12
+ import { CourseType } from './types.js';
13
+ import * as user from './user.js';
14
+ export { addCSRFTokenToUrl } from './request.js';
15
+ export * from './types.js';
16
+ /** the main helper class */
17
+ export class Learn2018Helper {
18
+ #session;
19
+ /** you can provide a CookieJar and / or CredentialProvider in the configuration */
20
+ constructor(config) {
21
+ this.#session = new Session(config, () => this.login());
22
+ }
23
+ /** whether preview URLs open the first page only (`HelperConfig.generatePreviewUrlForFirstPage`) */
24
+ get previewFirstPage() {
25
+ return this.#session.previewFirstPage;
26
+ }
27
+ set previewFirstPage(value) {
28
+ this.#session.previewFirstPage = value;
29
+ }
30
+ /** fetch CSRF token from helper (invalid after login / re-login), might be '' if not logged in */
31
+ getCSRFToken() {
32
+ return this.#session.csrfToken;
33
+ }
34
+ /** manually set CSRF token (useful when you want to reuse previous token) */
35
+ setCSRFToken(csrfToken) {
36
+ this.#session.csrfToken = csrfToken;
37
+ }
38
+ /**
39
+ * If using alternative cookie management systems,
40
+ * be sure to clear id.tsinghua.edu.cn cookies before calling this function
41
+ */
42
+ async getRoamingTicket(username, password, fingerPrint, fingerGenPrint = '', fingerGenPrint3 = '') {
43
+ return auth.getRoamingTicket(this.#session, username, password, fingerPrint, fingerGenPrint, fingerGenPrint3);
44
+ }
45
+ /** login is necessary if you do not provide a `CredentialProvider` */
46
+ async login(username, password, fingerPrint, fingerGenPrint, fingerGenPrint3) {
47
+ return auth.login(this.#session, username, password, fingerPrint, fingerGenPrint, fingerGenPrint3);
48
+ }
49
+ /** logout (to make everyone happy) */
50
+ async logout() {
51
+ return auth.logout(this.#session);
52
+ }
53
+ /** get user's name and department */
54
+ async getUserInfo(courseType = CourseType.STUDENT) {
55
+ return user.getUserInfo(this.#session, courseType);
56
+ }
57
+ /**
58
+ * Get calendar items during the specified period (in yyyymmdd format, both inclusive).
59
+ * Ranges longer than 28 days are fetched in windows and merged; windows that fail even after a retry are listed in
60
+ * `failedRanges`. Rejects only when every window fails (usually with `FailReason.INVALID_RESPONSE`).
61
+ */
62
+ async getCalendar(startDate, endDate, options) {
63
+ return calendar.getCalendar(this.#session, startDate, endDate, options);
64
+ }
65
+ async getSemesterIdList() {
66
+ return courses.getSemesterIdList(this.#session);
67
+ }
68
+ async getCurrentSemester() {
69
+ return courses.getCurrentSemester(this.#session);
70
+ }
71
+ /** get all courses in the specified semester */
72
+ async getCourseList(semesterID, courseType = CourseType.STUDENT, lang = this.#session.lang) {
73
+ return courses.getCourseList(this.#session, semesterID, courseType, lang);
74
+ }
75
+ /**
76
+ * Get certain type of content of all specified courses.
77
+ * It actually wraps around other `getXXX` functions. You can ignore the failure caused by certain courses.
78
+ */
79
+ async getAllContents(courseIDs, type, courseType = CourseType.STUDENT, allowFailure = false) {
80
+ return contents.getAllContents(this.#session, courseIDs, type, courseType, allowFailure);
81
+ }
82
+ /** Get all notifications (课程公告) of the specified course. */
83
+ async getNotificationList(courseID, courseType = CourseType.STUDENT) {
84
+ return notices.getNotificationList(this.#session, courseID, courseType);
85
+ }
86
+ /** Get all files (课程文件) of the specified course. */
87
+ async getFileList(courseID, courseType = CourseType.STUDENT) {
88
+ return files.getFileList(this.#session, courseID, courseType);
89
+ }
90
+ /** Get file categories of the specified course. */
91
+ async getFileCategoryList(courseID, courseType = CourseType.STUDENT) {
92
+ return files.getFileCategoryList(this.#session, courseID, courseType);
93
+ }
94
+ /**
95
+ * Get all files of the specified category of the specified course.
96
+ * Note: this cannot get correct `visitCount` and `downloadCount` for student
97
+ */
98
+ async getFileListByCategory(courseID, categoryId, courseType = CourseType.STUDENT) {
99
+ return files.getFileListByCategory(this.#session, courseID, categoryId, courseType);
100
+ }
101
+ async getHomeworkList(courseID, courseType = CourseType.STUDENT) {
102
+ return courseType === CourseType.TEACHER
103
+ ? homework.getHomeworkList(this.#session, courseID, CourseType.TEACHER)
104
+ : homework.getHomeworkList(this.#session, courseID, CourseType.STUDENT);
105
+ }
106
+ /** Get all discussions (课程讨论) of the specified course. */
107
+ async getDiscussionList(courseID, courseType = CourseType.STUDENT) {
108
+ return discussions.getDiscussionList(this.#session, courseID, courseType);
109
+ }
110
+ /**
111
+ * Get all notifications (课程答疑) of the specified course.
112
+ * The student version supports only answered questions, while the teacher version supports all questions.
113
+ */
114
+ async getAnsweredQuestionList(courseID, courseType = CourseType.STUDENT) {
115
+ return discussions.getAnsweredQuestionList(this.#session, courseID, courseType);
116
+ }
117
+ /**
118
+ * Get all questionnaires (课程问卷/QNR) of the specified course.
119
+ */
120
+ async getQuestionnaireList(courseID) {
121
+ return questionnaires.getQuestionnaireList(this.#session, courseID);
122
+ }
123
+ /**
124
+ * Add an item to favorites. (收藏)
125
+ */
126
+ async addToFavorites(type, id) {
127
+ return favorites.addToFavorites(this.#session, type, id);
128
+ }
129
+ /**
130
+ * Remove an item from favorites. (取消收藏)
131
+ */
132
+ async removeFromFavorites(id) {
133
+ return favorites.removeFromFavorites(this.#session, id);
134
+ }
135
+ /**
136
+ * Get favorites. (我的收藏)
137
+ * If `courseID` or `type` is specified, only return favorites of that course or type.
138
+ */
139
+ async getFavorites(courseID, type) {
140
+ return favorites.getFavorites(this.#session, courseID, type);
141
+ }
142
+ /**
143
+ * Pin a favorite item. (置顶)
144
+ */
145
+ async pinFavoriteItem(id) {
146
+ return favorites.pinFavoriteItem(this.#session, id);
147
+ }
148
+ /**
149
+ * Unpin a favorite item. (取消置顶)
150
+ */
151
+ async unpinFavoriteItem(id) {
152
+ return favorites.unpinFavoriteItem(this.#session, id);
153
+ }
154
+ /**
155
+ * Set a comment. (备注)
156
+ * Set an empty string to remove the comment.
157
+ */
158
+ async setComment(type, id, content) {
159
+ return favorites.setComment(this.#session, type, id, content);
160
+ }
161
+ /**
162
+ * Get comments. (我的备注)
163
+ * If `courseID` or `type` is specified, only return favorites of that course or type.
164
+ */
165
+ async getComments(courseID, type) {
166
+ return favorites.getComments(this.#session, courseID, type);
167
+ }
168
+ async sortCourses(courseIDs) {
169
+ return courses.sortCourses(this.#session, courseIDs);
170
+ }
171
+ async submitHomework(id, content = '', attachment, removeAttachment = false) {
172
+ return homework.submitHomework(this.#session, id, content, attachment, removeAttachment);
173
+ }
174
+ async setLanguage(lang) {
175
+ return user.setLanguage(this.#session, lang);
176
+ }
177
+ getCurrentLanguage() {
178
+ return this.#session.lang;
179
+ }
180
+ }
181
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Session } from './request.ts';
2
+ import type { Notification } from './types.ts';
3
+ import { CourseType } from './types.ts';
4
+ /** Get all notifications (课程公告) of the specified course. */
5
+ export declare function getNotificationList(s: Session, courseID: string, courseType?: CourseType): Promise<Notification[]>;
6
+ //# sourceMappingURL=notices.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notices.d.ts","sourceRoot":"","sources":["../src/notices.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAsC,YAAY,EAAE,MAAM,YAAY,CAAC;AACnF,OAAO,EAAe,UAAU,EAAc,MAAM,YAAY,CAAC;AAIjE,4DAA4D;AAC5D,wBAAsB,mBAAmB,CACvC,CAAC,EAAE,OAAO,EACV,QAAQ,EAAE,MAAM,EAChB,UAAU,GAAE,UAA+B,GAC1C,OAAO,CAAC,YAAY,EAAE,CAAC,CAKzB"}
package/lib/notices.js ADDED
@@ -0,0 +1,84 @@
1
+ // Course notifications (课程公告).
2
+ import { Base64 } from 'js-base64';
3
+ import { $, YES } from './request.js';
4
+ import { ContentType, CourseType, FailReason } from './types.js';
5
+ import * as URLS from './urls.js';
6
+ import { decodeHTML, trimAndDefine } from './utils.js';
7
+ /** Get all notifications (课程公告) of the specified course. */
8
+ export async function getNotificationList(s, courseID, courseType = CourseType.STUDENT) {
9
+ return Promise.all([
10
+ getNotificationListKind(s, courseID, courseType, false),
11
+ getNotificationListKind(s, courseID, courseType, true),
12
+ ]).then((r) => r.flat());
13
+ }
14
+ async function getNotificationListKind(s, courseID, courseType, expired) {
15
+ const json = await (await s.fetchWithToken(URLS.LEARN_NOTIFICATION_LIST(courseType, expired), {
16
+ method: 'POST',
17
+ body: URLS.LEARN_PAGE_LIST_FORM_DATA(courseID),
18
+ })).json();
19
+ if (json.result !== 'success') {
20
+ return Promise.reject({
21
+ reason: FailReason.INVALID_RESPONSE,
22
+ extra: json,
23
+ });
24
+ }
25
+ const result = (json.object?.aaData ?? json.object?.resultsList ?? []);
26
+ return Promise.all(result.map(async (n) => {
27
+ const notification = {
28
+ id: n.ggid,
29
+ content: Base64.decode(n.ggnr ?? ''),
30
+ title: decodeHTML(n.bt),
31
+ url: URLS.LEARN_NOTIFICATION_DETAIL(courseID, n.ggid, courseType),
32
+ publisher: n.fbrxm,
33
+ hasRead: n.sfyd === YES,
34
+ markedImportant: Number(n.sfqd) === 1, // n.sfqd could be string '1' (teacher mode) or number 1 (student mode)
35
+ publishTime: n.fbsj && typeof n.fbsj === 'string' ? n.fbsj : n.fbsjStr,
36
+ expireTime: n.jzsj ?? undefined,
37
+ isFavorite: n.sfsc === YES,
38
+ comment: n.bznr ?? undefined,
39
+ };
40
+ let detail = {};
41
+ const attachmentName = courseType === CourseType.STUDENT ? n.fjmc : n.fjbt;
42
+ if (attachmentName) {
43
+ detail = await parseNotificationDetail(s, courseID, notification.id, courseType, attachmentName);
44
+ }
45
+ return { ...notification, ...detail };
46
+ }));
47
+ }
48
+ async function parseNotificationDetail(s, courseID, id, courseType, attachmentName) {
49
+ /// from JSON (backup, currently not used)
50
+ // const postParams = new FormData();
51
+ // postParams.append('id', id);
52
+ // postParams.append('wlkcid', courseID);
53
+ // const metadata = await (await s.fetchWithToken(URL.LEARN_NOTIFICATION_EDIT(courseType), {
54
+ // 'method': 'POST',
55
+ // 'body': postParams,
56
+ // })).json();
57
+ // const attachmentId = metadata.ggfjid as string;
58
+ /// parsed from HTML
59
+ const response = await s.fetchWithToken(URLS.LEARN_NOTIFICATION_DETAIL(courseID, id, courseType));
60
+ const result = $(await response.text());
61
+ let path = '';
62
+ if (courseType === CourseType.STUDENT) {
63
+ path = result('.ml-10').attr('href');
64
+ }
65
+ else {
66
+ path = result('#wjid').attr('href');
67
+ }
68
+ const size = trimAndDefine(result('div#attachment > div.fl > span[class^="color"]').first().text());
69
+ const params = new URLSearchParams(path.split('?').slice(-1)[0]);
70
+ const attachmentId = params.get('wjid');
71
+ if (!path.startsWith(URLS.LEARN_PREFIX)) {
72
+ path = URLS.LEARN_PREFIX + path;
73
+ }
74
+ return {
75
+ attachment: {
76
+ name: attachmentName,
77
+ id: attachmentId,
78
+ downloadUrl: path,
79
+ previewUrl: URLS.LEARN_FILE_PREVIEW(ContentType.NOTIFICATION, attachmentId, courseType, s.previewFirstPage),
80
+ size,
81
+ },
82
+ };
83
+ }
84
+ //# sourceMappingURL=notices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notices.js","sourceRoot":"","sources":["../src/notices.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Session } from './request.ts';
2
+ import type { Questionnaire } from './types.ts';
3
+ /**
4
+ * Get all questionnaires (课程问卷/QNR) of the specified course.
5
+ */
6
+ export declare function getQuestionnaireList(s: Session, courseID: string): Promise<Questionnaire[]>;
7
+ //# sourceMappingURL=questionnaires.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"questionnaires.d.ts","sourceRoot":"","sources":["../src/questionnaires.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAE,aAAa,EAAuB,MAAM,YAAY,CAAC;AAKrE;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAKjG"}