generated from nhcarrigan/template
110 lines
3.8 KiB
TypeScript
110 lines
3.8 KiB
TypeScript
/**
|
|
* @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,
|
|
});
|
|
}
|
|
};
|