90 lines
2.6 KiB
TypeScript
90 lines
2.6 KiB
TypeScript
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<void> {
|
|
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<ButtonBuilder>()
|
|
.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<void> {
|
|
await inter.channel?.delete(`<@${inter.user.id}> has deleted the ticket.`);
|
|
await db.delete(ticketsTable).where(eq(ticketsTable.user, inter.user.id));
|
|
}
|
|
}
|