71 lines
2.6 KiB
JavaScript
71 lines
2.6 KiB
JavaScript
const { SlashCommandBuilder, PermissionsBitField, ChannelType, ButtonStyle, ButtonBuilder, ActionRowBuilder } = require('discord.js');
|
|
|
|
module.exports = {
|
|
data: new SlashCommandBuilder()
|
|
.setName('ticket')
|
|
.setDescription('Commands for managing a ticket')
|
|
.addSubcommand(subcommand => subcommand
|
|
.setName('create')
|
|
.setDescription('Create a ticket with you and moderators'))
|
|
.addSubcommand(subcommand => subcommand
|
|
.setName('close')
|
|
.setDescription('Close current ticket')),
|
|
|
|
async execute({ interaction, createEmbed }) {
|
|
if (interaction.options.getSubcommand() === 'create') {
|
|
await interaction.reply({ embeds: [createEmbed.basic('Creating ticket channel...')], fetchReply: true, ephemeral: true });
|
|
|
|
const ticketChannel = await interaction.member.guild.channels.create({
|
|
name: `ticket-${interaction.user.username}`,
|
|
type: ChannelType.GuildText,
|
|
parent: process.env.TICKET_CATEGORY_ID,
|
|
permissionOverwrites: [
|
|
{
|
|
id: interaction.guild.id,
|
|
deny: [PermissionsBitField.Flags.ViewChannel],
|
|
},
|
|
{
|
|
id: process.env.MODERATOR_ROLE_ID,
|
|
allow: [PermissionsBitField.Flags.ViewChannel],
|
|
},
|
|
{
|
|
id: interaction.user.id,
|
|
allow: [PermissionsBitField.Flags.ViewChannel],
|
|
},
|
|
],
|
|
|
|
});
|
|
|
|
await ticketChannel.send({ embeds: [createEmbed.basic(`${interaction.user} created a ticket`)]});
|
|
|
|
interaction.editReply({ embeds: [createEmbed.basic(`${ticketChannel} has been created`)], emphemeral: true });
|
|
|
|
} else if (interaction.options.getSubcommand() === 'close') {
|
|
|
|
if (!interaction.channel.name.startsWith('ticket')) return interaction.reply({ embeds: [createEmbed.basic('You must execute this command inside a ticket channel')], emphemeral: true });
|
|
|
|
const cancelRow = new ActionRowBuilder()
|
|
.addComponents(
|
|
new ButtonBuilder()
|
|
.setCustomId('cancel')
|
|
.setLabel('Cancel')
|
|
.setStyle(ButtonStyle.Danger),
|
|
);
|
|
|
|
const closeMessage = await interaction.reply({ embeds: [createEmbed.basic(`Closing ticket in 10 seconds...`)], components: [cancelRow]});
|
|
const collector = closeMessage.createMessageComponentCollector();
|
|
|
|
const timeout = setTimeout(() => {
|
|
try {
|
|
interaction.channel.delete()
|
|
} catch {}
|
|
}, 10000)
|
|
|
|
collector.on('collect', async () => {
|
|
clearTimeout(timeout);
|
|
await closeMessage.edit({ embeds: [createEmbed.basic('Ticket closing has been stopped')], components: [] });
|
|
});
|
|
}
|
|
},
|
|
};
|