lscontests 1.7.0 → 1.7.3
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 +95 -41
- package/dist/cli.js +2 -2
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +17 -15
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
@@ -14,7 +14,7 @@ A tool to get information about the contests on each OJ.
|
|
14
14
|
|
15
15
|
### CLI
|
16
16
|
|
17
|
-
You can use cli to get a list of contests
|
17
|
+
You can use cli to get a list of information about upcoming contests easily.
|
18
18
|
|
19
19
|
```text
|
20
20
|
lsct [options]
|
@@ -33,56 +33,71 @@ Options:
|
|
33
33
|
It performs as follows:
|
34
34
|
|
35
35
|
<details>
|
36
|
-
<summary>
|
36
|
+
<summary> <code>> lsct -o at cf</code> </summary>
|
37
37
|
|
38
38
|
```text
|
39
|
-
在最近的 3 天内有
|
40
|
-
|
39
|
+
在最近的 3 天内有 3 场比赛
|
41
40
|
|
42
41
|
比赛平台: Codeforces
|
42
|
+
比赛名称: Educational Codeforces Round 128 (Rated for Div. 2)
|
43
43
|
赛制: ICPC
|
44
44
|
开始时间: 2022/5/13 22:35:00
|
45
45
|
结束时间: 2022/5/14 00:35:00
|
46
46
|
https://codeforces.com/contests/1680
|
47
47
|
|
48
|
-
|
49
|
-
|
50
|
-
赛制:
|
51
|
-
开始时间: 2022/5/14
|
52
|
-
结束时间: 2022/5/14
|
53
|
-
https://
|
48
|
+
比赛平台: Codeforces
|
49
|
+
比赛名称: Codeforces Round #791 (Div. 2)
|
50
|
+
赛制: Codeforces
|
51
|
+
开始时间: 2022/5/14 17:35:00
|
52
|
+
结束时间: 2022/5/14 19:35:00
|
53
|
+
https://codeforces.com/contests/1679
|
54
|
+
|
55
|
+
比赛平台: AtCoder
|
56
|
+
比赛名称: Ⓐ Panasonic Programming Contest 2022(AtCoder Beginner Contest 251)
|
57
|
+
赛制: AtCoder
|
58
|
+
开始时间: 2022/5/14 20:00:00
|
59
|
+
结束时间: 2022/5/14 20:01:40
|
60
|
+
https://atcoder.jp/contests/abc251
|
54
61
|
```
|
55
62
|
|
56
63
|
</details>
|
57
64
|
|
58
65
|
<details>
|
59
|
-
<summary>
|
66
|
+
<summary> <code>> lsct -o lg -d 7 -L en</code> </summary>
|
60
67
|
|
61
68
|
```text
|
62
|
-
2 contests in the last
|
63
|
-
|
64
|
-
|
65
|
-
OJ: Codeforces
|
66
|
-
Rule: ICPC
|
67
|
-
Start time: 2022/5/13 22:35:00
|
68
|
-
End time: 2022/5/14 00:35:00
|
69
|
-
https://codeforces.com/contests/1680
|
70
|
-
|
69
|
+
2 contests in the last 7 days
|
71
70
|
|
72
71
|
OJ: Luogu
|
72
|
+
Contest name: 【LGR-109】洛谷 5 月月赛 II & Windy Round 6
|
73
73
|
Rule: IOI
|
74
74
|
Start time: 2022/5/14 14:00:00
|
75
75
|
End time: 2022/5/14 18:00:00
|
76
76
|
https://www.luogu.com.cn/contest/68326
|
77
|
+
|
78
|
+
OJ: Luogu
|
79
|
+
Contest name: 「WHOI」Round 1
|
80
|
+
Rule: IOI
|
81
|
+
Start time: 2022/5/15 14:00:00
|
82
|
+
End time: 2022/5/15 18:00:00
|
83
|
+
https://www.luogu.com.cn/contest/67377
|
77
84
|
```
|
78
85
|
|
79
86
|
</details>
|
80
87
|
|
81
88
|
<details>
|
82
|
-
<summary>
|
89
|
+
<summary> <code>> lsct -r -o cf nc --no-sort</code> </summary>
|
83
90
|
|
84
91
|
```bash
|
85
92
|
[
|
93
|
+
{
|
94
|
+
ojName: 'Codeforces',
|
95
|
+
name: 'Codeforces Round #791 (Div. 2)',
|
96
|
+
rule: 'Codeforces',
|
97
|
+
startTime: 2022-05-14T09:35:00.000Z,
|
98
|
+
endTime: 2022-05-14T11:35:00.000Z,
|
99
|
+
url: 'https://codeforces.com/contests/1679'
|
100
|
+
},
|
86
101
|
{
|
87
102
|
ojName: 'Codeforces',
|
88
103
|
name: 'Educational Codeforces Round 128 (Rated for Div. 2)',
|
@@ -92,12 +107,20 @@ https://www.luogu.com.cn/contest/68326
|
|
92
107
|
url: 'https://codeforces.com/contests/1680'
|
93
108
|
},
|
94
109
|
{
|
95
|
-
ojName: '
|
96
|
-
name: '
|
97
|
-
rule: '
|
98
|
-
startTime: 2022-05-
|
110
|
+
ojName: 'NowCoder',
|
111
|
+
name: '牛客挑战赛60',
|
112
|
+
rule: 'ICPC',
|
113
|
+
startTime: 2022-05-13T11:00:00.000Z,
|
114
|
+
endTime: 2022-05-13T14:00:00.000Z,
|
115
|
+
url: 'https://ac.nowcoder.com/acm/contest/11200'
|
116
|
+
},
|
117
|
+
{
|
118
|
+
ojName: 'NowCoder',
|
119
|
+
name: '第十八届西南科技大学ACM程序设计竞赛(同步赛)',
|
120
|
+
rule: 'ICPC',
|
121
|
+
startTime: 2022-05-14T05:00:00.000Z,
|
99
122
|
endTime: 2022-05-14T10:00:00.000Z,
|
100
|
-
url: 'https://
|
123
|
+
url: 'https://ac.nowcoder.com/acm/contest/33540'
|
101
124
|
}
|
102
125
|
]
|
103
126
|
```
|
@@ -106,58 +129,89 @@ https://www.luogu.com.cn/contest/68326
|
|
106
129
|
|
107
130
|
### API
|
108
131
|
|
109
|
-
If you want to
|
132
|
+
If you want to get a list of contest information in your project by calling *lscontests*, or if you need to add support for other OJs, then you can call the *lscontests* API as follows:
|
110
133
|
|
111
134
|
#### Get contests information string
|
112
135
|
|
113
136
|
```typescript
|
114
|
-
import {
|
137
|
+
import { getContestInfo } from "lscontests";
|
115
138
|
|
116
|
-
|
139
|
+
getContestInfo({ abbrList: ["cf", "lg"] }).then(console.log);
|
117
140
|
```
|
118
141
|
|
119
|
-
|
142
|
+
This code gives the same result as `lsct -o cf lg`.
|
120
143
|
|
121
144
|
#### Get contests information list
|
122
145
|
|
123
146
|
```typescript
|
124
|
-
import {
|
147
|
+
import { getContestList } from "lscontests";
|
125
148
|
|
126
|
-
|
149
|
+
getContestList({ sort: false }).then(console.log);
|
127
150
|
```
|
128
151
|
|
129
|
-
|
152
|
+
This code gives the same result as `lsct -r --no-sort`.
|
130
153
|
|
131
154
|
#### Add OJ support
|
132
155
|
|
133
156
|
```typescript
|
134
|
-
import { addOJ,
|
157
|
+
import { addOJ, getContestInfo, getContestList } from "lscontests";
|
135
158
|
|
136
159
|
addOJ("ts", {
|
137
160
|
name: "testOJ", get: async () => [{
|
138
161
|
ojName: "testOJ",
|
139
162
|
name: "testContest",
|
140
163
|
rule: "ICPC",
|
141
|
-
startTime: new Date(Date.now() +
|
142
|
-
endTime: new Date(Date.now() +
|
164
|
+
startTime: new Date(Date.now() + 1 * 86400000),
|
165
|
+
endTime: new Date(Date.now() + 2 * 86400000),
|
143
166
|
url: "https://www.test.com"
|
144
167
|
}]
|
145
168
|
});
|
146
169
|
|
147
|
-
|
170
|
+
async function main() {
|
171
|
+
console.log(await getContestInfo({ abbrList: ["cf", "ts"], days: 1 }, "en"));
|
172
|
+
console.log();
|
173
|
+
console.log(await getContestList({ abbrList: ["cf", "ts"], days: 7 }));
|
174
|
+
}
|
175
|
+
|
176
|
+
main();
|
148
177
|
```
|
149
178
|
|
150
|
-
|
179
|
+
This code gives the following results:
|
180
|
+
|
181
|
+
```text
|
182
|
+
1 contests in the last 1 days
|
183
|
+
|
184
|
+
OJ: testOJ
|
185
|
+
Contest name: testContest
|
186
|
+
Rule: ICPC
|
187
|
+
Start time: 2022/5/12 22:54:43
|
188
|
+
End time: 2022/5/13 22:54:43
|
189
|
+
https://www.test.com
|
151
190
|
|
152
|
-
```bash
|
153
191
|
[
|
154
192
|
{
|
155
193
|
ojName: 'testOJ',
|
156
194
|
name: 'testContest',
|
157
195
|
rule: 'ICPC',
|
158
|
-
startTime: 2022-05-
|
159
|
-
endTime: 2022-05-
|
196
|
+
startTime: 2022-05-12T14:54:46.240Z,
|
197
|
+
endTime: 2022-05-13T14:54:46.240Z,
|
160
198
|
url: 'https://www.test.com'
|
199
|
+
},
|
200
|
+
{
|
201
|
+
ojName: 'Codeforces',
|
202
|
+
name: 'Educational Codeforces Round 128 (Rated for Div. 2)',
|
203
|
+
rule: 'ICPC',
|
204
|
+
startTime: 2022-05-13T14:35:00.000Z,
|
205
|
+
endTime: 2022-05-13T16:35:00.000Z,
|
206
|
+
url: 'https://codeforces.com/contests/1680'
|
207
|
+
},
|
208
|
+
{
|
209
|
+
ojName: 'Codeforces',
|
210
|
+
name: 'Codeforces Round #791 (Div. 2)',
|
211
|
+
rule: 'Codeforces',
|
212
|
+
startTime: 2022-05-14T09:35:00.000Z,
|
213
|
+
endTime: 2022-05-14T11:35:00.000Z,
|
214
|
+
url: 'https://codeforces.com/contests/1679'
|
161
215
|
}
|
162
216
|
]
|
163
217
|
```
|
package/dist/cli.js
CHANGED
@@ -36,9 +36,9 @@ function main() {
|
|
36
36
|
sort: opts.sort
|
37
37
|
};
|
38
38
|
if (opts.raw)
|
39
|
-
console.log(yield (0, _1.
|
39
|
+
console.log(yield (0, _1.getContestList)(config));
|
40
40
|
else
|
41
|
-
console.log(yield (0, _1.
|
41
|
+
console.log(yield (0, _1.getContestInfo)(config, opts.language));
|
42
42
|
}
|
43
43
|
});
|
44
44
|
}
|
package/dist/cli.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,kDAA0C;AAC1C,yCAA4C;AAC5C,iCAAiC;AACjC,
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,kDAA0C;AAC1C,yCAA4C;AAC5C,iCAAiC;AACjC,wBAAqE;AAErE,mBAAO;KACF,IAAI,CAAC,MAAM,CAAC;KACZ,OAAO,CAAC,sBAAO,CAAC;KAChB,MAAM,CAAC,mBAAmB,EAAE,4CAA4C,EAAE,GAAG,CAAC;KAC9E,MAAM,CAAC,YAAY,EAAE,uBAAuB,CAAC;KAC7C,SAAS,CAAC,IAAI,kBAAM,CAAC,mBAAmB,EAAE,iCAAiC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,UAAK,CAAC,CAAC,CAAC;KACzG,SAAS,CAAC,IAAI,kBAAM,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;KAClF,SAAS,CAAC,IAAI,kBAAM,CAAC,uBAAuB,EAAE,qBAAqB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,WAAQ,CAAC,CAAC;KACxG,MAAM,CAAC,WAAW,EAAE,qDAAqD,CAAC;KAC1E,KAAK,EAAE,CAAC;AAEb,MAAM,IAAI,GAAG,mBAAO,CAAC,IAAI,EAAE,CAAC;AAE5B,SAAe,IAAI;;QACf,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,UAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;aACjE;YACD,MAAM,MAAM,GAAW;gBACnB,QAAQ,EAAE,IAAI,CAAC,EAAE;gBACjB,IAAI,EAAE,IAAI,CAAC,IAAc;gBACzB,IAAI,EAAE,IAAI,CAAC,IAAI;aAClB,CAAC;YACF,IAAI,IAAI,CAAC,GAAG;gBAAE,OAAO,CAAC,GAAG,CAAC,MAAM,IAAA,iBAAc,EAAC,MAAM,CAAC,CAAC,CAAC;;gBACnD,OAAO,CAAC,GAAG,CAAC,MAAM,IAAA,iBAAc,EAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;SACjE;IACL,CAAC;CAAA;AAED,IAAI,EAAE,CAAC"}
|
package/dist/index.d.ts
CHANGED
@@ -4,7 +4,7 @@ export declare type config = {
|
|
4
4
|
days?: number;
|
5
5
|
sort?: boolean;
|
6
6
|
};
|
7
|
-
declare function
|
7
|
+
declare function getContestList(config?: config): Promise<import("./lib/contest").contest[]>;
|
8
8
|
export declare const langList: string[];
|
9
|
-
declare function
|
10
|
-
export { addOJ,
|
9
|
+
declare function getContestInfo(config?: config, language?: string): Promise<string>;
|
10
|
+
export { addOJ, getContestList, getContestInfo };
|
package/dist/index.js
CHANGED
@@ -32,7 +32,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
32
32
|
});
|
33
33
|
};
|
34
34
|
Object.defineProperty(exports, "__esModule", { value: true });
|
35
|
-
exports.
|
35
|
+
exports.getContestInfo = exports.getContestList = exports.addOJ = exports.langList = void 0;
|
36
36
|
const fs_1 = require("fs");
|
37
37
|
const oj_1 = require("./lib/oj");
|
38
38
|
Object.defineProperty(exports, "addOJ", { enumerable: true, get: function () { return oj_1.addOJ; } });
|
@@ -41,7 +41,7 @@ const defaultConfig = {
|
|
41
41
|
days: 3,
|
42
42
|
sort: true
|
43
43
|
};
|
44
|
-
function
|
44
|
+
function getContestList(config) {
|
45
45
|
return __awaiter(this, void 0, void 0, function* () {
|
46
46
|
const cfg = Object.assign(Object.assign({}, defaultConfig), config);
|
47
47
|
if (!cfg.abbrList)
|
@@ -52,7 +52,7 @@ function getList(config) {
|
|
52
52
|
return cts.filter((c) => c.startTime <= new Date(Date.now() + cfg.days * 86400000));
|
53
53
|
}
|
54
54
|
catch (e) {
|
55
|
-
console.
|
55
|
+
console.error(`Failed to get match information for ${oj_1.alloj[abbr].name}, details:`);
|
56
56
|
console.error(e);
|
57
57
|
return [];
|
58
58
|
}
|
@@ -62,32 +62,34 @@ function getList(config) {
|
|
62
62
|
return contests;
|
63
63
|
});
|
64
64
|
}
|
65
|
-
exports.
|
65
|
+
exports.getContestList = getContestList;
|
66
66
|
exports.langList = (0, fs_1.readdirSync)(`${__dirname}/locale`).map((fileName) => fileName.replace(".json", ""));
|
67
67
|
function format(s, ...args) {
|
68
68
|
for (let i = 0; i < args.length; i++)
|
69
69
|
s = s.replace(`{${i}}`, args[i]);
|
70
70
|
return s;
|
71
71
|
}
|
72
|
-
function
|
72
|
+
function getContestInfo(config, language = "zh-CN") {
|
73
73
|
return __awaiter(this, void 0, void 0, function* () {
|
74
74
|
if (!exports.langList.includes(language))
|
75
75
|
throw new Error(`Illegal language ${language}, the allowed languages are ${exports.langList}`);
|
76
76
|
const cfg = Object.assign(Object.assign({}, defaultConfig), config);
|
77
|
-
const contests = yield
|
77
|
+
const contests = yield getContestList(cfg);
|
78
78
|
const info = [];
|
79
79
|
const lang = yield Promise.resolve().then(() => __importStar(require(`./locale/${language}.json`)));
|
80
80
|
info.push(format(lang.welcome, cfg.days.toString(), contests.length.toString()));
|
81
|
-
for (const
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
81
|
+
for (const contest of contests) {
|
82
|
+
const ct = [];
|
83
|
+
ct.push(`${lang.ojName}: ${contest.ojName}`);
|
84
|
+
ct.push(`${lang.name}: ${contest.name}`);
|
85
|
+
ct.push(`${lang.rule}: ${contest.rule}`);
|
86
|
+
ct.push(`${lang.startTime}: ${contest.startTime.toLocaleString()}`);
|
87
|
+
ct.push(`${lang.endTime}: ${contest.endTime.toLocaleString()}`);
|
88
|
+
ct.push(contest.url);
|
89
|
+
info.push(ct.join("\n"));
|
88
90
|
}
|
89
|
-
return info.join("\n");
|
91
|
+
return info.join("\n\n");
|
90
92
|
});
|
91
93
|
}
|
92
|
-
exports.
|
94
|
+
exports.getContestInfo = getContestInfo;
|
93
95
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2BAAiC;AACjC,iCAAwC;
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|