بناء بوت الخلاف باستخدام Discord.js

نشرت: 2022-03-10
ملخص سريع ↬ مقدمة لبناء روبوت Discord باستخدام وحدة Discord.js. سيشارك الروبوت النكات العشوائية ، ويعين أو يلغي أدوار المستخدم ، وينشر تغريدات لحساب معين على قناة ديسكورد.

تزداد شعبية منصات التواصل الجماعي يومًا بعد يوم ، حيث يعمل المزيد والمزيد من الأشخاص من المنزل. Slack و Discord هما من أكثر منصات التواصل الجماعي شيوعًا. بينما يركز Discord على اللاعبين ، فإن بعض الوظائف ، مثل القدرة على إضافة ما يصل إلى 50 عضوًا في غرفة المكالمات الصوتية ، تجعله بديلاً ممتازًا لـ Slack. تتمثل إحدى أهم مزايا استخدام مثل هذه المنصة في إمكانية أتمتة العديد من المهام باستخدام برامج الروبوت.

في هذه المقالة ، سننشئ روبوتًا من البداية باستخدام JavaScript وبمساعدة من Discord.js. سنغطي العملية من إنشاء الروبوت إلى نشره على السحابة. قبل إنشاء الروبوت الخاص بنا ، دعنا نكتب الوظائف التي سيشغلها الروبوت لدينا:

  • شارك نكت عشوائية من مجموعة من النكات.
  • قم بإضافة وإزالة أدوار المستخدم عن طريق تحديد الرموز التعبيرية.
  • مشاركة التغريدات من حساب معين إلى قناة معينة.

نظرًا لأن الوحدة النمطية Discord.js تستند إلى Node.js ، فسأفترض أنك معتاد إلى حد ما على Node.js و npm. الإلمام بجافا سكريبت أمر لا بد منه لهذه المقالة.

الآن بعد أن عرفنا المتطلبات الأساسية وهدفنا ، فلنبدأ. وإذا كنت ترغب في استنساخ الشفرة واستكشافها على الفور ، فيمكنك ذلك باستخدام مستودع GitHub.

الخطوات لمتابعة

سنقوم ببناء الروبوت باتباع بعض الخطوات.

أولاً ، سنقوم ببناء خادم Discord . يشبه خادم Discord مجموعة يمكنك من خلالها تخصيص مواضيع مختلفة لقنوات مختلفة ، تشبه إلى حد بعيد خادم Slack. يتمثل الاختلاف الرئيسي بين Slack و Discord في أن Slack يتطلب بيانات اعتماد تسجيل دخول مختلفة للوصول إلى خوادم مختلفة ، بينما في Discord يمكنك الوصول إلى جميع الخوادم التي تكون جزءًا منها بمصادقة واحدة.

سبب حاجتنا إلى إنشاء خادم هو أنه بدون امتيازات المسؤول للخادم ، لن نتمكن من إضافة روبوت إلى الخادم. بمجرد إنشاء خادمنا ، سنضيف الروبوت إلى الخادم ونحصل على رمز الوصول من بوابة مطوري Discord. يتيح لنا هذا الرمز المميز الاتصال بواجهة برمجة تطبيقات Discord. يوفر Discord واجهة برمجة تطبيقات رسمية مفتوحة لنا للتفاعل معها. يمكن استخدام واجهة برمجة التطبيقات لأي شيء بدءًا من تقديم طلبات برامج الروبوت إلى دمج OAuth. تدعم واجهة برمجة التطبيقات كل شيء بدءًا من روبوت الخادم الفردي وصولاً إلى الروبوت الذي يمكن دمجه في مئات الخوادم. إنه قوي للغاية ويمكن تنفيذه بعدة طرق.

ستساعدنا مكتبة Discord.js على التواصل مع واجهة برمجة تطبيقات Discord باستخدام رمز الوصول . ستستند جميع الوظائف إلى Discord API. بعد ذلك ، يمكننا البدء في برمجة الروبوت الخاص بنا. سنبدأ بكتابة أجزاء صغيرة من التعليمات البرمجية التي ستعرفنا على Discord API ومكتبة Discord.js. سوف نفهم بعد ذلك مفهوم الجزئيات في Discord.js. بمجرد أن نفهم الجزئيات ، سنضيف ما يعرف بنظام "دور رد الفعل" إلى الروبوت. بعد ذلك ، سنعرف أيضًا كيفية التواصل مع Twitter باستخدام حزمة twit تسمى twit. ستساعدنا حزمة npm هذه على دمج وظيفة إعادة توجيه التغريدات على Twitter. أخيرًا ، سنقوم بنشره على السحابة باستخدام Heroku.

الآن بعد أن عرفنا كيف سنبني الروبوت الخاص بنا ، فلنبدأ العمل عليه.

المزيد بعد القفز! أكمل القراءة أدناه ↓

بناء خادم الخلاف

أول شيء يتعين علينا القيام به هو إنشاء خادم Discord . بدون خادم بامتيازات المسؤول ، لن نتمكن من دمج الروبوت.

يعد إنشاء خادم Discord أمرًا سهلاً ، ويوفر Discord الآن قوالب تجعل الأمر أكثر سهولة. اتبع الخطوات أدناه ، وسيكون خادم Discord جاهزًا. أولاً ، سنختار كيف سنصل إلى بوابة Discord. يمكننا استخدام إما إصدار الويب أو التطبيق. كلاهما يعمل بنفس الطريقة. سنستخدم إصدار الويب لهذا البرنامج التعليمي.

إذا كنت تقرأ هذا المقال ، فسأفترض أن لديك بالفعل حساب Discord. إذا لم يكن الأمر كذلك ، فقم فقط بإنشاء حساب كما تفعل في أي موقع ويب آخر. انقر فوق الزر "تسجيل الدخول" في الجزء العلوي الأيمن ، وقم بتسجيل الدخول إذا كان لديك حساب ، أو انقر فوق الزر "تسجيل". املأ النموذج البسيط ، وأكمل كلمة التحقق ، وستكون قد أنشأت حسابًا بنجاح. بعد فتح تطبيق Discord أو موقع الويب ، انقر فوق رمز علامة الجمع على الجانب الأيسر ، حيث توجد قائمة الخادم. عند النقر فوقه ، سيُطلب منك اختيار قالب أو إنشاء قالب خاص بك.

إنشاء خادم من قالب أو من البداية في Discord
إنشاء خادم في Discord (معاينة كبيرة)

سنختار خيار "إنشاء خاصتي". دعنا نتخطى السؤال التالي. سوف نطلق على خادم Discord الخاص بنا "مثال محطم". يمكنك أيضًا تقديم صورة للخادم الخاص بك. يؤدي النقر فوق الزر "إنشاء" إلى إنشاء الخادم الخاص بك.

تسجيل الروبوت مع الفتنة

قبل تشفير الروبوت ، نحتاج إلى الحصول على رمز مميز مقدم من Discord . سيؤدي هذا الرمز المميز إلى إنشاء اتصال من الكود الخاص بنا إلى Discord. للحصول على الرمز ، يتعين علينا تسجيل الروبوت الخاص بنا على خادمنا. لتسجيل الروبوت ، يتعين علينا زيارة بوابة مطوري Discord. إذا كنت تقوم ببناء تطبيق Discord لأول مرة ، فستجد قائمة فارغة هناك. لتسجيل تطبيقنا ، انقر على رابط "تطبيق جديد" في الزاوية العلوية اليمنى. أدخل اسمًا للتطبيق الخاص بك ، وانقر فوق الزر "إنشاء". سنطلق على تطبيقنا اسم "Smashing App".

إضافة تطبيق جديد إلى Discord Developer Portal

القائمة الجديدة تعطينا بعض الخيارات. على الجانب الأيمن يوجد خيار يسمى "Bot". انقر فوقه ، وحدد "إضافة بوت". انقر فوق التأكيد ، وقم بتغيير اسم الروبوت إذا كنت تريد ، واحفظ التغييرات ، وانسخ الرمز المميز المستلم من هذه الصفحة. الروبوت الخاص بنا مسجل الآن في Discord. يمكننا البدء في إضافة وظائف وتشفير الروبوت.

بناء الروبوت

ما هو Discord.js؟

يعرّف Discord.js نفسه على النحو التالي:

Discord.js هي وحدة node.js قوية تتيح لك التفاعل مع واجهة برمجة تطبيقات Discord بسهولة بالغة. يتطلب الأمر منهجًا أكثر توجهاً للكائنات مقارنة بمعظم مكتبات JS Discord الأخرى ، مما يجعل كود الروبوت الخاص بك مرتبًا وأسهل في الفهم.

لذلك ، يجعل Discord.js التفاعل مع Discord API أسهل بكثير. لديها تغطية 100 ٪ مع Discord API الرسمية.

جارٍ تهيئة الروبوت

افتح محرر النصوص المفضل لديك ، وأنشئ مجلدًا يتم حفظ جميع ملفاتك فيه. افتح واجهة سطر الأوامر (CLI) ، ثم cd في المجلد ، وقم بتهيئة المجلد باستخدام npm: npm init -y .

سنحتاج إلى حزمتين لبدء بناء الروبوت. الأول هو dotenv ، والثاني ، من الواضح ، هو وحدة Discord.js Node.js. إذا كنت معتادًا على Node.js ، فستكون على دراية بحزمة dotenv. يقوم بتحميل متغيرات البيئة من ملف يسمى .env إلى process.env .

قم بتثبيت هذين باستخدام npm i dotenv discord.js .

بمجرد اكتمال التثبيت ، قم بإنشاء ملفين في المجلد الجذر الخاص بك. اسم أحد الملفات .env . قم بتسمية الملف الرئيسي الآخر بما تريد. سأطلق عليه اسم app.js سيبدو هيكل المجلد كما يلي:

 │ .env │ app.js │ package-lock.json │ package.json └─── node_modules

سنخزن الرموز المميزة والمعلومات الحساسة الأخرى في ملف .env ، ونخزن الكود الذي ينتج عنه النتائج في ملف app.js

افتح ملف .env ، وأنشئ متغيرًا جديدًا. دعنا نسمي المتغير BOT_TOKEN لهذا المثال. الصق الرمز المميز الخاص بك في هذا الملف. سيبدو ملف .env مشابهًا لهذا الآن:

 BOT_TOKEN=ODAxNzE1NTA2Njc1NDQ5ODY3.YAktvw.xxxxxxxxxxxxxxxxxxxxxxxx

يمكننا البدء في العمل على ملف app.js أول شيء يجب فعله هو طلب الوحدات التي قمنا بتثبيتها.

 const Discord = require('discord.js'); require('dotenv').config();

تتم تهيئة وحدة dotenv باستخدام طريقة config() . يمكننا تمرير المعلمات إلى طريقة config() . ولكن نظرًا لأن هذا استخدام بسيط جدًا لوحدة dotenv ، فإننا لا نحتاج إلى أي وظيفة خاصة منها.

لبدء استخدام وحدة Discord.js ، يتعين علينا تهيئة المُنشئ. هذا موضح في الوثائق:

 const client = new Discord.Client();

توفر الوحدة النمطية Discord.js طريقة تسمى client.on . تستمع طريقة client.on إلى أحداث مختلفة. مكتبة Discord.js قائمة على الأحداث ، مما يعني أنه في كل مرة يتم فيها إصدار حدث من Discord ، سيتم استدعاء الوظيفة المرتبطة بهذا الحدث.

الحدث الأول الذي سنستمع إليه هو الحدث ready . ستنطلق هذه الطريقة عندما يكون الاتصال بواجهة برمجة تطبيقات Discord جاهزًا. في هذه الطريقة ، يمكننا تمرير الوظائف التي سيتم تنفيذها عند إنشاء اتصال بين Discord API وتطبيقنا. دعنا نمرر تعليمة console.log في هذه الطريقة ، حتى نتمكن من معرفة ما إذا كان قد تم إنشاء اتصال أم لا. client.on مع الحدث ready كما يلي:

 client.on('ready', () => { console.log('Bot is ready'); });

لكن هذا لن يؤسس اتصالاً بواجهة برمجة التطبيقات لأننا لم نسجل الدخول إلى الروبوت باستخدام خادم Discord. لتمكين هذا ، توفر الوحدة النمطية Discord.js طريقة login . باستخدام طريقة login المتاحة على العميل وتمرير الرمز المميز بهذه الطريقة ، يمكننا تسجيل الدخول إلى التطبيق باستخدام خادم Discord.

 client.login(process.env.BOT_TOKEN)

إذا قمت بتشغيل التطبيق الآن - باستخدام node app.js أو ، إذا كنت تستخدم nodemon ، ثم باستخدام nodemon app.js - فستتمكن من رؤية رسالة وحدة التحكم التي حددتها. نجح برنامج الروبوت لدينا في تسجيل الدخول باستخدام خادم Discord الآن. يمكننا البدء في تجربة بعض الوظائف.

لنبدأ بالحصول على بعض محتوى الرسالة اعتمادًا على الكود.

حدث message

حدث message يستمع لبعض الرسائل. باستخدام طريقة reply ، يمكننا برمجة الروبوت للرد وفقًا لرسالة المستخدم.

 client.on('message', (msg) => { if (msg.content === 'Hello') msg.reply('Hi'); });

سيتم الرد على هذا الرمز النموذجي بعبارة "مرحبًا" عندما يتم تلقي رسالة "مرحبًا". ولكن من أجل إنجاح هذا الأمر ، يتعين علينا توصيل الروبوت بخادم.

توصيل الروبوت بخادم الفتنة

حتى هذه النقطة ، الروبوت غير متصل بأي خادم. للاتصال بخادمنا ( مثال Smashing ) ، قم بزيارة بوابة مطور Discord. انقر فوق اسم التطبيق الذي أنشأناه سابقًا في هذا البرنامج التعليمي (في حالتنا ، "Smashing App"). حدد التطبيق ، وانقر على خيار "OAuth2" في القائمة. ستجد مجموعة تسمى "نطاقات". حدد خانة الاختيار "bot" ، وانسخ عنوان URL الذي تم إنشاؤه.

ربط الروبوت بخادم Discord
OAuth لـ bot (معاينة كبيرة)

قم بزيارة عنوان URL هذا في علامة تبويب جديدة ، واختر الخادم الخاص بك ، وانقر فوق "تفويض". أكمل الكابتشا ، وسيتصل الروبوت لدينا الآن بالخادم الذي اخترناه.

إذا قمت بزيارة خادم Discord الآن ، فسترى أنه تم إرسال إشعار بالفعل بواسطة Discord ، ويظهر الروبوت الآن أيضًا في قائمة الأعضاء على الجانب الأيمن.

إضافة وظائف إلى الروبوت

الآن بعد أن أصبح الروبوت الخاص بنا متصلاً بالخادم ، إذا قمت بإرسال "Hello" إلى الخادم ، فسوف يرد الروبوت بـ "Hi". هذه مجرد مقدمة لـ Discord API. المتعة الحقيقية على وشك أن تبدأ.

لكي نتعرف أكثر على وحدة Discord.js ، دعنا نضيف وظيفة ترسل نكتة كلما تم تلقي أمر معين. هذا مشابه لما قمنا به للتو.

إضافة وظيفة مزحة عشوائية إلى الروبوت

لجعل هذا الجزء أكثر وضوحًا وسهولة في الفهم ، لن نستخدم أي واجهات برمجة تطبيقات. النكات التي سيعود بها الروبوت الخاص بنا ستكون عبارة عن مصفوفة بسيطة. سيتم إنشاء رقم عشوائي في كل مرة داخل نطاق المصفوفة ، وسيتم الوصول إلى هذا الموقع المحدد للمصفوفة لإرجاع نكتة.

في حالة استخدامك للوظائف التي يوفرها الروبوت في Discord ، ربما لاحظت أن بعض الأحرف الخاصة تميز الرسائل العادية عن الأوامر الخاصة. سأستخدم ? أمام أوامرنا لجعلها تبدو مختلفة عن الرسائل العادية. لذا ، فإن أمر النكتة لدينا سيكون ?joke .

سننشئ مصفوفة تسمى jokes في ملف app.js بنا. الطريقة التي نحصل بها على نكتة عشوائية من المصفوفة هي باستخدام هذه الصيغة:

 jokes[Math.floor(Math.random() * jokes.length)]

ستُنشئ صيغة Math.random() * jokes.length رقمًا عشوائيًا ضمن نطاق المصفوفة. ستعمل طريقة Math.floor على تحديد الرقم الذي تم إنشاؤه.

إذا كنت console.log console.log() هذا ، Math.floor(Math.random() * jokes.length) ، ستحصل على فهم أفضل. أخيرًا ، ستعطينا jokes[] نكتة عشوائية من مجموعة jokes .

ربما لاحظت أنه تم استخدام رمزنا الأول للرد على رسالتنا. لكننا لا نريد الحصول على رد هنا. بدلاً من ذلك ، نريد أن نحصل على نكتة كرسالة ، دون وضع علامة على أي شخص. لهذا ، تحتوي الوحدة النمطية Discord.js على طريقة تسمى channel.send() . باستخدام هذه الطريقة ، يمكننا إرسال رسائل إلى القناة التي تم استدعاء الأمر فيها. لذا ، فإن الكود الكامل حتى هذه النقطة يبدو كما يلي:

 const Discord = require('discord.js'); require('dotenv').config(); const client = new Discord.Client(); client.login(process.env.BOT_TOKEN); client.on('ready', () => console.log('The Bot is ready!')); // Adding jokes function // Jokes from dcslsoftware.com/20-one-liners-only-software-developers-understand/ // www.journaldev.com/240/my-25-favorite-programming-quotes-that-are-funny-too const jokes = [ 'I went to a street where the houses were numbered 8k, 16k, 32k, 64k, 128k, 256k and 512k. It was a trip down Memory Lane.', '“Debugging” is like being the detective in a crime drama where you are also the murderer.', 'The best thing about a Boolean is that even if you are wrong, you are only off by a bit.', 'A programmer puts two glasses on his bedside table before going to sleep. A full one, in case he gets thirsty, and an empty one, in case he doesn't.', 'If you listen to a UNIX shell, can you hear the C?', 'Why do Java programmers have to wear glasses? Because they don't C#.', 'What sits on your shoulder and says “Pieces of 7! Pieces of 7!”? A Parroty Error.', 'When Apple employees die, does their life HTML5 in front of their eyes?', 'Without requirements or design, programming is the art of adding bugs to an empty text file.', 'Before software can be reusable it first has to be usable.', 'The best method for accelerating a computer is the one that boosts it by 9.8 m/s2.', 'I think Microsoft named .Net so it wouldn't show up in a Unix directory listing.', 'There are two ways to write error-free programs; only the third one works.', ]; client.on('message', (msg) => { if (msg.content === '?joke') { msg.channel.send(jokes[Math.floor(Math.random() * jokes.length)]); } });

لقد قمت بإزالة جزء "Hello" / "Hi" من الكود لأن ذلك لم يعد مفيدًا لنا.

الآن بعد أن أصبح لديك فهم أساسي لوحدة Discord.js ، دعنا نتعمق أكثر. لكن يمكن للوحدة أن تفعل الكثير - على سبيل المثال ، إضافة أدوار لشخص ما أو حظره أو طرده. في الوقت الحالي ، سنبني نظام دور رد فعل بسيط.

بناء نظام رد الفعل الدور

عندما يستجيب المستخدم برمز تعبيري خاص في رسالة أو قناة معينة ، فسيتم منح المستخدم دورًا مرتبطًا بهذا الرمز التعبيري. سيكون التنفيذ بسيطًا جدًا. لكن قبل بناء نظام دور رد الفعل هذا ، علينا أن نفهم الجزئيات.

جزئيات

الجزئي هو مفهوم Discord.js. عادةً ما يخزن Discord.js جميع الرسائل مؤقتًا ، مما يعني أنه يخزن الرسائل في مجموعة. عندما تتلقى رسالة مخبأة بعض الأحداث ، مثل تلقي رسالة أو رد ، يتم إرسال حدث. لكن الرسائل المرسلة قبل بدء الروبوت غير مخزنة مؤقتًا. لذلك ، لن يؤدي الرد على مثل هذه الحالات إلى إصدار أي حدث ، ما لم نحضرها قبل استخدامها. يقدم الإصدار 12 من مكتبة Discord.js مفهوم الجزئيات. إذا أردنا التقاط مثل هذه الأحداث غير المخزنة ، فعلينا الاشتراك في الجزئيات. تحتوي المكتبة على خمسة أنواع من الجزئيات:

  1. USER
  2. CHANNEL
  3. GUILD_MEMBER
  4. MESSAGE
  5. REACTION

في حالتنا ، سنحتاج فقط إلى ثلاثة أنواع من الجزئيات:

  • USER ، الشخص الذي يتفاعل ؛
  • MESSAGE ، الرسالة التي يتم الرد عليها ؛
  • REACTION الفعل ، رد الفعل الذي يعطيه المستخدم للرسالة.

الوثائق لديها المزيد عن الأجزاء.

توفر مكتبة Discord.js طريقة سهلة للغاية لاستخدام الجزئيات. نحتاج فقط إلى إضافة سطر واحد من التعليمات البرمجية ، لتمرير كائن في Discord.Client() . يبدو المُنشئ الجديد كما يلي:

 const client = new Discord.Client({ partials: ['MESSAGE', 'REACTION', 'CHANNEL'], });

خلق الأدوار على خادم الفتنة

لتمكين نظام دور رد الفعل ، علينا إنشاء بعض الأدوار. الدور الأول الذي سننشئه هو دور الروبوت . لإنشاء دور ، انتقل إلى "إعدادات الخادم":

افتح إعدادات الخادم لإنشاء الأدوار
خيار إعدادات الخادم (معاينة كبيرة)

في إعدادات الخادم ، انتقل إلى خيار "الأدوار" ، وانقر على أيقونة الجمع الصغيرة ( + ) بجانب المكان الذي تقول فيه "الأدوار".

خلق الأدوار في الخلاف
إضافة الأدوار (معاينة كبيرة)

أولاً ، لنقم بإنشاء دور bot ، وتأكد من تحديد خيار "إدارة الأدوار" في قائمة خيارات الدور. بمجرد إنشاء دور bot ، يمكنك إضافة المزيد من الأدوار. لقد أضفت أدوار js و c++ و python . لست مضطرًا لمنحهم أي قدرة خاصة ، لكنه خيار.

هنا ، تذكر شيئًا واحدًا: تعمل أدوار Discord على أساس الأولوية . أي دور له أدوار أدناه يمكنه إدارة الأدوار أدناه ، لكن لا يمكنه إدارة الأدوار أعلاه. نريد أن يقوم دور الروبوت الخاص بنا بإدارة أدوار js و c++ و python . لذا ، تأكد من أن دور bot أعلى من الأدوار الأخرى. ما عليك سوى السحب والإفلات لتغيير ترتيب الأدوار في قائمة "الأدوار" لإعدادات الخادم.

عند الانتهاء من إنشاء الأدوار ، قم بتعيين دور bot إلى الروبوت . لمنح دور ، انقر فوق اسم الروبوت في قائمة الأعضاء على الجانب الأيمن للخادم ، ثم انقر فوق رمز الجمع الصغير ( + ). سيُظهر لك جميع الأدوار المتاحة. حدد دور "الروبوت" هنا ، وستنتهي.

تعيين الأدوار يدويًا
أدوار Assinging (معاينة كبيرة)

تفعيل وضع المطور في الخلاف

لا يمكن استخدام الأدوار التي قمنا بإنشائها بواسطة أسمائهم في التعليمات البرمجية الخاصة بنا. في Discord ، كل شيء من الرسائل إلى الأدوار له معرّف خاص به. إذا قمت بالنقر فوق مؤشر "المزيد" في أي رسالة ، فسترى خيارًا باسم "نسخ المعرف". هذا الخيار متاح لكل شيء في Discord ، بما في ذلك الأدوار.

خيار نسخ المعرف في Discord
نسخ المعرف في Discord (معاينة كبيرة)

على الأرجح ، لن تجد هذا الخيار افتراضيًا. سيكون عليك تنشيط خيار يسمى "وضع المطور". لتنشيطه ، توجه إلى إعدادات Discord (وليس إعدادات الخادم الخاص بك) ، بجوار اسمك في أسفل اليسار. ثم انتقل إلى خيار "المظهر" ضمن "إعدادات التطبيق" ، وقم بتنشيط "وضع المطور" من هنا. الآن ستتمكن من نسخ المعرفات.

messageReactionAdd و messageReactionRemove

الحدث الذي يجب إرساله عند تفاعل الرسالة هو messageReactionAdd . وكلما تمت إزالة أي تفاعل ، يجب إرسال حدث messageReactionRemove .

دعونا نواصل بناء النظام. كما قلت ، نحتاج أولاً إلى الاستماع إلى حدث messageReactionAdd . يأخذ كلا الحدثين messageReactionAdd و messageReactionRemove معلمتين في وظيفة رد الاتصال الخاصة بهما. المعلمة الأولى هي reaction ، والثانية هي user . هذه جميلة لا تحتاج إلى شرح.

ترميز وظيفة دور التفاعل

أولاً ، سننشئ رسالة توضح أي رمز تعبيري سيمنح أي دور ، مثل ما فعلته هنا:

رسالة دور رد الفعل على الخادم
رسالة دور رد الفعل (معاينة كبيرة)

ربما تفكر ، كيف سنستخدم تلك الرموز التعبيرية في كودنا؟ الرموز التعبيرية الافتراضية هي Unicode ، وسيتعين علينا نسخ إصدار Unicode. إذا اتبعت بناء الجملة \:emojiName: على "Enter" ، فستحصل على رمز تعبيري بالاسم. على سبيل المثال ، رمز تعبيري لدور JavaScript هو الثعلب ؛ لذلك ، إذا قمت بكتابة \:fox: على "Enter" في Discord ، فسوف أتلقى رمزًا تعبيريًا للثعلب. وبالمثل ، سأستخدم \:tiger: and \:snake: للحصول على تلك الرموز التعبيرية. احتفظ بها في إعداد Discord الخاص بك ؛ سنحتاجهم لاحقًا.

الحصول على Unicode emoji
الحصول على Unicode emoji (معاينة كبيرة)

هنا هو كود البداية. هذا الجزء من الكود يتحقق ببساطة من بعض حالات الحافة. بمجرد أن نفهم هذه الحالات ، سنطبق منطق نظام دور رد الفعل.

 // Adding reaction-role function client.on('messageReactionAdd', async (reaction, user) => { if (reaction.message.partial) await reaction.message.fetch(); if (reaction.partial) await reaction.fetch(); if (user.bot) return; if (!reaction.message.guild) return; });

نحن نمرر في وظيفة غير متزامنة. في رد الاتصال ، أول شيء نقوم به هو التحقق مما إذا كانت الرسالة جزئية . إذا كان الأمر كذلك ، فسنقوم بإحضاره ، بمعنى تخزينه مؤقتًا أو تخزينه في طريقة خريطة JavaScript. وبالمثل ، فإننا نتحقق مما إذا كان التفاعل نفسه جزئيًا ثم نفعل الشيء نفسه. بعد ذلك ، نتحقق مما إذا كان المستخدم الذي قام بالرد هو روبوت ، لأننا لا نريد تعيين أدوار إلى الروبوت الذي يتفاعل مع رسائلنا. أخيرًا ، نتحقق مما إذا كانت الرسالة موجودة على الخادم. يستخدم Discord.js guild كاسم بديل للخادم. إذا لم تكن الرسالة على الخادم ، فسنوقف الوظيفة.

سيقوم الروبوت الخاص بنا بتعيين الأدوار فقط إذا كانت الرسالة موجودة في قناة roles . إذا نقرت بزر الماوس الأيمن على قناة roles ، فسترى خيار "نسخ المعرف". انسخ الهوية وتابعها.

 if (reaction.message.channel.id == '802209416685944862') { if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.add('802208163776167977'); } if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.add('802208242696192040'); } if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.add('802208314766524526'); } } else return;

أعلاه هو ما تبقى من رمز في رد الاتصال. نحن نستخدم الخاصية reaction.message.channel.id للحصول على معرف القناة. بعد ذلك ، نقوم بمقارنتها بمعرف قناة الأدوار الذي قمنا بنسخه للتو. إذا كان هذا صحيحًا ، فإننا نتحقق من الرموز التعبيرية ونقارنها بردود الفعل. يُرجع reaction.emoji.name الرموز التعبيرية التي تم استخدامها للتفاعل. نحن نقارنه بإصدار Unicode الخاص بنا من الرموز التعبيرية. إذا كانت متطابقة ، فإننا ننتظر الخاصية reaction.message.guild.members.cache .

ذاكرة التخزين المؤقت هي مجموعة تخزن البيانات . هذه المجموعات عبارة عن Map JavaScript مع أدوات مساعدة إضافية. إحدى الأدوات المساعدة التي يوفرها هي طريقة get . للحصول على أي شيء عن طريق المعرف ، يمكننا ببساطة تمرير المعرف بهذه الطريقة. لذلك ، نجتاز user.id في طريقة get للحصول على المستخدم. أخيرًا ، تضيف طريقة roles.add الدور إلى المستخدم. في طريقة roles.add ، نقوم بتمرير معرف الدور. يمكنك العثور على معرّف الدور في خيار "الدور" لإعداد الخادم. يمنحك النقر بزر الماوس الأيمن على الدور خيار نسخ معرّف الدور. وقد انتهينا من إضافة نظام دور التفاعل إلى الروبوت الخاص بنا!

يمكننا إضافة وظيفة لدور ما ليتم حذفه عندما يزيل المستخدم رد فعله من الرسالة. هذا هو بالضبط نفس الكود أعلاه ، والفرق الوحيد هو أننا نستمع لحدث messageReactionRemove ونستخدم التابع roles.remove . لذلك ، سيكون الكود الكامل لإضافة الأدوار وإزالتها كما يلي:

 // Adding reaction-role function client.on('messageReactionAdd', async (reaction, user) => { if (reaction.message.partial) await reaction.message.fetch(); if (reaction.partial) await reaction.fetch(); if (user.bot) return; if (!reaction.message.guild) return; if (reaction.message.channel.id == '802209416685944862') { if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.add('802208163776167977'); } if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.add('802208242696192040'); } if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.add('802208314766524526'); } } else return; }); // Removing reaction roles client.on('messageReactionRemove', async (reaction, user) => { if (reaction.message.partial) await reaction.message.fetch(); if (reaction.partial) await reaction.fetch(); if (user.bot) return; if (!reaction.message.guild) return; if (reaction.message.channel.id == '802209416685944862') { if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.remove('802208163776167977'); } if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.remove('802208242696192040'); } if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.remove('802208314766524526'); } } else return; });

إضافة وظيفة إعادة توجيه Twitter

ستكون الوظيفة التالية التي سنضيفها إلى الروبوت الخاص بنا أكثر صعوبة بعض الشيء. نريد التركيز على حساب Twitter معين ، بحيث في أي وقت ينشر حساب Twitter تغريدة ، سيتم إعادة توجيهها إلى قناة Discord الخاصة بنا .

قبل البدء في الكود ، سيتعين علينا الحصول على الرموز المطلوبة من بوابة مطوري Twitter. قم بزيارة البوابة وأنشئ تطبيقًا جديدًا بالنقر فوق الزر "إنشاء تطبيق" في خيار "نظرة عامة". امنح تطبيقك اسمًا ، وانسخ جميع الرموز المميزة ، والصقها في ملف env. الخاص .env ، مع الأسماء المناسبة. ثم انقر فوق "إعدادات التطبيق" ، وقم بتمكين ميزة OAuth الثلاثية. أضف عناوين URL أدناه كعناوين URL لمعاودة الاتصال لأغراض الاختبار:

 https://127.0.0.1/ https://localhost/

إذا كنت تمتلك موقعًا على الويب ، فأضف العنوان إلى عنوان URL للموقع وانقر على "حفظ". توجه إلى علامة التبويب "Keys and Tokens" ، وأنشئ مفاتيح الوصول والرموز المميزة. انسخها واحفظها في ملف .env الخاص بك. تم عملنا مع بوابة مطوري تويتر. يمكننا العودة إلى محرر النصوص الخاص بنا لمواصلة تشفير الروبوت. لتحقيق الوظيفة التي نريدها ، يتعين علينا إضافة حزمة twit أخرى تسمى twit. إنه عميل Twitter API لـ Node.js. وهو يدعم كلاً من REST و API المتدفقة.

أولاً ، قم بتثبيت حزمة twit باستخدام npm install twit ، واطلبها في ملفك الرئيسي:

 const Twit = require('twit');

علينا إنشاء مثيل twit باستخدام مُنشئ Twit . قم بتمرير كائن في منشئ Twit مع جميع الرموز التي حصلنا عليها من Twitter:

 const T = new Twit({ consumer_key: process.env.API_TOKEN, consumer_secret: process.env.API_SECRET, access_token: process.env.ACCESS_KEY, access_token_secret: process.env.ACCESS_SECRET, bearer_token: process.env.BEARER_TOKEN, timeout_ms: 60 * 1000, });

تم تحديد مهلة هنا أيضًا. نريد أن يكون كل المهاجمين في قناة معينة. لقد أنشأت قناة منفصلة تسمى "Twitter forwards" ، حيث سيتم إعادة توجيه جميع التغريدات. لقد شرحت بالفعل كيف يمكنك إنشاء قناة. قم بإنشاء قناتك الخاصة وانسخ المعرف.

 // Destination Channel Twitter Forwards const dest = '803285069715865601';

الآن علينا إنشاء دفق. تسمح واجهة برمجة التطبيقات للدفق بالوصول إلى دفق البيانات عبر الشبكة. يتم تقسيم البيانات إلى أجزاء أصغر ، ثم يتم نقلها. إليك الكود الخاص بنا لدفق البيانات:

 // Create a stream to follow tweets const stream = T.stream('statuses/filter', { follow: '32771325', // @Stupidcounter });

في مفتاح follow ، أحدد @Stupidcounter لأنه يتغرد كل دقيقة ، وهو أمر رائع لأغراض الاختبار لدينا. يمكنك تقديم معرف أي حساب Twitter للحصول على تغريداته. سوف يمنحك TweeterID معرف أي مقبض. أخيرًا ، استخدم طريقة stream.on للحصول على البيانات وتدفقها إلى القناة المطلوبة.

 stream.on('tweet', (tweet) => { const twitterMessage = `Read the latest tweet by ${tweet.user.name} (@${tweet.user.screen_name}) here: https://twitter.com/${tweet.user.screen_name}/status/${tweet.id_str}`; client.channels.cache.get(dest).send(twitterMessage); return; });

نحن نستمع لحدث tweet ، وكلما حدث ذلك ، نقوم بتمرير التغريدة إلى وظيفة رد الاتصال. سنقوم ببناء رسالة مخصصة ؛ في حالتنا ستكون الرسالة:

 Read the latest tweet by The Count (@Stupidcounter) here: https://twitter.com/Stupidcounter/status/1353949542346084353

مرة أخرى ، نستخدم طريقة client.channels.cache.get للحصول على القناة المطلوبة وطريقة .send لإرسال رسالتنا. الآن ، قم بتشغيل الروبوت الخاص بك وانتظر لمدة دقيقة. سيتم إرسال رسالة Twitter إلى الخادم.

يرسل الروبوت تغريدة إلى ديسكورد
تغريدات مُعاد توجيهها إلى Discord (معاينة كبيرة)

إذن ، هذا هو رمز إعادة التوجيه الكامل على Twitter:

 // Adding Twitter forward function const Twit = require('twit'); const T = new Twit({ consumer_key: process.env.API_TOKEN, consumer_secret: process.env.API_SECRET, access_token: process.env.ACCESS_KEY, access_token_secret: process.env.ACCESS_SECRET, bearer_token: process.env.BEARER_TOKEN, timeout_ms: 60 * 1000, }); // Destination channel Twitter forwards const dest = '803285069715865601'; // Create a stream to follow tweets const stream = T.stream('statuses/filter', { follow: '32771325', // @Stupidcounter }); stream.on('tweet', (tweet) => { const twitterMessage = `Read the latest tweet by ${tweet.user.name} (@${tweet.user.screen_name}) here: https://twitter.com/${tweet.user.screen_name}/status/${tweet.id_str}`; client.channels.cache.get(dest).send(twitterMessage); return; });

تم الانتهاء من جميع الوظائف التي نريد إضافتها. الشيء الوحيد المتبقي الآن هو نشره على السحابة. سنستخدم Heroku لذلك.

نشر الروبوت على Heroku

أولاً ، قم بإنشاء ملف جديد في الدليل الجذر لمجلد bot code الخاص بك. Procfile . Procfile هذا على الأوامر المطلوب تنفيذها عند بدء تشغيل البرنامج. في الملف ، سنضيف worker: node app.js ، والذي سيبلغ Heroku عن الملف الذي سيتم تشغيله عند بدء التشغيل.

بعد إضافة الملف ، دعنا نبدأ مستودع git ، ودفع الكود الخاص بنا إلى GitHub (كيفية القيام بذلك خارج نطاق هذه المقالة). شيء واحد أود أن أقترحه هو إضافة مجلد node_modules وملف .env إلى ملف .gitignore ، بحيث يظل حجم الحزمة الخاص بك صغيرًا ولا تتم مشاركة المعلومات الحساسة بالخارج.

بمجرد دفع كل التعليمات البرمجية الخاصة بك بنجاح إلى GitHub ، قم بزيارة موقع ويب Heroku. قم بتسجيل الدخول أو إنشاء حساب إذا لم يكن لديك حساب بالفعل. انقر فوق الزر "جديد" لإنشاء تطبيق جديد ، وقم بتسميته كما يحلو لك. اختر "طريقة النشر" مثل GitHub.

اختر GitHub كطريقة نشر
اختر GitHub كطريقة للنشر (معاينة كبيرة)

ابحث عن تطبيقك وانقر على اتصال بمجرد العثور عليه. قم بتمكين النشر التلقائي من قائمة "النشر" ، بحيث يتم نشر الكود تلقائيًا في Heroku في كل مرة تدفع فيها التغييرات إلى الرمز.

الآن ، يتعين علينا إضافة متغيرات التكوين إلى Heroku ، وهو أمر سهل للغاية. انتقل إلى خيار "الإعدادات" ، أسفل اسم التطبيق الخاص بك ، وانقر على "كشف إعدادات المتغيرات".

الكشف عن متغيرات التكوين وإضافتها إلى Heroku
تكوين Vars على Heroku (معاينة كبيرة)

هنا ، أضفنا متغيرات التكوين كأزواج مفتاح-قيمة. بمجرد الانتهاء ، انتقل إلى علامة التبويب "نشر" مرة أخرى ، وانقر فوق "نشر الفرع" ضمن "النشر اليدوي".

آخر شيء يجب مراعاته هو أنك قد تواجه عطل خطأ مدته 60 ثانية يمنع الروبوت من التنفيذ. لمنع حدوث ذلك ، يتعين علينا تغيير نوع العامل في التطبيق. في Heroku ، إذا انتقلت إلى علامة التبويب "الموارد" في تطبيقك ، فسترى أنه ، ضمن "Free Dynos" ، يتم تمكين web npm start . يتعين علينا إيقاف تشغيل هذا وتمكين worker node app.js . لذلك ، انقر فوق الزر "تعديل" بجوار زر web npm start ، ثم قم بإيقاف تشغيله ، وقم بتمكين الخيار worker node app.js قم بتأكيد التغيير. أعد تشغيل جميع أجهزة Dynos الخاصة بك ، وقد انتهينا!

خاتمة

أتمنى أن تكون قد استمتعت بقراءة هذا المقال. حاولت تغطية جميع الأساسيات التي تحتاج إلى فهمها عند تطوير روبوت معقد. تعد وثائق Discord.js مكانًا رائعًا لمعرفة المزيد. لها تفسيرات عظيمة. أيضًا ، ستجد كل الكود في مستودع GitHub. وإليك بعض الموارد التي ستساعدك في مزيد من التطوير:

  • التوثيق ، بوابة مطور Discord
  • واجهة برمجة تطبيقات Discord (خادم Discord)
  • Partials ، Discord.js ، GitHub
  • بوابة المطور ، تويتر
  • الحشو والحزم والتوثيق