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) + ); + } }