مقدمة
ديسكورد هو تطبيق دردشة يتيح لملايين المستخدمين حول العالم التواصل عبر الرسائل النصية والصوتية في مجتمعات تُعرف باسم الخوادم. كما يوفر ديسكورد واجهة برمجة تطبيقات (API) شاملة تُمكّن المطورين من إنشاء روبوتات ديسكورد قوية. تستطيع هذه الروبوتات تنفيذ مهام متنوعة، مثل إرسال الرسائل إلى الخوادم، ومراسلة المستخدمين، وإدارة الخوادم، وتشغيل الصوت في المحادثات الصوتية. يتيح ذلك للمطورين إنشاء روبوتات قوية بميزات متقدمة ومعقدة، مثل أدوات الإدارة أو الألعاب. على سبيل المثال، يخدم روبوت Dyno Tool ملايين المجتمعات، ويتميز بميزات مفيدة مثل الحماية من الرسائل المزعجة، ومشغل موسيقى، ووظائف أخرى مفيدة. سيُمكّنك تعلم إنشاء روبوتات ديسكورد من تطبيق مجموعة واسعة من الميزات التي يتفاعل معها آلاف الأشخاص يوميًا.
في هذا الدرس، ستُنشئ روبوتًا لمنصة ديسكورد من الصفر باستخدام Node.js ومكتبة Discord.js، مما يسمح للمستخدمين بالتفاعل مباشرةً مع واجهة برمجة تطبيقات ديسكورد. ستُنشئ ملفًا تعريفيًا للروبوت، وتحصل على رموز المصادقة الخاصة به، وتُبرمجه لمعالجة الأوامر التي تتضمن وسائط المستخدم.
المتطلبات الأساسية
قبل أن تبدأ، ستحتاج إلى:
- تم تثبيت Node.js على جهاز التطوير الخاص بك.
- أي محرر نصوص من اختيارك، مثل Visual Studio Code أو Atom أو Sublime أو Nano.
- حساب ديسكورد مجاني مع حساب بريد إلكتروني موثق وخادم ديسكورد مجاني ستستخدمه لاختبار روبوت ديسكورد الخاص بك.
الخطوة 1 - إعداد بوت ديسكورد
في هذه الخطوة، ستستخدم واجهة المستخدم الرسومية لمطوري Discord لتشغيل روبوت Discord والحصول على رمز الروبوت، والذي تقوم بتمريره إلى تطبيقك.
لتسجيل بوت على منصة ديسكورد، استخدم لوحة تحكم تطبيق ديسكورد. من هنا يمكن للمطورين إنشاء تطبيقات ديسكورد، بما في ذلك بوتات ديسكورد.
للبدء، انقر على "تطبيق جديد". سيطلب منك ديسكورد إدخال اسم لتطبيقك الجديد. ثم انقر على "إنشاء" لإنشاء التطبيق.
ملاحظة: اسم تطبيقك مستقل عن اسم الروبوت، وليس بالضرورة أن يكون اسم الروبوت هو اسم التطبيق.
افتح الآن لوحة تحكم تطبيقك. لإضافة روبوت إلى تطبيقك، انتقل إلى علامة تبويب "الروبوت" في شريط التنقل الأيسر.
انقر على زر "إضافة بوت" لإضافة بوت إلى التطبيق. انقر على "نعم، نفّذ!" عند طلب التأكيد. سيتم نقلك بعد ذلك إلى لوحة تحكم تحتوي على تفاصيل اسم البوت، ورمز المصادقة، وصورة ملفك الشخصي.
يمكنك تغيير اسم البوت أو صورة ملفه الشخصي هنا في لوحة التحكم. ستحتاج أيضًا إلى نسخ رمز مصادقة البوت بالنقر على "انقر للكشف عن الرمز" ونسخ الرمز الذي يظهر.
تحذير: لا تقم أبدًا بمشاركة أو تحميل رمز البوت الخاص بك لأنه يسمح لأي شخص بتسجيل الدخول إلى البوت الخاص بك.
الآن، عليك إنشاء دعوة لإضافة البوت إلى مجتمع ديسكورد لاختباره. أولًا، انتقل إلى صفحة مُنشئ الروابط ضمن علامة تبويب OAuth2 في لوحة تحكم التطبيق. لإنشاء دعوة، مرّر لأسفل واختر البوت ضمن "النطاقات". ستحتاج أيضًا إلى تحديد الأذونات للتحكم في الإجراءات التي يمكن للبوت اتخاذها في المجتمعات. في هذا الشرح، اختر "مسؤول"، ما يسمح للبوت بتنفيذ جميع الإجراءات تقريبًا في المجموعة. انسخ الرابط باستخدام زر "نسخ".
ثم أضف البوت إلى الخادم. اتبع رابط الدعوة الذي أنشأته. يمكنك إضافة البوت إلى أي خادم تملكه، أو لديك صلاحيات إدارية عليه من القائمة المنسدلة.
انقر الآن على "متابعة". تأكد من تحديد المربع المجاور لـ "مسؤول" - سيمنح هذا البوت صلاحيات المسؤول. ثم انقر على "تخويل". سيطلب منك ديسكورد حلّ اختبار CAPTCHA قبل أن يتمكن البوت من الانضمام إلى الخادم. ستجد الآن بوت ديسكورد غير متصل بالإنترنت في قائمة أعضاء الخادم الذي أضفته إليه.
لقد أنشأتَ بنجاح روبوتًا على ديسكورد وأضفته إلى خادم. الآن، ستكتب برنامجًا لتسجيل الدخول إلى الروبوت.
الخطوة الثانية - أنشئ مشروعك
في هذه الخطوة، تقوم بإعداد بيئة البرمجة الأولية حيث تقوم ببناء الروبوت الخاص بك والدخول إلى الروبوت برمجيًا.
أولاً، تحتاج إلى إعداد مجلد المشروع وملفات المشروع اللازمة للروبوت.
أنشئ مجلد مشروعك:
mkdir discord-bot
انتقل إلى مجلد المشروع الذي أنشأته:
cd discord-bot
بعد ذلك، استخدم محرر النصوص لإنشاء ملف باسم config.json لتخزين كلمة مرور المصادقة الخاصة بالبوت الخاص بك:
nano config.json
ثم أضف الكود التالي إلى ملف الإعدادات واستبدل النص المميز برمز مصادقة البوت الخاص بك:
{
"BOT_TOKEN": "YOUR BOT TOKEN"
}
احفظ الملف ثم اخرج.
بعد ذلك، ستقوم بإنشاء ملف package.json الذي يخزن تفاصيل مشروعك ومعلومات حول التبعيات التي تستخدمها فيه. يمكنك إنشاء ملف package.json بتشغيل أمر npm التالي:
npm init
سيطلب منك npm تقديم تفاصيل مختلفة حول مشروعك.
الآن ستقوم بتثبيت حزمة discord.js التي ستستخدمها للتفاعل مع واجهة برمجة تطبيقات Discord. يمكنك تثبيت 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 (Discord API) وكيفية تلقي Discord إشعارات بالأحداث، مثل الرسائل الجديدة. يُمثل العميل في الواقع روبوت Discord. يُحدد الكائن المُمرر إلى مُنشئ العميل نوايا البوابة الخاصة بروبوتك، والتي تُحدد أحداث WebSocket التي سيستمع إليها. هنا، قمت بتحديد GUILDS و GUILD_MESSAGES حتى يتمكن الروبوت من استقبال أحداث الرسائل في المنتديات.
يستخدم السطر الثاني من التعليمات البرمجية طريقة تسجيل الدخول من جانب العميل لتسجيل الدخول إلى بوت ديسكورد الذي أنشأته، باستخدام كلمة المرور الموجودة في ملف config.json. يُتيح الرمز المميز لواجهة برمجة تطبيقات ديسكورد معرفة البوت الذي يُخصصه التطبيق، والتأكد من أنك مُصادقٌ لاستخدام البوت.
الآن قم بتشغيل ملف index.js باستخدام Node:
node index.js
سيتغير وضع البوت الخاص بك إلى متصل على خادم Discord الذي أضفته إليه.
لقد نجحت في إعداد بيئة البرمجة وإنشاء الكود الأساسي لتسجيل الدخول إلى بوت ديسكورد الخاص بك. الآن، ستتعامل مع أوامر المستخدم وتجعل البوت يقوم بمهام مثل إرسال الرسائل.
الخطوة 3 - معالجة الأمر الأول للمستخدم
في هذه الخطوة، تقوم بإنشاء روبوت قادر على التعامل مع أوامر المستخدم. تقوم بتنفيذ أول أمر "ping" الذي يستجيب برسالة "ping" والوقت المستغرق للاستجابة للأمر.
أولًا، عليك رصد واستقبال الرسائل التي يرسلها المستخدمون لتتمكن من معالجة أي أوامر. باستخدام دالة `on` في تطبيق ديسكورد، سيرسل لك ديسكورد إشعارًا بالأحداث الجديدة. تأخذ دالة `on` وسيطين: اسم الحدث المراد انتظاره، ودالة تُنفَّذ عند وقوع هذا الحدث. باستخدام هذه الدالة، يمكنك انتظار رسالة الحدث - يحدث هذا في كل مرة تُرسَل فيها رسالة إلى منتدى يملك البوت صلاحية عرض الرسائل فيه. لذا، ستُنشئ دالة تُنفَّذ عند كل رسالة تُرسَل لمعالجة الأوامر.
أولاً، افتح ملفك:
nano index.js
أضف الكود التالي إلى ملفك:
...
const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]});
client.on("messageCreate", function(message) {
});
client.login(config.BOT_TOKEN);تستقبل هذه الدالة، التي تعمل عند حدث إنشاء الرسالة، الرسالة كمعامل. ستكون الرسالة عبارة عن نسخة من رسالة Discord.js تحتوي على معلومات حول الرسالة المرسلة وطرق لمساعدة البوت على الرد.
أضف الآن سطر التعليمات البرمجية التالي إلى دالة التحكم في الأوامر الخاصة بك:
...
client.on("messageCreate", function(message) {
if (message.author.bot) return;
});
...يتحقق هذا السطر مما إذا كان مُرسِل الرسالة برنامجًا آليًا (بوت)، وإذا كان كذلك، فإنه يُوقف معالجة الأمر. وهذا مهم لأنه، بشكل عام، لا يُنصح بمعالجة رسائل البرامج الآلية أو الرد عليها. عادةً لا تحتاج البرامج الآلية إلى استخدام معلومات من برامج آلية أخرى، لذا فإن تجاهل رسائلها يُوفر طاقة المعالجة ويمنع الردود العشوائية.
الآن ستكتب أمرًا للتحكم. وللقيام بذلك، من الأفضل فهم الصيغة النموذجية لأمر ديسكورد. عادةً، يتكون هيكل أمر ديسكورد من ثلاثة أجزاء بهذا الترتيب: بادئة، واسم الأمر، و(أحيانًا) وسائط الأمر.
- البادئة: يمكن أن تكون البادئة أي شيء، ولكنها عادةً ما تكون علامة ترقيم أو عبارة مجردة لا تأتي عادةً في بداية الرسالة. هذا يعني أنه عند إدخال البادئة في بداية الرسالة، يفهم البوت أن هذا الأمر مُعدّ للتنفيذ بواسطة بوت.
- اسم الأمر: اسم الأمر الذي يرغب المستخدم في استخدامه. هذا يعني أن البوت يدعم أوامر متعددة ذات وظائف مختلفة، ويتيح للمستخدمين الاختيار بينها من خلال تحديد اسم أمر مختلف.
- الوسائط: في بعض الأحيان، إذا كان الأمر يتطلب أو يستخدم معلومات إضافية من المستخدم، فيمكن للمستخدم تقديم وسائط بعد اسم الأمر، مع فصل كل وسيط بمسافة.
ملاحظة: لا يوجد هيكل أوامر إلزامي ويمكن للروبوتات معالجة الأوامر بالطريقة التي تريدها، ولكن الهيكل المعروض هنا هو هيكل عملي تستخدمه الغالبية العظمى من الروبوتات.
لبدء إنشاء محلل أوامر يتعامل مع هذا التنسيق، أضف أسطر التعليمات البرمجية التالية إلى دالة معالجة الرسائل:
...
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.
يقوم السطر الثالث بإزالة العنصر الأول من مصفوفة الوسائط (والذي سيكون اسم الأمر المُقدَّم)، ثم يحوّله إلى أحرف صغيرة، ويُسنده إلى الثابت command. هذا يسمح لك بعزل اسم الأمر والاحتفاظ بالوسائط فقط في المصفوفة. كما تستخدم دالة toLowerCase لأن الأوامر عادةً لا تُفرِّق بين الأحرف الكبيرة والصغيرة في روبوتات ديسكورد.
لقد انتهيت من بناء محلل الأوامر، وتطبيق البادئة المطلوبة، واسترجاع اسم الأمر وأي وسائط من الرسائل. الآن ستقوم بتنفيذ وإنشاء الكود لأوامر محددة.
لبدء تنفيذ أمر 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" لحساب الفرق بالمللي ثانية بين الوقت الحالي - الذي يتم الحصول عليه باستخدام الطريقة الجديدة على كائن التاريخ - والطابع الزمني للرسالة التي تم إنشاؤها. يحسب هذا الإجراء الوقت المستغرق لمعالجة الرسالة وإرسال إشارة "ping" إلى البوت.
يستجيب السطر الثاني لأمر المستخدم باستخدام دالة الرد الموجودة في ثابت الرسالة. تقوم دالة الرد بإرسال إشارة إلى المستخدم الذي نفّذ الأمر (مما يُعلم المستخدم ويُبرز الرسالة الخاصة به)، متبوعةً بالمحتوى المُقدّم كمعامل أول للدالة. يجب عليك تقديم نمط حرفي يحتوي على رسالة وإشارة ping المحسوبة كاستجابة ستستخدمها دالة الرد.
هذا ينهي تنفيذ أمر "ping".
قم بتشغيل برنامج الروبوت الخاص بك باستخدام الأمر التالي (في نفس مجلد index.js):
node index.js
يمكنك الآن استخدام الأمر "!ping" على أي قناة يمكن للروبوت رؤيتها وإرسال الرسائل إليها، والحصول على رد نتيجة لذلك.
لقد نجحت في إنشاء روبوت قادر على التعامل مع أوامر المستخدم، ونفّذت أمرك الأول. الآن، ستواصل تطوير الروبوت الخاص بك من خلال تنفيذ أمر الجمع.
الخطوة 4 - تنفيذ أمر الجمع
الآن ستُوسّع برنامجك بتشغيل الأمر "!sum". يأخذ هذا الأمر أي عدد من الوسائط ويجمعها معًا، ثم يُعيد مجموع جميع الوسائط إلى المستخدم.
إذا كان برنامج Discord الخاص بك لا يزال قيد التشغيل، يمكنك إيقاف العملية باستخدام CTRL + C.
أعد فتح ملف index.js الخاص بك:
nano index.js
تستخدم كتلة "else-if" لبدء تنفيذ الأمر "!sum". بعد التحقق من اسم الأمر "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}!`);
}
...تستخدم دالة map على قائمة الوسائط لإنشاء قائمة جديدة باستخدام دالة parseFloat على كل عنصر في مصفوفة args. ينتج عن ذلك مصفوفة جديدة (مُسندة إلى الثابت numArgs) حيث تكون جميع العناصر أرقامًا بدلًا من سلاسل نصية. هذا يعني أنه يمكنك لاحقًا إيجاد مجموع الأرقام بسهولة عن طريق جمعها معًا.
يستخدم السطر الثاني دالة reduce على الثابت numArgs، والتي توفر دالة تجمع جميع عناصر القائمة. ثم تُسند مجموع جميع عناصر numArgs إلى الثابت sum.
ثم تستخدم طريقة الرد على كائن الرسالة للرد على أمر المستخدم بنمط فعلي، والذي يتضمن مجموع جميع الوسائط التي يرسلها المستخدم إلى الروبوت.
بهذا ينتهي تنفيذ أمر "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 الخاص بك عن طريق تشغيل أمر الجمع.
نتيجة
لقد نجحت في إنشاء بوت ديسكورد قادر على التعامل مع العديد من أوامر المستخدمين ومعاملات الأوامر المختلفة. إذا كنت ترغب في تطوير بوتك، يمكنك تشغيل المزيد من الأوامر أو تجربة المزيد من أجزاء واجهة برمجة تطبيقات ديسكورد لبناء بوت ديسكورد أكثر قوة.




















