Gamificação do Discourse

É possível redefinir manualmente a URL da Leaderboard de alguma forma?

Por exemplo, de leaderboards/2 para leaderboards/1.

É possível atribuir pontos a um usuário como recompensa adicional? :grin:

1 curtida

Você pode querer ver:

que tem esta solicitação curl dentro:

curl --location 'https://my.discourse.com/admin/plugins/gamification/score_events' \
--header 'Api-Key: <sua chave>' \
--header 'Api-Username: <seu nome de usuário>' \
--header 'Content-Type: application/json' \
--data '{
    "user_id": "101",
    "date": "2024-05-15",
    "points": "-141",
    "description": "Ajuste de pontos de gamificação"
}'
2 curtidas

Eu ativei este plugin no admin, mas a barra de guias não exibiu automaticamente o Leaderboard, e adicionar novas listas também não fez com que elas aparecessem. Por que isso acontece? Onde devo procurar por essas listas?

Eu acho que você tem que adicioná-los à barra lateral sozinho :thinking:. As tabelas de classificação estão em /leaderboard, /leaderboard/2, /leaderboard/3, etc.

É possível criar um ranking para uma categoria ou tag específica?

As leaderboards estão vinculadas a grupos. Mas você pode especificar quais categorias afetam todas as leaderboards nas configurações de gamificação. Parece uma ideia interessante mover isso para a leaderboard, para, por exemplo, ter uma leaderboard de #suporte aqui nesta comunidade.

3 curtidas

2 posts foram divididos em um novo tópico: Reduzindo pontos para usuários sinalizados

Existe uma maneira de me excluir dos rankings?

sim, adicione-se a um novo grupo (chame-o de ‘leaderboard-exclusion’ ou algo assim) e, em seguida, exclua o grupo nas configurações do plugin.

editar: isso também permitirá que você exclua facilmente qualquer outra pessoa, se desejar em algum momento, adicionando-a ao mesmo grupo. :slight_smile:

3 curtidas

Muito obrigado. Isso faz sentido.

2 curtidas

Após atualizar para a versão 2026.1.0, criei um novo placar mensal e encontrei um erro ao acessar a seguinte rota:

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

O erro é o seguinte:

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)

Localizei o arquivo com o problema da seguinte forma:

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

O código específico é:

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

A causa do erro é:

Erro de asserção do gerenciamento de estado reativo do Ember.js (mais precisamente, do sistema de rastreamento Glimmer). O cerne do problema é: dentro do mesmo ciclo de computação, você primeiro lê um valor tracked (rastreado) e depois tenta modificar esse valor. Essa operação de “usar antes de atualizar” causa confusão lógica, loops infinitos ou problemas de desempenho, e, portanto, o Ember proíbe diretamente esse comportamento.

Problema chave:

  • Array.sort() modifica o array original no local, o que atualiza o estado leaderboards @tracked.
  • A função computada (sortedLeaderboards) tem a responsabilidade de derivar um novo valor, e não de modificar o estado original; ela deve ser uma “função pura” (sem efeitos colaterais, não modifica a fonte de entrada).

A seguir está a solução de correção:

  @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)) || []
    );
  }

Captura de tela após a correção:

Parece que esse tipo de problema não é um caso isolado. Eu suspeito que seja um problema de incompatibilidade causado pela atualização do emberjs. No entanto, muitos desses locais nos plugins não foram modificados em sincronia com a atualização, pois esse trabalho não é tão simples quanto parece.

Pergunta: Há um atraso na atribuição de pontos? Por exemplo, novos usuários estão realizando ações que pagam pontos, como postar um novo tópico ou dar um “curtir”, mas suas pontuações não aparecem. Eu incluí o nível de confiança 0 nas configurações, então presumo que seja apenas um atraso na atribuição de pontos? Se for esse o caso, com que frequência ele calcula e atualiza? Obrigado!

4 curtidas