From 29b9fe48c5cd3d7554c7bdb9b7808e4c3e0a4d21 Mon Sep 17 00:00:00 2001 From: Matt Dunn-Rankin Date: Sat, 23 May 2020 13:55:59 -0700 Subject: [PATCH] use PetService to determine the correct pose --- src/app/HomePage.js | 5 ++-- src/app/SpeciesColorPicker.js | 3 --- src/server/index.js | 14 +++++++--- src/server/neopets.js | 21 ++++++++++++--- src/server/query-tests/Pet.test.js | 1 + .../__snapshots__/Pet.test.js.snap | 1 + src/server/util.js | 26 +++++++++++++++++++ 7 files changed, 59 insertions(+), 12 deletions(-) diff --git a/src/app/HomePage.js b/src/app/HomePage.js index 9b3aec8..1b8338d 100644 --- a/src/app/HomePage.js +++ b/src/app/HomePage.js @@ -121,6 +121,7 @@ function SubmitPetForm() { species { id } + pose items { id } @@ -132,12 +133,12 @@ function SubmitPetForm() { onCompleted: (data) => { if (!data) return; - const { species, color, items } = data.petOnNeopetsDotCom; + const { species, color, pose, items } = data.petOnNeopetsDotCom; const params = new URLSearchParams({ name: petName, species: species.id, color: color.id, - pose: "HAPPY_FEM", // TODO: Ask PetService + pose, }); for (const item of items) { params.append("objects[]", item.id); diff --git a/src/app/SpeciesColorPicker.js b/src/app/SpeciesColorPicker.js index e8715c9..92b0ff7 100644 --- a/src/app/SpeciesColorPicker.js +++ b/src/app/SpeciesColorPicker.js @@ -103,7 +103,6 @@ function SpeciesColorPicker({ const validPoses = getValidPoses(valids, speciesId, newColorId); const isValid = validPoses.size > 0; const closestPose = getClosestPose(validPoses, idealPose); - console.log(idealPose, closestPose, validPoses); onChange(species, newColor, isValid, closestPose); }; @@ -117,7 +116,6 @@ function SpeciesColorPicker({ const validPoses = getValidPoses(valids, newSpeciesId, colorId); const isValid = validPoses.size > 0; const closestPose = getClosestPose(validPoses, idealPose); - console.log(idealPose, closestPose, validPoses); onChange(newSpecies, color, isValid, closestPose); }; @@ -181,7 +179,6 @@ function pairIsValid(valids, speciesId, colorId) { function getValidPoses(valids, speciesId, colorId) { const pairByte = getPairByte(valids, speciesId, colorId); - console.log("pair byte", pairByte.toString(2).padStart(8, "0")); const validPoses = new Set(); if (pairByte & 0b00000001) validPoses.add("HAPPY_MASC"); diff --git a/src/server/index.js b/src/server/index.js index 4570a84..7d1d530 100644 --- a/src/server/index.js +++ b/src/server/index.js @@ -6,6 +6,7 @@ const neopets = require("./neopets"); const { capitalize, getPoseFromPetState, + getPoseFromPetData, getEmotion, getGenderPresentation, } = require("./util"); @@ -124,6 +125,7 @@ const typeDefs = gql` type Outfit { species: Species! color: Color! + pose: Pose! items: [Item!]! } @@ -354,11 +356,15 @@ const resolvers = { return petStates.map((petState) => ({ petType, petState })); }, petOnNeopetsDotCom: async (_, { petName }) => { - const petData = await neopets.loadPetData(petName); + const [petMetaData, customPetData] = await Promise.all([ + neopets.loadPetMetaData(petName), + neopets.loadCustomPetData(petName), + ]); const outfit = { - species: { id: petData.custom_pet.species_id }, - color: { id: petData.custom_pet.color_id }, - items: Object.values(petData.object_info_registry).map((o) => ({ + species: { id: customPetData.custom_pet.species_id }, + color: { id: customPetData.custom_pet.color_id }, + pose: getPoseFromPetData(petMetaData, customPetData), + items: Object.values(customPetData.object_info_registry).map((o) => ({ id: o.obj_info_id, })), }; diff --git a/src/server/neopets.js b/src/server/neopets.js index f99c411..44ba3b3 100644 --- a/src/server/neopets.js +++ b/src/server/neopets.js @@ -1,13 +1,28 @@ const fetch = require("node-fetch"); -async function loadPetData(petName) { +async function loadPetMetaData(petName) { + const url = + `http://www.neopets.com/amfphp/json.php/PetService.getPet` + `/${petName}`; + const res = await fetch(url); + if (!res.ok) { + throw new Error( + `for pet meta data, neopets.com returned: ` + + `${res.status} ${res.statusText}. (${url})` + ); + } + + const json = await res.json(); + return json; +} + +async function loadCustomPetData(petName) { const url = `http://www.neopets.com/amfphp/json.php/CustomPetService.getViewerData` + `/${petName}`; const res = await fetch(url); if (!res.ok) { throw new Error( - `for pet data, neopets.com returned: ` + + `for custom pet data, neopets.com returned: ` + `${res.status} ${res.statusText}. (${url})` ); } @@ -56,4 +71,4 @@ function convertSwfUrlToManifestUrl(swfUrl) { return `http://images.neopets.com/cp/${type}/data/${folders}/manifest.json`; } -module.exports = { loadPetData, loadAssetManifest }; +module.exports = { loadPetMetaData, loadCustomPetData, loadAssetManifest }; diff --git a/src/server/query-tests/Pet.test.js b/src/server/query-tests/Pet.test.js index 0acf4d3..0ebd664 100644 --- a/src/server/query-tests/Pet.test.js +++ b/src/server/query-tests/Pet.test.js @@ -13,6 +13,7 @@ describe("Pet", () => { color { id } + pose items { id } diff --git a/src/server/query-tests/__snapshots__/Pet.test.js.snap b/src/server/query-tests/__snapshots__/Pet.test.js.snap index dc5775d..1816ff1 100644 --- a/src/server/query-tests/__snapshots__/Pet.test.js.snap +++ b/src/server/query-tests/__snapshots__/Pet.test.js.snap @@ -32,6 +32,7 @@ Object { "id": "48313", }, ], + "pose": "SAD_MASC", "species": Object { "id": "54", }, diff --git a/src/server/util.js b/src/server/util.js index aa746c1..0bae7d8 100644 --- a/src/server/util.js +++ b/src/server/util.js @@ -57,6 +57,31 @@ function getPoseFromPetState(petState) { } } +function getPoseFromPetData(petMetaData, petCustomData) { + // TODO: Use custom data to decide if Unconverted. + const moodId = petMetaData.mood; + const genderId = petMetaData.gender; + if (String(moodId) === "1" && String(genderId) === "1") { + return "HAPPY_MASC"; + } else if (String(moodId) === "1" && String(genderId) === "2") { + return "HAPPY_FEM"; + } else if (String(moodId) === "2" && String(genderId) === "1") { + return "SAD_MASC"; + } else if (String(moodId) === "2" && String(genderId) === "2") { + return "SAD_FEM"; + } else if (String(moodId) === "4" && String(genderId) === "1") { + return "SICK_MASC"; + } else if (String(moodId) === "4" && String(genderId) === "2") { + return "SICK_FEM"; + } else { + throw new Error( + `could not identify pose: ` + + `moodId=${moodId}, ` + + `genderId=${genderId}` + ); + } +} + function normalizeRow(row) { const normalizedRow = {}; for (let [key, value] of Object.entries(row)) { @@ -74,5 +99,6 @@ module.exports = { getEmotion, getGenderPresentation, getPoseFromPetState, + getPoseFromPetData, normalizeRow, };