diff --git a/packages/discord.js/src/managers/EntitlementManager.js b/packages/discord.js/src/managers/EntitlementManager.js index 1456d3719acb..a667b403c056 100644 --- a/packages/discord.js/src/managers/EntitlementManager.js +++ b/packages/discord.js/src/managers/EntitlementManager.js @@ -37,6 +37,12 @@ class EntitlementManager extends CachedManager { * @typedef {SKU|Snowflake} SKUResolvable */ + /** + * Options used to fetch an entitlement + * @typedef {BaseFetchOptions} FetchEntitlementOptions + * @property {EntitlementResolvable} entitlement The entitlement to fetch + */ + /** * Options used to fetch entitlements * @typedef {Object} FetchEntitlementsOptions @@ -45,6 +51,7 @@ class EntitlementManager extends CachedManager { * @property {UserResolvable} [user] The user to fetch entitlements for * @property {SKUResolvable[]} [skus] The SKUs to fetch entitlements for * @property {boolean} [excludeEnded] Whether to exclude ended entitlements + * @property {boolean} [excludeDeleted] Whether to exclude deleted entitlements * @property {boolean} [cache=true] Whether to cache the fetched entitlements * @property {Snowflake} [before] Consider only entitlements before this entitlement id * @property {Snowflake} [after] Consider only entitlements after this entitlement id @@ -53,21 +60,49 @@ class EntitlementManager extends CachedManager { /** * Fetches entitlements for this application - * @param {FetchEntitlementsOptions} [options={}] Options for fetching the entitlements - * @returns {Promise>} + * @param {EntitlementResolvable|FetchEntitlementOptions|FetchEntitlementsOptions} [options] + * Options for fetching the entitlements + * @returns {Promise>} */ - async fetch({ limit, guild, user, skus, excludeEnded, cache = true, before, after } = {}) { + async fetch(options) { + if (!options) return this._fetchMany(options); + const { entitlement, cache, force } = options; + const resolvedEntitlement = this.resolveId(entitlement ?? options); + + if (resolvedEntitlement) { + return this._fetchSingle({ entitlement: resolvedEntitlement, cache, force }); + } + + return this._fetchMany(options); + } + + async _fetchSingle({ entitlement, cache, force = false }) { + if (!force) { + const existing = this.cache.get(entitlement); + + if (existing) { + return existing; + } + } + + const data = await this.client.rest.get(Routes.entitlement(this.client.application.id, entitlement)); + return this._add(data, cache); + } + + async _fetchMany({ limit, guild, user, skus, excludeEnded, excludeDeleted, cache, before, after } = {}) { const query = makeURLSearchParams({ limit, guild_id: guild && this.client.guilds.resolveId(guild), user_id: user && this.client.users.resolveId(user), sku_ids: skus?.map(sku => resolveSKUId(sku)).join(','), exclude_ended: excludeEnded, + exclude_deleted: excludeDeleted, before, after, }); const entitlements = await this.client.rest.get(Routes.entitlements(this.client.application.id), { query }); + return entitlements.reduce( (coll, entitlement) => coll.set(entitlement.id, this._add(entitlement, cache)), new Collection(), diff --git a/packages/discord.js/typings/index.d.ts b/packages/discord.js/typings/index.d.ts index a2c4d3da8cd9..ed49e4a51b5b 100644 --- a/packages/discord.js/typings/index.d.ts +++ b/packages/discord.js/typings/index.d.ts @@ -4147,12 +4147,17 @@ export interface UserEntitlementCreateOptions { user: UserResolvable; } +export interface FetchEntitlementOptions extends BaseFetchOptions { + entitlement: EntitlementResolvable; +} + export interface FetchEntitlementsOptions { limit?: number; guild?: GuildResolvable; user?: UserResolvable; skus?: readonly SKUResolvable[]; excludeEnded?: boolean; + excludeDeleted?: boolean; cache?: boolean; before?: Snowflake; after?: Snowflake; @@ -4160,6 +4165,7 @@ export interface FetchEntitlementsOptions { export class EntitlementManager extends CachedManager { private constructor(client: Client, iterable: Iterable); + public fetch(options: EntitlementResolvable | FetchEntitlementOptions): Promise; public fetch(options?: FetchEntitlementsOptions): Promise>; public createTest(options: GuildEntitlementCreateOptions | UserEntitlementCreateOptions): Promise; public deleteTest(entitlement: EntitlementResolvable): Promise;