diff --git a/src/api/controllers/guilds.ts b/src/api/controllers/guilds.ts index 405ae33fe..151666bc1 100644 --- a/src/api/controllers/guilds.ts +++ b/src/api/controllers/guilds.ts @@ -33,7 +33,7 @@ export async function handleInternalGuildCreate( } if (!cache.isReady) return eventHandlers.guildLoaded?.(guild); - return eventHandlers.guildCreate?.(guild); + eventHandlers.guildCreate?.(guild); } export async function handleInternalGuildDelete(data: DiscordPayload) { @@ -61,7 +61,7 @@ export async function handleInternalGuildDelete(data: DiscordPayload) { const guild = await cacheHandlers.get("guilds", payload.id); if (!guild) return; - return eventHandlers.guildDelete?.(guild); + eventHandlers.guildDelete?.(guild); } export async function handleInternalGuildUpdate(data: DiscordPayload) { @@ -91,7 +91,6 @@ export async function handleInternalGuildUpdate(data: DiscordPayload) { if (Array.isArray(cachedValue) && Array.isArray(value)) { const different = (cachedValue.length !== value.length) || - // @ts-ignore no idea how to fix this cachedValue.find((val) => !value.includes(val)) || value.find((val) => !cachedValue.includes(val)); if (!different) return; @@ -103,7 +102,9 @@ export async function handleInternalGuildUpdate(data: DiscordPayload) { } }).filter((change) => change) as GuildUpdateChange[]; - return eventHandlers.guildUpdate?.(cachedGuild, changes); + await cacheHandlers.set("guilds", payload.id, { ...cachedGuild, ...changes }); + + eventHandlers.guildUpdate?.(cachedGuild, changes); } export async function handleInternalGuildEmojisUpdate(data: DiscordPayload) { @@ -118,7 +119,7 @@ export async function handleInternalGuildEmojisUpdate(data: DiscordPayload) { cacheHandlers.set("guilds", payload.guild_id, guild); - return eventHandlers.guildEmojisUpdate?.( + eventHandlers.guildEmojisUpdate?.( guild, payload.emojis, cachedEmojis, diff --git a/src/api/controllers/members.ts b/src/api/controllers/members.ts index b3eb33c87..dbf05b233 100644 --- a/src/api/controllers/members.ts +++ b/src/api/controllers/members.ts @@ -70,6 +70,8 @@ export async function handleInternalGuildMemberUpdate(data: DiscordPayload) { payload.guild_id, ); + await cacheHandlers.set("messages", member.id, member); + if (guildMember?.nick !== payload.nick) { eventHandlers.nicknameUpdate?.( guild, diff --git a/src/api/controllers/misc.ts b/src/api/controllers/misc.ts index d05cc640f..da19bad3b 100644 --- a/src/api/controllers/misc.ts +++ b/src/api/controllers/misc.ts @@ -63,7 +63,7 @@ export async function handleInternalPresenceUpdate(data: DiscordPayload) { const oldPresence = await cacheHandlers.get("presences", payload.user.id); await cacheHandlers.set("presences", payload.user.id, payload); - return eventHandlers.presenceUpdate?.(payload, oldPresence); + eventHandlers.presenceUpdate?.(payload, oldPresence); } /** This function is the internal handler for the typings event. Users can override this with controllers if desired. */ @@ -85,7 +85,10 @@ export async function handleInternalUserUpdate(data: DiscordPayload) { // @ts-ignore index signatures if (member[key] !== value) return member[key] = value; }); - return eventHandlers.botUpdate?.(userData); + + await cacheHandlers.set("members", userData.id, member); + + eventHandlers.botUpdate?.(userData); } /** This function is the internal handler for the voice state update event. Users can override this with controllers if desired. */ @@ -117,6 +120,8 @@ export async function handleInternalVoiceStateUpdate(data: DiscordPayload) { selfStream: payload.self_stream || false, }); + await cacheHandlers.set("guilds", payload.guild_id, guild); + if (cachedState?.channelID !== payload.channel_id) { // Either joined or moved channels if (payload.channel_id) { @@ -144,7 +149,7 @@ export function handleInternalWebhooksUpdate(data: DiscordPayload) { if (data.t !== "WEBHOOKS_UPDATE") return; const options = data.d as WebhookUpdatePayload; - return eventHandlers.webhooksUpdate?.( + eventHandlers.webhooksUpdate?.( options.channel_id, options.guild_id, ); diff --git a/src/api/controllers/reactions.ts b/src/api/controllers/reactions.ts index b74b3ae3d..dc0151846 100644 --- a/src/api/controllers/reactions.ts +++ b/src/api/controllers/reactions.ts @@ -15,8 +15,7 @@ export async function handleInternalMessageReactionAdd(data: DiscordPayload) { const message = await cacheHandlers.get("messages", payload.message_id); if (message) { - const previousReactions = message.reactions; - const reactionExisted = previousReactions?.find( + const reactionExisted = message.reactions?.find( (reaction) => reaction.emoji.id === payload.emoji.id && reaction.emoji.name === payload.emoji.name, @@ -68,8 +67,7 @@ export async function handleInternalMessageReactionRemove( const message = await cacheHandlers.get("messages", payload.message_id); if (message) { - const previousReactions = message.reactions; - const reactionExisted = previousReactions?.find( + const reactionExisted = message.reactions?.find( (reaction) => reaction.emoji.id === payload.emoji.id && reaction.emoji.name === payload.emoji.name, @@ -115,15 +113,43 @@ export async function handleInternalMessageReactionRemove( ); } -export function handleInternalMessageReactionRemoveAll(data: DiscordPayload) { +export async function handleInternalMessageReactionRemoveAll( + data: DiscordPayload, +) { if (data.t !== "MESSAGE_REACTION_REMOVE_ALL") return; + const payload = data.d as BaseMessageReactionPayload; + const message = await cacheHandlers.get("messages", payload.message_id); + + if (message?.reactions) { + message.reactions = undefined; + + await cacheHandlers.set("messages", payload.message_id, message); + } + eventHandlers.reactionRemoveAll?.(data.d as BaseMessageReactionPayload); } -export function handleInternalMessageReactionRemoveEmoji(data: DiscordPayload) { +export async function handleInternalMessageReactionRemoveEmoji( + data: DiscordPayload, +) { if (data.t !== "MESSAGE_REACTION_REMOVE_EMOJI") return; + const payload = data.d as MessageReactionRemoveEmojiPayload; + const message = await cacheHandlers.get("messages", payload.message_id); + + if (message?.reactions) { + message.reactions = message.reactions?.filter( + (reaction) => + !( + reaction.emoji.id === payload.emoji.id && + reaction.emoji.name === payload.emoji.name + ), + ); + + await cacheHandlers.set("messages", payload.message_id, message); + } + eventHandlers.reactionRemoveEmoji?.( data.d as MessageReactionRemoveEmojiPayload, ); diff --git a/src/api/controllers/roles.ts b/src/api/controllers/roles.ts index 69f1c2b43..376e2ca31 100644 --- a/src/api/controllers/roles.ts +++ b/src/api/controllers/roles.ts @@ -16,7 +16,9 @@ export async function handleInternalGuildRoleCreate(data: DiscordPayload) { const role = await structures.createRole(payload.role); guild.roles = guild.roles.set(payload.role.id, role); - return eventHandlers.roleCreate?.(guild, role); + await cacheHandlers.set("guilds", payload.guild_id, guild); + + eventHandlers.roleCreate?.(guild, role); } export async function handleInternalGuildRoleDelete(data: DiscordPayload) { @@ -41,8 +43,11 @@ export async function handleInternalGuildRoleDelete(data: DiscordPayload) { if (!g.roles.includes(payload.role_id)) return; // Remove this role from the members cache g.roles = g.roles.filter((id) => id !== payload.role_id); + cacheHandlers.set("members", member.id, member); }); }); + + eventHandlers.roleDelete?.(guild, cachedRole); } export async function handleInternalGuildRoleUpdate(data: DiscordPayload) { @@ -57,5 +62,7 @@ export async function handleInternalGuildRoleUpdate(data: DiscordPayload) { const role = await structures.createRole(payload.role); guild.roles.set(payload.role.id, role); + await cacheHandlers.set("guilds", guild.id, guild); + eventHandlers.roleUpdate?.(guild, role, cachedRole); }