Distintivo baseado em quando o usuário foi promovido a moderador pela primeira vez?

Olá pessoal! Tentei pesquisar, mas não encontrei nada.

Existe alguma maneira de atribuir um distintivo com base em quanto tempo um usuário é moderador?

No nosso caso, temos moderadores que são parte essencial da equipe há muitos anos e queremos dar a eles um distintivo especial.

Basicamente, a consulta deve verificar as condições:
O usuário é atualmente um moderador?
Quantos dias o usuário ocupou o cargo de moderador?

Dessa forma, queremos distribuir distintivos para moderadores que estiveram ativos por 1 ano, 3 anos, 5 anos, etc.

Ainda não tentei configurar como badge sql, mas aqui está uma consulta do explorador de dados para obter os dias de moderador como sua função:

WITH moderator_role_dates AS (
    SELECT
        gu.user_id,
        MIN(gu.created_at) AS role_granted_date
    FROM
        group_users gu
        JOIN groups g ON gu.group_id = g.id
    WHERE
        g.name = 'moderators'
    GROUP BY
        gu.user_id
),
current_date_info AS (
    SELECT
        CURRENT_DATE AS today
)
SELECT
    mrd.user_id,
    u.username,
    mrd.role_granted_date,
    cdi.today,
    (cdi.today - mrd.role_granted_date) AS days_in_role
FROM
    moderator_role_dates mrd
    JOIN users u ON mrd.user_id = u.id,
    current_date_info cdi
ORDER BY
    days_in_role DESC
3 curtidas

Acabei de marcar isto como sql-triggered-badge, mas pensei em verificar se você está procurando um automático ou não? Presumo que você pode não ter uma grande quantidade de mods e poderia talvez conceder este distintivo manualmente com base em uma consulta do explorador de dados?


Acho que uma versão simplificada da acima poderia ser:

-- [params]
-- int :years

WITH time_in_mod_group AS (

SELECT
    user_id,
    (CURRENT_DATE - created_at::date) AS days_as_mod
FROM group_users
WHERE group_id = 2 -- group id of the 'moderator' group
  AND user_id > 0 -- exclude system users and bots

)

SELECT
    user_id,
    days_as_mod
FROM time_in_mod_group
WHERE days_as_mod > (365 * :years)

Este funcionaria como uma consulta do explorador de dados em vez de um conjunto de distintivos SQL, e pode selecionar uma lista de usuários que se encaixam nos critérios para que você possa conceder manualmente o distintivo a eles.

Há uma ressalva de que se eles saírem do grupo de mod a qualquer momento e voltarem a entrar, isso só contaria a inclusão mais recente. Acho que seria possível usar a tabela user_histories para contornar isso, mas se for uma exceção, é provável que seja mais fácil contabilizá-la manualmente também.

2 curtidas

Sim, supostamente é automático. Basicamente, queremos definir vários emblemas para moderadores (1 ano, 2 anos, 3 anos, etc.) com base em quanto tempo eles são moderadores e conceder-lhes emblemas automaticamente.

1 curtida

Eu acho que o acima é adaptável se você remover o parâmetro e alterar o WHERE para ser os diferentes limites de dias para cada um, por exemplo.

WHERE days_as_mod > 365

(O gatilho seria update daily)

Obrigado, tecnicamente poderíamos fazer isso, mas desde que possamos fazer isso automaticamente de uma forma que não comprometa a segurança, preferiremos optar por isso. :slight_smile:

Eu realmente aprecio o código e tentaremos implementá-lo junto com nosso hoster CommuniteQ e relataremos aqui.

1 curtida