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 CHANGED
@@ -8,10 +8,14 @@
8
8
  ![npm](https://img.shields.io/npm/v/lscontests)
9
9
  ![npm](https://img.shields.io/npm/dw/lscontests)
10
10
 
11
- A CLI tool to get information about the contests on each OJ
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
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
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
@@ -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"}
@@ -0,0 +1,3 @@
1
+ import { addOJ } from "./lib/oj";
2
+ declare function list(abbrList?: string[], days?: number): Promise<import("./lib/contest").contest[]>;
3
+ export { addOJ, list };
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,9 @@
1
+ export declare type rule = "OI" | "IOI" | "ICPC" | "LeDuo" | "Codeforces" | "AtCoder";
2
+ export declare type contest = {
3
+ ojName: string;
4
+ name: string;
5
+ rule: rule;
6
+ startTime: Date;
7
+ endTime: Date;
8
+ url: string;
9
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=contest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contest.js","sourceRoot":"","sources":["../../src/lib/contest.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import { oj } from ".";
2
+ export declare const at: oj;
@@ -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,2 @@
1
+ import { oj } from ".";
2
+ export declare const cf: oj;
@@ -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,9 @@
1
+ import { contest } from "../contest";
2
+ export declare type oj = {
3
+ name: string;
4
+ get: () => Promise<contest[]>;
5
+ };
6
+ export declare const alloj: {
7
+ [abbr: string]: oj;
8
+ };
9
+ export declare function addOJ(abbr: string, oj: oj): void;
@@ -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,2 @@
1
+ import { oj } from ".";
2
+ export declare const lg: oj;
@@ -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,2 @@
1
+ import { oj } from ".";
2
+ export declare const nc: oj;
@@ -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.0",
4
- "description": "A CLI tool to get information about the contests on each OJ",
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": "./bin/cli.js",
15
+ "main": "./dist/index.js",
14
16
  "bin": {
15
- "lsct": "./bin/cli.js"
17
+ "lsct": "./dist/cli.js"
16
18
  },
17
19
  "files": [
18
- "bin"
20
+ "dist"
19
21
  ],
20
22
  "scripts": {
21
- "build": "rollup -c",
22
- "watch": "rollup -c --watch",
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
- "rollup": "^2.72.0",
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();