lscontests 1.6.1 → 1.7.2

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
@@ -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",