koishi-plugin-warframe 1.4.0 → 1.4.4

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.
Files changed (3) hide show
  1. package/lib/index.d.ts +514 -100
  2. package/lib/index.js +2437 -1838
  3. package/package.json +12 -9
package/lib/index.js CHANGED
@@ -37,6 +37,9 @@ __export(index_exports, {
37
37
  module.exports = __toCommonJS(index_exports);
38
38
  var import_koishi = require("koishi");
39
39
 
40
+ // src/services/wfm-service.ts
41
+ var import_warframe_public_export_plus4 = require("warframe-public-export-plus");
42
+
40
43
  // src/utils/time.ts
41
44
  var toTimeStamp = /* @__PURE__ */ __name((timeStr) => {
42
45
  return new Date(timeStr).getTime();
@@ -57,21 +60,17 @@ var msToHumanReadable = /* @__PURE__ */ __name((ms) => {
57
60
  }, "msToHumanReadable");
58
61
 
59
62
  // src/utils/cache.ts
60
- function createAsyncCache(fetchFn, ttlMs) {
61
- let cache = null;
63
+ function createAsyncCache(factory, ttlMs = 6e4) {
64
+ let cache;
62
65
  let lastUpdatedAt = 0;
63
- let inFlight = null;
64
- async function get() {
65
- const now = Date.now();
66
- if (cache && now - lastUpdatedAt < ttlMs) {
67
- return cache;
68
- }
66
+ let inFlight;
67
+ async function update() {
69
68
  if (inFlight) {
70
69
  return inFlight;
71
70
  }
72
71
  inFlight = (async () => {
73
72
  try {
74
- const result = await fetchFn();
73
+ const result = await factory();
75
74
  cache = result;
76
75
  lastUpdatedAt = Date.now();
77
76
  return cache;
@@ -81,8 +80,16 @@ function createAsyncCache(fetchFn, ttlMs) {
81
80
  })();
82
81
  return inFlight;
83
82
  }
83
+ __name(update, "update");
84
+ async function get() {
85
+ const now = Date.now();
86
+ if (cache && (ttlMs < 0 || now - lastUpdatedAt < ttlMs)) {
87
+ return cache;
88
+ }
89
+ return await update();
90
+ }
84
91
  __name(get, "get");
85
- return { get };
92
+ return { get, update };
86
93
  }
87
94
  __name(createAsyncCache, "createAsyncCache");
88
95
 
@@ -93,7 +100,23 @@ var fullWidthToHalfWidth = /* @__PURE__ */ __name((text) => text.replace(/[\uFF0
93
100
  }).replace(/\u3000/g, " "), "fullWidthToHalfWidth");
94
101
  var removeSpace = /* @__PURE__ */ __name((text) => text.replace(/\s/g, ""), "removeSpace");
95
102
  var pascalToSpaced = /* @__PURE__ */ __name((text) => text.replace(/([A-Z])/g, " $1").trim(), "pascalToSpaced");
96
- var toPascalCase = /* @__PURE__ */ __name((text) => text.toLowerCase().split(/[^a-zA-Z0-9]+/).filter(Boolean).map((word) => word[0].toUpperCase() + word.slice(1)).join(""), "toPascalCase");
103
+ var toPascalCase = /* @__PURE__ */ __name((text) => {
104
+ const tokens = text.match(/[A-Z]+[a-z]*|[a-z]+|\s+|[^A-Za-z\s]+/g);
105
+ if (!tokens) {
106
+ return text;
107
+ }
108
+ return tokens.map((token) => {
109
+ if (/^\s+$/.test(token)) return "";
110
+ if (/^[A-Za-z]+$/.test(token)) {
111
+ if (/^[A-Z]+$/.test(token) || token.length === 1) {
112
+ return token.charAt(0).toUpperCase() + token.slice(1).toLowerCase();
113
+ }
114
+ const lower = token.toLowerCase();
115
+ return lower[0].toUpperCase() + lower.slice(1);
116
+ }
117
+ return token;
118
+ }).join("");
119
+ }, "toPascalCase");
97
120
  function normalSimilarity(a, b) {
98
121
  const distance = levenshtein(a, b);
99
122
  return 1 - distance / Math.max(a.length, b.length);
@@ -140,8 +163,13 @@ var fetchAsyncText = /* @__PURE__ */ __name(async (url, method = "GET") => {
140
163
  try {
141
164
  return await response.text();
142
165
  } catch (error) {
143
- console.log("Error: " + error.message);
144
- return null;
166
+ if (error instanceof Error) {
167
+ console.log(error.message);
168
+ console.log(error.stack);
169
+ } else {
170
+ console.log("未知错误", error);
171
+ }
172
+ return void 0;
145
173
  }
146
174
  }, "fetchAsyncText");
147
175
  var fetchAsyncData = /* @__PURE__ */ __name(async (url, method = "GET") => {
@@ -158,8 +186,13 @@ var fetchAsyncData = /* @__PURE__ */ __name(async (url, method = "GET") => {
158
186
  try {
159
187
  return await response.json();
160
188
  } catch (error) {
161
- console.log("Error: " + error.message);
162
- return null;
189
+ if (error instanceof Error) {
190
+ console.log(error.message);
191
+ console.log(error.stack);
192
+ } else {
193
+ console.log("未知错误", error);
194
+ }
195
+ return void 0;
163
196
  }
164
197
  }, "fetchAsyncData");
165
198
  var fetchAsyncImage = /* @__PURE__ */ __name(async (url, method = "GET") => {
@@ -176,8 +209,13 @@ var fetchAsyncImage = /* @__PURE__ */ __name(async (url, method = "GET") => {
176
209
  try {
177
210
  return await response.blob();
178
211
  } catch (error) {
179
- console.log("Error: " + error.message);
180
- return null;
212
+ if (error instanceof Error) {
213
+ console.log(error.message);
214
+ console.log(error.stack);
215
+ } else {
216
+ console.log("未知错误", error);
217
+ }
218
+ return void 0;
181
219
  }
182
220
  }, "fetchAsyncImage");
183
221
 
@@ -223,11 +261,21 @@ var import_warframe_public_export_plus2 = require("warframe-public-export-plus")
223
261
  // src/utils/wf-export-adapter.ts
224
262
  var import_warframe_public_export_plus = require("warframe-public-export-plus");
225
263
  var regionToShort = /* @__PURE__ */ __name((region, dict) => {
264
+ let faction;
265
+ if (region.faction) {
266
+ const name2 = import_warframe_public_export_plus.ExportFactions[region.faction].name;
267
+ if (name2) {
268
+ faction = dict[name2];
269
+ }
270
+ }
271
+ if (!faction) {
272
+ faction = region.faction;
273
+ }
226
274
  return {
227
275
  name: dict[region.name],
228
276
  system: dict[region.systemName],
229
277
  type: dict[region.missionName],
230
- faction: dict[import_warframe_public_export_plus.ExportFactions[region.faction].name],
278
+ faction,
231
279
  maxLevel: region.maxEnemyLevel,
232
280
  minLevel: region.minEnemyLevel
233
281
  };
@@ -245,9 +293,85 @@ var relicToFullNameZH = /* @__PURE__ */ __name((tier, category) => {
245
293
  return `${import_warframe_public_export_plus2.dict_zh[relicEraToTransKey(tier)] ?? toPascalCase(tier)} ${category} 遗物`;
246
294
  }, "relicToFullNameZH");
247
295
 
296
+ // src/utils/ocr.ts
297
+ var extractTextFromImage = /* @__PURE__ */ __name(async (image, secret) => {
298
+ if (image instanceof Blob) {
299
+ const buffer = await image.arrayBuffer();
300
+ image = Buffer.from(buffer).toString("base64");
301
+ }
302
+ const tencentcloud = require("tencentcloud-sdk-nodejs-ocr");
303
+ const ocrClient = tencentcloud.ocr.v20181119.Client;
304
+ const clientConfig = {
305
+ credential: {
306
+ secretId: secret.id,
307
+ secretKey: secret.key
308
+ },
309
+ region: "",
310
+ profile: {
311
+ httpProfile: {
312
+ endpoint: "ocr.tencentcloudapi.com"
313
+ }
314
+ }
315
+ };
316
+ const client = new ocrClient(clientConfig);
317
+ try {
318
+ const result = await client.GeneralAccurateOCR({
319
+ ImageBase64: image
320
+ });
321
+ return result.TextDetections?.map((t) => t.DetectedText).filter(
322
+ (v) => !!v
323
+ );
324
+ } catch (err) {
325
+ console.error("error", err);
326
+ return void 0;
327
+ }
328
+ }, "extractTextFromImage");
329
+
330
+ // src/utils/output.tsx
331
+ var import_path = __toESM(require("path"));
332
+ var import_url = require("url");
333
+ var import_fs = require("fs");
334
+ var import_meta = {};
335
+ var htmlString = (() => {
336
+ const __fileName = (0, import_url.fileURLToPath)(import_meta.url);
337
+ const __dirname = import_path.default.dirname(__fileName);
338
+ const stylePath = import_path.default.join(__dirname, "output.css");
339
+ const style = (0, import_fs.readFileSync)(stylePath, "utf8");
340
+ const svgPath = import_path.default.join(__dirname, "output.svg");
341
+ const svg = (0, import_fs.readFileSync)(svgPath, "utf8");
342
+ const template = `
343
+ <!DOCTYPE html>
344
+ <html>
345
+ <head>
346
+ <meta charset="UTF-8" />
347
+ <title>{{title}}</title>
348
+ <style>{{style}}</style>
349
+ </head>
350
+ <body>
351
+ <div style="display: none;">{{svg}}</div>
352
+ <div id="root">{{htmlString}}</div>
353
+ </body>
354
+ </html>`;
355
+ return (htmlString2, title = "title") => {
356
+ return template.replace("{{htmlString}}", htmlString2).replace("{{title}}", title).replace("{{style}}", style).replace("{{svg}}", svg);
357
+ };
358
+ })();
359
+ var generateImageOutput = /* @__PURE__ */ __name(async (puppe, element) => {
360
+ if (!puppe) {
361
+ return "本功能需要启用 koishi-plugin-puppeteer 插件";
362
+ }
363
+ return await puppe.render(
364
+ htmlString(element.toString()),
365
+ async (page, next) => {
366
+ const handle = await page.$("#root>*");
367
+ return await next(handle ?? void 0);
368
+ }
369
+ );
370
+ }, "generateImageOutput");
371
+
248
372
  // src/utils/wfcd-adapter.ts
249
373
  var import_warframe_public_export_plus3 = require("warframe-public-export-plus");
250
- var solNodesEnDict = null;
374
+ var solNodesEnDict;
251
375
  var getSolNodeKey = /* @__PURE__ */ __name(async (name2) => {
252
376
  const worldstateData = await import("warframe-worldstate-data");
253
377
  if (!solNodesEnDict) {
@@ -257,7 +381,7 @@ var getSolNodeKey = /* @__PURE__ */ __name(async (name2) => {
257
381
  }
258
382
  return solNodesEnDict[name2];
259
383
  }, "getSolNodeKey");
260
- var missionTypeEnDict = null;
384
+ var missionTypeEnDict;
261
385
  var getMissionTypeKey = /* @__PURE__ */ __name(async (name2) => {
262
386
  const worldstateData = await import("warframe-worldstate-data");
263
387
  if (!missionTypeEnDict) {
@@ -333,416 +457,138 @@ var getVoidTraderItemName = /* @__PURE__ */ __name((sourceKey) => {
333
457
  }
334
458
  }, "getVoidTraderItemName");
335
459
 
336
- // src/api/wfm-api.ts
460
+ // src/infrastructure/wfm/wfm-api.ts
337
461
  var wfmApiV1Base = "https://api.warframe.market/v1/";
338
462
  var wfmApiV2Base = "https://api.warframe.market/v2/";
339
463
  var getWFMItemList = /* @__PURE__ */ __name(async () => {
340
- return await fetchAsyncData(`${wfmApiV2Base}items`);
464
+ const response = await fetchAsyncData(
465
+ `${wfmApiV2Base}items`
466
+ );
467
+ return response?.data;
341
468
  }, "getWFMItemList");
342
469
  var getWFMOrderList = /* @__PURE__ */ __name(async (itemId) => {
343
- return await fetchAsyncData(
470
+ const response = await fetchAsyncData(
344
471
  `${wfmApiV2Base}orders/item/${itemId}`
345
472
  );
473
+ return response?.data;
346
474
  }, "getWFMOrderList");
347
475
  var getWFMRivenItemList = /* @__PURE__ */ __name(async () => {
348
- return await fetchAsyncData(
476
+ const response = await fetchAsyncData(
349
477
  `${wfmApiV2Base}riven/weapons`
350
478
  );
479
+ return response?.data;
351
480
  }, "getWFMRivenItemList");
352
481
  var getWFMRivenOrderList = /* @__PURE__ */ __name(async (itemId) => {
353
- return await fetchAsyncData(
482
+ const response = await fetchAsyncData(
354
483
  `${wfmApiV1Base}auctions/search?type=riven&sort_by=price_asc&weapon_url_name=${itemId}`
355
484
  );
485
+ return response?.payload.auctions;
356
486
  }, "getWFMRivenOrderList");
357
487
  var getWFMRivenAttributeList = /* @__PURE__ */ __name(async () => {
358
- return await fetchAsyncData(
488
+ const response = await fetchAsyncData(
359
489
  `${wfmApiV2Base}riven/attributes`
360
490
  );
491
+ return response?.data;
361
492
  }, "getWFMRivenAttributeList");
362
493
  var getWFMDucatnator = /* @__PURE__ */ __name(async () => {
363
- return await fetchAsyncData(`${wfmApiV1Base}tools/ducats`);
494
+ const response = await fetchAsyncData(`${wfmApiV1Base}tools/ducats`);
495
+ if (!response || !response.payload) {
496
+ return void 0;
497
+ }
498
+ const day = response.payload.previous_day.map((e) => {
499
+ return e;
500
+ });
501
+ const hour = response.payload.previous_hour.map((e) => {
502
+ return e;
503
+ });
504
+ return {
505
+ day,
506
+ hour
507
+ };
364
508
  }, "getWFMDucatnator");
365
509
 
366
- // src/components/wfm.tsx
367
- var import_jsx_runtime = require("@satorijs/element/jsx-runtime");
368
- var getHtmlString = /* @__PURE__ */ __name((body, title) => {
369
- return `<!DOCTYPE html>
370
- <html>
371
- <head>
372
- <meta charset="UTF-8">
373
- <title>${title}</title>
374
- <style>
375
- :root {
376
- --color_success_text: #4d8200;
377
- --color_success_border: #4d8200;
378
- --color_rgb_success_text: 77 130 0;
379
- --color_rgb_success_border: 77 130 0;
380
- --color_auction_participant: #1c8a62;
381
- --color_auction_sell: #909090;
382
- --color_auction_own: mediumpurple;
383
- --color_auction_archiving: gray;
384
- --color_rgb_auction_archiving: 128 128 128;
385
- --color_dark_background--light: #11262b;
386
- --color_dark_border--ligth: #283235;
387
- --color_dark_background: #171e21;
388
- --color_dark_border: #283235;
389
- --color_dark_background--darker: #071013;
390
- --color_dark_border--darker: #171e21;
391
- --color_rgb_dark_background--light: 17 38 43;
392
- --color_rgb_dark_border--ligth: 40 50 53;
393
- --color_rgb_dark_background: 23 30 33;
394
- --color_rgb_dark_border: 40 50 53;
395
- --color_rgb_dark_background--darker: 7 16 19;
396
- --color_rgb_dark_border--darker: 23 30 33;
397
- --color_place_order: #b53600;
398
- --color_place_order--hover: #e64400;
399
- --color_place_order--active: #ff8f00;
400
- --color_place_order_text: #f5f5f5;
401
- --color_create_auction: #8960db;
402
- --color_create_auction_text: #f5f5f5;
403
- --color_create_auction--hover: #b08cff;
404
- --color_create_auction--active: #9d92ff;
405
- --color_input_inner_shadow: 0 0 0;
406
- --color_input_text--highlight: #19a187;
407
- --color_attribute_text: white;
408
- --color_attribute_background_first: #19a187;
409
- --color_attribute_background_second: #358576;
410
- --color_attribute_background_third: #516965;
411
- --color_attribute_background_negative: #98392d;
412
- --color_rgb_attribute_background_first: 25 161 135;
413
- --color_rgb_attribute_background_second: 53 133 118;
414
- --color_rgb_attribute_background_third: 81 105 101;
415
- --color_rgb_attribute_background_negative: 152 57 45;
416
- --color_link_dimmed: #408698;
417
- --color_link_dimmed--hover: #a3dddb;
418
- --color_link_dimmed--active: #acb8dd;
419
- --color_rgb_link_dimmed: 64 134 152;
420
- --color_rgb_link_dimmed--hover: 163 221 219;
421
- --color_rgb_link_dimmed--active: 172 184 221;
422
- --color_dark_md_code_background: black;
423
- --color_dark_md_code_text: #39a57e;
424
- --color_rgb_dark_md_code_background: 0 0 0;
425
- --color_status-offline: darkred;
426
- --color_highlight: #b53600;
427
- --color_highlight_text: #f5f5f5;
428
- --color_tooltip_background: #1b2432;
429
- --color_tooltip_border: black;
430
- --color_tooltip_text: #aab3b6;
431
- --color_rgb_tooltip_background: 27 36 50;
432
- --color_text_svg: red;
433
- --color_dark_text: #aab3b6;
434
- --color_dark_h1: #fcfdfd;
435
- --color_dark_h2: #e1e4e5;
436
- --color_dark_h3: #c5ccce;
437
- --color_dark_disclaimer: #333d40
438
- }
439
-
440
- body {
441
- font-family: Arial, sans-serif; padding:
442
- 20px;
443
- }
444
-
445
- * {
446
- margin: 0;
447
- padding: 0;
510
+ // src/data/wfm/globalItem.ts
511
+ var globalItemDataFactory = /* @__PURE__ */ __name(async (response) => {
512
+ response ??= await getWFMItemList();
513
+ if (!response) {
514
+ return void 0;
515
+ }
516
+ const data = response;
517
+ const globalItemList = response;
518
+ const globalItemDict = listToDict(
519
+ data,
520
+ (i) => [i.slug]
521
+ );
522
+ const globalItemNameToSlugDict = ((list) => {
523
+ const result = {};
524
+ for (const item of list) {
525
+ if (item.i18n["zh-hans"]?.name) {
526
+ result[normalizeName(item.i18n["zh-hans"].name)] = item.slug;
448
527
  }
449
-
450
- ul {
451
- list-style: none;
528
+ if (item.i18n["en"]?.name) {
529
+ result[normalizeName(item.i18n["en"].name)] = item.slug;
452
530
  }
453
- </style>
454
- </head>
455
- <body>
456
- <svg style="display:none;" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"><defs><symbol viewBox="0 0 19.736 20.883" id="icon-amber"><path d="M15.163 9.37c-3.622-4.486-4.755-6.107-5.312-6.107-.557 0-1.656 1.621-5.278 6.107.116 2.831 1.424 2.328 5.295 7.062 3.871-4.734 5.179-4.231 5.295-7.062zm-8.26.491c1.296-1.39 2.254-4.473 2.965-4.448.711-.025 1.67 3.058 2.966 4.448-.493 1.425-1.72 2.611-2.966 4.06-1.246-1.449-2.473-2.635-2.965-4.06zm-1.787 7.416C3.03 17.449 0 12.89 0 11.335c0-2.573 4.116-6.501 4.499-7.782l.11-2.16C5.854.397 7.632.1 9.87 0c2.235.099 4.014.396 5.258 1.394l.11 2.159c.383 1.28 4.5 5.209 4.5 7.782 0 1.555-3.085 5.942-5.117 5.942-.86 1.214-3.277 3.606-4.752 3.606-1.474 0-3.892-2.392-4.752-3.606z"/></symbol><symbol viewBox="0 0 320 512" id="icon-angle-up"><path d="m177 159.7 136 136c9.4 9.4 9.4 24.6 0 33.9l-22.6 22.6c-9.4 9.4-24.6 9.4-33.9 0L160 255.9l-96.4 96.4c-9.4 9.4-24.6 9.4-33.9 0L7 329.7c-9.4-9.4-9.4-24.6 0-33.9l136-136c9.4-9.5 24.6-9.5 34-.1z"/></symbol><symbol viewBox="0 0 512 512" id="icon-archive"><path d="M32 448c0 17.7 14.3 32 32 32h384c17.7 0 32-14.3 32-32V160H32v288zm160-212c0-6.6 5.4-12 12-12h104c6.6 0 12 5.4 12 12v8c0 6.6-5.4 12-12 12H204c-6.6 0-12-5.4-12-12v-8zM480 32H32C14.3 32 0 46.3 0 64v48c0 8.8 7.2 16 16 16h480c8.8 0 16-7.2 16-16V64c0-17.7-14.3-32-32-32z"/></symbol><symbol viewBox="-10 0 468 512" id="icon-arrow-link"><path fill="currentColor" d="M280 80q-22-2-24-24 2-22 24-24h144q22 2 24 24v144q-2 22-24 24-22-2-24-24v-86L200 312q-16 15-33 0-14-16 0-33L366 80h-86zM0 120q1-24 16-40 16-15 40-16h112q22 2 24 24-2 22-24 24H56q-7 1-8 8v304q1 7 8 8h304q7-1 8-8V312q2-22 24-24 22 2 24 24v112q-1 24-16 40-16 15-40 16H56q-24-1-40-16-15-16-16-40V120z"/></symbol><symbol viewBox="0 0 512 512" id="icon-arrows-alt-h"><path d="M377.941 169.941V216H134.059v-46.059c0-21.382-25.851-32.09-40.971-16.971L7.029 239.029c-9.373 9.373-9.373 24.568 0 33.941l86.059 86.059c15.119 15.119 40.971 4.411 40.971-16.971V296h243.882v46.059c0 21.382 25.851 32.09 40.971 16.971l86.059-86.059c9.373-9.373 9.373-24.568 0-33.941l-86.059-86.059c-15.119-15.12-40.971-4.412-40.971 16.97z"/></symbol><symbol viewBox="0 0 1000 1000" id="icon-auction"><path d="m324.4 138.5 250 144.3c19.8 11.4 45 4.6 56.3-15.1 11.4-19.7 4.7-45-15.1-56.3l-250-144.3c-19.8-11.4-45-4.6-56.3 15.1s-4.6 44.8 15.1 56.3zm229.4 180-250-144.3-144.3 250 250 144.3 144.3-250zM97.6 531.3l250 144.3c19.7 11.4 45 4.6 56.3-15.1 11.3-19.7 4.6-45-15.1-56.3L138.8 460c-19.8-11.4-45-4.6-56.3 15.1-11.5 19.6-4.7 44.9 15.1 56.2zm861.5 116.4L502.3 407.8 461 479.3l436.2 275.6c29.6 17.1 67.4 7 84.5-22.6 17.1-29.7 6.9-67.5-22.6-84.6zM506.3 856c0-22.8-18.5-41.2-41.2-41.2H93.8c-22.8 0-41.2 18.4-41.2 41.2v41.2l-42.6-.9 1.4 42.1h536.1l1.9-39.5-40.6-1.7c.1 0-2.5-18.5-2.5-41.2z"/></symbol><symbol viewBox="0 0 400 423" id="icon-averagePrice"><path d="m162.531 374.211-.905-319.596 70.517-.147 1.118 319.744z" fill="#ff5a69"/></symbol><symbol viewBox="0 0 384 512" id="icon-award"><path d="M97.12 362.63c-8.69-8.69-4.16-6.24-25.12-11.85-9.51-2.55-17.87-7.45-25.43-13.32L1.2 448.7c-4.39 10.77 3.81 22.47 15.43 22.03l52.69-2.01L105.56 507c8 8.44 22.04 5.81 26.43-4.96l52.05-127.62c-10.84 6.04-22.87 9.58-35.31 9.58-19.5 0-37.82-7.59-51.61-21.37zM382.8 448.7l-45.37-111.24c-7.56 5.88-15.92 10.77-25.43 13.32-21.07 5.64-16.45 3.18-25.12 11.85-13.79 13.78-32.12 21.37-51.62 21.37-12.44 0-24.47-3.55-35.31-9.58L252 502.04c4.39 10.77 18.44 13.4 26.43 4.96l36.25-38.28 52.69 2.01c11.62.44 19.82-11.27 15.43-22.03zM263 340c15.28-15.55 17.03-14.21 38.79-20.14 13.89-3.79 24.75-14.84 28.47-28.98 7.48-28.4 5.54-24.97 25.95-45.75 10.17-10.35 14.14-25.44 10.42-39.58-7.47-28.38-7.48-24.42 0-52.83 3.72-14.14-.25-29.23-10.42-39.58-20.41-20.78-18.47-17.36-25.95-45.75-3.72-14.14-14.58-25.19-28.47-28.98-27.88-7.61-24.52-5.62-44.95-26.41-10.17-10.35-25-14.4-38.89-10.61-27.87 7.6-23.98 7.61-51.9 0-13.89-3.79-28.72.25-38.89 10.61-20.41 20.78-17.05 18.8-44.94 26.41-13.89 3.79-24.75 14.84-28.47 28.98-7.47 28.39-5.54 24.97-25.95 45.75-10.17 10.35-14.15 25.44-10.42 39.58 7.47 28.36 7.48 24.4 0 52.82-3.72 14.14.25 29.23 10.42 39.59 20.41 20.78 18.47 17.35 25.95 45.75 3.72 14.14 14.58 25.19 28.47 28.98C104.6 325.96 106.27 325 121 340c13.23 13.47 33.84 15.88 49.74 5.82a39.676 39.676 0 0 1 42.53 0c15.89 10.06 36.5 7.65 49.73-5.82zM97.66 175.96c0-53.03 42.24-96.02 94.34-96.02s94.34 42.99 94.34 96.02-42.24 96.02-94.34 96.02-94.34-42.99-94.34-96.02z"/></symbol><symbol viewBox="0 0 640 512" id="icon-backspace"><path d="M576 64H205.26A63.97 63.97 0 0 0 160 82.75L9.37 233.37c-12.5 12.5-12.5 32.76 0 45.25L160 429.25c12 12 28.28 18.75 45.25 18.75H576c35.35 0 64-28.65 64-64V128c0-35.35-28.65-64-64-64zm-84.69 254.06c6.25 6.25 6.25 16.38 0 22.63l-22.62 22.62c-6.25 6.25-16.38 6.25-22.63 0L384 301.25l-62.06 62.06c-6.25 6.25-16.38 6.25-22.63 0l-22.62-22.62c-6.25-6.25-6.25-16.38 0-22.63L338.75 256l-62.06-62.06c-6.25-6.25-6.25-16.38 0-22.63l22.62-22.62c6.25-6.25 16.38-6.25 22.63 0L384 210.75l62.06-62.06c6.25-6.25 16.38-6.25 22.63 0l22.62 22.62c6.25 6.25 6.25 16.38 0 22.63L429.25 256l62.06 62.06z"/></symbol><symbol viewBox="0 0 512 512" id="icon-ban"><path d="M256 8C119.034 8 8 119.033 8 256s111.034 248 248 248 248-111.034 248-248S392.967 8 256 8zm130.108 117.892c65.448 65.448 70 165.481 20.677 235.637L150.47 105.216c70.204-49.356 170.226-44.735 235.638 20.676zM125.892 386.108c-65.448-65.448-70-165.481-20.677-235.637L361.53 406.784c-70.203 49.356-170.226 44.736-235.638-20.676z"/></symbol><symbol viewBox="0 0 448 512" id="icon-bars"><path d="M16 132h416c8.837 0 16-7.163 16-16V76c0-8.837-7.163-16-16-16H16C7.163 60 0 67.163 0 76v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16z"/></symbol><symbol viewBox="0 0 544 1423" id="icon-candlePrice"><g fill="green"><path d="m141.618 209.102 2.33 804.884 266.39.894-6.224-806.124c-58.188 2.227-202.884-.42-262.496.346z"/><path d="m243.855 250.785-1.697-236.057 63.435-.335.369 236.664zm.917 985.162.013-230.11 64.04-1.797.382 232.173z"/></g></symbol><symbol viewBox="0 0 320 512" id="icon-caret-down"><path d="M31.3 192h257.3c17.8 0 26.7 21.5 14.1 34.1L174.1 354.8c-7.8 7.8-20.5 7.8-28.3 0L17.2 226.1C4.6 213.5 13.5 192 31.3 192z"/></symbol><symbol viewBox="0 0 192 512" id="icon-caret-left"><path d="M192 127.338v257.324c0 17.818-21.543 26.741-34.142 14.142L29.196 270.142c-7.81-7.81-7.81-20.474 0-28.284l128.662-128.662c12.599-12.6 34.142-3.676 34.142 14.142z"/></symbol><symbol viewBox="0 0 512 512" id="icon-chart-area"><path d="M500 384c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12H12c-6.6 0-12-5.4-12-12V76c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v308h436zM372.7 159.5 288 216l-85.3-113.7c-5.1-6.8-15.5-6.3-19.9 1L96 248v104h384l-89.9-187.8c-3.2-6.5-11.4-8.7-17.4-4.7z"/></symbol><symbol viewBox="0 0 512 512" id="icon-check"><path d="m173.898 439.404-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z"/></symbol><symbol viewBox="0 0 512 512" id="icon-check-circle"><path d="M256 48a208 208 0 1 1 0 416 208 208 0 1 1 0-416zm0 464a256 256 0 1 0 0-512 256 256 0 1 0 0 512zm113-303c9.4-9.4 9.4-24.6 0-33.9s-24.6-9.4-33.9 0l-111 111-47-47c-9.4-9.4-24.6-9.4-33.9 0s-9.4 24.6 0 33.9l64 64c9.4 9.4 24.6 9.4 33.9 0L369 209z"/></symbol><symbol viewBox="0 0 448 512" id="icon-chevron-down"><path d="M207.029 381.476 12.686 187.132c-9.373-9.373-9.373-24.569 0-33.941l22.667-22.667c9.357-9.357 24.522-9.375 33.901-.04L224 284.505l154.745-154.021c9.379-9.335 24.544-9.317 33.901.04l22.667 22.667c9.373 9.373 9.373 24.569 0 33.941L240.971 381.476c-9.373 9.372-24.569 9.372-33.942 0z"/></symbol><symbol viewBox="0 0 320 512" id="icon-chevron-left"><path d="M34.52 239.03 228.87 44.69c9.37-9.37 24.57-9.37 33.94 0l22.67 22.67c9.36 9.36 9.37 24.52.04 33.9L131.49 256l154.02 154.75c9.34 9.38 9.32 24.54-.04 33.9l-22.67 22.67c-9.37 9.37-24.57 9.37-33.94 0L34.52 272.97c-9.37-9.37-9.37-24.57 0-33.94z"/></symbol><symbol viewBox="0 0 448 512" id="icon-chevron-up"><path d="m240.971 130.524 194.343 194.343c9.373 9.373 9.373 24.569 0 33.941l-22.667 22.667c-9.357 9.357-24.522 9.375-33.901.04L224 227.495 69.255 381.516c-9.379 9.335-24.544 9.317-33.901-.04l-22.667-22.667c-9.373-9.373-9.373-24.569 0-33.941L207.03 130.525c9.372-9.373 24.568-9.373 33.941-.001z"/></symbol><symbol viewBox="0 0 512 512" id="icon-circle"><path d="M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8z"/></symbol><symbol viewBox="0 0 512 512" id="icon-circle-check"><path d="M256 512a256 256 0 1 0 0-512 256 256 0 1 0 0 512zm113-303L241 337c-9.4 9.4-24.6 9.4-33.9 0l-64-64c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l47 47L335 175c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9z"/></symbol><symbol viewBox="0 0 512 512" id="icon-circle-notch"><path d="M288 39.056v16.659c0 10.804 7.281 20.159 17.686 23.066C383.204 100.434 440 171.518 440 256c0 101.689-82.295 184-184 184-101.689 0-184-82.295-184-184 0-84.47 56.786-155.564 134.312-177.219C216.719 75.874 224 66.517 224 55.712V39.064c0-15.709-14.834-27.153-30.046-23.234C86.603 43.482 7.394 141.206 8.003 257.332c.72 137.052 111.477 246.956 248.531 246.667C393.255 503.711 504 392.788 504 256c0-115.633-79.14-212.779-186.211-240.236C302.678 11.889 288 23.456 288 39.056z"/></symbol><symbol viewBox="0 0 640 512" id="icon-cogs"><path d="m512.1 191-8.2 14.3c-3 5.3-9.4 7.5-15.1 5.4-11.8-4.4-22.6-10.7-32.1-18.6-4.6-3.8-5.8-10.5-2.8-15.7l8.2-14.3c-6.9-8-12.3-17.3-15.9-27.4h-16.5c-6 0-11.2-4.3-12.2-10.3-2-12-2.1-24.6 0-37.1 1-6 6.2-10.4 12.2-10.4h16.5c3.6-10.1 9-19.4 15.9-27.4l-8.2-14.3c-3-5.2-1.9-11.9 2.8-15.7 9.5-7.9 20.4-14.2 32.1-18.6 5.7-2.1 12.1.1 15.1 5.4l8.2 14.3c10.5-1.9 21.2-1.9 31.7 0L552 6.3c3-5.3 9.4-7.5 15.1-5.4 11.8 4.4 22.6 10.7 32.1 18.6 4.6 3.8 5.8 10.5 2.8 15.7l-8.2 14.3c6.9 8 12.3 17.3 15.9 27.4h16.5c6 0 11.2 4.3 12.2 10.3 2 12 2.1 24.6 0 37.1-1 6-6.2 10.4-12.2 10.4h-16.5c-3.6 10.1-9 19.4-15.9 27.4l8.2 14.3c3 5.2 1.9 11.9-2.8 15.7-9.5 7.9-20.4 14.2-32.1 18.6-5.7 2.1-12.1-.1-15.1-5.4l-8.2-14.3c-10.4 1.9-21.2 1.9-31.7 0zm-10.5-58.8c38.5 29.6 82.4-14.3 52.8-52.8-38.5-29.7-82.4 14.3-52.8 52.8zM386.3 286.1l33.7 16.8c10.1 5.8 14.5 18.1 10.5 29.1-8.9 24.2-26.4 46.4-42.6 65.8-7.4 8.9-20.2 11.1-30.3 5.3l-29.1-16.8c-16 13.7-34.6 24.6-54.9 31.7v33.6c0 11.6-8.3 21.6-19.7 23.6-24.6 4.2-50.4 4.4-75.9 0-11.5-2-20-11.9-20-23.6V418c-20.3-7.2-38.9-18-54.9-31.7L74 403c-10 5.8-22.9 3.6-30.3-5.3-16.2-19.4-33.3-41.6-42.2-65.7-4-10.9.4-23.2 10.5-29.1l33.3-16.8c-3.9-20.9-3.9-42.4 0-63.4L12 205.8c-10.1-5.8-14.6-18.1-10.5-29 8.9-24.2 26-46.4 42.2-65.8 7.4-8.9 20.2-11.1 30.3-5.3l29.1 16.8c16-13.7 34.6-24.6 54.9-31.7V57.1c0-11.5 8.2-21.5 19.6-23.5 24.6-4.2 50.5-4.4 76-.1 11.5 2 20 11.9 20 23.6v33.6c20.3 7.2 38.9 18 54.9 31.7l29.1-16.8c10-5.8 22.9-3.6 30.3 5.3 16.2 19.4 33.2 41.6 42.1 65.8 4 10.9.1 23.2-10 29.1l-33.7 16.8c3.9 21 3.9 42.5 0 63.5zm-117.6 21.1c59.2-77-28.7-164.9-105.7-105.7-59.2 77 28.7 164.9 105.7 105.7zm243.4 182.7-8.2 14.3c-3 5.3-9.4 7.5-15.1 5.4-11.8-4.4-22.6-10.7-32.1-18.6-4.6-3.8-5.8-10.5-2.8-15.7l8.2-14.3c-6.9-8-12.3-17.3-15.9-27.4h-16.5c-6 0-11.2-4.3-12.2-10.3-2-12-2.1-24.6 0-37.1 1-6 6.2-10.4 12.2-10.4h16.5c3.6-10.1 9-19.4 15.9-27.4l-8.2-14.3c-3-5.2-1.9-11.9 2.8-15.7 9.5-7.9 20.4-14.2 32.1-18.6 5.7-2.1 12.1.1 15.1 5.4l8.2 14.3c10.5-1.9 21.2-1.9 31.7 0l8.2-14.3c3-5.3 9.4-7.5 15.1-5.4 11.8 4.4 22.6 10.7 32.1 18.6 4.6 3.8 5.8 10.5 2.8 15.7l-8.2 14.3c6.9 8 12.3 17.3 15.9 27.4h16.5c6 0 11.2 4.3 12.2 10.3 2 12 2.1 24.6 0 37.1-1 6-6.2 10.4-12.2 10.4h-16.5c-3.6 10.1-9 19.4-15.9 27.4l8.2 14.3c3 5.2 1.9 11.9-2.8 15.7-9.5 7.9-20.4 14.2-32.1 18.6-5.7 2.1-12.1-.1-15.1-5.4l-8.2-14.3c-10.4 1.9-21.2 1.9-31.7 0zM501.6 431c38.5 29.6 82.4-14.3 52.8-52.8-38.5-29.6-82.4 14.3-52.8 52.8z"/></symbol><symbol viewBox="0 0 576 512" id="icon-comments"><path d="M416 192c0-88.4-93.1-160-208-160S0 103.6 0 192c0 34.3 14.1 65.9 38 92-13.4 30.2-35.5 54.2-35.8 54.5-2.2 2.3-2.8 5.7-1.5 8.7S4.8 352 8 352c36.6 0 66.9-12.3 88.7-25 32.2 15.7 70.3 25 111.3 25 114.9 0 208-71.6 208-160zm122 220c23.9-26 38-57.7 38-92 0-66.9-53.5-124.2-129.3-148.1.9 6.6 1.3 13.3 1.3 20.1 0 105.9-107.7 192-240 192-10.8 0-21.3-.8-31.7-1.9C207.8 439.6 281.8 480 368 480c41 0 79.1-9.2 111.3-25 21.8 12.7 52.1 25 88.7 25 3.2 0 6.1-1.9 7.3-4.8 1.3-2.9.7-6.3-1.5-8.7-.3-.3-22.4-24.2-35.8-54.5z"/></symbol><symbol viewBox="0 0 640 512" id="icon-contract"><path d="m519.2 127.9-47.6-47.6A56.252 56.252 0 0 0 432 64H205.2c-14.8 0-29.1 5.9-39.6 16.3L118 127.9H0v255.7h64c17.6 0 31.8-14.2 31.9-31.7h9.1l84.6 76.4c30.9 25.1 73.8 25.7 105.6 3.8 12.5 10.8 26 15.9 41.1 15.9 18.2 0 35.3-7.4 48.8-24 22.1 8.7 48.2 2.6 64-16.8l26.2-32.3c5.6-6.9 9.1-14.8 10.9-23h57.9c.1 17.5 14.4 31.7 31.9 31.7h64V127.9H519.2zM48 351.6c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16c0 8.9-7.2 16-16 16zm390-6.9-26.1 32.2c-2.8 3.4-7.8 4-11.3 1.2l-23.9-19.4-30 36.5c-6 7.3-15 4.8-18 2.4l-36.8-31.5-15.6 19.2c-13.9 17.1-39.2 19.7-55.3 6.6l-97.3-88H96V175.8h41.9l61.7-61.6c2-.8 3.7-1.5 5.7-2.3H262l-38.7 35.5c-29.4 26.9-31.1 72.3-4.4 101.3 14.8 16.2 61.2 41.2 101.5 4.4l8.2-7.5 108.2 87.8c3.4 2.8 3.9 7.9 1.2 11.3zm106-40.8h-69.2c-2.3-2.8-4.9-5.4-7.7-7.7l-102.7-83.4 12.5-11.4c6.5-6 7-16.1 1-22.6L367 167.1c-6-6.5-16.1-6.9-22.6-1l-55.2 50.6c-9.5 8.7-25.7 9.4-34.6 0-9.3-9.9-8.5-25.1 1.2-33.9l65.6-60.1c7.4-6.8 17-10.5 27-10.5l83.7-.2c2.1 0 4.1.8 5.5 2.3l61.7 61.6H544v128zm48 47.7c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16c0 8.9-7.2 16-16 16z"/></symbol><symbol viewBox="0 0 24 24" id="icon-crossplay"><path d="M10.762 3.098c-1.124.118-2.38.62-3.623 1.449C5.972 5.32 4.9 6.28 3.01 8.255c-1.364 1.42-1.598 1.701-1.86 2.25-.277.58-.361 1.003-.37 1.762 0 .361.013.68.032.699.019.023.712-.638 1.533-1.458l1.5-1.5v1.828L2.32 13.359.797 14.883l.01 1.256.013 1.252 3.985-3.966c2.193-2.18 4.153-4.097 4.36-4.26.735-.577 1.424-.93 2.165-1.107.567-.136 1.383-.108 1.865.06 1.557.554 2.663 1.913 2.817 3.465.02.178.043.323.061.323.014 0 .32-.29.675-.647l.643-.642v-.262c0-.572-.3-1.35-.76-1.974-.75-1.017-2.151-1.86-3.6-2.175-.614-.131-1.617-.112-2.208.042-1.5.394-2.63 1.163-4.434 3.024l-.712.736-.005-.919V8.17l.375-.45C7.12 6.436 8.634 5.4 10.03 5.002c.746-.216 1.29-.282 2.147-.258a7.312 7.312 0 0 1 3.211.815c1.425.718 2.658 1.932 3.22 3.178.211.465.253.375.22-.496-.023-.816-.107-1.172-.412-1.805-.736-1.533-2.54-2.78-4.612-3.197a11.417 11.417 0 0 0-3.043-.14Z"/><path d="M19.148 10.575c-2.189 2.18-4.153 4.097-4.359 4.26-.736.577-1.425.93-2.166 1.107-.567.136-1.382.108-1.865-.06-1.556-.554-2.663-1.913-2.817-3.465-.02-.178-.043-.323-.061-.323-.014 0-.32.29-.675.647l-.643.642v.262c0 .572.3 1.35.76 1.974.75 1.017 2.151 1.86 3.6 2.175.614.131 1.617.112 2.208-.042 1.5-.394 2.63-1.163 4.434-3.024l.713-.736.004.919v.919l-.375.45c-1.073 1.284-2.587 2.32-3.984 2.718-.745.216-1.29.282-2.147.258a7.31 7.31 0 0 1-3.21-.815c-1.426-.718-2.659-1.932-3.221-3.178-.211-.465-.253-.376-.22.496.023.816.107 1.172.412 1.805.614 1.275 1.992 2.386 3.652 2.94 1.673.557 3.839.594 5.371.093.563-.183 1.618-.713 2.246-1.134 1.18-.788 2.245-1.744 4.139-3.718 1.364-1.42 1.598-1.701 1.86-2.25.277-.58.362-1.003.371-1.762 0-.361-.014-.68-.033-.699-.019-.023-.712.638-1.533 1.458l-1.5 1.5v-1.828l1.524-1.523 1.523-1.524-.01-1.256-.013-1.252Z"/></symbol><symbol viewBox="0 0 24 24" id="icon-crossplay-warn"><g clip-path="url(#icon-crossplay-warn_a)"><path d="M10.762 3.098c-1.124.118-2.38.62-3.623 1.449C5.972 5.32 4.9 6.28 3.01 8.255c-1.364 1.42-1.598 1.701-1.86 2.25-.277.58-.361 1.003-.37 1.762 0 .361.013.68.032.699.019.023.712-.638 1.533-1.458l1.5-1.5v1.828L2.32 13.359.797 14.883l.01 1.256.013 1.252 3.985-3.966c2.193-2.18 4.153-4.097 4.36-4.26.735-.577 1.424-.93 2.165-1.107.567-.136 1.383-.108 1.865.06 1.557.554 2.663 1.913 2.817 3.465.02.178.043.323.061.323.014 0 .32-.29.675-.647l.643-.642v-.262c0-.572-.3-1.35-.76-1.974-.75-1.017-2.151-1.86-3.6-2.175-.614-.131-1.617-.112-2.208.042-1.5.394-2.63 1.163-4.434 3.024l-.712.736-.005-.919V8.17l.375-.45C7.12 6.436 8.634 5.4 10.03 5.002c.746-.216 1.29-.282 2.147-.258a7.312 7.312 0 0 1 3.211.815c1.425.718 2.658 1.932 3.22 3.178.211.465.253.375.22-.496-.023-.816-.107-1.172-.412-1.805-.736-1.533-2.54-2.78-4.612-3.197a11.417 11.417 0 0 0-3.043-.14Z"/><path d="M19.148 10.575c-2.189 2.18-4.153 4.097-4.359 4.26-.736.577-1.425.93-2.166 1.107-.567.136-1.382.108-1.865-.06-1.556-.554-2.663-1.913-2.817-3.465-.02-.178-.043-.323-.061-.323-.014 0-.32.29-.675.647l-.643.642v.262c0 .572.3 1.35.76 1.974.75 1.017 2.151 1.86 3.6 2.175.614.131 1.617.112 2.208-.042 1.5-.394 2.63-1.163 4.434-3.024l.713-.736.004.919v.919l-.375.45c-1.073 1.284-2.587 2.32-3.984 2.718-.745.216-1.29.282-2.147.258a7.31 7.31 0 0 1-3.21-.815c-1.426-.718-2.659-1.932-3.221-3.178-.211-.465-.253-.376-.22.496.023.816.107 1.172.412 1.805.614 1.275 1.992 2.386 3.652 2.94 1.673.557 3.839.594 5.371.093.563-.183 1.618-.713 2.246-1.134 1.18-.788 2.245-1.744 4.139-3.718 1.364-1.42 1.598-1.701 1.86-2.25.277-.58.362-1.003.371-1.762 0-.361-.014-.68-.033-.699-.019-.023-.712.638-1.533 1.458l-1.5 1.5v-1.828l1.524-1.523 1.523-1.524-.01-1.256-.013-1.252Z"/><path d="M18.741 12.996a.868.868 0 0 0-.313-.323.836.836 0 0 0-.856 0 .868.868 0 0 0-.313.323l-5.185 9.075c-.345.605.07 1.374.742 1.374h10.368c.672 0 1.087-.77.741-1.374z" fill="#fff"/><path d="M18.741 12.996a.868.868 0 0 0-.313-.323.836.836 0 0 0-.856 0 .868.868 0 0 0-.313.323l-5.185 9.075c-.345.605.07 1.374.742 1.374h10.368c.672 0 1.087-.77.741-1.374zM18 15.667c.404 0 .721.36.68.774l-.264 2.728a.434.434 0 0 1-.134.28.411.411 0 0 1-.565 0 .434.434 0 0 1-.133-.28l-.265-2.728a.723.723 0 0 1 .174-.542.685.685 0 0 1 .507-.232zm0 4.667c.2 0 .393.082.535.228a.79.79 0 0 1 .221.55c0 .206-.08.404-.221.55a.746.746 0 0 1-.535.227.746.746 0 0 1-.535-.227.789.789 0 0 1-.22-.55.79.79 0 0 1 .22-.55.746.746 0 0 1 .535-.228z" fill="#a52f31"/></g><defs/></symbol><clipPath id="icon-crossplay-warn_a"><path fill="#fff" d="M0 0h24v24H0z"/></clipPath><symbol viewBox="0 0 512 512" id="icon-cubes"><path d="M488.6 250.2 392 214V105.5c0-15-9.3-28.4-23.4-33.7l-100-37.5c-8.1-3.1-17.1-3.1-25.3 0l-100 37.5c-14.1 5.3-23.4 18.7-23.4 33.7V214l-96.6 36.2C9.3 255.5 0 268.9 0 283.9V394c0 13.6 7.7 26.1 19.9 32.2l100 50c10.1 5.1 22.1 5.1 32.2 0l103.9-52 103.9 52c10.1 5.1 22.1 5.1 32.2 0l100-50c12.2-6.1 19.9-18.6 19.9-32.2V283.9c0-15-9.3-28.4-23.4-33.7zM358 214.8l-85 31.9v-68.2l85-37v73.3zM154 104.1l102-38.2 102 38.2v.6l-102 41.4-102-41.4v-.6zm84 291.1-85 42.5v-79.1l85-38.8v75.4zm0-112-102 41.4-102-41.4v-.6l102-38.2 102 38.2v.6zm240 112-85 42.5v-79.1l85-38.8v75.4zm0-112-102 41.4-102-41.4v-.6l102-38.2 102 38.2v.6z"/></symbol><symbol viewBox="0 0 14.021 15.329" id="icon-cyan"><path d="M14.021 7.959c-.972-1.693-3.793-4.185-3.204-6.465L6.972 0 3.124 1.493C3.714 3.773.972 6.266 0 7.959c1.194 4.657 4.173 6.192 6.973 7.37 2.8-1.178 5.855-2.713 7.048-7.37zM3.127 7.783s1.898-4.066 3.848-5.095c1.95 1.029 3.92 5.095 3.92 5.095-1.4 2.758-3.922 3.62-3.922 3.62s-2.448-.862-3.846-3.62zm6.397-.067A10.821 10.821 0 0 0 6.98 4.397c-1.086.968-1.853 2.053-2.483 3.32.686.98 1.492 1.724 2.48 2.282a7.647 7.647 0 0 0 2.547-2.283z"/></symbol><symbol viewBox="0 0 940 940" id="icon-cycle-icon"><path d="M469.594.813c-132.135.23-258.059 56.12-346.873 153.955-31.762-19.523-64.48-37.499-96.83-56.034l29.308 229.293 210.975-88.775-89.528-50.959A407.135 407.135 0 0 1 469.594 63.271 407.135 407.135 0 1 1 62.459 470.406l.02-.406H.014l-.014.406a469.593 469.593 0 1 0 939.188 0A469.593 469.593 0 0 0 469.594.812z"/></symbol><symbol viewBox="-10 0 522 512" id="icon-dice"><path d="M20 317q-4 0-4-4V151q0-4 4-5 1 0 2 1l77 45-76 122q-1 4-3 3zm211 88L23 383q-7-1-7-8 0-2 1-4l106-156 108 190zM31 420q0-3 4-4h1l203 22v66q0 7-7 8-2 0-3-1L34 424q-2-2-3-4zm325-213L256 383 156 207h200zm120 208q4 1 4 4 0 2-2 4l-195 87q-1 1-3 1-7 0-8-8v-66l204-22zm19-44q1 2 1 4 0 7-7 8l-208 22 108-190 106 156zm-4-224q4 0 4 4v162q0 4-4 4-2 0-3-2l-76-122 77-45 2-1z" fill="currentColor"/><path d="M196.54 20.512q-1-8-8-8-2 0-4 1l-151 98q-2 2-3 4 0 2 2 3l83 49 79-143q2-2 2-4zm58-19q-7 0-13 8l-95 167h218l-95-168q-5-7-15-7zm224 114q0-2-2-4l-151-98q-2-1-4-1-7 0-8 8 0 2 2 4l80 143 81-49q3-1 2-3z" fill="currentColor" fill-opacity=".75"/></symbol><symbol viewBox="0 0 71 71" id="icon-discord"><path d="M60.105 12.928a58.55 58.55 0 0 0-14.452-4.483.22.22 0 0 0-.233.11 40.784 40.784 0 0 0-1.8 3.697c-5.456-.817-10.886-.817-16.23 0-.485-1.164-1.201-2.587-1.828-3.697a.228.228 0 0 0-.233-.11 58.386 58.386 0 0 0-14.451 4.483.207.207 0 0 0-.095.082C1.578 26.76-.944 40.174.293 53.42a.244.244 0 0 0 .093.167c6.073 4.46 11.955 7.167 17.729 8.962a.23.23 0 0 0 .249-.082 42.08 42.08 0 0 0 3.627-5.9.225.225 0 0 0-.123-.312 38.772 38.772 0 0 1-5.539-2.64.228.228 0 0 1-.022-.378 31.17 31.17 0 0 0 1.1-.862.22.22 0 0 1 .23-.03c11.619 5.304 24.198 5.304 35.68 0a.219.219 0 0 1 .233.027c.356.293.728.586 1.103.865a.228.228 0 0 1-.02.378 36.384 36.384 0 0 1-5.54 2.637.227.227 0 0 0-.121.315 47.249 47.249 0 0 0 3.624 5.897.225.225 0 0 0 .249.084c5.801-1.794 11.684-4.502 17.757-8.96a.228.228 0 0 0 .092-.165c1.48-15.315-2.48-28.618-10.497-40.412a.18.18 0 0 0-.093-.084zm-36.38 32.427c-3.497 0-6.38-3.21-6.38-7.156 0-3.944 2.827-7.156 6.38-7.156 3.583 0 6.438 3.24 6.382 7.156 0 3.945-2.827 7.156-6.381 7.156zm23.593 0c-3.498 0-6.38-3.21-6.38-7.156 0-3.944 2.826-7.156 6.38-7.156 3.582 0 6.437 3.24 6.38 7.156 0 3.945-2.798 7.156-6.38 7.156z"/></symbol><symbol viewBox="0 0 503 523" id="icon-dochPrice"><defs/><path d="m62.572 63.274 2.965-.822-.41 1.084z" opacity=".85" fill="#171e21" fill-opacity=".01" stroke="#171ed9" stroke-width=".008" transform="matrix(30.54912 0 0 33.4782 -1979.787 -2198.975)"/><path d="m66.514 78.982-.005-11.15 13.099.005.01 11.14z" opacity=".15" fill="#265663" stroke="url(#icon-dochPrice_b)" stroke-width=".014" stroke-opacity=".01" transform="matrix(30.54912 0 0 33.4782 -1979.787 -2198.975)"/><path d="M79.374 75.524c.01-.704.018-1.313.023-1.836.026-2.575-.002-3.08-.002-2.657 0 .554.006 2.608-.021 4.493zm-12.64.199c.01-.704.018-1.312.023-1.836.026-2.574-.002-3.079-.002-2.656 0 .553.006 2.608-.021 4.492zm-.063-7.661c.772.01 1.44.016 2.013.02 2.821.025 3.374 0 2.91-.001-.606 0-2.858.005-4.923-.02zm7.699-.064c.772.01 1.44.016 2.013.021 2.821.024 3.374-.002 2.91-.002-.606 0-2.858.005-4.922-.02zm.086 10.781c.772.01 1.439.016 2.012.02 2.822.025 3.375 0 2.911-.001-.606 0-2.858.005-4.923-.02zm-7.752.034c.772.01 1.44.016 2.013.021 2.821.024 3.374-.002 2.91-.002-.606 0-2.858.006-4.923-.02z" opacity=".259" fill="#4d4d4d" fill-opacity=".988" stroke="#171e21" stroke-width=".345" transform="matrix(30.54912 0 0 33.4782 -1979.787 -2198.975)"/></symbol><linearGradient osb:paint="solid" id="icon-dochPrice_a"><stop offset="0" stop-color="#171e21"/></linearGradient><linearGradient gradientTransform="translate(1.708 2.148)" y2="71.258" x2="77.916" y1="71.258" x1="64.794" gradientUnits="userSpaceOnUse" id="icon-dochPrice_b" xlink:href="#icon-dochPrice_a"/><symbol viewBox="0 0 512 512" id="icon-dot-circle"><path d="M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm80 248c0 44.112-35.888 80-80 80s-80-35.888-80-80 35.888-80 80-80 80 35.888 80 80z"/></symbol><symbol viewBox="0 0 18.231 22.384" id="icon-ducats"><path d="m7.986.006-.275.363H4.737l2.606 4.189-.008 13.603 1.762 3.268 1.762-3.268-.008-13.603L13.457.369h-2.973l-.276-.363H7.986zM4.805 1.522c-.887.528-1.917 1.425-2.571 2.225l2.232 1.138c.4-.42 1.149-.981 1.646-1.277L4.805 1.522zm8.584 0-1.307 2.086c.497.296 1.246.856 1.646 1.277l2.232-1.138c-.654-.8-1.684-1.697-2.57-2.225zM.542 3.497l2.5 4.46v9.41l2.353.378.017-11.763-4.87-2.485zm17.11 0-4.87 2.485.017 11.763 2.353-.379v-9.41l2.5-4.459zM1.057 5.52C.598 6.61.346 8.06.346 9.321c0 2.25.812 4.303 2.15 5.877l.02-7.08L1.057 5.52zm16.08 0-1.459 2.597.02 7.081a9.046 9.046 0 0 0 2.15-5.877c0-1.26-.252-2.712-.711-3.8zm-11.23 8.93v3.103c.274.167.575.323.909.454V14.45c-.312.01-.696-.008-.91 0zm5.472 0v3.557a5.94 5.94 0 0 0 .91-.454v-3.104c-.215-.008-.599.01-.91 0zM3.04 18.006 5.396 22.4v-4.026l-2.356-.368zm12.114 0-2.355.368V22.4l2.355-4.394z" paint-order="markers stroke fill"/></symbol><symbol viewBox="0 0 576 512" id="icon-edit"><path d="m402.3 344.9 32-32c5-5 13.7-1.5 13.7 5.7V464c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h273.5c7.1 0 10.7 8.6 5.7 13.7l-32 32c-1.5 1.5-3.5 2.3-5.7 2.3H48v352h352V350.5c0-2.1.8-4.1 2.3-5.6zm156.6-201.8L296.3 405.7l-90.4 10c-26.2 2.9-48.5-19.2-45.6-45.6l10-90.4L432.9 17.1c22.9-22.9 59.9-22.9 82.7 0l43.2 43.2c22.9 22.9 22.9 60 .1 82.8zM460.1 174 402 115.9 216.2 301.8l-7.3 65.3 65.3-7.3L460.1 174zm64.8-79.7-43.2-43.2c-4.1-4.1-10.8-4.1-14.8 0L436 82l58.1 58.1 30.9-30.9c4-4.2 4-10.8-.1-14.9z"/></symbol><symbol viewBox="0 0 512 512" id="icon-ellipsis-h"><path d="M328 256c0 39.8-32.2 72-72 72s-72-32.2-72-72 32.2-72 72-72 72 32.2 72 72zm104-72c-39.8 0-72 32.2-72 72s32.2 72 72 72 72-32.2 72-72-32.2-72-72-72zm-352 0c-39.8 0-72 32.2-72 72s32.2 72 72 72 72-32.2 72-72-32.2-72-72-72z"/></symbol><symbol viewBox="0 0 256 251.342" id="icon-endo"><path style="display:inline;opacity:1;fill-opacity:1;stroke:none;stroke-width:.785732;stroke-dasharray:none;stroke-opacity:1" d="M127.322 0C65.442.142 13.79 45.301 7.982 106.908l3.266-2.563 18.698-2.582c8.011-47.544 49.162-80.406 97.376-80.442h1.356c48.214.036 89.365 32.898 97.376 80.442l18.698 2.582 3.265 2.563C242.21 45.301 190.557.142 128.678 0Zm-.035 47.06c-32.405.03-60.827 21.633-69.53 52.847l.023-.003v3.347h14.186v-5.306l17.076-2.676c11.52-12.664 18.687-20.448 38.959-20.53 20.271.082 27.436 7.866 38.957 20.53l17.076 2.676v5.306h14.186v-3.347l.023.003c-8.703-31.214-37.125-52.817-69.53-52.846ZM128 84.513c-18.59.058-28.32 13.998-28.32 13.998l14.377.104-14.374 8.299H75.715l-37.213.01-24.361 3.365L0 121.395l26.828 11.82 70.13 3.585a35.294 35.294 0 0 0 12.581 13.113l6.143 69.327L128 251.342l12.317-32.102 6.143-69.327a35.295 35.295 0 0 0 12.581-13.113l70.13-3.585L256 121.395l-14.14-11.107-24.362-3.365-37.213-.01h-23.969l-14.373-8.299 14.376-.104s-9.729-13.94-28.318-13.998zm0 19.427c8.8.082 15.913 7.226 15.914 16.045 0 8.82-7.115 15.963-15.914 16.046-8.8-.083-15.915-7.227-15.915-16.046 0-8.819 7.115-15.963 15.915-16.045zM25.496 117.625h16.915c4.634.004 4.634 6.484 0 6.484H25.496c-4.634 0-4.634-6.484 0-6.484zm31.445 0h5.376c4.635.004 4.635 6.487 0 6.484h-5.376c-4.635-.004-4.635-6.488 0-6.484zm19.972 0h5.377c4.634.004 4.634 6.487 0 6.484h-5.377c-4.635-.004-4.635-6.488 0-6.484zm96.797 0h5.377c4.634-.004 4.634 6.48 0 6.484h-5.377c-4.635.004-4.635-6.48 0-6.484zm19.973 0h5.378c4.635-.004 4.635 6.48 0 6.484h-5.378c-4.635.004-4.635-6.48 0-6.484zm19.906 0h16.915c4.634 0 4.634 6.484 0 6.484h-16.915c-4.634 0-4.634-6.48 0-6.484zm-116.761.026h5.376c4.635.004 4.635 6.487 0 6.484h-5.376c-4.635-.004-4.635-6.488 0-6.484zm56.968 0h5.376c4.635-.004 4.635 6.48 0 6.484h-5.376c-4.635.004-4.635-6.48 0-6.484zM7.808 132.014c4.531 59.23 52.241 103.835 111.479 108.229l-9.88-20.952-9.918-21.851-7.229.14-6.56 6.127 17.64 25.85-21.698-22.127c-26.292-13.768-45.539-35.888-51.267-66.031l-1.433-.074zm240.384 0-21.134 9.311-1.433.074c-5.728 30.143-24.975 52.263-51.267 66.03l-21.698 22.128 17.64-25.85-6.56-6.126-7.23-.141-9.917 21.85-9.88 20.953c59.237-4.395 106.948-48.998 111.479-108.23zm-190.283 6.823c6.87 23.077 27.875 47.583 50.865 54.739l-2.3-25.03c-11.001-5.613-22.351-17.148-27.256-28.484Zm140.182 0-21.309 1.225c-4.905 11.336-16.255 22.871-27.257 28.485l-2.3 25.029c22.991-7.156 43.997-31.662 50.866-54.74zm-76.686 20.178H134.595s-.313 3.032-1.503 4.052c-1.189 1.02-5.091 1.022-5.091 1.022s-3.904-.002-5.093-1.022c-1.19-1.02-1.503-4.052-1.503-4.052zm-.037 19.701h13.264s.287 5.746-1.126 7.473c-1.413 1.726-5.505 1.992-5.505 1.992s-4.094-.266-5.507-1.992c-1.413-1.727-1.126-7.473-1.126-7.473zm.118 24.293H134.514s-.644 5.267-1.933 6.897c-1.267 1.602-4.467 2.517-4.58 2.55-.114-.033-3.315-.948-4.582-2.55-1.289-1.63-1.933-6.897-1.933-6.897z"/><path style="display:inline;opacity:.75;stroke-width:.799524" d="m99.685 98.435-23.498 3.417.049 5.238 23.452-.006 14.504-8.542zm56.63 0-14.507.107 14.504 8.542 23.454.006.047-5.238zm-76.94 43.87c3.308 10.97 13.424 22.62 24.495 26.022l-1.108-11.899c-5.298-2.668-10.763-8.153-13.125-13.542zm97.25 0-10.262.581c-2.362 5.39-7.827 10.874-13.125 13.542l-1.106 11.9c11.07-3.402 21.185-15.053 24.492-26.024zM85.7 203.706l-4.06 3.723 21.699 22.127zm84.598 0-17.639 25.85 21.698-22.127z"/></symbol><symbol viewBox="0 0 512 512" id="icon-envelope"><path d="M502.3 190.8c3.9-3.1 9.7-.2 9.7 4.7V400c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V195.6c0-5 5.7-7.8 9.7-4.7 22.4 17.4 52.1 39.5 154.1 113.6 21.1 15.4 56.7 47.8 92.2 47.6 35.7.3 72-32.8 92.3-47.6 102-74.1 131.6-96.3 154-113.7zM256 320c23.2.4 56.6-29.2 73.4-41.4 132.7-96.3 142.8-104.7 173.4-128.7 5.8-4.5 9.2-11.5 9.2-18.9v-19c0-26.5-21.5-48-48-48H48C21.5 64 0 85.5 0 112v19c0 7.4 3.4 14.3 9.2 18.9 30.6 23.9 40.7 32.4 173.4 128.7 16.8 12.2 50.2 41.8 73.4 41.4z"/></symbol><symbol viewBox="0 0 512 512" id="icon-exchange-alt"><path d="M0 168v-16c0-13.255 10.745-24 24-24h360V80c0-21.367 25.899-32.042 40.971-16.971l80 80c9.372 9.373 9.372 24.569 0 33.941l-80 80C409.956 271.982 384 261.456 384 240v-48H24c-13.255 0-24-10.745-24-24zm488 152H128v-48c0-21.314-25.862-32.08-40.971-16.971l-80 80c-9.372 9.373-9.372 24.569 0 33.941l80 80C102.057 463.997 128 453.437 128 432v-48h360c13.255 0 24-10.745 24-24v-16c0-13.255-10.745-24-24-24z"/></symbol><symbol viewBox="0 0 576 512" id="icon-eye"><path d="M569.354 231.631C512.97 135.949 407.81 72 288 72 168.14 72 63.004 135.994 6.646 231.631a47.999 47.999 0 0 0 0 48.739C63.031 376.051 168.19 440 288 440c119.86 0 224.996-63.994 281.354-159.631a47.997 47.997 0 0 0 0-48.738zM288 392c-102.556 0-192.091-54.701-240-136 44.157-74.933 123.677-127.27 216.162-135.007C273.958 131.078 280 144.83 280 160c0 30.928-25.072 56-56 56s-56-25.072-56-56l.001-.042C157.794 179.043 152 200.844 152 224c0 75.111 60.889 136 136 136s136-60.889 136-136c0-31.031-10.4-59.629-27.895-82.515C451.704 164.638 498.009 205.106 528 256c-47.908 81.299-137.444 136-240 136z"/></symbol><symbol viewBox="0 0 576 512" id="icon-eye-slash"><path d="M272.702 359.139c-80.483-9.011-136.212-86.886-116.93-167.042l116.93 167.042zM288 392c-102.556 0-192.092-54.701-240-136 21.755-36.917 52.1-68.342 88.344-91.658l-27.541-39.343C67.001 152.234 31.921 188.741 6.646 231.631a47.999 47.999 0 0 0 0 48.739C63.004 376.006 168.14 440 288 440a332.89 332.89 0 0 0 39.648-2.367l-32.021-45.744A284.16 284.16 0 0 1 288 392zm281.354-111.631c-33.232 56.394-83.421 101.742-143.554 129.492l48.116 68.74c3.801 5.429 2.48 12.912-2.949 16.712L450.23 509.83c-5.429 3.801-12.912 2.48-16.712-2.949L102.084 33.399c-3.801-5.429-2.48-12.912 2.949-16.712L125.77 2.17c5.429-3.801 12.912-2.48 16.712 2.949l55.526 79.325C226.612 76.343 256.808 72 288 72c119.86 0 224.996 63.994 281.354 159.631a48.002 48.002 0 0 1 0 48.738zM528 256c-44.157-74.933-123.677-127.27-216.162-135.007C302.042 131.078 296 144.83 296 160c0 30.928 25.072 56 56 56s56-25.072 56-56l-.001-.042c30.632 57.277 16.739 130.26-36.928 171.719l26.695 38.135C452.626 346.551 498.308 306.386 528 256z"/></symbol><symbol viewBox="0 0 512 512" id="icon-filter2"><path d="M24 64h336c10 0 19 6 22 15 4 9 2 19-5 26L256 226v198c0 10-6 19-15 22-9 4-19 2-26-5l-80-80c-4-4-7-10-7-17V226L7 105c-7-7-9-17-5-26s12-15 22-15Zm145 135c5 5 7 11 7 17v118l32 32V216c0-6 3-12 7-17l87-87H82ZM472 64h48c13 0 24 11 24 24s-11 24-24 24h-48c-13 0-24-11-24-24s11-24 24-24zM344 232h176c13 0 24 11 24 24s-11 24-24 24H344c-13 0-24-11-24-24s11-24 24-24zm0 168h176c13 0 24 11 24 24s-11 24-24 24H344c-13 0-24-11-24-24s11-24 24-24z"/></symbol><symbol viewBox="0 0 448 512" id="icon-fire-alt"><path fill="currentColor" d="M323.56 51.2c-20.8 19.3-39.58 39.59-56.22 59.97C240.08 73.62 206.28 35.53 168 0 69.74 91.17 0 209.96 0 281.6 0 408.85 100.29 512 224 512s224-103.15 224-230.4c0-53.27-51.98-163.14-124.44-230.4zm-19.47 340.65C282.43 407.01 255.72 416 226.86 416 154.71 416 96 368.26 96 290.75c0-38.61 24.31-72.63 72.79-130.75 6.93 7.98 98.83 125.34 98.83 125.34l58.63-66.88c4.14 6.85 7.91 13.55 11.27 19.97 27.35 52.19 15.81 118.97-33.43 153.42z"/></symbol><symbol viewBox="0 0 496 512" id="icon-frown"><path d="M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-216c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160-64c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm-80 128c-40.2 0-78 17.7-103.8 48.6-8.5 10.2-7.1 25.3 3.1 33.8 10.2 8.4 25.3 7.1 33.8-3.1 16.6-19.9 41-31.4 66.9-31.4s50.3 11.4 66.9 31.4c8.1 9.7 23.1 11.9 33.8 3.1 10.2-8.5 11.5-23.6 3.1-33.8C326 321.7 288.2 304 248 304z"/></symbol><symbol viewBox="0 0 1024 1024" id="icon-github"><path d="M512 13.028C229.345 13.028.407 241.966.407 524.62c0 226.38 146.443 417.588 349.802 485.374 25.58 4.476 35.172-10.871 35.172-24.3 0-12.151-.64-52.439-.64-95.285-128.538 23.661-161.791-31.335-172.023-60.112-5.755-14.708-30.696-60.112-52.438-72.263-17.906-9.592-43.486-33.253-.64-33.893 40.288-.64 69.065 37.09 78.658 52.439 46.043 77.378 119.585 55.635 149.001 42.206 4.477-33.254 17.906-55.636 32.614-68.426-113.83-12.79-232.775-56.914-232.775-252.599 0-55.635 19.825-101.679 52.439-137.49-5.116-12.79-23.022-65.229 5.116-135.573 0 0 42.845-13.429 140.688 52.439 40.927-11.511 84.413-17.267 127.898-17.267s86.97 5.756 127.898 17.267c97.842-66.507 140.688-52.439 140.688-52.439 28.138 70.344 10.232 122.783 5.116 135.573 32.614 35.811 52.439 81.215 52.439 137.49 0 196.324-119.585 239.81-233.415 252.6 18.545 15.987 34.533 46.682 34.533 94.644 0 68.426-.64 123.422-.64 140.688 0 13.43 9.593 29.417 35.172 24.301 202.08-67.786 348.523-259.634 348.523-485.374 0-282.655-228.938-511.593-511.593-511.593z"/></symbol><symbol viewBox="0 0 384 512" id="icon-hourglass-half"><path d="M360 0H24C10.745 0 0 10.745 0 24v16c0 13.255 10.745 24 24 24 0 90.965 51.016 167.734 120.842 192C75.016 280.266 24 357.035 24 448c-13.255 0-24 10.745-24 24v16c0 13.255 10.745 24 24 24h336c13.255 0 24-10.745 24-24v-16c0-13.255-10.745-24-24-24 0-90.965-51.016-167.734-120.842-192C308.984 231.734 360 154.965 360 64c13.255 0 24-10.745 24-24V24c0-13.255-10.745-24-24-24zm-75.078 384H99.08c17.059-46.797 52.096-80 92.92-80 40.821 0 75.862 33.196 92.922 80zm.019-256H99.078C91.988 108.548 88 86.748 88 64h208c0 22.805-3.987 44.587-11.059 64z"/></symbol><symbol viewBox="0 0 640 512" id="icon-infinity"><path d="M471.1 96C405 96 353.3 137.3 320 174.6 286.7 137.3 235 96 168.9 96 75.8 96 0 167.8 0 256s75.8 160 168.9 160c66.1 0 117.8-41.3 151.1-78.6 33.3 37.3 85 78.6 151.1 78.6 93.1 0 168.9-71.8 168.9-160S564.2 96 471.1 96zM168.9 320c-40.2 0-72.9-28.7-72.9-64s32.7-64 72.9-64c38.2 0 73.4 36.1 94 64-20.4 27.6-55.9 64-94 64zm302.2 0c-38.2 0-73.4-36.1-94-64 20.4-27.6 55.9-64 94-64 40.2 0 72.9 28.7 72.9 64s-32.7 64-72.9 64z"/></symbol><symbol viewBox="0 0 512 512" id="icon-info"><path d="M256 40c118.621 0 216 96.075 216 216 0 119.291-96.61 216-216 216-119.244 0-216-96.562-216-216 0-119.203 96.602-216 216-216m0-32C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm-36 344h12V232h-12c-6.627 0-12-5.373-12-12v-8c0-6.627 5.373-12 12-12h48c6.627 0 12 5.373 12 12v140h12c6.627 0 12 5.373 12 12v8c0 6.627-5.373 12-12 12h-72c-6.627 0-12-5.373-12-12v-8c0-6.627 5.373-12 12-12zm36-240c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32z"/></symbol><symbol viewBox="0 0 512 512" id="icon-link"><path d="M326.612 185.391c59.747 59.809 58.927 155.698.36 214.59-.11.12-.24.25-.36.37l-67.2 67.2c-59.27 59.27-155.699 59.262-214.96 0-59.27-59.26-59.27-155.7 0-214.96l37.106-37.106c9.84-9.84 26.786-3.3 27.294 10.606.648 17.722 3.826 35.527 9.69 52.721 1.986 5.822.567 12.262-3.783 16.612l-13.087 13.087c-28.026 28.026-28.905 73.66-1.155 101.96 28.024 28.579 74.086 28.749 102.325.51l67.2-67.19c28.191-28.191 28.073-73.757 0-101.83-3.701-3.694-7.429-6.564-10.341-8.569a16.037 16.037 0 0 1-6.947-12.606c-.396-10.567 3.348-21.456 11.698-29.806l21.054-21.055c5.521-5.521 14.182-6.199 20.584-1.731a152.482 152.482 0 0 1 20.522 17.197zM467.547 44.449c-59.261-59.262-155.69-59.27-214.96 0l-67.2 67.2c-.12.12-.25.25-.36.37-58.566 58.892-59.387 154.781.36 214.59a152.454 152.454 0 0 0 20.521 17.196c6.402 4.468 15.064 3.789 20.584-1.731l21.054-21.055c8.35-8.35 12.094-19.239 11.698-29.806a16.037 16.037 0 0 0-6.947-12.606c-2.912-2.005-6.64-4.875-10.341-8.569-28.073-28.073-28.191-73.639 0-101.83l67.2-67.19c28.239-28.239 74.3-28.069 102.325.51 27.75 28.3 26.872 73.934-1.155 101.96l-13.087 13.087c-4.35 4.35-5.769 10.79-3.783 16.612 5.864 17.194 9.042 34.999 9.69 52.721.509 13.906 17.454 20.446 27.294 10.606l37.106-37.106c59.271-59.259 59.271-155.699.001-214.959z"/></symbol><symbol viewBox="0 0 16.267 16.491" id="icon-madurai"><path d="M1.694 16.491c2.23-6.227 5.77-7.546 8.965-10.499.951-.88 3.086-2.097 4.85-2.429-.685-.632-1.147-.878-1.782-1.182-.778-.408-1.376-.255-2.676 1.188-1.155 1.317-5.634 4.724-6.369 4.886-.6-1.235.772-5.57.975-8.455 0 0-3.164 2.749-5.657 2.557 0 0 2.429.895 2.557 1.917z"/></symbol><symbol viewBox="0 0 400 423" id="icon-medianPrice"><path d="m162.531 374.211-.905-319.596 70.517-.147 1.118 319.744z" fill="#5a95ff"/></symbol><symbol viewBox="0 0 496 512" id="icon-meh"><path d="M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-216c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160-64c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm8 144H160c-13.2 0-24 10.8-24 24s10.8 24 24 24h176c13.2 0 24-10.8 24-24s-10.8-24-24-24z"/></symbol><symbol viewBox="0 0 18 18" id="icon-naramon"><path d="M2.096 13.26c-.135-1.702-.278-3.405-1.943-5.401l14.824-.226c1.105-.706.837-2.893.837-2.893.475 2.041.346 4.33 2.033 5.876l-14.576.045c-.726.484-1.175 2.599-1.175 2.599z"/></symbol><symbol viewBox="0 0 448 512" id="icon-paste"><path d="M128 184c0-30.879 25.122-56 56-56h136V56c0-13.255-10.745-24-24-24h-80.61C204.306 12.89 183.637 0 160 0s-44.306 12.89-55.39 32H24C10.745 32 0 42.745 0 56v336c0 13.255 10.745 24 24 24h104V184zm32-144c13.255 0 24 10.745 24 24s-10.745 24-24 24-24-10.745-24-24 10.745-24 24-24zm184 248h104v200c0 13.255-10.745 24-24 24H184c-13.255 0-24-10.745-24-24V184c0-13.255 10.745-24 24-24h136v104c0 13.2 10.8 24 24 24zm104-38.059V256h-96v-96h6.059a24 24 0 0 1 16.97 7.029l65.941 65.941a24.002 24.002 0 0 1 7.03 16.971z"/></symbol><symbol viewBox="0 0 1024 1024" id="icon-patreon"><path d="M137.741 725.75c1.5-266.734 1.784-274.433 11.392-308.99 23.796-85.581 79.183-167.291 142.612-210.392 72.468-49.243 140.233-70.911 221.774-70.911 165.476 0 306.731 100.693 358.349 255.448 72.925 218.636-64.099 445.36-295.631 489.159-32.01 6.055-121.217 3.042-150.485-5.083l-18.827-5.227v-81.415c0-44.779.498-81.414 1.108-81.413s12.072 4.209 25.472 9.35c55.969 21.472 122.821 18.874 174.984-6.801 41.045-20.203 65.707-42.046 90.702-80.335 29.938-45.86 36.874-71.683 34.883-129.857-1.52-44.41-2.761-49.999-17.913-80.657-34.942-70.7-97.786-118.015-171.229-128.915-87.002-12.913-172.325 28.33-219.124 105.918-33.246 55.119-31.703 39.4-33.12 337.377l-1.272 267.515 145.246-2.37c143.004-2.334 146.034-2.574 196.28-15.553 173.31-44.768 304.422-174.39 353.036-349.024 11.417-41.014 12.246-49.68 12.054-125.998-.177-70.118-1.597-86.964-9.834-116.642-26-93.682-65.87-161.534-135.816-231.14-36.62-36.442-53.216-49.156-93.275-71.46-90.78-50.542-143.996-64.706-243.648-64.849-62.259-.09-76.537 1.328-117.394 11.65-82.493 20.841-170.399 70.213-225.413 126.602-58.491 59.953-98.831 125.916-122.085 199.632-22.794 72.255-24.565 99.609-24.593 379.888l-.028 258.045h110.255l1.538-273.55z"/></symbol><symbol viewBox="0 0 24 24" id="icon-platform-mobile"><path d="M5.75 4.5A2.5 2.5 0 0 1 8.25 2h7.5a2.5 2.5 0 0 1 2.5 2.5v15a2.5 2.5 0 0 1-2.5 2.5h-7.5a2.5 2.5 0 0 1-2.5-2.5Zm7.5 13.75a1.25 1.25 0 1 0-2.5 0 1.25 1.25 0 0 0 2.5 0Z"/></symbol><symbol viewBox="0 0 24 24" id="icon-platform-pc"><path d="M2 12v8.66h4.312v-5.815l1.197.01 1.197.012 1.368-1.368 1.368-1.368v-6.06l-1.368-1.368L8.709 3.34H2Zm5.018-2.855v2.279l-.353-.011-.353-.011V6.87h.706zm6.407-4.435-1.35 1.361v11.895l1.35 1.35 1.345 1.345h4.498l1.368-1.364L22 17.932V13.19l-2.256.007-2.26.011-.012 1.978-.007 1.98h-.669V6.908h.669v3.272H22V8.097c0-1.513-.011-2.082-.041-2.082-.022 0-.643-.602-1.379-1.338L19.242 3.34l-2.234.008-2.238.003Z"/></symbol><symbol viewBox="0 0 24 24" id="icon-platform-ps"><path d="M9.218 3s.008 6.318.035 6.445l-.02 9.866L12.8 20.5l.007-13.452c0-1.207.432-1.302.824-1.146.376.15.609.557.607 1.176l.008 5.67c.28.195 1.213.433 1.624.42.146-.003 2.603.153 2.342-4.011-.127-2.027-.728-3.269-2.788-4.269-1.43-.694-4.873-1.64-6.206-1.888Zm-.699 9.877-5.743 2.131c-2.19.783-2.322 1.977-.578 2.723 3.168 1.274 6.324.545 6.324.545l-.005-1.895c.02-.017-1.747.773-2.67.847-1.284.102-1.554-.215-1.572-.372-.029-.253.406-.436.507-.472l3.745-1.373zm8.853.915c-1.577.022-2.724.399-3.88.729l.019 2.212 4.073-1.463c.53-.19 2.104-.276 2.232.209.078.295-.256.42-.524.518l-5.8 2.118.015 2.131 7.837-2.89c.48-.177 1.679-.726 1.656-1.55-.028-.986-2.27-1.68-3.892-1.901-.637-.087-1.21-.12-1.736-.113z"/></symbol><symbol viewBox="0 0 24 24" id="icon-platform-switch"><path d="M5.8 8.4v.001a1.703 1.703 0 0 0 1.697 1.696c.934 0 1.697-.764 1.697-1.697S8.43 6.704 7.497 6.704A1.7 1.7 0 0 0 5.8 8.4z"/><path d="M11.54 3H7.61A4.61 4.61 0 0 0 3 7.61v8.766a4.61 4.61 0 0 0 4.61 4.611h3.93a.127.127 0 0 0 .128-.127V3.127c.014-.07-.043-.127-.128-.127Zm-1.315 16.544H7.61a3.088 3.088 0 0 1-2.235-.934 3.149 3.149 0 0 1-.933-2.234V7.61a3.09 3.09 0 0 1 .933-2.235 3.152 3.152 0 0 1 2.235-.933h2.615Zm9.425-15.18a4.609 4.609 0 0 0-3.26-1.35h-2.785a.111.111 0 0 0-.113.113v17.746c-.014.07.042.127.127.127h2.77A4.61 4.61 0 0 0 21 16.39V7.624a4.61 4.61 0 0 0-1.35-3.26zm-2.61 10.358a1.828 1.828 0 0 1-1.823-1.824c0-1.004.82-1.824 1.824-1.824s1.824.82 1.824 1.824-.82 1.824-1.824 1.824z"/></symbol><symbol viewBox="0 0 24 24" id="icon-platform-xbox"><path d="M11.007 21.959a9.984 9.984 0 0 1-4.44-1.574c-1.123-.732-1.377-1.033-1.377-1.634 0-1.206 1.328-3.32 3.599-5.729 1.289-1.368 3.085-2.971 3.28-2.928.377.085 3.397 3.028 4.528 4.414 1.787 2.191 2.609 3.986 2.191 4.786-.317.608-2.286 1.796-3.733 2.253-1.192.376-2.758.535-4.048.412zm-7.333-4.462c-.933-1.43-1.405-2.84-1.632-4.876-.075-.673-.049-1.057.17-2.438.273-1.72 1.253-3.71 2.432-4.935.501-.52.546-.534 1.158-.327.741.25 1.534.798 2.764 1.91l.718.648-.393.481c-1.82 2.233-3.74 5.4-4.463 7.358-.393 1.064-.55 2.133-.381 2.578.114.3.01.188-.374-.399zm16.377.243c.092-.45-.025-1.275-.298-2.109-.591-1.804-2.57-5.16-4.386-7.441l-.571-.719.618-.567c.808-.741 1.369-1.185 1.974-1.562.477-.298 1.16-.56 1.453-.56.18 0 .817.661 1.33 1.382.797 1.115 1.382 2.47 1.679 3.877.191.91.208 2.858.03 3.766a12.033 12.033 0 0 1-.75 2.367c-.226.49-.781 1.444-1.025 1.755-.126.16-.126.159-.056-.185zm-8.88-13.3c-.837-.425-2.13-.881-2.844-1.004a5.194 5.194 0 0 0-.949-.054c-.59.03-.563 0 .382-.447a9.722 9.722 0 0 1 2.332-.776c1-.21 2.882-.212 3.867-.005 1.063.224 2.316.69 3.022 1.125l.21.128-.481-.024c-.957-.048-2.351.338-3.848 1.066-.452.22-.844.395-.873.39a15.893 15.893 0 0 1-.818-.398Z"/></symbol><symbol viewBox="0 0 215.535 215.535" id="icon-platinum"><path d="M105.563 0c-32.088 0-56.76 18.984-56.76 18.984l8.052 7.096-15.052 16.395-15.916 13.998-6.903-7.67S0 74.875 0 109.973c0 32.087 18.984 56.761 18.984 56.761l7.096-8.054 16.395 15.052 13.998 15.916-7.67 6.905s26.072 18.982 61.17 18.982c32.087 0 56.761-18.982 56.761-18.982l-8.054-7.096 15.052-16.396 15.916-13.998 6.905 7.671s18.982-26.074 18.982-61.171c0-32.088-18.982-56.76-18.982-56.76l-7.096 8.052-16.394-15.052-14-15.916 7.671-6.903S140.66 0 105.562 0zm-.192 8.438c28.187.505 46.406 12.464 46.406 12.464l-5.369 5.178 20.326 22.05 22.532 20.999 5.56-5.56s10.93 14.189 12.272 41.802c-.506 28.187-12.463 46.404-12.463 46.404l-5.178-5.369-22.053 20.328-20.996 22.532 5.56 5.56s-14.189 10.93-41.802 12.272c-28.186-.506-46.406-12.463-46.406-12.463l5.369-5.178-20.326-22.053-22.532-20.998-5.56 5.563S9.78 137.777 8.437 110.164C8.943 81.978 20.902 63.76 20.902 63.76l5.178 5.369 22.05-20.326 21-22.533-5.56-5.562s14.187-10.929 41.8-12.27zM71.295 60.467v11.879h9.734v69.62h-9.734v13.231h72.592v-13.23h-9.239V72.346l9.239.144V60.467z" fill-rule="evenodd"/></symbol><symbol viewBox="0 0 448 512" id="icon-plus-square"><path d="M352 240v32c0 6.6-5.4 12-12 12h-88v88c0 6.6-5.4 12-12 12h-32c-6.6 0-12-5.4-12-12v-88h-88c-6.6 0-12-5.4-12-12v-32c0-6.6 5.4-12 12-12h88v-88c0-6.6 5.4-12 12-12h32c6.6 0 12 5.4 12 12v88h88c6.6 0 12 5.4 12 12zm96-160v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z"/></symbol><symbol viewBox="0 0 978 388" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2" id="icon-pwa_logo"><path d="m719.12 322.11 28.23-71.38h81.503l-38.688-108.283 48.38-122.33L977.1 388H874.92l-23.676-65.89H719.121zm-87.175 45.77L780.27-.002l-98.332.008L580.47 237.74 508.314.005h-75.581L355.264 237.74l-54.639-108.338-49.444 152.33 50.204 86.149h96.774l70.01-213.197 66.744 213.197h97.032zM93.344 241.602h60.57c18.348 0 34.684-2.045 49.013-6.142l15.662-48.254 43.78-134.881a107.213 107.213 0 0 0-11.423-14.996C228.468 12.446 195.578.013 152.284.013H.002v367.884h93.342V241.602zm80.172-156.96c8.782 8.838 13.17 20.668 13.17 35.476 0 14.933-3.863 26.77-11.58 35.522-8.469 9.723-24.052 14.588-46.757 14.588H93.344V71.394h35.264c21.161 0 36.133 4.411 44.908 13.249z" fill-opacity=".91" fill-rule="nonzero"/></symbol><symbol viewBox="0 0 1952 734.93" id="icon-pwa_logo_inverse"><path d="m1436.62 603.304 56.39-142.599h162.82l-77.27-216.315L1675.2 0 1952 734.934h-204.13l-47.3-131.629h-263.95z" fill="#FFF"/><path d="M1262.47 734.935 1558.79.002h-196.45l-202.7 474.931L1015.5.003H864.499l-154.768 474.93-109.146-216.416-98.773 304.302 100.284 172.116h193.331l139.857-425.91 133.346 425.91h193.84z" fill="#a52f31"/><path d="M186.476 482.643h121.003c36.654 0 69.293-4.091 97.917-12.273l31.293-96.408 87.459-269.446c-6.664-10.563-14.272-20.55-22.824-29.96C456.419 24.853 390.719 0 304.222 0H0v734.933h186.476v-252.29zm160.166-313.564c17.54 17.653 26.309 41.276 26.309 70.871 0 29.822-7.713 53.474-23.138 70.956-16.91 19.425-48.047 29.137-93.409 29.137h-69.928V142.598h70.442c42.277 0 72.185 8.827 89.724 26.481z" fill="#FFF"/></symbol><symbol viewBox="0 0 51.936 53.127" id="icon-qq"><path d="M50.267 29.674c1.056 2.179 1.833 4.656 1.64 7.586-.077 1.202-.385 2.516-.974 3.326-.3.409-.736.791-1.199.798-.776.014-1.331-.911-1.729-1.508-.473-.708-.83-1.392-1.198-2.085-.478.492-.645 1.208-.887 1.818-.757 1.91-1.812 3.573-3.149 4.924 1.251.725 2.418 1.229 3.504 2.084.668.527 1.552 1.284 1.331 2.529-.147.831-.863 1.532-1.376 1.862-3.574 2.307-11.038 1.969-15.435.533-.854-.28-1.711-.729-2.484-.843-.293-.044-.798-.023-1.109-.045-.448-.03-.947-.116-1.153-.089-.264.036-.492.307-.798.488-1.938 1.145-3.832 1.795-6.743 1.996-3.233.226-6.495-.043-9.003-.843-1.331-.424-3.111-1.291-3.282-2.838-.084-.75.122-1.874.399-2.396.688-1.304 2.242-1.724 4.168-1.907-.071-.333-.533-.547-.843-.8-1.828-1.492-3.261-3.503-4.169-5.987-.145-.399-.201-.849-.443-1.242-.428.314-.477.891-.754 1.331-.559.888-1.453 1.824-2.352 2.262-.33.161-.821.355-1.197.266-.729-.171-.895-1.512-.977-2.438-.302-3.444.698-6.223 1.819-8.384 1.432-2.76 3.478-4.552 5.545-6.254-.577-1.593.107-3.379.842-4.348.028-.728.098-1.399.354-2.04.146-.354.467-.582.533-.887.07-.319-.029-.676 0-1.065.327-4.318 2.986-8.22 5.368-10.6 1.413-1.414 2.668-2.418 4.655-3.327 1.801-.823 4.089-1.3 6.566-1.553h3.236C36.907.748 41.949 4.27 44.321 10.6c.365.972.631 1.96.888 3.016.254 1.044.223 2.32.576 3.415.214.663.766 1.254 1.065 1.953.606 1.412.807 3.406 0 4.789 1.197 1.682 2.382 3.77 3.417 5.901zm-3.328 19.341c.376-2.04-2.059-1.636-3.637-1.73.191-.668 1.122-.592 1.818-.754a4.123 4.123 0 0 0-2.972-1.464c-3.032 2.644-6.568 4.785-11.577 5.456 1.441 1.203 4.591 1.694 7.674 1.817 3.032.121 6.287-.618 7.807-1.907.405-.343.793-.901.887-1.418zm-2.661-10.159c1.104-4.161-.569-7.771-2.262-10.246-5.013 3.403-13.106 6.049-20.804 4.035.045.823.128 1.729.134 2.706.005.971.195 2.061.044 2.883-.117.646-.679 1.299-1.197 1.509-.768.312-1.958.297-2.929.223-1.758-.137-3.261-.984-3.725-2.352-.176-.519-.14-1.181-.179-1.819-.119-2.033.078-3.921.356-5.722a20.458 20.458 0 0 0-2.706-1.597c-1.445 1.452-2.125 5.038-2.04 7.541.021.635.159 1.545.31 2.262.412 1.965 1.507 3.791 2.706 5.19 1.242 1.449 2.606 2.588 4.303 3.592 3.394 2.012 8.088 3.016 12.598 3.062 1.633.016 3.217-.311 4.701-.843 1.508-.542 2.95-1.376 4.259-2.219 1.289-.83 2.639-1.991 3.504-2.972 1.155-1.309 2.39-3.207 2.927-5.233zm-6.653-17.167c.361-.167 1.765-.771 1.73-1.242-.02-.237-.747-.669-1.109-.886-3.768-2.251-9.395-3.03-14.948-2.219-2.127.312-4.053.812-5.811 1.643-.556.262-2.138 1.056-2.085 1.64.021.228.378.505.577.622.864.507 2.262.805 3.238 1.02-.198-.543-.586-.892-.8-1.419 1.998 1.383 4.328 2.877 7.407 3.149 4.613.406 8.113-1.41 10.735-3.149-.25.629-1.129.919-1.287 1.464 1.02-.012 1.607-.278 2.353-.623zm-5.013-4.568c3.081-1.104 3.179-8.305.045-9.492-.281-.106-.839-.111-1.02-.088-1.013.122-1.712.842-2.13 1.553-1.396 2.374-.918 7.275 1.73 8.072.496.149 1.05.071 1.375-.045zm-9.889-.044c2.244.224 3.325-2.575 3.281-4.79-.046-2.284-1.131-4.685-2.972-4.701-1.132-.012-1.932.767-2.395 1.597-1.373 2.454-.784 7.608 2.086 7.894zm-5.858 35.528c3.022-.151 6.146-.59 7.275-2.262-4.633-.55-8.8-1.938-11.933-4.081-.395-.27-1.05-.858-1.374-.931-.07-.016-.221.042-.354.043-1.067.018-1.794.433-2.618.933-.552.336-1.23.853-.797 1.465.491-.026.791-.243 1.374-.179-.568.498-1.555.885-1.774 1.729-.188.73.512 1.346.932 1.642 2.09 1.479 5.7 1.823 9.269 1.641z"/><path d="M41.528 36.549c.038.506-.653.628-.931.312-.854.229-1.98.008-1.775-1.108.18-.976 1.55-1.893 2.219-.977.289.396.189 1.1.397 1.642-.208-.146-.358-.351-.62-.444-.936.278.404 1.491.71.575zm-1.287-.709c.201-.062.223.172.356.044-.182-1.575-1.55.501-.533.576-.017-.283.007-.524.177-.62zm.134.178c-.228-.036-.168.216-.177.399.151-.042.091-.293.177-.399z"/><path d="M40.642 36.417c-.188-.063.003-.296.177-.268-.018.131-.145.152-.177.268zm-1.952.132c.024.477-.659.647-.933.312-.787.158-1.766.092-1.817-.754-.065-1.048 1.341-2.195 2.128-1.465.295.274.419.786.354 1.42.058.105.113.212.179.311-.311 0-.355-.427-.665-.399-.595.051-.187.941.266.931.312-.008.241-.216.488-.356zm-1.287-.709c.173-.035.229.163.354.044-.071-.299-.175-.564-.443-.665-.373.127-.79 1.291-.089 1.198-.06-.217-.005-.482.178-.577zm0 .577c.016-.138.224-.384.045-.444-.082.137-.224.359-.045.444z"/><path d="M37.937 36.106c.122.098-.141.181-.134.311-.217-.092.06-.238.134-.311zm-6.034-25.15c.593.289.962 1.389.62 2.262-.961.134-.553-1.236-1.108-1.331-.612-.102-.519 1.057-.888 1.376-.688-.091-.519-.928-.354-1.419.206-.616.952-1.269 1.73-.888zm-7.541-.488c1.771-.235 1.605 3.937.089 3.858-1.539-.077-1.62-3.654-.089-3.858z"/></symbol><symbol viewBox="0 0 512 512" id="icon-question-circle-solid"><path d="M504 256c0 136.997-111.043 248-248 248S8 392.997 8 256C8 119.083 119.043 8 256 8s248 111.083 248 248zM262.655 90c-54.497 0-89.255 22.957-116.549 63.758-3.536 5.286-2.353 12.415 2.715 16.258l34.699 26.31c5.205 3.947 12.621 3.008 16.665-2.122 17.864-22.658 30.113-35.797 57.303-35.797 20.429 0 45.698 13.148 45.698 32.958 0 14.976-12.363 22.667-32.534 33.976C247.128 238.528 216 254.941 216 296v4c0 6.627 5.373 12 12 12h56c6.627 0 12-5.373 12-12v-1.333c0-28.462 83.186-29.647 83.186-106.667 0-58.002-60.165-102-116.531-102zM256 338c-25.365 0-46 20.635-46 46 0 25.364 20.635 46 46 46s46-20.636 46-46c0-25.365-20.635-46-46-46z"/></symbol><symbol viewBox="0 0 512 512" id="icon-search"><path d="M505 442.7 405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"/></symbol><symbol viewBox="0 0 512 512" id="icon-search-plus"><path d="M304 192v32c0 6.6-5.4 12-12 12h-56v56c0 6.6-5.4 12-12 12h-32c-6.6 0-12-5.4-12-12v-56h-56c-6.6 0-12-5.4-12-12v-32c0-6.6 5.4-12 12-12h56v-56c0-6.6 5.4-12 12-12h32c6.6 0 12 5.4 12 12v56h56c6.6 0 12 5.4 12 12zm201 284.7L476.7 505c-9.4 9.4-24.6 9.4-33.9 0L343 405.3c-4.5-4.5-7-10.6-7-17V372c-35.3 27.6-79.7 44-128 44C93.1 416 0 322.9 0 208S93.1 0 208 0s208 93.1 208 208c0 48.3-16.4 92.7-44 128h16.3c6.4 0 12.5 2.5 17 7l99.7 99.7c9.3 9.4 9.3 24.6 0 34zM344 208c0-75.2-60.8-136-136-136S72 132.8 72 208s60.8 136 136 136 136-60.8 136-136z"/></symbol><symbol viewBox="0 0 576 512" id="icon-shopping-cart"><path d="m528.12 301.319 47.273-208C578.806 78.301 567.391 64 551.99 64H159.208l-9.166-44.81C147.758 8.021 137.93 0 126.529 0H24C10.745 0 0 10.745 0 24v16c0 13.255 10.745 24 24 24h69.883l70.248 343.435C147.325 417.1 136 435.222 136 456c0 30.928 25.072 56 56 56s56-25.072 56-56c0-15.674-6.447-29.835-16.824-40h209.647C430.447 426.165 424 440.326 424 456c0 30.928 25.072 56 56 56s56-25.072 56-56c0-22.172-12.888-41.332-31.579-50.405l5.517-24.276c3.413-15.018-8.002-29.319-23.403-29.319H218.117l-6.545-32h293.145c11.206 0 20.92-7.754 23.403-18.681z"/></symbol><symbol viewBox="0 0 512 512" id="icon-sign-in-alt"><path d="M416 448h-84c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h84c17.7 0 32-14.3 32-32V160c0-17.7-14.3-32-32-32h-84c-6.6 0-12-5.4-12-12V76c0-6.6 5.4-12 12-12h84c53 0 96 43 96 96v192c0 53-43 96-96 96zm-47-201L201 79c-15-15-41-4.5-41 17v96H24c-13.3 0-24 10.7-24 24v96c0 13.3 10.7 24 24 24h136v96c0 21.5 26 32 41 17l168-168c9.3-9.4 9.3-24.6 0-34z"/></symbol><symbol viewBox="0 0 512 512" id="icon-sign-out-alt"><path d="M497 273 329 441c-15 15-41 4.5-41-17v-96H152c-13.3 0-24-10.7-24-24v-96c0-13.3 10.7-24 24-24h136V88c0-21.4 25.9-32 41-17l168 168c9.3 9.4 9.3 24.6 0 34zM192 436v-40c0-6.6-5.4-12-12-12H96c-17.7 0-32-14.3-32-32V160c0-17.7 14.3-32 32-32h84c6.6 0 12-5.4 12-12V76c0-6.6-5.4-12-12-12H96c-53 0-96 43-96 96v192c0 53 43 96 96 96h84c6.6 0 12-5.4 12-12z"/></symbol><symbol viewBox="0 0 400 423" id="icon-simpleAvgPrice"><path d="m162.531 374.211-.905-319.596 70.517-.147 1.118 319.744z" fill="#464646"/></symbol><symbol viewBox="0 0 496 512" id="icon-smile"><path d="M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-216c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm4 72.6c-20.8 25-51.5 39.4-84 39.4s-63.2-14.3-84-39.4c-8.5-10.2-23.7-11.5-33.8-3.1-10.2 8.5-11.5 23.6-3.1 33.8 30 36 74.1 56.6 120.9 56.6s90.9-20.6 120.9-56.6c8.5-10.2 7.1-25.3-3.1-33.8-10.1-8.4-25.3-7.1-33.8 3.1z"/></symbol><symbol viewBox="0 0 32 32" id="icon-stack"><path d="M32 10 16 2 0 10l16 8 16-8zM16 4.655 26.689 10 16 15.345 5.311 10 16 4.655zm12.795 9.743L32 16l-16 8-16-8 3.205-1.602L16 20.796zm0 6L32 22l-16 8-16-8 3.205-1.602L16 26.796z"/></symbol><symbol viewBox="0 0 448 512" id="icon-steam-square"><path d="M185.2 356.5c7.7-18.5-1-39.7-19.6-47.4l-29.5-12.2c11.4-4.3 24.3-4.5 36.4.5 12.2 5.1 21.6 14.6 26.7 26.7 5 12.2 5 25.6-.1 37.7-10.5 25.1-39.4 37-64.6 26.5-11.6-4.8-20.4-13.6-25.4-24.2l28.5 11.8c18.6 7.8 39.9-.9 47.6-19.4zM400 32H48C21.5 32 0 53.5 0 80v160.7l116.6 48.1c12-8.2 26.2-12.1 40.7-11.3l55.4-80.2v-1.1c0-48.2 39.3-87.5 87.6-87.5s87.6 39.3 87.6 87.5c0 49.2-40.9 88.7-89.6 87.5l-79 56.3c1.6 38.5-29.1 68.8-65.7 68.8-31.8 0-58.5-22.7-64.5-52.7L0 319.2V432c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-99.7 222.5c-32.2 0-58.4-26.1-58.4-58.3s26.2-58.3 58.4-58.3 58.4 26.2 58.4 58.3-26.2 58.3-58.4 58.3zm.1-14.6c24.2 0 43.9-19.6 43.9-43.8 0-24.2-19.6-43.8-43.9-43.8-24.2 0-43.9 19.6-43.9 43.8 0 24.2 19.7 43.8 43.9 43.8z"/></symbol><symbol viewBox="0 0 352 512" id="icon-times"><path d="m242.72 256 100.07-100.07c12.28-12.28 12.28-32.19 0-44.48l-22.24-22.24c-12.28-12.28-32.19-12.28-44.48 0L176 189.28 75.93 89.21c-12.28-12.28-32.19-12.28-44.48 0L9.21 111.45c-12.28 12.28-12.28 32.19 0 44.48L109.28 256 9.21 356.07c-12.28 12.28-12.28 32.19 0 44.48l22.24 22.24c12.28 12.28 32.2 12.28 44.48 0L176 322.72l100.07 100.07c12.28 12.28 32.2 12.28 44.48 0l22.24-22.24c12.28-12.28 12.28-32.19 0-44.48L242.72 256z"/></symbol><symbol viewBox="0 0 448 512" id="icon-trash-alt"><path d="M0 84V56c0-13.3 10.7-24 24-24h112l9.4-18.7c4-8.2 12.3-13.3 21.4-13.3h114.3c9.1 0 17.4 5.1 21.5 13.3L312 32h112c13.3 0 24 10.7 24 24v28c0 6.6-5.4 12-12 12H12C5.4 96 0 90.6 0 84zm416 56v324c0 26.5-21.5 48-48 48H80c-26.5 0-48-21.5-48-48V140c0-6.6 5.4-12 12-12h360c6.6 0 12 5.4 12 12zm-272 68c0-8.8-7.2-16-16-16s-16 7.2-16 16v224c0 8.8 7.2 16 16 16s16-7.2 16-16V208zm96 0c0-8.8-7.2-16-16-16s-16 7.2-16 16v224c0 8.8 7.2 16 16 16s16-7.2 16-16V208zm96 0c0-8.8-7.2-16-16-16s-16 7.2-16 16v224c0 8.8 7.2 16 16 16s16-7.2 16-16V208z"/></symbol><symbol viewBox="0 0 512 512" id="icon-upload"><path d="M296 384h-80c-13.3 0-24-10.7-24-24V192h-87.7c-17.8 0-26.7-21.5-14.1-34.1L242.3 5.7c7.5-7.5 19.8-7.5 27.3 0l152.2 152.2c12.6 12.6 3.7 34.1-14.1 34.1H320v168c0 13.3-10.7 24-24 24zm216-8v112c0 13.3-10.7 24-24 24H24c-13.3 0-24-10.7-24-24V376c0-13.3 10.7-24 24-24h136v8c0 30.9 25.1 56 56 56h80c30.9 0 56-25.1 56-56v-8h136c13.3 0 24 10.7 24 24zm-124 88c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20zm64 0c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20z"/></symbol><symbol viewBox="0 0 448 512" id="icon-user"><path d="M224 256c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm89.6 32h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-41.6c0-74.2-60.2-134.4-134.4-134.4z"/></symbol><symbol viewBox="0 0 13.546 16.345" id="icon-vazarin"><path d="M0 1.226c5.958 2.784 9.917 8.708 11.277 15.12 1.011-1.734 1.735-3.47 2.192-6.668.349-3.612-.572-7.13-1.043-9.678C11.95 1.529 0 1.226 0 1.226zM7.14 4.87s3.362-.141 4.93-.063c.186 1.331.536 2.41-.233 4.804l-1.525-.03C9.272 7.546 7.14 4.869 7.14 4.869z"/></symbol><symbol viewBox="0 0 614.156 507.697" id="icon-wifi2"><path d="M306.719 118.003c-80.452.303-160.77 30.425-222.313 90.281l55.906 55.282c92.257-89.611 240.746-90.142 333.657-1.157l55.781-55.812c-62.01-59.39-142.58-88.897-223.031-88.594M140.312 263.566l-.125.093z"/><path d="M306.594.003C195.649.421 84.87 41.96 0 124.503l55.469 54.844C194.41 44.792 417.73 44.108 557.5 177.972l56.656-55.781C528.642 40.29 417.54-.415 306.594.003M55.469 179.347l-.563.531zm251.406 56.156c-50.088.189-100.122 18.954-138.438 56.219l53.438 52.812c47.181-45.82 123.111-46.068 170.625-.562l53.219-53.313c-38.607-36.975-88.756-55.345-138.844-55.156zm-85 109.031-.063.063z"/><circle cx="307.078" cy="429.197" r="78.5"/></symbol><symbol viewBox="0 0 372.369 372.573" id="icon-xbox"><path d="M167.618 371.807c-28.683-2.748-57.723-13.049-82.67-29.325-20.904-13.639-25.624-19.245-25.624-30.434 0-22.476 24.712-61.84 66.992-106.716 24.013-25.487 57.46-55.36 61.078-54.55 7.03 1.571 63.25 56.41 84.296 82.224 33.28 40.821 48.58 74.245 40.808 89.147-5.908 11.327-42.572 33.467-69.507 41.972-22.2 7.01-51.356 9.981-75.373 7.681zM31.09 288.68C13.719 262.03 4.943 235.793.705 197.847c-1.4-12.53-.898-19.697 3.177-45.415 5.08-32.054 23.333-69.137 45.268-91.958 9.34-9.72 10.176-9.956 21.563-6.12C84.54 59.012 99.309 69.211 122.21 89.92l13.363 12.083-7.297 8.964c-33.873 41.613-69.63 100.597-83.106 137.09-7.326 19.838-10.28 39.753-7.128 48.043 2.128 5.598.173 3.511-6.953-7.42zm304.915 4.532c1.716-8.377-.454-23.762-5.54-39.28-11.018-33.606-47.84-96.124-81.654-138.63l-10.644-13.38 11.516-10.575c15.036-13.807 25.476-22.074 36.74-29.095 8.889-5.54 21.59-10.444 27.05-10.444 3.367 0 15.218 12.298 24.785 25.72 14.818 20.788 25.718 45.987 31.24 72.22 3.57 16.95 3.867 53.231.576 70.14-2.7 13.875-8.403 31.874-13.966 44.081-4.17 9.147-14.536 26.91-19.08 32.691-2.334 2.972-2.336 2.965-1.023-3.448zM170.69 45.462c-15.601-7.923-39.67-16.427-52.965-18.715-4.66-.803-12.612-1.25-17.67-.995-10.97.554-10.48-.02 7.119-8.333 14.63-6.912 26.834-10.977 43.4-14.455C169.21-.949 204.24-.996 222.58 2.87c19.808 4.174 43.133 12.854 56.276 20.943l3.906 2.404-8.962-.453c-17.81-.9-43.766 6.296-71.633 19.857-8.405 4.09-15.718 7.358-16.25 7.26-.532-.097-7.384-3.436-15.227-7.418z" style="stroke:none"/></symbol></defs></svg>
457
- ${body}
458
- </body>
459
- </html>`;
460
- }, "getHtmlString");
461
- var getHtmlImageBase64 = /* @__PURE__ */ __name(async (puppe, html, type) => {
462
- return await puppe.render(
463
- getHtmlString(html),
464
- async (page, next) => {
465
- const element = await page.$("body");
466
- const clip = await element.evaluate((e) => {
467
- const { x, y, width, height } = e.children[1].getBoundingClientRect();
468
- return { x, y, width, height };
469
- });
470
- return await element.screenshot({
471
- type: type ?? "png",
472
- encoding: "base64",
473
- clip
474
- });
475
531
  }
476
- );
477
- }, "getHtmlImageBase64");
478
- var OutputImage = /* @__PURE__ */ __name((imgBase64) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("img", { src: `data:image/png;base64,${imgBase64}` }), "OutputImage");
479
- var ItemOrderOutput = /* @__PURE__ */ __name((item, orders) => {
480
- const itemNameCN = item.i18n["zh-hans"].name;
481
- const itemNameEN = item.i18n["en"].name;
482
- let result = `物品: ${itemNameCN} / ${itemNameEN} (ID: ${item.slug})
483
- `;
484
- for (const order of orders) {
485
- result += `玩家: ${order.user.ingameName} 状态: ${order.user.status} 价格: ${order.platinum}
486
- `;
487
- }
488
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: "display:flex; flex-direction: column;", children: [
489
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("style", { children: `
490
- th {
491
- align-items: center;
492
- font-size: 1.8rem;
493
- }
494
-
495
- td {
496
- text-align: center;
497
- font-size: 1.5rem;
498
- }
532
+ return result;
533
+ })(globalItemList);
534
+ const globalItemGameRefDict = listToDict(data, (i) => [i.gameRef]);
535
+ return {
536
+ globalItemList,
537
+ globalItemDict,
538
+ globalItemNameToSlugDict,
539
+ globalItemGameRefDict
540
+ };
541
+ }, "globalItemDataFactory");
542
+ var globalItemData = createAsyncCache(globalItemDataFactory, -1);
499
543
 
500
- tr {
501
- height: 3rem;
502
- }
503
- ` }),
504
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("h1", { style: "text-align: center;", children: [
505
- itemNameCN,
506
- " / ",
507
- itemNameEN,
508
- " (ID: ",
509
- item.slug,
510
- ")"
511
- ] }),
512
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("table", { style: "width:100%;", children: [
513
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("tr", { children: [
514
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { style: "width:40%;", children: "玩家名" }),
515
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { style: "width:30%;", children: "状态" }),
516
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { style: "width:10%;", children: "价格" }),
517
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { style: "width:10%;", children: "数量" }),
518
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { style: "width:10%;", children: "好评" })
519
- ] }),
520
- orders.map((order) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("tr", { children: [
521
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("td", { children: order.user.ingameName }),
522
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("td", { children: order.user.status }),
523
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("td", { children: order.platinum }),
524
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("td", { children: order.quantity }),
525
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("td", { children: order.user.reputation })
526
- ] }))
527
- ] }),
528
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: "text-align: center; margin-top: 30px; font-size: 25px;", children: (() => {
529
- const firstOrder = orders[0];
530
- const comment = `/w ${firstOrder.user.ingameName} Hi! I want to buy: "${item.i18n["en"].name}${!item.maxRank || item.maxRank === 0 ? "" : ` (rank ${firstOrder.rank})`}" for ${firstOrder.platinum} platinum. (warframe.market)`;
531
- return comment;
532
- })() })
533
- ] });
534
- }, "ItemOrderOutput");
535
- var RivenOrderOutput = /* @__PURE__ */ __name((item, orders) => {
536
- const itemNameCN = item.i18n["zh-hans"].name;
537
- const itemNameEN = item.i18n["en"].name;
538
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: "display:flex; flex-direction: column; font-size: 12px;", children: [
539
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("h1", { style: "text-align: center;", children: [
540
- itemNameCN,
541
- " / ",
542
- itemNameEN,
543
- " (ID: ",
544
- item.slug,
545
- ")"
546
- ] }),
547
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ul", { style: "width:100%;", children: orders.map((order) => {
548
- return RivenOrderComponent(item, order);
549
- }) })
550
- ] });
551
- }, "RivenOrderOutput");
552
- var RivenOrderComponent = /* @__PURE__ */ __name((item, order) => {
553
- const itemNameCN = item.i18n["zh-hans"]?.name ?? item.i18n["en"].name;
554
- const itemIconLink = "https://warframe.market/static/assets/" + item.i18n["en"].thumb;
555
- const ownerAvatarLink = order.owner.avatar ? "https://warframe.market/static/assets/" + order.owner.avatar : void 0;
556
- const reputationColor = order.owner.reputation >= 5 ? "#00a96c" : "#739098";
557
- const reputationIconLink = order.owner.reputation >= 5 ? "#icon-smile" : "#icon-meh";
558
- const statusData = {
559
- ingame: ["ONLINE IN GAME", "#634b93"],
560
- online: ["ONLINE", "darkgreen"],
561
- offline: ["OFFLINE", "darkred"]
544
+ // src/data/wfm/globalRivenItem.ts
545
+ var globalRivenItemData = createAsyncCache(async () => {
546
+ const rivenData = await getWFMRivenItemList();
547
+ if (!rivenData) {
548
+ throw new Error("Failed to fetch riven items from Warframe Market API.");
549
+ }
550
+ const data = rivenData;
551
+ const globalRivenItemList = data;
552
+ const globalRivenItemDict = listToDict(data, (i) => [i.slug]);
553
+ return {
554
+ globalRivenItemList,
555
+ globalRivenItemDict
562
556
  };
563
- const statusText = statusData[order.owner.status][0];
564
- const statusColor = statusData[order.owner.status][1];
565
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: "border: 1px solid gray; margin: 20px; padding: 10px 15px 10px 11px; font-family: 'Lato', sans-serif, Helvetica, Arial; display: flex; flex-direction: column;", children: [
566
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: "display: flex; align-items: center; padding-bottom: 10px; min-height: 45px;", children: [
567
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
568
- "img",
569
- {
570
- src: itemIconLink,
571
- style: "height: 30px; width: 30px; object-fit: contain; border-radius: 50%; box-shadow: 0 0 10px 1px rgba(0, 0, 0, .15); vertical-align: middle;"
572
- }
573
- ),
574
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
575
- "span",
576
- {
577
- id: "title",
578
- style: "margin-left: 15px; font-size: 16px; line-height: 16px; font-weight: 700; text-overflow: ellipsis; text-decoration: underline; cursor: pointer;",
579
- children: [
580
- itemNameCN,
581
- " ",
582
- order.item.name
583
- ]
584
- }
585
- )
586
- ] }),
587
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
588
- "div",
589
- {
590
- id: "body",
591
- style: "display: flex; flex-wrap: wrap; justify-content: space-between;",
592
- children: [
593
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { id: "body-left", children: [
594
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ul", { style: "display: flex; padding-top: 5px;", children: order.item.attributes.filter((attr) => attr.positive).map(RivenAttributeComponent) }),
595
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ul", { style: "display: flex; width: 100%; padding-top: 5px;", children: order.item.attributes.filter((attr) => !attr.positive).map(RivenAttributeComponent) }),
596
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("ul", { style: "display: flex; padding: 5px 0; font-size: 12px;", children: [
597
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("li", { style: "margin-right: 10px;", children: [
598
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "段位 " }),
599
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("b", { children: order.item.mastery_level })
600
- ] }),
601
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("li", { style: "margin-right: 10px;", children: [
602
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "等级: " }),
603
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("b", { children: order.item.mod_rank })
604
- ] }),
605
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("li", { style: "margin-right: 10px;", children: [
606
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "循环: " }),
607
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("b", { children: order.item.re_rolls })
608
- ] }),
609
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("li", { style: "margin-right: 10px;", children: [
610
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "极性: " }),
611
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("b", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
612
- "svg",
613
- {
614
- viewBox: "0 0 18 18",
615
- style: "\n color: rgb(64 64 64 / 75%);\n height: 1em;\n width: 1em;\n vertical-align: -.125em;\n fill: currentcolor;",
616
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("use", { href: `#icon-${order.item.polarity}` })
617
- }
618
- ) })
619
- ] })
620
- ] })
621
- ] }),
622
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
623
- "div",
624
- {
625
- id: "body-right",
626
- style: "display: flex; flex-direction: column; justify-content: center; padding-left: 10px;",
627
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: "display: flex; justify-content: flex-end; font-size: 16px;", children: [
628
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "售价: " }),
629
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: "padding-left: 5px; line-height: 1.5;", children: [
630
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("b", { children: order.starting_price }),
631
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
632
- "svg",
633
- {
634
- viewBox: "0 0 215.535 215.535",
635
- style: "\n margin: 0 0 0 3px;\n color: rgb(64 64 64 / 75%);\n height: 1em;\n width: 1em;\n vertical-align: -.125em;\n fill: currentcolor;",
636
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("use", { href: "#icon-platinum" })
637
- }
638
- )
639
- ] })
640
- ] })
641
- }
642
- )
643
- ]
644
- }
645
- ),
646
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
647
- "div",
648
- {
649
- id: "footer",
650
- style: "display: flex; margin-top: 10px; line-height: 1.5;",
651
- children: [
652
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: "display: flex;", children: [
653
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
654
- "img",
655
- {
656
- src: ownerAvatarLink,
657
- style: "height: 20px; width: 20px; object-fit: contain; border-radius: 50%; box-shadow: 0 0 10px 1px rgba(0, 0, 0, .15); vertical-align: middle;"
658
- }
659
- ),
660
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: "margin-left: 5px;", children: order.owner.ingame_name })
661
- ] }),
662
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
663
- "div",
664
- {
665
- style: `margin-left: 10px; color:${statusColor ?? "gray"}; font-size: 12px;`,
666
- children: statusText
667
- }
668
- ),
669
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: `margin-left: 10px; color:${reputationColor};`, children: [
670
- order.owner.reputation,
671
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
672
- "svg",
673
- {
674
- viewBox: "0 0 496 512",
675
- style: "margin-left: 5px; margin-top: -2px; overflow:hidden; height: 1em; width: 1em; vertical-align: -.125em; fill: currentcolor;",
676
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("use", { href: reputationIconLink })
677
- }
678
- )
679
- ] })
680
- ]
681
- }
682
- )
683
- ] });
684
- }, "RivenOrderComponent");
685
- var RivenAttributeComponent = /* @__PURE__ */ __name((attr, index) => {
686
- const attrInfo = globalRivenAttributeDict[attr.url_name];
687
- const attrName = attrInfo.i18n["zh-hans"].name;
688
- const attrValuePrefix = attrInfo.unit === "multiply" ? "x" : "";
689
- const unitSuffixMap = {
690
- percent: "%",
691
- second: "s",
692
- multiply: ""
557
+ }, -1);
558
+
559
+ // src/data/wfm/globalRivenAttribute.ts
560
+ var globalRivenAttributeFactory = /* @__PURE__ */ __name(async (rivenAttributeData) => {
561
+ rivenAttributeData ??= await getWFMRivenAttributeList();
562
+ if (!rivenAttributeData) {
563
+ throw new Error(
564
+ "Failed to fetch riven attributes from Warframe Market API."
565
+ );
566
+ }
567
+ const data = rivenAttributeData;
568
+ const globalRivenAttributeList = data;
569
+ const globalRivenAttributeDict = listToDict(data, (a) => [
570
+ a.slug
571
+ ]);
572
+ return {
573
+ globalRivenAttributeList,
574
+ globalRivenAttributeDict
693
575
  };
694
- const attrValueSuffix = unitSuffixMap[attrInfo.unit] || "";
695
- const attrValue = attrValuePrefix + attr.value + attrValueSuffix;
696
- const positiveColors = [
697
- "--color_rgb_attribute_background_first",
698
- "--color_rgb_attribute_background_second",
699
- "--color_rgb_attribute_background_third"
700
- ];
701
- const color = attr.positive ? positiveColors[index] : "--color_rgb_attribute_background_negative";
702
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
703
- "li",
704
- {
705
- style: `
706
- border: 1px solid rgb(var(${color})/50%);
707
- background-color: rgb(var(${color})/10%);
708
- color: rgb(var(${color}));
709
- padding: 2px 10px;
710
- border-radius: 4px;
711
- margin-right: 5px;
712
- font-size: 14px;
713
- line-height: 1.5;`,
714
- children: [
715
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("b", { children: [
716
- attr.positive && !attrValuePrefix && attr.value > 0 ? "+" : "",
717
- attrValue,
718
- " "
719
- ] }),
720
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: attrName })
721
- ]
722
- }
723
- );
724
- }, "RivenAttributeComponent");
576
+ }, "globalRivenAttributeFactory");
577
+ var globalRivenAttribute = createAsyncCache(
578
+ globalRivenAttributeFactory,
579
+ -1
580
+ );
581
+
582
+ // src/data/wfm/globalDucatnator.ts
583
+ var globalDucatnatorIDDict = createAsyncCache(async () => {
584
+ const data = await getWFMDucatnator();
585
+ if (!data) {
586
+ return void 0;
587
+ }
588
+ return listToDict(data.hour, (d) => [d.item]);
589
+ }, 36e5);
725
590
 
726
591
  // src/services/wfm-service.ts
727
- var import_warframe_public_export_plus4 = require("warframe-public-export-plus");
728
- var globalDucatnatorIDDict = createAsyncCache(
729
- async () => {
730
- const data = await getWFMDucatnator();
731
- if (!data || !data.payload) {
732
- return void 0;
733
- }
734
- return listToDict(data.payload.previous_hour, (d) => [d.item]);
735
- },
736
- 36e5
737
- );
738
- var globalItemList = [];
739
- var globalRivenItemList = [];
740
- var globalRivenAttributeList = [];
741
- var globalItemDict = {};
742
- var globalRivenItemDict = {};
743
- var globalRivenAttributeDict = {};
744
- var globalItemNameToSlugDict = {};
745
- var globalItemGameRefDict = {};
746
592
  var warframeAlias = {
747
593
  Volt: ["电", "电男", "伏特"],
748
594
  Trinity: ["奶妈", "奶"],
@@ -838,49 +684,7 @@ var weaponPartSuffix = [
838
684
  "连接器"
839
685
  ];
840
686
  var wmOnReady = /* @__PURE__ */ __name(async () => {
841
- const data = await getWFMItemList();
842
- if (!data) {
843
- throw new Error("Failed to fetch items from Warframe Market API.");
844
- }
845
- const rivenData = await getWFMRivenItemList();
846
- if (!rivenData) {
847
- throw new Error("Failed to fetch riven items from Warframe Market API.");
848
- }
849
- const rivenAttributeData = await getWFMRivenAttributeList();
850
- if (!rivenAttributeData) {
851
- throw new Error(
852
- "Failed to fetch riven attributes from Warframe Market API."
853
- );
854
- }
855
- setGlobalItem(data.data);
856
- setGlobalRivenItem(rivenData.data);
857
- setGlobalRivenAttribute(rivenAttributeData.data);
858
687
  }, "wmOnReady");
859
- var setGlobalItem = /* @__PURE__ */ __name((data) => {
860
- globalItemList = data;
861
- globalItemDict = listToDict(data, (i) => [i.slug]);
862
- globalItemNameToSlugDict = ((list) => {
863
- const result = {};
864
- for (const item of list) {
865
- if (item.i18n["zh-hans"]?.name) {
866
- result[normalizeName(item.i18n["zh-hans"].name)] = item.slug;
867
- }
868
- if (item.i18n["en"]?.name) {
869
- result[normalizeName(item.i18n["en"].name)] = item.slug;
870
- }
871
- }
872
- return result;
873
- })(globalItemList);
874
- globalItemGameRefDict = listToDict(data, (i) => [i.gameRef]);
875
- }, "setGlobalItem");
876
- var setGlobalRivenItem = /* @__PURE__ */ __name((data) => {
877
- globalRivenItemList = data;
878
- globalRivenItemDict = listToDict(data, (i) => [i.slug]);
879
- }, "setGlobalRivenItem");
880
- var setGlobalRivenAttribute = /* @__PURE__ */ __name((data) => {
881
- globalRivenAttributeList = data;
882
- globalRivenAttributeDict = listToDict(data, (a) => [a.slug]);
883
- }, "setGlobalRivenAttribute");
884
688
  var getItemOrders = /* @__PURE__ */ __name(async (input) => {
885
689
  if (!input) return null;
886
690
  input = normalizeName(input);
@@ -892,7 +696,7 @@ var getItemOrders = /* @__PURE__ */ __name(async (input) => {
892
696
  input = input.slice(0, input.length - 2);
893
697
  }
894
698
  }
895
- const targetItem = stringToWFMItem(input);
699
+ const targetItem = await stringToWFMItem(input);
896
700
  if (!targetItem) {
897
701
  return null;
898
702
  }
@@ -901,7 +705,7 @@ var getItemOrders = /* @__PURE__ */ __name(async (input) => {
901
705
  if (!data) {
902
706
  return null;
903
707
  }
904
- const result = data.data.filter(
708
+ const result = data.filter(
905
709
  (order) => order.user.status === "ingame" && order.visible && order.type === "sell" && (!isFullLevel || order.rank == targetItem.maxRank)
906
710
  ).sort((a, b) => toTimeStamp(b.updatedAt) - toTimeStamp(a.updatedAt)).sort((a, b) => a.platinum - b.platinum).slice(0, 5);
907
711
  return {
@@ -909,12 +713,9 @@ var getItemOrders = /* @__PURE__ */ __name(async (input) => {
909
713
  orders: result
910
714
  };
911
715
  }, "getItemOrders");
912
- var generateItemOrderOutput = /* @__PURE__ */ __name(async (puppe, item, orders) => {
913
- const element = ItemOrderOutput(item, orders);
914
- const imgBase64 = await getHtmlImageBase64(puppe, element.toString());
915
- return OutputImage(imgBase64);
916
- }, "generateItemOrderOutput");
917
716
  var getRivenOrders = /* @__PURE__ */ __name(async (input) => {
717
+ const { globalRivenItemList } = await globalRivenItemData.get();
718
+ const { globalRivenAttributeDict } = await globalRivenAttribute.get();
918
719
  const targetItem = globalRivenItemList.find(
919
720
  (item) => compareRivenItemName(input, item.i18n["zh-hans"].name)
920
721
  ) ?? globalRivenItemList.find(
@@ -928,18 +729,26 @@ var getRivenOrders = /* @__PURE__ */ __name(async (input) => {
928
729
  if (!data) {
929
730
  return null;
930
731
  }
931
- const top5 = data.payload.auctions.filter(
732
+ const top5 = data.filter(
932
733
  (order) => order.owner.status === "ingame" && order.visible && !order.private && !order.closed && order.is_direct_sell
933
734
  ).sort((a, b) => toTimeStamp(b.updated) - toTimeStamp(a.updated)).sort((a, b) => a.starting_price - b.starting_price).slice(0, 5);
934
- return { item: targetItem, orders: top5 };
735
+ const orders = top5.map((e) => {
736
+ const transformed = e.item.attributes.map(
737
+ (attr) => {
738
+ return {
739
+ ...attr,
740
+ attribute: globalRivenAttributeDict[attr.url_name]
741
+ };
742
+ }
743
+ );
744
+ e.item.attributes = transformed;
745
+ return e;
746
+ });
747
+ return { item: targetItem, orders };
935
748
  }, "getRivenOrders");
936
- var generateRivenOrderOutput = /* @__PURE__ */ __name(async (puppe, item, orders) => {
937
- const element = RivenOrderOutput(item, orders);
938
- const imgBase64 = await getHtmlImageBase64(puppe, element.toString());
939
- return OutputImage(imgBase64);
940
- }, "generateRivenOrderOutput");
941
749
  var applyRelicData = /* @__PURE__ */ __name(async (relic) => {
942
750
  const tier = import_warframe_public_export_plus4.dict_zh[relic.tierKey] ?? relic.tier;
751
+ const { globalItemGameRefDict } = await globalItemData.get();
943
752
  const wfmDict = await globalDucatnatorIDDict.get();
944
753
  const loadedItems = relic.items.map((element) => {
945
754
  const item = globalItemGameRefDict[element.name];
@@ -970,17 +779,18 @@ var applyRelicData = /* @__PURE__ */ __name(async (relic) => {
970
779
  items: loadedItems
971
780
  };
972
781
  }, "applyRelicData");
973
- var stringToWFMItem = /* @__PURE__ */ __name((input) => {
782
+ var stringToWFMItem = /* @__PURE__ */ __name(async (input) => {
783
+ const { globalItemList, globalItemDict, globalItemNameToSlugDict } = await globalItemData.get();
974
784
  input = normalizeName(input);
975
785
  const slug = globalItemNameToSlugDict[input];
976
786
  if (slug) return globalItemDict[slug];
977
- const normalShortHandRes = shortHandProcess(input);
787
+ const normalShortHandRes = await shortHandProcess(input);
978
788
  if (normalShortHandRes) return normalShortHandRes;
979
789
  const { pure: inputNoSuffix, suffix } = removeNameSuffix(input);
980
790
  const aliasHasEndP = inputNoSuffix.endsWith(primeSuffix) ? inputNoSuffix.replace(new RegExp(`${primeSuffix}$`), "") : inputNoSuffix;
981
791
  const mappedAliasHasEndP = warframeAliasDict[aliasHasEndP];
982
792
  if (mappedAliasHasEndP) {
983
- const aliasHasEndPRes = shortHandProcess(
793
+ const aliasHasEndPRes = await shortHandProcess(
984
794
  normalizeName(mappedAliasHasEndP) + primeSuffix + suffix
985
795
  );
986
796
  if (aliasHasEndPRes) return aliasHasEndPRes;
@@ -989,7 +799,7 @@ var stringToWFMItem = /* @__PURE__ */ __name((input) => {
989
799
  const aliasNoEndP = inputNoSuffix.replace(/p$/, "");
990
800
  const mappedAliasNoEndP = warframeAliasDict[aliasNoEndP];
991
801
  if (mappedAliasNoEndP) {
992
- const aliasNoEndPRes = shortHandProcess(
802
+ const aliasNoEndPRes = await shortHandProcess(
993
803
  normalizeName(mappedAliasNoEndP) + primeSuffix + suffix
994
804
  );
995
805
  if (aliasNoEndPRes) return aliasNoEndPRes;
@@ -1074,7 +884,8 @@ var removeNameSuffix = /* @__PURE__ */ __name((input) => {
1074
884
  };
1075
885
  }
1076
886
  }, "removeNameSuffix");
1077
- var shortHandProcess = /* @__PURE__ */ __name((input) => {
887
+ var shortHandProcess = /* @__PURE__ */ __name(async (input) => {
888
+ const { globalItemDict, globalItemNameToSlugDict } = await globalItemData.get();
1078
889
  const { pure: inputNoSuffix, suffix } = removeNameSuffix(input);
1079
890
  if (inputNoSuffix === input) {
1080
891
  const fixSet = input + setSuffix;
@@ -1115,7 +926,7 @@ var compareRivenItemName = /* @__PURE__ */ __name((input, standard) => {
1115
926
  }, "compareRivenItemName");
1116
927
 
1117
928
  // src/services/wf-service.ts
1118
- var import_warframe_public_export_plus5 = require("warframe-public-export-plus");
929
+ var import_warframe_public_export_plus8 = require("warframe-public-export-plus");
1119
930
 
1120
931
  // src/assets/zh.json
1121
932
  var zh_default = {
@@ -1597,6 +1408,199 @@ var arbyRewards_default = {
1597
1408
  // 冥i防
1598
1409
  };
1599
1410
 
1411
+ // src/assets/circuitRewards.json
1412
+ var incarnons = [
1413
+ [
1414
+ "/Lotus/Language/Items/AutoShotgunName",
1415
+ "/Lotus/Language/Items/ReconnasorName",
1416
+ "/Lotus/Language/Items/CorpusHandRocketLauncherName",
1417
+ "/Lotus/Language/Items/HeavyRifleName",
1418
+ "/Lotus/Language/Items/ParisScytheName"
1419
+ ],
1420
+ [
1421
+ "/Lotus/Language/Items/StaffName",
1422
+ "/Lotus/Language/Items/SemiAutoRifleName",
1423
+ "/Lotus/Language/Items/AutoPistolName",
1424
+ "/Lotus/Language/Items/FistName",
1425
+ "/Lotus/Language/Items/ShotgunName"
1426
+ ],
1427
+ [
1428
+ "/Lotus/Language/Locations/Lex",
1429
+ "/Lotus/Language/Items/PaladinMaceName",
1430
+ "/Lotus/Language/Items/BoltoRifleName",
1431
+ "/Lotus/Language/Items/HandCannonName",
1432
+ "/Lotus/Language/Items/CeramicDaggerName"
1433
+ ],
1434
+ [
1435
+ "/Lotus/Language/ClanTech/Torid",
1436
+ "/Lotus/Language/Items/InfestedLexName",
1437
+ "/Lotus/Language/Weapons/InfestedDualAxeName",
1438
+ "/Lotus/Language/Items/GrineerSawbladeGunName",
1439
+ "/Lotus/Language/Items/GrnHeatGunName"
1440
+ ],
1441
+ [
1442
+ "/Lotus/Language/Items/RegorAxeShieldName",
1443
+ "/Lotus/Language/Items/TennoAssaultRifleName",
1444
+ "/Lotus/Language/Items/TennoRevolverName",
1445
+ "/Lotus/Language/Items/NamiSoloName",
1446
+ "/Lotus/Language/Items/BurstRifleName"
1447
+ ],
1448
+ [
1449
+ "/Lotus/Language/Weapons/SybarisPistolName",
1450
+ "/Lotus/Language/Items/IceHammerName",
1451
+ "/Lotus/Language/Items/StalkerBowName",
1452
+ "/Lotus/Language/Items/StalkerKunaiName",
1453
+ "/Lotus/Language/Items/StalkerScytheName"
1454
+ ],
1455
+ [
1456
+ "/Lotus/Language/Items/EnergyRifleName",
1457
+ "/Lotus/Language/Items/TennoLeverActionRifleName",
1458
+ "/Lotus/Language/Items/CorpusMinigunName",
1459
+ "/Lotus/Language/Items/BurstPistolName",
1460
+ "/Lotus/Language/Items/TennoSaiName"
1461
+ ],
1462
+ [
1463
+ "/Lotus/Language/Items/RifleName",
1464
+ "/Lotus/Language/Items/PistolName",
1465
+ "/Lotus/Language/Items/LongSwordName",
1466
+ "/Lotus/Language/Items/HuntingBowName",
1467
+ "/Lotus/Language/Items/KunaiName"
1468
+ ]
1469
+ ];
1470
+ var warframes = [
1471
+ [
1472
+ "/Lotus/Language/Suits/InfestationName",
1473
+ "/Lotus/Language/Suits/BardName",
1474
+ "/Lotus/Language/Suits/PriestName"
1475
+ ],
1476
+ [
1477
+ "/Lotus/Language/Suits/GlassName",
1478
+ "/Lotus/Language/Suits/KhoraName",
1479
+ "/Lotus/Language/Suits/RevenantName"
1480
+ ],
1481
+ [
1482
+ "/Lotus/Language/Suits/GarudaName",
1483
+ "/Lotus/Language/Suits/PacifistName",
1484
+ "/Lotus/Language/Suits/IronFrameName"
1485
+ ],
1486
+ [
1487
+ "/Lotus/Language/Suits/ExcaliburName",
1488
+ "/Lotus/Language/Suits/TrinityName",
1489
+ "/Lotus/Language/Suits/EmberName"
1490
+ ],
1491
+ [
1492
+ "/Lotus/Language/Suits/LokiName",
1493
+ "/Lotus/Language/Suits/MagName",
1494
+ "/Lotus/Language/Suits/RhinoName"
1495
+ ],
1496
+ [
1497
+ "/Lotus/Language/Suits/AshName",
1498
+ "/Lotus/Language/Suits/FrostName",
1499
+ "/Lotus/Language/Suits/NyxName"
1500
+ ],
1501
+ [
1502
+ "/Lotus/Language/Suits/SarynName",
1503
+ "/Lotus/Language/Suits/VaubanName",
1504
+ "/Lotus/Language/Suits/NovaName"
1505
+ ],
1506
+ [
1507
+ "/Lotus/Language/Suits/NekrosName",
1508
+ "/Lotus/Language/Suits/ValkyrName",
1509
+ "/Lotus/Language/Suits/OberonName"
1510
+ ],
1511
+ [
1512
+ "/Lotus/Language/Suits/HydroidName",
1513
+ "/Lotus/Language/Suits/MirageName",
1514
+ "/Lotus/Language/Suits/LimboName"
1515
+ ],
1516
+ [
1517
+ "/Lotus/Language/Suits/MesaName",
1518
+ "/Lotus/Language/Suits/ChromaName",
1519
+ "/Lotus/Language/Suits/AtlasName"
1520
+ ],
1521
+ [
1522
+ "/Lotus/Language/Suits/IvaraName",
1523
+ "/Lotus/Language/Suits/InarosName",
1524
+ "/Lotus/Language/Suits/TitaniaName"
1525
+ ]
1526
+ ];
1527
+
1528
+ // src/data/wf/relics.ts
1529
+ var import_warframe_public_export_plus5 = require("warframe-public-export-plus");
1530
+ var relics = (() => {
1531
+ const result = {};
1532
+ for (const key in import_warframe_public_export_plus5.ExportRelics) {
1533
+ const exportRelic = import_warframe_public_export_plus5.ExportRelics[key];
1534
+ const exportRewards = import_warframe_public_export_plus5.ExportRewards[exportRelic.rewardManifest];
1535
+ const era = "/Lotus/Language/Relics/Era_" + exportRelic.era.toUpperCase();
1536
+ const relicKey = normalizeName(exportRelic.era + exportRelic.category);
1537
+ const rewards = (exportRewards[0] ?? []).map((r) => {
1538
+ const item = fixRelicRewardKey(r.type);
1539
+ return {
1540
+ name: item,
1541
+ rarity: r.rarity,
1542
+ quantity: r.itemCount
1543
+ };
1544
+ });
1545
+ const relic = {
1546
+ tier: exportRelic.era,
1547
+ tierKey: era,
1548
+ num: exportRelic.category,
1549
+ items: rewards
1550
+ };
1551
+ result[relicKey] = relic;
1552
+ }
1553
+ return result;
1554
+ })();
1555
+
1556
+ // src/data/wf/globalWorldState.ts
1557
+ var import_warframe_public_export_plus6 = require("warframe-public-export-plus");
1558
+
1559
+ // src/infrastructure/wf/wf-api.ts
1560
+ var apiBase = "https://api.warframe.com/cdn/";
1561
+ var getWorldState = /* @__PURE__ */ __name(async (json) => {
1562
+ if (!json) {
1563
+ json = await fetchAsyncText(apiBase + "worldState.php");
1564
+ }
1565
+ if (!json) {
1566
+ throw new Error("获取游戏信息失败");
1567
+ }
1568
+ const WorldStateParser = await import("warframe-worldstate-parser");
1569
+ return await WorldStateParser.WorldState.build(json);
1570
+ }, "getWorldState");
1571
+
1572
+ // src/data/wf/globalWorldState.ts
1573
+ var globalWorldState = createAsyncCache(async () => {
1574
+ const worldState = await getWorldState();
1575
+ const fissures = [];
1576
+ const rjFissures = [];
1577
+ const spFissures = [];
1578
+ for (const fissure of worldState.fissures) {
1579
+ const nodeKey = await getSolNodeKey(fissure.nodeKey);
1580
+ const tierName = fissure.tierNum in fissureTierName ? import_warframe_public_export_plus6.dict_zh[fissureTierName[fissure.tierNum]] : fissure.tierNum;
1581
+ const obj = {
1582
+ category: fissure.isStorm ? "rj-fissures" : fissure.isHard ? "sp-fissures" : "fissures",
1583
+ hard: fissure.isHard,
1584
+ activation: fissure.activation?.getTime(),
1585
+ expiry: fissure.expiry?.getTime(),
1586
+ node: regionToShort(import_warframe_public_export_plus6.ExportRegions[nodeKey], import_warframe_public_export_plus6.dict_zh),
1587
+ tier: tierName,
1588
+ tierNum: fissureTierNumToNumber(fissure.tierNum)
1589
+ };
1590
+ if (fissure.isStorm) {
1591
+ rjFissures.push(obj);
1592
+ } else if (fissure.isHard) {
1593
+ spFissures.push(obj);
1594
+ } else {
1595
+ fissures.push(obj);
1596
+ }
1597
+ }
1598
+ fissures.sort((a, b) => a.tierNum - b.tierNum);
1599
+ spFissures.sort((a, b) => a.tierNum - b.tierNum);
1600
+ rjFissures.sort((a, b) => a.tierNum - b.tierNum);
1601
+ return { raw: worldState, fissures, spFissures, rjFissures };
1602
+ }, 12e4);
1603
+
1600
1604
  // src/assets/arbys.ts
1601
1605
  var arbys = `1727884800,SettlementNode11
1602
1606
  1727888400,ClanNode10
@@ -45657,122 +45661,162 @@ var arbys = `1727884800,SettlementNode11
45657
45661
  `;
45658
45662
  var arbys_default = arbys;
45659
45663
 
45660
- // src/assets/circuitRewards.ts
45661
- var incarnonRewards = [
45662
- [
45663
- "/Lotus/Language/Items/AutoShotgunName",
45664
- "/Lotus/Language/Items/ReconnasorName",
45665
- "/Lotus/Language/Items/CorpusHandRocketLauncherName",
45666
- "/Lotus/Language/Items/HeavyRifleName",
45667
- "/Lotus/Language/Items/ParisScytheName"
45668
- ],
45669
- [
45670
- "/Lotus/Language/Items/StaffName",
45671
- "/Lotus/Language/Items/SemiAutoRifleName",
45672
- "/Lotus/Language/Items/AutoPistolName",
45673
- "/Lotus/Language/Items/FistName",
45674
- "/Lotus/Language/Items/ShotgunName"
45675
- ],
45676
- [
45677
- "/Lotus/Language/Locations/Lex",
45678
- "/Lotus/Language/Items/PaladinMaceName",
45679
- "/Lotus/Language/Items/BoltoRifleName",
45680
- "/Lotus/Language/Items/HandCannonName",
45681
- "/Lotus/Language/Items/CeramicDaggerName"
45682
- ],
45683
- [
45684
- "/Lotus/Language/ClanTech/Torid",
45685
- "/Lotus/Language/Items/InfestedLexName",
45686
- "/Lotus/Language/Weapons/InfestedDualAxeName",
45687
- "/Lotus/Language/Items/GrineerSawbladeGunName",
45688
- "/Lotus/Language/Items/GrnHeatGunName"
45689
- ],
45690
- [
45691
- "/Lotus/Language/Items/RegorAxeShieldName",
45692
- "/Lotus/Language/Items/TennoAssaultRifleName",
45693
- "/Lotus/Language/Items/TennoRevolverName",
45694
- "/Lotus/Language/Items/NamiSoloName",
45695
- "/Lotus/Language/Items/BurstRifleName"
45696
- ],
45697
- [
45698
- "/Lotus/Language/Weapons/SybarisPistolName",
45699
- "/Lotus/Language/Items/IceHammerName",
45700
- "/Lotus/Language/Items/StalkerBowName",
45701
- "/Lotus/Language/Items/StalkerKunaiName",
45702
- "/Lotus/Language/Items/StalkerScytheName"
45703
- ],
45704
- [
45705
- "/Lotus/Language/Items/EnergyRifleName",
45706
- "/Lotus/Language/Items/TennoLeverActionRifleName",
45707
- "/Lotus/Language/Items/CorpusMinigunName",
45708
- "/Lotus/Language/Items/BurstPistolName",
45709
- "/Lotus/Language/Items/TennoSaiName"
45710
- ],
45711
- [
45712
- "/Lotus/Language/Items/RifleName",
45713
- "/Lotus/Language/Items/PistolName",
45714
- "/Lotus/Language/Items/LongSwordName",
45715
- "/Lotus/Language/Items/HuntingBowName",
45716
- "/Lotus/Language/Items/KunaiName"
45717
- ]
45718
- ];
45719
- var warframeRewards = [
45720
- [
45721
- "/Lotus/Language/Suits/InfestationName",
45722
- "/Lotus/Language/Suits/BardName",
45723
- "/Lotus/Language/Suits/PriestName"
45724
- ],
45725
- [
45726
- "/Lotus/Language/Suits/GlassName",
45727
- "/Lotus/Language/Suits/KhoraName",
45728
- "/Lotus/Language/Suits/RevenantName"
45729
- ],
45730
- [
45731
- "/Lotus/Language/Suits/GarudaName",
45732
- "/Lotus/Language/Suits/PacifistName",
45733
- "/Lotus/Language/Suits/IronFrameName"
45734
- ],
45735
- [
45736
- "/Lotus/Language/Suits/ExcaliburName",
45737
- "/Lotus/Language/Suits/TrinityName",
45738
- "/Lotus/Language/Suits/EmberName"
45739
- ],
45740
- [
45741
- "/Lotus/Language/Suits/LokiName",
45742
- "/Lotus/Language/Suits/MagName",
45743
- "/Lotus/Language/Suits/RhinoName"
45744
- ],
45745
- [
45746
- "/Lotus/Language/Suits/AshName",
45747
- "/Lotus/Language/Suits/FrostName",
45748
- "/Lotus/Language/Suits/NyxName"
45749
- ],
45750
- [
45751
- "/Lotus/Language/Suits/SarynName",
45752
- "/Lotus/Language/Suits/VaubanName",
45753
- "/Lotus/Language/Suits/NovaName"
45754
- ],
45755
- [
45756
- "/Lotus/Language/Suits/NekrosName",
45757
- "/Lotus/Language/Suits/ValkyrName",
45758
- "/Lotus/Language/Suits/OberonName"
45759
- ],
45760
- [
45761
- "/Lotus/Language/Suits/HydroidName",
45762
- "/Lotus/Language/Suits/MirageName",
45763
- "/Lotus/Language/Suits/LimboName"
45764
- ],
45765
- [
45766
- "/Lotus/Language/Suits/MesaName",
45767
- "/Lotus/Language/Suits/ChromaName",
45768
- "/Lotus/Language/Suits/AtlasName"
45769
- ],
45770
- [
45771
- "/Lotus/Language/Suits/IvaraName",
45772
- "/Lotus/Language/Suits/InarosName",
45773
- "/Lotus/Language/Suits/TitaniaName"
45774
- ]
45775
- ];
45664
+ // src/data/wf/arbitrationSchedule.ts
45665
+ var arbitrationSchedule = arbys_default.split("\n").map((line) => line.split(",")).filter((arr) => arr.length == 2).map((arr) => {
45666
+ return {
45667
+ time: parseInt(arr[0]),
45668
+ node: arr[1]
45669
+ };
45670
+ });
45671
+
45672
+ // src/assets/rivenAttrValues.json
45673
+ var rivenAttrValues_default = {
45674
+ Rifle: {
45675
+ "Ammo Maximum": 49.95,
45676
+ "Damage to Corpus": 0.45,
45677
+ "Damage to Grineer": 0.45,
45678
+ "Damage to Infested": 0.45,
45679
+ "Cold Damage": 90,
45680
+ "Critical Chance": 149.99,
45681
+ "Critical Damage": 120,
45682
+ Damage: 165,
45683
+ "Electricity Damage": 90,
45684
+ "Heat Damage": 90,
45685
+ "Fire Rate / Attack Speed": 60.03,
45686
+ "Projectile Speed": 90,
45687
+ "Impact Damage": 119.97,
45688
+ "Magazine Capacity": 50,
45689
+ Multishot: 90,
45690
+ "Toxin Damage": 90,
45691
+ "Punch Through": 2.7,
45692
+ "Puncture Damage": 119.97,
45693
+ "Reload Speed": 50,
45694
+ "Slash Damage": 119.97,
45695
+ "Status Chance": 90,
45696
+ "Status Duration": 99.99,
45697
+ "Weapon Recoil": -90,
45698
+ Zoom: 59.99
45699
+ },
45700
+ Shotgun: {
45701
+ "Ammo Maximum": 90,
45702
+ "Damage to Corpus": 0.45,
45703
+ "Damage to Grineer": 0.45,
45704
+ "Damage to Infested": 0.45,
45705
+ "Cold Damage": 90,
45706
+ "Critical Chance": 90,
45707
+ "Critical Damage": 90,
45708
+ Damage: 164.7,
45709
+ "Electricity Damage": 90,
45710
+ "Heat Damage": 90,
45711
+ "Fire Rate / Attack Speed": 89.1,
45712
+ "Projectile Speed": 89.1,
45713
+ "Impact Damage": 119.97,
45714
+ "Magazine Capacity": 50,
45715
+ Multishot: 119.7,
45716
+ "Toxin Damage": 90,
45717
+ "Punch Through": 2.7,
45718
+ "Puncture Damage": 119.97,
45719
+ "Reload Speed": 49.45,
45720
+ "Slash Damage": 119.97,
45721
+ "Status Chance": 90,
45722
+ "Status Duration": 99,
45723
+ "Weapon Recoil": -90
45724
+ },
45725
+ Pistol: {
45726
+ "Ammo Maximum": 90,
45727
+ "Damage to Corpus": 0.45,
45728
+ "Damage to Grineer": 0.45,
45729
+ "Damage to Infested": 0.45,
45730
+ "Cold Damage": 90,
45731
+ "Critical Chance": 149.99,
45732
+ "Critical Damage": 90,
45733
+ Damage: 219.6,
45734
+ "Electricity Damage": 90,
45735
+ "Heat Damage": 90,
45736
+ "Fire Rate / Attack Speed": 74.7,
45737
+ "Projectile Speed": 90,
45738
+ "Impact Damage": 119.97,
45739
+ "Magazine Capacity": 50,
45740
+ Multishot: 119.7,
45741
+ "Toxin Damage": 90,
45742
+ "Punch Through": 2.7,
45743
+ "Puncture Damage": 119.97,
45744
+ "Reload Speed": 50,
45745
+ "Slash Damage": 119.97,
45746
+ "Status Chance": 90,
45747
+ "Status Duration": 99.99,
45748
+ "Weapon Recoil": -90,
45749
+ Zoom: 80.1
45750
+ },
45751
+ Archgun: {
45752
+ "Ammo Maximum": 99.9,
45753
+ "Damage to Corpus": 0.45,
45754
+ "Damage to Grineer": 0.45,
45755
+ "Damage to Infested": 0.45,
45756
+ "Cold Damage": 119.7,
45757
+ "Critical Chance": 99.9,
45758
+ "Critical Damage": 80.1,
45759
+ Damage: 99.9,
45760
+ "Electricity Damage": 119.7,
45761
+ "Heat Damage": 119.7,
45762
+ "Fire Rate / Attack Speed": 60.03,
45763
+ "Impact Damage": 90,
45764
+ "Magazine Capacity": 60.3,
45765
+ Multishot: 60.3,
45766
+ "Toxin Damage": 119.7,
45767
+ "Punch Through": 2.7,
45768
+ "Puncture Damage": 90,
45769
+ "Reload Speed": 99.9,
45770
+ "Slash Damage": 90,
45771
+ "Status Chance": 60.3,
45772
+ "Status Duration": 99.99,
45773
+ "Weapon Recoil": -90,
45774
+ Zoom: 59.99
45775
+ },
45776
+ Melee: {
45777
+ "Additional Combo Count Chance": 58.77,
45778
+ "Damage to Corpus": 0.45,
45779
+ "Damage to Grineer": 0.45,
45780
+ "Damage to Infested": 0.45,
45781
+ "Cold Damage": 90,
45782
+ "Combo Duration": 8.1,
45783
+ "Critical Chance": 180,
45784
+ "Critical Chance for Slide Attack": 120,
45785
+ "Critical Damage": 90,
45786
+ Damage: 164.7,
45787
+ "Electricity Damage": 90,
45788
+ "Heat Damage": 90,
45789
+ "Finisher Damage": 119.7,
45790
+ "Fire Rate / Attack Speed": 54.9,
45791
+ "Initial Combo": 24.5,
45792
+ "Impact Damage": 119.7,
45793
+ "Heavy Attack Efficiency": 73.44,
45794
+ "Toxin Damage": 90,
45795
+ "Puncture Damage": 119.7,
45796
+ Range: 1.94,
45797
+ "Slash Damage": 119.7,
45798
+ "Status Chance": 90,
45799
+ "Status Duration": 99
45800
+ }
45801
+ };
45802
+
45803
+ // src/data/wf/rivenBaseValues.ts
45804
+ var rivenAttrValueDict = (() => {
45805
+ const dict = {};
45806
+ for (const key in rivenAttrValues_default) {
45807
+ const attrs = rivenAttrValues_default[key];
45808
+ dict[key] = {};
45809
+ for (const attrKey in attrs) {
45810
+ const removeDamageSuffix = attrKey.endsWith("Damage") && attrKey !== "Damage" && attrKey !== "Finisher Damage" && !attrKey.startsWith("Critical");
45811
+ const wfmKey = removeDamageSuffix ? normalizeName(attrKey.replace("Damage", "")) : normalizeName(attrKey);
45812
+ dict[key][wfmKey] = attrs[attrKey];
45813
+ }
45814
+ }
45815
+ return dict;
45816
+ })();
45817
+
45818
+ // src/data/wf/rivenDisposition.ts
45819
+ var import_warframe_public_export_plus7 = require("warframe-public-export-plus");
45776
45820
 
45777
45821
  // src/assets/rivencalc.json
45778
45822
  var rivencalc_default = {
@@ -49471,350 +49515,983 @@ var rivencalc_default = {
49471
49515
  ]
49472
49516
  };
49473
49517
 
49474
- // src/assets/rivenAttrValues.json
49475
- var rivenAttrValues_default = {
49476
- Rifle: {
49477
- "Ammo Maximum": 49.95,
49478
- "Damage to Corpus": 0.45,
49479
- "Damage to Grineer": 0.45,
49480
- "Damage to Infested": 0.45,
49481
- "Cold Damage": 90,
49482
- "Critical Chance": 149.99,
49483
- "Critical Damage": 120,
49484
- Damage: 165,
49485
- "Electricity Damage": 90,
49486
- "Heat Damage": 90,
49487
- "Fire Rate / Attack Speed": 60.03,
49488
- "Projectile Speed": 90,
49489
- "Impact Damage": 119.97,
49490
- "Magazine Capacity": 50,
49491
- Multishot: 90,
49492
- "Toxin Damage": 90,
49493
- "Punch Through": 2.7,
49494
- "Puncture Damage": 119.97,
49495
- "Reload Speed": 50,
49496
- "Slash Damage": 119.97,
49497
- "Status Chance": 90,
49498
- "Status Duration": 99.99,
49499
- "Weapon Recoil": -90,
49500
- Zoom: 59.99
49501
- },
49502
- Shotgun: {
49503
- "Ammo Maximum": 90,
49504
- "Damage to Corpus": 0.45,
49505
- "Damage to Grineer": 0.45,
49506
- "Damage to Infested": 0.45,
49507
- "Cold Damage": 90,
49508
- "Critical Chance": 90,
49509
- "Critical Damage": 90,
49510
- Damage: 164.7,
49511
- "Electricity Damage": 90,
49512
- "Heat Damage": 90,
49513
- "Fire Rate / Attack Speed": 89.1,
49514
- "Projectile Speed": 89.1,
49515
- "Impact Damage": 119.97,
49516
- "Magazine Capacity": 50,
49517
- Multishot: 119.7,
49518
- "Toxin Damage": 90,
49519
- "Punch Through": 2.7,
49520
- "Puncture Damage": 119.97,
49521
- "Reload Speed": 49.45,
49522
- "Slash Damage": 119.97,
49523
- "Status Chance": 90,
49524
- "Status Duration": 99,
49525
- "Weapon Recoil": -90
49526
- },
49527
- Pistol: {
49528
- "Ammo Maximum": 90,
49529
- "Damage to Corpus": 0.45,
49530
- "Damage to Grineer": 0.45,
49531
- "Damage to Infested": 0.45,
49532
- "Cold Damage": 90,
49533
- "Critical Chance": 149.99,
49534
- "Critical Damage": 90,
49535
- Damage: 219.6,
49536
- "Electricity Damage": 90,
49537
- "Heat Damage": 90,
49538
- "Fire Rate / Attack Speed": 74.7,
49539
- "Projectile Speed": 90,
49540
- "Impact Damage": 119.97,
49541
- "Magazine Capacity": 50,
49542
- Multishot: 119.7,
49543
- "Toxin Damage": 90,
49544
- "Punch Through": 2.7,
49545
- "Puncture Damage": 119.97,
49546
- "Reload Speed": 50,
49547
- "Slash Damage": 119.97,
49548
- "Status Chance": 90,
49549
- "Status Duration": 99.99,
49550
- "Weapon Recoil": -90,
49551
- Zoom: 80.1
49518
+ // src/data/wf/rivenDisposition.ts
49519
+ var weaponRivenDispositionDict = (() => {
49520
+ const mapped = rivencalc_default.weapons.reduce(
49521
+ (prev, element) => {
49522
+ let mapped2 = void 0;
49523
+ for (const weaponKey in import_warframe_public_export_plus7.ExportWeapons) {
49524
+ const weapon = import_warframe_public_export_plus7.ExportWeapons[weaponKey];
49525
+ const splited = weapon.name.split("/");
49526
+ if (splited.length <= 0) {
49527
+ continue;
49528
+ }
49529
+ const keyName = splited[splited.length - 1];
49530
+ const normalizedCalcName = normalizeName(element.name);
49531
+ if (normalizeName(keyName) === normalizedCalcName) {
49532
+ mapped2 = weapon;
49533
+ break;
49534
+ }
49535
+ const weaponEN2 = import_warframe_public_export_plus7.dict_en[weapon.name];
49536
+ if (weaponEN2 && normalizeName(weaponEN2) === normalizedCalcName) {
49537
+ mapped2 = weapon;
49538
+ break;
49539
+ }
49540
+ }
49541
+ if (!mapped2) {
49542
+ return prev;
49543
+ }
49544
+ const weaponEN = import_warframe_public_export_plus7.dict_en[mapped2.name];
49545
+ const weaponZH = import_warframe_public_export_plus7.dict_zh[mapped2.name];
49546
+ const result = {
49547
+ name: {
49548
+ en: weaponEN,
49549
+ zh: weaponZH
49550
+ },
49551
+ calc: element,
49552
+ weapon: mapped2
49553
+ };
49554
+ prev.push(result);
49555
+ return prev;
49556
+ },
49557
+ []
49558
+ );
49559
+ return listToDict(mapped, (e) => [
49560
+ normalizeName(e.name.zh),
49561
+ normalizeName(e.name.en)
49562
+ ]);
49563
+ })();
49564
+
49565
+ // src/data/wf/rivenStatData.ts
49566
+ var rivenStatFixFactor = {
49567
+ "2": { buffFactor: 0.99, buffCount: 2, curseFactor: 0, curseCount: 0 },
49568
+ "21": {
49569
+ buffFactor: 1.2375,
49570
+ buffCount: 2,
49571
+ curseFactor: -0.495,
49572
+ curseCount: 1
49552
49573
  },
49553
- Archgun: {
49554
- "Ammo Maximum": 99.9,
49555
- "Damage to Corpus": 0.45,
49556
- "Damage to Grineer": 0.45,
49557
- "Damage to Infested": 0.45,
49558
- "Cold Damage": 119.7,
49559
- "Critical Chance": 99.9,
49560
- "Critical Damage": 80.1,
49561
- Damage: 99.9,
49562
- "Electricity Damage": 119.7,
49563
- "Heat Damage": 119.7,
49564
- "Fire Rate / Attack Speed": 60.03,
49565
- "Impact Damage": 90,
49566
- "Magazine Capacity": 60.3,
49567
- Multishot: 60.3,
49568
- "Toxin Damage": 119.7,
49569
- "Punch Through": 2.7,
49570
- "Puncture Damage": 90,
49571
- "Reload Speed": 99.9,
49572
- "Slash Damage": 90,
49573
- "Status Chance": 60.3,
49574
- "Status Duration": 99.99,
49575
- "Weapon Recoil": -90,
49576
- Zoom: 59.99
49574
+ "3": {
49575
+ buffFactor: 0.75,
49576
+ buffCount: 3,
49577
+ curseFactor: 0,
49578
+ curseCount: 0
49577
49579
  },
49578
- Melee: {
49579
- "Additional Combo Count Chance": 58.77,
49580
- "Damage to Corpus": 0.45,
49581
- "Damage to Grineer": 0.45,
49582
- "Damage to Infested": 0.45,
49583
- "Cold Damage": 90,
49584
- "Combo Duration": 8.1,
49585
- "Critical Chance": 180,
49586
- "Critical Chance for Slide Attack": 120,
49587
- "Critical Damage": 90,
49588
- Damage: 164.7,
49589
- "Electricity Damage": 90,
49590
- "Heat Damage": 90,
49591
- "Finisher Damage": 119.7,
49592
- "Fire Rate / Attack Speed": 54.9,
49593
- "Initial Combo": 24.5,
49594
- "Impact Damage": 119.7,
49595
- "Heavy Attack Efficiency": 73.44,
49596
- "Toxin Damage": 90,
49597
- "Puncture Damage": 119.7,
49598
- Range: 1.94,
49599
- "Slash Damage": 119.7,
49600
- "Status Chance": 90,
49601
- "Status Duration": 99
49580
+ "31": {
49581
+ buffFactor: 0.9375,
49582
+ buffCount: 3,
49583
+ curseFactor: -0.75,
49584
+ curseCount: 1
49602
49585
  }
49603
49586
  };
49604
49587
 
49605
- // src/components/wf.tsx
49606
- var import_jsx_runtime2 = require("@satorijs/element/jsx-runtime");
49607
- var ArbitrationTable = /* @__PURE__ */ __name((arbi) => {
49608
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
49609
- "div",
49610
- {
49611
- style: "width:calc(100dvw-40px);display:flex;flex-direction:column;align-items: center;",
49612
- children: [
49613
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h1", { children: "高掉落仲裁时间表" }),
49614
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("ul", { style: "width:100%;font-size: 30px;", children: arbi.map((a) => {
49615
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("li", { children: [
49616
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
49617
- "[",
49618
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: "color:darkgreen;", children: a.time }),
49619
- "]"
49620
- ] }),
49621
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: "margin-left:10px;", children: `${a.name} ${a.system}-${a.type} (${a.faction})`.replace(
49622
- /\(|\)/g,
49623
- ""
49624
- ) }),
49625
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { style: "margin-left:10px;", children: [
49626
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: "color:darkgreen;", children: a.rewards }),
49627
- "精华/h"
49628
- ] })
49629
- ] });
49630
- }) }) })
49631
- ]
49632
- }
49588
+ // src/services/wf-service.ts
49589
+ var getRelic = /* @__PURE__ */ __name(async (input) => {
49590
+ if (!input) {
49591
+ return "请提供正确的遗物名称";
49592
+ }
49593
+ input = normalizeName(input);
49594
+ if (!input) {
49595
+ return "请提供正确的遗物名称";
49596
+ }
49597
+ if (!relics) {
49598
+ return "遗物数据未加载完成,请稍后再试";
49599
+ }
49600
+ const tierListForMatch = [
49601
+ "古纪",
49602
+ "前纪",
49603
+ "中纪",
49604
+ "后纪",
49605
+ "安魂",
49606
+ "先锋",
49607
+ "Lith",
49608
+ "Meso",
49609
+ "Neo",
49610
+ "Axi",
49611
+ "Requiem",
49612
+ "Vanguard"
49613
+ ].map((t) => normalizeName(t));
49614
+ const tier = tierListForMatch.find((t) => input.startsWith(t));
49615
+ if (!tier) {
49616
+ return "请提供正确的遗物名称";
49617
+ }
49618
+ const category = input.replace(new RegExp(`^${tier}`), "").replace(/遗物$|relic$/, "");
49619
+ const zhTierMap = {
49620
+ 古纪: "Lith",
49621
+ 前纪: "Meso",
49622
+ 中纪: "Neo",
49623
+ 后纪: "Axi",
49624
+ 安魂: "Requiem",
49625
+ 先锋: "Vanguard"
49626
+ };
49627
+ const enTier = zhTierMap[tier] ?? tier;
49628
+ const key = normalizeName(enTier + category);
49629
+ return relics[key] ?? "未找到对应遗物信息";
49630
+ }, "getRelic");
49631
+ var getArbitrations = /* @__PURE__ */ __name((day = 3) => {
49632
+ if (day > 14 || day <= 0) {
49633
+ return "天数需小于等于14且大于0";
49634
+ }
49635
+ const currentHourTimeStamp = Math.floor(
49636
+ (/* @__PURE__ */ new Date()).setMinutes(0, 0, 0) / 1e3
49633
49637
  );
49634
- }, "ArbitrationTable");
49635
- var CircuitTable = /* @__PURE__ */ __name((incarnons, warframes) => {
49636
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
49637
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("header", { style: "text-align: center;font-size:30px;", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h1", { children: "本周回廊奖励" }) }),
49638
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
49639
- "div",
49640
- {
49641
- style: "display:flex;flex-direction:column;align-items:center;margin-top:40px;font-size:40px;",
49642
- children: [
49643
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: "display:flex;align-items:center;line-height:1;", children: [
49644
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: "灵化之源:" }),
49645
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("ul", { style: "display:flex;gap:13px;margin-left:15px;", children: incarnons.map((i) => {
49646
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("li", { children: i });
49647
- }) })
49648
- ] }),
49649
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
49650
- "div",
49651
- {
49652
- style: "display:flex;align-items:center;line-height:1;margin-top:40px;",
49653
- children: [
49654
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: "战甲:" }),
49655
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("ul", { style: "display:flex;gap:13px;margin-left:15px;", children: warframes.map((i) => {
49656
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("li", { children: i });
49657
- }) })
49658
- ]
49659
- }
49660
- )
49661
- ]
49638
+ const currentHourIndex = arbitrationSchedule.findIndex(
49639
+ (a) => a.time === currentHourTimeStamp
49640
+ );
49641
+ const weekArbys = arbitrationSchedule.slice(
49642
+ currentHourIndex,
49643
+ currentHourIndex + 24 * day
49644
+ );
49645
+ return weekArbys.filter((a) => arbyRewards_default[a.node]).map((a) => {
49646
+ const obj = regionToShort(import_warframe_public_export_plus8.ExportRegions[a.node], import_warframe_public_export_plus8.dict_zh);
49647
+ return {
49648
+ ...obj,
49649
+ time: new Date(a.time * 1e3).toLocaleString("zh-cn", {
49650
+ year: "numeric",
49651
+ month: "numeric",
49652
+ day: "numeric",
49653
+ hour: "numeric",
49654
+ // minute: 'numeric', // 保持注释或删除,以去除分钟
49655
+ // second: 'numeric', // 保持注释或删除,以去除秒
49656
+ hour12: false,
49657
+ // 统一使用 24 小时制
49658
+ // hourCycle: 'h23' // 另一种设置 24 小时制的方法
49659
+ timeZone: "Asia/Shanghai"
49660
+ }),
49661
+ rewards: arbyRewards_default[a.node]
49662
+ };
49663
+ });
49664
+ }, "getArbitrations");
49665
+ var getWeekly = /* @__PURE__ */ __name(async () => {
49666
+ const { raw: worldState } = await globalWorldState.get();
49667
+ if (!worldState) {
49668
+ return "内部错误,获取最新信息失败";
49669
+ }
49670
+ const archon = {
49671
+ name: import_warframe_public_export_plus8.dict_zh["/Lotus/Language/Narmer/" + removeSpace(worldState.archonHunt.boss)]
49672
+ };
49673
+ const stringToDebuff = /* @__PURE__ */ __name((key, name2, prefix) => {
49674
+ const keyToName = zh_default[`${prefix}${key}`];
49675
+ if (!keyToName) {
49676
+ for (const transKey in en_default) {
49677
+ if (en_default[transKey] === name2) {
49678
+ return {
49679
+ name: zh_default[transKey],
49680
+ desc: zh_default[transKey + "_Desc"]
49681
+ };
49682
+ }
49662
49683
  }
49663
- )
49664
- ] });
49665
- }, "CircuitTable");
49666
- var FissureTable = /* @__PURE__ */ __name((fissures, type) => {
49667
- const titles = {
49668
- fissure: "虚空裂缝",
49669
- "sp-fissure": "虚空裂缝 (钢铁之路)",
49670
- "rj-fissure": "虚空裂缝 (九重天)"
49684
+ }
49685
+ const riskDesc = zh_default[`${prefix}${key}_Desc`];
49686
+ return {
49687
+ name: keyToName,
49688
+ desc: riskDesc
49689
+ };
49690
+ }, "stringToDebuff");
49691
+ const deepArchim = worldState.archimedeas[0];
49692
+ const deepArchimMissions = await Promise.all(
49693
+ deepArchim.missions.map(async (m) => {
49694
+ const receivedType = await getMissionTypeKey(m.missionType);
49695
+ const type = import_warframe_public_export_plus8.dict_zh[import_warframe_public_export_plus8.ExportMissionTypes[receivedType]?.name ?? ""] ?? m.missionType;
49696
+ const deviation = stringToDebuff(
49697
+ m.deviation.key,
49698
+ m.deviation.name,
49699
+ "/Lotus/Language/Conquest/MissionVariant_LabConquest_"
49700
+ );
49701
+ const risks = m.risks.map(
49702
+ (r) => stringToDebuff(r.key, r.name, "/Lotus/Language/Conquest/Condition_")
49703
+ );
49704
+ return {
49705
+ type,
49706
+ deviation,
49707
+ risks
49708
+ };
49709
+ })
49710
+ );
49711
+ const deepArchimPersonalModifier = deepArchim.personalModifiers.map(
49712
+ (p) => stringToDebuff(p.key, p.name, "/Lotus/Language/Conquest/PersonalMod_")
49713
+ );
49714
+ const deepArchimRes = {
49715
+ name: "深层科研",
49716
+ missions: deepArchimMissions,
49717
+ peronal: deepArchimPersonalModifier
49671
49718
  };
49672
- const colors = [
49673
- "#B87333",
49674
- "#4A6F43",
49675
- "#B2B2B2",
49676
- "#D4AF37",
49677
- "#8B0000",
49678
- "#2F9E88"
49719
+ const temporalArchim = worldState.archimedeas[1];
49720
+ const temporalArchimMissions = await Promise.all(
49721
+ temporalArchim.missions.map(async (m) => {
49722
+ const receivedType = await getMissionTypeKey(m.missionType);
49723
+ const type = import_warframe_public_export_plus8.dict_zh[import_warframe_public_export_plus8.ExportMissionTypes[receivedType]?.name ?? ""] ?? receivedType;
49724
+ const deviation = stringToDebuff(
49725
+ m.deviation.key,
49726
+ m.deviation.name,
49727
+ "/Lotus/Language/Conquest/MissionVariant_HexConquest_"
49728
+ );
49729
+ const risks = m.risks.map(
49730
+ (r) => stringToDebuff(r.key, r.name, "/Lotus/Language/Conquest/Condition_")
49731
+ );
49732
+ return {
49733
+ type,
49734
+ deviation,
49735
+ risks
49736
+ };
49737
+ })
49738
+ );
49739
+ const temporalArchimPersonalModifier = temporalArchim.personalModifiers.map(
49740
+ (p) => stringToDebuff(p.key, p.name, "/Lotus/Language/Conquest/PersonalMod_")
49741
+ );
49742
+ const temporalArchimRes = {
49743
+ name: "时光科研",
49744
+ missions: temporalArchimMissions,
49745
+ peronal: temporalArchimPersonalModifier
49746
+ };
49747
+ return {
49748
+ archonHunt: archon,
49749
+ deepArchimedea: deepArchimRes,
49750
+ temporalArchimedea: temporalArchimRes
49751
+ };
49752
+ }, "getWeekly");
49753
+ var getEnvironment = /* @__PURE__ */ __name(async () => {
49754
+ const { raw: worldState } = await globalWorldState.get();
49755
+ if (!worldState) {
49756
+ return "内部错误,获取最新信息失败";
49757
+ }
49758
+ const cetusDay = worldState.cetusCycle.isDay ? "白天" : "黑夜";
49759
+ const cetus = `地球/夜灵平野: ${cetusDay} ${worldState.cetusCycle.timeLeft}`;
49760
+ const vallisState = worldState.vallisCycle.isWarm ? "温暖" : "寒冷";
49761
+ const vallis = `奥布山谷: ${vallisState} ${worldState.vallisCycle.timeLeft}`;
49762
+ const cambionState = worldState.cambionCycle.state ? worldState.cambionCycle.state.charAt(0).toUpperCase() + worldState.cambionCycle.state.slice(1) : "未知";
49763
+ const cambion = `魔胎之境: ${cambionState} ${worldState.cambionCycle.timeLeft}`;
49764
+ const duviriStateTransDict = {
49765
+ sorrow: "悲伤",
49766
+ fear: "恐惧",
49767
+ joy: "喜悦",
49768
+ anger: "愤怒",
49769
+ envy: "嫉妒"
49770
+ };
49771
+ const duviriState = duviriStateTransDict[worldState.duviriCycle.state] ?? worldState.duviriCycle.state;
49772
+ const duviri = `双衍王境: ${duviriState} ${worldState.duviriCycle.endString}`;
49773
+ const zarimanFaction = worldState.zarimanCycle.isCorpus ? "Corpus" : "Grineer";
49774
+ const zariman = `扎里曼号: ${zarimanFaction} ${worldState.zarimanCycle.timeLeft}`;
49775
+ return `当前环境:
49776
+ ${cetus}
49777
+ ${vallis}
49778
+ ${cambion}
49779
+ ${duviri}
49780
+ ${zariman}`;
49781
+ }, "getEnvironment");
49782
+ var getCircuitWeek = /* @__PURE__ */ __name(() => {
49783
+ const EPOCH = 1734307200 * 1e3;
49784
+ const week = Math.trunc((Date.now() - EPOCH) / 6048e5);
49785
+ const incarnons2 = incarnons[week % incarnons.length].map(
49786
+ (i) => import_warframe_public_export_plus8.dict_zh[i]
49787
+ );
49788
+ const warframes2 = warframes[week % warframes.length].map(
49789
+ (i) => import_warframe_public_export_plus8.dict_zh[i]
49790
+ );
49791
+ return {
49792
+ incarnons: incarnons2,
49793
+ warframes: warframes2
49794
+ };
49795
+ }, "getCircuitWeek");
49796
+ var getFissures = /* @__PURE__ */ __name(async () => {
49797
+ const { fissures } = await globalWorldState.get();
49798
+ return fissures ?? "内部错误,获取最新信息失败";
49799
+ }, "getFissures");
49800
+ var getSteelPathFissures = /* @__PURE__ */ __name(async () => {
49801
+ const { spFissures } = await globalWorldState.get();
49802
+ return spFissures ?? "内部错误,获取最新信息失败";
49803
+ }, "getSteelPathFissures");
49804
+ var getRailjackFissures = /* @__PURE__ */ __name(async () => {
49805
+ const { rjFissures } = await globalWorldState.get();
49806
+ return rjFissures ?? "内部错误,获取最新信息失败";
49807
+ }, "getRailjackFissures");
49808
+ var getAnalyzedRiven = /* @__PURE__ */ __name(async (secret, url) => {
49809
+ const img = await fetchAsyncImage(url);
49810
+ if (!img) {
49811
+ return "获取图片失败";
49812
+ }
49813
+ const extractResult = await extractTextFromImage(img, secret);
49814
+ if (!extractResult) {
49815
+ return "解析图片失败";
49816
+ }
49817
+ const parseResult = await parseOCRResult(extractResult);
49818
+ if (!parseResult || parseResult.attributes.length < 2 || parseResult.attributes.length > 4) {
49819
+ return "解析图片失败";
49820
+ }
49821
+ return analyzeRivenStat(parseResult);
49822
+ }, "getAnalyzedRiven");
49823
+ var getVoidTrader = /* @__PURE__ */ __name(async () => {
49824
+ const { raw: worldState } = await globalWorldState.get();
49825
+ if (worldState.voidTraders.length === 0) {
49826
+ return "虚空商人仍在未知地带漂流...";
49827
+ }
49828
+ const trader = worldState.voidTraders[0];
49829
+ if (trader && trader.activation && trader.activation.getTime() > Date.now()) {
49830
+ const diff2 = trader.activation.getTime() - Date.now();
49831
+ return "距离虚空商人到达还有: " + msToHumanReadable(diff2);
49832
+ }
49833
+ const diff = trader.expiry.getTime() - Date.now();
49834
+ const items = trader.inventory.map(getVoidTraderItem);
49835
+ return { expiry: msToHumanReadable(diff), items };
49836
+ }, "getVoidTrader");
49837
+ var getStaticRivenStats = /* @__PURE__ */ __name(async (weaponType, statType, disposition) => {
49838
+ if (disposition > 1.51 || disposition < 0.5) {
49839
+ return "裂罅倾向错误";
49840
+ }
49841
+ const weaponTypes = [
49842
+ "步枪",
49843
+ "手枪",
49844
+ "霰弹枪",
49845
+ "Archwing枪械",
49846
+ "近战",
49847
+ "Rifle",
49848
+ "Shotgun",
49849
+ "Pistol",
49850
+ "Archgun",
49851
+ "Melee"
49679
49852
  ];
49680
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: "display:flex;flex-direction:column;align-items:center;", children: [
49681
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h1", { style: "font-size: 50px;", children: titles[type] }),
49682
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("ul", { style: "font-size: 30px;margin-top:30px;", children: fissures.filter((f) => f.expiry - Date.now() > 0).map((f) => {
49683
- let timeLeft = f.expiry - Date.now();
49684
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("li", { style: "margin-top: 10px;", children: [
49685
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: `color:${colors[f.tierNum - 1]};`, children: `${f.tier}(T${f.tierNum})` }),
49686
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { style: "margin-left: 20px;", children: [
49687
- f.node.name,
49688
- " ",
49689
- f.node.system
49690
- ] }),
49691
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: "margin-left: 10px;", children: f.node.type }),
49692
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { style: "margin-left: 10px;color:purple;", children: [
49693
- f.node.faction,
49694
- "(",
49695
- f.node.minLevel + 5 + (f.hard ? 100 : 0),
49696
- "-",
49697
- f.node.maxLevel + 5 + (f.hard ? 100 : 0),
49698
- ")"
49699
- ] }),
49700
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
49701
- "span",
49702
- {
49703
- style: `margin-left: 10px;color:${timeLeft > 36e5 ? "green" : timeLeft > 6e5 ? "blue" : "red"};`,
49704
- children: [
49705
- "剩余",
49706
- msToHumanReadable(timeLeft)
49707
- ]
49708
- }
49709
- )
49710
- ] });
49711
- }) }),
49712
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { style: "margin-top: 30px; font-size: 30px;", children: "注: 该功能的数据有一定延迟" })
49713
- ] });
49714
- }, "FissureTable");
49715
- var WeeklyTable = /* @__PURE__ */ __name(async (archon, deepArchimedea, temporalArchimedea) => {
49716
- const archonRes = `执行官: ${archon}`;
49717
- const deepRes = `${deepArchimedea.name}
49718
- ${deepArchimedea.missions.map((m) => {
49719
- let result = `${m.type}
49720
- 偏差: ${m.diviation.name}(${m.diviation.desc})`;
49721
- for (const risk of m.risks) {
49722
- result += `
49723
- 风险: ${risk.name}(${risk.desc})`;
49853
+ const matchedWeaponType = weaponTypes.find(
49854
+ (v) => normalizeName(v).startsWith(normalizeName(weaponType))
49855
+ );
49856
+ if (!matchedWeaponType) {
49857
+ return "武器类型错误";
49858
+ }
49859
+ const weaponTypeKeys = {
49860
+ 步枪: "Rifle",
49861
+ 手枪: "Pistol",
49862
+ 霰弹枪: "Shotgun",
49863
+ 近战: "Melee",
49864
+ Archwing枪械: "Archgun"
49865
+ };
49866
+ const weaponTypeKey = weaponTypeKeys[matchedWeaponType] ?? matchedWeaponType;
49867
+ const statTypes = ["2", "3", "21", "31"];
49868
+ if (!statTypes.includes(statType)) {
49869
+ return "词条类型错误";
49870
+ }
49871
+ const rivenAttrValues = rivenAttrValueDict[weaponTypeKey];
49872
+ const factor = rivenStatFixFactor[statType];
49873
+ const result = {
49874
+ positive: {},
49875
+ negative: factor.curseCount > 0 ? {} : void 0
49876
+ };
49877
+ const { globalRivenAttributeList } = await globalRivenAttribute.get();
49878
+ for (const key in rivenAttrValues) {
49879
+ const data = globalRivenAttributeList.find(
49880
+ (v) => normalizeName(v.i18n["en"].name) == key
49881
+ );
49882
+ const baseValue = rivenAttrValues[key];
49883
+ const buffValue = baseValue * disposition * factor.buffFactor;
49884
+ result.positive[key] = {
49885
+ name: data?.i18n["zh-hans"].name ?? key,
49886
+ max: buffValue * 1.1,
49887
+ min: buffValue * 0.9,
49888
+ unit: data?.unit ?? ""
49889
+ };
49890
+ if (result.negative) {
49891
+ const curseValue = baseValue * disposition * factor.curseFactor;
49892
+ result.negative[key] = {
49893
+ name: data?.i18n["zh-hans"].name ?? key,
49894
+ max: curseValue * 0.9,
49895
+ min: curseValue * 1.1,
49896
+ unit: data?.unit ?? ""
49897
+ };
49724
49898
  }
49725
- return result;
49726
- }).join("\n")}
49727
- ${deepArchimedea.peronal.map((per) => {
49728
- return `个人变量: ${per.name}(${per.desc})`;
49729
- }).join("\n")}`;
49730
- const tempRes = `${temporalArchimedea.name}
49731
- ${temporalArchimedea.missions.map((m) => {
49732
- let result = `${m.type}
49733
- 偏差: ${m.diviation.name}(${m.diviation.desc})`;
49734
- for (const risk of m.risks) {
49735
- result += `
49736
- 风险: ${risk.name}(${risk.desc})`;
49899
+ }
49900
+ return result;
49901
+ }, "getStaticRivenStats");
49902
+ var getWeaponRivenDisposition = /* @__PURE__ */ __name((name2) => {
49903
+ const normalizedName = normalizeName(name2);
49904
+ const normalRes = weaponRivenDispositionDict[normalizedName];
49905
+ if (normalRes) {
49906
+ return normalRes;
49907
+ }
49908
+ const withPrimeSuffix = normalizedName + "prime";
49909
+ const withPrimeRes = weaponRivenDispositionDict[withPrimeSuffix];
49910
+ if (withPrimeRes) {
49911
+ return withPrimeRes;
49912
+ }
49913
+ return void 0;
49914
+ }, "getWeaponRivenDisposition");
49915
+ var parseOCRResult = /* @__PURE__ */ __name(async (ocrResult) => {
49916
+ const { globalRivenAttributeList } = await globalRivenAttribute.get();
49917
+ const list = ocrResult;
49918
+ if (!list.length) {
49919
+ return;
49920
+ }
49921
+ function similarity(standard, input) {
49922
+ if (!standard || !input) {
49923
+ return 0;
49737
49924
  }
49738
- return result;
49739
- }).join("\n")}
49740
- ${temporalArchimedea.peronal.map((per) => {
49741
- return `个人变量: ${per.name}(${per.desc})`;
49742
- }).join("\n")}`;
49743
- return `${archonRes}
49744
-
49745
- ${deepRes}
49746
-
49747
- ${tempRes}`;
49748
- }, "WeeklyTable");
49749
- var RelicComponent = /* @__PURE__ */ __name((relic) => {
49750
- const gold = relic.items.filter((i) => i.rarity === "RARE");
49751
- const silver = relic.items.filter((i) => i.rarity === "UNCOMMON");
49752
- const bronze = relic.items.filter((i) => i.rarity === "COMMON");
49753
- const getRateColor = /* @__PURE__ */ __name((rarity) => {
49754
- if (rarity === "RARE") return "#ffd700";
49755
- if (rarity === "UNCOMMON") return "#c0c0c0";
49756
- if (rarity === "COMMON") return "#cd7f32";
49757
- return "#000000";
49758
- }, "getRateColor");
49759
- const relicRewardDropRate = {
49760
- RARE: "2/4/6/10",
49761
- UNCOMMON: "11/13/17/20",
49762
- COMMON: "25/23/20/17"
49763
- };
49764
- const renderRewards = /* @__PURE__ */ __name((items) => {
49765
- if (items.length === 0) return null;
49766
- return items.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
49767
- "div",
49768
- {
49769
- style: `padding: 8px 12px;
49770
- margin: 4px 0;
49771
- border-radius: 4px;
49772
- background-color: rgba(255, 255, 255, 0.05);
49773
- border-left: 4px solid ${getRateColor(item.rarity)};
49774
- display: flex;
49775
- justify-content: space-between;
49776
- align-items: center;
49777
- line-height: 1;`,
49778
- children: [
49779
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: `color: #000000; font-size: 14px;`, children: item.name }),
49780
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
49781
- "span",
49782
- {
49783
- style: `color: #a0a0a0;
49784
- font-size: 12px;
49785
- font-family: monospace;
49786
- display:flex;
49787
- gap:10px;`,
49788
- children: [
49789
- item.platinum ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
49790
- "span",
49791
- {
49792
- style: "\n color: #0d93b8;\n display:flex;\n line-height:1;",
49793
- children: [
49794
- item.platinum,
49795
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
49796
- "svg",
49797
- {
49798
- viewBox: "0 0 18 18",
49799
- style: "\n color: rgb(64 64 64 / 75%);\n height: 1em;\n width: 1em;\n vertical-align: -.125em;\n fill: currentcolor;\n margin-left:2px;",
49800
- children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("use", { href: `#icon-platinum` })
49801
- }
49802
- )
49803
- ]
49925
+ standard = normalizeName(standard);
49926
+ input = normalizeName(input);
49927
+ if (input === "伤害") {
49928
+ return standard === "基础伤害" ? 1 : 0;
49929
+ }
49930
+ if (standard === "基础伤害" && input.match(/^伤害$|近战伤害/)) {
49931
+ return 1;
49932
+ }
49933
+ if (standard === "暴击率") {
49934
+ standard = "暴击几率";
49935
+ }
49936
+ if (standard.includes(input) || input.includes(standard) || standard.split("/").find((x) => !!x && input.includes(x))) {
49937
+ return 1;
49938
+ }
49939
+ const t = tokenSimilarity(standard, input);
49940
+ const s = normalSimilarity(standard, input);
49941
+ return Math.max(t, s);
49942
+ }
49943
+ __name(similarity, "similarity");
49944
+ const texts = list;
49945
+ const attributes = [];
49946
+ const statLines = [];
49947
+ for (const t of texts) {
49948
+ if (!t || !t.match(/^[x+-]|^[0-9]/)) {
49949
+ continue;
49950
+ }
49951
+ const prefix = t.match(/^[x+-]/) ? t[0] : "";
49952
+ const attrNamePart = removeSpace(t ?? "").replace(/^[^一-龥]+/, "");
49953
+ const attr = globalRivenAttributeList.find((a) => {
49954
+ if (!a) return false;
49955
+ let zhName = a.i18n["zh-hans"]?.name;
49956
+ if (!zhName) return false;
49957
+ const sim = similarity(zhName, attrNamePart);
49958
+ if (sim < 0.8) return false;
49959
+ return true;
49960
+ });
49961
+ if (!attr) {
49962
+ continue;
49963
+ }
49964
+ statLines.push(t);
49965
+ const value = (/* @__PURE__ */ __name((function extractStatValue(text) {
49966
+ const t2 = text.replace(/\s+/g, "");
49967
+ const multMatch = t2.match(/x(\d+(\.\d+)?)/i);
49968
+ if (multMatch) {
49969
+ return {
49970
+ value: parseFloat(multMatch[1]),
49971
+ type: "multiply"
49972
+ };
49973
+ }
49974
+ const percentMatch = t2.match(/([+-]?\d+(\.\d+)?)%/);
49975
+ if (percentMatch) {
49976
+ return {
49977
+ value: parseFloat(percentMatch[1]),
49978
+ type: "percent"
49979
+ };
49980
+ }
49981
+ const numMatch = t2.match(/([+-]?\d+(\.\d+)?)/);
49982
+ if (numMatch) {
49983
+ return {
49984
+ value: parseFloat(numMatch[1]),
49985
+ type: "number"
49986
+ };
49987
+ }
49988
+ return void 0;
49989
+ }), "extractStatValue"))(t);
49990
+ if (!value) {
49991
+ return void 0;
49992
+ }
49993
+ attributes.push({ attr, value: value.value, prefix });
49994
+ }
49995
+ const weaponName = (/* @__PURE__ */ __name((function extractWeaponName(ocrData) {
49996
+ const rejectPatterns = [
49997
+ /%/,
49998
+ /x\d/i,
49999
+ /\d/,
50000
+ // numbers, %, multipliers
50001
+ /伤害/,
50002
+ /暴击/,
50003
+ /射速/,
50004
+ /攻击/,
50005
+ /后坐力/,
50006
+ /段位/,
50007
+ /加倍/,
50008
+ /效/,
50009
+ /武器/,
50010
+ /果/,
50011
+ /\)/,
50012
+ /\(/
50013
+ // junk OCR fragments
50014
+ ];
50015
+ const candidates = ocrData.filter((str) => {
50016
+ const s = str.trim();
50017
+ if (/^\d+$/.test(s)) return false;
50018
+ if (/[+%]/.test(s)) return false;
50019
+ if (!/[A-Za-z\u4e00-\u9fa5]/.test(s)) return false;
50020
+ if (rejectPatterns.some((p) => p.test(s))) return false;
50021
+ return true;
50022
+ });
50023
+ const merged = candidates.join("");
50024
+ function removeRivenSuffix(name2) {
50025
+ let s = name2.replace(/\s+/g, "");
50026
+ const rivenPattern = /[A-Za-z]+-?[A-Za-z]+$/;
50027
+ return s.replace(rivenPattern, "");
50028
+ }
50029
+ __name(removeRivenSuffix, "removeRivenSuffix");
50030
+ return merged ? removeRivenSuffix(merged) : null;
50031
+ }), "extractWeaponName"))(texts.filter((t) => !statLines.some((l) => l === t)));
50032
+ if (!weaponName || !attributes.length) {
50033
+ return void 0;
50034
+ }
50035
+ return {
50036
+ name: weaponName,
50037
+ attributes
50038
+ };
50039
+ }, "parseOCRResult");
50040
+ var analyzeRivenStat = /* @__PURE__ */ __name((parseResult) => {
50041
+ const weaponRiven = getWeaponRivenDisposition(parseResult.name);
50042
+ if (!weaponRiven) {
50043
+ return "未找到武器: " + parseResult.name;
50044
+ }
50045
+ const disposition = weaponRiven.calc.disposition;
50046
+ const weaponType = weaponRiven.calc.riventype;
50047
+ const rivenStatCountType = (function() {
50048
+ if (parseResult.attributes.length === 4) {
50049
+ return "31";
50050
+ } else if (parseResult.attributes.length === 2) {
50051
+ return "2";
50052
+ }
50053
+ const firstStat = parseResult.attributes[0];
50054
+ const firstStatBaseValue = rivenAttrValueDict[weaponType][normalizeName(firstStat.attr.i18n["en"].name)];
50055
+ if (firstStat.value >= firstStatBaseValue * 1.2375 * 0.9 * disposition) {
50056
+ return "21";
50057
+ } else {
50058
+ return "3";
50059
+ }
50060
+ })();
50061
+ const { buffFactor, buffCount, curseFactor, curseCount } = rivenStatFixFactor[rivenStatCountType];
50062
+ const buffs = [];
50063
+ for (let i = 0; i < buffCount; i++) {
50064
+ const attr = parseResult.attributes[i];
50065
+ const baseValue = rivenAttrValueDict[weaponType][normalizeName(attr.attr.i18n["en"].name)];
50066
+ const value = attr.attr.unit === "multiply" ? attr.value - 1 : attr.value;
50067
+ const standardValue = baseValue * buffFactor * disposition;
50068
+ const percent = (value - standardValue) / standardValue;
50069
+ buffs.push({
50070
+ name: attr.attr.i18n["zh-hans"].name,
50071
+ unit: attr.attr.unit,
50072
+ value: attr.value,
50073
+ percent,
50074
+ max: standardValue * 1.1,
50075
+ min: standardValue * 0.9
50076
+ });
50077
+ }
50078
+ const curses = [];
50079
+ if (curseCount > 0) {
50080
+ for (let i = buffCount; i < buffCount + curseCount; i++) {
50081
+ const attr = parseResult.attributes[i];
50082
+ const baseValue = rivenAttrValueDict[weaponType][normalizeName(attr.attr.i18n["en"].name)];
50083
+ const value = attr.attr.unit === "multiply" ? attr.value - 1 : attr.value;
50084
+ const standardValue = baseValue * curseFactor * disposition;
50085
+ const percent = (value - standardValue) / standardValue * -1;
50086
+ curses.push({
50087
+ name: attr.attr.i18n["zh-hans"].name,
50088
+ unit: attr.attr.unit,
50089
+ value: attr.value,
50090
+ percent,
50091
+ max: standardValue * 0.9,
50092
+ min: standardValue * 1.1
50093
+ });
50094
+ }
50095
+ }
50096
+ return {
50097
+ name: weaponRiven.name.zh,
50098
+ disposition,
50099
+ buffs,
50100
+ curses
50101
+ };
50102
+ }, "analyzeRivenStat");
50103
+
50104
+ // src/components/wf.tsx
50105
+ var import_jsx_runtime = require("@satorijs/element/jsx-runtime");
50106
+ var ArbitrationComponent = /* @__PURE__ */ __name((arbi) => {
50107
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
50108
+ "div",
50109
+ {
50110
+ style: "width:calc(100dvw-40px);display:flex;flex-direction:column;align-items: center;",
50111
+ children: [
50112
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h1", { children: "高掉落仲裁时间表" }),
50113
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ul", { style: "width:100%;font-size: 30px;", children: arbi.map((a) => {
50114
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("li", { children: [
50115
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
50116
+ "[",
50117
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: "color:darkgreen;", children: a.time }),
50118
+ "]"
50119
+ ] }),
50120
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: "margin-left:10px;", children: `${a.name} ${a.system}-${a.type} (${a.faction})`.replace(
50121
+ /\(|\)/g,
50122
+ ""
50123
+ ) }),
50124
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { style: "margin-left:10px;", children: [
50125
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: "color:darkgreen;", children: a.rewards }),
50126
+ "精华/h"
50127
+ ] })
50128
+ ] });
50129
+ }) }) })
50130
+ ]
50131
+ }
50132
+ );
50133
+ }, "ArbitrationComponent");
50134
+ var CircuitComponent = /* @__PURE__ */ __name((incarnons2, warframes2) => {
50135
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
50136
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("header", { style: "text-align: center;font-size:30px;", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h1", { children: "本周回廊奖励" }) }),
50137
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
50138
+ "div",
50139
+ {
50140
+ style: "display:flex;flex-direction:column;align-items:center;margin-top:40px;font-size:40px;",
50141
+ children: [
50142
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: "display:flex;align-items:center;line-height:1;", children: [
50143
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "灵化之源:" }),
50144
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ul", { style: "display:flex;gap:13px;margin-left:15px;", children: incarnons2.map((i) => {
50145
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("li", { children: i });
50146
+ }) })
50147
+ ] }),
50148
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
50149
+ "div",
50150
+ {
50151
+ style: "display:flex;align-items:center;line-height:1;margin-top:40px;",
50152
+ children: [
50153
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "战甲:" }),
50154
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ul", { style: "display:flex;gap:13px;margin-left:15px;", children: warframes2.map((i) => {
50155
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("li", { children: i });
50156
+ }) })
50157
+ ]
50158
+ }
50159
+ )
50160
+ ]
50161
+ }
50162
+ )
50163
+ ] });
50164
+ }, "CircuitComponent");
50165
+ var FissureComponent = /* @__PURE__ */ __name((fissures, type) => {
50166
+ const titles = {
50167
+ fissure: "虚空裂缝",
50168
+ "sp-fissure": "虚空裂缝 (钢铁之路)",
50169
+ "rj-fissure": "虚空裂缝 (九重天)"
50170
+ };
50171
+ const colors = [
50172
+ "#B87333",
50173
+ "#4A6F43",
50174
+ "#B2B2B2",
50175
+ "#D4AF37",
50176
+ "#8B0000",
50177
+ "#2F9E88"
50178
+ ];
50179
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: "display:flex;flex-direction:column;align-items:center;", children: [
50180
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h1", { style: "font-size: 50px;", children: titles[type] }),
50181
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ul", { style: "font-size: 30px;margin-top:30px;", children: fissures.filter((f) => f.expiry - Date.now() > 0).map((f) => {
50182
+ let timeLeft = f.expiry - Date.now();
50183
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("li", { style: "margin-top: 10px;", children: [
50184
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: `color:${colors[f.tierNum - 1]};`, children: `${f.tier}(T${f.tierNum})` }),
50185
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { style: "margin-left: 20px;", children: [
50186
+ f.node.name,
50187
+ " ",
50188
+ f.node.system
50189
+ ] }),
50190
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: "margin-left: 10px;", children: f.node.type }),
50191
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { style: "margin-left: 10px;color:purple;", children: [
50192
+ f.node.faction,
50193
+ "(",
50194
+ f.node.minLevel + 5 + (f.hard ? 100 : 0),
50195
+ "-",
50196
+ f.node.maxLevel + 5 + (f.hard ? 100 : 0),
50197
+ ")"
50198
+ ] }),
50199
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
50200
+ "span",
50201
+ {
50202
+ style: `margin-left: 10px;color:${timeLeft > 36e5 ? "green" : timeLeft > 6e5 ? "blue" : "red"};`,
50203
+ children: [
50204
+ "剩余",
50205
+ msToHumanReadable(timeLeft)
50206
+ ]
50207
+ }
50208
+ )
50209
+ ] });
50210
+ }) }),
50211
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: "margin-top: 30px; font-size: 30px;", children: "注: 该功能的数据有一定延迟" })
50212
+ ] });
50213
+ }, "FissureComponent");
50214
+ var WeeklyComponent = /* @__PURE__ */ __name((archon, deepArchimedea, temporalArchimedea) => {
50215
+ const archonHuntSection = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
50216
+ "section",
50217
+ {
50218
+ style: `
50219
+ border-radius: 8px;
50220
+ border: 1px solid #1f2937;
50221
+ padding: 12px 14px;
50222
+ background-color: #0b0f19;
50223
+ box-shadow: 0 0 0 1px rgba(15, 23, 42, 0.9);
50224
+ color: #e5e7eb;
50225
+ `,
50226
+ children: [
50227
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
50228
+ "div",
50229
+ {
50230
+ style: `
50231
+ font-size: 12px;
50232
+ color: #9ca3af;
50233
+ margin-bottom: 6px;
50234
+ `,
50235
+ children: "Archon Hunt"
50236
+ }
50237
+ ),
50238
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
50239
+ "div",
50240
+ {
50241
+ style: `
50242
+ font-size: 16px;
50243
+ font-weight: 600;
50244
+ `,
50245
+ children: `执行官刺杀: ${archon.name}`
50246
+ }
50247
+ )
50248
+ ]
50249
+ }
50250
+ );
50251
+ const deepArchimedeaSection = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
50252
+ "section",
50253
+ {
50254
+ style: `
50255
+ border-radius: 8px;
50256
+ border: 1px solid #1f2937;
50257
+ padding: 12px 14px;
50258
+ background-color: #0b0f19;
50259
+ box-shadow: 0 0 0 1px rgba(15, 23, 42, 0.9);
50260
+ color: #e5e7eb;
50261
+ `,
50262
+ children: [
50263
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
50264
+ "div",
50265
+ {
50266
+ style: `
50267
+ font-size: 12px;
50268
+ color: #6ee7b7;
50269
+ margin-bottom: 6px;
50270
+ `,
50271
+ children: "Deep Archimedea"
50272
+ }
50273
+ ),
50274
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
50275
+ "div",
50276
+ {
50277
+ style: `
50278
+ font-size: 16px;
50279
+ font-weight: 600;
50280
+ margin-bottom: 8px;
50281
+ `,
50282
+ children: deepArchimedea.name
50283
+ }
50284
+ ),
50285
+ deepArchimedea.missions.map((m) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
50286
+ "div",
50287
+ {
50288
+ style: `
50289
+ border-radius: 6px;
50290
+ border: 1px solid rgba(255,255,255,0.15);
50291
+ padding: 8px 10px;
50292
+ margin-bottom: 8px;
50293
+ background-color: rgba(255,255,255,0.05);
50294
+ `,
50295
+ children: [
50296
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
50297
+ "div",
50298
+ {
50299
+ style: `
50300
+ font-size: 13px;
50301
+ font-weight: 600;
50302
+ margin-bottom: 4px;
50303
+ `,
50304
+ children: m.type
50305
+ }
50306
+ ),
50307
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: `font-size: 12px;`, children: [
50308
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
50309
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: `font-weight: 600; margin-right: 4px;`, children: "偏差:" }),
50310
+ `${m.deviation.name}(${m.deviation.desc})`
50311
+ ] }),
50312
+ m.risks.map((r) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
50313
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: `font-weight: 600; margin-right: 4px;`, children: "风险:" }),
50314
+ `${r.name}(${r.desc})`
50315
+ ] }))
50316
+ ] })
50317
+ ]
50318
+ }
50319
+ )),
50320
+ deepArchimedea.peronal.map((p) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: `font-size: 12px; margin-top: 4px;`, children: [
50321
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: `font-weight: 600; margin-right: 4px;`, children: "个人变量:" }),
50322
+ `${p.name}(${p.desc})`
50323
+ ] }))
50324
+ ]
50325
+ }
50326
+ );
50327
+ const temporalArchimedeaSection = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
50328
+ "section",
50329
+ {
50330
+ style: `
50331
+ border-radius: 8px;
50332
+ border: 1px solid #1f2937;
50333
+ padding: 12px 14px;
50334
+ background-color: #0b0f19;
50335
+ box-shadow: 0 0 0 1px rgba(15, 23, 42, 0.9);
50336
+ color: #e5e7eb;
50337
+ `,
50338
+ children: [
50339
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
50340
+ "div",
50341
+ {
50342
+ style: `
50343
+ font-size: 12px;
50344
+ color: #a5b4fc;
50345
+ margin-bottom: 6px;
50346
+ `,
50347
+ children: "Temporal Archimedea"
50348
+ }
50349
+ ),
50350
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
50351
+ "div",
50352
+ {
50353
+ style: `
50354
+ font-size: 16px;
50355
+ font-weight: 600;
50356
+ margin-bottom: 8px;
50357
+ `,
50358
+ children: temporalArchimedea.name
50359
+ }
50360
+ ),
50361
+ temporalArchimedea.missions.map((m) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
50362
+ "div",
50363
+ {
50364
+ style: `
50365
+ border-radius: 6px;
50366
+ border: 1px solid rgba(255,255,255,0.15);
50367
+ padding: 8px 10px;
50368
+ margin-bottom: 8px;
50369
+ background-color: rgba(255,255,255,0.05);
50370
+ `,
50371
+ children: [
50372
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
50373
+ "div",
50374
+ {
50375
+ style: `
50376
+ font-size: 13px;
50377
+ font-weight: 600;
50378
+ margin-bottom: 4px;
50379
+ `,
50380
+ children: m.type
50381
+ }
50382
+ ),
50383
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: `font-size: 12px;`, children: [
50384
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
50385
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: `font-weight: 600; margin-right: 4px;`, children: "偏差:" }),
50386
+ `${m.deviation.name}(${m.deviation.desc})`
50387
+ ] }),
50388
+ m.risks.map((r) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
50389
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: `font-weight: 600; margin-right: 4px;`, children: "风险:" }),
50390
+ `${r.name}(${r.desc})`
50391
+ ] }))
50392
+ ] })
50393
+ ]
50394
+ }
50395
+ )),
50396
+ temporalArchimedea.peronal.map((p) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: `font-size: 12px; margin-top: 4px;`, children: [
50397
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: `font-weight: 600; margin-right: 4px;`, children: "个人变量:" }),
50398
+ `${p.name}(${p.desc})`
50399
+ ] }))
50400
+ ]
50401
+ }
50402
+ );
50403
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
50404
+ "div",
50405
+ {
50406
+ style: `
50407
+ color: #e4e7ec;
50408
+ line-height: 1.5;
50409
+ font-size: 14px;
50410
+ background-color: #05060a;
50411
+ font-family: 'Segoe UI', system-ui, sans-serif;
50412
+ max-width: 1024px;
50413
+ margin: 0 auto;
50414
+ display: grid;
50415
+ grid-template-columns: 1fr 1fr 1fr;
50416
+ gap: 16px;
50417
+ `,
50418
+ children: [
50419
+ archonHuntSection,
50420
+ deepArchimedeaSection,
50421
+ temporalArchimedeaSection
50422
+ ]
50423
+ }
50424
+ );
50425
+ }, "WeeklyComponent");
50426
+ var RelicComponent = /* @__PURE__ */ __name((relic) => {
50427
+ const gold = relic.items.filter((i) => i.rarity === "RARE");
50428
+ const silver = relic.items.filter((i) => i.rarity === "UNCOMMON");
50429
+ const bronze = relic.items.filter((i) => i.rarity === "COMMON");
50430
+ const getRateColor = /* @__PURE__ */ __name((rarity) => {
50431
+ if (rarity === "RARE") return "#ffd700";
50432
+ if (rarity === "UNCOMMON") return "#c0c0c0";
50433
+ if (rarity === "COMMON") return "#cd7f32";
50434
+ return "#000000";
50435
+ }, "getRateColor");
50436
+ const relicRewardDropRate = {
50437
+ RARE: "2/4/6/10",
50438
+ UNCOMMON: "11/13/17/20",
50439
+ COMMON: "25/23/20/17"
50440
+ };
50441
+ const renderRewards = /* @__PURE__ */ __name((items) => {
50442
+ if (items.length === 0) return null;
50443
+ return items.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
50444
+ "div",
50445
+ {
50446
+ style: `padding: 8px 12px;
50447
+ margin: 4px 0;
50448
+ border-radius: 4px;
50449
+ background-color: rgba(255, 255, 255, 0.05);
50450
+ border-left: 4px solid ${getRateColor(item.rarity)};
50451
+ display: flex;
50452
+ justify-content: space-between;
50453
+ align-items: center;
50454
+ line-height: 1;`,
50455
+ children: [
50456
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: `color: #000000; font-size: 14px;`, children: item.name }),
50457
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
50458
+ "span",
50459
+ {
50460
+ style: `color: #a0a0a0;
50461
+ font-size: 12px;
50462
+ font-family: monospace;
50463
+ display:flex;
50464
+ gap:10px;`,
50465
+ children: [
50466
+ item.platinum ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
50467
+ "span",
50468
+ {
50469
+ style: "\n color: #0d93b8;\n display:flex;\n line-height:1;",
50470
+ children: [
50471
+ item.platinum,
50472
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
50473
+ "svg",
50474
+ {
50475
+ viewBox: "0 0 18 18",
50476
+ style: "\n color: rgb(64 64 64 / 75%);\n height: 1em;\n width: 1em;\n vertical-align: -.125em;\n fill: currentcolor;\n margin-left:2px;",
50477
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("use", { href: `#icon-platinum` })
50478
+ }
50479
+ )
50480
+ ]
49804
50481
  }
49805
50482
  ) : "",
49806
- item.ducats ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { style: "color: #a0a000;display:flex;line-height:1;", children: [
50483
+ item.ducats ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { style: "color: #a0a000;display:flex;line-height:1;", children: [
49807
50484
  item.ducats,
49808
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
50485
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
49809
50486
  "svg",
49810
50487
  {
49811
50488
  viewBox: "0 0 18 18",
49812
50489
  style: "\n color: rgb(64 64 64 / 75%);\n height: 1em;\n width: 1em;\n vertical-align: -.125em;\n fill: currentcolor;",
49813
- children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("use", { href: `#icon-ducats` })
50490
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("use", { href: `#icon-ducats` })
49814
50491
  }
49815
50492
  )
49816
50493
  ] }) : "",
49817
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
50494
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
49818
50495
  relicRewardDropRate[item.rarity],
49819
50496
  "%"
49820
50497
  ] })
@@ -49825,7 +50502,7 @@ var RelicComponent = /* @__PURE__ */ __name((relic) => {
49825
50502
  }
49826
50503
  ));
49827
50504
  }, "renderRewards");
49828
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
50505
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
49829
50506
  "div",
49830
50507
  {
49831
50508
  style: `
@@ -49839,7 +50516,7 @@ var RelicComponent = /* @__PURE__ */ __name((relic) => {
49839
50516
  max-width: 500px;
49840
50517
  min-width: 320px;`,
49841
50518
  children: [
49842
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
50519
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
49843
50520
  "div",
49844
50521
  {
49845
50522
  style: `display: flex;
@@ -49848,7 +50525,7 @@ var RelicComponent = /* @__PURE__ */ __name((relic) => {
49848
50525
  margin-bottom: 16px;
49849
50526
  padding-bottom: 12px;
49850
50527
  border-bottom: 1px solid rgba(255, 255, 255, 0.1);`,
49851
- children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
50528
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
49852
50529
  "h1",
49853
50530
  {
49854
50531
  style: `font-size: 20px;
@@ -49860,14 +50537,14 @@ var RelicComponent = /* @__PURE__ */ __name((relic) => {
49860
50537
  )
49861
50538
  }
49862
50539
  ),
49863
- gold.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: `margin-bottom: 12px;`, children: [
49864
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
50540
+ gold.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: `margin-bottom: 12px;`, children: [
50541
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
49865
50542
  "div",
49866
50543
  {
49867
50544
  style: `display: flex;
49868
50545
  align-items: center;
49869
50546
  margin-bottom: 8px;`,
49870
- children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
50547
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
49871
50548
  "h3",
49872
50549
  {
49873
50550
  style: `font-size: 14px;
@@ -49882,14 +50559,14 @@ var RelicComponent = /* @__PURE__ */ __name((relic) => {
49882
50559
  ),
49883
50560
  renderRewards(gold)
49884
50561
  ] }),
49885
- silver.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: `margin-bottom: 12px;`, children: [
49886
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
50562
+ silver.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: `margin-bottom: 12px;`, children: [
50563
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
49887
50564
  "div",
49888
50565
  {
49889
50566
  style: `display: flex;
49890
50567
  align-items: center;
49891
50568
  margin-bottom: 8px;`,
49892
- children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
50569
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
49893
50570
  "h3",
49894
50571
  {
49895
50572
  style: `font-size: 14px;
@@ -49904,14 +50581,14 @@ var RelicComponent = /* @__PURE__ */ __name((relic) => {
49904
50581
  ),
49905
50582
  renderRewards(silver)
49906
50583
  ] }),
49907
- bronze.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: `margin-bottom: 12px;`, children: [
49908
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
50584
+ bronze.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: `margin-bottom: 12px;`, children: [
50585
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
49909
50586
  "div",
49910
50587
  {
49911
50588
  style: `display: flex;
49912
50589
  align-items: center;
49913
50590
  margin-bottom: 8px;`,
49914
- children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
50591
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
49915
50592
  "h3",
49916
50593
  {
49917
50594
  style: `font-size: 14px;
@@ -49926,7 +50603,7 @@ var RelicComponent = /* @__PURE__ */ __name((relic) => {
49926
50603
  ),
49927
50604
  renderRewards(bronze)
49928
50605
  ] }),
49929
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
50606
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
49930
50607
  "div",
49931
50608
  {
49932
50609
  style: `margin-top: 16px;
@@ -50020,18 +50697,18 @@ var RivenComponent = /* @__PURE__ */ __name((data) => {
50020
50697
  const normalized = (percent + 1) / 2 * 100;
50021
50698
  return `${Math.max(0, Math.min(100, normalized))}%`;
50022
50699
  }, "getProgressWidth");
50023
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { style: `display: flex; gap: 20px; width: 600px;`, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
50700
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: `display: flex; gap: 20px; width: 600px;`, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
50024
50701
  "div",
50025
50702
  {
50026
50703
  style: `width: 100%; border-radius: 8px; padding: 20px; box-shadow: 0 4px 6px rgba(0,0,0,0.3); border: 1px solid #444;`,
50027
50704
  children: [
50028
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
50705
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
50029
50706
  "div",
50030
50707
  {
50031
50708
  style: `display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; padding-bottom: 10px; border-bottom: 2px solid #444;`,
50032
50709
  children: [
50033
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h2", { style: `margin: 0; font-size: 20px;`, children: data.name }),
50034
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
50710
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { style: `margin: 0; font-size: 20px;`, children: data.name }),
50711
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
50035
50712
  "div",
50036
50713
  {
50037
50714
  style: `background-color: #f0f0f0; padding: 4px 12px; border-radius: 12px; font-size: 14px; line-height: 1;`,
@@ -50043,8 +50720,8 @@ var RivenComponent = /* @__PURE__ */ __name((data) => {
50043
50720
  ]
50044
50721
  }
50045
50722
  ),
50046
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: `margin-bottom: 25px;`, children: [
50047
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
50723
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: `margin-bottom: 25px;`, children: [
50724
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
50048
50725
  "h3",
50049
50726
  {
50050
50727
  style: `color: #4caf50; margin: 0 0 15px 0; font-size: 16px; display: flex; align-items: center;`,
@@ -50055,10 +50732,10 @@ var RivenComponent = /* @__PURE__ */ __name((data) => {
50055
50732
  ]
50056
50733
  }
50057
50734
  ),
50058
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("ul", { children: data.buffs.map((buff) => {
50735
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ul", { children: data.buffs.map((buff) => {
50059
50736
  const inRange = isInRange(buff.percent);
50060
50737
  const percentColor = getPercentColor(buff.percent);
50061
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
50738
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
50062
50739
  "li",
50063
50740
  {
50064
50741
  style: `
@@ -50069,25 +50746,25 @@ var RivenComponent = /* @__PURE__ */ __name((data) => {
50069
50746
  border-left: 4px solid ${percentColor};
50070
50747
  position: relative;`,
50071
50748
  children: [
50072
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
50749
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
50073
50750
  "div",
50074
50751
  {
50075
50752
  style: `display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px;`,
50076
50753
  children: [
50077
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: `font-weight: bold;`, children: buff.name }),
50078
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: `font-size: 18px; font-weight: bold;`, children: formatValue(buff.value, buff.unit) })
50754
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: `font-weight: bold;`, children: buff.name }),
50755
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: `font-size: 18px; font-weight: bold;`, children: formatValue(buff.value, buff.unit) })
50079
50756
  ]
50080
50757
  }
50081
50758
  ),
50082
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
50759
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
50083
50760
  "div",
50084
50761
  {
50085
50762
  style: `height: 10px; background-color: #444; border-radius: 3px; margin-bottom: 8px;`,
50086
- children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
50763
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
50087
50764
  "div",
50088
50765
  {
50089
50766
  style: `height: 10px; position: relative; overflow: hidden;`,
50090
- children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
50767
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
50091
50768
  "p",
50092
50769
  {
50093
50770
  style: `position: absolute; left: 0; top: 0; height: 100%; width: ${getProgressWidth(
@@ -50099,864 +50776,494 @@ var RivenComponent = /* @__PURE__ */ __name((data) => {
50099
50776
  )
50100
50777
  }
50101
50778
  ),
50102
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
50779
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
50103
50780
  "div",
50104
50781
  {
50105
50782
  style: `display: flex; justify-content: space-between; font-size: 12px; color: #aaa;`,
50106
50783
  children: [
50107
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
50784
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
50108
50785
  "范围: ",
50109
50786
  formatRange(buff.min, buff.max, buff.unit)
50110
50787
  ] }),
50111
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { style: `color: ${percentColor};`, children: [
50788
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { style: `color: ${percentColor};`, children: [
50112
50789
  buff.percent > 0 ? "+" : "",
50113
50790
  (buff.percent * 100).toFixed(2) + "%"
50114
50791
  ] })
50115
50792
  ]
50116
50793
  }
50117
50794
  ),
50118
- !inRange ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
50795
+ !inRange ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
50119
50796
  "div",
50120
50797
  {
50121
50798
  style: `margin-top: 8px; padding: 6px; background-color: rgba(244, 67, 54, 0.2); border-radius: 4px; font-size: 12px; color: #f44336; display: flex; align-items: center;`,
50122
50799
  children: [
50123
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: `margin-right: 6px;`, children: "⚠" }),
50124
- "数值不在正常范围内(可能未满级或倾向未更新)"
50125
- ]
50126
- }
50127
- ) : ""
50128
- ]
50129
- }
50130
- );
50131
- }) })
50132
- ] }),
50133
- data.curses.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
50134
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
50135
- "h3",
50136
- {
50137
- style: `color: #f44336; margin: 0 0 15px 0; font-size: 16px; display: flex; align-items: center;`,
50138
- children: [
50139
- "负面词条 (",
50140
- data.curses.length,
50141
- ")"
50142
- ]
50143
- }
50144
- ),
50145
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("ul", { children: data.curses.map((curse, curseIndex) => {
50146
- const inRange = isInRange(curse.percent);
50147
- const percentColor = getPercentColor(curse.percent);
50148
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
50149
- "li",
50150
- {
50151
- style: `background-color: #eeeeee; border-radius: 6px; padding: 12px; margin-bottom: 10px; border-left: 4px solid ${percentColor};`,
50152
- children: [
50153
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
50154
- "div",
50155
- {
50156
- style: `display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px;`,
50157
- children: [
50158
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: `font-weight: bold;`, children: curse.name }),
50159
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: `font-size: 18px; font-weight: bold;`, children: formatValue(curse.value, curse.unit) })
50160
- ]
50161
- }
50162
- ),
50163
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
50164
- "div",
50165
- {
50166
- style: `height: 10px; background-color: #444; border-radius: 3px; margin-bottom: 8px;`,
50167
- children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
50168
- "div",
50169
- {
50170
- style: `height: 10px; position: relative; overflow: hidden;`,
50171
- children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
50172
- "p",
50173
- {
50174
- style: `position: absolute; left: 0; top: 0; height: 100%; width: ${getProgressWidth(
50175
- curse.percent * 10
50176
- )}; background-color: ${percentColor}; border-radius: 3px;`
50177
- }
50178
- )
50179
- }
50180
- )
50181
- }
50182
- ),
50183
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
50184
- "div",
50185
- {
50186
- style: `display: flex; justify-content: space-between; font-size: 12px; color: #aaa;`,
50187
- children: [
50188
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
50189
- "范围: ",
50190
- formatRange(curse.min, curse.max, curse.unit)
50191
- ] }),
50192
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { style: `color: ${percentColor};`, children: [
50193
- curse.percent > 0 ? "+" : "",
50194
- (curse.percent * 100).toFixed(2) + "%"
50195
- ] })
50196
- ]
50197
- }
50198
- ),
50199
- !inRange ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
50200
- "div",
50201
- {
50202
- style: `margin-top: 8px; padding: 6px; background-color: rgba(244, 67, 54, 0.2); border-radius: 4px; font-size: 12px; color: #f44336; display: flex; align-items: center;`,
50203
- children: [
50204
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: `margin-right: 6px;`, children: "⚠" }),
50205
- "数值不在正常范围内(可能未满级或倾向未更新)"
50206
- ]
50207
- }
50208
- ) : ""
50209
- ]
50210
- }
50211
- );
50212
- }) })
50213
- ] }) : ""
50214
- ]
50215
- }
50216
- ) });
50217
- }, "RivenComponent");
50218
- var VoidTraderComponent = /* @__PURE__ */ __name((data) => {
50219
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
50220
- "div",
50221
- {
50222
- style: `width: 400px; padding: 10px; font-family: sans-serif; font-size: 14px;`,
50223
- children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("table", { style: `width: 100%; border-collapse: collapse;`, children: [
50224
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("thead", { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("tr", { children: [
50225
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
50226
- "th",
50227
- {
50228
- style: `border-bottom: 1px solid #ccc; text-align: left; padding: 6px;`,
50229
- children: "名称"
50230
- }
50231
- ),
50232
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
50233
- "th",
50234
- {
50235
- style: `border-bottom: 1px solid #ccc; text-align: left; padding: 6px;`,
50236
- children: "价格"
50237
- }
50238
- )
50239
- ] }) }),
50240
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("tbody", { children: data.items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("tr", { children: [
50241
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("td", { style: `padding: 6px; border-bottom: 1px solid #eee;`, children: item.name }),
50242
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
50243
- "td",
50244
- {
50245
- style: `padding: 6px; border-bottom: 1px solid #eee; text-align: center;line-height: 1;`,
50246
- children: [
50247
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: item.ducats }),
50248
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
50249
- "svg",
50250
- {
50251
- viewBox: "0 0 18 18",
50252
- style: "\n color: rgb(64 64 64 / 75%);\n height: 1em;\n width: 1em;\n vertical-align: -.125em;\n fill: currentcolor;",
50253
- children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("use", { href: `#icon-ducats` })
50254
- }
50255
- ),
50256
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: "+" }),
50257
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: item.credits }),
50258
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: "现金" })
50259
- ]
50260
- }
50261
- )
50262
- ] })) })
50263
- ] })
50264
- }
50265
- );
50266
- }, "VoidTraderComponent");
50267
-
50268
- // src/api/wf-api.ts
50269
- var apiBase = "https://api.warframe.com/cdn/";
50270
- var getWorldState = /* @__PURE__ */ __name(async (json = "") => {
50271
- if (!json) {
50272
- json = await fetchAsyncText(apiBase + "worldState.php");
50273
- }
50274
- const WorldStateParser = await import("warframe-worldstate-parser");
50275
- const ws = await WorldStateParser.WorldState.build(json);
50276
- return ws;
50277
- }, "getWorldState");
50278
-
50279
- // src/services/ocr-service.ts
50280
- var extractTextFromImage = /* @__PURE__ */ __name(async (image, secret) => {
50281
- if (image instanceof Blob) {
50282
- const buffer = await image.arrayBuffer();
50283
- image = Buffer.from(buffer).toString("base64");
50284
- }
50285
- const tencentcloud = require("tencentcloud-sdk-nodejs-ocr");
50286
- const ocrClient = tencentcloud.ocr.v20181119.Client;
50287
- const clientConfig = {
50288
- credential: {
50289
- secretId: secret.id,
50290
- secretKey: secret.key
50291
- },
50292
- region: "",
50293
- profile: {
50294
- httpProfile: {
50295
- endpoint: "ocr.tencentcloudapi.com"
50296
- }
50297
- }
50298
- };
50299
- const client = new ocrClient(clientConfig);
50300
- try {
50301
- return await client.GeneralAccurateOCR({
50302
- ImageBase64: image
50303
- });
50304
- } catch (err) {
50305
- console.error("error", err);
50306
- return void 0;
50307
- }
50308
- }, "extractTextFromImage");
50309
-
50310
- // src/services/wf-service.ts
50311
- var arbitrationSchedule = arbys_default.split("\n").map((line) => line.split(",")).filter((arr) => arr.length == 2).map((arr) => {
50312
- return {
50313
- time: parseInt(arr[0]),
50314
- node: arr[1]
50315
- };
50316
- });
50317
- var globalWorldState = createAsyncCache(async () => {
50318
- const worldState = await getWorldState();
50319
- const fissures = [];
50320
- const rjFissures = [];
50321
- const spFissures = [];
50322
- for (const fissure of worldState.fissures) {
50323
- const nodeKey = await getSolNodeKey(fissure.nodeKey);
50324
- const obj = {
50325
- category: fissure.isStorm ? "rj-fissures" : fissure.isHard ? "sp-fissures" : "fissures",
50326
- hard: fissure.isHard,
50327
- activation: fissure.activation.getTime(),
50328
- expiry: fissure.expiry.getTime(),
50329
- node: regionToShort(import_warframe_public_export_plus5.ExportRegions[nodeKey], import_warframe_public_export_plus5.dict_zh),
50330
- tier: import_warframe_public_export_plus5.dict_zh[fissureTierName[fissure.tierNum]],
50331
- tierNum: fissureTierNumToNumber(fissure.tierNum)
50332
- };
50333
- if (fissure.isStorm) {
50334
- rjFissures.push(obj);
50335
- } else if (fissure.isHard) {
50336
- spFissures.push(obj);
50337
- } else {
50338
- fissures.push(obj);
50339
- }
50340
- }
50341
- fissures.sort((a, b) => a.tierNum - b.tierNum);
50342
- spFissures.sort((a, b) => a.tierNum - b.tierNum);
50343
- rjFissures.sort((a, b) => a.tierNum - b.tierNum);
50344
- return { raw: worldState, fissures, spFissures, rjFissures };
50345
- }, 12e4);
50346
- var loadRelics = /* @__PURE__ */ __name(() => {
50347
- const result = {};
50348
- for (const key in import_warframe_public_export_plus5.ExportRelics) {
50349
- const exportRelic = import_warframe_public_export_plus5.ExportRelics[key];
50350
- const exportRewards = import_warframe_public_export_plus5.ExportRewards[exportRelic.rewardManifest];
50351
- const era = "/Lotus/Language/Relics/Era_" + exportRelic.era.toUpperCase();
50352
- const relicKey = normalizeName(exportRelic.era + exportRelic.category);
50353
- const rewards = (exportRewards[0] ?? []).map((r) => {
50354
- const item = fixRelicRewardKey(r.type);
50355
- return {
50356
- name: item,
50357
- rarity: r.rarity,
50358
- quantity: r.itemCount
50359
- };
50360
- });
50361
- const relic = {
50362
- tier: exportRelic.era,
50363
- tierKey: era,
50364
- num: exportRelic.category,
50365
- items: rewards
50366
- };
50367
- result[relicKey] = relic;
50368
- }
50369
- relics = result;
50370
- }, "loadRelics");
50371
- var relics = null;
50372
- var tierListForMatch = [
50373
- "古纪",
50374
- "前纪",
50375
- "中纪",
50376
- "后纪",
50377
- "安魂",
50378
- "先锋",
50379
- "Lith",
50380
- "Meso",
50381
- "Neo",
50382
- "Axi",
50383
- "Requiem",
50384
- "Vanguard"
50385
- ].map((t) => normalizeName(t));
50386
- var rivenAttrValueDict = (function() {
50387
- const dict = {};
50388
- for (const key in rivenAttrValues_default) {
50389
- const attrs = rivenAttrValues_default[key];
50390
- dict[key] = {};
50391
- for (const attrKey in attrs) {
50392
- const removeDamageSuffix = attrKey.endsWith("Damage") && attrKey !== "Damage" && attrKey !== "Finisher Damage" && !attrKey.startsWith("Critical");
50393
- const wfmKey = removeDamageSuffix ? normalizeName(attrKey.replace("Damage", "")) : normalizeName(attrKey);
50394
- dict[key][wfmKey] = attrs[attrKey];
50395
- }
50396
- }
50397
- return dict;
50398
- })();
50399
- var weaponRivenDispositionDict = (function() {
50400
- const mapped = rivencalc_default.weapons.reduce((prev, element) => {
50401
- let mapped2 = void 0;
50402
- for (const weaponKey in import_warframe_public_export_plus5.ExportWeapons) {
50403
- const weapon = import_warframe_public_export_plus5.ExportWeapons[weaponKey];
50404
- const splited = weapon.name.split("/");
50405
- if (splited.length <= 0) {
50406
- continue;
50407
- }
50408
- const keyName = splited[splited.length - 1];
50409
- const normalizedCalcName = normalizeName(element.name);
50410
- if (normalizeName(keyName) === normalizedCalcName) {
50411
- mapped2 = weapon;
50412
- break;
50413
- }
50414
- const weaponEN2 = import_warframe_public_export_plus5.dict_en[weapon.name];
50415
- if (weaponEN2 && normalizeName(weaponEN2) === normalizedCalcName) {
50416
- mapped2 = weapon;
50417
- break;
50418
- }
50419
- }
50420
- if (!mapped2) {
50421
- return prev;
50422
- }
50423
- const weaponEN = import_warframe_public_export_plus5.dict_en[mapped2.name];
50424
- const weaponZH = import_warframe_public_export_plus5.dict_zh[mapped2.name];
50425
- const result = {
50426
- name: {
50427
- en: weaponEN,
50428
- zh: weaponZH
50429
- },
50430
- calc: element,
50431
- weapon: mapped2
50432
- };
50433
- prev.push(result);
50434
- return prev;
50435
- }, []);
50436
- return listToDict(mapped, (e) => [
50437
- normalizeName(e.name.zh),
50438
- normalizeName(e.name.en)
50439
- ]);
50440
- })();
50441
- var rivenStatFixFactor = {
50442
- "2_0": { buffFactor: 0.99, buffCount: 2, curseFactor: 0, curseCount: 0 },
50443
- "2_1": {
50444
- buffFactor: 1.2375,
50445
- buffCount: 2,
50446
- curseFactor: -0.495,
50447
- curseCount: 1
50448
- },
50449
- "3_0": {
50450
- buffFactor: 0.75,
50451
- buffCount: 3,
50452
- curseFactor: 0,
50453
- curseCount: 0
50454
- },
50455
- "3_1": {
50456
- buffFactor: 0.9375,
50457
- buffCount: 3,
50458
- curseFactor: -0.75,
50459
- curseCount: 1
50460
- }
50461
- };
50462
- var wfOnReady = /* @__PURE__ */ __name(async () => {
50463
- loadRelics();
50464
- }, "wfOnReady");
50465
- var getRelic = /* @__PURE__ */ __name(async (input) => {
50466
- if (!input) {
50467
- return "请提供正确的遗物名称";
50468
- }
50469
- input = normalizeName(input);
50470
- if (!input) {
50471
- return "请提供正确的遗物名称";
50472
- }
50473
- if (!relics) {
50474
- return "遗物数据未加载完成,请稍后再试";
50475
- }
50476
- const tier = tierListForMatch.find((t) => input.startsWith(t));
50477
- if (!tier) {
50478
- return "请提供正确的遗物名称";
50479
- }
50480
- let category = input.replace(new RegExp(`^${tier}`), "").replace(/遗物$|relic$/, "");
50481
- const zhTierMap = {
50482
- 古纪: "Lith",
50483
- 前纪: "Meso",
50484
- 中纪: "Neo",
50485
- 后纪: "Axi",
50486
- 安魂: "Requiem",
50487
- 先锋: "Vanguard"
50488
- };
50489
- const enTier = zhTierMap[tier] ?? tier;
50490
- const key = normalizeName(enTier + category);
50491
- return relics[key] ?? "未找到对应遗物信息";
50492
- }, "getRelic");
50493
- var generateRelicOutput = /* @__PURE__ */ __name(async (puppe, relic) => {
50494
- const element = RelicComponent(relic);
50495
- const imgBase64 = await getHtmlImageBase64(puppe, element.toString());
50496
- return OutputImage(imgBase64);
50497
- }, "generateRelicOutput");
50498
- var getArbitrations = /* @__PURE__ */ __name((day = 3) => {
50499
- if (day > 14 || day <= 0) {
50500
- return "天数需小于等于14且大于0";
50501
- }
50502
- const currentHourTimeStamp = Math.floor(
50503
- (/* @__PURE__ */ new Date()).setMinutes(0, 0, 0) / 1e3
50504
- );
50505
- const currentHourIndex = arbitrationSchedule.findIndex(
50506
- (a) => a.time === currentHourTimeStamp
50507
- );
50508
- const weekArbys = arbitrationSchedule.slice(
50509
- currentHourIndex,
50510
- currentHourIndex + 24 * day
50511
- );
50512
- return weekArbys.filter((a) => arbyRewards_default[a.node]).map((a) => {
50513
- const obj = regionToShort(import_warframe_public_export_plus5.ExportRegions[a.node], import_warframe_public_export_plus5.dict_zh);
50514
- return {
50515
- ...obj,
50516
- time: new Date(a.time * 1e3).toLocaleString("zh-cn", {
50517
- year: "numeric",
50518
- month: "numeric",
50519
- day: "numeric",
50520
- hour: "numeric",
50521
- // minute: 'numeric', // 保持注释或删除,以去除分钟
50522
- // second: 'numeric', // 保持注释或删除,以去除秒
50523
- hour12: false,
50524
- // 统一使用 24 小时制
50525
- // hourCycle: 'h23' // 另一种设置 24 小时制的方法
50526
- timeZone: "Asia/Shanghai"
50527
- }),
50528
- rewards: arbyRewards_default[a.node]
50529
- };
50530
- });
50531
- }, "getArbitrations");
50532
- var generateArbitrationsOutput = /* @__PURE__ */ __name(async (puppe, arby) => {
50533
- const element = ArbitrationTable(arby);
50534
- const imgBase64 = await getHtmlImageBase64(puppe, element.toString());
50535
- return OutputImage(imgBase64);
50536
- }, "generateArbitrationsOutput");
50537
- var getWeekly = /* @__PURE__ */ __name(async () => {
50538
- const { raw: worldState } = await globalWorldState.get();
50539
- if (!worldState) {
50540
- return "内部错误,获取最新信息失败";
50541
- }
50542
- const archon = import_warframe_public_export_plus5.dict_zh["/Lotus/Language/Narmer/" + removeSpace(worldState.archonHunt.boss)];
50543
- const stringToDebuff = /* @__PURE__ */ __name((key, name2, prefix) => {
50544
- const keyToName = zh_default[`${prefix}${key}`];
50545
- if (!keyToName) {
50546
- for (const transKey in en_default) {
50547
- if (en_default[transKey] === name2) {
50548
- return {
50549
- name: zh_default[transKey],
50550
- desc: zh_default[transKey + "_Desc"]
50551
- };
50552
- }
50553
- }
50554
- }
50555
- const riskDesc = zh_default[`${prefix}${key}_Desc`];
50556
- return {
50557
- name: keyToName,
50558
- desc: riskDesc
50559
- };
50560
- }, "stringToDebuff");
50561
- const deepArchim = worldState.archimedeas[0];
50562
- const deepArchimMissions = await Promise.all(
50563
- deepArchim.missions.map(async (m) => {
50564
- const receivedType = await getMissionTypeKey(m.missionType);
50565
- const type = import_warframe_public_export_plus5.dict_zh[import_warframe_public_export_plus5.ExportMissionTypes[receivedType]?.name] ?? m.missionType;
50566
- const diviation = stringToDebuff(
50567
- m.diviation.key,
50568
- m.diviation.name,
50569
- "/Lotus/Language/Conquest/MissionVariant_LabConquest_"
50570
- );
50571
- const risks = m.risks.map(
50572
- (r) => stringToDebuff(r.key, r.name, "/Lotus/Language/Conquest/Condition_")
50573
- );
50574
- return {
50575
- type,
50576
- diviation,
50577
- risks
50578
- };
50579
- })
50580
- );
50581
- const deepArchimPersonalModifier = deepArchim.personalModifiers.map(
50582
- (p) => stringToDebuff(p.key, p.name, "/Lotus/Language/Conquest/PersonalMod_")
50583
- );
50584
- const deepArchimRes = {
50585
- name: "深层科研",
50586
- missions: deepArchimMissions,
50587
- peronal: deepArchimPersonalModifier
50588
- };
50589
- const temporalArchim = worldState.archimedeas[1];
50590
- const temporalArchimMissions = await Promise.all(
50591
- temporalArchim.missions.map(async (m) => {
50592
- const receivedType = await getMissionTypeKey(m.missionType);
50593
- const type = import_warframe_public_export_plus5.dict_zh[import_warframe_public_export_plus5.ExportMissionTypes[receivedType]?.name] ?? receivedType;
50594
- const diviation = stringToDebuff(
50595
- m.diviation.key,
50596
- m.diviation.name,
50597
- "/Lotus/Language/Conquest/MissionVariant_HexConquest_"
50598
- );
50599
- const risks = m.risks.map(
50600
- (r) => stringToDebuff(r.key, r.name, "/Lotus/Language/Conquest/Condition_")
50601
- );
50602
- return {
50603
- type,
50604
- diviation,
50605
- risks
50606
- };
50607
- })
50608
- );
50609
- const temporalArchimPersonalModifier = temporalArchim.personalModifiers.map(
50610
- (p) => stringToDebuff(p.key, p.name, "/Lotus/Language/Conquest/PersonalMod_")
50611
- );
50612
- const temporalArchimRes = {
50613
- name: "时光科研",
50614
- missions: temporalArchimMissions,
50615
- peronal: temporalArchimPersonalModifier
50616
- };
50617
- return {
50618
- archonHunt: archon,
50619
- deepArchimedea: deepArchimRes,
50620
- temporalArchimedea: temporalArchimRes
50621
- };
50622
- }, "getWeekly");
50623
- var generateWeeklyOutput = /* @__PURE__ */ __name(async (puppe, archon, deepArchimedea, temporalArchimedea) => {
50624
- const element = await WeeklyTable(archon, deepArchimedea, temporalArchimedea);
50625
- return element;
50626
- }, "generateWeeklyOutput");
50627
- var getRegionTime = /* @__PURE__ */ __name(async () => {
50628
- const { raw: worldState } = await globalWorldState.get();
50629
- if (!worldState) {
50630
- return "内部错误,获取最新信息失败";
50631
- }
50632
- const cetusDay = worldState.cetusCycle.isDay ? "白天" : "黑夜";
50633
- const cetus = `地球/夜灵平野: ${cetusDay} ${worldState.cetusCycle.timeLeft}`;
50634
- const vallisState = worldState.vallisCycle.isWarm ? "温暖" : "寒冷";
50635
- const vallis = `奥布山谷: ${vallisState} ${worldState.vallisCycle.timeLeft}`;
50636
- const cambionState = worldState.cambionCycle.state ? worldState.cambionCycle.state.charAt(0).toUpperCase() + worldState.cambionCycle.state.slice(1) : "未知";
50637
- const cambion = `魔胎之境: ${cambionState} ${worldState.cambionCycle.timeLeft}`;
50638
- const duviriStateTransDict = {
50639
- sorrow: "悲伤",
50640
- fear: "恐惧",
50641
- joy: "喜悦",
50642
- anger: "愤怒",
50643
- envy: "嫉妒"
50644
- };
50645
- const duviriState = duviriStateTransDict[worldState.duviriCycle.state] ?? worldState.duviriCycle.state;
50646
- const duviri = `双衍王境: ${duviriState} ${worldState.duviriCycle.endString}`;
50647
- const zarimanFaction = worldState.zarimanCycle.isCorpus ? "Corpus" : "Grineer";
50648
- const zariman = `扎里曼号: ${zarimanFaction} ${worldState.zarimanCycle.timeLeft}`;
50649
- return `当前环境:
50650
- ${cetus}
50651
- ${vallis}
50652
- ${cambion}
50653
- ${duviri}
50654
- ${zariman}`;
50655
- }, "getRegionTime");
50656
- var getCircuitWeek = /* @__PURE__ */ __name(() => {
50657
- const EPOCH = 1734307200 * 1e3;
50658
- const week = Math.trunc((Date.now() - EPOCH) / 6048e5);
50659
- const incarnons = incarnonRewards[week % incarnonRewards.length].map(
50660
- (i) => import_warframe_public_export_plus5.dict_zh[i]
50661
- );
50662
- const warframes = warframeRewards[week % warframeRewards.length].map(
50663
- (i) => import_warframe_public_export_plus5.dict_zh[i]
50664
- );
50665
- return {
50666
- incarnons,
50667
- warframes
50668
- };
50669
- }, "getCircuitWeek");
50670
- var generateCircuitWeekOutput = /* @__PURE__ */ __name(async (puppe, data) => {
50671
- const element = CircuitTable(data.incarnons, data.warframes);
50672
- const imgBase64 = await getHtmlImageBase64(puppe, element.toString());
50673
- return OutputImage(imgBase64);
50674
- }, "generateCircuitWeekOutput");
50675
- var getFissures = /* @__PURE__ */ __name(async () => {
50676
- const { fissures } = await globalWorldState.get();
50677
- return fissures ?? "内部错误,获取最新信息失败";
50678
- }, "getFissures");
50679
- var getSteelPathFissures = /* @__PURE__ */ __name(async () => {
50680
- const { spFissures } = await globalWorldState.get();
50681
- return spFissures ?? "内部错误,获取最新信息失败";
50682
- }, "getSteelPathFissures");
50683
- var getRailjackFissures = /* @__PURE__ */ __name(async () => {
50684
- const { rjFissures } = await globalWorldState.get();
50685
- return rjFissures ?? "内部错误,获取最新信息失败";
50686
- }, "getRailjackFissures");
50687
- var generateFissureOutput = /* @__PURE__ */ __name(async (puppe, fissures, type) => {
50688
- const element = FissureTable(fissures, type);
50689
- const imgBase64 = await getHtmlImageBase64(puppe, element.toString());
50690
- return OutputImage(imgBase64);
50691
- }, "generateFissureOutput");
50692
- var getWeaponRivenDisposition = /* @__PURE__ */ __name((name2) => {
50693
- const normalizedName = normalizeName(name2);
50694
- const normalRes = weaponRivenDispositionDict[normalizedName];
50695
- if (normalRes) {
50696
- return normalRes;
50697
- }
50698
- const withPrimeSuffix = normalizedName + "prime";
50699
- const withPrimeRes = weaponRivenDispositionDict[withPrimeSuffix];
50700
- if (withPrimeRes) {
50701
- return withPrimeRes;
50702
- }
50703
- return void 0;
50704
- }, "getWeaponRivenDisposition");
50705
- var getAnalyzedRiven = /* @__PURE__ */ __name(async (secret, dict) => {
50706
- const img = await fetchAsyncImage(dict.src);
50707
- if (!img) {
50708
- return "获取图片失败";
50709
- }
50710
- const extractResult = await extractTextFromImage(img, secret);
50711
- if (!extractResult) {
50712
- return "解析图片失败";
50713
- }
50714
- const parseResult = parseOCRResult(extractResult);
50715
- if (!parseResult || parseResult.attributes.length < 2 || parseResult.attributes.length > 4) {
50716
- return "解析图片失败";
50717
- }
50718
- return analyzeRivenStat(parseResult);
50719
- }, "getAnalyzedRiven");
50720
- var generateAnalyzedRivenOutput = /* @__PURE__ */ __name(async (puppe, data) => {
50721
- const element = RivenComponent(data);
50722
- const imgBase64 = await getHtmlImageBase64(puppe, element.toString());
50723
- return OutputImage(imgBase64);
50724
- }, "generateAnalyzedRivenOutput");
50725
- var parseOCRResult = /* @__PURE__ */ __name((ocrResult) => {
50726
- const list = ocrResult.TextDetections;
50727
- if (!list) {
50728
- return;
50729
- }
50730
- function similarity(standard, input) {
50731
- if (!standard || !input) {
50732
- return 0;
50733
- }
50734
- standard = normalizeName(standard);
50735
- input = normalizeName(input);
50736
- if (input === "伤害") {
50737
- return standard === "基础伤害" ? 1 : 0;
50738
- }
50739
- if (standard === "基础伤害" && input.match(/^伤害$|近战伤害/)) {
50740
- return 1;
50741
- }
50742
- if (standard === "暴击率") {
50743
- standard = "暴击几率";
50744
- }
50745
- if (standard.includes(input) || input.includes(standard) || standard.split("/").find((x) => !!x && input.includes(x))) {
50746
- return 1;
50747
- }
50748
- const t = tokenSimilarity(standard, input);
50749
- const s = normalSimilarity(standard, input);
50750
- return Math.max(t, s);
50751
- }
50752
- __name(similarity, "similarity");
50753
- const texts = list.map((item) => item.DetectedText);
50754
- const attributes = [];
50755
- const statLines = [];
50756
- for (const t of texts) {
50757
- if (!t || !t.match(/^[x+-]|^[0-9]/)) {
50758
- continue;
50759
- }
50760
- const prefix = t.match(/^[x+-]/) ? t[0] : "";
50761
- const attrNamePart = removeSpace(t ?? "").replace(/^[^一-龥]+/, "");
50762
- const attr = globalRivenAttributeList.find((a) => {
50763
- if (!a) return false;
50764
- let zhName = a.i18n["zh-hans"]?.name;
50765
- if (!zhName) return false;
50766
- const sim = similarity(zhName, attrNamePart);
50767
- if (sim < 0.8) return false;
50768
- return true;
50769
- });
50770
- if (!attr) {
50771
- continue;
50772
- }
50773
- statLines.push(t);
50774
- const value = (/* @__PURE__ */ __name((function extractStatValue(text) {
50775
- const t2 = text.replace(/\s+/g, "");
50776
- const multMatch = t2.match(/x(\d+(\.\d+)?)/i);
50777
- if (multMatch) {
50778
- return {
50779
- value: parseFloat(multMatch[1]),
50780
- type: "multiply"
50781
- };
50782
- }
50783
- const percentMatch = t2.match(/([+-]?\d+(\.\d+)?)%/);
50784
- if (percentMatch) {
50785
- return {
50786
- value: parseFloat(percentMatch[1]),
50787
- type: "percent"
50788
- };
50789
- }
50790
- const numMatch = t2.match(/([+-]?\d+(\.\d+)?)/);
50791
- if (numMatch) {
50792
- return {
50793
- value: parseFloat(numMatch[1]),
50794
- type: "number"
50795
- };
50796
- }
50797
- return void 0;
50798
- }), "extractStatValue"))(t);
50799
- if (!value) {
50800
- return void 0;
50801
- }
50802
- attributes.push({ attr, value: value.value, prefix });
50803
- }
50804
- const weaponName = (/* @__PURE__ */ __name((function extractWeaponName(ocrData) {
50805
- const rejectPatterns = [
50806
- /%/,
50807
- /x\d/i,
50808
- /\d/,
50809
- // numbers, %, multipliers
50810
- /伤害/,
50811
- /暴击/,
50812
- /射速/,
50813
- /攻击/,
50814
- /后坐力/,
50815
- /段位/,
50816
- /加倍/,
50817
- /效/,
50818
- /武器/,
50819
- /果/,
50820
- /\)/,
50821
- /\(/
50822
- // junk OCR fragments
50823
- ];
50824
- const candidates = ocrData.filter((str) => {
50825
- const s = str.trim();
50826
- if (/^\d+$/.test(s)) return false;
50827
- if (/[+%]/.test(s)) return false;
50828
- if (!/[A-Za-z\u4e00-\u9fa5]/.test(s)) return false;
50829
- if (rejectPatterns.some((p) => p.test(s))) return false;
50830
- return true;
50831
- });
50832
- const merged = candidates.join("");
50833
- function removeRivenSuffix(name2) {
50834
- let s = name2.replace(/\s+/g, "");
50835
- const rivenPattern = /[A-Za-z]+-?[A-Za-z]+$/;
50836
- return s.replace(rivenPattern, "");
50837
- }
50838
- __name(removeRivenSuffix, "removeRivenSuffix");
50839
- return merged ? removeRivenSuffix(merged) : null;
50840
- }), "extractWeaponName"))(texts.filter((t) => !statLines.some((l) => l === t)));
50841
- if (!weaponName || !attributes.length) {
50842
- return void 0;
50843
- }
50844
- return {
50845
- name: weaponName,
50846
- attributes
50847
- };
50848
- }, "parseOCRResult");
50849
- var analyzeRivenStat = /* @__PURE__ */ __name((parseResult) => {
50850
- const weaponRiven = getWeaponRivenDisposition(parseResult.name);
50851
- if (!weaponRiven) {
50852
- return "未找到武器: " + parseResult.name;
50853
- }
50854
- const disposition = weaponRiven.calc.disposition;
50855
- const weaponType = weaponRiven.calc.riventype;
50856
- const rivenStatCountType = (function() {
50857
- if (parseResult.attributes.length === 4) {
50858
- return "3_1";
50859
- } else if (parseResult.attributes.length === 2) {
50860
- return "2_0";
50800
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: `margin-right: 6px;`, children: "⚠" }),
50801
+ "数值不在正常范围内(可能未满级或倾向未更新)"
50802
+ ]
50803
+ }
50804
+ ) : ""
50805
+ ]
50806
+ }
50807
+ );
50808
+ }) })
50809
+ ] }),
50810
+ data.curses.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
50811
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
50812
+ "h3",
50813
+ {
50814
+ style: `color: #f44336; margin: 0 0 15px 0; font-size: 16px; display: flex; align-items: center;`,
50815
+ children: [
50816
+ "负面词条 (",
50817
+ data.curses.length,
50818
+ ")"
50819
+ ]
50820
+ }
50821
+ ),
50822
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ul", { children: data.curses.map((curse, curseIndex) => {
50823
+ const inRange = isInRange(curse.percent);
50824
+ const percentColor = getPercentColor(curse.percent);
50825
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
50826
+ "li",
50827
+ {
50828
+ style: `background-color: #eeeeee; border-radius: 6px; padding: 12px; margin-bottom: 10px; border-left: 4px solid ${percentColor};`,
50829
+ children: [
50830
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
50831
+ "div",
50832
+ {
50833
+ style: `display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px;`,
50834
+ children: [
50835
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: `font-weight: bold;`, children: curse.name }),
50836
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: `font-size: 18px; font-weight: bold;`, children: formatValue(curse.value, curse.unit) })
50837
+ ]
50838
+ }
50839
+ ),
50840
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
50841
+ "div",
50842
+ {
50843
+ style: `height: 10px; background-color: #444; border-radius: 3px; margin-bottom: 8px;`,
50844
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
50845
+ "div",
50846
+ {
50847
+ style: `height: 10px; position: relative; overflow: hidden;`,
50848
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
50849
+ "p",
50850
+ {
50851
+ style: `position: absolute; left: 0; top: 0; height: 100%; width: ${getProgressWidth(
50852
+ curse.percent * 10
50853
+ )}; background-color: ${percentColor}; border-radius: 3px;`
50854
+ }
50855
+ )
50856
+ }
50857
+ )
50858
+ }
50859
+ ),
50860
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
50861
+ "div",
50862
+ {
50863
+ style: `display: flex; justify-content: space-between; font-size: 12px; color: #aaa;`,
50864
+ children: [
50865
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
50866
+ "范围: ",
50867
+ formatRange(curse.min, curse.max, curse.unit)
50868
+ ] }),
50869
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { style: `color: ${percentColor};`, children: [
50870
+ curse.percent > 0 ? "+" : "",
50871
+ (curse.percent * 100).toFixed(2) + "%"
50872
+ ] })
50873
+ ]
50874
+ }
50875
+ ),
50876
+ !inRange ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
50877
+ "div",
50878
+ {
50879
+ style: `margin-top: 8px; padding: 6px; background-color: rgba(244, 67, 54, 0.2); border-radius: 4px; font-size: 12px; color: #f44336; display: flex; align-items: center;`,
50880
+ children: [
50881
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: `margin-right: 6px;`, children: "⚠" }),
50882
+ "数值不在正常范围内(可能未满级或倾向未更新)"
50883
+ ]
50884
+ }
50885
+ ) : ""
50886
+ ]
50887
+ }
50888
+ );
50889
+ }) })
50890
+ ] }) : ""
50891
+ ]
50861
50892
  }
50862
- const firstStat = parseResult.attributes[0];
50863
- const firstStatBaseValue = rivenAttrValueDict[weaponType][normalizeName(firstStat.attr.i18n["en"].name)];
50864
- if (firstStat.value >= firstStatBaseValue * 1.2375 * 0.9 * disposition) {
50865
- return "2_1";
50866
- } else {
50867
- return "3_0";
50893
+ ) });
50894
+ }, "RivenComponent");
50895
+ var RivenStatComponent = /* @__PURE__ */ __name((data) => {
50896
+ const getValue = /* @__PURE__ */ __name((value, unit) => {
50897
+ switch (unit) {
50898
+ case "multiply":
50899
+ return "x" + (1 + value).toFixed(2);
50900
+ case "seconds":
50901
+ return value.toFixed(2) + "s";
50902
+ case "percent":
50903
+ return value.toFixed(2) + "%";
50904
+ default:
50905
+ return value.toFixed(2);
50868
50906
  }
50869
- })();
50870
- const { buffFactor, buffCount, curseFactor, curseCount } = rivenStatFixFactor[rivenStatCountType];
50871
- const buffs = [];
50872
- for (let i = 0; i < buffCount; i++) {
50873
- const attr = parseResult.attributes[i];
50874
- const baseValue = rivenAttrValueDict[weaponType][normalizeName(attr.attr.i18n["en"].name)];
50875
- const value = attr.attr.unit === "multiply" ? attr.value - 1 : attr.value;
50876
- const standardValue = baseValue * buffFactor * disposition;
50877
- const percent = (value - standardValue) / standardValue;
50878
- buffs.push({
50879
- name: attr.attr.i18n["zh-hans"].name,
50880
- unit: attr.attr.unit,
50881
- value: attr.value,
50882
- percent,
50883
- max: standardValue * 1.1,
50884
- min: standardValue * 0.9
50885
- });
50886
- }
50887
- const curses = [];
50888
- if (curseCount > 0) {
50889
- for (let i = buffCount; i < buffCount + curseCount; i++) {
50890
- const attr = parseResult.attributes[i];
50891
- const baseValue = rivenAttrValueDict[weaponType][normalizeName(attr.attr.i18n["en"].name)];
50892
- const value = attr.attr.unit === "multiply" ? attr.value - 1 : attr.value;
50893
- const standardValue = baseValue * curseFactor * disposition;
50894
- const percent = (value - standardValue) / standardValue * -1;
50895
- curses.push({
50896
- name: attr.attr.i18n["zh-hans"].name,
50897
- unit: attr.attr.unit,
50898
- value: attr.value,
50899
- percent,
50900
- max: standardValue * 0.9,
50901
- min: standardValue * 1.1
50902
- });
50907
+ }, "getValue");
50908
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
50909
+ "div",
50910
+ {
50911
+ style: `
50912
+ display: flex;
50913
+ flex-direction: column;
50914
+ gap: 16px;
50915
+ padding: 16px;
50916
+ font-family: system-ui, sans-serif;
50917
+ background-color: #1a1a2e;
50918
+ border-radius: 8px;
50919
+ max-width: 600px;
50920
+ `,
50921
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
50922
+ "div",
50923
+ {
50924
+ style: `
50925
+ display: flex;
50926
+ gap: 16px;
50927
+ `,
50928
+ children: [
50929
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
50930
+ "div",
50931
+ {
50932
+ style: `
50933
+ flex: 1;
50934
+ `,
50935
+ children: [
50936
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
50937
+ "div",
50938
+ {
50939
+ style: `
50940
+ display: flex;
50941
+ justify-content: space-between;
50942
+ align-items: center;
50943
+ margin-bottom: 8px;
50944
+ padding: 0 4px;
50945
+ `,
50946
+ children: [
50947
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
50948
+ "h3",
50949
+ {
50950
+ style: `
50951
+ margin: 0;
50952
+ color: #7dd56f;
50953
+ font-size: 16px;
50954
+ font-weight: 600;
50955
+ `,
50956
+ children: "正面属性"
50957
+ }
50958
+ ),
50959
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
50960
+ "div",
50961
+ {
50962
+ style: `
50963
+ display: flex;
50964
+ gap: 12px;
50965
+ `,
50966
+ children: [
50967
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
50968
+ "span",
50969
+ {
50970
+ style: `
50971
+ color: #888;
50972
+ font-size: 12px;
50973
+ `,
50974
+ children: "最小"
50975
+ }
50976
+ ),
50977
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
50978
+ "span",
50979
+ {
50980
+ style: `
50981
+ color: #888;
50982
+ font-size: 12px;
50983
+ `,
50984
+ children: "最大"
50985
+ }
50986
+ )
50987
+ ]
50988
+ }
50989
+ )
50990
+ ]
50991
+ }
50992
+ ),
50993
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
50994
+ "div",
50995
+ {
50996
+ style: `
50997
+ display: flex;
50998
+ flex-direction: column;
50999
+ gap: 4px;
51000
+ `,
51001
+ children: Object.entries(data.positive).map(([_, value]) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
51002
+ "div",
51003
+ {
51004
+ style: `
51005
+ display: flex;
51006
+ justify-content: space-between;
51007
+ align-items: center;
51008
+ padding: 6px 8px;
51009
+ background-color: #16213e;
51010
+ border-radius: 4px;
51011
+ border-left: 3px solid #7dd56f;
51012
+ `,
51013
+ children: [
51014
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
51015
+ "span",
51016
+ {
51017
+ style: `
51018
+ color: #e0e0e0;
51019
+ font-size: 13px;
51020
+ `,
51021
+ children: value.name
51022
+ }
51023
+ ),
51024
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
51025
+ "div",
51026
+ {
51027
+ style: `
51028
+ display: flex;
51029
+ gap: 16px;
51030
+ `,
51031
+ children: [
51032
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
51033
+ "span",
51034
+ {
51035
+ style: `
51036
+ color: #7dd56f;
51037
+ font-size: 13px;
51038
+ font-weight: 500;
51039
+ min-width: 60px;
51040
+ text-align: right;
51041
+ `,
51042
+ children: getValue(value.min, value.unit)
51043
+ }
51044
+ ),
51045
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
51046
+ "span",
51047
+ {
51048
+ style: `
51049
+ color: #7dd56f;
51050
+ font-size: 13px;
51051
+ font-weight: 500;
51052
+ min-width: 60px;
51053
+ text-align: right;
51054
+ `,
51055
+ children: getValue(value.max, value.unit)
51056
+ }
51057
+ )
51058
+ ]
51059
+ }
51060
+ )
51061
+ ]
51062
+ }
51063
+ ))
51064
+ }
51065
+ )
51066
+ ]
51067
+ }
51068
+ ),
51069
+ data.negative ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
51070
+ "div",
51071
+ {
51072
+ style: `
51073
+ flex: 1;
51074
+ `,
51075
+ children: [
51076
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
51077
+ "div",
51078
+ {
51079
+ style: `
51080
+ display: flex;
51081
+ justify-content: space-between;
51082
+ align-items: center;
51083
+ margin-bottom: 8px;
51084
+ padding: 0 4px;
51085
+ `,
51086
+ children: [
51087
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
51088
+ "h3",
51089
+ {
51090
+ style: `
51091
+ margin: 0;
51092
+ color: #e35f5f;
51093
+ font-size: 16px;
51094
+ font-weight: 600;
51095
+ `,
51096
+ children: "负面属性"
51097
+ }
51098
+ ),
51099
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
51100
+ "div",
51101
+ {
51102
+ style: `
51103
+ display: flex;
51104
+ gap: 12px;
51105
+ `,
51106
+ children: [
51107
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
51108
+ "span",
51109
+ {
51110
+ style: `
51111
+ color: #888;
51112
+ font-size: 12px;
51113
+ `,
51114
+ children: "最小"
51115
+ }
51116
+ ),
51117
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
51118
+ "span",
51119
+ {
51120
+ style: `
51121
+ color: #888;
51122
+ font-size: 12px;
51123
+ `,
51124
+ children: "最大"
51125
+ }
51126
+ )
51127
+ ]
51128
+ }
51129
+ )
51130
+ ]
51131
+ }
51132
+ ),
51133
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
51134
+ "div",
51135
+ {
51136
+ style: `
51137
+ display: flex;
51138
+ flex-direction: column;
51139
+ gap: 4px;
51140
+ `,
51141
+ children: Object.entries(data.negative).map(([key, value]) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
51142
+ "div",
51143
+ {
51144
+ style: `
51145
+ display: flex;
51146
+ justify-content: space-between;
51147
+ align-items: center;
51148
+ padding: 6px 8px;
51149
+ background-color: #16213e;
51150
+ border-radius: 4px;
51151
+ border-left: 3px solid #e35f5f;
51152
+ `,
51153
+ children: [
51154
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
51155
+ "span",
51156
+ {
51157
+ style: `
51158
+ color: #e0e0e0;
51159
+ font-size: 13px;
51160
+ `,
51161
+ children: value.name
51162
+ }
51163
+ ),
51164
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
51165
+ "div",
51166
+ {
51167
+ style: `
51168
+ display: flex;
51169
+ gap: 16px;
51170
+ `,
51171
+ children: [
51172
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
51173
+ "span",
51174
+ {
51175
+ style: `
51176
+ color: #e35f5f;
51177
+ font-size: 13px;
51178
+ font-weight: 500;
51179
+ min-width: 60px;
51180
+ text-align: right;
51181
+ `,
51182
+ children: getValue(value.min, value.unit)
51183
+ }
51184
+ ),
51185
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
51186
+ "span",
51187
+ {
51188
+ style: `
51189
+ color: #e35f5f;
51190
+ font-size: 13px;
51191
+ font-weight: 500;
51192
+ min-width: 60px;
51193
+ text-align: right;
51194
+ `,
51195
+ children: getValue(value.max, value.unit)
51196
+ }
51197
+ )
51198
+ ]
51199
+ }
51200
+ )
51201
+ ]
51202
+ }
51203
+ ))
51204
+ }
51205
+ )
51206
+ ]
51207
+ }
51208
+ ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, {})
51209
+ ]
51210
+ }
51211
+ )
50903
51212
  }
50904
- }
50905
- return {
50906
- name: weaponRiven.name.zh,
50907
- disposition,
50908
- buffs,
50909
- curses
50910
- };
50911
- }, "analyzeRivenStat");
50912
- var getVoidTrader = /* @__PURE__ */ __name(async () => {
50913
- const { raw: worldState } = await globalWorldState.get();
50914
- if (worldState.voidTraders.length === 0) {
50915
- return "虚空商人仍在未知地带漂流...";
50916
- }
50917
- if (worldState.voidTraders[0].activation.getTime() > Date.now()) {
50918
- const diff2 = worldState.voidTraders[0].activation.getTime() - Date.now();
50919
- return "距离虚空商人到达还有: " + msToHumanReadable(diff2);
50920
- }
50921
- const diff = worldState.voidTraders[0].expiry.getTime() - Date.now();
50922
- const trader = worldState.voidTraders[0];
50923
- const items = trader.inventory.map(getVoidTraderItem);
50924
- return { expiry: msToHumanReadable(diff), items };
50925
- }, "getVoidTrader");
50926
- var generateVoidTraderOutput = /* @__PURE__ */ __name(async (puppe, data) => {
50927
- const element = VoidTraderComponent(data);
50928
- const imgBase64 = await getHtmlImageBase64(puppe, element.toString());
50929
- return OutputImage(imgBase64);
50930
- }, "generateVoidTraderOutput");
50931
-
50932
- // src/commands/wfm/wm.ts
50933
- var wmCommand = /* @__PURE__ */ __name(async (action, input) => {
50934
- const result = await getItemOrders(input);
50935
- if (!result) {
50936
- return `Item not found: ${input}`;
50937
- }
50938
- return await generateItemOrderOutput(
50939
- action.session.app.puppeteer,
50940
- result.item,
50941
- result.orders
50942
51213
  );
50943
- }, "wmCommand");
50944
-
50945
- // src/commands/wfm/wmr.ts
50946
- var wmrCommand = /* @__PURE__ */ __name(async (action, input) => {
50947
- const result = await getRivenOrders(input);
50948
- if (!result) {
50949
- return `Item not found: ${input}`;
50950
- }
50951
- return generateRivenOrderOutput(
50952
- action.session.app.puppeteer,
50953
- result.item,
50954
- result.orders
51214
+ }, "RivenStatComponent");
51215
+ var VoidTraderComponent = /* @__PURE__ */ __name((data) => {
51216
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
51217
+ "div",
51218
+ {
51219
+ style: `width: 400px; padding: 10px; font-family: sans-serif; font-size: 14px;`,
51220
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("table", { style: `width: 100%; border-collapse: collapse;`, children: [
51221
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("thead", { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("tr", { children: [
51222
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
51223
+ "th",
51224
+ {
51225
+ style: `border-bottom: 1px solid #ccc; text-align: left; padding: 6px;`,
51226
+ children: "名称"
51227
+ }
51228
+ ),
51229
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
51230
+ "th",
51231
+ {
51232
+ style: `border-bottom: 1px solid #ccc; text-align: left; padding: 6px;`,
51233
+ children: "价格"
51234
+ }
51235
+ )
51236
+ ] }) }),
51237
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("tbody", { children: data.items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("tr", { children: [
51238
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("td", { style: `padding: 6px; border-bottom: 1px solid #eee;`, children: item.name }),
51239
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
51240
+ "td",
51241
+ {
51242
+ style: `padding: 6px; border-bottom: 1px solid #eee; text-align: center;line-height: 1;`,
51243
+ children: [
51244
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: item.ducats }),
51245
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
51246
+ "svg",
51247
+ {
51248
+ viewBox: "0 0 18 18",
51249
+ style: "\n color: rgb(64 64 64 / 75%);\n height: 1em;\n width: 1em;\n vertical-align: -.125em;\n fill: currentcolor;",
51250
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("use", { href: `#icon-ducats` })
51251
+ }
51252
+ ),
51253
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "+" }),
51254
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: item.credits }),
51255
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "现金" })
51256
+ ]
51257
+ }
51258
+ )
51259
+ ] })) })
51260
+ ] })
51261
+ }
50955
51262
  );
50956
- }, "wmrCommand");
51263
+ }, "VoidTraderComponent");
50957
51264
 
50958
- // src/commands/wf/arbitration.ts
50959
- var arbitrationCommand = /* @__PURE__ */ __name((action, input) => {
51265
+ // src/commands/wf.ts
51266
+ var arbitrationCommand = /* @__PURE__ */ __name(async (action, input) => {
50960
51267
  const result = getArbitrations(input);
50961
51268
  if (!result) {
50962
51269
  return "获取失败, 请稍后再试";
@@ -50964,10 +51271,28 @@ var arbitrationCommand = /* @__PURE__ */ __name((action, input) => {
50964
51271
  if (typeof result === "string") {
50965
51272
  return result;
50966
51273
  }
50967
- return generateArbitrationsOutput(action.session.app.puppeteer, result);
51274
+ return await generateImageOutput(
51275
+ action.session.app.puppeteer,
51276
+ ArbitrationComponent(result)
51277
+ );
50968
51278
  }, "arbitrationCommand");
50969
-
50970
- // src/commands/wf/fissure.ts
51279
+ var circuitCommand = /* @__PURE__ */ __name(async (action) => {
51280
+ const result = getCircuitWeek();
51281
+ return await generateImageOutput(
51282
+ action.session.app.puppeteer,
51283
+ CircuitComponent(result.incarnons, result.warframes)
51284
+ );
51285
+ }, "circuitCommand");
51286
+ var voidtraderCommand = /* @__PURE__ */ __name(async (action) => {
51287
+ const result = await getVoidTrader();
51288
+ if (typeof result === "string") {
51289
+ return result;
51290
+ }
51291
+ return await generateImageOutput(
51292
+ action.session.app.puppeteer,
51293
+ VoidTraderComponent(result)
51294
+ );
51295
+ }, "voidtraderCommand");
50971
51296
  var fissureCommand = /* @__PURE__ */ __name(async (action) => {
50972
51297
  const result = await getFissures();
50973
51298
  if (!result) {
@@ -50976,10 +51301,9 @@ var fissureCommand = /* @__PURE__ */ __name(async (action) => {
50976
51301
  if (typeof result === "string") {
50977
51302
  return result;
50978
51303
  }
50979
- return await generateFissureOutput(
51304
+ return await generateImageOutput(
50980
51305
  action.session.app.puppeteer,
50981
- result,
50982
- "fissure"
51306
+ FissureComponent(result, "fissure")
50983
51307
  );
50984
51308
  }, "fissureCommand");
50985
51309
  var steelPathFissureCommand = /* @__PURE__ */ __name(async (action) => {
@@ -50990,10 +51314,9 @@ var steelPathFissureCommand = /* @__PURE__ */ __name(async (action) => {
50990
51314
  if (typeof result === "string") {
50991
51315
  return result;
50992
51316
  }
50993
- return await generateFissureOutput(
51317
+ return await generateImageOutput(
50994
51318
  action.session.app.puppeteer,
50995
- result,
50996
- "sp-fissure"
51319
+ FissureComponent(result, "sp-fissure")
50997
51320
  );
50998
51321
  }, "steelPathFissureCommand");
50999
51322
  var railjackFissureCommand = /* @__PURE__ */ __name(async (action) => {
@@ -51004,73 +51327,351 @@ var railjackFissureCommand = /* @__PURE__ */ __name(async (action) => {
51004
51327
  if (typeof result === "string") {
51005
51328
  return result;
51006
51329
  }
51007
- return await generateFissureOutput(
51330
+ return await generateImageOutput(
51008
51331
  action.session.app.puppeteer,
51009
- result,
51010
- "rj-fissure"
51332
+ FissureComponent(result, "rj-fissure")
51011
51333
  );
51012
51334
  }, "railjackFissureCommand");
51013
-
51014
- // src/commands/wf/circuit.ts
51015
- var circuitCommand = /* @__PURE__ */ __name((action) => {
51016
- const result = getCircuitWeek();
51017
- return generateCircuitWeekOutput(action.session.app.puppeteer, result);
51018
- }, "circuitCommand");
51019
-
51020
- // src/commands/wf/environment.ts
51021
- var environmentCommand = /* @__PURE__ */ __name(async () => {
51022
- return await getRegionTime();
51023
- }, "environmentCommand");
51024
-
51025
- // src/commands/wf/weekly.ts
51026
- var weeklyCommand = /* @__PURE__ */ __name(async (action) => {
51027
- const result = await getWeekly();
51028
- if (!result || typeof result === "string") {
51029
- return "None.";
51030
- }
51031
- return await generateWeeklyOutput(
51032
- action.session.app.puppeteer,
51033
- result.archonHunt,
51034
- result.deepArchimedea,
51035
- result.temporalArchimedea
51036
- );
51037
- }, "weeklyCommand");
51038
-
51039
- // src/commands/wf/relic.ts
51040
51335
  var relicCommand = /* @__PURE__ */ __name(async (action, input) => {
51041
51336
  const result = await getRelic(input);
51042
51337
  if (typeof result === "string") {
51043
51338
  return result;
51044
51339
  }
51045
51340
  const relic = await applyRelicData(result);
51046
- return await generateRelicOutput(action.session.app.puppeteer, relic);
51341
+ return await generateImageOutput(
51342
+ action.session.app.puppeteer,
51343
+ RelicComponent(relic)
51344
+ );
51047
51345
  }, "relicCommand");
51048
-
51049
- // src/commands/wf/riven.ts
51050
51346
  var rivenCommand = /* @__PURE__ */ __name(async (action, input, secret) => {
51051
- const result = await getAnalyzedRiven(secret, input);
51347
+ if (!input?.src) {
51348
+ return "未检测到图片";
51349
+ }
51350
+ const result = await getAnalyzedRiven(secret, input.src);
51052
51351
  if (typeof result === "string") {
51053
51352
  return result;
51054
51353
  }
51055
- return await generateAnalyzedRivenOutput(
51354
+ return await generateImageOutput(
51056
51355
  action.session.app.puppeteer,
51057
- result
51356
+ RivenComponent(result)
51058
51357
  );
51059
51358
  }, "rivenCommand");
51060
-
51061
- // src/commands/wf/voidtrader.ts
51062
- var voidtraderCommand = /* @__PURE__ */ __name(async (action) => {
51063
- const result = await getVoidTrader();
51359
+ var rivenStatCommand = /* @__PURE__ */ __name(async (action, weaponType, statType, disposition) => {
51360
+ if (!weaponType || !statType || !disposition) {
51361
+ return "请输入正确参数";
51362
+ }
51363
+ const result = await getStaticRivenStats(weaponType, statType, disposition);
51064
51364
  if (typeof result === "string") {
51065
51365
  return result;
51066
51366
  }
51067
- return await generateVoidTraderOutput(action.session.app.puppeteer, result);
51068
- }, "voidtraderCommand");
51367
+ return await generateImageOutput(
51368
+ action.session.app.puppeteer,
51369
+ RivenStatComponent(result)
51370
+ );
51371
+ }, "rivenStatCommand");
51372
+ var weeklyCommand = /* @__PURE__ */ __name(async (action) => {
51373
+ const result = await getWeekly();
51374
+ if (!result) {
51375
+ return "内部错误";
51376
+ }
51377
+ if (typeof result === "string") {
51378
+ return result;
51379
+ }
51380
+ return await generateImageOutput(
51381
+ action.session.app.puppeteer,
51382
+ WeeklyComponent(
51383
+ result.archonHunt,
51384
+ result.deepArchimedea,
51385
+ result.temporalArchimedea
51386
+ )
51387
+ );
51388
+ }, "weeklyCommand");
51389
+ var environmentCommand = /* @__PURE__ */ __name(async () => {
51390
+ return await getEnvironment();
51391
+ }, "environmentCommand");
51392
+
51393
+ // src/components/wfm.tsx
51394
+ var import_jsx_runtime2 = require("@satorijs/element/jsx-runtime");
51395
+ var ItemOrderComponent = /* @__PURE__ */ __name((item, orders) => {
51396
+ const itemNameCN = item.i18n["zh-hans"]?.name;
51397
+ const itemNameEN = item.i18n["en"]?.name;
51398
+ let result = `物品: ${itemNameCN} / ${itemNameEN} (ID: ${item.slug})
51399
+ `;
51400
+ for (const order of orders) {
51401
+ result += `玩家: ${order.user.ingameName} 状态: ${order.user.status} 价格: ${order.platinum}
51402
+ `;
51403
+ }
51404
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: "display:flex; flex-direction: column;", children: [
51405
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("style", { children: `
51406
+ th {
51407
+ align-items: center;
51408
+ font-size: 1.8rem;
51409
+ }
51410
+
51411
+ td {
51412
+ text-align: center;
51413
+ font-size: 1.5rem;
51414
+ }
51415
+
51416
+ tr {
51417
+ height: 3rem;
51418
+ }
51419
+ ` }),
51420
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("h1", { style: "text-align: center;", children: [
51421
+ itemNameCN,
51422
+ " / ",
51423
+ itemNameEN,
51424
+ " (ID: ",
51425
+ item.slug,
51426
+ ")"
51427
+ ] }),
51428
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("table", { style: "width:100%;", children: [
51429
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("tr", { children: [
51430
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("th", { style: "width:40%;", children: "玩家名" }),
51431
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("th", { style: "width:30%;", children: "状态" }),
51432
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("th", { style: "width:10%;", children: "价格" }),
51433
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("th", { style: "width:10%;", children: "数量" }),
51434
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("th", { style: "width:10%;", children: "好评" })
51435
+ ] }),
51436
+ orders.map((order) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("tr", { children: [
51437
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("td", { children: order.user.ingameName }),
51438
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("td", { children: order.user.status }),
51439
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("td", { children: order.platinum }),
51440
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("td", { children: order.quantity }),
51441
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("td", { children: order.user.reputation })
51442
+ ] }))
51443
+ ] }),
51444
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { style: "text-align: center; margin-top: 30px; font-size: 25px;", children: (() => {
51445
+ const firstOrder = orders[0];
51446
+ const comment = `/w ${firstOrder.user.ingameName} Hi! I want to buy: "${itemNameEN}${!item.maxRank || item.maxRank === 0 ? "" : ` (rank ${firstOrder.rank})`}" for ${firstOrder.platinum} platinum. (warframe.market)`;
51447
+ return comment;
51448
+ })() })
51449
+ ] });
51450
+ }, "ItemOrderComponent");
51451
+ var RivenOrderComponent = /* @__PURE__ */ __name((item, orders) => {
51452
+ const itemNameCN = item.i18n ? item.i18n["zh-hans"]?.name : void 0;
51453
+ const itemNameEN = item.i18n ? item.i18n["en"]?.name : void 0;
51454
+ const itemThumb = item.i18n ? item.i18n["en"]?.thumb : void 0;
51455
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: "display:flex; flex-direction: column; font-size: 12px;", children: [
51456
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("h1", { style: "text-align: center;", children: [
51457
+ itemNameCN,
51458
+ " / ",
51459
+ itemNameEN,
51460
+ " (ID: ",
51461
+ item.slug,
51462
+ ")"
51463
+ ] }),
51464
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("ul", { style: "width:100%;", children: orders.map((order) => {
51465
+ return RivenOrderItemComponent(
51466
+ order,
51467
+ itemNameCN,
51468
+ itemNameEN,
51469
+ itemThumb
51470
+ );
51471
+ }) })
51472
+ ] });
51473
+ }, "RivenOrderComponent");
51474
+ var RivenOrderItemComponent = /* @__PURE__ */ __name((order, cnName, enName, thumb) => {
51475
+ const itemNameCN = cnName ?? enName;
51476
+ const itemIconLink = thumb ? "https://warframe.market/static/assets/" + thumb : void 0;
51477
+ const ownerAvatarLink = order.owner.avatar ? "https://warframe.market/static/assets/" + order.owner.avatar : void 0;
51478
+ const reputationColor = order.owner.reputation >= 5 ? "#00a96c" : "#739098";
51479
+ const reputationIconLink = order.owner.reputation >= 5 ? "#icon-smile" : "#icon-meh";
51480
+ const statusData = {
51481
+ ingame: ["ONLINE IN GAME", "#634b93"],
51482
+ online: ["ONLINE", "darkgreen"],
51483
+ offline: ["OFFLINE", "darkred"],
51484
+ _: ["UNKNOWN", "grey"]
51485
+ };
51486
+ const status = order.owner.status in statusData ? order.owner.status : "_";
51487
+ const statusText = statusData[status][0];
51488
+ const statusColor = statusData[status][1];
51489
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: "border: 1px solid gray; margin: 20px; padding: 10px 15px 10px 11px; font-family: 'Lato', sans-serif, Helvetica, Arial; display: flex; flex-direction: column;", children: [
51490
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: "display: flex; align-items: center; padding-bottom: 10px; min-height: 45px;", children: [
51491
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
51492
+ "img",
51493
+ {
51494
+ src: itemIconLink,
51495
+ style: "height: 30px; width: 30px; object-fit: contain; border-radius: 50%; box-shadow: 0 0 10px 1px rgba(0, 0, 0, .15); vertical-align: middle;"
51496
+ }
51497
+ ),
51498
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
51499
+ "span",
51500
+ {
51501
+ id: "title",
51502
+ style: "margin-left: 15px; font-size: 16px; line-height: 16px; font-weight: 700; text-overflow: ellipsis; text-decoration: underline; cursor: pointer;",
51503
+ children: [
51504
+ itemNameCN,
51505
+ " ",
51506
+ order.item.name
51507
+ ]
51508
+ }
51509
+ )
51510
+ ] }),
51511
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
51512
+ "div",
51513
+ {
51514
+ id: "body",
51515
+ style: "display: flex; flex-wrap: wrap; justify-content: space-between;",
51516
+ children: [
51517
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { id: "body-left", children: [
51518
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("ul", { style: "display: flex; padding-top: 5px;", children: order.item.attributes.filter((attr) => attr.positive).map(RivenAttributeComponent) }),
51519
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("ul", { style: "display: flex; width: 100%; padding-top: 5px;", children: order.item.attributes.filter((attr) => !attr.positive).map(RivenAttributeComponent) }),
51520
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("ul", { style: "display: flex; padding: 5px 0; font-size: 12px;", children: [
51521
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("li", { style: "margin-right: 10px;", children: [
51522
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: "段位 " }),
51523
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("b", { children: order.item.mastery_level })
51524
+ ] }),
51525
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("li", { style: "margin-right: 10px;", children: [
51526
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: "等级: " }),
51527
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("b", { children: order.item.mod_rank })
51528
+ ] }),
51529
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("li", { style: "margin-right: 10px;", children: [
51530
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: "循环: " }),
51531
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("b", { children: order.item.re_rolls })
51532
+ ] }),
51533
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("li", { style: "margin-right: 10px;", children: [
51534
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: "极性: " }),
51535
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("b", { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
51536
+ "svg",
51537
+ {
51538
+ viewBox: "0 0 18 18",
51539
+ style: "\n color: rgb(64 64 64 / 75%);\n height: 1em;\n width: 1em;\n vertical-align: -.125em;\n fill: currentcolor;",
51540
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("use", { href: `#icon-${order.item.polarity}` })
51541
+ }
51542
+ ) })
51543
+ ] })
51544
+ ] })
51545
+ ] }),
51546
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
51547
+ "div",
51548
+ {
51549
+ id: "body-right",
51550
+ style: "display: flex; flex-direction: column; justify-content: center; padding-left: 10px;",
51551
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: "display: flex; justify-content: flex-end; font-size: 16px;", children: [
51552
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: "售价: " }),
51553
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: "padding-left: 5px; line-height: 1.5;", children: [
51554
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("b", { children: order.starting_price }),
51555
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
51556
+ "svg",
51557
+ {
51558
+ viewBox: "0 0 215.535 215.535",
51559
+ style: "\n margin: 0 0 0 3px;\n color: rgb(64 64 64 / 75%);\n height: 1em;\n width: 1em;\n vertical-align: -.125em;\n fill: currentcolor;",
51560
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("use", { href: "#icon-platinum" })
51561
+ }
51562
+ )
51563
+ ] })
51564
+ ] })
51565
+ }
51566
+ )
51567
+ ]
51568
+ }
51569
+ ),
51570
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
51571
+ "div",
51572
+ {
51573
+ id: "footer",
51574
+ style: "display: flex; margin-top: 10px; line-height: 1.5;",
51575
+ children: [
51576
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: "display: flex;", children: [
51577
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
51578
+ "img",
51579
+ {
51580
+ src: ownerAvatarLink,
51581
+ style: "height: 20px; width: 20px; object-fit: contain; border-radius: 50%; box-shadow: 0 0 10px 1px rgba(0, 0, 0, .15); vertical-align: middle;"
51582
+ }
51583
+ ),
51584
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: "margin-left: 5px;", children: order.owner.ingame_name })
51585
+ ] }),
51586
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
51587
+ "div",
51588
+ {
51589
+ style: `margin-left: 10px; color:${statusColor ?? "gray"}; font-size: 12px;`,
51590
+ children: statusText
51591
+ }
51592
+ ),
51593
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: `margin-left: 10px; color:${reputationColor};`, children: [
51594
+ order.owner.reputation,
51595
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
51596
+ "svg",
51597
+ {
51598
+ viewBox: "0 0 496 512",
51599
+ style: "margin-left: 5px; margin-top: -2px; overflow:hidden; height: 1em; width: 1em; vertical-align: -.125em; fill: currentcolor;",
51600
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("use", { href: reputationIconLink })
51601
+ }
51602
+ )
51603
+ ] })
51604
+ ]
51605
+ }
51606
+ )
51607
+ ] });
51608
+ }, "RivenOrderItemComponent");
51609
+ var RivenAttributeComponent = /* @__PURE__ */ __name((attr, index) => {
51610
+ const attrInfo = attr.attribute;
51611
+ const attrName = attrInfo.i18n["zh-hans"].name;
51612
+ const attrValuePrefix = attrInfo.unit === "multiply" ? "x" : "";
51613
+ const unitSuffixMap = {
51614
+ percent: "%",
51615
+ second: "s",
51616
+ multiply: ""
51617
+ };
51618
+ const attrValueSuffix = unitSuffixMap[attrInfo.unit] || "";
51619
+ const attrValue = attrValuePrefix + attr.value + attrValueSuffix;
51620
+ const positiveColors = [
51621
+ "--color_rgb_attribute_background_first",
51622
+ "--color_rgb_attribute_background_second",
51623
+ "--color_rgb_attribute_background_third"
51624
+ ];
51625
+ const color = attr.positive ? positiveColors[index] : "--color_rgb_attribute_background_negative";
51626
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
51627
+ "li",
51628
+ {
51629
+ style: `
51630
+ border: 1px solid rgb(var(${color})/50%);
51631
+ background-color: rgb(var(${color})/10%);
51632
+ color: rgb(var(${color}));
51633
+ padding: 2px 10px;
51634
+ border-radius: 4px;
51635
+ margin-right: 5px;
51636
+ font-size: 14px;
51637
+ line-height: 1.5;`,
51638
+ children: [
51639
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("b", { children: [
51640
+ attr.positive && !attrValuePrefix && attr.value > 0 ? "+" : "",
51641
+ attrValue,
51642
+ " "
51643
+ ] }),
51644
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: attrName })
51645
+ ]
51646
+ }
51647
+ );
51648
+ }, "RivenAttributeComponent");
51649
+
51650
+ // src/commands/wfm.ts
51651
+ var wmCommand = /* @__PURE__ */ __name(async (action, input) => {
51652
+ const result = await getItemOrders(input);
51653
+ if (!result) {
51654
+ return `Item not found: ${input}`;
51655
+ }
51656
+ return await generateImageOutput(
51657
+ action.session.app.puppeteer,
51658
+ ItemOrderComponent(result.item, result.orders)
51659
+ );
51660
+ }, "wmCommand");
51661
+ var wmrCommand = /* @__PURE__ */ __name(async (action, input) => {
51662
+ const result = await getRivenOrders(input);
51663
+ if (!result) {
51664
+ return `Item not found: ${input}`;
51665
+ }
51666
+ return await generateImageOutput(
51667
+ action.session.app.puppeteer,
51668
+ RivenOrderComponent(result.item, result.orders)
51669
+ );
51670
+ }, "wmrCommand");
51069
51671
 
51070
51672
  // src/hooks/on-ready.ts
51071
51673
  var onReadyHandler = /* @__PURE__ */ __name(async () => {
51072
51674
  await wmOnReady();
51073
- await wfOnReady();
51074
51675
  }, "onReadyHandler");
51075
51676
 
51076
51677
  // src/index.ts
@@ -51090,33 +51691,27 @@ __name(apply, "apply");
51090
51691
  var setupHooks = /* @__PURE__ */ __name((ctx) => {
51091
51692
  ctx.on("message", (session) => {
51092
51693
  if (ctx.config.developerMode) {
51093
- ctx.logger.info(`
51094
- Koishi recieved message: ${session.content}
51095
- 平台: ${session.platform}
51096
- 用户: ${session.author.name}`);
51097
- }
51098
- });
51099
- ctx.on("ready", onReadyHandler);
51100
- }, "setupHooks");
51101
- var setupCommands = /* @__PURE__ */ __name((ctx) => {
51102
- ctx.command("wm <itemId:text>", "请用wmi替代").action((a, b) => {
51103
- if (ctx.config.developerMode) {
51104
- ctx.logger.info(`WFM Plugin received command wm: '${b}'`);
51105
- }
51106
- return wmCommand(a, b);
51107
- });
51108
- ctx.command("wmr <itemId:text>", "查询wm的紫卡价格").action((a, b) => {
51109
- if (ctx.config.developerMode) {
51110
- ctx.logger.info(`WFM Plugin received command wmr: '${b}'`);
51694
+ ctx.logger.info(
51695
+ `Koishi recieved message: ${session.content}
51696
+ Platform: ${session.platform}
51697
+ User: ${session.author.name}`
51698
+ );
51111
51699
  }
51112
- return wmrCommand(a, b);
51113
51700
  });
51114
- ctx.command("wmi <msg:text>", "查询wm的物品价格").action((a, b) => {
51701
+ ctx.on("command/before-execute", (action) => {
51115
51702
  if (ctx.config.developerMode) {
51116
- ctx.logger.info(`WFM Plugin received command wmi: '${b}'`);
51703
+ ctx.logger.info(
51704
+ `WFM Plugin received command ${action.command?.name}
51705
+ arguments: ${JSON.stringify(action.args)}`
51706
+ );
51117
51707
  }
51118
- return wmCommand(a, b);
51119
51708
  });
51709
+ ctx.on("ready", onReadyHandler);
51710
+ }, "setupHooks");
51711
+ var setupCommands = /* @__PURE__ */ __name((ctx) => {
51712
+ ctx.command("wm <itemId:text>", "请使用wmi替代").action(wmCommand);
51713
+ ctx.command("wmr <itemId:text>", "查询wm的紫卡价格").action(wmrCommand);
51714
+ ctx.command("wmi <msg:text>", "查询wm的物品价格").action(wmCommand);
51120
51715
  ctx.command("arbitration [day:number]", "近期高价值仲裁任务").alias("arbi").alias("仲裁").alias("仲裁表").action(arbitrationCommand);
51121
51716
  ctx.command("fissure", "当前虚空裂隙").alias("裂缝").alias("裂隙").action(fissureCommand);
51122
51717
  ctx.command("spfissure", "当前钢铁之路虚空裂隙").alias("钢铁裂缝").alias("钢铁裂隙").action(steelPathFissureCommand);
@@ -51125,12 +51720,16 @@ var setupCommands = /* @__PURE__ */ __name((ctx) => {
51125
51720
  ctx.command("environment", "当前各区域状态").alias("env").alias("平原").alias("地球").alias("金星").alias("夜灵").alias("夜灵平野").alias("奥布山谷").action(environmentCommand);
51126
51721
  ctx.command("weekly", "周常任务").alias("周常").alias("科研").alias("时光科研").alias("深层科研").alias("执行官").action(weeklyCommand);
51127
51722
  ctx.command("circuit", "本周回廊战甲及灵化之源").alias("灵化之源").alias("灵化").action(circuitCommand);
51128
- ctx.command("lichc", "c系玄骸武器", { hidden: true }).action(inDevelopment);
51129
- ctx.command("lichi", "i系玄骸武器", { hidden: true }).action(inDevelopment);
51130
51723
  ctx.command("riven <img:image>", "分析紫卡截图").action((a, b) => {
51131
51724
  return rivenCommand(a, b, ctx.config.ocrAPISecret);
51132
51725
  });
51726
+ ctx.command(
51727
+ "rivenstat <weaponType:string> <statType:string> <disposition:number>",
51728
+ "获取紫卡数值范围"
51729
+ ).usage("武器类型: 步枪, 手枪, 霰弹枪, 近战, Archwing枪械\n词条类型: 2, 3, 21, 31").example("rivenstat 步枪 31 0.7").alias("紫卡数值").action(rivenStatCommand);
51133
51730
  ctx.command("voidtrader", "虚空商人").alias("虚空商人").alias("奸商").action(voidtraderCommand);
51731
+ ctx.command("lichc", "c系玄骸武器", { hidden: true }).action(inDevelopment);
51732
+ ctx.command("lichi", "i系玄骸武器", { hidden: true }).action(inDevelopment);
51134
51733
  }, "setupCommands");
51135
51734
  var inDevelopment = /* @__PURE__ */ __name(() => {
51136
51735
  return "功能暂未开放";