1
0
Fork 1
impress/lib/tasks/neopets/import/styling_studio.rake
Emi Matchu 97ffffb67a Add configurable full name field to alt styles
Sigh, the "Valentine Plushie" series is messing with me again! It
doesn't follow the previously established pattern of the names being
"<series> <color> <species>", because in this case the base color is
considered "Valentine".

Okay, well! In this change we add `full_name` as an explicit database
field, and set the previous full name value as a fallback. (We also
extract the generic fallback logic into `ApplicationRecord`, to help us
express it more concisely.)

We also tweak `adjective_name` to be able to shorten custom `full_name`
values, too. That way, in the outfit editor, the Styles options show
correct values like "Cherub Plushie" for the "Cherub Plushie Acara".

I also make some changes in the outfit editor to better accommodate the
longer series names, to try to better handle long words but also to
just only use the first word of the series main name anyway. (Currently,
all series main names are one word, except "Valentine Plushie" becomes
"Valentine".)
2025-02-15 21:52:47 -08:00

99 lines
3.2 KiB
Ruby

namespace "neopets:import" do
desc "Import alt style info from the NC Styling Studio"
task :styling_studio => ["neopets:import:neologin", :environment] do
puts "Importing from Styling Studio…"
all_species = Species.order(:name).to_a
# Load 10 species pages from the NC Mall at a time.
styles_by_species_id = {}
DTIRequests.load_many(max_at_once: 10) do |task|
num_loaded = 0
num_total = all_species.size
print "0/#{num_total} species loaded"
all_species.each do |species|
task.async {
begin
styles_by_species_id[species.id] = Neopets::NCMall.load_styles(
species_id: species.id,
neologin: Neologin.cookie,
)
rescue => error
puts "\n⚠️ Error loading for #{species.human_name}, skipping: #{error.message}"
end
num_loaded += 1
print "\r#{num_loaded}/#{num_total} species loaded"
}
end
end
print "\n"
style_ids = styles_by_species_id.values.flatten(1).map { |s| s[:oii] }
style_records_by_id =
AltStyle.where(id: style_ids).to_h { |as| [as.id, as] }
all_species.each do |species|
styles = styles_by_species_id[species.id]
next if styles.nil?
counts = {changed: 0, unchanged: 0, skipped: 0}
styles.each do |style|
record = style_records_by_id[style[:oii]]
label = "#{style[:name]} (#{style[:oii]})"
if record.nil?
puts "❔ [#{label}]: Not modeled yet, skipping"
counts[:skipped] += 1
next
end
if !record.real_full_name?
record.full_name = style[:name]
puts "✅ [#{label}]: Full name is now #{style[:name].inspect}"
elsif record.full_name != style[:name]
puts "⚠️ [#{label}: Full name may have changed, handle manually? " +
"#{record.full_name.inspect} -> #{style[:name].inspect}"
end
if !record.real_thumbnail_url?
record.thumbnail_url = style[:image]
puts "✅ [#{label}]: Thumbnail URL is now #{style[:image].inspect}"
elsif record.thumbnail_url != style[:image]
puts "⚠️ [#{label}: Thumbnail URL may have changed, handle manually? " +
"#{record.thumbnail_url.inspect} -> #{style[:image].inspect}"
end
if style[:name].end_with?(record.pet_name)
new_series_name = style[:name].split(record.pet_name).first.strip
if !record.real_series_name?
record.series_name = new_series_name
puts "✅ [#{label}]: Series name is now #{new_series_name.inspect}"
elsif record.series_name != new_series_name
if ENV['FORCE'] == '1'
puts "❗ [#{label}]: Series name forcibly changed: " +
"#{record.series_name.inspect} -> #{new_series_name.inspect}"
record.series_name = new_series_name
else
puts "⚠️ [#{label}]: Series name may have changed, handle manually? " +
"#{record.series_name.inspect} -> #{new_series_name.inspect}"
end
end
else
puts "⚠️ [#{label}]: Unable to detect series name, handle manually? " +
"#{record.pet_name.inspect} <-> #{style[:name].inspect}"
end
if record.changed?
counts[:changed] += 1
else
counts[:unchanged] += 1
end
record.save!
end
puts "#{species.human_name}: #{counts[:changed]} changed, " +
"#{counts[:unchanged]} unchanged, #{counts[:skipped]} skipped"
end
end
end