Commit 43ac6601dbe9af168a95ed351bee23d8137c978b

Authored by Hugo Melo
1 parent 97c7b22a

Adapt badge rules for composed actions

Showing 1 changed file with 83 additions and 45 deletions   Show diff stats
lib/merit/badge_rules.rb
@@ -9,48 +9,76 @@ module Merit @@ -9,48 +9,76 @@ module Merit
9 include Merit::BadgeRulesMethods 9 include Merit::BadgeRulesMethods
10 10
11 AVAILABLE_RULES = { 11 AVAILABLE_RULES = {
12 - :comment_author => {  
13 - :action => 'comment#create',  
14 - :default_threshold => 5,  
15 - :to => :author,  
16 - :value => lambda { |comment| comment.author.present? ? comment.author.comments.count : 0 }  
17 - },  
18 - :comment_received => {  
19 - :action => 'comment#create',  
20 - :default_threshold => 5,  
21 - :to => lambda {|comment| comment.source.author},  
22 - :value => lambda { |comment| comment.source.author.present? ? Comment.where(:source_id => Article.where(:author_id => comment.source.author.id)).count : 0 }  
23 - },  
24 - :article_author => {  
25 - :action => 'article#create',  
26 - :default_threshold => 5,  
27 - :to => :author,  
28 - :value => lambda { |article| article.author.present? ? article.environment.articles.text_articles.where(:author_id => article.author.id).count : 0 }  
29 - },  
30 - :positive_votes_received => {  
31 - :action => 'vote#create',  
32 - :default_threshold => 5,  
33 - :to => lambda {|vote| vote.voteable.author},  
34 - :value => lambda { |vote| Vote.for_voteable(vote.voteable).where('vote > 0').count }  
35 - },  
36 - :negative_votes_received => {  
37 - :action => 'vote#create',  
38 - :default_threshold => 5,  
39 - :to => lambda {|vote| vote.voteable.author},  
40 - :value => lambda { |vote| Vote.for_voteable(vote.voteable).where('vote < 0').count }  
41 - },  
42 - :votes_performed => {  
43 - :action => 'vote#create',  
44 - :default_threshold => 5,  
45 - :to => lambda {|vote| vote.voter},  
46 - :value => lambda { |vote| Vote.for_voter(vote.voter).count }  
47 - },  
48 - :friendly => {  
49 - :action => 'friendship#create',  
50 - :default_threshold => 5,  
51 - :to => lambda {|friendship| friendship.person},  
52 - :value => lambda { |friendship| friendship.person.friends.count }  
53 - } 12 + :comment_author => [
  13 + {
  14 + :action => 'comment#create',
  15 + :default_threshold => 5,
  16 + :to => :author,
  17 + :value => lambda { |author| author.present? ? author.comments.count : 0 }
  18 + }
  19 + ],
  20 + :comment_received => [
  21 + {
  22 + :action => 'comment#create',
  23 + :default_threshold => 5,
  24 + :to => lambda {|comment| comment.source.author},
  25 + :value => lambda { |author| author.present? ? Comment.where(:source_id => Article.where(:author_id => author.id)).count : 0 }
  26 + }
  27 + ],
  28 + :article_author => [
  29 + {
  30 + :action => 'article#create',
  31 + :default_threshold => 5,
  32 + :to => :author,
  33 + :value => lambda { |author| author.present? ? author.environment.articles.text_articles.where(:author_id => author.id).count : 0 }
  34 + },
  35 + ],
  36 + :positive_votes_received => [
  37 + {
  38 + :action => 'vote#create',
  39 + :default_threshold => 5,
  40 + :to => lambda {|vote| vote.voteable.author},
  41 + :value => lambda { |vote| Vote.for_voteable(vote.voteable).where('vote > 0').count }
  42 + }
  43 + ],
  44 + :negative_votes_received => [
  45 + {
  46 + :action => 'vote#create',
  47 + :default_threshold => 5,
  48 + :to => lambda {|vote| vote.voteable.author},
  49 + :value => lambda { |vote| Vote.for_voteable(vote.voteable).where('vote < 0').count }
  50 + }
  51 + ],
  52 + :votes_performed => [
  53 + {
  54 + :action => 'vote#create',
  55 + :default_threshold => 5,
  56 + :to => lambda {|vote| vote.voter},
  57 + :value => lambda { |vote| Vote.for_voter(vote.voter).count }
  58 + }
  59 + ],
  60 + :friendly => [
  61 + {
  62 + :action => 'friendship#create',
  63 + :default_threshold => 5,
  64 + :to => lambda {|friendship| friendship.person},
  65 + :value => lambda { |person| person.friends.count }
  66 + }
  67 + ],
  68 + :creative => [
  69 + {
  70 + :action => 'comment#create',
  71 + :default_threshold => 5,
  72 + :to => :author,
  73 + :value => lambda { |author| author.present? ? author.comments.count : 0 }
  74 + },
  75 + {
  76 + :action => 'proposal#create',
  77 + :default_threshold => 5,
  78 + :to => :author,
  79 + :value => lambda { |author| author.present? ? author.proposals.count : 0 }
  80 + },
  81 + ]
54 } 82 }
55 83
56 def initialize(environment=nil) 84 def initialize(environment=nil)
@@ -58,9 +86,19 @@ module Merit @@ -58,9 +86,19 @@ module Merit
58 @environment = environment 86 @environment = environment
59 87
60 environment.gamification_plugin_badges.all.each do |badge| 88 environment.gamification_plugin_badges.all.each do |badge|
61 - setting = AVAILABLE_RULES[badge.name.to_sym]  
62 - grant_on setting[:action], :badge => badge.name, :level => badge.level, :to => setting[:to] do |source|  
63 - setting[:value].call(source) >= (badge.custom_fields || {}).fetch(:threshold, setting[:default_threshold]).to_i 89 + settings = AVAILABLE_RULES[badge.name.to_sym]
  90 + settings.each_with_index do |setting,i|
  91 + grant_on setting[:action], :badge => badge.name, :level => badge.level, :to => setting[:to] do |source|
  92 + can_be_granted = true
  93 + settings.each_with_index do |s,j|
  94 + if s[:to].is_a? Symbol
  95 + receiver = source.send s[:to]
  96 + else
  97 + receiver = s[:to].call source
  98 + end
  99 + can_be_granted &= s[:value].call(receiver) >= (badge.custom_fields || {}).fetch(:threshold, s[:default_threshold]).to_i
  100 + end
  101 + end
64 end 102 end
65 end 103 end
66 end 104 end