A powerful and extendable Discord bot, with it's own module system :3 thevoid.cafe/projects/voidy
at develop 53 lines 1.9 kB view raw
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});