Compare commits

...

6 commits

Author SHA1 Message Date
ab572b6576 Fix magic magnifier positioning in Firefox
Oh oops, Firefox is a bit stricter about interpreting custom elements
as inline elements by default instead of block elements. This messes up
the positioning relative to the container. Fixed!
2024-12-28 16:11:38 -08:00
019484b6dd Oops, fix showing the magic magnifier in Firefox
Oh, guess Firefox doesn't support this CSS container query feature yet!
Use a more compatible technique instead.
2024-12-28 16:08:28 -08:00
34bf27069b Oops, fix silly routing mistake where I set path twice for same route
Ruby 3.3.6 has a warning for this, neat! I apparently didn't notice the
`path` option already there at first, and just added a new one.

This change shouldn't affect behavior, it just is clearer and removes a
warning!
2024-12-28 15:58:41 -08:00
84dec2d82e Tweak output for Styling Studio auto-importer
A style not being modeled yet is not a big deal, whereas some of those
other warnings actually require manual intervention. I want to make the
list easier to scan for the warn icons!
2024-12-28 15:53:24 -08:00
d75492bd1d Add Prismatic styles to Styling Studio auto-importer
I missed this the first time, and had just kinda been putting it off.
But now there's a lot of new Prismatics, so let's finally do it!
2024-12-28 15:52:48 -08:00
b61526f6ad Upgrade to Ruby 3.3.6
Fedora upgraded its system Ruby, and I'm on that laptop today, and I
prefer to have prod keep pace rather than use rbenv to keep myself and
prod knowingly on an older version!
2024-12-28 15:34:42 -08:00
11 changed files with 65 additions and 28 deletions

View file

@ -1 +1 @@
3.3.5 3.3.6

View file

@ -1,5 +1,5 @@
source 'https://rubygems.org' source 'https://rubygems.org'
ruby '3.3.5' ruby '3.3.6'
gem 'rails', '~> 7.2', '>= 7.2.1' gem 'rails', '~> 7.2', '>= 7.2.1'

View file

@ -565,7 +565,7 @@ DEPENDENCIES
will_paginate (~> 4.0) will_paginate (~> 4.0)
RUBY VERSION RUBY VERSION
ruby 3.3.5p100 ruby 3.3.6p108
BUNDLED WITH BUNDLED WITH
2.5.18 2.5.18

View file

@ -1,4 +1,6 @@
class MagicMagnifier extends HTMLElement { class MagicMagnifier extends HTMLElement {
#internals = this.attachInternals();
connectedCallback() { connectedCallback() {
setTimeout(() => this.#attachLens(), 0); setTimeout(() => this.#attachLens(), 0);
this.addEventListener("mousemove", this.#onMouseMove); this.addEventListener("mousemove", this.#onMouseMove);
@ -18,6 +20,7 @@ class MagicMagnifier extends HTMLElement {
const y = e.clientY - rect.top; const y = e.clientY - rect.top;
this.style.setProperty("--magic-magnifier-x", x + "px"); this.style.setProperty("--magic-magnifier-x", x + "px");
this.style.setProperty("--magic-magnifier-y", y + "px"); this.style.setProperty("--magic-magnifier-y", y + "px");
this.#internals.states.add("ready");
} }
} }

View file

@ -1,4 +1,5 @@
magic-magnifier magic-magnifier
display: block
position: relative position: relative
// Only show the lens when we are hovering, and the magnifier's X and Y // Only show the lens when we are hovering, and the magnifier's X and Y
@ -7,12 +8,14 @@ magic-magnifier
magic-magnifier-lens magic-magnifier-lens
display: none display: none
&:hover // TODO: Once container query support is broader, we can remove the CSS state
@container style(--magic-magnifier-x) and style(--magic-magnifier-y) // and read for the presence of the X and Y custom properties instead.
magic-magnifier-lens &:hover:state(ready)
display: block magic-magnifier-lens
display: block
magic-magnifier-lens magic-magnifier-lens
display: block
width: var(--magic-magnifier-lens-width, 100px) width: var(--magic-magnifier-lens-width, 100px)
height: var(--magic-magnifier-lens-height, 100px) height: var(--magic-magnifier-lens-height, 100px)
overflow: hidden overflow: hidden

View file

@ -38,8 +38,20 @@ module Neopets::NCMall
uniq uniq
end end
STYLING_STUDIO_URL = "https://www.neopets.com/np-templates/ajax/stylingstudio/studio.php"
def self.load_styles(species_id:, neologin:) def self.load_styles(species_id:, neologin:)
Sync do
tabs = [
Async { load_styles_tab(species_id:, neologin:, tab: 1) },
Async { load_styles_tab(species_id:, neologin:, tab: 2) },
]
tabs.map(&:wait).flatten(1)
end
end
private
STYLING_STUDIO_URL = "https://www.neopets.com/np-templates/ajax/stylingstudio/studio.php"
def self.load_styles_tab(species_id:, neologin:, tab:)
Sync do Sync do
DTIRequests.post( DTIRequests.post(
STYLING_STUDIO_URL, STYLING_STUDIO_URL,
@ -48,7 +60,7 @@ module Neopets::NCMall
["Cookie", "neologin=#{neologin}"], ["Cookie", "neologin=#{neologin}"],
["X-Requested-With", "XMLHttpRequest"], ["X-Requested-With", "XMLHttpRequest"],
], ],
{tab: 1, mode: "getStyles", species: species_id}.to_query, {tab:, mode: "getStyles", species: species_id}.to_query,
) do |response| ) do |response|
if response.status != 200 if response.status != 200
raise ResponseNotOK.new(response.status), raise ResponseNotOK.new(response.status),
@ -60,7 +72,8 @@ module Neopets::NCMall
# HACK: styles is a hash, unless it's empty, in which case it's an # HACK: styles is a hash, unless it's empty, in which case it's an
# array? Weird. Normalize this by converting to hash. # array? Weird. Normalize this by converting to hash.
data.fetch(:styles).to_h.values data.fetch(:styles).to_h.values.
map { |s| s.slice(:oii, :name, :image, :limited) }
rescue JSON::ParserError, KeyError rescue JSON::ParserError, KeyError
raise UnexpectedResponseFormat raise UnexpectedResponseFormat
end end
@ -68,8 +81,6 @@ module Neopets::NCMall
end end
end end
private
def self.load_page_by_url(url) def self.load_page_by_url(url)
Sync do Sync do
DTIRequests.get(url) do |response| DTIRequests.get(url) do |response|

View file

@ -37,8 +37,7 @@ OpenneoImpressItems::Application.routes.draw do
end end
resources :swf_assets, path: 'swf-assets', only: [:show] resources :swf_assets, path: 'swf-assets', only: [:show]
scope "rainbow-pool" do scope "rainbow-pool" do
resources :alt_styles, path: 'alt-styles', only: [:index, :edit, :update], resources :alt_styles, path: 'styles', only: [:index, :edit, :update]
path: 'styles'
end end
resources :pet_types, path: 'rainbow-pool', param: "name", resources :pet_types, path: 'rainbow-pool', param: "name",
only: [:index, :show] do only: [:index, :show] do

View file

@ -6,7 +6,7 @@
vars: vars:
local_app_root: "{{ playbook_dir }}/.." local_app_root: "{{ playbook_dir }}/.."
remote_project_root: "/srv/impress" remote_project_root: "/srv/impress"
ruby_version: "3.3.5" ruby_version: "3.3.6"
# deploy:setup should have added us to the "impress-deployers" group, so we # deploy:setup should have added us to the "impress-deployers" group, so we
# should be able to become the "impress" user without a password. # should be able to become the "impress" user without a password.

View file

@ -6,7 +6,7 @@
vars: vars:
email_address: "emi@matchu.dev" # TODO: Extract this to personal config? email_address: "emi@matchu.dev" # TODO: Extract this to personal config?
impress_hostname: impress.openneo.net impress_hostname: impress.openneo.net
ruby_version: "3.3.5" ruby_version: "3.3.6"
vars_files: vars_files:
# mysql_root_password, mysql_user_password, mysql_user_password_2020, # mysql_root_password, mysql_user_password, mysql_user_password_2020,
# dev_ips # dev_ips
@ -171,7 +171,7 @@
git: git:
repo: https://github.com/rbenv/ruby-build.git repo: https://github.com/rbenv/ruby-build.git
dest: /opt/ruby-build dest: /opt/ruby-build
version: v20240917 version: v20241225.2
- name: Check if Ruby {{ ruby_version }} is already installed - name: Check if Ruby {{ ruby_version }} is already installed
stat: stat:

View file

@ -42,7 +42,7 @@ namespace "neopets:import" do
record = style_records_by_id[style[:oii]] record = style_records_by_id[style[:oii]]
label = "#{style[:name]} (#{style[:oii]})" label = "#{style[:name]} (#{style[:oii]})"
if record.nil? if record.nil?
puts "⚠️ [#{label}]: Not modeled yet, skipping" puts " [#{label}]: Not modeled yet, skipping"
counts[:skipped] += 1 counts[:skipped] += 1
next next
end end

View file

@ -3,7 +3,7 @@ require_relative '../rails_helper'
RSpec.describe Neopets::NCMall, type: :model do RSpec.describe Neopets::NCMall, type: :model do
describe ".load_styles" do describe ".load_styles" do
def stub_styles_request def stub_styles_request(tab:)
stub_request(:post, "https://www.neopets.com/np-templates/ajax/stylingstudio/studio.php"). stub_request(:post, "https://www.neopets.com/np-templates/ajax/stylingstudio/studio.php").
with( with(
headers: { headers: {
@ -12,10 +12,15 @@ RSpec.describe Neopets::NCMall, type: :model do
"Cookie": "neologin=STUB_NEOLOGIN", "Cookie": "neologin=STUB_NEOLOGIN",
"User-Agent": Rails.configuration.user_agent_for_neopets, "User-Agent": Rails.configuration.user_agent_for_neopets,
}, },
body: "mode=getStyles&species=2&tab=1", body: "mode=getStyles&species=2&tab=#{tab}",
) )
end end
def empty_styles_response
# You'd think styles would be `{}` in this case, but it's `[]`. Huh!
{ body: '{"success":true,"styles":[]}' }
end
subject(:styles) do subject(:styles) do
Neopets::NCMall.load_styles( Neopets::NCMall.load_styles(
species_id: 2, species_id: 2,
@ -24,9 +29,12 @@ RSpec.describe Neopets::NCMall, type: :model do
end end
it "loads current NC styles from the NC Mall" do it "loads current NC styles from the NC Mall" do
stub_styles_request.to_return( stub_styles_request(tab: 1).to_return(
body: '{"success":true,"styles":{"87966":{"oii":87966,"name":"Nostalgic Alien Aisha","image":"https:\/\/images.neopets.com\/items\/nostalgic_alien_aisha.gif","limited":false},"87481":{"oii":87481,"name":"Nostalgic Sponge Aisha","image":"https:\/\/images.neopets.com\/items\/nostalgic_sponge_aisha.gif","limited":false},"90031":{"oii":90031,"name":"Celebratory Anniversary Aisha","image":"https:\/\/images.neopets.com\/items\/624dc08bcf.gif","limited":true},"90050":{"oii":90050,"name":"Nostalgic Tyrannian Aisha","image":"https:\/\/images.neopets.com\/items\/b225e06541.gif","limited":true}}}', body: '{"success":true,"styles":{"87966":{"oii":87966,"name":"Nostalgic Alien Aisha","image":"https:\/\/images.neopets.com\/items\/nostalgic_alien_aisha.gif","limited":false},"87481":{"oii":87481,"name":"Nostalgic Sponge Aisha","image":"https:\/\/images.neopets.com\/items\/nostalgic_sponge_aisha.gif","limited":false},"90031":{"oii":90031,"name":"Celebratory Anniversary Aisha","image":"https:\/\/images.neopets.com\/items\/624dc08bcf.gif","limited":true},"90050":{"oii":90050,"name":"Nostalgic Tyrannian Aisha","image":"https:\/\/images.neopets.com\/items\/b225e06541.gif","limited":true}}}',
) )
stub_styles_request(tab: 2).to_return(
body: '{"success":true,"styles":{"90338":{"oii":90338,"name":"Prismatic Pine: Christmas Aisha","image":"https:\/\/images.neopets.com\/items\/3m182ff5.gif","limited":true,"style":90252},"90348":{"oii":90348,"name":"Prismatic Tinsel: Christmas Aisha","image":"https:\/\/images.neopets.com\/items\/4j29mb91.gif","limited":true,"style":90252}}}'
)
expect(styles).to contain_exactly( expect(styles).to contain_exactly(
{ {
@ -52,37 +60,50 @@ RSpec.describe Neopets::NCMall, type: :model do
name: "Nostalgic Tyrannian Aisha", name: "Nostalgic Tyrannian Aisha",
image: "https://images.neopets.com/items/b225e06541.gif", image: "https://images.neopets.com/items/b225e06541.gif",
limited: true, limited: true,
},
{
oii: 90338,
name: "Prismatic Pine: Christmas Aisha",
image: "https://images.neopets.com/items/3m182ff5.gif",
limited: true,
},
{
oii: 90348,
name: "Prismatic Tinsel: Christmas Aisha",
image: "https://images.neopets.com/items/4j29mb91.gif",
limited: true,
} }
) )
end end
it "handles the NC Mall's odd API behavior for zero styles" do it "handles the NC Mall's odd API behavior for zero styles" do
stub_styles_request.to_return( stub_styles_request(tab: 1).to_return(empty_styles_response)
# You'd think styles would be `{}` in this case, but it's `[]`. Huh! stub_styles_request(tab: 2).to_return(empty_styles_response)
body: '{"success":true,"styles":[]}',
)
expect(styles).to be_empty expect(styles).to be_empty
end end
it "raises an error if the request returns a non-200 status" do it "raises an error if the request returns a non-200 status" do
stub_styles_request.to_return(status: 400) stub_styles_request(tab: 1).to_return(status: 400)
stub_styles_request(tab: 2).to_return(empty_styles_response)
expect { styles }.to raise_error(Neopets::NCMall::ResponseNotOK) expect { styles }.to raise_error(Neopets::NCMall::ResponseNotOK)
end end
it "raises an error if the request returns a non-JSON response" do it "raises an error if the request returns a non-JSON response" do
stub_styles_request.to_return( stub_styles_request(tab: 1).to_return(
body: "Oops, this request failed for some weird reason!", body: "Oops, this request failed for some weird reason!",
) )
stub_styles_request(tab: 2).to_return(empty_styles_response)
expect { styles }.to raise_error(Neopets::NCMall::UnexpectedResponseFormat) expect { styles }.to raise_error(Neopets::NCMall::UnexpectedResponseFormat)
end end
it "raises an error if the request returns unexpected JSON" do it "raises an error if the request returns unexpected JSON" do
stub_styles_request.to_return( stub_styles_request(tab: 1).to_return(
body: '{"success": false}', body: '{"success": false}',
) )
stub_styles_request(tab: 2).to_return(empty_styles_response)
expect { styles }.to raise_error(Neopets::NCMall::UnexpectedResponseFormat) expect { styles }.to raise_error(Neopets::NCMall::UnexpectedResponseFormat)
end end