/** * @copyright nhcarrigan * @license Naomi's Public License * @author Naomi Carrigan */ import { LabelBuilder, ModalBuilder, StringSelectMenuBuilder, TextInputBuilder, TextInputStyle, } from "discord.js"; import { naomiId } from "../config/entitlements.js"; import { errorHandler } from "../utils/errorHandler.js"; import type { Command } from "../interfaces/command.js"; /** * Handles the `/announcement` command interaction. * Owner-only command that opens a modal for creating cross-platform announcements. * @param _hikari - Hikari's Discord instance (unused). * @param interaction - The command interaction payload from Discord. */ // eslint-disable-next-line max-lines-per-function -- Modal requires many input components export const announcement: Command = async(_hikari, interaction) => { try { if (interaction.user.id !== naomiId) { await interaction.reply({ content: "This command is restricted to the owner.", ephemeral: true, }); return; } const modal = new ModalBuilder(). setCustomId("announcement_modal"). setTitle("Create Announcement"); const contentInput = new TextInputBuilder(). setCustomId("content"). setStyle(TextInputStyle.Paragraph). setMaxLength(4000). setRequired(true); const contentInput2 = new TextInputBuilder(). setCustomId("content_2"). setStyle(TextInputStyle.Paragraph). setMaxLength(4000). setRequired(false); const contentInput3 = new TextInputBuilder(). setCustomId("content_3"). setStyle(TextInputStyle.Paragraph). setMaxLength(4000). setRequired(false); const contentInput4 = new TextInputBuilder(). setCustomId("content_4"). setStyle(TextInputStyle.Paragraph). setMaxLength(4000). setRequired(false); const categorySelect = new StringSelectMenuBuilder(). setCustomId("category"). setPlaceholder("Select a category"). addOptions([ { label: "Products", value: "products" }, { label: "Community", value: "community" }, { label: "Company", value: "company" }, ]); const contentLabel = new LabelBuilder().setLabel("Announcement Copy"). setDescription( "Your version of the announcement, to send to the AI for processing.", ). setTextInputComponent(contentInput); // eslint-disable-next-line stylistic/max-len -- Label chain exceeds line length limit const contentLabel2 = new LabelBuilder().setLabel("Additional Copy (Part 2)"). setDescription("Optional continuation of your announcement copy."). setTextInputComponent(contentInput2); // eslint-disable-next-line stylistic/max-len -- Label chain exceeds line length limit const contentLabel3 = new LabelBuilder().setLabel("Additional Copy (Part 3)"). setDescription("Optional continuation of your announcement copy."). setTextInputComponent(contentInput3); // eslint-disable-next-line stylistic/max-len -- Label chain exceeds line length limit const contentLabel4 = new LabelBuilder().setLabel("Additional Copy (Part 4)"). setDescription("Optional continuation of your announcement copy."). setTextInputComponent(contentInput4); const categoryLabel = new LabelBuilder().setLabel("Announcement Category"). setDescription("The category of the announcement."). setStringSelectMenuComponent(categorySelect); modal.addLabelComponents( contentLabel, contentLabel2, contentLabel3, contentLabel4, categoryLabel, ); await interaction.showModal(modal); } catch (error) { const id = await errorHandler(error, "announcement command"); await interaction.reply({ content: `An error occurred whilst processing your request. Error ID: \`${id}\``, ephemeral: true, }); } };