0% found this document useful (0 votes)
3 views6 pages

Message

This document outlines a Discord bot interaction handler for creating and managing support tickets. It includes functionalities for users to create tickets, claim them, generate transcripts, and delete or close tickets, with appropriate permissions checks for each action. The code uses Discord.js to create modals, buttons, and embeds for user interaction and ticket management.

Uploaded by

boredmanrng
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
3 views6 pages

Message

This document outlines a Discord bot interaction handler for creating and managing support tickets. It includes functionalities for users to create tickets, claim them, generate transcripts, and delete or close tickets, with appropriate permissions checks for each action. The code uses Discord.js to create modals, buttons, and embeds for user interaction and ticket management.

Uploaded by

boredmanrng
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 6

const {

EmbedBuilder,
ChannelType,
TextInputBuilder,
ModalBuilder,
TextInputStyle,
} = require("discord.js");
const { ButtonStyle, ButtonBuilder, ActionRowBuilder } = require("discord.js");
const TicketCanal = require("../../models/ticketCreados");
const TicketPanel = require("../../models/ticketPanel");
const transcripts = require("discord-html-transcripts")

module.exports = {
name: "interactionCreate",

async execute(interaction, client) {


if (interaction.isButton()) {
if (interaction.customId === "Crear") {
try {
const modal = new ModalBuilder()
.setCustomId("modal")
.setTitle("Crear tu Ticket'")
.addComponents(
new ActionRowBuilder().addComponents(
new TextInputBuilder()
.setCustomId("razon")
.setLabel("Problema")
.setStyle(TextInputStyle.Short)
.setRequired(true)
),
new ActionRowBuilder().addComponents(
new TextInputBuilder()
.setCustomId("razon1")
.setLabel("Explica el problema")
.setStyle(TextInputStyle.Paragraph)
.setRequired(true)
),
new ActionRowBuilder().addComponents(
new TextInputBuilder()
.setCustomId("razon3")
.setLabel("Posibles soluciones")
.setStyle(TextInputStyle.Paragraph)
.setRequired(true)
)
);

interaction.showModal(modal);

const modalInteraction = await interaction.awaitModalSubmit({


filter: (i) => i.user.id === interaction.user.id,
time: 1200000_000,
});

const razon2 = modalInteraction.fields.getTextInputValue("razon");

const razon1 = modalInteraction.fields.getTextInputValue("razon1");

const razon3 = modalInteraction.fields.getTextInputValue("razon3");


const Data = await TicketPanel.findOne({
ServerID: interaction.guild.id,
});
if (Data === null) return;
const RolId = Data.RolID;
const CategoriaId = Data.CategoriaID;

let data_ticket = await TicketCanal.find({


ServerID: interaction.guild.id,
AuthorID: interaction.user.id,
Cerrado: false,
});

for (const ticket of data_ticket) {


if (interaction.guild.channels.cache.get(ticket.Canal))
return modalInteraction.reply({
embeds: [
new EmbedBuilder().setColor("#2f3136").setDescription(`
\`❌\` Error ya tienes uno abierto

Tu ya tienes un ticket abierto aqui esta


tu comprovacion de tu ticket <#${ticket.Canal}>
`),
],
ephemeral: true,
});
}

await modalInteraction.reply({
embeds: [
new EmbedBuilder()
.setColor("#2f3136")
.setDescription(` \`⏳\` Espera un momento.... `),
],
ephemeral: true,
});

const canal = await interaction.guild.channels.create({


name: `ticket-${interaction.user.tag}`,
type: ChannelType.GuildText,
parent: CategoriaId,
});

canal.permissionOverwrites.create(interaction.user.id, {
ViewChannel: true,
SendMessages: true,
});

canal.permissionOverwrites.create(canal.guild.roles.everyone, {
ViewChannel: false,
SendMessages: false,
});

canal.permissionOverwrites.create(
interaction.guild.roles.cache.get(`${RolId}`),
{
ViewChannel: true,
SendMessages: true,
}
);

const mensaje = new EmbedBuilder()


.setAuthor({
name: `${interaction.user.username}`,
iconURL: `${interaction.user.displayAvatarURL({
dynamic: true,
})}`,
})
.setDescription(
`
\`🎫\` **Ticket Abierto**
**Creador del Ticket:** ${interaction.user.tag}

**👋 ¡Hola, bienvenid@ a tu ticket, <@$


{interaction.user.id}>!
Por favor, espera un momento mientras uno de nuestros
moderadores revisa tu solicitud.**

# \`❓\` **Asunto**
**Problema:**
\`\`\`ansi
#[1;2m#[1;31m#[1;31m${razon2}#[0m#[1;31m#[0m#[0m \`\`\`

**Explica el problema:**
\`\`\`ansi
#[1;2m#[1;31m#[1;31m${razon1}#[0m#[1;31m#[0m#[0m \`\`\`

**Posibles soluciones:**
\`\`\`ansi
#[1;2m#[1;31m#[1;31m${razon3}#[0m#[1;31m#[0m#[0m \`\`\`
`
)
.setColor("#ff1900");

let data = new TicketCanal({


ServerID: interaction.guild.id,
AuthorID: interaction.user.id,
Canal: canal.id,
Cerrado: false,
});

data.save();

await modalInteraction.editReply({
embeds: [
new EmbedBuilder().setColor("#2f3136")
.setDescription(`> *Tu ticket fue creado correctamente* *puedes ir
dando aqui click* ${canal}
`),
],
ephemeral: true,
});

const botones = new ActionRowBuilder().addComponents(


new ButtonBuilder()
.setCustomId("cerrar")
.setEmoji("🔒")
.setLabel("Cerrar")
.setStyle(ButtonStyle.Secondary),

new ButtonBuilder()
.setCustomId("borrar")
.setEmoji("🗑")
.setLabel("Borrar")
.setStyle(ButtonStyle.Secondary),

new ButtonBuilder()
.setCustomId("claim")
.setEmoji("📌")
.setLabel("Reclamar")
.setStyle(ButtonStyle.Secondary),

new ButtonBuilder()
.setCustomId("transcript")
.setEmoji("📋")
.setLabel("Transcripts")
.setStyle(ButtonStyle.Secondary)
);

canal.send({
embeds: [mensaje],
components: [botones],
content: `<@${interaction.user.id}> <@&${RolId}>`,
});
} catch (error) {
console.log(error);
}
}
if (interaction.customId === "claim") {
try {
const Data = await TicketPanel.findOne({
ServerID: interaction.guild.id,
});
if (Data === null) return;
const RolId = Data.RolID;
if (Data === null) return;
const dueño = Data.AuthorID;

const permiso = interaction.member.roles.cache.has(`${RolId}`);


if (!permiso)
return interaction.reply({
embeds: [
new EmbedBuilder()
.setDescription(
`
# \`❌\` **ERROR DE PERMISO**
**Solo los que tienen que rango** <@&${RolId}> **pueden usar este botón**
`
)
.setColor("#2f3136"),
],
ephemeral: true,
});

const embed = new EmbedBuilder()


.setDescription(
`
# \`📌\` **TICKET FUE RECLAMADO**
**Este ticket fue reclamados por** <@${interaction.user.id}>
`
)
.setColor("Red");

interaction.reply({ embeds: [embed] });


} catch (error) {
console.log(error);
}

} else if (interaction.customId === "transcript") {


try{
const Data = await TicketPanel.findOne({ ServerID: interaction.guild.id })
if(Data === null) return; const RolId = Data.RolID;

const permiso = interaction.member.roles.cache.has(`${RolId}`)


if(!permiso)
return interaction.reply({ content: "❌ No tienes permisos suficientes",
ephemeral: true })

const canal = interaction.channel;

const trans_tickets = await transcripts.createTranscript(canal)

interaction.reply({ files: [trans_tickets] })

} catch(err) {

}
} else if (interaction.customId === "borrar") {
try{
const Data = await TicketPanel.findOne({ ServerID:
interaction.guild.id })
if(Data === null) return; const RolId = Data.RolID;

const permiso = interaction.member.roles.cache.has(`$


{RolId}`)
if(!permiso)
return interaction.reply({ content: "❌ No tienes
suficientes permiso", ephemeral: true })

const mensaje = new EmbedBuilder()


.setDescription("📌 ¿Estas seguro que quieres borrar el
ticket?")
.setColor("Red")

const botones = new ActionRowBuilder().addComponents(


new ButtonBuilder()
.setCustomId("siboton")
.setEmoji("✅")
.setLabel("si")
.setStyle(ButtonStyle.Secondary),

new ButtonBuilder()
.setCustomId("noboton")
.setEmoji("❌")
.setLabel("No")
.setStyle(ButtonStyle.Secondary)
)

} catch(err) {

}
} else if (interaction.customId === "cerrar") {
try{

const Data = await TicketPanel.findOne({ ServerID:


interaction.guild.id })
if(Data === null) return; const RolId = Data.RolID;

const permiso = interaction.member.roles.cache.has(`$


{RolId}`)
if(!permiso)
return interaction.reply({ content: "❌ No tienes permisos
suficientes", ephemeral: true })

const mensaje = new EmbedBuilder()


.setDescription("✅ El ticket sera eliminado dentro de **5**
segundos")
.setColor("Green")
return interaction.reply({ embeds: [mensaje], ephemeral: true
})

&& setTimeout(() => {


interaction.channel.delete(`${interaction.channels}`)
}, 5000)
} catch(error){
console.log(error)
}
} if(interaction.customId === "noboton"){
try{

const Data = await TicketPanel.findOne({ ServerID:


interaction.guild.id })
if(Data === null) return; const RolId = Data.RolID;

const permiso = interaction.member.roles.cache.has(`$


{RolId}`)
if(!permiso)
return interaction.reply({ content: "❌ No tienes permisos
suficientes", ephemeral: true })

const mensaje = new EmbedBuilder()


.setDescription("❌ El ticket no fue eliminado")
.setColor("Red")

await interaction.reply({ embeds: [mensaje], ephemeral:


true })
} catch(error){
console.log(error)
}
}
}
}
}

You might also like