From 9ed0bc46535a3acbe3c8a2eaf1b7fe7c4b07d8eb Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 26 Nov 2011 19:32:06 +0100 Subject: [PATCH 1/7] ability to destroy achievement --- lib/glory/achievements.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/glory/achievements.rb b/lib/glory/achievements.rb index 15596ef..4b2b80a 100644 --- a/lib/glory/achievements.rb +++ b/lib/glory/achievements.rb @@ -20,6 +20,13 @@ def has_achievement?(achievement, level = nil) achievements.first(:conditions => conditions).present? end + def delete_achievement?(achievement, level = nil) + conditions = {:type => achievement.to_s, :achievable_id => id, :achievable_type => self.class.to_s} + conditions[:level] = level if level + lost_achievement = achievements.first(:conditions => conditions) + lost_achievement.destroy + end + def get_badges_in_progress(badges) badges.collect do |achievement| { From e512f767e80c8219e1b3db47fc6c0f00214fd522 Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 26 Nov 2011 19:55:34 +0100 Subject: [PATCH 2/7] oups --- lib/glory/achievements.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/glory/achievements.rb b/lib/glory/achievements.rb index 4b2b80a..7905a5f 100644 --- a/lib/glory/achievements.rb +++ b/lib/glory/achievements.rb @@ -20,11 +20,11 @@ def has_achievement?(achievement, level = nil) achievements.first(:conditions => conditions).present? end - def delete_achievement?(achievement, level = nil) + def delete_achievement(achievement, level = nil) conditions = {:type => achievement.to_s, :achievable_id => id, :achievable_type => self.class.to_s} conditions[:level] = level if level lost_achievement = achievements.first(:conditions => conditions) - lost_achievement.destroy + lost_achievement.destroy if lost_achievement end def get_badges_in_progress(badges) From 6b4b5991b10872a61963f73ab40e9436dd6a1bc2 Mon Sep 17 00:00:00 2001 From: deneuxa Date: Sun, 27 Nov 2011 02:01:42 +0100 Subject: [PATCH 3/7] title, best generator, points, capacity of automatic delete an achievement --- .../achievement/templates/achievement.rb | 82 +++++++++++++------ .../templates/achievement_observer.rb | 4 +- .../20100311101933_create_achievements.rb | 3 + lib/glory/achievement.rb | 4 +- 4 files changed, 63 insertions(+), 30 deletions(-) diff --git a/lib/generators/achievement/templates/achievement.rb b/lib/generators/achievement/templates/achievement.rb index aec8989..03fab8e 100644 --- a/lib/generators/achievement/templates/achievement.rb +++ b/lib/generators/achievement/templates/achievement.rb @@ -1,41 +1,69 @@ -class <%= class_name %> < Achievement +class <%= class_name.camelize %> < Achievement - # The required quotas to meet for each achievement level. - # level 1, :quota => 5 - # level 2, :quota => 10 - # level 3, :quota => 30 - # level 4, :quota => 100 - # level 5, :quota => 500 - # Return the value that needs to be checked against the quotas - # set_thing_to_check { |achievable| ... } + ## The required quotas to meet for each achievement level. + # level 1, :quota => 5, :points => 50 + # level 2, :quota => 10, :points => 100 + # level 3, bundle :quota => 30, :points => 150 + # level 4, :quota => 100, :points => 200 + # level 5, :quota => 500, :points => 250 + + ## Return the value that needs to be checked against the quotas + # set_thing_to_check { |achievable| } - # Comment out below for multi-level achievements - # def self.award_achievements_for(achievable) + ## Comment out below for multi-level achievements + # def self.award_achievements_for(achievable, may_lost) # return unless achievable # levels.each do |level| # if !achievable.has_achievement?(self, level[:level]) and thing_to_check(achievable) >= level[:quota] # achievable.award_achievement(self, level[:level]) + # elsif may_lost and achievable.has_achievement?(self, level[:level]) and !thing_to_check(achievable) >= level[:quota] + # achievable.delete_achievement(self) # end # end # end - - # Comment out below for once-off achievements - # def self.award_achievements_for(achievable) - # return unless achievable - # return if achievable.has_achievement?(self) - # achievable.award_achievement(self) - # end - # Change to reflect the purpose of this achievement. - def self.description - 'An achievement description.' - end - # Change the image to use for the achievement. - # Be sure to include this file in Rails.root/public/images - def self.image - 'achievement-default.png' - end +# # Return the boolean value that needs to be checked +# set_thing_to_check { |achievable| boolean } +# +# # Comment out below for once-off achievements +# def self.award_achievements_for(achievable, may_lost) +# return unless achievable +# if !achievable.has_achievement?(self) and thing_to_check(achievable) +# achievable.award_achievement(self) +# elsif may_lost and achievable.has_achievement?(self) and !thing_to_check(achievable) +# achievable.delete_achievement(self) +# end +# end +# +# # Change to reflect the purpose of this achievement. +# def title +# 'Achievement title' +# end +# # +# ## Change to reflect the purpose of this achievement. +# def description +# 'Achievement description' +# end +# +# # Achievement mode. simple/level +# def mode +# 'simple/level' +# end +# +# def points +# if self.mode == 'simple' +# # give the default points value for simple achievements +# 10 +# else +# select_level(self.level)[:points] +# end +# end +# # Change the image to use for the achievement. +# # Be sure to include this file in Rails.root/public/images +# def self.image +# 'achievement-default.png' +# end end \ No newline at end of file diff --git a/lib/generators/achievement/templates/achievement_observer.rb b/lib/generators/achievement/templates/achievement_observer.rb index 826557e..b4ebaca 100644 --- a/lib/generators/achievement/templates/achievement_observer.rb +++ b/lib/generators/achievement/templates/achievement_observer.rb @@ -1,7 +1,7 @@ -class <%= class_name %>Observer < ActiveRecord::Observer +class <%= class_name.camelize %>Observer < ActiveRecord::Observer observe :<%= model_name.downcase.underscore %> def after_save(<%= model_name.downcase.underscore %>) - <%= class_name %>.award_achievements_for(<%= model_name.downcase.underscore %>.achievable) if ('your conditions here') + <%= class_name.camelize %>.award_achievements_for(<%= model_name.downcase.underscore %>.achievable, false/true : may_delete) if ('your conditions here') end end \ No newline at end of file diff --git a/lib/generators/paths_of_glory/templates/20100311101933_create_achievements.rb b/lib/generators/paths_of_glory/templates/20100311101933_create_achievements.rb index c0ae954..0ac2a73 100644 --- a/lib/generators/paths_of_glory/templates/20100311101933_create_achievements.rb +++ b/lib/generators/paths_of_glory/templates/20100311101933_create_achievements.rb @@ -9,6 +9,9 @@ def self.up t.string :ref_type t.timestamps + + add_index :achievements, :achievable_id + add_index :achievements, :ref_id end end diff --git a/lib/glory/achievement.rb b/lib/glory/achievement.rb index 042a942..e9ea58f 100644 --- a/lib/glory/achievement.rb +++ b/lib/glory/achievement.rb @@ -19,7 +19,7 @@ def levels end def level(level, options = {}) - levels << {:level => level, :quota => options[:quota]} + levels << {:level => level, :quota => options[:quota], :points => options[:points]} end def set_thing_to_check(&block) @@ -69,5 +69,7 @@ def progress_to_next_level(user) return nil end end + + end end From a0ae49cfef8b937ad2c194a3dece44203e429f51 Mon Sep 17 00:00:00 2001 From: deneuxa Date: Mon, 28 Nov 2011 00:13:16 +0100 Subject: [PATCH 4/7] some modifications --- .../achievement/templates/achievement.rb | 101 ++++++++++-------- .../templates/achievement_observer.rb | 10 +- lib/glory/achievement.rb | 39 +++++-- 3 files changed, 98 insertions(+), 52 deletions(-) diff --git a/lib/generators/achievement/templates/achievement.rb b/lib/generators/achievement/templates/achievement.rb index 03fab8e..b54eacd 100644 --- a/lib/generators/achievement/templates/achievement.rb +++ b/lib/generators/achievement/templates/achievement.rb @@ -1,27 +1,28 @@ class <%= class_name.camelize %> < Achievement - ## The required quotas to meet for each achievement level. - # level 1, :quota => 5, :points => 50 - # level 2, :quota => 10, :points => 100 - # level 3, bundle :quota => 30, :points => 150 - # level 4, :quota => 100, :points => 200 - # level 5, :quota => 500, :points => 250 +## The required quotas to meet for each achievement level. +# level 1, :quota => 5, :points => 50, :imagerank => 'achievement-rank1.png' +# level 2, :quota => 10, :points => 100, :imagerank => 'achievement-rank2.png' +# level 3, :quota => 30, :points => 150, :imagerank => 'achievement-rank3.png' +# level 4, :quota => 100, :points => 200, :imagerank => 'achievement-rank4.png' +# level 5, :quota => 500, :points => 250, :imagerank => 'achievement-rank5.png' - ## Return the value that needs to be checked against the quotas - # set_thing_to_check { |achievable| } + +## Return the value that needs to be checked against the quotas +# set_thing_to_check { |achievable| } - ## Comment out below for multi-level achievements - # def self.award_achievements_for(achievable, may_lost) - # return unless achievable - # levels.each do |level| - # if !achievable.has_achievement?(self, level[:level]) and thing_to_check(achievable) >= level[:quota] - # achievable.award_achievement(self, level[:level]) - # elsif may_lost and achievable.has_achievement?(self, level[:level]) and !thing_to_check(achievable) >= level[:quota] - # achievable.delete_achievement(self) - # end - # end - # end +## Comment out below for multi-level achievements +# def self.award_achievements_for(achievable, may_lost) +# return unless achievable +# levels.each do |level| +# if !achievable.has_achievement?(self, level[:level]) and thing_to_check(achievable) >= level[:quota] +# achievable.award_achievement(self, level[:level]) +# elsif may_lost and achievable.has_achievement?(self, level[:level]) and thing_to_check(achievable) < level[:quota] +# achievable.delete_achievement(self) +# end +# end +# end # # Return the boolean value that needs to be checked @@ -37,33 +38,45 @@ class <%= class_name.camelize %> < Achievement # end # end # -# # Change to reflect the purpose of this achievement. -# def title -# 'Achievement title' -# end -# # -# ## Change to reflect the purpose of this achievement. -# def description -# 'Achievement description' -# end +## Change to reflect the purpose of this achievement. +def title + "Awesome badge" +end + +def first_description + "It's so easy to win this badge, ..." + end +# + def succeed_description + "Congratulations ! ... " + end +# + def next_level_description + '' + end # # # Achievement mode. simple/level -# def mode -# 'simple/level' -# end + def is_simple + true + end # -# def points -# if self.mode == 'simple' -# # give the default points value for simple achievements -# 10 -# else -# select_level(self.level)[:points] -# end -# end -# # Change the image to use for the achievement. -# # Be sure to include this file in Rails.root/public/images -# def self.image -# 'achievement-default.png' -# end + def is_by_level + false + end +# + def simple_points + 10 + end +# + # Change the image to use for the achievement. + # Be sure to include this file in Rails.root/public/images + + def image + 'achievement-class_name.png' + end + + def simple_imagerank + 'achievement-simple.png' + end end \ No newline at end of file diff --git a/lib/generators/achievement/templates/achievement_observer.rb b/lib/generators/achievement/templates/achievement_observer.rb index b4ebaca..4200fa3 100644 --- a/lib/generators/achievement/templates/achievement_observer.rb +++ b/lib/generators/achievement/templates/achievement_observer.rb @@ -2,6 +2,14 @@ class <%= class_name.camelize %>Observer < ActiveRecord::Observer observe :<%= model_name.downcase.underscore %> def after_save(<%= model_name.downcase.underscore %>) - <%= class_name.camelize %>.award_achievements_for(<%= model_name.downcase.underscore %>.achievable, false/true : may_delete) if ('your conditions here') + <%= class_name.camelize %>.award_achievements_for(<%= model_name.downcase.underscore %>. ???, true) unless <%= model_name.downcase%>.new_record? + end + +def after_update(<%= model_name.downcase.underscore %>) + <%= class_name.camelize %>.award_achievements_for(<%= model_name.downcase.underscore %>. ???, true) unless <%= model_name.downcase%>.new_record? + end + +def after_destroy(<%= model_name.downcase.underscore %>) + <%= class_name.camelize %>.award_achievements_for(<%= model_name.downcase.underscore %>. ???, true) unless <%= model_name.downcase%>.new_record? end end \ No newline at end of file diff --git a/lib/glory/achievement.rb b/lib/glory/achievement.rb index e9ea58f..f8aeedb 100644 --- a/lib/glory/achievement.rb +++ b/lib/glory/achievement.rb @@ -13,13 +13,34 @@ def current #scope :order, lambda { |order| {:order => order} } #scope :limit, lambda { |limit| {:limit => limit} } + def points + if is_simple + simple_points + else + self.class.points_for(level) + end + end + + def imagerank + if is_simple + simple_imagerank + else + self.class.imagerank_for(level) + end + end + + def has_next_level? + self.class.has_level?(level+1) + end + + class << self def levels @levels ||= [] end def level(level, options = {}) - levels << {:level => level, :quota => options[:quota], :points => options[:points]} + levels << {:level => level, :quota => options[:quota], :points => options[:points], :imagerank => options[:imagerank]} end def set_thing_to_check(&block) @@ -38,16 +59,20 @@ def quota_for(level) select_level(level)[:quota] if select_level(level) end + def imagerank_for(level) + select_level(level)[:imagerank] if select_level(level) + end + + def points_for(level) + select_level(level)[:points] if select_level(level) + end + def has_level?(level) select_level(level).present? end - def current_level(user) - if current_achievement = user.achievements.kind_of(self).current - current_achievement.level - else - 0 - end + def current_achievement(user) + user.achievements.kind_of(self).current end def next_level(user) From f39ae3100d47be289d44413a278d8ffbfc93ef04 Mon Sep 17 00:00:00 2001 From: deneuxa Date: Mon, 28 Nov 2011 23:19:14 +0100 Subject: [PATCH 5/7] reload achievable in model because may need it --- lib/generators/achievement/templates/achievement.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/generators/achievement/templates/achievement.rb b/lib/generators/achievement/templates/achievement.rb index b54eacd..380c39e 100644 --- a/lib/generators/achievement/templates/achievement.rb +++ b/lib/generators/achievement/templates/achievement.rb @@ -15,6 +15,8 @@ class <%= class_name.camelize %> < Achievement ## Comment out below for multi-level achievements # def self.award_achievements_for(achievable, may_lost) # return unless achievable +# #reload achievable: because may need to be reupdated in case call various in same time +# achievable = achievable.class.find(achievable.id) # levels.each do |level| # if !achievable.has_achievement?(self, level[:level]) and thing_to_check(achievable) >= level[:quota] # achievable.award_achievement(self, level[:level]) @@ -31,6 +33,8 @@ class <%= class_name.camelize %> < Achievement # # Comment out below for once-off achievements # def self.award_achievements_for(achievable, may_lost) # return unless achievable +# #reload achievable: because may need to be reupdated in case call various in same time +# achievable = achievable.class.find(achievable.id) # if !achievable.has_achievement?(self) and thing_to_check(achievable) # achievable.award_achievement(self) # elsif may_lost and achievable.has_achievement?(self) and !thing_to_check(achievable) From 8c7caf96e38bbac90ad145428ad5746d49d5a0ff Mon Sep 17 00:00:00 2001 From: deneuxa Date: Sun, 4 Dec 2011 15:55:51 +0100 Subject: [PATCH 6/7] modif generator --- .../achievement/templates/achievement.rb | 18 ++++++++++++------ lib/glory/achievement.rb | 1 + 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/lib/generators/achievement/templates/achievement.rb b/lib/generators/achievement/templates/achievement.rb index 380c39e..9e110a9 100644 --- a/lib/generators/achievement/templates/achievement.rb +++ b/lib/generators/achievement/templates/achievement.rb @@ -17,11 +17,13 @@ class <%= class_name.camelize %> < Achievement # return unless achievable # #reload achievable: because may need to be reupdated in case call various in same time # achievable = achievable.class.find(achievable.id) -# levels.each do |level| -# if !achievable.has_achievement?(self, level[:level]) and thing_to_check(achievable) >= level[:quota] -# achievable.award_achievement(self, level[:level]) -# elsif may_lost and achievable.has_achievement?(self, level[:level]) and thing_to_check(achievable) < level[:quota] -# achievable.delete_achievement(self) +# if achievable +# levels.each do |level| +# if !achievable.has_achievement?(self, level[:level]) and thing_to_check(achievable) >= level[:quota] +# achievable.award_achievement(self, level[:level]) +# elsif may_lost and achievable.has_achievement?(self, level[:level]) and thing_to_check(achievable) < level[:quota] +# achievable.delete_achievement(self) +# end # end # end # end @@ -56,7 +58,11 @@ def succeed_description end # def next_level_description - '' + if has_next_level? + "For the next level you just have to posseed #{self.class.quota_for(level+1)} badges for the next level (#{self.class.quota_for(level+1) - self.class.thing_to_check(self.achievable)} more than now)" + else + "Yeah, you won the biggest level !" + end end # # # Achievement mode. simple/level diff --git a/lib/glory/achievement.rb b/lib/glory/achievement.rb index f8aeedb..175985f 100644 --- a/lib/glory/achievement.rb +++ b/lib/glory/achievement.rb @@ -29,6 +29,7 @@ def imagerank end end + # Définit s'il existe un level supérieur à passer. def has_next_level? self.class.has_level?(level+1) end From f786a30e53b8d100fed2bfee01c58ae8b18be160 Mon Sep 17 00:00:00 2001 From: deneuxa Date: Sun, 11 Dec 2011 19:13:35 +0100 Subject: [PATCH 7/7] base_class bullshit --- lib/generators/achievement/templates/achievement.rb | 4 ++-- lib/generators/achievement/templates/achievement_observer.rb | 3 --- lib/glory/achievements.rb | 4 ++-- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/lib/generators/achievement/templates/achievement.rb b/lib/generators/achievement/templates/achievement.rb index 9e110a9..1f37c56 100644 --- a/lib/generators/achievement/templates/achievement.rb +++ b/lib/generators/achievement/templates/achievement.rb @@ -16,7 +16,7 @@ class <%= class_name.camelize %> < Achievement # def self.award_achievements_for(achievable, may_lost) # return unless achievable # #reload achievable: because may need to be reupdated in case call various in same time -# achievable = achievable.class.find(achievable.id) +# achievable = achievable.class.base_class.find(achievable.id) # if achievable # levels.each do |level| # if !achievable.has_achievement?(self, level[:level]) and thing_to_check(achievable) >= level[:quota] @@ -36,7 +36,7 @@ class <%= class_name.camelize %> < Achievement # def self.award_achievements_for(achievable, may_lost) # return unless achievable # #reload achievable: because may need to be reupdated in case call various in same time -# achievable = achievable.class.find(achievable.id) +# achievable = achievable.class.base_class.find(achievable.id) # if !achievable.has_achievement?(self) and thing_to_check(achievable) # achievable.award_achievement(self) # elsif may_lost and achievable.has_achievement?(self) and !thing_to_check(achievable) diff --git a/lib/generators/achievement/templates/achievement_observer.rb b/lib/generators/achievement/templates/achievement_observer.rb index 4200fa3..3a41dd3 100644 --- a/lib/generators/achievement/templates/achievement_observer.rb +++ b/lib/generators/achievement/templates/achievement_observer.rb @@ -5,9 +5,6 @@ def after_save(<%= model_name.downcase.underscore %>) <%= class_name.camelize %>.award_achievements_for(<%= model_name.downcase.underscore %>. ???, true) unless <%= model_name.downcase%>.new_record? end -def after_update(<%= model_name.downcase.underscore %>) - <%= class_name.camelize %>.award_achievements_for(<%= model_name.downcase.underscore %>. ???, true) unless <%= model_name.downcase%>.new_record? - end def after_destroy(<%= model_name.downcase.underscore %>) <%= class_name.camelize %>.award_achievements_for(<%= model_name.downcase.underscore %>. ???, true) unless <%= model_name.downcase%>.new_record? diff --git a/lib/glory/achievements.rb b/lib/glory/achievements.rb index 7905a5f..84ce763 100644 --- a/lib/glory/achievements.rb +++ b/lib/glory/achievements.rb @@ -15,13 +15,13 @@ def award_achievement(achievement, level = nil, ref = nil) end def has_achievement?(achievement, level = nil) - conditions = {:type => achievement.to_s, :achievable_id => id, :achievable_type => self.class.to_s} + conditions = {:type => achievement.to_s, :achievable_id => id, :achievable_type => self.class.base_class.to_s} conditions[:level] = level if level achievements.first(:conditions => conditions).present? end def delete_achievement(achievement, level = nil) - conditions = {:type => achievement.to_s, :achievable_id => id, :achievable_type => self.class.to_s} + conditions = {:type => achievement.to_s, :achievable_id => id, :achievable_type => self.class.base_class.to_s} conditions[:level] = level if level lost_achievement = achievements.first(:conditions => conditions) lost_achievement.destroy if lost_achievement