آموزش معرفی و بررسی

چگونه یک ربات Discord با Node.js بسازیم

معرفی

Discord یک برنامه چت است که به میلیون ها کاربر در سراسر جهان امکان می دهد در جوامعی به نام اصناف یا سرورها به صورت آنلاین پیام و چت صوتی داشته باشند. Discord همچنین یک API گسترده ارائه می دهد که توسعه دهندگان می توانند از آن برای ساخت ربات های قدرتمند Discord استفاده کنند. ربات ها می توانند اقدامات مختلفی مانند ارسال پیام به سرورها، کاربران DM-ing، تعدیل سرورها و پخش صدا در چت های صوتی را انجام دهند. این به توسعه‌دهندگان اجازه می‌دهد تا ربات‌های قدرتمندی بسازند که شامل ویژگی‌های پیشرفته و پیچیده مانند ابزارهای تعدیل یا حتی بازی‌ها می‌شود. به عنوان مثال، ربات ابزار Dyno به میلیون‌ها انجمن خدمات ارائه می‌دهد و دارای ویژگی‌های مفیدی مانند محافظت از هرزنامه، پخش‌کننده موسیقی و سایر عملکردهای کاربردی است. یادگیری نحوه ایجاد ربات های Discord به شما امکان می دهد تا امکانات زیادی را پیاده سازی کنید که هزاران نفر می توانند هر روز با آنها تعامل داشته باشند.

در این آموزش، با استفاده از Node.js و کتابخانه Discord.js، یک ربات Discord را از ابتدا می سازید، که به کاربران اجازه می دهد مستقیماً با Discord API تعامل داشته باشند. شما یک نمایه برای یک ربات Discord تنظیم می‌کنید، نشانه‌های احراز هویت را برای ربات دریافت می‌کنید، و ربات را با قابلیت پردازش دستورات با آرگومان‌های کاربران برنامه‌ریزی می‌کنید.

پیش نیازها

قبل از شروع به موارد زیر نیاز دارید:

  • Node.js روی ماشین توسعه شما نصب شده است. برای نصب آن در macOS یا اوبونتو 20.04، مراحل نحوه نصب Node.js و ایجاد محیط توسعه محلی در macOS یا نصب Node.js با Apt با استفاده از بخش NodeSource PPA در نحوه نصب Node.js در اوبونتو 20.04 را دنبال کنید. .
  • هر ویرایشگر متنی دلخواه شما، مانند Visual Studio Code، Atom، Sublime یا Nano.
  • یک حساب رایگان Discord با یک حساب ایمیل تأیید شده و یک سرور Discord رایگان که برای آزمایش ربات Discord خود استفاده خواهید کرد.

مرحله 1 – راه اندازی ربات Discord

در این مرحله، از رابط کاربری گرافیکی توسعه دهندگان Discord (GUI) برای راه اندازی ربات Discord و دریافت توکن ربات استفاده می کنید که آن را به برنامه خود منتقل می کنید.

برای ثبت ربات در پلتفرم دیسکورد، از داشبورد اپلیکیشن دیسکورد استفاده کنید. در اینجا توسعه دهندگان می توانند برنامه های Discord از جمله ربات های Discord را ایجاد کنند.

برای شروع، روی New Application کلیک کنید. Discord از شما می خواهد که یک نام برای برنامه جدید خود وارد کنید. سپس روی Create کلیک کنید تا اپلیکیشن ایجاد شود.

اکنون داشبورد برنامه خود را باز کنید. برای افزودن ربات به برنامه، به تب Bot در نوار پیمایش سمت چپ بروید.

روی دکمه افزودن ربات کلیک کنید تا یک ربات به برنامه اضافه شود. روی Yes, do it کلیک کنید! زمانی که از شما درخواست تایید می کند را فشار دهید. سپس روی داشبوردی قرار می گیرید که حاوی جزئیات نام ربات، نشانه احراز هویت و تصویر نمایه شما است.

اکنون باید یک دعوت نامه ایجاد کنید تا ربات را به انجمن Discord اضافه کنید تا بتوانید آن را آزمایش کنید. ابتدا به صفحه URL Generator زیر تب OAuth2 داشبورد برنامه بروید. برای ایجاد یک دعوت، به پایین پیمایش کنید و ربات را در زیر scopes انتخاب کنید. همچنین باید مجوزهایی را برای کنترل اعمالی که ربات شما می تواند در انجمن ها انجام دهد تنظیم کنید. برای اهداف این آموزش، Administrator را انتخاب کنید، که به ربات شما اجازه می دهد تقریباً تمام اقدامات را در Guild انجام دهد. لینک را با دکمه کپی کپی کنید.

سپس ربات را به سرور اضافه کنید. پیوند دعوتی را که ایجاد کردید دنبال کنید. می‌توانید ربات را به هر سروری که دارید اضافه کنید یا مجوزهای سرپرست را در منوی کشویی دارید.

حالا روی Continue کلیک کنید. مطمئن شوید که تیک باکس کنار Administrator را علامت زده اید – این به مدیر ربات مجوز می دهد. سپس روی Authorize کلیک کنید. Discord از شما می خواهد که قبل از پیوستن ربات به سرور، یک CAPTCHA را حل کنید. اکنون ربات Discord را در لیست اعضا در سروری که ربات را در حالت آفلاین به آن اضافه کرده اید خواهید داشت.

شما با موفقیت یک ربات Discord ایجاد کردید و آن را به یک سرور اضافه کردید. در مرحله بعد برنامه ای برای ورود به ربات می نویسید.

مرحله 2 – ایجاد پروژه شما

در این مرحله، محیط کدنویسی اولیه را راه‌اندازی می‌کنید که در آن ربات خود را می‌سازید و به صورت برنامه‌نویسی وارد ربات می‌شوید.

ابتدا باید یک پوشه پروژه و فایل های پروژه لازم برای ربات راه اندازی کنید.

پوشه پروژه خود را ایجاد کنید:

mkdir discord-bot

به پوشه پروژه ای که ایجاد کرده اید بروید:

cd discord-bot

در مرحله بعد، از ویرایشگر متن خود برای ایجاد فایلی به نام config.json برای ذخیره رمز احراز هویت ربات خود استفاده کنید:

nano config.json

سپس کد زیر را به فایل کانفیگ اضافه کنید و متن برجسته شده را با کد احراز هویت ربات خود جایگزین کنید:

discord-bot/config.json
{
    "BOT_TOKEN": "YOUR BOT TOKEN"
}

فایل را ذخیره کرده و از آن خارج شوید.

سپس یک فایل package.json ایجاد می‌کنید که جزئیات پروژه شما و اطلاعات مربوط به وابستگی‌هایی را که برای پروژه استفاده می‌کنید ذخیره می‌کند. با اجرای دستور npm زیر یک فایل package.json ایجاد خواهید کرد:

npm init

npm از شما جزئیات مختلفی در مورد پروژه شما می خواهد. اگر مایل به راهنمایی برای تکمیل این دستورات هستید، می توانید در مورد آنها در نحوه استفاده از ماژول های Node.js با npm و package.json مطالعه کنید.

اکنون بسته discord.js را که برای تعامل با Discord API استفاده خواهید کرد، نصب خواهید کرد. با دستور زیر می توانید discord.js را از طریق npm نصب کنید:

npm install discord.js

اکنون که فایل پیکربندی را تنظیم کرده اید و وابستگی لازم را نصب کرده اید، آماده شروع ساخت ربات خود هستید. در یک برنامه واقعی، یک ربات بزرگ بین بسیاری از فایل ها تقسیم می شود، اما برای اهداف این آموزش، کد ربات شما در یک فایل خواهد بود.

ابتدا یک فایل به نام index.js در پوشه discord-bot برای کد ایجاد کنید:

nano index.js

کدگذاری ربات را با نیاز به وابستگی discord.js و فایل پیکربندی با توکن ربات آغاز کنید.

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

پس از این، دو خط کد بعدی را اضافه کنید:

discord-bot/index.js
...
const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]);

client.login(config.BOT_TOKEN);

فایل خود را ذخیره کرده و از آن خارج شوید.

خط اول کد یک Discord.Client جدید ایجاد می کند و آن را به مشتری ثابت اختصاص می دهد. این کلاینت تا حدودی نحوه تعامل شما با Discord API و نحوه اطلاع رسانی Discord از رویدادهایی مانند پیام های جدید است. کلاینت در واقع نشان دهنده ربات Discord است. شیء ارسال شده به سازنده Client، مقاصد دروازه ربات شما را مشخص می کند. این مشخص می کند که ربات شما به کدام رویدادهای WebSocket گوش می دهد. در اینجا GUILDS و GUILD_MESSAGES را مشخص کرده‌اید تا ربات بتواند رویدادهای پیام را در انجمن‌ها دریافت کند.

خط دوم کد از روش لاگین روی کلاینت برای ورود به ربات Discord که ایجاد کرده‌اید استفاده می‌کند و از رمز موجود در فایل config.json به عنوان رمز عبور استفاده می‌کند. توکن به Discord API اجازه می دهد بداند که برنامه برای کدام ربات است و اینکه شما برای استفاده از ربات احراز هویت شده اید.

اکنون فایل index.js را با استفاده از Node اجرا کنید:

node index.js

وضعیت ربات شما در سرور Discord که آن را به آن اضافه کرده اید به حالت آنلاین تغییر می کند.

شما با موفقیت یک محیط کدنویسی راه اندازی کرده اید و کد اصلی را برای ورود به ربات Discord ایجاد کرده اید. در مرحله بعد دستورات کاربر را کنترل می‌کنید و ربات خود را وادار می‌کنید تا اقداماتی مانند ارسال پیام را انجام دهد.

مرحله 3 – مدیریت اولین فرمان کاربر

در این مرحله رباتی ایجاد می کنید که می تواند دستورات کاربر را مدیریت کند. شما اولین پینگ فرمان خود را اجرا می کنید، که با “pong” و زمان صرف شده برای پاسخ به دستور پاسخ می دهد.

ابتدا باید پیام‌هایی را که کاربران ارسال می‌کنند شناسایی و دریافت کنید تا بتوانید هر دستوری را پردازش کنید. با استفاده از روش روشن در مشتری Discord، Discord یک اعلان در مورد رویدادهای جدید برای شما ارسال می کند. متد on دو آرگومان می گیرد: نام رویدادی که باید منتظر ماند و تابعی که هر بار که آن رویداد اجرا می شود اجرا می شود. با این روش می توانید منتظر پیام رویداد بمانید — این اتفاق هر بار که پیامی به انجمنی ارسال می شود که ربات مجوز مشاهده پیام ها را دارد، رخ می دهد. بنابراین شما یک تابع ایجاد خواهید کرد که هر بار که پیامی برای پردازش دستورات ارسال می شود اجرا می شود.

ابتدا فایل خود را باز کنید:

nano index.js

کد زیر را به فایل خود اضافه کنید:

discord-bot/index.js
...
const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]});


client.on("messageCreate", function(message) { 
                                         
});                                      

client.login(config.BOT_TOKEN);

این تابع که روی رویداد messageCreate اجرا می شود، پیام را به عنوان پارامتر می گیرد. پیام ارزش یک نمونه پیام Discord.js را خواهد داشت که حاوی اطلاعاتی در مورد پیام ارسال شده و روش هایی برای کمک به ربات برای پاسخ دادن است.

اکنون خط کد زیر را به تابع کنترل فرمان خود اضافه کنید:

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

این خط بررسی می کند که آیا نویسنده پیام یک ربات است یا خیر، و در این صورت، پردازش دستور را متوقف می کند. این مهم است زیرا معمولاً نمی خواهید پیام های ربات ها را پردازش کنید یا به آنها پاسخ دهید. ربات‌ها معمولاً نیازی به استفاده از اطلاعات ربات‌های دیگر ندارند، بنابراین نادیده گرفتن پیام‌های آنها باعث صرفه‌جویی در قدرت پردازش و جلوگیری از پاسخ‌های تصادفی می‌شود.

اکنون یک کنترل کننده فرمان می نویسید. برای انجام این کار، خوب است که فرمت معمول یک فرمان Discord را درک کنید. به طور معمول، ساختار یک فرمان Discord شامل سه بخش به ترتیب زیر است: یک پیشوند، یک نام دستور، و (گاهی) آرگومان های فرمان.

  • پیشوند: پیشوند می تواند هر چیزی باشد، اما معمولاً یک قطعه نقطه گذاری یا عبارت انتزاعی است که معمولاً در ابتدای پیام نیست. این بدان معناست که وقتی پیشوند را در ابتدای پیام وارد می‌کنید، ربات می‌داند که قصد این دستور این است که یک ربات آن را پردازش کند.
  • نام فرمان: نام دستوری که کاربر می خواهد از آن استفاده کند. این بدان معناست که ربات می‌تواند از چندین فرمان با عملکردهای مختلف پشتیبانی کند و به کاربران اجازه دهد تا با ارائه یک نام فرمان متفاوت، بین آنها یکی را انتخاب کنند.
  • آرگومان‌ها: گاهی اوقات اگر دستور نیاز به اطلاعات اضافی از کاربر داشته باشد یا از آن استفاده کند، کاربر می‌تواند آرگومان‌هایی را پس از نام فرمان ارائه کند و هر آرگومان با یک فاصله از هم جدا شود.

برای شروع ایجاد یک تجزیه کننده فرمان که این قالب را مدیریت می کند، خطوط کد زیر را به تابع مدیریت پیام اضافه کنید:

discord-bot/index.js
...
const prefix = "!";

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

شما خط اول کد را اضافه می کنید تا مقدار “!” به پیشوند ثابت که از آن به عنوان پیشوند ربات استفاده خواهید کرد.

خط دوم کدی که اضافه می‌کنید بررسی می‌کند که آیا محتوای پیامی که ربات در حال پردازش است با پیشوندی که تنظیم کرده‌اید شروع می‌شود یا خیر، و اگر این کار را نکرد، ادامه پردازش پیام را متوقف می‌کند.

اکنون باید بقیه پیام را به نام فرمان و هر آرگومان موجود در پیام تبدیل کنید. خطوط برجسته زیر را اضافه کنید:

discord-bot/index.js
...
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();
});
...

شما از خط اول در اینجا برای حذف پیشوند از محتوای پیام استفاده می کنید و نتیجه را به commandBody ثابت اختصاص می دهید. این ضروری است زیرا نمی خواهید پیشوند را در نام فرمان تجزیه شده قرار دهید.

خط دوم پیام را با پیشوند حذف شده می گیرد و از روش تقسیم بر روی آن استفاده می کند و یک فاصله به عنوان جداکننده دارد. این آن را به آرایه‌ای از رشته‌های فرعی تقسیم می‌کند و هر جا که فاصله وجود داشته باشد، یک تقسیم می‌شود. این منجر به آرایه ای می شود که نام فرمان را در بر می گیرد، سپس، اگر در پیام گنجانده شود، هر گونه آرگومان. شما این آرایه را به آرگ های ثابت اختصاص می دهید.

خط سوم اولین عنصر را از آرایه args حذف می کند (که نام دستور ارائه شده است)، آن را به حروف کوچک تبدیل می کند و سپس آن را به دستور ثابت اختصاص می دهد. این به شما امکان می دهد نام فرمان را ایزوله کنید و فقط آرگومان ها را در آرایه باقی بگذارید. شما همچنین از روش toLowerCase استفاده می کنید زیرا دستورات معمولاً در ربات های Discord به حروف بزرگ و کوچک حساس نیستند.

شما ساختن یک تجزیه کننده فرمان، پیاده سازی یک پیشوند مورد نیاز، و دریافت نام فرمان و هر گونه آرگومان از پیام ها را تکمیل کرده اید. اکنون کد دستورات خاص را پیاده سازی و ایجاد خواهید کرد.

برای شروع اجرای دستور ping کد زیر را اضافه کنید:

discord-bot/index.js
...
  const args = commandBody.split(' ');
  const command = args.shift().toLowerCase();

  if (command === "ping") {
                           
  }                        
});
...

این دستور if بررسی می کند که آیا نام فرمانی که شما تجزیه کرده اید (به دستور ثابت اختصاص داده شده) با “ping” مطابقت دارد یا خیر. اگر این کار را کرد، نشان می دهد که کاربر می خواهد از دستور “ping” استفاده کند. کد دستور خاص را در بلوک دستور if قرار می دهید. شما این الگو را برای دستورات دیگری که می خواهید اجرا کنید تکرار خواهید کرد.

اکنون می توانید کد دستور “ping” را پیاده سازی کنید:

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

فایل خود را ذخیره کرده و از آن خارج شوید.

شما بلوک فرمان “ping” را اضافه می کنید که تفاوت بین زمان فعلی – که با استفاده از روش now در شیء 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” را بررسی کند. خطوط هایلایت شده زیر را به فایل خود اضافه کنید:

discord-bot/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") {
                               
  }                            
});
...

می توانید اجرای کد دستور “sum” را شروع کنید. کد دستور “sum” داخل بلوک else-if که به تازگی ایجاد کرده اید می رود. حالا کد زیر را اضافه کنید:

discord-bot/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}!`);
  }
...

شما از روش نقشه در لیست آرگومان ها برای ایجاد یک لیست جدید با استفاده از تابع parseFloat در هر آیتم در آرایه args استفاده می کنید. این یک آرایه جدید ایجاد می کند (به ثابت numArgs اختصاص داده می شود) که در آن همه موارد به جای رشته ها اعداد هستند. این بدان معناست که بعداً می توانید با جمع کردن آنها با موفقیت مجموع اعداد را پیدا کنید.

خط دوم از روش کاهش در numArgs ثابت استفاده می کند که تابعی را ارائه می دهد که تمام عناصر لیست را جمع می کند. شما مجموع تمام عناصر موجود در numArgs را به مجموع ثابت اختصاص می دهید.

سپس از روش reply روی شی پیام استفاده می‌کنید تا به دستور کاربر با یک الگوی واقعی پاسخ دهید، که شامل مجموع همه آرگومان‌هایی است که کاربر به ربات ارسال می‌کند.

این به اجرای دستور “sum” پایان می دهد. اکنون ربات را با استفاده از دستور زیر (در همان پوشه index.js) اجرا کنید:

node index.js

اکنون می توانید از دستور “!sum” در هر کانالی که ربات می تواند مشاهده کند و در آن پیام ارسال کند، استفاده کنید.

نسخه زیر یک نسخه کامل از اسکریپت ربات index.js است:

discord-bot/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 بسازید. می توانید اسناد Discord.js یا اسناد Discord API را مرور کنید تا دانش خود را در مورد Discord API گسترش دهید. به طور خاص، می توانید دستورات ربات خود را به دستورات اسلش تبدیل کنید، که بهترین تمرین برای Discord.js نسخه 13 است.

هنگام ایجاد ربات‌های Discord، همیشه باید شرایط سرویس Discord API را در نظر داشته باشید که نشان می‌دهد توسعه‌دهندگان چگونه باید از Discord API استفاده کنند. اگر می‌خواهید درباره Node.js بیشتر بدانید، نحوه کدنویسی در سری Node.js را بررسی کنید.

 


https://vpsgol.net/product/vps-germany/

https://vpsgol.net/product/vps-usa/

https://vpsgol.net/product/vps-france/

https://vpsgol.net/product/vps-canada/

https://vpsgol.net/product/vps-poland/

https://vpsgol.net/product/vps-netherlands/

https://vpsgol.net/product/vps-england/