Compare commits

...

2 commits

Author SHA1 Message Date
cd28c26ae7 Make thumbnail_url a manually overridable field for Alt Styles
Oh jeez, okay, the latest batch of Alt Styles are using a different URL
format for the thumbnail image!

This isn't something we can import via modeling, so we're gonna have to
keep on top of it manually. For now, I'll keep inferring the previous
format in case they keep using it, but here's also a console script to
fix up the latest batch. (At time of writing, not all of these are in
our database, which is fine; when pasting it into the console, those
lines will error and the script will continue.)

```rb
def update_style(color_name, species_name, thumbnail_url)
	AltStyle.find_by_color_id_and_species_id(
		Color.find_by_name(color_name),
		Species.find_by_name(species_name)
	).update!(thumbnail_url:)
end

update_style "Grey", "Blumaroo", "https://images.neopets.com/items/c0gk16fk.gif"
update_style "Grey", "Bori", "https://images.neopets.com/items/55qvx6mr.gif"
update_style "Grey", "Bruce", "https://images.neopets.com/items/6y6pyiuw.gif"
update_style "Grey", "Buzz", "https://images.neopets.com/items/7fh4avry.gif"
update_style "Grey", "Chia", "https://images.neopets.com/items/7b2jtn10.gif"
update_style "Grey", "Elephante", "https://images.neopets.com/items/0ne41rao.gif"
update_style "Grey", "Gnorbu", "https://images.neopets.com/items/75mwtqmh.gif"
update_style "Grey", "Hissi", "https://images.neopets.com/items/dxdi2mhm.gif"
update_style "Grey", "Kiko", "https://images.neopets.com/items/b9yiruxt.gif"
update_style "Grey", "Lenny", "https://images.neopets.com/items/c6cboc7e.gif"
update_style "Grey", "Lutari", "https://images.neopets.com/items/33fs4eqf.gif"
update_style "Grey", "Nimmo", "https://images.neopets.com/items/4karmgbl.gif"
update_style "Grey", "Ogrin", "https://images.neopets.com/items/dlw78fhk.gif"
update_style "Grey", "Quiggle", "https://images.neopets.com/items/0aipl0iw.gif"
update_style "Grey", "Ruki", "https://images.neopets.com/items/bjnjxsem.gif"
update_style "Grey", "Tuskaninny", "https://images.neopets.com/items/7rh57a0o.gif"
update_style "Grey", "Vandagyre", "https://images.neopets.com/items/6p8sgs69.gif"
update_style "Grey", "Xweetok", "https://images.neopets.com/items/bge9vp5e.gif"
```
2024-06-15 17:35:12 -07:00
36452a4704 Flag items you already own in the Item Getting Guide 2024-06-15 15:47:52 -07:00
7 changed files with 154 additions and 82 deletions

View file

@ -58,9 +58,33 @@
.thumbnail-cell img
outline: 1px solid $soft-border-color
.actions-cell button
/* Bootstrap's Purple 600 */
+awesome-button-color(#59359a)
.actions-cell
button, a.button
/* Bootstrap's Purple 600 */
+awesome-button-color(#59359a)
tr[data-item-owned]
color: #aaa
a:not(.button)
color: inherit
.thumbnail-cell
filter: grayscale(1)
opacity: .75
.item-name
font-style: italic
text-decoration: line-through
text-decoration-color: rgba($text-color, 0.35)
.owned-explanation
font-style: italic
font-size: 85%
.actions-cell
button, a.button
+awesome-button-color(#999)
.price-breakdown
text-decoration-line: underline
@ -100,3 +124,8 @@
tr:hover .thumbnail-cell
opacity: 0.85
&[data-group-owned]
thead
button, a.button
+awesome-button-color(#999)

View file

@ -116,6 +116,7 @@ class ItemsController < ApplicationController
item_ids = params[:ids].split(",")
@items = Item.where(id: item_ids).includes(:nc_mall_record).
includes(:dyeworks_base_item).order(:name).limit(50)
assign_closeted!
if @items.empty?
render file: "public/404.html", status: :not_found, layout: nil
@ -155,6 +156,16 @@ class ItemsController < ApplicationController
[color, color.example_pet_type(preferred_species: species)]
end.to_h
# 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?)
@pb_items_needed_by_color =
@pb_items_by_color.transform_values { |items| items.reject(&:owned?) }
# Finish loading the NC trade values.
trade_values_task.wait

View file

@ -11,6 +11,7 @@ class AltStyle < ApplicationRecord
validates :body_id, presence: true
before_create :infer_series_name
before_create :infer_thumbnail_url
scope :matching_name, ->(series_name, color_name, species_name) {
color = Color.find_by_name!(color_name)
@ -41,22 +42,6 @@ class AltStyle < ApplicationRecord
"#{series_name} #{color.human_name}"
end
THUMBNAIL_URL_TEMPLATE = Addressable::Template.new(
"https://images.neopets.com/items/{series}_{color}_{species}.gif"
)
DEFAULT_THUMBNAIL_URL = "https://images.neopets.com/items/mall_bg_circle.gif"
def thumbnail_url
return DEFAULT_THUMBNAIL_URL unless has_real_series_name?
# HACK: We're assuming this is the format long-term! But if it changes, we
# may need to add it as a database field instead.
THUMBNAIL_URL_TEMPLATE.expand(
series: series_name.gsub(/\s+/, '').downcase,
color: color.name.gsub(/\s+/, '').downcase,
species: species.name.gsub(/\s+/, '').downcase,
).to_s
end
def preview_image_url
swf_asset = swf_assets.first
return nil if swf_asset.nil?
@ -91,6 +76,26 @@ class AltStyle < ApplicationRecord
end
end
# At time of writing, most batches of Alt Styles thumbnails used a simple
# pattern for the item thumbnail URL, but that's not always the case anymore.
# For now, let's keep using this format as the default value when creating a
# new Alt Style, but the database field can be manually overridden as needed!
THUMBNAIL_URL_TEMPLATE = Addressable::Template.new(
"https://images.neopets.com/items/{series}_{color}_{species}.gif"
)
DEFAULT_THUMBNAIL_URL = "https://images.neopets.com/items/mall_bg_circle.gif"
def infer_thumbnail_url
if has_real_series_name?
self.thumbnail_url = THUMBNAIL_URL_TEMPLATE.expand(
series: series_name.gsub(/\s+/, '').downcase,
color: color.name.gsub(/\s+/, '').downcase,
species: species.name.gsub(/\s+/, '').downcase,
).to_s
else
self.thumbnail_url = DEFAULT_THUMBNAIL_URL
end
end
# For convenience in the console!
def self.find_by_name(color_name, species_name)
color = Color.find_by_name(color_name)

View file

@ -4,12 +4,15 @@
- content = yield
- subtitle = yield :subtitle
%tr
%tr{"data-item-owned": item.owned?}
%td.thumbnail-cell
= link_to item_thumbnail_for(item), item, target: "_blank",
tabindex: "-1"
%td.name-cell
= link_to item.name, item, target: "_blank"
= link_to item.name, item, target: "_blank", class: "item-name"
- if item.owned?
%span.owned-explanation
(You own this)
- if subtitle.present?
.subtitle= subtitle
%td.actions-cell= content

View file

@ -16,13 +16,14 @@
%tr
%td
%th
Total: #{nc_total_for @nc_mall_items} NC
(#{pluralize @nc_mall_items.size, "item"})
Total: #{nc_total_for @nc_mall_items_needed} NC
(#{pluralize @nc_mall_items_needed.size, "item"})
%td.actions-cell
%button{onclick: "alert('Todo!')"}
= cart_icon alt: ""
Buy all in NC Mall
- if @nc_mall_items_needed.present?
%button{onclick: "alert('Todo!')"}
= cart_icon alt: ""
Buy all in NC Mall
%tbody
- @nc_mall_items.each do |item|
= render "item_list_row", item: do
@ -42,25 +43,27 @@
%table.item-list
%thead
%td.thumbnail-cell
= 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} NC
= surround "(", ")" do
%span.price-breakdown{
title: "#{dyeworks_items_nc_total_for(@buyable_dyeworks_items)} NC"
}<
#{pluralize @buyable_dyeworks_items.size, "item"}
+
%span.price-breakdown{
title: dyeworks_potions_nc_summary(@buyable_dyeworks_items.size)
}<
#{pluralize @buyable_dyeworks_items.size, "potion"}
%td.actions-cell
%button{onclick: "alert('Todo!')"}
= cart_icon alt: ""
Buy all in NC Mall
%tr
%td.thumbnail-cell
= 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
= surround "(", ")" do
%span.price-breakdown{
title: "#{dyeworks_items_nc_total_for(@buyable_dyeworks_items_needed)} NC"
}<
#{pluralize @buyable_dyeworks_items_needed.size, "item"}
+
%span.price-breakdown{
title: dyeworks_potions_nc_summary(@buyable_dyeworks_items_needed.size)
}<
#{pluralize @buyable_dyeworks_items_needed.size, "potion"}
%td.actions-cell
- if @buyable_dyeworks_items_needed.present?
%button{onclick: "alert('Todo!')"}
= cart_icon alt: ""
Buy all in NC Mall
%tbody
- @buyable_dyeworks_items.each do |item|
= render "item_list_row", item: do
@ -96,9 +99,10 @@
%table.item-list
%thead
%td
%th{colspan: 2}
Total: #{pluralize @np_items.size, "item"}
%tr
%td
%th{colspan: 2}
Total: #{pluralize @np_items_needed.size, "item"}
%tbody
- @np_items.each do |item|
= render "item_list_row", item: do
@ -116,39 +120,44 @@
"cross-paint" outfits.
- @pb_items_by_color.each do |color, items|
%table.item-list{"data-group-type": "bundle"}
- items_needed = @pb_items_needed_by_color[color]
%table.item-list{
"data-group-type": "bundle",
"data-group-owned": items.all?(&:owned?),
}
%thead
%td.thumbnail-cell
- if color&.pb_item_thumbnail_url?
= image_tag color.pb_item_thumbnail_url,
alt: "Item thumbnail for #{color.pb_item_name}"
- elsif color
= image_tag pet_type_image_url(@pb_color_pet_types[color], size: :face),
srcset: ["#{pet_type_image_url(@pb_color_pet_types[color], size: :face_2x)} 2x"],
alt: @pb_color_pet_types[color].human_name
- else
= image_tag "https://images.neopets.com/items/starter_red_pb.gif",
alt: "Item thumbnail for Starter Red Paint Brush"
%th
- if color
#{color.pb_item_name || color.name.humanize}
- else
Basic colors
(#{pluralize items.size, "item"})
%td.actions-cell
- if color&.pb_item_name?
= button_link_to "Shops",
shop_wizard_url_for(color.pb_item_name),
target: "_blank", icon: search_icon
= button_link_to "Trades",
trading_post_url_for(color.pb_item_name),
target: "_blank", icon: search_icon
- elsif color
.special-color-explanation
Get via Lab Ray, morphing potions, etc.
- else
.special-color-explanation
Many colors, like Red, will grant these items.
%tr
%td.thumbnail-cell
- if color&.pb_item_thumbnail_url?
= image_tag color.pb_item_thumbnail_url,
alt: "Item thumbnail for #{color.pb_item_name}"
- elsif color
= image_tag pet_type_image_url(@pb_color_pet_types[color], size: :face),
srcset: ["#{pet_type_image_url(@pb_color_pet_types[color], size: :face_2x)} 2x"],
alt: @pb_color_pet_types[color].human_name
- else
= image_tag "https://images.neopets.com/items/starter_red_pb.gif",
alt: "Item thumbnail for Starter Red Paint Brush"
%th
- if color
#{color.pb_item_name || color.name.humanize}
- else
Basic colors
(#{pluralize items_needed.size, "item"})
%td.actions-cell
- if color&.pb_item_name?
= button_link_to "Shops",
shop_wizard_url_for(color.pb_item_name),
target: "_blank", icon: search_icon
= button_link_to "Trades",
trading_post_url_for(color.pb_item_name),
target: "_blank", icon: search_icon
- elsif color
.special-color-explanation
Get via Lab Ray, morphing potions, etc.
- else
.special-color-explanation
Many colors, like Red, will grant these items.
%tbody
- items.each do |item|
= render "item_list_row", item:
@ -175,7 +184,7 @@
%thead
%td
%th{colspan: 2}
Total: #{pluralize @other_nc_items.size, "item"}
Total: #{pluralize @other_nc_items_needed.size, "item"}
%tbody
- @other_nc_items.each do |item|
= render "item_list_row", item: do

View file

@ -0,0 +1,14 @@
class AddThumbnailUrlToAltStyles < ActiveRecord::Migration[7.1]
def change
add_column :alt_styles, :thumbnail_url, :string, null: false
reversible do |direction|
direction.up do
AltStyle.find_each do |alt_style|
alt_style.infer_thumbnail_url
alt_style.save!
end
end
end
end
end

View file

@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[7.1].define(version: 2024_06_08_022149) do
ActiveRecord::Schema[7.1].define(version: 2024_06_16_001002) do
create_table "alt_styles", charset: "utf8mb4", collation: "utf8mb4_unicode_520_ci", force: :cascade do |t|
t.integer "species_id", null: false
t.integer "color_id", null: false
@ -18,6 +18,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_06_08_022149) do
t.datetime "created_at", precision: nil, null: false
t.datetime "updated_at", precision: nil, null: false
t.string "series_name"
t.string "thumbnail_url", null: false
t.index ["color_id"], name: "index_alt_styles_on_color_id"
t.index ["species_id"], name: "index_alt_styles_on_species_id"
end