lscontests 1.4.0 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +79 -2
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +34 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/contest.d.ts +9 -0
- package/dist/lib/contest.js +3 -0
- package/dist/lib/contest.js.map +1 -0
- package/dist/lib/oj/atcoder.d.ts +2 -0
- package/dist/lib/oj/atcoder.js +74 -0
- package/dist/lib/oj/atcoder.js.map +1 -0
- package/dist/lib/oj/codeforces.d.ts +2 -0
- package/dist/lib/oj/codeforces.js +37 -0
- package/dist/lib/oj/codeforces.js.map +1 -0
- package/dist/lib/oj/index.d.ts +9 -0
- package/dist/lib/oj/index.js +18 -0
- package/dist/lib/oj/index.js.map +1 -0
- package/dist/lib/oj/luogu.d.ts +2 -0
- package/dist/lib/oj/luogu.js +44 -0
- package/dist/lib/oj/luogu.js.map +1 -0
- package/dist/lib/oj/nowcoder.d.ts +2 -0
- package/dist/lib/oj/nowcoder.js +82 -0
- package/dist/lib/oj/nowcoder.js.map +1 -0
- package/package.json +10 -14
- package/bin/cli.js +0 -136
package/README.md
CHANGED
@@ -8,10 +8,14 @@
|
|
8
8
|

|
9
9
|

|
10
10
|
|
11
|
-
A
|
11
|
+
A tool to get information about the contests on each OJ.
|
12
12
|
|
13
13
|
## Usage
|
14
14
|
|
15
|
+
### CLI
|
16
|
+
|
17
|
+
You can use cli to get a list of contests information easily.
|
18
|
+
|
15
19
|
```bash
|
16
20
|
lsct [options]
|
17
21
|
|
@@ -19,7 +23,80 @@ Options:
|
|
19
23
|
-V, --version output the version number
|
20
24
|
-d, --days, <day> Number of days to get contests information (default: "3")
|
21
25
|
-l, --list List all supported OJ
|
22
|
-
-o, --oj <ojs...> OJs to get contests information (choices: "cf", "lg")
|
26
|
+
-o, --oj <ojs...> OJs to get contests information (choices: "cf", "lg", "nc")
|
27
|
+
-h, --help display help for command
|
28
|
+
```
|
29
|
+
|
30
|
+
Its performance:
|
31
|
+
|
32
|
+
```bash
|
33
|
+
> lsct
|
34
|
+
[
|
35
|
+
{
|
36
|
+
ojName: 'Codeforces',
|
37
|
+
name: 'Codeforces Round #790 (Div. 4)',
|
38
|
+
rule: 'ICPC',
|
39
|
+
startTime: 2022-05-10T14:35:00.000Z,
|
40
|
+
endTime: 2022-05-10T16:35:00.000Z,
|
41
|
+
url: 'https://codeforces.com/contests/1676'
|
42
|
+
},
|
43
|
+
{
|
44
|
+
ojName: 'NowCoder',
|
45
|
+
name: '牛客挑战赛60',
|
46
|
+
rule: 'ICPC',
|
47
|
+
startTime: 2022-05-13T11:00:00.000Z,
|
48
|
+
endTime: 2022-05-13T14:00:00.000Z,
|
49
|
+
url: 'https://ac.nowcoder.com/acm/contest/11200'
|
50
|
+
}
|
51
|
+
]
|
52
|
+
```
|
53
|
+
|
54
|
+
### API
|
55
|
+
|
56
|
+
If you want to call lscontests in your project to get a list of contests information, or if you need to add OJ support, then you can call the lscontests API like the following:
|
57
|
+
|
58
|
+
#### Get a list of contests information
|
59
|
+
|
60
|
+
```typescript
|
61
|
+
import { list } from "lscontests";
|
62
|
+
|
63
|
+
list().then(console.log);
|
64
|
+
```
|
65
|
+
|
66
|
+
The result of this code is the same as using cli directly without arguments.
|
67
|
+
|
68
|
+
#### Add OJ support
|
69
|
+
|
70
|
+
```typescript
|
71
|
+
import { addOJ, list } from "lscontests";
|
72
|
+
|
73
|
+
addOJ("ts", {
|
74
|
+
name: "testOJ", get: async () => [{
|
75
|
+
ojName: "testOJ",
|
76
|
+
name: "testContest",
|
77
|
+
rule: "ICPC",
|
78
|
+
startTime: new Date(Date.now() + 5 * 86400000),
|
79
|
+
endTime: new Date(Date.now() + 6 * 86400000),
|
80
|
+
url: "https://www.test.com"
|
81
|
+
}]
|
82
|
+
});
|
83
|
+
|
84
|
+
list(["ts"], 7).then(console.log);
|
85
|
+
```
|
86
|
+
|
87
|
+
The result of this code is as follows:
|
88
|
+
|
89
|
+
```bash
|
90
|
+
[
|
91
|
+
{
|
92
|
+
ojName: 'testOJ',
|
93
|
+
name: 'testContest',
|
94
|
+
rule: 'ICPC',
|
95
|
+
startTime: 2022-05-15T11:50:42.032Z,
|
96
|
+
endTime: 2022-05-16T11:50:42.032Z,
|
97
|
+
url: 'https://www.test.com'
|
98
|
+
}
|
99
|
+
]
|
23
100
|
```
|
24
101
|
|
25
102
|
## License
|
package/dist/cli.d.ts
ADDED
package/dist/cli.js
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
#!/usr/bin/env node
|
2
|
+
"use strict";
|
3
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
4
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
5
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
6
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
7
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
8
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
9
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
10
|
+
});
|
11
|
+
};
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
13
|
+
const package_json_1 = require("../package.json");
|
14
|
+
const commander_1 = require("commander");
|
15
|
+
const oj_1 = require("./lib/oj");
|
16
|
+
const _1 = require(".");
|
17
|
+
commander_1.program
|
18
|
+
.name("lsct")
|
19
|
+
.version(package_json_1.version)
|
20
|
+
.option("-d, --days, <day>", "Number of days to get contests information", "3")
|
21
|
+
.option("-l, --list", "List all supported OJ")
|
22
|
+
.addOption(new commander_1.Option("-o, --oj <ojs...>", "OJs to get contests information").choices(Object.keys(oj_1.alloj)))
|
23
|
+
.parse();
|
24
|
+
const opts = commander_1.program.opts();
|
25
|
+
function main() {
|
26
|
+
return __awaiter(this, void 0, void 0, function* () {
|
27
|
+
if (opts.list)
|
28
|
+
console.log(Object.values(oj_1.alloj).map((oj) => oj.name));
|
29
|
+
else
|
30
|
+
console.log(yield (0, _1.list)(opts.oj, opts.days));
|
31
|
+
});
|
32
|
+
}
|
33
|
+
main();
|
34
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,kDAA0C;AAC1C,yCAA4C;AAC5C,iCAAiC;AACjC,wBAAyB;AAEzB,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,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;;YACjE,OAAO,CAAC,GAAG,CAAC,MAAM,IAAA,OAAI,EAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAc,CAAC,CAAC,CAAC;IAC/D,CAAC;CAAA;AAED,IAAI,EAAE,CAAC"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
@@ -0,0 +1,25 @@
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
12
|
+
exports.list = exports.addOJ = void 0;
|
13
|
+
const oj_1 = require("./lib/oj");
|
14
|
+
Object.defineProperty(exports, "addOJ", { enumerable: true, get: function () { return oj_1.addOJ; } });
|
15
|
+
function list(abbrList, days = 3) {
|
16
|
+
return __awaiter(this, void 0, void 0, function* () {
|
17
|
+
if (!abbrList)
|
18
|
+
abbrList = Object.keys(oj_1.alloj);
|
19
|
+
return (yield Promise.all(abbrList.map((abbr) => __awaiter(this, void 0, void 0, function* () {
|
20
|
+
return (yield oj_1.alloj[abbr].get()).filter((ct) => ct.startTime <= new Date(Date.now() + days * 86400000));
|
21
|
+
})))).reduce((ls1, ls2) => ls1.concat(ls2));
|
22
|
+
});
|
23
|
+
}
|
24
|
+
exports.list = list;
|
25
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iCAAwC;AAa/B,sFAbA,UAAK,OAaA;AAXd,SAAe,IAAI,CAAC,QAAmB,EAAE,IAAI,GAAG,CAAC;;QAC7C,IAAI,CAAC,QAAQ;YAAE,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,UAAK,CAAC,CAAC;QAC7C,OAAO,CAAC,MAAM,OAAO,CAAC,GAAG,CACrB,QAAQ,CAAC,GAAG,CACR,CAAO,IAAI,EAAE,EAAE;YAAC,OAAA,CAAC,MAAM,UAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAC5C,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAI,IAAe,GAAG,QAAQ,CAAC,CAC7E,CAAA;UAAA,CACJ,CACJ,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;CAAA;AAEe,oBAAI"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"contest.js","sourceRoot":"","sources":["../../src/lib/contest.ts"],"names":[],"mappings":""}
|
@@ -0,0 +1,74 @@
|
|
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
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
26
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
27
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
28
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
29
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
30
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
31
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
32
|
+
});
|
33
|
+
};
|
34
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
35
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
36
|
+
};
|
37
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
38
|
+
exports.at = void 0;
|
39
|
+
const axios_1 = __importDefault(require("axios"));
|
40
|
+
const cheerio = __importStar(require("cheerio"));
|
41
|
+
exports.at = {
|
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 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, s] = $(this).text().split(":");
|
66
|
+
ct.endTime = new Date(ct.startTime.getTime() + (parseInt(h) * 60 + parseInt(s)) * 1000);
|
67
|
+
}
|
68
|
+
});
|
69
|
+
contests.push(ct);
|
70
|
+
});
|
71
|
+
return contests;
|
72
|
+
})
|
73
|
+
};
|
74
|
+
//# sourceMappingURL=atcoder.js.map
|
@@ -0,0 +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;QACZ,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,4CAA4C,CAAC,CAAC,IAAI,CAAC;YACjD,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;gBAC5B,IAAI,GAAG,IAAI,CAAC;oBAAE,EAAE,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;qBACjD,IAAI,GAAG,IAAI,CAAC,EAAE;oBACf,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,IAAI,GAAG,IAAI,CAAC,EAAE;oBACf,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,IAAI,CAAC,CAAC;iBAC3F;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"}
|
@@ -0,0 +1,37 @@
|
|
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
|
+
exports.cf = void 0;
|
16
|
+
const axios_1 = __importDefault(require("axios"));
|
17
|
+
const ruleRecord = {
|
18
|
+
CF: "Codeforces",
|
19
|
+
ICPC: "ICPC"
|
20
|
+
};
|
21
|
+
exports.cf = {
|
22
|
+
name: "Codeforces",
|
23
|
+
get: () => __awaiter(void 0, void 0, void 0, function* () {
|
24
|
+
const resList = (yield axios_1.default.get("https://codeforces.com/api/contest.list")).data.result;
|
25
|
+
return resList.map((res) => {
|
26
|
+
return {
|
27
|
+
ojName: exports.cf.name,
|
28
|
+
name: res.name,
|
29
|
+
rule: ruleRecord[res.type],
|
30
|
+
startTime: new Date(res.startTimeSeconds * 1000),
|
31
|
+
endTime: new Date((res.startTimeSeconds + res.durationSeconds) * 1000),
|
32
|
+
url: `https://codeforces.com/contests/${res.id}`
|
33
|
+
};
|
34
|
+
}).filter((contest) => contest.startTime >= new Date());
|
35
|
+
})
|
36
|
+
};
|
37
|
+
//# sourceMappingURL=codeforces.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"codeforces.js","sourceRoot":"","sources":["../../../src/lib/oj/codeforces.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,kDAA0B;AAe1B,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;QACZ,MAAM,OAAO,GAAa,CAAC,MAAM,eAAK,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QACnG,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAW,EAAE;YAChC,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,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAA;CACJ,CAAC"}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.addOJ = exports.alloj = void 0;
|
4
|
+
const atcoder_1 = require("./atcoder");
|
5
|
+
const codeforces_1 = require("./codeforces");
|
6
|
+
const luogu_1 = require("./luogu");
|
7
|
+
const nowcoder_1 = require("./nowcoder");
|
8
|
+
exports.alloj = {
|
9
|
+
at: atcoder_1.at,
|
10
|
+
cf: codeforces_1.cf,
|
11
|
+
lg: luogu_1.lg,
|
12
|
+
nc: nowcoder_1.nc,
|
13
|
+
};
|
14
|
+
function addOJ(abbr, oj) {
|
15
|
+
exports.alloj[abbr] = oj;
|
16
|
+
}
|
17
|
+
exports.addOJ = addOJ;
|
18
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/oj/index.ts"],"names":[],"mappings":";;;AACA,uCAA+B;AAC/B,6CAAkC;AAClC,mCAA6B;AAC7B,yCAAgC;AAOnB,QAAA,KAAK,GAA2B;IACzC,EAAE,EAAF,YAAE;IACF,EAAE,EAAF,eAAE;IACF,EAAE,EAAF,UAAE;IACF,EAAE,EAAF,aAAE;CACL,CAAC;AAEF,SAAgB,KAAK,CAAC,IAAY,EAAE,EAAM;IACtC,aAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;AACrB,CAAC;AAFD,sBAEC"}
|
@@ -0,0 +1,44 @@
|
|
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
|
+
exports.lg = void 0;
|
16
|
+
const axios_1 = __importDefault(require("axios"));
|
17
|
+
const ruleRecord = {
|
18
|
+
1: "OI",
|
19
|
+
2: "ICPC",
|
20
|
+
3: "LeDuo",
|
21
|
+
4: "IOI",
|
22
|
+
5: "Codeforces"
|
23
|
+
};
|
24
|
+
const headers = {
|
25
|
+
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36",
|
26
|
+
"x-luogu-type": "content-only"
|
27
|
+
};
|
28
|
+
exports.lg = {
|
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.startTime >= new Date());
|
42
|
+
})
|
43
|
+
};
|
44
|
+
//# sourceMappingURL=luogu.js.map
|
@@ -0,0 +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;QACZ,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;YAChC,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,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAA;CACJ,CAAC"}
|
@@ -0,0 +1,82 @@
|
|
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
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
26
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
27
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
28
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
29
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
30
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
31
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
32
|
+
});
|
33
|
+
};
|
34
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
35
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
36
|
+
};
|
37
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
38
|
+
exports.nc = void 0;
|
39
|
+
const axios_1 = __importDefault(require("axios"));
|
40
|
+
const cheerio = __importStar(require("cheerio"));
|
41
|
+
var topCategoryFilter;
|
42
|
+
(function (topCategoryFilter) {
|
43
|
+
topCategoryFilter[topCategoryFilter["NOWCODERSERIES"] = 13] = "NOWCODERSERIES";
|
44
|
+
topCategoryFilter[topCategoryFilter["SCHOOLCONTEST"] = 14] = "SCHOOLCONTEST";
|
45
|
+
})(topCategoryFilter || (topCategoryFilter = {}));
|
46
|
+
const url = "https://ac.nowcoder.com/acm/contest/vip-index";
|
47
|
+
function getResultList(tcf) {
|
48
|
+
return __awaiter(this, void 0, void 0, function* () {
|
49
|
+
const html = (yield axios_1.default.get(`${url}?topCategoryFilter=${tcf}`)).data;
|
50
|
+
const $ = cheerio.load(html);
|
51
|
+
const ls = [];
|
52
|
+
$("div[class='platform-item js-item ']").each(function () {
|
53
|
+
ls.push(JSON.parse(cheerio.load(this.attribs["data-json"]).text()));
|
54
|
+
});
|
55
|
+
return ls;
|
56
|
+
});
|
57
|
+
}
|
58
|
+
const ruleRecord = {
|
59
|
+
0: "ICPC",
|
60
|
+
1: "IOI",
|
61
|
+
2: "OI"
|
62
|
+
};
|
63
|
+
exports.nc = {
|
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
|
+
};
|
79
|
+
});
|
80
|
+
})
|
81
|
+
};
|
82
|
+
//# sourceMappingURL=nowcoder.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"nowcoder.js","sourceRoot":"","sources":["../../../src/lib/oj/nowcoder.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA0B;AAC1B,iDAAmC;AAgDnC,IAAK,iBAGJ;AAHD,WAAK,iBAAiB;IAClB,8EAAmB,CAAA;IACnB,4EAAa,CAAA;AACjB,CAAC,EAHI,iBAAiB,KAAjB,iBAAiB,QAGrB;AAED,MAAM,GAAG,GAAG,+CAA+C,CAAC;AAE5D,SAAe,aAAa,CAAC,GAAsB;;QAC/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;YAC1C,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,KAAK;IACR,CAAC,EAAE,IAAI;CACV,CAAC;AAEW,QAAA,EAAE,GAAO;IAClB,IAAI,EAAE,UAAU;IAChB,GAAG,EAAE,GAAS,EAAE;QACZ,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,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,sBAAsB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAW,EAAE;YAC5E,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"}
|
package/package.json
CHANGED
@@ -1,25 +1,27 @@
|
|
1
1
|
{
|
2
2
|
"name": "lscontests",
|
3
|
-
"version": "1.
|
4
|
-
"description": "A
|
3
|
+
"version": "1.6.0",
|
4
|
+
"description": "A tool to get information about the contests on each OJ",
|
5
5
|
"keywords": [
|
6
6
|
"cli",
|
7
|
+
"OJ",
|
8
|
+
"Codeforces",
|
7
9
|
"competitive-programming"
|
8
10
|
],
|
9
11
|
"repository": "https://github.com/StableAgOH/lscontests",
|
10
12
|
"author": "StableAgOH <stagoh17@gmail.com>",
|
11
13
|
"license": "GPL-3.0",
|
12
14
|
"private": false,
|
13
|
-
"main": "./
|
15
|
+
"main": "./dist/index.js",
|
14
16
|
"bin": {
|
15
|
-
"lsct": "./
|
17
|
+
"lsct": "./dist/cli.js"
|
16
18
|
},
|
17
19
|
"files": [
|
18
|
-
"
|
20
|
+
"dist"
|
19
21
|
],
|
20
22
|
"scripts": {
|
21
|
-
"build": "
|
22
|
-
"
|
23
|
+
"build": "rimraf ./dist/* && tsc -p src",
|
24
|
+
"clean": "rimraf ./dist",
|
23
25
|
"prepack": "yarn build"
|
24
26
|
},
|
25
27
|
"dependencies": {
|
@@ -28,12 +30,6 @@
|
|
28
30
|
"commander": "^9.2.0"
|
29
31
|
},
|
30
32
|
"devDependencies": {
|
31
|
-
"@babel/core": "^7.17.10",
|
32
|
-
"@babel/preset-env": "^7.17.10",
|
33
|
-
"@babel/preset-typescript": "^7.16.7",
|
34
|
-
"@rollup/plugin-babel": "^5.3.1",
|
35
|
-
"@rollup/plugin-json": "^4.1.0",
|
36
|
-
"@rollup/plugin-node-resolve": "^13.3.0",
|
37
33
|
"@semantic-release/changelog": "^6.0.1",
|
38
34
|
"@semantic-release/git": "^10.0.1",
|
39
35
|
"@types/node": "^17.0.31",
|
@@ -41,7 +37,7 @@
|
|
41
37
|
"@typescript-eslint/parser": "^5.22.0",
|
42
38
|
"cz-conventional-changelog": "3.3.0",
|
43
39
|
"eslint": "^8.14.0",
|
44
|
-
"
|
40
|
+
"rimraf": "^3.0.2",
|
45
41
|
"semantic-release": "^19.0.2",
|
46
42
|
"typescript": "^4.6.4"
|
47
43
|
},
|
package/bin/cli.js
DELETED
@@ -1,136 +0,0 @@
|
|
1
|
-
#!/usr/bin/env node
|
2
|
-
'use strict';
|
3
|
-
|
4
|
-
var commander = require('commander');
|
5
|
-
var axios = require('axios');
|
6
|
-
var cheerio = require('cheerio');
|
7
|
-
|
8
|
-
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
9
|
-
|
10
|
-
function _interopNamespace(e) {
|
11
|
-
if (e && e.__esModule) return e;
|
12
|
-
var n = Object.create(null);
|
13
|
-
if (e) {
|
14
|
-
Object.keys(e).forEach(function (k) {
|
15
|
-
if (k !== 'default') {
|
16
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
17
|
-
Object.defineProperty(n, k, d.get ? d : {
|
18
|
-
enumerable: true,
|
19
|
-
get: function () { return e[k]; }
|
20
|
-
});
|
21
|
-
}
|
22
|
-
});
|
23
|
-
}
|
24
|
-
n["default"] = e;
|
25
|
-
return Object.freeze(n);
|
26
|
-
}
|
27
|
-
|
28
|
-
var axios__default = /*#__PURE__*/_interopDefaultLegacy(axios);
|
29
|
-
var cheerio__namespace = /*#__PURE__*/_interopNamespace(cheerio);
|
30
|
-
|
31
|
-
var version = "1.4.0";
|
32
|
-
|
33
|
-
const ruleRecord$2 = {
|
34
|
-
CF: "Codeforces",
|
35
|
-
ICPC: "ICPC"
|
36
|
-
};
|
37
|
-
const cf = {
|
38
|
-
name: "Codeforces",
|
39
|
-
get: async () => {
|
40
|
-
const resList = (await axios__default["default"].get("https://codeforces.com/api/contest.list")).data.result;
|
41
|
-
return resList.map(res => {
|
42
|
-
return {
|
43
|
-
ojName: cf.name,
|
44
|
-
name: res.name,
|
45
|
-
rule: ruleRecord$2[res.type],
|
46
|
-
startTime: new Date(res.startTimeSeconds * 1000),
|
47
|
-
endTime: new Date((res.startTimeSeconds + res.durationSeconds) * 1000),
|
48
|
-
url: `https://codeforces.com/contests/${res.id}`
|
49
|
-
};
|
50
|
-
}).filter(contest => contest.startTime >= new Date());
|
51
|
-
}
|
52
|
-
};
|
53
|
-
|
54
|
-
const ruleRecord$1 = {
|
55
|
-
1: "OI",
|
56
|
-
2: "ICPC",
|
57
|
-
3: "LeDuo",
|
58
|
-
4: "IOI",
|
59
|
-
5: "Codeforces"
|
60
|
-
};
|
61
|
-
const headers = {
|
62
|
-
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36",
|
63
|
-
"x-luogu-type": "content-only"
|
64
|
-
};
|
65
|
-
const lg = {
|
66
|
-
name: "Luogu",
|
67
|
-
get: async () => {
|
68
|
-
const resList = (await axios__default["default"].get("https://www.luogu.com.cn/contest/list", {
|
69
|
-
headers
|
70
|
-
})).data.currentData.contests.result;
|
71
|
-
return resList.map(res => {
|
72
|
-
return {
|
73
|
-
ojName: lg.name,
|
74
|
-
name: res.name,
|
75
|
-
rule: ruleRecord$1[res.ruleType],
|
76
|
-
startTime: new Date(res.startTime * 1000),
|
77
|
-
endTime: new Date(res.endTime * 1000),
|
78
|
-
url: `https://www.luogu.com.cn/contest/${res.id}`
|
79
|
-
};
|
80
|
-
}).filter(contest => contest.startTime >= new Date());
|
81
|
-
}
|
82
|
-
};
|
83
|
-
|
84
|
-
const url = "https://ac.nowcoder.com/acm/contest/vip-index";
|
85
|
-
|
86
|
-
async function getResultList(topCategoryFilter) {
|
87
|
-
const html = (await axios__default["default"].get(`${url}?topCategoryFilter=${topCategoryFilter}`)).data;
|
88
|
-
const $ = cheerio__namespace.load(html);
|
89
|
-
const ls = [];
|
90
|
-
$("div[class='platform-item js-item ']").each(function () {
|
91
|
-
ls.push(JSON.parse(cheerio__namespace.load(this.attribs["data-json"]).text()));
|
92
|
-
});
|
93
|
-
return ls;
|
94
|
-
}
|
95
|
-
|
96
|
-
const ruleRecord = {
|
97
|
-
0: "ICPC",
|
98
|
-
1: "IOI",
|
99
|
-
2: "OI"
|
100
|
-
};
|
101
|
-
const nc = {
|
102
|
-
name: "NowCoder",
|
103
|
-
get: async () => {
|
104
|
-
const res = [...(await getResultList(13)), ...(await getResultList(14))];
|
105
|
-
return res.filter(res => res.signUpEndCountDownTime > 0).map(res => {
|
106
|
-
return {
|
107
|
-
ojName: nc.name,
|
108
|
-
name: res.contestName,
|
109
|
-
rule: ruleRecord[res.type],
|
110
|
-
startTime: new Date(res.contestStartTime),
|
111
|
-
endTime: new Date(res.contestEndTime),
|
112
|
-
url: `https://ac.nowcoder.com/acm/contest/${res.contestId}`
|
113
|
-
};
|
114
|
-
});
|
115
|
-
}
|
116
|
-
};
|
117
|
-
|
118
|
-
const alloj = {
|
119
|
-
cf,
|
120
|
-
lg,
|
121
|
-
nc
|
122
|
-
};
|
123
|
-
|
124
|
-
async function list(abbrList, days) {
|
125
|
-
if (!abbrList) abbrList = Object.keys(alloj);
|
126
|
-
return (await Promise.all(abbrList.map(async abbr => (await alloj[abbr].get()).filter(ct => ct.startTime <= new Date(Date.now() + days * 86400000))))).reduce((ls1, ls2) => ls1.concat(ls2));
|
127
|
-
}
|
128
|
-
|
129
|
-
commander.program.name("lsct").version(version).option("-d, --days, <day>", "Number of days to get contests information", "3").option("-l, --list", "List all supported OJ").addOption(new commander.Option("-o, --oj <ojs...>", "OJs to get contests information").choices(Object.keys(alloj))).parse();
|
130
|
-
const opts = commander.program.opts();
|
131
|
-
|
132
|
-
async function main() {
|
133
|
-
if (opts.list) console.log(Object.values(alloj).map(oj => oj.name));else console.log(await list(opts.oj, opts.days));
|
134
|
-
}
|
135
|
-
|
136
|
-
main();
|