import { ActionRowBuilder, ButtonBuilder, ButtonInteraction, ButtonStyle, CategoryChannel, ChannelType, EmbedBuilder, MessageFlags, PermissionsBitField, } from "discord.js"; import { ButtonComponent, Discord } from "discordx"; import { ticketsTable } from "../db/schema"; import db from "../db"; import { eq } from "drizzle-orm"; @Discord() export class TicketComponenets { @ButtonComponent({ id: "createTicket" }) async createHandler(inter: ButtonInteraction): Promise { const check = await db .select() .from(ticketsTable) .where(eq(ticketsTable.user, inter.user.id)); if (check.length >= 1) { await inter.reply({ content: "You already have a ticket open.", flags: MessageFlags.Ephemeral, }); return; } let channel = await inter.guild!.channels.create({ type: ChannelType.GuildText, name: `ticket-${inter.user.username}`, permissionOverwrites: [ { id: inter.guild!.roles.everyone, deny: [PermissionsBitField.Flags.ViewChannel], }, { id: inter.user.id, allow: [ PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.SendMessages, ], }, { id: Bun.env.MOD_ROLE, allow: [ PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.SendMessages, ], }, { id: inter.client.user.id, allow: [ PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.SendMessages ], } ], }); const category = inter.guild!.channels.cache.get( Bun.env.TICKET_CATEGORY, ) as CategoryChannel; channel = await channel.setParent(category); const embed = new EmbedBuilder() .setTitle(`Tickets`) .setDescription(`<@${inter.user.id}> here's your ticket!`); const deleteButton = new ButtonBuilder() .setCustomId("deleteTicket") .setLabel("Delete Ticket") .setStyle(ButtonStyle.Primary); const row = new ActionRowBuilder().addComponents( deleteButton, ); await channel.send({ embeds: [embed], components: [row], }); await inter.reply({ content: `<#${channel.id}>`, flags: MessageFlags.Ephemeral, }); await db.insert(ticketsTable).values({ user: inter.user.id, channel: channel.id, }); } @ButtonComponent({ id: "deleteTicket" }) async deleteHandler(inter: ButtonInteraction): Promise { await inter.channel?.delete(`<@${inter.user.id}> has deleted the ticket.`); await db.delete(ticketsTable).where(eq(ticketsTable.user, inter.user.id)); } }