warframe-nexus-query
Version:
Query prices form nexus-stats.com and warframe.market.
523 lines (470 loc) • 12.3 kB
TypeScript
/**
* TypeScript type definitions for warframe-nexus-query
* Library for querying Warframe item prices from warframe.market
*/
export type Platform = 'pc' | 'ps4' | 'xbox' | 'switch' | 'mobile';
export type PlatformAlias =
| 'pc'
| 'ps4'
| 'playstation'
| 'xb1'
| 'xbone'
| 'xbox'
| 'switch'
| 'swi'
| 'ns'
| 'mobile';
export type Language = 'en' | 'es' | 'fr' | 'de' | 'it' | 'pl' | 'pt' | 'ru' | 'ko' | 'zh-hans' | 'zh-hant' | 'uk';
export type OrderType = 'buy' | 'sell';
export type UserStatus = 'invisible' | 'offline' | 'online' | 'ingame';
export type ActivityType = 'UNKNOWN' | 'IDLE' | 'ON_MISSION' | 'IN_DOJO' | 'IN_ORBITER' | 'IN_RELAY';
export type Rarity = 'common' | 'uncommon' | 'rare' | 'legendary';
export interface Logger {
debug(message: string, ...args: unknown[]): void;
info(message: string, ...args: unknown[]): void;
warn(message: string, ...args: unknown[]): void;
error(message: string, ...args: unknown[]): void;
log(message: string, ...args: unknown[]): void;
}
export interface LocalizedData {
name: string;
description?: string;
icon?: string;
thumb?: string;
subIcon?: string;
wikiLink?: string;
}
export interface I18nData {
[lang: string]: LocalizedData;
}
export interface ItemData {
id: string;
slug: string;
gameRef?: string;
tags?: string[];
rarity?: Rarity;
tradingTax?: number;
ducats?: number;
vosfor?: number;
baseEndo?: number;
endoMultiplier?: number;
reqMasteryRank?: number;
maxRank?: number;
maxCharges?: number;
maxAmberStars?: number;
maxCyanStars?: number;
setRoot?: boolean;
setParts?: string[];
quantityInSet?: number;
bulkTradable?: boolean;
subtypes?: string[];
tradable?: boolean;
vaulted?: boolean;
i18n: I18nData;
}
export interface OrderUserData {
id: string;
ingameName: string;
avatar?: string;
reputation?: number;
locale?: string;
platform?: Platform;
crossplay?: boolean;
status?: UserStatus;
activity?: UserActivity;
lastSeen?: string;
}
export interface UserActivity {
type: ActivityType;
details?: string;
startedAt?: string;
}
export interface OrderData {
id: string;
type: OrderType;
platinum: number;
quantity: number;
perTrade?: boolean;
rank?: number;
charges?: number;
subtype?: string;
amberStars?: number;
cyanStars?: number;
visible?: boolean;
createdAt?: string;
updatedAt?: string;
itemId?: string;
group?: string;
user?: OrderUserData;
}
export interface PriceRange {
minimum: number;
maximum: number;
median: number;
}
export interface StatisticsData {
volume: number;
orderCount: number;
median: number;
min: number;
max: number;
avg: number;
q1: number;
q3: number;
}
export interface SummaryPrices {
soldCount: number;
soldPrice: number;
minimum: number;
maximum: number;
average: number;
volume: number;
}
export interface SummaryData {
name: string;
slug: string;
thumbnail: string;
partThumb?: string;
icon?: string;
tradingTax: number;
ducats?: number;
vosfor?: number;
masteryLevel?: number;
tradable?: boolean;
vaulted?: boolean;
wikiUrl?: string;
description?: string;
codex?: string;
url: string;
tags?: string[];
prices: SummaryPrices;
orders: {
buy: Order[];
sell: Order[];
};
statistics: {
buy: StatisticsData;
sell: StatisticsData;
};
type: 'market-v2';
}
export interface TraderInfo {
ingameName: string;
platinum: number;
quantity: number;
status: UserStatus;
activity?: string;
reputation?: number;
platform?: Platform;
crossplay?: boolean;
}
export interface QueryOptions {
platform: Platform;
successfulQuery?: () => void;
rank?: number;
ranks?: number[];
rankLt?: number;
charges?: number;
chargesLt?: number;
amberStars?: number;
amberStarsLt?: number;
cyanStars?: number;
cyanStarsLt?: number;
subtype?: string;
}
/** Options for filtering price checks by mod rank and other order modifiers. */
export type PriceCheckOptions = Omit<QueryOptions, 'platform' | 'successfulQuery'>;
export interface GetTopOrdersOptions extends QueryOptions {
platform: Platform;
}
export interface CalculateStatisticsOptions {
type?: OrderType;
onlineOnly?: boolean;
includeOutliers?: boolean;
}
export interface GetBestOrdersOptions {
limit?: number;
onlineOnly?: boolean;
}
export class Item {
id: string;
slug: string;
name: string;
description?: string;
wikiLink?: string;
tags: string[];
gameRef?: string;
rarity?: Rarity;
thumb?: string;
icon?: string;
subIcon?: string;
tradingTax?: number;
ducats?: number;
vosfor?: number;
baseEndo?: number;
endoMultiplier?: number;
reqMasteryRank?: number;
maxRank?: number;
maxCharges?: number;
maxAmberStars?: number;
maxCyanStars?: number;
bulkTradable: boolean;
subtypes: string[];
tradable?: boolean;
vaulted: boolean;
setRoot?: boolean;
setParts: string[];
quantityInSet?: number;
i18n: I18nData;
locale: Language;
type: 'market-v2';
constructor(data: ItemData, locale?: Language);
getLocalized(field: string, lang?: Language): unknown;
getIconUrl(baseUrl?: string): string | null;
getThumbUrl(baseUrl?: string): string | null;
isPartOfSet(): boolean;
isVaulted(): boolean;
toJSON(): ItemData;
toString(): string;
}
export class OrderUser {
id: string;
ingameName: string;
avatar?: string;
reputation: number;
locale?: string;
platform?: Platform;
crossplay: boolean;
status?: UserStatus;
activity?: UserActivity;
lastSeen: Date | null;
constructor(data: OrderUserData);
isOnline(): boolean;
getActivityDescription(): string | null;
getStatusEmoji(): string;
toJSON(): OrderUserData;
}
export class Order {
id: string;
type: OrderType;
platinum: number;
quantity: number;
perTrade?: boolean;
rank?: number;
charges?: number;
subtype?: string;
amberStars?: number;
cyanStars?: number;
visible: boolean;
createdAt: Date | null;
updatedAt: Date | null;
itemId?: string;
group?: string;
user: OrderUser | null;
constructor(data: OrderData);
isUserOnline(): boolean;
isBuyOrder(): boolean;
isSellOrder(): boolean;
getAgeHours(): number;
toJSON(): OrderData;
toString(): string;
}
export class SummaryV2 {
name: string;
slug: string;
thumbnail: string;
partThumb?: string;
icon?: string;
tradingTax: number;
ducats: number;
vosfor: number;
masteryLevel?: number;
tradable?: boolean;
vaulted: boolean;
wikiUrl?: string;
description: string;
codex: string;
url: string;
tags: string[];
prices: SummaryPrices;
orders: {
buy: Order[];
sell: Order[];
};
statistics: {
buy: StatisticsData;
sell: StatisticsData;
};
type: 'market-v2';
constructor(
item: Item,
orders: { buy: Order[]; sell: Order[] },
statistics: { buy: StatisticsData; sell: StatisticsData }
);
getOnlineSellers(limit?: number): TraderInfo[];
getOnlineBuyers(limit?: number): TraderInfo[];
toString(opt?: 'codex' | 'item' | 'location' | 'traders' | 'all'): string;
pad(str: string, length?: number, character?: string): string;
}
export interface HttpClientOptions {
baseURL?: string;
timeout?: number;
locale?: Language;
logger?: Logger;
token?: string;
headers?: Record<string, string>;
}
export interface HttpClient {
get(
path: string,
options?: { platform?: Platform; locale?: Language; query?: Record<string, unknown> }
): Promise<unknown>;
post(path: string, body: unknown, options?: { platform?: Platform; locale?: Language }): Promise<unknown>;
setLocale(locale: Language): void;
setTimeout(timeout: number): void;
}
export interface CacheOptions {
maxSize?: number;
ttl?: number;
cacheId?: string;
persistent?: boolean;
logger?: Logger;
}
export interface VersionedCache {
get(key: string, collection: string, fetchFn: () => Promise<unknown>): Promise<unknown>;
set(key: string, value: unknown, collection?: string): void;
clear(): void;
delete(key: string): void;
size(): number;
has(key: string): boolean;
checkVersions(): Promise<VersionedCacheVersionData>;
shouldRefresh(collection: string): Promise<boolean>;
refresh(key: string, collection: string, fetchFn: () => Promise<unknown>): Promise<unknown>;
}
export interface VersionedCacheVersionData {
apiVersion?: string;
data?: {
collections?: Record<string, string>;
[key: string]: unknown;
};
}
export interface MarketFetcherV2Options {
locale?: Language;
timeout?: number;
logger?: Logger;
cacheSize?: number;
ordersCacheSize?: number;
cacheTTL?: number;
baseURL?: string;
}
export interface MarketFetcherV2 {
locale: Language;
logger: Logger;
getItems(): Promise<Item[]>;
getItemBySlug(slug: string): Promise<Item>;
getItemSet(slug: string): Promise<{ id: string; items: Item[] }>;
getTopOrders(slug: string, options: GetTopOrdersOptions): Promise<{ buy: Order[]; sell: Order[] }>;
getAllOrders(slug: string, platform: Platform): Promise<Order[]>;
getRecentOrders(platform: Platform): Promise<Order[]>;
calculateStatistics(orders: Order[], options?: CalculateStatisticsOptions): StatisticsData;
getBestOrders(orders: Order[], options?: GetBestOrdersOptions): { buy: Order[]; sell: Order[] };
formatPriceRange(stats: StatisticsData): string;
formatStatistics(stats: StatisticsData, type?: OrderType): string;
queryMarket(query: string, options: QueryOptions): Promise<SummaryV2[]>;
priceCheckQuery(query: string, platform: Platform, options?: PriceCheckOptions): Promise<SummaryV2[]>;
clearCache(): void;
checkVersions(): Promise<VersionedCacheVersionData>;
normalizePlatform(platform: string): string;
setLocale(locale: Language): void;
stop(): void;
}
export interface PriceCheckQuerierOptions {
logger?: Logger;
marketCache?: MarketFetcherV2;
skipMarket?: boolean;
}
export interface PriceCheckQueryResult {
query: string;
platform: Platform;
results: SummaryV2[];
apiVersion: 'v1' | 'v2';
}
export interface DiscordEmbed {
type: 'rich';
title: string;
color: number;
url: string;
fields: DiscordEmbedField[];
thumbnail?: DiscordEmbedThumbnail;
footer?: DiscordEmbedFooter;
}
export interface DiscordEmbedField {
name: string;
value: string;
inline?: boolean;
}
export interface DiscordEmbedThumbnail {
url: string;
}
export interface DiscordEmbedFooter {
text: string;
icon_url?: string;
}
export class PriceCheckQuerier {
settings: Settings;
logger: Logger;
skipMarket: boolean;
marketFetcher: MarketFetcherV2 | null;
apiVersion: 'v1' | 'v2';
creator: AttachmentCreator;
constructor(options?: PriceCheckQuerierOptions);
priceCheckQuery(query: string, platform?: Platform, options?: PriceCheckOptions): Promise<SummaryV2[]>;
priceCheckQueryString(
query: string,
priorResults?: SummaryV2[],
platform?: Platform,
options?: PriceCheckOptions
): Promise<string>;
priceCheckQueryAttachment(
query: string,
priorResults?: SummaryV2[],
platform?: Platform,
options?: PriceCheckOptions
): Promise<DiscordEmbed[]>;
stopUpdating(): Promise<void>;
}
export interface AttachmentCreator {
attachmentFromComponents(components: SummaryV2[], query: string, platform?: Platform): DiscordEmbed;
}
export interface Settings {
urls: {
market: string;
marketAssets: string;
};
platforms: {
pc: Platform;
ps4: Platform;
playstation: Platform;
xbone: Platform;
xbox: Platform;
xb1: Platform;
swi: Platform;
switch: Platform;
ns: Platform;
market: Record<string, Platform>;
};
timeouts: {
market: number;
};
defaultString: string;
lookupAlias(platformAlias: string, market?: boolean): Platform | undefined;
}
export interface StatisticsCalculator {
calculateStatistics(orders: Order[], options?: CalculateStatisticsOptions): StatisticsData;
getBestOrders(orders: Order[], options?: GetBestOrdersOptions): { buy: Order[]; sell: Order[] };
formatPriceRange(stats: StatisticsData): string;
formatStatistics(stats: StatisticsData, type?: OrderType): string;
}
export { SummaryV2 as Summary };
export default PriceCheckQuerier;
export as namespace NexusQuery;