From 3d53781bd385ea1afca18fc4f168c13372fcd2f2 Mon Sep 17 00:00:00 2001 From: Blade Barringer Date: Sat, 10 Sep 2016 22:05:25 -0500 Subject: [PATCH] Fix content name error (#7995) * fix: correct translation strings for pet/mount names * chore: expose potion and egg key, not object in pet content api * fix: Update feed route to use potion and egg objects * refactor: Update feed route to use petInfo * Use pet/mount text method for name * correct feed route --- common/locales/en/pets.json | 4 +- common/script/content/stable.js | 12 ++-- common/script/ops/feed.js | 61 ++++++++----------- .../user/POST-user_feed_pet_food.test.js | 9 +-- test/common/ops/feed.js | 52 ++++------------ test/helpers/content.helper.js | 3 +- .../client/js/controllers/inventoryCtrl.js | 13 ++-- website/views/options/inventory/mounts.jade | 18 +++--- website/views/options/inventory/pets.jade | 30 ++++----- 9 files changed, 82 insertions(+), 120 deletions(-) diff --git a/common/locales/en/pets.json b/common/locales/en/pets.json index 8a84ca0dcc..8c3812981e 100644 --- a/common/locales/en/pets.json +++ b/common/locales/en/pets.json @@ -71,8 +71,8 @@ "earnedSteed": "By completing your tasks, you've earned a faithful steed!", "rideNow": "Ride Now", "rideLater": "Ride Later", - "petName": "<%= potion %> <%= egg %>", - "mountName": "<%= potion %> <%= mount %>", + "petName": "<%= potion(locale) %> <%= egg(locale) %>", + "mountName": "<%= potion(locale) %> <%= mount(locale) %>", "petKeyName": "Key to the Kennels", "petKeyPop": "Let your pets roam free, release them to start their own adventure, and give yourself the thrill of Beast Master once more!", "petKeyBegin": "Key to the Kennels: Experience <%= title %> Once More!", diff --git a/common/script/content/stable.js b/common/script/content/stable.js index d6d47c8e3c..cb6adae702 100644 --- a/common/script/content/stable.js +++ b/common/script/content/stable.js @@ -26,19 +26,19 @@ function constructSet (type, eggs, potions) { return { key, type, - potion, - egg, + potion: potion.key, + egg: egg.key, text, }; } petInfo[key] = getAnimalData(t('petName', { - potion: potion.text(), - egg: egg.text(), + potion: potion.text, + egg: egg.text, })); mountInfo[key] = getAnimalData(t('mountName', { - potion: potion.text(), - mount: egg.mountText(), + potion: potion.text, + mount: egg.mountText, })); pets[key] = true; diff --git a/common/script/ops/feed.js b/common/script/ops/feed.js index 637d9b3e1d..8411bf6d65 100644 --- a/common/script/ops/feed.js +++ b/common/script/ops/feed.js @@ -7,16 +7,16 @@ import { NotFound, } from '../libs/errors'; -function evolve (user, pet, petDisplayName, req) { - user.items.pets[pet] = -1; - user.items.mounts[pet] = true; +function evolve (user, pet, req) { + user.items.pets[pet.key] = -1; + user.items.mounts[pet.key] = true; - if (pet === user.items.currentPet) { + if (pet.key === user.items.currentPet) { user.items.currentPet = ''; } return i18n.t('messageEvolve', { - egg: petDisplayName, + egg: pet.text(req.language), }, req.language); } @@ -26,7 +26,9 @@ module.exports = function feed (user, req = {}) { if (!pet || !foodK) throw new BadRequest(i18n.t('missingPetFoodFeed', req.language)); - if (pet.indexOf('-') === -1) { + pet = content.petInfo[pet]; + + if (!pet) { throw new BadRequest(i18n.t('invalidPetName', req.language)); } @@ -37,53 +39,42 @@ module.exports = function feed (user, req = {}) { let userPets = user.items.pets; - if (!userPets[pet]) { + if (!userPets[pet.key]) { throw new NotFound(i18n.t('messagePetNotFound', req.language)); } - let [egg, potion] = pet.split('-'); - - let potionText = content.hatchingPotions[potion] ? content.hatchingPotions[potion].text(req.language) : potion; - let eggText = content.eggs[egg] ? content.eggs[egg].text(req.language) : egg; - - let petDisplayName = i18n.t('petName', { - potion: potionText, - egg: eggText, - }, req.language); - if (!user.items.food[food.key]) { throw new NotFound(i18n.t('messageFoodNotFound', req.language)); } - if (content.specialPets[pet]) { + if (pet.type === 'special') { throw new NotAuthorized(i18n.t('messageCannotFeedPet', req.language)); } - if (user.items.mounts[pet]) { + if (user.items.mounts[pet.key]) { throw new NotAuthorized(i18n.t('messageAlreadyMount', req.language)); } let message; if (food.key === 'Saddle') { - message = evolve(user, pet, petDisplayName, req); + message = evolve(user, pet, req); } else { - if (food.target === potion || content.hatchingPotions[potion].premium) { - userPets[pet] += 5; - message = i18n.t('messageLikesFood', { - egg: petDisplayName, - foodText: food.text(req.language), - }, req.language); + let messageParams = { + egg: pet.text(req.language), + foodText: food.text(req.language), + }; + + if (food.target === pet.potion || pet.type === 'premium') { + userPets[pet.key] += 5; + message = i18n.t('messageLikesFood', messageParams, req.language); } else { - userPets[pet] += 2; - message = i18n.t('messageDontEnjoyFood', { - egg: petDisplayName, - foodText: food.text(req.language), - }, req.language); + userPets[pet.key] += 2; + message = i18n.t('messageDontEnjoyFood', messageParams, req.language); } - if (userPets[pet] >= 50 && !user.items.mounts[pet]) { - message = evolve(user, pet, petDisplayName, req); + if (userPets[pet.key] >= 50 && !user.items.mounts[pet.key]) { + message = evolve(user, pet, req); } } @@ -91,11 +82,11 @@ module.exports = function feed (user, req = {}) { if (req.v2 === true) { return { - value: userPets[pet], + value: userPets[pet.key], }; } else { return [ - userPets[pet], + userPets[pet.key], message, ]; } diff --git a/test/api/v3/integration/user/POST-user_feed_pet_food.test.js b/test/api/v3/integration/user/POST-user_feed_pet_food.test.js index 7581c266ee..87226965d1 100644 --- a/test/api/v3/integration/user/POST-user_feed_pet_food.test.js +++ b/test/api/v3/integration/user/POST-user_feed_pet_food.test.js @@ -22,19 +22,14 @@ describe('POST /user/feed/:pet/:food', () => { }); let food = content.food.Milk; - let [egg, potion] = 'Wolf-Base'.split('-'); - let potionText = content.hatchingPotions[potion] ? content.hatchingPotions[potion].text() : potion; - let eggText = content.eggs[egg] ? content.eggs[egg].text() : egg; + let pet = content.petInfo['Wolf-Base']; let res = await user.post('/user/feed/Wolf-Base/Milk'); await user.sync(); expect(res).to.eql({ data: user.items.pets['Wolf-Base'], message: t('messageDontEnjoyFood', { - egg: t('petName', { - potion: potionText, - egg: eggText, - }), + egg: pet.text(), foodText: food.text(), }), }); diff --git a/test/common/ops/feed.js b/test/common/ops/feed.js index 0b726f5ec7..0b2f78f8d1 100644 --- a/test/common/ops/feed.js +++ b/test/common/ops/feed.js @@ -38,9 +38,9 @@ describe('shared.ops.feed', () => { } }); - it('does not allow feeding if food does not exists', (done) => { + it('does not allow feeding if food does not exist', (done) => { try { - feed(user, {params: {pet: 'valid-pet', food: 'invalid food name'}}); + feed(user, {params: {pet: 'Wolf-Red', food: 'invalid food name'}}); } catch (err) { expect(err).to.be.an.instanceof(NotFound); expect(err.message).to.equal(i18n.t('messageFoodNotFound')); @@ -50,7 +50,7 @@ describe('shared.ops.feed', () => { it('does not allow feeding if pet is not owned', (done) => { try { - feed(user, {params: {pet: 'not-owned', food: 'Meat'}}); + feed(user, {params: {pet: 'Wolf-Red', food: 'Meat'}}); } catch (err) { expect(err).to.be.an.instanceof(NotFound); expect(err.message).to.equal(i18n.t('messagePetNotFound')); @@ -100,18 +100,12 @@ describe('shared.ops.feed', () => { user.items.pets['Wolf-Base'] = 5; user.items.food.Saddle = 2; user.items.currentPet = 'Wolf-Base'; - let [egg, potion] = 'Wolf-Base'.split('-'); - - let potionText = content.hatchingPotions[potion] ? content.hatchingPotions[potion].text() : potion; - let eggText = content.eggs[egg] ? content.eggs[egg].text() : egg; + let pet = content.petInfo['Wolf-Base']; let [data, message] = feed(user, {params: {pet: 'Wolf-Base', food: 'Saddle'}}); expect(data).to.eql(user.items.pets['Wolf-Base']); expect(message).to.eql(i18n.t('messageEvolve', { - egg: i18n.t('petName', { - potion: potionText, - egg: eggText, - }), + egg: pet.text(), })); expect(user.items.food.Saddle).to.equal(1); @@ -125,17 +119,12 @@ describe('shared.ops.feed', () => { user.items.food.Meat = 2; let food = content.food.Meat; - let [egg, potion] = 'Wolf-Base'.split('-'); - let potionText = content.hatchingPotions[potion] ? content.hatchingPotions[potion].text() : potion; - let eggText = content.eggs[egg] ? content.eggs[egg].text() : egg; + let pet = content.petInfo['Wolf-Base']; let [data, message] = feed(user, {params: {pet: 'Wolf-Base', food: 'Meat'}}); expect(data).to.eql(user.items.pets['Wolf-Base']); expect(message).to.eql(i18n.t('messageLikesFood', { - egg: i18n.t('petName', { - potion: potionText, - egg: eggText, - }), + egg: pet.text(), foodText: food.text(), })); @@ -148,17 +137,12 @@ describe('shared.ops.feed', () => { user.items.food.Milk = 2; let food = content.food.Milk; - let [egg, potion] = 'Wolf-Spooky'.split('-'); - let potionText = content.hatchingPotions[potion] ? content.hatchingPotions[potion].text() : potion; - let eggText = content.eggs[egg] ? content.eggs[egg].text() : egg; + let pet = content.petInfo['Wolf-Spooky']; let [data, message] = feed(user, {params: {pet: 'Wolf-Spooky', food: 'Milk'}}); expect(data).to.eql(user.items.pets['Wolf-Spooky']); expect(message).to.eql(i18n.t('messageLikesFood', { - egg: i18n.t('petName', { - potion: potionText, - egg: eggText, - }), + egg: pet.text(), foodText: food.text(), })); @@ -171,17 +155,12 @@ describe('shared.ops.feed', () => { user.items.food.Milk = 2; let food = content.food.Milk; - let [egg, potion] = 'Wolf-Base'.split('-'); - let potionText = content.hatchingPotions[potion] ? content.hatchingPotions[potion].text() : potion; - let eggText = content.eggs[egg] ? content.eggs[egg].text() : egg; + let pet = content.petInfo['Wolf-Base']; let [data, message] = feed(user, {params: {pet: 'Wolf-Base', food: 'Milk'}}); expect(data).to.eql(user.items.pets['Wolf-Base']); expect(message).to.eql(i18n.t('messageDontEnjoyFood', { - egg: i18n.t('petName', { - potion: potionText, - egg: eggText, - }), + egg: pet.text(), foodText: food.text(), })); @@ -194,17 +173,12 @@ describe('shared.ops.feed', () => { user.items.food.Milk = 2; user.items.currentPet = 'Wolf-Base'; - let [egg, potion] = 'Wolf-Base'.split('-'); - let potionText = content.hatchingPotions[potion] ? content.hatchingPotions[potion].text() : potion; - let eggText = content.eggs[egg] ? content.eggs[egg].text() : egg; + let pet = content.petInfo['Wolf-Base']; let [data, message] = feed(user, {params: {pet: 'Wolf-Base', food: 'Milk'}}); expect(data).to.eql(user.items.pets['Wolf-Base']); expect(message).to.eql(i18n.t('messageEvolve', { - egg: i18n.t('petName', { - potion: potionText, - egg: eggText, - }), + egg: pet.text(), })); expect(user.items.food.Milk).to.equal(1); diff --git a/test/helpers/content.helper.js b/test/helpers/content.helper.js index b97606c256..3d423f93af 100644 --- a/test/helpers/content.helper.js +++ b/test/helpers/content.helper.js @@ -10,7 +10,8 @@ export function expectValidTranslationString (attribute) { let translatedString = attribute(); - expect(translatedString).to.not.be.empty; + expect(translatedString.trim()).to.not.be.empty; + expect(translatedString).to.not.contain('function func(lang)'); expect(translatedString).to.not.eql(STRING_ERROR_MSG); expect(translatedString).to.not.match(STRING_DOES_NOT_EXIST_MSG); } diff --git a/website/client/js/controllers/inventoryCtrl.js b/website/client/js/controllers/inventoryCtrl.js index c4fc0ce173..c78d00918c 100644 --- a/website/client/js/controllers/inventoryCtrl.js +++ b/website/client/js/controllers/inventoryCtrl.js @@ -180,11 +180,8 @@ habitrpg.controller("InventoryCtrl", } $scope.choosePet = function(egg, potion){ - var petDisplayName = env.t('petName', { - potion: Content.hatchingPotions[potion] ? Content.hatchingPotions[potion].text() : potion, - egg: Content.eggs[egg] ? Content.eggs[egg].text() : egg - }), - pet = egg + '-' + potion; + var pet = Content.petInfo[egg + '-' + potion]; + var petDisplayName = pet.text(); // Feeding Pet if ($scope.selectedFood) { @@ -195,14 +192,14 @@ habitrpg.controller("InventoryCtrl", } else if (!$window.confirm(window.env.t('feedPet', {name: petDisplayName, article: food.article, text: food.text()}))) { return; } - User.feed({params:{pet: pet, food: food.key}}); + User.feed({params:{pet: pet.key, food: food.key}}); $scope.selectedFood = null; _updateDropAnimalCount(user.items); if ($rootScope.countExists(user.items.mounts) > startingMounts && !user.preferences.suppressModals.raisePet) { $scope.raisedPet = { displayName: petDisplayName, - spriteName: pet, + spriteName: pet.key, egg: egg, potion: potion } @@ -221,7 +218,7 @@ habitrpg.controller("InventoryCtrl", // Selecting Pet } else { - User.equip({params:{type: 'pet', key: pet}}); + User.equip({params:{type: 'pet', key: pet.key}}); } } diff --git a/website/views/options/inventory/mounts.jade b/website/views/options/inventory/mounts.jade index e08d25c642..3c77e8a46c 100644 --- a/website/views/options/inventory/mounts.jade +++ b/website/views/options/inventory/mounts.jade @@ -5,10 +5,11 @@ mixin mountList(eggSource, potionSource) li.customize-menu menu each potion in potionSource - - mount = egg.key+"-"+potion.key - div(popover-trigger='mouseenter', popover=env.t('mountName', {potion: potion.text(env.language.code), mount: egg.mountText(env.language.code)}), popover-placement='bottom') - button(class="pet-button Mount_Icon_#{mount}", ng-show='user.items.mounts["#{mount}"]', ng-class='{active: user.items.currentMount == "#{mount}"}', ng-click='chooseMount("#{egg.key}", "#{potion.key}")') - button(class="pet-button mount-not-owned", ng-if='!user.items.mounts["#{mount}"] && (#{potion.canBuy()} || user.items.hatchingPotions["#{potion.key}"] || user.items.pets["#{mount}"])') + - var mountKey = egg.key+"-"+potion.key + - var mount = env.Content.mountInfo[mountKey] + div(popover-trigger='mouseenter', popover=mount.text(), popover-placement='bottom') + button(class="pet-button Mount_Icon_#{mountKey}", ng-show='user.items.mounts["#{mountKey}"]', ng-class='{active: user.items.currentMount == "#{mountKey}"}', ng-click='chooseMount("#{egg.key}", "#{potion.key}")') + button(class="pet-button mount-not-owned", ng-if='!user.items.mounts["#{mountKey}"] && (#{potion.canBuy()} || user.items.hatchingPotions["#{potion.key}"] || user.items.pets["#{mountKey}"])') .PixelPaw -} @@ -32,10 +33,11 @@ mixin mountList(eggSource, potionSource) li.customize-menu menu each egg in env.Content.dropEggs - - mount = egg.key+"-"+potion.key - div(popover-trigger='mouseenter', popover=env.t('mountName', {potion: potion.text(env.language.code), mount: egg.mountText(env.language.code)}), popover-placement='bottom') - button(class="pet-button Mount_Icon_#{mount}", ng-show='user.items.mounts["#{mount}"]', ng-class='{active: user.items.currentMount == "#{mount}"}', ng-click='chooseMount("#{egg.key}", "#{potion.key}")') - button(class="pet-button mount-not-owned", ng-if='!user.items.mounts["#{mount}"] && (#{potion.canBuy()} || user.items.hatchingPotions["#{potion.key}"] || user.items.pets["#{mount}"])') + - var mountKey = egg.key + "-" + potion.key + - var mount = env.Content.mountInfo[mountKey] + div(popover-trigger='mouseenter', popover=mount.text(), popover-placement='bottom') + button(class="pet-button Mount_Icon_#{mountKey}", ng-show='user.items.mounts["#{mountKey}"]', ng-class='{active: user.items.currentMount == "#{mountKey}"}', ng-click='chooseMount("#{egg.key}", "#{potion.key}")') + button(class="pet-button mount-not-owned", ng-if='!user.items.mounts["#{mountKey}"] && (#{potion.canBuy()} || user.items.hatchingPotions["#{potion.key}"] || user.items.pets["#{mountKey}"])') .PixelPaw .row: .col-md-12 h4=env.t('questMounts') diff --git a/website/views/options/inventory/pets.jade b/website/views/options/inventory/pets.jade index d299d54120..7716fb529b 100644 --- a/website/views/options/inventory/pets.jade +++ b/website/views/options/inventory/pets.jade @@ -4,14 +4,15 @@ mixin petList(eggSource, potionSource) li.customize-menu menu each potion in potionSource - - pet = egg.key+"-"+potion.key - div(popover-trigger='mouseenter', popover=env.t('petName', {potion: potion.text(env.language.code), egg: egg.text(env.language.code)}), popover-placement='bottom') - button(class="pet-button Pet-#{pet}", ng-if='user.items.pets["#{pet}"]>0', ng-class='{active: user.items.currentPet == "#{pet}", selectableInventory: #{!egg.noMount} && selectedFood && !user.items.mounts["#{pet}"]}', ng-click='choosePet("#{egg.key}", "#{potion.key}")') - .progress(ng-show='!user.items.mounts["#{pet}"]') - .progress-bar.progress-bar-success(ng-style='{width: user.items.pets["#{pet}"]/.5 + "%"}') - button(class="pet-button pet-not-owned", ng-if='!user.items.pets["#{pet}"] && (#{potion.canBuy()} || user.items.hatchingPotions["#{potion.key}"])') + - var petKey = egg.key+"-"+potion.key + - var pet = env.Content.petInfo[petKey] + div(popover-trigger='mouseenter', popover=pet.text(), popover-placement='bottom') + button(class="pet-button Pet-#{petKey}", ng-if='user.items.pets["#{petKey}"]>0', ng-class='{active: user.items.currentPet == "#{petKey}", selectableInventory: #{!egg.noMount} && selectedFood && !user.items.mounts["#{petKey}"]}', ng-click='choosePet("#{egg.key}", "#{potion.key}")') + .progress(ng-show='!user.items.mounts["#{petKey}"]') + .progress-bar.progress-bar-success(ng-style='{width: user.items.pets["#{petKey}"]/.5 + "%"}') + button(class="pet-button pet-not-owned", ng-if='!user.items.pets["#{petKey}"] && (#{potion.canBuy()} || user.items.hatchingPotions["#{potion.key}"])') .PixelPaw - button(class="pet-evolved pet-button Pet-#{pet}", ng-if='user.items.pets["#{pet}"]<0') + button(class="pet-evolved pet-button Pet-#{petKey}", ng-if='user.items.pets["#{petKey}"]<0') .container-fluid .stable.row: .col-xs-12 @@ -32,14 +33,15 @@ mixin petList(eggSource, potionSource) li.customize-menu(ng-if="::shouldShowPremiumPetRow('#{potion.key}')") menu each egg in env.Content.dropEggs - - pet = egg.key+"-"+potion.key - div(popover-trigger='mouseenter', popover=env.t('petName', {potion: potion.text(env.language.code), egg: egg.text(env.language.code)}), popover-placement='bottom') - button(class="pet-button Pet-#{pet}", ng-if='user.items.pets["#{pet}"]>0', ng-class='{active: user.items.currentPet == "#{pet}", selectableInventory: #{!egg.noMount} && selectedFood && !user.items.mounts["#{pet}"]}', ng-click='choosePet("#{egg.key}", "#{potion.key}")') - .progress(ng-show='!user.items.mounts["#{pet}"]') - .progress-bar.progress-bar-success(ng-style='{width: user.items.pets["#{pet}"]/.5 + "%"}') - button(class="pet-button pet-not-owned", ng-if='!user.items.pets["#{pet}"] && (#{potion.canBuy()} || user.items.hatchingPotions["#{potion.key}"])') + - var petKey = egg.key+"-"+potion.key + - var pet = env.Content.petInfo[petKey] + div(popover-trigger='mouseenter', popover=pet.text(), popover-placement='bottom') + button(class="pet-button Pet-#{petKey}", ng-if='user.items.pets["#{petKey}"]>0', ng-class='{active: user.items.currentPet == "#{petKey}", selectableInventory: #{!egg.noMount} && selectedFood && !user.items.mounts["#{petKey}"]}', ng-click='choosePet("#{egg.key}", "#{potion.key}")') + .progress(ng-show='!user.items.mounts["#{petKey}"]') + .progress-bar.progress-bar-success(ng-style='{width: user.items.pets["#{petKey}"]/.5 + "%"}') + button(class="pet-button pet-not-owned", ng-if='!user.items.pets["#{petKey}"] && (#{potion.canBuy()} || user.items.hatchingPotions["#{potion.key}"])') .PixelPaw - button(class="pet-evolved pet-button Pet-#{pet}", ng-if='user.items.pets["#{pet}"]<0') + button(class="pet-evolved pet-button Pet-#{petKey}", ng-if='user.items.pets["#{petKey}"]<0') .row: .col-md-12 h4=env.t('questPets') +petList(env.Content.questEggs,env.Content.dropHatchingPotions)