디스코urs 게이미피케이션

리더보드 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개의 좋아요

관리자 화면에서 이 플러그인을 활성화했지만, 탭에 리더보드가 자동으로 표시되지 않았습니다. 새 리더보드를 추가해도 여전히 표시되지 않습니다. 왜 그런가요? 이 리더보드들을 어디서 볼 수 있나요?

사이드바에 직접 추가해야 할 것 같아요 :thinking:. 리더보드는 /leaderboard, /leaderboard/2, /leaderboard/3 등에 있습니다.

특정 카테고리나 태그에 대한 리더보드를 만들 수 있을까요?

리더보드는 그룹과 연결되어 있습니다. 하지만 게임화 설정에서 모든 리더보드에 영향을 미치는 카테고리를 지정할 수 있습니다. 이를 리더보드 단위로 이동하여, 예를 들어 이 커뮤니티에서 Support 리더보드를 만들 수 있는 것도 흥미로운 아이디어입니다.

4개의 좋아요

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()는 원본 배열을 제자리(in-place)에서 수정하므로 @tracked된 leaderboards 상태를 업데이트하게 됩니다.

  • 계산 프로퍼티(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 업그레이드로 인한 비호환성 문제라고 추측합니다. 그리고 많은 플러그인에서 이러한 부분이 업그레이드와 함께 동기화되어 수정되지 않았습니다.毕竟 이 작업은 말처럼 간단하지 않으니까요.

질문: 포인트가 지급되는 데 지연이 있나요? 예를 들어, 새 사용자가 새 주제 게시나 좋아요 부여와 같은 포인트를 받는 활동을 하지만, 점수가 표시되지 않습니다. 설정에 신뢰 수준 0을 포함해 두었기 때문에, 단순히 포인트 배정에 지연이 있는 것 같다고 추측하고 있습니다. 그렇다면 계산과 업데이트는 얼마나 자주 이루어지나요? 감사합니다!

4개의 좋아요

이 아이디어를 다시 검토하고 싶습니다. 현재는 리더보드를 1개 카테고리로 제한해 두었지만, 개별 리더보드로 이동하는 것이 더 좋겠습니다.

2개의 좋아요

우리는 정말로 하고 싶은 일인데, 단순히 시간을 내거나 그 작업을 후원해줄 고객을 찾는 문제입니다.

5개의 좋아요

안녕하세요,

새로운 리더보드를 만들었는데, 기존 리더보드의 설정이 초기화되었습니다.

프론트엔드에서 사용자가 어떤 리더보드를 보게 할지 선택하는 방법이 있을까요?

섹션을 커스터마이즈하여 선택한 순위표 링크로 직접 이동할 수 있습니다

2개의 좋아요

사용자가 직접 정의한 이벤트로도 포인트를 지급할 수 있으면 좋겠습니다. 예를 들어, 저는 Discourse Points Mall 플러그인을 저희 모더레이터, 그리고 어쩌면 커뮤니티 멤버들에게도 사용할 계획입니다. 이를 통해 Discord에서의 활동에 대한 보상을 지급하고, 향후에는 게임 내에서도 보상을 지급할 수 있을 것입니다.

수동으로 포인트를 지급하는 방식이거나, 사용자가 입력해야 하는 리디머 코드 형태로 작동할 수 있을 것 같습니다. 이 플러그인의 범위가 Discourse 내부의 상호작용에 더 초점이 맞춰져 있다는 점은 이해하지만, 그 범위를 넓힐 수 있다면 좋겠습니다. 제 사용 사례처럼 Discourse는 저희 생태계의 일부일 뿐, 유일한 목적지가 아니기 때문입니다.

수정: 위에서 언급한 기능들을 API를 통해 구현할 수 있는 방법들이 있다는 점은 알고 있습니다. 하지만 그러한 방식들은 외부 소스를 위해 더 최적화되어 있다고 생각하며, 포인트 지급이 가능할지라도 네이티브로 지원되는 기능이 있다면 더 좋다고 생각합니다 :wink:

2개의 좋아요

외부 시스템과 Discourse 게이미피케이션 통합하기 (포인트 사용 및 부여) 글을 확인해 보셨나요?