获得更高等级时,是否撤销低级别徽章?

如何排除已授予更高等级的自定义徽章的权利?目标是仅授予用户有资格获得的最高等级…

假设我有 3 个徽章:

等级 1:赠送 5 个赞,收到 5 个赞
等级 2:赠送 100 个赞,收到 100 个赞
等级 3:赠送 250 个赞,收到 250 个赞

下面的代码是针对等级 2 的。其他等级除了数字“100”之外没有其他区别。

SELECT us.user_id, current_timestamp AS granted_at 
FROM user_stats AS us
WHERE us.likes_received >= 100 
AND us.likes_given >= 100
AND (:backfill OR us.user_id IN (:user_ids))
1 个赞

/admin/badges/BADGE-ID 设置中,只需勾选 Run revocation query daily(每日运行撤销查询)选项。如果用户不再满足 SQL 标准,徽章将被移除。

您可能还希望将它们设置为 Update Daily(每日更新),以便授予/撤销操作在同一时间(我认为是您实例的午夜本地时间)进行。

3 个赞

谢谢,内森。我会看看的。

1 个赞

这个也需要在徽章 SQL 中添加额外的行来平衡吗?类似这样:

SELECT us.user_id, current_timestamp AS granted_at 
FROM user_stats AS us
WHERE us.likes_received >= 100 
AND us.likes_given >= 100
AND us.likes_given < 250
AND (:backfill OR us.user_id IN (:user_ids))

(可能使用 BETWEEN 或类似方法,但我还没测试过 :slight_smile:

然后当查询运行时,它会第一次授予 100 个赞的徽章,忽略 101 到 249 个赞,然后在 250 个赞时撤销(下一个徽章将从那里开始)。


更新: 我对 BETWEEN 进行了一些练习,在示例测试中,类似这样的内容似乎能捕捉到所有合适的人:

SELECT us.user_id
FROM user_stats AS us
WHERE us.likes_received BETWEEN 100 AND 249 
ORDER BY us.likes_received DESC

所以,如果将其转换为触发式徽章,类似这样的内容应该有效:

SELECT us.user_id, current_timestamp AS granted_at 
FROM user_stats AS us
WHERE us.likes_received BETWEEN 100 AND 249
AND us.likes_given BETWEEN 100 AND 249
AND (:backfill OR us.user_id IN (:user_ids))
3 个赞

这几乎是完美的。可能会发生一种罕见的情况:用户在“给予”方面超额交付,但在“接收”方面滞后(反之亦然),因此徽章可能会在授予下一个徽章之前被撤销(撤销例程)。

查看后,我发现了一个有趣的属性:something.badge_id = 123,其中“something”是用户定义的变量,“123”是另一个徽章的 ID。我将尝试一下,并在第 1 层和第 2 层的基础上补充原始 SQL,以检查是否已获得更高层级的徽章。

2 个赞

这是一个我没想到的非常有趣的观点。:slightly_smiling_face: 双重性质确实让它有点棘手。:thinking:

我喜欢加入对其他徽章进行检查的想法,这可能很有用。

1 个赞