lscontests 1.6.1 → 1.7.2

Sign up to get free protection for your applications and to get access to all the features.
package/README.md CHANGED
@@ -16,60 +16,122 @@ A tool to get information about the contests on each OJ.
16
16
 
17
17
  You can use cli to get a list of contests information easily.
18
18
 
19
- ```bash
19
+ ```text
20
20
  lsct [options]
21
21
 
22
22
  Options:
23
- -V, --version output the version number
24
- -d, --days, <day> Number of days to get contests information (default: "3")
25
- -l, --list List all supported OJ
26
- --no-sort Do not sort by contests start time (default sort by OJ)
27
- -o, --oj <ojs...> OJs to get contests information (choices: "at", "cf", "lg", "nc")
28
- -h, --help display help for command
23
+ -V, --version output the version number
24
+ -d, --days, <day> Number of days to get contests information (default: "3")
25
+ -l, --list List all supported OJ
26
+ -o, --oj <ojs...> OJs to get contests information (choices: "at", "cf", "lg", "nc")
27
+ -r, --raw Print raw contest list
28
+ -L, --language <lang> Set output language (choices: "en", "zh-CN", "zh-TW", default: "zh-CN")
29
+ --no-sort Do not sort by contests start time, but by OJ order
30
+ -h, --help display help for command
31
+ ```
32
+
33
+ It performs as follows:
34
+
35
+ <details>
36
+ <summary> > lsct -o cf lg </summary>
37
+
38
+ ```text
39
+ 在最近的 3 天内有 2 场比赛
40
+
41
+
42
+ 比赛平台: Codeforces
43
+ 赛制: ICPC
44
+ 开始时间: 2022/5/13 22:35:00
45
+ 结束时间: 2022/5/14 00:35:00
46
+ https://codeforces.com/contests/1680
47
+
48
+
49
+ 比赛平台: Luogu
50
+ 赛制: IOI
51
+ 开始时间: 2022/5/14 14:00:00
52
+ 结束时间: 2022/5/14 18:00:00
53
+ https://www.luogu.com.cn/contest/68326
54
+ ```
55
+
56
+ </details>
57
+
58
+ <details>
59
+ <summary> > lsct -o cf lg -L en </summary>
60
+
61
+ ```text
62
+ 2 contests in the last 3 days
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
+
71
+
72
+ OJ: Luogu
73
+ Rule: IOI
74
+ Start time: 2022/5/14 14:00:00
75
+ End time: 2022/5/14 18:00:00
76
+ https://www.luogu.com.cn/contest/68326
29
77
  ```
30
78
 
31
- Its performance:
79
+ </details>
80
+
81
+ <details>
82
+ <summary> > lsct -r -o cf lg </summary>
32
83
 
33
84
  ```bash
34
- > lsct
35
85
  [
36
86
  {
37
87
  ojName: 'Codeforces',
38
- name: 'Codeforces Round #790 (Div. 4)',
88
+ name: 'Educational Codeforces Round 128 (Rated for Div. 2)',
39
89
  rule: 'ICPC',
40
- startTime: 2022-05-10T14:35:00.000Z,
41
- endTime: 2022-05-10T16:35:00.000Z,
42
- url: 'https://codeforces.com/contests/1676'
90
+ startTime: 2022-05-13T14:35:00.000Z,
91
+ endTime: 2022-05-13T16:35:00.000Z,
92
+ url: 'https://codeforces.com/contests/1680'
43
93
  },
44
94
  {
45
- ojName: 'NowCoder',
46
- name: '牛客挑战赛60',
47
- rule: 'ICPC',
48
- startTime: 2022-05-13T11:00:00.000Z,
49
- endTime: 2022-05-13T14:00:00.000Z,
50
- url: 'https://ac.nowcoder.com/acm/contest/11200'
95
+ ojName: 'Luogu',
96
+ name: '【LGR-109】洛谷 5 月月赛 II & Windy Round 6',
97
+ rule: 'IOI',
98
+ startTime: 2022-05-14T06:00:00.000Z,
99
+ endTime: 2022-05-14T10:00:00.000Z,
100
+ url: 'https://www.luogu.com.cn/contest/68326'
51
101
  }
52
102
  ]
53
103
  ```
54
104
 
105
+ </details>
106
+
55
107
  ### API
56
108
 
57
109
  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:
58
110
 
59
- #### Get a list of contests information
111
+ #### Get contests information string
112
+
113
+ ```typescript
114
+ import { getContestInfo } from "lscontests";
115
+
116
+ getContestInfo({ abbrList: ["cf", "lg"] }).then(console.log);
117
+ ```
118
+
119
+ The result of this code is the same as `lsct -o cf lg`.
120
+
121
+ #### Get contests information list
60
122
 
61
123
  ```typescript
62
- import { list } from "lscontests";
124
+ import { getContestList } from "lscontests";
63
125
 
64
- list().then(console.log);
126
+ getContestList({ sort: false }).then(console.log);
65
127
  ```
66
128
 
67
- The result of this code is the same as using cli directly without arguments.
129
+ The result of this code is the same as `lsct -r --no-sort`.
68
130
 
69
131
  #### Add OJ support
70
132
 
71
133
  ```typescript
72
- import { addOJ, list } from "lscontests";
134
+ import { addOJ, getContestList } from "lscontests";
73
135
 
74
136
  addOJ("ts", {
75
137
  name: "testOJ", get: async () => [{
@@ -82,7 +144,7 @@ addOJ("ts", {
82
144
  }]
83
145
  });
84
146
 
85
- list(["ts"], 7).then(console.log);
147
+ getContestList({ abbrList: ["ts"], days: 7 }).then(console.log);
86
148
  ```
87
149
 
88
150
  The result of this code is as follows:
package/dist/cli.js CHANGED
@@ -19,16 +19,27 @@ commander_1.program
19
19
  .version(package_json_1.version)
20
20
  .option("-d, --days, <day>", "Number of days to get contests information", "3")
21
21
  .option("-l, --list", "List all supported OJ")
22
- .option("--no-sort", "Do not sort by contests start time (default sort by OJ)")
23
22
  .addOption(new commander_1.Option("-o, --oj <ojs...>", "OJs to get contests information").choices(Object.keys(oj_1.alloj)))
23
+ .addOption(new commander_1.Option("-r, --raw", "Print raw contest list").conflicts("language"))
24
+ .addOption(new commander_1.Option("-L, --language <lang>", "Set output language").default("zh-CN").choices(_1.langList))
25
+ .option("--no-sort", "Do not sort by contests start time, but by OJ order")
24
26
  .parse();
25
27
  const opts = commander_1.program.opts();
26
28
  function main() {
27
29
  return __awaiter(this, void 0, void 0, function* () {
28
30
  if (opts.list)
29
31
  console.log(Object.values(oj_1.alloj).map((oj) => oj.name));
30
- else
31
- console.log(yield (0, _1.list)(opts.oj, opts.days, opts.sort));
32
+ else {
33
+ const config = {
34
+ abbrList: opts.oj,
35
+ days: opts.days,
36
+ sort: opts.sort
37
+ };
38
+ if (opts.raw)
39
+ console.log(yield (0, _1.getContestList)(config));
40
+ else
41
+ console.log(yield (0, _1.getContestInfo)(config, opts.language));
42
+ }
32
43
  });
33
44
  }
34
45
  main();
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,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,MAAM,CAAC,WAAW,EAAE,yDAAyD,CAAC;KAC9E,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,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1E,CAAC;CAAA;AAED,IAAI,EAAE,CAAC"}
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
@@ -1,3 +1,10 @@
1
1
  import { addOJ } from "./lib/oj";
2
- declare function list(abbrList?: string[], days?: number, sort?: boolean): Promise<import("./lib/contest").contest[]>;
3
- export { addOJ, list };
2
+ export declare type config = {
3
+ abbrList?: string[];
4
+ days?: number;
5
+ sort?: boolean;
6
+ };
7
+ declare function getContestList(config?: config): Promise<import("./lib/contest").contest[]>;
8
+ export declare const langList: string[];
9
+ declare function getContestInfo(config?: config, language?: string): Promise<string>;
10
+ export { addOJ, getContestList, getContestInfo };
package/dist/index.js CHANGED
@@ -1,4 +1,27 @@
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
+ };
2
25
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
26
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
27
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -9,20 +32,62 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
32
  });
10
33
  };
11
34
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.list = exports.addOJ = void 0;
35
+ exports.getContestInfo = exports.getContestList = exports.addOJ = exports.langList = void 0;
36
+ const fs_1 = require("fs");
13
37
  const oj_1 = require("./lib/oj");
14
38
  Object.defineProperty(exports, "addOJ", { enumerable: true, get: function () { return oj_1.addOJ; } });
15
- function list(abbrList, days = 3, sort = true) {
39
+ const defaultConfig = {
40
+ abbrList: Object.keys(oj_1.alloj),
41
+ days: 3,
42
+ sort: true
43
+ };
44
+ function getContestList(config) {
16
45
  return __awaiter(this, void 0, void 0, function* () {
17
- if (!abbrList)
18
- abbrList = Object.keys(oj_1.alloj);
19
- const contests = (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));
46
+ const cfg = Object.assign(Object.assign({}, defaultConfig), config);
47
+ if (!cfg.abbrList)
48
+ cfg.abbrList = Object.keys(oj_1.alloj);
49
+ const contests = (yield Promise.all(cfg.abbrList.map((abbr) => __awaiter(this, void 0, void 0, function* () {
50
+ try {
51
+ const cts = yield oj_1.alloj[abbr].get();
52
+ return cts.filter((c) => c.startTime <= new Date(Date.now() + cfg.days * 86400000));
53
+ }
54
+ catch (e) {
55
+ console.error(`Failed to get match information for ${oj_1.alloj[abbr].name}, details:`);
56
+ console.error(e);
57
+ return [];
58
+ }
21
59
  })))).reduce((ls1, ls2) => ls1.concat(ls2));
22
- if (sort)
60
+ if (cfg.sort)
23
61
  contests.sort((a, b) => a.startTime.getTime() - b.startTime.getTime());
24
62
  return contests;
25
63
  });
26
64
  }
27
- exports.list = list;
65
+ exports.getContestList = getContestList;
66
+ exports.langList = (0, fs_1.readdirSync)(`${__dirname}/locale`).map((fileName) => fileName.replace(".json", ""));
67
+ function format(s, ...args) {
68
+ for (let i = 0; i < args.length; i++)
69
+ s = s.replace(`{${i}}`, args[i]);
70
+ return s;
71
+ }
72
+ function getContestInfo(config, language = "zh-CN") {
73
+ return __awaiter(this, void 0, void 0, function* () {
74
+ if (!exports.langList.includes(language))
75
+ throw new Error(`Illegal language ${language}, the allowed languages are ${exports.langList}`);
76
+ const cfg = Object.assign(Object.assign({}, defaultConfig), config);
77
+ const contests = yield getContestList(cfg);
78
+ const info = [];
79
+ const lang = yield Promise.resolve().then(() => __importStar(require(`./locale/${language}.json`)));
80
+ info.push(format(lang.welcome, cfg.days.toString(), contests.length.toString()));
81
+ for (const ct of contests) {
82
+ info.push("\n");
83
+ info.push(`${lang.ojName}: ${ct.ojName}`);
84
+ info.push(`${lang.rule}: ${ct.rule}`);
85
+ info.push(`${lang.startTime}: ${ct.startTime.toLocaleString()}`);
86
+ info.push(`${lang.endTime}: ${ct.endTime.toLocaleString()}`);
87
+ info.push(ct.url);
88
+ }
89
+ return info.join("\n");
90
+ });
91
+ }
92
+ exports.getContestInfo = getContestInfo;
28
93
  //# 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,iCAAwC;AAe/B,sFAfA,UAAK,OAeA;AAbd,SAAe,IAAI,CAAC,QAAmB,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI;;QAC1D,IAAI,CAAC,QAAQ;YAAE,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,UAAK,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAC/B,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;QACzC,IAAI,IAAI;YAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;QACjF,OAAO,QAAQ,CAAC;IACpB,CAAC;CAAA;AAEe,oBAAI"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,27 @@
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
+ };
2
25
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
26
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
27
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -14,6 +37,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
14
37
  Object.defineProperty(exports, "__esModule", { value: true });
15
38
  exports.cf = void 0;
16
39
  const axios_1 = __importDefault(require("axios"));
40
+ const cheerio = __importStar(require("cheerio"));
17
41
  const ruleRecord = {
18
42
  CF: "Codeforces",
19
43
  ICPC: "ICPC"
@@ -21,7 +45,12 @@ const ruleRecord = {
21
45
  exports.cf = {
22
46
  name: "Codeforces",
23
47
  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;
48
+ const response = yield axios_1.default.get("https://codeforces.com/api/contest.list");
49
+ if (!(response.data instanceof Object)) {
50
+ const $ = cheerio.load(response.data);
51
+ throw new Error($.text());
52
+ }
53
+ const resList = response.data.result;
25
54
  return resList.map((res) => {
26
55
  return {
27
56
  ojName: exports.cf.name,
@@ -1 +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"}
1
+ {"version":3,"file":"codeforces.js","sourceRoot":"","sources":["../../../src/lib/oj/codeforces.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA0B;AAC1B,iDAAmC;AAenC,MAAM,UAAU,GAAyB;IACrC,EAAE,EAAE,YAAY;IAChB,IAAI,EAAE,MAAM;CACf,CAAC;AAEW,QAAA,EAAE,GAAO;IAClB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,GAAS,EAAE;QACZ,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QAC5E,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,YAAY,MAAM,CAAC,EAAE;YACpC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;SAC7B;QACD,MAAM,OAAO,GAAa,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;QAC/C,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,8 @@
1
+ {
2
+ "welcome": "{1} contests in the last {0} days",
3
+ "ojName": "OJ",
4
+ "name": "Contest name",
5
+ "rule": "Rule",
6
+ "startTime": "Start time",
7
+ "endTime": "End time"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "welcome": "在最近的 {0} 天内有 {1} 场比赛",
3
+ "ojName": "比赛平台",
4
+ "name": "比赛名称",
5
+ "rule": "赛制",
6
+ "startTime": "开始时间",
7
+ "endTime": "结束时间"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "welcome": "在最近的 {0} 天內有 {1} 場比賽",
3
+ "ojName": "比賽平台",
4
+ "name": "比賽名稱",
5
+ "rule": "賽制",
6
+ "startTime": "開始時間",
7
+ "endTime": "結束時間"
8
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "es6",
4
+ "module": "commonjs",
5
+ "esModuleInterop": true,
6
+ "forceConsistentCasingInFileNames": true,
7
+ "strict": true,
8
+ "skipLibCheck": true,
9
+ "sourceMap": true,
10
+ "declaration": true,
11
+ "outDir": "../dist/",
12
+ "resolveJsonModule": true
13
+ },
14
+ "include": [
15
+ "**/*.ts",
16
+ "**/*.json"
17
+ ],
18
+ "references": [
19
+ {
20
+ "path": "../"
21
+ }
22
+ ]
23
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lscontests",
3
- "version": "1.6.1",
3
+ "version": "1.7.2",
4
4
  "description": "A tool to get information about the contests on each OJ",
5
5
  "keywords": [
6
6
  "cli",