Commit 7b2d77fa0f95f24179e5afa28ec548a1d3c76cec

Authored by Victor Costa
1 parent c608ace2

Change the way to add point rules

lib/merit/badge_rules.rb
... ... @@ -39,24 +39,6 @@ module Merit
39 39 voteable.votes.count == 2
40 40 end
41 41  
42   - # If it has 10 comments, grant commenter-10 badge
43   - # grant_on 'comments#create', badge: 'commenter', level: 10 do |comment|
44   - # comment.user.comments.count == 10
45   - # end
46   -
47   - # If it has 5 votes, grant relevant-commenter badge
48   - # grant_on 'comments#vote', badge: 'relevant-commenter',
49   - # to: :user do |comment|
50   - #
51   - # comment.votes.count == 5
52   - # end
53   -
54   - # Changes his name by one wider than 4 chars (arbitrary ruby code case)
55   - # grant_on 'registrations#update', badge: 'autobiographer',
56   - # temporary: true, model_name: 'User' do |user|
57   - #
58   - # user.name.length > 4
59   - # end
60 42 end
61 43 end
62 44 end
... ...
lib/merit/point_rules.rb
... ... @@ -12,16 +12,71 @@ module Merit
12 12 class PointRules
13 13 include Merit::PointRulesMethods
14 14  
  15 + AVAILABLE_RULES = {
  16 + :comment_author => {
  17 + :action => 'comment#create',
  18 + :undo_action => 'comment#destroy',
  19 + :to => :author,
  20 + :value => 1
  21 + },
  22 + :article_author => {
  23 + :action => 'article#create',
  24 + :undo_action => 'article#destroy',
  25 + :to => :author,
  26 + :value => 1
  27 + },
  28 + :vote_voteable_author => {
  29 + :action => 'vote#create',
  30 + :undo_action => 'vote#destroy',
  31 + :to => lambda {|vote| vote.voteable.author},
  32 + :profile => lambda {|vote| vote.voteable.profile},
  33 + :value => lambda {|vote| vote.vote}
  34 + },
  35 + :vote_voteable => {
  36 + :action => 'vote#create',
  37 + :undo_action => 'vote#destroy',
  38 + :to => lambda {|vote| vote.voteable},
  39 + :profile => lambda {|vote| vote.voteable.profile},
  40 + :value => lambda {|vote| vote.vote}
  41 + },
  42 + }
  43 +
  44 + # FIXME get value from environment
  45 + def weight(action)
  46 + case action
  47 + when :comment_author
  48 + 10
  49 + when :article_author
  50 + 50
  51 + when :vote_voteable
  52 + 5
  53 + when :vote_voteable_author
  54 + 5
  55 + end
  56 + end
  57 +
  58 + def calculate_score(target, action, value)
  59 + value = value.call(target) if value.respond_to?(:call)
  60 + weight(action) * value
  61 + end
  62 +
15 63 def initialize
16   - score 10, :on => 'comment#create'
17   - score -10, :on => 'comment#destroy'
  64 + AVAILABLE_RULES.each do |key, setting|
  65 + score lambda {|target| calculate_score(target, key, setting[:value])}, :on => setting[:action], :to => setting[:to]
  66 + if setting[:undo_action].present?
  67 + score lambda {|target| -calculate_score(target, key, setting[:value])}, :on => setting[:undo_action], :to => setting[:to]
  68 + end
  69 + end
  70 +
  71 + #score lambda {|target| calculate_score(target, :comment_create, 1)}, :on => 'comment#create'
  72 + #score lambda {|target| calculate_score(target, :comment_create, -1)}, :on => 'comment#destroy'
18 73  
19   - score 50, :on => 'article#create'
20   - score -50, :on => 'article#destroy'
  74 + #score lambda {|target| calculate_score(target, :article_create, 1)}, :on => 'article#create'
  75 + #score lambda {|target| calculate_score(target, :article_create, -1)}, :on => 'article#destroy'
21 76  
22   - score lambda {|vote| 5 * vote.vote}, :on => 'vote#create', :to => lambda {|vote| vote.voteable.author}
23   - score lambda {|vote| 5 * vote.vote}, :on => 'vote#create', :to => lambda {|vote| vote.voteable}
24   - score lambda {|vote| -5 * vote.vote}, :on => 'vote#destroy', :to => lambda {|vote| vote.voteable.author}
  77 + #score lambda {|target| calculate_score(target, :vote_create, target.vote)}, :on => 'vote#create', :to => lambda {|vote| vote.voteable.author}
  78 + #score lambda {|target| calculate_score(target, :vote_create, target.vote)}, :on => 'vote#create', :to => lambda {|vote| vote.voteable}
  79 + #score lambda {|target| calculate_score(target, :vote_create, -target.vote)}, :on => 'vote#destroy', :to => lambda {|vote| vote.voteable.author}
25 80 end
26 81 end
27 82 end
... ...