تحويل النقاش إلى لعبة

هل من الممكن إعادة تعيين عنوان URL للوحة المتصدرين يدويًا؟

على سبيل المثال، leaderboards/2 إلى leaderboards/1.

هل من الممكن منح نقاط للمستخدم كمكافأة إضافية؟ :grin:

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

قد ترغب في رؤية:

والذي يحتوي على طلب curl هذا بداخله:

curl --location 'https://my.discourse.com/admin/plugins/gamification/score_events' \
--header 'Api-Key: <your key>' \
--header 'Api-Username: <your username>' \
--header 'Content-Type: application/json' \
--data '{
    "user_id": "101",
    "date": "2024-05-15",
    "points": "-141",
    "description": "Gamification point adjustment"
}'
إعجابَين (2)

لقد قمت بتفعيل هذه الإضافة في لوحة التحكم، لكن شريط علامات التبويب لم يعرض “Leaderboard” تلقائيًا، ولم تظهر عند إضافة قوائم جديدة. ما السبب؟ وأين يمكنني رؤية هذه القوائم؟

أعتقد أنه عليك إضافتها إلى الشريط الجانبي بنفسك :thinking:. لوحات الصدارة موجودة في /leaderboard و /leaderboard/2 و /leaderboard/3 وما إلى ذلك.

هل من الممكن إنشاء لوحة صدارة لفئة أو علامة معينة؟

تتصل لوحات الصدارة بالمجموعات. ولكن يمكنك تحديد الفئات التي تؤثر على جميع لوحات الصدارة في إعدادات التلعيب. يبدو أنها فكرة مثيرة للاهتمام لنقلها إلى لوحة الصدارة، على سبيل المثال، لوحة صدارة Support هنا في هذا المجتمع.

3 إعجابات

تم تقسيم منشورين إلى موضوع جديد: تقليل النقاط للمستخدمين الذين تم وضع علامة عليهم

هل هناك طريقة لاستبعادي من التصنيفات؟

نعم، أضف نفسك إلى مجموعة جديدة (سمّها ‘leaderboard-exclusion’ أو شيء من هذا القبيل) ثم استبعد المجموعة في إعدادات المكوّن الإضافي.

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

3 إعجابات

شكراً جزيلاً. هذا منطقي.

إعجابَين (2)

بعد الترقية إلى الإصدار 2026.1.0، قمت بإنشاء لوحة صدارة شهرية جديدة، ثم ظهر خطأ عند الوصول إلى المسار التالي:

http://localhost:4200/admin/plugins/discourse-gamification/leaderboards

الخطأ هو كما يلي:

assert.js:40 
 Uncaught (in promise) Error: Assertion Failed: You attempted to update `_value` on `TrackedStorageImpl`, but it had already been used previously in the same computation.  Attempting to update a value after using it in a computation can cause logical errors, infinite revalidation bugs, and performance issues, and is not supported.

`_value` was first used:

- While rendering:
  {{outlet}} for -top-level
    -top-level
      {{outlet}} for application
        application
          DiscourseRoot
            {{outlet}} for admin
              admin
                {{outlet}} for adminPlugins
                  admin-plugins
                    {{outlet}} for adminPlugins.show
                      show
                        AdminPluginConfigPage
                          AdminPluginConfigArea
                            {{outlet}} for adminPlugins.show.discourse-gamification-leaderboards
                              adminPlugins.show.discourse-gamification-leaderboards
                                {{outlet}} for adminPlugins.show.discourse-gamification-leaderboards.index
                                  discourse-gamification-leaderboards
                                    DPageSubheader
                                      (result of a `unknown` helper)

Stack trace for the update:
    at TrackedArray._dirtyCollection2 (array.ts:163:13)
    at Object.set (array.ts:126:15)
    at Proxy.sort (<anonymous>)
    at AdminPluginsShowDiscourseGamificationLeaderboardsIndexController.sortedLeaderboards (index.js:23:1)
    at AdminPluginsShowDiscourseGamificationLeaderboardsIndexController.<anonymous> (handle-descriptor.js:67:17)

لقد حددت الملف الذي حدث فيه الخطأ على النحو التالي:

plugins/discourse-gamification/admin/assets/javascripts/discourse/controllers/admin-plugins/show/discourse-gamification-leaderboards/index.js

الكود المحدد:

  @discourseComputed("model.leaderboards.@each.updatedAt")
  sortedLeaderboards(leaderboards) {
    return (
      leaderboards?.sort((a, b) => compare(b?.updatedAt, a?.updatedAt)) || [] // السطر 22
    );
  }

سبب الخطأ هو:

خطأ تأكيد إدارة الحالة التفاعلية في Ember.js (أو بتعبير أدق، نظام التتبع Glimmer)، والسبب الجوهري هو: في نفس دورة الحساب، تقوم أولاً بقراءة قيمة tracked (الحالة المتعقبة)، ثم تحاول تعديل هذه القيمة، وهذا النوع من العمليات “الاستخدام أولاً ثم التحديث” يسبب ارتباكًا منطقيًا أو حلقات لا نهائية أو مشاكل في الأداء، ولذلك يمنع Ember هذا السلوك مباشرة.

المشكلة الرئيسية:

  • Array.sort() يعدل المصفوفة الأصلية في مكانها، مما يؤدي إلى تحديث حالة leaderboards المتعقبة (@tracked).
  • وظيفة الخاصية المحسوبة (sortedLeaderboards) هي اشتقاق قيمة جديدة، وليس تعديل الحالة الأصلية؛ يجب أن تكون “دالة نقية” (بدون آثار جانبية، لا تعدل مصدر الإدخال).

فيما يلي طريقة الإصلاح:

  @discourseComputed("model.leaderboards.@each.updatedAt")
  sortedLeaderboards(leaderboards) {
    return (
      //leaderboards?.sort((a, b) => compare(b?.updatedAt, a?.updatedAt)) || []
      leaderboards?.slice().sort((a, b) => compare(b?.updatedAt, a?.updatedAt)) || []
    );
  }

لقطة الشاشة بعد الإصلاح:

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

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

4 إعجابات