refactor(Emoji)!: make imageURL() change extension dynamically (#10613)

BREAKING CHANGE: Image URLs of emojis now automatically return GIF or static extensions.
BREAKING CHANGE: `CDN#emoji()` now has an `animated` required parameter.
This commit is contained in:
Idris
2025-01-16 10:59:28 +01:00
committed by GitHub
parent e2bbfe7b13
commit 0c40bc195e
5 changed files with 29 additions and 12 deletions

View File

@@ -58,7 +58,7 @@ class BaseGuildEmoji extends Emoji {
* @method imageURL * @method imageURL
* @memberof BaseGuildEmoji * @memberof BaseGuildEmoji
* @instance * @instance
* @param {BaseImageURLOptions} [options] Options for the image URL * @param {ImageURLOptions} [options={}] Options for the image URL
* @returns {string} * @returns {string}
*/ */

View File

@@ -42,11 +42,11 @@ class Emoji extends Base {
/** /**
* Returns a URL for the emoji or `null` if this is not a custom emoji. * Returns a URL for the emoji or `null` if this is not a custom emoji.
* @param {BaseImageURLOptions} [options] Options for the image URL * @param {ImageURLOptions} [options={}] Options for the image URL
* @returns {?string} * @returns {?string}
*/ */
imageURL(options) { imageURL(options = {}) {
return this.id && this.client.rest.cdn.emoji(this.id, options); return this.id && this.client.rest.cdn.emoji(this.id, this.animated, options);
} }
/** /**

View File

@@ -634,7 +634,7 @@ export abstract class BaseGuild extends Base {
export class BaseGuildEmoji extends Emoji { export class BaseGuildEmoji extends Emoji {
protected constructor(client: Client<true>, data: RawGuildEmojiData, guild: Guild | GuildPreview); protected constructor(client: Client<true>, data: RawGuildEmojiData, guild: Guild | GuildPreview);
public imageURL(options?: BaseImageURLOptions): string; public imageURL(options?: ImageURLOptions): string;
public get url(): string; public get url(): string;
public available: boolean | null; public available: boolean | null;
public get createdAt(): Date; public get createdAt(): Date;
@@ -1333,7 +1333,7 @@ export class Emoji extends Base {
public id: Snowflake | null; public id: Snowflake | null;
public name: string | null; public name: string | null;
public get identifier(): string; public get identifier(): string;
public imageURL(options?: BaseImageURLOptions): string | null; public imageURL(options?: ImageURLOptions): string | null;
public get url(): string | null; public get url(): string | null;
public toJSON(): unknown; public toJSON(): unknown;
public toString(): string; public toString(): string;

View File

@@ -50,12 +50,28 @@ test('discoverySplash default', () => {
expect(cdn.discoverySplash(id, hash)).toEqual(`${baseCDN}/discovery-splashes/${id}/${hash}.webp`); expect(cdn.discoverySplash(id, hash)).toEqual(`${baseCDN}/discovery-splashes/${id}/${hash}.webp`);
}); });
test('emoji default', () => { test('emoji static', () => {
expect(cdn.emoji(id)).toEqual(`${baseCDN}/emojis/${id}.webp`); expect(cdn.emoji(id, false)).toEqual(`${baseCDN}/emojis/${id}.webp`);
}); });
test('emoji gif', () => { test('emoji static with JPG extension', () => {
expect(cdn.emoji(id, { extension: 'gif' })).toEqual(`${baseCDN}/emojis/${id}.gif`); expect(cdn.emoji(id, false, { extension: 'jpg' })).toEqual(`${baseCDN}/emojis/${id}.jpg`);
});
test('emoji static with JPG extension with force static', () => {
expect(cdn.emoji(id, false, { extension: 'jpg', forceStatic: true })).toEqual(`${baseCDN}/emojis/${id}.jpg`);
});
test('emoji animated', () => {
expect(cdn.emoji(id, true)).toEqual(`${baseCDN}/emojis/${id}.gif`);
});
test('emoji animated with JPG extension', () => {
expect(cdn.emoji(id, true, { extension: 'jpg' })).toEqual(`${baseCDN}/emojis/${id}.gif`);
});
test('emoji animated with JPG extension with force static', () => {
expect(cdn.emoji(id, true, { extension: 'jpg', forceStatic: true })).toEqual(`${baseCDN}/emojis/${id}.jpg`);
}); });
test('guildMemberAvatar default', () => { test('guildMemberAvatar default', () => {

View File

@@ -161,10 +161,11 @@ export class CDN {
* Generates an emoji's URL. * Generates an emoji's URL.
* *
* @param emojiId - The emoji id * @param emojiId - The emoji id
* @param animated - Whether the emoji is animated
* @param options - Optional options for the emoji * @param options - Optional options for the emoji
*/ */
public emoji(emojiId: string, options?: Readonly<BaseImageURLOptions>): string { public emoji(emojiId: string, animated: boolean, options?: Readonly<ImageURLOptions>): string {
return this.makeURL(`/emojis/${emojiId}`, options); return this.dynamicMakeURL(`/emojis/${emojiId}`, animated ? 'a_' : '', options);
} }
/** /**