point_rules.rb
2.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
module Merit
class PointRules
include Merit::PointRulesMethods
AVAILABLE_RULES = {
:comment_author => {
:action => 'comment#create',
:undo_action => 'comment#destroy',
:to => :author,
:value => 1,
:description => _('Point weight for comment author'),
:default_weight => 10
},
:article_author => {
:action => 'article#create',
:undo_action => 'article#destroy',
:to => :author,
:value => 1,
:description => _('Point weight for article author'),
:default_weight => 50
},
:vote_voteable_author => {
:action => 'vote#create',
:undo_action => 'vote#destroy',
:to => lambda {|vote| vote.voteable.author},
:profile => lambda {|vote| vote.voteable.profile},
:value => lambda {|vote| vote.vote},
:description => _('Point weight for the author of a voted content'),
:default_weight => 5
},
:vote_voteable => {
:action => 'vote#create',
:undo_action => 'vote#destroy',
:to => lambda {|vote| vote.voteable},
:profile => lambda {|vote| vote.voteable.profile},
:value => lambda {|vote| vote.vote},
:description => _('Point weight for a voted content'),
:default_weight => 5
},
# TODO comment_voter and article_voter
}
def weight(category)
settings = Noosfero::Plugin::Settings.new(@environment, GamificationPlugin)
settings.settings.fetch(:point_rules, {}).fetch(category.to_s, {}).fetch('weight', AVAILABLE_RULES[category][:default_weight]).to_i
end
def calculate_score(target, category, value)
value = value.call(target) if value.respond_to?(:call)
weight(category) * value
end
def initialize(environment=nil)
return if environment.nil?
@environment = environment
AVAILABLE_RULES.each do |category, setting|
[setting[:action], setting[:undo_action]].compact.zip([1, -1]).each do |action, signal|
score lambda {|target| signal * calculate_score(target, category, setting[:value])}, :on => action, :to => setting[:to], :category => category
end
end
end
end
end