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 +49 -72
- package/dist/lib/oj/atcoder.js +31 -28
- package/dist/lib/oj/atcoder.js.map +1 -1
- package/dist/lib/oj/codeforces.js +20 -18
- package/dist/lib/oj/codeforces.js.map +1 -1
- package/dist/lib/oj/index.d.ts +1 -1
- package/dist/lib/oj/leetcode.js +19 -17
- package/dist/lib/oj/leetcode.js.map +1 -1
- package/dist/lib/oj/luogu.js +15 -13
- package/dist/lib/oj/luogu.js.map +1 -1
- package/dist/lib/oj/nowcoder.js +17 -15
- package/dist/lib/oj/nowcoder.js.map +1 -1
- package/dist/server.d.ts +1 -0
- package/dist/server.js +107 -0
- package/dist/server.js.map +1 -0
- package/package.json +9 -4
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,
|
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
|
-
|
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 #
|
82
|
+
Contest name: Codeforces Round #794 (Div. 1)
|
83
83
|
Rule: Codeforces
|
84
|
-
Start time: 5/
|
85
|
-
End time: 5/
|
86
|
-
https://codeforces.com/contests/
|
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 #
|
89
|
+
Contest name: Codeforces Round #794 (Div. 2)
|
90
90
|
Rule: Codeforces
|
91
|
-
Start time: 5/
|
92
|
-
End time: 5/
|
93
|
-
https://codeforces.com/contests/
|
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
|
111
|
+
There are 3 contests on Codeforces,AtCoder in the next 7 days
|
105
112
|
|
106
113
|
OJ: Codeforces
|
107
|
-
Contest name: Codeforces Round #
|
114
|
+
Contest name: Codeforces Round #794 (Div. 1)
|
108
115
|
Rule: Codeforces
|
109
|
-
Start time: 5/
|
110
|
-
End time: 5/
|
111
|
-
https://codeforces.com/contests/
|
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 #
|
121
|
+
Contest name: Codeforces Round #794 (Div. 2)
|
115
122
|
Rule: Codeforces
|
116
|
-
Start time: 5/
|
117
|
-
End time: 5/
|
118
|
-
https://codeforces.com/contests/
|
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:
|
128
|
+
Contest name: Ⓗ AtCoder Heuristic Contest 011
|
122
129
|
Rule: AtCoder
|
123
|
-
Start time: 5/
|
124
|
-
End time: 5/
|
125
|
-
https://atcoder.jp/contests/
|
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": "
|
146
|
+
"name": "Ⓗ AtCoder Heuristic Contest 011",
|
154
147
|
"rule": "AtCoder",
|
155
|
-
"startTime": "2022-05-
|
156
|
-
"endTime": "2022-
|
157
|
-
"url": "https://atcoder.jp/contests/
|
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 #
|
154
|
+
"name": "Codeforces Round #794 (Div. 1)",
|
178
155
|
"rule": "Codeforces",
|
179
|
-
"startTime": "2022-05-
|
180
|
-
"endTime": "2022-05-
|
181
|
-
"url": "https://codeforces.com/contests/
|
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 #
|
162
|
+
"name": "Codeforces Round #794 (Div. 2)",
|
186
163
|
"rule": "Codeforces",
|
187
|
-
"startTime": "2022-05-
|
188
|
-
"endTime": "2022-05-
|
189
|
-
"url": "https://codeforces.com/contests/
|
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
|
}
|
package/dist/lib/oj/atcoder.js
CHANGED
@@ -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
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
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
|
73
|
+
return contests;
|
70
74
|
});
|
71
|
-
|
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;
|
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
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
return {
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
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;
|
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"}
|
package/dist/lib/oj/index.d.ts
CHANGED
package/dist/lib/oj/leetcode.js
CHANGED
@@ -43,24 +43,26 @@ const headers = {
|
|
43
43
|
};
|
44
44
|
exports.lc = {
|
45
45
|
name: "LeetCode",
|
46
|
-
get
|
46
|
+
get() {
|
47
47
|
var _a;
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
.
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
return {
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
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;
|
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"}
|
package/dist/lib/oj/luogu.js
CHANGED
@@ -27,18 +27,20 @@ const headers = {
|
|
27
27
|
};
|
28
28
|
exports.lg = {
|
29
29
|
name: "Luogu",
|
30
|
-
get
|
31
|
-
|
32
|
-
|
33
|
-
return {
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
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
|
package/dist/lib/oj/luogu.js.map
CHANGED
@@ -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;
|
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"}
|
package/dist/lib/oj/nowcoder.js
CHANGED
@@ -62,21 +62,23 @@ const ruleRecord = {
|
|
62
62
|
};
|
63
63
|
exports.nc = {
|
64
64
|
name: "NowCoder",
|
65
|
-
get
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
return {
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
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;
|
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"}
|
package/dist/server.d.ts
ADDED
@@ -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.
|
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": "
|
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"
|