mirror of
https://github.com/discordeno/discordeno.git
synced 2026-06-16 03:18:17 +00:00
51 lines
1.9 KiB
TypeScript
51 lines
1.9 KiB
TypeScript
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)
|
|
);
|
|
}
|