Xây dựng Discord Bot từ A-Z với Node.js

Sau gần 2 năm phát triển Ma Đạo Bot phục vụ cộng đồng 3000+ thành viên, mình quyết định viết bài này để chia sẻ toàn bộ kinh nghiệm từ zero đến hero. Nếu bạn đang muốn tạo bot riêng cho server Discord của mình, bài viết này dành cho bạn!

🎯 Tại sao nên học làm Discord Bot?

Hồi đầu năm 2023, mình chỉ là một sinh viên IT bình thường, biết chút ít JavaScript nhưng chưa làm dự án thực tế nào. Khi quyết định tạo Ma Đạo Community, mình nhận ra cần một bot để:

  • Tự động hóa - Welcome members mới, auto-role, moderation
  • Tăng engagement - Mini game, economy system, leveling
  • Quản lý hiệu quả - Ticket system, logging, analytics
  • Giải trí - Music bot, meme commands, fun features

Và quan trọng nhất: học được một skill thực tế siêu hữu ích! 💪

⚙️ Setup môi trường (15 phút)

Bước 1: Cài đặt Node.js

Download Node.js từ nodejs.org (khuyên dùng bản LTS). Kiểm tra cài đặt thành công:

node --version
npm --version

Bước 2: Tạo Discord Application

Vào Discord Developer Portal:

  1. Click "New Application", đặt tên bot (ví dụ: "Ma Đạo Bot")
  2. Vào tab Bot → "Add Bot" → "Yes, do it!"
  3. Copy Token (giữ bí mật, đừng share lên GitHub!)
  4. Bật Privileged Gateway Intents: Presence, Server Members, Message Content

Lưu ý: Token giống như mật khẩu của bot. Nếu bị lộ, hacker có thể kiểm soát bot của bạn. Luôn dùng file .env và thêm vào .gitignore!

Bước 3: Khởi tạo project

mkdir my-discord-bot
cd my-discord-bot
npm init -y
npm install discord.js dotenv

Tạo file .env để lưu token:

TOKEN=your_bot_token_here
CLIENT_ID=your_client_id

🚀 Code bot đầu tiên (30 phút)

Tạo file index.js:

require('dotenv').config();
const { Client, GatewayIntentBits, Events } = require('discord.js');

// Tạo client instance
const client = new Client({ 
    intents: [
        GatewayIntentBits.Guilds,
        GatewayIntentBits.GuildMessages,
        GatewayIntentBits.MessageContent,
        GatewayIntentBits.GuildMembers
    ] 
});

// Event: Bot ready
client.once(Events.ClientReady, c => {
    console.log(`✅ Bot online! Đăng nhập với tên ${c.user.tag}`);
    client.user.setActivity('Ma Đạo Community', { type: 'WATCHING' });
});

// Event: Nhận message
client.on(Events.MessageCreate, async message => {
    // Ignore bot messages
    if (message.author.bot) return;
    
    // Command: !hello
    if (message.content === '!hello') {
        message.reply(`Xin chào ${message.author.username}! 👋`);
    }
    
    // Command: !server
    if (message.content === '!server') {
        message.reply(`Server: ${message.guild.name}\\nThành viên: ${message.guild.memberCount}`);
    }
});

// Login bot
client.login(process.env.TOKEN);

Chạy bot:

node index.js

Nếu thấy "Bot online!", chúc mừng bạn đã tạo bot thành công! 🎉

🎮 Case Study: Ma Đạo Ticket System

Một trong những dự án mình tự hào nhất là Ma Đạo Ticket Bot - hệ thống quản lý ticket cho Ma Đạo Store. Bạn có thể xem source code tại GitHub của mình! 🔗

💡 Ý tưởng ra đời

Hồi đó Ma Đạo Store bán các item in-game, nhận support từ customers qua DM loạn xà ngầu. Mình và chez1s quyết định làm một hệ thống ticket chuyên nghiệp như các trang web lớn! 🎯

Tính năng chính:

  • Hiển thị embed với các nút bấm tạo ticket
  • Người dùng chọn loại ticket (Mua hàng / Hỗ trợ - Bảo hành)
  • Sau khi nhập lý do → bot tạo kênh riêng tư
  • Nhân viên khóa/mở khóa/đóng ticket
  • Ticket đã đóng chuyển vào mục lưu trữ

🔧 Tech Stack

  • Node.js - Runtime environment
  • discord.js v14 - Discord API wrapper
  • Nodemon - Auto reload khi code thay đổi (dev)

📂 Cấu trúc project

MaDao-Ticket-NodeJS/
├── handlers/          # Xử lý commands & events
├── config.js          # Token, role ID, category ID
├── index.js           # Main file
└── package.json

⚙️ Setup & Config

File config.js của mình:

module.exports = {
    token: "YOUR_BOT_TOKEN",           // Token từ Discord Dev Portal
    roleSupport: "ROLE_ID_HERE",       // Role của nhân viên support
    ticketCategory: "CATEGORY_ID_HERE" // Category chứa các ticket channels
};

🎨 Ticket Embed Design

Mình design embed cho đẹp và chuyên nghiệp:

// Embed giới thiệu ticket system
const ticketEmbed = {
    color: 0x5865F2,
    title: '🎫 Hệ Thống Ticket - Ma Đạo Store',
    description: 'Chọn loại ticket phù hợp để được hỗ trợ nhanh nhất!',
    fields: [
        {
            name: '🛒 Mua Hàng',
            value: 'Mua item, package, hoặc sản phẩm từ store',
            inline: true
        },
        {
            name: '🔧 Hỗ Trợ - Bảo Hành',
            value: 'Báo lỗi, khiếu nại, hoặc yêu cầu bảo hành',
            inline: true
        }
    ],
    footer: { text: 'Click nút bên dưới để tạo ticket' },
    timestamp: new Date()
};

2. Economy System đơn giản

Tạo hệ thống coin để members tương tác nhiều hơn:

const coins = new Map(); // Trong thực tế dùng database

client.on(Events.MessageCreate, message => {
    if (message.author.bot) return;
    
    // Cộng coin mỗi message (giới hạn 1 lần/phút)
    const userId = message.author.id;
    const userData = coins.get(userId) || { coins: 0, lastMsg: 0 };
    
    if (Date.now() - userData.lastMsg > 60000) {
        userData.coins += 10;
        userData.lastMsg = Date.now();
        coins.set(userId, userData);
    }
    
    // Command: !balance
    if (message.content === '!balance') {
        const data = coins.get(userId) || { coins: 0 };
        message.reply(`💰 Bạn có **${data.coins}** coins!`);
    }
});

💾 Database: MongoDB hay SQL?

Sau khi Ma Đạo Community có 1000+ members, mình phải chuyển từ lưu data tạm trong Map sang database thật sự. Dựa trên kinh nghiệm:

MongoDB (mình đang dùng)

Ưu điểm:

  • Setup nhanh, code đơn giản
  • Flexible schema, dễ thay đổi structure
  • Mongoose library rất mạnh
  • Free tier MongoDB Atlas (512MB)

Nhược điểm:

  • Không phù hợp với quan hệ phức tạp
  • Dễ bị duplicate data

SQL (PostgreSQL/MySQL)

Ưu điểm:

  • Chuẩn hóa data tốt
  • Xử lý quan hệ giữa bảng mạnh
  • Transaction an toàn

Nhược điểm:

  • Code phức tạp hơn
  • Khó modify schema sau này

Kết luận: Với Discord Bot quy mô nhỏ/vừa (<5000 users), mình recommend MongoDB. Nếu làm bot lớn với nhiều tính năng phức tạp, thì SQL.

🚀 Deploy bot lên Cloud

Bot chỉ chạy khi máy tính bạn bật. Để bot online 24/7, cần host lên cloud:

Option 1: Heroku (Đơn giản nhất - Free tier bị khai tử rồi 😢)

Option 2: Railway.app (Mình đang dùng)

  1. Push code lên GitHub
  2. Tạo account Railway
  3. Deploy from GitHub repo
  4. Add environment variables (TOKEN, DATABASE_URL)
  5. Done! Free $5/month credit

Option 3: VPS (Linode, DigitalOcean)

Mạnh mẽ nhất nhưng cần kiến thức Linux. Giá ~$5/tháng.

📚 Những gì mình học được

Sau 2 năm develop Ma Đạo Bot, mình đã:

  • ✅ Thành thạo Node.jsasync/await
  • ✅ Hiểu về WebSocket và real-time communication
  • ✅ Làm việc với MongoDB và schema design
  • ✅ Deploy và maintain production application
  • ✅ Debug và optimize performance cho 3000+ concurrent users
  • ✅ Viết clean code với command handler pattern

Quan trọng hơn: Mình có một dự án thực tế để show trong CV và portfolio! 🎯

🎓 Tips từ kinh nghiệm thực tế

Bắt đầu nhỏ

Đừng làm quá nhiều features ngay từ đầu. Mình bắt đầu chỉ với welcome message và prefix commands, rồi mới thêm dần.

Tổ chức code tốt

Dùng command handler từ đầu. Tách commands ra từng file riêng, không nhét hết vào index.js.

Đọc docs

Discord.js guide và documentation cực kỳ chi tiết. Mọi thứ bạn cần đều có trong đó.

Join community

Discord.js official server có hơn 600K members, rất helpful khi gặp bug.

🔗 Resources hữu ích

💬 Kết luận

Làm Discord Bot là một trong những project tốt nhất mình làm lúc là sinh viên. Nó vừa practical (phục vụ cộng đồng thật), vừa học được nhiều thứ, lại còn fun nữa!

Nếu bạn đang học IT và chưa biết làm dự án gì, mình khuyên là làm thử Discord Bot. Start small, learn by doing, và đừng ngại hỏi community khi gặp khó khăn.

Good luck và happy coding! 🚀

— Luân, founder of Ma Đạo Community

Chia sẻ bài viết: