Een ticketbot geeft leden een knop. Als ze erop drukken, opent er een privékanaal dat alleen dat lid en je staff kunnen zien. Deze gids bouwt de kern ervan. Je hebt eerst een bottoken nodig: Een Discord-bot maken en zijn token ophalen.
Wat je nodig hebt
- Alleen de intent
Guilds. Er is geen privileged intent nodig. - Permissies voor de bot: Kanalen beheren, Kanalen bekijken, Berichten versturen.
- De ID van je staffrol. Zet de ontwikkelaarsmodus aan in Discord, klik met rechts op de rol en kies Rol-ID kopiëren.
De 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);
Voeg "discord.js": "^14.16.0" toe aan package.json. De ID van de staffrol wordt gelezen uit STAFF_ROLE_ID: zet hem in een .env-bestand en voeg het pakket dotenv toe, of typ de ID tijdens het testen in de code.
Draaien
Upload de bestanden naar je botserver en start hem: Een Node.js Discord-bot hosten. Typ op je server /ticketpanel in het kanaal waar leden tickets moeten openen.
Volgende stappen
- Een knop Close ticket die het kanaal verwijdert nadat hij een transcript heeft opgeslagen.
- Beperk elk lid tot één open ticket door te controleren of er al een kanaal met die naam bestaat.
- Bewaar tickets in een database: Een database gebruiken met je Discord-bot.





