summaryrefslogtreecommitdiff
path: root/app/models
diff options
context:
space:
mode:
authorDavid Gay <david@davidgay.org>2021-05-23 17:06:34 -0400
committerDavid Gay <david@davidgay.org>2021-05-23 17:06:34 -0400
commitaba212e13062c43a1192ef885b05145ac1cc9fe7 (patch)
tree61e3850ec0c86913a7e2d42076bcd73aa59f480a /app/models
parent44facc2e567eb3c045ce082428f42276e45b0202 (diff)
Bazaar with buy orders, sell orders, and order cancellation
Diffstat (limited to 'app/models')
-rw-r--r--app/models/bazaar_order.rb12
-rw-r--r--app/models/character.rb14
-rw-r--r--app/models/character_item.rb14
-rw-r--r--app/models/concerns/destroy_if_zero_quantity.rb18
4 files changed, 42 insertions, 16 deletions
diff --git a/app/models/bazaar_order.rb b/app/models/bazaar_order.rb
new file mode 100644
index 0000000..d36d520
--- /dev/null
+++ b/app/models/bazaar_order.rb
@@ -0,0 +1,12 @@
+class BazaarOrder < ApplicationRecord
+ include DestroyIfZeroQuantity
+
+ belongs_to :character
+ belongs_to :item
+
+ validates :price_each, :quantity,
+ numericality: { greater_than_or_equal_to: 0,
+ less_than_or_equal_to: 2_000_000_000, only_integer: true }
+ validates :buy_order, inclusion: { in: [true, false] }
+
+end
diff --git a/app/models/character.rb b/app/models/character.rb
index bad2bb2..003f8af 100644
--- a/app/models/character.rb
+++ b/app/models/character.rb
@@ -11,6 +11,7 @@ class Character < ApplicationRecord
has_many :items, through: :character_items
has_many :character_skills
has_many :chat_messages
+ has_many :bazaar_orders
validates :name, presence: true
validates_length_of :name, maximum: 15, message: "can't be longer than 15 characters"
validates_uniqueness_of :name, message: "is already being used"
@@ -35,12 +36,17 @@ class Character < ApplicationRecord
def wildscour_level; skill_level("wildscour"); end
def worldcall_level; skill_level("worldcall"); end
+ def vestige
+ vestige = self.character_items.find_by(item: Item.find_by_gid("vestige"))
+ vestige ? vestige.quantity : 0
+ end
+
def shift_item(item, amount)
item = Item.find_by_gid(item) if item.is_a? String
CharacterItem.transaction do
ci = self.character_items.find_or_initialize_by(item: item)
- ci.increment(:quantity, amount)
- ci.save
+ ci.increment!(:quantity, amount)
+ ci.save!
end
end
@@ -71,7 +77,7 @@ class Character < ApplicationRecord
open_slots = self.open_slots_for(item)
raise EquipmentError unless open_slots.any?
self.shift_item(item, -1)
- self.equipment.create(item: item, slot: open_slots.first)
+ self.equipment.create!(item: item, slot: open_slots.first)
end
end
@@ -80,7 +86,7 @@ class Character < ApplicationRecord
equipment = self.equipment.find_by(slot: slot)
raise EquipmentError unless equipment
item = equipment.item
- equipment.destroy
+ equipment.destroy!
self.shift_item(item, 1)
end
end
diff --git a/app/models/character_item.rb b/app/models/character_item.rb
index b54f799..6ee13ab 100644
--- a/app/models/character_item.rb
+++ b/app/models/character_item.rb
@@ -1,4 +1,6 @@
class CharacterItem < ApplicationRecord
+ include DestroyIfZeroQuantity
+
belongs_to :character
belongs_to :item
validates :quantity, presence: true
@@ -9,17 +11,5 @@ class CharacterItem < ApplicationRecord
end
end
- after_save :destroy_if_zero_quantity
-
scope :ordered_by_item_name, -> { includes(:item).order("items.name") }
-
- private
- def destroy_if_zero_quantity
- if self.quantity == 0
- destroy
- elsif self.quantity < 0
- # TODO: Can improve this (at the least, with reporting, later).
- raise ItemQuantityError
- end
- end
end
diff --git a/app/models/concerns/destroy_if_zero_quantity.rb b/app/models/concerns/destroy_if_zero_quantity.rb
new file mode 100644
index 0000000..6fdfb3e
--- /dev/null
+++ b/app/models/concerns/destroy_if_zero_quantity.rb
@@ -0,0 +1,18 @@
+module DestroyIfZeroQuantity
+ extend ActiveSupport::Concern
+
+ included do
+ after_save :destroy_if_zero_quantity
+ end
+
+ private
+ def destroy_if_zero_quantity
+ byebug
+ if self.quantity == 0
+ destroy
+ elsif self.quantity < 0
+ # TODO: Can improve this (at the least, with reporting, later).
+ raise ItemQuantityError
+ end
+ end
+end