aslain.dev
0%
← Tüm makaleler

Node.js ile Discord Botu Yapımı: Adım Adım (discord.js)

Bir Discord topluluğunu canlı tutmanın en iyi yollarından biri, işleri otomatikleştiren bir Discord botudur. Discord bot yapımı sandığından kolay: Node.js ve discord.js kütüphanesiyle birkaç dakikada ilk komutunu çalıştırabilirsin. Bu rehberde sıfırdan bir bot kuracağız ve sonunda, kendi botum Runa2 Bot gibi, oyun veritabanına bağlanan gerçek bir komut yazacağız.

Gereksinimler

  • Node.js 18+ ve npm.
  • Discord Developer Portal'da bir uygulama + bot oluştur ve token'ı al.
  • Botu sunucuna davet et (OAuth2 → scopes: bot, applications.commands).
  • Projede npm install discord.js mysql2.

İlk bot: çalışan bir /ping

Botun çekirdeği bir Client'tır. intents, botun hangi olayları alacağını belirler:

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

Token'ı koda gömme; bir .env dosyasında TOKEN olarak sakla.

Slash komutlarını kaydetmek

Modern botlar slash komutları (/ping) kullanır. Komutlar, kullanıcılar çağırmadan önce Discord'a REST API ile kaydedilmelidir:

// 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 },
);

İpucu: Geliştirme sırasında applicationGuildCommands (tek sunucu) kullan — anında güncellenir. Global komutların yayılması bir saati bulabilir.

Gerçek dünya: oyun veritabanına bağlanmak

Runa2 Bot'u özel kılan şey, oyunun MySQL veritabanından bilgi çekip komutlarla veri yazabilmesi. mysql2 ile bir oyuncunun seviyesini sorgulayan komut şöyle görünür:

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

Dikkat: sorguda her zaman parametre (?) kullan — kullanıcı girdisini doğrudan SQL'e eklemek SQL injection kapısı açar.

Botu 7/24 çalıştırmak

Bilgisayarını kapatınca bot durur. Sürekli çalışması için botu bir VPS'te pm2 gibi bir süreç yöneticisiyle başlat: pm2 start index.js. pm2, çökme durumunda botu otomatik yeniden başlatır ve logları tutar.

Sık Sorulan Sorular

Node.js mi Python mı?

İkisi de mükemmel çalışır. Node.js (discord.js) gerçek zamanlı ve olay tabanlı işlerde çok rahattır; Python (discord.py) ise veri/otomasyon ağırlıklı işlerde sade durur. Ben her ikisini de kullanıyorum.

Botun token'ı sızdırılırsa ne olur?

Token'ı ele geçiren herkes botunu kontrol edebilir. Sızdıysa Developer Portal'dan hemen yenile ve asla koda/GitHub'a koyma.

Botu ücretsiz barındırabilir miyim?

Küçük botlar için ücretsiz katmanlar var, ama oyun veritabanına bağlanan ciddi bir bot için küçük bir VPS en güvenli seçenektir.

Topluluğun için özel bir bot mu istiyorsun? Oyun veritabanına bağlanan, moderasyon yapan veya etkinlik yöneten botlar yazıyorum — benimle iletişime geç.

Devamı için