@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,62 @@
1
+ // Questionnaires (课程问卷).
2
+ import { YES } from './request.js';
3
+ import { FailReason, QuestionnaireType } from './types.js';
4
+ import * as URLS from './urls.js';
5
+ import { QNR_TYPE_MAP, decodeHTML } from './utils.js';
6
+ /**
7
+ * Get all questionnaires (课程问卷/QNR) of the specified course.
8
+ */
9
+ export async function getQuestionnaireList(s, courseID) {
10
+ return Promise.all([
11
+ getQuestionnaireListAtUrl(s, courseID, URLS.LEARN_QNR_LIST_ONGOING),
12
+ getQuestionnaireListAtUrl(s, courseID, URLS.LEARN_QNR_LIST_ENDED),
13
+ ]).then((r) => r.flat());
14
+ }
15
+ async function getQuestionnaireListAtUrl(s, courseID, url) {
16
+ const json = await (await s.fetchWithToken(url, { method: 'POST', body: URLS.LEARN_PAGE_LIST_FORM_DATA(courseID) })).json();
17
+ if (json.result !== 'success') {
18
+ return Promise.reject({
19
+ reason: FailReason.INVALID_RESPONSE,
20
+ extra: json,
21
+ });
22
+ }
23
+ const result = (json.object?.aaData ?? []);
24
+ return Promise.all(result.map(async (e) => {
25
+ const type = QNR_TYPE_MAP.get(e.wjlx) ?? QuestionnaireType.SURVEY;
26
+ return {
27
+ id: e.wjid,
28
+ type,
29
+ title: decodeHTML(e.wjbt),
30
+ startTime: e.kssj,
31
+ endTime: e.jssj,
32
+ uploadTime: e.scsj,
33
+ uploaderId: e.scr,
34
+ uploaderName: e.scrxm,
35
+ submitTime: e.tjsj ? e.tjsj : undefined,
36
+ isFavorite: e.sfsc === YES,
37
+ comment: e.bznr ?? undefined,
38
+ url: URLS.LEARN_QNR_SUBMIT_PAGE(e.wlkcid, e.wjid, type),
39
+ detail: await getQuestionnaireDetail(s, courseID, e.wjid),
40
+ };
41
+ }));
42
+ }
43
+ async function getQuestionnaireDetail(s, courseID, qnrID) {
44
+ const json = await (await s.fetchWithToken(URLS.LEARN_QNR_DETAIL, {
45
+ method: 'POST',
46
+ body: URLS.LEARN_QNR_DETAIL_FORM(courseID, qnrID),
47
+ })).json();
48
+ return json.map((e) => ({
49
+ id: e.wtid,
50
+ index: Number(e.wtbh),
51
+ type: e.type,
52
+ required: e.require === YES,
53
+ title: decodeHTML(e.wtbt),
54
+ score: e.wtfz ? Number(e.wtfz) : undefined, // unsure about original type
55
+ options: e.list?.map((o) => ({
56
+ id: o.xxid,
57
+ index: Number(o.xxbh),
58
+ title: decodeHTML(o.xxbt),
59
+ })),
60
+ }));
61
+ }
62
+ //# sourceMappingURL=questionnaires.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"questionnaires.js","sourceRoot":"","sources":["../src/questionnaires.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import * as cheerio from 'cheerio';
2
+ import type { Element } from 'cheerio';
3
+ import { CookieJar } from 'tough-cookie';
4
+ import type { CredentialProvider, Fetch, HelperConfig } from './types.ts';
5
+ import { Language } from './types.ts';
6
+ export declare const $: (html: string | Element | Element[]) => cheerio.CheerioAPI;
7
+ export declare const noLogin: (res: Response) => boolean;
8
+ export declare const YES = "\u662F";
9
+ /** add CSRF token to any request URL as parameters */
10
+ export declare const addCSRFTokenToUrl: (url: string, token: string) => string;
11
+ /**
12
+ * State shared by every request a `Learn2018Helper` makes: cookies, CSRF token, language and the fetch wrappers.
13
+ * Internal; the helper keeps it in a private field.
14
+ */
15
+ export declare class Session {
16
+ readonly login: () => Promise<void>;
17
+ readonly provider?: CredentialProvider;
18
+ readonly cookieJar: CookieJar;
19
+ /** plain fetch with cookies, no login check */
20
+ readonly rawFetch: Fetch;
21
+ /** rejects with `NOT_LOGGED_IN`, or logs in again and retries once when a `CredentialProvider` is set */
22
+ readonly fetch: Fetch;
23
+ csrfToken: string;
24
+ lang: Language;
25
+ previewFirstPage: boolean;
26
+ /** `login` is called with no arguments when a request needs a (new) session */
27
+ constructor(config: HelperConfig | undefined, login: () => Promise<void>);
28
+ /** like `fetch`, but logs in first if there is no CSRF token yet and adds the token to the URL */
29
+ readonly fetchWithToken: Fetch;
30
+ }
31
+ //# sourceMappingURL=request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGvC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,EAAc,QAAQ,EAAE,MAAM,YAAY,CAAC;AAIlD,eAAO,MAAM,CAAC,SAAU,MAAM,GAAG,OAAO,GAAG,OAAO,EAAE,KAAG,OAAO,CAAC,UAE9D,CAAC;AAEF,eAAO,MAAM,OAAO,QAAS,QAAQ,YAA4D,CAAC;AAElG,eAAO,MAAM,GAAG,WAAM,CAAC;AAEvB,sDAAsD;AACtD,eAAO,MAAM,iBAAiB,QAAS,MAAM,SAAS,MAAM,KAAG,MAI9D,CAAC;AAgCF;;;GAGG;AACH,qBAAa,OAAO;IAchB,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC;IAbrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,+CAA+C;IAC/C,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC;IACzB,yGAAyG;IACzG,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,SAAS,SAAM;IACf,IAAI,WAAe;IACnB,gBAAgB,EAAE,OAAO,CAAC;IAE1B,+EAA+E;IAC/E,YACE,MAAM,EAAE,YAAY,GAAG,SAAS,EACvB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAgBpC;IAED,kGAAkG;IAClG,QAAQ,CAAC,cAAc,EAAE,KAAK,CAM5B;CACH"}
package/lib/request.js ADDED
@@ -0,0 +1,90 @@
1
+ import * as cheerio from 'cheerio';
2
+ import fetchCookie from 'fetch-cookie';
3
+ import { fetch } from 'node-fetch-native';
4
+ import { CookieJar } from 'tough-cookie';
5
+ import { FailReason, Language } from './types.js';
6
+ const CHEERIO_CONFIG = { xml: true };
7
+ export const $ = (html) => {
8
+ return cheerio.load(html, CHEERIO_CONFIG);
9
+ };
10
+ export const noLogin = (res) => res.url.includes('login_timeout') || res.status === 403;
11
+ export const YES = '是';
12
+ /** add CSRF token to any request URL as parameters */
13
+ export const addCSRFTokenToUrl = (url, token) => {
14
+ const newUrl = new URL(url);
15
+ newUrl.searchParams.set('_csrf', token);
16
+ return newUrl.toString();
17
+ };
18
+ function makeFetch(jar) {
19
+ return fetchCookie(fetch, jar);
20
+ }
21
+ function withReAuth(rawFetch, login) {
22
+ return async function wrappedFetch(...args) {
23
+ const retryAfterLogin = async () => {
24
+ await login();
25
+ return await rawFetch(...args).then((res) => {
26
+ if (noLogin(res)) {
27
+ return Promise.reject({
28
+ reason: FailReason.NOT_LOGGED_IN,
29
+ });
30
+ }
31
+ else if (res.status !== 200) {
32
+ return Promise.reject({
33
+ reason: FailReason.UNEXPECTED_STATUS,
34
+ extra: {
35
+ code: res.status,
36
+ text: res.statusText,
37
+ },
38
+ });
39
+ }
40
+ else {
41
+ return res;
42
+ }
43
+ });
44
+ };
45
+ return await rawFetch(...args).then((res) => (noLogin(res) ? retryAfterLogin() : res));
46
+ };
47
+ }
48
+ /**
49
+ * State shared by every request a `Learn2018Helper` makes: cookies, CSRF token, language and the fetch wrappers.
50
+ * Internal; the helper keeps it in a private field.
51
+ */
52
+ export class Session {
53
+ login;
54
+ provider;
55
+ cookieJar;
56
+ /** plain fetch with cookies, no login check */
57
+ rawFetch;
58
+ /** rejects with `NOT_LOGGED_IN`, or logs in again and retries once when a `CredentialProvider` is set */
59
+ fetch;
60
+ csrfToken = '';
61
+ lang = Language.ZH;
62
+ previewFirstPage;
63
+ /** `login` is called with no arguments when a request needs a (new) session */
64
+ constructor(config, login) {
65
+ this.login = login;
66
+ this.previewFirstPage = config?.generatePreviewUrlForFirstPage ?? true;
67
+ this.provider = config?.provider;
68
+ this.cookieJar = config?.cookieJar ?? new CookieJar();
69
+ this.rawFetch = config?.fetch ?? makeFetch(this.cookieJar);
70
+ this.fetch = this.provider
71
+ ? withReAuth(this.rawFetch, login)
72
+ : async (...args) => {
73
+ const result = await this.rawFetch(...args);
74
+ if (noLogin(result))
75
+ return Promise.reject({
76
+ reason: FailReason.NOT_LOGGED_IN,
77
+ });
78
+ return result;
79
+ };
80
+ }
81
+ /** like `fetch`, but logs in first if there is no CSRF token yet and adds the token to the URL */
82
+ fetchWithToken = async (...args) => {
83
+ if (this.csrfToken === '') {
84
+ await this.login();
85
+ }
86
+ const [url, ...remaining] = args;
87
+ return this.fetch(addCSRFTokenToUrl(url, this.csrfToken), ...remaining);
88
+ };
89
+ }
90
+ //# sourceMappingURL=request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.js","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"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"}
package/lib/types.d.ts ADDED
@@ -0,0 +1,392 @@
1
+ import type { CookieJar } from 'tough-cookie';
2
+ export type Fetch = typeof globalThis.fetch;
3
+ export type Credential = {
4
+ username?: string;
5
+ password?: string;
6
+ fingerPrint?: string;
7
+ fingerGenPrint?: string;
8
+ fingerGenPrint3?: string;
9
+ };
10
+ export type CredentialProvider = () => Credential | Promise<Credential>;
11
+ export type HelperConfig = {
12
+ provider?: CredentialProvider;
13
+ fetch?: Fetch;
14
+ cookieJar?: CookieJar;
15
+ generatePreviewUrlForFirstPage?: boolean;
16
+ };
17
+ export declare enum FailReason {
18
+ NO_CREDENTIAL = "no credential provided",
19
+ ERROR_FETCH_FROM_ID = "could not fetch ticket from id.tsinghua.edu.cn",
20
+ BAD_CREDENTIAL = "bad credential",
21
+ ERROR_ROAMING = "could not roam to learn.tsinghua.edu.cn",
22
+ NOT_LOGGED_IN = "not logged in or login timeout",
23
+ NOT_IMPLEMENTED = "not implemented",
24
+ INVALID_RESPONSE = "invalid response",
25
+ UNEXPECTED_STATUS = "unexpected status",
26
+ OPERATION_FAILED = "operation failed",
27
+ ERROR_SETTING_COOKIES = "could not set cookies"
28
+ }
29
+ export interface ApiError {
30
+ reason: FailReason;
31
+ extra?: unknown;
32
+ }
33
+ export declare enum SemesterType {
34
+ FALL = "fall",
35
+ SPRING = "spring",
36
+ SUMMER = "summer",
37
+ UNKNOWN = ""
38
+ }
39
+ export declare enum ContentType {
40
+ NOTIFICATION = "notification",
41
+ FILE = "file",
42
+ HOMEWORK = "homework",
43
+ DISCUSSION = "discussion",
44
+ QUESTION = "question",
45
+ QUESTIONNAIRE = "questionnaire"
46
+ }
47
+ interface IUserInfo {
48
+ name: string;
49
+ department: string;
50
+ }
51
+ export type UserInfo = IUserInfo;
52
+ interface ISemesterInfo {
53
+ id: string;
54
+ startDate: string;
55
+ endDate: string;
56
+ startYear: number;
57
+ endYear: number;
58
+ type: SemesterType;
59
+ }
60
+ export type SemesterInfo = ISemesterInfo;
61
+ export declare enum CourseType {
62
+ STUDENT = "student",
63
+ TEACHER = "teacher"
64
+ }
65
+ interface ICourseInfo {
66
+ id: string;
67
+ name: string;
68
+ chineseName: string;
69
+ englishName: string;
70
+ timeAndLocation: string[];
71
+ url: string;
72
+ teacherName: string;
73
+ teacherNumber: string;
74
+ courseNumber: string;
75
+ courseIndex: number;
76
+ courseType: CourseType;
77
+ }
78
+ export type CourseInfo = ICourseInfo;
79
+ interface IRemoteFile {
80
+ id: string;
81
+ name: string;
82
+ downloadUrl: string;
83
+ previewUrl: string;
84
+ size: string;
85
+ }
86
+ export type RemoteFile = IRemoteFile;
87
+ export interface INotification {
88
+ id: string;
89
+ title: string;
90
+ content: string;
91
+ hasRead: boolean;
92
+ url: string;
93
+ markedImportant: boolean;
94
+ publishTime: string;
95
+ publisher: string;
96
+ expireTime?: string;
97
+ isFavorite: boolean;
98
+ comment?: string;
99
+ }
100
+ export interface INotificationDetail {
101
+ attachment?: RemoteFile;
102
+ }
103
+ export type Notification = INotification & INotificationDetail;
104
+ interface IFileCategory {
105
+ id: string;
106
+ title: string;
107
+ creationTime: Date;
108
+ }
109
+ export type FileCategory = IFileCategory;
110
+ interface IFile {
111
+ /** previously `id2` */
112
+ id: string;
113
+ /** previously `id` */
114
+ fileId: string;
115
+ /** note: will be unset when calling `getFileListByCategory` */
116
+ category?: FileCategory;
117
+ /** size in byte */
118
+ rawSize: number;
119
+ /** inaccurate size description (like '1M') */
120
+ size: string;
121
+ title: string;
122
+ description: string;
123
+ uploadTime: string;
124
+ publishTime: string;
125
+ downloadUrl: string;
126
+ /** preview is not supported on all types of files, check before use */
127
+ previewUrl: string;
128
+ isNew: boolean;
129
+ markedImportant: boolean;
130
+ visitCount: number;
131
+ downloadCount: number;
132
+ fileType: string;
133
+ /** for compatibility */
134
+ remoteFile: RemoteFile;
135
+ /** could not get favorite or comment info when using `getFileList` or in TA mode */
136
+ isFavorite?: boolean;
137
+ comment?: string;
138
+ }
139
+ export type File = IFile;
140
+ export interface IHomeworkStatus {
141
+ submitted: boolean;
142
+ graded: boolean;
143
+ }
144
+ export declare enum HomeworkGradeLevel {
145
+ /** 已阅 */
146
+ CHECKED = "checked",
147
+ A_PLUS = "A+",
148
+ A = "A",
149
+ A_MINUS = "A-",
150
+ B_PLUS = "B+",
151
+ /** 优秀 */
152
+ DISTINCTION = "distinction",
153
+ B = "B",
154
+ B_MINUS = "B-",
155
+ C_PLUS = "C+",
156
+ C = "C",
157
+ C_MINUS = "C-",
158
+ G = "G",
159
+ D_PLUS = "D+",
160
+ D = "D",
161
+ /** 免课 */
162
+ EXEMPTED_COURSE = "exempted course",
163
+ P = "P",
164
+ EX = "EX",
165
+ /** 免修 */
166
+ EXEMPTION = "exemption",
167
+ /** 通过 */
168
+ PASS = "pass",
169
+ /** 不通过 */
170
+ FAILURE = "failure",
171
+ W = "W",
172
+ I = "I",
173
+ /** 缓考 */
174
+ INCOMPLETE = "incomplete",
175
+ NA = "NA",
176
+ F = "F"
177
+ }
178
+ export interface IHomework extends IHomeworkStatus {
179
+ id: string;
180
+ /** @deprecated use `id` */
181
+ studentHomeworkId: string;
182
+ baseId: string;
183
+ title: string;
184
+ deadline: string;
185
+ lateSubmissionDeadline?: string;
186
+ url: string;
187
+ completionType: HomeworkCompletionType;
188
+ submissionType: HomeworkSubmissionType;
189
+ submitUrl: string;
190
+ submitTime?: string;
191
+ isLateSubmission: boolean;
192
+ grade?: number;
193
+ /** some homework has levels but not grades, like A/B/.../F */
194
+ gradeLevel?: HomeworkGradeLevel;
195
+ gradeTime?: string;
196
+ graderName?: string;
197
+ gradeContent?: string;
198
+ isFavorite: boolean;
199
+ favoriteTime?: string;
200
+ comment?: string;
201
+ excellentHomeworkList?: ExcellentHomework[];
202
+ }
203
+ export interface IHomeworkDetail {
204
+ description?: string;
205
+ /** attachment from teacher */
206
+ attachment?: RemoteFile;
207
+ /** answer from teacher */
208
+ answerContent?: string;
209
+ answerAttachment?: RemoteFile;
210
+ /** submitted content from student */
211
+ submittedContent?: string;
212
+ submittedAttachment?: RemoteFile;
213
+ /** grade from teacher */
214
+ gradeAttachment?: RemoteFile;
215
+ }
216
+ export type Homework = IHomework & IHomeworkDetail;
217
+ export declare enum HomeworkCompletionType {
218
+ INDIVIDUAL = 1,
219
+ GROUP = 2
220
+ }
221
+ export declare enum HomeworkSubmissionType {
222
+ WEB_LEARNING = 2,
223
+ OFFLINE = 0
224
+ }
225
+ export interface IExcellentHomework {
226
+ id: string;
227
+ baseId: string;
228
+ title: string;
229
+ url: string;
230
+ completionType: HomeworkCompletionType;
231
+ author: {
232
+ id: string;
233
+ name: string;
234
+ anonymous: boolean;
235
+ };
236
+ }
237
+ export type ExcellentHomework = IExcellentHomework & IHomeworkDetail;
238
+ export interface IHomeworkTA {
239
+ id: string;
240
+ index: number;
241
+ title: string;
242
+ description: string;
243
+ publisherId: string;
244
+ publishTime: string;
245
+ startTime: string;
246
+ deadline: string;
247
+ lateSubmissionDeadline?: string;
248
+ url: string;
249
+ completionType: HomeworkCompletionType;
250
+ submissionType: HomeworkSubmissionType;
251
+ gradedCount: number;
252
+ submittedCount: number;
253
+ unsubmittedCount: number;
254
+ }
255
+ export type HomeworkTA = IHomeworkTA;
256
+ export interface IHomeworkSubmitAttachment {
257
+ filename: string;
258
+ content: Blob;
259
+ }
260
+ export interface IDiscussionBase {
261
+ id: string;
262
+ title: string;
263
+ publisherName: string;
264
+ publishTime: string;
265
+ lastReplierName: string;
266
+ lastReplyTime: string;
267
+ visitCount: number;
268
+ replyCount: number;
269
+ isFavorite: boolean;
270
+ comment?: string;
271
+ }
272
+ interface IDiscussion extends IDiscussionBase {
273
+ url: string;
274
+ boardId: string;
275
+ }
276
+ export type Discussion = IDiscussion;
277
+ interface IQuestion extends IDiscussionBase {
278
+ url: string;
279
+ question: string;
280
+ }
281
+ export type Question = IQuestion;
282
+ export declare enum QuestionnaireDetailType {
283
+ SINGLE = "dnx",
284
+ MULTI = "dox",
285
+ TEXT = "wd"
286
+ }
287
+ export interface QuestionnaireDetail {
288
+ id: string;
289
+ index: number;
290
+ type: QuestionnaireDetailType;
291
+ required: boolean;
292
+ title: string;
293
+ score?: number;
294
+ options?: {
295
+ id: string;
296
+ index: number;
297
+ title: string;
298
+ }[];
299
+ }
300
+ export declare enum QuestionnaireType {
301
+ VOTE = "tp",
302
+ FORM = "tb",
303
+ SURVEY = "wj"
304
+ }
305
+ export interface IQuestionnaire {
306
+ id: string;
307
+ type: QuestionnaireType;
308
+ title: string;
309
+ startTime: string;
310
+ endTime: string;
311
+ uploadTime: string;
312
+ uploaderId: string;
313
+ uploaderName: string;
314
+ submitTime?: string;
315
+ isFavorite: boolean;
316
+ comment?: string;
317
+ url: string;
318
+ detail: QuestionnaireDetail[];
319
+ }
320
+ export type Questionnaire = IQuestionnaire;
321
+ export type ContentTypeMap = {
322
+ [ContentType.NOTIFICATION]: Notification;
323
+ [ContentType.FILE]: File;
324
+ [ContentType.HOMEWORK]: Homework;
325
+ [ContentType.DISCUSSION]: Discussion;
326
+ [ContentType.QUESTION]: Question;
327
+ [ContentType.QUESTIONNAIRE]: Questionnaire;
328
+ };
329
+ interface ICourseContent<T extends ContentType> {
330
+ [id: string]: ContentTypeMap[T][];
331
+ }
332
+ export type CourseContent<T extends ContentType = ContentType> = ICourseContent<T>;
333
+ interface IFavoriteItem {
334
+ id: string;
335
+ type: ContentType;
336
+ title: string;
337
+ time: string;
338
+ state: string;
339
+ /** extra message. For homework, this will be deadline (plus score if graded). It's too flexible and hard to parse so we leave it as is. */
340
+ extra?: string;
341
+ semesterId: string;
342
+ courseId: string;
343
+ pinned: boolean;
344
+ pinnedTime?: string;
345
+ comment?: string;
346
+ addedTime: string;
347
+ /** for reference */
348
+ itemId: string;
349
+ }
350
+ export type FavoriteItem = IFavoriteItem;
351
+ interface ICommentItem {
352
+ id: string;
353
+ type: ContentType;
354
+ content: string;
355
+ contentHTML: string;
356
+ title: string;
357
+ semesterId: string;
358
+ courseId: string;
359
+ commentTime: string;
360
+ /** for reference */
361
+ itemId: string;
362
+ }
363
+ export type CommentItem = ICommentItem;
364
+ export interface CalendarEvent {
365
+ location: string;
366
+ status: string;
367
+ startTime: string;
368
+ endTime: string;
369
+ date: string;
370
+ courseName: string;
371
+ }
372
+ export interface CalendarOptions {
373
+ /** use the graduate calendar instead of the undergraduate one */
374
+ graduate?: boolean;
375
+ }
376
+ /** an inclusive date range, in yyyymmdd format */
377
+ export interface CalendarRange {
378
+ startDate: string;
379
+ endDate: string;
380
+ }
381
+ export interface CalendarResult {
382
+ /** events of every window that succeeded, in date order */
383
+ events: CalendarEvent[];
384
+ /** windows that failed even after a retry; empty when the whole range was fetched */
385
+ failedRanges: CalendarRange[];
386
+ }
387
+ export declare enum Language {
388
+ ZH = "zh",
389
+ EN = "en"
390
+ }
391
+ export {};
392
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}