# Значок на основе даты первого назначения пользователя модератором?

**URL:** https://meta.discourse.org/t/badge-based-on-when-user-was-promoted-to-moderator-first-time/303035
**Category:** Data & reporting
**Tags:** sql-triggered-badge
**Created:** [09.Апрель.2024 13:24:34 UTC](https://meta.discourse.org/t/badge-based-on-when-user-was-promoted-to-moderator-first-time/303035 "2024-04-09T13:24:34Z")
**Posts on this page:** 6
**Page:** 1

<div class="post-metadata">

### Author: ![jrgong](https://avatars.discourse-cdn.com/v4/letter/j/c57346/32.png) [@jrgong](https://meta.discourse.org/u/jrgong)
#### Post date: [09.Апрель.2024 13:24:34 UTC](https://meta.discourse.org/t/badge-based-on-when-user-was-promoted-to-moderator-first-time/303035/1 "2024-04-09T13:24:34Z")

</div>

Привет, ребята! Я искал, но ничего не нашёл.

Есть ли способ назначить бейдж в зависимости от того, как долго пользователь является модератором?

В нашем случае у нас есть модераторы, которые являются неотъемлемой частью команды уже много лет, и мы хотим вручить им специальный бейдж.

По сути, запрос должен проверять следующие условия:  
Является ли пользователь в данный момент модератором?  
Сколько дней пользователь занимал роль модератора?

Таким образом, мы хотим выдавать бейджи модераторам, которые активны 1 год, 3 года, 5 лет и так далее.

---

<div class="post-metadata">

### Author: ![Lilly](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/lilly/32/575047_2.png) [@Lilly](https://meta.discourse.org/u/Lilly)
#### Post date: [09.Апрель.2024 13:55:02 UTC](https://meta.discourse.org/t/badge-based-on-when-user-was-promoted-to-moderator-first-time/303035/2 "2024-04-09T13:55:02Z")

</div>

Я не пробовал настраивать это как SQL-бейдж, но вот запрос для [Data Explorer](https://meta.discourse.org/t/32566?silent=true), чтобы получить количество дней, в течение которых пользователь имеет роль модератора:

```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

```

---

<div class="post-metadata">

### Author: ![JammyDodger](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jammydodger/32/254611_2.png) [@JammyDodger](https://meta.discourse.org/u/JammyDodger)
#### Post date: [19.Апрель.2024 06:00:15 UTC](https://meta.discourse.org/t/badge-based-on-when-user-was-promoted-to-moderator-first-time/303035/7 "2024-04-19T06:00:15Z")

</div>

Я только что пометил это как #sql-triggered-badge, но хотел уточнить: вы ищете автоматический бейдж или нет? Предполагаю, что у вас может быть не так много модов, и, возможно, этот бейдж можно выдавать вручную на основе запроса к [Data Explorer](https://meta.discourse.org/t/32566?silent=true)?

* * *

Думаю, упрощённая версия предыдущего запроса может выглядеть так:

```sql
-- [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 -- id группы «модераторы»
  AND user_id > 0 -- исключаем системных пользователей и ботов

)

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

```

Этот запрос можно использовать в [Data Explorer](https://meta.discourse.org/t/32566?silent=true) вместо набора SQL-бейджей. Он позволит получить список пользователей, соответствующих критериям, чтобы вы могли вручную выдать им бейдж.

Есть один нюанс: если пользователь в какой-то момент покинул группу модераторов, а затем снова вступил в неё, будет учтён только последний период нахождения в группе. Думаю, можно обойти это ограничение, используя таблицу `user_histories`, но если такие случаи редки, проще учесть их вручную.

---

<div class="post-metadata">

### Author: ![jrgong](https://avatars.discourse-cdn.com/v4/letter/j/c57346/32.png) [@jrgong](https://meta.discourse.org/u/jrgong)
#### Post date: [22.Апрель.2024 09:59:19 UTC](https://meta.discourse.org/t/badge-based-on-when-user-was-promoted-to-moderator-first-time/303035/8 "2024-04-22T09:59:19Z")

</div>

> [@JammyDodger](#):
>
> но подумал, что стоит уточнить, ищете ли вы автоматическое решение или нет?

Да, оно должно быть автоматическим. По сути, мы хотим назначать нескольким модераторам значки (за 1 год, 2 года, 3 года и т. д.) в зависимости от того, как долго они являются модераторами, и выдавать эти значки автоматически.

---

<div class="post-metadata">

### Author: ![JammyDodger](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jammydodger/32/254611_2.png) [@JammyDodger](https://meta.discourse.org/u/JammyDodger)
#### Post date: [22.Апрель.2024 11:50:46 UTC](https://meta.discourse.org/t/badge-based-on-when-user-was-promoted-to-moderator-first-time/303035/9 "2024-04-22T11:50:46Z")

</div>

Думаю, вариант выше можно адаптировать, если убрать параметр и изменить `WHERE` на различные пороги дней для каждого случая, например:

`WHERE days_as_mod > 365`

(Триггером будет `update daily`)

---

<div class="post-metadata">

### Author: ![jrgong](https://avatars.discourse-cdn.com/v4/letter/j/c57346/32.png) [@jrgong](https://meta.discourse.org/u/jrgong)
#### Post date: [24.Апрель.2024 10:23:39 UTC](https://meta.discourse.org/t/badge-based-on-when-user-was-promoted-to-moderator-first-time/303035/10 "2024-04-24T10:23:39Z")

</div>

Спасибо. Технически мы могли бы это сделать, но пока существует возможность реализовать это автоматически без ущерба для безопасности, мы предпочтем именно такой вариант. 🙂

Я очень ценю предоставленный код и мы постараемся внедрить его совместно с нашим хостинг-провайдером CommuniteQ, после чего сообщим об этом здесь.
