FEATURE: new badges when visiting the forum for 10, 100 and 365 consecutive days

This commit is contained in:
Régis Hanol 2017-09-06 22:35:08 +02:00
parent 0fca5ed533
commit 8a935a4b5f
4 changed files with 47 additions and 0 deletions

View File

@ -56,6 +56,10 @@ class Badge < ActiveRecord::Base
GivesBack = 32
Empathetic = 39
Enthusiast = 45
Aficionado = 46
Devotee = 47
NewUserOfTheMonth = 44
# other consts

View File

@ -3392,6 +3392,18 @@ en:
description: Outstanding contributions in their first month
long_description: |
This badge is granted to congratulate two new users each month for their excellent overall contributions, as measured by how often their posts were liked, and by whom.
enthusiast:
name: Enthusiast
description: Has visited the forum for 10 consecutive days
long_description: This badge is granted the first time you visit the forum for 10 consecutive days.
aficionado:
name: Aficionado
description: Has visited the forum for 100 consecutive days
long_description: This badge is granted the first time you visit the forum for 100 consecutive days.
devotee:
name: Devotee
description: Has visited the forum for 365 consecutive days
long_description: This badge is granted the first time you visit the forum for 365 consecutive days.
badge_title_metadata: "%{display_name} badge on %{site_title}"
admin_login:

View File

@ -415,6 +415,25 @@ Badge.seed do |b|
b.system = true
end
[
[Badge::Enthusiast, "Enthusiast", BadgeType::Bronze, 10],
[Badge::Aficionado, "Aficionado", BadgeType::Silver, 100],
[Badge::Devotee, "Devotee", BadgeType::Gold, 365],
].each do |id, name, level, days|
Badge.seed do |b|
b.id = id
b.name = name
b.default_icon = "fa-eye"
b.badge_type_id = level
b.query = BadgeQueries.consecutive_visits(days)
b.badge_grouping_id = BadgeGrouping::Community
b.default_badge_grouping_id = BadgeGrouping::Community
b.trigger = Badge::Trigger::None
b.auto_revoke = false
b.system = true
end
end
Badge.where("NOT system AND id < 100").each do |badge|
new_id = [Badge.maximum(:id) + 1, 100].max
old_id = badge.id

View File

@ -232,4 +232,16 @@ SQL
SQL
end
def self.consecutive_visits(days)
<<~SQL
SELECT user_id, "start" + interval '1' day * COUNT(*) AS "granted_at"
FROM (
SELECT user_id, visited_at - (DENSE_RANK() OVER (PARTITION BY user_id ORDER BY visited_at))::int "start"
FROM user_visits
) s
GROUP BY user_id, "start"
HAVING COUNT(*) >= #{days}
SQL
end
end