ساخت ربات Discord با Node.js

?How To Build a Discord Bot with Node.js

13 بهمن 1400
How-To-Build-a-Discord-Bot-with-Nodejs

Discord یک برنامه چت است که به میلیون ها کاربر در سراسر جهان امکان می دهد در جوامعی به نام سرورها به صورت آنلاین پیام و چت صوتی داشته باشند. Discord همچنین یک API گسترده ارائه می دهد که توسعه دهندگان می توانند از آن برای ساخت ربات های قدرتمند Discord استفاده کنند.

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

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

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

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

سپس روی Create کلیک کنید تا اپلیکیشن ایجاد شود.

توجه: نام برنامه شما مستقل از نام ربات است و لازم نیست ربات هم نام برنامه باشد.

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

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

اگر پیام زیر را دریافت کردید باید یک نام دیگر برای ربات استفاده کنید:

اگر درخواست با موفقیت تایید شود پیام زیر را دریافت می کنید:

می توانید نام ربات یا تصویر پروفایل خود را در اینجا در داشبورد تغییر دهید. همچنین با کلیک کردن بر روی دکمه Click to Reveal Token توکن ربات ظاهر می‌شود، می توانید آن را کپی کنید.

هشدار: هرگز توکن ربات خود را به اشتراک نگذارید یا آپلود نکنید زیرا به هر کسی اجازه می دهد وارد ربات شما شود.

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

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

اکنون روی Continue کلیک کنید. سپس روی Authorize کلیک کنید. Discord از شما می خواهد که قبل از پیوستن ربات به سرور، یک CAPTCHA را حل کنید. اکنون ربات 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 استفاده خواهیم کرد، از طریق npm نصب کنید:

npm install discord.js

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

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

nano index.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);

در اینجا GUILDS و GUILD_MESSAGES را مشخص کرده‌ایم تا ربات بتواند رویدادهای پیام را در سرور ها دریافت کند.

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

node index.js

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

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

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

در این مرحله رباتی ایجاد می کنیم که می تواند دستورات کاربر را مدیریت کند.

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

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

کد برنامه خود را به کد زیر تغییر بدهید

const Discord = require("discord.js");
const config = require("./config.json");
const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]});


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

client.login(config.BOT_TOKEN);

این تابع که روی رویداد messageCreate اجرا می شود، پیام را به عنوان پارامتر می گیرد.

اکنون خط کد زیر را به تابع client.on خود اضافه کنید:

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();
});
...

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

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

خط سوم اولین عنصر را از آرایه 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" را اضافه کردیم که تفاوت بین زمان فعلی - که با استفاده از روش now در شیء Date یافت می شود - و مهر زمانی که پیام ایجاد شده را در میلی ثانیه محاسبه می کند. این محاسبه مدت زمان پردازش پیام و "پینگ" ربات را محاسبه می کند.

مرحله 4 - اجرای دستور Sum

اکنون با اجرای دستور "sum!" برنامه خود را گسترش خواهیم داد. این دستور قبل از بازگرداندن مجموع همه آرگومان ها به کاربر، هر تعداد آرگومان را می گیرد و آنها را با هم جمع می کند.

دستورات زیر را به کد خود اضافه کنید

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}!`);
}

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

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

کد زیر کد کامل برنامه است

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);

امید وارم این آموزش مفید بوده باشد.


منبع: وب سایت digitalocean

نویسنده شوید

دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.