scythe/src/components/ticket.ts

109 lines
2.5 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,
],
},
{
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<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));
}
}