diff --git a/src/structures/User.js b/src/structures/User.js index a991a80c5..56a6ecf2d 100644 --- a/src/structures/User.js +++ b/src/structures/User.js @@ -122,6 +122,16 @@ class User extends Base { */ this.flags = new UserFlags(data.public_flags); } + + if ('avatar_decoration' in data) { + /** + * The user avatar decoration's hash + * @type {?string} + */ + this.avatarDecoration = data.avatar_decoration; + } else { + this.avatarDecoration ??= null; + } } /** @@ -161,6 +171,16 @@ class User extends Base { return this.client.rest.cdn.Avatar(this.id, this.avatar, format, size, dynamic); } + /** + * A link to the user's avatar decoration. + * @param {StaticImageURLOptions} [options={}] Options for the image URL + * @returns {?string} + */ + avatarDecorationURL({ format, size } = {}) { + if (!this.avatarDecoration) return null; + return this.client.rest.cdn.AvatarDecoration(this.id, this.avatarDecoration, format, size); + } + /** * A link to the user's default avatar * @type {string} diff --git a/src/util/Constants.js b/src/util/Constants.js index e3a86cf05..5a293dcfa 100644 --- a/src/util/Constants.js +++ b/src/util/Constants.js @@ -73,6 +73,8 @@ exports.Endpoints = { if (dynamic && hash.startsWith('a_')) format = 'gif'; return makeImageUrl(`${root}/avatars/${userId}/${hash}`, { format, size }); }, + AvatarDecoration: (userId, hash, format = 'png', size) => + makeImageUrl(`${root}/avatar-decorations/${userId}/${hash}`, { format, size }), GuildMemberAvatar: (guildId, memberId, hash, format = 'webp', size, dynamic = false) => { if (dynamic && hash.startsWith('a_')) format = 'gif'; return makeImageUrl(`${root}/guilds/${guildId}/users/${memberId}/avatars/${hash}`, { format, size }); diff --git a/typings/index.d.ts b/typings/index.d.ts index b53d3e667..5dc7baf22 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -2698,6 +2698,7 @@ export class User extends PartialTextBasedChannel(Base) { public accentColor: number | null | undefined; public avatar: string | null; + public avatarDecoration: string | null; public banner: string | null | undefined; public bot: boolean; public readonly createdAt: Date; @@ -2715,6 +2716,7 @@ export class User extends PartialTextBasedChannel(Base) { public readonly tag: string; public username: string; public avatarURL(options?: ImageURLOptions): string | null; + public avatarDecorationURL(options?: StaticImageURLOptions): string | null; public bannerURL(options?: ImageURLOptions): string | null; public createDM(force?: boolean): Promise; public deleteDM(): Promise; @@ -3095,6 +3097,7 @@ export const Constants: { size: AllowedImageSize, dynamic: boolean, ): string; + AvatarDecoration(userId: Snowflake, hash: string, format: AllowedImageFormat, size: AllowedImageSize): string; Banner(id: Snowflake, hash: string, format: DynamicImageFormat, size: AllowedImageSize, dynamic: boolean): string; DefaultAvatar(index: number): string; DiscoverySplash(guildId: Snowflake, hash: string, format: AllowedImageFormat, size: AllowedImageSize): string;