diff --git a/src/api/controllers/CHANNEL_PINS_UPDATE.ts b/src/api/controllers/CHANNEL_PINS_UPDATE.ts new file mode 100644 index 000000000..4e4a1e97f --- /dev/null +++ b/src/api/controllers/CHANNEL_PINS_UPDATE.ts @@ -0,0 +1,17 @@ +import { eventHandlers } from "../../bot.ts"; +import { + DiscordChannelPinsUpdateEvent, + DiscordPayload, +} from "../../types/mod.ts"; +import { cacheHandlers } from "./cache.ts"; + +export async function handleChannelPinsUpdate(data: DiscordPayload) { + const payload = data.d as DiscordChannelPinsUpdateEvent; + + const channel = await cacheHandlers.get("channels", payload.channel_id); + if (!channel) return; + + const guild = payload.guild_id ? await cacheHandlers.get("guilds", payload.guild_id) : undefined; + + eventHandlers.channelPinsUpdate?.(channel, guild, payload.last_pin_timestamp); +} diff --git a/src/api/controllers/mod.ts b/src/api/controllers/mod.ts index 8ef8cd3fa..bf0913f9a 100644 --- a/src/api/controllers/mod.ts +++ b/src/api/controllers/mod.ts @@ -7,6 +7,7 @@ import { handleInternalChannelDelete, handleInternalChannelUpdate, } from "./channels.ts"; +import { handleChannelPinsUpdate } from "./CHANNEL_PINS_UPDATE.ts"; import { handleInternalGuildCreate, handleInternalGuildDelete, @@ -62,6 +63,7 @@ export let controllers = { CHANNEL_CREATE: handleInternalChannelCreate, CHANNEL_DELETE: handleInternalChannelDelete, CHANNEL_UPDATE: handleInternalChannelUpdate, + CHANNEL_PINS_UPDATE: handleChannelPinsUpdate, GUILD_CREATE: handleInternalGuildCreate, GUILD_DELETE: handleInternalGuildDelete, GUILD_UPDATE: handleInternalGuildUpdate, diff --git a/src/types/discord.ts b/src/types/discord.ts index b4906e373..a07aa9cde 100644 --- a/src/types/discord.ts +++ b/src/types/discord.ts @@ -24,6 +24,7 @@ export interface DiscordPayload { | "CHANNEL_CREATE" | "CHANNEL_DELETE" | "CHANNEL_UPDATE" + | "CHANNEL_PINS_UPDATE" | "GUILD_CREATE" | "GUILD_DELETE" | "GUILD_UPDATE" diff --git a/src/types/options.ts b/src/types/options.ts index 3340e0611..2f148a786 100644 --- a/src/types/options.ts +++ b/src/types/options.ts @@ -117,6 +117,12 @@ export interface EventHandlers { channelUpdate?: (channel: Channel, cachedChannel: Channel) => unknown; /** Sent when a channel relevant to the current user is deleted. */ channelDelete?: (channel: Channel) => unknown; + /** Sent when a message is pinned or unpinned in a text channel. This is not sent when a pinned message is deleted. */ + channelPinsUpdate?: ( + channel: Channel, + guild?: Guild, + lastPinTimestamp?: string | null, + ) => unknown; debug?: (args: DebugArg) => unknown; dispatchRequirements?: (data: DiscordPayload, shardID: number) => unknown; /** Sent when a user is banned from a guild. */