طقم بناء بوت Discord 🤖

غرض هذا الإضافة

تقوم هذه الإضافة بعدة مهام:

  1. تتيح لك تشغيل روبوت Discord باستخدام خادم Discourse الخاص بك للقيام بأشياء تربط النظامين معًا. انسخ هذا المستودع وقم بتوسيعه باستخدام Ruby بسيط لإنشاء جميع أنواع وظائف الروبوت.

  2. الوظائف الموجودة لتقديم أمثلة وأدوات مفيدة:

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

توفر الإضافة هيكلًا قابلًا للتوسع يمكنك من خلاله بناء ميزات إضافية. نرحب بطلبات الدمج (PRs) للإضافات المفيدة بشكل عام.


هذه ليست أوامر المزامنة الفعلية، بل مجرد توضيح لتفاعل الروبوت الممكن. الأمر الثاني في لقطة الشاشة تم إلغاؤه أثناء التطوير :wink:

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

أوامر الروبوت

هناك أربعة أوامر:

  1. Ping!
  2. !disckick
  3. !discsync
  4. !disccopy

Ping!

للتحقق مما إذا كان الروبوت يستجيب، اكتب ببساطة “Ping!” ويجب أن يستجيب الروبوت بـ “:robot: : Pong!” - مذهل، أليس كذلك؟ :smiley: (هذا في الواقع نوع من الميمز btw!)

!disckick <min_trust_level: الافتراضي 2>

سيؤدي كتابة هذا الأمر إلى طرد أي مستخدم موجود في Discourse الخاص بك ولكن بمستوى ثقة أقل من القيمة التي قدمتها. الافتراضي إذا لم تقم بتوفير قيمة هو 2.

مثال:

!discsync <clean up: الافتراضي false, min_visibility: الافتراضي 0, include automated groups: الافتراضي false>

سيحاول هذا الأمر نسخ جميع المجموعات إلى أدوار في Discord والتي تطابق المعايير المقدمة (أو الافتراضيات إذا لم يتم توفيرها). ثم سيحاول ملء الأدوار وفقًا لعضوية المجموعة في Discourse. إنها مزامنة في اتجاه واحد فقط. لا يتم تغيير أي بيانات في Discourse أبدًا.

!disccopy <number_of_messages> <optional_target_category_name> <optional_target_topic_name>

يتيح لك نسخ سجل محادثات Discord إلى مثيل Discourse الخاص بك من داخل دردشة Discord. يمكن التعامل مع آلاف الرسائل دفعة واحدة (ولكنه سيستغرق وقتًا لهذا الحجم).

اتصال ثنائي الاتجاه

إليك الإعدادات

  • يمكنك تعيين قناة إعلانات في Discord في إعدادات الإضافة.
  • يمكنك الآن الكتابة في قناة إعلانات Discord المحددة وسيتم نشر رسالتك في موضوع Discourse المحدد في إعدادات الإضافة.
  • يمكنك إعداد قائمة بالفئات في Discourse للنشر في قناة الإعلانات في Discord إذا قام شخص ما بالنشر هناك أو إضافة موضوع جديد (أي منهما أو كلاهما).
  • نسخ دردشة تلقائي لكل رسالة، من قناة إلى أي فئة تحمل نفس الاسم في Discourse: إذا كان اسم القناة يطابق اسم الفئة، فسيتم نسخ الرسالة إلى Discourse.

image

بالإضافة إلى ذلك، قمت بإضافة ملف جديد لإدارة أحداث Discord المدعومة من API discordrb، مع كون منطق الإعلانات هو المثال الأول (لا تتردد في تطوير أمثلة جديدة وتقديم طلب دمج إذا كانت مفيدة بشكل عام للمجتمع).

ملاحظة: بالنسبة لأي رسالة يتم نسخها إلى Discourse من Discord، سيظهر المستخدم بشكل صحيح إذا قام هذا المستخدم بتسجيل الدخول إلى Discourse باستخدام تسجيل دخول Discord (لذلك يمكن لـ Discord Bot مطابقة المستخدمين).

حالة هذه الإضافة

هذه إضافة معقدة في الإعداد. كان ذلك لا مفر منه إلى حد كبير.

ومع ذلك، فإن استخدامها سهل جدًا بمجرد تشغيلها بالكامل.

اعتبر الكود حاليًا في النسخة التجريبية (Beta). تم اختباره، حتى في بيئة الإنتاج، ولكن من المرجح أن يحتوي على أخطاء. أوصي باختباره أولاً على خادم Discord جديد قبل تطبيقه على خادم Discord الرئيسي “الإنتاجي” الخاص بك، ما لم تكن تبدأ للتو.

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

تعليمات الإعداد

المتطلبات الأساسية

  1. خادم Discord أنت مدير فيه.
  2. تطبيق Discord (انظر أدناه).
  3. روبوت Discord (انظر أدناه).
  4. وصول ssh كمستخدم root إلى خادم Discourse الخاص بك.
  5. تحديثات لملف app.yml لتثبيت الإضافة.
  6. سيحتاج جميع مستخدمي Discourse الخاص بك إلى تسجيل الدخول باستخدام تسجيل دخول Discord OAuth الذي سيظهر على صفحة تسجيل الدخول الخاصة بك بمجرد تثبيت الإضافة.

تطبيق Discord

اذهب إلى هنا وأنشئ تطبيقًا:

اضغط على “New Application”.

ستحتاج إلى إنشاء روبوت وسيبدو شيئًا مثل هذا (اتركه غير ‘عام’):

ستحتاج إلى تفويض الروبوت في المتصفح، راجع OAuth2 - Documentation - Discord

بمجرد إعداد الروبوت، انسخ الرمز (Token). ستحتاج إلى إدخال ذلك في Discourse لاحقًا.

تغييرات app.yml

الإضافة

تحتاج فقط إلى إضافة واحدة الآن لأن تسجيل الدخول الاجتماعي لـ Discord أصبح جزءًا أساسيًا من نواة Discourse (واو :tada: )

ثم في المطالبة ./launcher rebuild app كما هو معتاد.

يجب أن يعمل هذا، لا مشكلة.

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

بمجرد الدخول إلى منطقة المسؤول في Discourse، انتقل إلى إعدادات الإضافة واملأ هذه الحقول:

ستحصل على المعرفات (IDs) من واجهة Discord. ستحتاج إلى تفعيل وضع المطور للسماح لك بنسخ هذه المعرفات. في Discord، انتقل إلى الإعدادات - > المظهر - > متقدم (ADVANCED) وقم بتفعيل وضع المطور:

يمكنك بعد ذلك الحصول على المعرفات من الواجهة، على سبيل المثال:

ستحتاج أيضًا إلى ملء إعدادات OAuth الخاصة بـ Discord. معرف العميل (Client ID) والسر (Secret) يأتيان من تطبيق Discord نفسه.

بمجرد تعيين هذه الإعدادات، عد إلى المطالبة الجذرية (root prompt) في linux واكتب:

./launcher restart app

إذا قمت بإعداد خوادم Discord و Discourse الخاصة بك بشكل صحيح، يجب أن ترى الروبوت ينضم إلى الخادم.

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

أوامر مستقبلية؟

إذا كان لديك فكرة عن أمر آخر يستغل الرابط بين Discourse و Discord وتعتقد أنه سيكون مفيدًا للمجتمع الأوسع، فأخبرني في الردود ويمكننا النظر في إمكانية تنفيذ ذلك. ملاحظة: لا يُقصد بهذا الروبوت أداء مهام خارج نطاق Discourse.

القيود

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

أوامر الروبوت هي بشكل فردي بطبيعتها.

مشاكل معروفة

  • سيبدأ الروبوت مثيلًا من نفسه إذا ذهبت إلى جلسة وحدة تحكم rails على الخادم. سيسبب ذلك في ظهور الروبوت وكأنه يستجيب مرتين (ولكن في الواقع يوجد روبوتان الآن). في وحدة تحكم rails، ببساطة أوقف الروبوت الإضافي عن طريق كتابة: ::DiscordBot::Bot.discord_bot.stop لم يعد هذا ضروريًا الآن!

  • الروبوت ثرثار قليلاً خلال ترقيات Discourse ‘المتصل’ حيث يستمر في إعادة التفعيل أثناء عملية الترقية. هذا يعود إلى إيجاد طريقة جيدة لتشغيل الروبوت في عملية منفصلة ومدارة بدلاً من خيط فرع من خادم الويب. أعتقد أن هذا كله غير ضار، وإذا كان إخراج الروبوت فقط إلى قناة المسؤول الخاصة بك في Discord، فهل تهتم حقًا؟ يجب أن يكون هذا قد تم حله الآن تقريبًا، مع إعلان الروبوت عن نفسه مرتين فقط أثناء إعادة البناء.

شكرًا

هناك العديد من الداعمين الذين يجب شكرهم على هذه الإضافة التي استغرقت وقتًا طويلاً للوصول إلى هذه المرحلة بما في ذلك @Wedgebert، @FoohonPie. شكرًا لـ Jeff على مساهمته السخية. شكرًا لـ @angus على كل التشجيع والتعامل مع الدعم المالي.

تمت استلهام الإضافة من العمل الذي قام به @Watercolor_Games في مرحلة سابقة وتعتمد على إضافة OAuth الخاصة بـ Discord التي بناها @featheredtoast.

تعتمد الإضافة على مكتبة Ruby discordrb شبه الرسمية المدعومة من Discord والعمل الرائع الذي قام به فريق Discord لجعل نظامهم في متناول الجميع. شكرًا لـ @Falco على مساعدتي في اعتماد في استجابة سريعة للغاية.

بالإضافة إلى ذلك، بالطبع، لن يكون هذا ممكنًا بدون نظام الإضافات المذهل في Discourse (واو!)

حالة هذه التعليمات

سيتم تحسينها مع مرور الوقت وأرحب بالتعليقات. هناك مناطق من المرجح أن تكون غير واضحة.

47 إعجابًا
Discord<-> Discourse Selective Group Sync
Discord login and obtain discord roles in discourse
Discord and Discourse - Better Together | Blog
Convert Existing Plugin to do Discord to Discourse role/group sync
Slack Bot Construction Kit :robot:
2019: The Year in Review
Creat a user automatically when granted a Discord Role?
Discord Sync: sync a Discourse forum with a Discord server
Creating bot on discourse
Using "custom" ruby gems
Discourse Trust Levels for Discord
Discord is taking aim at Discourse. How does Discourse remain unique and stand out from the crowd?
Discord is taking aim at Discourse. How does Discourse remain unique and stand out from the crowd?
Copy + Pasting text from Discord into Discourse mangles paragraph breaks
Discord Role Badge Sync
Discord Bot: Topics not Posts
How do I go about making a very customized theme?
API feature request for additonal info about external accounts
Can anyone help me to add chat option of discord on forum?
How to Integrate/Sync Discord User MEE6 Points with Discourse Leaderboard?
LF Developer, Theme Creator, and Discord/Discourse Hero
Discord Sync: sync a Discourse forum with a Discord server
[PAID] Discourse/Discord integration needed (roles/user groups)
Can anyone help me to add chat option of discord on forum?
Discord and Discourse - Better Together | Blog
How to easily make Discourse bots?
Discourse to Discord bot possible?
Migrating from Discord to Discourse
Convert Existing Plugin to do Discord to Discourse role/group sync
Is migration from other chat apps supported?
Partially enable login option
Introducing Discourse Chat (BETA)
Which instant messenger do you use with Discourse?
Request widgetbot.io
Discord Sync: sync a Discourse forum with a Discord server

مرحبًا، أنا مهتم جدًا بهذا.

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

إعجابَين (2)

نعم، بالتأكيد.

يمكنك إما بناء ذلك كأمر للبوت لتطبيق فوري، لكن مع ميزة التكرار التي تعيد تشغيل الأمر بعد فترة (جيد لكنه ليس شفافًا جدًا ولا توجد طريقة لإدارة هذه التكرارات بشكل فردي).

أو

كما ألمحت أعلاه، قم بجدولتها كمهمة في Discourse كمهمة Sidekiq. قد تكون هذه إضافة منفصلة (في الواقع بدأت في هيكل هذا النهج قبل الانتقال إلى حل يعتمد على البوت فقط، لأن نهج ‘البوت’ كان نوعًا ما ‘الأمر’ المميز لـ Discord، ممتعًا وعرض نهجًا ونتيجة فريدين)، لكن إذا تمكنت من جعل Discourse تشغيل أوامر البوت، فإن هذا يصبح غير ذي صلة (لم أتحسن بعد لاختبار ذلك)، وعندها يمكننا كتابة الكود مرة واحدة وجعله يعمل في كلا الحالتين (رائع!).

كلا الحلين يعتمدان على نفس تسجيل الدخول عبر OAuth.

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

4 إعجابات

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

3 إعجابات

لا تتردد في أن تتسخ. إنها الطريقة الوحيدة للتعلم. :).

4 إعجابات

تم نشر إصلاح طفيف لخطأ:

حصلت على هذا أثناء إعادة البناء:

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

إعجابَين (2)

شكرًا لك على تجربة هذا الأمر وفي وقت مبكر جدًا بعد التحديث. سأحاول إعادة إنتاج المشكلة وسأعود إليك. لم أقم بإجراء أي تغييرات فيما يتعلق بإعدادات المنفذ.

إعجابَين (2)

لا توجد مشاكل في إعادة البناء هنا، Bot يعمل بشكل صحيح… هل قمت بأي تغييرات في إعدادات خادمك في هذه الأثناء؟

رسالة الخطأ 400 Bad Request توحي بأن خادمك أرسل طلبًا تالفًا أو غير صحيح إلى خادم Discord، وهذه كانت الاستجابة. وهذا يعني أن الطلب استُقبل بشكل صحيح ولم يتم حظره.

يمكن أن يحدث هذا بسبب:

  • طلبات غير صحيحة
  • عدم وجود تفويض
  • تجاوز حدود المعدل

للأسف، لا يبدو أن رسالة الخطأ تساعدنا في تحديد أي من هذه الأسباب هو المشكلة المحددة.

من المفترض أن يكون موقع Discourse الخاص بك نشطًا؟ تحقق من أن جميع إعدادات الإضافات مملوءة بشكل صحيح.

ولاستبعاد أي مشكلة مؤقتة، قم بتشغيل الأمر ./launcher restart app عندما يتسنى لك ذلك… سيؤدي هذا إلى إيقاف موقعك لبضع ثوانٍ فقط (نعتذر عن ذلك!).

أرى أنه يقوم بتشغيل البوت في كتلة after_initialize، لذا سيمنع عمليات الترحيل (والإعادة البناء) إذا كان البوت مُعدًا بشكل خاطئ، أو إذا كان ديسكورد معطلاً.

ربما تحاول معالجة هذا الاستثناء وتسجيله فقط؟

5 إعجابات

هل يعمل على خيط منفصل؟ لذا أتوقع ألا تكون هذه مشكلة؟

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

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

تحديث: @falco، تم ذلك، على سبيل المثال:

image

3 إعجابات

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

لقد قمت بإنشاء البوت داخل نفس تطبيق ديسكورد الذي أنشأته سابقًا، وأذنت للبوت داخل خادم ديسكورد، ويظهر في قائمة الأعضاء كحالة غير متصل. ولم تذكر وثائقكم القيمة المسموح بها التي يجب تطبيقها، ولكن نظرًا لأن معظم البوتات التي واجهتها لـ ديسكورد طلبت ذلك، فقد قمت بإعداده بقيمة صلاحيات 8 لـ “المسؤول”.

داخل خادم ديسكورد، قمت بنسخ معرف الدور الذي أنشأته، والذي سُمي باسم تطبيقي، ومعرف القناة الخاصة بنص المسؤول. ثم أضفت دور التطبيق إلى تلك القناة مع جميع الحقوق، للتأكد، ثم أضفت المعرفات إلى Discourse وأعدت التشغيل.

لسوء الحظ، مهما حاولت، أواجه خطأ 400، حتى جربت إعادة البناء للتأكد.

3 إعجابات

شكرًا لك، كلمات طيبة. وقد تم تمكين هذا أيضًا بفضل سخاء الممولين.

نعم، هذا رائع. يجب أن يكون لديه صلاحيات المسؤول.

هذه هي البلاغ الثاني عن هذه المشكلة.

إذا قمت بإزالة الحرف الأخير من الرمز في الإعدادات عمدًا (تذكر ما هو هذا)، هل تحصل على خطأ 401 بدلاً من ذلك؟

دعنا ننقل هذا إلى الرسائل الخاصة لأنه قد يصبح معقدًا :wink: (يمكننا دائمًا نشر الحل هنا).

4 إعجابات

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

إعجاب واحد (1)

تم إصلاح هذه المشكلة الآن. كانت من النوع الغريب الذي يصعب تتبعه.

شكرًا خاصًا لـ @ransim على طرح المشكلة والعمل معي للوصول إلى جذور المشكلة.

شكرًا عظيمًا لفريق #ruby_discordrb على Discord API على مساعدتهم الفورية والصبر!

@neemiasvf

5 إعجابات

@merefield لا مشكلة، إضافةك رائعة. لكن واجهت بعض المشاكل الآن.
مثل هذا:

Discourse Sync:  Starting.  Please be patient, I'm rate limited to respect Discord services.
Discourse Sync:  Checking if there are any eligible groups for sync ...
Discourse Sync: 1 eligible group(s) were found
Discourse Sync:  Preparing list of users who also have a registered account on Discord ...
Discourse Sync:  Preparing list of groups that users who have a registered account on Discord belong to on Discourse ...
Discourse Sync: 0 eligible group(s) were found with Discord users
Discourse Sync:  No users were found in elibigle groups for sync using provided or default criteria!

أمري هو: !discsync 4

والأمر المتغير: !discsync false 5 false

Discourse Sync:  Starting.  Please be patient, I'm rate limited to respect Discord services.
Discourse Sync:  Checking if there are any eligible groups for sync ...
Discourse Sync: 10 eligible group(s) were found
Discourse Sync:  Preparing list of users who also have a registered account on Discord ...
Discourse Sync:  Preparing list of groups that users who have a registered account on Discord belong to on Discourse ...
إعجاب واحد (1)

مرحبًا @p0nda، آسف على التأخير في الرد.

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

3 إعجابات

هل تواجه مشكلة في ظهور إعدادات البوت الممتدة؟ لقد قمت بتطبيق التغييرات على ملف app.yml وتثبيت الإضافات. إعدادات OAuth تعمل بشكل صحيح، لكن إعدادات البوت لا تظهر. هل لديك أي أفكار؟

إعجاب واحد (1)

إعدادات OAuth موجودة، لكن لا توجد إعدادات للروبوت

إعجاب واحد (1)


هذه

إعجابَين (2)