import { SlashCommandBuilder } from 'discord.js'; import { Message } from './../../database.js'; import { addSelfRoles } from '../../shared.js'; const createSelfRoles = async (interaction) => { const { options, channel } = interaction; // Create message with text input const text = options.getString('text'); const id = (await channel.send(text)).id; // Reply and delete to acknowledge command await interaction.deferReply(); await interaction.deleteReply(); return id; }; const registerSelfRoles = async (interaction) => { const { options, channel } = interaction; const id = options.getString('id'); const response = { success: false, msgID: null }; try { // Get message by id await channel.messages.fetch(id); // Reply successfully to acknowledge command await interaction.reply({ content: 'Successfully fetched message!', ephemeral: true }); response.success = true; response.msgID = id; return response; } catch (error) { console.error(error); // Reply failed to acknowledge command await interaction.reply({ content: 'Failed to fetch message!', ephemeral: true }); } return response; }; export const data = new SlashCommandBuilder() .setName('self_roles') .setDMPermission(false) .setDescription('Manages reactions for self roles.') .addSubcommand((subcommand) => subcommand .setName('create') .setDescription('Creates new message in channel.') .addStringOption((option) => option .setName('text') .setRequired(true) .setDescription('The text to be displayed in the message.') ) ) .addSubcommand((subcommand) => subcommand .setName('register') .setDescription('Registers an existing message.') .addStringOption((option) => option .setName('id') .setRequired(true) .setDescription('The ID to reference the message to be used.') ) ) .addSubcommand((subcommand) => subcommand .setName('add') .setDescription('Add a role-emoji-pair to a message.') .addStringOption((option) => option .setName('id') .setRequired(true) .setDescription('The ID to reference the message to be used.') ) .addRoleOption((option) => option.setName('role').setRequired(true).setDescription('The role be assigned to.') ) .addStringOption((option) => option.setName('emoji').setRequired(true).setDescription('The emoji to be reacted with.') ) ); export async function execute(interaction) { const { options } = interaction; let createNew = false, id; switch (options.getSubcommand()) { case 'create': id = await createSelfRoles(interaction); // Flag to create new database entry createNew = true; break; case 'register': { const response = await registerSelfRoles(interaction); id = response.msgID ?? id; // Flag to create new database entry createNew = response.success; break; } case 'add': { // Get command options const msgID = options.getString('id'); const role = options.getRole('role'); const emoji = options.getString('emoji'); // Try adding self role pair await addSelfRoles(interaction, msgID, role, emoji); break; } } if (createNew) { try { // Create database entry await Message.create({ id }); } catch (error) { console.error(error); // Reply failed to acknowledge command await interaction.followUp({ content: 'Failed to save data from message!', ephemeral: true }); } console.info(`[INFO] New self roles on message with ID: '${id}'.`); } }