عظيم. بالمناسبة، سأكون سعيدًا بالنظر في أي تحسينات عامة ومفيدة لهذا الإضافة في حال قررت العودة إلى البرمجة مرة أخرى ![]()
حسناً، لنبدأ ببطء. لقد قمت للتو بإرسال أول طلب سحب (pull request) إلى هذا المستودع
.
تم الدمج
شكرًا لك!
مرحبًا! لقد كنت أحاول العثور على إضافة تمنح المستخدمين في Discord دورًا بناءً على الشارات التي يمتلكونها في ملفهم الشخصي على Discourse. هل هذا ممكن مع إضافتك؟ وإذا لم يكن كذلك، فهل هو ممكن من الأساس؟ شكرًا لك!
ليس في الوقت الحالي، لكن لا يوجد سبب يمنعك من إنشاء نسخة منه وإضافة أمر مناسب لتنفيذ ذلك!
إذا تم تنفيذه بشكل جيد، فسأعتبر دمج طلب السحب (PR). ومع ذلك، قد يكون الأمر محددًا بعض الشيء للاستخدام العام، لأنه يُفترض أنك ستحتاج إلى الحفاظ على نوع من التmapping ما لم تكن أسماء الشارات مطابقة لأسماء الأدوار؟ وفي كل الأحوال، ستحتاج إلى تصفية معظمها؟ قد يصبح ذلك فوضويًا للاستخدام العام. إذا وجدت طريقة نظيفة حقًا لإدارة ذلك تعمل لمستخدمي الإضافة بشكل عام، فأخبرني.
لكن تفضل بالانقسام، افعل ما تشاء!
أود بالتأكيد أن أرى ما إذا كان ذلك ممكنًا. هذا سيجعلني أكثر اهتمامًا بهذا الإضافة. ![]()
سؤال بسيط: هل يجب علينا تشغيل !discsync يدوياً في كل مرة نريد فيها تحديث الأدوار، أم أن الأمر تلقائي؟
للأسف نعم. قد يكون إضافة معلمة ‘تكرار بعد x ساعة’ تحسينًا لطيفًا (مرحبًا بطلب سحب أو توظيفي لتنفيذه)، ولكن كما ذكرت سابقًا في هذا الموضوع، سيكون من الأفضل لو قام شخص ما بإنتاج ملحق جديد باستخدام واجهة برمجة التطبيقات الخاصة بهم وإنشاء مهام Sidekiq مجدولة للقيام بذلك. البوت هو حل ممتع، لكنه ليس أفضل بنية لتزامن مجدول.
أهلاً، شكراً على أي حال. نعم، لقد فكرنا بالفعل في بديل محتمل…
كنا نرغب في مزامنة مجموعات Discourse مع أدوار Discord، لكن يبدو أنه لا توجد حل مثالي يناسب جميع الاحتياجات.
سنقوم الآن بإنشاء نوع من البوت باستخدام الويب هوكس: حيث سيقوم Discourse بتفعيل ويب هوك عند تحديث مجموعات المستخدم (أو حتى تغيير اسم المستخدم) إلى حل مخصص، والذي سيقوم بعد ذلك بتعيين الأدوار في Discord. سنواصل استخدام خيار Discord OAuth للحصول على السيرفرات (Guilds)، ومن خلال إنشاء استعلام مخصص في Data Explorer، يمكننا الحصول على تلك السيرفرات عبر واجهة برمجة التطبيقات (API).
سيكون الأمر مشابهاً للآتي:
- يقوم المستخدم بتغيير المجموعات أو اسم المستخدم
- يتم تفعيل ويب هوك إلى الحل المخصص
- يتصل هذا الحل المخصص بواجهة برمجة تطبيقات Data Explorer لاستعلام مخصص يعيد السيرفرات الخاصة بالمستخدم
- باستخدام تلك السيرفرات، نتصل بـ Discord لتحديث الأدوار
سيكون عمل الدُفعة الصحيح أفضل حتى لا تفقد سلامة البيانات بسبب أعطال الأحداث الفردية. كلاهما سيكون مثاليًا.
حسنًا، لم أذهب من تلك الطريقة… ![]()
لقد قمت بعمل نسخة من مستودعك (fork) وأنشأت ملحقًا جديدًا يناسب احتياجاتنا:
يقوم هذا الملحق بمزامنة جميع المجموعات مع أدوار Discord تلقائيًا. فعند إضافة مستخدم أو إزالته من مجموعة، سيقوم بتشغيل وظيفة مزامنة وتحديث أدواره بناءً على المجموعات العامة. بالإضافة إلى ذلك، أضفت إعدادًا لتحديد “دور موثوق”، سيتم إضافته لجميع المستخدمين الذين لديهم حساب في Discourse. كما يدعم أيضًا إضافة قائمة بالأدوار الآمنة التي سيتجاهلها البوت عند مزامنة المستخدمين (مفيد مثلًا عند الرغبة في تعيين مشرفين ومحررين مختلفين في الخادم مقارنة بالمنتدى).
أضفت أيضًا مزامنة بين اسم المستخدم واللقب (nickname). يمكنها إلزام المستخدمين بامتلاك نفس اللقب في الخادم كما هو اسمهم في المنتدى.
سأفتح موضوعًا في قسم #plugin بعد تنظيف بعض الأمور، ربما يجد شخص ما ذلك مفيدًا.
@barreeeiroo ما كان مثيرًا للاهتمام حقًا في نسختك المعدلة هو استغلالك لخطافات DiscourseEvents.
كنت أفترض أن هذا غير ممكن لأن البوت يعمل في خيط منفصل. لكن كما اكتشفت، يبدو أننا نستطيع التصرف بناءً على الأحداث والتأثير على البوت. لذا شكرًا لك على ذلك، فهذه رؤية مهمة جدًا يمكننا تطويرها في المستقبل.
لذا بدأت في اعتماد هذه التقنية في المستودع الرئيسي، بدءًا من إمكانية تعيين بعض المراقبة للمشاركات أو المواضيع الجديدة التي سيتم الإعلان عنها في قناة الإدارة على Discord.
قد تكون هذه الوظيفة قليلة الفائدة كما هي حاليًا، لكنها توضح المفهوم للآخرين لاستغلاله.
حسنًا، لقد طورتُ الإضافة قليلًا الآن، ولدي دليل إثبات (POC) لعملية الاتصال ثنائي الاتجاه:
إليك الإعدادات الجديدة
-
يمكنك تعيين قناة الإعلانات (Announcements Channel) على Discord في إعدادات الإضافة.
-
يمكنك الآن الكتابة في قناة الإعلانات المخصصة على Discord، وسيتم نشر رسالتك في موضوع Discourse المخصص في إعدادات الإضافة.
-
يمكنك إعداد قائمة بالفئات (Categories) في Discourse لنشرها في قناة الإعلانات على Discord إذا قام شخص ما بالنشر هناك أو بإضافة موضوع جديد (أيًا منهما أو كلاهما).
https://github.com/merefield/discourse-discord-bot/commit/a19aa35f6aab2504aa220a1ab3856475f27c795a
بالإضافة إلى ذلك، أضفت ملفًا جديدًا لإدارة أحداث Discord المدعومة بواسطة واجهة برمجة التطبيقات discordrb، مع كون منطق الإعلانات أول مثال (لا تتردد في تطوير أمثلة جديدة وتقديم طلب سحب (PR) إذا كانت ذات فائدة عامة للمجتمع).
لقد قمت أيضًا بإزالة التغييرات المطلوبة في ملف app.yml لتثبيت libsodium-dev، حيث أصبح هذا الخيار اختياريًا بعد تحديث التبعيات، ولا هو مطلوب حاليًا للإضافة (لا حاجة للتعامل مع الصوت).这将使安装过程变得更加简单.
لقد اتبعت تعليمات التثبيت وسار كل شيء بسلاسة حتى إعادة التشغيل. لم ينضم الروبوت إلى الغرفة، لذا تحققت من /logs:
هل يشير هذا إلى discord_bot_token؟ لقد تم ملؤه، وتحققت من القيمة. أي اقتراحات؟
مارك، أعتذر، لقد فاتني هذا بطريقة ما.
هل اكتشفت المشكلة؟
هل يمكنك التحديث وتجربة الإصدار الجديد وسنتابع من هناك
تحديث هام ممول من فريق Discourse ![]()
-
أمر جديد
!disccopy <عدد-الرسائل> <اسم-الفئة-المستهدفة-اختياري> <اسم-الموضوع-المستهدف-اختياري>يسمح لك بنسخ سجل رسائل Discord (في تلك القناة) إلى مثيل Discourse الخاص بك من داخل دردشة Discord. يمكنه التعامل بأمان مع آلاف الرسائل دفعة واحدة (ولكن لهذا الحجم سيستغرق وقتًا). -
النسخ التلقائي للدردشة لكل رسالة، حسب القناة إلى أي فئة بنفس الاسم على Discourse: إذا تطابق اسم القناة مع اسم الفئة، فسيقوم بنسخ الرسالة إلى Discourse إذا تم تعيين ذلك:

-
لأي رسالة يتم نسخها إلى Discourse من Discord، سيظهر المستخدم الآن بشكل صحيح إذا قام هذا المستخدم بتسجيل الدخول إلى Discourse باستخدام تسجيل الدخول إلى Discord (لذلك يكون Discord Bot قادرًا على مطابقة حسابات المستخدمين).
-
تمت إضافة دعم التوطين للعديد من الميزات.
شكرًا لـ @erlend_sh وفريق Discourse على تحديد ورعاية هذا العمل!! ![]()
المزيد من وظائف البوت قادمة
![]()
إذا قاموا بتسجيل الدخول باستخدام مصادقة Discourse أو أي مصادقة أخرى غير Discord OAuth، فهل سيتجاهلهم هذا المكون الإضافي ببساطة؟
لا تتجاهلها، بل إنها غير قادرة على مطابقة المستخدم مع الشخص الموجود على النظام الآخر. ونتيجة لذلك، ستظهر الرسائل المنسوخة على أنها من “النظام”.
هل يتم دعم الخيوط؟
ليس بعد يا كلاوس، ولكنها قد تكون قيد الإعداد. في انتظار تحديث واجهة برمجة تطبيقات Ruby (عائق) ثم سيضيف أحد الداعمين هذه الميزة.


