ユーザーが初めてモデレーターに昇格した時のバッジ?

皆さん、こんにちは!検索してみましたが、何も見つかりませんでした。

ユーザーがモデレーターになってからの期間に基づいてバッジを割り当てる方法はありますか?

当社のチームにとって長年不可欠な存在であるモデレーターに特別なバッジを贈りたいと考えています。

基本的に、クエリは次の条件を確認する必要があります。
ユーザーは現在モデレーターですか?
ユーザーがモデレーターの役割をどれだけの日数保持していますか?

これにより、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' グループのグループ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