scythe/src/components/ticket.ts

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