diff --git a/module/shardingManager.ts b/module/shardingManager.ts index 851e5d05f..ec746ec0d 100644 --- a/module/shardingManager.ts +++ b/module/shardingManager.ts @@ -563,7 +563,10 @@ export async function handleDiscordPayload( } if (data.t === "PRESENCE_UPDATE") { - return eventHandlers.presenceUpdate?.(data.d as PresenceUpdatePayload); + const payload = data.d as PresenceUpdatePayload; + const oldPresence = cache.presences.get(payload.user.id); + cache.presences.set(payload.user.id, payload); + return eventHandlers.presenceUpdate?.(payload, oldPresence); } if (data.t === "TYPING_START") { diff --git a/types/options.ts b/types/options.ts index f1f85e852..3a25deaa4 100644 --- a/types/options.ts +++ b/types/options.ts @@ -105,7 +105,10 @@ export interface EventHandlers { nickname: string, oldNickname?: string, ) => unknown; - presenceUpdate?: (data: PresenceUpdatePayload) => unknown; + presenceUpdate?: ( + presence: PresenceUpdatePayload, + oldPresence?: PresenceUpdatePayload, + ) => unknown; raw?: (data: DiscordPayload) => unknown; ready?: () => unknown; reactionAdd?: ( diff --git a/utils/cache.ts b/utils/cache.ts index e97037f85..094abc42c 100644 --- a/utils/cache.ts +++ b/utils/cache.ts @@ -3,12 +3,14 @@ import { Message } from "../structures/message.ts"; import { Guild } from "../structures/guild.ts"; import { Channel } from "../structures/channel.ts"; import { delay } from "https://deno.land/std@0.61.0/async/delay.ts"; +import { PresenceUpdatePayload } from "../types/discord.ts"; export interface CacheData { guilds: Collection; channels: Collection; messages: Collection; unavailableGuilds: Collection; + presences: Collection; } export const cache: CacheData = { @@ -16,6 +18,7 @@ export const cache: CacheData = { channels: new Collection(), messages: new Collection(), unavailableGuilds: new Collection(), + presences: new Collection(), }; async function cleanMessageCache() {