import { applicationId, eventHandlers } from "../../bot.ts"; import { cache } from "../../cache.ts"; import { rest } from "../../rest/rest.ts"; import type { DiscordenoInteractionResponse } from "../../types/discordeno/interaction_response.ts"; import { endpoints } from "../../util/constants.ts"; import { snakelize, validateComponents } from "../../util/utils.ts"; // TODO: v12 remove | string /** * Send a response to a users slash command. The command data will have the id and token necessary to respond. * Interaction `tokens` are valid for **15 minutes** and can be used to send followup messages. * * NOTE: By default we will suppress mentions. To enable mentions, just pass any mentions object. */ export async function sendInteractionResponse( id: bigint | string, token: string, options: DiscordenoInteractionResponse ) { // TODO: add more options validations if (options.data?.components) validateComponents(options.data?.components); // If the user wants this as a private message mark it ephemeral if (options.private) { options.data = { ...options.data, flags: 64 }; } // If no mentions are provided, force disable mentions if (!options.data?.allowedMentions) { options.data = { ...options.data, allowedMentions: { parse: [] } }; } // If its already been executed, we need to send a followup response if (cache.executedSlashCommands.has(token)) { return await rest.runMethod("post", endpoints.WEBHOOK(applicationId, token), snakelize(options.data)); } // Expire in 15 minutes cache.executedSlashCommands.add(token); setTimeout(() => { eventHandlers.debug?.("loop", `Running setTimeout in send_interaction_response file.`); cache.executedSlashCommands.delete(token); }, 900000); return await rest.runMethod( "post", endpoints.INTERACTION_ID_TOKEN(typeof id === "bigint" ? id : BigInt(id), token), snakelize(options) ); }