مقدمه
Discord یک پلتفرم ارتباطی محبوب است که میلیونها کاربر در سراسر جهان از آن برای ارسال پیام متنی، برقراری تماس صوتی و تعامل در انجمنهایی با نام Guild یا Server استفاده میکنند.
علاوه بر امکانات ارتباطی، Discord یک API قدرتمند نیز در اختیار توسعهدهندگان قرار میدهد که با استفاده از آن میتوان رباتهای (Bot) پیشرفتهای ساخت. این رباتها قادرند وظایف مختلفی را انجام دهند، از جمله:
- ارسال پیام در کانالها
- ارسال پیام خصوصی (DM) به کاربران
- مدیریت و نظارت بر سرورها
- پخش موسیقی در کانالهای صوتی
- اجرای دستورات سفارشی
- ساخت بازیها و ابزارهای مدیریتی
برای مثال، ربات مشهور Dyno که در میلیونها سرور Discord استفاده میشود، امکاناتی مانند جلوگیری از اسپم، پخش موسیقی، مدیریت کاربران و دهها قابلیت دیگر را ارائه میدهد.
یادگیری نحوه ساخت ربات Discord این امکان را به شما میدهد که ابزارهایی طراحی کنید که روزانه هزاران نفر بتوانند با آنها تعامل داشته باشند.
در این آموزش، یک ربات Discord را از ابتدا و با استفاده از Node.js و کتابخانه Discord.js ایجاد خواهیم کرد. در پایان این آموزش، ربات شما قادر خواهد بود:
- به Discord متصل شود.
- دستورات کاربران را دریافت کند.
- آرگومانهای ارسالشده توسط کاربران را پردازش کند.
- به درخواستهای مختلف پاسخ دهد.
پیشنیازها
قبل از شروع، موارد زیر باید روی سیستم شما آماده باشد:
- نصب بودن Node.js روی سیستم توسعه (Windows، Linux یا macOS)
- یک ویرایشگر کد مانند:
- Visual Studio Code
- Sublime Text
- Atom
- Nano
- یک حساب کاربری رایگان در Discord با ایمیل تأییدشده
- یک سرور (Server) در Discord برای آزمایش ربات
مرحله اول — ایجاد یک ربات در Discord
در این مرحله، از پنل توسعهدهندگان Discord برای ایجاد ربات و دریافت Bot Token استفاده میکنیم.
این توکن مانند رمز عبور ربات عمل میکند و برنامه Node.js با استفاده از آن به Discord متصل خواهد شد.
ورود به پنل توسعهدهندگان
ابتدا وارد صفحه Discord Developer Portal شوید.
سپس روی گزینه New Application کلیک کنید.
Discord از شما نام برنامه را درخواست میکند.
برای مثال میتوانید نامی مانند زیر انتخاب کنید:
Test Node.js Bot
پس از وارد کردن نام، روی Create کلیک کنید.
نکته:
نام Application لزوماً همان نام Bot نیست و بعداً میتوانید نام ربات را به دلخواه تغییر دهید.
ایجاد Bot
پس از ساخت برنامه، از منوی سمت چپ وارد بخش Bot شوید.
سپس روی دکمه Add Bot کلیک کنید.
در پنجره تأیید، گزینه Yes, do it! را انتخاب کنید.
اکنون ربات شما ایجاد شده است و صفحهای شامل اطلاعات زیر نمایش داده میشود:
- نام ربات
- تصویر پروفایل
- Token احراز هویت
دریافت Bot Token
در همین صفحه روی گزینه Click to Reveal Token کلیک کنید.
سپس توکن نمایش دادهشده را کپی کنید.
در مراحل بعدی از این توکن داخل برنامه Node.js استفاده خواهیم کرد.
⚠️ هشدار امنیتی
Bot Token دقیقاً مانند رمز عبور ربات شماست.
هرگز آن را در GitHub، مخازن عمومی یا فایلهای قابل دسترس منتشر نکنید.
در صورت افشای Token، هر شخصی میتواند کنترل کامل ربات شما را در اختیار بگیرد.
ایجاد لینک دعوت ربات
اکنون باید لینکی ایجاد کنیم تا ربات به سرور Discord اضافه شود.
از منوی سمت چپ وارد بخش:
OAuth2
و سپس:
URL Generator
شوید.
در قسمت Scopes گزینه:
bot
را انتخاب کنید.
سپس در قسمت Bot Permissions مجوز زیر را فعال کنید:
Administrator
این مجوز باعث میشود ربات تقریباً تمام دسترسیهای مدیریتی موردنیاز را در سرور داشته باشد.
پس از انتخاب مجوزها، لینکی در پایین صفحه تولید میشود.
آن را با استفاده از دکمه Copy کپی کنید.
اضافه کردن ربات به سرور
لینک تولیدشده را در مرورگر باز کنید.
در صفحه بازشده، سروری را که مالک آن هستید (یا دسترسی Administrator دارید) انتخاب کنید.
سپس مراحل زیر را انجام دهید:
- روی Continue کلیک کنید.
- مجوز Administrator را تأیید کنید.
- روی Authorize کلیک کنید.
- آزمون CAPTCHA را تکمیل کنید.
پس از پایان این مراحل، ربات به سرور شما اضافه میشود.
اگر به لیست اعضای سرور نگاه کنید، ربات را در بخش Offline مشاهده خواهید کرد.
در این مرحله:
- یک Application در Discord ایجاد کردید.
- یک Bot ساختید.
- Token اختصاصی ربات را دریافت کردید.
- ربات را به سرور Discord اضافه کردید.
مرحله دوم — ایجاد پروژه Node.js
در این مرحله محیط توسعه را آماده میکنیم، فایلهای پروژه را میسازیم و ربات را برای اولین بار به Discord متصل خواهیم کرد.
ایجاد پوشه پروژه
ابتدا یک پوشه جدید برای پروژه ایجاد کنید:
mkdir discord-bot
سپس وارد آن شوید:
cd discord-bot
ایجاد فایل تنظیمات
برای نگهداری توکن ربات، یک فایل با نام config.json ایجاد کنید:
nano config.json
محتوای فایل را به شکل زیر قرار دهید و بهجای مقدار YOUR BOT TOKEN توکن ربات خود را وارد کنید.
{
"BOT_TOKEN": "YOUR BOT TOKEN"
}
فایل را ذخیره کرده و خارج شوید.
نکته امنیتی:
فایلconfig.jsonرا در مخزن GitHub عمومی قرار ندهید. این فایل حاوی اطلاعات حساس ربات شما است.
ایجاد فایل package.json
اکنون باید فایل package.json را ایجاد کنیم. این فایل اطلاعات پروژه و وابستگیهای موردنیاز را نگهداری میکند.
دستور زیر را اجرا کنید:
npm init
سپس npm چند سؤال درباره پروژه از شما خواهد پرسید. در صورت تمایل میتوانید مقادیر پیشفرض را با فشردن Enter انتخاب کنید.
نصب کتابخانه Discord.js
برای ارتباط با API دیسکورد از کتابخانه Discord.js استفاده خواهیم کرد.
آن را با دستور زیر نصب کنید:
npm install discord.js
پس از پایان نصب، پوشه node_modules و فایل package-lock.json نیز ایجاد خواهند شد.
ایجاد فایل اصلی پروژه
اکنون فایل اصلی برنامه را ایجاد کنید:
nano index.js
در ابتدای فایل، کتابخانه Discord.js و فایل تنظیمات را فراخوانی کنید:
const Discord = require("discord.js");
const config = require("./config.json");
سپس کد زیر را اضافه کنید:
const client = new Discord.Client({
intents: ["GUILDS", "GUILD_MESSAGES"]
});
client.login(config.BOT_TOKEN);
در نهایت فایل را ذخیره کنید.
بررسی کد
در این قسمت دو خط مهم وجود دارد.
ایجاد Client
const client = new Discord.Client({
intents: ["GUILDS", "GUILD_MESSAGES"]
});
این خط یک شیء جدید از نوع Discord.Client ایجاد میکند.
این شیء در واقع نماینده ربات شماست و تمام ارتباطات میان برنامه و Discord از طریق آن انجام میشود.
پارامتر intents نیز مشخص میکند ربات به چه رویدادهایی گوش دهد.
در این آموزش دو مجوز فعال شدهاند:
GUILDSGUILD_MESSAGES
این دو Intent باعث میشوند ربات بتواند:
- اطلاعات سرورها را دریافت کند.
- پیامهای ارسالشده در کانالها را مشاهده کند.
ورود به Discord
کد زیر:
client.login(config.BOT_TOKEN);
با استفاده از توکن ذخیرهشده در فایل config.json ربات را وارد Discord میکند.
توکن در واقع نقش رمز عبور ربات را دارد و Discord از طریق آن تشخیص میدهد که برنامه شما متعلق به کدام Bot است.
اجرای ربات
اکنون برنامه را اجرا کنید:
node index.js
اگر همه مراحل را بهدرستی انجام داده باشید، وضعیت ربات در سرور Discord از Offline به Online تغییر خواهد کرد.
این یعنی ارتباط میان برنامه Node.js و Discord با موفقیت برقرار شده است.
در پایان این مرحله:
- پروژه Node.js را ایجاد کردید.
- فایلهای موردنیاز را ساختید.
- کتابخانه Discord.js را نصب کردید.
- ربات را برای اولین بار به Discord متصل کردید.
مرحله سوم — پردازش اولین دستور کاربر
در این مرحله، ربات را طوری برنامهنویسی میکنیم که بتواند پیامهای کاربران را دریافت کرده و اولین دستور خود یعنی !ping را اجرا کند.
در پایان این بخش، هر زمان کاربری دستور !ping را ارسال کند، ربات با پیام Pong! به همراه مدت زمان پاسخدهی خود پاسخ خواهد داد.
دریافت پیامهای کاربران
ابتدا فایل index.js را باز کنید:
nano index.js
سپس کد زیر را بعد از ایجاد شیء client اضافه کنید:
const client = new Discord.Client({
intents: ["GUILDS", "GUILD_MESSAGES"]
});
client.on("messageCreate", function(message) {
});
client.login(config.BOT_TOKEN);
این کد چه کاری انجام میدهد؟
متد on() برای گوش دادن به رویدادهای Discord استفاده میشود.
در اینجا به رویداد:
messageCreate
گوش میدهیم.
هر زمان پیامی در یکی از سرورهایی که ربات به آن دسترسی دارد ارسال شود، تابع داخل messageCreate اجرا خواهد شد.
پارامتر message نیز تمام اطلاعات مربوط به پیام ارسالشده را در اختیار شما قرار میدهد؛ از جمله:
- متن پیام
- نویسنده پیام
- کانال ارسال
- زمان ارسال
- و دهها ویژگی دیگر
جلوگیری از پردازش پیام سایر رباتها
در ابتدای تابع، کد زیر را اضافه کنید:
client.on("messageCreate", function(message) {
if (message.author.bot) return;
});
چرا این کار ضروری است؟
در Discord ممکن است چندین ربات در یک سرور حضور داشته باشند.
اگر ربات شما به پیام سایر رباتها پاسخ دهد، احتمال ایجاد حلقههای بینهایت وجود دارد؛ برای مثال:
- Bot A به Bot B پاسخ دهد.
- Bot B دوباره پاسخ Bot A را بدهد.
- این روند تا بینهایت ادامه پیدا کند.
بنابراین اولین کاری که انجام میدهیم این است که پیامهای ارسالی توسط رباتها را نادیده بگیریم.
ساختار دستورات در Discord
اکثر رباتهای Discord از ساختاری مشابه استفاده میکنند.
یک دستور معمولاً از سه بخش تشکیل شده است:
!add 10 20
که شامل موارد زیر است:
Prefix
قسمتی که ابتدای دستور قرار میگیرد.
در این آموزش از علامت:
!
استفاده میکنیم.
وجود Prefix باعث میشود ربات تشخیص دهد که این پیام یک دستور است.
Command
بعد از Prefix، نام دستور قرار میگیرد.
مثلاً:
ping
یا
sum
Arguments
در صورت نیاز، کاربر میتواند بعد از نام دستور، آرگومانهای موردنیاز را وارد کند.
برای مثال:
!sum 5 10 15
در این مثال:
- دستور برابر است با:
sum
و آرگومانها عبارتاند از:
5
10
15
تعیین Prefix
قبل از رویداد messageCreate کد زیر را اضافه کنید:
const prefix = "!";
سپس شرط زیر را داخل تابع قرار دهید:
client.on("messageCreate", 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();
در نهایت کد شما به شکل زیر خواهد بود:
client.on("messageCreate", 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();
});
بررسی عملکرد این بخش
حذف Prefix
کد زیر:
const commandBody = message.content.slice(prefix.length);
علامت ! را از ابتدای پیام حذف میکند.
برای مثال:
!ping
تبدیل میشود به:
ping
تبدیل متن به آرایه
کد زیر:
const args = commandBody.split(" ");
رشته را بر اساس فاصله جدا میکند.
برای مثال:
sum 5 10 20
به آرایه زیر تبدیل میشود:
["sum", "5", "10", "20"]
استخراج نام دستور
سپس:
const command = args.shift().toLowerCase();
اولین عضو آرایه را جدا کرده و به حروف کوچک تبدیل میکند.
در نتیجه:
command = "sum"
و مقدار args برابر خواهد بود با:
["5", "10", "20"]
ایجاد دستور Ping
اکنون اولین دستور را پیادهسازی میکنیم.
کد زیر را اضافه کنید:
if (command === "ping") {
}
سپس داخل آن بنویسید:
if (command === "ping") {
const timeTaken =
Date.now() - message.createdTimestamp;
message.reply(
`Pong! This message had a latency of ${timeTaken}ms.`
);
}
این کد چگونه کار میکند؟
ابتدا مدت زمان بین ارسال پیام کاربر و زمان فعلی محاسبه میشود:
const timeTaken =
Date.now() - message.createdTimestamp;
سپس ربات با استفاده از:
message.reply()
به همان کاربر پاسخ میدهد.
خروجی چیزی شبیه زیر خواهد بود:
Pong!
This message had a latency of 112 ms.
اجرای برنامه
اکنون برنامه را اجرا کنید:
node index.js
سپس در یکی از کانالهای سرور Discord بنویسید:
!ping
اگر همه چیز درست باشد، ربات پاسخ مشابه زیر ارسال خواهد کرد:
Pong!
This message had a latency of 95ms.
در پایان این مرحله، ربات شما میتواند:
- پیامهای کاربران را دریافت کند.
- پیام رباتها را نادیده بگیرد.
- دستورات دارای Prefix را تشخیص دهد.
- نام دستور و آرگومانها را استخراج کند.
- اولین دستور (
!ping) را اجرا کرده و به کاربر پاسخ دهد.
نظرات کاربران