koishi-plugin-warframe 1.6.6 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.js CHANGED
@@ -156,7 +156,7 @@ var require_DLList = __commonJS({
156
156
  var require_Events = __commonJS({
157
157
  "node_modules/bottleneck/lib/Events.js"(exports2, module2) {
158
158
  "use strict";
159
- function asyncGeneratorStep2(gen, resolve2, reject, _next, _throw, key, arg) {
159
+ function asyncGeneratorStep2(gen, resolve3, reject, _next, _throw, key, arg) {
160
160
  try {
161
161
  var info = gen[key](arg);
162
162
  var value = info.value;
@@ -165,7 +165,7 @@ var require_Events = __commonJS({
165
165
  return;
166
166
  }
167
167
  if (info.done) {
168
- resolve2(value);
168
+ resolve3(value);
169
169
  } else {
170
170
  Promise.resolve(value).then(_next, _throw);
171
171
  }
@@ -174,14 +174,14 @@ var require_Events = __commonJS({
174
174
  function _asyncToGenerator2(fn) {
175
175
  return function() {
176
176
  var self2 = this, args = arguments;
177
- return new Promise(function(resolve2, reject) {
177
+ return new Promise(function(resolve3, reject) {
178
178
  var gen = fn.apply(self2, args);
179
179
  function _next(value) {
180
- asyncGeneratorStep2(gen, resolve2, reject, _next, _throw, "next", value);
180
+ asyncGeneratorStep2(gen, resolve3, reject, _next, _throw, "next", value);
181
181
  }
182
182
  __name(_next, "_next");
183
183
  function _throw(err) {
184
- asyncGeneratorStep2(gen, resolve2, reject, _next, _throw, "throw", err);
184
+ asyncGeneratorStep2(gen, resolve3, reject, _next, _throw, "throw", err);
185
185
  }
186
186
  __name(_throw, "_throw");
187
187
  _next(void 0);
@@ -384,7 +384,7 @@ var require_BottleneckError = __commonJS({
384
384
  var require_Job = __commonJS({
385
385
  "node_modules/bottleneck/lib/Job.js"(exports2, module2) {
386
386
  "use strict";
387
- function asyncGeneratorStep2(gen, resolve2, reject, _next, _throw, key, arg) {
387
+ function asyncGeneratorStep2(gen, resolve3, reject, _next, _throw, key, arg) {
388
388
  try {
389
389
  var info = gen[key](arg);
390
390
  var value = info.value;
@@ -393,7 +393,7 @@ var require_Job = __commonJS({
393
393
  return;
394
394
  }
395
395
  if (info.done) {
396
- resolve2(value);
396
+ resolve3(value);
397
397
  } else {
398
398
  Promise.resolve(value).then(_next, _throw);
399
399
  }
@@ -402,14 +402,14 @@ var require_Job = __commonJS({
402
402
  function _asyncToGenerator2(fn) {
403
403
  return function() {
404
404
  var self2 = this, args = arguments;
405
- return new Promise(function(resolve2, reject) {
405
+ return new Promise(function(resolve3, reject) {
406
406
  var gen = fn.apply(self2, args);
407
407
  function _next(value) {
408
- asyncGeneratorStep2(gen, resolve2, reject, _next, _throw, "next", value);
408
+ asyncGeneratorStep2(gen, resolve3, reject, _next, _throw, "next", value);
409
409
  }
410
410
  __name(_next, "_next");
411
411
  function _throw(err) {
412
- asyncGeneratorStep2(gen, resolve2, reject, _next, _throw, "throw", err);
412
+ asyncGeneratorStep2(gen, resolve3, reject, _next, _throw, "throw", err);
413
413
  }
414
414
  __name(_throw, "_throw");
415
415
  _next(void 0);
@@ -595,7 +595,7 @@ var require_Job = __commonJS({
595
595
  var require_LocalDatastore = __commonJS({
596
596
  "node_modules/bottleneck/lib/LocalDatastore.js"(exports2, module2) {
597
597
  "use strict";
598
- function asyncGeneratorStep2(gen, resolve2, reject, _next, _throw, key, arg) {
598
+ function asyncGeneratorStep2(gen, resolve3, reject, _next, _throw, key, arg) {
599
599
  try {
600
600
  var info = gen[key](arg);
601
601
  var value = info.value;
@@ -604,7 +604,7 @@ var require_LocalDatastore = __commonJS({
604
604
  return;
605
605
  }
606
606
  if (info.done) {
607
- resolve2(value);
607
+ resolve3(value);
608
608
  } else {
609
609
  Promise.resolve(value).then(_next, _throw);
610
610
  }
@@ -613,14 +613,14 @@ var require_LocalDatastore = __commonJS({
613
613
  function _asyncToGenerator2(fn) {
614
614
  return function() {
615
615
  var self2 = this, args = arguments;
616
- return new Promise(function(resolve2, reject) {
616
+ return new Promise(function(resolve3, reject) {
617
617
  var gen = fn.apply(self2, args);
618
618
  function _next(value) {
619
- asyncGeneratorStep2(gen, resolve2, reject, _next, _throw, "next", value);
619
+ asyncGeneratorStep2(gen, resolve3, reject, _next, _throw, "next", value);
620
620
  }
621
621
  __name(_next, "_next");
622
622
  function _throw(err) {
623
- asyncGeneratorStep2(gen, resolve2, reject, _next, _throw, "throw", err);
623
+ asyncGeneratorStep2(gen, resolve3, reject, _next, _throw, "throw", err);
624
624
  }
625
625
  __name(_throw, "_throw");
626
626
  _next(void 0);
@@ -694,8 +694,8 @@ var require_LocalDatastore = __commonJS({
694
694
  })();
695
695
  }
696
696
  yieldLoop(t2 = 0) {
697
- return new this.Promise(function(resolve2, reject) {
698
- return setTimeout(resolve2, t2);
697
+ return new this.Promise(function(resolve3, reject) {
698
+ return setTimeout(resolve3, t2);
699
699
  });
700
700
  }
701
701
  computePenalty() {
@@ -733,11 +733,11 @@ var require_LocalDatastore = __commonJS({
733
733
  return _this6._done;
734
734
  })();
735
735
  }
736
- __groupCheck__(time) {
736
+ __groupCheck__(time2) {
737
737
  var _this7 = this;
738
738
  return _asyncToGenerator2(function* () {
739
739
  yield _this7.yieldLoop();
740
- return _this7._nextRequest + _this7.timeout < time;
740
+ return _this7._nextRequest + _this7.timeout < time2;
741
741
  })();
742
742
  }
743
743
  computeCapacity() {
@@ -1165,7 +1165,7 @@ var require_Scripts = __commonJS({
1165
1165
  var require_RedisConnection = __commonJS({
1166
1166
  "node_modules/bottleneck/lib/RedisConnection.js"(exports, module) {
1167
1167
  "use strict";
1168
- function asyncGeneratorStep(gen, resolve2, reject, _next, _throw, key, arg) {
1168
+ function asyncGeneratorStep(gen, resolve3, reject, _next, _throw, key, arg) {
1169
1169
  try {
1170
1170
  var info = gen[key](arg);
1171
1171
  var value = info.value;
@@ -1174,7 +1174,7 @@ var require_RedisConnection = __commonJS({
1174
1174
  return;
1175
1175
  }
1176
1176
  if (info.done) {
1177
- resolve2(value);
1177
+ resolve3(value);
1178
1178
  } else {
1179
1179
  Promise.resolve(value).then(_next, _throw);
1180
1180
  }
@@ -1183,14 +1183,14 @@ var require_RedisConnection = __commonJS({
1183
1183
  function _asyncToGenerator(fn) {
1184
1184
  return function() {
1185
1185
  var self2 = this, args = arguments;
1186
- return new Promise(function(resolve2, reject) {
1186
+ return new Promise(function(resolve3, reject) {
1187
1187
  var gen = fn.apply(self2, args);
1188
1188
  function _next(value) {
1189
- asyncGeneratorStep(gen, resolve2, reject, _next, _throw, "next", value);
1189
+ asyncGeneratorStep(gen, resolve3, reject, _next, _throw, "next", value);
1190
1190
  }
1191
1191
  __name(_next, "_next");
1192
1192
  function _throw(err) {
1193
- asyncGeneratorStep(gen, resolve2, reject, _next, _throw, "throw", err);
1193
+ asyncGeneratorStep(gen, resolve3, reject, _next, _throw, "throw", err);
1194
1194
  }
1195
1195
  __name(_throw, "_throw");
1196
1196
  _next(void 0);
@@ -1236,7 +1236,7 @@ var require_RedisConnection = __commonJS({
1236
1236
  }
1237
1237
  _setup(client, sub) {
1238
1238
  client.setMaxListeners(0);
1239
- return new this.Promise((resolve2, reject) => {
1239
+ return new this.Promise((resolve3, reject) => {
1240
1240
  client.on("error", (e) => {
1241
1241
  return this.Events.trigger("error", e);
1242
1242
  });
@@ -1247,14 +1247,14 @@ var require_RedisConnection = __commonJS({
1247
1247
  });
1248
1248
  }
1249
1249
  if (client.ready) {
1250
- return resolve2();
1250
+ return resolve3();
1251
1251
  } else {
1252
- return client.once("ready", resolve2);
1252
+ return client.once("ready", resolve3);
1253
1253
  }
1254
1254
  });
1255
1255
  }
1256
1256
  _loadScript(name2) {
1257
- return new this.Promise((resolve2, reject) => {
1257
+ return new this.Promise((resolve3, reject) => {
1258
1258
  var payload;
1259
1259
  payload = Scripts.payload(name2);
1260
1260
  return this.client.multi([["script", "load", payload]]).exec((err, replies) => {
@@ -1262,7 +1262,7 @@ var require_RedisConnection = __commonJS({
1262
1262
  return reject(err);
1263
1263
  }
1264
1264
  this.shas[name2] = replies[0];
1265
- return resolve2(replies[0]);
1265
+ return resolve3(replies[0]);
1266
1266
  });
1267
1267
  });
1268
1268
  }
@@ -1275,12 +1275,12 @@ var require_RedisConnection = __commonJS({
1275
1275
  var _this = this;
1276
1276
  return _asyncToGenerator(function* () {
1277
1277
  yield _this.ready;
1278
- return new _this.Promise((resolve2, reject) => {
1278
+ return new _this.Promise((resolve3, reject) => {
1279
1279
  return _this.client.multi([cmd]).exec_atomic(function(err, replies) {
1280
1280
  if (err != null) {
1281
1281
  return reject(err);
1282
1282
  } else {
1283
- return resolve2(replies[0]);
1283
+ return resolve3(replies[0]);
1284
1284
  }
1285
1285
  });
1286
1286
  });
@@ -1288,13 +1288,13 @@ var require_RedisConnection = __commonJS({
1288
1288
  }
1289
1289
  __addLimiter__(instance) {
1290
1290
  return this.Promise.all([instance.channel(), instance.channel_client()].map((channel) => {
1291
- return new this.Promise((resolve2, reject) => {
1291
+ return new this.Promise((resolve3, reject) => {
1292
1292
  var handler;
1293
1293
  handler = /* @__PURE__ */ __name((chan) => {
1294
1294
  if (chan === channel) {
1295
1295
  this.subscriber.removeListener("subscribe", handler);
1296
1296
  this.limiters[channel] = instance;
1297
- return resolve2();
1297
+ return resolve3();
1298
1298
  }
1299
1299
  }, "handler");
1300
1300
  this.subscriber.on("subscribe", handler);
@@ -1308,13 +1308,13 @@ var require_RedisConnection = __commonJS({
1308
1308
  /* @__PURE__ */ (function() {
1309
1309
  var _ref = _asyncToGenerator(function* (channel) {
1310
1310
  if (!_this2.terminated) {
1311
- yield new _this2.Promise((resolve2, reject) => {
1311
+ yield new _this2.Promise((resolve3, reject) => {
1312
1312
  return _this2.subscriber.unsubscribe(channel, function(err, chan) {
1313
1313
  if (err != null) {
1314
1314
  return reject(err);
1315
1315
  }
1316
1316
  if (chan === channel) {
1317
- return resolve2();
1317
+ return resolve3();
1318
1318
  }
1319
1319
  });
1320
1320
  });
@@ -1403,7 +1403,7 @@ var require_IORedisConnection = __commonJS({
1403
1403
  if (Array.isArray(arr)) return arr;
1404
1404
  }
1405
1405
  __name(_arrayWithHoles, "_arrayWithHoles");
1406
- function asyncGeneratorStep(gen, resolve2, reject, _next, _throw, key, arg) {
1406
+ function asyncGeneratorStep(gen, resolve3, reject, _next, _throw, key, arg) {
1407
1407
  try {
1408
1408
  var info = gen[key](arg);
1409
1409
  var value = info.value;
@@ -1412,7 +1412,7 @@ var require_IORedisConnection = __commonJS({
1412
1412
  return;
1413
1413
  }
1414
1414
  if (info.done) {
1415
- resolve2(value);
1415
+ resolve3(value);
1416
1416
  } else {
1417
1417
  Promise.resolve(value).then(_next, _throw);
1418
1418
  }
@@ -1421,14 +1421,14 @@ var require_IORedisConnection = __commonJS({
1421
1421
  function _asyncToGenerator(fn) {
1422
1422
  return function() {
1423
1423
  var self2 = this, args = arguments;
1424
- return new Promise(function(resolve2, reject) {
1424
+ return new Promise(function(resolve3, reject) {
1425
1425
  var gen = fn.apply(self2, args);
1426
1426
  function _next(value) {
1427
- asyncGeneratorStep(gen, resolve2, reject, _next, _throw, "next", value);
1427
+ asyncGeneratorStep(gen, resolve3, reject, _next, _throw, "next", value);
1428
1428
  }
1429
1429
  __name(_next, "_next");
1430
1430
  function _throw(err) {
1431
- asyncGeneratorStep(gen, resolve2, reject, _next, _throw, "throw", err);
1431
+ asyncGeneratorStep(gen, resolve3, reject, _next, _throw, "throw", err);
1432
1432
  }
1433
1433
  __name(_throw, "_throw");
1434
1434
  _next(void 0);
@@ -1479,7 +1479,7 @@ var require_IORedisConnection = __commonJS({
1479
1479
  }
1480
1480
  _setup(client, sub) {
1481
1481
  client.setMaxListeners(0);
1482
- return new this.Promise((resolve2, reject) => {
1482
+ return new this.Promise((resolve3, reject) => {
1483
1483
  client.on("error", (e) => {
1484
1484
  return this.Events.trigger("error", e);
1485
1485
  });
@@ -1490,9 +1490,9 @@ var require_IORedisConnection = __commonJS({
1490
1490
  });
1491
1491
  }
1492
1492
  if (client.status === "ready") {
1493
- return resolve2();
1493
+ return resolve3();
1494
1494
  } else {
1495
- return client.once("ready", resolve2);
1495
+ return client.once("ready", resolve3);
1496
1496
  }
1497
1497
  });
1498
1498
  }
@@ -1518,10 +1518,10 @@ var require_IORedisConnection = __commonJS({
1518
1518
  }
1519
1519
  __addLimiter__(instance) {
1520
1520
  return this.Promise.all([instance.channel(), instance.channel_client()].map((channel) => {
1521
- return new this.Promise((resolve2, reject) => {
1521
+ return new this.Promise((resolve3, reject) => {
1522
1522
  return this.subscriber.subscribe(channel, () => {
1523
1523
  this.limiters[channel] = instance;
1524
- return resolve2();
1524
+ return resolve3();
1525
1525
  });
1526
1526
  });
1527
1527
  }));
@@ -1623,7 +1623,7 @@ var require_RedisDatastore = __commonJS({
1623
1623
  if (Array.isArray(arr)) return arr;
1624
1624
  }
1625
1625
  __name(_arrayWithHoles2, "_arrayWithHoles");
1626
- function asyncGeneratorStep2(gen, resolve2, reject, _next, _throw, key, arg) {
1626
+ function asyncGeneratorStep2(gen, resolve3, reject, _next, _throw, key, arg) {
1627
1627
  try {
1628
1628
  var info = gen[key](arg);
1629
1629
  var value = info.value;
@@ -1632,7 +1632,7 @@ var require_RedisDatastore = __commonJS({
1632
1632
  return;
1633
1633
  }
1634
1634
  if (info.done) {
1635
- resolve2(value);
1635
+ resolve3(value);
1636
1636
  } else {
1637
1637
  Promise.resolve(value).then(_next, _throw);
1638
1638
  }
@@ -1641,14 +1641,14 @@ var require_RedisDatastore = __commonJS({
1641
1641
  function _asyncToGenerator2(fn) {
1642
1642
  return function() {
1643
1643
  var self2 = this, args = arguments;
1644
- return new Promise(function(resolve2, reject) {
1644
+ return new Promise(function(resolve3, reject) {
1645
1645
  var gen = fn.apply(self2, args);
1646
1646
  function _next(value) {
1647
- asyncGeneratorStep2(gen, resolve2, reject, _next, _throw, "next", value);
1647
+ asyncGeneratorStep2(gen, resolve3, reject, _next, _throw, "next", value);
1648
1648
  }
1649
1649
  __name(_next, "_next");
1650
1650
  function _throw(err) {
1651
- asyncGeneratorStep2(gen, resolve2, reject, _next, _throw, "throw", err);
1651
+ asyncGeneratorStep2(gen, resolve3, reject, _next, _throw, "throw", err);
1652
1652
  }
1653
1653
  __name(_throw, "_throw");
1654
1654
  _next(void 0);
@@ -1789,7 +1789,7 @@ var require_RedisDatastore = __commonJS({
1789
1789
  if (!(name2 === "init" || name2 === "register_client")) {
1790
1790
  yield _this3.ready;
1791
1791
  }
1792
- return new _this3.Promise((resolve2, reject) => {
1792
+ return new _this3.Promise((resolve3, reject) => {
1793
1793
  var all_args, arr;
1794
1794
  all_args = [Date.now(), _this3.clientId].concat(args);
1795
1795
  _this3.instance.Events.trigger("debug", `Calling Redis script: ${name2}.lua`, all_args);
@@ -1797,7 +1797,7 @@ var require_RedisDatastore = __commonJS({
1797
1797
  if (err != null) {
1798
1798
  return reject(err);
1799
1799
  }
1800
- return resolve2(replies);
1800
+ return resolve3(replies);
1801
1801
  });
1802
1802
  return _this3.connection.__scriptFn__(name2)(...arr);
1803
1803
  }).catch((e) => {
@@ -2031,7 +2031,7 @@ var require_States = __commonJS({
2031
2031
  var require_Sync = __commonJS({
2032
2032
  "node_modules/bottleneck/lib/Sync.js"(exports2, module2) {
2033
2033
  "use strict";
2034
- function asyncGeneratorStep2(gen, resolve2, reject, _next, _throw, key, arg) {
2034
+ function asyncGeneratorStep2(gen, resolve3, reject, _next, _throw, key, arg) {
2035
2035
  try {
2036
2036
  var info = gen[key](arg);
2037
2037
  var value = info.value;
@@ -2040,7 +2040,7 @@ var require_Sync = __commonJS({
2040
2040
  return;
2041
2041
  }
2042
2042
  if (info.done) {
2043
- resolve2(value);
2043
+ resolve3(value);
2044
2044
  } else {
2045
2045
  Promise.resolve(value).then(_next, _throw);
2046
2046
  }
@@ -2049,14 +2049,14 @@ var require_Sync = __commonJS({
2049
2049
  function _asyncToGenerator2(fn) {
2050
2050
  return function() {
2051
2051
  var self2 = this, args = arguments;
2052
- return new Promise(function(resolve2, reject) {
2052
+ return new Promise(function(resolve3, reject) {
2053
2053
  var gen = fn.apply(self2, args);
2054
2054
  function _next(value) {
2055
- asyncGeneratorStep2(gen, resolve2, reject, _next, _throw, "next", value);
2055
+ asyncGeneratorStep2(gen, resolve3, reject, _next, _throw, "next", value);
2056
2056
  }
2057
2057
  __name(_next, "_next");
2058
2058
  function _throw(err) {
2059
- asyncGeneratorStep2(gen, resolve2, reject, _next, _throw, "throw", err);
2059
+ asyncGeneratorStep2(gen, resolve3, reject, _next, _throw, "throw", err);
2060
2060
  }
2061
2061
  __name(_throw, "_throw");
2062
2062
  _next(void 0);
@@ -2084,19 +2084,19 @@ var require_Sync = __commonJS({
2084
2084
  _tryToRun() {
2085
2085
  var _this = this;
2086
2086
  return _asyncToGenerator2(function* () {
2087
- var args, cb, error, reject, resolve2, returned, task;
2087
+ var args, cb, error, reject, resolve3, returned, task;
2088
2088
  if (_this._running < 1 && _this._queue.length > 0) {
2089
2089
  _this._running++;
2090
2090
  var _this$_queue$shift = _this._queue.shift();
2091
2091
  task = _this$_queue$shift.task;
2092
2092
  args = _this$_queue$shift.args;
2093
- resolve2 = _this$_queue$shift.resolve;
2093
+ resolve3 = _this$_queue$shift.resolve;
2094
2094
  reject = _this$_queue$shift.reject;
2095
2095
  cb = yield _asyncToGenerator2(function* () {
2096
2096
  try {
2097
2097
  returned = yield task(...args);
2098
2098
  return function() {
2099
- return resolve2(returned);
2099
+ return resolve3(returned);
2100
2100
  };
2101
2101
  } catch (error1) {
2102
2102
  error = error1;
@@ -2112,16 +2112,16 @@ var require_Sync = __commonJS({
2112
2112
  })();
2113
2113
  }
2114
2114
  schedule(task, ...args) {
2115
- var promise, reject, resolve2;
2116
- resolve2 = reject = null;
2115
+ var promise, reject, resolve3;
2116
+ resolve3 = reject = null;
2117
2117
  promise = new this.Promise(function(_resolve, _reject) {
2118
- resolve2 = _resolve;
2118
+ resolve3 = _resolve;
2119
2119
  return reject = _reject;
2120
2120
  });
2121
2121
  this._queue.push({
2122
2122
  task,
2123
2123
  args,
2124
- resolve: resolve2,
2124
+ resolve: resolve3,
2125
2125
  reject
2126
2126
  });
2127
2127
  this._tryToRun();
@@ -2178,7 +2178,7 @@ var require_Group = __commonJS({
2178
2178
  if (Array.isArray(arr)) return arr;
2179
2179
  }
2180
2180
  __name(_arrayWithHoles2, "_arrayWithHoles");
2181
- function asyncGeneratorStep2(gen, resolve2, reject, _next, _throw, key, arg) {
2181
+ function asyncGeneratorStep2(gen, resolve3, reject, _next, _throw, key, arg) {
2182
2182
  try {
2183
2183
  var info = gen[key](arg);
2184
2184
  var value = info.value;
@@ -2187,7 +2187,7 @@ var require_Group = __commonJS({
2187
2187
  return;
2188
2188
  }
2189
2189
  if (info.done) {
2190
- resolve2(value);
2190
+ resolve3(value);
2191
2191
  } else {
2192
2192
  Promise.resolve(value).then(_next, _throw);
2193
2193
  }
@@ -2196,14 +2196,14 @@ var require_Group = __commonJS({
2196
2196
  function _asyncToGenerator2(fn) {
2197
2197
  return function() {
2198
2198
  var self2 = this, args = arguments;
2199
- return new Promise(function(resolve2, reject) {
2199
+ return new Promise(function(resolve3, reject) {
2200
2200
  var gen = fn.apply(self2, args);
2201
2201
  function _next(value) {
2202
- asyncGeneratorStep2(gen, resolve2, reject, _next, _throw, "next", value);
2202
+ asyncGeneratorStep2(gen, resolve3, reject, _next, _throw, "next", value);
2203
2203
  }
2204
2204
  __name(_next, "_next");
2205
2205
  function _throw(err) {
2206
- asyncGeneratorStep2(gen, resolve2, reject, _next, _throw, "throw", err);
2206
+ asyncGeneratorStep2(gen, resolve3, reject, _next, _throw, "throw", err);
2207
2207
  }
2208
2208
  __name(_throw, "_throw");
2209
2209
  _next(void 0);
@@ -2323,14 +2323,14 @@ var require_Group = __commonJS({
2323
2323
  clearInterval(this.interval);
2324
2324
  return typeof (base = this.interval = setInterval(
2325
2325
  /* @__PURE__ */ _asyncToGenerator2(function* () {
2326
- var e, k, ref, results, time, v;
2327
- time = Date.now();
2326
+ var e, k, ref, results, time2, v;
2327
+ time2 = Date.now();
2328
2328
  ref = _this3.instances;
2329
2329
  results = [];
2330
2330
  for (k in ref) {
2331
2331
  v = ref[k];
2332
2332
  try {
2333
- if (yield v._store.__groupCheck__(time)) {
2333
+ if (yield v._store.__groupCheck__(time2)) {
2334
2334
  results.push(_this3.deleteKey(k));
2335
2335
  } else {
2336
2336
  results.push(void 0);
@@ -2480,7 +2480,7 @@ var require_Bottleneck = __commonJS({
2480
2480
  if (Array.isArray(arr)) return arr;
2481
2481
  }
2482
2482
  __name(_arrayWithHoles2, "_arrayWithHoles");
2483
- function asyncGeneratorStep2(gen, resolve2, reject, _next, _throw, key, arg) {
2483
+ function asyncGeneratorStep2(gen, resolve3, reject, _next, _throw, key, arg) {
2484
2484
  try {
2485
2485
  var info = gen[key](arg);
2486
2486
  var value = info.value;
@@ -2489,7 +2489,7 @@ var require_Bottleneck = __commonJS({
2489
2489
  return;
2490
2490
  }
2491
2491
  if (info.done) {
2492
- resolve2(value);
2492
+ resolve3(value);
2493
2493
  } else {
2494
2494
  Promise.resolve(value).then(_next, _throw);
2495
2495
  }
@@ -2498,14 +2498,14 @@ var require_Bottleneck = __commonJS({
2498
2498
  function _asyncToGenerator2(fn) {
2499
2499
  return function() {
2500
2500
  var self2 = this, args = arguments;
2501
- return new Promise(function(resolve2, reject) {
2501
+ return new Promise(function(resolve3, reject) {
2502
2502
  var gen = fn.apply(self2, args);
2503
2503
  function _next(value) {
2504
- asyncGeneratorStep2(gen, resolve2, reject, _next, _throw, "next", value);
2504
+ asyncGeneratorStep2(gen, resolve3, reject, _next, _throw, "next", value);
2505
2505
  }
2506
2506
  __name(_next, "_next");
2507
2507
  function _throw(err) {
2508
- asyncGeneratorStep2(gen, resolve2, reject, _next, _throw, "throw", err);
2508
+ asyncGeneratorStep2(gen, resolve3, reject, _next, _throw, "throw", err);
2509
2509
  }
2510
2510
  __name(_throw, "_throw");
2511
2511
  _next(void 0);
@@ -2748,14 +2748,14 @@ var require_Bottleneck = __commonJS({
2748
2748
  counts = this._states.counts;
2749
2749
  return counts[0] + counts[1] + counts[2] + counts[3] === at;
2750
2750
  }, "finished");
2751
- return new this.Promise((resolve2, reject) => {
2751
+ return new this.Promise((resolve3, reject) => {
2752
2752
  if (finished()) {
2753
- return resolve2();
2753
+ return resolve3();
2754
2754
  } else {
2755
2755
  return this.on("done", () => {
2756
2756
  if (finished()) {
2757
2757
  this.removeAllListeners("done");
2758
- return resolve2();
2758
+ return resolve3();
2759
2759
  }
2760
2760
  });
2761
2761
  }
@@ -2863,9 +2863,9 @@ var require_Bottleneck = __commonJS({
2863
2863
  options2 = parser2.load(options2, this.jobDefaults);
2864
2864
  }
2865
2865
  task = /* @__PURE__ */ __name((...args2) => {
2866
- return new this.Promise(function(resolve2, reject) {
2866
+ return new this.Promise(function(resolve3, reject) {
2867
2867
  return fn(...args2, function(...args3) {
2868
- return (args3[0] != null ? reject : resolve2)(args3);
2868
+ return (args3[0] != null ? reject : resolve3)(args3);
2869
2869
  });
2870
2870
  });
2871
2871
  }, "task");
@@ -4174,7 +4174,7 @@ __export(index_exports, {
4174
4174
  name: () => name
4175
4175
  });
4176
4176
  module.exports = __toCommonJS(index_exports);
4177
- var import_koishi3 = require("koishi");
4177
+ var import_koishi2 = require("koishi");
4178
4178
 
4179
4179
  // src/components/miscs.tsx
4180
4180
  var import_jsx_runtime = require("@satorijs/element/jsx-runtime");
@@ -4240,7 +4240,7 @@ var messages = {
4240
4240
  };
4241
4241
  function t(messageOrResult, params) {
4242
4242
  if (typeof messageOrResult !== "string") {
4243
- return t(messageOrResult.message, messageOrResult.params);
4243
+ return t(messageOrResult.error.code, messageOrResult.error.params);
4244
4244
  }
4245
4245
  let text = messages[messageOrResult];
4246
4246
  for (const [key, value] of Object.entries(params ?? {})) {
@@ -4250,7 +4250,7 @@ function t(messageOrResult, params) {
4250
4250
  }
4251
4251
  __name(t, "t");
4252
4252
 
4253
- // src/utils/assets.ts
4253
+ // src/warframe/utils/assets.ts
4254
4254
  var import_node_fs = require("node:fs");
4255
4255
  var import_node_path = require("node:path");
4256
4256
  var jsonCache = /* @__PURE__ */ new Map();
@@ -4259,7 +4259,7 @@ function assetRoot() {
4259
4259
  if ((0, import_node_path.basename)(__dirname) === "utils") {
4260
4260
  return (0, import_node_path.resolve)(__dirname, "../assets");
4261
4261
  }
4262
- return (0, import_node_path.resolve)(__dirname, "assets");
4262
+ return (0, import_node_path.resolve)(__dirname, "warframe/assets");
4263
4263
  }
4264
4264
  __name(assetRoot, "assetRoot");
4265
4265
  function assetPath(path) {
@@ -4292,7 +4292,7 @@ function loadAssetText(path) {
4292
4292
  }
4293
4293
  __name(loadAssetText, "loadAssetText");
4294
4294
 
4295
- // src/utils/cache.ts
4295
+ // src/warframe/utils/cache.ts
4296
4296
  function createAsyncCache(factory, ttlMs = 6e4) {
4297
4297
  let cache;
4298
4298
  let lastUpdatedAt = 0;
@@ -4326,7 +4326,7 @@ function createAsyncCache(factory, ttlMs = 6e4) {
4326
4326
  }
4327
4327
  __name(createAsyncCache, "createAsyncCache");
4328
4328
 
4329
- // src/utils/collection.ts
4329
+ // src/warframe/utils/collection.ts
4330
4330
  var listToDict = /* @__PURE__ */ __name((dict, predict) => {
4331
4331
  const result = {};
4332
4332
  for (const obj of dict) {
@@ -4352,31 +4352,8 @@ var dictToKeyDict = /* @__PURE__ */ __name((dict, predict) => {
4352
4352
  return result;
4353
4353
  }, "dictToKeyDict");
4354
4354
 
4355
- // src/utils/color.ts
4356
- function lerp(start, end, t2) {
4357
- return Math.round(start + (end - start) * t2);
4358
- }
4359
- __name(lerp, "lerp");
4360
- function hexToRgb(hex) {
4361
- const r = Number.parseInt(hex.slice(1, 3), 16);
4362
- const g = Number.parseInt(hex.slice(3, 5), 16);
4363
- const b = Number.parseInt(hex.slice(5, 7), 16);
4364
- return { r, g, b };
4365
- }
4366
- __name(hexToRgb, "hexToRgb");
4367
- function rgbToHex(r, g, b) {
4368
- return `#${((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)}`;
4369
- }
4370
- __name(rgbToHex, "rgbToHex");
4371
-
4372
- // src/utils/http.ts
4355
+ // src/warframe/utils/http.ts
4373
4356
  var import_ofetch = require("ofetch");
4374
-
4375
- // src/utils/logger.ts
4376
- var import_koishi = require("koishi");
4377
- var logger = new import_koishi.Logger("koishi-plugin-warframe");
4378
-
4379
- // src/utils/http.ts
4380
4357
  var defaultHeaders = {
4381
4358
  "Accept": "text/html,application/json;q=0.9,image/*;q=0.8,*/*;q=0.8",
4382
4359
  "Accept-Language": "zh-CN,zh-Hans;q=0.9",
@@ -4394,11 +4371,7 @@ async function request(url, method, responseType) {
4394
4371
  retryDelay: 500,
4395
4372
  retryStatusCodes: [408, 429, 500, 502, 503, 504]
4396
4373
  });
4397
- } catch (err) {
4398
- const e = err;
4399
- const status = e.statusCode ?? "network";
4400
- const detail = e.data && typeof e.data === "object" ? JSON.stringify(e.data) : e.data ?? e.message ?? "";
4401
- logger.error(`[HTTP] ${method} ${url} -> ${status} ${detail}`.trimEnd());
4374
+ } catch {
4402
4375
  return void 0;
4403
4376
  }
4404
4377
  }
@@ -4416,7 +4389,7 @@ async function fetchAsyncImage(url, method = "GET") {
4416
4389
  }
4417
4390
  __name(fetchAsyncImage, "fetchAsyncImage");
4418
4391
 
4419
- // src/utils/text.ts
4392
+ // src/warframe/utils/text.ts
4420
4393
  function normalizeName(text) {
4421
4394
  return fullWidthToHalfWidth(text).toLowerCase().replace(/[·'\-+()【】[\]{},。!?;:_]/g, "").replace(/\s+/g, "");
4422
4395
  }
@@ -4482,7 +4455,7 @@ function tokenSimilarity(a, b) {
4482
4455
  }
4483
4456
  __name(tokenSimilarity, "tokenSimilarity");
4484
4457
 
4485
- // src/utils/time.ts
4458
+ // src/warframe/utils/time.ts
4486
4459
  function toTimeStamp(timeStr) {
4487
4460
  return new Date(timeStr).getTime();
4488
4461
  }
@@ -4506,7 +4479,7 @@ function msToHumanReadable(ms) {
4506
4479
  }
4507
4480
  __name(msToHumanReadable, "msToHumanReadable");
4508
4481
 
4509
- // src/infrastructure/miscs/lab-api.ts
4482
+ // src/warframe/infrastructure/miscs/lab-api.ts
4510
4483
  async function getHotRivenWeapons(num = 30) {
4511
4484
  const response = await fetchAsyncData(
4512
4485
  `https://lab.webutilitykit.com/api/RivenTracker/hot-weapons?limit=${num}&sortBy=price`
@@ -4515,30 +4488,43 @@ async function getHotRivenWeapons(num = 30) {
4515
4488
  }
4516
4489
  __name(getHotRivenWeapons, "getHotRivenWeapons");
4517
4490
 
4518
- // src/data/miscs/lab.ts
4491
+ // src/warframe/data/miscs/lab.ts
4519
4492
  var globalHotRivenWeapons = createAsyncCache(async () => {
4520
4493
  const items = await getHotRivenWeapons(40);
4521
4494
  return items || [];
4522
4495
  }, 18e5);
4523
4496
 
4524
- // src/services/miscs-service.ts
4497
+ // src/warframe/types/warframe-result.ts
4498
+ function failure(code, retryable = false, params) {
4499
+ return {
4500
+ ok: false,
4501
+ error: {
4502
+ code,
4503
+ retryable,
4504
+ ...params ? { params } : {}
4505
+ }
4506
+ };
4507
+ }
4508
+ __name(failure, "failure");
4509
+
4510
+ // src/warframe/services/miscs-service.ts
4525
4511
  async function getHotRivenWeapons2() {
4526
4512
  try {
4527
4513
  const result = await globalHotRivenWeapons.get();
4528
4514
  if (!result || result.length === 0) {
4529
- return { ok: false, message: "miscs.hotRiven.noData" };
4515
+ return failure("miscs.hotRiven.noData");
4530
4516
  }
4531
4517
  return { ok: true, data: result };
4532
4518
  } catch {
4533
- return { ok: false, message: "miscs.hotRiven.fetchFailed" };
4519
+ return failure("miscs.hotRiven.fetchFailed", true);
4534
4520
  }
4535
4521
  }
4536
4522
  __name(getHotRivenWeapons2, "getHotRivenWeapons");
4537
4523
 
4538
- // src/services/wf-service.ts
4524
+ // src/warframe/services/wf-service.ts
4539
4525
  var import_warframe_public_export_plus6 = require("warframe-public-export-plus");
4540
4526
 
4541
- // src/assets/index.ts
4527
+ // src/warframe/assets/index.ts
4542
4528
  var {
4543
4529
  incarnons,
4544
4530
  warframes
@@ -4553,7 +4539,7 @@ var Baro = loadAssetText("baro.txt");
4553
4539
  var BaroParsed = loadAssetJson("baroParsed.json");
4554
4540
  var warframeAlias = loadAssetJson("warframeAlias.json");
4555
4541
 
4556
- // src/data/wf/arbitrationSchedule.ts
4542
+ // src/warframe/data/wf/arbitrationSchedule.ts
4557
4543
  var arbitrationSchedule = arbitrationScheduleText.split("\n").map((line) => line.split(",")).filter((arr) => arr.length === 2).map((arr) => {
4558
4544
  return {
4559
4545
  time: parseInt(arr[0]),
@@ -4561,10 +4547,10 @@ var arbitrationSchedule = arbitrationScheduleText.split("\n").map((line) => line
4561
4547
  };
4562
4548
  });
4563
4549
 
4564
- // src/data/wf/globalWorldState.ts
4550
+ // src/warframe/data/wf/globalWorldState.ts
4565
4551
  var import_warframe_public_export_plus3 = require("warframe-public-export-plus");
4566
4552
 
4567
- // src/infrastructure/wf/wf-api.ts
4553
+ // src/warframe/infrastructure/wf/wf-api.ts
4568
4554
  var apiBase = "https://api.warframe.com/cdn/";
4569
4555
  async function getWorldState(json) {
4570
4556
  if (!json) {
@@ -4574,7 +4560,8 @@ async function getWorldState(json) {
4574
4560
  throw new Error("获取游戏信息失败");
4575
4561
  }
4576
4562
  const WorldStateParser = await import("warframe-worldstate-parser");
4577
- return WorldStateParser.WorldState.build(json);
4563
+ return WorldStateParser.WorldState.build(json, { locale: "en", logger: { debug: /* @__PURE__ */ __name(() => {
4564
+ }, "debug") } });
4578
4565
  }
4579
4566
  __name(getWorldState, "getWorldState");
4580
4567
  async function getVoidTraderHistory(data) {
@@ -4735,7 +4722,7 @@ async function getVoidTraderHistory(data) {
4735
4722
  }
4736
4723
  __name(getVoidTraderHistory, "getVoidTraderHistory");
4737
4724
 
4738
- // src/infrastructure/wf/wf-export-adapter.ts
4725
+ // src/warframe/infrastructure/wf/wf-export-adapter.ts
4739
4726
  var import_warframe_public_export_plus = require("warframe-public-export-plus");
4740
4727
  function regionToShort(region, dict) {
4741
4728
  let faction;
@@ -4768,7 +4755,7 @@ function fixRelicRewardKey(item) {
4768
4755
  }
4769
4756
  __name(fixRelicRewardKey, "fixRelicRewardKey");
4770
4757
 
4771
- // src/infrastructure/wf/wfcd-adapter.ts
4758
+ // src/warframe/infrastructure/wf/wfcd-adapter.ts
4772
4759
  var import_warframe_public_export_plus2 = require("warframe-public-export-plus");
4773
4760
  function relicToFullNameZH(tier, category) {
4774
4761
  return `${import_warframe_public_export_plus2.dict_zh[relicEraToTransKey(tier)] ?? toPascalCase(tier)} ${category} 遗物`;
@@ -4866,24 +4853,28 @@ function getVoidTraderItemName(sourceKey) {
4866
4853
  }
4867
4854
  __name(getVoidTraderItemName, "getVoidTraderItemName");
4868
4855
 
4869
- // src/data/wf/globalWorldState.ts
4856
+ // src/warframe/data/wf/globalWorldState.ts
4857
+ async function adaptFissure(fissure) {
4858
+ const nodeKey = await getSolNodeKey(fissure.nodeKey);
4859
+ const tierName = fissure.tierNum in fissureTierName ? import_warframe_public_export_plus3.dict_zh[fissureTierName[fissure.tierNum]] : fissure.tierNum;
4860
+ return {
4861
+ category: fissure.isStorm ? "rj-fissures" : fissure.isHard ? "sp-fissures" : "fissures",
4862
+ hard: fissure.isHard,
4863
+ activation: fissure.activation?.getTime() ?? 0,
4864
+ expiry: fissure.expiry?.getTime() ?? 0,
4865
+ node: regionToShort(import_warframe_public_export_plus3.ExportRegions[nodeKey], import_warframe_public_export_plus3.dict_zh),
4866
+ tier: String(tierName),
4867
+ tierNum: fissureTierNumToNumber(fissure.tierNum)
4868
+ };
4869
+ }
4870
+ __name(adaptFissure, "adaptFissure");
4870
4871
  var globalWorldState = createAsyncCache(async () => {
4871
4872
  const worldState = await getWorldState();
4872
4873
  const fissures = [];
4873
4874
  const rjFissures = [];
4874
4875
  const spFissures = [];
4875
4876
  for (const fissure of worldState.fissures) {
4876
- const nodeKey = await getSolNodeKey(fissure.nodeKey);
4877
- const tierName = fissure.tierNum in fissureTierName ? import_warframe_public_export_plus3.dict_zh[fissureTierName[fissure.tierNum]] : fissure.tierNum;
4878
- const obj = {
4879
- category: fissure.isStorm ? "rj-fissures" : fissure.isHard ? "sp-fissures" : "fissures",
4880
- hard: fissure.isHard,
4881
- activation: fissure.activation?.getTime() ?? 0,
4882
- expiry: fissure.expiry?.getTime() ?? 0,
4883
- node: regionToShort(import_warframe_public_export_plus3.ExportRegions[nodeKey], import_warframe_public_export_plus3.dict_zh),
4884
- tier: String(tierName),
4885
- tierNum: fissureTierNumToNumber(fissure.tierNum)
4886
- };
4877
+ const obj = await adaptFissure(fissure);
4887
4878
  if (fissure.isStorm) {
4888
4879
  rjFissures.push(obj);
4889
4880
  } else if (fissure.isHard) {
@@ -4896,9 +4887,9 @@ var globalWorldState = createAsyncCache(async () => {
4896
4887
  spFissures.sort((a, b) => a.tierNum - b.tierNum);
4897
4888
  rjFissures.sort((a, b) => a.tierNum - b.tierNum);
4898
4889
  return { raw: worldState, fissures, spFissures, rjFissures };
4899
- }, 12e4);
4890
+ }, -1);
4900
4891
 
4901
- // src/data/wf/relics.ts
4892
+ // src/warframe/data/wf/relics.ts
4902
4893
  var import_warframe_public_export_plus4 = require("warframe-public-export-plus");
4903
4894
  var relics = (() => {
4904
4895
  const result = {};
@@ -4926,7 +4917,7 @@ var relics = (() => {
4926
4917
  return result;
4927
4918
  })();
4928
4919
 
4929
- // src/data/wf/rivenBaseValues.ts
4920
+ // src/warframe/data/wf/rivenBaseValues.ts
4930
4921
  var rivenAttrValueDict = (() => {
4931
4922
  const dict = {};
4932
4923
  for (const key in rivenAttrValues) {
@@ -4941,7 +4932,7 @@ var rivenAttrValueDict = (() => {
4941
4932
  return dict;
4942
4933
  })();
4943
4934
 
4944
- // src/data/wf/rivenDisposition.ts
4935
+ // src/warframe/data/wf/rivenDisposition.ts
4945
4936
  var import_warframe_public_export_plus5 = require("warframe-public-export-plus");
4946
4937
  var weaponRivenDispositionDict = (() => {
4947
4938
  const mapped = rivenCalc.weapons.reduce(
@@ -4989,7 +4980,7 @@ var weaponRivenDispositionDict = (() => {
4989
4980
  ]);
4990
4981
  })();
4991
4982
 
4992
- // src/data/wf/rivenStatData.ts
4983
+ // src/warframe/data/wf/rivenStatData.ts
4993
4984
  var rivenStatFixFactor = {
4994
4985
  2: { buffFactor: 0.99, buffCount: 2, curseFactor: 0, curseCount: 0 },
4995
4986
  21: {
@@ -5191,10 +5182,10 @@ function resolveLimiter(rateLimit) {
5191
5182
  }
5192
5183
  __name(resolveLimiter, "resolveLimiter");
5193
5184
 
5194
- // src/infrastructure/wfm-client.ts
5185
+ // src/warframe/infrastructure/wfm-client.ts
5195
5186
  var wfmClient = createWfmApiClient();
5196
5187
 
5197
- // src/data/wfm/globalRivenAttribute.ts
5188
+ // src/warframe/data/wfm/globalRivenAttribute.ts
5198
5189
  async function globalRivenAttributeFactory(rivenAttributeData) {
5199
5190
  rivenAttributeData ??= await wfmClient.rivens.getAttributes();
5200
5191
  if (!rivenAttributeData) {
@@ -5218,7 +5209,7 @@ var globalRivenAttribute = createAsyncCache(
5218
5209
  -1
5219
5210
  );
5220
5211
 
5221
- // src/data/wfm/globalRivenItem.ts
5212
+ // src/warframe/data/wfm/globalRivenItem.ts
5222
5213
  function normalizeWordPrefixName(input) {
5223
5214
  return fullWidthToHalfWidth(input).toLowerCase().replace(/[·'()+【】[\]{},。!?;:_]/g, " ").replace(/[-/\\]/g, " ").replace(/\s+/g, " ").trim();
5224
5215
  }
@@ -5294,7 +5285,7 @@ var globalRivenItemData = createAsyncCache(async () => {
5294
5285
  return globalRivenItemFactory();
5295
5286
  }, -1);
5296
5287
 
5297
- // src/infrastructure/ocr-api.ts
5288
+ // src/warframe/infrastructure/ocr-api.ts
5298
5289
  var import_node_buffer = require("node:buffer");
5299
5290
  var import_node_crypto = __toESM(require("node:crypto"));
5300
5291
  var import_async_cache_dedupe = require("async-cache-dedupe");
@@ -5345,24 +5336,23 @@ async function extractTextFromImage(image, secret) {
5345
5336
  const hash = getImageBase64Hash(image);
5346
5337
  try {
5347
5338
  return await ocrCache.extract({ hash, image, secret });
5348
- } catch (err) {
5349
- logger.error("OCR request error:", err);
5339
+ } catch {
5350
5340
  return void 0;
5351
5341
  }
5352
5342
  }
5353
5343
  __name(extractTextFromImage, "extractTextFromImage");
5354
5344
 
5355
- // src/services/wf-service.ts
5345
+ // src/warframe/services/wf-service.ts
5356
5346
  async function getRelic(input) {
5357
5347
  if (!input) {
5358
- return { ok: false, message: "relic.invalidName" };
5348
+ return failure("relic.invalidName");
5359
5349
  }
5360
5350
  input = normalizeName(input);
5361
5351
  if (!input) {
5362
- return { ok: false, message: "relic.invalidName" };
5352
+ return failure("relic.invalidName");
5363
5353
  }
5364
5354
  if (!relics) {
5365
- return { ok: false, message: "relic.dataLoading" };
5355
+ return failure("relic.dataLoading", true);
5366
5356
  }
5367
5357
  const tierListForMatch = [
5368
5358
  "古纪",
@@ -5380,7 +5370,7 @@ async function getRelic(input) {
5380
5370
  ].map((t2) => normalizeName(t2));
5381
5371
  const tier = tierListForMatch.find((t2) => input.startsWith(t2));
5382
5372
  if (!tier) {
5383
- return { ok: false, message: "relic.invalidName" };
5373
+ return failure("relic.invalidName");
5384
5374
  }
5385
5375
  const category = input.replace(new RegExp(`^${tier}`), "").replace(/遗物$|relic$/, "");
5386
5376
  const zhTierMap = {
@@ -5393,12 +5383,12 @@ async function getRelic(input) {
5393
5383
  };
5394
5384
  const enTier = zhTierMap[tier] ?? tier;
5395
5385
  const key = normalizeName(enTier + category);
5396
- return relics[key] ? { ok: true, data: relics[key] } : { ok: false, message: "relic.notFound" };
5386
+ return relics[key] ? { ok: true, data: relics[key] } : failure("relic.notFound");
5397
5387
  }
5398
5388
  __name(getRelic, "getRelic");
5399
5389
  function getArbitrations(day = 3) {
5400
5390
  if (day > 14 || day <= 0) {
5401
- return { ok: false, message: "arbitration.invalidDayRange" };
5391
+ return failure("arbitration.invalidDayRange");
5402
5392
  }
5403
5393
  const currentHourTimeStamp = Math.floor(
5404
5394
  (/* @__PURE__ */ new Date()).setUTCMinutes(0, 0, 0) / 1e3
@@ -5437,7 +5427,7 @@ __name(getArbitrations, "getArbitrations");
5437
5427
  async function getWeekly() {
5438
5428
  const { raw: worldState } = await globalWorldState.get();
5439
5429
  if (!worldState) {
5440
- return { ok: false, message: "common.fetchFailed" };
5430
+ return failure("common.fetchFailed", true);
5441
5431
  }
5442
5432
  const archon = {
5443
5433
  name: import_warframe_public_export_plus6.dict_zh[`/Lotus/Language/Narmer/${removeSpace(worldState.archonHunt.boss)}`],
@@ -5574,31 +5564,31 @@ function getCircuitWeek() {
5574
5564
  __name(getCircuitWeek, "getCircuitWeek");
5575
5565
  async function getFissures() {
5576
5566
  const { fissures } = await globalWorldState.get();
5577
- return fissures ? { ok: true, data: fissures } : { ok: false, message: "common.fetchFailed" };
5567
+ return fissures ? { ok: true, data: fissures } : failure("common.fetchFailed", true);
5578
5568
  }
5579
5569
  __name(getFissures, "getFissures");
5580
5570
  async function getSteelPathFissures() {
5581
5571
  const { spFissures } = await globalWorldState.get();
5582
- return spFissures ? { ok: true, data: spFissures } : { ok: false, message: "common.fetchFailed" };
5572
+ return spFissures ? { ok: true, data: spFissures } : failure("common.fetchFailed", true);
5583
5573
  }
5584
5574
  __name(getSteelPathFissures, "getSteelPathFissures");
5585
5575
  async function getRailjackFissures() {
5586
5576
  const { rjFissures } = await globalWorldState.get();
5587
- return rjFissures ? { ok: true, data: rjFissures } : { ok: false, message: "common.fetchFailed" };
5577
+ return rjFissures ? { ok: true, data: rjFissures } : failure("common.fetchFailed", true);
5588
5578
  }
5589
5579
  __name(getRailjackFissures, "getRailjackFissures");
5590
5580
  async function getAnalyzedRiven(secret, url) {
5591
5581
  const img = await fetchAsyncImage(url);
5592
5582
  if (!img) {
5593
- return { ok: false, message: "riven.imageFetchFailed" };
5583
+ return failure("riven.imageFetchFailed", true);
5594
5584
  }
5595
5585
  const extractResult = await extractTextFromImage(img, secret);
5596
5586
  if (!extractResult) {
5597
- return { ok: false, message: "riven.imageParseFailed" };
5587
+ return failure("riven.imageParseFailed");
5598
5588
  }
5599
5589
  const parseResult = await parseOCRResult(extractResult);
5600
5590
  if (!parseResult || parseResult.attributes.length < 2 || parseResult.attributes.length > 4) {
5601
- return { ok: false, message: "riven.imageParseFailed" };
5591
+ return failure("riven.imageParseFailed");
5602
5592
  }
5603
5593
  return analyzeRivenStat(parseResult);
5604
5594
  }
@@ -5606,12 +5596,12 @@ __name(getAnalyzedRiven, "getAnalyzedRiven");
5606
5596
  async function getVoidTrader() {
5607
5597
  const { raw: worldState } = await globalWorldState.get();
5608
5598
  if (worldState.voidTraders.length === 0) {
5609
- return { ok: false, message: "voidTrader.drifting" };
5599
+ return failure("voidTrader.drifting");
5610
5600
  }
5611
5601
  const trader = worldState.voidTraders[0];
5612
5602
  if (trader && trader.activation && trader.activation.getTime() > Date.now()) {
5613
5603
  const diff2 = trader.activation.getTime() - Date.now();
5614
- return { ok: false, message: "voidTrader.arriving", params: { time: msToHumanReadable(diff2) } };
5604
+ return failure("voidTrader.arriving", false, { time: msToHumanReadable(diff2) });
5615
5605
  }
5616
5606
  const diff = trader.expiry.getTime() - Date.now();
5617
5607
  const items = trader.inventory.map(getVoidTraderItem);
@@ -5654,7 +5644,7 @@ async function getWeeklyRivens(minPrice) {
5654
5644
  __name(getWeeklyRivens, "getWeeklyRivens");
5655
5645
  async function getStaticRivenStats(weaponType, statType, disposition) {
5656
5646
  if (disposition > 1.55 || disposition < 0.5) {
5657
- return { ok: false, message: "riven.dispositionError" };
5647
+ return failure("riven.dispositionError");
5658
5648
  }
5659
5649
  const weaponTypes = [
5660
5650
  "步枪",
@@ -5672,7 +5662,7 @@ async function getStaticRivenStats(weaponType, statType, disposition) {
5672
5662
  (v) => normalizeName(v).startsWith(normalizeName(weaponType))
5673
5663
  );
5674
5664
  if (!matchedWeaponType) {
5675
- return { ok: false, message: "riven.weaponTypeError" };
5665
+ return failure("riven.weaponTypeError");
5676
5666
  }
5677
5667
  const weaponTypeKeys = {
5678
5668
  步枪: "Rifle",
@@ -5684,7 +5674,7 @@ async function getStaticRivenStats(weaponType, statType, disposition) {
5684
5674
  const weaponTypeKey = weaponTypeKeys[matchedWeaponType] ?? matchedWeaponType;
5685
5675
  const statTypes = ["2", "3", "21", "31"];
5686
5676
  if (!statTypes.includes(statType)) {
5687
- return { ok: false, message: "riven.statTypeError" };
5677
+ return failure("riven.statTypeError");
5688
5678
  }
5689
5679
  const rivenAttrValues2 = rivenAttrValueDict[weaponTypeKey];
5690
5680
  const factor = rivenStatFixFactor[statType];
@@ -5871,11 +5861,9 @@ __name(parseOCRResult, "parseOCRResult");
5871
5861
  function analyzeRivenStat(parseResult) {
5872
5862
  const weaponRiven = getWeaponRivenDisposition(parseResult.name);
5873
5863
  if (!weaponRiven) {
5874
- return {
5875
- ok: false,
5876
- message: "riven.weaponNotFound",
5877
- params: { weapon: parseResult.name }
5878
- };
5864
+ return failure("riven.weaponNotFound", false, {
5865
+ weapon: parseResult.name
5866
+ });
5879
5867
  }
5880
5868
  const disposition = weaponRiven.calc.disposition;
5881
5869
  const weaponType = weaponRiven.calc.riventype;
@@ -5940,10 +5928,10 @@ function analyzeRivenStat(parseResult) {
5940
5928
  }
5941
5929
  __name(analyzeRivenStat, "analyzeRivenStat");
5942
5930
 
5943
- // src/services/wfm-service/index.ts
5931
+ // src/warframe/services/wfm-service/index.ts
5944
5932
  var import_warframe_public_export_plus7 = require("warframe-public-export-plus");
5945
5933
 
5946
- // src/data/wfm/globalDucatnator.ts
5934
+ // src/warframe/data/wfm/globalDucatnator.ts
5947
5935
  var globalDucatnatorIDDict = createAsyncCache(async () => {
5948
5936
  const data = await wfmClient.tools.getDucatnator();
5949
5937
  if (!data) {
@@ -5952,7 +5940,7 @@ var globalDucatnatorIDDict = createAsyncCache(async () => {
5952
5940
  return listToDict(data.hour, (d) => [d.item]);
5953
5941
  }, 36e5);
5954
5942
 
5955
- // src/data/wfm/globalItem.ts
5943
+ // src/warframe/data/wfm/globalItem.ts
5956
5944
  function normalizeWordPrefixName2(input) {
5957
5945
  return fullWidthToHalfWidth(input).toLowerCase().replace(/[·'()+【】[\]{},。!?;:_]/g, " ").replace(/[-/\\]/g, " ").replace(/\s+/g, " ").trim();
5958
5946
  }
@@ -6037,7 +6025,7 @@ async function globalItemDataFactory(response) {
6037
6025
  __name(globalItemDataFactory, "globalItemDataFactory");
6038
6026
  var globalItemData = createAsyncCache(globalItemDataFactory, -1);
6039
6027
 
6040
- // src/services/wfm-service/wfm-service.item-matcher.ts
6028
+ // src/warframe/services/wfm-service/wfm-service.item-matcher.ts
6041
6029
  var wfmItemMatcher = (() => {
6042
6030
  const setSuffix = "一套";
6043
6031
  const bpSuffix = "蓝图";
@@ -6297,7 +6285,7 @@ var shortHandProcess = wfmItemMatcher.shortHandProcess;
6297
6285
  var stringToWFMItem = wfmItemMatcher.stringToWFMItem;
6298
6286
  var transformByWarframeAlias = wfmItemMatcher.transformByWarframeAlias;
6299
6287
 
6300
- // src/services/wfm-service/wfm-service.riven-item-matcher.ts
6288
+ // src/warframe/services/wfm-service/wfm-service.riven-item-matcher.ts
6301
6289
  function normalizeWordPrefixName4(input) {
6302
6290
  return fullWidthToHalfWidth(input).toLowerCase().replace(/[·'()+【】[\]{},。!?;:_]/g, " ").replace(/[-/\\]/g, " ").replace(/\s+/g, " ").trim();
6303
6291
  }
@@ -6425,7 +6413,7 @@ async function findRivenItemByName(input, globalRivenItemList) {
6425
6413
  }
6426
6414
  __name(findRivenItemByName, "findRivenItemByName");
6427
6415
 
6428
- // src/services/wfm-service/index.ts
6416
+ // src/warframe/services/wfm-service/index.ts
6429
6417
  async function updateCache() {
6430
6418
  const updateTasks = [
6431
6419
  { name: "globalItemData", fn: globalItemData.update() },
@@ -6446,10 +6434,10 @@ async function updateCache() {
6446
6434
  }
6447
6435
  __name(updateCache, "updateCache");
6448
6436
  async function getItemOrders(input) {
6449
- input = input.trim();
6450
- if (!input) {
6451
- return { ok: false, message: "wfm.inputItemName" };
6437
+ if (!input || !input.trim()) {
6438
+ return failure("wfm.inputItemName");
6452
6439
  }
6440
+ input = input.trim();
6453
6441
  const isFullLevel = /^满级|满级$/.test(normalizeName(input));
6454
6442
  if (isFullLevel) {
6455
6443
  if (input.startsWith("满级")) {
@@ -6460,18 +6448,18 @@ async function getItemOrders(input) {
6460
6448
  }
6461
6449
  const targetItem = await stringToWFMItem(input);
6462
6450
  if (!targetItem) {
6463
- return { ok: false, message: "wfm.itemNotFound", params: { input } };
6451
+ return failure("wfm.itemNotFound", false, { input });
6464
6452
  }
6465
6453
  const itemId = targetItem.slug;
6466
6454
  const data = await wfmClient.items.getOrders(itemId);
6467
6455
  if (!data) {
6468
- return { ok: false, message: "wfm.orderFetchFailed" };
6456
+ return failure("wfm.orderFetchFailed", true);
6469
6457
  }
6470
6458
  const result = data.filter(
6471
6459
  (order) => order.user.status === "ingame" && order.visible && order.type === "sell" && (!isFullLevel || order.rank === targetItem.maxRank)
6472
6460
  ).sort((a, b) => toTimeStamp(b.updatedAt) - toTimeStamp(a.updatedAt)).sort((a, b) => a.platinum - b.platinum).slice(0, 8);
6473
6461
  if (result.length === 0) {
6474
- return { ok: false, message: "wfm.noOnlineSeller" };
6462
+ return failure("wfm.noOnlineSeller");
6475
6463
  }
6476
6464
  return {
6477
6465
  ok: true,
@@ -6480,21 +6468,25 @@ async function getItemOrders(input) {
6480
6468
  }
6481
6469
  __name(getItemOrders, "getItemOrders");
6482
6470
  async function getRivenOrders(input) {
6471
+ if (!input || !input.trim()) {
6472
+ return failure("wfm.inputItemName");
6473
+ }
6474
+ input = input.trim();
6483
6475
  const { globalRivenAttributeDict } = await globalRivenAttribute.get();
6484
6476
  const targetItem = await findRivenItemByName(input);
6485
6477
  if (!targetItem) {
6486
- return { ok: false, message: "wfm.rivenWeaponNotFound", params: { input } };
6478
+ return failure("wfm.rivenWeaponNotFound", false, { input });
6487
6479
  }
6488
6480
  const itemId = targetItem.slug;
6489
6481
  const data = await wfmClient.rivens.getOrders(itemId);
6490
6482
  if (!data) {
6491
- return { ok: false, message: "wfm.rivenOrderFetchFailed" };
6483
+ return failure("wfm.rivenOrderFetchFailed", true);
6492
6484
  }
6493
6485
  const top5 = data.filter(
6494
6486
  (order) => order.owner.status === "ingame" && order.visible && !order.private && !order.closed && order.is_direct_sell
6495
6487
  ).sort((a, b) => toTimeStamp(b.updated) - toTimeStamp(a.updated)).sort((a, b) => a.starting_price - b.starting_price).slice(0, 5);
6496
6488
  if (top5.length === 0) {
6497
- return { ok: false, message: "wfm.noOnlineRivenSeller" };
6489
+ return failure("wfm.noOnlineRivenSeller");
6498
6490
  }
6499
6491
  const orders = top5.map((e) => {
6500
6492
  const transformed = e.item.attributes.map(
@@ -6598,6 +6590,144 @@ var primedModHistory = createAsyncCache(async () => {
6598
6590
  return result;
6599
6591
  }, 432e5);
6600
6592
 
6593
+ // src/warframe/services/world-state-refresh.ts
6594
+ function time(value) {
6595
+ return value?.getTime() ?? 0;
6596
+ }
6597
+ __name(time, "time");
6598
+ function fissureId(value) {
6599
+ return value.id ?? [
6600
+ time(value.activation),
6601
+ time(value.expiry),
6602
+ value.node,
6603
+ value.tier,
6604
+ value.isHard,
6605
+ value.isStorm
6606
+ ].join(":");
6607
+ }
6608
+ __name(fissureId, "fissureId");
6609
+ function dailyDealId(value) {
6610
+ return value.id ?? [
6611
+ time(value.activation),
6612
+ time(value.expiry),
6613
+ value.uniqueName ?? value.item
6614
+ ].join(":");
6615
+ }
6616
+ __name(dailyDealId, "dailyDealId");
6617
+ function alertId(value) {
6618
+ return value.id ?? [
6619
+ time(value.activation),
6620
+ time(value.expiry),
6621
+ value.mission?.nodeKey ?? value.mission?.node ?? "",
6622
+ value.tag ?? ""
6623
+ ].join(":");
6624
+ }
6625
+ __name(alertId, "alertId");
6626
+ function traderId(value) {
6627
+ return value.id ?? [
6628
+ time(value.activation),
6629
+ value.character,
6630
+ value.location
6631
+ ].join(":");
6632
+ }
6633
+ __name(traderId, "traderId");
6634
+ function alertReward(alert) {
6635
+ const reward = alert.mission?.reward;
6636
+ if (!reward) {
6637
+ return "";
6638
+ }
6639
+ const values = [
6640
+ ...reward.items,
6641
+ ...reward.countedItems.map((item) => `${item.key} x${item.count}`)
6642
+ ];
6643
+ if (reward.credits) {
6644
+ values.push(`${reward.credits} 现金`);
6645
+ }
6646
+ return values.join("、");
6647
+ }
6648
+ __name(alertReward, "alertReward");
6649
+ async function diffWorldStates(previous, current) {
6650
+ const notifications = [];
6651
+ const previousFissures = new Set(previous.raw.fissures.map(fissureId));
6652
+ for (const fissure of current.raw.fissures) {
6653
+ const id = fissureId(fissure);
6654
+ if (!previousFissures.has(id)) {
6655
+ const mapped = await adaptFissure(fissure);
6656
+ notifications.push({
6657
+ type: "fissure",
6658
+ id,
6659
+ tier: mapped.tier,
6660
+ tierNum: mapped.tierNum,
6661
+ node: mapped.node,
6662
+ hard: mapped.hard,
6663
+ category: fissure.isStorm ? "railjack" : fissure.isHard ? "steel-path" : "normal",
6664
+ expiry: time(fissure.expiry)
6665
+ });
6666
+ }
6667
+ }
6668
+ const previousTimestamp = previous.raw.timestamp.getTime();
6669
+ const currentTimestamp = current.raw.timestamp.getTime();
6670
+ for (const trader of current.raw.voidTraders) {
6671
+ const activation = time(trader.activation);
6672
+ if (activation > previousTimestamp && activation <= currentTimestamp) {
6673
+ notifications.push({
6674
+ type: "void-trader",
6675
+ id: traderId(trader),
6676
+ character: trader.character,
6677
+ location: trader.location,
6678
+ expiry: time(trader.expiry)
6679
+ });
6680
+ }
6681
+ }
6682
+ const previousDeals = new Set(previous.raw.dailyDeals.map(dailyDealId));
6683
+ for (const deal of current.raw.dailyDeals) {
6684
+ const id = dailyDealId(deal);
6685
+ if (!previousDeals.has(id)) {
6686
+ notifications.push({
6687
+ type: "daily-deal",
6688
+ id,
6689
+ item: deal.item,
6690
+ originalPrice: deal.originalPrice,
6691
+ salePrice: deal.salePrice,
6692
+ discount: deal.discount,
6693
+ expiry: time(deal.expiry)
6694
+ });
6695
+ }
6696
+ }
6697
+ const previousAlerts = new Set(previous.raw.alerts.map(alertId));
6698
+ for (const alert of current.raw.alerts) {
6699
+ const id = alertId(alert);
6700
+ if (!previousAlerts.has(id)) {
6701
+ notifications.push({
6702
+ type: "alert",
6703
+ id,
6704
+ description: alert.description,
6705
+ node: alert.mission?.node ?? "",
6706
+ missionType: alert.mission?.type ?? "",
6707
+ reward: alertReward(alert),
6708
+ expiry: time(alert.expiry)
6709
+ });
6710
+ }
6711
+ }
6712
+ return notifications;
6713
+ }
6714
+ __name(diffWorldStates, "diffWorldStates");
6715
+ function createWorldStateRefresher(source = globalWorldState) {
6716
+ let previous;
6717
+ return async () => {
6718
+ const current = await source.update();
6719
+ if (!previous) {
6720
+ previous = current;
6721
+ return [];
6722
+ }
6723
+ const notifications = await diffWorldStates(previous, current);
6724
+ previous = current;
6725
+ return notifications;
6726
+ };
6727
+ }
6728
+ __name(createWorldStateRefresher, "createWorldStateRefresher");
6729
+ var refreshWorldState = createWorldStateRefresher();
6730
+
6601
6731
  // src/commands/miscs.ts
6602
6732
  function inDevelopment() {
6603
6733
  return t("miscs.inDevelopment");
@@ -6620,6 +6750,54 @@ function createMiscsCommands(deps) {
6620
6750
  }
6621
6751
  __name(createMiscsCommands, "createMiscsCommands");
6622
6752
 
6753
+ // src/utils/assets.ts
6754
+ var import_node_fs2 = require("node:fs");
6755
+ var import_node_path2 = require("node:path");
6756
+ var textCache2 = /* @__PURE__ */ new Map();
6757
+ function assetRoot2() {
6758
+ if ((0, import_node_path2.basename)(__dirname) === "utils") {
6759
+ return (0, import_node_path2.resolve)(__dirname, "../assets");
6760
+ }
6761
+ return (0, import_node_path2.resolve)(__dirname, "assets");
6762
+ }
6763
+ __name(assetRoot2, "assetRoot");
6764
+ function assetPath2(path) {
6765
+ const root = assetRoot2();
6766
+ const resolved = (0, import_node_path2.resolve)(root, path);
6767
+ if (resolved !== root && !resolved.startsWith(`${root}${import_node_path2.sep}`)) {
6768
+ throw new Error(`Invalid asset path: ${path}`);
6769
+ }
6770
+ return resolved;
6771
+ }
6772
+ __name(assetPath2, "assetPath");
6773
+ function loadAssetText2(path) {
6774
+ const resolved = assetPath2(path);
6775
+ if (textCache2.has(resolved)) {
6776
+ return textCache2.get(resolved);
6777
+ }
6778
+ const data = (0, import_node_fs2.readFileSync)(resolved, "utf8");
6779
+ textCache2.set(resolved, data);
6780
+ return data;
6781
+ }
6782
+ __name(loadAssetText2, "loadAssetText");
6783
+
6784
+ // src/utils/color.ts
6785
+ function lerp(start, end, t2) {
6786
+ return Math.round(start + (end - start) * t2);
6787
+ }
6788
+ __name(lerp, "lerp");
6789
+ function hexToRgb(hex) {
6790
+ const r = Number.parseInt(hex.slice(1, 3), 16);
6791
+ const g = Number.parseInt(hex.slice(3, 5), 16);
6792
+ const b = Number.parseInt(hex.slice(5, 7), 16);
6793
+ return { r, g, b };
6794
+ }
6795
+ __name(hexToRgb, "hexToRgb");
6796
+ function rgbToHex(r, g, b) {
6797
+ return `#${((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)}`;
6798
+ }
6799
+ __name(rgbToHex, "rgbToHex");
6800
+
6623
6801
  // src/components/wf.tsx
6624
6802
  var import_jsx_runtime2 = require("@satorijs/element/jsx-runtime");
6625
6803
  function ArbitrationComponent(arbi) {
@@ -8323,10 +8501,10 @@ function createWfCommands(deps) {
8323
8501
  __name(createWfCommands, "createWfCommands");
8324
8502
 
8325
8503
  // src/components/render.tsx
8326
- var import_koishi2 = require("koishi");
8327
- var style = loadAssetText("render.css");
8328
- var svg = loadAssetText("render-icons.svg");
8329
- var template = loadAssetText("render.html");
8504
+ var import_koishi = require("koishi");
8505
+ var style = loadAssetText2("render.css");
8506
+ var svg = loadAssetText2("render-icons.svg");
8507
+ var template = loadAssetText2("render.html");
8330
8508
  var slots = {
8331
8509
  body: "<!-- __WARFRAME_RENDER_SLOT_BODY__ -->",
8332
8510
  title: "__WARFRAME_RENDER_SLOT_TITLE__",
@@ -8357,7 +8535,7 @@ async function generateImageElementOutput(puppe, element) {
8357
8535
  const handle = await page.$("#root>*");
8358
8536
  const clip = await handle?.boundingBox() ?? void 0;
8359
8537
  const buffer = await page.screenshot({ clip });
8360
- return import_koishi2.h.image(buffer, "image/png");
8538
+ return import_koishi.h.image(buffer, "image/png");
8361
8539
  }
8362
8540
  );
8363
8541
  }
@@ -8404,9 +8582,10 @@ function ItemOrderComponent(item, orders) {
8404
8582
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("table", { style: "width:100%;", children: [
8405
8583
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("tr", { children: [
8406
8584
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("th", { style: "width:40%;", children: "玩家名" }),
8407
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("th", { style: "width:30%;", children: "状态" }),
8585
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("th", { style: "width:20%;", children: "状态" }),
8408
8586
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("th", { style: "width:10%;", children: "价格" }),
8409
8587
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("th", { style: "width:10%;", children: "数量" }),
8588
+ item.maxRank && item.maxRank > 0 ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("th", { style: "width:10%;", children: "等级" }) : null,
8410
8589
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("th", { style: "width:10%;", children: "好评" })
8411
8590
  ] }),
8412
8591
  orders.map((order) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("tr", { children: [
@@ -8414,6 +8593,7 @@ function ItemOrderComponent(item, orders) {
8414
8593
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("td", { children: order.user.status }),
8415
8594
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("td", { children: order.platinum }),
8416
8595
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("td", { children: order.quantity }),
8596
+ item.maxRank && item.maxRank > 0 ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("td", { children: order.rank }) : null,
8417
8597
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("td", { children: order.user.reputation })
8418
8598
  ] }))
8419
8599
  ] })
@@ -8866,8 +9046,8 @@ function wmMessage(img, item, orders) {
8866
9046
  const lines = orders.slice(0, 3).map((order) => `
8867
9047
  /w ${order.user.ingameName} Hi! I want to buy: "${item.i18n.en?.name}${!item.maxRank || item.maxRank === 0 ? "" : ` (rank ${order.rank})`}" for ${order.platinum} platinum. (warframe.market)`);
8868
9048
  return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("message", { children: [
8869
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { children: lines.join("") }),
8870
- img
9049
+ img,
9050
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { children: lines.join("") })
8871
9051
  ] });
8872
9052
  }
8873
9053
  __name(wmMessage, "wmMessage");
@@ -8905,17 +9085,100 @@ function createWfmCommands(deps) {
8905
9085
  }
8906
9086
  __name(createWfmCommands, "createWfmCommands");
8907
9087
 
9088
+ // src/messages/world-state.tsx
9089
+ var import_jsx_runtime5 = require("@satorijs/element/jsx-runtime");
9090
+ function formatExpiry(expiry) {
9091
+ if (!expiry) {
9092
+ return "";
9093
+ }
9094
+ return new Date(expiry).toLocaleString("zh-CN", {
9095
+ hour12: false,
9096
+ timeZone: "Asia/Shanghai"
9097
+ });
9098
+ }
9099
+ __name(formatExpiry, "formatExpiry");
9100
+ function suffixWithExpiry(expiry) {
9101
+ const formatted = formatExpiry(expiry);
9102
+ return formatted ? `,截止 ${formatted}` : "";
9103
+ }
9104
+ __name(suffixWithExpiry, "suffixWithExpiry");
9105
+ function suffixWithTimeRemaining(expiry) {
9106
+ return expiry > Date.now() ? `剩余${msToHumanReadable(expiry - Date.now())}` : "";
9107
+ }
9108
+ __name(suffixWithTimeRemaining, "suffixWithTimeRemaining");
9109
+ async function createWorldStateMessages(items) {
9110
+ const messages2 = [];
9111
+ const push = /* @__PURE__ */ __name(async (title, lines) => {
9112
+ if (lines.length) {
9113
+ messages2.push(/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("message", { children: [
9114
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { children: `${title}
9115
+ ` }),
9116
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { children: lines.join("\n") })
9117
+ ] }));
9118
+ }
9119
+ }, "push");
9120
+ await push("新的虚空裂隙已出现:", items.filter((item) => item.type === "fissure").map((item) => {
9121
+ const category = item.category === "steel-path" ? "[钢铁]" : item.category === "railjack" ? "[九重天]" : "[普通]";
9122
+ const faction = item.node.faction ? `${item.node.faction}` : "";
9123
+ return `${category}${item.tier} - ${item.node.system} (${item.node.type}) ${faction} ${item.node.name} | ${suffixWithTimeRemaining(item.expiry)}`;
9124
+ }));
9125
+ await push("虚空商人到达", items.filter((item) => item.type === "void-trader").map((item) => `${item.character} 已到达 ${item.location}${suffixWithExpiry(item.expiry)}`));
9126
+ await push("新每日特惠", items.filter((item) => item.type === "daily-deal").map((item) => `${item.item}:${item.salePrice} 白金(-${item.discount}%,原价 ${item.originalPrice})${suffixWithExpiry(item.expiry)}`));
9127
+ await push("新警报", items.filter((item) => item.type === "alert").map((item) => {
9128
+ const reward = item.reward ? ` | 奖励:${item.reward}` : "";
9129
+ return `${item.description} | ${item.node} ${item.missionType}${reward}${suffixWithExpiry(item.expiry)}`;
9130
+ }));
9131
+ return messages2;
9132
+ }
9133
+ __name(createWorldStateMessages, "createWorldStateMessages");
9134
+
9135
+ // src/schedules/world-state.ts
9136
+ function setupWorldStateSchedule(ctx, deps, refresh = refreshWorldState) {
9137
+ let running = false;
9138
+ const run = /* @__PURE__ */ __name(async () => {
9139
+ if (running) {
9140
+ return;
9141
+ }
9142
+ running = true;
9143
+ try {
9144
+ const messages2 = await createWorldStateMessages(await refresh());
9145
+ const channels = Object.values(deps.config.channelIds);
9146
+ if (!channels.length) {
9147
+ return;
9148
+ }
9149
+ for (const message of messages2) {
9150
+ await ctx.broadcast(channels, message);
9151
+ }
9152
+ } catch (error) {
9153
+ deps.logger.warn(error, "刷新 Warframe 世界状态失败");
9154
+ } finally {
9155
+ running = false;
9156
+ }
9157
+ }, "run");
9158
+ ctx.cron("0 */5 * * * *", () => {
9159
+ void run();
9160
+ });
9161
+ }
9162
+ __name(setupWorldStateSchedule, "setupWorldStateSchedule");
9163
+
9164
+ // src/schedules/index.ts
9165
+ function setupSchedules(ctx, deps) {
9166
+ setupWorldStateSchedule(ctx, deps);
9167
+ }
9168
+ __name(setupSchedules, "setupSchedules");
9169
+
8908
9170
  // src/index.ts
8909
9171
  var import_reflect_metadata = __toESM(require_Reflect());
8910
9172
  var name = "warframe";
8911
9173
  var inject = {
8912
- required: ["puppeteer"]
9174
+ required: ["cron", "database", "puppeteer"]
8913
9175
  };
8914
- var Config = import_koishi3.Schema.object({
8915
- developerMode: import_koishi3.Schema.boolean().default(false),
8916
- ocrAPISecret: import_koishi3.Schema.object({
8917
- id: import_koishi3.Schema.string(),
8918
- key: import_koishi3.Schema.string()
9176
+ var Config = import_koishi2.Schema.object({
9177
+ channelIds: import_koishi2.Schema.dict(import_koishi2.Schema.string()).default({}).description("用于接收推送的`channelId`列表, 需携带平台前缀, 如:`qq:123456789`"),
9178
+ developerMode: import_koishi2.Schema.boolean().default(false),
9179
+ ocrAPISecret: import_koishi2.Schema.object({
9180
+ id: import_koishi2.Schema.string(),
9181
+ key: import_koishi2.Schema.string()
8919
9182
  }).description("OCR API 密钥")
8920
9183
  });
8921
9184
  function apply(ctx) {
@@ -8926,13 +9189,14 @@ function apply(ctx) {
8926
9189
  };
8927
9190
  setupHooks(ctx, deps);
8928
9191
  setupCommands(ctx, deps);
9192
+ setupSchedules(ctx, deps);
8929
9193
  }
8930
9194
  __name(apply, "apply");
8931
9195
  function setupHooks(ctx, deps) {
8932
- const { config, logger: logger2 } = deps;
9196
+ const { config, logger } = deps;
8933
9197
  ctx.on("message", (session) => {
8934
9198
  if (config.developerMode) {
8935
- logger2.info(
9199
+ logger.info(
8936
9200
  `Koishi recieved message: ${session.content}
8937
9201
  Platform: ${session.platform}
8938
9202
  User: ${session.author.name}`
@@ -8941,7 +9205,7 @@ function setupHooks(ctx, deps) {
8941
9205
  });
8942
9206
  ctx.on("command/before-execute", (action) => {
8943
9207
  if (config.developerMode) {
8944
- logger2.info(
9208
+ logger.info(
8945
9209
  `WFM Plugin received command ${action.command?.name}
8946
9210
  arguments: ${JSON.stringify(action.args)}`
8947
9211
  );