From d713d090642c862b30a2c5cac03e090fd58bdc91 Mon Sep 17 00:00:00 2001 From: Fleny Date: Mon, 11 Aug 2025 18:41:50 +0200 Subject: [PATCH] fix(types)!: Fix nullability for DiscordEmoji (#4285) * Fix nullability for DiscordEmoji * Fix type errors, use actual DiscordEmoji for partial emojis * Apply code review suggestions --- .../benchmarks/src/benchmarks/transformers.ts | 1 + .../handlers/messages/MESSAGE_REACTION_ADD.ts | 1 + .../messages/MESSAGE_REACTION_REMOVE.ts | 1 + .../messages/MESSAGE_REACTION_REMOVE_EMOJI.ts | 1 + packages/bot/src/transformers/component.ts | 2 +- packages/bot/src/transformers/message.ts | 1 + .../bot/src/transformers/reverse/component.ts | 8 ++++---- .../bot/src/transformers/reverse/emoji.ts | 4 ++-- packages/types/src/discord/components.ts | 19 +++---------------- packages/types/src/discord/emoji.ts | 11 ++++++++--- 10 files changed, 23 insertions(+), 26 deletions(-) diff --git a/packages/benchmarks/src/benchmarks/transformers.ts b/packages/benchmarks/src/benchmarks/transformers.ts index d7b2f0684..c479ec1ae 100644 --- a/packages/benchmarks/src/benchmarks/transformers.ts +++ b/packages/benchmarks/src/benchmarks/transformers.ts @@ -399,6 +399,7 @@ function oldtransformMessage(bot: Bot, payload: DiscordMessage): any { reactions: payload.reactions?.map((reaction) => ({ me: reaction.me, count: reaction.count, + // @ts-expect-error: TODO: Deal with partials emoji: bot.transformers.emoji(bot, reaction.emoji), })), type: payload.type, diff --git a/packages/bot/src/handlers/messages/MESSAGE_REACTION_ADD.ts b/packages/bot/src/handlers/messages/MESSAGE_REACTION_ADD.ts index cdea6b723..2010277aa 100644 --- a/packages/bot/src/handlers/messages/MESSAGE_REACTION_ADD.ts +++ b/packages/bot/src/handlers/messages/MESSAGE_REACTION_ADD.ts @@ -15,6 +15,7 @@ export async function handleMessageReactionAdd(bot: Bot, data: DiscordGatewayPay guildId, member: payload.member && guildId ? bot.transformers.member(bot, payload.member, guildId, userId) : undefined, user: payload.member ? bot.transformers.user(bot, payload.member.user) : undefined, + // @ts-expect-error TODO: Deal with partials emoji: bot.transformers.emoji(bot, payload.emoji), messageAuthorId: payload.message_author_id ? bot.transformers.snowflake(payload.message_author_id) : undefined, burst: payload.burst, diff --git a/packages/bot/src/handlers/messages/MESSAGE_REACTION_REMOVE.ts b/packages/bot/src/handlers/messages/MESSAGE_REACTION_REMOVE.ts index 91b5853c8..7e4a6b41d 100644 --- a/packages/bot/src/handlers/messages/MESSAGE_REACTION_REMOVE.ts +++ b/packages/bot/src/handlers/messages/MESSAGE_REACTION_REMOVE.ts @@ -11,6 +11,7 @@ export async function handleMessageReactionRemove(bot: Bot, data: DiscordGateway channelId: bot.transformers.snowflake(payload.channel_id), messageId: bot.transformers.snowflake(payload.message_id), guildId: payload.guild_id ? bot.transformers.snowflake(payload.guild_id) : undefined, + // @ts-expect-error TODO: Deal with partials emoji: bot.transformers.emoji(bot, payload.emoji), burst: payload.burst, }) diff --git a/packages/bot/src/handlers/messages/MESSAGE_REACTION_REMOVE_EMOJI.ts b/packages/bot/src/handlers/messages/MESSAGE_REACTION_REMOVE_EMOJI.ts index 4d5980be0..23741a16e 100644 --- a/packages/bot/src/handlers/messages/MESSAGE_REACTION_REMOVE_EMOJI.ts +++ b/packages/bot/src/handlers/messages/MESSAGE_REACTION_REMOVE_EMOJI.ts @@ -10,6 +10,7 @@ export async function handleMessageReactionRemoveEmoji(bot: Bot, data: DiscordGa channelId: bot.transformers.snowflake(payload.channel_id), messageId: bot.transformers.snowflake(payload.message_id), guildId: payload.guild_id ? bot.transformers.snowflake(payload.guild_id) : undefined, + // @ts-expect-error TODO: Deal with partials emoji: bot.transformers.emoji(bot, payload.emoji), }) } diff --git a/packages/bot/src/transformers/component.ts b/packages/bot/src/transformers/component.ts index d8aeb5477..dc158684f 100644 --- a/packages/bot/src/transformers/component.ts +++ b/packages/bot/src/transformers/component.ts @@ -177,7 +177,7 @@ function transformSelectMenuComponent(bot: Bot, payload: DiscordSelectMenuCompon emoji: option.emoji ? { id: option.emoji.id ? bot.transformers.snowflake(option.emoji.id) : undefined, - name: option.emoji.name, + name: option.emoji.name ?? undefined, animated: option.emoji.animated, } : undefined, diff --git a/packages/bot/src/transformers/message.ts b/packages/bot/src/transformers/message.ts index 2684866ea..4fd184973 100644 --- a/packages/bot/src/transformers/message.ts +++ b/packages/bot/src/transformers/message.ts @@ -244,6 +244,7 @@ export function transformMessage( burst: reaction.count_details.burst, normal: reaction.count_details.normal, }, + // @ts-expect-error TODO: Deal with partials emoji: bot.transformers.emoji(bot, reaction.emoji), burstColors: reaction.burst_colors, })) diff --git a/packages/bot/src/transformers/reverse/component.ts b/packages/bot/src/transformers/reverse/component.ts index 9510d776b..21ab3b522 100644 --- a/packages/bot/src/transformers/reverse/component.ts +++ b/packages/bot/src/transformers/reverse/component.ts @@ -99,8 +99,8 @@ function transformButtonComponent(bot: Bot, payload: Component): DiscordButtonCo disabled: payload.disabled, emoji: payload.emoji ? { - id: payload.emoji.id ? bot.transformers.reverse.snowflake(payload.emoji.id) : undefined, - name: payload.emoji.name, + id: payload.emoji.id ? bot.transformers.reverse.snowflake(payload.emoji.id) : null, + name: payload.emoji.name ?? null, animated: payload.emoji.animated, } : undefined, @@ -145,8 +145,8 @@ function transformSelectMenuComponent(bot: Bot, payload: Component): DiscordSele description: option.description, emoji: option.emoji ? { - id: option.emoji.id ? bot.transformers.reverse.snowflake(option.emoji.id) : undefined, - name: option.emoji.name, + id: option.emoji.id ? bot.transformers.reverse.snowflake(option.emoji.id) : null, + name: option.emoji.name ?? null, animated: option.emoji.animated, } : undefined, diff --git a/packages/bot/src/transformers/reverse/emoji.ts b/packages/bot/src/transformers/reverse/emoji.ts index ede0ba2df..103ca646f 100644 --- a/packages/bot/src/transformers/reverse/emoji.ts +++ b/packages/bot/src/transformers/reverse/emoji.ts @@ -3,8 +3,8 @@ import type { Emoji, InternalBot } from '../../index.js' export function transformEmojiToDiscordEmoji(bot: InternalBot, payload: Emoji): DiscordEmoji { return { - id: payload.id ? bot.transformers.reverse.snowflake(payload.id) : undefined, - name: payload.name ?? undefined, + id: payload.id ? bot.transformers.reverse.snowflake(payload.id) : null, + name: payload.name ?? null, roles: payload.roles?.map((id) => bot.transformers.reverse.snowflake(id)), user: payload.user ? bot.transformers.reverse.user(bot, payload.user) : undefined, require_colons: payload.toggles.requireColons, diff --git a/packages/types/src/discord/components.ts b/packages/types/src/discord/components.ts index 3e23113db..8c48cd150 100644 --- a/packages/types/src/discord/components.ts +++ b/packages/types/src/discord/components.ts @@ -1,6 +1,7 @@ /** Types for: https://discord.com/developers/docs/components/reference */ import type { ChannelTypes } from './channel.js' +import type { DiscordEmoji } from './emoji.js' /** https://discord.com/developers/docs/components/reference#component-object-component-types */ export enum MessageComponentTypes { @@ -91,14 +92,7 @@ export interface DiscordButtonComponent extends DiscordBaseComponent { * @remarks * A button of style {@link ButtonStyles.Premium | Premium} cannot have an emoji */ - emoji?: { - /** Emoji id */ - id?: string - /** Emoji name */ - name?: string - /** Whether this emoji is animated */ - animated?: boolean - } + emoji?: Pick /** * A dev-defined unique string sent on click (max 100 characters). * @@ -193,14 +187,7 @@ export interface DiscordSelectOption { /** An additional description of the option. Maximum 50 characters. */ description?: string /** The id, name, and animated properties of an emoji. */ - emoji?: { - /** Emoji id */ - id?: string - /** Emoji name */ - name?: string - /** Whether this emoji is animated */ - animated?: boolean - } + emoji?: Pick /** Will render this option as already-selected by default. */ default?: boolean } diff --git a/packages/types/src/discord/emoji.ts b/packages/types/src/discord/emoji.ts index 4f8ccc1af..528de4639 100644 --- a/packages/types/src/discord/emoji.ts +++ b/packages/types/src/discord/emoji.ts @@ -4,10 +4,15 @@ import type { DiscordUser } from './user.js' /** https://discord.com/developers/docs/resources/emoji#emoji-object-emoji-structure */ export interface DiscordEmoji { - /** Emoji name (can only be null in reaction emoji objects) */ - name?: string /** Emoji id */ - id?: string + id: string | null + /** + * Emoji name + * + * @remarks + * Can be null only in reaction emoji objects + */ + name: string | null /** Roles allowed to use this emoji */ roles?: string[] /** User that created this emoji */