all repos — stealth-developers @ 3c18edb41ee6535cb134d27febc94d7c36e1c45f

feat(tickets): handle ticket authors adding own close reason
vi v@vt3e.cat
Tue, 17 Feb 2026 19:50:10 +0000
commit

3c18edb41ee6535cb134d27febc94d7c36e1c45f

parent

fde303d6daf3ee22a4b0c2982dff0719a0c68529

1 files changed, 21 insertions(+), 16 deletions(-)

jump to
M src/interactions/buttons/tickets/ticket.tssrc/interactions/buttons/tickets/ticket.ts

@@ -9,11 +9,9 @@ type ChatInputCommandInteraction,

type Client, ContainerBuilder, FileBuilder, - FileComponent, LabelBuilder, type ModalSubmitInteraction, PermissionFlagsBits, - SectionBuilder, SeparatorBuilder, SlashCommandBuilder, SlashCommandSubcommandBuilder,

@@ -36,7 +34,6 @@ import { makeComponentId, parseComponentId } from "@/utils/components";

import { formatMessage } from "@/utils/formatting"; import { loggers } from "@/utils/logging"; import { - countTickets, getGuild, getManagerRoleIds, getTicket,

@@ -126,15 +123,17 @@ modal.addLabelComponents(label);

return modal; } -function getTicketReasonModal() { +function getTicketReasonModal(staff = false) { const modal = new ModalBuilder() .setCustomId(MODAL_IDS.reason) - .setTitle("Close Ticket Reason"); + .setTitle("Close Ticket"); const pubReason = new LabelBuilder() .setLabel("Public Reason") .setDescription( - "Provide a reason for closing the ticket - this will be DMd to the user", + staff + ? "Provide a reason for closing the ticket - this will be visible to the user" + : "Provide a reason for closing the ticket", ) .setTextInputComponent( new TextInputBuilder()

@@ -159,7 +158,8 @@ .setMaxLength(2000)

.setRequired(false), ); - modal.addLabelComponents(pubReason, privateReason); + modal.addLabelComponents(pubReason); + if (staff) modal.addLabelComponents(privateReason); return modal; }

@@ -216,7 +216,9 @@ });

return; } - return await interaction.showModal(getTicketReasonModal()); + return await interaction.showModal( + getTicketReasonModal(interaction.user.id !== ticket.authorId), + ); } await interaction.deferReply({ flags: ["Ephemeral"] });

@@ -259,7 +261,9 @@ return;

} if (action === "close") - return await interaction.showModal(getTicketReasonModal()); + return await interaction.showModal( + getTicketReasonModal(interaction.user.id !== ticket.authorId), + ); await interaction.deferReply({ flags: ["Ephemeral"] }); if (action === "reopen") await handleReopen(client, interaction, ticket);

@@ -299,12 +303,12 @@ } else if (action === "reason") {

const publicReason = interaction.fields.getTextInputValue( "ticket:reason_input", ); - const privateReason = interaction.fields.getTextInputValue( - "ticket:private_reason_input", - ); - - console.log(privateReason); - console.log(publicReason); + let privateReason = ""; + try { + privateReason = interaction.fields.getTextInputValue( + "ticket:private_reason_input", + ); + } catch {} const { data: ticket, exists } = await getTicket( interaction.guildId,

@@ -434,6 +438,7 @@ if (ticket.status === "closed") {

await interaction.editReply("❌ This ticket is already closed."); return; } + const closedByReporter = interaction.user.id === ticket.authorId; const channel = interaction.channel; if (!channel || !("permissionOverwrites" in channel)) return;

@@ -512,7 +517,7 @@ .addTextDisplayComponents(

new TextDisplayBuilder().setContent( [ `## Ticket #${ticket.anonymousId} closed`, - `**Closed By**: <@${interaction.user.id}>`, + `**Closed By**: <@${interaction.user.id}> (${closedByReporter ? "reporter" : "staff"})`, ].join("\n"), ), )