Hướng dẫn này sẽ giúp bạn tạo một chatbot Discord hiện đại sử dụng ES6, Discord.js, Bun và tích hợp khả năng của ChatGPT.
Hãy bắt đầu bằng việc thiết lập cấu trúc dự án:
project-root/
├── src/
│ ├── commands/
│ │ ├── ping.js
│ │ └── ask.js
│ ├── utils/
│ │ └── openai.js
│ ├── config.js
│ └── index.js
├── package.json
├── docker-compose.yaml
└── Dockerfile
Đầu tiên, tạo một ứng dụng Discord mới tại Discord Developer Portal. Thiết lập bot của bạn và kích hoạt các intent cần thiết.
Bây giờ, hãy triển khai bot của chúng ta sử dụng ES6 modules. Đây là nội dung cho từng file:
src/config.js
:
export const DISCORD_BOT_TOKEN = process.env.DISCORD_BOT_TOKEN;
export const CLIENT_ID = process.env.CLIENT_ID;
export const OPENAI_API_KEY = process.env.OPENAI_API_KEY;
src/utils/openai.js
:
import { Configuration, OpenAI }from "openai";
import { OPENAI_API_KEY }from '../config.js'; const configuration = new Configuration({ apiKey: OPENAI_API_KEY,
}); export const openai =new OpenAI(configuration); export async function askChatGPT(question) { try { const response =await openai.createCompletion({ model: "text-davinci-002", prompt: question, max_tokens: 150 }); return response.data.choices[0].text.trim(); } catch (error) { console.error('Error asking ChatGPT:', error);
throw error; }
}
src/commands/ping.js
:
export const data = { name: 'ping', description: 'Replies with Pong!'
}; export async function execute(interaction) { await interaction.reply('Pong!');
}
src/commands/ask.js
:
import { askChatGPT }from '../utils/openai.js'; export const data = { name: 'ask', description: 'Ask ChatGPT a question', options: [{ name: 'question', type: 3, description: 'Your question', required: true }]
}; export async function execute(interaction) { const question = interaction.options.getString('question'); await interaction.deferReply(); try { const answer = await askChatGPT(question); await interaction.editReply(`Q: ${question}\nA: ${answer}`); } catch (error) { console.error(error); await interaction.editReply('Sorry, there was an error processing your request.'); }
}
src/index.js
:
import { Client, GatewayIntentBits, REST, Routes } from 'discord.js';
import { DISCORD_BOT_TOKEN, CLIENT_ID } from './config.js';
import * as pingCommand from './commands/ping.js';
import * as askCommand from './commands/ask.js'; const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.MessageContent ],
}); const commands = [ pingCommand.data, askCommand.data
]; const rest = new REST({ version: '10' }).setToken(DISCORD_BOT_TOKEN); async function main() { try { console.log('Started refreshing application (/) commands.'); await rest.put(Routes.applicationCommands(CLIENT_ID), { body: commands }); console.log('Successfully reloaded application (/) commands.'); client.on('ready', () => { console.log(`Logged in as ${client.user.tag}!`); }); client.on('interactionCreate',async interaction => { if (!interaction.isChatInputCommand())return; if (interaction.commandName === 'ping') { await pingCommand.execute(interaction); } else if (interaction.commandName === 'ask') { await askCommand.execute(interaction); } }); await client.login(DISCORD_BOT_TOKEN); }catch (error) { console.error(error); }
} main();
Cập nhật package.json
và sửa “type” thành “module”:
{ **"type": "module",** "dependencies": { "discord.js": "^14.0.0", "openai": "^3.0.0" }
}
Tiếp theo hãy tạo file **docker-compose.yaml
**với nội dung sau:
version: '3'
services: bot: build: . environment: - DISCORD_BOT_TOKEN=<YOUR_BOT_TOKEN> - CLIENT_ID=<YOUR_CLIENT_ID> - OPENAI_API_KEY=<YOUR_OPENAI_API_KEY>
Và cuối cùng là Dockerfile
:
FROM node:latest WORKDIR /app COPY package.json . RUN npm install COPY . . CMD ["node", "src/index.js"]
Khởi động bằng docker compose up
, sau đó thêm chatbot của bạn vào Discord server, và sử dụng lệnh /ask
hoặc /ping
để tương tác với chatbot.
Cấu trúc hiện đại này sử dụng ES6 modules và tách biệt các chức năng thành các file riêng biệt, giúp codebase dễ bảo trì và mở rộng hơn. Bot giờ đây hỗ trợ các lệnh slash cho cả chức năng ping và ask, với chức năng sau tích hợp ChatGPT để cung cấp câu trả lời thông minh.
Nhớ thay thế các giá trị placeholder trong file docker-compose.yaml
bằng token Discord bot, client ID và OpenAI API key thực tế của bạn.
Với cấu trúc này, bạn có thể dễ dàng thêm nhiều lệnh hơn bằng cách tạo các file mới trong thư mục commands
và import chúng trong file index.js
.
Nếu bạn muốn tiết kiệm thời gian và bắt đầu với một nền tảng vững chắc, bạn có thể tham khảo repository boilerplate này: https://github.com/mrgoonie/bun-discord-bot. Nó cung cấp một điểm khởi đầu tuyệt vời để xây dựng Discord bot với Bun.
Tôi cũng đã dùng nó để xây dựng lên DigiCord AI với hơn 8K người dùng.
Chúc bạn code vui vẻ và thú vị khi xây dựng Discord bot của mình!