تحديات يومية في Discourse

:information_source: الملخص قم بتشغيل تحديات محدودة الوقت تحتوي على لوحات متصدرة، ومنشورات آلية، وتوزيع شارات.
:hammer_and_wrench: رابط المستودع GitHub - R23DPrinting/discourse-daily-challenge · GitHub
:open_book: دليل التثبيت كيفية تثبيت الإضافات في Discourse

الإصدار الحالي: 1.3.0 (محدث في 27/3/2026)
الرخصة: MIT


القصة

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

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

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


ما الذي يفعله

تتيح لك إضافة discourse-daily-challenge تشغيل تحديات منظمة ومحدودة الوقت مباشرة داخل Discourse. يقوم الأعضاء بالتسجيل في التحدي من خلال النشر في موضوع مخصص باستخدام هاشتاغ معين أو صورة. تتتبع الإضافة كل شيء تلقائيًا.

الميزات الأساسية

:white_check_mark: تسجيل دخول مرن
يقوم الأعضاء بالتسجيل من خلال النشر في موضوع التحدي باستخدام الهاشتاغ المconfigured أو مرفق صورة. يمكن تكوين التحديات لتسجيل الدخول اليومي أو الأسبوعي. يتم تقييم نافذة التسجيل حسب المنطقة الزمنية المconfigured للتحدي، مما يضمن عمل المجتمعات العالمية بشكل صحيح.

:bar_chart: لوحة المتصدرين المباشرة والتتابعات
تعرض لوحة تحكم المشرف النتائج في الوقت الفعلي بما في ذلك إجمالي عمليات تسجيل الدخول، والتتابعات الحالية، ونسبة الإنجاز لكل مشارك. تعكس ملصقات التتابع تلقائيًا فاصل التحدي (“تتابع يوم” مقابل “تتابع أسبوع”).

:robot: منشورات لوحة المتصدرين الآلية
قم بتعيين يوم وساعة لنشر لوحة متصدرين أسبوعية آلية مباشرة في موضوع التحدي. يتم أيضًا إنشاء منشور نتائج نهائي تلقائيًا في اليوم التالي لانتهاء التحدي.

:sports_medal: شارات مخصصة
حدد الحد الأدنى لعدد عمليات تسجيل الدخول المطلوبة “لإكمال” التحدي. يحصل المشاركون المؤهلون تلقائيًا على شارة Discourse مخصصة عند انتهاء التحدي. يتم تعبئة اسم الشارة تلقائيًا من عنوان الموضوع.

:card_index_dividers: تحديات متعددة في وقت واحد
قم بتشغيل عدد غير محدود من التحديات في نفس الوقت. لكل تحدي موضوعه وجدوله الزمني ومنطقته الزمنية وشارته ولوحة المتصدرين الخاصة به.

:file_folder: التحديات المؤرشفة
يتم حفظ التحديات المكتملة في عرض متقابل (Accordion) مؤرشف في لوحة التحكم، مما يسمح لك بالرجوع إلى النتائج التاريخية.

:hammer_and_wrench: إدارة تسجيل الدخول للمشرفين
يمكن للمشرفين إضافة أو إزالة عمليات تسجيل الدخول يدويًا — وهو أمر مفيد لالتقاط المنشورات الفائتة أو حل النزاعات.

:pushpin: تشغيل لوحة المتصدرين يدويًا
تتيح زر “نشر لوحة المتصدرين الآن” للمشرفين نشر تحديث لوحة المتصدرين عند الطلب، خارج النافذة المجدولة.

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

:card_index_dividers: وصول مشرفي الفئات
يمكن لمشرفي الفئات إدارة التحديات المحددة بفئاتهم المخصصة عبر مسار /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 السماح لمشرفي الفئات بإدارة التحديات في فئاتهم المخصصة

كيفية عمل تسجيلات الدخول

  1. ينشر عضو ردًا في موضوع التحدي.
  2. يجب أن يحتوي المنشور على الهاشتاغ المconfigured أو مرفق صورة.
  3. تتحقق الإضافة مما إذا كان العضو قد سجل دخوله بالفعل خلال الفترة الحالية (يوم أو أسبوع، حسب فاصل التحدي).
  4. إذا لم يكن كذلك، يتم تسجيل عملية تسجيل الدخول ويتم تحديث لوحة المتصدرين.
  5. يُسمح بعملية تسجيل دخول واحدة لكل عضو لكل فترة.

يمكن للمشرفين عرض وإدارة جميع عمليات تسجيل الدخول من لوحة تحكم المشرفين.


وصول المشرفين ومشرفي الفئات

يمكن للمشرفين على الموقع كاملين الوصول إلى إدارة التحديات عبر قسم 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 الخاص بك.

:link: GitHub - R23DPrinting/discourse-daily-challenge · GitHub

15 إعجابًا

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

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

دعني أتأكد من أنني فهمت الطلبات:

إذًا، هل تريد إعداد التحدي لمدة شهر واحد (من 1 إلى 30 أبريل)، ولكن تحديد أنه يتم احتساب إدخال واحد فقط في الأسبوع بدلاً من إدخال واحد في اليوم؟ هل تريد أن تكون الأسابيع من الأحد إلى السبت أم كل 7 أيام؟

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

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

نعم، بالضبط. مجتمعنا لديه تحدي 52 في 52 حيث يوجد تحدٍ أسبوعي لمدة عام، لذا فإن تسجيل الدخول غير اليومي سيمنح مرونة أكبر لأنواع مختلفة من التحديات.

يسمح https://meta.discourse.org/t/discourse-calendar-and-event/97376 للمسؤول بتعيين بداية الأسبوع يوم السبت أو الأحد أو الاثنين، لذا إذا كنت تريد التخطيط للتوافق مع هذا المكون الإضافي في المستقبل (مثل إنشاء أحداث تقويم لتسجيل الدخول أو تاريخ البدء/الانتهاء؟)، فقد أتبع كيف يحدد التقويم الأسبوع؟ بالنسبة لمجتمعي على وجه التحديد، لا أعتقد أن هذا مهم.

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

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

هذه أفكار ممتازة. شكرًا لمشاركتها! سأرى ما يمكنني فعله لتطبيقها.

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

هل يتطلب هذا المكوّن الإضافي تمكين المكوّن الإضافي #gamification، أم أنك اخترت الوسم لأن المكوّن الإضافي الخاص بك مخصص للتحفيز (gamification) بشكل عام؟

إعجابَين (2)

لا يتطلب المكون الإضافي. لقد حددت العلامة فقط. أنا آسف لذلك.

إعجابَين (2)

يتوفر الآن الإصدار v1.2.0!

ما هو الجديد في هذا الإصدار:

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

نموذج التحدي — فترة تسجيل الدخول

لوحة التحكم — بداية الأسبوع في

وصول المشرفين عبر الشريط الجانبي

ملاحظة: يتطلب هذا الإصدار تشغيل ./launcher rebuild app لتطبيق هجرات قاعدة البيانات — لن يعمل زر التحديث في اللوحة لهذا الإصدار.


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

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

لا يمكنني إنشاء تحدي، حيث يُرجع خطأ 500 لأي إجراء.

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

هل يمكنك استخدام SSH للاتصال بخادمك، وتشغيل بعض الأوامر، ثم نشر النتائج؟

أولاً، تحقق من رقم إصدار الإضافة:

./launcher enter app
cat /var/www/discourse/plugins/discourse-daily-challenge/plugin.rb | grep version

بعد ذلك، حاول إنشاء تحدي. عند ظهور خطأ 500، قم بتشغيل الأمر التالي فورًا في جلسة SSH:

./launcher enter app
tail -50 /var/www/discourse/log/production.log

أخبرني بالنتائج، وسنحاول معرفة المشكلة.

Discourse 2026.3.0-latest.1 - https://github.com/discourse/discourse version f2781e1455274ea2c011fd1d161ac2ad9fde72bd

# version: 1.2.0
# required_version: 2.7.0
Started POST "/drafts.json" for 2804:1b0:f442:e48c:3056:bd27:b4ae:52b3 at 2026-0                                                                                        3-26 20:49:05 +0000
Processing by DraftsController#create as JSON
  Parameters: {"draft_key" => "topic_17746", "sequence" => "2", "data" => "{\"re                                                                                        ply\":\"@Discipulo na minha opinião eu não vou me estressar\",\"action\":\"reply                                                                                        \",\"categoryId\":14,\"tags\":[],\"archetypeId\":\"regular\",\"metaData\":null,\                                                                                        "composerTime\":25298,\"typingTime\":3900,\"locale\":\"\"}", "owner" => "fee91ce                                                                                        037e64ec297a500af13091165", "force_save" => "false"}
Completed 200 OK in 11ms (Views: 0.1ms | ActiveRecord: 0.0ms (0 queries, 0 cache                                                                                        d) | GC: 0.1ms)
Started GET "/t/os-melhores-blogs-de-games-no-brasil/15399?__cf_chl_rt_tk=5M6_rd                                                                                        _fq46BL9PZ6VvZRAVdIsJ84aL9XIfa1Re_paQ-1773238724-1.0.1.1-g20DH5dkOVXOIHhKYVpNwYR                                                                                        CQNnUboE4.po6L1TFk1E" for 164.52.120.12 at 2026-03-26 20:49:06 +0000
Processing by TopicsController#show as */*
  Parameters: {"__cf_chl_rt_tk" => "5M6_rd_fq46BL9PZ6VvZRAVdIsJ84aL9XIfa1Re_paQ-                                                                                        1773238724-1.0.1.1-g20DH5dkOVXOIHhKYVpNwYRCQNnUboE4.po6L1TFk1E", "slug" => "os-m                                                                                        elhores-blogs-de-games-no-brasil", "topic_id" => "15399"}
  Rendered layout layouts/application.html.erb (Duration: 107.3ms | GC: 1.4ms)
Completed 200 OK in 192ms (Views: 109.0ms | ActiveRecord: 0.0ms (0 queries, 0 ca                                                                                        ched) | GC: 2.4ms)
Started POST "/drafts.json" for 2804:1b0:f442:e48c:3056:bd27:b4ae:52b3 at 2026-0                                                                                        3-26 20:49:11 +0000
Processing by DraftsController#create as JSON
  Parameters: {"draft_key" => "topic_17746", "sequence" => "3", "data" => "{\"re                                                                                        ply\":\"@Discipulo na minha opinião eu não vou me estressar com o comportamento                                                                                         \",\"action\":\"reply\",\"categoryId\":14,\"tags\":[],\"archetypeId\":\"regular\                                                                                        ",\"metaData\":null,\"composerTime\":31344,\"typingTime\":4600,\"locale\":\"\"}"                                                                                        , "owner" => "fee91ce037e64ec297a500af13091165", "force_save" => "false"}
Completed 200 OK in 11ms (Views: 0.1ms | ActiveRecord: 0.0ms (0 queries, 0 cache                                                                                        d) | GC: 0.0ms)
Started GET "/leaderboard" for 2804:1e68:c201:632a:1161:4504:ea4d:9983 at 2026-0                                                                                        3-26 20:49:15 +0000
Processing by DiscourseGamification::GamificationLeaderboardController#respond a                                                                                        s JSON
Completed 200 OK in 30ms (Views: 0.1ms | ActiveRecord: 0.0ms (0 queries, 0 cache                                                                                        d) | GC: 0.0ms)
Started POST "/drafts.json" for 2804:1b0:f442:e48c:3056:bd27:b4ae:52b3 at 2026-0                                                                                        3-26 20:49:16 +0000
Processing by DraftsController#create as JSON
  Parameters: {"draft_key" => "topic_17746", "sequence" => "4", "data" => "{\"re                                                                                        ply\":\"@Discipulo na minha opinião eu não vou me estressar com o comportamento                                                                                         das outras pessoas \",\"action\":\"reply\",\"categoryId\":14,\"tags\":[],\"arche                                                                                        typeId\":\"regular\",\"metaData\":null,\"composerTime\":36481,\"typingTime\":510                                                                                        0,\"locale\":\"\"}", "owner" => "fee91ce037e64ec297a500af13091165", "force_save"                                                                                         => "false"}
Completed 200 OK in 11ms (Views: 0.1ms | ActiveRecord: 0.0ms (0 queries, 0 cache                                                                                        d) | GC: 0.0ms)
Started GET "/leaderboard/6?period=daily" for 2804:1e68:c201:632a:1161:4504:ea4d                                                                                        :9983 at 2026-03-26 20:49:19 +0000
Processing by DiscourseGamification::GamificationLeaderboardController#respond a                                                                                        s JSON
  Parameters: {"period" => "daily", "id" => "6"}
Completed 200 OK in 20ms (Views: 0.1ms | ActiveRecord: 0.0ms (0 queries, 0 cache                                                                                        d) | GC: 0.0ms)
Processing by UserAvatarsController#show as PNG
  Parameters: {"hostname" => "segredin.com", "username" => "mary", "size" => "28                                                                                        8", "version" => "8962_2"}
Completed 418  in 8ms (Views: 0.2ms | ActiveRecord: 0.0ms (0 queries, 0 cached)                                                                                         | GC: 0.0ms)
Sent file /var/www/discourse/public/uploads/default/optimized/2X/8/86ba5981dfff7                                                                                        6df7de0f2141a1a87ad805e2c5c_2_288x288.jpeg (0.2ms)
Started GET "/latest.json" for 2804:79d4:f008:68f:fd8c:855b:db16:bbee at 2026-03                                                                                        -26 20:49:23 +0000
Processing by ListController#latest as JSON
Completed 200 OK in 143ms (Views: 0.1ms | ActiveRecord: 0.0ms (0 queries, 0 cach                                                                                        ed) | GC: 6.8ms)
Started GET "/t/17746/1.json?track_visit=true&forceLoad=true" for 2804:79d4:f008                                                                                        :68f:fd8c:855b:db16:bbee at 2026-03-26 20:49:31 +0000
Processing by TopicsController#show as JSON
  Parameters: {"track_visit" => "true", "forceLoad" => "true", "topic_id" => "17                                                                                        746", "post_number" => "1"}
Completed 200 OK in 114ms (Views: 0.1ms | ActiveRecord: 0.0ms (0 queries, 0 cach                                                                                        ed) | GC: 1.8ms)
Started POST "/drafts.json" for 2804:1b0:f442:e48c:3056:bd27:b4ae:52b3 at 2026-0                                                                                        3-26 20:49:32 +0000
Processing by DraftsController#create as JSON
  Parameters: {"draft_key" => "topic_17746", "sequence" => "5", "data" => "{\"re                                                                                        ply\":\"@Discipulo na minha opinião eu não consigo k\",\"action\":\"reply\",\"ca                                                                                        tegoryId\":14,\"tags\":[],\"archetypeId\":\"regular\",\"metaData\":null,\"compos                                                                                        erTime\":46059,\"typingTime\":8500,\"locale\":\"\"}", "owner" => "fee91ce037e64e                                                                                        c297a500af13091165", "force_save" => "false"}
Completed 200 OK in 13ms (Views: 0.1ms | ActiveRecord: 0.0ms (0 queries, 0 cache                                                                                        d) | GC: 0.0ms)
Started POST "/drafts.json" for 2804:1b0:f442:e48c:3056:bd27:b4ae:52b3 at 2026-0                                                                                        3-26 20:49:36 +0000
Processing by DraftsController#create as JSON
  Parameters: {"draft_key" => "topic_17746", "sequence" => "6", "data" => "{\"re                                                                                        ply\":\"@Discipulo na minha opinião eu não consigo julgar \",\"action\":\"reply\                                                                                        ",\"categoryId\":14,\"tags\":[],\"archetypeId\":\"regular\",\"metaData\":null,\"                                                                                        composerTime\":50400,\"typingTime\":9100,\"locale\":\"\"}", "owner" => "fee91ce0                                                                                        37e64ec297a500af13091165", "force_save" => "false"}
Completed 200 OK in 10ms (Views: 0.1ms | ActiveRecord: 0.0ms (0 queries, 0 cache                                                                                        d) | GC: 0.0ms)
Started POST "/drafts.json" for 2804:1b0:f442:e48c:3056:bd27:b4ae:52b3 at 2026-0                                                                                        3-26 20:49:37 +0000
Processing by DraftsController#create as JSON
  Parameters: {"draft_key" => "topic_17746", "sequence" => "7", "data" => "{\"re                                                                                        ply\":\"@Discipulo na minha opinião eu não consigo julgar \",\"action\":\"reply\                                                                                        ",\"categoryId\":14,\"tags\":[],\"archetypeId\":\"regular\",\"metaData\":null,\"                                                                                        composerTime\":51596,\"typingTime\":9100,\"locale\":\"\"}", "owner" => "fee91ce0                                                                                        37e64ec297a500af13091165", "force_save" => "false"}
Completed 200 OK in 10ms (Views: 0.1ms | ActiveRecord: 0.0ms (0 queries, 0 cache                                                                                        d) | GC: 0.0ms)
Processing by TopicsController#timings as */*
  Parameters: {"timings" => {"1" => "59036"}, "topic_time" => "59036", "topic_id                                                                                        " => "17746"}
Completed 418  in 8ms (Views: 0.2ms | ActiveRecord: 0.0ms (0 queries, 0 cached)                                                                                         | GC: 0.0ms)

حmm. لا يُظهر هذا السجل خطأ 500. متى يحدث الخطأ بالضبط؟ هل ترى أي خطأ على الشاشة، أم فقط الرسالة العامة “حدث خطأ ما”؟ هل تتأكد من ملء جميع الحقول؟ خاصة معرف الموضوع؟

هل يمكنك محاولة إنشاء تحدي مرة أخرى وتشغيل هذا الأمر فورًا عند ظهور خطأ 500؟ سنزيد الحجم قليلاً:

./launcher enter app
tail -100 /var/www/discourse/log/production.log | grep -A 30 "500\|Error\|exception"

(حذف المنشور من قبل المؤلف)

انتظر، سأقوم بتفعيله مرة أخرى

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

إعجابَين (2)

شيء جديد؟ قمت بالتحديث هنا ولم يظهر شيء بعد

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

سأقوم بنشر منشور كامل يتضمن التغييرات بعد قليل.

إعجابَين (2)

أنا متأكد من أنني أقوم بذلك بالطريقة الخاطئة

الشك الأول: هل يمكن أن يكون معرف الموضوع موجودًا مسبقًا أم أنه يحتاج إلى إنشاء موضوع جديد؟
لقد فهمت أن الوسم يكون بدون علامة #.

هل يمكن أن تكون البداية والنهاية بضعة أيام أو أسابيع، أم يمكنني تحديد تاريخ حتى ديسمبر مثلًا؟

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

يجب أن يكون معرف الموضوع موجودًا ويمكن لحسابك الوصول إليه (أفترض أنك مدير، لذا لا ينبغي أن يكون ذلك مشكلة). مثال: إذا كان عنوان URL للموضوع هو:

https://community.com/t/test-formatting/722

فإن معرف الموضوع الذي ستدخله هو: 722

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

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

يمكن أن تكون تواريخ البدء والنهاية أي شيء تريده.

activerecord (8.0.5) lib/active_record/inheritance.rb:76:in 'ActiveRecord::Inheritance::ClassMethods#new'
plugins/discourse-daily-challenge/app/controllers/discourse_daily_challenge/admin_daily_challenges_controller.rb:26:in 'DiscourseDailyChallenge::AdminDailyChallengesController#create'

إعداداتي الأولى

وسجلاتي الأخيرة