Thứ tư, 22/07/2020 | 00:00 GMT+7

Cách xây dựng một Bot bất hòa với Node.js

Discord là ứng dụng trò chuyện cho phép hàng triệu user trên phạm vi global nhắn tin và trò chuyện thoại trực tuyến trong các cộng đồng được gọi là bang hội hoặc server . Discord cũng cung cấp một API mở rộng mà các nhà phát triển có thể sử dụng để xây dựng các bot Discord mạnh mẽ. Các bot có thể thực hiện các hành động khác nhau như gửi tin nhắn đến server , user DM-ing, kiểm duyệt server và phát âm thanh trong cuộc trò chuyện thoại. Điều này cho phép các nhà phát triển tạo ra các bot mạnh mẽ bao gồm các tính năng nâng cao, phức tạp như công cụ kiểm duyệt hoặc thậm chí là trò chơi. Ví dụ: bot tiện ích Dyno phục vụ hàng triệu bang hội và chứa các tính năng hữu ích như chống spam, trình phát nhạc và các chức năng tiện ích khác. Học cách tạo bot Discord cho phép bạn triển khai nhiều khả năng mà hàng nghìn người có thể tương tác mỗi ngày.

Trong hướng dẫn này, bạn sẽ xây dựng bot Discord từ đầu, sử dụng Node.js và thư viện Discord.js , cho phép user tương tác trực tiếp với API Discord. Bạn sẽ cài đặt profile cho bot Discord, nhận mã thông báo xác thực cho bot và lập trình cho bot khả năng xử lý lệnh, với các đối số, từ user .

Yêu cầu

Trước khi bắt đầu, bạn cần những thứ sau:

Bước 1 - Cài đặt bot Discord

Trong bước này, bạn sẽ sử dụng GUI dành cho nhà phát triển Discord để cài đặt bot Discord và lấy mã thông báo của bot mà bạn sẽ chuyển vào chương trình của bạn .

Để đăng ký bot trên nền tảng Discord, hãy sử dụng console ứng dụng Discord . Tại đây các nhà phát triển có thể tạo các ứng dụng Discord bao gồm cả bot Discord.

Hình ảnh console  ứng dụng Discord sau lần đầu tiên truy cập https://discord.com/developers/application

Để bắt đầu, hãy nhấp vào Ứng dụng mới . Discord sẽ yêu cầu bạn nhập tên cho ứng dụng mới của bạn . Sau đó bấm Create để tạo ứng dụng.

Hình ảnh  dấu nhắc  tạo ứng dụng, với "Test Node.js Bot" được nhập làm tên của ứng dụng

Lưu ý: Tên cho ứng dụng của bạn độc lập với tên của bot và bot không nhất thiết phải trùng tên với ứng dụng.

Bây giờ, hãy mở console ứng dụng của bạn. Để thêm bot vào ứng dụng, hãy chuyển đến tab Bot trên thanh chuyển bên trái.

Hình ảnh tab bot của console  ứng dụng

Nhấn vào nút Add Bot để thêm bot vào ứng dụng.Nhấp vào Yes, do it! khi nó nhắc bạn xác nhận. Sau đó, bạn sẽ ở trên một console chứa thông tin chi tiết về tên bot, mã thông báo xác thực và ảnh profile của bạn.

Trang tổng quan chứa thông tin chi tiết về bot của bạn

Bạn có thể sửa đổi tên bot hoặc ảnh profile của bạn tại đây trên trang tổng quan. Bạn cũng cần sao chép mã thông báo xác thực của bot bằng cách nhấp vào Click to Reveal Token và sao chép mã thông báo xuất hiện.

Cảnh báo: Không bao giờ chia sẻ hoặc tải lên mã thông báo bot của bạn vì nó cho phép bất kỳ ai đăng nhập vào bot của bạn.

Đến đây bạn cần tạo một lời mời cho phép bạn thêm các hội bot Discord để bạn có thể kiểm tra bot. Đầu tiên, chuyển đến tab OAuth2 của trang tổng quan ứng dụng. Để tạo lời mời, hãy cuộn xuống và chọn bot trong phạm vi . Bạn cũng phải đặt quyền để kiểm soát những hành động mà bot của bạn có thể thực hiện trong các bang hội. Theo mục đích của hướng dẫn này, hãy chọn Administrator , người này sẽ cấp cho bot của bạn quyền thực hiện gần như tất cả các hành động trong bang hội. Sao chép liên kết bằng nút Sao chép .

Tab OAuth2, với phạm vi được đặt thành "bot" và quyền được đặt thành " administrator "

Tiếp theo, thêm bot vào server . Theo liên kết mời bạn vừa tạo. Bạn có thể thêm bot vào bất kỳ server nào bạn sở hữu hoặc có quyền của administrator , từ menu thả xuống.

Trang theo liên kết mời, cho phép  user  thêm bot vào  server

Bây giờ hãy nhấp vào Tiếp tục . Đảm bảo bạn đã chọn hộp kiểm bên cạnh Administrator — điều này sẽ cấp quyền admin bot. Sau đó nhấp vào Ủy quyền . Discord sẽ yêu cầu bạn giải một CAPTCHA trước khi bot tham gia vào server . Đến đây bạn sẽ có bot Discord trong danh sách thành viên trong server mà bạn đã thêm bot vào khi offline .

Danh sách thành viên của  server  Discord với bot mới được tạo trong phần " offline " của danh sách thành viên

Bạn đã tạo thành công bot Discord và thêm nó vào server . Tiếp theo, bạn sẽ viết chương trình đăng nhập vào bot.

Bước 2 - Tạo dự án của bạn

Trong bước này, bạn sẽ cài đặt môi trường mã hóa cơ bản, nơi bạn sẽ xây dựng bot của bạn và đăng nhập vào bot theo chương trình.

Đầu tiên, bạn cần cài đặt một folder dự án và các file dự án cần thiết cho bot.

Tạo folder dự án của bạn:

  • mkdir discord-bot

Di chuyển vào folder dự án bạn vừa tạo:

  • cd discord-bot

Tiếp theo, sử dụng editor của bạn để tạo file có tên config.json để lưu trữ mã xác thực bot của bạn:

  • nano config.json

Sau đó, thêm mã sau vào file cấu hình, thay thế văn bản được đánh dấu bằng mã xác thực bot của bạn:

config.json
{     "BOT_TOKEN": "YOUR BOT TOKEN" } 

Lưu và thoát khỏi file .

Tiếp theo, bạn sẽ tạo một file package.json , file này sẽ lưu trữ thông tin chi tiết về dự án của bạn và thông tin về các phụ thuộc bạn sẽ sử dụng cho dự án. Bạn sẽ tạo file package.json bằng cách chạy lệnh npm sau:

  • npm init

npm sẽ hỏi bạn các chi tiết khác nhau về dự án của bạn. Nếu bạn muốn được hướng dẫn về cách hoàn thành các dấu nhắc này, bạn có thể đọc về chúng trong Cách sử dụng module Node.js với npm và package.json .

Đến đây bạn sẽ cài đặt gói discord.js mà bạn sẽ sử dụng để tương tác với Discord API. Bạn có thể cài đặt discord.js thông qua npm bằng lệnh sau:

  • npm install discord.js

Đến đây bạn đã cài đặt file cấu hình và cài đặt phần phụ thuộc cần thiết, bạn đã sẵn sàng để bắt đầu xây dựng bot của bạn . Trong một ứng dụng thực tế, một bot lớn sẽ được chia thành nhiều file , nhưng theo mục đích của hướng dẫn này, mã cho bot của bạn sẽ nằm trong một file .

Đầu tiên, hãy tạo một file có tên index.js trong folder discord-bot cho mã:

  • nano index.js

Bắt đầu mã hóa bot bằng cách yêu cầu phụ thuộc discord.js và file cấu hình với mã thông báo của bot:

index.js
const Discord = require("discord.js"); const config = require("./config.json"); 

Sau đây, thêm hai dòng mã tiếp theo:

index.js
... const client = new Discord.Client();  client.login(config.BOT_TOKEN); 

Lưu và thoát khỏi file của bạn.

Dòng mã đầu tiên tạo Discord.Client mới và gán nó cho client liên tục. Ứng dụng khách này một phần là cách bạn sẽ tương tác với API Discord và cách Discord sẽ thông báo cho bạn về các sự kiện như tin nhắn mới. Thực tế, client đại diện cho bot Discord.

Dòng mã thứ hai sử dụng phương thức login trên client để đăng nhập vào bot Discord mà bạn đã tạo, sử dụng mã thông báo trong file config.json làm password . Mã thông báo cho phép API Discord biết chương trình dành cho bot nào và bạn đã được xác thực để sử dụng bot.

Bây giờ, thực thi index.js bằng Node:

  • node index.js

Trạng thái bot của bạn sẽ chuyển sang trực tuyến trong server Discord mà bạn đã thêm nó vào.

Hình ảnh của bot trực tuyến

Bạn đã cài đặt thành công môi trường mã hóa và tạo mã cơ bản để đăng nhập vào bot Discord. Trong bước tiếp theo, bạn sẽ xử lý các lệnh của user và yêu cầu bot của bạn thực hiện các hành động, chẳng hạn như gửi tin nhắn.

Bước 3 - Xử lý lệnh user đầu tiên của bạn

Trong bước này, bạn sẽ tạo một bot có thể xử lý các lệnh của user . Bạn sẽ thực hiện lệnh ping đầu tiên của bạn , lệnh này sẽ phản hồi bằng "pong" và thời gian cần thiết để phản hồi lệnh.

Đầu tiên, bạn cần phát hiện và nhận bất kỳ tin nhắn nào mà user gửi để có thể xử lý bất kỳ lệnh nào. Sử dụng on phương pháp trên client bất hòa, bất hòa sẽ gửi cho bạn một thông báo về các sự kiện mới. Phương thức on nhận hai đối số: tên của một sự kiện để đợi và một hàm để chạy mỗi khi sự kiện đó xảy ra. Với phương pháp này, bạn có thể đợi message sự kiện — điều này sẽ xảy ra mỗi khi tin nhắn được gửi đến một bang hội nơi bot có quyền xem tin nhắn. Do đó, hãy tạo một hàm, chạy mỗi khi một tin nhắn được gửi đi, để xử lý các lệnh.

Đầu tiên hãy mở file của bạn:

  • nano index.js

Thêm mã sau vào file của bạn:

index.js
... const client = new Discord.Client();   client.on("message", function(message) {                                            });                                        client.login(config.BOT_TOKEN); 

Hàm này, chạy trên sự kiện message , nhận message làm tham số. message sẽ có giá trị của một bản tin Discord.js , chứa thông tin về tin nhắn đã gửi và các phương pháp giúp bot phản hồi.

Bây giờ, hãy thêm dòng mã sau vào chức năng xử lý lệnh của bạn:

index.js
... client.on("message", function(message) {   if (message.author.bot) return; }); ... 

Dòng này kiểm tra xem tác giả của tin nhắn có phải là bot hay không và nếu có, hãy ngừng xử lý lệnh. Điều này rất quan trọng vì nhìn chung bạn không muốn xử lý hoặc trả lời tin nhắn của bot. Các bot thường không cần hoặc không muốn sử dụng bot của ta , vì vậy việc bỏ qua các thông báo của chúng sẽ tiết kiệm năng lượng xử lý và giúp ngăn chặn các câu trả lời ngẫu nhiên.

Đến đây bạn sẽ viết một trình xử lý lệnh. Để thực hiện điều này, bạn nên hiểu định dạng thông thường của lệnh Discord. Thông thường, cấu trúc của lệnh Discord chứa ba phần theo thứ tự sau: tiền tố, tên lệnh và (đôi khi) đối số lệnh.

Hình ảnh đọc lệnh Discord điển hình "! Add 1 2"

  • Tiền tố: tiền tố có thể là bất kỳ thứ gì, nhưng thường là một đoạn dấu câu hoặc cụm từ trừu tượng thường không có ở đầu thư. Điều này nghĩa là khi bạn đưa tiền tố vào đầu thư, bot sẽ biết rằng mục đích của lệnh này là để bot xử lý nó.

  • Tên lệnh: Tên lệnh mà user muốn sử dụng. Điều này nghĩa là bot có thể hỗ trợ nhiều lệnh với các chức năng khác nhau và cho phép user lựa chọn giữa chúng bằng cách cung cấp một tên lệnh khác.

  • Đối số: Đôi khi nếu lệnh yêu cầu hoặc sử dụng thêm thông tin từ user , user có thể cung cấp các đối số sau tên lệnh, với mỗi đối số được phân tách bằng dấu cách.

Lưu ý: Không có cấu trúc lệnh bắt buộc và bot có thể xử lý các lệnh theo cách chúng muốn, nhưng cấu trúc được trình bày ở đây là một cấu trúc hiệu quả mà đại đa số bot sử dụng.

Để bắt đầu tạo một trình phân tích lệnh xử lý định dạng này, hãy thêm các dòng mã sau vào hàm xử lý thông báo:

index.js
... const prefix = "!";  client.on("message", function(message) {   if (message.author.bot) return;   if (!message.content.startsWith(prefix)) return; }); ... 

Bạn thêm dòng mã đầu tiên để gán giá trị "!" thành prefix không đổi, mà bạn sẽ sử dụng làm tiền tố của bot.

Dòng mã thứ hai mà bạn thêm vào sẽ kiểm tra xem nội dung của tin nhắn mà bot đang xử lý có bắt đầu bằng tiền tố bạn đã đặt hay không và nếu không, nó sẽ ngăn thông báo tiếp tục xử lý.

Đến đây bạn phải chuyển phần còn lại của thông báo thành tên lệnh và bất kỳ đối số nào có thể tồn tại trong thông báo. Thêm các dòng được đánh dấu sau:

index.js
... client.on("message", function(message) {   if (message.author.bot) return;   if (!message.content.startsWith(prefix)) return;    const commandBody = message.content.slice(prefix.length);   const args = commandBody.split(' ');   const command = args.shift().toLowerCase(); }); ... 

Bạn sử dụng dòng đầu tiên ở đây để xóa tiền tố khỏi nội dung thư và gán kết quả cho hằng commandBody . Điều này là cần thiết vì bạn không muốn đưa tiền tố vào tên lệnh đã phân tích cú pháp.

Dòng thứ hai nhận thông báo có tiền tố đã loại bỏ và sử dụng phương pháp split trên đó, với khoảng trắng làm dấu phân tách. Điều này chia nó thành một mảng các chuỗi con, thực hiện phân chia bất cứ nơi nào có khoảng trống. Điều này dẫn đến một mảng chứa tên lệnh, sau đó, nếu có trong thông báo, bất kỳ đối số nào. Bạn gán mảng này để hằng số args .

Dòng thứ ba xóa phần tử đầu tiên khỏi mảng args (sẽ là tên lệnh được cung cấp), chuyển nó thành chữ thường, sau đó gán nó cho command hằng. Điều này cho phép bạn tách biệt tên lệnh và chỉ để lại các đối số trong mảng. Bạn cũng sử dụng phương thức toLowerCase vì các lệnh thường không phân biệt chữ hoa chữ thường trong bot Discord.

Bạn đã hoàn thành việc xây dựng trình phân tích cú pháp lệnh, triển khai tiền tố bắt buộc và lấy tên lệnh cũng như bất kỳ đối số nào từ các thông báo. Đến đây bạn sẽ triển khai và tạo mã cho các lệnh cụ thể.

Thêm mã sau để bắt đầu triển khai lệnh ping :

index.js
...   const args = commandBody.split(' ');   const command = args.shift().toLowerCase();    if (command === "ping") {                               }                         }); ... 

Câu lệnh if này kiểm tra xem tên lệnh bạn đã phân tích cú pháp (được gán cho command hằng) có trùng với "ping" . Nếu có, điều đó cho biết user muốn sử dụng lệnh "ping" . Bạn sẽ tổ mã cho các lệnh cụ thể bên trong if khối tuyên bố. Bạn sẽ lặp lại mẫu này cho các lệnh khác mà bạn muốn thực hiện.

Bây giờ, bạn có thể triển khai mã cho lệnh "ping" :

index.js
...   if (command === "ping") {     const timeTaken = Date.now() - message.createdTimestamp;     message.reply(`Pong! This message had a latency of ${timeTaken}ms.`);   } ... 

Lưu và thoát khỏi file của bạn.

Bạn thêm khối lệnh "ping" để tính toán sự khác biệt giữa thời gian hiện tại — được tìm thấy bằng cách sử dụngphương thức now trên đối tượng Date — và dấu thời gian khi thư được tạo bằng mili giây. Điều này tính toán thời gian xử lý tin nhắn và "ping" của bot.

Dòng thứ hai phản hồi lệnh của user bằng cách sử dụng phương thức reply trên hằng số message . Phương thức reply ping (thông báo cho user và đánh dấu thông báo cho user được chỉ định) user đã gọi lệnh, theo sau là nội dung được cung cấp làm đối số đầu tiên cho phương thức. Bạn cung cấp một ký tự mẫu chứa một thông báo và ping được tính toán làm phản hồi mà phương thức reply sẽ sử dụng.

Điều này kết thúc việc thực hiện lệnh "ping" .

Chạy bot của bạn bằng lệnh sau (trong cùng folder với index.js ):

  • node index.js

Đến đây bạn có thể sử dụng lệnh "!ping" trong bất kỳ kênh nào mà bot có thể xem và nhắn tin, dẫn đến phản hồi.

Hình ảnh bot trả lời trong Discord tới "! Ping" với "@ T0M, Pong! Tin nhắn này có độ trễ là 1128ms".

Bạn đã tạo thành công một bot có thể xử lý các lệnh của user và bạn đã thực hiện lệnh đầu tiên của bạn . Trong bước tiếp theo, bạn sẽ tiếp tục phát triển bot của bạn bằng cách triển khai lệnh sum.

Bước 4 - Thực hiện lệnh Sum

Đến đây bạn sẽ mở rộng chương trình của bạn bằng cách chạy lệnh "!sum" . Lệnh sẽ lấy bất kỳ số lượng đối số nào và cộng chúng lại với nhau, trước khi trả về tổng của tất cả các đối số cho user .

Nếu bot Discord của bạn vẫn đang chạy, bạn có thể dừng quá trình của nó bằng CTRL + C

Mở lại index.js của bạn:

  • nano index.js

Để bắt đầu thực hiện lệnh "!sum" bạn sẽ sử dụng một khối else-if . Sau khi kiểm tra tên lệnh ping, nó sẽ kiểm tra xem tên lệnh có bằng "sum" . Ta sử dụng một khối else-if vì chỉ có một lệnh sẽ xử lý tại một thời điểm, vì vậy nếu chương trình trùng với tên lệnh "ping" , thì nó không phải kiểm tra lệnh "sum" . Thêm các dòng được đánh dấu sau vào file của bạn:

index.js
...   if (command === "ping") {     const timeTaken = Date.now() - message.createdTimestamp;     message.reply(`Ping! This message had a latency of ${timeTaken}ms.`);   }    else if (command === "sum") {                                   }                             }); ... 

Bạn có thể bắt đầu triển khai mã cho lệnh "sum" . Mã cho lệnh "sum" sẽ đi vào bên trong khối else-if mà bạn vừa tạo. Bây giờ, hãy thêm mã sau:

index.js
...   else if (command === "sum") {     const numArgs = args.map(x => parseFloat(x));     const sum = numArgs.reduce((counter, x) => counter += x);     message.reply(`The sum of all the arguments you provided is ${sum}!`);   } ... 

Bạn sử dụng phương pháp map trên danh sách đối số để tạo một danh sách mới bằng cách sử dụng hàm parseFloat trên mỗi mục trong mảng args . Điều này tạo ra một mảng mới (được gán cho hằng số numArgs ) trong đó tất cả các mục là số thay vì chuỗi. Điều này nghĩa là sau này bạn có thể tìm thành công tổng các số bằng cách cộng chúng lại với nhau.

Dòng thứ hai sử dụng reduce phương pháp trên liên tục numArgs cung cấp một chức năng mà tổng số tất cả các yếu tố trong danh sách. Bạn gán tổng của tất cả các phần tử trong numArgs thành sum không đổi.

Sau đó, bạn sử dụng phương thức reply trên đối tượng tin nhắn để trả lời lệnh của user bằng một mẫu chữ , chứa tổng của tất cả các đối số mà user gửi tới bot.

Điều này kết thúc việc thực hiện lệnh "sum" . Bây giờ hãy chạy bot bằng lệnh sau (trong cùng folder với index.js ):

  • node index.js

Như vậy, bạn có thể sử dụng lệnh "!sum" trong bất kỳ kênh nào mà bot có thể xem và nhắn tin.

Hình ảnh bot trả lời "Tổng tất cả các đối số bạn cung cấp là 6!" thành "! sum 1 2 3", sau đó trả lời "Tổng của tất cả các đối số bạn đã cung cấp là 13! to"! sum 1,5 1,5 10 "

Sau đây là version hoàn chỉnh của tập lệnh bot index.js :

index.js
const Discord = require("discord.js"); const config = require("./config.json");  const client = new Discord.Client();  const prefix = "!";  client.on("message", function(message) {   if (message.author.bot) return;   if (!message.content.startsWith(prefix)) return;    const commandBody = message.content.slice(prefix.length);   const args = commandBody.split(' ');   const command = args.shift().toLowerCase();    if (command === "ping") {     const timeTaken = Date.now() - message.createdTimestamp;     message.reply(`Pong! This message had a latency of ${timeTaken}ms.`);   }    else if (command === "sum") {     const numArgs = args.map(x => parseFloat(x));     const sum = numArgs.reduce((counter, x) => counter += x);     message.reply(`The sum of all the arguments you provided is ${sum}!`);   } });  client.login(config.BOT_TOKEN); 

Trong bước này, bạn đã phát triển thêm bot Discord của bạn bằng cách triển khai lệnh sum .

Kết luận

Bạn đã triển khai thành công bot Discord có thể xử lý nhiều lệnh user và đối số lệnh khác nhau. Nếu bạn muốn mở rộng bot của bạn , bạn có thể triển khai nhiều lệnh hơn hoặc thử nhiều phần hơn của API Discord để tạo ra một bot Discord mạnh mẽ. Bạn có thể xem lại tài liệu Discord.js hoặc tài liệu API Discord để mở rộng kiến thức của bạn về API Discord.

Trong khi tạo bot Discord, bạn phải luôn ghi nhớ điều khoản dịch vụ của Discord API , điều này nêu rõ cách các nhà phát triển phải sử dụng Discord API. Bạn cũng có thể đọc bộ hướng dẫn này về cách triển khai tốt nhất bot Discord và cung cấp các mẹo về cách thiết kế bot Discord. Nếu bạn muốn tìm hiểu thêm về Node.js, hãy xem loạt bài Cách viết mã trong Node.js của ta .


Tags:

Các tin liên quan