| الملخص | قم بتشغيل تحديات محدودة الوقت تحتوي على لوحات متصدرة، ومنشورات آلية، وتوزيع شارات. | |
| رابط المستودع | GitHub - R23DPrinting/discourse-daily-challenge · GitHub | |
| دليل التثبيت | كيفية تثبيت الإضافات في Discourse |
الإصدار الحالي: 1.3.0 (محدث في 27/3/2026)
الرخصة: MIT
القصة
أدير مجتمعًا للصحة والعافية انتقل مؤخرًا من Discord إلى Discourse. في Discord، قمت ببناء روبوت مخصص لتشغيل تحديات اللياقة الشهرية — حيث كان الأعضاء ينشرون تمارينهم اليومية، ويتتبع الروبوت عمليات تسجيل الدخول، وينشر لوحات المتصدرين الأسبوعية، ويعلن الفائزين في نهاية كل شهر. كانت هذه الميزة من أكثر الميزات شعبية لدينا.
بعد الانتقال إلى Discourse، بدأ الأعضاء يطلبون عودة التحديات. بحثت عن إضافة موجودة لكن لم أجد شيئًا مناسبًا. لذا قمت ببنائها بنفسي.
ما بدأ كحل سريع تحول إلى نظام تحديات كامل الميزات يعمل في الواقع بشكل أفضل من روبوت Discord الأصلي. ونظرًا لأن هذا قد يكون مفيدًا لمجتمعات أخرى، فأنا أشاركه هنا.
ما الذي يفعله
تتيح لك إضافة discourse-daily-challenge تشغيل تحديات منظمة ومحدودة الوقت مباشرة داخل Discourse. يقوم الأعضاء بالتسجيل في التحدي من خلال النشر في موضوع مخصص باستخدام هاشتاغ معين أو صورة. تتتبع الإضافة كل شيء تلقائيًا.
الميزات الأساسية
تسجيل دخول مرن
يقوم الأعضاء بالتسجيل من خلال النشر في موضوع التحدي باستخدام الهاشتاغ المconfigured أو مرفق صورة. يمكن تكوين التحديات لتسجيل الدخول اليومي أو الأسبوعي. يتم تقييم نافذة التسجيل حسب المنطقة الزمنية المconfigured للتحدي، مما يضمن عمل المجتمعات العالمية بشكل صحيح.
لوحة المتصدرين المباشرة والتتابعات
تعرض لوحة تحكم المشرف النتائج في الوقت الفعلي بما في ذلك إجمالي عمليات تسجيل الدخول، والتتابعات الحالية، ونسبة الإنجاز لكل مشارك. تعكس ملصقات التتابع تلقائيًا فاصل التحدي (“تتابع يوم” مقابل “تتابع أسبوع”).
منشورات لوحة المتصدرين الآلية
قم بتعيين يوم وساعة لنشر لوحة متصدرين أسبوعية آلية مباشرة في موضوع التحدي. يتم أيضًا إنشاء منشور نتائج نهائي تلقائيًا في اليوم التالي لانتهاء التحدي.
شارات مخصصة
حدد الحد الأدنى لعدد عمليات تسجيل الدخول المطلوبة “لإكمال” التحدي. يحصل المشاركون المؤهلون تلقائيًا على شارة Discourse مخصصة عند انتهاء التحدي. يتم تعبئة اسم الشارة تلقائيًا من عنوان الموضوع.
تحديات متعددة في وقت واحد
قم بتشغيل عدد غير محدود من التحديات في نفس الوقت. لكل تحدي موضوعه وجدوله الزمني ومنطقته الزمنية وشارته ولوحة المتصدرين الخاصة به.
التحديات المؤرشفة
يتم حفظ التحديات المكتملة في عرض متقابل (Accordion) مؤرشف في لوحة التحكم، مما يسمح لك بالرجوع إلى النتائج التاريخية.
إدارة تسجيل الدخول للمشرفين
يمكن للمشرفين إضافة أو إزالة عمليات تسجيل الدخول يدويًا — وهو أمر مفيد لالتقاط المنشورات الفائتة أو حل النزاعات.
تشغيل لوحة المتصدرين يدويًا
تتيح زر “نشر لوحة المتصدرين الآن” للمشرفين نشر تحديث لوحة المتصدرين عند الطلب، خارج النافذة المجدولة.
وصول المشرفين
يمكن للمشرفين على الموقع كاملين إنشاء التحديات وتعديلها وإدارتها عبر قسم جانبي مخصص. يمكن تمكينه أو تعطيله عبر إعدادات الموقع.
وصول مشرفي الفئات
يمكن لمشرفي الفئات إدارة التحديات المحددة بفئاتهم المخصصة عبر مسار /challenges المخصص — ولا يتطلب ذلك وصول المشرفين. يمكن تمكينه أو تعطيله بشكل مستقل عبر إعدادات الموقع.
التثبيت
أضف السطر التالي إلى ملف containers/app.yml الخاص بك تحت hooks > after_code > exec > cmd:
- git clone https://github.com/R23DPrinting/discourse-daily-challenge.git
ثم أعد البناء:
cd /var/discourse && ./launcher rebuild app
بعد التثبيت الأولي، يمكن تطبيق التحديثات المستقبلية عبر زر “تحديث” الموجود في اللوحة ما لم يُذكر خلاف ذلك في سجل التغييرات.
التكوين
إنشاء تحدي
انتقل إلى Admin → Plugins → Challenges → Discourse Challenges وانقر على New Challenge.
| الحقل | الوصف |
|---|---|
| معرف الموضوع (Topic ID) | موضوع Discourse الذي سيستخدمه الأعضاء للتسجيل. سيتم تعبئة اسم الشارة تلقائيًا من عنوان الموضوع. |
| محفز الهاشتاغ | الهاشتاغ المطلوب للتسجيل (بدون #، مثل workout) |
| فاصل تسجيل الدخول | وضع تسجيل الدخول اليومي أو الأسبوعي |
| بداية الأسبوع | للتحديات الأسبوعية: اليوم الذي يبدأ فيه الأسبوع (الأحد، الاثنين، أو السبت) |
| تاريخ البدء | اليوم الأول للتحدي (شامل) |
| تاريخ الانتهاء | اليوم الأخير للتحدي (شامل) |
| المنطقة الزمنية للتحدي | المنطقة الزمنية لتقييم نافذة التسجيل (اختياري، الافتراضي هو UTC) |
| عدد تسجيلات الدخول المطلوبة | الحد الأدنى لعمليات تسجيل الدخول لكسب شارة الإكمال |
| الوصف | وصف اختياري للتحدي |
| تمكين منشور لوحة المتصدرين الأسبوعي | تبديل منشورات لوحة المتصدرين الأسبوعية الآلية |
| يوم النشر الأسبوعي | يوم الأسبوع لمنشور لوحة المتصدرين الآلي |
| ساعة النشر | الساعة (0–23، حسب المنطقة الزمنية للتحدي) لمنشور لوحة المتصدرين الآلي |
| منح شارة الإكمال | تبديل منح الشارة تلقائيًا عند انتهاء التحدي |
| اسم الشارة | اسم الشارة المراد إنشاؤه ومنحه — يتم تعبئته تلقائيًا من عنوان الموضوع |
إعدادات الموقع
| الإعداد | الافتراضي | الوصف |
|---|---|---|
daily_challenge_enabled |
true |
تمكين أو تعطيل الإضافة على مستوى الموقع |
daily_challenge_mod_access_enabled |
true |
السماح للمشرفين على الموقع كاملين بإدارة التحديات |
daily_challenge_category_mod_access_enabled |
true |
السماح لمشرفي الفئات بإدارة التحديات في فئاتهم المخصصة |
كيفية عمل تسجيلات الدخول
- ينشر عضو ردًا في موضوع التحدي.
- يجب أن يحتوي المنشور على الهاشتاغ المconfigured أو مرفق صورة.
- تتحقق الإضافة مما إذا كان العضو قد سجل دخوله بالفعل خلال الفترة الحالية (يوم أو أسبوع، حسب فاصل التحدي).
- إذا لم يكن كذلك، يتم تسجيل عملية تسجيل الدخول ويتم تحديث لوحة المتصدرين.
- يُسمح بعملية تسجيل دخول واحدة لكل عضو لكل فترة.
يمكن للمشرفين عرض وإدارة جميع عمليات تسجيل الدخول من لوحة تحكم المشرفين.
وصول المشرفين ومشرفي الفئات
يمكن للمشرفين على الموقع كاملين الوصول إلى إدارة التحديات عبر قسم CHALLENGES في الشريط الجانبي الرئيسي (إذا كان daily_challenge_mod_access_enabled مفعلاً).
يمكن لمشرفي الفئات الوصول إلى نسخة محددة في /challenges/dashboard و /challenges/challenges — حيث يمكنهم فقط رؤية وإدارة التحديات المرتبطة بالمواضيع في فئاتهم المخصصة. يتطلب هذا تفعيل daily_challenge_category_mod_access_enabled وتعيين المستخدم كمشرف فئة عبر Admin → Categories → [Category] → Moderation.
المنشورات الآلية
لوحة المتصدرين الأسبوعية
تشغل الإضافة مهمة خلفية كل ساعة تتحقق مما إذا حان وقت نشر لوحة المتصدرين الأسبوعية. عند وصول اليوم + الساعة المconfigured (حسب المنطقة الزمنية للتحدي)، يتم إنشاء منشور منسق في موضوع التحدي يعرض النتائج الحالية.
منشور النتائج النهائي
في اليوم التالي لانتهاء التحدي، يتم نشر منشور نتائج نهائي تلقائيًا. يسرد هذا المنشور جميع المشاركين، وإجمالي عمليات تسجيل الدخول الخاصة بهم، وحالة الإكمال، ويهنئ الحاصلين على الشارات.
جداول قاعدة البيانات
daily_challenges— تعريفات التحدياتdaily_check_ins— سجلات تسجيل الدخول الفردية لكل مستخدم لكل تحدي لكل فترة
التوافق
- Discourse 3.x+
- تم اختباره على التثبيتات المستضافة ذاتيًا
- Ruby 3.x, Rails 7.x+
خارطة الطريق (v1.4.0)
- @ChallengeBot أوامر الذكرى — يمكن للأعضاء ذكر حساب الروبوت @ChallengeBot في مواضيع التحدي للحصول على إحصائياتهم الشخصية عبر الرسائل الخاصة (DM) (
status,leaderboard,streak,help) - رسائل تأكيد تسجيل الدخول — رسالة خاصة تلقائية بعد كل تسجيل دخول ناجح مع معلومات التتابع الحالية
- رسائل تذكير — إعداد اختياري لكل تحدي؛ ترسل التحديات اليومية تذكيرًا بعد 2+ يوم فائت، وترسل التحديات الأسبوعية تذكيرًا في اليوم الأخير من الأسبوع إذا لم يتم تسجيل الدخول بعد
سجل التغييرات
v1.3.0
- وصول مشرفي الفئات — يمكن لمشرفي الفئات إنشاء التحديات وتعديلها وحذفها وإدارة تسجيلات الدخول للتحديات في فئاتهم المخصصة عبر
/challenges/dashboardو/challenges/challenges— لا يتطلب وصول المشرفين - تعبئة اسم الشارة تلقائيًا — يتم تعبئة حقل اسم الشارة تلقائيًا من عنوان الموضوع عند إدخال معرف الموضوع
- التحقق من صحة اسم الشارة — اسم الشارة مطلوب عند تمكين “منح شارة الإكمال”؛ يعيد خطأً صحيحًا بدلاً من استجابة 500
- تبديل منفصل للمشرفين/مشرفي الفئات — يمكن التبديل بين
daily_challenge_mod_access_enabledوdaily_challenge_category_mod_access_enabledبشكل مستقل
v1.2.0
- فاصل تسجيل دخول قابل للتكوين — تشغيل تحديات يومية أو أسبوعية
- إعداد بداية الأسبوع — للتحديات الأسبوعية، اختر ما إذا كانت الأسابيع تبدأ يوم الأحد، الاثنين، أو السبت
- تتابعات واعية بالفاصل — تعكس ملصقات التتابع وحساباته الآن فاصل التحدي
- وصول المشرفين — يمكن للمشرفين على الموقع كاملين إدارة التحديات عبر قسم جانبي مخصص
- إعادة التسمية إلى “Discourse Challenges” في واجهة مستخدم المشرفين
v1.1.1
- لوحة تحكم متعددة التحديات تعرض جميع التحديات النشطة في وقت واحد
- قسم متقابل للتحديات المؤرشفة يعرض النتائج التاريخية
v1.1.0
- دعم المنطقة الزمنية لكل تحدي
- جدول النشر الأسبوعي الآن لكل تحدي (يوم، ساعة، تبديل تمكين/تعطيل)
v1.0.0
- الإصدار الأولي
التعليقات والمساهمات
تم بناء هذه الإضافة لحل حاجة حقيقية في مجتمعنا، وأشاركها في حال كانت ستفيد مجتمعاتكم. الترحيب بالمشاكل (Issues)، طلبات السحب (PRs)، وطلبات الميزات على GitHub.
إذا كنت تدير مجتمعًا حيث المساءلة والاستمرارية أمران مهمان — مثل اللياقة، تعلم اللغات، الكتابة، العادات الإبداعية — فإن التحديات اليومية يمكن أن تكون أداة تفاعل قوية حقًا. أتمنى أن تجعل هذه الإضافة من السهل جلب ذلك إلى مجتمع Discourse الخاص بك.




