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], } ] }); 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)); } }