Compare commits

...

4 commits

Author SHA1 Message Date
bbd1849e19 Oops, fix crash for Dyeworks without Owls info in Item Getting Guide
Silly mistake, right, we might not have a trade value listed! This is
relevant for the new Dyeworks items that just came out like a few hours
ago, which Owls doesn't have info for yet.
2024-06-17 13:07:03 -07:00
598a9dac52 Oops, fix crashing bug when Item Getting Guide has *no* Dyeworks
Lmao I've been testing with an outfit that has all the kinds of items,
so I didn't notice that this new refactor to `@items[:dyeworks]` style
of tracking the items returns `nil` when there's none, instead of `[]`.
(I always make this mistake when I use `group_by` lmao sob)

In this change, we give the `@items` hash a default value, so that will
stop happening!
2024-06-17 13:03:12 -07:00
9f536f81b3 Refactor to use a new Item#source method for where an item is from
I'm doing this in preparation for maybe trying to load some of this
info into the outfit editor, too!
2024-06-16 12:37:53 -07:00
77f01a6cb9 Edge case: say "0 NC" for cost of no potions in Item Getting Guide 2024-06-16 12:26:55 -07:00
4 changed files with 55 additions and 47 deletions

View file

@ -13,7 +13,7 @@ class ItemsController < ApplicationController
@items = @query.results.paginate(
page: params[:page], per_page: per_page)
assign_closeted!
assign_closeted!(@items)
respond_to do |format|
format.html {
@ -54,7 +54,7 @@ class ItemsController < ApplicationController
end
elsif params.has_key?(:ids) && params[:ids].is_a?(Array)
@items = Item.find(params[:ids])
assign_closeted!
assign_closeted!(@items)
respond_to do |format|
format.json { render json: @items }
end
@ -104,7 +104,7 @@ class ItemsController < ApplicationController
end
@items = @pet_type.needed_items.order(:name)
assign_closeted!
assign_closeted!(@items)
respond_to do |format|
format.html { @pet_name = params[:name] ; render :layout => 'application' }
@ -113,12 +113,15 @@ class ItemsController < ApplicationController
end
def sources
# Load all the items, then group them by source.
item_ids = params[:ids].split(",")
@items = Item.where(id: item_ids).includes(:nc_mall_record).
@all_items = Item.where(id: item_ids).includes(:nc_mall_record).
includes(:dyeworks_base_item).order(:name).limit(50)
assign_closeted!
@items = @all_items.group_by(&:source).tap { |i| i.default = [] }
if @items.empty?
assign_closeted!(@all_items)
if @all_items.empty?
render file: "public/404.html", status: :not_found, layout: nil
return
end
@ -126,23 +129,14 @@ class ItemsController < ApplicationController
# For Dyeworks items whose base is currently in the NC Mall, preload their
# trade values. We'll use this to determine which ones are fully buyable rn
# (because Owls tracks this data and we don't).
Item.preload_nc_trade_values(@items.select(&:dyeworks_base_buyable?))
# Group the items by category!
@nc_mall_items = @items.select(&:currently_in_mall?).
reject(&:dyeworks_buyable?)
@buyable_dyeworks_items = @items.select(&:dyeworks_buyable?)
@np_items = @items.select(&:np?)
@pb_items = @items.select(&:pb?)
@other_nc_items = @items.select(&:nc?).reject(&:currently_in_mall?).
reject(&:dyeworks_buyable?)
Item.preload_nc_trade_values(@items[:dyeworks])
# Start loading the NC trade values for the non-Mall NC items.
trade_values_task = Async { Item.preload_nc_trade_values(@other_nc_items) }
trade_values_task = Async { Item.preload_nc_trade_values(@items[:other_nc]) }
# Also, PB items have some special handling: we group them by color, then
# load example pet types for the colors that don't have paint brushes.
@pb_items_by_color = @pb_items.group_by(&:pb_color).
@pb_items_by_color = @items[:pb].group_by(&:pb_color).
sort_by { |color, items| color&.name }.to_h
colors_without_thumbnails = @pb_items_by_color.keys.
@ -158,11 +152,7 @@ class ItemsController < ApplicationController
# Create a second value that only include the items the user *needs*: that
# is, that they don't already own.
@nc_mall_items_needed = @nc_mall_items.reject(&:owned?)
@buyable_dyeworks_items_needed = @buyable_dyeworks_items.reject(&:owned?)
@np_items_needed = @np_items.reject(&:owned?)
@pb_items_needed = @pb_items.reject(&:owned?)
@other_nc_items_needed = @other_nc_items.reject(&:owned?)
@items_needed = @items.transform_values { |items| items.reject(&:owned?) }
@pb_items_needed_by_color =
@pb_items_by_color.transform_values { |items| items.reject(&:owned?) }
@ -174,8 +164,8 @@ class ItemsController < ApplicationController
protected
def assign_closeted!
current_user.assign_closeted_to_items!(@items) if user_signed_in?
def assign_closeted!(items)
current_user.assign_closeted_to_items!(items) if user_signed_in?
end
def load_appearances

View file

@ -234,6 +234,7 @@ module ItemsHelper
num_items = 0
end
summaries << "0 NC" if summaries.empty?
summary = summaries.join(", ")
{nc_total:, summary:}

View file

@ -213,6 +213,7 @@ class Item < ApplicationRecord
# Mall at any time, rather than as part of a limited-time event. (Owls tracks
# this, not us!)
def dyeworks_permanent?
return false if nc_trade_value.nil?
nc_trade_value.value_text.include?("Permanent Dyeworks")
end
@ -240,6 +241,22 @@ class Item < ApplicationRecord
Item.find_by_name(name_match["base"])
end
def source
if dyeworks_buyable?
:dyeworks
elsif currently_in_mall?
:nc_mall
elsif nc?
:other_nc
elsif np?
:np
elsif pb?
:pb
else
raise "Item has no matching source (should not happen?)"
end
end
def owned?
@owned || false
end

View file

@ -1,7 +1,7 @@
- title "Item Getting Guide"
%h1#title Item Getting Guide
- if @nc_mall_items.present?
- if @items[:nc_mall].present?
%h2 NC Mall items
:markdown
These items are available in the NC Mall right now! You can buy them
@ -16,22 +16,22 @@
%tr
%td
%th
Total: #{nc_total_for @nc_mall_items_needed} NC
(#{pluralize @nc_mall_items_needed.size, "item"})
Total: #{nc_total_for @items_needed[:nc_mall]} NC
(#{pluralize @items_needed[:nc_mall].size, "item"})
%td.actions-cell
- if @nc_mall_items_needed.present?
- if @items_needed[:nc_mall].present?
%button{onclick: "alert('Todo!')"}
= cart_icon alt: ""
Buy all in NC Mall
%tbody
- @nc_mall_items.each do |item|
- @items[:nc_mall].each do |item|
= render "item_list_row", item: do
%button{onclick: "alert('Todo!')"}
= cart_icon alt: ""
Buy (#{item.current_nc_price} NC)
- if @buyable_dyeworks_items.present?
- if @items[:dyeworks].present?
%h2 Dyeworks items
:markdown
These are recolored "Dyeworks" variants of items. First get the "base"
@ -48,24 +48,24 @@
= image_tag "https://images.neopets.com/items/mall_80x80_cleaning.gif",
alt: "Dyeworks Hue Brew Potion"
%th
Total: #{dyeworks_nc_total_for @buyable_dyeworks_items_needed} NC
Total: #{dyeworks_nc_total_for @items_needed[:dyeworks]} NC
= surround "(", ")" do
%span.price-breakdown{
title: "#{dyeworks_items_nc_total_for(@buyable_dyeworks_items_needed)} NC"
title: "#{dyeworks_items_nc_total_for(@items_needed[:dyeworks])} NC"
}<
#{pluralize @buyable_dyeworks_items_needed.size, "item"}
#{pluralize @items_needed[:dyeworks].size, "item"}
+
%span.price-breakdown{
title: dyeworks_potions_nc_summary(@buyable_dyeworks_items_needed.size)
title: dyeworks_potions_nc_summary(@items_needed[:dyeworks].size)
}<
#{pluralize @buyable_dyeworks_items_needed.size, "potion"}
#{pluralize @items_needed[:dyeworks].size, "potion"}
%td.actions-cell
- if @buyable_dyeworks_items_needed.present?
- if @items_needed[:dyeworks].present?
%button{onclick: "alert('Todo!')"}
= cart_icon alt: ""
Buy all in NC Mall
%tbody
- @buyable_dyeworks_items.each do |item|
- @items[:dyeworks].each do |item|
= render "item_list_row", item: do
- base_item = item.dyeworks_base_item
@ -85,7 +85,7 @@
= cart_icon alt: ""
Buy base (#{item.dyeworks_base_item.current_nc_price} NC)
- if @np_items.present?
- if @items[:np].present?
%h2 Neopoint items
:markdown
These items can be purchased with Neopoints. For less-expensive items,
@ -102,16 +102,16 @@
%tr
%td
%th{colspan: 2}
Total: #{pluralize @np_items_needed.size, "item"}
Total: #{pluralize @items_needed[:np].size, "item"}
%tbody
- @np_items.each do |item|
- @items[:np].each do |item|
= render "item_list_row", item: do
= button_link_to "Shops", shop_wizard_url_for(item),
target: "_blank", icon: search_icon
= button_link_to "Trades", trading_post_url_for(item),
target: "_blank", icon: search_icon
- if @pb_items.present?
- if @pb_items_by_color.present?
%h2 Paint Brush items
:markdown
These items are part of a paint brush set. Once you paint your pet,
@ -162,7 +162,7 @@
- items.each do |item|
= render "item_list_row", item:
- if @other_nc_items.present?
- if @items[:other_nc].present?
%h2 Neocash items (Capsules, events, retired, etc.)
:markdown
These items are part of the Neocash economy, but not directly for sale.
@ -172,7 +172,7 @@
[mall]: https://ncmall.neopets.com/
- if @other_nc_items.any?(&:nc_trade_value)
- if @items[:other_nc].any?(&:nc_trade_value)
:markdown
The [Owls Value Guide][owls] often has more details about how to get
these items, and how much they're usually worth in the NC Trading
@ -184,9 +184,9 @@
%thead
%td
%th{colspan: 2}
Total: #{pluralize @other_nc_items_needed.size, "item"}
Total: #{pluralize @items_needed[:other_nc].size, "item"}
%tbody
- @other_nc_items.each do |item|
- @items[:other_nc].each do |item|
= render "item_list_row", item: do
- content_for :subtitle, flush: true do
- if item.nc_trade_value.present?