Files
sorielle/src/commands/config.ts
T
naomi fe70dcc49f
Node.js CI / Lint and Test (pull_request) Successful in 46s
feat: initial prototype
2025-07-19 19:46:36 -07:00

101 lines
3.6 KiB
TypeScript

/**
* @copyright nhcarrigan
* @license Naomi's Public License
* @author Naomi Carrigan
*/
import {
TextDisplayBuilder,
ContainerBuilder,
ButtonBuilder,
ButtonStyle,
ActionRowBuilder,
MessageFlags,
ChannelType,
PermissionFlagsBits,
} from "discord.js";
import { sendUnentitledResponse } from "../modules/sendUnentitledResponse.js";
import { checkGuildEntitlement } from "../utils/checkEntitlement.js";
import { errorHandler } from "../utils/errorHandler.js";
import type { Command } from "../interfaces/command.js";
/**
* Handles the `/config` command interaction.
* @param _sorielle - Sorielle's Discord instance (unused).
* @param interaction - The command interaction payload from Discord.
*/
/**
* Handles the `/config` command interaction.
* @param sorielle - Sorielle's Discord instance.
* @param interaction - The command interaction payload from Discord.
*/
// eslint-disable-next-line max-lines-per-function -- It's mostly components.
export const config: Command = async(sorielle, interaction) => {
try {
const isEntitled = await checkGuildEntitlement(sorielle, interaction.guild);
if (!isEntitled) {
await sendUnentitledResponse(interaction);
return;
}
await interaction.deferReply({
flags: [ MessageFlags.Ephemeral ],
});
const channel = interaction.options.getChannel("channel", true, [
ChannelType.GuildText,
]);
const permissions = interaction.guild.members.me?.permissionsIn(channel);
const hasAllPermissions
= permissions !== undefined
&& permissions.has(PermissionFlagsBits.ManageMessages)
&& permissions.has(PermissionFlagsBits.ViewChannel)
&& permissions.has(PermissionFlagsBits.ReadMessageHistory);
if (!hasAllPermissions) {
await interaction.editReply({
content:
// eslint-disable-next-line stylistic/max-len -- Big boi string.
"I do not have permission to manage messages in that channel. Please ensure I have the `Manage Messages`, `View Channel`, and `Read Message History` permissions.",
});
return;
}
const seconds = interaction.options.getInteger("timeout", true);
const components = [
new ContainerBuilder().addTextDisplayComponents(
new TextDisplayBuilder().setContent(
`Messages in <#${
channel.id
}> will be deleted after ${seconds.toLocaleString("en-GB")} seconds.`,
),
),
new ActionRowBuilder<ButtonBuilder>().addComponents(
new ButtonBuilder().
setStyle(ButtonStyle.Link).
setLabel("Discord Server").
setURL("https://chat.nhcarrigan.com"),
new ButtonBuilder().
setStyle(ButtonStyle.Link).
setLabel("Forum").
setURL("https://forum.nhcarrigan.com"),
),
];
await interaction.editReply({
components: components,
flags: [ MessageFlags.IsComponentsV2 ],
});
} catch (error) {
await errorHandler(error, "config command");
// eslint-disable-next-line @typescript-eslint/no-unused-expressions -- We want to ensure the interaction is replied to.
interaction.replied
? await interaction.editReply({
content:
// eslint-disable-next-line stylistic/max-len -- Big boi string.
"An error occurred while processing your request. Please try again later.",
})
: await interaction.reply({
content:
// eslint-disable-next-line stylistic/max-len -- Big boi string.
"An error occurred while processing your request. Please try again later.",
flags: [ MessageFlags.Ephemeral ],
});
}
};