Для кастомного триггера, я думаю, вы сможете взять запрос Campaigner и немного доработать его, чтобы он работал с бейджами вместо приглашений.
Вот пример для получения 5 бейджей «Badge 108», который можно настроить на ежедневное обновление.
SELECT u.id user_id, current_timestamp granted_at
FROM users u
WHERE u.id IN (
SELECT ub.user_id
FROM user_badges ub
WHERE ub.badge_id = 108
GROUP BY ub.user_id
HAVING COUNT(*) >= 4
) AND u.active AND u.silenced_till IS NULL AND u.id > 0 AND
(:backfill OR u.id IN (:user_ids) )
Я кратко протестировал это на своём тестовом сайте, и всё работает нормально (я запускаю фоновую задачу Sidekiq для выдачи бейджей, чтобы ускорить ожидание). Надеюсь, это хотя бы даст вам отправную точку для дальнейшей разработки. ![]()
Также здесь есть несколько примеров, которые могут послужить вдохновением, если вы их ещё не нашли: Some common badge queries ![]()