diff --git a/packages/bot/src/handlers/interactions/INTERACTION_CREATE.ts b/packages/bot/src/handlers/interactions/INTERACTION_CREATE.ts index eebb98cf4..dc9314f62 100644 --- a/packages/bot/src/handlers/interactions/INTERACTION_CREATE.ts +++ b/packages/bot/src/handlers/interactions/INTERACTION_CREATE.ts @@ -1,8 +1,13 @@ import type { DiscordGatewayPayload, DiscordInteraction } from '@discordeno/types' import type { Bot } from '../../index.js' -export async function handleInteractionCreate(bot: Bot, data: DiscordGatewayPayload): Promise { +export async function handleInteractionCreate(bot: Bot, data: DiscordGatewayPayload, shardId: number): Promise { if (!bot.events.interactionCreate) return - bot.events.interactionCreate(bot.transformers.interaction(bot, data.d as DiscordInteraction)) + bot.events.interactionCreate( + bot.transformers.interaction(bot, { + interaction: data.d as DiscordInteraction, + shardId, + }), + ) } diff --git a/packages/bot/src/transformers.ts b/packages/bot/src/transformers.ts index d5246aa1d..75a91bd73 100644 --- a/packages/bot/src/transformers.ts +++ b/packages/bot/src/transformers.ts @@ -130,7 +130,7 @@ import type { BotInteractionResponse, DiscordComponent, DiscordInteractionRespon export interface Transformers { customizers: { channel: (bot: Bot, payload: DiscordChannel, channel: Channel) => any - interaction: (bot: Bot, payload: DiscordInteraction, interaction: Interaction) => any + interaction: (bot: Bot, payload: { interaction: DiscordInteraction; shardId: number }, interaction: Interaction) => any message: (bot: Bot, payload: DiscordMessage, message: Message) => any messageInteractionMetadata: (bot: Bot, payload: DiscordMessageInteractionMetadata, metadata: MessageInteractionMetadata) => any messageCall: (bot: Bot, payload: DiscordMessageCall, call: MessageCall) => any @@ -300,6 +300,7 @@ export interface Transformers { id: boolean applicationId: boolean type: boolean + guild: boolean guildId: boolean channel: boolean channelId: boolean @@ -602,7 +603,7 @@ export interface Transformers { messageCall: (bot: Bot, payload: DiscordMessageCall) => MessageCall role: (bot: Bot, payload: { role: DiscordRole } & { guildId: BigString }) => Role voiceState: (bot: Bot, payload: { voiceState: DiscordVoiceState } & { guildId: bigint }) => VoiceState - interaction: (bot: Bot, payload: DiscordInteraction) => Interaction + interaction: (bot: Bot, payload: { interaction: DiscordInteraction; shardId: number }) => Interaction interactionDataOptions: (bot: Bot, payload: DiscordInteractionDataOption) => InteractionDataOption integration: (bot: Bot, payload: DiscordIntegrationCreateUpdate) => Integration invite: (bot: Bot, payload: { invite: DiscordInviteCreate | DiscordInviteMetadata; shardId: number }) => Invite @@ -919,6 +920,7 @@ export function createTransformers(options: Partial, opts?: Create id: opts?.defaultDesiredPropertiesValue ?? false, applicationId: opts?.defaultDesiredPropertiesValue ?? false, type: opts?.defaultDesiredPropertiesValue ?? false, + guild: opts?.defaultDesiredPropertiesValue ?? false, guildId: opts?.defaultDesiredPropertiesValue ?? false, channel: opts?.defaultDesiredPropertiesValue ?? false, channelId: opts?.defaultDesiredPropertiesValue ?? false, diff --git a/packages/bot/src/transformers/interaction.ts b/packages/bot/src/transformers/interaction.ts index 624f5a7fa..821dda38d 100644 --- a/packages/bot/src/transformers/interaction.ts +++ b/packages/bot/src/transformers/interaction.ts @@ -19,6 +19,7 @@ import { type Component, type DiscordChannel, type DiscordInteractionContextType, + type Guild, } from '../index.js' import type { DiscordInteractionDataResolved } from '../typings.js' import type { Attachment } from './attachment.js' @@ -38,6 +39,8 @@ export interface Interaction extends BaseInteraction { applicationId: bigint /** The type of interaction */ type: InteractionTypes + /** Guild that the interaction was sent from */ + guild: Guild /** The guild it was sent from */ guildId?: bigint /** The channel it was sent from */ @@ -204,55 +207,62 @@ const baseInteraction: Partial & BaseInteraction = { }, } -export function transformInteraction(bot: Bot, payload: DiscordInteraction): Interaction { - const guildId = payload.guild_id ? bot.transformers.snowflake(payload.guild_id) : undefined - const user = bot.transformers.user(bot, payload.member?.user ?? payload.user!) +export function transformInteraction(bot: Bot, payload: { interaction: DiscordInteraction; shardId: number }): Interaction { + const guildId = payload.interaction.guild_id ? bot.transformers.snowflake(payload.interaction.guild_id) : undefined + const user = bot.transformers.user(bot, payload.interaction.member?.user ?? payload.interaction.user!) const interaction: Interaction = Object.create(baseInteraction) const props = bot.transformers.desiredProperties.interaction interaction.bot = bot interaction.acknowledged = false - if (props.id && payload.id) interaction.id = bot.transformers.snowflake(payload.id) - if (props.applicationId && payload.application_id) interaction.applicationId = bot.transformers.snowflake(payload.application_id) - if (props.type && payload.type) interaction.type = payload.type - if (props.token && payload.token) interaction.token = payload.token - if (props.version && payload.version) interaction.version = payload.version - if (props.locale && payload.locale) interaction.locale = payload.locale - if (props.guildLocale && payload.guild_locale) interaction.guildLocale = payload.guild_locale + if (props.id && payload.interaction.id) interaction.id = bot.transformers.snowflake(payload.interaction.id) + if (props.applicationId && payload.interaction.application_id) + interaction.applicationId = bot.transformers.snowflake(payload.interaction.application_id) + if (props.type && payload.interaction.type) interaction.type = payload.interaction.type + if (props.token && payload.interaction.token) interaction.token = payload.interaction.token + if (props.version && payload.interaction.version) interaction.version = payload.interaction.version + if (props.locale && payload.interaction.locale) interaction.locale = payload.interaction.locale + if (props.guildLocale && payload.interaction.guild_locale) interaction.guildLocale = payload.interaction.guild_locale + if (props.guild && payload.interaction.guild) + // @ts-expect-error payload.interaction.guild is a Partial + interaction.guild = bot.transformers.guild(bot, { guild: payload.interaction.guild, shardId: payload.shardId }) if (props.guildId && guildId) interaction.guildId = guildId if (props.user && user) interaction.user = user - if (props.appPermissions && payload.app_permissions) interaction.appPermissions = bot.transformers.snowflake(payload.app_permissions) - if (props.message && payload.message) interaction.message = bot.transformers.message(bot, payload.message) - if (props.channel && payload.channel) interaction.channel = bot.transformers.channel(bot, { channel: payload.channel as DiscordChannel, guildId }) - if (props.channelId && payload.channel_id) interaction.channelId = bot.transformers.snowflake(payload.channel_id) - if (props.member && guildId && payload.member) interaction.member = bot.transformers.member(bot, payload.member, guildId, user.id) - if (props.authorizingIntegrationOwners && payload.authorizing_integration_owners) { + if (props.appPermissions && payload.interaction.app_permissions) + interaction.appPermissions = bot.transformers.snowflake(payload.interaction.app_permissions) + if (props.message && payload.interaction.message) interaction.message = bot.transformers.message(bot, payload.interaction.message) + if (props.channel && payload.interaction.channel) + interaction.channel = bot.transformers.channel(bot, { channel: payload.interaction.channel as DiscordChannel, guildId }) + if (props.channelId && payload.interaction.channel_id) interaction.channelId = bot.transformers.snowflake(payload.interaction.channel_id) + if (props.member && guildId && payload.interaction.member) + interaction.member = bot.transformers.member(bot, payload.interaction.member, guildId, user.id) + if (props.authorizingIntegrationOwners && payload.interaction.authorizing_integration_owners) { interaction.authorizingIntegrationOwners = {} - if (payload.authorizing_integration_owners['0']) + if (payload.interaction.authorizing_integration_owners['0']) interaction.authorizingIntegrationOwners[DiscordApplicationIntegrationType.GuildInstall] = bot.transformers.snowflake( - payload.authorizing_integration_owners['0'], + payload.interaction.authorizing_integration_owners['0'], ) - if (payload.authorizing_integration_owners['1']) + if (payload.interaction.authorizing_integration_owners['1']) interaction.authorizingIntegrationOwners[DiscordApplicationIntegrationType.UserInstall] = bot.transformers.snowflake( - payload.authorizing_integration_owners['1'], + payload.interaction.authorizing_integration_owners['1'], ) } - if (props.context && payload.context) interaction.context = payload.context - if (props.data && payload.data) { + if (props.context && payload.interaction.context) interaction.context = payload.interaction.context + if (props.data && payload.interaction.data) { interaction.data = { - type: payload.data.type, - componentType: payload.data.component_type, - customId: payload.data.custom_id, - components: payload.data.components?.map((component) => bot.transformers.component(bot, component)), - values: payload.data.values, - id: payload.data.id ? bot.transformers.snowflake(payload.data.id) : undefined, - name: payload.data.name, - resolved: payload.data.resolved ? transformInteractionDataResolved(bot, payload.data.resolved, guildId) : undefined, - options: payload.data.options?.map((opt) => bot.transformers.interactionDataOptions(bot, opt)), - targetId: payload.data.target_id ? bot.transformers.snowflake(payload.data.target_id) : undefined, - // guildId: payload.data.guild_id ? bot.transformers.snowflake(payload.data.guild_id) : undefined, + type: payload.interaction.data.type, + componentType: payload.interaction.data.component_type, + customId: payload.interaction.data.custom_id, + components: payload.interaction.data.components?.map((component) => bot.transformers.component(bot, component)), + values: payload.interaction.data.values, + id: payload.interaction.data.id ? bot.transformers.snowflake(payload.interaction.data.id) : undefined, + name: payload.interaction.data.name, + resolved: payload.interaction.data.resolved ? transformInteractionDataResolved(bot, payload.interaction.data.resolved, guildId) : undefined, + options: payload.interaction.data.options?.map((opt) => bot.transformers.interactionDataOptions(bot, opt)), + targetId: payload.interaction.data.target_id ? bot.transformers.snowflake(payload.interaction.data.target_id) : undefined, + // guildId: payload.interaction.data.guild_id ? bot.transformers.snowflake(payload.interaction.data.guild_id) : undefined, } } diff --git a/packages/types/src/discord.ts b/packages/types/src/discord.ts index fb5afe958..2a89f980d 100644 --- a/packages/types/src/discord.ts +++ b/packages/types/src/discord.ts @@ -1794,6 +1794,8 @@ export interface DiscordInteraction { application_id: string /** The type of interaction */ type: InteractionTypes + /** Guild that the interaction was sent from */ + guild?: Partial /** The guild it was sent from */ guild_id?: string /** The channel it was sent from */