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.





