مقدمه
Discord یک برنامه چت است که به میلیون ها کاربر در سراسر جهان امکان می دهد در جوامعی به نام اصناف یا سرورها به صورت آنلاین پیام و چت صوتی داشته باشند. Discord همچنین یک API گسترده ارائه می دهد که توسعه دهندگان می توانند از آن برای ساخت ربات های قدرتمند Discord استفاده کنند. ربات ها می توانند اقدامات مختلفی مانند ارسال پیام به سرورها، کاربران DM-ing، تعدیل سرورها و پخش صدا در چت های صوتی را انجام دهند. این به توسعه دهندگان اجازه می دهد تا ربات های قدرتمندی را با ویژگی های پیشرفته و پیچیده مانند ابزارهای تعدیل یا بازی بسازند. به عنوان مثال، ربات ابزار Dyno به میلیونها انجمن خدمات ارائه میدهد و دارای ویژگیهای مفیدی مانند حفاظت از هرزنامه، پخشکننده موسیقی و سایر عملکردهای کاربردی است. یادگیری ایجاد ربات های Discord به شما امکان می دهد تا امکانات زیادی را پیاده سازی کنید، که هزاران نفر می توانند روزانه با آنها تعامل داشته باشند.
در این آموزش، با استفاده از Node.js و کتابخانه Discord.js، یک ربات Discord را از ابتدا می سازید، که به کاربران اجازه می دهد مستقیماً با Discord API تعامل داشته باشند. شما یک نمایه برای یک ربات Discord راهاندازی میکنید، نشانههای احراز هویت را برای ربات دریافت میکنید و ربات را با توانایی پردازش دستورات با آرگومانهای کاربران برنامهریزی میکنید.
پیش نیازها
قبل از شروع به موارد زیر نیاز دارید:
- Node.js بر روی ماشین توسعه شما نصب شده است.
- هر ویرایشگر متنی دلخواه شما، مانند Visual Studio Code، Atom، Sublime یا Nano.
- یک حساب رایگان Discord با یک حساب ایمیل تأیید شده و یک سرور Discord رایگان که برای آزمایش ربات Discord خود استفاده خواهید کرد.
مرحله 1 – راه اندازی ربات Discord
در این مرحله، از رابط کاربری گرافیکی توسعه دهنده Discord (GUI) برای راه اندازی ربات Discord و دریافت توکن ربات استفاده می کنید که آن را به برنامه خود منتقل می کنید.
برای ثبت ربات در پلتفرم Discord، از داشبورد برنامه Discord استفاده کنید. در اینجا توسعه دهندگان می توانند برنامه های Discord از جمله ربات های Discord را ایجاد کنند.
برای شروع، روی New Application کلیک کنید. Discord از شما می خواهد که یک نام برای برنامه جدید خود وارد کنید. سپس روی Create کلیک کنید تا اپلیکیشن ایجاد شود.
توجه: نام برنامه شما مستقل از نام ربات است و لازم نیست ربات هم نام برنامه باشد.
اکنون داشبورد برنامه خود را باز کنید. برای افزودن ربات به برنامه، به تب Bot در نوار پیمایش سمت چپ بروید.
روی دکمه افزودن ربات کلیک کنید تا یک ربات به برنامه اضافه شود. روی Yes, do it کلیک کنید! زمانی که از شما درخواست تایید می کند را فشار دهید. سپس روی داشبوردی قرار می گیرید که حاوی جزئیات نام ربات، نشانه احراز هویت و تصویر نمایه شما است.
می توانید نام ربات یا تصویر نمایه خود را در اینجا در داشبورد تغییر دهید. همچنین باید با کلیک روی کلیک برای آشکار کردن توکن و کپی کردن توکنی که ظاهر میشود، توکن احراز هویت ربات را کپی کنید.
هشدار: هرگز توکن ربات خود را به اشتراک نگذارید یا آپلود نکنید زیرا به هر کسی اجازه میدهد وارد ربات شما شود.
اکنون باید یک دعوت نامه ایجاد کنید تا ربات را به انجمن Discord اضافه کنید تا بتوانید آن را آزمایش کنید. ابتدا به صفحه URL Generator زیر تب OAuth2 داشبورد برنامه بروید. برای ایجاد یک دعوت، به پایین اسکرول کنید و ربات را در زیر محدوده ها انتخاب کنید. همچنین باید مجوزهایی را برای کنترل اعمالی که ربات شما می تواند در انجمن ها انجام دهد تنظیم کنید. برای این آموزش، Administrator را انتخاب کنید، که به ربات شما اجازه می دهد تقریباً تمام اقدامات را در Guild انجام دهد. لینک را با دکمه کپی کپی کنید.
سپس ربات را به سرور اضافه کنید. پیوند دعوتی را که ایجاد کردید دنبال کنید. میتوانید ربات را به هر سروری که دارید اضافه کنید، یا مجوزهای سرپرست را در منوی کشویی دارید.
اکنون روی Continue کلیک کنید. مطمئن شوید که تیک باکس کنار Administrator را علامت زده اید – این به مدیر ربات مجوز می دهد. سپس روی Authorize کلیک کنید. Discord از شما می خواهد که قبل از پیوستن ربات به سرور، یک CAPTCHA را حل کنید. اکنون ربات Discord را در لیست اعضای سروری که ربات را به آن اضافه کرده اید، در حالت آفلاین خواهید داشت.
شما با موفقیت یک ربات Discord ایجاد کردید و آن را به یک سرور اضافه کردید. در مرحله بعد برنامه ای برای ورود به ربات می نویسید.
مرحله 2 – ایجاد پروژه شما
در این مرحله، محیط کدنویسی اولیه را راهاندازی میکنید که در آن ربات خود را میسازید و به صورت برنامهنویسی وارد ربات میشوید.
ابتدا باید یک پوشه پروژه و فایل های پروژه لازم برای ربات راه اندازی کنید.
پوشه پروژه خود را ایجاد کنید:
mkdir discord-bot
به پوشه پروژه ای که ایجاد کرده اید بروید:
cd discord-bot
در مرحله بعد، از ویرایشگر متن خود برای ایجاد فایلی به نام config.json برای ذخیره رمز احراز هویت ربات خود استفاده کنید:
nano config.json
سپس کد زیر را به فایل کانفیگ اضافه کنید و متن برجسته شده را با توکن احراز هویت ربات خود جایگزین کنید:
{
"BOT_TOKEN": "YOUR BOT TOKEN"
}
فایل را ذخیره کرده و از آن خارج شوید.
در مرحله بعد، یک فایل package.json ایجاد خواهید کرد که جزئیات پروژه شما و اطلاعات مربوط به وابستگی هایی را که برای پروژه استفاده می کنید ذخیره می کند. با اجرای دستور npm زیر یک فایل package.json ایجاد خواهید کرد:
npm init
npm از شما جزئیات مختلفی در مورد پروژه شما می خواهد.
اکنون بسته discord.js را که برای تعامل با Discord API استفاده خواهید کرد، نصب خواهید کرد. با دستور زیر می توانید discord.js را از طریق npm نصب کنید:
npm install discord.js
اکنون که فایل پیکربندی را تنظیم کرده اید و وابستگی لازم را نصب کرده اید، آماده شروع ساخت ربات خود هستید. در یک برنامه واقعی، یک ربات بزرگ بین فایلهای زیادی تقسیم میشود، اما برای این آموزش، کد ربات شما در یک فایل خواهد بود.
ابتدا یک فایل به نام index.js در پوشه discord-bot برای کد ایجاد کنید:
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);
فایل خود را ذخیره کرده و از آن خارج شوید.
خط اول کد یک Discord جدید ایجاد می کند. مشتری و آن را به مشتری ثابت اختصاص می دهد. این کلاینت تا حدودی نحوه تعامل شما با Discord API و نحوه اطلاع رسانی Discord از رویدادهایی مانند پیام های جدید است. کلاینت در واقع نشان دهنده ربات Discord است. شیء ارسال شده به سازنده Client، مقاصد دروازه ربات شما را مشخص می کند. این مشخص می کند که ربات شما به کدام رویدادهای WebSocket گوش می دهد. در اینجا GUILDS و GUILD_MESSAGES را مشخص کردهاید تا ربات بتواند رویدادهای پیام را در انجمنها دریافت کند.
خط دوم کد از روش لاگین روی کلاینت برای ورود به ربات Discord که ایجاد کردهاید استفاده میکند و از رمز موجود در فایل config.json به عنوان رمز عبور استفاده میکند. توکن به Discord API اجازه میدهد بداند که برنامه برای کدام ربات است و اینکه شما برای استفاده از ربات احراز هویت شدهاید.
اکنون فایل index.js را با استفاده از Node اجرا کنید:
node index.js
وضعیت ربات شما در سرور Discord که آن را به آن اضافه کرده اید به آنلاین تغییر می کند.
شما با موفقیت یک محیط کدنویسی راه اندازی کرده اید و کد اصلی را برای ورود به ربات Discord ایجاد کرده اید. در مرحله بعد، دستورات کاربر را کنترل میکنید و ربات خود را وادار میکنید تا اقداماتی مانند ارسال پیام را انجام دهد.
مرحله 3 – مدیریت اولین فرمان کاربر
در این مرحله رباتی ایجاد می کنید که می تواند دستورات کاربر را مدیریت کند. شما اولین پینگ فرمان خود را اجرا می کنید که با “پنگ” و زمان صرف شده برای پاسخ به دستور پاسخ می دهد.
ابتدا باید پیامهایی را که کاربران ارسال میکنند شناسایی و دریافت کنید تا بتوانید هر دستوری را پردازش کنید. با استفاده از روش on در مشتری Discord، Discord یک اعلان در مورد رویدادهای جدید برای شما ارسال می کند. متد on دو آرگومان می گیرد: نام رویدادی که باید منتظر ماند و تابعی که هر بار که آن رویداد اجرا می شود اجرا می شود. با این روش می توانید منتظر پیام رویداد بمانید — این اتفاق هر بار که پیامی به انجمنی ارسال می شود که ربات مجوز مشاهده پیام ها را دارد، رخ می دهد. بنابراین شما یک تابع ایجاد خواهید کرد که هر بار که پیامی برای پردازش دستورات ارسال می شود اجرا می شود.
ابتدا فایل خود را باز کنید:
nano index.js
کد زیر را به فایل خود اضافه کنید:
...
const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]});
client.on("messageCreate", function(message) {
});
client.login(config.BOT_TOKEN);
این تابع که روی رویداد messageCreate اجرا می شود، پیام را به عنوان پارامتر می گیرد. پیام ارزش یک نمونه پیام Discord.js را خواهد داشت که حاوی اطلاعاتی در مورد پیام ارسال شده و روش هایی برای کمک به ربات برای پاسخگویی است.
اکنون خط کد زیر را به تابع کنترل فرمان خود اضافه کنید:
...
client.on("messageCreate", function(message) {
if (message.author.bot) return;
});
...
این خط بررسی می کند که آیا نویسنده پیام یک ربات است یا خیر، و در این صورت، پردازش دستور را متوقف می کند. این مهم است زیرا به طور کلی، شما نمی خواهید پیام های ربات ها را پردازش کنید یا به آنها پاسخ دهید. رباتها معمولاً نیازی به استفاده از اطلاعات رباتهای دیگر ندارند، بنابراین نادیده گرفتن پیامهای آنها باعث صرفهجویی در قدرت پردازش و جلوگیری از پاسخهای تصادفی میشود.
اکنون یک فرمان کنترلر می نویسید. برای انجام این کار، خوب است که فرمت معمول یک فرمان Discord را درک کنید. به طور معمول، ساختار یک فرمان Discord شامل سه بخش به ترتیب زیر است: یک پیشوند، یک نام دستور، و (گاهی اوقات) آرگومان های فرمان.
- پیشوند: پیشوند می تواند هر چیزی باشد، اما معمولاً یک قطعه نقطه گذاری یا عبارت انتزاعی است که معمولاً در ابتدای پیام نیست. این بدان معناست که وقتی پیشوند را در ابتدای پیام وارد میکنید، ربات متوجه میشود که هدف این دستور پردازش آن توسط یک ربات است.
- نام فرمان: نام دستوری که کاربر می خواهد از آن استفاده کند. این به این معنی است که ربات میتواند از چندین فرمان با عملکردهای مختلف پشتیبانی کند و به کاربران امکان انتخاب بین آنها را با ارائه یک نام دستور متفاوت بدهد.
- آرگومانها: گاهی اوقات اگر دستور نیاز به اطلاعات اضافی از کاربر داشته باشد یا از آن استفاده کند، کاربر میتواند آرگومانهایی را پس از نام فرمان ارائه کند و هر آرگومان با فاصله از هم جدا شود.
توجه: هیچ ساختار فرمان اجباری وجود ندارد و رباتها میتوانند دستورات را هر طور که دوست دارند پردازش کنند، اما ساختار ارائهشده در اینجا یک ساختار کارآمد است که اکثریت قریب به اتفاق رباتها از آن استفاده میکنند.
برای شروع ایجاد یک تجزیه کننده فرمان که این قالب را مدیریت می کند، خطوط کد زیر را به تابع مدیریت پیام اضافه کنید:
...
const prefix = "!";
client.on("messageCreate", function(message) {
if (message.author.bot) return;
if (!message.content.startsWith(prefix)) return;
});
...
شما خط اول کد را اضافه می کنید تا مقدار “!” به پیشوند ثابت که از آن به عنوان پیشوند ربات استفاده خواهید کرد.
خط دوم کدی که اضافه میکنید بررسی میکند که آیا محتوای پیامی که ربات در حال پردازش آن است با پیشوندی که تنظیم کردهاید شروع میشود یا نه، و اگر این کار را نکرد، ادامه پردازش پیام را متوقف میکند.
اکنون باید بقیه پیام را به نام دستور و هر آرگومان موجود در پیام تبدیل کنید. خطوط برجسته زیر را اضافه کنید:
...
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();
});
...
شما از خط اول در اینجا برای حذف پیشوند از محتوای پیام استفاده می کنید و نتیجه را به بدنه فرمان ثابت اختصاص می دهید. این ضروری است زیرا نمی خواهید پیشوند را در نام فرمان تجزیه شده قرار دهید.
خط دوم پیام را با پیشوند حذف شده می گیرد و از روش تقسیم بر روی آن استفاده می کند و یک فاصله به عنوان جداکننده دارد. این آن را به آرایهای از رشتههای فرعی تقسیم میکند و هر جا که فاصله وجود داشته باشد، یک تقسیم میشود. این منجر به آرایهای میشود که نام فرمان را شامل میشود، و سپس، اگر در پیام گنجانده شود، هر آرگومان. شما این آرایه را به آرگ های ثابت اختصاص می دهید.
خط سوم اولین عنصر را از آرایه args (که نام دستور ارائه شده خواهد بود) حذف می کند، آن را به حروف کوچک تبدیل می کند و سپس آن را به دستور ثابت اختصاص می دهد. این به شما امکان می دهد نام فرمان را ایزوله کنید و فقط آرگومان ها را در آرایه باقی بگذارید. شما همچنین از روش toLowerCase استفاده میکنید زیرا دستورات معمولاً در رباتهای Discord به حروف بزرگ و کوچک حساس نیستند.
شما ساختن یک تجزیه کننده فرمان، پیاده سازی یک پیشوند مورد نیاز، و دریافت نام فرمان و هرگونه آرگومان از پیام ها را تکمیل کرده اید. اکنون کد دستورات خاص را پیاده سازی و ایجاد خواهید کرد.
برای شروع اجرای دستور ping کد زیر را اضافه کنید:
...
const args = commandBody.split(' ');
const command = args.shift().toLowerCase();
if (command === "ping") {
}
});
...
این دستور if بررسی می کند که آیا نام فرمانی که تجزیه کرده اید (به دستور ثابت اختصاص داده شده) با “ping” مطابقت دارد یا خیر. اگر این کار را کرد، نشان می دهد که کاربر می خواهد از دستور “ping” استفاده کند. کد دستور خاص را در بلوک دستور if قرار می دهید. شما این الگو را برای دستورات دیگری که می خواهید اجرا کنید تکرار خواهید کرد.
اکنون می توانید کد دستور “ping” را پیاده سازی کنید:
...
if (command === "ping") {
const timeTaken = Date.now() - message.createdTimestamp;
message.reply(`Pong! This message had a latency of ${timeTaken}ms.`);
}
...
فایل خود را ذخیره کرده و از آن خارج شوید.
شما بلوک فرمان “ping” را اضافه می کنید که تفاوت بین زمان فعلی – که با استفاده از روش جدید در شی Date پیدا شده است – و مهر زمانی که پیام ایجاد شده را در میلی ثانیه محاسبه می کند. این محاسبه مدت زمان پردازش پیام و “پینگ” ربات را محاسبه می کند.
خط دوم با استفاده از روش پاسخ در ثابت پیام به دستور کاربر پاسخ می دهد. متد پاسخ به کاربر که دستور را فراخوانی کرده است پینگ می دهد (که به کاربر اطلاع می دهد و پیام را برای کاربر مشخص شده برجسته می کند) و به دنبال آن محتوای ارائه شده به عنوان اولین آرگومان متد. شما یک الگوی تحت اللفظی حاوی یک پیام و پینگ محاسبه شده به عنوان پاسخی که روش پاسخ استفاده خواهد کرد ارائه می دهید.
این به اجرای دستور “ping” پایان می دهد.
ربات خود را با استفاده از دستور زیر (در همان پوشه index.js) اجرا کنید:
node index.js
اکنون می توانید از دستور “!ping” در هر کانالی که ربات می تواند مشاهده کند و در آن پیام ارسال کند، استفاده کنید و در نتیجه پاسخ دهید.
شما با موفقیت یک ربات ایجاد کرده اید که می تواند دستورات کاربر را مدیریت کند و اولین دستور خود را اجرا کرده اید. در مرحله بعد با اجرای دستور sum به توسعه ربات خود ادامه می دهید.
مرحله 4 – اجرای دستور Sum
اکنون با اجرای دستور “!sum” برنامه خود را گسترش خواهید داد. دستور هر تعداد آرگومان را می گیرد و آنها را با هم جمع می کند، قبل از اینکه مجموع همه آرگومان ها را به کاربر برگرداند.
اگر ربات Discord شما همچنان در حال اجرا است، می توانید با CTRL + C فرآیند آن را متوقف کنید.
فایل index.js خود را دوباره باز کنید:
nano index.js
برای شروع اجرای دستور “!sum” از بلوک else-if استفاده می کنید. پس از بررسی نام دستور ping، بررسی می کند که آیا نام دستور برابر با “sum” است یا خیر. شما از بلوک else-if استفاده خواهید کرد زیرا فقط یک دستور در یک زمان پردازش می شود، بنابراین اگر برنامه با نام دستور “ping” مطابقت داشته باشد، نیازی به بررسی دستور “sum” نیست. خطوط هایلایت شده زیر را به فایل خود اضافه کنید:
...
if (command === "ping") {
const timeTaken = Date.now() - message.createdTimestamp;
message.reply(`Ping! This message had a latency of ${timeTaken}ms.`);
}
else if (command === "sum") {
}
});
...
می توانید اجرای کد دستور “sum” را شروع کنید. کد دستور “sum” داخل بلوک else-if که به تازگی ایجاد کرده اید می رود. حالا کد زیر را اضافه کنید:
...
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}!`);
}
...
شما از روش نقشه در لیست آرگومان ها برای ایجاد یک لیست جدید با استفاده از تابع parseFloat در هر آیتم در آرایه args استفاده می کنید. این یک آرایه جدید ایجاد می کند (که به numArgs ثابت اختصاص داده شده است) که در آن همه موارد به جای رشته ها اعداد هستند. این بدان معناست که بعداً میتوانید با جمع کردن آنها با موفقیت مجموع اعداد را پیدا کنید.
خط دوم از روش کاهش در numArgs ثابت استفاده می کند که تابعی را ارائه می دهد که تمام عناصر لیست را جمع می کند. شما مجموع تمام عناصر موجود در numArgs را به مجموع ثابت اختصاص می دهید.
سپس از روش reply بر روی شی پیام استفاده میکنید تا به دستور کاربر با یک الگوی واقعی پاسخ دهید، که شامل مجموع همه آرگومانهایی است که کاربر به ربات ارسال میکند.
این به اجرای دستور “sum” پایان می دهد. اکنون ربات را با استفاده از دستور زیر (در همان پوشه index.js) اجرا کنید:
node index.js
اکنون می توانید از دستور “!sum” در هر کانالی که ربات می تواند مشاهده کند و در آن پیام ارسال کند، استفاده کنید.
نسخه زیر یک نسخه کامل از اسکریپت ربات index.js است:
const Discord = require("discord.js");
const config = require("./config.json");
const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]});
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();
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);
در این مرحله، ربات Discord خود را با اجرای دستور sum توسعه داده اید.
نتیجه
شما یک ربات Discord را با موفقیت پیادهسازی کردهاید که میتواند چندین دستور مختلف کاربر و آرگومانهای فرمان را مدیریت کند. اگر میخواهید ربات خود را گسترش دهید، احتمالاً میتوانید دستورات بیشتری را اجرا کنید یا بخشهای بیشتری از Discord API را امتحان کنید تا یک ربات قدرتمند Discord بسازید.