diff --git a/packages/benchmarks/src/benchmarks/transformers.ts b/packages/benchmarks/src/benchmarks/transformers.ts index 9bd55e001..1379d9510 100644 --- a/packages/benchmarks/src/benchmarks/transformers.ts +++ b/packages/benchmarks/src/benchmarks/transformers.ts @@ -103,7 +103,7 @@ await memoryBenchmark( () => ({ cache: [] as any[], }), // function returns a new instance of object wanted to test with - (object, event: DiscordMessage) => object.cache.push(bot.transformers.message(bot, { message: event, shardId: 0 })), + (object, event: DiscordMessage) => object.cache.push(bot.transformers.message(bot, event)), // function specify how to add event to the object/ run the object [...new Array(MESSAGE_SIZE)].map( () => @@ -442,7 +442,7 @@ function oldtransformMessage(bot: Bot, payload: DiscordMessage): any { : undefined, } : undefined, - thread: payload.thread ? bot.transformers.channel(bot, { channel: payload.thread, guildId }) : undefined, + thread: payload.thread ? bot.transformers.channel(bot, payload.thread, { guildId }) : undefined, components: payload.components?.map((component) => bot.transformers.component(bot, component)), stickerItems: payload.sticker_items?.map((sticker) => ({ id: bot.transformers.snowflake(sticker.id), diff --git a/packages/bot/src/handlers/channels/CHANNEL_CREATE.ts b/packages/bot/src/handlers/channels/CHANNEL_CREATE.ts index 89d13a4c2..eb6028264 100644 --- a/packages/bot/src/handlers/channels/CHANNEL_CREATE.ts +++ b/packages/bot/src/handlers/channels/CHANNEL_CREATE.ts @@ -4,10 +4,7 @@ export async function handleChannelCreate(bot: Bot, payload: DiscordGatewayPaylo if (!bot.events.channelCreate) return const data = payload.d as DiscordChannel - const channel = bot.transformers.channel(bot, { - channel: data, - guildId: data.guild_id ? bot.transformers.snowflake(data.guild_id) : undefined, - }) + const channel = bot.transformers.channel(bot, data, { guildId: data.guild_id }) bot.events.channelCreate(channel) } diff --git a/packages/bot/src/handlers/channels/CHANNEL_DELETE.ts b/packages/bot/src/handlers/channels/CHANNEL_DELETE.ts index 0f3c9d345..cbf477771 100644 --- a/packages/bot/src/handlers/channels/CHANNEL_DELETE.ts +++ b/packages/bot/src/handlers/channels/CHANNEL_DELETE.ts @@ -6,10 +6,5 @@ export async function handleChannelDelete(bot: Bot, data: DiscordGatewayPayload) const payload = data.d as DiscordChannel - bot.events.channelDelete( - bot.transformers.channel(bot, { - channel: payload, - guildId: payload.guild_id ? bot.transformers.snowflake(payload.guild_id) : undefined, - }), - ) + bot.events.channelDelete(bot.transformers.channel(bot, payload, { guildId: payload.guild_id })) } diff --git a/packages/bot/src/handlers/channels/CHANNEL_UPDATE.ts b/packages/bot/src/handlers/channels/CHANNEL_UPDATE.ts index 464e616f9..e787b10e7 100644 --- a/packages/bot/src/handlers/channels/CHANNEL_UPDATE.ts +++ b/packages/bot/src/handlers/channels/CHANNEL_UPDATE.ts @@ -5,7 +5,7 @@ export async function handleChannelUpdate(bot: Bot, data: DiscordGatewayPayload) if (!bot.events.channelUpdate) return const payload = data.d as DiscordChannel - const channel = bot.transformers.channel(bot, { channel: payload }) + const channel = bot.transformers.channel(bot, payload) bot.events.channelUpdate(channel) } diff --git a/packages/bot/src/handlers/channels/THREAD_CREATE.ts b/packages/bot/src/handlers/channels/THREAD_CREATE.ts index 8f82e5d72..b75cb6b38 100644 --- a/packages/bot/src/handlers/channels/THREAD_CREATE.ts +++ b/packages/bot/src/handlers/channels/THREAD_CREATE.ts @@ -6,5 +6,5 @@ export async function handleThreadCreate(bot: Bot, data: DiscordGatewayPayload): const payload = data.d as DiscordChannel - bot.events.threadCreate(bot.transformers.channel(bot, { channel: payload })) + bot.events.threadCreate(bot.transformers.channel(bot, payload)) } diff --git a/packages/bot/src/handlers/channels/THREAD_DELETE.ts b/packages/bot/src/handlers/channels/THREAD_DELETE.ts index 1e3901ad6..9c0d20dcc 100644 --- a/packages/bot/src/handlers/channels/THREAD_DELETE.ts +++ b/packages/bot/src/handlers/channels/THREAD_DELETE.ts @@ -6,5 +6,5 @@ export async function handleThreadDelete(bot: Bot, data: DiscordGatewayPayload): const payload = data.d as DiscordChannel - bot.events.threadDelete(bot.transformers.channel(bot, { channel: payload })) + bot.events.threadDelete(bot.transformers.channel(bot, payload)) } diff --git a/packages/bot/src/handlers/channels/THREAD_LIST_SYNC.ts b/packages/bot/src/handlers/channels/THREAD_LIST_SYNC.ts index cfb03dcb6..3af2fc59b 100644 --- a/packages/bot/src/handlers/channels/THREAD_LIST_SYNC.ts +++ b/packages/bot/src/handlers/channels/THREAD_LIST_SYNC.ts @@ -11,7 +11,7 @@ export async function handleThreadListSync(bot: Bot, data: DiscordGatewayPayload bot.events.threadListSync({ guildId, channelIds: payload.channel_ids?.map((id) => bot.transformers.snowflake(id)), - threads: payload.threads.map((thread) => bot.transformers.channel(bot, { channel: thread, guildId })), + threads: payload.threads.map((thread) => bot.transformers.channel(bot, thread, { guildId })), members: payload.members.map((member) => ({ id: member.id ? bot.transformers.snowflake(member.id) : undefined, userId: member.user_id ? bot.transformers.snowflake(member.user_id) : undefined, diff --git a/packages/bot/src/handlers/channels/THREAD_UPDATE.ts b/packages/bot/src/handlers/channels/THREAD_UPDATE.ts index 488e8a2fb..13ef9f34e 100644 --- a/packages/bot/src/handlers/channels/THREAD_UPDATE.ts +++ b/packages/bot/src/handlers/channels/THREAD_UPDATE.ts @@ -6,5 +6,5 @@ export async function handleThreadUpdate(bot: Bot, data: DiscordGatewayPayload): const payload = data.d as DiscordChannel - bot.events.threadUpdate(bot.transformers.channel(bot, { channel: payload })) + bot.events.threadUpdate(bot.transformers.channel(bot, payload)) } diff --git a/packages/bot/src/handlers/guilds/GUILD_CREATE.ts b/packages/bot/src/handlers/guilds/GUILD_CREATE.ts index 90e7cdbc7..aad323629 100644 --- a/packages/bot/src/handlers/guilds/GUILD_CREATE.ts +++ b/packages/bot/src/handlers/guilds/GUILD_CREATE.ts @@ -5,5 +5,5 @@ export async function handleGuildCreate(bot: Bot, data: DiscordGatewayPayload, s if (!bot.events.guildCreate) return const payload = data.d as DiscordGuild - bot.events.guildCreate(bot.transformers.guild(bot, { guild: payload, shardId })) + bot.events.guildCreate(bot.transformers.guild(bot, payload, { shardId })) } diff --git a/packages/bot/src/handlers/guilds/GUILD_UPDATE.ts b/packages/bot/src/handlers/guilds/GUILD_UPDATE.ts index 43bd37f4a..18fe12855 100644 --- a/packages/bot/src/handlers/guilds/GUILD_UPDATE.ts +++ b/packages/bot/src/handlers/guilds/GUILD_UPDATE.ts @@ -6,5 +6,5 @@ export async function handleGuildUpdate(bot: Bot, data: DiscordGatewayPayload, s const payload = data.d as DiscordGuild - bot.events.guildUpdate(bot.transformers.guild(bot, { guild: payload, shardId })) + bot.events.guildUpdate(bot.transformers.guild(bot, payload, { shardId })) } diff --git a/packages/bot/src/handlers/interactions/INTERACTION_CREATE.ts b/packages/bot/src/handlers/interactions/INTERACTION_CREATE.ts index dc9314f62..6f42c2e69 100644 --- a/packages/bot/src/handlers/interactions/INTERACTION_CREATE.ts +++ b/packages/bot/src/handlers/interactions/INTERACTION_CREATE.ts @@ -4,10 +4,7 @@ import type { Bot } from '../../index.js' export async function handleInteractionCreate(bot: Bot, data: DiscordGatewayPayload, shardId: number): Promise { if (!bot.events.interactionCreate) return - bot.events.interactionCreate( - bot.transformers.interaction(bot, { - interaction: data.d as DiscordInteraction, - shardId, - }), - ) + const payload = data.d as DiscordInteraction + + bot.events.interactionCreate(bot.transformers.interaction(bot, payload, { shardId })) } diff --git a/packages/bot/src/handlers/invites/INVITE_CREATE.ts b/packages/bot/src/handlers/invites/INVITE_CREATE.ts index b0b85fee1..12a5c3d2e 100644 --- a/packages/bot/src/handlers/invites/INVITE_CREATE.ts +++ b/packages/bot/src/handlers/invites/INVITE_CREATE.ts @@ -4,5 +4,7 @@ import type { Bot } from '../../index.js' export async function handleInviteCreate(bot: Bot, data: DiscordGatewayPayload, shardId: number): Promise { if (!bot.events.inviteCreate) return - bot.events.inviteCreate(bot.transformers.invite(bot, { invite: data.d as DiscordInviteCreate, shardId })) + const payload = data.d as DiscordInviteCreate + + bot.events.inviteCreate(bot.transformers.invite(bot, payload, { shardId })) } diff --git a/packages/bot/src/handlers/members/GUILD_MEMBER_ADD.ts b/packages/bot/src/handlers/members/GUILD_MEMBER_ADD.ts index 6ae726632..0db9a31e0 100644 --- a/packages/bot/src/handlers/members/GUILD_MEMBER_ADD.ts +++ b/packages/bot/src/handlers/members/GUILD_MEMBER_ADD.ts @@ -7,6 +7,6 @@ export async function handleGuildMemberAdd(bot: Bot, data: DiscordGatewayPayload const payload = data.d as DiscordGuildMemberAdd const guildId = bot.transformers.snowflake(payload.guild_id) const user = bot.transformers.user(bot, payload.user) - const member = bot.transformers.member(bot, payload, guildId, payload.user.id) + const member = bot.transformers.member(bot, payload, { guildId, userId: payload.user.id }) bot.events.guildMemberAdd(member, user) } diff --git a/packages/bot/src/handlers/members/GUILD_MEMBER_UPDATE.ts b/packages/bot/src/handlers/members/GUILD_MEMBER_UPDATE.ts index 5dde6ad5b..c9d4d55fb 100644 --- a/packages/bot/src/handlers/members/GUILD_MEMBER_UPDATE.ts +++ b/packages/bot/src/handlers/members/GUILD_MEMBER_UPDATE.ts @@ -7,6 +7,9 @@ export async function handleGuildMemberUpdate(bot: Bot, data: DiscordGatewayPayl const payload = data.d as DiscordGuildMemberUpdate const user = bot.transformers.user(bot, payload.user) - // @ts-expect-error Flags in the update are nullable, while on the member they are be always present - bot.events.guildMemberUpdate(bot.transformers.member(bot, payload, bot.transformers.snowflake(payload.guild_id), user.id), user) + bot.events.guildMemberUpdate( + // @ts-expect-error Flags in the update are nullable, while on the member they are be always present + bot.transformers.member(bot, payload, { guildId: payload.guild_id, userId: payload.user.id }), + user, + ) } diff --git a/packages/bot/src/handlers/messages/MESSAGE_CREATE.ts b/packages/bot/src/handlers/messages/MESSAGE_CREATE.ts index 6b041232b..bd24d37cf 100644 --- a/packages/bot/src/handlers/messages/MESSAGE_CREATE.ts +++ b/packages/bot/src/handlers/messages/MESSAGE_CREATE.ts @@ -6,5 +6,5 @@ export async function handleMessageCreate(bot: Bot, data: DiscordGatewayPayload, const payload = data.d as DiscordMessage - bot.events.messageCreate(bot.transformers.message(bot, { message: payload, shardId })) + bot.events.messageCreate(bot.transformers.message(bot, payload, { shardId })) } diff --git a/packages/bot/src/handlers/messages/MESSAGE_REACTION_ADD.ts b/packages/bot/src/handlers/messages/MESSAGE_REACTION_ADD.ts index 2010277aa..cb75d03f9 100644 --- a/packages/bot/src/handlers/messages/MESSAGE_REACTION_ADD.ts +++ b/packages/bot/src/handlers/messages/MESSAGE_REACTION_ADD.ts @@ -13,7 +13,7 @@ export async function handleMessageReactionAdd(bot: Bot, data: DiscordGatewayPay channelId: bot.transformers.snowflake(payload.channel_id), messageId: bot.transformers.snowflake(payload.message_id), guildId, - member: payload.member && guildId ? bot.transformers.member(bot, payload.member, guildId, userId) : undefined, + 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), diff --git a/packages/bot/src/handlers/messages/MESSAGE_UPDATE.ts b/packages/bot/src/handlers/messages/MESSAGE_UPDATE.ts index 8f710859f..45f4404e9 100644 --- a/packages/bot/src/handlers/messages/MESSAGE_UPDATE.ts +++ b/packages/bot/src/handlers/messages/MESSAGE_UPDATE.ts @@ -7,5 +7,5 @@ export async function handleMessageUpdate(bot: Bot, data: DiscordGatewayPayload, const payload = data.d as DiscordMessage if (!payload.edited_timestamp) return - bot.events.messageUpdate(bot.transformers.message(bot, { message: payload, shardId })) + bot.events.messageUpdate(bot.transformers.message(bot, payload, { shardId })) } diff --git a/packages/bot/src/handlers/misc/TYPING_START.ts b/packages/bot/src/handlers/misc/TYPING_START.ts index f83882547..bbd4f16cf 100644 --- a/packages/bot/src/handlers/misc/TYPING_START.ts +++ b/packages/bot/src/handlers/misc/TYPING_START.ts @@ -14,6 +14,6 @@ export async function handleTypingStart(bot: Bot, data: DiscordGatewayPayload): channelId: bot.transformers.snowflake(payload.channel_id), userId, timestamp: payload.timestamp, - member: payload.member && guildId ? bot.transformers.member(bot, payload.member, guildId, userId) : undefined, + member: payload.member && guildId ? bot.transformers.member(bot, payload.member, { guildId, userId }) : undefined, }) } diff --git a/packages/bot/src/handlers/roles/GUILD_ROLE_CREATE.ts b/packages/bot/src/handlers/roles/GUILD_ROLE_CREATE.ts index 261f3c64c..442820264 100644 --- a/packages/bot/src/handlers/roles/GUILD_ROLE_CREATE.ts +++ b/packages/bot/src/handlers/roles/GUILD_ROLE_CREATE.ts @@ -6,8 +6,7 @@ export async function handleGuildRoleCreate(bot: Bot, data: DiscordGatewayPayloa const payload = data.d as DiscordGuildRoleCreate bot.events.roleCreate( - bot.transformers.role(bot, { - role: payload.role, + bot.transformers.role(bot, payload.role, { guildId: bot.transformers.snowflake(payload.guild_id), }), ) diff --git a/packages/bot/src/handlers/roles/GUILD_ROLE_UPDATE.ts b/packages/bot/src/handlers/roles/GUILD_ROLE_UPDATE.ts index a333477ea..8bd6f9190 100644 --- a/packages/bot/src/handlers/roles/GUILD_ROLE_UPDATE.ts +++ b/packages/bot/src/handlers/roles/GUILD_ROLE_UPDATE.ts @@ -7,8 +7,7 @@ export async function handleGuildRoleUpdate(bot: Bot, data: DiscordGatewayPayloa const payload = data.d as DiscordGuildRoleUpdate bot.events.roleUpdate( - bot.transformers.role(bot, { - role: payload.role, + bot.transformers.role(bot, payload.role, { guildId: bot.transformers.snowflake(payload.guild_id), }), ) diff --git a/packages/bot/src/handlers/voice/VOICE_STATE_UPDATE.ts b/packages/bot/src/handlers/voice/VOICE_STATE_UPDATE.ts index 1e9df1cd0..a1cae3643 100644 --- a/packages/bot/src/handlers/voice/VOICE_STATE_UPDATE.ts +++ b/packages/bot/src/handlers/voice/VOICE_STATE_UPDATE.ts @@ -10,5 +10,5 @@ export async function handleVoiceStateUpdate(bot: Bot, data: DiscordGatewayPaylo const guildId = bot.transformers.snowflake(payload.guild_id) - bot.events.voiceStateUpdate(bot.transformers.voiceState(bot, { voiceState: payload, guildId })) + bot.events.voiceStateUpdate(bot.transformers.voiceState(bot, payload, { guildId })) } diff --git a/packages/bot/src/helpers.ts b/packages/bot/src/helpers.ts index b4f8bfd9b..c510e891e 100644 --- a/packages/bot/src/helpers.ts +++ b/packages/bot/src/helpers.ts @@ -45,7 +45,6 @@ import type { DiscordInvite, DiscordInviteMetadata, DiscordListArchivedThreads, - DiscordMessage, DiscordPrunedCount, DiscordTokenExchange, DiscordTokenRevocation, @@ -155,7 +154,7 @@ export function createBotHelpers { - return bot.transformers.channel(bot, { channel: snakelize(await bot.rest.createChannel(guildId, options, reason)), guildId }) + return bot.transformers.channel(bot, snakelize(await bot.rest.createChannel(guildId, options, reason)), { guildId }) }, createEmoji: async (guildId, options, reason) => { return bot.transformers.emoji(bot, snakelize(await bot.rest.createEmoji(guildId, options, reason))) @@ -164,7 +163,7 @@ export function createBotHelpers { - return bot.transformers.channel(bot, { channel: snakelize(await bot.rest.createForumThread(channelId, options, reason)) }) + return bot.transformers.channel(bot, snakelize(await bot.rest.createForumThread(channelId, options, reason))) }, createGlobalApplicationCommand: async (command, options) => { return bot.transformers.applicationCommand(bot, snakelize(await bot.rest.createGlobalApplicationCommand(command, options))) @@ -182,7 +181,7 @@ export function createBotHelpers { - return bot.transformers.role(bot, { role: snakelize(await bot.rest.createRole(guildId, options, reason)), guildId }) + return bot.transformers.role(bot, snakelize(await bot.rest.createRole(guildId, options, reason)), { guildId }) }, createScheduledEvent: async (guildId, options, reason) => { return bot.transformers.scheduledEvent(bot, snakelize(await bot.rest.createScheduledEvent(guildId, options, reason))) @@ -206,7 +205,7 @@ export function createBotHelpers { - return bot.transformers.channel(bot, { channel: snakelize(await bot.rest.editChannel(channelId, options, reason)) }) + return bot.transformers.channel(bot, snakelize(await bot.rest.editChannel(channelId, options, reason))) }, editEmoji: async (guildId, id, options, reason) => { return bot.transformers.emoji(bot, snakelize(await bot.rest.editEmoji(guildId, id, options, reason))) @@ -215,13 +214,13 @@ export function createBotHelpers { - return bot.transformers.message(bot, { message: snakelize(await bot.rest.editFollowupMessage(token, messageId, options)), shardId: 0 }) + return bot.transformers.message(bot, snakelize(await bot.rest.editFollowupMessage(token, messageId, options))) }, editGlobalApplicationCommand: async (commandId, options) => { return bot.transformers.applicationCommand(bot, snakelize(await bot.rest.editGlobalApplicationCommand(commandId, options))) }, editGuild: async (guildId, options, reason) => { - return bot.transformers.guild(bot, { guild: snakelize(await bot.rest.editGuild(guildId, options, reason)), shardId: 0 }) + return bot.transformers.guild(bot, snakelize(await bot.rest.editGuild(guildId, options, reason))) }, editGuildApplicationCommand: async (commandId, guildId, options) => { return bot.transformers.applicationCommand(bot, snakelize(await bot.rest.editGuildApplicationCommand(commandId, guildId, options))) @@ -233,19 +232,16 @@ export function createBotHelpers { - return bot.transformers.message(bot, { - message: snakelize(await bot.rest.editMessage(channelId, messageId, options)) as DiscordMessage, - shardId: 0, - }) + return bot.transformers.message(bot, snakelize(await bot.rest.editMessage(channelId, messageId, options))) }, editOriginalInteractionResponse: async (token, options) => { - return bot.transformers.message(bot, { message: snakelize(await bot.rest.editOriginalInteractionResponse(token, options)), shardId: 0 }) + return bot.transformers.message(bot, snakelize(await bot.rest.editOriginalInteractionResponse(token, options))) }, editRole: async (guildId, roleId, options, reason) => { - return bot.transformers.role(bot, { role: snakelize(await bot.rest.editRole(guildId, roleId, options, reason)), guildId }) + return bot.transformers.role(bot, snakelize(await bot.rest.editRole(guildId, roleId, options, reason)), { guildId }) }, editRolePositions: async (guildId, options, reason) => { - return snakelize(await bot.rest.editRolePositions(guildId, options, reason)).map((role) => bot.transformers.role(bot, { role, guildId })) + return snakelize(await bot.rest.editRolePositions(guildId, options, reason)).map((role) => bot.transformers.role(bot, role, { guildId })) }, editScheduledEvent: async (guildId, eventId, options, reason) => { return bot.transformers.scheduledEvent(bot, snakelize(await bot.rest.editScheduledEvent(guildId, eventId, options, reason))) @@ -257,10 +253,7 @@ export function createBotHelpers { - return bot.transformers.message(bot, { - message: snakelize(await bot.rest.editWebhookMessage(webhookId, token, messageId, options)) as DiscordMessage, - shardId: 0, - }) + return bot.transformers.message(bot, snakelize(await bot.rest.editWebhookMessage(webhookId, token, messageId, options))) }, editWebhookWithToken: async (webhookId, token, options) => { return bot.transformers.webhook(bot, snakelize(await bot.rest.editWebhookWithToken(webhookId, token, options))) @@ -275,7 +268,7 @@ export function createBotHelpers { return await bot.rest.followAnnouncement(sourceChannelId, targetChannelId) @@ -283,15 +276,15 @@ export function createBotHelpers { const result = await bot.rest.getActiveThreads(guildId) return { - threads: result.threads.map((thread) => bot.transformers.channel(bot, { guildId, channel: snakelize(thread) })), + threads: result.threads.map((thread) => bot.transformers.channel(bot, snakelize(thread), { guildId })), members: result.members.map((member) => bot.transformers.threadMember(bot, snakelize(member), { guildId })), } }, getApplicationInfo: async () => { - return bot.transformers.application(bot, { application: snakelize(await bot.rest.getApplicationInfo()), shardId: 0 }) + return bot.transformers.application(bot, snakelize(await bot.rest.getApplicationInfo())) }, editApplicationInfo: async (body) => { - return bot.transformers.application(bot, { application: snakelize(await bot.rest.editApplicationInfo(body)), shardId: 0 }) + return bot.transformers.application(bot, snakelize(await bot.rest.editApplicationInfo(body))) }, getCurrentAuthenticationInfo: async (bearerToken) => { return await bot.rest.getCurrentAuthenticationInfo(bearerToken) @@ -332,23 +325,23 @@ export function createBotHelpers { - return bot.transformers.channel(bot, { channel: snakelize(await bot.rest.getChannel(channelId)) }) + return bot.transformers.channel(bot, snakelize(await bot.rest.getChannel(channelId))) }, getChannelInvites: async (channelId) => { return await bot.rest.getChannelInvites(channelId) // return (await bot.rest.getChannelInvites(channelId)).map((res) => bot.transformers.invite(bot, snakelize(res))) }, getChannels: async (guildId) => { - return (await bot.rest.getChannels(guildId)).map((res) => bot.transformers.channel(bot, { channel: snakelize(res), guildId })) + return (await bot.rest.getChannels(guildId)).map((res) => bot.transformers.channel(bot, snakelize(res), { guildId })) }, getChannelWebhooks: async (channelId) => { return (await bot.rest.getChannelWebhooks(channelId)).map((res) => bot.transformers.webhook(bot, snakelize(res))) }, getDmChannel: async (userId) => { - return bot.transformers.channel(bot, { channel: snakelize(await bot.rest.getDmChannel(userId)) }) + return bot.transformers.channel(bot, snakelize(await bot.rest.getDmChannel(userId))) }, getGroupDmChannel: async (options) => { - return bot.transformers.channel(bot, { channel: snakelize(await bot.rest.getGroupDmChannel(options)) }) + return bot.transformers.channel(bot, snakelize(await bot.rest.getGroupDmChannel(options))) }, getEmoji: async (guildId, emojiId) => { return bot.transformers.emoji(bot, snakelize(await bot.rest.getEmoji(guildId, emojiId))) @@ -367,7 +360,7 @@ export function createBotHelpers { - return bot.transformers.message(bot, { message: snakelize(await bot.rest.getFollowupMessage(token, messageId)), shardId: 0 }) + return bot.transformers.message(bot, snakelize(await bot.rest.getFollowupMessage(token, messageId))) }, getGatewayBot: async () => { return bot.transformers.gatewayBot(bot, snakelize(await bot.rest.getGatewayBot())) @@ -379,12 +372,12 @@ export function createBotHelpers bot.transformers.applicationCommand(bot, snakelize(res))) }, getGuild: async (guildId, options) => { - return bot.transformers.guild(bot, { guild: snakelize(await bot.rest.getGuild(guildId, options)), shardId: 0 }) + return bot.transformers.guild(bot, snakelize(await bot.rest.getGuild(guildId, options))) }, getGuilds: async (bearerToken, options) => { return (await bot.rest.getGuilds(bearerToken, options)).map>((res) => // @ts-expect-error getGuilds returns partial guilds - bot.transformers.guild(bot, { guild: snakelize(res), shardId: 0 }), + bot.transformers.guild(bot, snakelize(res)), ) }, getGuildApplicationCommand: async (commandId, guildId) => { @@ -418,16 +411,16 @@ export function createBotHelpers { - return bot.transformers.invite(bot, { invite: snakelize(await bot.rest.getInvite(inviteCode, options)), shardId: 0 }) + return bot.transformers.invite(bot, snakelize(await bot.rest.getInvite(inviteCode, options))) }, getInvites: async (guildId) => { - return (await bot.rest.getInvites(guildId)).map((res) => bot.transformers.invite(bot, { invite: snakelize(res), shardId: 0 })) + return (await bot.rest.getInvites(guildId)).map((res) => bot.transformers.invite(bot, snakelize(res))) }, getMessage: async (channelId, messageId) => { - return bot.transformers.message(bot, { message: snakelize(await bot.rest.getMessage(channelId, messageId)), shardId: 0 }) + return bot.transformers.message(bot, snakelize(await bot.rest.getMessage(channelId, messageId))) }, getMessages: async (channelId, options) => { - return (await bot.rest.getMessages(channelId, options)).map((res) => bot.transformers.message(bot, { message: snakelize(res), shardId: 0 })) + return (await bot.rest.getMessages(channelId, options)).map((res) => bot.transformers.message(bot, snakelize(res))) }, getStickerPack: async (stickerPackId) => { return bot.transformers.stickerPack(bot, snakelize(await bot.rest.getStickerPack(stickerPackId))) @@ -436,7 +429,7 @@ export function createBotHelpers bot.transformers.stickerPack(bot, snakelize(res))) }, getOriginalInteractionResponse: async (token) => { - return bot.transformers.message(bot, { message: snakelize(await bot.rest.getOriginalInteractionResponse(token)), shardId: 0 }) + return bot.transformers.message(bot, snakelize(await bot.rest.getOriginalInteractionResponse(token))) }, getChannelPins: async (channelId, options) => { const res = snakelize(await bot.rest.getChannelPins(channelId, options)) @@ -447,7 +440,7 @@ export function createBotHelpers { - return (await bot.rest.getPinnedMessages(channelId)).map((res) => bot.transformers.message(bot, { message: snakelize(res), shardId: 0 })) + return (await bot.rest.getPinnedMessages(channelId)).map((res) => bot.transformers.message(bot, snakelize(res))) }, getPrivateArchivedThreads: async (channelId, options) => { return await bot.rest.getPrivateArchivedThreads(channelId, options) @@ -462,10 +455,10 @@ export function createBotHelpers { - return snakelize(await bot.rest.getRoles(guildId)).map((role) => bot.transformers.role(bot, { role, guildId })) + return snakelize(await bot.rest.getRoles(guildId)).map((role) => bot.transformers.role(bot, role, { guildId })) }, getRole: async (guildId, roleId) => { - return bot.transformers.role(bot, { role: snakelize(await bot.rest.getRole(guildId, roleId)), guildId }) + return bot.transformers.role(bot, snakelize(await bot.rest.getRole(guildId, roleId)), { guildId }) }, getScheduledEvent: async (guildId, eventId, options) => { return bot.transformers.scheduledEvent(bot, snakelize(await bot.rest.getScheduledEvent(guildId, eventId, options))) @@ -477,7 +470,7 @@ export function createBotHelpers { return { user: bot.transformers.user(bot, snakelize(u.user)), - member: u.member && bot.transformers.member(bot, snakelize(u.member), guildId, bot.transformers.snowflake(u.user.id)), + member: u.member && bot.transformers.member(bot, snakelize(u.member), { guildId, userId: bot.transformers.snowflake(u.user.id) }), } }) }, @@ -488,10 +481,10 @@ export function createBotHelpers { - return bot.transformers.voiceState(bot, { guildId, voiceState: snakelize(await bot.rest.getOwnVoiceState(guildId)) }) + return bot.transformers.voiceState(bot, snakelize(await bot.rest.getOwnVoiceState(guildId)), { guildId }) }, getUserVoiceState: async (guildId, userId) => { - return bot.transformers.voiceState(bot, { guildId, voiceState: snakelize(await bot.rest.getUserVoiceState(guildId, userId)) }) + return bot.transformers.voiceState(bot, snakelize(await bot.rest.getUserVoiceState(guildId, userId)), { guildId }) }, getSticker: async (stickerId) => { return bot.transformers.sticker(bot, snakelize(await bot.rest.getSticker(stickerId))) @@ -527,7 +520,7 @@ export function createBotHelpers { - return bot.transformers.message(bot, { message: snakelize(await bot.rest.getWebhookMessage(webhookId, token, messageId, options)), shardId: 0 }) + return bot.transformers.message(bot, snakelize(await bot.rest.getWebhookMessage(webhookId, token, messageId, options))) }, getWebhookWithToken: async (webhookId, token) => { return bot.transformers.webhook(bot, snakelize(await bot.rest.getWebhookWithToken(webhookId, token))) @@ -542,21 +535,19 @@ export function createBotHelpers { - return bot.transformers.message(bot, { message: snakelize(await bot.rest.publishMessage(channelId, messageId)), shardId: 0 }) + return bot.transformers.message(bot, snakelize(await bot.rest.publishMessage(channelId, messageId))) }, sendMessage: async (channelId, options) => { - return bot.transformers.message(bot, { message: snakelize(await bot.rest.sendMessage(channelId, options)), shardId: 0 }) + return bot.transformers.message(bot, snakelize(await bot.rest.sendMessage(channelId, options))) }, sendFollowupMessage: async (token, options) => { - return bot.transformers.message(bot, { message: snakelize(await bot.rest.sendFollowupMessage(token, options)), shardId: 0 }) + return bot.transformers.message(bot, snakelize(await bot.rest.sendFollowupMessage(token, options))) }, startThreadWithMessage: async (channelId, messageId, options, reason) => { - return bot.transformers.channel(bot, { - channel: snakelize(await bot.rest.startThreadWithMessage(channelId, messageId, options, reason)), - }) + return bot.transformers.channel(bot, snakelize(await bot.rest.startThreadWithMessage(channelId, messageId, options, reason))) }, startThreadWithoutMessage: async (channelId, options, reason) => { - return bot.transformers.channel(bot, { channel: snakelize(await bot.rest.startThreadWithoutMessage(channelId, options, reason)) }) + return bot.transformers.channel(bot, snakelize(await bot.rest.startThreadWithoutMessage(channelId, options, reason))) }, syncGuildTemplate: async (guildId) => { return bot.transformers.template(bot, snakelize(await bot.rest.syncGuildTemplate(guildId))) @@ -572,21 +563,21 @@ export function createBotHelpers { - return bot.transformers.member(bot, snakelize(await bot.rest.editBotMember(guildId, options, reason)), guildId, bot.id) + return bot.transformers.member(bot, snakelize(await bot.rest.editBotMember(guildId, options, reason)), { guildId, userId: bot.id }) }, editMember: async (guildId, userId, options, reason) => { - return bot.transformers.member(bot, snakelize(await bot.rest.editMember(guildId, userId, options, reason)), guildId, userId) + return bot.transformers.member(bot, snakelize(await bot.rest.editMember(guildId, userId, options, reason)), { guildId, userId }) }, getMember: async (guildId, userId) => { - return bot.transformers.member(bot, snakelize(await bot.rest.getMember(guildId, userId)), guildId, userId) + return bot.transformers.member(bot, snakelize(await bot.rest.getMember(guildId, userId)), { guildId, userId }) }, getCurrentMember: async (guildId, bearerToken) => { const res = await bot.rest.getCurrentMember(guildId, bearerToken) - return bot.transformers.member(bot, snakelize(res), guildId, bot.transformers.snowflake(res.user.id)) + return bot.transformers.member(bot, snakelize(res), { guildId, userId: bot.transformers.snowflake(res.user.id) }) }, getMembers: async (guildId, options) => { return (await bot.rest.getMembers(guildId, options)).map((res) => - bot.transformers.member(bot, snakelize(res), guildId, bot.transformers.snowflake(res.user.id)), + bot.transformers.member(bot, snakelize(res), { guildId, userId: bot.transformers.snowflake(res.user.id) }), ) }, pruneMembers: async (guildId, options, reason) => { @@ -594,7 +585,7 @@ export function createBotHelpers { return (await bot.rest.searchMembers(guildId, query, options)).map((res) => - bot.transformers.member(bot, snakelize(res), guildId, bot.transformers.snowflake(res.user.id)), + bot.transformers.member(bot, snakelize(res), { guildId, userId: bot.transformers.snowflake(res.user.id) }), ) }, bulkBanMembers: async (guildId, options, reason) => { @@ -764,7 +755,7 @@ export function createBotHelpers { return await bot.rest.triggerTypingIndicator(channelId) diff --git a/packages/bot/src/transformers.ts b/packages/bot/src/transformers.ts index f34ee452c..cd759b4f7 100644 --- a/packages/bot/src/transformers.ts +++ b/packages/bot/src/transformers.ts @@ -263,7 +263,7 @@ export type Transformers, ) => any - application: (bot: Bot, payload: DiscordApplication, application: Application) => any + application: (bot: Bot, payload: DiscordApplication, application: Application, extra?: { shardId?: number }) => any applicationCommand: (bot: Bot, payload: DiscordApplicationCommand, applicationCommand: ApplicationCommand) => any applicationCommandOption: ( bot: Bot, @@ -293,7 +293,12 @@ export type Transformers, ) => any - channel: (bot: Bot, payload: DiscordChannel, channel: SetupDesiredProps) => any + channel: ( + bot: Bot, + payload: DiscordChannel, + channel: SetupDesiredProps, + extra?: { guildId?: bigint }, + ) => any collectibles: (bot: Bot, payload: DiscordCollectibles, collectibles: SetupDesiredProps) => any component: (bot: Bot, payload: DiscordMessageComponent, component: Component) => any defaultReactionEmoji: ( @@ -306,7 +311,12 @@ export type Transformers, payload: DiscordEntitlement, entitlement: SetupDesiredProps) => any forumTag: (bot: Bot, payload: DiscordForumTag, forumTag: SetupDesiredProps) => any gatewayBot: (bot: Bot, payload: DiscordGetGatewayBot, getGatewayBot: GetGatewayBot) => any - guild: (bot: Bot, payload: DiscordGuild, guild: SetupDesiredProps) => any + guild: ( + bot: Bot, + payload: DiscordGuild, + guild: SetupDesiredProps, + extra?: { shardId?: number }, + ) => any guildOnboarding: ( bot: Bot, payload: DiscordGuildOnboarding, @@ -330,8 +340,9 @@ export type Transformers, payload: DiscordIntegrationCreateUpdate, integration: Integration) => any interaction: ( bot: Bot, - payload: { interaction: DiscordInteraction; shardId: number }, + payload: DiscordInteraction, interaction: SetupDesiredProps, + extra?: { shardId?: number }, ) => any interactionCallback: ( bot: Bot, @@ -342,50 +353,71 @@ export type Transformers, payload: DiscordInteractionCallbackResponse, interactionCallbackResponse: SetupDesiredProps, + extra?: { shardId?: number }, ) => any interactionDataOptions: (bot: Bot, payload: DiscordInteractionDataOption, interactionDataOptions: InteractionDataOption) => any interactionDataResolved: ( bot: Bot, - payload: { resolved: DiscordInteractionDataResolved; guildId?: bigint }, + payload: DiscordInteractionDataResolved, interactionDataResolved: InteractionDataResolved, + extra?: { shardId?: number; guildId?: bigint }, ) => any interactionResource: ( bot: Bot, payload: DiscordInteractionResource, interactionResource: SetupDesiredProps, + extra?: { shardId?: number }, ) => any invite: ( bot: Bot, payload: DiscordInviteCreate | DiscordInviteMetadata, invite: SetupDesiredProps, + extra?: { shardId?: number }, ) => any inviteStageInstance: ( bot: Bot, payload: DiscordInviteStageInstance, inviteStageInstance: SetupDesiredProps, + extra?: { guildId?: bigint }, ) => any lobby: (bot: Bot, payload: DiscordLobby, lobby: SetupDesiredProps) => any lobbyMember: (bot: Bot, payload: DiscordLobbyMember, lobbyMember: SetupDesiredProps) => any mediaGalleryItem: (bot: Bot, payload: DiscordMediaGalleryItem, item: MediaGalleryItem) => any - member: (bot: Bot, payload: DiscordMember, member: SetupDesiredProps) => any - message: (bot: Bot, payload: DiscordMessage, message: SetupDesiredProps) => any + member: ( + bot: Bot, + payload: DiscordMember, + member: SetupDesiredProps, + extra?: { guildId?: bigint; userId?: bigint }, + ) => any + message: ( + bot: Bot, + payload: DiscordMessage, + message: SetupDesiredProps, + extra?: { shardId?: number }, + ) => any messageCall: (bot: Bot, payload: DiscordMessageCall, call: SetupDesiredProps) => any messageInteractionMetadata: ( bot: Bot, payload: DiscordMessageInteractionMetadata, metadata: SetupDesiredProps, ) => any - messagePin: (bot: Bot, payload: DiscordMessagePin, call: SetupDesiredProps) => any + messagePin: ( + bot: Bot, + payload: DiscordMessagePin, + call: SetupDesiredProps, + extra?: { shardId?: number }, + ) => any messageSnapshot: ( bot: Bot, payload: DiscordMessageSnapshot, messageSnapshot: SetupDesiredProps, + extra?: { shardId?: number }, ) => any nameplate: (bot: Bot, payload: DiscordNameplate, nameplate: SetupDesiredProps) => any poll: (bot: Bot, payload: DiscordPoll, poll: SetupDesiredProps) => any pollMedia: (bot: Bot, payload: DiscordPollMedia, pollMedia: SetupDesiredProps) => any presence: (bot: Bot, payload: DiscordPresenceUpdate, presence: PresenceUpdate) => any - role: (bot: Bot, payload: DiscordRole, role: SetupDesiredProps) => any + role: (bot: Bot, payload: DiscordRole, role: SetupDesiredProps, extra?: { guildId?: bigint }) => any roleColors: (bot: Bot, payload: DiscordRoleColors, roleColors: SetupDesiredProps) => any scheduledEvent: ( bot: Bot, @@ -427,7 +459,12 @@ export type Transformers, ) => any voiceRegion: (bot: Bot, payload: DiscordVoiceRegion, voiceRegion: VoiceRegion) => any - voiceState: (bot: Bot, payload: DiscordVoiceState, voiceState: SetupDesiredProps) => any + voiceState: ( + bot: Bot, + payload: DiscordVoiceState, + voiceState: SetupDesiredProps, + extra?: { guildId?: bigint }, + ) => any webhook: (bot: Bot, payload: DiscordWebhook, webhook: SetupDesiredProps) => any welcomeScreen: (bot: Bot, payload: DiscordWelcomeScreen, welcomeScreen: WelcomeScreen) => any widget: (bot: Bot, payload: DiscordGuildWidget, widget: GuildWidget) => any @@ -454,7 +491,7 @@ export type Transformers, payload: DiscordActivity) => Activity activityInstance: (bot: Bot, payload: DiscordActivityInstance) => SetupDesiredProps activityLocation: (bot: Bot, payload: DiscordActivityLocation) => SetupDesiredProps - application: (bot: Bot, payload: { application: DiscordApplication; shardId: number }) => Application + application: (bot: Bot, payload: DiscordApplication, extra?: { shardId?: number }) => Application applicationCommand: (bot: Bot, payload: DiscordApplicationCommand) => ApplicationCommand applicationCommandOption: (bot: Bot, payload: DiscordApplicationCommandOption) => ApplicationCommandOption applicationCommandOptionChoice: (bot: Bot, payload: DiscordApplicationCommandOptionChoice) => ApplicationCommandOptionChoice @@ -470,7 +507,7 @@ export type Transformers, payload: DiscordAvatarDecorationData, ) => SetupDesiredProps - channel: (bot: Bot, payload: { channel: DiscordChannel; guildId?: BigString }) => SetupDesiredProps + channel: (bot: Bot, payload: DiscordChannel, extra?: { guildId?: BigString }) => SetupDesiredProps collectibles: (bot: Bot, payload: DiscordCollectibles) => SetupDesiredProps component: (bot: Bot, payload: DiscordMessageComponent) => Component defaultReactionEmoji: ( @@ -482,7 +519,7 @@ export type Transformers, payload: DiscordEntitlement) => SetupDesiredProps forumTag: (bot: Bot, payload: DiscordForumTag) => SetupDesiredProps gatewayBot: (bot: Bot, payload: DiscordGetGatewayBot) => GetGatewayBot - guild: (bot: Bot, payload: { guild: DiscordGuild; shardId: number }) => SetupDesiredProps + guild: (bot: Bot, payload: DiscordGuild, extra?: { shardId?: number }) => SetupDesiredProps guildOnboarding: (bot: Bot, payload: DiscordGuildOnboarding) => SetupDesiredProps guildOnboardingPrompt: ( bot: Bot, @@ -493,29 +530,35 @@ export type Transformers, payload: DiscordIntegrationCreateUpdate) => Integration interaction: ( bot: Bot, - payload: { interaction: DiscordInteraction; shardId: number }, + payload: DiscordInteraction, + extra?: { shardId?: number }, ) => SetupDesiredProps interactionCallback: (bot: Bot, payload: DiscordInteractionCallback) => SetupDesiredProps interactionCallbackResponse: ( bot: Bot, - payload: { interactionCallbackResponse: DiscordInteractionCallbackResponse; shardId: number }, + payload: DiscordInteractionCallbackResponse, + extra?: { shardId?: number }, ) => SetupDesiredProps interactionDataOptions: (bot: Bot, payload: DiscordInteractionDataOption) => InteractionDataOption interactionDataResolved: ( bot: Bot, - payload: { resolved: DiscordInteractionDataResolved; shardId: number; guildId?: bigint }, + payload: DiscordInteractionDataResolved, + extra?: { shardId?: number; guildId?: BigString }, ) => TransformProperty interactionResource: ( bot: Bot, - payload: { interactionResource: DiscordInteractionResource; shardId: number }, + payload: DiscordInteractionResource, + extra?: { shardId?: number }, ) => SetupDesiredProps invite: ( bot: Bot, - payload: { invite: DiscordInviteCreate | DiscordInviteMetadata; shardId: number }, + payload: DiscordInviteCreate | DiscordInviteMetadata, + extra?: { shardId?: number }, ) => SetupDesiredProps inviteStageInstance: ( bot: Bot, - payload: DiscordInviteStageInstance & { guildId: BigString }, + payload: DiscordInviteStageInstance, + extra?: { guildId: BigString }, ) => SetupDesiredProps lobby: (bot: Bot, payload: DiscordLobby) => SetupDesiredProps lobbyMember: (bot: Bot, payload: DiscordLobbyMember) => SetupDesiredProps @@ -523,25 +566,29 @@ export type Transformers, payload: DiscordMember, - guildId: BigString | undefined, - userId: BigString, + extra?: { guildId?: BigString; userId?: BigString }, ) => SetupDesiredProps - message: (bot: Bot, payload: { message: DiscordMessage; shardId: number }) => SetupDesiredProps + message: (bot: Bot, payload: DiscordMessage, extra?: { shardId?: number }) => SetupDesiredProps messageCall: (bot: Bot, payload: DiscordMessageCall) => SetupDesiredProps messageInteractionMetadata: ( bot: Bot, payload: DiscordMessageInteractionMetadata, ) => SetupDesiredProps - messagePin: (bot: Bot, payload: DiscordMessagePin) => SetupDesiredProps + messagePin: ( + bot: Bot, + payload: DiscordMessagePin, + extra?: { shardId?: number }, + ) => SetupDesiredProps messageSnapshot: ( bot: Bot, - payload: { messageSnapshot: DiscordMessageSnapshot; shardId: number }, + payload: DiscordMessageSnapshot, + extra?: { shardId?: number }, ) => SetupDesiredProps nameplate: (bot: Bot, payload: DiscordNameplate) => SetupDesiredProps poll: (bot: Bot, payload: DiscordPoll) => SetupDesiredProps pollMedia: (bot: Bot, payload: DiscordPollMedia) => SetupDesiredProps presence: (bot: Bot, payload: DiscordPresenceUpdate) => PresenceUpdate - role: (bot: Bot, payload: { role: DiscordRole; guildId: BigString }) => SetupDesiredProps + role: (bot: Bot, payload: DiscordRole, extra?: { guildId?: BigString }) => SetupDesiredProps roleColors: (bot: Bot, payload: DiscordRoleColors) => SetupDesiredProps scheduledEvent: (bot: Bot, payload: DiscordScheduledEvent) => SetupDesiredProps scheduledEventRecurrenceRule: ( @@ -565,7 +612,8 @@ export type Transformers, payload: DiscordVoiceRegion) => VoiceRegion voiceState: ( bot: Bot, - payload: { voiceState: DiscordVoiceState; guildId: BigString }, + payload: DiscordVoiceState, + extra?: { guildId?: BigString }, ) => SetupDesiredProps webhook: (bot: Bot, payload: DiscordWebhook) => SetupDesiredProps welcomeScreen: (bot: Bot, payload: DiscordWelcomeScreen) => WelcomeScreen diff --git a/packages/bot/src/transformers/application.ts b/packages/bot/src/transformers/application.ts index da229bf27..9f9b4b1c0 100644 --- a/packages/bot/src/transformers/application.ts +++ b/packages/bot/src/transformers/application.ts @@ -7,70 +7,70 @@ import { iconHashToBigInt, } from '../index.js' -export function transformApplication(bot: Bot, payload: { application: DiscordApplication; shardId: number }): Application { +export function transformApplication(bot: Bot, payload: DiscordApplication, extra?: { shardId?: number }): Application { const application = { - name: payload.application.name, - description: payload.application.description, - rpcOrigins: payload.application.rpc_origins, - botPublic: payload.application.bot_public, - botRequireCodeGrant: payload.application.bot_require_code_grant, - termsOfServiceUrl: payload.application.terms_of_service_url, - privacyPolicyUrl: payload.application.privacy_policy_url, - verifyKey: payload.application.verify_key, - primarySkuId: payload.application.primary_sku_id, - slug: payload.application.slug, - coverImage: payload.application.cover_image ? iconHashToBigInt(payload.application.cover_image) : undefined, - flags: payload.application.flags, + name: payload.name, + description: payload.description, + rpcOrigins: payload.rpc_origins, + botPublic: payload.bot_public, + botRequireCodeGrant: payload.bot_require_code_grant, + termsOfServiceUrl: payload.terms_of_service_url, + privacyPolicyUrl: payload.privacy_policy_url, + verifyKey: payload.verify_key, + primarySkuId: payload.primary_sku_id, + slug: payload.slug, + coverImage: payload.cover_image ? iconHashToBigInt(payload.cover_image) : undefined, + flags: payload.flags, - id: bot.transformers.snowflake(payload.application.id), - icon: payload.application.icon ? iconHashToBigInt(payload.application.icon) : undefined, - owner: payload.application.owner + id: bot.transformers.snowflake(payload.id), + icon: payload.icon ? iconHashToBigInt(payload.icon) : undefined, + owner: payload.owner ? // @ts-expect-error the partial here wont break anything - bot.transformers.user(bot, payload.application.owner) + bot.transformers.user(bot, payload.owner) : undefined, - team: payload.application.team ? bot.transformers.team(bot, payload.application.team) : undefined, - guildId: payload.application.guild_id ? bot.transformers.snowflake(payload.application.guild_id) : undefined, - customInstallUrl: payload.application.custom_install_url, + team: payload.team ? bot.transformers.team(bot, payload.team) : undefined, + guildId: payload.guild_id ? bot.transformers.snowflake(payload.guild_id) : undefined, + customInstallUrl: payload.custom_install_url, // @ts-expect-error the partial here wont break anything - guild: payload.application.guild ? bot.transformers.guild(bot, { guild: payload.application.guild, shardId: payload.shardId }) : undefined, - approximateGuildCount: payload.application.approximate_guild_count, - approximateUserInstallCount: payload.application.approximate_user_install_count, - approximateUserAuthorizationCount: payload.application.approximate_user_authorization_count, - bot: payload.application.bot ? bot.transformers.user(bot, payload.application.bot as DiscordUser) : undefined, - interactionsEndpointUrl: payload.application.interactions_endpoint_url ? payload.application.interactions_endpoint_url : undefined, - redirectUris: payload.application.redirect_uris, - roleConnectionsVerificationUrl: payload.application.role_connections_verification_url, - tags: payload.application.tags, - installParams: payload.application.install_params + guild: payload.guild ? bot.transformers.guild(bot, payload.guild, { shardId: extra?.shardId }) : undefined, + approximateGuildCount: payload.approximate_guild_count, + approximateUserInstallCount: payload.approximate_user_install_count, + approximateUserAuthorizationCount: payload.approximate_user_authorization_count, + bot: payload.bot ? bot.transformers.user(bot, payload.bot as DiscordUser) : undefined, + interactionsEndpointUrl: payload.interactions_endpoint_url ? payload.interactions_endpoint_url : undefined, + redirectUris: payload.redirect_uris, + roleConnectionsVerificationUrl: payload.role_connections_verification_url, + tags: payload.tags, + installParams: payload.install_params ? { - scopes: payload.application.install_params.scopes, - permissions: bot.transformers.snowflake(payload.application.install_params.permissions), + scopes: payload.install_params.scopes, + permissions: bot.transformers.snowflake(payload.install_params.permissions), } : undefined, - integrationTypesConfig: payload.application.integration_types_config + integrationTypesConfig: payload.integration_types_config ? { - [DiscordApplicationIntegrationType.GuildInstall]: payload.application.integration_types_config['0']?.oauth2_install_params + [DiscordApplicationIntegrationType.GuildInstall]: payload.integration_types_config['0']?.oauth2_install_params ? { oauth2InstallParams: { - scopes: payload.application.integration_types_config['0'].oauth2_install_params.scopes, - permissions: bot.transformers.snowflake(payload.application.integration_types_config['0'].oauth2_install_params.permissions), + scopes: payload.integration_types_config['0'].oauth2_install_params.scopes, + permissions: bot.transformers.snowflake(payload.integration_types_config['0'].oauth2_install_params.permissions), }, } : undefined, - [DiscordApplicationIntegrationType.UserInstall]: payload.application.integration_types_config['1']?.oauth2_install_params + [DiscordApplicationIntegrationType.UserInstall]: payload.integration_types_config['1']?.oauth2_install_params ? { oauth2InstallParams: { - scopes: payload.application.integration_types_config['1'].oauth2_install_params.scopes, - permissions: bot.transformers.snowflake(payload.application.integration_types_config['1'].oauth2_install_params.permissions), + scopes: payload.integration_types_config['1'].oauth2_install_params.scopes, + permissions: bot.transformers.snowflake(payload.integration_types_config['1'].oauth2_install_params.permissions), }, } : undefined, } : undefined, - eventWebhooksUrl: payload.application.event_webhooks_url, - eventWebhooksStatus: payload.application.event_webhooks_status, - eventWebhooksTypes: payload.application.event_webhooks_types, + eventWebhooksUrl: payload.event_webhooks_url, + eventWebhooksStatus: payload.event_webhooks_status, + eventWebhooksTypes: payload.event_webhooks_types, } as Application - return bot.transformers.customizers.application(bot, payload.application, application) + return bot.transformers.customizers.application(bot, payload, application, extra) } diff --git a/packages/bot/src/transformers/channel.ts b/packages/bot/src/transformers/channel.ts index 04b9128dc..0f9b65730 100644 --- a/packages/bot/src/transformers/channel.ts +++ b/packages/bot/src/transformers/channel.ts @@ -76,62 +76,61 @@ export const baseChannel: Channel = { }, } -export function transformChannel(bot: Bot, payload: { channel: DiscordChannel; guildId?: BigString }) { +export function transformChannel(bot: Bot, payload: DiscordChannel, extra?: { guildId?: BigString }) { const channel = Object.create(baseChannel) as SetupDesiredProps const props = bot.transformers.desiredProperties.channel - channel.toggles = new ChannelToggles(payload.channel) + channel.toggles = new ChannelToggles(payload) - if (props.id && payload.channel.id) channel.id = bot.transformers.snowflake(payload.channel.id) - if (props.guildId && (payload.guildId ?? payload.channel.guild_id)) - channel.guildId = payload.guildId ? bot.transformers.snowflake(payload.guildId) : bot.transformers.snowflake(payload.channel.guild_id!) - if (props.type) channel.type = payload.channel.type - if (props.position) channel.position = payload.channel.position - if (props.name && payload.channel.name) channel.name = payload.channel.name - if (props.topic && payload.channel.topic) channel.topic = payload.channel.topic - if (props.lastMessageId && payload.channel.last_message_id) channel.lastMessageId = bot.transformers.snowflake(payload.channel.last_message_id) - if (props.bitrate && payload.channel.bitrate) channel.bitrate = payload.channel.bitrate - if (props.userLimit) channel.userLimit = payload.channel.user_limit - if (props.rateLimitPerUser) channel.rateLimitPerUser = payload.channel.rate_limit_per_user - if (props.ownerId && payload.channel.owner_id) channel.ownerId = bot.transformers.snowflake(payload.channel.owner_id) - if (props.lastPinTimestamp && payload.channel.last_pin_timestamp) channel.lastPinTimestamp = Date.parse(payload.channel.last_pin_timestamp) - if (props.rtcRegion && payload.channel.rtc_region) channel.rtcRegion = payload.channel.rtc_region - if (props.videoQualityMode && payload.channel.video_quality_mode) channel.videoQualityMode = payload.channel.video_quality_mode - if (props.messageCount) channel.messageCount = payload.channel.message_count - if (props.memberCount) channel.memberCount = payload.channel.member_count + if (props.id && payload.id) channel.id = bot.transformers.snowflake(payload.id) + if (props.guildId && (extra?.guildId ?? payload.guild_id)) + channel.guildId = extra?.guildId ? bot.transformers.snowflake(extra.guildId) : bot.transformers.snowflake(payload.guild_id!) + if (props.type) channel.type = payload.type + if (props.position) channel.position = payload.position + if (props.name && payload.name) channel.name = payload.name + if (props.topic && payload.topic) channel.topic = payload.topic + if (props.lastMessageId && payload.last_message_id) channel.lastMessageId = bot.transformers.snowflake(payload.last_message_id) + if (props.bitrate && payload.bitrate) channel.bitrate = payload.bitrate + if (props.userLimit) channel.userLimit = payload.user_limit + if (props.rateLimitPerUser) channel.rateLimitPerUser = payload.rate_limit_per_user + if (props.ownerId && payload.owner_id) channel.ownerId = bot.transformers.snowflake(payload.owner_id) + if (props.lastPinTimestamp && payload.last_pin_timestamp) channel.lastPinTimestamp = Date.parse(payload.last_pin_timestamp) + if (props.rtcRegion && payload.rtc_region) channel.rtcRegion = payload.rtc_region + if (props.videoQualityMode && payload.video_quality_mode) channel.videoQualityMode = payload.video_quality_mode + if (props.messageCount) channel.messageCount = payload.message_count + if (props.memberCount) channel.memberCount = payload.member_count if (props.threadMetadata) { channel.internalThreadMetadata = {} as NonNullable - if (payload.channel.thread_metadata?.archive_timestamp) - channel.internalThreadMetadata.archiveTimestamp = Date.parse(payload.channel.thread_metadata.archive_timestamp) - if (payload.channel.thread_metadata?.create_timestamp) - channel.internalThreadMetadata.createTimestamp = Date.parse(payload.channel.thread_metadata.create_timestamp) - if (payload.channel.thread_metadata?.auto_archive_duration) - channel.internalThreadMetadata.autoArchiveDuration = payload.channel.thread_metadata.auto_archive_duration + if (payload.thread_metadata?.archive_timestamp) + channel.internalThreadMetadata.archiveTimestamp = Date.parse(payload.thread_metadata.archive_timestamp) + if (payload.thread_metadata?.create_timestamp) + channel.internalThreadMetadata.createTimestamp = Date.parse(payload.thread_metadata.create_timestamp) + if (payload.thread_metadata?.auto_archive_duration) + channel.internalThreadMetadata.autoArchiveDuration = payload.thread_metadata.auto_archive_duration } - if (props.defaultAutoArchiveDuration && payload.channel.default_auto_archive_duration) - channel.defaultAutoArchiveDuration = payload.channel.default_auto_archive_duration - if (props.permissions && payload.channel.permissions) channel.permissions = new Permissions(payload.channel.permissions) - if (props.flags) channel.flags = payload.channel.flags - if (props.permissionOverwrites && payload.channel.permission_overwrites) - channel.internalOverwrites = payload.channel.permission_overwrites.map((o) => packOverwrites(o.allow ?? '0', o.deny ?? '0', o.id, o.type)) - if (props.parentId && payload.channel.parent_id) channel.parentId = bot.transformers.snowflake(payload.channel.parent_id) - 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, { 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)) - if (props.appliedTags && payload.channel.applied_tags) channel.appliedTags = payload.channel.applied_tags.map((x) => bot.transformers.snowflake(x)) - if (props.defaultReactionEmoji && payload.channel.default_reaction_emoji) - channel.defaultReactionEmoji = bot.transformers.defaultReactionEmoji(bot, payload.channel.default_reaction_emoji) - if (props.defaultThreadRateLimitPerUser && payload.channel.default_thread_rate_limit_per_user) - channel.defaultThreadRateLimitPerUser = payload.channel.default_thread_rate_limit_per_user - if (props.defaultSortOrder && payload.channel.default_sort_order !== undefined) channel.defaultSortOrder = payload.channel.default_sort_order - if (props.defaultForumLayout && payload.channel.default_forum_layout !== undefined) - channel.defaultForumLayout = payload.channel.default_forum_layout + if (props.defaultAutoArchiveDuration && payload.default_auto_archive_duration) + channel.defaultAutoArchiveDuration = payload.default_auto_archive_duration + if (props.permissions && payload.permissions) channel.permissions = new Permissions(payload.permissions) + if (props.flags) channel.flags = payload.flags + if (props.permissionOverwrites && payload.permission_overwrites) + channel.internalOverwrites = payload.permission_overwrites.map((o) => packOverwrites(o.allow ?? '0', o.deny ?? '0', o.id, o.type)) + if (props.parentId && payload.parent_id) channel.parentId = bot.transformers.snowflake(payload.parent_id) + if (props.recipients && payload.recipients) channel.recipients = payload.recipients.map((u) => bot.transformers.user(bot, u)) + if (props.icon && payload.icon) channel.icon = iconHashToBigInt(payload.icon) + if (props.applicationId && payload.application_id) channel.applicationId = bot.transformers.snowflake(payload.application_id) + if (props.member && payload.member) channel.member = bot.transformers.threadMember(bot, payload.member, { guildId: extra?.guildId }) + if (props.totalMessageSent && payload.total_message_sent !== undefined) channel.totalMessageSent = payload.total_message_sent + if (props.availableTags && payload.available_tags) channel.availableTags = payload.available_tags.map((x) => bot.transformers.forumTag(bot, x)) + if (props.appliedTags && payload.applied_tags) channel.appliedTags = payload.applied_tags.map((x) => bot.transformers.snowflake(x)) + if (props.defaultReactionEmoji && payload.default_reaction_emoji) + channel.defaultReactionEmoji = bot.transformers.defaultReactionEmoji(bot, payload.default_reaction_emoji) + if (props.defaultThreadRateLimitPerUser && payload.default_thread_rate_limit_per_user) + channel.defaultThreadRateLimitPerUser = payload.default_thread_rate_limit_per_user + if (props.defaultSortOrder && payload.default_sort_order !== undefined) channel.defaultSortOrder = payload.default_sort_order + if (props.defaultForumLayout && payload.default_forum_layout !== undefined) channel.defaultForumLayout = payload.default_forum_layout - return bot.transformers.customizers.channel(bot, payload.channel, channel) + return bot.transformers.customizers.channel(bot, payload, channel, { + guildId: extra?.guildId ? bot.transformers.snowflake(extra.guildId) : undefined, + }) } export function transformForumTag(bot: Bot, payload: DiscordForumTag): ForumTag { diff --git a/packages/bot/src/transformers/guild.ts b/packages/bot/src/transformers/guild.ts index fcdb09523..f7a0f6328 100644 --- a/packages/bot/src/transformers/guild.ts +++ b/packages/bot/src/transformers/guild.ts @@ -21,33 +21,32 @@ export const baseGuild: Guild = { }, } -export function transformGuild(bot: Bot, payload: { guild: DiscordGuild; shardId: number }): Guild { - const guildId = bot.transformers.snowflake(payload.guild.id) +export function transformGuild(bot: Bot, payload: DiscordGuild, extra?: { shardId?: number }): Guild { + const guildId = bot.transformers.snowflake(payload.id) const props = bot.transformers.desiredProperties.guild const guild: SetupDesiredProps = Object.create(baseGuild) - if (props.afkTimeout && payload.guild.afk_timeout) guild.afkTimeout = payload.guild.afk_timeout - if (props.approximateMemberCount && payload.guild.approximate_member_count) guild.approximateMemberCount = payload.guild.approximate_member_count - if (props.approximatePresenceCount && payload.guild.approximate_presence_count) - guild.approximatePresenceCount = payload.guild.approximate_presence_count - if (props.defaultMessageNotifications) guild.defaultMessageNotifications = payload.guild.default_message_notifications - if (props.description && payload.guild.description) guild.description = payload.guild.description - if (props.toggles) guild.toggles = new GuildToggles(payload.guild) - if (props.explicitContentFilter) guild.explicitContentFilter = payload.guild.explicit_content_filter - if (props.maxMembers && payload.guild.max_members) guild.maxMembers = payload.guild.max_members - if (props.maxPresences && payload.guild.max_presences) guild.maxPresences = payload.guild.max_presences ?? undefined - if (props.maxVideoChannelUsers && payload.guild.max_video_channel_users) guild.maxVideoChannelUsers = payload.guild.max_video_channel_users - if (props.maxStageVideoChannelUsers && payload.guild.max_stage_video_channel_users) - guild.maxStageVideoChannelUsers = payload.guild.max_stage_video_channel_users - if (props.mfaLevel) guild.mfaLevel = payload.guild.mfa_level - if (props.name && payload.guild.name) guild.name = payload.guild.name - if (props.nsfwLevel) guild.nsfwLevel = payload.guild.nsfw_level - if (props.preferredLocale && payload.guild.preferred_locale) guild.preferredLocale = payload.guild.preferred_locale - if (props.premiumSubscriptionCount && payload.guild.premium_subscription_count !== undefined) - guild.premiumSubscriptionCount = payload.guild.premium_subscription_count - if (props.premiumTier) guild.premiumTier = payload.guild.premium_tier - if (props.stageInstances && payload.guild.stage_instances) - guild.stageInstances = payload.guild.stage_instances.map((si) => ({ + if (props.afkTimeout && payload.afk_timeout) guild.afkTimeout = payload.afk_timeout + if (props.approximateMemberCount && payload.approximate_member_count) guild.approximateMemberCount = payload.approximate_member_count + if (props.approximatePresenceCount && payload.approximate_presence_count) guild.approximatePresenceCount = payload.approximate_presence_count + if (props.defaultMessageNotifications) guild.defaultMessageNotifications = payload.default_message_notifications + if (props.description && payload.description) guild.description = payload.description + if (props.toggles) guild.toggles = new GuildToggles(payload) + if (props.explicitContentFilter) guild.explicitContentFilter = payload.explicit_content_filter + if (props.maxMembers && payload.max_members) guild.maxMembers = payload.max_members + if (props.maxPresences && payload.max_presences) guild.maxPresences = payload.max_presences ?? undefined + if (props.maxVideoChannelUsers && payload.max_video_channel_users) guild.maxVideoChannelUsers = payload.max_video_channel_users + if (props.maxStageVideoChannelUsers && payload.max_stage_video_channel_users) + guild.maxStageVideoChannelUsers = payload.max_stage_video_channel_users + if (props.mfaLevel) guild.mfaLevel = payload.mfa_level + if (props.name && payload.name) guild.name = payload.name + if (props.nsfwLevel) guild.nsfwLevel = payload.nsfw_level + if (props.preferredLocale && payload.preferred_locale) guild.preferredLocale = payload.preferred_locale + if (props.premiumSubscriptionCount && payload.premium_subscription_count !== undefined) + guild.premiumSubscriptionCount = payload.premium_subscription_count + if (props.premiumTier) guild.premiumTier = payload.premium_tier + if (props.stageInstances && payload.stage_instances) + guild.stageInstances = payload.stage_instances.map((si) => ({ /** The id of this Stage instance */ id: bot.transformers.snowflake(si.id), /** The guild id of the associated Stage channel */ @@ -57,97 +56,96 @@ export function transformGuild(bot: Bot, payload: { guild: DiscordGuild; shardId /** The topic of the Stage instance (1-120 characters) */ topic: si.topic, })) - if (props.channels && (!!payload.guild.channels || !!payload.guild.threads)) + if (props.channels && (!!payload.channels || !!payload.threads)) guild.channels = new Collection( - [...(payload.guild.channels ?? []), ...(payload.guild.threads ?? [])].map((channel) => { - const result = bot.transformers.channel(bot, { channel, guildId }) + [...(payload.channels ?? []), ...(payload.threads ?? [])].map((channel) => { + const result = bot.transformers.channel(bot, channel, { guildId }) // TODO: We should check that id exists, or else the collection will have undefined as it's key (This is valid for all the collections below as well) - // @ts-expect-error: We TODO above + // @ts-expect-error: See TODO above return [result.id, result] }), ) - if (props.members && payload.guild.members) + if (props.members && payload.members) guild.members = new Collection( - payload.guild.members.map((member) => { - const result = bot.transformers.member(bot, member, guildId, bot.transformers.snowflake(member.user!.id)) - // @ts-expect-error: We TODO above + payload.members.map((member) => { + const result = bot.transformers.member(bot, member, { guildId, userId: bot.transformers.snowflake(member.user!.id) }) + // @ts-expect-error: See TODO above return [result.id, result] }), ) - if (props.roles && payload.guild.roles) + if (props.roles && payload.roles) guild.roles = new Collection( - payload.guild.roles.map((role) => { - const result = bot.transformers.role(bot, { role, guildId }) - // @ts-expect-error: We TODO above + payload.roles.map((role) => { + const result = bot.transformers.role(bot, role, { guildId }) + // @ts-expect-error: See TODO above return [result.id, result] }), ) - if (props.emojis && payload.guild.emojis) + if (props.emojis && payload.emojis) guild.emojis = new Collection( - payload.guild.emojis.map((emoji) => { + payload.emojis.map((emoji) => { const result = bot.transformers.emoji(bot, emoji) - // @ts-expect-error: We TODO above + // @ts-expect-error: See TODO above return [result.id!, result] }), ) - if (props.voiceStates && payload.guild.voice_states) + if (props.voiceStates && payload.voice_states) guild.voiceStates = new Collection( - payload.guild.voice_states.map((voiceState) => { - const result = bot.transformers.voiceState(bot, { voiceState, guildId }) - // @ts-expect-error: We TODO above + payload.voice_states.map((voiceState) => { + const result = bot.transformers.voiceState(bot, voiceState, { guildId }) + // @ts-expect-error: See TODO above return [result.userId, result] }), ) - if (props.stickers && payload.guild.stickers) + if (props.stickers && payload.stickers) guild.stickers = new Collection( - payload.guild.stickers?.map((sticker) => { + payload.stickers?.map((sticker) => { const result = bot.transformers.sticker(bot, sticker) - // @ts-expect-error: We TODO above + // @ts-expect-error: See TODO above return [result.id, result] }), ) - if (props.systemChannelFlags && payload.guild.system_channel_flags) guild.systemChannelFlags = payload.guild.system_channel_flags - if (props.vanityUrlCode && payload.guild.vanity_url_code) guild.vanityUrlCode = payload.guild.vanity_url_code - if (props.verificationLevel) guild.verificationLevel = payload.guild.verification_level - if (props.welcomeScreen && payload.guild.welcome_screen) + if (props.systemChannelFlags && payload.system_channel_flags) guild.systemChannelFlags = payload.system_channel_flags + if (props.vanityUrlCode && payload.vanity_url_code) guild.vanityUrlCode = payload.vanity_url_code + if (props.verificationLevel) guild.verificationLevel = payload.verification_level + if (props.welcomeScreen && payload.welcome_screen) guild.welcomeScreen = { - description: payload.guild.welcome_screen.description ?? undefined, - welcomeChannels: payload.guild.welcome_screen.welcome_channels.map((wc) => ({ + description: payload.welcome_screen.description ?? undefined, + welcomeChannels: payload.welcome_screen.welcome_channels.map((wc) => ({ channelId: bot.transformers.snowflake(wc.channel_id), description: wc.description, emojiId: wc.emoji_id ? bot.transformers.snowflake(wc.emoji_id) : undefined, emojiName: wc.emoji_name ?? undefined, })), } - if (props.discoverySplash && payload.guild.discovery_splash) guild.discoverySplash = iconHashToBigInt(payload.guild.discovery_splash) - if (props.joinedAt && payload.guild.joined_at) guild.joinedAt = Date.parse(payload.guild.joined_at) - if (props.memberCount && payload.guild.member_count) guild.memberCount = payload.guild.member_count ?? 0 - if (props.shardId) guild.shardId = payload.shardId - if (props.icon && payload.guild.icon) guild.icon = iconHashToBigInt(payload.guild.icon) - if (props.banner && payload.guild.banner) guild.banner = iconHashToBigInt(payload.guild.banner) - if (props.splash && payload.guild.splash) guild.splash = iconHashToBigInt(payload.guild.splash) - if (props.id && payload.guild.id) guild.id = guildId - if (props.ownerId && payload.guild.owner_id) guild.ownerId = bot.transformers.snowflake(payload.guild.owner_id) - if (props.permissions && payload.guild.permissions) guild.permissions = bot.transformers.snowflake(payload.guild.permissions) - if (props.afkChannelId && payload.guild.afk_channel_id) guild.afkChannelId = bot.transformers.snowflake(payload.guild.afk_channel_id) - if (props.widgetChannelId && payload.guild.widget_channel_id) guild.widgetChannelId = bot.transformers.snowflake(payload.guild.widget_channel_id) - if (props.applicationId && payload.guild.application_id) guild.applicationId = bot.transformers.snowflake(payload.guild.application_id) - if (props.systemChannelId && payload.guild.system_channel_id) guild.systemChannelId = bot.transformers.snowflake(payload.guild.system_channel_id) - if (props.rulesChannelId && payload.guild.rules_channel_id) guild.rulesChannelId = bot.transformers.snowflake(payload.guild.rules_channel_id) - if (props.publicUpdatesChannelId && payload.guild.public_updates_channel_id) - guild.publicUpdatesChannelId = bot.transformers.snowflake(payload.guild.public_updates_channel_id) - if (props.premiumProgressBarEnabled && payload.guild.premium_progress_bar_enabled) - guild.premiumProgressBarEnabled = payload.guild.premium_progress_bar_enabled - if (props.large && payload.guild.large) guild.large = payload.guild.large - if (props.owner && payload.guild.owner) guild.owner = payload.guild.owner - if (props.widgetEnabled && payload.guild.widget_enabled) guild.widgetEnabled = payload.guild.widget_enabled - if (props.unavailable && payload.guild.unavailable) guild.unavailable = payload.guild.unavailable - if (props.iconHash && payload.guild.icon_hash) guild.iconHash = iconHashToBigInt(payload.guild.icon_hash) - if (props.presences && payload.guild.presences) - guild.presences = payload.guild.presences?.map((presence) => bot.transformers.presence(bot, presence as DiscordPresenceUpdate)) - if (props.safetyAlertsChannelId && payload.guild.safety_alerts_channel_id) - guild.safetyAlertsChannelId = bot.transformers.snowflake(payload.guild.safety_alerts_channel_id) - if (props.incidentsData && payload.guild.incidents_data) guild.incidentsData = bot.transformers.incidentsData(bot, payload.guild.incidents_data) + if (props.discoverySplash && payload.discovery_splash) guild.discoverySplash = iconHashToBigInt(payload.discovery_splash) + if (props.joinedAt && payload.joined_at) guild.joinedAt = Date.parse(payload.joined_at) + if (props.memberCount && payload.member_count) guild.memberCount = payload.member_count ?? 0 + if (props.shardId && extra?.shardId) guild.shardId = extra.shardId + if (props.icon && payload.icon) guild.icon = iconHashToBigInt(payload.icon) + if (props.banner && payload.banner) guild.banner = iconHashToBigInt(payload.banner) + if (props.splash && payload.splash) guild.splash = iconHashToBigInt(payload.splash) + if (props.id && payload.id) guild.id = guildId + if (props.ownerId && payload.owner_id) guild.ownerId = bot.transformers.snowflake(payload.owner_id) + if (props.permissions && payload.permissions) guild.permissions = bot.transformers.snowflake(payload.permissions) + if (props.afkChannelId && payload.afk_channel_id) guild.afkChannelId = bot.transformers.snowflake(payload.afk_channel_id) + if (props.widgetChannelId && payload.widget_channel_id) guild.widgetChannelId = bot.transformers.snowflake(payload.widget_channel_id) + if (props.applicationId && payload.application_id) guild.applicationId = bot.transformers.snowflake(payload.application_id) + if (props.systemChannelId && payload.system_channel_id) guild.systemChannelId = bot.transformers.snowflake(payload.system_channel_id) + if (props.rulesChannelId && payload.rules_channel_id) guild.rulesChannelId = bot.transformers.snowflake(payload.rules_channel_id) + if (props.publicUpdatesChannelId && payload.public_updates_channel_id) + guild.publicUpdatesChannelId = bot.transformers.snowflake(payload.public_updates_channel_id) + if (props.premiumProgressBarEnabled && payload.premium_progress_bar_enabled) guild.premiumProgressBarEnabled = payload.premium_progress_bar_enabled + if (props.large && payload.large) guild.large = payload.large + if (props.owner && payload.owner) guild.owner = payload.owner + if (props.widgetEnabled && payload.widget_enabled) guild.widgetEnabled = payload.widget_enabled + if (props.unavailable && payload.unavailable) guild.unavailable = payload.unavailable + if (props.iconHash && payload.icon_hash) guild.iconHash = iconHashToBigInt(payload.icon_hash) + if (props.presences && payload.presences) + guild.presences = payload.presences?.map((presence) => bot.transformers.presence(bot, presence as DiscordPresenceUpdate)) + if (props.safetyAlertsChannelId && payload.safety_alerts_channel_id) + guild.safetyAlertsChannelId = bot.transformers.snowflake(payload.safety_alerts_channel_id) + if (props.incidentsData && payload.incidents_data) guild.incidentsData = bot.transformers.incidentsData(bot, payload.incidents_data) - return bot.transformers.customizers.guild(bot, payload.guild, guild) + return bot.transformers.customizers.guild(bot, payload, guild, extra) } diff --git a/packages/bot/src/transformers/interaction.ts b/packages/bot/src/transformers/interaction.ts index a6794c4ef..bb1267640 100644 --- a/packages/bot/src/transformers/interaction.ts +++ b/packages/bot/src/transformers/interaction.ts @@ -13,10 +13,10 @@ import { import { Collection } from '@discordeno/utils' import type { Attachment, + BigString, Bot, CompleteDesiredProperties, DesiredPropertiesBehavior, - DiscordChannel, Interaction, InteractionCallback, InteractionCallbackResponse, @@ -136,81 +136,75 @@ export const baseInteraction: SetupDesiredProps = Object.create(baseInteraction) const props = bot.transformers.desiredProperties.interaction - // Typescript has an hard time with this, so we need to tell him for sure this is a Bot - interaction.bot = bot as unknown as Bot + + interaction.bot = bot interaction.acknowledged = false - 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.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.guild && payload.guild) + // @ts-expect-error payload.guild is a Partial + interaction.guild = bot.transformers.guild(bot, payload.guild, { shardId: extra?.shardId }) if (props.guildId && guildId) interaction.guildId = guildId if (props.user) { - if (payload.interaction.member?.user) interaction.user = bot.transformers.user(bot, payload.interaction.member?.user) - else if (payload.interaction.user) interaction.user = bot.transformers.user(bot, payload.interaction.user) + if (payload.member?.user) interaction.user = bot.transformers.user(bot, payload.member?.user) + else if (payload.user) interaction.user = bot.transformers.user(bot, payload.user) } - 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, { message: payload.interaction.message, shardId: 0 }) - 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, + 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, { shardId: extra?.shardId }) + if (props.channel && payload.channel) + // @ts-expect-error payload.channel is a Partial<> + interaction.channel = bot.transformers.channel(bot, payload.channel, { 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, - payload.interaction.member?.user.id ?? payload.interaction.user?.id, - ) - if (props.entitlements && payload.interaction.entitlements) - interaction.entitlements = payload.interaction.entitlements.map((e) => bot.transformers.entitlement(bot, e)) - if (props.authorizingIntegrationOwners && payload.interaction.authorizing_integration_owners) { + userId: payload.member?.user.id ?? payload.user?.id, + }) + if (props.entitlements && payload.entitlements) interaction.entitlements = payload.entitlements.map((e) => bot.transformers.entitlement(bot, e)) + if (props.authorizingIntegrationOwners && payload.authorizing_integration_owners) { interaction.authorizingIntegrationOwners = {} - if (payload.interaction.authorizing_integration_owners['0']) + if (payload.authorizing_integration_owners['0']) interaction.authorizingIntegrationOwners[DiscordApplicationIntegrationType.GuildInstall] = bot.transformers.snowflake( - payload.interaction.authorizing_integration_owners['0'], + payload.authorizing_integration_owners['0'], ) - if (payload.interaction.authorizing_integration_owners['1']) + if (payload.authorizing_integration_owners['1']) interaction.authorizingIntegrationOwners[DiscordApplicationIntegrationType.UserInstall] = bot.transformers.snowflake( - payload.interaction.authorizing_integration_owners['1'], + payload.authorizing_integration_owners['1'], ) } - if (props.context && payload.interaction.context) interaction.context = payload.interaction.context - if (props.attachmentSizeLimit && payload.interaction.attachment_size_limit) - interaction.attachmentSizeLimit = payload.interaction.attachment_size_limit - if (props.data && payload.interaction.data) { + if (props.context && payload.context) interaction.context = payload.context + if (props.attachmentSizeLimit && payload.attachment_size_limit) interaction.attachmentSizeLimit = payload.attachment_size_limit + if (props.data && payload.data) { interaction.data = { - 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 - ? bot.transformers.interactionDataResolved(bot, { resolved: payload.interaction.data.resolved, shardId: payload.shardId, guildId }) + 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 + ? bot.transformers.interactionDataResolved(bot, payload.data.resolved, { shardId: extra?.shardId, 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, + options: payload.data.options?.map((opt) => bot.transformers.interactionDataOptions(bot, opt)), + targetId: payload.data.target_id ? bot.transformers.snowflake(payload.data.target_id) : undefined, } } // Typescript has an hard time with interaction.bot, so we need to tell him for sure this interaction is the of the correct type - return bot.transformers.customizers.interaction(bot, payload, interaction as unknown as typeof bot.transformers.$inferredTypes.interaction) + return bot.transformers.customizers.interaction(bot, payload, interaction as unknown as typeof bot.transformers.$inferredTypes.interaction, extra) } export function transformInteractionDataOption(bot: Bot, option: DiscordInteractionDataOption): InteractionDataOption { @@ -227,37 +221,38 @@ export function transformInteractionDataOption(bot: Bot, option: DiscordInteract export function transformInteractionDataResolved( bot: Bot, - payload: { resolved: DiscordInteractionDataResolved; shardId: number; guildId?: bigint }, + payload: DiscordInteractionDataResolved, + extra?: { shardId?: number; guildId?: BigString }, ): TransformProperty { const transformed: InteractionDataResolved = {} - if (payload.resolved.messages) { + if (payload.messages) { transformed.messages = new Collection( - Object.entries(payload.resolved.messages).map(([_id, value]) => { + Object.entries(payload.messages).map(([_id, value]) => { // @ts-expect-error TODO: Deal with partials - const message = bot.transformers.message(bot, { message: value, shardId: payload.shardId }) as Message + const message = bot.transformers.message(bot, value, { shardId: extra?.shardId }) as Message return [message.id, message] }), ) } - if (payload.resolved.users) { + if (payload.users) { transformed.users = new Collection( - Object.entries(payload.resolved.users).map(([_id, value]) => { + Object.entries(payload.users).map(([_id, value]) => { const user = bot.transformers.user(bot, value) as User return [user.id, user] }), ) } - if (payload.guildId && payload.resolved.members) { + if (extra?.guildId && payload.members) { transformed.members = new Collection( - Object.entries(payload.resolved.members).map(([id, value]) => { + Object.entries(payload.members).map(([id, value]) => { // @ts-expect-error TODO: Deal with partials, value is missing 2 values but the transformer can handle it, despite what the types says - const member = bot.transformers.member(bot, value, payload.guildId!, bot.transformers.snowflake(id)) as InteractionResolvedDataMember< - TransformersDesiredProperties, - DesiredPropertiesBehavior - > + const member = bot.transformers.member(bot, value, { + guildId: extra.guildId, + userId: bot.transformers.snowflake(id), + }) as InteractionResolvedDataMember // We need to tell TS that we are sure the id is a bigint return [member.id as bigint, member] @@ -265,19 +260,19 @@ export function transformInteractionDataResolved( ) } - if (payload.guildId && payload.resolved.roles) { + if (extra?.guildId && payload.roles) { transformed.roles = new Collection( - Object.entries(payload.resolved.roles).map(([_id, value]) => { - const role = bot.transformers.role(bot, { role: value, guildId: payload.guildId! }) as Role + Object.entries(payload.roles).map(([_id, value]) => { + const role = bot.transformers.role(bot, value, { guildId: extra.guildId }) as Role return [role.id, role] }), ) } - if (payload.resolved.channels) { + if (payload.channels) { transformed.channels = new Collection( - Object.entries(payload.resolved.channels).map(([_id, value]) => { - const channel = bot.transformers.channel(bot, { channel: value }) as unknown as InteractionResolvedDataChannel< + Object.entries(payload.channels).map(([_id, value]) => { + const channel = bot.transformers.channel(bot, value) as unknown as InteractionResolvedDataChannel< TransformersDesiredProperties, DesiredPropertiesBehavior > @@ -287,9 +282,9 @@ export function transformInteractionDataResolved( ) } - if (payload.resolved.attachments) { + if (payload.attachments) { transformed.attachments = new Collection( - Object.entries(payload.resolved.attachments).map(([key, value]) => { + Object.entries(payload.attachments).map(([key, value]) => { const id = bot.transformers.snowflake(key) const attachment = bot.transformers.attachment(bot, value) as Attachment return [id, attachment] @@ -297,25 +292,24 @@ export function transformInteractionDataResolved( ) } - return bot.transformers.customizers.interactionDataResolved(bot, payload, transformed) + return bot.transformers.customizers.interactionDataResolved(bot, payload, transformed, { + shardId: extra?.shardId, + guildId: extra?.guildId ? bot.transformers.snowflake(extra.guildId) : undefined, + }) } export function transformInteractionCallbackResponse( bot: Bot, - payload: { interactionCallbackResponse: DiscordInteractionCallbackResponse; shardId: number }, + payload: DiscordInteractionCallbackResponse, + extra?: { shardId?: number }, ): InteractionCallbackResponse { const props = bot.transformers.desiredProperties.interactionCallbackResponse const response = {} as SetupDesiredProps - if (props.interaction && payload.interactionCallbackResponse.interaction) - response.interaction = bot.transformers.interactionCallback(bot, payload.interactionCallbackResponse.interaction) - if (props.resource && payload.interactionCallbackResponse.resource) - response.resource = bot.transformers.interactionResource(bot, { - interactionResource: payload.interactionCallbackResponse.resource, - shardId: payload.shardId, - }) + if (props.interaction && payload.interaction) response.interaction = bot.transformers.interactionCallback(bot, payload.interaction) + if (props.resource && payload.resource) response.resource = bot.transformers.interactionResource(bot, payload.resource, { shardId: extra?.shardId }) - return bot.transformers.customizers.interactionCallbackResponse(bot, payload.interactionCallbackResponse, response) + return bot.transformers.customizers.interactionCallbackResponse(bot, payload, response, extra) } export function transformInteractionCallback(bot: Bot, payload: DiscordInteractionCallback): InteractionCallback { @@ -332,18 +326,13 @@ export function transformInteractionCallback(bot: Bot, payload: DiscordInteracti return bot.transformers.customizers.interactionCallback(bot, payload, callback) } -export function transformInteractionResource( - bot: Bot, - payload: { interactionResource: DiscordInteractionResource; shardId: number }, -): InteractionResource { +export function transformInteractionResource(bot: Bot, payload: DiscordInteractionResource, extra?: { shardId?: number }): InteractionResource { const props = bot.transformers.desiredProperties.interactionResource const resource = {} as SetupDesiredProps - if (props.type && payload.interactionResource.type) resource.type = payload.interactionResource.type - if (props.activityInstance && payload.interactionResource.activity_instance) - resource.activityInstance = payload.interactionResource.activity_instance - if (props.message && payload.interactionResource.message) - resource.message = bot.transformers.message(bot, { message: payload.interactionResource.message, shardId: payload.shardId }) + if (props.type && payload.type) resource.type = payload.type + if (props.activityInstance && payload.activity_instance) resource.activityInstance = payload.activity_instance + if (props.message && payload.message) resource.message = bot.transformers.message(bot, payload.message, { shardId: extra?.shardId }) - return bot.transformers.customizers.interactionResource(bot, payload.interactionResource, resource) + return bot.transformers.customizers.interactionResource(bot, payload, resource, extra) } diff --git a/packages/bot/src/transformers/invite.ts b/packages/bot/src/transformers/invite.ts index 0b2b26ec7..2915eb171 100644 --- a/packages/bot/src/transformers/invite.ts +++ b/packages/bot/src/transformers/invite.ts @@ -1,4 +1,4 @@ -import type { DiscordApplication, DiscordInviteCreate, DiscordInviteMetadata } from '@discordeno/types' +import type { DiscordInviteCreate, DiscordInviteMetadata } from '@discordeno/types' import { type Bot, type DesiredPropertiesBehavior, @@ -9,49 +9,43 @@ import { type TransformersDesiredProperties, } from '../index.js' -export function transformInvite(bot: Bot, payload: { invite: DiscordInviteCreate | DiscordInviteMetadata; shardId: number }): Invite { +export function transformInvite(bot: Bot, payload: DiscordInviteCreate | DiscordInviteMetadata, extra?: { shardId?: number }): Invite { const props = bot.transformers.desiredProperties.invite const invite = {} as SetupDesiredProps - if (props.type && 'type' in payload.invite) invite.type = payload.invite.type - if (props.code && payload.invite.code) invite.code = payload.invite.code - if (props.createdAt && payload.invite.created_at) invite.createdAt = Date.parse(payload.invite.created_at) - if (props.inviter && payload.invite.inviter) invite.inviter = bot.transformers.user(bot, payload.invite.inviter) - if (props.maxAge) invite.maxAge = payload.invite.max_age - if (props.maxUses) invite.maxUses = payload.invite.max_uses - if (props.targetType && payload.invite.target_type) invite.targetType = payload.invite.target_type - if (props.targetUser && payload.invite.target_user) invite.targetUser = bot.transformers.user(bot, payload.invite.target_user) - if (props.targetApplication && payload.invite.target_application) - invite.targetApplication = bot.transformers.application(bot, { - application: payload.invite.target_application as DiscordApplication, - shardId: payload.shardId, - }) - if (props.temporary && payload.invite.temporary) invite.temporary = payload.invite.temporary - if (props.uses && payload.invite.uses) invite.uses = payload.invite.uses + if (props.type && 'type' in payload) invite.type = payload.type + if (props.code && payload.code) invite.code = payload.code + if (props.createdAt && payload.created_at) invite.createdAt = Date.parse(payload.created_at) + if (props.inviter && payload.inviter) invite.inviter = bot.transformers.user(bot, payload.inviter) + if (props.maxAge) invite.maxAge = payload.max_age + if (props.maxUses) invite.maxUses = payload.max_uses + if (props.targetType && payload.target_type) invite.targetType = payload.target_type + if (props.targetUser && payload.target_user) invite.targetUser = bot.transformers.user(bot, payload.target_user) + if (props.targetApplication && payload.target_application) + // @ts-expect-error TODO: Partials + invite.targetApplication = bot.transformers.application(bot, payload.target_application, { shardId: extra?.shardId }) + if (props.temporary && payload.temporary) invite.temporary = payload.temporary + if (props.uses && payload.uses) invite.uses = payload.uses - if (isInviteWithMetadata(payload.invite)) { - if (props.channelId && payload.invite.channel?.id) invite.channelId = bot.transformers.snowflake(payload.invite.channel.id) - if (props.guildId && payload.invite.guild?.id) invite.guildId = bot.transformers.snowflake(payload.invite.guild.id) - if (props.approximateMemberCount && payload.invite.approximate_member_count) - invite.approximateMemberCount = payload.invite.approximate_member_count - if (props.approximatePresenceCount && payload.invite.approximate_presence_count !== undefined) - invite.approximatePresenceCount = payload.invite.approximate_presence_count - if (props.guildScheduledEvent && payload.invite.guild_scheduled_event) - invite.guildScheduledEvent = bot.transformers.scheduledEvent(bot, payload.invite.guild_scheduled_event) - if (props.stageInstance && payload.invite.guild?.id && payload.invite.stage_instance) { - invite.stageInstance = bot.transformers.inviteStageInstance(bot, { - ...payload.invite.stage_instance, - guildId: bot.transformers.snowflake(payload.invite.guild.id), - }) + if (isInviteWithMetadata(payload)) { + if (props.channelId && payload.channel?.id) invite.channelId = bot.transformers.snowflake(payload.channel.id) + if (props.guildId && payload.guild?.id) invite.guildId = bot.transformers.snowflake(payload.guild.id) + if (props.approximateMemberCount && payload.approximate_member_count) invite.approximateMemberCount = payload.approximate_member_count + if (props.approximatePresenceCount && payload.approximate_presence_count !== undefined) + invite.approximatePresenceCount = payload.approximate_presence_count + if (props.guildScheduledEvent && payload.guild_scheduled_event) + invite.guildScheduledEvent = bot.transformers.scheduledEvent(bot, payload.guild_scheduled_event) + if (props.stageInstance && payload.guild?.id && payload.stage_instance) { + invite.stageInstance = bot.transformers.inviteStageInstance(bot, payload.stage_instance, { guildId: payload.guild.id }) } - if (props.expiresAt && payload.invite.expires_at) { - invite.expiresAt = Date.parse(payload.invite.expires_at) + if (props.expiresAt && payload.expires_at) { + invite.expiresAt = Date.parse(payload.expires_at) } - if (props.flags && payload.invite.flags) invite.flags = new ToggleBitfield(payload.invite.flags) + if (props.flags && payload.flags) invite.flags = new ToggleBitfield(payload.flags) } else { - if (props.channelId && payload.invite.channel_id) invite.channelId = bot.transformers.snowflake(payload.invite.channel_id) - if (props.guildId && payload.invite.guild_id) invite.guildId = bot.transformers.snowflake(payload.invite.guild_id) + if (props.channelId && payload.channel_id) invite.channelId = bot.transformers.snowflake(payload.channel_id) + if (props.guildId && payload.guild_id) invite.guildId = bot.transformers.snowflake(payload.guild_id) } - return bot.transformers.customizers.invite(bot, payload.invite, invite) + return bot.transformers.customizers.invite(bot, payload, invite, extra) } diff --git a/packages/bot/src/transformers/lobby.ts b/packages/bot/src/transformers/lobby.ts index cea834329..d80954017 100644 --- a/packages/bot/src/transformers/lobby.ts +++ b/packages/bot/src/transformers/lobby.ts @@ -17,7 +17,7 @@ export function transformLobby(bot: Bot, payload: DiscordLobby): Lobby { if (props.applicationId && payload.application_id) lobby.applicationId = bot.transformers.snowflake(payload.application_id) if (props.metadata && payload.metadata) lobby.metadata = payload.metadata if (props.members && payload.members) lobby.members = payload.members.map((member) => bot.transformers.lobbyMember(bot, member)) - if (props.linkedChannel && payload.linked_channel) lobby.linkedChannel = bot.transformers.channel(bot, { channel: payload.linked_channel }) + if (props.linkedChannel && payload.linked_channel) lobby.linkedChannel = bot.transformers.channel(bot, payload.linked_channel) return bot.transformers.customizers.lobby(bot, payload, lobby) } diff --git a/packages/bot/src/transformers/member.ts b/packages/bot/src/transformers/member.ts index 21782dce4..bb6d7dff3 100644 --- a/packages/bot/src/transformers/member.ts +++ b/packages/bot/src/transformers/member.ts @@ -36,12 +36,12 @@ export const baseMember: Member = { }, } -export function transformMember(bot: Bot, payload: DiscordMember, guildId: BigString | undefined, userId: BigString): Member { +export function transformMember(bot: Bot, payload: DiscordMember, extra?: { guildId?: BigString; userId?: BigString }): Member { const member: SetupDesiredProps = Object.create(baseMember) const props = bot.transformers.desiredProperties.member - if (props.id && userId) member.id = typeof userId === 'string' ? bot.transformers.snowflake(userId) : userId - if (props.guildId && guildId) member.guildId = typeof guildId === 'string' ? bot.transformers.snowflake(guildId) : guildId + if (props.id && extra?.userId) member.id = typeof extra.userId === 'string' ? bot.transformers.snowflake(extra.userId) : extra.userId + if (props.guildId && extra?.guildId) member.guildId = typeof extra.guildId === 'string' ? bot.transformers.snowflake(extra.guildId) : extra.guildId if (props.user && payload.user) member.user = bot.transformers.user(bot, payload.user) if (props.nick && payload.nick) member.nick = payload.nick if (props.roles && payload.roles) member.roles = payload.roles.map((id) => bot.transformers.snowflake(id)) @@ -56,5 +56,8 @@ export function transformMember(bot: Bot, payload: DiscordMember, guildId: BigSt if (props.avatarDecorationData && payload.avatar_decoration_data) member.avatarDecorationData = bot.transformers.avatarDecorationData(bot, payload.avatar_decoration_data) - return bot.transformers.customizers.member(bot, payload, member) + return bot.transformers.customizers.member(bot, payload, member, { + guildId: extra?.guildId ? bot.transformers.snowflake(extra.guildId) : undefined, + userId: extra?.userId ? bot.transformers.snowflake(extra.userId) : undefined, + }) } diff --git a/packages/bot/src/transformers/message.ts b/packages/bot/src/transformers/message.ts index a30c4e43f..6487d051f 100644 --- a/packages/bot/src/transformers/message.ts +++ b/packages/bot/src/transformers/message.ts @@ -1,5 +1,4 @@ import { - type DiscordApplication, DiscordApplicationIntegrationType, type DiscordMessage, type DiscordMessageCall, @@ -142,102 +141,97 @@ export const baseMessage: Message = { }, } -export function transformMessage(bot: Bot, payload: { message: DiscordMessage; shardId: number }): Message { - const guildId = payload.message.guild_id ? bot.transformers.snowflake(payload.message.guild_id) : undefined - const userId = payload.message.author?.id ? bot.transformers.snowflake(payload.message.author.id) : undefined +export function transformMessage(bot: Bot, payload: DiscordMessage, extra?: { shardId?: number }): Message { + const guildId = payload.guild_id ? bot.transformers.snowflake(payload.guild_id) : undefined + const userId = payload.author?.id ? bot.transformers.snowflake(payload.author.id) : undefined const message: SetupDesiredProps = Object.create(baseMessage) message.bitfield = new ToggleBitfield() - message.flags = new ToggleBitfield(payload.message.flags) + message.flags = new ToggleBitfield(payload.flags) const props = bot.transformers.desiredProperties.message - if (props.author && payload.message.author) message.author = bot.transformers.user(bot, payload.message.author) - if (props.application && payload.message.application) - message.application = bot.transformers.application(bot, { - application: payload.message.application as DiscordApplication, - shardId: payload.shardId, - }) - if (props.applicationId && payload.message.application_id) message.applicationId = bot.transformers.snowflake(payload.message.application_id) - if (props.attachments && payload.message.attachments?.length) - message.attachments = payload.message.attachments.map((attachment) => bot.transformers.attachment(bot, attachment)) - if (props.channelId && payload.message.channel_id) message.channelId = bot.transformers.snowflake(payload.message.channel_id) - if (props.components && payload.message.components?.length) - message.components = payload.message.components.map((comp) => bot.transformers.component(bot, comp)) - if (props.content) message.content = payload.message.content ?? EMPTY_STRING - if (props.editedTimestamp && payload.message.edited_timestamp) message.editedTimestamp = Date.parse(payload.message.edited_timestamp) - if (props.embeds && payload.message.embeds?.length) message.embeds = payload.message.embeds.map((embed) => bot.transformers.embed(bot, embed)) + if (props.author && payload.author) message.author = bot.transformers.user(bot, payload.author) + if (props.application && payload.application) + // @ts-expect-error TODO: Partials + message.application = bot.transformers.application(bot, payload.application, { shardId: extra?.shardId }) + if (props.applicationId && payload.application_id) message.applicationId = bot.transformers.snowflake(payload.application_id) + if (props.attachments && payload.attachments?.length) + message.attachments = payload.attachments.map((attachment) => bot.transformers.attachment(bot, attachment)) + if (props.channelId && payload.channel_id) message.channelId = bot.transformers.snowflake(payload.channel_id) + if (props.components && payload.components?.length) message.components = payload.components.map((comp) => bot.transformers.component(bot, comp)) + if (props.content) message.content = payload.content ?? EMPTY_STRING + if (props.editedTimestamp && payload.edited_timestamp) message.editedTimestamp = Date.parse(payload.edited_timestamp) + if (props.embeds && payload.embeds?.length) message.embeds = payload.embeds.map((embed) => bot.transformers.embed(bot, embed)) if (props.guildId && guildId) message.guildId = guildId - if (props.id && payload.message.id) message.id = bot.transformers.snowflake(payload.message.id) - if (props.interactionMetadata && payload.message.interaction_metadata) - message.interactionMetadata = bot.transformers.messageInteractionMetadata(bot, payload.message.interaction_metadata) - if (props.interaction && payload.message.interaction) { + if (props.id && payload.id) message.id = bot.transformers.snowflake(payload.id) + if (props.interactionMetadata && payload.interaction_metadata) + message.interactionMetadata = bot.transformers.messageInteractionMetadata(bot, payload.interaction_metadata) + if (props.interaction && payload.interaction) { const interaction = {} as SetupDesiredProps const messageInteractionProps = bot.transformers.desiredProperties.messageInteraction if (messageInteractionProps.id) { - interaction.id = bot.transformers.snowflake(payload.message.interaction.id) + interaction.id = bot.transformers.snowflake(payload.interaction.id) } - if (messageInteractionProps.member && payload.message.interaction.member) { + if (messageInteractionProps.member && payload.interaction.member) { // @ts-expect-error TODO: partial - check why this is partial and handle as needed - interaction.member = bot.transformers.member(bot, payload.message.interaction.member, guildId, payload.message.interaction.user.id) + interaction.member = bot.transformers.member(bot, payload.interaction.member, { guildId, userId: payload.interaction.user.id }) } if (messageInteractionProps.name) { - interaction.name = payload.message.interaction.name + interaction.name = payload.interaction.name } if (messageInteractionProps.type) { - interaction.type = payload.message.interaction.type + interaction.type = payload.interaction.type } if (messageInteractionProps.user) { - interaction.user = bot.transformers.user(bot, payload.message.interaction.user) + interaction.user = bot.transformers.user(bot, payload.interaction.user) } message.interaction = interaction } - if (props.member && guildId && userId && payload.message.member) + if (props.member && guildId && userId && payload.member) // @ts-expect-error TODO: partial - message.member = bot.transformers.member(bot, payload.message.member, guildId, userId) - if (payload.message.mention_everyone) message.mentionEveryone = true - if (props.mentionedChannelIds && payload.message.mention_channels?.length) { + message.member = bot.transformers.member(bot, payload.member, { guildId, userId }) + if (payload.mention_everyone) message.mentionEveryone = true + if (props.mentionedChannelIds && payload.mention_channels?.length) { message.mentionedChannelIds = [ // Keep any ids tht discord sends - ...(payload.message.mention_channels ?? []).map((m) => bot.transformers.snowflake(m.id)), + ...(payload.mention_channels ?? []).map((m) => bot.transformers.snowflake(m.id)), // Add any other ids that can be validated in a channel mention format - ...(payload.message.content?.match(CHANNEL_MENTION_REGEX) ?? []).map((text) => + ...(payload.content?.match(CHANNEL_MENTION_REGEX) ?? []).map((text) => // converts the <#123> into 123 bot.transformers.snowflake(text.substring(2, text.length - 1)), ), ] } - if (props.mentionedRoleIds && payload.message.mention_roles?.length) - message.mentionedRoleIds = payload.message.mention_roles.map((id) => bot.transformers.snowflake(id)) - if (props.mentions && payload.message.mentions?.length) message.mentions = payload.message.mentions.map((user) => bot.transformers.user(bot, user)) - if (props.messageReference && payload.message.message_reference) { + if (props.mentionedRoleIds && payload.mention_roles?.length) + message.mentionedRoleIds = payload.mention_roles.map((id) => bot.transformers.snowflake(id)) + if (props.mentions && payload.mentions?.length) message.mentions = payload.mentions.map((user) => bot.transformers.user(bot, user)) + if (props.messageReference && payload.message_reference) { const reference = {} as NonNullable const messageReferenceProps = bot.transformers.desiredProperties.messageReference - if (messageReferenceProps.channelId && payload.message.message_reference.channel_id) { - reference.channelId = bot.transformers.snowflake(payload.message.message_reference.channel_id) + if (messageReferenceProps.channelId && payload.message_reference.channel_id) { + reference.channelId = bot.transformers.snowflake(payload.message_reference.channel_id) } - if (messageReferenceProps.guildId && payload.message.message_reference.guild_id) { - reference.guildId = bot.transformers.snowflake(payload.message.message_reference.guild_id) + if (messageReferenceProps.guildId && payload.message_reference.guild_id) { + reference.guildId = bot.transformers.snowflake(payload.message_reference.guild_id) } - if (messageReferenceProps.messageId && payload.message.message_reference.message_id) { - reference.messageId = bot.transformers.snowflake(payload.message.message_reference.message_id) + if (messageReferenceProps.messageId && payload.message_reference.message_id) { + reference.messageId = bot.transformers.snowflake(payload.message_reference.message_id) } message.messageReference = reference } - if (props.referencedMessage && payload.message.referenced_message) - message.referencedMessage = bot.transformers.message(bot, { message: payload.message.referenced_message, shardId: payload.shardId }) - if (props.messageSnapshots && payload.message.message_snapshots) - message.messageSnapshots = payload.message.message_snapshots.map((snap) => - bot.transformers.messageSnapshot(bot, { messageSnapshot: snap, shardId: payload.shardId }), - ) - if (props.nonce && payload.message.nonce) message.nonce = payload.message.nonce - if (payload.message.pinned) message.pinned = true - if (props.reactions && payload.message.reactions?.length) { - message.reactions = payload.message.reactions.map((reaction) => ({ + if (props.referencedMessage && payload.referenced_message) + message.referencedMessage = bot.transformers.message(bot, payload.referenced_message, { shardId: extra?.shardId }) + if (props.messageSnapshots && payload.message_snapshots) + message.messageSnapshots = payload.message_snapshots.map((snap) => bot.transformers.messageSnapshot(bot, snap, { shardId: extra?.shardId })) + if (props.nonce && payload.nonce) message.nonce = payload.nonce + if (payload.pinned) message.pinned = true + if (props.reactions && payload.reactions?.length) { + message.reactions = payload.reactions.map((reaction) => ({ me: reaction.me, meBurst: reaction.me_burst, count: reaction.count, @@ -250,43 +244,41 @@ export function transformMessage(bot: Bot, payload: { message: DiscordMessage; s burstColors: reaction.burst_colors, })) } - if (props.stickerItems && payload.message.sticker_items?.length) - message.stickerItems = payload.message.sticker_items.map((item) => ({ + if (props.stickerItems && payload.sticker_items?.length) + message.stickerItems = payload.sticker_items.map((item) => ({ id: bot.transformers.snowflake(item.id), name: item.name, formatType: item.format_type, })) - if (payload.message.tts) message.tts = true - if (props.thread && payload.message.thread) message.thread = bot.transformers.channel(bot, { channel: payload.message.thread, guildId }) - if (props.type) message.type = payload.message.type - if (props.webhookId && payload.message.webhook_id) message.webhookId = bot.transformers.snowflake(payload.message.webhook_id) - if (props.poll && payload.message.poll) message.poll = bot.transformers.poll(bot, payload.message.poll) - if (props.call && payload.message.call) message.call = bot.transformers.messageCall(bot, payload.message.call) + if (payload.tts) message.tts = true + if (props.thread && payload.thread) message.thread = bot.transformers.channel(bot, payload.thread, { guildId }) + if (props.type) message.type = payload.type + if (props.webhookId && payload.webhook_id) message.webhookId = bot.transformers.snowflake(payload.webhook_id) + if (props.poll && payload.poll) message.poll = bot.transformers.poll(bot, payload.poll) + if (props.call && payload.call) message.call = bot.transformers.messageCall(bot, payload.call) - return bot.transformers.customizers.message(bot, payload.message, message) + return bot.transformers.customizers.message(bot, payload, message, extra) } -export function transformMessagePin(bot: Bot, payload: DiscordMessagePin): MessagePin { +export function transformMessagePin(bot: Bot, payload: DiscordMessagePin, extra?: { shardId?: number }): MessagePin { const props = bot.transformers.desiredProperties.messagePin const messagePin = {} as SetupDesiredProps if (props.pinnedAt && payload.pinned_at) messagePin.pinnedAt = Date.parse(payload.pinned_at) - if (props.message && payload.message) messagePin.message = bot.transformers.message(bot, { message: payload.message, shardId: 0 }) + if (props.message && payload.message) messagePin.message = bot.transformers.message(bot, payload.message, { shardId: extra?.shardId }) - return bot.transformers.customizers.messagePin(bot, payload, messagePin) + return bot.transformers.customizers.messagePin(bot, payload, messagePin, extra) } -export function transformMessageSnapshot(bot: Bot, payload: { messageSnapshot: DiscordMessageSnapshot; shardId: number }): MessageSnapshot { +export function transformMessageSnapshot(bot: Bot, payload: DiscordMessageSnapshot, extra?: { shardId?: number }): MessageSnapshot { const props = bot.transformers.desiredProperties.messageSnapshot const messageSnapshot = {} as SetupDesiredProps - if (props.message && payload.messageSnapshot.message) - messageSnapshot.message = bot.transformers.message(bot, { - message: payload.messageSnapshot.message as DiscordMessage, - shardId: payload.shardId, - }) as Message + if (props.message && payload.message) + // @ts-expect-error TODO: Partials + messageSnapshot.message = bot.transformers.message(bot, payload.message, { shardId: extra?.shardId }) as Message - return bot.transformers.customizers.messageSnapshot(bot, payload.messageSnapshot, messageSnapshot) + return bot.transformers.customizers.messageSnapshot(bot, payload, messageSnapshot, extra) } export function transformMessageInteractionMetadata(bot: Bot, payload: DiscordMessageInteractionMetadata): MessageInteractionMetadata { diff --git a/packages/bot/src/transformers/role.ts b/packages/bot/src/transformers/role.ts index 24dada812..635a1196b 100644 --- a/packages/bot/src/transformers/role.ts +++ b/packages/bot/src/transformers/role.ts @@ -51,31 +51,31 @@ export const baseRole: Role = { }, } -export function transformRole(bot: Bot, payload: { role: DiscordRole; guildId: BigString }): Role { +export function transformRole(bot: Bot, payload: DiscordRole, extra?: { guildId?: BigString }): Role { const role: SetupDesiredProps = Object.create(baseRole) const props = bot.transformers.desiredProperties.role - if (props.id && payload.role.id) role.id = bot.transformers.snowflake(payload.role.id) + if (props.id && payload.id) role.id = bot.transformers.snowflake(payload.id) // Role name can be an empty string - if (props.name && payload.role.name !== undefined) role.name = payload.role.name - if (props.position) role.position = payload.role.position - if (props.guildId && payload.guildId) role.guildId = bot.transformers.snowflake(payload.guildId) - if (props.color && payload.role.color !== undefined) role.color = payload.role.color - if (props.permissions && payload.role.permissions) role.permissions = new Permissions(payload.role.permissions) - if (props.icon && payload.role.icon) role.icon = iconHashToBigInt(payload.role.icon) - if (props.unicodeEmoji && payload.role.unicode_emoji) role.unicodeEmoji = payload.role.unicode_emoji - if (props.flags) role.flags = payload.role.flags - if (props.tags && payload.role.tags) { + if (props.name && payload.name !== undefined) role.name = payload.name + if (props.position) role.position = payload.position + if (props.guildId && extra?.guildId) role.guildId = bot.transformers.snowflake(extra?.guildId) + if (props.color && payload.color !== undefined) role.color = payload.color + if (props.permissions && payload.permissions) role.permissions = new Permissions(payload.permissions) + if (props.icon && payload.icon) role.icon = iconHashToBigInt(payload.icon) + if (props.unicodeEmoji && payload.unicode_emoji) role.unicodeEmoji = payload.unicode_emoji + if (props.flags) role.flags = payload.flags + if (props.tags && payload.tags) { role.internalTags = {} - if (payload.role.tags.bot_id) role.internalTags.botId = bot.transformers.snowflake(payload.role.tags.bot_id) - if (payload.role.tags.integration_id) role.internalTags.integrationId = bot.transformers.snowflake(payload.role.tags.integration_id) - if (payload.role.tags.subscription_listing_id) - role.internalTags.subscriptionListingId = bot.transformers.snowflake(payload.role.tags.subscription_listing_id) - } - if (props.toggles) { - role.toggles = new RoleToggles(payload.role) + if (payload.tags.bot_id) role.internalTags.botId = bot.transformers.snowflake(payload.tags.bot_id) + if (payload.tags.integration_id) role.internalTags.integrationId = bot.transformers.snowflake(payload.tags.integration_id) + if (payload.tags.subscription_listing_id) + role.internalTags.subscriptionListingId = bot.transformers.snowflake(payload.tags.subscription_listing_id) } + if (props.toggles) role.toggles = new RoleToggles(payload) - return bot.transformers.customizers.role(bot, payload.role, role) + return bot.transformers.customizers.role(bot, payload, role, { + guildId: extra?.guildId ? bot.transformers.snowflake(extra.guildId) : undefined, + }) } export function transformRoleColors(bot: Bot, payload: DiscordRoleColors): RoleColors { diff --git a/packages/bot/src/transformers/stageInviteInstance.ts b/packages/bot/src/transformers/stageInviteInstance.ts index ad4dfeead..b4eed2969 100644 --- a/packages/bot/src/transformers/stageInviteInstance.ts +++ b/packages/bot/src/transformers/stageInviteInstance.ts @@ -1,23 +1,24 @@ -import type { BigString, DiscordInviteStageInstance, DiscordMember } from '@discordeno/types' +import type { BigString, DiscordInviteStageInstance } from '@discordeno/types' import type { Bot, DesiredPropertiesBehavior, InviteStageInstance, SetupDesiredProps, TransformersDesiredProperties } from '../index.js' -export function transformInviteStageInstance(bot: Bot, payload: DiscordInviteStageInstance & { guildId: BigString }): InviteStageInstance { +export function transformInviteStageInstance(bot: Bot, payload: DiscordInviteStageInstance, extra?: { guildId?: BigString }): InviteStageInstance { const props = bot.transformers.desiredProperties.inviteStageInstance const inviteStageInstance = {} as SetupDesiredProps if (props.members && payload.members) { inviteStageInstance.members = payload.members.map((member) => - bot.transformers.member( - bot, - member as DiscordMember, - payload.guildId, - member.user?.id ? bot.transformers.snowflake(member.user.id) : undefined!, - ), + // @ts-expect-error TODO: Partials + bot.transformers.member(bot, member, { + guildId: extra?.guildId, + userId: member.user?.id, + }), ) } if (props.participantCount) inviteStageInstance.participantCount = payload.participant_count if (props.speakerCount) inviteStageInstance.participantCount = payload.participant_count if (props.topic && payload.topic) inviteStageInstance.topic = payload.topic - return bot.transformers.customizers.inviteStageInstance(bot, payload, inviteStageInstance) + return bot.transformers.customizers.inviteStageInstance(bot, payload, inviteStageInstance, { + guildId: extra?.guildId ? bot.transformers.snowflake(extra.guildId) : undefined, + }) } diff --git a/packages/bot/src/transformers/threadMember.ts b/packages/bot/src/transformers/threadMember.ts index 15ac93779..dbff946ce 100644 --- a/packages/bot/src/transformers/threadMember.ts +++ b/packages/bot/src/transformers/threadMember.ts @@ -8,12 +8,10 @@ export function transformThreadMember(bot: Bot, payload: DiscordThreadMember, ex joinTimestamp: Date.parse(payload.join_timestamp), flags: payload.flags, member: payload.member - ? bot.transformers.member( - bot, - payload.member, - extra?.guildId ? bot.transformers.snowflake(extra.guildId) : undefined, - bot.transformers.snowflake(payload.user_id), - ) + ? bot.transformers.member(bot, payload.member, { + guildId: extra?.guildId, + userId: payload.user_id, + }) : undefined, } as ThreadMember diff --git a/packages/bot/src/transformers/voiceState.ts b/packages/bot/src/transformers/voiceState.ts index 2829576c8..9298041ea 100644 --- a/packages/bot/src/transformers/voiceState.ts +++ b/packages/bot/src/transformers/voiceState.ts @@ -2,17 +2,19 @@ import type { BigString, DiscordVoiceState } from '@discordeno/types' import type { Bot, DesiredPropertiesBehavior, SetupDesiredProps, TransformersDesiredProperties, VoiceState } from '../index.js' import { VoiceStateToggles } from './toggles/voice.js' -export function transformVoiceState(bot: Bot, payload: { voiceState: DiscordVoiceState; guildId: BigString }): VoiceState { +export function transformVoiceState(bot: Bot, payload: DiscordVoiceState, extra?: { guildId?: BigString }): VoiceState { const props = bot.transformers.desiredProperties.voiceState const voiceState = {} as SetupDesiredProps - if (props.requestToSpeakTimestamp && payload.voiceState.request_to_speak_timestamp) - voiceState.requestToSpeakTimestamp = Date.parse(payload.voiceState.request_to_speak_timestamp) - if (props.channelId && payload.voiceState.channel_id) voiceState.channelId = bot.transformers.snowflake(payload.voiceState.channel_id) - if (props.guildId) voiceState.guildId = bot.transformers.snowflake(payload.guildId) - if (props.toggles) voiceState.toggles = new VoiceStateToggles(payload.voiceState) - if (props.sessionId) voiceState.sessionId = payload.voiceState.session_id - if (props.userId && payload.voiceState.user_id) voiceState.userId = bot.transformers.snowflake(payload.voiceState.user_id) ?? 0n + if (props.requestToSpeakTimestamp && payload.request_to_speak_timestamp) + voiceState.requestToSpeakTimestamp = Date.parse(payload.request_to_speak_timestamp) + if (props.channelId && payload.channel_id) voiceState.channelId = bot.transformers.snowflake(payload.channel_id) + if (props.guildId && extra?.guildId) voiceState.guildId = bot.transformers.snowflake(extra.guildId) + if (props.toggles) voiceState.toggles = new VoiceStateToggles(payload) + if (props.sessionId) voiceState.sessionId = payload.session_id + if (props.userId && payload.user_id) voiceState.userId = bot.transformers.snowflake(payload.user_id) - return bot.transformers.customizers.voiceState(bot, payload.voiceState, voiceState) + return bot.transformers.customizers.voiceState(bot, payload, voiceState, { + guildId: extra?.guildId ? bot.transformers.snowflake(extra.guildId) : undefined, + }) } diff --git a/packages/bot/src/transformers/widget.ts b/packages/bot/src/transformers/widget.ts index a24044304..36eecb3c2 100644 --- a/packages/bot/src/transformers/widget.ts +++ b/packages/bot/src/transformers/widget.ts @@ -7,7 +7,7 @@ export function transformWidget(bot: Bot, payload: DiscordGuildWidget): GuildWid name: payload.name, instantInvite: payload.instant_invite ?? undefined, // @ts-expect-error TODO: Deal with partials - channels: payload.channels.map((channel) => bot.transformers.channel(bot, { channel })), + channels: payload.channels.map((channel) => bot.transformers.channel(bot, channel)), // @ts-expect-error TODO: Deal with partials members: payload.members.map((user) => bot.transformers.user(bot, user)), presenceCount: payload.presence_count,