Commit 7b2d77fa0f95f24179e5afa28ec548a1d3c76cec
1 parent
c608ace2
Exists in
master
and in
1 other branch
Change the way to add point rules
Showing
2 changed files
with
62 additions
and
25 deletions
Show diff stats
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 | ... | ... |