用户首次晋升版主时发放徽章?

各位!我尝试搜索了一下,但什么也没找到。

有没有办法根据用户担任版主的时间长短来授予徽章?

在我们的例子中,有一些版主多年来一直是团队的重要组成部分,我们想给他们一个特殊的徽章。

基本上,查询应该检查以下条件:
用户当前是版主吗?
用户担任版主角色多少天了?

这样我们就可以为活跃了 1 年、3 年、5 年等的版主发放徽章。

尚未尝试将其设置为徽章 SQL,但这是一个用于获取版主作为其角色的天数的数据浏览器查询:

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 个赞

我刚刚将此标记为 sql-triggered-badge,但我想确认您是在寻找自动徽章还是手动徽章?我假设您可能没有很多版主,并且可以根据数据浏览器查询手动授予此徽章?


我认为上面简化版本可以这样写:

-- [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 -- 'moderator' group 的 group id
  AND user_id > 0 -- 排除系统用户和机器人

)

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

这可以作为一个数据浏览器查询而不是一组 SQL 徽章来使用,并且可以选出符合条件的用户名列表,以便您手动授予他们徽章。

有一个注意事项是,如果他们中途离开版主组然后重新加入,它将只计算最新的加入时间。我认为可以使用 user_histories 表来解决这个问题,但如果这是一个例外情况,那么手动处理可能更容易。

2 个赞

是的,应该是自动的。基本上,我们只是想为版主设置多个徽章(1年、2年、3年等),根据他们担任版主的时间自动授予他们徽章。

1 个赞

我认为上面的那个可以适应,如果你移除参数并将 WHERE 改为每个不同的天数阈值,例如。

WHERE days_as_mod > 365

(触发器将是 update daily

谢谢,理论上我们可以做到,但只要我们能以不损害安全性的方式自动完成,我们宁愿选择这种方式。:slight_smile:

我非常感谢这段代码,我们将尝试与我们的主机提供商 CommuniteQ 一起实施它,并在此处反馈。

1 个赞