Sha256: 3884ddb2ec5b99808dbde6f2fbe05dbf1386a948db00db6bfb31f3b843b49bc2

Contents?: true

Size: 1.37 KB

Versions: 1

Compression:

Stored size: 1.37 KB

Contents

module Merit
  class Judge
    def initialize(sashes, rule, options = {})
      @sashes = sashes
      @rule = rule
      # FIXME: Too much context?
      # A Judge should apply reputation independently of the action
      @action = options[:action]
    end

    # Grant badge if rule applies. If it doesn't, and the badge is temporary,
    # then remove it.
    def apply_badges
      if rule_applies?
        grant_badges if new_or_multiple?
      else
        remove_badges if @rule.temporary
      end
    end

    def apply_points
      return unless rule_applies?
      @sashes.each do |sash|
        sash.add_points @rule.score, @action.inspect[0..240]
      end
      @action.log_activity "points_granted:#{@rule.score}"
    end

    private

    def grant_badges
      @sashes.each { |sash| sash.add_badge badge.id }
      to_action_user = (@rule.to.to_sym == :action_user ? '_to_action_user' : '')
      @action.log_activity "badge_granted#{to_action_user}:#{badge.id}"
    end

    def remove_badges
      @sashes.each { |sash| sash.rm_badge badge.id }
      @action.log_activity "badge_removed:#{badge.id}"
    end

    def new_or_multiple?
      !@sashes.map(&:badge_ids).include?(badge.id) || @rule.multiple
    end

    def rule_applies?
      rule_object = BaseTargetFinder.find(@rule, @action)
      @rule.applies? rule_object
    end

    def badge
      @rule.badge
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
merit-1.4.0 lib/merit/judge.rb