diff --git a/commands/admin/ctx_add_self_roles.js b/commands/admin/ctx_add_self_roles.js index 041ebc1..95d33cc 100644 --- a/commands/admin/ctx_add_self_roles.js +++ b/commands/admin/ctx_add_self_roles.js @@ -1,30 +1,108 @@ -import { Message } from '../../database.js'; -import { ApplicationCommandType, ContextMenuCommandBuilder } from 'discord.js'; +import { TextInputBuilder, TextInputStyle } from 'discord.js'; +import { RoleEmojiPair } from '../../database.js'; +import { + ComponentType, + ActionRowBuilder, + RoleSelectMenuBuilder, + ApplicationCommandType, + ContextMenuCommandBuilder +} from 'discord.js'; +import { ModalBuilder } from 'discord.js'; -export const data = new ContextMenuCommandBuilder() - .setDMPermission(false) - .setName('Register self roles') - .setType(ApplicationCommandType.Message); -export async function execute(interaction) { - const id = interaction.targetMessage.id; +const saveMessageData = async (id, role, emoji) => { + // Try finding existing entry + const rep = await RoleEmojiPair.findOne({ + where: { + [Op.or]: [ + { + message: id, + role: role.id + }, { + message: id, + emoji + } + ] + } + }); + if (rep !== null) throw new Error(`Failed to fetch RoleEmojiPair entry with data {message:${id},role:${role.id},emoji:${emoji}}!`); + // Create database entry for pair + await RoleEmojiPair.create({ message: id, role: role.id, emoji }); +}; + +const addSelfRoles = async (interaction, msgID, emoji, role) => { + const { channel } = interaction; + + let step = 'fetch'; try { - // Create database entry - await Message.create({ id }); + // Get message by id + const message = await channel.messages.fetch(msgID); + + step = 'save data from'; + await saveMessageData(id, role, emoji); + + step = 'react to'; + // React with emoji to message + await message.react(emoji); // Reply successfully to acknowledge command await interaction.reply({ - content: `Successfully saved data from message! Add roles to it with reference ID '${id}'.`, + content: 'Added new entry for self roles!', ephemeral: true, }); - console.info(`[INFO] New self roles on message with ID: '${id}'.`); + console.info(`[INFO] Added new entry to get role with ID '${role.id}' using '${emoji}'.`); } catch (error) { console.error(error); + // Reply failed to acknowledge command await interaction.reply({ - content: 'Failed to save data from message!', + content: `Failed to ${step} message!`, ephemeral: true, }); } } + +export const data = new ContextMenuCommandBuilder() + .setDMPermission(false) + .setName('Add role emoji pair') + .setType(ApplicationCommandType.Message); +export async function modalSubmit(interaction) { + console.log(interaction); + + // await interaction.reply({ + // content: 'Successfully submitted Form!', + // ephemeral: true + // }); +} +export async function execute(interaction) { + const modal = new ModalBuilder() + .setCustomId('Add role emoji pair-pair') + .setTitle('Role Emoji Pair'); + + const roleSelector = new ActionRowBuilder().addComponents( + new TextInputBuilder() + .setLabel('Enter exactly one role ID.') + .setStyle(TextInputStyle.Short) + .setCustomId('role') + .setRequired(true)); + + // const roles = await interaction.guild.roles.fetch(); + // const selection = roles.find((r) => + // roleInteraction.values.includes(r.id) + // ); + + const emojiTextInput = new ActionRowBuilder().addComponents( + new TextInputBuilder() + .setLabel('Enter exactly one emoji.') + .setStyle(TextInputStyle.Short) + .setCustomId('emoji') + .setRequired(true)); + + // const id = interaction.targetMessage.id; + // await addSelfRoles(interaction, id, emoji, role); + + modal.addComponents(roleSelector, emojiTextInput); + + await interaction.showModal(modal); +}