koishi-plugin-warframe 1.13.0 → 1.14.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/README.md CHANGED
@@ -38,7 +38,8 @@ Toolkit for Warframe. Provides Warframe Market prices, fissures, arbitrations, r
38
38
  | `arbitration` | `[day:number]` | `arbi`, `仲裁`, `仲裁表` | Query high-value arbitration missions. Optional `day` controls how many days to show (default: 3). |
39
39
  | `weekly` | | `周常`, `科研`, `时光科研`, `深层科研`, `执行官` | Query weekly missions (Archon Hunt, Deep Archimedea, Temporal Archimedea). |
40
40
  | `circuit` | | `灵化之源`, `灵化` | Query weekly circuit rewards (warframes and incarnon adapters). |
41
- | `steelpath` | | `steel-path`, `teshin`, `钢铁精华`, `钢铁之路` | Query this week's Steel Essence shop rotation (current offering, remaining time, upcoming). |
41
+ | `steel-essence` | | `钢铁精华` | Query this week's Steel Essence shop rotation (current offering, remaining time, upcoming). |
42
+ | `1999calendar` | | `日历`, `1999日历`, `霍瓦尼亚日历` | Query the current 1999 Höllvania calendar tagged days (challenges, overrides, rewards). |
42
43
 
43
44
  ### Open World Cycles
44
45
 
package/lib/index.d.ts CHANGED
@@ -34,7 +34,7 @@ declare module "warframe/types/ocr" {
34
34
  }
35
35
  }
36
36
  declare module "warframe/types/warframe-result" {
37
- export const warframeErrorCodes: readonly ["common.fetchFailed", "relic.invalidName", "relic.dataLoading", "relic.notFound", "arbitration.invalidDayRange", "bounty.unavailable", "invasion.unavailable", "alert.unavailable", "steelpath.unavailable", "nightwave.unavailable", "sortie.unavailable", "voidTrader.drifting", "voidTrader.arriving", "riven.imageFetchFailed", "riven.imageParseFailed", "riven.weaponNotFound", "riven.dispositionError", "riven.weaponTypeError", "riven.statTypeError", "wfm.inputItemName", "wfm.itemNotFound", "wfm.itemAmbiguous", "wfm.orderFetchFailed", "wfm.noOnlineSeller", "wfm.rivenWeaponNotFound", "wfm.rivenOrderFetchFailed", "wfm.noOnlineRivenSeller", "miscs.hotRiven.noData", "miscs.hotRiven.fetchFailed"];
37
+ export const warframeErrorCodes: readonly ["common.fetchFailed", "relic.invalidName", "relic.dataLoading", "relic.notFound", "arbitration.invalidDayRange", "bounty.unavailable", "invasion.unavailable", "alert.unavailable", "calendar.unavailable", "steelEssence.unavailable", "nightwave.unavailable", "sortie.unavailable", "voidTrader.drifting", "voidTrader.arriving", "riven.imageFetchFailed", "riven.imageParseFailed", "riven.weaponNotFound", "riven.dispositionError", "riven.weaponTypeError", "riven.statTypeError", "wfm.inputItemName", "wfm.itemNotFound", "wfm.itemAmbiguous", "wfm.orderFetchFailed", "wfm.noOnlineSeller", "wfm.rivenWeaponNotFound", "wfm.rivenOrderFetchFailed", "wfm.noOnlineRivenSeller", "miscs.hotRiven.noData", "miscs.hotRiven.fetchFailed"];
38
38
  export type WarframeErrorCode = typeof warframeErrorCodes[number];
39
39
  export type WarframeErrorParams = Record<string, string | number>;
40
40
  export interface WarframeError {
@@ -186,6 +186,86 @@ declare module "warframe/types/wf/bounty" {
186
186
  zarimanFaction?: string;
187
187
  }
188
188
  }
189
+ declare module "warframe/types/wf/nightwave" {
190
+ export interface RawMongoDate {
191
+ $date?: {
192
+ $numberLong?: string | number;
193
+ };
194
+ }
195
+ export interface RawNightwaveActiveChallenge {
196
+ Challenge: string;
197
+ Daily?: boolean;
198
+ Permanent?: boolean | number | string;
199
+ Activation?: RawMongoDate;
200
+ Expiry?: RawMongoDate;
201
+ }
202
+ export interface RawSeasonInfo {
203
+ Season: number;
204
+ Phase: number;
205
+ AffiliationTag: string;
206
+ Expiry?: RawMongoDate;
207
+ ActiveChallenges: RawNightwaveActiveChallenge[];
208
+ }
209
+ export type NightwaveChallengeKind = 'daily' | 'weekly' | 'elite' | 'permanent';
210
+ export interface NightwaveChallengeInfo {
211
+ name: string;
212
+ description: string;
213
+ kind: NightwaveChallengeKind;
214
+ remaining: string;
215
+ standing?: number;
216
+ }
217
+ export interface NightwaveBoard {
218
+ title: string;
219
+ season: number;
220
+ phase: number;
221
+ expiry: number;
222
+ remaining: string;
223
+ challenges: NightwaveChallengeInfo[];
224
+ }
225
+ }
226
+ declare module "warframe/types/wf/calendar" {
227
+ import type { RawMongoDate } from "warframe/types/wf/nightwave";
228
+ export interface RawCalendarEvent {
229
+ type?: string;
230
+ challenge?: string;
231
+ upgrade?: string;
232
+ reward?: string;
233
+ dialogueName?: string;
234
+ dialogueConvo?: string;
235
+ }
236
+ export interface RawCalendarDay {
237
+ day?: number;
238
+ events?: RawCalendarEvent[];
239
+ }
240
+ export interface RawCalendarSeason {
241
+ Activation?: RawMongoDate;
242
+ Expiry?: RawMongoDate;
243
+ Days?: RawCalendarDay[];
244
+ Season?: string;
245
+ YearIteration?: number;
246
+ Version?: number;
247
+ UpgradeAvaliabilityRequirements?: string[];
248
+ }
249
+ export type CalendarEventKind = 'challenge' | 'upgrade' | 'reward' | 'birthday' | 'other';
250
+ export interface CalendarEventInfo {
251
+ kind: CalendarEventKind;
252
+ kindLabel: string;
253
+ name: string;
254
+ description?: string;
255
+ }
256
+ export interface CalendarDayInfo {
257
+ day: number;
258
+ dateLabel: string;
259
+ events: CalendarEventInfo[];
260
+ }
261
+ export interface CalendarBoard {
262
+ title: string;
263
+ season: string;
264
+ remaining: string;
265
+ expiry: number;
266
+ days: CalendarDayInfo[];
267
+ }
268
+ }
189
269
  declare module "warframe/types/wf/fissure" {
190
270
  import type { WFRegionShort } from "warframe/types/wf/region";
191
271
  export interface Fissure {
@@ -261,43 +341,6 @@ declare module "warframe/types/wf/invasion" {
261
341
  planets: InvasionPlanetGroup[];
262
342
  }
263
343
  }
264
- declare module "warframe/types/wf/nightwave" {
265
- export interface RawMongoDate {
266
- $date?: {
267
- $numberLong?: string | number;
268
- };
269
- }
270
- export interface RawNightwaveActiveChallenge {
271
- Challenge: string;
272
- Daily?: boolean;
273
- Permanent?: boolean | number | string;
274
- Activation?: RawMongoDate;
275
- Expiry?: RawMongoDate;
276
- }
277
- export interface RawSeasonInfo {
278
- Season: number;
279
- Phase: number;
280
- AffiliationTag: string;
281
- Expiry?: RawMongoDate;
282
- ActiveChallenges: RawNightwaveActiveChallenge[];
283
- }
284
- export type NightwaveChallengeKind = 'daily' | 'weekly' | 'elite' | 'permanent';
285
- export interface NightwaveChallengeInfo {
286
- name: string;
287
- description: string;
288
- kind: NightwaveChallengeKind;
289
- remaining: string;
290
- standing?: number;
291
- }
292
- export interface NightwaveBoard {
293
- title: string;
294
- season: number;
295
- phase: number;
296
- expiry: number;
297
- remaining: string;
298
- challenges: NightwaveChallengeInfo[];
299
- }
300
- }
301
344
  declare module "warframe/types/wf/relic" {
302
345
  export type RelicTier = 'Lith' | 'Meso' | 'Neo' | 'Axi' | 'Requiem' | 'Vanguard';
303
346
  export type RelicQuality = 'Intact' | 'Exceptional' | 'Flawless' | 'Radiant';
@@ -457,7 +500,7 @@ declare module "warframe/types/wf/sortie" {
457
500
  missions: SortieMission[];
458
501
  }
459
502
  }
460
- declare module "warframe/types/wf/steelpath" {
503
+ declare module "warframe/types/wf/steelessence" {
461
504
  export interface RawSteelPathOffering {
462
505
  name?: string;
463
506
  cost?: number;
@@ -468,17 +511,17 @@ declare module "warframe/types/wf/steelpath" {
468
511
  expiry?: Date;
469
512
  rotation?: RawSteelPathOffering[];
470
513
  }
471
- export interface SteelPathOfferingInfo {
514
+ export interface SteelEssenceOfferingInfo {
472
515
  name: string;
473
516
  cost: number;
474
517
  }
475
- export interface SteelPathBoard {
518
+ export interface SteelEssenceBoard {
476
519
  title: string;
477
520
  costLabel: string;
478
521
  remaining: string;
479
522
  expiry: number;
480
- current: SteelPathOfferingInfo;
481
- upcoming: SteelPathOfferingInfo[];
523
+ current: SteelEssenceOfferingInfo;
524
+ upcoming: SteelEssenceOfferingInfo[];
482
525
  }
483
526
  }
484
527
  declare module "warframe/types/wf/voidtrader" {
@@ -526,6 +569,7 @@ declare module "warframe/types/index" {
526
569
  export type { AlertBoard, AlertInfo, AlertReward } from "warframe/types/wf/alert";
527
570
  export type { Arbitration, ArbitrationShort } from "warframe/types/wf/arbitration";
528
571
  export type { BountyBoard, BountyJob, BountyLocation, BountyReward, BountyRewardRarity, BountyStandingUnit, OracleBountyCycle, OracleBountyEntry, RawSyndicateJob, RawSyndicateMission, } from "warframe/types/wf/bounty";
572
+ export type { CalendarBoard, CalendarDayInfo, CalendarEventInfo, CalendarEventKind, RawCalendarDay, RawCalendarEvent, RawCalendarSeason, } from "warframe/types/wf/calendar";
529
573
  export type { Fissure } from "warframe/types/wf/fissure";
530
574
  export type { Invasion, InvasionBoard, InvasionFactionTone, InvasionPlanetGroup, InvasionReward, InvasionSide, RawInvasion, RawInvasionCountedItem, RawInvasionMissionInfo, RawInvasionReward, } from "warframe/types/wf/invasion";
531
575
  export type { NightwaveBoard, NightwaveChallengeInfo, NightwaveChallengeKind, RawMongoDate, RawNightwaveActiveChallenge, RawSeasonInfo, } from "warframe/types/wf/nightwave";
@@ -533,7 +577,7 @@ declare module "warframe/types/index" {
533
577
  export type { ExternalRelic, ExternalRelicReward, OutputRelic, OutputRelicReward, Relic, RelicQuality, RelicReward, RelicRewardRarity, RelicTier, } from "warframe/types/wf/relic";
534
578
  export type { RivenStatAnalyzeResult, RivenStatAnalyzsis, RivenStatCountType, RivenStatFixFactor, RivenStatFixFactorMap, RivenStatResult, RivenWeaponDisposition, RivenWeaponType, } from "warframe/types/wf/riven";
535
579
  export type { RawSortie, RawSortieVariant, Sortie, SortieMission, } from "warframe/types/wf/sortie";
536
- export type { RawSteelPathOffering, RawSteelPathOfferings, SteelPathBoard, SteelPathOfferingInfo, } from "warframe/types/wf/steelpath";
580
+ export type { RawSteelPathOffering, RawSteelPathOfferings, SteelEssenceBoard, SteelEssenceOfferingInfo, } from "warframe/types/wf/steelessence";
537
581
  export type { VoidTrader, VoidTraderItem } from "warframe/types/wf/voidtrader";
538
582
  export type { ArchiMedea, ArchiMedeaDebuff, ArchiMedeaMission, ArchonHunt, ArchonHuntMissions, } from "warframe/types/wf/weekly";
539
583
  export type { ClosedStatisticsEntry, Ducatnator, ItemShort, ItemStatisticsPoint, ItemStatisticsSummary, LiveStatisticsEntry, OrderWithUser, PrimedModHistoryItem, RivenAttribute, RivenAttributeShortInternal, RivenAttributeUnit, RivenItem, RivenOrder, RivenOrderInternal, StatisticsCollection, WFMLang, } from "warframe/types/wfm";
@@ -643,11 +687,12 @@ declare module "warframe/data/wf/archonHunt" {
643
687
  }
644
688
  declare module "warframe/infrastructure/wf/wf-api" {
645
689
  import type WorldState from 'warframe-worldstate-parser';
646
- import type { OracleBountyCycle, RawInvasion, RawSeasonInfo, RawSortie, RawSyndicateMission } from "warframe/types/index";
690
+ import type { OracleBountyCycle, RawCalendarSeason, RawInvasion, RawSeasonInfo, RawSortie, RawSyndicateMission } from "warframe/types/index";
647
691
  export function extractSyndicateMissionsRaw(json: string): RawSyndicateMission[];
648
692
  export function extractSeasonInfoRaw(json: string): RawSeasonInfo | undefined;
649
693
  export function extractSortieRaw(json: string): RawSortie | undefined;
650
694
  export function extractInvasionsRaw(json: string): RawInvasion[];
695
+ export function extractCalendarRaw(json: string): RawCalendarSeason | undefined;
651
696
  export function fetchWorldStateJson(): Promise<string | undefined>;
652
697
  /** browse.wf Oracle bounty cycle (Zariman / Cavia / Hex). */
653
698
  export function fetchOracleBountyCycle(): Promise<OracleBountyCycle | undefined>;
@@ -734,7 +779,7 @@ declare module "warframe/infrastructure/wf/wfcd-adapter" {
734
779
  }
735
780
  declare module "warframe/data/wf/globalWorldState" {
736
781
  import type WorldState from 'warframe-worldstate-parser';
737
- import type { Fissure, RawSeasonInfo, RawSyndicateMission } from "warframe/types/index";
782
+ import type { Fissure, RawCalendarSeason, RawSeasonInfo, RawSyndicateMission } from "warframe/types/index";
738
783
  type ParsedFissure = WorldState['fissures'][number];
739
784
  export function adaptFissure(fissure: ParsedFissure): Promise<Fissure>;
740
785
  export const globalWorldState: import("warframe").AsyncCache<{
@@ -743,6 +788,7 @@ declare module "warframe/data/wf/globalWorldState" {
743
788
  seasonInfoRaw: RawSeasonInfo | undefined;
744
789
  sortieRaw: import("warframe").RawSortie | undefined;
745
790
  invasionsRaw: import("warframe").RawInvasion[];
791
+ calendarRaw: RawCalendarSeason | undefined;
746
792
  fissures: Fissure[];
747
793
  spFissures: Fissure[];
748
794
  rjFissures: Fissure[];
@@ -923,13 +969,20 @@ declare module "warframe/infrastructure/wf/bounty-adapter" {
923
969
  export function formatOracleChallenge(challengePath: string): string;
924
970
  export function adaptOracleBountyBoard(location: 'zariman' | 'cavia' | 'hex', cycle: OracleBountyCycle | undefined): BountyBoard | undefined;
925
971
  }
972
+ declare module "warframe/infrastructure/wf/calendar-adapter" {
973
+ import type { CalendarBoard, RawCalendarSeason, RawMongoDate } from "warframe/types/index";
974
+ export function calendarTimestampMs(value?: RawMongoDate): number;
975
+ /** Strip Lotus color pipes and HTML-like markup tags. */
976
+ export function stripLotusMarkup(text: string): string;
977
+ export function adaptCalendar(raw: RawCalendarSeason | undefined, now?: number): CalendarBoard;
978
+ }
926
979
  declare module "warframe/infrastructure/wf/nightwave-adapter" {
927
980
  import type { NightwaveBoard, RawSeasonInfo } from "warframe/types/index";
928
981
  export function adaptNightwave(raw: RawSeasonInfo, now?: number): NightwaveBoard;
929
982
  }
930
983
  declare module "warframe/services/wf-service" {
931
984
  import type { WeeklyRiven } from 'warframe-weekly-rivens';
932
- import type { AlertBoard, Arbitration, ArchiMedea, ArchonHunt, BountyBoard, BountyLocation, Fissure, InvasionBoard, NightwaveBoard, OcrAPISecret, RawInvasion, RawSeasonInfo, RawSortie, RawSteelPathOfferings, Relic, RivenAttribute, RivenStatAnalyzeResult, RivenStatResult, Sortie, SteelPathBoard, VoidTrader, WarframeResult } from "warframe/types/index";
985
+ import type { AlertBoard, Arbitration, ArchiMedea, ArchonHunt, BountyBoard, BountyLocation, CalendarBoard, Fissure, InvasionBoard, NightwaveBoard, OcrAPISecret, RawCalendarSeason, RawInvasion, RawSeasonInfo, RawSortie, RawSteelPathOfferings, Relic, RivenAttribute, RivenStatAnalyzeResult, RivenStatResult, Sortie, SteelEssenceBoard, VoidTrader, WarframeResult } from "warframe/types/index";
933
986
  import { weaponRivenDispositionDict } from "warframe/data/wf/rivenDisposition";
934
987
  export function getRelic(input: string): Promise<WarframeResult<Relic>>;
935
988
  export function getArbitrations(day?: number): WarframeResult<Arbitration[]>;
@@ -996,13 +1049,19 @@ declare module "warframe/services/wf-service" {
996
1049
  };
997
1050
  }[], now?: number): Promise<AlertBoard>;
998
1051
  export function getAlerts(): Promise<WarframeResult<AlertBoard>>;
999
- export function adaptSteelPath(raw?: RawSteelPathOfferings, now?: number): Promise<SteelPathBoard>;
1000
- export function getSteelPathFrom(snapshot?: {
1052
+ export function adaptCalendar(raw: RawCalendarSeason | undefined, now?: number): CalendarBoard;
1053
+ export function getCalendarFrom(snapshot?: {
1054
+ raw?: unknown;
1055
+ calendarRaw?: RawCalendarSeason;
1056
+ }, now?: number): Promise<WarframeResult<CalendarBoard>>;
1057
+ export function getCalendar(): Promise<WarframeResult<CalendarBoard>>;
1058
+ export function adaptSteelEssence(raw?: RawSteelPathOfferings, now?: number): Promise<SteelEssenceBoard>;
1059
+ export function getSteelEssenceFrom(snapshot?: {
1001
1060
  raw?: {
1002
1061
  steelPath?: RawSteelPathOfferings;
1003
1062
  };
1004
- }, now?: number): Promise<WarframeResult<SteelPathBoard>>;
1005
- export function getSteelPath(): Promise<WarframeResult<SteelPathBoard>>;
1063
+ }, now?: number): Promise<WarframeResult<SteelEssenceBoard>>;
1064
+ export function getSteelEssence(): Promise<WarframeResult<SteelEssenceBoard>>;
1006
1065
  export function getFissures(): Promise<WarframeResult<Fissure[]>>;
1007
1066
  export function getSteelPathFissures(): Promise<WarframeResult<Fissure[]>>;
1008
1067
  export function getRailjackFissures(): Promise<WarframeResult<Fissure[]>>;
@@ -1216,7 +1275,8 @@ declare module "i18n" {
1216
1275
  readonly 'bounty.unavailable': "当前该地点暂无可用赏金";
1217
1276
  readonly 'invasion.unavailable': "当前没有入侵";
1218
1277
  readonly 'alert.unavailable': "当前没有警报";
1219
- readonly 'steelpath.unavailable': "钢铁精华商店获取失败";
1278
+ readonly 'calendar.unavailable': "当前没有1999日历";
1279
+ readonly 'steelEssence.unavailable': "钢铁精华商店获取失败";
1220
1280
  readonly 'nightwave.unavailable': "当前没有午夜电波";
1221
1281
  readonly 'sortie.unavailable': "当前没有突击";
1222
1282
  readonly 'voidTrader.drifting': "虚空商人仍在未知地带漂流...";
@@ -1281,7 +1341,7 @@ declare module "utils/index" {
1281
1341
  declare module "components/wf" {
1282
1342
  import type { Element } from 'koishi';
1283
1343
  import type { WeeklyRiven } from 'warframe-weekly-rivens';
1284
- import type { AlertBoard, Arbitration, ArchiMedea, ArchonHunt, BountyBoard, Fissure, InvasionBoard, NightwaveBoard, OutputRelic, RivenStatAnalyzeResult, RivenStatResult, Sortie, SteelPathBoard, VoidTrader } from "warframe/index";
1344
+ import type { AlertBoard, Arbitration, ArchiMedea, ArchonHunt, BountyBoard, CalendarBoard, Fissure, InvasionBoard, NightwaveBoard, OutputRelic, RivenStatAnalyzeResult, RivenStatResult, Sortie, SteelEssenceBoard, VoidTrader } from "warframe/index";
1285
1345
  export function ArbitrationComponent(arbi: Arbitration[]): Element;
1286
1346
  export function CircuitComponent(currentIncarnons: number, currentWarframes: number, allIncarnons: string[][], allWarframes: string[][]): Element;
1287
1347
  export function FissureComponent(fissures: Fissure[], type: 'fissure' | 'sp-fissure' | 'rj-fissure'): Element;
@@ -1296,7 +1356,8 @@ declare module "components/wf" {
1296
1356
  export function RivenStatComponent(data: RivenStatResult): Element;
1297
1357
  export function VoidTraderComponent(data: VoidTrader): Element;
1298
1358
  export function AlertComponent(board: AlertBoard): Element;
1299
- export function SteelPathComponent(board: SteelPathBoard): Element;
1359
+ export function CalendarComponent(board: CalendarBoard): Element;
1360
+ export function SteelEssenceComponent(board: SteelEssenceBoard): Element;
1300
1361
  }
1301
1362
  declare module "commands/wf" {
1302
1363
  import type { Argv, Dict } from 'koishi';
@@ -1308,7 +1369,8 @@ declare module "commands/wf" {
1308
1369
  fissureCommand: (_action: Argv) => Promise<string>;
1309
1370
  invasionCommand: (_action: Argv) => Promise<string>;
1310
1371
  alertCommand: (_action: Argv) => Promise<string>;
1311
- steelPathCommand: (_action: Argv) => Promise<string>;
1372
+ calendarCommand: (_action: Argv) => Promise<string>;
1373
+ steelEssenceCommand: (_action: Argv) => Promise<string>;
1312
1374
  steelPathFissureCommand: (_action: Argv) => Promise<string>;
1313
1375
  railjackFissureCommand: (_action: Argv) => Promise<string>;
1314
1376
  relicCommand: (_action: Argv, input: string) => Promise<string>;