module Decidim::Gamification
Public Class Methods
Semi-private: The BadgeRegistry
to register global badges to.
# File lib/decidim/gamification.rb, line 64 def self.badge_registry @badge_registry ||= Decidim::Gamification::BadgeRegistry.new end
Public: Returns all available badges.
Returns an Array<Badge>
# File lib/decidim/gamification.rb, line 71 def self.badges badge_registry.all end
Public: Decrement the score of a user for a badge.
user - A User for whom to increase the score. badge_name - The name of the badge for which to increase the score. amount - (Optional) The amount to decrease. Defaults to 1.
Returns nothing.
# File lib/decidim/gamification.rb, line 43 def self.decrement_score(user, badge_name, amount = 1) return unless amount.positive? return unless user.is_a?(Decidim::UserBaseEntity) BadgeScorer.new(user, find_badge(badge_name)).decrement(amount) end
Public: Increments the score of a user for a badge.
user - A User for whom to increase the score. badge_name - The name of the badge for which to increase the score. amount - (Optional) The amount to increase. Defaults to 1.
Returns nothing.
# File lib/decidim/gamification.rb, line 29 def self.increment_score(user, badge_name, amount = 1) return unless amount.positive? return unless user.is_a?(Decidim::UserBaseEntity) BadgeScorer.new(user, find_badge(badge_name)).increment(amount) end
Public: Registers a new Badge
.
Example:
Decidim.register_badge(:foo) do |badge| badge.levels = [1, 10, 50] end
Returns nothing if registered successfully, raises an exception otherwise.
# File lib/decidim/gamification.rb, line 92 def self.register_badge(name, &block) badge_registry.register(name, &block) end
Public: Resets all the badge scores using each of the badges' reset methods (if available). This is useful if the badges ever get inconsistent.
users - The Array of Users to reset the score.
Returns nothing.
# File lib/decidim/gamification.rb, line 103 def self.reset_badges(users = nil) return reset_badges(User.all) && reset_badges(UserGroup.all) unless users badges.each do |badge| Rails.logger.info "Resetting #{badge.name}..." if badge.reset users.find_each do |user| set_score(user, badge.name, badge.reset.call(user)) if badge.valid_for?(user) end else Rails.logger.info "Badge can't be reset since it doesn't have a reset method." end end end
Public: Sets the score of a user for a badge.
user - A User for whom to set the score. badge_name - The name of the badge for which to increase the score. score - The score to set.
Returns nothing.
# File lib/decidim/gamification.rb, line 57 def self.set_score(user, badge_name, score) return unless user.is_a?(Decidim::UserBaseEntity) BadgeScorer.new(user, find_badge(badge_name)).set(score) end
Public: Returns a the status of a badge given a user and a badge name.
Returns a `BadgeStatus` instance.
# File lib/decidim/gamification.rb, line 16 def self.status_for(user, badge_name) return unless user.is_a?(Decidim::UserBaseEntity) BadgeStatus.new(user, find_badge(badge_name)) end