Discourse ゲーミフィケーション

リーダーボードのURLを何らかの方法で手動でリセットすることは可能ですか?

例えば、leaderboards/2leaderboards/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

2件の投稿が新しいトピックに分割されました: フラグが付けられたユーザーのポイント削減

ランキングから自分を除外する方法はありますか?

はい、新しいグループ(「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()元の配列をインプレースで変更するため、@trackedleaderboards 状態が更新されてしまう。

  • 計算プロパティ (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