From 9de5d9301440ec1553d19140998df701e31e822c Mon Sep 17 00:00:00 2001 From: Fleny Date: Fri, 15 Aug 2025 04:21:22 +0200 Subject: [PATCH] feat(bot): Add guildId to ThreadMember (#4335) --- .../channels/THREAD_MEMBERS_UPDATE.ts | 2 +- packages/bot/src/helpers.ts | 15 +++++------ packages/bot/src/transformers.ts | 5 ++-- packages/bot/src/transformers/channel.ts | 3 ++- packages/bot/src/transformers/threadMember.ts | 25 ++++++++++++++++--- 5 files changed, 35 insertions(+), 15 deletions(-) diff --git a/packages/bot/src/handlers/channels/THREAD_MEMBERS_UPDATE.ts b/packages/bot/src/handlers/channels/THREAD_MEMBERS_UPDATE.ts index 480a1cd1a..56af94446 100644 --- a/packages/bot/src/handlers/channels/THREAD_MEMBERS_UPDATE.ts +++ b/packages/bot/src/handlers/channels/THREAD_MEMBERS_UPDATE.ts @@ -9,7 +9,7 @@ export async function handleThreadMembersUpdate(bot: Bot, data: DiscordGatewayPa bot.events.threadMembersUpdate({ id: bot.transformers.snowflake(payload.id), guildId: bot.transformers.snowflake(payload.guild_id), - addedMembers: payload.added_members?.map((member) => bot.transformers.threadMember?.(bot, member)), + addedMembers: payload.added_members?.map((member) => bot.transformers.threadMember?.(bot, member, { guildId: payload.guild_id })), removedMemberIds: payload.removed_member_ids?.map((id) => bot.transformers.snowflake(id)), }) } diff --git a/packages/bot/src/helpers.ts b/packages/bot/src/helpers.ts index 04b7ade9f..51c14f4a8 100644 --- a/packages/bot/src/helpers.ts +++ b/packages/bot/src/helpers.ts @@ -138,6 +138,7 @@ import type { Subscription, Template, ThreadMember, + ThreadMemberTransformerExtra, User, VoiceState, Webhook, @@ -281,7 +282,7 @@ export function createBotHelpers bot.transformers.channel(bot, { guildId, channel: snakelize(thread) })), - members: result.members.map((member) => bot.transformers.threadMember(bot, snakelize(member))), + members: result.members.map((member) => bot.transformers.threadMember(bot, snakelize(member), { guildId })), } }, getApplicationInfo: async () => { @@ -493,11 +494,11 @@ export function createBotHelpers { return bot.transformers.sticker(bot, snakelize(await bot.rest.getSticker(stickerId))) }, - getThreadMember: async (channelId, userId, options) => { - return bot.transformers.threadMember(bot, snakelize(await bot.rest.getThreadMember(channelId, userId, options))) + getThreadMember: async (channelId, userId, options, extra) => { + return bot.transformers.threadMember(bot, snakelize(await bot.rest.getThreadMember(channelId, userId, options)), extra) }, - getThreadMembers: async (channelId, options) => { - return (await bot.rest.getThreadMembers(channelId, options)).map((res) => bot.transformers.threadMember(bot, snakelize(res))) + getThreadMembers: async (channelId, options, extra) => { + return (await bot.rest.getThreadMembers(channelId, options)).map((res) => bot.transformers.threadMember(bot, snakelize(res), extra)) }, getReactions: async (channelId, messageId, reaction, options) => { return (await bot.rest.getReactions(channelId, messageId, reaction, options)).map((res) => bot.transformers.user(bot, snakelize(res))) @@ -1028,8 +1029,8 @@ export type BotHelpers Promise> getUserVoiceState: (guildId: BigString, userId: BigString) => Promise> getSticker: (stickerId: BigString) => Promise> - getThreadMember: (channelId: BigString, userId: BigString, options?: GetThreadMember) => Promise - getThreadMembers: (channelId: BigString, options?: ListThreadMembers) => Promise + getThreadMember: (channelId: BigString, userId: BigString, options?: GetThreadMember, extra?: ThreadMemberTransformerExtra) => Promise + getThreadMembers: (channelId: BigString, options?: ListThreadMembers, extra?: ThreadMemberTransformerExtra) => Promise getReactions: ( channelId: BigString, messageId: BigString, diff --git a/packages/bot/src/transformers.ts b/packages/bot/src/transformers.ts index 8f8eba3da..c592a7440 100644 --- a/packages/bot/src/transformers.ts +++ b/packages/bot/src/transformers.ts @@ -155,6 +155,7 @@ import { type Template, type ThreadMember, type ThreadMemberGuildCreate, + type ThreadMemberTransformerExtra, transformActivity, transformActivityInstance, transformActivityLocation, @@ -415,7 +416,7 @@ export type Transformers, payload: DiscordSubscription, subscription: SetupDesiredProps) => any team: (bot: Bot, payload: DiscordTeam, team: Team) => any template: (bot: Bot, payload: DiscordTemplate, template: Template) => any - threadMember: (bot: Bot, payload: DiscordThreadMember, threadMember: ThreadMember) => any + threadMember: (bot: Bot, payload: DiscordThreadMember, threadMember: ThreadMember, extra?: ThreadMemberTransformerExtra) => any threadMemberGuildCreate: ( bot: Bot, payload: DiscordThreadMemberGuildCreate, @@ -560,7 +561,7 @@ export type Transformers, payload: DiscordSubscription) => SetupDesiredProps team: (bot: Bot, payload: DiscordTeam) => Team template: (bot: Bot, payload: DiscordTemplate) => Template - threadMember: (bot: Bot, payload: DiscordThreadMember) => ThreadMember + threadMember: (bot: Bot, payload: DiscordThreadMember, extra?: ThreadMemberTransformerExtra) => ThreadMember threadMemberGuildCreate: (bot: Bot, payload: DiscordThreadMemberGuildCreate) => ThreadMemberGuildCreate unfurledMediaItem: (bot: Bot, payload: DiscordUnfurledMediaItem) => UnfurledMediaItem user: (bot: Bot, payload: DiscordUser) => SetupDesiredProps diff --git a/packages/bot/src/transformers/channel.ts b/packages/bot/src/transformers/channel.ts index 12cb7f4a9..04b9128dc 100644 --- a/packages/bot/src/transformers/channel.ts +++ b/packages/bot/src/transformers/channel.ts @@ -117,7 +117,8 @@ export function transformChannel(bot: Bot, payload: { channel: DiscordChannel; g if (props.recipients && payload.channel.recipients) channel.recipients = payload.channel.recipients.map((u) => bot.transformers.user(bot, u)) if (props.icon && payload.channel.icon) channel.icon = iconHashToBigInt(payload.channel.icon) if (props.applicationId && payload.channel.application_id) channel.applicationId = bot.transformers.snowflake(payload.channel.application_id) - if (props.member && payload.channel.member) channel.member = bot.transformers.threadMember(bot, payload.channel.member) + if (props.member && payload.channel.member) + channel.member = bot.transformers.threadMember(bot, payload.channel.member, { guildId: payload.guildId }) if (props.totalMessageSent && payload.channel.total_message_sent !== undefined) channel.totalMessageSent = payload.channel.total_message_sent if (props.availableTags && payload.channel.available_tags) channel.availableTags = payload.channel.available_tags.map((x) => bot.transformers.forumTag(bot, x)) diff --git a/packages/bot/src/transformers/threadMember.ts b/packages/bot/src/transformers/threadMember.ts index cd3e3a2a5..15ac93779 100644 --- a/packages/bot/src/transformers/threadMember.ts +++ b/packages/bot/src/transformers/threadMember.ts @@ -1,16 +1,33 @@ -import type { DiscordThreadMember, DiscordThreadMemberGuildCreate } from '@discordeno/types' +import type { BigString, DiscordThreadMember, DiscordThreadMemberGuildCreate } from '@discordeno/types' import type { Bot, ThreadMember, ThreadMemberGuildCreate } from '../index.js' -export function transformThreadMember(bot: Bot, payload: DiscordThreadMember): ThreadMember { +export function transformThreadMember(bot: Bot, payload: DiscordThreadMember, extra?: ThreadMemberTransformerExtra): ThreadMember { const threadMember = { id: payload.id ? bot.transformers.snowflake(payload.id) : undefined, userId: payload.user_id ? bot.transformers.snowflake(payload.user_id) : undefined, joinTimestamp: Date.parse(payload.join_timestamp), flags: payload.flags, - member: payload.member ? bot.transformers.member(bot, payload.member, undefined, bot.transformers.snowflake(payload.user_id)) : undefined, + member: payload.member + ? bot.transformers.member( + bot, + payload.member, + extra?.guildId ? bot.transformers.snowflake(extra.guildId) : undefined, + bot.transformers.snowflake(payload.user_id), + ) + : undefined, } as ThreadMember - return bot.transformers.customizers.threadMember(bot, payload, threadMember) + return bot.transformers.customizers.threadMember(bot, payload, threadMember, extra) +} + +export interface ThreadMemberTransformerExtra { + /** + * Provide this parameter if you want it to be passed down to the `threadMember.member` object (when `withMembers` is set to `true`), + * since Discord does not include a `guildId` in that payload. + * + * This allows you to cache member objects in the member customizer. + */ + guildId?: BigString } export function transformThreadMemberGuildCreate(bot: Bot, payload: DiscordThreadMemberGuildCreate): ThreadMemberGuildCreate {