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".)
99 lines
3.2 KiB
Ruby
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
|