diff --git a/migrations/users/full-stable.js b/migrations/users/full-stable.js new file mode 100644 index 0000000000..76b0d922f6 --- /dev/null +++ b/migrations/users/full-stable.js @@ -0,0 +1,117 @@ +import each from 'lodash/each'; +import keys from 'lodash/keys'; +import content from '../../website/common/script/content/index'; +const migrationName = 'full-stable.js'; +const authorName = 'Sabe'; // in case script author needs to know when their ... +const authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done + +/* + * Award users every extant pet and mount + */ +const connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE + +let monk = require('monk'); +let dbUsers = monk(connectionString).get('users', { castIds: false }); + +function processUsers (lastId) { + // specify a query to limit the affected users (empty for all users): + let query = { + 'profile.name': 'SabreCat', + }; + + if (lastId) { + query._id = { + $gt: lastId, + }; + } + + dbUsers.find(query, { + sort: {_id: 1}, + limit: 250, + fields: [ + ], // specify fields we are interested in to limit retrieved data (empty if we're not reading data): + }) + .then(updateUsers) + .catch((err) => { + console.log(err); + return exiting(1, `ERROR! ${ err}`); + }); +} + +let progressCount = 1000; +let count = 0; + +function updateUsers (users) { + if (!users || users.length === 0) { + console.warn('All appropriate users found and modified.'); + displayData(); + return; + } + + let userPromises = users.map(updateUser); + let lastUser = users[users.length - 1]; + + return Promise.all(userPromises) + .then(() => { + processUsers(lastUser._id); + }); +} + +function updateUser (user) { + count++; + let set = { + migration: migrationName, + }; + + each(keys(content.pets), (pet) => { + set[`items.pets.${pet}`] = 5; + }); + each(keys(content.premiumPets), (pet) => { + set[`items.pets.${pet}`] = 5; + }); + each(keys(content.questPets), (pet) => { + set[`items.pets.${pet}`] = 5; + }); + each(keys(content.specialPets), (pet) => { + set[`items.pets.${pet}`] = 5; + }); + each(keys(content.mounts), (mount) => { + set[`items.mounts.${mount}`] = true; + }); + each(keys(content.premiumMounts), (mount) => { + set[`items.mounts.${mount}`] = true; + }); + each(keys(content.questMounts), (mount) => { + set[`items.mounts.${mount}`] = true; + }); + each(keys(content.specialMounts), (mount) => { + set[`items.mounts.${mount}`] = true; + }); + + dbUsers.update({_id: user._id}, {$set: set}); + + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); +} + +function displayData () { + console.warn(`\n${ count } users processed\n`); + return exiting(0); +} + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} + +module.exports = processUsers; diff --git a/package-lock.json b/package-lock.json index d31ab211f5..e797082f4f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "habitica", - "version": "4.34.1", + "version": "4.34.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 8d696400ed..9182931d9d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "habitica", "description": "A habit tracker app which treats your goals like a Role Playing Game.", - "version": "4.34.1", + "version": "4.34.2", "main": "./website/server/index.js", "dependencies": { "@slack/client": "^3.8.1", diff --git a/website/client/assets/css/sprites.css b/website/client/assets/css/sprites.css index 906e3bc5a2..3b50e94b11 100755 --- a/website/client/assets/css/sprites.css +++ b/website/client/assets/css/sprites.css @@ -100,7 +100,34 @@ [class*="Mount_Head_"], [class*="Mount_Body_"] { - margin-top:18px; /* Sprite accommodates 105x123 box */ + margin-top: 18px; /* Sprite accommodates 105x123 box */ + left: 28px; + top: 34px; +} + +[class*="Mount_"], +[class*="Pet-"] { + transform: scale(0.333, 0.333); + -ms-transform: scale(0.333, 0.333); + -webkit-transform: scale(0.333, 0.333); +} + +[class*="_Sabretooth"], +[class*="_TRex"], +[class*="_Wolf"] { + left: 18px; + top: 25px; +} + +[class*="_JackOLantern"] { + left: 32px; +} + +[class*="_Cuttlefish"], +[class*="_Frog"], +[class*="_MagicalBee"], +[class*="_Mammoth"] { + top: 30px; } .Pet_Currency_Gem { diff --git a/website/client/assets/scss/animals.scss b/website/client/assets/scss/animals.scss index a75f6dcb17..ca2bb92043 100644 --- a/website/client/assets/scss/animals.scss +++ b/website/client/assets/scss/animals.scss @@ -7,7 +7,7 @@ left: 0; &:not([class*="FlyingPig"]) { - top: -28px !important; + top: -8px !important; } } diff --git a/website/client/components/avatar.vue b/website/client/components/avatar.vue index a4acea6cc0..e62965e78a 100644 --- a/website/client/components/avatar.vue +++ b/website/client/components/avatar.vue @@ -1,10 +1,6 @@