@rhseung/ps-cli 1.6.0 → 1.7.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/dist/chunk-A6STXEAE.js +54 -0
- package/dist/{chunk-RVD22OUQ.js → chunk-TNGUME4H.js} +332 -11
- package/dist/commands/config.js +32 -2
- package/dist/commands/fetch.js +9 -8
- package/dist/commands/init.js +209 -117
- package/dist/commands/open.js +1 -1
- package/dist/commands/run.js +1 -1
- package/dist/commands/search.js +7 -7
- package/dist/commands/solve.js +42 -4
- package/dist/commands/stats.js +7 -7
- package/dist/commands/submit.js +1 -1
- package/dist/commands/test.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-NH36IFWR.js +0 -255
package/dist/chunk-NH36IFWR.js
DELETED
|
@@ -1,255 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
// src/utils/tier.ts
|
|
4
|
-
import gradient from "gradient-string";
|
|
5
|
-
var TIER_NAMES = [
|
|
6
|
-
void 0,
|
|
7
|
-
"Bronze V",
|
|
8
|
-
"Bronze IV",
|
|
9
|
-
"Bronze III",
|
|
10
|
-
"Bronze II",
|
|
11
|
-
"Bronze I",
|
|
12
|
-
"Silver V",
|
|
13
|
-
"Silver IV",
|
|
14
|
-
"Silver III",
|
|
15
|
-
"Silver II",
|
|
16
|
-
"Silver I",
|
|
17
|
-
"Gold V",
|
|
18
|
-
"Gold IV",
|
|
19
|
-
"Gold III",
|
|
20
|
-
"Gold II",
|
|
21
|
-
"Gold I",
|
|
22
|
-
"Platinum V",
|
|
23
|
-
"Platinum IV",
|
|
24
|
-
"Platinum III",
|
|
25
|
-
"Platinum II",
|
|
26
|
-
"Platinum I",
|
|
27
|
-
"Diamond V",
|
|
28
|
-
"Diamond IV",
|
|
29
|
-
"Diamond III",
|
|
30
|
-
"Diamond II",
|
|
31
|
-
"Diamond I",
|
|
32
|
-
"Ruby V",
|
|
33
|
-
"Ruby IV",
|
|
34
|
-
"Ruby III",
|
|
35
|
-
"Ruby II",
|
|
36
|
-
"Ruby I",
|
|
37
|
-
"Master"
|
|
38
|
-
];
|
|
39
|
-
var TIER_COLORS = [
|
|
40
|
-
void 0,
|
|
41
|
-
"#9d4900",
|
|
42
|
-
"#a54f00",
|
|
43
|
-
"#ad5600",
|
|
44
|
-
"#b55d0a",
|
|
45
|
-
"#c67739",
|
|
46
|
-
"#38546e",
|
|
47
|
-
"#3d5a74",
|
|
48
|
-
"#435f7a",
|
|
49
|
-
"#496580",
|
|
50
|
-
"#4e6a86",
|
|
51
|
-
"#d28500",
|
|
52
|
-
"#df8f00",
|
|
53
|
-
"#ec9a00",
|
|
54
|
-
"#f9a518",
|
|
55
|
-
"#ffb028",
|
|
56
|
-
"#00c78b",
|
|
57
|
-
"#00d497",
|
|
58
|
-
"#27e2a4",
|
|
59
|
-
"#3ef0b1",
|
|
60
|
-
"#51fdbd",
|
|
61
|
-
"#009ee5",
|
|
62
|
-
"#00a9f0",
|
|
63
|
-
"#00b4fc",
|
|
64
|
-
"#2bbfff",
|
|
65
|
-
"#41caff",
|
|
66
|
-
"#e0004c",
|
|
67
|
-
"#ea0053",
|
|
68
|
-
"#f5005a",
|
|
69
|
-
"#ff0062",
|
|
70
|
-
"#ff3071",
|
|
71
|
-
"#b300e0"
|
|
72
|
-
];
|
|
73
|
-
var TIER_IMAGE_BASE_URL = "https://d2gd6pc034wcta.cloudfront.net/tier";
|
|
74
|
-
var MASTER_TIER_GRADIENT = [
|
|
75
|
-
{ r: 255, g: 124, b: 168 },
|
|
76
|
-
{ r: 180, g: 145, b: 255 },
|
|
77
|
-
{ r: 124, g: 249, b: 255 }
|
|
78
|
-
];
|
|
79
|
-
var TIER_MIN_RATINGS = [
|
|
80
|
-
0,
|
|
81
|
-
// Unrated (tier 0): 0-29
|
|
82
|
-
30,
|
|
83
|
-
// Bronze V (tier 1)
|
|
84
|
-
60,
|
|
85
|
-
// Bronze IV (tier 2)
|
|
86
|
-
90,
|
|
87
|
-
// Bronze III (tier 3)
|
|
88
|
-
120,
|
|
89
|
-
// Bronze II (tier 4)
|
|
90
|
-
150,
|
|
91
|
-
// Bronze I (tier 5)
|
|
92
|
-
200,
|
|
93
|
-
// Silver V (tier 6)
|
|
94
|
-
300,
|
|
95
|
-
// Silver IV (tier 7)
|
|
96
|
-
400,
|
|
97
|
-
// Silver III (tier 8)
|
|
98
|
-
500,
|
|
99
|
-
// Silver II (tier 9)
|
|
100
|
-
650,
|
|
101
|
-
// Silver I (tier 10)
|
|
102
|
-
800,
|
|
103
|
-
// Gold V (tier 11)
|
|
104
|
-
950,
|
|
105
|
-
// Gold IV (tier 12)
|
|
106
|
-
1100,
|
|
107
|
-
// Gold III (tier 13)
|
|
108
|
-
1250,
|
|
109
|
-
// Gold II (tier 14)
|
|
110
|
-
1400,
|
|
111
|
-
// Gold I (tier 15)
|
|
112
|
-
1600,
|
|
113
|
-
// Platinum V (tier 16)
|
|
114
|
-
1750,
|
|
115
|
-
// Platinum IV (tier 17)
|
|
116
|
-
1900,
|
|
117
|
-
// Platinum III (tier 18)
|
|
118
|
-
2e3,
|
|
119
|
-
// Platinum II (tier 19)
|
|
120
|
-
2100,
|
|
121
|
-
// Platinum I (tier 20)
|
|
122
|
-
2200,
|
|
123
|
-
// Diamond V (tier 21)
|
|
124
|
-
2300,
|
|
125
|
-
// Diamond IV (tier 22)
|
|
126
|
-
2400,
|
|
127
|
-
// Diamond III (tier 23)
|
|
128
|
-
2500,
|
|
129
|
-
// Diamond II (tier 24)
|
|
130
|
-
2600,
|
|
131
|
-
// Diamond I (tier 25)
|
|
132
|
-
2700,
|
|
133
|
-
// Ruby V (tier 26)
|
|
134
|
-
2800,
|
|
135
|
-
// Ruby IV (tier 27)
|
|
136
|
-
2850,
|
|
137
|
-
// Ruby III (tier 28)
|
|
138
|
-
2900,
|
|
139
|
-
// Ruby II (tier 29)
|
|
140
|
-
2950,
|
|
141
|
-
// Ruby I (tier 30)
|
|
142
|
-
3e3
|
|
143
|
-
// Master (tier 31)
|
|
144
|
-
];
|
|
145
|
-
function getTierMinRating(tier) {
|
|
146
|
-
if (tier >= 0 && tier < TIER_MIN_RATINGS.length) {
|
|
147
|
-
return TIER_MIN_RATINGS[tier] ?? 0;
|
|
148
|
-
}
|
|
149
|
-
return 0;
|
|
150
|
-
}
|
|
151
|
-
function getNextTierMinRating(tier) {
|
|
152
|
-
if (tier === 31) {
|
|
153
|
-
return null;
|
|
154
|
-
}
|
|
155
|
-
if (tier >= 0 && tier < TIER_MIN_RATINGS.length - 1) {
|
|
156
|
-
return TIER_MIN_RATINGS[tier + 1] ?? null;
|
|
157
|
-
}
|
|
158
|
-
return null;
|
|
159
|
-
}
|
|
160
|
-
function calculateTierProgress(currentRating, tier) {
|
|
161
|
-
if (tier === 31) {
|
|
162
|
-
return 100;
|
|
163
|
-
}
|
|
164
|
-
const currentTierMin = getTierMinRating(tier);
|
|
165
|
-
const nextTierMin = getNextTierMinRating(tier);
|
|
166
|
-
if (nextTierMin === null) {
|
|
167
|
-
return 100;
|
|
168
|
-
}
|
|
169
|
-
if (currentRating < currentTierMin) {
|
|
170
|
-
return 0;
|
|
171
|
-
}
|
|
172
|
-
if (currentRating >= nextTierMin) {
|
|
173
|
-
return 100;
|
|
174
|
-
}
|
|
175
|
-
const progress = (currentRating - currentTierMin) / (nextTierMin - currentTierMin) * 100;
|
|
176
|
-
return Math.max(0, Math.min(100, progress));
|
|
177
|
-
}
|
|
178
|
-
function getTierName(level) {
|
|
179
|
-
if (level === 0) return "Unrated";
|
|
180
|
-
if (level >= 1 && level < TIER_NAMES.length) {
|
|
181
|
-
return TIER_NAMES[level] || "Unrated";
|
|
182
|
-
}
|
|
183
|
-
return "Unrated";
|
|
184
|
-
}
|
|
185
|
-
function getTierColor(level) {
|
|
186
|
-
if (level === 0) return "#2d2d2d";
|
|
187
|
-
if (level === 31) {
|
|
188
|
-
return gradient([...MASTER_TIER_GRADIENT]);
|
|
189
|
-
}
|
|
190
|
-
if (level >= 1 && level < TIER_COLORS.length) {
|
|
191
|
-
return TIER_COLORS[level] || "#2d2d2d";
|
|
192
|
-
}
|
|
193
|
-
return "#2d2d2d";
|
|
194
|
-
}
|
|
195
|
-
function getTierImageUrl(level) {
|
|
196
|
-
return `${TIER_IMAGE_BASE_URL}/${level}.svg`;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
// src/services/solved-api.ts
|
|
200
|
-
var BASE_URL = "https://solved.ac/api/v3";
|
|
201
|
-
var USER_AGENT = "ps-cli/1.0.0";
|
|
202
|
-
async function fetchWithRetry(url, options = {}, maxRetries = 3) {
|
|
203
|
-
let lastError = null;
|
|
204
|
-
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
205
|
-
try {
|
|
206
|
-
const response = await fetch(url, {
|
|
207
|
-
...options,
|
|
208
|
-
headers: {
|
|
209
|
-
"User-Agent": USER_AGENT,
|
|
210
|
-
...options.headers
|
|
211
|
-
}
|
|
212
|
-
});
|
|
213
|
-
if (response.status === 429) {
|
|
214
|
-
const retryAfter = response.headers.get("Retry-After");
|
|
215
|
-
const waitTime = retryAfter ? parseInt(retryAfter, 10) * 1e3 : (attempt + 1) * 1e3;
|
|
216
|
-
await new Promise((resolve) => setTimeout(resolve, waitTime));
|
|
217
|
-
continue;
|
|
218
|
-
}
|
|
219
|
-
if (!response.ok) {
|
|
220
|
-
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
221
|
-
}
|
|
222
|
-
return response;
|
|
223
|
-
} catch (error) {
|
|
224
|
-
lastError = error instanceof Error ? error : new Error(String(error));
|
|
225
|
-
if (attempt < maxRetries - 1) {
|
|
226
|
-
await new Promise(
|
|
227
|
-
(resolve) => setTimeout(resolve, (attempt + 1) * 1e3)
|
|
228
|
-
);
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
throw lastError || new Error("Request failed after retries");
|
|
233
|
-
}
|
|
234
|
-
async function getProblem(problemId) {
|
|
235
|
-
const url = `${BASE_URL}/problem/show?problemId=${problemId}`;
|
|
236
|
-
const response = await fetchWithRetry(url);
|
|
237
|
-
const data = await response.json();
|
|
238
|
-
return data;
|
|
239
|
-
}
|
|
240
|
-
async function getUserStats(handle) {
|
|
241
|
-
const url = `${BASE_URL}/user/show?handle=${handle}`;
|
|
242
|
-
const response = await fetchWithRetry(url);
|
|
243
|
-
const data = await response.json();
|
|
244
|
-
return data;
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
export {
|
|
248
|
-
getNextTierMinRating,
|
|
249
|
-
calculateTierProgress,
|
|
250
|
-
getTierName,
|
|
251
|
-
getTierColor,
|
|
252
|
-
getTierImageUrl,
|
|
253
|
-
getProblem,
|
|
254
|
-
getUserStats
|
|
255
|
-
};
|