From b672e2c6a2cf40fcf194d28b6dba3f9f8ab4aab3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pascal=20Prie=C3=9Fnitz?= Date: Wed, 3 Dec 2025 14:36:16 +0100 Subject: [PATCH] [deploy] add in-ticket pipeline status buttons --- src/services/ticketService.ts | 36 ++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/src/services/ticketService.ts b/src/services/ticketService.ts index c43bc35..3407011 100644 --- a/src/services/ticketService.ts +++ b/src/services/ticketService.ts @@ -129,6 +129,30 @@ export class TicketService { } const transcriptPath = await this.exportTranscript(interaction.channel as TextChannel, ticket.id); await interaction.reply({ content: `Transcript erstellt: ${transcriptPath}`, ephemeral: true }); + return; + } + + if (interaction.customId.startsWith('ticket:status:')) { + const targetStatus = interaction.customId.split(':')[2]; + const ticket = await this.getTicketByChannel(interaction); + if (!ticket) { + await interaction.reply({ content: 'Kein Ticket gefunden.', ephemeral: true }); + return; + } + const member = interaction.member as GuildMember; + const cfg = settingsStore.get(interaction.guild.id); + const supportRoleId = cfg?.supportRoleId || env.supportRoleId; + const canManage = + ticket.claimedBy === interaction.user.id || + (supportRoleId && member?.roles.cache.has(supportRoleId)) || + member?.permissions.has(PermissionsBitField.Flags.ManageMessages); + if (!canManage) { + await interaction.reply({ content: 'Keine Berechtigung, Status zu ändern.', ephemeral: true }); + return; + } + await this.updateStatus(ticket.id, targetStatus as TicketStatus); + await interaction.reply({ content: `Status gesetzt auf ${targetStatus}.`, ephemeral: true }); + return; } } @@ -288,12 +312,13 @@ export class TicketService { new ButtonBuilder().setCustomId('ticket:close').setLabel('Schliessen').setStyle(ButtonStyle.Danger), new ButtonBuilder().setCustomId('ticket:transcript').setLabel('Transcript').setStyle(ButtonStyle.Secondary) ); + const statusRow = this.buildStatusButtons(); const supportMention = supportRoleId ? `<@&${supportRoleId}>` : null; await channel.send({ content: supportMention ? `${member} ${supportMention}` : `${member}`, embeds: [embed], - components: [controls], + components: [controls, statusRow], allowedMentions: supportMention ? { roles: [supportRoleId as string], users: [member.id] } : { users: [member.id] } }); await this.sendTicketCreatedLog(guild, channel, member, topic, nextNumber, supportRoleId); @@ -533,4 +558,13 @@ export class TicketService { const cfg = settingsStore.get(guildId); return cfg?.ticketsEnabled === true; } + + private buildStatusButtons() { + return new ActionRowBuilder().addComponents( + new ButtonBuilder().setCustomId('ticket:status:neu').setLabel('Neu').setStyle(ButtonStyle.Secondary), + new ButtonBuilder().setCustomId('ticket:status:in_bearbeitung').setLabel('In Bearbeitung').setStyle(ButtonStyle.Primary), + new ButtonBuilder().setCustomId('ticket:status:warten_auf_user').setLabel('Warten auf User').setStyle(ButtonStyle.Secondary), + new ButtonBuilder().setCustomId('ticket:status:erledigt').setLabel('Erledigt').setStyle(ButtonStyle.Success) + ); + } }