lscontests 1.11.1 → 1.12.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of lscontests might be problematic. Click here for more details.

package/README.md CHANGED
@@ -54,7 +54,7 @@ Options:
54
54
  It performs as follows:
55
55
 
56
56
  <!-- block_cli begin -->
57
- (*The following content was automatically generated using [semantic-release](https://github.com/semantic-release/semantic-release) on Tue, 17 May 2022 04:55:42 GMT*)
57
+ (*The following content was automatically generated using [semantic-release](https://github.com/semantic-release/semantic-release) on Tue, 24 May 2022 12:17:18 GMT*)
58
58
 
59
59
  <details>
60
60
  <summary> <code>> lsct -L en</code> </summary>
@@ -62,13 +62,6 @@ It performs as follows:
62
62
  ```text
63
63
  There are 2 contests is running on NowCoder
64
64
 
65
- OJ: NowCoder
66
- Contest name: 牛客竞赛博弈专题班 Sprague-Grundy 函数(SG 函数、图游戏、Nim 和)
67
- Rule: ICPC
68
- Start time: 5/13/2022, 04:00:00
69
- End time: 5/21/2022, 13:00:00
70
- https://ac.nowcoder.com/acm/contest/34655
71
-
72
65
  OJ: NowCoder
73
66
  Contest name: 2022 图论班第一章图匹配例题与习题
74
67
  Rule: ICPC
@@ -76,21 +69,35 @@ Start time: 5/13/2022, 06:00:00
76
69
  End time: 5/30/2022, 08:00:00
77
70
  https://ac.nowcoder.com/acm/contest/34649
78
71
 
79
- There are 2 contests on Codeforces in the next 3 days
72
+ OJ: NowCoder
73
+ Contest name: 牛客竞赛字符串专题班 SA(后缀数组 nlogn 构造和应用)习题
74
+ Rule: ICPC
75
+ Start time: 5/17/2022, 09:00:00
76
+ End time: 5/24/2022, 14:00:00
77
+ https://ac.nowcoder.com/acm/contest/34974
78
+
79
+ There are 3 contests on Codeforces,NowCoder in the next 3 days
80
80
 
81
81
  OJ: Codeforces
82
- Contest name: Codeforces Round #792 (Div. 1)
82
+ Contest name: Codeforces Round #794 (Div. 1)
83
83
  Rule: Codeforces
84
- Start time: 5/19/2022, 14:35:00
85
- End time: 5/19/2022, 16:35:00
86
- https://codeforces.com/contests/1683
84
+ Start time: 5/25/2022, 17:35:00
85
+ End time: 5/25/2022, 19:50:00
86
+ https://codeforces.com/contests/1685
87
87
 
88
88
  OJ: Codeforces
89
- Contest name: Codeforces Round #792 (Div. 2)
89
+ Contest name: Codeforces Round #794 (Div. 2)
90
90
  Rule: Codeforces
91
- Start time: 5/19/2022, 14:35:00
92
- End time: 5/19/2022, 16:35:00
93
- https://codeforces.com/contests/1684
91
+ Start time: 5/25/2022, 17:35:00
92
+ End time: 5/25/2022, 19:50:00
93
+ https://codeforces.com/contests/1686
94
+
95
+ OJ: NowCoder
96
+ Contest name: 牛客练习赛 99
97
+ Rule: ICPC
98
+ Start time: 5/27/2022, 11:00:00
99
+ End time: 5/27/2022, 13:30:00
100
+ https://ac.nowcoder.com/acm/contest/34330
94
101
  ```
95
102
 
96
103
  </details>
@@ -101,42 +108,28 @@ https://codeforces.com/contests/1684
101
108
  ```text
102
109
  No running contests
103
110
 
104
- There are 5 contests on Codeforces,AtCoder in the next 7 days
111
+ There are 3 contests on Codeforces,AtCoder in the next 7 days
105
112
 
106
113
  OJ: Codeforces
107
- Contest name: Codeforces Round #792 (Div. 1)
114
+ Contest name: Codeforces Round #794 (Div. 1)
108
115
  Rule: Codeforces
109
- Start time: 5/19/2022, 14:35:00
110
- End time: 5/19/2022, 16:35:00
111
- https://codeforces.com/contests/1683
116
+ Start time: 5/25/2022, 17:35:00
117
+ End time: 5/25/2022, 19:50:00
118
+ https://codeforces.com/contests/1685
112
119
 
113
120
  OJ: Codeforces
114
- Contest name: Codeforces Round #792 (Div. 2)
121
+ Contest name: Codeforces Round #794 (Div. 2)
115
122
  Rule: Codeforces
116
- Start time: 5/19/2022, 14:35:00
117
- End time: 5/19/2022, 16:35:00
118
- https://codeforces.com/contests/1684
123
+ Start time: 5/25/2022, 17:35:00
124
+ End time: 5/25/2022, 19:50:00
125
+ https://codeforces.com/contests/1686
119
126
 
120
127
  OJ: AtCoder
121
- Contest name: AtCoder Beginner Contest 252
128
+ Contest name: AtCoder Heuristic Contest 011
122
129
  Rule: AtCoder
123
- Start time: 5/21/2022, 12:00:00
124
- End time: 5/21/2022, 13:40:00
125
- https://atcoder.jp/contests/abc252
126
-
127
- OJ: Codeforces
128
- Contest name: Codeforces Round #793 (Div. 2)
129
- Rule: Codeforces
130
- Start time: 5/22/2022, 14:35:00
131
- End time: 5/22/2022, 16:35:00
132
- https://codeforces.com/contests/1682
133
-
134
- OJ: Codeforces
135
- Contest name: Educational Codeforces Round 129 (Rated for Div. 2)
136
- Rule: ICPC
137
- Start time: 5/23/2022, 14:35:00
138
- End time: 5/23/2022, 16:35:00
139
- https://codeforces.com/contests/1681
130
+ Start time: 5/28/2022, 03:00:00
131
+ End time: 6/5/2022, 10:00:00
132
+ https://atcoder.jp/contests/ahc011
140
133
  ```
141
134
 
142
135
  </details>
@@ -150,43 +143,27 @@ https://codeforces.com/contests/1681
150
143
  "upcoming": [
151
144
  {
152
145
  "ojName": "AtCoder",
153
- "name": " AtCoder Beginner Contest 252",
146
+ "name": " AtCoder Heuristic Contest 011",
154
147
  "rule": "AtCoder",
155
- "startTime": "2022-05-21T12:00:00.000Z",
156
- "endTime": "2022-05-21T13:40:00.000Z",
157
- "url": "https://atcoder.jp/contests/abc252"
158
- },
159
- {
160
- "ojName": "Codeforces",
161
- "name": "Educational Codeforces Round 129 (Rated for Div. 2)",
162
- "rule": "ICPC",
163
- "startTime": "2022-05-23T14:35:00.000Z",
164
- "endTime": "2022-05-23T16:35:00.000Z",
165
- "url": "https://codeforces.com/contests/1681"
166
- },
167
- {
168
- "ojName": "Codeforces",
169
- "name": "Codeforces Round #793 (Div. 2)",
170
- "rule": "Codeforces",
171
- "startTime": "2022-05-22T14:35:00.000Z",
172
- "endTime": "2022-05-22T16:35:00.000Z",
173
- "url": "https://codeforces.com/contests/1682"
148
+ "startTime": "2022-05-28T03:00:00.000Z",
149
+ "endTime": "2022-06-05T10:00:00.000Z",
150
+ "url": "https://atcoder.jp/contests/ahc011"
174
151
  },
175
152
  {
176
153
  "ojName": "Codeforces",
177
- "name": "Codeforces Round #792 (Div. 1)",
154
+ "name": "Codeforces Round #794 (Div. 1)",
178
155
  "rule": "Codeforces",
179
- "startTime": "2022-05-19T14:35:00.000Z",
180
- "endTime": "2022-05-19T16:35:00.000Z",
181
- "url": "https://codeforces.com/contests/1683"
156
+ "startTime": "2022-05-25T17:35:00.000Z",
157
+ "endTime": "2022-05-25T19:50:00.000Z",
158
+ "url": "https://codeforces.com/contests/1685"
182
159
  },
183
160
  {
184
161
  "ojName": "Codeforces",
185
- "name": "Codeforces Round #792 (Div. 2)",
162
+ "name": "Codeforces Round #794 (Div. 2)",
186
163
  "rule": "Codeforces",
187
- "startTime": "2022-05-19T14:35:00.000Z",
188
- "endTime": "2022-05-19T16:35:00.000Z",
189
- "url": "https://codeforces.com/contests/1684"
164
+ "startTime": "2022-05-25T17:35:00.000Z",
165
+ "endTime": "2022-05-25T19:50:00.000Z",
166
+ "url": "https://codeforces.com/contests/1686"
190
167
  }
191
168
  ]
192
169
  }
@@ -40,35 +40,38 @@ const axios_1 = __importDefault(require("axios"));
40
40
  const cheerio = __importStar(require("cheerio"));
41
41
  exports.at = {
42
42
  name: "AtCoder",
43
- get: () => __awaiter(void 0, void 0, void 0, function* () {
44
- const response = yield axios_1.default.get("https://atcoder.jp/contests");
45
- const $ = cheerio.load(response.data);
46
- const contests = [];
47
- $("#contest-table-upcoming,#contest-table-action table > tbody > tr").each(function () {
48
- const ct = {
49
- ojName: exports.at.name,
50
- name: "",
51
- rule: "AtCoder",
52
- startTime: new Date(0),
53
- endTime: new Date(0),
54
- url: ""
55
- };
56
- $("td", this).each(function (idx) {
57
- if (idx == 0)
58
- ct.startTime = new Date($(this).text());
59
- else if (idx == 1) {
60
- const ele = $("a", this);
61
- ct.name = `${$("span:first", this).text()} ${ele.text()}`;
62
- ct.url = `https://atcoder.jp${ele.attr().href}`;
63
- }
64
- else if (idx == 2) {
65
- const [h, m] = $(this).text().split(":");
66
- ct.endTime = new Date(ct.startTime.getTime() + (parseInt(h) * 60 + parseInt(m)) * 60 * 1000);
67
- }
43
+ get() {
44
+ return __awaiter(this, void 0, void 0, function* () {
45
+ const response = yield axios_1.default.get("https://atcoder.jp/contests");
46
+ const $ = cheerio.load(response.data);
47
+ const contests = [];
48
+ $("#contest-table-upcoming,#contest-table-action table > tbody > tr").each(function () {
49
+ const ct = {
50
+ ojName: exports.at.name,
51
+ name: "",
52
+ rule: "AtCoder",
53
+ startTime: new Date(0),
54
+ endTime: new Date(0),
55
+ url: ""
56
+ };
57
+ $("td", this).each(function (idx) {
58
+ var _a;
59
+ if (idx == 0)
60
+ ct.startTime = new Date($(this).text());
61
+ else if (idx == 1) {
62
+ const ele = $("a", this);
63
+ ct.name = `${$("span:first", this).text()} ${ele.text()}`;
64
+ ct.url = `https://atcoder.jp${(_a = ele.attr()) === null || _a === void 0 ? void 0 : _a.href}`;
65
+ }
66
+ else if (idx == 2) {
67
+ const [h, m] = $(this).text().split(":");
68
+ ct.endTime = new Date(ct.startTime.getTime() + (parseInt(h) * 60 + parseInt(m)) * 60 * 1000);
69
+ }
70
+ });
71
+ contests.push(ct);
68
72
  });
69
- contests.push(ct);
73
+ return contests;
70
74
  });
71
- return contests;
72
- })
75
+ }
73
76
  };
74
77
  //# sourceMappingURL=atcoder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"atcoder.js","sourceRoot":"","sources":["../../../src/lib/oj/atcoder.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA0B;AAC1B,iDAAmC;AAItB,QAAA,EAAE,GAAO;IAClB,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,GAAS,EAAE;QAEZ,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAChE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAc,EAAE,CAAC;QAC/B,CAAC,CAAC,kEAAkE,CAAC,CAAC,IAAI,CAAC;YAEvE,MAAM,EAAE,GAAY;gBAChB,MAAM,EAAE,UAAE,CAAC,IAAI;gBACf,IAAI,EAAE,EAAE;gBACR,IAAI,EAAE,SAAS;gBACf,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC;gBACtB,OAAO,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC;gBACpB,GAAG,EAAE,EAAE;aACV,CAAC;YACF,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG;gBAE5B,IAAG,GAAG,IAAI,CAAC;oBAAE,EAAE,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;qBAChD,IAAG,GAAG,IAAI,CAAC,EAChB;oBACI,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;oBACzB,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC1D,EAAE,CAAC,GAAG,GAAG,qBAAqB,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;iBACnD;qBACI,IAAG,GAAG,IAAI,CAAC,EAChB;oBACI,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBACzC,EAAE,CAAC,OAAO,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;iBAChG;YACL,CAAC,CAAC,CAAC;YACH,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IACpB,CAAC,CAAA;CACJ,CAAC"}
1
+ {"version":3,"file":"atcoder.js","sourceRoot":"","sources":["../../../src/lib/oj/atcoder.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA0B;AAC1B,iDAAmC;AAItB,QAAA,EAAE,GAAO;IAClB,IAAI,EAAE,SAAS;IACT,GAAG;;YAEL,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAChE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,QAAQ,GAAc,EAAE,CAAC;YAC/B,CAAC,CAAC,kEAAkE,CAAC,CAAC,IAAI,CAAC;gBAEvE,MAAM,EAAE,GAAY;oBAChB,MAAM,EAAE,UAAE,CAAC,IAAI;oBACf,IAAI,EAAE,EAAE;oBACR,IAAI,EAAE,SAAS;oBACf,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC;oBACtB,OAAO,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC;oBACpB,GAAG,EAAE,EAAE;iBACV,CAAC;gBACF,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG;;oBAE5B,IAAG,GAAG,IAAI,CAAC;wBAAE,EAAE,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;yBAChD,IAAG,GAAG,IAAI,CAAC,EAChB;wBACI,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;wBACzB,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;wBAC1D,EAAE,CAAC,GAAG,GAAG,qBAAqB,MAAA,GAAG,CAAC,IAAI,EAAE,0CAAE,IAAI,EAAE,CAAC;qBACpD;yBACI,IAAG,GAAG,IAAI,CAAC,EAChB;wBACI,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;wBACzC,EAAE,CAAC,OAAO,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;qBAChG;gBACL,CAAC,CAAC,CAAC;gBACH,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACtB,CAAC,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC;QACpB,CAAC;KAAA;CACJ,CAAC"}
@@ -44,23 +44,25 @@ const ruleRecord = {
44
44
  };
45
45
  exports.cf = {
46
46
  name: "Codeforces",
47
- get: () => __awaiter(void 0, void 0, void 0, function* () {
48
- const response = yield axios_1.default.get("https://codeforces.com/api/contest.list");
49
- if (!(response.data instanceof Object)) {
50
- const $ = cheerio.load(response.data);
51
- throw new Error($.text());
52
- }
53
- const resList = response.data.result;
54
- return resList.map((res) => {
55
- return {
56
- ojName: exports.cf.name,
57
- name: res.name,
58
- rule: ruleRecord[res.type],
59
- startTime: new Date(res.startTimeSeconds * 1000),
60
- endTime: new Date((res.startTimeSeconds + res.durationSeconds) * 1000),
61
- url: `https://codeforces.com/contests/${res.id}`
62
- };
63
- }).filter(contest => contest.endTime >= new Date());
64
- })
47
+ get() {
48
+ return __awaiter(this, void 0, void 0, function* () {
49
+ const response = yield axios_1.default.get("https://codeforces.com/api/contest.list");
50
+ if (!(response.data instanceof Object)) {
51
+ const $ = cheerio.load(response.data);
52
+ throw new Error($.text());
53
+ }
54
+ const resList = response.data.result;
55
+ return resList.map((res) => {
56
+ return {
57
+ ojName: exports.cf.name,
58
+ name: res.name,
59
+ rule: ruleRecord[res.type],
60
+ startTime: new Date(res.startTimeSeconds * 1000),
61
+ endTime: new Date((res.startTimeSeconds + res.durationSeconds) * 1000),
62
+ url: `https://codeforces.com/contests/${res.id}`
63
+ };
64
+ }).filter(contest => contest.endTime >= new Date());
65
+ });
66
+ }
65
67
  };
66
68
  //# sourceMappingURL=codeforces.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"codeforces.js","sourceRoot":"","sources":["../../../src/lib/oj/codeforces.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA0B;AAC1B,iDAAmC;AAenC,MAAM,UAAU,GAAyB;IACrC,EAAE,EAAE,YAAY;IAChB,IAAI,EAAE,MAAM;CACf,CAAC;AAEW,QAAA,EAAE,GAAO;IAClB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,GAAS,EAAE;QAEZ,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QAC5E,IAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,YAAY,MAAM,CAAC,EACrC;YACI,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;SAC7B;QACD,MAAM,OAAO,GAAa,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;QAC/C,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAW,EAAE;YAEhC,OAAO;gBACH,MAAM,EAAE,UAAE,CAAC,IAAI;gBACf,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;gBAC1B,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,gBAAgB,GAAG,IAAI,CAAC;gBAChD,OAAO,EAAE,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,gBAAgB,GAAG,GAAG,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC;gBACtE,GAAG,EAAE,mCAAmC,GAAG,CAAC,EAAE,EAAE;aACnD,CAAC;QACN,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC,CAAA;CACJ,CAAC"}
1
+ {"version":3,"file":"codeforces.js","sourceRoot":"","sources":["../../../src/lib/oj/codeforces.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA0B;AAC1B,iDAAmC;AAenC,MAAM,UAAU,GAAyB;IACrC,EAAE,EAAE,YAAY;IAChB,IAAI,EAAE,MAAM;CACf,CAAC;AAEW,QAAA,EAAE,GAAO;IAClB,IAAI,EAAE,YAAY;IACZ,GAAG;;YAEL,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;YAC5E,IAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,YAAY,MAAM,CAAC,EACrC;gBACI,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACtC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;aAC7B;YACD,MAAM,OAAO,GAAa,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;YAC/C,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAW,EAAE;gBAEhC,OAAO;oBACH,MAAM,EAAE,UAAE,CAAC,IAAI;oBACf,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;oBAC1B,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,gBAAgB,GAAG,IAAI,CAAC;oBAChD,OAAO,EAAE,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,gBAAgB,GAAG,GAAG,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC;oBACtE,GAAG,EAAE,mCAAmC,GAAG,CAAC,EAAE,EAAE;iBACnD,CAAC;YACN,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;KAAA;CACJ,CAAC"}
@@ -6,7 +6,7 @@ import { contest } from "../contest";
6
6
  */
7
7
  export declare type oj = {
8
8
  name: string;
9
- get: () => Promise<contest[]>;
9
+ get(): Promise<contest[]>;
10
10
  };
11
11
  export declare const alloj: {
12
12
  [abbr: string]: oj;
@@ -43,24 +43,26 @@ const headers = {
43
43
  };
44
44
  exports.lc = {
45
45
  name: "LeetCode",
46
- get: () => __awaiter(void 0, void 0, void 0, function* () {
46
+ get() {
47
47
  var _a;
48
- const response = yield axios_1.default.get("https://leetcode.com/contest", { headers });
49
- const $ = cheerio.load(response.data);
50
- const resList = JSON.parse((_a = $("#__NEXT_DATA__").html()) !== null && _a !== void 0 ? _a : "")
51
- .props.pageProps.dehydratedState.queries
52
- .find((v) => v.queryKey[0] == "topTwoContests")
53
- .state.data.topTwoContests;
54
- return resList.map((res) => {
55
- return {
56
- ojName: exports.lc.name,
57
- name: res.title,
58
- rule: "AtCoder",
59
- startTime: new Date(res.startTime * 1000),
60
- endTime: new Date((res.startTime + res.duration) * 1000),
61
- url: `https://leetcode.com/contest/${res.titleSlug}`
62
- };
48
+ return __awaiter(this, void 0, void 0, function* () {
49
+ const response = yield axios_1.default.get("https://leetcode.com/contest", { headers });
50
+ const $ = cheerio.load(response.data);
51
+ const resList = JSON.parse((_a = $("#__NEXT_DATA__").html()) !== null && _a !== void 0 ? _a : "")
52
+ .props.pageProps.dehydratedState.queries
53
+ .find((v) => v.queryKey[0] == "topTwoContests")
54
+ .state.data.topTwoContests;
55
+ return resList.map((res) => {
56
+ return {
57
+ ojName: exports.lc.name,
58
+ name: res.title,
59
+ rule: "AtCoder",
60
+ startTime: new Date(res.startTime * 1000),
61
+ endTime: new Date((res.startTime + res.duration) * 1000),
62
+ url: `https://leetcode.com/contest/${res.titleSlug}`
63
+ };
64
+ });
63
65
  });
64
- })
66
+ }
65
67
  };
66
68
  //# sourceMappingURL=leetcode.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"leetcode.js","sourceRoot":"","sources":["../../../src/lib/oj/leetcode.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA0B;AAC1B,iDAAmC;AAYnC,MAAM,OAAO,GAAG;IACZ,YAAY,EAAE,qHAAqH;CACtI,CAAC;AAEW,QAAA,EAAE,GAAO;IAClB,IAAI,EAAE,UAAU;IAChB,GAAG,EAAE,GAAS,EAAE;;QAEZ,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,8BAA8B,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9E,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,OAAO,GAAa,IAAI,CAAC,KAAK,CAAC,MAAA,CAAC,CAAC,gBAAgB,CAAC,CAAC,IAAI,EAAE,mCAAI,EAAE,CAAC;aACjE,KAAK,CAAC,SAAS,CAAC,eAAe,CAAC,OAAO;aACvC,IAAI,CAAC,CAAC,CAA2B,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC;aACxE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC;QAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAW,EAAE;YAEhC,OAAO;gBACH,MAAM,EAAE,UAAE,CAAC,IAAI;gBACf,IAAI,EAAE,GAAG,CAAC,KAAK;gBACf,IAAI,EAAE,SAAS;gBACf,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;gBACzC,OAAO,EAAE,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;gBACxD,GAAG,EAAE,gCAAgC,GAAG,CAAC,SAAS,EAAE;aACvD,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC,CAAA;CACJ,CAAC"}
1
+ {"version":3,"file":"leetcode.js","sourceRoot":"","sources":["../../../src/lib/oj/leetcode.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA0B;AAC1B,iDAAmC;AAYnC,MAAM,OAAO,GAAG;IACZ,YAAY,EAAE,qHAAqH;CACtI,CAAC;AAEW,QAAA,EAAE,GAAO;IAClB,IAAI,EAAE,UAAU;IACV,GAAG;;;YAEL,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,8BAA8B,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAC9E,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,OAAO,GAAa,IAAI,CAAC,KAAK,CAAC,MAAA,CAAC,CAAC,gBAAgB,CAAC,CAAC,IAAI,EAAE,mCAAI,EAAE,CAAC;iBACjE,KAAK,CAAC,SAAS,CAAC,eAAe,CAAC,OAAO;iBACvC,IAAI,CAAC,CAAC,CAA2B,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC;iBACxE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC;YAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAW,EAAE;gBAEhC,OAAO;oBACH,MAAM,EAAE,UAAE,CAAC,IAAI;oBACf,IAAI,EAAE,GAAG,CAAC,KAAK;oBACf,IAAI,EAAE,SAAS;oBACf,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;oBACzC,OAAO,EAAE,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;oBACxD,GAAG,EAAE,gCAAgC,GAAG,CAAC,SAAS,EAAE;iBACvD,CAAC;YACN,CAAC,CAAC,CAAC;;KACN;CACJ,CAAC"}
@@ -27,18 +27,20 @@ const headers = {
27
27
  };
28
28
  exports.lg = {
29
29
  name: "Luogu",
30
- get: () => __awaiter(void 0, void 0, void 0, function* () {
31
- const resList = (yield axios_1.default.get("https://www.luogu.com.cn/contest/list", { headers })).data.currentData.contests.result;
32
- return resList.map((res) => {
33
- return {
34
- ojName: exports.lg.name,
35
- name: res.name,
36
- rule: ruleRecord[res.ruleType],
37
- startTime: new Date(res.startTime * 1000),
38
- endTime: new Date(res.endTime * 1000),
39
- url: `https://www.luogu.com.cn/contest/${res.id}`
40
- };
41
- }).filter(contest => contest.endTime >= new Date());
42
- })
30
+ get() {
31
+ return __awaiter(this, void 0, void 0, function* () {
32
+ const resList = (yield axios_1.default.get("https://www.luogu.com.cn/contest/list", { headers })).data.currentData.contests.result;
33
+ return resList.map((res) => {
34
+ return {
35
+ ojName: exports.lg.name,
36
+ name: res.name,
37
+ rule: ruleRecord[res.ruleType],
38
+ startTime: new Date(res.startTime * 1000),
39
+ endTime: new Date(res.endTime * 1000),
40
+ url: `https://www.luogu.com.cn/contest/${res.id}`
41
+ };
42
+ }).filter(contest => contest.endTime >= new Date());
43
+ });
44
+ }
43
45
  };
44
46
  //# sourceMappingURL=luogu.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"luogu.js","sourceRoot":"","sources":["../../../src/lib/oj/luogu.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,kDAA0B;AAiB1B,MAAM,UAAU,GAAyB;IACrC,CAAC,EAAE,IAAI;IACP,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,OAAO;IACV,CAAC,EAAE,KAAK;IACR,CAAC,EAAE,YAAY;CAClB,CAAC;AAEF,MAAM,OAAO,GAAG;IACZ,YAAY,EAAE,qHAAqH;IACnI,cAAc,EAAE,cAAc;CACjC,CAAC;AAEW,QAAA,EAAE,GAAO;IAClB,IAAI,EAAE,OAAO;IACb,GAAG,EAAE,GAAS,EAAE;QAEZ,MAAM,OAAO,GAAa,CAAC,MAAM,eAAK,CAAC,GAAG,CAAC,uCAAuC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC;QACnI,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAW,EAAE;YAEhC,OAAO;gBACH,MAAM,EAAE,UAAE,CAAC,IAAI;gBACf,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAC9B,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;gBACzC,OAAO,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;gBACrC,GAAG,EAAE,oCAAoC,GAAG,CAAC,EAAE,EAAE;aACpD,CAAC;QACN,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC,CAAA;CACJ,CAAC"}
1
+ {"version":3,"file":"luogu.js","sourceRoot":"","sources":["../../../src/lib/oj/luogu.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,kDAA0B;AAiB1B,MAAM,UAAU,GAAyB;IACrC,CAAC,EAAE,IAAI;IACP,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,OAAO;IACV,CAAC,EAAE,KAAK;IACR,CAAC,EAAE,YAAY;CAClB,CAAC;AAEF,MAAM,OAAO,GAAG;IACZ,YAAY,EAAE,qHAAqH;IACnI,cAAc,EAAE,cAAc;CACjC,CAAC;AAEW,QAAA,EAAE,GAAO;IAClB,IAAI,EAAE,OAAO;IACP,GAAG;;YAEL,MAAM,OAAO,GAAa,CAAC,MAAM,eAAK,CAAC,GAAG,CAAC,uCAAuC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC;YACnI,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAW,EAAE;gBAEhC,OAAO;oBACH,MAAM,EAAE,UAAE,CAAC,IAAI;oBACf,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;oBAC9B,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;oBACzC,OAAO,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;oBACrC,GAAG,EAAE,oCAAoC,GAAG,CAAC,EAAE,EAAE;iBACpD,CAAC;YACN,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;KAAA;CACJ,CAAC"}
@@ -62,21 +62,23 @@ const ruleRecord = {
62
62
  };
63
63
  exports.nc = {
64
64
  name: "NowCoder",
65
- get: () => __awaiter(void 0, void 0, void 0, function* () {
66
- const res = [
67
- ...yield getResultList(topCategoryFilter.NOWCODERSERIES),
68
- ...yield getResultList(topCategoryFilter.SCHOOLCONTEST)
69
- ];
70
- return res.filter(res => res.signUpEndCountDownTime > 0).map((res) => {
71
- return {
72
- ojName: exports.nc.name,
73
- name: res.contestName,
74
- rule: ruleRecord[res.type],
75
- startTime: new Date(res.contestStartTime),
76
- endTime: new Date(res.contestEndTime),
77
- url: `https://ac.nowcoder.com/acm/contest/${res.contestId}`
78
- };
65
+ get() {
66
+ return __awaiter(this, void 0, void 0, function* () {
67
+ const res = [
68
+ ...yield getResultList(topCategoryFilter.NOWCODERSERIES),
69
+ ...yield getResultList(topCategoryFilter.SCHOOLCONTEST)
70
+ ];
71
+ return res.filter(res => res.signUpEndCountDownTime > 0).map((res) => {
72
+ return {
73
+ ojName: exports.nc.name,
74
+ name: res.contestName,
75
+ rule: ruleRecord[res.type],
76
+ startTime: new Date(res.contestStartTime),
77
+ endTime: new Date(res.contestEndTime),
78
+ url: `https://ac.nowcoder.com/acm/contest/${res.contestId}`
79
+ };
80
+ });
79
81
  });
80
- })
82
+ }
81
83
  };
82
84
  //# sourceMappingURL=nowcoder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"nowcoder.js","sourceRoot":"","sources":["../../../src/lib/oj/nowcoder.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA0B;AAC1B,iDAAmC;AAgDnC,IAAK,iBAIJ;AAJD,WAAK,iBAAiB;IAElB,8EAAmB,CAAA;IACnB,4EAAa,CAAA;AACjB,CAAC,EAJI,iBAAiB,KAAjB,iBAAiB,QAIrB;AAED,MAAM,GAAG,GAAG,+CAA+C,CAAC;AAE5D,SAAe,aAAa,CAAC,GAAsB;;QAE/C,MAAM,IAAI,GAAG,CAAC,MAAM,eAAK,CAAC,GAAG,CAAC,GAAG,GAAG,sBAAsB,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACvE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,EAAE,GAAa,EAAE,CAAC;QACxB,CAAC,CAAC,qCAAqC,CAAC,CAAC,IAAI,CAAC;YAE1C,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,CAAC;IACd,CAAC;CAAA;AAED,MAAM,UAAU,GAAyB;IACrC,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,IAAI;IACP,CAAC,EAAE,KAAK;CACX,CAAC;AAEW,QAAA,EAAE,GAAO;IAClB,IAAI,EAAE,UAAU;IAChB,GAAG,EAAE,GAAS,EAAE;QAEZ,MAAM,GAAG,GAAa;YAClB,GAAG,MAAM,aAAa,CAAC,iBAAiB,CAAC,cAAc,CAAC;YACxD,GAAG,MAAM,aAAa,CAAC,iBAAiB,CAAC,aAAa,CAAC;SAC1D,CAAC;QACF,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,sBAAsB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAW,EAAE;YAE1E,OAAO;gBACH,MAAM,EAAE,UAAE,CAAC,IAAI;gBACf,IAAI,EAAE,GAAG,CAAC,WAAW;gBACrB,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;gBAC1B,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC;gBACzC,OAAO,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC;gBACrC,GAAG,EAAE,uCAAuC,GAAG,CAAC,SAAS,EAAE;aAC9D,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC,CAAA;CACJ,CAAC"}
1
+ {"version":3,"file":"nowcoder.js","sourceRoot":"","sources":["../../../src/lib/oj/nowcoder.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA0B;AAC1B,iDAAmC;AAgDnC,IAAK,iBAIJ;AAJD,WAAK,iBAAiB;IAElB,8EAAmB,CAAA;IACnB,4EAAa,CAAA;AACjB,CAAC,EAJI,iBAAiB,KAAjB,iBAAiB,QAIrB;AAED,MAAM,GAAG,GAAG,+CAA+C,CAAC;AAE5D,SAAe,aAAa,CAAC,GAAsB;;QAE/C,MAAM,IAAI,GAAG,CAAC,MAAM,eAAK,CAAC,GAAG,CAAC,GAAG,GAAG,sBAAsB,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACvE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,EAAE,GAAa,EAAE,CAAC;QACxB,CAAC,CAAC,qCAAqC,CAAC,CAAC,IAAI,CAAC;YAE1C,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,CAAC;IACd,CAAC;CAAA;AAED,MAAM,UAAU,GAAyB;IACrC,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,IAAI;IACP,CAAC,EAAE,KAAK;CACX,CAAC;AAEW,QAAA,EAAE,GAAO;IAClB,IAAI,EAAE,UAAU;IACV,GAAG;;YAEL,MAAM,GAAG,GAAa;gBAClB,GAAG,MAAM,aAAa,CAAC,iBAAiB,CAAC,cAAc,CAAC;gBACxD,GAAG,MAAM,aAAa,CAAC,iBAAiB,CAAC,aAAa,CAAC;aAC1D,CAAC;YACF,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,sBAAsB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAW,EAAE;gBAE1E,OAAO;oBACH,MAAM,EAAE,UAAE,CAAC,IAAI;oBACf,IAAI,EAAE,GAAG,CAAC,WAAW;oBACrB,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;oBAC1B,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC;oBACzC,OAAO,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC;oBACrC,GAAG,EAAE,uCAAuC,GAAG,CAAC,SAAS,EAAE;iBAC9D,CAAC;YACN,CAAC,CAAC,CAAC;QACP,CAAC;KAAA;CACJ,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
package/dist/server.js ADDED
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const express_1 = __importDefault(require("express"));
16
+ const index_1 = require("./index");
17
+ const oj_1 = require("./lib/oj");
18
+ const locale_1 = require("./locale");
19
+ const ics_1 = require("ics");
20
+ const pangu_1 = __importDefault(require("pangu"));
21
+ const crypto_1 = require("crypto");
22
+ const commander_1 = require("commander");
23
+ const package_json_1 = require("../package.json");
24
+ const lodash_1 = __importDefault(require("lodash"));
25
+ const app = (0, express_1.default)();
26
+ function assertType(obj) {
27
+ }
28
+ app.get("/", (req, res) => {
29
+ res.redirect("https://github.com/StableAgOH/lscontests");
30
+ });
31
+ app.get("/ics", (req, res) => __awaiter(void 0, void 0, void 0, function* () {
32
+ const { language, l, ojs, o } = req.query;
33
+ const lArg = language || l || "zh-CN";
34
+ let oArg = ojs || o;
35
+ if (lArg instanceof Array) {
36
+ res.status(400).send("Multiple languages not supported");
37
+ return;
38
+ }
39
+ if (typeof oArg === "string") {
40
+ if (oArg.includes(","))
41
+ oArg = oArg.split(",");
42
+ else
43
+ oArg = [oArg];
44
+ }
45
+ else if (!oArg)
46
+ oArg = Object.keys(oj_1.alloj);
47
+ assertType(oArg);
48
+ assertType(lArg);
49
+ const data = yield getIcs(lArg, oArg);
50
+ res.setHeader("Content-Type", "text/calendar");
51
+ res.send(data);
52
+ }));
53
+ const contestsCache = {
54
+ contests: [],
55
+ lastUpdate: 0
56
+ };
57
+ function getIcs(lang, ojs) {
58
+ return __awaiter(this, void 0, void 0, function* () {
59
+ if (contestsCache.lastUpdate < Date.now() - 1000 * 60 * 5) {
60
+ const c = yield (0, index_1.getContests)({
61
+ days: 365 * 10,
62
+ });
63
+ contestsCache.contests = lodash_1.default.uniqBy(contestsCache.contests.concat(c.running.concat(c.upcoming)), c => JSON.stringify(c));
64
+ contestsCache.lastUpdate = Date.now();
65
+ }
66
+ const contests = contestsCache.contests.filter(c => ojs.some(oj => c.ojName === oj_1.alloj[oj].name));
67
+ const langDict = yield (0, locale_1.getLangDict)(lang);
68
+ const events = contests.map((c) => {
69
+ const ls = [];
70
+ ls.push(`${langDict.ojName}: ${c.ojName}`);
71
+ ls.push(`${langDict.name}: ${c.name}`);
72
+ ls.push(`${langDict.rule}: ${c.rule}`);
73
+ ls.push(c.url);
74
+ const description = pangu_1.default.spacing(ls.join("\n"));
75
+ const ret = {
76
+ start: (0, ics_1.convertTimestampToArray)(c.startTime.getTime(), "local"),
77
+ end: (0, ics_1.convertTimestampToArray)(c.endTime.getTime(), "local"),
78
+ calName: "算法竞赛",
79
+ productId: "-//StableAgOH//LSCT//CN",
80
+ title: c.name,
81
+ url: c.url,
82
+ location: c.ojName,
83
+ categories: [c.rule],
84
+ uid: `${(0, crypto_1.randomUUID)()}@LSCT`,
85
+ description,
86
+ };
87
+ return ret;
88
+ });
89
+ const { value, error } = (0, ics_1.createEvents)(events);
90
+ if (error)
91
+ throw error;
92
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
93
+ return value;
94
+ });
95
+ }
96
+ const command = new commander_1.Command()
97
+ .name(Object.keys(package_json_1.bin)[1])
98
+ .version(package_json_1.version)
99
+ .option("-h, --host, <host>", "Host to listen on", "0.0.0.0")
100
+ .option("-p, --port, <port>", "Port to listen on", "8080");
101
+ command.parse();
102
+ const { host, port } = command.opts();
103
+ app.listen(port, host, () => {
104
+ const logURL = `http://${host === "0.0.0.0" ? "127.0.0.1" : host}:${port}/`;
105
+ console.log(`Listening on ${logURL}`);
106
+ });
107
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lscontests",
3
- "version": "1.11.1",
3
+ "version": "1.12.0",
4
4
  "description": "A tool to get information about the contests on each OJ",
5
5
  "keywords": [
6
6
  "cli",
@@ -18,7 +18,8 @@
18
18
  "license": "GPL-3.0",
19
19
  "main": "./dist/index.js",
20
20
  "bin": {
21
- "lsct": "./dist/cli.js"
21
+ "lsct": "./dist/cli.js",
22
+ "lsct-s": "./dist/server.js"
22
23
  },
23
24
  "files": [
24
25
  "dist"
@@ -28,15 +29,17 @@
28
29
  "clean": "rimraf ./dist",
29
30
  "docs": "typedoc",
30
31
  "lint": "eslint && markdownlint README.md",
31
- "prestart": "yarn build",
32
32
  "release": "mkdirp docs && yarn semantic-release",
33
- "start": "node ./dist/cli.js"
33
+ "start": "tsx src/cli.ts",
34
+ "start-s": "tsx src/server.ts"
34
35
  },
35
36
  "dependencies": {
36
37
  "axios": "^0.27.2",
37
38
  "axios-retry": "^3.2.5",
38
39
  "cheerio": "^1.0.0-rc.10",
39
40
  "commander": "^9.2.0",
41
+ "express": "^4.18.1",
42
+ "ics": "^2.35.0",
40
43
  "lodash": "^4.17.21",
41
44
  "pangu": "^4.0.7"
42
45
  },
@@ -45,6 +48,7 @@
45
48
  "@semantic-release/changelog": "^6.0.1",
46
49
  "@semantic-release/exec": "^6.0.3",
47
50
  "@semantic-release/git": "^10.0.1",
51
+ "@types/express": "^4.17.13",
48
52
  "@types/lodash": "^4.14.182",
49
53
  "@types/node": "^17.0.34",
50
54
  "@types/pangu": "^3.3.0",
@@ -56,6 +60,7 @@
56
60
  "mkdirp": "^1.0.4",
57
61
  "rimraf": "^3.0.2",
58
62
  "semantic-release": "^19.0.2",
63
+ "tsx": "*",
59
64
  "typedoc": "^0.22.15",
60
65
  "typedoc-plugin-extras": "^2.2.3",
61
66
  "typescript": "^4.6.4"