@robertying/thu-learn-lib 0.0.0-stage → 5.0.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 +51 -0
  14. package/lib/contents.js.map +1 -0
  15. package/lib/courses.d.ts +11 -0
  16. package/lib/courses.d.ts.map +1 -0
  17. package/lib/courses.js +94 -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 +17 -0
  32. package/lib/homework.d.ts.map +1 -0
  33. package/lib/homework.js +194 -0
  34. package/lib/homework.js.map +1 -0
  35. package/lib/index.d.ts +134 -0
  36. package/lib/index.d.ts.map +1 -0
  37. package/lib/index.js +219 -0
  38. package/lib/index.js.map +1 -0
  39. package/lib/notices.d.ts +14 -0
  40. package/lib/notices.d.ts.map +1 -0
  41. package/lib/notices.js +92 -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 +57 -0
  48. package/lib/request.d.ts.map +1 -0
  49. package/lib/request.js +197 -0
  50. package/lib/request.js.map +1 -0
  51. package/lib/types.d.ts +433 -0
  52. package/lib/types.d.ts.map +1 -0
  53. package/lib/types.js +98 -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 +16 -0
  64. package/lib/utils.d.ts.map +1 -0
  65. package/lib/utils.js +117 -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 +63 -0
  71. package/src/courses.ts +111 -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 +284 -0
  76. package/src/index.ts +345 -0
  77. package/src/notices.ts +115 -0
  78. package/src/questionnaires.ts +76 -0
  79. package/src/request.ts +214 -0
  80. package/src/types.ts +494 -0
  81. package/src/urls.ts +257 -0
  82. package/src/user.ts +28 -0
  83. package/src/utils.ts +125 -0
@@ -0,0 +1,11 @@
1
+ import type { Session } from './request.ts';
2
+ import type { CourseInfo, CourseListOptions, SemesterInfo } from './types.ts';
3
+ import { CourseType } from './types.ts';
4
+ export declare function getSemesterIdList(s: Session): Promise<string[]>;
5
+ export declare function getCurrentSemester(s: Session): Promise<SemesterInfo>;
6
+ /** get all courses in the specified semester; time and location only with `options.timeAndLocation` */
7
+ export declare function getCourseList(s: Session, semesterID: string, courseType?: CourseType, lang?: import("./types.ts").Language, options?: CourseListOptions): Promise<CourseInfo[]>;
8
+ /** get the time and location of one course (1 request) */
9
+ export declare function getCourseTimeAndLocation(s: Session, courseID: string): Promise<string[]>;
10
+ export declare function sortCourses(s: Session, courseIDs: string[]): Promise<void>;
11
+ //# sourceMappingURL=courses.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"courses.d.ts","sourceRoot":"","sources":["../src/courses.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAY,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACxF,OAAO,EAAE,UAAU,EAAc,MAAM,YAAY,CAAC;AAIpD,wBAAsB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAWrE;AAED,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAiB1E;AAED,uGAAuG;AACvG,wBAAsB,aAAa,CACjC,CAAC,EAAE,OAAO,EACV,UAAU,EAAE,MAAM,EAClB,UAAU,GAAE,UAA+B,EAC3C,IAAI,gCAAS,EACb,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,UAAU,EAAE,CAAC,CAmCvB;AAED,0DAA0D;AAC1D,wBAAsB,wBAAwB,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAO9F;AAED,wBAAsB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBhF"}
package/lib/courses.js ADDED
@@ -0,0 +1,94 @@
1
+ // Semesters and courses.
2
+ import { CourseType, FailReason } from './types.js';
3
+ import * as URLS from './urls.js';
4
+ import { decodeHTML, parseSemesterType } from './utils.js';
5
+ export async function getSemesterIdList(s) {
6
+ const json = await (await s.fetchWithToken(URLS.LEARN_SEMESTER_LIST())).json();
7
+ if (!Array.isArray(json)) {
8
+ return Promise.reject({
9
+ reason: FailReason.INVALID_RESPONSE,
10
+ extra: json,
11
+ });
12
+ }
13
+ const semesters = json;
14
+ // sometimes web learning returns null, so confusing...
15
+ return semesters.filter((semester) => semester != null);
16
+ }
17
+ export async function getCurrentSemester(s) {
18
+ const json = await (await s.fetchWithToken(URLS.LEARN_CURRENT_SEMESTER())).json();
19
+ if (json.message !== 'success') {
20
+ return Promise.reject({
21
+ reason: FailReason.INVALID_RESPONSE,
22
+ extra: json,
23
+ });
24
+ }
25
+ const result = json.result;
26
+ return {
27
+ id: result.id,
28
+ startDate: result.kssj,
29
+ endDate: result.jssj,
30
+ startYear: Number(result.xnxq.slice(0, 4)),
31
+ endYear: Number(result.xnxq.slice(5, 9)),
32
+ type: parseSemesterType(Number(result.xnxq.slice(10, 11))),
33
+ };
34
+ }
35
+ /** get all courses in the specified semester; time and location only with `options.timeAndLocation` */
36
+ export async function getCourseList(s, semesterID, courseType = CourseType.STUDENT, lang = s.lang, options = {}) {
37
+ const json = await (await s.fetchWithToken(URLS.LEARN_COURSE_LIST(semesterID, courseType, lang))).json();
38
+ if (json.message !== 'success' || !Array.isArray(json.resultList)) {
39
+ return Promise.reject({
40
+ reason: FailReason.INVALID_RESPONSE,
41
+ extra: json,
42
+ });
43
+ }
44
+ const result = (json.resultList ?? []);
45
+ return Promise.all(result.map(async (c) => {
46
+ let timeAndLocation;
47
+ if (options.timeAndLocation) {
48
+ try {
49
+ timeAndLocation = await getCourseTimeAndLocation(s, c.wlkcid);
50
+ }
51
+ catch {
52
+ timeAndLocation = [];
53
+ }
54
+ }
55
+ return {
56
+ id: c.wlkcid,
57
+ name: decodeHTML(c.zywkcm),
58
+ chineseName: decodeHTML(c.kcm),
59
+ englishName: decodeHTML(c.ywkcm),
60
+ timeAndLocation,
61
+ url: URLS.LEARN_COURSE_PAGE(c.wlkcid, courseType),
62
+ teacherName: c.jsm ?? '', // teacher can not fetch this
63
+ teacherNumber: c.jsh,
64
+ courseNumber: c.kch,
65
+ courseIndex: Number(c.kxh), // c.kxh could be string (teacher mode) or number (student mode)
66
+ courseType,
67
+ };
68
+ }));
69
+ }
70
+ /** get the time and location of one course (1 request) */
71
+ export async function getCourseTimeAndLocation(s, courseID) {
72
+ // see https://github.com/Harry-Chen/Learn-Helper/issues/145
73
+ const json = await (await s.fetchWithToken(URLS.LEARN_COURSE_TIME_LOCATION(courseID))).json();
74
+ if (!Array.isArray(json)) {
75
+ throw { reason: FailReason.INVALID_RESPONSE, extra: json };
76
+ }
77
+ return json;
78
+ }
79
+ export async function sortCourses(s, courseIDs) {
80
+ const json = await (await s.fetchWithToken(URLS.LEARN_SORT_COURSES, {
81
+ method: 'POST',
82
+ body: JSON.stringify(courseIDs.map((id, index) => ({ wlkcid: id, xh: index + 1 }))),
83
+ headers: {
84
+ 'Content-Type': 'application/json',
85
+ },
86
+ })).json();
87
+ if (json.result !== 'success') {
88
+ return Promise.reject({
89
+ reason: FailReason.OPERATION_FAILED,
90
+ extra: json,
91
+ });
92
+ }
93
+ }
94
+ //# sourceMappingURL=courses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"courses.js","sourceRoot":"","sources":["../src/courses.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Session } from './request.ts';
2
+ import type { Discussion, Question } from './types.ts';
3
+ import { CourseType } from './types.ts';
4
+ /** Get all discussions (课程讨论) of the specified course. */
5
+ export declare function getDiscussionList(s: Session, courseID: string, courseType?: CourseType): Promise<Discussion[]>;
6
+ /**
7
+ * Get all notifications (课程答疑) of the specified course.
8
+ * The student version supports only answered questions, while the teacher version supports all questions.
9
+ */
10
+ export declare function getAnsweredQuestionList(s: Session, courseID: string, courseType?: CourseType): Promise<Question[]>;
11
+ //# sourceMappingURL=discussions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discussions.d.ts","sourceRoot":"","sources":["../src/discussions.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAE,UAAU,EAAmB,QAAQ,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EAAE,UAAU,EAAc,MAAM,YAAY,CAAC;AAIpD,0DAA0D;AAC1D,wBAAsB,iBAAiB,CACrC,CAAC,EAAE,OAAO,EACV,QAAQ,EAAE,MAAM,EAChB,UAAU,GAAE,UAA+B,GAC1C,OAAO,CAAC,UAAU,EAAE,CAAC,CAmBvB;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,CAAC,EAAE,OAAO,EACV,QAAQ,EAAE,MAAM,EAChB,UAAU,GAAE,UAA+B,GAC1C,OAAO,CAAC,QAAQ,EAAE,CAAC,CAmBrB"}
@@ -0,0 +1,56 @@
1
+ // Discussions (课程讨论) and answered questions (课程答疑).
2
+ import { Base64 } from 'js-base64';
3
+ import { YES } from './request.js';
4
+ import { CourseType, FailReason } from './types.js';
5
+ import * as URLS from './urls.js';
6
+ import { decodeHTML } from './utils.js';
7
+ /** Get all discussions (课程讨论) of the specified course. */
8
+ export async function getDiscussionList(s, courseID, courseType = CourseType.STUDENT) {
9
+ const json = await (await s.fetchWithToken(URLS.LEARN_DISCUSSION_LIST(courseID, courseType))).json();
10
+ if (json.result !== 'success') {
11
+ return Promise.reject({
12
+ reason: FailReason.INVALID_RESPONSE,
13
+ extra: json,
14
+ });
15
+ }
16
+ const result = (json.object?.resultsList ?? []);
17
+ return result.map((d) => ({
18
+ ...parseDiscussionBase(d),
19
+ boardId: d.bqid,
20
+ url: URLS.LEARN_DISCUSSION_DETAIL(d.wlkcid, d.bqid, d.id, courseType),
21
+ }));
22
+ }
23
+ /**
24
+ * Get all notifications (课程答疑) of the specified course.
25
+ * The student version supports only answered questions, while the teacher version supports all questions.
26
+ */
27
+ export async function getAnsweredQuestionList(s, courseID, courseType = CourseType.STUDENT) {
28
+ const json = await (await s.fetchWithToken(URLS.LEARN_QUESTION_LIST_ANSWERED(courseID, courseType))).json();
29
+ if (json.result !== 'success') {
30
+ return Promise.reject({
31
+ reason: FailReason.INVALID_RESPONSE,
32
+ extra: json,
33
+ });
34
+ }
35
+ const result = (json.object?.resultsList ?? []);
36
+ return result.map((q) => ({
37
+ ...parseDiscussionBase(q),
38
+ question: Base64.decode(q.wtnr),
39
+ url: URLS.LEARN_QUESTION_DETAIL(q.wlkcid, q.id, courseType),
40
+ }));
41
+ }
42
+ function parseDiscussionBase(d) {
43
+ return {
44
+ id: d.id,
45
+ title: decodeHTML(d.bt),
46
+ publisherName: d.fbrxm,
47
+ publishTime: d.fbsj,
48
+ lastReplyTime: d.zhhfsj,
49
+ lastReplierName: d.zhhfrxm,
50
+ visitCount: d.djs ?? 0, // teacher cannot fetch this
51
+ replyCount: d.hfcs,
52
+ isFavorite: d.sfsc === YES,
53
+ comment: d.bznr ?? undefined,
54
+ };
55
+ }
56
+ //# sourceMappingURL=discussions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discussions.js","sourceRoot":"","sources":["../src/discussions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { Session } from './request.ts';
2
+ import type { CommentItem, FavoriteItem } from './types.ts';
3
+ import { ContentType } from './types.ts';
4
+ /**
5
+ * Add an item to favorites. (收藏)
6
+ */
7
+ export declare function addToFavorites(s: Session, type: ContentType, id: string): Promise<void>;
8
+ /**
9
+ * Remove an item from favorites. (取消收藏)
10
+ */
11
+ export declare function removeFromFavorites(s: Session, id: string): Promise<void>;
12
+ /**
13
+ * Get favorites. (我的收藏)
14
+ * If `courseID` or `type` is specified, only return favorites of that course or type.
15
+ */
16
+ export declare function getFavorites(s: Session, courseID?: string, type?: ContentType): Promise<FavoriteItem[]>;
17
+ /**
18
+ * Pin a favorite item. (置顶)
19
+ */
20
+ export declare function pinFavoriteItem(s: Session, id: string): Promise<void>;
21
+ /**
22
+ * Unpin a favorite item. (取消置顶)
23
+ */
24
+ export declare function unpinFavoriteItem(s: Session, id: string): Promise<void>;
25
+ /**
26
+ * Set a comment. (备注)
27
+ * Set an empty string to remove the comment.
28
+ */
29
+ export declare function setComment(s: Session, type: ContentType, id: string, content: string): Promise<void>;
30
+ /**
31
+ * Get comments. (我的备注)
32
+ * If `courseID` or `type` is specified, only return favorites of that course or type.
33
+ */
34
+ export declare function getComments(s: Session, courseID?: string, type?: ContentType): Promise<CommentItem[]>;
35
+ //# sourceMappingURL=favorites.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"favorites.d.ts","sourceRoot":"","sources":["../src/favorites.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAc,MAAM,YAAY,CAAC;AAIrD;;GAEG;AACH,wBAAsB,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ7F;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ/E;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAmC7G;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAa3E;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAa7E;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAa1G;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA+B3G"}
@@ -0,0 +1,150 @@
1
+ // Favorites (收藏) and comments (备注).
2
+ import { YES } from './request.js';
3
+ import { ContentType, FailReason } from './types.js';
4
+ import * as URLS from './urls.js';
5
+ import { CONTENT_TYPE_MAP_REVERSE, decodeHTML } from './utils.js';
6
+ /**
7
+ * Add an item to favorites. (收藏)
8
+ */
9
+ export async function addToFavorites(s, type, id) {
10
+ const json = await (await s.fetchWithToken(URLS.LEARN_FAVORITE_ADD(type, id))).json();
11
+ if (json.result !== 'success' || !json.msg?.endsWith?.('成功')) {
12
+ return Promise.reject({
13
+ reason: FailReason.OPERATION_FAILED,
14
+ extra: json,
15
+ });
16
+ }
17
+ }
18
+ /**
19
+ * Remove an item from favorites. (取消收藏)
20
+ */
21
+ export async function removeFromFavorites(s, id) {
22
+ const json = await (await s.fetchWithToken(URLS.LEARN_FAVORITE_REMOVE(id))).json();
23
+ if (json.result !== 'success' || !json.msg?.endsWith?.('成功')) {
24
+ return Promise.reject({
25
+ reason: FailReason.OPERATION_FAILED,
26
+ extra: json,
27
+ });
28
+ }
29
+ }
30
+ /**
31
+ * Get favorites. (我的收藏)
32
+ * If `courseID` or `type` is specified, only return favorites of that course or type.
33
+ */
34
+ export async function getFavorites(s, courseID, type) {
35
+ const json = await (await s.fetchWithToken(URLS.LEARN_FAVORITE_LIST(type), {
36
+ method: 'POST',
37
+ body: URLS.LEARN_PAGE_LIST_FORM_DATA(courseID),
38
+ })).json();
39
+ if (json.result !== 'success') {
40
+ return Promise.reject({
41
+ reason: FailReason.INVALID_RESPONSE,
42
+ extra: json,
43
+ });
44
+ }
45
+ const result = (json.object?.aaData ?? []);
46
+ return result
47
+ .map((e) => {
48
+ const itemType = CONTENT_TYPE_MAP_REVERSE.get(e.ywlx);
49
+ if (!itemType)
50
+ return undefined; // ignore unknown type
51
+ return {
52
+ id: e.ywid,
53
+ type: itemType,
54
+ title: decodeHTML(e.ywbt),
55
+ time: itemType === ContentType.DISCUSSION || itemType === ContentType.QUESTION ? e.tlsj : e.ywsj,
56
+ state: e.ywzt,
57
+ extra: e.ywbz ?? undefined,
58
+ semesterId: e.xnxq,
59
+ courseId: e.wlkcid,
60
+ pinned: e.sfzd === YES,
61
+ pinnedTime: e.zdsj === null ? undefined : e.zdsj, // Note: this field is originally unix timestamp instead of string
62
+ comment: e.bznr ?? undefined,
63
+ addedTime: e.scsj,
64
+ itemId: e.id,
65
+ };
66
+ })
67
+ .filter((x) => !!x);
68
+ }
69
+ /**
70
+ * Pin a favorite item. (置顶)
71
+ */
72
+ export async function pinFavoriteItem(s, id) {
73
+ const json = await (await s.fetchWithToken(URLS.LEARN_FAVORITE_PIN, {
74
+ method: 'POST',
75
+ body: URLS.LEARN_FAVORITE_PIN_UNPIN_FORM_DATA(id),
76
+ })).json();
77
+ if (json.result !== 'success') {
78
+ return Promise.reject({
79
+ reason: FailReason.OPERATION_FAILED,
80
+ extra: json,
81
+ });
82
+ }
83
+ }
84
+ /**
85
+ * Unpin a favorite item. (取消置顶)
86
+ */
87
+ export async function unpinFavoriteItem(s, id) {
88
+ const json = await (await s.fetchWithToken(URLS.LEARN_FAVORITE_UNPIN, {
89
+ method: 'POST',
90
+ body: URLS.LEARN_FAVORITE_PIN_UNPIN_FORM_DATA(id),
91
+ })).json();
92
+ if (json.result !== 'success') {
93
+ return Promise.reject({
94
+ reason: FailReason.OPERATION_FAILED,
95
+ extra: json,
96
+ });
97
+ }
98
+ }
99
+ /**
100
+ * Set a comment. (备注)
101
+ * Set an empty string to remove the comment.
102
+ */
103
+ export async function setComment(s, type, id, content) {
104
+ const json = await (await s.fetchWithToken(URLS.LEARN_COMMENT_SET, {
105
+ method: 'POST',
106
+ body: URLS.LEARN_COMMENT_SET_FORM_DATA(type, id, content),
107
+ })).json();
108
+ if (json.result !== 'success' || !json.msg?.endsWith?.('成功')) {
109
+ return Promise.reject({
110
+ reason: FailReason.OPERATION_FAILED,
111
+ extra: json,
112
+ });
113
+ }
114
+ }
115
+ /**
116
+ * Get comments. (我的备注)
117
+ * If `courseID` or `type` is specified, only return favorites of that course or type.
118
+ */
119
+ export async function getComments(s, courseID, type) {
120
+ const json = await (await s.fetchWithToken(URLS.LEARN_COMMENT_LIST(type), {
121
+ method: 'POST',
122
+ body: URLS.LEARN_PAGE_LIST_FORM_DATA(courseID),
123
+ })).json();
124
+ if (json.result !== 'success') {
125
+ return Promise.reject({
126
+ reason: FailReason.INVALID_RESPONSE,
127
+ extra: json,
128
+ });
129
+ }
130
+ const result = (json.object?.aaData ?? []);
131
+ return result
132
+ .map((e) => {
133
+ const itemType = CONTENT_TYPE_MAP_REVERSE.get(e.ywlx);
134
+ if (!itemType)
135
+ return undefined; // ignore unknown type
136
+ return {
137
+ id: e.ywid,
138
+ type: itemType,
139
+ content: e.bt,
140
+ contentHTML: decodeHTML(e.bznrstring),
141
+ title: decodeHTML(e.ywbt),
142
+ semesterId: e.xnxq,
143
+ courseId: e.wlkcid,
144
+ commentTime: e.cjsj,
145
+ itemId: e.id,
146
+ };
147
+ })
148
+ .filter((x) => !!x);
149
+ }
150
+ //# sourceMappingURL=favorites.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"favorites.js","sourceRoot":"","sources":["../src/favorites.ts"],"names":[],"mappings":"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"}
package/lib/files.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ import type { Session } from './request.ts';
2
+ import type { File, FileCategory } from './types.ts';
3
+ import { CourseType } from './types.ts';
4
+ /** Get all files (课程文件) of the specified course. */
5
+ export declare function getFileList(s: Session, courseID: string, courseType?: CourseType): Promise<File[]>;
6
+ /** Get file categories of the specified course. */
7
+ export declare function getFileCategoryList(s: Session, courseID: string, courseType?: CourseType): Promise<FileCategory[]>;
8
+ /**
9
+ * Get all files of the specified category of the specified course.
10
+ * Note: this cannot get correct `visitCount` and `downloadCount` for student
11
+ */
12
+ export declare function getFileListByCategory(s: Session, courseID: string, categoryId: string, courseType?: CourseType): Promise<File[]>;
13
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAe,UAAU,EAAc,MAAM,YAAY,CAAC;AAIjE,oDAAoD;AACpD,wBAAsB,WAAW,CAC/B,CAAC,EAAE,OAAO,EACV,QAAQ,EAAE,MAAM,EAChB,UAAU,GAAE,UAA+B,GAC1C,OAAO,CAAC,IAAI,EAAE,CAAC,CAoDjB;AAED,mDAAmD;AACnD,wBAAsB,mBAAmB,CACvC,CAAC,EAAE,OAAO,EACV,QAAQ,EAAE,MAAM,EAChB,UAAU,GAAE,UAA+B,GAC1C,OAAO,CAAC,YAAY,EAAE,CAAC,CAmBzB;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,CAAC,EAAE,OAAO,EACV,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,UAAU,GAAE,UAA+B,GAC1C,OAAO,CAAC,IAAI,EAAE,CAAC,CA8FjB"}
package/lib/files.js ADDED
@@ -0,0 +1,167 @@
1
+ // Course files (课程文件) and file categories.
2
+ import { ContentType, CourseType, FailReason } from './types.js';
3
+ import * as URLS from './urls.js';
4
+ import { decodeHTML, formatFileSize } from './utils.js';
5
+ /** Get all files (课程文件) of the specified course. */
6
+ export async function getFileList(s, courseID, courseType = CourseType.STUDENT) {
7
+ const json = await (await s.fetchWithToken(URLS.LEARN_FILE_LIST(courseID, courseType))).json();
8
+ if (json.result !== 'success') {
9
+ return Promise.reject({
10
+ reason: FailReason.INVALID_RESPONSE,
11
+ extra: json,
12
+ });
13
+ }
14
+ let result = [];
15
+ if (Array.isArray(json.object?.resultsList)) {
16
+ // teacher
17
+ result = json.object.resultsList;
18
+ }
19
+ else if (Array.isArray(json.object)) {
20
+ // student
21
+ result = json.object;
22
+ }
23
+ const categories = new Map((await getFileCategoryList(s, courseID, courseType)).map((c) => [c.id, c]));
24
+ return result.map((f) => {
25
+ const title = decodeHTML(f.bt);
26
+ const fileId = f.wjid;
27
+ const uploadTime = f.scsj;
28
+ const downloadUrl = URLS.LEARN_FILE_DOWNLOAD(fileId, courseType);
29
+ const previewUrl = URLS.LEARN_FILE_PREVIEW(ContentType.FILE, fileId, courseType, s.previewFirstPage);
30
+ return {
31
+ id: f.kjxxid,
32
+ fileId,
33
+ category: categories.get(f.kjflid),
34
+ title,
35
+ description: decodeHTML(f.ms),
36
+ rawSize: f.wjdx,
37
+ size: f.fileSize,
38
+ uploadTime,
39
+ publishTime: uploadTime,
40
+ downloadUrl,
41
+ previewUrl,
42
+ isNew: f.isNew ?? false,
43
+ markedImportant: f.sfqd === 1,
44
+ visitCount: f.xsllcs ?? f.llcs ?? 0,
45
+ downloadCount: f.xzcs ?? 0,
46
+ fileType: f.wjlx,
47
+ remoteFile: {
48
+ id: fileId,
49
+ name: title,
50
+ downloadUrl,
51
+ previewUrl,
52
+ size: f.fileSize,
53
+ },
54
+ };
55
+ });
56
+ }
57
+ /** Get file categories of the specified course. */
58
+ export async function getFileCategoryList(s, courseID, courseType = CourseType.STUDENT) {
59
+ const json = await (await s.fetchWithToken(URLS.LEARN_FILE_CATEGORY_LIST(courseID, courseType))).json();
60
+ if (json.result !== 'success') {
61
+ return Promise.reject({
62
+ reason: FailReason.INVALID_RESPONSE,
63
+ extra: json,
64
+ });
65
+ }
66
+ const result = (json.object?.rows ?? []);
67
+ return result.map((c) => ({
68
+ id: c.kjflid,
69
+ title: decodeHTML(c.bt),
70
+ creationTime: c.czsj,
71
+ }));
72
+ }
73
+ /**
74
+ * Get all files of the specified category of the specified course.
75
+ * Note: this cannot get correct `visitCount` and `downloadCount` for student
76
+ */
77
+ export async function getFileListByCategory(s, courseID, categoryId, courseType = CourseType.STUDENT) {
78
+ if (courseType === CourseType.STUDENT) {
79
+ const json = await (await s.fetchWithToken(URLS.LEARN_FILE_LIST_BY_CATEGORY_STUDENT(courseID, categoryId))).json();
80
+ if (json.result !== 'success') {
81
+ return Promise.reject({
82
+ reason: FailReason.INVALID_RESPONSE,
83
+ extra: json,
84
+ });
85
+ }
86
+ const result = (json.object ?? []);
87
+ return result.map((f) => {
88
+ const fileId = f[7];
89
+ const title = decodeHTML(f[1]);
90
+ const rawSize = f[9];
91
+ const size = formatFileSize(rawSize);
92
+ const downloadUrl = URLS.LEARN_FILE_DOWNLOAD(fileId, courseType);
93
+ const previewUrl = URLS.LEARN_FILE_PREVIEW(ContentType.FILE, fileId, courseType, s.previewFirstPage);
94
+ return {
95
+ id: f[0],
96
+ fileId,
97
+ title,
98
+ description: decodeHTML(f[5]),
99
+ rawSize,
100
+ size,
101
+ uploadTime: f[6],
102
+ publishTime: f[10],
103
+ downloadUrl,
104
+ previewUrl,
105
+ isNew: f[8] === 1,
106
+ markedImportant: f[2] === 1,
107
+ visitCount: 0,
108
+ downloadCount: 0,
109
+ fileType: f[13],
110
+ remoteFile: {
111
+ id: fileId,
112
+ name: title,
113
+ downloadUrl,
114
+ previewUrl,
115
+ size,
116
+ },
117
+ isFavorite: f[11],
118
+ comment: f[14] ?? undefined,
119
+ };
120
+ });
121
+ }
122
+ else {
123
+ const json = await (await s.fetchWithToken(URLS.LEARN_FILE_LIST_BY_CATEGORY_TEACHER, {
124
+ method: 'POST',
125
+ body: URLS.LEARN_FILE_LIST_BY_CATEGORY_TEACHER_FORM_DATA(courseID, categoryId),
126
+ })).json();
127
+ if (json.result !== 'success') {
128
+ return Promise.reject({
129
+ reason: FailReason.INVALID_RESPONSE,
130
+ extra: json,
131
+ });
132
+ }
133
+ const result = (json.object.aaData ?? []);
134
+ return result.map((f) => {
135
+ const title = decodeHTML(f.bt);
136
+ const fileId = f.wjid;
137
+ const uploadTime = f.scsj;
138
+ const downloadUrl = URLS.LEARN_FILE_DOWNLOAD(fileId, courseType);
139
+ const previewUrl = URLS.LEARN_FILE_PREVIEW(ContentType.FILE, fileId, courseType, s.previewFirstPage);
140
+ return {
141
+ id: f.kjxxid,
142
+ fileId,
143
+ title,
144
+ description: decodeHTML(f.ms),
145
+ rawSize: f.wjdx,
146
+ size: f.fileSize,
147
+ uploadTime,
148
+ publishTime: uploadTime,
149
+ downloadUrl,
150
+ previewUrl,
151
+ isNew: f.isNew ?? false,
152
+ markedImportant: f.sfqd === 1,
153
+ visitCount: f.xsllcs ?? f.llcs ?? 0,
154
+ downloadCount: f.xzcs ?? 0,
155
+ fileType: f.wjlx,
156
+ remoteFile: {
157
+ id: fileId,
158
+ name: title,
159
+ downloadUrl,
160
+ previewUrl,
161
+ size: f.fileSize,
162
+ },
163
+ };
164
+ });
165
+ }
166
+ }
167
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAI3C,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAExD,oDAAoD;AACpD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,CAAU,EACV,QAAgB,EAChB,UAAU,GAAe,UAAU,CAAC,OAAO;IAE3C,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/F,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,OAAO,CAAC,MAAM,CAAC;YACpB,MAAM,EAAE,UAAU,CAAC,gBAAgB;YACnC,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM,GAAU,EAAE,CAAC;IACvB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC;QAC5C,UAAU;QACV,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;IACnC,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,UAAU;QACV,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,mBAAmB,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvG,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACtB,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC;QACtB,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC;QAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACjE,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAC;QACrG,OAAO;YACL,EAAE,EAAE,CAAC,CAAC,MAAM;YACZ,MAAM;YACN,QAAQ,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;YAClC,KAAK;YACL,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,CAAC,CAAC,IAAI;YACf,IAAI,EAAE,CAAC,CAAC,QAAQ;YAChB,UAAU;YACV,WAAW,EAAE,UAAU;YACvB,WAAW;YACX,UAAU;YACV,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,KAAK;YACvB,eAAe,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC;YAC7B,UAAU,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC;YACnC,aAAa,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC;YAC1B,QAAQ,EAAE,CAAC,CAAC,IAAI;YAChB,UAAU,EAAE;gBACV,EAAE,EAAE,MAAM;gBACV,IAAI,EAAE,KAAK;gBACX,WAAW;gBACX,UAAU;gBACV,IAAI,EAAE,CAAC,CAAC,QAAQ;aACjB;SACa,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,mDAAmD;AACnD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,CAAU,EACV,QAAgB,EAChB,UAAU,GAAe,UAAU,CAAC,OAAO;IAE3C,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,wBAAwB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACxG,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,OAAO,CAAC,MAAM,CAAC;YACpB,MAAM,EAAE,UAAU,CAAC,gBAAgB;YACnC,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;IACL,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAU,CAAC;IAElD,OAAO,MAAM,CAAC,GAAG,CACf,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC;QACC,EAAE,EAAE,CAAC,CAAC,MAAM;QACZ,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACvB,YAAY,EAAE,CAAC,CAAC,IAAI;KACrB,CAAwB,CAC5B,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,CAAU,EACV,QAAgB,EAChB,UAAkB,EAClB,UAAU,GAAe,UAAU,CAAC,OAAO;IAE3C,IAAI,UAAU,KAAK,UAAU,CAAC,OAAO,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,mCAAmC,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACnH,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,OAAO,CAAC,MAAM,CAAC;gBACpB,MAAM,EAAE,UAAU,CAAC,gBAAgB;gBACnC,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;QACL,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAU,CAAC;QAE5C,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACtB,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACpB,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACrB,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;YACrC,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YACjE,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAC;YACrG,OAAO;gBACL,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;gBACR,MAAM;gBACN,KAAK;gBACL,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7B,OAAO;gBACP,IAAI;gBACJ,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;gBAChB,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC;gBAClB,WAAW;gBACX,UAAU;gBACV,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;gBACjB,eAAe,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC3B,UAAU,EAAE,CAAC;gBACb,aAAa,EAAE,CAAC;gBAChB,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC;gBACf,UAAU,EAAE;oBACV,EAAE,EAAE,MAAM;oBACV,IAAI,EAAE,KAAK;oBACX,WAAW;oBACX,UAAU;oBACV,IAAI;iBACL;gBACD,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC;gBACjB,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,SAAS;aACb,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,MAAM,CACjB,MAAM,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,mCAAmC,EAAE;YAC/D,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,6CAA6C,CAAC,QAAQ,EAAE,UAAU,CAAC;SAC/E,CAAC,CACH,CAAC,IAAI,EAAE,CAAC;QACT,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,OAAO,CAAC,MAAM,CAAC;gBACpB,MAAM,EAAE,UAAU,CAAC,gBAAgB;gBACnC,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;QACL,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAU,CAAC;QAEnD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACtB,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC/B,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC;YACtB,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC;YAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YACjE,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAC;YACrG,OAAO;gBACL,EAAE,EAAE,CAAC,CAAC,MAAM;gBACZ,MAAM;gBACN,KAAK;gBACL,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7B,OAAO,EAAE,CAAC,CAAC,IAAI;gBACf,IAAI,EAAE,CAAC,CAAC,QAAQ;gBAChB,UAAU;gBACV,WAAW,EAAE,UAAU;gBACvB,WAAW;gBACX,UAAU;gBACV,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,KAAK;gBACvB,eAAe,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC;gBAC7B,UAAU,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC;gBACnC,aAAa,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC;gBAC1B,QAAQ,EAAE,CAAC,CAAC,IAAI;gBAChB,UAAU,EAAE;oBACV,EAAE,EAAE,MAAM;oBACV,IAAI,EAAE,KAAK;oBACX,WAAW;oBACX,UAAU;oBACV,IAAI,EAAE,CAAC,CAAC,QAAQ;iBACjB;aACa,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { Session } from './request.ts';
2
+ import type { Homework, HomeworkListOptions, HomeworkTA, IExcellentHomework, IHomework, IHomeworkDetail, IHomeworkSubmitAttachment } from './types.ts';
3
+ import { CourseType } from './types.ts';
4
+ /**
5
+ * Get all homeworks (课程作业) of the specified course: 3 status lists and the excellent homework list.
6
+ * Details (page + description) only for the homework `options.details` selects.
7
+ */
8
+ export declare function getHomeworkList(s: Session, courseID: string): Promise<Homework[]>;
9
+ export declare function getHomeworkList(s: Session, courseID: string, courseType: CourseType.STUDENT, options?: HomeworkListOptions): Promise<Homework[]>;
10
+ export declare function getHomeworkList(s: Session, courseID: string, courseType: CourseType.TEACHER): Promise<HomeworkTA[]>;
11
+ /**
12
+ * Get the detail of one homework or excellent homework: its page (answer, submitted content, attachments) and the
13
+ * description JSON (which wins for `description`). 2 requests.
14
+ */
15
+ export declare function getHomeworkDetail(s: Session, homework: Pick<IHomework | IExcellentHomework, 'url' | 'baseId'>): Promise<IHomeworkDetail>;
16
+ export declare function submitHomework(s: Session, id: string, content?: string, attachment?: IHomeworkSubmitAttachment, removeAttachment?: boolean): Promise<void>;
17
+ //# sourceMappingURL=homework.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"homework.d.ts","sourceRoot":"","sources":["../src/homework.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAGV,QAAQ,EACR,mBAAmB,EACnB,UAAU,EACV,kBAAkB,EAClB,SAAS,EACT,eAAe,EAEf,yBAAyB,EAE1B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAe,UAAU,EAAc,MAAM,YAAY,CAAC;AAIjE;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;AAEnF,wBAAgB,eAAe,CAC7B,CAAC,EAAE,OAAO,EACV,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,UAAU,CAAC,OAAO,EAC9B,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;AAEvB,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;AA2KrH;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,CAAC,EAAE,OAAO,EACV,QAAQ,EAAE,IAAI,CAAC,SAAS,GAAG,kBAAkB,EAAE,KAAK,GAAG,QAAQ,CAAC,GAC/D,OAAO,CAAC,eAAe,CAAC,CAM1B;AA2CD,wBAAsB,cAAc,CAClC,CAAC,EAAE,OAAO,EACV,EAAE,EAAE,MAAM,EACV,OAAO,SAAK,EACZ,UAAU,CAAC,EAAE,yBAAyB,EACtC,gBAAgB,UAAQ,GACvB,OAAO,CAAC,IAAI,CAAC,CAaf"}