+1

Hướng dẫn tạo Discord Chatbot hiện đại với ES6, Discord.js, Bun và tích hợp ChatGPT

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.

CleanShot 2024-12-01 at 16.14.34@2x.png

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:

  1. 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;
  1. 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;
  }
}

  1. src/commands/ping.js:
export const data = {
  name: 'ping',
  description: 'Replies with Pong!'
};

export async function execute(interaction) {
  await interaction.reply('Pong!');
}

  1. 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.');
  }
}
  1. 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!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí