Геймификация Discourse

Возможно ли как-то вручную сбросить или изменить URL таблицы лидеров? В нашем случае мы протестировали несколько таблиц лидеров, а затем удалили их.

Например, изменить /leaderboards/5 на /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.

4 лайка

2 сообщения были перенесены в новую тему: Снижение баллов для пользователей с флагами

Можно ли мне исключить себя из рейтинга?

Да, добавьте себя в новую группу (назовите её, например, «leaderboard-exclusion» или как-то иначе), а затем исключите эту группу в настройках плагина.

edit: это также позволит вам легко исключить любого другого пользователя, если вы захотите сделать это позже, просто добавив его в ту же группу. :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)) || []
    );
  }

Скриншот после исправления:

Кажется, что подобные проблемы не единичны. Я предполагаю, что это вызвано несовместимостью после обновления Ember.js. Однако многие плагины не были обновлены соответствующим образом, так как эта задача не так проста, как кажется на первый взгляд.

Вопрос: Есть ли задержка при начислении баллов? Например, новые пользователи выполняют действия, за которые начисляются баллы (например, создают новую тему или ставят лайк), но их очки не отображаются. В настройках включён уровень доверия 0, поэтому я предполагаю, что это просто задержка в присвоении баллов? Если да, то как часто происходит расчёт и обновление? Спасибо!

4 лайка

Я хотел бы вернуться к этой идее. На данный момент я заблокировал таблицы лидеров одной категорией, но перенос этого в индивидуальную таблицу лидеров был бы лучше.

2 лайка

Это то, что мы действительно хотим сделать, вопрос лишь в том, чтобы найти время для этого или найти клиента, который спонсирует эту работу.

5 лайков

Привет,

Я создал новую таблицу лидеров, но она стерла настройки моей исходной таблицы лидеров.

Есть ли способ выбрать, какую таблицу лидеров видят пользователи на фронтенде?

Вы можете настроить секцию, чтобы перейти напрямую по выбранной ссылке на рейтинг

2 лайка