apps/bot/src/feats/tickets/modals.ts (view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
import {
LabelBuilder,
MessageFlags,
ModalBuilder,
TextInputBuilder,
TextInputStyle,
} from "discord.js";
import { option } from "@purrkit/router";
import db, { eq, getGuildByDiscordId, getTicket, guilds } from "@stealth-developers/db";
import { kitten } from "@/client";
import { errorMessage, upsertUser } from "@/lib";
import * as actions from "./actions";
export const configTextModal = kitten.modal("config-text", {
options: {
key: option.string({ required: true }),
},
run: async (interaction, { key }) => {
const value = interaction.fields.getTextInputValue("text-value");
if (!interaction.guildId)
return errorMessage(interaction, "This interaction can only be used in a server.");
const guild = await getGuildByDiscordId(interaction.guildId);
if (!guild)
return errorMessage(interaction, "Failed to update configuration: Guild not found.");
const [res] = await db
.update(guilds)
.set({ [key]: value })
.where(eq(guilds.id, guild.id))
.returning();
if (!res) return errorMessage(interaction, "Failed to update configuration.");
return interaction.reply({
content: "Configuration updated successfully!",
flags: [MessageFlags.Ephemeral],
});
},
});
export const closeTicketModal = kitten.modal("close-ticket", {
options: {
ticketId: option.string({ required: true }),
},
run: async (interaction, { ticketId }) => {
await interaction.deferReply({ flags: ["Ephemeral"] });
if (!interaction.guild)
return errorMessage(interaction, "You must run this command in a guild");
const ticket = await getTicket(ticketId);
if (!ticket) return errorMessage(interaction, "Ticket not found");
const user = await upsertUser(interaction.user, interaction.guild);
if (!user) return errorMessage(interaction, "Failed to upsert user");
const reasons = {
public: interaction.fields.getTextInputValue("reason:public"),
private: user.moderator ? interaction.fields.getTextInputValue("reason:private") : undefined,
};
await actions.closeTicket(user, ticket.id, reasons);
return interaction.followUp({ content: "Ticket closed successfully" });
},
});
export const TicketModalPresets = {
close: (id: string, isModerator: boolean) => {
const description = isModerator
? "The reason for closing the ticket; this will be shared with the user"
: "The reason for closing the ticket";
const reasonLabel = new LabelBuilder()
.setLabel("Reason")
.setDescription(description)
.setTextInputComponent(
new TextInputBuilder()
.setStyle(TextInputStyle.Paragraph)
.setCustomId("reason:public")
.setRequired(true),
);
const privateReasonLabel = new LabelBuilder()
.setLabel("Private Reason")
.setDescription("The reason for closing the ticket.")
.setTextInputComponent(
new TextInputBuilder()
.setStyle(TextInputStyle.Paragraph)
.setCustomId("reason:private")
.setRequired(isModerator),
);
const labels = isModerator ? [reasonLabel, privateReasonLabel] : [reasonLabel];
const modal = new ModalBuilder()
.setCustomId(closeTicketModal.id({ ticketId: id }))
.setTitle("Close ticket")
.addLabelComponents(...labels);
return modal;
},
};
export const TicketModals = [closeTicketModal, configTextModal];
|