summaryrefslogtreecommitdiff
path: root/app/models
diff options
context:
space:
mode:
authorDavid Gay <david@davidgay.org>2021-05-23 19:01:19 -0400
committerDavid Gay <david@davidgay.org>2021-05-23 19:01:19 -0400
commitac1790f76d843ed125ffeac6962f50504f1bf559 (patch)
treed8ed2555799fd19f611e85cf2bde689e64170e40 /app/models
parente6ef4ee72e0816e7e91e21787d04182476a41f6f (diff)
Send achievement channel text messsage when someone levels up
Diffstat (limited to 'app/models')
-rw-r--r--app/models/character.rb6
-rw-r--r--app/models/character_skill.rb21
2 files changed, 26 insertions, 1 deletions
diff --git a/app/models/character.rb b/app/models/character.rb
index fd0f540..a6e8ff6 100644
--- a/app/models/character.rb
+++ b/app/models/character.rb
@@ -93,7 +93,11 @@ class Character < ApplicationRecord
def add_skill_xp(skill, amount)
skill = Skill.find_by_gid(skill) if skill.is_a? String
- CharacterSkill.find_by(skill: skill).increment!(:xp, amount)
+ Character.transaction do
+ cs = CharacterSkill.find_by(skill: skill)
+ cs.xp += amount
+ cs.save!
+ end
end
def skill_level(skill)
diff --git a/app/models/character_skill.rb b/app/models/character_skill.rb
index 189f386..20468c3 100644
--- a/app/models/character_skill.rb
+++ b/app/models/character_skill.rb
@@ -4,6 +4,8 @@ class CharacterSkill < ApplicationRecord
validates :skill_id, uniqueness: { scope: :character_id }
validates :xp, numericality: { greater_than_or_equal_to: 0, only_integer: true }
+ before_update :send_chat_message_if_leveled_up
+
scope :ordered_by_skill_name, -> { includes(:skill).order("skills.name") }
XP_TOTALS_PER_LEVEL = [
@@ -24,6 +26,14 @@ class CharacterSkill < ApplicationRecord
1459475733, 1680697391, 1935475040, 2228899094
].freeze
+ def self.level_for_xp(xp)
+ XP_TOTALS_PER_LEVEL.each_with_index do |total, index|
+ if total > xp
+ return index
+ end
+ end
+ end
+
def level
XP_TOTALS_PER_LEVEL.each_with_index do |total, index|
return index if total > self.xp
@@ -42,4 +52,15 @@ class CharacterSkill < ApplicationRecord
def xp_required_for_level(level)
level <= 120 ? XP_TOTALS_PER_LEVEL[level - 1] : nil
end
+
+ def send_chat_message_if_leveled_up
+ if CharacterSkill.level_for_xp(self.xp_was) < CharacterSkill.level_for_xp(self.xp)
+ chat_message = ChatMessage.new(body: "reached #{self.skill.name} level #{self.level}!",
+ target: self.character,
+ chat_room: ChatRoom.find_by_gid("achievement"))
+ if chat_message.save
+ ChatRoomChannel.broadcast_chat_message(chat_message)
+ end
+ end
+ end
end