리더보드 URL을 수동으로 재설정하거나 다시 작성할 수 있는 방법이 있을까요? 저희는 리더보드를 몇 개 테스트한 후 나중에 삭제했습니다.
예를 들어, /leaderboards/5를 /leaderboards/1로 변경하는 경우입니다.
리더보드 URL을 수동으로 재설정하거나 다시 작성할 수 있는 방법이 있을까요? 저희는 리더보드를 몇 개 테스트한 후 나중에 삭제했습니다.
예를 들어, /leaderboards/5를 /leaderboards/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"
}'
관리자 화면에서 이 플러그인을 활성화했지만, 탭에 리더보드가 자동으로 표시되지 않았습니다. 새 리더보드를 추가해도 여전히 표시되지 않습니다. 왜 그런가요? 이 리더보드들을 어디서 볼 수 있나요?
사이드바에 직접 추가해야 할 것 같아요
. 리더보드는 /leaderboard, /leaderboard/2, /leaderboard/3 등에 있습니다.
특정 카테고리나 태그에 대한 리더보드를 만들 수 있을까요?
리더보드는 그룹과 연결되어 있습니다. 하지만 게임화 설정에서 모든 리더보드에 영향을 미치는 카테고리를 지정할 수 있습니다. 이를 리더보드 단위로 이동하여, 예를 들어 이 커뮤니티에서 Support 리더보드를 만들 수 있는 것도 흥미로운 아이디어입니다.
2개의 게시물이 새 주제 신고된 사용자의 포인트 감소로 분리되었습니다
랭킹에서 제외될 방법이 있을까요?
네, 새로운 그룹(예: ‘leaderboard-exclusion’ 등)을 만들고 자신에게 추가한 다음, 플러그인 설정에서 해당 그룹을 제외하세요.
수정: 이 방법은 나중에 원할 경우 다른 사용자를 같은 그룹에 추가하여 쉽게 제외할 수도 있습니다. ![]()
정말 감사합니다. 이해가 됩니다.
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을 포함해 두었기 때문에, 단순히 포인트 배정에 지연이 있는 것 같다고 추측하고 있습니다. 그렇다면 계산과 업데이트는 얼마나 자주 이루어지나요? 감사합니다!
이 아이디어를 다시 검토하고 싶습니다. 현재는 리더보드를 1개 카테고리로 제한해 두었지만, 개별 리더보드로 이동하는 것이 더 좋겠습니다.
우리는 정말로 하고 싶은 일인데, 단순히 시간을 내거나 그 작업을 후원해줄 고객을 찾는 문제입니다.
안녕하세요,
새로운 리더보드를 만들었는데, 기존 리더보드의 설정이 초기화되었습니다.
프론트엔드에서 사용자가 어떤 리더보드를 보게 할지 선택하는 방법이 있을까요?
사용자가 직접 정의한 이벤트로도 포인트를 지급할 수 있으면 좋겠습니다. 예를 들어, 저는 Discourse Points Mall 플러그인을 저희 모더레이터, 그리고 어쩌면 커뮤니티 멤버들에게도 사용할 계획입니다. 이를 통해 Discord에서의 활동에 대한 보상을 지급하고, 향후에는 게임 내에서도 보상을 지급할 수 있을 것입니다.
수동으로 포인트를 지급하는 방식이거나, 사용자가 입력해야 하는 리디머 코드 형태로 작동할 수 있을 것 같습니다. 이 플러그인의 범위가 Discourse 내부의 상호작용에 더 초점이 맞춰져 있다는 점은 이해하지만, 그 범위를 넓힐 수 있다면 좋겠습니다. 제 사용 사례처럼 Discourse는 저희 생태계의 일부일 뿐, 유일한 목적지가 아니기 때문입니다.
수정: 위에서 언급한 기능들을 API를 통해 구현할 수 있는 방법들이 있다는 점은 알고 있습니다. 하지만 그러한 방식들은 외부 소스를 위해 더 최적화되어 있다고 생각하며, 포인트 지급이 가능할지라도 네이티브로 지원되는 기능이 있다면 더 좋다고 생각합니다 ![]()
외부 시스템과 Discourse 게이미피케이션 통합하기 (포인트 사용 및 부여) 글을 확인해 보셨나요?