Insignia basada en cuándo fue la primera promoción de usuario a moderador?

¡Hola a todos! Busqué, pero no encontré nada.

¿Hay alguna forma de asignar una insignia según el tiempo que un usuario ha sido moderador?

En nuestro caso, tenemos moderadores que han sido una parte esencial del equipo durante muchos años y queremos darles una insignia especial.

Básicamente, la consulta debería verificar las siguientes condiciones:
¿Es el usuario actualmente un moderador?
¿Cuántos días ha tenido el usuario el rol de moderador?

De esta manera, queremos otorgar insignias a los moderadores que han estado activos durante 1, 3, 5 años, etc.

Aún no he intentado configurarlo como insignia SQL, pero aquí tienes una consulta del explorador de datos para obtener los días de moderador como su rol:

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 Me gusta

Acabo de etiquetar esto como sql-triggered-badge, pero pensé en preguntar si buscas uno automático o no. Supongo que quizás no tengas una gran cantidad de moderadores y podrías otorgar esta insignia manualmente basándote en una consulta del explorador de datos.


Creo que una versión simplificada de la anterior podría 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)

Esta funcionaría como una consulta del explorador de datos en lugar de un conjunto de insignias SQL, y puede seleccionar una lista de usuarios que cumplen los criterios para que puedas otorgarles manualmente la insignia.

Hay una advertencia: si abandonaron el grupo de moderadores en algún momento y se volvieron a unir, solo contaría la última inclusión. Creo que sería posible usar la tabla user_histories para solucionar eso, pero si es una excepción, es probable que sea más fácil tenerla en cuenta manualmente también.

2 Me gusta

Sí, se supone que es automático. Básicamente, solo queremos establecer varias insignias para los moderadores (1 año, 2 años, 3 años, etc.) según el tiempo que lleven como moderadores y otorgarles insignias automáticamente.

1 me gusta

Creo que el anterior es adaptable si eliminas el parámetro y cambias el WHERE para que sean los diferentes umbrales de días para cada uno, por ejemplo.

WHERE days_as_mod > 365

(El disparador sería update daily)

Gracias, técnicamente podríamos hacer eso, pero mientras podamos hacerlo automáticamente de una manera que no comprometa la seguridad, preferiremos esa opción. :slight_smile:

Realmente aprecio el código e intentaremos implementarlo junto con nuestro hoster CommuniteQ y le informaremos aquí.

1 me gusta