A powerful and extendable Discord bot, with it's own module system :3
thevoid.cafe/projects/voidy
1import { MessageFlags, PermissionFlagsBits, SlashCommandSubcommandBuilder } from "discord.js";
2import { Command, requirePermission } from "@voidy/framework";
3import { ChatbotRepository } from "../../schemas/ChatbotRepository";
4
5export default new Command({
6 id: "chatbot.message.remove",
7 use: [requirePermission(PermissionFlagsBits.ManageGuild)],
8 data: new SlashCommandSubcommandBuilder()
9 .setName("remove")
10 .setDescription("Remove a message from a content repository by index.")
11 .addIntegerOption((option) =>
12 option.setName("index").setDescription("Message index (1-based).").setRequired(true).setMinValue(1),
13 )
14 .addStringOption((option) =>
15 option.setName("repository").setDescription("Local repository name. Omit for global."),
16 ),
17
18 execute: async ({ interaction }) => {
19 const index = interaction.options.getInteger("index", true) - 1;
20 const repoName = interaction.options.getString("repository");
21
22 const query = repoName
23 ? { scope: "local" as const, guildId: interaction.guildId, name: repoName }
24 : { scope: "global" as const };
25
26 const repo = await ChatbotRepository.findOne(query);
27
28 if (!repo) {
29 const target = repoName ? `Local repository "${repoName}"` : "Global repository";
30 await interaction.reply({
31 content: `${target} not found.`,
32 flags: [MessageFlags.Ephemeral],
33 });
34 return;
35 }
36
37 if (index < 0 || index >= repo.messages.length) {
38 await interaction.reply({
39 content: `Invalid index. Repository has ${repo.messages.length} message(s).`,
40 flags: [MessageFlags.Ephemeral],
41 });
42 return;
43 }
44
45 const removed = repo.messages.splice(index, 1)[0];
46 await repo.save();
47
48 await interaction.reply({
49 content: `Removed message: "${removed?.content}". Remaining: ${repo.messages.length}.`,
50 flags: [MessageFlags.Ephemeral],
51 });
52 },
53});