NUEVO 📢 Oferta de lanzamiento limitada: ¡hasta un 70% de descuento en tu primer mes, en todos los juegos!Ver planes

Cómo crear un bot de tickets para Discord (discord.js)

Hosting de bots de DiscordUpdated Oct 22, 20264 min read

Un bot de tickets da a los miembros un botón. Al pulsarlo se abre un canal privado que solo ven ese miembro y tu equipo. Esta guía construye la base de uno. Antes necesitas un token de bot: Cómo crear un bot de Discord y obtener su token.

Qué necesitas

  • Solo el intent Guilds. No hace falta ningún intent privilegiado.
  • Permisos para el bot: Manage Channels, View Channels, Send Messages.
  • El ID del rol de tu equipo. Activa el Developer Mode (modo desarrollador) en Discord, haz clic derecho sobre el rol y elige Copy Role ID.

El código

index.js

const {
  Client, GatewayIntentBits, ChannelType, PermissionFlagsBits,
  ActionRowBuilder, ButtonBuilder, ButtonStyle, SlashCommandBuilder, REST, Routes,
} = require('discord.js');

const STAFF_ROLE_ID = process.env.STAFF_ROLE_ID;
const client = new Client({ intents: [GatewayIntentBits.Guilds] });

client.once('ready', async () => {
  const rest = new REST({ version: '10' }).setToken(process.env.DISCORD_TOKEN);
  const cmd = new SlashCommandBuilder().setName('ticketpanel').setDescription('Post the ticket button')
    .setDefaultMemberPermissions(PermissionFlagsBits.ManageGuild);
  await rest.put(Routes.applicationCommands(client.user.id), { body: [cmd.toJSON()] });
  console.log(`Logged in as ${client.user.tag}`);
});

client.on('interactionCreate', async (i) => {
  if (i.isChatInputCommand() && i.commandName === 'ticketpanel') {
    const row = new ActionRowBuilder().addComponents(
      new ButtonBuilder().setCustomId('open_ticket').setLabel('Open a ticket').setStyle(ButtonStyle.Primary));
    await i.channel.send({ content: 'Need help? Press the button to open a private ticket.', components: [row] });
    return i.reply({ content: 'Posted.', ephemeral: true });
  }

  if (i.isButton() && i.customId === 'open_ticket') {
    const channel = await i.guild.channels.create({
      name: `ticket-${i.user.username}`,
      type: ChannelType.GuildText,
      permissionOverwrites: [
        { id: i.guild.roles.everyone.id, deny: [PermissionFlagsBits.ViewChannel] },
        { id: i.user.id, allow: [PermissionFlagsBits.ViewChannel, PermissionFlagsBits.SendMessages] },
        { id: STAFF_ROLE_ID, allow: [PermissionFlagsBits.ViewChannel, PermissionFlagsBits.SendMessages] },
        { id: client.user.id, allow: [PermissionFlagsBits.ViewChannel, PermissionFlagsBits.SendMessages, PermissionFlagsBits.ManageChannels] },
      ],
    });
    await channel.send(`Hello ${i.user}, a member of staff will be with you soon.`);
    return i.reply({ content: `Your ticket: ${channel}`, ephemeral: true });
  }
});

client.login(process.env.DISCORD_TOKEN);

Añade "discord.js": "^14.16.0" a package.json. El ID del rol del equipo se lee de STAFF_ROLE_ID: ponlo en un archivo .env y añade el paquete dotenv, o escribe el ID en el código mientras pruebas.

Ejecútalo

Sube los archivos a tu servidor de bots e inícialo: Cómo alojar un bot de Discord en Node.js. En tu servidor, escribe /ticketpanel en el canal donde los miembros deban abrir los tickets.

Siguientes pasos

  • Un botón Close ticket (cerrar ticket) que borre el canal después de guardar una transcripción.
  • Limita a cada miembro a un solo ticket abierto comprobando si ya existe un canal con ese nombre.
  • Guarda los tickets en una base de datos: Cómo usar una base de datos con tu bot de Discord.

¿Ya lo tienes en otro proveedor? Trae tu servidor con nosotros

CREA TU SERVIDOR DE JUEGOS
¿LISTO PARA EMPEZAR?

Ahorra hasta un 30% en tu nuevo servidor de juegos.
Rendimiento premium, activación instantánea y una fiabilidad inigualable al mejor precio.

NUESTROS ÚLTIMOS BLOGS