diff --git a/src/handlers/commands/APPLICATION_COMMAND_CREATE.ts b/src/handlers/commands/APPLICATION_COMMAND_CREATE.ts index 592fef829..59ef82873 100644 --- a/src/handlers/commands/APPLICATION_COMMAND_CREATE.ts +++ b/src/handlers/commands/APPLICATION_COMMAND_CREATE.ts @@ -1,19 +1,17 @@ import { eventHandlers } from "../../bot.ts"; import { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts"; -import { DiscordApplicationCommandCreateUpdateDelete } from "../../types/interactions/application_command_create_update_delete.ts"; +import { + ApplicationCommandCreateUpdateDelete, + DiscordApplicationCommandCreateUpdateDelete, +} from "../../types/interactions/application_command_create_update_delete.ts"; +import { snakeKeysToCamelCase } from "../../util/utils.ts"; export function handleApplicationCommandCreate( data: DiscordGatewayPayload, ) { - const { - guild_id: guildId, - application_id: applicationId, - ...rest - } = data.d as DiscordApplicationCommandCreateUpdateDelete; - - eventHandlers.applicationCommandCreate?.({ - ...rest, - guildId, - applicationId, - }); + eventHandlers.applicationCommandCreate?.( + snakeKeysToCamelCase( + data.d as DiscordApplicationCommandCreateUpdateDelete, + ), + ); } diff --git a/src/handlers/commands/APPLICATION_COMMAND_DELETE.ts b/src/handlers/commands/APPLICATION_COMMAND_DELETE.ts index 8f73f8ef5..0845aa0a9 100644 --- a/src/handlers/commands/APPLICATION_COMMAND_DELETE.ts +++ b/src/handlers/commands/APPLICATION_COMMAND_DELETE.ts @@ -1,17 +1,15 @@ import { eventHandlers } from "../../bot.ts"; import { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts"; -import { DiscordApplicationCommandCreateUpdateDelete } from "../../types/interactions/application_command_create_update_delete.ts"; +import { + ApplicationCommandCreateUpdateDelete, + DiscordApplicationCommandCreateUpdateDelete, +} from "../../types/interactions/application_command_create_update_delete.ts"; +import { snakeKeysToCamelCase } from "../../util/utils.ts"; export function handleApplicationCommandDelete(data: DiscordGatewayPayload) { - const { - application_id: applicationId, - guild_id: guildId, - ...rest - } = data.d as DiscordApplicationCommandCreateUpdateDelete; - - eventHandlers.applicationCommandDelete?.({ - ...rest, - guildId, - applicationId, - }); + eventHandlers.applicationCommandDelete?.( + snakeKeysToCamelCase( + data.d as DiscordApplicationCommandCreateUpdateDelete, + ), + ); } diff --git a/src/handlers/commands/APPLICATION_COMMAND_UPDATE.ts b/src/handlers/commands/APPLICATION_COMMAND_UPDATE.ts index 2c450a496..7b92f1f89 100644 --- a/src/handlers/commands/APPLICATION_COMMAND_UPDATE.ts +++ b/src/handlers/commands/APPLICATION_COMMAND_UPDATE.ts @@ -1,6 +1,10 @@ import { eventHandlers } from "../../bot.ts"; import { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts"; -import { DiscordApplicationCommandCreateUpdateDelete } from "../../types/interactions/application_command_create_update_delete.ts"; +import { + ApplicationCommandCreateUpdateDelete, + DiscordApplicationCommandCreateUpdateDelete, +} from "../../types/interactions/application_command_create_update_delete.ts"; +import { snakeKeysToCamelCase } from "../../util/utils.ts"; export function handleApplicationCommandUpdate(data: DiscordGatewayPayload) { const { @@ -9,9 +13,9 @@ export function handleApplicationCommandUpdate(data: DiscordGatewayPayload) { ...rest } = data.d as DiscordApplicationCommandCreateUpdateDelete; - eventHandlers.applicationCommandUpdate?.({ - ...rest, - guildId, - applicationId, - }); + eventHandlers.applicationCommandUpdate?.( + snakeKeysToCamelCase( + data.d as DiscordApplicationCommandCreateUpdateDelete, + ), + ); } diff --git a/src/handlers/emojis/GUILD_EMOJIS_UPDATE.ts b/src/handlers/emojis/GUILD_EMOJIS_UPDATE.ts index ae59504ca..31bf720e7 100644 --- a/src/handlers/emojis/GUILD_EMOJIS_UPDATE.ts +++ b/src/handlers/emojis/GUILD_EMOJIS_UPDATE.ts @@ -1,8 +1,8 @@ import { eventHandlers } from "../../bot.ts"; import { cacheHandlers } from "../../cache.ts"; -import { Collection } from "../../util/collection.ts"; -import { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts"; import { DiscordGuildEmojisUpdate } from "../../types/emojis/guild_emojis_update.ts"; +import { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts"; +import { Collection } from "../../util/collection.ts"; export async function handleGuildEmojisUpdate(data: DiscordGatewayPayload) { const payload = data.d as DiscordGuildEmojisUpdate; @@ -11,7 +11,7 @@ export async function handleGuildEmojisUpdate(data: DiscordGatewayPayload) { const cachedEmojis = guild.emojis; guild.emojis = new Collection( - payload.emojis.map((emoji) => [emoji.id ?? emoji.name, emoji]), + payload.emojis.map((emoji) => [emoji.id!, emoji]), ); await cacheHandlers.set("guilds", payload.guild_id, guild); diff --git a/src/handlers/guilds/GUILD_UPDATE.ts b/src/handlers/guilds/GUILD_UPDATE.ts index 11898a945..72f06cc45 100644 --- a/src/handlers/guilds/GUILD_UPDATE.ts +++ b/src/handlers/guilds/GUILD_UPDATE.ts @@ -30,6 +30,8 @@ export async function handleGuildUpdate(data: DiscordGatewayPayload) { if (Array.isArray(cachedValue) && Array.isArray(value)) { const different = (cachedValue.length !== value.length) || cachedValue.find((val) => !value.includes(val)) || + // TODO: check if this really works hehe + // @ts-ignore this works ts is wrong value.find((val) => !cachedValue.includes(val)); if (!different) return; } diff --git a/src/handlers/integrations/INTEGRATION_CREATE.ts b/src/handlers/integrations/INTEGRATION_CREATE.ts index 255df04c1..5d7f9dd38 100644 --- a/src/handlers/integrations/INTEGRATION_CREATE.ts +++ b/src/handlers/integrations/INTEGRATION_CREATE.ts @@ -9,9 +9,9 @@ import { snakeKeysToCamelCase } from "../../util/utils.ts"; export function handleIntegrationCreate( data: DiscordGatewayPayload, ) { - const payload = data.d as DiscordIntegrationCreateUpdate; - eventHandlers.integrationCreate?.( - snakeKeysToCamelCase(payload) as IntegrationCreateUpdate, + snakeKeysToCamelCase( + data.d as DiscordIntegrationCreateUpdate, + ), ); } diff --git a/src/handlers/integrations/INTEGRATION_DELETE.ts b/src/handlers/integrations/INTEGRATION_DELETE.ts index af1ed9d15..6422cf9ba 100644 --- a/src/handlers/integrations/INTEGRATION_DELETE.ts +++ b/src/handlers/integrations/INTEGRATION_DELETE.ts @@ -1,15 +1,15 @@ import { eventHandlers } from "../../bot.ts"; import { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts"; +import { IntegrationCreateUpdate } from "../../types/integration/integration_create_update.ts"; import { DiscordIntegrationDelete, - IntegrationDelete, } from "../../types/integration/integration_delete.ts"; import { snakeKeysToCamelCase } from "../../util/utils.ts"; export function handleIntegrationDelete(data: DiscordGatewayPayload) { - const payload = data.d as DiscordIntegrationDelete; - eventHandlers.integrationDelete?.( - snakeKeysToCamelCase(payload) as IntegrationDelete, + snakeKeysToCamelCase( + data.d as DiscordIntegrationDelete, + ), ); } diff --git a/src/handlers/integrations/INTEGRATION_UPDATE.ts b/src/handlers/integrations/INTEGRATION_UPDATE.ts index db56de2cd..564f73cf7 100644 --- a/src/handlers/integrations/INTEGRATION_UPDATE.ts +++ b/src/handlers/integrations/INTEGRATION_UPDATE.ts @@ -7,9 +7,9 @@ import { import { snakeKeysToCamelCase } from "../../util/utils.ts"; export function handleIntegrationUpdate(data: DiscordGatewayPayload) { - const payload = data.d as DiscordIntegrationCreateUpdate; - eventHandlers.integrationUpdate?.( - snakeKeysToCamelCase(payload) as IntegrationCreateUpdate, + snakeKeysToCamelCase( + data.d as DiscordIntegrationCreateUpdate, + ), ); } diff --git a/src/handlers/interactions/INTERACTION_CREATE.ts b/src/handlers/interactions/INTERACTION_CREATE.ts index 7d24eb33c..14444c581 100644 --- a/src/handlers/interactions/INTERACTION_CREATE.ts +++ b/src/handlers/interactions/INTERACTION_CREATE.ts @@ -1,10 +1,12 @@ +// TODO: DM support idk need to discuss how we solve this import { eventHandlers } from "../../bot.ts"; import { cacheHandlers } from "../../cache.ts"; import { structures } from "../../structures/mod.ts"; import { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts"; +import { Interaction } from "../../types/mod.ts"; export async function handleInteractionCreate(data: DiscordGatewayPayload) { - const payload = data.d as InteractionCommandPayload; + const payload = data.d as Interaction; const discordenoMember = await structures.createDiscordenoMember( payload.member, payload.guild_id, diff --git a/src/handlers/invites/INVITE_CREATE.ts b/src/handlers/invites/INVITE_CREATE.ts index c21e87e3b..a222c46a0 100644 --- a/src/handlers/invites/INVITE_CREATE.ts +++ b/src/handlers/invites/INVITE_CREATE.ts @@ -7,7 +7,7 @@ import { import { snakeKeysToCamelCase } from "../../util/utils.ts"; export function handleInviteCreate(data: DiscordGatewayPayload) { - const payload = data.d as DiscordInviteCreate; - - eventHandlers.inviteCreate?.(snakeKeysToCamelCase(payload) as InviteCreate); + eventHandlers.inviteCreate?.( + snakeKeysToCamelCase(data.d as DiscordInviteCreate), + ); } diff --git a/src/handlers/invites/INVITE_DELETE.ts b/src/handlers/invites/INVITE_DELETE.ts index 3704ed7f0..a633cd500 100644 --- a/src/handlers/invites/INVITE_DELETE.ts +++ b/src/handlers/invites/INVITE_DELETE.ts @@ -7,7 +7,7 @@ import { import { snakeKeysToCamelCase } from "../../util/utils.ts"; export function handleInviteDelete(data: DiscordGatewayPayload) { - const payload = data.d as DiscordInviteDelete; - - eventHandlers.inviteDelete?.(snakeKeysToCamelCase(payload) as InviteDelete); + eventHandlers.inviteDelete?.( + snakeKeysToCamelCase(data.d as DiscordInviteDelete), + ); } diff --git a/src/handlers/members/GUILD_MEMBER_UPDATE.ts b/src/handlers/members/GUILD_MEMBER_UPDATE.ts index 80431f9db..e29988efb 100644 --- a/src/handlers/members/GUILD_MEMBER_UPDATE.ts +++ b/src/handlers/members/GUILD_MEMBER_UPDATE.ts @@ -35,7 +35,7 @@ export async function handleGuildMemberUpdate(data: DiscordGatewayPayload) { guild, discordenoMember, payload.nick!, - guildMember.nick, + guildMember.nick ?? undefined, ); } diff --git a/src/handlers/messages/MESSAGE_REACTION_ADD.ts b/src/handlers/messages/MESSAGE_REACTION_ADD.ts index cfafa997a..8af308a15 100644 --- a/src/handlers/messages/MESSAGE_REACTION_ADD.ts +++ b/src/handlers/messages/MESSAGE_REACTION_ADD.ts @@ -2,7 +2,11 @@ import { botId, eventHandlers } from "../../bot.ts"; import { cacheHandlers } from "../../cache.ts"; import { structures } from "../../structures/mod.ts"; import { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts"; -import { DiscordMessageReactionAdd } from "../../types/messages/message_reaction_add.ts"; +import { + DiscordMessageReactionAdd, + MessageReactionAdd, +} from "../../types/messages/message_reaction_add.ts"; +import { snakeKeysToCamelCase } from "../../util/utils.ts"; export async function handleMessageReactionAdd(data: DiscordGatewayPayload) { const payload = data.d as DiscordMessageReactionAdd; @@ -41,17 +45,8 @@ export async function handleMessageReactionAdd(data: DiscordGatewayPayload) { } } - const uncachedOptions = { - ...payload, - id: payload.message_id, - channelId: payload.channel_id, - guildId: payload.guild_id || "", - }; - eventHandlers.reactionAdd?.( - uncachedOptions, - payload.emoji, - payload.user_id, + snakeKeysToCamelCase(payload), message, ); } diff --git a/src/handlers/messages/MESSAGE_REACTION_REMOVE.ts b/src/handlers/messages/MESSAGE_REACTION_REMOVE.ts index 7d28cb76b..7c8fbe21a 100644 --- a/src/handlers/messages/MESSAGE_REACTION_REMOVE.ts +++ b/src/handlers/messages/MESSAGE_REACTION_REMOVE.ts @@ -1,7 +1,11 @@ import { eventHandlers } from "../../bot.ts"; import { cacheHandlers } from "../../cache.ts"; import { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts"; -import { DiscordMessageReactionRemove } from "../../types/messages/message_reaction_remove.ts"; +import { + DiscordMessageReactionRemove, + MessageReactionRemove, +} from "../../types/messages/message_reaction_remove.ts"; +import { snakeKeysToCamelCase } from "../../util/utils.ts"; export async function handleMessageReactionRemove( data: DiscordGatewayPayload, @@ -18,24 +22,17 @@ export async function handleMessageReactionRemove( if (reaction) { reaction.count--; - if (reaction.count === 0) message.reactions = message.reactions?.filter(r => r.count !== 0); + if (reaction.count === 0) { + message.reactions = message.reactions?.filter((r) => r.count !== 0); + } if (!message.reactions?.length) message.reactions = undefined; await cacheHandlers.set("messages", payload.message_id, message); } } - const uncachedOptions = { - ...payload, - id: payload.message_id, - channelId: payload.channel_id, - guildId: payload.guild_id, - }; - eventHandlers.reactionRemove?.( - uncachedOptions, - payload.emoji, - payload.user_id, + snakeKeysToCamelCase(payload), message, ); } diff --git a/src/handlers/messages/MESSAGE_REACTION_REMOVE_ALL.ts b/src/handlers/messages/MESSAGE_REACTION_REMOVE_ALL.ts index 80c70e9a5..c4d48dccb 100644 --- a/src/handlers/messages/MESSAGE_REACTION_REMOVE_ALL.ts +++ b/src/handlers/messages/MESSAGE_REACTION_REMOVE_ALL.ts @@ -1,7 +1,11 @@ import { eventHandlers } from "../../bot.ts"; import { cacheHandlers } from "../../cache.ts"; import { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts"; -import { DiscordMessageReactionRemoveAll } from "../../types/messages/message_reaction_remove_all.ts"; +import { + DiscordMessageReactionRemoveAll, + MessageReactionRemoveAll, +} from "../../types/messages/message_reaction_remove_all.ts"; +import { snakeKeysToCamelCase } from "../../util/utils.ts"; export async function handleMessageReactionRemoveAll( data: DiscordGatewayPayload, @@ -15,5 +19,8 @@ export async function handleMessageReactionRemoveAll( await cacheHandlers.set("messages", payload.message_id, message); } - eventHandlers.reactionRemoveAll?.(payload); + eventHandlers.reactionRemoveAll?.( + snakeKeysToCamelCase(payload), + message, + ); } diff --git a/src/handlers/messages/MESSAGE_REACTION_REMOVE_EMOJI.ts b/src/handlers/messages/MESSAGE_REACTION_REMOVE_EMOJI.ts index 8828bf7f5..e7e8aa90e 100644 --- a/src/handlers/messages/MESSAGE_REACTION_REMOVE_EMOJI.ts +++ b/src/handlers/messages/MESSAGE_REACTION_REMOVE_EMOJI.ts @@ -18,13 +18,16 @@ export async function handleMessageReactionRemoveEmoji( reaction.emoji.name === payload.emoji.name ), ); - - if (!message.reactions.length) message.reactions = undefined + + if (!message.reactions.length) message.reactions = undefined; await cacheHandlers.set("messages", payload.message_id, message); } eventHandlers.reactionRemoveEmoji?.( - data.d, + payload.emoji, + payload.message_id, + payload.channel_id, + payload.guild_id, ); } diff --git a/src/handlers/messages/MESSAGE_UPDATE.ts b/src/handlers/messages/MESSAGE_UPDATE.ts index 2e38ebca2..9494cc7c5 100644 --- a/src/handlers/messages/MESSAGE_UPDATE.ts +++ b/src/handlers/messages/MESSAGE_UPDATE.ts @@ -9,22 +9,13 @@ export async function handleMessageUpdate(data: DiscordGatewayPayload) { const channel = await cacheHandlers.get("channels", payload.channel_id); if (!channel) return; - const cachedMessage = await cacheHandlers.get("messages", payload.id); - if (!cachedMessage) return; - - const oldMessage = { - attachments: cachedMessage.attachments, - content: cachedMessage.content, - embeds: cachedMessage.embeds, - editedTimestamp: cachedMessage.editedTimestamp, - tts: cachedMessage.tts, - pinned: cachedMessage.pinned, - }; + const oldMessage = await cacheHandlers.get("messages", payload.id); + if (!oldMessage) return; // Messages with embeds can trigger update but they wont have edited_timestamp if ( !payload.edited_timestamp || - (cachedMessage.content === payload.content) + (oldMessage.content === payload.content) ) { return; } diff --git a/src/handlers/misc/PRESENCE_UPDATE.ts b/src/handlers/misc/PRESENCE_UPDATE.ts index 66a6cc6c3..38601b858 100644 --- a/src/handlers/misc/PRESENCE_UPDATE.ts +++ b/src/handlers/misc/PRESENCE_UPDATE.ts @@ -1,10 +1,16 @@ import { eventHandlers } from "../../bot.ts"; import { cacheHandlers } from "../../cache.ts"; import { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts"; -import { DiscordPresenceUpdate } from "../../types/misc/presence_update.ts"; +import { + DiscordPresenceUpdate, + PresenceUpdate, +} from "../../types/misc/presence_update.ts"; +import { snakeKeysToCamelCase } from "../../util/utils.ts"; export async function handlePresenceUpdate(data: DiscordGatewayPayload) { - const payload = data.d as DiscordPresenceUpdate; + const payload = snakeKeysToCamelCase( + data.d as DiscordPresenceUpdate, + ); const oldPresence = await cacheHandlers.get("presences", payload.user.id); await cacheHandlers.set("presences", payload.user.id, payload); diff --git a/src/handlers/misc/READY.ts b/src/handlers/misc/READY.ts index b58de7c83..fb6a6c418 100644 --- a/src/handlers/misc/READY.ts +++ b/src/handlers/misc/READY.ts @@ -4,7 +4,8 @@ import { initialMemberLoadQueue } from "../../structures/guild.ts"; import { structures } from "../../structures/mod.ts"; import { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts"; import { DiscordReady } from "../../types/gateway/ready.ts"; -import { delay, snakeKeysToCamelCase } from "../../util/utils.ts"; +import { DiscordGuildMemberWithUser } from "../../types/mod.ts"; +import { camelKeysToSnakeCase, delay } from "../../util/utils.ts"; import { ws } from "../../ws/ws.ts"; export async function handleReady( @@ -103,7 +104,7 @@ async function loaded(shardId: number) { await Promise.allSettled( members.map(async (member) => { const discordenoMember = await structures.createDiscordenoMember( - snakeKeysToCamelCase(member), + camelKeysToSnakeCase(member), guildId, ); diff --git a/src/handlers/misc/TYPING_START.ts b/src/handlers/misc/TYPING_START.ts index 9775758d7..61a369d23 100644 --- a/src/handlers/misc/TYPING_START.ts +++ b/src/handlers/misc/TYPING_START.ts @@ -1,7 +1,13 @@ import { eventHandlers } from "../../bot.ts"; import { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts"; -import { DiscordTypingStart } from "../../types/misc/typing_start.ts"; +import { + DiscordTypingStart, + TypingStart, +} from "../../types/misc/typing_start.ts"; +import { snakeKeysToCamelCase } from "../../util/utils.ts"; export function handleTypingStart(data: DiscordGatewayPayload) { - eventHandlers.typingStart?.(data.d as DiscordTypingStart); + eventHandlers.typingStart?.( + snakeKeysToCamelCase(data.d as DiscordTypingStart), + ); } diff --git a/src/handlers/roles/GUILD_ROLE_CREATE.ts b/src/handlers/roles/GUILD_ROLE_CREATE.ts index 82119f043..e0c57eada 100644 --- a/src/handlers/roles/GUILD_ROLE_CREATE.ts +++ b/src/handlers/roles/GUILD_ROLE_CREATE.ts @@ -2,9 +2,10 @@ import { eventHandlers } from "../../bot.ts"; import { cacheHandlers } from "../../cache.ts"; import { structures } from "../../structures/mod.ts"; import { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts"; +import { DiscordGuildRoleCreate } from "../../types/mod.ts"; export async function handleGuildRoleCreate(data: DiscordGatewayPayload) { - const payload = data.d as DiscordGuildRoleCreateUpdate; + const payload = data.d as DiscordGuildRoleCreate; const guild = await cacheHandlers.get("guilds", payload.guild_id); if (!guild) return; diff --git a/src/handlers/roles/GUILD_ROLE_UPDATE.ts b/src/handlers/roles/GUILD_ROLE_UPDATE.ts index 23572e3e7..263ee3520 100644 --- a/src/handlers/roles/GUILD_ROLE_UPDATE.ts +++ b/src/handlers/roles/GUILD_ROLE_UPDATE.ts @@ -2,9 +2,10 @@ import { eventHandlers } from "../../bot.ts"; import { cacheHandlers } from "../../cache.ts"; import { structures } from "../../structures/mod.ts"; import { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts"; +import { DiscordGuildRoleUpdate } from "../../types/mod.ts"; export async function handleGuildRoleUpdate(data: DiscordGatewayPayload) { - const payload = data.d as DiscordGuildRoleCreateUpdate; + const payload = data.d as DiscordGuildRoleUpdate; const guild = await cacheHandlers.get("guilds", payload.guild_id); if (!guild) return; diff --git a/src/handlers/voice/VOICE_SERVER_UPDATE.ts b/src/handlers/voice/VOICE_SERVER_UPDATE.ts index 066456d78..ed6955c9f 100644 --- a/src/handlers/voice/VOICE_SERVER_UPDATE.ts +++ b/src/handlers/voice/VOICE_SERVER_UPDATE.ts @@ -1,11 +1,16 @@ import { eventHandlers } from "../../bot.ts"; import { cacheHandlers } from "../../cache.ts"; import { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts"; -import { DiscordVoiceServerUpdate, VoiceServerUpdate } from "../../types/voice/voice_server_update.ts"; +import { + DiscordVoiceServerUpdate, + VoiceServerUpdate, +} from "../../types/voice/voice_server_update.ts"; import { snakeKeysToCamelCase } from "../../util/utils.ts"; export async function handleVoiceServerUpdate(data: DiscordGatewayPayload) { - const payload = snakeKeysToCamelCase(data.d as DiscordVoiceServerUpdate) as VoiceServerUpdate; + const payload = snakeKeysToCamelCase( + data.d as DiscordVoiceServerUpdate, + ); const guild = await cacheHandlers.get("guilds", payload.guildId); if (!guild) return; diff --git a/src/handlers/voice/VOICE_STATE_UPDATE.ts b/src/handlers/voice/VOICE_STATE_UPDATE.ts index 132a13275..c84f9c65f 100644 --- a/src/handlers/voice/VOICE_STATE_UPDATE.ts +++ b/src/handlers/voice/VOICE_STATE_UPDATE.ts @@ -2,51 +2,58 @@ import { eventHandlers } from "../../bot.ts"; import { cacheHandlers } from "../../cache.ts"; import { structures } from "../../structures/mod.ts"; import { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts"; -import { DiscordVoiceState } from "../../types/voice/voice_state.ts"; +import { DiscordGuildMemberWithUser } from "../../types/mod.ts"; +import { + DiscordVoiceState, + VoiceState, +} from "../../types/voice/voice_state.ts"; +import { + camelKeysToSnakeCase, + snakeKeysToCamelCase, +} from "../../util/utils.ts"; export async function handleVoiceStateUpdate(data: DiscordGatewayPayload) { - const payload = data.d as DiscordVoiceState; - if (!payload.guild_id) return; + const payload = snakeKeysToCamelCase( + data.d as DiscordVoiceState, + ); + if (!payload.guildId) return; - const guild = await cacheHandlers.get("guilds", payload.guild_id); + const guild = await cacheHandlers.get("guilds", payload.guildId); if (!guild) return; const member = payload.member - ? await structures.createDiscordenoMember(payload.member, guild.id) - : await cacheHandlers.get("members", payload.user_id); + ? await structures.createDiscordenoMember( + camelKeysToSnakeCase(payload), + guild.id, + ) + : await cacheHandlers.get("members", payload.userId); if (!member) return; // No cached state before so lets make one for em - const cachedState = guild.voiceStates.get(payload.user_id); + const cachedState = guild.voiceStates.get(payload.userId); - guild.voiceStates.set(payload.user_id, { - ...payload, - guildId: payload.guild_id, - channelId: payload.channel_id || "", - userId: payload.user_id, - sessionId: payload.session_id, - selfDeaf: payload.self_deaf, - selfMute: payload.self_mute, - selfStream: payload.self_stream || false, - }); + guild.voiceStates.set( + payload.userId, + payload, + ); - await cacheHandlers.set("guilds", payload.guild_id, guild); + await cacheHandlers.set("guilds", payload.guildId, guild); - if (cachedState?.channelId !== payload.channel_id) { + if (cachedState?.channelId !== payload.channelId) { // Either joined or moved channels - if (payload.channel_id) { + if (payload.channelId) { if (cachedState?.channelId) { // Was in a channel before eventHandlers.voiceChannelSwitch?.( member, - payload.channel_id, + payload.channelId, cachedState.channelId, ); } else { // Was not in a channel before so user just joined - eventHandlers.voiceChannelJoin?.(member, payload.channel_id); + eventHandlers.voiceChannelJoin?.(member, payload.channelId); } } // Left the channel else if (cachedState?.channelId) { - guild.voiceStates.delete(payload.user_id); + guild.voiceStates.delete(payload.userId); eventHandlers.voiceChannelLeave?.(member, cachedState.channelId); } } diff --git a/src/helpers/emojis/create_emoji.ts b/src/helpers/emojis/create_emoji.ts index 4b2cdff67..5e4554ab8 100644 --- a/src/helpers/emojis/create_emoji.ts +++ b/src/helpers/emojis/create_emoji.ts @@ -24,5 +24,5 @@ export async function createEmoji( image, }); - return snakeKeysToCamelCase(result) as Emoji; + return snakeKeysToCamelCase(result); } diff --git a/src/helpers/guilds/edit_widget.ts b/src/helpers/guilds/edit_widget.ts index 42eaefd1b..8d0e0cf93 100644 --- a/src/helpers/guilds/edit_widget.ts +++ b/src/helpers/guilds/edit_widget.ts @@ -21,5 +21,5 @@ export async function editWidget( }, ); - return snakeKeysToCamelCase(result) as GuildWidget; + return snakeKeysToCamelCase(result); } diff --git a/src/helpers/guilds/get_audit_logs.ts b/src/helpers/guilds/get_audit_logs.ts index 241c21ff4..795e4bd7c 100644 --- a/src/helpers/guilds/get_audit_logs.ts +++ b/src/helpers/guilds/get_audit_logs.ts @@ -26,5 +26,5 @@ export async function getAuditLogs( }), ); - return snakeKeysToCamelCase(result) as AuditLog; + return snakeKeysToCamelCase(result); } diff --git a/src/helpers/guilds/get_ban.ts b/src/helpers/guilds/get_ban.ts index 1cac4ac1d..7abe6d3b0 100644 --- a/src/helpers/guilds/get_ban.ts +++ b/src/helpers/guilds/get_ban.ts @@ -13,5 +13,5 @@ export async function getBan(guildId: string, memberId: string) { endpoints.GUILD_BAN(guildId, memberId), ); - return snakeKeysToCamelCase(result) as Ban; + return snakeKeysToCamelCase(result); } diff --git a/src/helpers/guilds/get_bans.ts b/src/helpers/guilds/get_bans.ts index c55e27e5d..1fdef4fcd 100644 --- a/src/helpers/guilds/get_bans.ts +++ b/src/helpers/guilds/get_bans.ts @@ -15,6 +15,6 @@ export async function getBans(guildId: string) { )) as DiscordBan[]; return new Collection( - results.map((res) => [res.user.id, snakeKeysToCamelCase(res) as Ban]), + results.map((res) => [res.user.id, snakeKeysToCamelCase(res)]), ); } diff --git a/src/helpers/guilds/get_guild.ts b/src/helpers/guilds/get_guild.ts index b0b39700b..5652b979b 100644 --- a/src/helpers/guilds/get_guild.ts +++ b/src/helpers/guilds/get_guild.ts @@ -15,5 +15,5 @@ export async function getGuild(guildId: string, counts = true) { with_counts: counts, }); - return snakeKeysToCamelCase(result) as Guild; + return snakeKeysToCamelCase(result); } diff --git a/src/helpers/guilds/get_guild_preview.ts b/src/helpers/guilds/get_guild_preview.ts index dfd398273..274f20a28 100644 --- a/src/helpers/guilds/get_guild_preview.ts +++ b/src/helpers/guilds/get_guild_preview.ts @@ -7,5 +7,5 @@ import { snakeKeysToCamelCase } from "../../util/utils.ts"; export async function getGuildPreview(guildId: string) { const result = await rest.runMethod("get", endpoints.GUILD_PREVIEW(guildId)); - return snakeKeysToCamelCase(result) as GuildPreview; + return snakeKeysToCamelCase(result); } diff --git a/src/helpers/guilds/get_vainty_url.ts b/src/helpers/guilds/get_vainty_url.ts index c80c65a81..999c34884 100644 --- a/src/helpers/guilds/get_vainty_url.ts +++ b/src/helpers/guilds/get_vainty_url.ts @@ -10,7 +10,9 @@ export async function getVanityURL(guildId: string) { endpoints.GUILD_VANITY_URL(guildId), ); - return snakeKeysToCamelCase(result) as - | (Partial & Pick) - | { code: null }; + return snakeKeysToCamelCase< + (Partial & Pick) | { + code: null; + } + >(result); } diff --git a/src/structures/channel.ts b/src/structures/channel.ts index 748d2b8ea..f8efdae7b 100644 --- a/src/structures/channel.ts +++ b/src/structures/channel.ts @@ -80,7 +80,7 @@ export async function createDiscordenoChannel( guildId: rawGuildId = "", lastPinTimestamp, ...rest - } = snakeKeysToCamelCase(data) as Channel; + } = snakeKeysToCamelCase(data); const props: Record = {}; Object.keys(rest).forEach((key) => { diff --git a/src/structures/guild.ts b/src/structures/guild.ts index 742705433..b7dc6a75c 100644 --- a/src/structures/guild.ts +++ b/src/structures/guild.ts @@ -18,14 +18,13 @@ import { CreateGuildBan } from "../types/guilds/create_guild_ban.ts"; import { DiscordGuild, Guild } from "../types/guilds/guild.ts"; import { DiscordGuildFeatures } from "../types/guilds/guild_features.ts"; import { - DiscordGuildMember, + DiscordGuildMemberWithUser, GuildMember, } from "../types/guilds/guild_member.ts"; import { ModifyGuild } from "../types/guilds/modify_guild.ts"; import { DiscordImageFormat } from "../types/misc/image_format.ts"; import { DiscordImageSize } from "../types/misc/image_size.ts"; import { PresenceUpdate } from "../types/misc/presence_update.ts"; -import { DiscordUser } from "../types/users/user.ts"; import { VoiceState } from "../types/voice/voice_state.ts"; import { Collection } from "../util/collection.ts"; import { @@ -128,7 +127,7 @@ export async function createDiscordenoGuild( emojis, members = [], ...rest - } = snakeKeysToCamelCase(data) as Guild; + } = snakeKeysToCamelCase(data); const roles = await Promise.all( (data.roles || []).map((role) => @@ -189,9 +188,7 @@ export async function createDiscordenoGuild( await Promise.allSettled( members.map(async (member) => { const discordenoMember = await structures.createDiscordenoMember( - camelKeysToSnakeCase(member) as Omit & { - user: DiscordUser; - }, + camelKeysToSnakeCase(member) as DiscordGuildMemberWithUser, guild.id, ); @@ -220,7 +217,7 @@ export interface DiscordenoGuild extends | "emojis" > { /** Total number of members in this guild */ - memberCount?: number; + memberCount: number; /** The roles in the guild */ roles: Collection; /** The presences of all the users in the guild. */ diff --git a/src/structures/member.ts b/src/structures/member.ts index 318906142..6be2528bf 100644 --- a/src/structures/member.ts +++ b/src/structures/member.ts @@ -9,14 +9,15 @@ import { addRole } from "../helpers/roles/add_role.ts"; import { removeRole } from "../helpers/roles/remove_role.ts"; import { CreateGuildBan } from "../types/guilds/create_guild_ban.ts"; import { - DiscordGuildMember, + DiscordGuildMemberWithUser, GuildMember, + GuildMemberWithUser, } from "../types/guilds/guild_member.ts"; import { ModifyGuildMember } from "../types/guilds/modify_guild_member.ts"; import { CreateMessage } from "../types/messages/create_message.ts"; import { DiscordImageFormat } from "../types/misc/image_format.ts"; import { DiscordImageSize } from "../types/misc/image_size.ts"; -import { DiscordUser, User } from "../types/users/user.ts"; +import { User } from "../types/users/user.ts"; import { Collection } from "../util/collection.ts"; import { createNewProp, snakeKeysToCamelCase } from "../util/utils.ts"; import { DiscordenoGuild } from "./guild.ts"; @@ -73,7 +74,7 @@ const baseMember: Partial = { export async function createDiscordenoMember( // The `user` param in `DiscordGuildMember` is optional since discord does not send it in `MESSAGE_CREATE` and `MESSAGE_UPDATE` events. But this data in there is required to build this structure so it is required in this case - data: Omit & { user: DiscordUser }, + data: DiscordGuildMemberWithUser, guildId: string, ) { const { @@ -81,9 +82,7 @@ export async function createDiscordenoMember( joinedAt, premiumSince, ...rest - } = snakeKeysToCamelCase(data) as Omit & { - user: DiscordUser; - }; + } = snakeKeysToCamelCase(data); const props: Record> = {}; diff --git a/src/structures/message.ts b/src/structures/message.ts index feb586614..f54dfaf55 100644 --- a/src/structures/message.ts +++ b/src/structures/message.ts @@ -39,9 +39,8 @@ const baseMessage: Partial = { return this.member?.guilds.get(this.guildId); }, get link() { - return `https://discord.com/channels/${this.guildId || "@me"}/${ - this.channelId - }/${this.id}`; + return `https://discord.com/channels/${this.guildId || + "@me"}/${this.channelId}/${this.id}`; }, get mentionedRoles() { return this.mentionedRoleIds?.map((id) => this.guild?.roles.get(id)) || []; @@ -70,25 +69,24 @@ const baseMessage: Partial = { return addReactions(this.channelId!, this.id!, reactions, ordered); }, reply(content) { - const contentWithMention = - typeof content === "string" - ? { - content, - mentions: { repliedUser: true }, - messageReference: { - messageId: this.id, - failReplyIfNotExists: false, - }, - } - : { - ...content, - mentions: { ...(content.allowedMentions || {}), repliedUser: true }, - messageReference: { - messageId: this.id, - failReplyIfNotExists: - content.messageReference?.failIfNotExists === true, - }, - }; + const contentWithMention = typeof content === "string" + ? { + content, + mentions: { repliedUser: true }, + messageReference: { + messageId: this.id, + failReplyIfNotExists: false, + }, + } + : { + ...content, + mentions: { ...(content.allowedMentions || {}), repliedUser: true }, + messageReference: { + messageId: this.id, + failReplyIfNotExists: + content.messageReference?.failIfNotExists === true, + }, + }; if (this.guildId) return sendMessage(this.channelId!, contentWithMention); return sendDirectMessage(this.author!.id, contentWithMention); @@ -133,21 +131,21 @@ export async function createDiscordenoMessage(data: DiscordMessage) { mentionRoles, editedTimestamp, ...rest - } = snakeKeysToCamelCase(data) as Message; + } = snakeKeysToCamelCase(data); const props: Record> = {}; for (const key of Object.keys(rest)) { eventHandlers.debug?.( "loop", - `Running for of loop in createDiscordenoMessage function.` + `Running for of loop in createDiscordenoMessage function.`, ); // @ts-ignore index signature props[key] = createNewProp(rest[key]); } // Discord doesnt give guild id for getMessage() so this will fill it in - const guildIdFinal = - guildId || (await cacheHandlers.get("channels", channelId))?.guildId || ""; + const guildIdFinal = guildId || + (await cacheHandlers.get("channels", channelId))?.guildId || ""; const message: DiscordenoMessage = Object.create(baseMessage, { ...props, @@ -167,7 +165,7 @@ export async function createDiscordenoMessage(data: DiscordMessage) { ]), timestamp: createNewProp(Date.parse(data.timestamp)), editedTimestamp: createNewProp( - editedTimestamp ? Date.parse(editedTimestamp) : undefined + editedTimestamp ? Date.parse(editedTimestamp) : undefined, ), }); @@ -209,7 +207,7 @@ export interface DiscordenoMessage extends Message { /** Delete the message */ delete( reason?: string, - delayMilliseconds?: number + delayMilliseconds?: number, ): ReturnType; /** Edit the message */ edit(content: string | EditMessage): ReturnType; @@ -220,7 +218,7 @@ export interface DiscordenoMessage extends Message { /** Add multiple reactions to the message without or without order. */ addReactions( reactions: string[], - ordered?: boolean + ordered?: boolean, ): ReturnType; /** Send a inline reply to this message */ reply(content: string | CreateMessage): ReturnType; @@ -230,13 +228,13 @@ export interface DiscordenoMessage extends Message { alert( content: string | CreateMessage, timeout?: number, - reason?: string + reason?: string, ): Promise; /** Send a inline reply to this message but then delete it after a bit. By default it will delete after 10 seconds with no reason provided. */ alertReply( content: string | CreateMessage, timeout?: number, - reason?: string + reason?: string, ): Promise; /** Remove all reactions */ removeAllReactions(): ReturnType; diff --git a/src/structures/role.ts b/src/structures/role.ts index 852708169..480c30676 100644 --- a/src/structures/role.ts +++ b/src/structures/role.ts @@ -71,9 +71,11 @@ export async function createDiscordenoRole(data: DiscordGuildRoleCreate) { const { tags = {}, ...rest - } = snakeKeysToCamelCase({ guildId: data.guild_id, ...data.role }) as Role & { - guildId: string; - }; + } = snakeKeysToCamelCase< + Role & { + guildId: string; + } + >({ guildId: data.guild_id, ...data.role }); const props: Record> = {}; for (const key of Object.keys(rest)) { diff --git a/src/types/discordeno/eventHandlers.ts b/src/types/discordeno/eventHandlers.ts index 91ea90409..22eec5976 100644 --- a/src/types/discordeno/eventHandlers.ts +++ b/src/types/discordeno/eventHandlers.ts @@ -9,7 +9,6 @@ import { ApplicationCommandCreateUpdateDelete } from "../interactions/applicatio import { Channel, DiscordGatewayPayload, - DiscordMessageReactionRemoveAll, Emoji, GatewayPayload, IntegrationDelete, @@ -18,6 +17,7 @@ import { InviteDelete, MessageReactionAdd, MessageReactionRemove, + MessageReactionRemoveAll, PresenceUpdate, TypingStart, User, @@ -30,15 +30,15 @@ import { GuildUpdateChange } from "./guild_update_change.ts"; export interface EventHandlers { /** Sent when a new Slash Command is created, relevant to the current user. */ applicationCommandCreate?: ( - data: ApplicationCommandCreateUpdateDelete + data: ApplicationCommandCreateUpdateDelete, ) => unknown; /** Sent when a Slash Command relevant to the current user is updated. */ applicationCommandUpdate?: ( - data: ApplicationCommandCreateUpdateDelete + data: ApplicationCommandCreateUpdateDelete, ) => unknown; /** Sent when a Slash Command relevant to the current user is deleted. */ applicationCommandDelete?: ( - data: ApplicationCommandCreateUpdateDelete + data: ApplicationCommandCreateUpdateDelete, ) => unknown; /** Sent when properties about the user change. */ botUpdate?: (user: User) => unknown; @@ -48,23 +48,29 @@ export interface EventHandlers { channelUpdate?: (channel: Channel, oldChannel: Channel) => unknown; /** Sent when a channel relevant to the current user is deleted. */ channelDelete?: (channel: Channel) => unknown; + /** Sent when a message pin is updated */ + channelPinsUpdate?: ( + channel: DiscordenoChannel, + guild?: DiscordenoGuild, + lastPinTimestamp?: string | null, + ) => unknown; debug?: (args: string | DebugArg, data?: string) => unknown; /** Sent before every event. Discordeno awaits the execution of this event before main event gets sent. */ dispatchRequirements?: ( data: DiscordGatewayPayload, - shardId: number + shardId: number, ) => unknown; /** Sent when a user is banned from a guild. */ guildBanAdd?: ( guild: DiscordenoGuild, user: User, - member?: DiscordenoMember + member?: DiscordenoMember, ) => unknown; /** Sent when a user is unbanned from a guild. */ guildBanRemove?: ( guild: DiscordenoGuild, user: User, - member?: DiscordenoMember + member?: DiscordenoMember, ) => unknown; /** * This event can be sent in three different scenarios: @@ -77,12 +83,16 @@ export interface EventHandlers { guildCreate?: (guild: DiscordenoGuild) => unknown; /** This event does get sent on start when shards are loading the guilds */ guildLoaded?: (guild: DiscordenoGuild) => unknown; - /** When a guild goes unavailable this event will be ran. */ + /** When a guild goes available this event will be ran. */ guildAvailable?: (guild: DiscordenoGuild) => unknown; + /** When a guild goes unavailable this event will be ran. */ + guildUnavailable?: (guild: DiscordenoGuild) => unknown; + /** Sent when a guilds integration gets updated */ + guildIntegrationsUpdate?: (guild: DiscordenoGuild) => unknown; /** Sent when a guild is updated. */ guildUpdate?: ( guild: DiscordenoGuild, - changes: GuildUpdateChange[] + changes: GuildUpdateChange[], ) => unknown; /** Sent when a guild becomes or was already unavailable due to an outage, or when the user leaves or is removed from a guild. If the `unavailable` field is not set, the user was removed from the guild. */ guildDelete?: (guild: DiscordenoGuild) => unknown; @@ -90,54 +100,54 @@ export interface EventHandlers { guildEmojisUpdate?: ( guild: DiscordenoGuild, emojis: Collection, - oldEmojis: Collection + oldEmojis: Collection, ) => unknown; /** Sent when a new user joins a guild. */ guildMemberAdd?: ( guild: DiscordenoGuild, - member: DiscordenoMember + member: DiscordenoMember, ) => unknown; /** Sent when a user is removed from a guild (leave/kick/ban). */ guildMemberRemove?: ( guild: DiscordenoGuild, user: User, - member?: DiscordenoMember + member?: DiscordenoMember, ) => unknown; /** Sent when a guild member is updated. This will also fire when the user object of a guild member changes. */ guildMemberUpdate?: ( guild: DiscordenoGuild, member: DiscordenoMember, - oldMember?: DiscordenoMember + oldMember?: DiscordenoMember, ) => unknown; // TODO: remove this? //heartbeat?: () => unknown; /** Sent when a user in a guild uses a Slash Command. */ interactionCreate?: ( - data: Omit & { member: DiscordenoMember } + data: Omit & { member: DiscordenoMember }, ) => unknown; /** Sent when a message is created. */ messageCreate?: (message: DiscordenoMessage) => unknown; /** Sent when a message is deleted. */ messageDelete?: ( partial: { id: string; channel: DiscordenoChannel }, - message?: DiscordenoMessage + message?: DiscordenoMessage, ) => unknown; /** Sent when a message is updated. */ messageUpdate?: ( message: DiscordenoMessage, - oldMessage: DiscordenoMessage + oldMessage: DiscordenoMessage, ) => unknown; /** Sent when a user updates its nickname */ nicknameUpdate?: ( guild: DiscordenoGuild, member: DiscordenoMember, nickname: string, - oldNickname?: string + oldNickname?: string, ) => unknown; /** A user's presence is their current state on a guild. This event is sent when a user's presence or info, such as name or avatar, is updated. */ presenceUpdate?: ( presence: PresenceUpdate, - oldPresence?: PerformanceEntry + oldPresence?: PresenceUpdate, ) => unknown; /** Sent before every event execution. Discordeno will not await its execution. */ raw?: (data: GatewayPayload) => unknown; @@ -148,22 +158,24 @@ export interface EventHandlers { /** Sent when a user adds a reaction to a message. */ reactionAdd?: ( data: MessageReactionAdd, - member?: DiscordenoMember, - message?: DiscordenoMessage + message?: DiscordenoMessage, ) => unknown; /** Sent when a user removes a reaction from a message. */ reactionRemove?: ( data: MessageReactionRemove, - message?: DiscordenoMessage + message?: DiscordenoMessage, ) => unknown; /** Sent when a user explicitly removes all reactions from a message. */ - reactionRemoveAll?: (payload: DiscordMessageReactionRemoveAll) => unknown; + reactionRemoveAll?: ( + payload: MessageReactionRemoveAll, + message?: DiscordenoMessage, + ) => unknown; /** Sent when a bot removes all instances of a given emoji from the reactions of a message. */ reactionRemoveEmoji?: ( emoji: Partial, messageId: string, channelId: string, - guildId?: string + guildId?: string, ) => unknown; /** Sent when a guild role is created. */ roleCreate?: (guild: DiscordenoGuild, role: DiscordenoRole) => unknown; @@ -173,19 +185,24 @@ export interface EventHandlers { roleUpdate?: ( guild: DiscordenoGuild, role: DiscordenoRole, - old: DiscordenoRole + old: DiscordenoRole, ) => unknown; roleGained?: ( guild: DiscordenoGuild, member: DiscordenoMember, - roleId: string + roleId: string, ) => unknown; roleLost?: ( guild: DiscordenoGuild, member: DiscordenoMember, - roleId: string + roleId: string, ) => unknown; shardReady?: (shardId: number) => unknown; + /** Sent when a shard failed to load. */ + shardFailedToLoad?: ( + shardId: number, + unavailableGuildIds: Set, + ) => unknown; /** Sent when a user starts typing in a channel. */ typingStart?: (data: TypingStart) => unknown; /** Sent when a user joins a voice channel */ @@ -196,24 +213,24 @@ export interface EventHandlers { voiceChannelSwitch?: ( member: DiscordenoMember, channelId: string, - oldChannelId: string + oldChannelId: string, ) => unknown; /** Sent when a voice server is updated with information for making the bot connect to a voice channel. */ voiceServerUpdate?: ( payload: VoiceServerUpdate, - guild: DiscordenoGuild + guild: DiscordenoGuild, ) => unknown; /** Sent when someone joins/leaves/moves voice channels. */ voiceStateUpdate?: ( member: DiscordenoMember, - voiceState: VoiceState + voiceState: VoiceState, ) => unknown; /** Sent when a guild channel's webhook is created, updated, or deleted. */ webhooksUpdate?: (channelId: string, guildId: string) => unknown; /** Sent when a member has passed the guild's Membership Screening requirements */ membershipScreeningPassed?: ( guild: DiscordenoGuild, - member: DiscordenoMember + member: DiscordenoMember, ) => unknown; /** Sent when an integration is created on a server such as twitch, youtube etc.. */ integrationCreate?: (data: IntegrationCreateUpdate) => unknown; diff --git a/src/types/guilds/guild_member.ts b/src/types/guilds/guild_member.ts index e51a97596..86c4a2053 100644 --- a/src/types/guilds/guild_member.ts +++ b/src/types/guilds/guild_member.ts @@ -22,3 +22,11 @@ export interface GuildMember { /** https://discord.com/developers/docs/resources/guild#guild-member-object */ export type DiscordGuildMember = SnakeCasedPropertiesDeep; + +// We use these types much since user always exists unless its a `CREATE_MESSAGE` or `MESSAGE_UPDATE` event + +export type GuildMemberWithUser = Omit & { user: User }; +/** https://discord.com/developers/docs/resources/guild#guild-member-object */ +export type DiscordGuildMemberWithUser = SnakeCasedPropertiesDeep< + GuildMemberWithUser +>; diff --git a/src/types/members/guild_member_add.ts b/src/types/members/guild_member_add.ts index 90e710a6a..a92d651d3 100644 --- a/src/types/members/guild_member_add.ts +++ b/src/types/members/guild_member_add.ts @@ -1,7 +1,7 @@ -import { GuildMember } from "../guilds/guild_member.ts"; +import { GuildMemberWithUser } from "../guilds/guild_member.ts"; import { SnakeCasedPropertiesDeep } from "../util.ts"; -export interface GuildMemberAdd extends GuildMember { +export interface GuildMemberAdd extends GuildMemberWithUser { /** id of the guild */ guildId: string; } diff --git a/src/types/members/guild_members_chunk.ts b/src/types/members/guild_members_chunk.ts index b4b4e0a82..d346550e4 100644 --- a/src/types/members/guild_members_chunk.ts +++ b/src/types/members/guild_members_chunk.ts @@ -1,4 +1,4 @@ -import { GuildMember } from "../guilds/guild_member.ts"; +import { GuildMemberWithUser } from "../guilds/guild_member.ts"; import { PresenceUpdate } from "../misc/presence_update.ts"; import { SnakeCasedPropertiesDeep } from "../util.ts"; @@ -6,7 +6,7 @@ export interface GuildMembersChunk { /** The id of the guild */ guildId: string; /** Set of guild members */ - members: GuildMember[]; + members: GuildMemberWithUser[]; /** The chunk index in the expected chunks for this response (0 <= chunk_index < chunk_count) */ chunkIndex: number; /** The total number of expected chunks for this response */ diff --git a/src/types/messages/message.ts b/src/types/messages/message.ts index ed43b2ae9..04317a2d9 100644 --- a/src/types/messages/message.ts +++ b/src/types/messages/message.ts @@ -43,7 +43,7 @@ export interface Message { * Users specifically mentioned in the message * Note: The user objects in the mentions array will only have the partial member field present in `MESSAGE_CREATE` and `MESSAGE_UPDATE` events from text-based guild channels. */ - mentions: User[]; + mentions: (User & { member?: Partial })[]; /** Roles specifically mentioned in this message */ mentionRoles: string[]; /** diff --git a/src/types/messages/message_reaction_add.ts b/src/types/messages/message_reaction_add.ts index 4839e9e26..af3530ff6 100644 --- a/src/types/messages/message_reaction_add.ts +++ b/src/types/messages/message_reaction_add.ts @@ -1,5 +1,5 @@ import { Emoji } from "../emojis/emoji.ts"; -import { GuildMember } from "../guilds/guild_member.ts"; +import { GuildMemberWithUser } from "../guilds/guild_member.ts"; import { SnakeCasedPropertiesDeep } from "../util.ts"; export interface MessageReactionAdd { @@ -12,7 +12,7 @@ export interface MessageReactionAdd { /** The id of the guild */ guildId?: string; /** The member who reacted if this happened in a guild */ - member?: GuildMember; + member?: GuildMemberWithUser; /** The emoji used to react */ emoji: Partial; } diff --git a/src/types/voice/voice_state.ts b/src/types/voice/voice_state.ts index cc75e9f21..80dc73673 100644 --- a/src/types/voice/voice_state.ts +++ b/src/types/voice/voice_state.ts @@ -1,4 +1,4 @@ -import { GuildMember } from "../guilds/guild_member.ts"; +import { GuildMemberWithUser } from "../guilds/guild_member.ts"; import { SnakeCasedPropertiesDeep } from "../util.ts"; export interface VoiceState { @@ -9,7 +9,7 @@ export interface VoiceState { /** The user id this voice state is for */ userId: string; /** The guild member this voice state is for */ - member?: GuildMember; + member?: GuildMemberWithUser; /** The session id for this voice state */ sessionId: string; /** Whether this user is deafened by the server */