NEU 📢 Begrenztes Startangebot: bis zu 70 % Rabatt auf deinen ersten Monat, für jedes Spiel!Tarife ansehen

So baust du einen Ticket-Bot für Discord (discord.js)

Discord-Bot-HostingUpdated Oct 22, 20263 min read

Ein Ticket-Bot gibt Mitgliedern einen Button. Ein Klick öffnet einen privaten Kanal, den nur dieses Mitglied und dein Team sehen können. Diese Anleitung baut den Kern eines solchen Bots. Du brauchst zuerst einen Bot-Token: So erstellst du einen Discord-Bot und holst seinen Token.

Was du brauchst

  • Nur den Intent Guilds. Es ist kein privilegierter Intent nötig.
  • Berechtigungen für den Bot: Manage Channels, View Channels, Send Messages.
  • Die ID deiner Team-Rolle. Schalte in Discord den Developer Mode ein, klick mit rechts auf die Rolle und wähl Copy Role ID.

Der Code

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

Füge "discord.js": "^14.16.0" zur package.json hinzu. Die ID der Team-Rolle wird aus STAFF_ROLE_ID gelesen: Leg sie in eine .env-Datei und füge das Paket dotenv hinzu, oder trag die ID beim Testen direkt in den Code ein.

Ausführen

Lade die Dateien auf deinen Bot-Server hoch und starte ihn: So hostest du einen Node.js-Discord-Bot. Tipp auf deinem Server /ticketpanel in den Kanal, in dem Mitglieder Tickets öffnen sollen.

Nächste Schritte

  • Ein Button Close ticket, der den Kanal löscht, nachdem er ein Transkript gespeichert hat.
  • Begrenze jedes Mitglied auf ein offenes Ticket, indem du auf einen vorhandenen Kanalnamen prüfst.
  • Speichere Tickets in einer Datenbank: So nutzt du eine Datenbank mit deinem Discord-Bot.

Läuft dein Server schon woanders? Zieh ihn zu uns um

ERSTELLE DEINEN GAMESERVER
BEREIT ZUM LOSLEGEN?

Spare bis zu 30% auf deinen neuen Gameserver.
Premium-Performance, sofortige Aktivierung und unschlagbare Zuverlässigkeit. Alles zum besseren Preis.

UNSERE NEUESTEN BLOGS