module Decidim::Gamification

Public Class Methods

badge_registry() click to toggle source

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
badges() click to toggle source

Public: Returns all available badges.

Returns an Array<Badge>

# File lib/decidim/gamification.rb, line 71
def self.badges
  badge_registry.all
end
decrement_score(user, badge_name, amount = 1) click to toggle source

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
find_badge(name) click to toggle source

Public: Finds a Badge given a name.

Returns a Badge if found, nil otherwise.

# File lib/decidim/gamification.rb, line 78
def self.find_badge(name)
  badge_registry.find(name)
end
increment_score(user, badge_name, amount = 1) click to toggle source

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
register_badge(name, &block) click to toggle source

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
reset_badges(users = nil) click to toggle source

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
set_score(user, badge_name, score) click to toggle source

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
status_for(user, badge_name) click to toggle source

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