lscontests 2.6.3 → 2.7.1
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.
- package/README.md +180 -87
- package/dist/lib/contest.d.ts +1 -1
- package/dist/locale/index.d.ts +1 -1
- package/dist/locale/index.js +13 -26
- package/dist/locale/index.js.map +1 -1
- package/dist/server-cli.d.ts +2 -0
- package/dist/server-cli.js +25 -0
- package/dist/server-cli.js.map +1 -0
- package/dist/server.d.ts +2 -2
- package/dist/server.js +31 -23
- package/dist/server.js.map +1 -1
- package/package.json +30 -27
- package/{dist/server.html → public/index.html} +6 -14
- package/dist/locale/zh-NE.json +0 -13
package/README.md
CHANGED
|
@@ -44,8 +44,8 @@ Options:
|
|
|
44
44
|
-s, --silent do not print log
|
|
45
45
|
-o, --oj <ojs...> OJs to display (choices: "at", "cf", "lc", "lg", "nc")
|
|
46
46
|
-r, --raw print raw contest list
|
|
47
|
-
-L, --language <lang> set output language (choices: "en", "zh-CN", "zh-
|
|
48
|
-
|
|
47
|
+
-L, --language <lang> set output language (choices: "en", "zh-CN", "zh-TW",
|
|
48
|
+
default: "zh-CN")
|
|
49
49
|
--no-sort do not sort by contests start time, but by OJ order
|
|
50
50
|
--no-running do not list all running contests
|
|
51
51
|
--no-upcoming do not list all upcoming contests
|
|
@@ -56,43 +56,57 @@ Options:
|
|
|
56
56
|
It performs as follows:
|
|
57
57
|
|
|
58
58
|
<!-- block_cli begin -->
|
|
59
|
-
(*The following content was automatically generated using [semantic-release](https://github.com/semantic-release/semantic-release) on
|
|
59
|
+
(*The following content was automatically generated using [semantic-release](https://github.com/semantic-release/semantic-release) on Sun, 24 Sep 2023 07:10:27 GMT*)
|
|
60
60
|
|
|
61
61
|
<details>
|
|
62
62
|
<summary> <code>> lsct -L en</code> </summary>
|
|
63
63
|
|
|
64
64
|
```text
|
|
65
|
-
There are 2 contests is running on Luogu
|
|
65
|
+
There are 2 contests is running on Luogu,AtCoder
|
|
66
66
|
|
|
67
67
|
OJ: Luogu
|
|
68
|
-
Contest name:
|
|
69
|
-
Rule:
|
|
70
|
-
Start time:
|
|
71
|
-
End time:
|
|
72
|
-
https://www.luogu.com.cn/contest/
|
|
68
|
+
Contest name: [ICPC2021 Macao R] ICPC2021 区域赛澳门站重现赛
|
|
69
|
+
Rule: ICPC
|
|
70
|
+
Start time: 9/24/2023, 05:00:00
|
|
71
|
+
End time: 9/24/2023, 10:00:00
|
|
72
|
+
https://www.luogu.com.cn/contest/134300
|
|
73
73
|
|
|
74
|
-
OJ:
|
|
75
|
-
Contest name:
|
|
74
|
+
OJ: AtCoder
|
|
75
|
+
Contest name: Ⓗ Marubeni Programming Contest 2023 (AtCoder Heuristic Contest 024)
|
|
76
|
+
Rule: AtCoder
|
|
77
|
+
Start time: 9/24/2023, 06:00:00
|
|
78
|
+
End time: 9/24/2023, 10:00:00
|
|
79
|
+
https://atcoder.jp/contests/ahc024
|
|
80
|
+
|
|
81
|
+
There are 4 contests on NowCoder,Codeforces in the next 3 days
|
|
82
|
+
|
|
83
|
+
OJ: NowCoder
|
|
84
|
+
Contest name: 牛客周赛 Round 13
|
|
76
85
|
Rule: IOI
|
|
77
|
-
Start time:
|
|
78
|
-
End time:
|
|
79
|
-
https://
|
|
86
|
+
Start time: 9/24/2023, 11:00:00
|
|
87
|
+
End time: 9/24/2023, 12:30:00
|
|
88
|
+
https://ac.nowcoder.com/acm/contest/65507
|
|
80
89
|
|
|
81
|
-
|
|
90
|
+
OJ: Codeforces
|
|
91
|
+
Contest name: Educational Codeforces Round 155 (Rated for Div. 2)
|
|
92
|
+
Rule: ICPC
|
|
93
|
+
Start time: 9/24/2023, 14:35:00
|
|
94
|
+
End time: 9/24/2023, 16:35:00
|
|
95
|
+
https://codeforces.com/contests/1879
|
|
82
96
|
|
|
83
|
-
OJ:
|
|
84
|
-
Contest name:
|
|
85
|
-
Rule:
|
|
86
|
-
Start time:
|
|
87
|
-
End time:
|
|
88
|
-
https://
|
|
97
|
+
OJ: Codeforces
|
|
98
|
+
Contest name: Codeforces Round 899 (Div. 2)
|
|
99
|
+
Rule: Codeforces
|
|
100
|
+
Start time: 9/25/2023, 14:35:00
|
|
101
|
+
End time: 9/25/2023, 16:35:00
|
|
102
|
+
https://codeforces.com/contests/1882
|
|
89
103
|
|
|
90
|
-
OJ:
|
|
91
|
-
Contest name:
|
|
92
|
-
Rule:
|
|
93
|
-
Start time:
|
|
94
|
-
End time:
|
|
95
|
-
https://
|
|
104
|
+
OJ: Codeforces
|
|
105
|
+
Contest name: Codeforces Round 900 (Div. 3)
|
|
106
|
+
Rule: ICPC
|
|
107
|
+
Start time: 9/26/2023, 14:35:00
|
|
108
|
+
End time: 9/26/2023, 16:50:00
|
|
109
|
+
https://codeforces.com/contests/1878
|
|
96
110
|
```
|
|
97
111
|
|
|
98
112
|
</details>
|
|
@@ -101,30 +115,58 @@ https://atcoder.jp/contests/ahc015
|
|
|
101
115
|
<summary> <code>> lsct -o at cf -d 7 -L en</code> </summary>
|
|
102
116
|
|
|
103
117
|
```text
|
|
104
|
-
There are
|
|
105
|
-
|
|
106
|
-
There are 3 contests on AtCoder,Codeforces in the next 7 days
|
|
118
|
+
There are 1 contests is running on AtCoder
|
|
107
119
|
|
|
108
120
|
OJ: AtCoder
|
|
109
|
-
Contest name: Ⓗ
|
|
121
|
+
Contest name: Ⓗ Marubeni Programming Contest 2023 (AtCoder Heuristic Contest 024)
|
|
110
122
|
Rule: AtCoder
|
|
111
|
-
Start time:
|
|
112
|
-
End time:
|
|
113
|
-
https://atcoder.jp/contests/
|
|
123
|
+
Start time: 9/24/2023, 06:00:00
|
|
124
|
+
End time: 9/24/2023, 10:00:00
|
|
125
|
+
https://atcoder.jp/contests/ahc024
|
|
126
|
+
|
|
127
|
+
There are 6 contests on Codeforces,AtCoder in the next 7 days
|
|
114
128
|
|
|
115
129
|
OJ: Codeforces
|
|
116
|
-
Contest name: Codeforces Round (Div. 2)
|
|
130
|
+
Contest name: Educational Codeforces Round 155 (Rated for Div. 2)
|
|
131
|
+
Rule: ICPC
|
|
132
|
+
Start time: 9/24/2023, 14:35:00
|
|
133
|
+
End time: 9/24/2023, 16:35:00
|
|
134
|
+
https://codeforces.com/contests/1879
|
|
135
|
+
|
|
136
|
+
OJ: Codeforces
|
|
137
|
+
Contest name: Codeforces Round 899 (Div. 2)
|
|
117
138
|
Rule: Codeforces
|
|
118
|
-
Start time:
|
|
119
|
-
End time:
|
|
120
|
-
https://codeforces.com/contests/
|
|
139
|
+
Start time: 9/25/2023, 14:35:00
|
|
140
|
+
End time: 9/25/2023, 16:35:00
|
|
141
|
+
https://codeforces.com/contests/1882
|
|
142
|
+
|
|
143
|
+
OJ: Codeforces
|
|
144
|
+
Contest name: Codeforces Round 900 (Div. 3)
|
|
145
|
+
Rule: ICPC
|
|
146
|
+
Start time: 9/26/2023, 14:35:00
|
|
147
|
+
End time: 9/26/2023, 16:50:00
|
|
148
|
+
https://codeforces.com/contests/1878
|
|
121
149
|
|
|
122
150
|
OJ: AtCoder
|
|
123
|
-
Contest name: Ⓐ AtCoder Beginner Contest
|
|
151
|
+
Contest name: Ⓐ AtCoder Beginner Contest 322
|
|
124
152
|
Rule: AtCoder
|
|
125
|
-
Start time:
|
|
126
|
-
End time:
|
|
127
|
-
https://atcoder.jp/contests/
|
|
153
|
+
Start time: 9/30/2023, 12:00:00
|
|
154
|
+
End time: 9/30/2023, 13:40:00
|
|
155
|
+
https://atcoder.jp/contests/abc322
|
|
156
|
+
|
|
157
|
+
OJ: Codeforces
|
|
158
|
+
Contest name: Codeforces Round 901 (Div. 1)
|
|
159
|
+
Rule: Codeforces
|
|
160
|
+
Start time: 9/30/2023, 14:35:00
|
|
161
|
+
End time: 9/30/2023, 17:35:00
|
|
162
|
+
https://codeforces.com/contests/1874
|
|
163
|
+
|
|
164
|
+
OJ: Codeforces
|
|
165
|
+
Contest name: Codeforces Round 901 (Div. 2)
|
|
166
|
+
Rule: Codeforces
|
|
167
|
+
Start time: 9/30/2023, 14:35:00
|
|
168
|
+
End time: 9/30/2023, 17:35:00
|
|
169
|
+
https://codeforces.com/contests/1875
|
|
128
170
|
```
|
|
129
171
|
|
|
130
172
|
</details>
|
|
@@ -134,93 +176,144 @@ https://atcoder.jp/contests/abc276
|
|
|
134
176
|
|
|
135
177
|
```json
|
|
136
178
|
{
|
|
137
|
-
"running": [
|
|
179
|
+
"running": [
|
|
180
|
+
{
|
|
181
|
+
"ojName": "AtCoder",
|
|
182
|
+
"name": "Ⓗ Marubeni Programming Contest 2023 (AtCoder Heuristic Contest 024)",
|
|
183
|
+
"rule": "AtCoder",
|
|
184
|
+
"startTime": "2023-09-24T06:00:00.000Z",
|
|
185
|
+
"endTime": "2023-09-24T10:00:00.000Z",
|
|
186
|
+
"url": "https://atcoder.jp/contests/ahc024"
|
|
187
|
+
}
|
|
188
|
+
],
|
|
138
189
|
"upcoming": [
|
|
139
190
|
{
|
|
140
191
|
"ojName": "AtCoder",
|
|
141
|
-
"name": "
|
|
192
|
+
"name": "Ⓐ AtCoder Beginner Contest 322",
|
|
193
|
+
"rule": "AtCoder",
|
|
194
|
+
"startTime": "2023-09-30T12:00:00.000Z",
|
|
195
|
+
"endTime": "2023-09-30T13:40:00.000Z",
|
|
196
|
+
"url": "https://atcoder.jp/contests/abc322"
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
"ojName": "AtCoder",
|
|
200
|
+
"name": "Ⓐ UNIQUE VISION Programming Contest 2023 Autumn(AtCoder Beginner Contest 323)",
|
|
201
|
+
"rule": "AtCoder",
|
|
202
|
+
"startTime": "2023-10-07T12:00:00.000Z",
|
|
203
|
+
"endTime": "2023-10-07T13:40:00.000Z",
|
|
204
|
+
"url": "https://atcoder.jp/contests/abc323"
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
"ojName": "AtCoder",
|
|
208
|
+
"name": "Ⓐ AtCoder Regular Contest 166",
|
|
142
209
|
"rule": "AtCoder",
|
|
143
|
-
"startTime": "
|
|
144
|
-
"endTime": "
|
|
145
|
-
"url": "https://atcoder.jp/contests/
|
|
210
|
+
"startTime": "2023-10-08T12:00:00.000Z",
|
|
211
|
+
"endTime": "2023-10-08T14:00:00.000Z",
|
|
212
|
+
"url": "https://atcoder.jp/contests/arc166"
|
|
146
213
|
},
|
|
147
214
|
{
|
|
148
215
|
"ojName": "AtCoder",
|
|
149
|
-
"name": "
|
|
216
|
+
"name": "Ⓗ AtCoder Heuristic Contest 025",
|
|
150
217
|
"rule": "AtCoder",
|
|
151
|
-
"startTime": "
|
|
152
|
-
"endTime": "
|
|
153
|
-
"url": "https://atcoder.jp/contests/
|
|
218
|
+
"startTime": "2023-10-14T03:00:00.000Z",
|
|
219
|
+
"endTime": "2023-10-22T10:00:00.000Z",
|
|
220
|
+
"url": "https://atcoder.jp/contests/ahc025"
|
|
154
221
|
},
|
|
155
222
|
{
|
|
156
223
|
"ojName": "AtCoder",
|
|
157
|
-
"name": "
|
|
224
|
+
"name": "Ⓐ Japan Registry Services (JPRS) Programming Contest 2023 (AtCoder Beginner Contest 324)",
|
|
158
225
|
"rule": "AtCoder",
|
|
159
|
-
"startTime": "
|
|
160
|
-
"endTime": "
|
|
161
|
-
"url": "https://atcoder.jp/contests/
|
|
226
|
+
"startTime": "2023-10-14T12:00:00.000Z",
|
|
227
|
+
"endTime": "2023-10-14T13:40:00.000Z",
|
|
228
|
+
"url": "https://atcoder.jp/contests/abc324"
|
|
162
229
|
},
|
|
163
230
|
{
|
|
164
231
|
"ojName": "AtCoder",
|
|
165
|
-
"name": "Ⓐ
|
|
232
|
+
"name": "Ⓐ AtCoder Regular Contest 167",
|
|
166
233
|
"rule": "AtCoder",
|
|
167
|
-
"startTime": "
|
|
168
|
-
"endTime": "
|
|
169
|
-
"url": "https://atcoder.jp/contests/
|
|
234
|
+
"startTime": "2023-10-15T12:00:00.000Z",
|
|
235
|
+
"endTime": "2023-10-15T14:00:00.000Z",
|
|
236
|
+
"url": "https://atcoder.jp/contests/arc167"
|
|
170
237
|
},
|
|
171
238
|
{
|
|
172
239
|
"ojName": "AtCoder",
|
|
173
|
-
"name": "Ⓐ
|
|
240
|
+
"name": "Ⓐ Panasonic Programming Contest 2023(AtCoder Beginner Contest 326)",
|
|
174
241
|
"rule": "AtCoder",
|
|
175
|
-
"startTime": "
|
|
176
|
-
"endTime": "
|
|
177
|
-
"url": "https://atcoder.jp/contests/
|
|
242
|
+
"startTime": "2023-10-28T12:00:00.000Z",
|
|
243
|
+
"endTime": "2023-10-28T13:40:00.000Z",
|
|
244
|
+
"url": "https://atcoder.jp/contests/abc326"
|
|
178
245
|
},
|
|
179
246
|
{
|
|
180
247
|
"ojName": "Codeforces",
|
|
181
|
-
"name": "Codeforces Round (Div. 2)",
|
|
182
|
-
"rule": "
|
|
183
|
-
"startTime": "
|
|
184
|
-
"endTime": "
|
|
185
|
-
"url": "https://codeforces.com/contests/
|
|
248
|
+
"name": "Educational Codeforces Round 155 (Rated for Div. 2)",
|
|
249
|
+
"rule": "ICPC",
|
|
250
|
+
"startTime": "2023-09-24T14:35:00.000Z",
|
|
251
|
+
"endTime": "2023-09-24T16:35:00.000Z",
|
|
252
|
+
"url": "https://codeforces.com/contests/1879"
|
|
186
253
|
},
|
|
187
254
|
{
|
|
188
255
|
"ojName": "Codeforces",
|
|
189
|
-
"name": "
|
|
256
|
+
"name": "Codeforces Round 899 (Div. 2)",
|
|
190
257
|
"rule": "Codeforces",
|
|
191
|
-
"startTime": "
|
|
192
|
-
"endTime": "
|
|
193
|
-
"url": "https://codeforces.com/contests/
|
|
258
|
+
"startTime": "2023-09-25T14:35:00.000Z",
|
|
259
|
+
"endTime": "2023-09-25T16:35:00.000Z",
|
|
260
|
+
"url": "https://codeforces.com/contests/1882"
|
|
194
261
|
},
|
|
195
262
|
{
|
|
196
263
|
"ojName": "Codeforces",
|
|
197
|
-
"name": "Codeforces Round (Div.
|
|
264
|
+
"name": "Codeforces Round 900 (Div. 3)",
|
|
265
|
+
"rule": "ICPC",
|
|
266
|
+
"startTime": "2023-09-26T14:35:00.000Z",
|
|
267
|
+
"endTime": "2023-09-26T16:50:00.000Z",
|
|
268
|
+
"url": "https://codeforces.com/contests/1878"
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
"ojName": "Codeforces",
|
|
272
|
+
"name": "Codeforces Round 901 (Div. 1)",
|
|
198
273
|
"rule": "Codeforces",
|
|
199
|
-
"startTime": "
|
|
200
|
-
"endTime": "
|
|
201
|
-
"url": "https://codeforces.com/contests/
|
|
274
|
+
"startTime": "2023-09-30T14:35:00.000Z",
|
|
275
|
+
"endTime": "2023-09-30T17:35:00.000Z",
|
|
276
|
+
"url": "https://codeforces.com/contests/1874"
|
|
202
277
|
},
|
|
203
278
|
{
|
|
204
279
|
"ojName": "Codeforces",
|
|
205
|
-
"name": "
|
|
206
|
-
"
|
|
207
|
-
"
|
|
208
|
-
"
|
|
280
|
+
"name": "Codeforces Round 901 (Div. 2)",
|
|
281
|
+
"rule": "Codeforces",
|
|
282
|
+
"startTime": "2023-09-30T14:35:00.000Z",
|
|
283
|
+
"endTime": "2023-09-30T17:35:00.000Z",
|
|
284
|
+
"url": "https://codeforces.com/contests/1875"
|
|
209
285
|
},
|
|
210
286
|
{
|
|
211
287
|
"ojName": "Codeforces",
|
|
212
|
-
"name": "
|
|
213
|
-
"
|
|
214
|
-
"
|
|
215
|
-
"
|
|
288
|
+
"name": "Codeforces Round (Div. 1)",
|
|
289
|
+
"rule": "Codeforces",
|
|
290
|
+
"startTime": "2023-10-08T09:05:00.000Z",
|
|
291
|
+
"endTime": "2023-10-08T11:35:00.000Z",
|
|
292
|
+
"url": "https://codeforces.com/contests/1876"
|
|
216
293
|
},
|
|
217
294
|
{
|
|
218
295
|
"ojName": "Codeforces",
|
|
219
296
|
"name": "Codeforces Round (Div. 2)",
|
|
220
297
|
"rule": "Codeforces",
|
|
221
|
-
"startTime": "
|
|
222
|
-
"endTime": "
|
|
223
|
-
"url": "https://codeforces.com/contests/
|
|
298
|
+
"startTime": "2023-10-08T09:05:00.000Z",
|
|
299
|
+
"endTime": "2023-10-08T11:35:00.000Z",
|
|
300
|
+
"url": "https://codeforces.com/contests/1877"
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
"ojName": "Codeforces",
|
|
304
|
+
"name": "Codeforces Round (Div. 3)",
|
|
305
|
+
"rule": "ICPC",
|
|
306
|
+
"startTime": "2023-10-12T14:35:00.000Z",
|
|
307
|
+
"endTime": "2023-10-12T16:50:00.000Z",
|
|
308
|
+
"url": "https://codeforces.com/contests/1881"
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
"ojName": "Codeforces",
|
|
312
|
+
"name": "Codeforces Round (Div. 3)",
|
|
313
|
+
"rule": "ICPC",
|
|
314
|
+
"startTime": "2023-10-22T12:05:00.000Z",
|
|
315
|
+
"endTime": "2023-10-22T14:20:00.000Z",
|
|
316
|
+
"url": "https://codeforces.com/contests/1883"
|
|
224
317
|
}
|
|
225
318
|
]
|
|
226
319
|
}
|
package/dist/lib/contest.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* LeDuo: From Luogu OJ
|
|
3
3
|
*/
|
|
4
|
-
export
|
|
4
|
+
export type rule = "OI" | "IOI" | "ICPC" | "LeDuo" | "Codeforces" | "AtCoder";
|
|
5
5
|
export interface Contest {
|
|
6
6
|
ojName: string;
|
|
7
7
|
name: string;
|
package/dist/locale/index.d.ts
CHANGED
package/dist/locale/index.js
CHANGED
|
@@ -1,27 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
2
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
3
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
4
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -31,15 +8,25 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
31
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
9
|
});
|
|
33
10
|
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
34
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
15
|
exports.getLangDict = exports.langList = void 0;
|
|
36
|
-
const
|
|
37
|
-
|
|
16
|
+
const en_json_1 = __importDefault(require("./en.json"));
|
|
17
|
+
const zh_CN_json_1 = __importDefault(require("./zh-CN.json"));
|
|
18
|
+
const zh_TW_json_1 = __importDefault(require("./zh-TW.json"));
|
|
19
|
+
exports.langList = ["en", "zh-CN", "zh-TW"];
|
|
38
20
|
function getLangDict(language) {
|
|
39
21
|
return __awaiter(this, void 0, void 0, function* () {
|
|
40
22
|
if (!exports.langList.includes(language))
|
|
41
23
|
throw new Error(`Illegal language ${language}, the allowed languages are ${exports.langList}`);
|
|
42
|
-
|
|
24
|
+
switch (language) {
|
|
25
|
+
case "en": return en_json_1.default;
|
|
26
|
+
case "zh-CN": return zh_CN_json_1.default;
|
|
27
|
+
case "zh-TW": return zh_TW_json_1.default;
|
|
28
|
+
default: return en_json_1.default;
|
|
29
|
+
}
|
|
43
30
|
});
|
|
44
31
|
}
|
|
45
32
|
exports.getLangDict = getLangDict;
|
package/dist/locale/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/locale/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/locale/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,wDAA2B;AAC3B,8DAAgC;AAChC,8DAAgC;AAEnB,QAAA,QAAQ,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAgBjD,SAAsB,WAAW,CAAC,QAAgB;;QAE9C,IAAG,CAAC,gBAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,+BAA+B,gBAAQ,EAAE,CAAC,CAAC;QACxH,QAAQ,QAAQ,EAChB;YACI,KAAK,IAAI,CAAC,CAAC,OAAO,iBAAE,CAAC;YACrB,KAAK,OAAO,CAAC,CAAC,OAAO,oBAAI,CAAC;YAC1B,KAAK,OAAO,CAAC,CAAC,OAAO,oBAAI,CAAC;YAC1B,OAAO,CAAC,CAAC,OAAO,iBAAE,CAAC;SACtB;IACL,CAAC;CAAA;AAVD,kCAUC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const commander_1 = require("commander");
|
|
8
|
+
const package_json_1 = require("../package.json");
|
|
9
|
+
const server_1 = __importDefault(require("./server"));
|
|
10
|
+
const express_1 = __importDefault(require("express"));
|
|
11
|
+
const command = new commander_1.Command()
|
|
12
|
+
.name(Object.keys(package_json_1.bin)[1])
|
|
13
|
+
.version(package_json_1.version)
|
|
14
|
+
.option("-h, --host, <host>", "Host to listen on", "0.0.0.0")
|
|
15
|
+
.option("-p, --port, <port>", "Port to listen on", "8080");
|
|
16
|
+
command.parse();
|
|
17
|
+
const host = command.opts().host;
|
|
18
|
+
let port = command.opts().port;
|
|
19
|
+
port = parseInt(port, 10);
|
|
20
|
+
server_1.default.use(express_1.default.static(`${__dirname}/../public`));
|
|
21
|
+
server_1.default.listen(port, host, () => {
|
|
22
|
+
const logURL = `http://${host === "0.0.0.0" ? "127.0.0.1" : host}:${port}/`;
|
|
23
|
+
console.log(`LSCT server v${package_json_1.version} listening on ${logURL}`);
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=server-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-cli.js","sourceRoot":"","sources":["../src/server-cli.ts"],"names":[],"mappings":";;;;;;AACA,yCAAoC;AACpC,kDAA+C;AAC/C,sDAA2B;AAC3B,sDAA8B;AAE9B,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE;KACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAG,CAAC,CAAC,CAAC,CAAC,CAAC;KACzB,OAAO,CAAC,sBAAO,CAAC;KAChB,MAAM,CAAC,oBAAoB,EAAE,mBAAmB,EAAE,SAAS,CAAC;KAC5D,MAAM,CAAC,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,CAAC,CAAC;AAC/D,OAAO,CAAC,KAAK,EAAE,CAAC;AAEhB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,IAAc,CAAC;AAC3C,IAAI,IAAI,GAAoB,OAAO,CAAC,IAAI,EAAE,CAAC,IAAc,CAAC;AAC1D,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAE1B,gBAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,MAAM,CAAC,GAAG,SAAS,YAAY,CAAC,CAAC,CAAC;AAElD,gBAAG,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;IAExB,MAAM,MAAM,GAAG,UAAU,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,GAAG,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,gBAAgB,sBAAO,iBAAiB,MAAM,EAAE,CAAC,CAAC;AAClE,CAAC,CAAC,CAAC"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
1
|
+
declare const app: import("express-serve-static-core").Express;
|
|
2
|
+
export = app;
|
package/dist/server.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
1
|
"use strict";
|
|
3
2
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
4
3
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
@@ -12,7 +11,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
12
11
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
13
12
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
14
13
|
};
|
|
15
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
14
|
const express_1 = __importDefault(require("express"));
|
|
17
15
|
const _1 = __importDefault(require("."));
|
|
18
16
|
const oj_1 = require("./lib/oj");
|
|
@@ -20,10 +18,8 @@ const locale_1 = require("./locale");
|
|
|
20
18
|
const ics_1 = require("ics");
|
|
21
19
|
const pangu_1 = __importDefault(require("pangu"));
|
|
22
20
|
const crypto_1 = require("crypto");
|
|
23
|
-
const commander_1 = require("commander");
|
|
24
|
-
const package_json_1 = require("../package.json");
|
|
25
|
-
const fs_1 = require("fs");
|
|
26
21
|
const await_lock_1 = __importDefault(require("await-lock"));
|
|
22
|
+
const ioredis_1 = __importDefault(require("ioredis"));
|
|
27
23
|
const app = (0, express_1.default)();
|
|
28
24
|
const logger = () => {
|
|
29
25
|
return (req, res, next) => {
|
|
@@ -42,13 +38,8 @@ const logger = () => {
|
|
|
42
38
|
next();
|
|
43
39
|
};
|
|
44
40
|
};
|
|
45
|
-
const web = (0, fs_1.readFileSync)(`${__dirname}/server.html`).toString();
|
|
46
41
|
app.set("trust proxy", true);
|
|
47
42
|
app.use(logger());
|
|
48
|
-
app.get("/", (req, res) => {
|
|
49
|
-
res.set("Content-Type", "text/html");
|
|
50
|
-
res.send(web);
|
|
51
|
-
});
|
|
52
43
|
app.get("/ics", (req, res) => __awaiter(void 0, void 0, void 0, function* () {
|
|
53
44
|
const { language, l, ojs, o } = req.query;
|
|
54
45
|
const lArg = language || l || "zh-CN";
|
|
@@ -73,6 +64,29 @@ const contestsCache = {
|
|
|
73
64
|
contests: [],
|
|
74
65
|
lastUpdate: 0
|
|
75
66
|
};
|
|
67
|
+
let redis = undefined;
|
|
68
|
+
const cacheKey = "lsct:cache";
|
|
69
|
+
function exportContestCache() {
|
|
70
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
71
|
+
yield redis.set(cacheKey, JSON.stringify(contestsCache));
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
function importContestCache() {
|
|
75
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
76
|
+
redis = new ioredis_1.default(process.env.REDIS_URL);
|
|
77
|
+
const payload = yield redis.get(cacheKey);
|
|
78
|
+
if (payload) {
|
|
79
|
+
const obj = JSON.parse(payload);
|
|
80
|
+
contestsCache.lastUpdate = obj.lastUpdate;
|
|
81
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
82
|
+
contestsCache.contests = obj.contests.map((c) => {
|
|
83
|
+
c.startTime = new Date(c.startTime);
|
|
84
|
+
c.endTime = new Date(c.endTime);
|
|
85
|
+
return c;
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
}
|
|
76
90
|
const lock = new await_lock_1.default();
|
|
77
91
|
function icsPostProcess(value) {
|
|
78
92
|
return value
|
|
@@ -93,12 +107,18 @@ function icsPostProcess(value) {
|
|
|
93
107
|
function checkCache() {
|
|
94
108
|
return __awaiter(this, void 0, void 0, function* () {
|
|
95
109
|
yield lock.acquireAsync();
|
|
110
|
+
if (process.env.VERCEL) {
|
|
111
|
+
yield importContestCache();
|
|
112
|
+
}
|
|
96
113
|
try {
|
|
97
114
|
if (contestsCache.lastUpdate < Date.now() - 1000 * 60 * 5) {
|
|
98
115
|
const c = yield new _1.default({ days: -1 }).getContests();
|
|
99
116
|
contestsCache.contests = c.running.concat(...c.upcoming);
|
|
100
117
|
contestsCache.contests = contestsCache.contests.filter(c => c.endTime.getTime() - c.startTime.getTime() < 1000 * 60 * 60 * 24 * 2); // ignore too long contests
|
|
101
118
|
contestsCache.lastUpdate = Date.now();
|
|
119
|
+
if (process.env.VERCEL) {
|
|
120
|
+
yield exportContestCache();
|
|
121
|
+
}
|
|
102
122
|
}
|
|
103
123
|
}
|
|
104
124
|
finally {
|
|
@@ -141,17 +161,5 @@ function getIcs(lang, ojs) {
|
|
|
141
161
|
return icsPostProcess(value);
|
|
142
162
|
});
|
|
143
163
|
}
|
|
144
|
-
|
|
145
|
-
.name(Object.keys(package_json_1.bin)[1])
|
|
146
|
-
.version(package_json_1.version)
|
|
147
|
-
.option("-h, --host, <host>", "Host to listen on", "0.0.0.0")
|
|
148
|
-
.option("-p, --port, <port>", "Port to listen on", "8080");
|
|
149
|
-
command.parse();
|
|
150
|
-
const host = command.opts().host;
|
|
151
|
-
let port = command.opts().port;
|
|
152
|
-
port = parseInt(port, 10);
|
|
153
|
-
app.listen(port, host, () => {
|
|
154
|
-
const logURL = `http://${host === "0.0.0.0" ? "127.0.0.1" : host}:${port}/`;
|
|
155
|
-
console.log(`LSCT server v${package_json_1.version} listening on ${logURL}`);
|
|
156
|
-
});
|
|
164
|
+
module.exports = app;
|
|
157
165
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"
|
|
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": "2.
|
|
3
|
+
"version": "2.7.1",
|
|
4
4
|
"description": "A tool to get information about the contests on each OJ",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cli",
|
|
@@ -18,51 +18,54 @@
|
|
|
18
18
|
"main": "./dist/index.js",
|
|
19
19
|
"bin": {
|
|
20
20
|
"lsct": "./dist/cli.js",
|
|
21
|
-
"lsct-s": "./dist/server.js"
|
|
21
|
+
"lsct-s": "./dist/server-cli.js"
|
|
22
22
|
},
|
|
23
23
|
"files": [
|
|
24
|
-
"dist"
|
|
24
|
+
"dist",
|
|
25
|
+
"public"
|
|
25
26
|
],
|
|
26
27
|
"scripts": {
|
|
27
|
-
"prebuild": "rimraf ./dist
|
|
28
|
-
"postbuild": "cpy --flat src/server.html dist",
|
|
28
|
+
"prebuild": "rimraf ./dist",
|
|
29
29
|
"build": "tsc -p src",
|
|
30
30
|
"clean": "rimraf ./dist ./docs ./node_modules",
|
|
31
31
|
"docs": "typedoc",
|
|
32
32
|
"lint": "eslint . && markdownlint .",
|
|
33
33
|
"lint:fix": "eslint . --fix && markdownlint . --fix",
|
|
34
34
|
"start": "tsx src/cli.ts",
|
|
35
|
-
"start-s": "tsx src/server.ts"
|
|
35
|
+
"start-s": "tsx src/server.ts",
|
|
36
|
+
"vercel-dev": "vercel dev"
|
|
36
37
|
},
|
|
37
38
|
"dependencies": {
|
|
38
39
|
"await-lock": "^2.2.2",
|
|
39
|
-
"axios": "^1.
|
|
40
|
-
"axios-retry": "^3.
|
|
41
|
-
"cheerio": "^1.0.0-rc.
|
|
42
|
-
"commander": "^
|
|
43
|
-
"express": "^4.18.
|
|
44
|
-
"html-entities": "^2.
|
|
45
|
-
"ics": "^
|
|
40
|
+
"axios": "^1.5.0",
|
|
41
|
+
"axios-retry": "^3.8.0",
|
|
42
|
+
"cheerio": "^1.0.0-rc.12",
|
|
43
|
+
"commander": "^11.0.0",
|
|
44
|
+
"express": "^4.18.2",
|
|
45
|
+
"html-entities": "^2.4.0",
|
|
46
|
+
"ics": "^3.5.0",
|
|
47
|
+
"ioredis": "^5.3.2",
|
|
46
48
|
"lodash": "^4.17.21",
|
|
47
49
|
"pangu": "^4.0.7",
|
|
48
|
-
"winston": "^3.
|
|
50
|
+
"winston": "^3.10.0"
|
|
49
51
|
},
|
|
50
52
|
"devDependencies": {
|
|
51
|
-
"@types/express": "^4.17.
|
|
52
|
-
"@types/lodash": "^4.14.
|
|
53
|
-
"@types/node": "^
|
|
53
|
+
"@types/express": "^4.17.17",
|
|
54
|
+
"@types/lodash": "^4.14.199",
|
|
55
|
+
"@types/node": "^20.6.3",
|
|
54
56
|
"@types/pangu": "^4.0.0",
|
|
55
|
-
"@typescript-eslint/eslint-plugin": "^
|
|
56
|
-
"@typescript-eslint/parser": "^
|
|
57
|
-
"
|
|
57
|
+
"@typescript-eslint/eslint-plugin": "^6.7.2",
|
|
58
|
+
"@typescript-eslint/parser": "^6.7.2",
|
|
59
|
+
"@vercel/ncc": "^0.38.0",
|
|
60
|
+
"cpy-cli": "^5.0.0",
|
|
58
61
|
"cz-conventional-changelog": "3.3.0",
|
|
59
|
-
"eslint": "^8.
|
|
60
|
-
"markdownlint-cli": "^0.
|
|
61
|
-
"rimraf": "^
|
|
62
|
-
"tsx": "^3.
|
|
63
|
-
"typedoc": "^0.
|
|
64
|
-
"typedoc-plugin-extras": "^
|
|
65
|
-
"typescript": "^
|
|
62
|
+
"eslint": "^8.50.0",
|
|
63
|
+
"markdownlint-cli": "^0.37.0",
|
|
64
|
+
"rimraf": "^5.0.1",
|
|
65
|
+
"tsx": "^3.12.10",
|
|
66
|
+
"typedoc": "^0.25.1",
|
|
67
|
+
"typedoc-plugin-extras": "^3.0.0",
|
|
68
|
+
"typescript": "^5.2.2"
|
|
66
69
|
},
|
|
67
70
|
"config": {
|
|
68
71
|
"commitizen": {
|
|
@@ -70,11 +70,6 @@
|
|
|
70
70
|
checked/>
|
|
71
71
|
<label class="form-check-label" for="zhCN">zh-CN</label>
|
|
72
72
|
</div>
|
|
73
|
-
<div class="form-check">
|
|
74
|
-
<input class="form-check-input" type="radio" name="lang"
|
|
75
|
-
id="zhNE"/>
|
|
76
|
-
<label class="form-check-label" for="zhNE">zh-NE</label>
|
|
77
|
-
</div>
|
|
78
73
|
<div class="form-check">
|
|
79
74
|
<input class="form-check-input" type="radio" name="lang"
|
|
80
75
|
id="zhTW"/>
|
|
@@ -97,14 +92,10 @@
|
|
|
97
92
|
</div>
|
|
98
93
|
</div>
|
|
99
94
|
</main>
|
|
100
|
-
<script src="https://cdnjs.loli.net/ajax/libs/mdb-ui-kit/4.1
|
|
101
|
-
referrerpolicy="no-referrer"
|
|
95
|
+
<script src="https://cdnjs.loli.net/ajax/libs/mdb-ui-kit/6.4.1/mdb.min.js" crossorigin="anonymous" referrerpolicy="no-referrer"
|
|
102
96
|
></script>
|
|
103
|
-
<script src="https://cdnjs.loli.net/ajax/libs/jquery/3.
|
|
104
|
-
|
|
105
|
-
<script src="https://cdnjs.loli.net/ajax/libs/clipboard.js/2.0.10/clipboard.min.js"
|
|
106
|
-
crossorigin="anonymous"
|
|
107
|
-
referrerpolicy="no-referrer"></script>
|
|
97
|
+
<script src="https://cdnjs.loli.net/ajax/libs/jquery/3.7.1/jquery.min.js" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
|
98
|
+
<script src="https://cdnjs.loli.net/ajax/libs/clipboard.js/2.0.11/clipboard.min.js" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
|
108
99
|
<script>
|
|
109
100
|
function updateURL()
|
|
110
101
|
{
|
|
@@ -130,7 +121,9 @@
|
|
|
130
121
|
if(lc) ojs.push("lc");
|
|
131
122
|
if(lg) ojs.push("lg");
|
|
132
123
|
if(nc) ojs.push("nc");
|
|
133
|
-
|
|
124
|
+
if(ojs.length > 0) {
|
|
125
|
+
args.append("o", ojs.join(","));
|
|
126
|
+
}
|
|
134
127
|
}
|
|
135
128
|
|
|
136
129
|
//process lang
|
|
@@ -171,7 +164,6 @@
|
|
|
171
164
|
{
|
|
172
165
|
copy.tooltip("hide");
|
|
173
166
|
}, 1000);
|
|
174
|
-
fetch(url);
|
|
175
167
|
}
|
|
176
168
|
});
|
|
177
169
|
}
|
package/dist/locale/zh-NE.json
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"runnning": "搁 ${oj} 上有 ${contestCount} 场比赛正偷摸干着呢",
|
|
3
|
-
"norunning": "这前搁 ${oj} 上属实是没比赛打",
|
|
4
|
-
"upcoming": "之后 ${days} 天搁 ${oj} 上拢共 ${contestCount} 场比赛",
|
|
5
|
-
"upcoming_all": "往后搁 ${oj} 上有 ${contestCount} 场比赛",
|
|
6
|
-
"noupcoming": "没成想往后 ${days} 天搁 ${oj} 上没比赛打啊",
|
|
7
|
-
"noupcoming_all": "将来搁 ${oj} 上没比赛",
|
|
8
|
-
"ojName": "搁哪",
|
|
9
|
-
"name": "叫啥",
|
|
10
|
-
"rule": "咋个整法",
|
|
11
|
-
"startTime": "啥前开始",
|
|
12
|
-
"endTime": "多前完事"
|
|
13
|
-
}
|