Een van de beste manieren om een Discord-community levendig te houden, is een Discord-bot die het saaie werk automatiseert. Een Discord-bot bouwen is makkelijker dan je denkt: met Node.js en de discord.js-bibliotheek draait je eerste commando binnen enkele minuten. In deze gids bouwen we een bot vanaf nul en eindigen we, net als mijn eigen Runa2 Bot, met een echt commando dat met een game-database praat.
Vereisten
- Node.js 18+ en npm.
- Maak een applicatie + bot aan in het Discord Developer Portal en pak het token.
- Nodig de bot uit op je server (OAuth2 → scopes:
bot,applications.commands). - In je project:
npm install discord.js mysql2.
Je eerste bot: een werkende /ping
De kern van een bot is een Client. De intents bepalen welke gebeurtenissen de bot ontvangt:
// index.js
const { Client, GatewayIntentBits, Events } = require('discord.js');
const client = new Client({ intents: [GatewayIntentBits.Guilds] });
client.once(Events.ClientReady, (c) => {
console.log(`Giris yapildi: ${c.user.tag}`);
});
client.on(Events.InteractionCreate, async (interaction) => {
if (!interaction.isChatInputCommand()) return;
if (interaction.commandName === 'ping') {
await interaction.reply('Pong! 🏓');
}
});
client.login(process.env.TOKEN);
Zet het token nooit hard in de code; bewaar het als TOKEN in een .env-bestand.
Slash-commando's registreren
Moderne bots gebruiken slash-commando's (/ping). Commando's moeten via de REST API bij Discord worden geregistreerd voordat gebruikers ze kunnen aanroepen:
// deploy-commands.js
const { REST, Routes, SlashCommandBuilder } = require('discord.js');
const commands = [
new SlashCommandBuilder().setName('ping').setDescription('Pong ile yanitlar'),
].map((c) => c.toJSON());
const rest = new REST().setToken(process.env.TOKEN);
await rest.put(
Routes.applicationGuildCommands(CLIENT_ID, GUILD_ID),
{ body: commands },
);
Tip: Gebruik tijdens ontwikkeling applicationGuildCommands (één server) — die werkt direct bij. Globale commando's kunnen tot een uur duren om te verspreiden.
De praktijk: verbinden met een game-database
Wat Runa2 Bot bijzonder maakt, is dat hij de MySQL-database van het spel kan lezen en data kan schrijven via commando's. Met mysql2 ziet een commando dat het level van een speler opvraagt er zo uit:
const mysql = require('mysql2/promise');
const db = await mysql.createConnection({
host: 'localhost', user: 'bot', password: '***', database: 'player',
});
// /seviye komutu icinde:
const [rows] = await db.execute(
'SELECT level FROM player WHERE name = ?', [name]
);
await interaction.reply(`${name} seviye ${rows[0].level}`);
Let op: gebruik altijd parameters (?) in queries — gebruikersinvoer rechtstreeks in SQL stoppen opent de deur naar SQL-injectie.
De bot 24/7 draaien
Als je je computer uitzet, stopt de bot. Om hem continu te laten draaien, start je hem op een VPS met een procesmanager als pm2: pm2 start index.js. pm2 herstart de bot automatisch bij een crash en bewaart logs.
Veelgestelde vragen
Node.js of Python?
Beide werken uitstekend. Node.js (discord.js) is erg prettig voor realtime, event-gedreven werk; Python (discord.py) leest fijn voor data-/automatiseringstaken. Ik gebruik beide.
Wat als het bot-token lekt?
Iedereen met het token kan je bot besturen. Bij een lek genereer je het meteen opnieuw in het Developer Portal en zet je het nooit in code of op GitHub.
Kan ik de bot gratis hosten?
Er zijn gratis tiers voor kleine bots, maar voor een serieuze bot die met een game-database verbindt, is een kleine VPS de veiligste keuze.
Wil je een bot op maat voor je community? Ik bouw bots die verbinden met game-databases, modereren of evenementen beheren — neem contact op.