Compare commits

..

37 Commits

Author SHA1 Message Date
Sabe Jones 1035af0d25 4.135.1 2020-03-02 16:20:56 -06:00
Sabe Jones 80b302c997 chore(news): Bailey 2020-03-02 16:20:48 -06:00
Sabe Jones 76039020f5 4.135.0 2020-02-28 15:27:58 -06:00
Sabe Jones cbcfb21deb chore(sprites): compile 2020-02-28 15:27:22 -06:00
Sabe Jones f47ec3d85f feat(content): mystery set March 2020 2020-02-28 15:27:14 -06:00
Sabe Jones aee08ba0f9 fix(bulk-email): wait 5s per 250 messages for server queue 2020-02-28 13:35:27 +00:00
Sabe Jones e1f9cac37a fix(gdpr): forbidden domain 2020-02-28 13:30:41 +00:00
Sabe Jones c9bb96d2be fix(gdpr): unique key fix 2020-02-28 13:30:15 +00:00
Sabe Jones 1bb337d235 4.134.4 2020-02-27 15:00:52 -06:00
Sabe Jones 07d6969764 Merge branch 'develop' into release 2020-02-27 15:00:46 -06:00
Sabe Jones 5807db9053 chore(news): Last Chance Bailey 2020-02-27 15:00:33 -06:00
Matteo Pagliazzi a5a91a3a9c 4.134.3 2020-02-27 14:38:26 +01:00
Matteo Pagliazzi 3650426edc fix(task): hotfix for when task.attribute is sent as null 2020-02-27 14:25:26 +01:00
Alys 7579bec587 allow another guild to use banned words in appropriate contexts
This commit also puts the list of guilds into alphabetical order.
2020-02-26 07:45:31 +10:00
Alys c1e7fed4d4 move a word from slurs to swears as discussed with beffymaroo and mods 2020-02-26 07:44:36 +10:00
agentx999 bad148148c Enchanted Armoire immediately updates XP stat in header (fixes #11827) (#11884)
* sync user if Armoire gives XP

* user can level up from Armoire

* remove XP amount from Armoire XP notification
2020-02-24 22:19:48 +01:00
Matteo Pagliazzi 0280513a00 improvements to apidocs comments (#11832)
* make corrections and improvements to apidocs (no code changes)

* make further minor tweaks to apidocs that were previously changed

* make one extra small change for consistency

* fix lines that are too long

Each line was fixed by one of these:
- changing the wording
- breaking into separate lines
- adding eslint-disable-line max-len (necessary for `@api ` lines because
a line break there causes the first part of the text to not be displayed
on the apidocs website)

* apply eslint-disable max-len around block comments that need to have a long line

The `@api ` lines can't have a line break in them because it would
cause the first part of the text to not be displayed on the apidocs
website.

Using `// eslint-disable-line max-len` at the end of an `@api `
line doesn't work, possibly because it's nesting a comment inside
a multi-line comment.

The only way I've found to ignore the `max-len` rule is to put
disable and enable comments around the whole comment block.
2020-02-24 21:22:29 +01:00
Sabe Jones e502588abc Improve G1G1 process (#11792)
* WIP(g1g1): notif

* WIP(g1g1): notif cont'd

* WIP(gifting): partial modal implementation

* feat(gifting): select giftee modal

* fix(gifting): notification order, modal dismiss

* fix(modals): correct some repops

* fix(gifting): style updates

* fix(modals): new dismiss logic

* fix(modals): new dismiss no go??

* refactor(close): catch up with dismiss functionality

* refactor(g1g1): optimizations
2020-02-24 16:54:56 +01:00
Matteo Pagliazzi 5718d8396d build(deps): bump svg-inline-loader in /website/client (#11891)
Bumps [svg-inline-loader](https://github.com/sairion/svg-inline-loader) from 0.8.0 to 0.8.2.
- [Release notes](https://github.com/sairion/svg-inline-loader/releases)
- [Changelog](https://github.com/webpack-contrib/svg-inline-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sairion/svg-inline-loader/compare/v0.8.0...v0.8.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-24 14:29:55 +01:00
dependabot-preview[bot] b59a63ecbe build(deps): bump bootstrap-vue from 2.4.2 to 2.5.0 in /website/client (#11893)
Bumps [bootstrap-vue](https://github.com/bootstrap-vue/bootstrap-vue) from 2.4.2 to 2.5.0.
- [Release notes](https://github.com/bootstrap-vue/bootstrap-vue/releases)
- [Changelog](https://github.com/bootstrap-vue/bootstrap-vue/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/bootstrap-vue/bootstrap-vue/compare/v2.4.2...v2.5.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-24 14:29:39 +01:00
dependabot-preview[bot] f0465aab5e build(deps): bump inspectpack from 4.3.1 to 4.4.0 in /website/client (#11892)
Bumps [inspectpack](https://github.com/FormidableLabs/inspectpack) from 4.3.1 to 4.4.0.
- [Release notes](https://github.com/FormidableLabs/inspectpack/releases)
- [Changelog](https://github.com/FormidableLabs/inspectpack/blob/master/HISTORY.md)
- [Commits](https://github.com/FormidableLabs/inspectpack/compare/v4.3.1...v4.4.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-24 14:29:29 +01:00
dependabot-preview[bot] 39ee78127c build(deps): bump eslint-plugin-vue in /website/client (#11894)
Bumps [eslint-plugin-vue](https://github.com/vuejs/eslint-plugin-vue) from 6.2.0 to 6.2.1.
- [Release notes](https://github.com/vuejs/eslint-plugin-vue/releases)
- [Commits](https://github.com/vuejs/eslint-plugin-vue/compare/v6.2.0...v6.2.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-24 14:29:04 +01:00
Matteo Pagliazzi 4658025f3f build(deps-dev): bump sinon-chai from 3.4.0 to 3.5.0 (#11895)
Bumps [sinon-chai](https://github.com/domenic/sinon-chai) from 3.4.0 to 3.5.0.
- [Release notes](https://github.com/domenic/sinon-chai/releases)
- [Changelog](https://github.com/domenic/sinon-chai/blob/master/CHANGELOG.md)
- [Commits](https://github.com/domenic/sinon-chai/compare/3.4.0...3.5.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-24 14:28:53 +01:00
dependabot-preview[bot] 46417b4124 build(deps): bump superagent from 5.2.1 to 5.2.2 (#11896)
Bumps [superagent](https://github.com/visionmedia/superagent) from 5.2.1 to 5.2.2.
- [Release notes](https://github.com/visionmedia/superagent/releases)
- [Changelog](https://github.com/visionmedia/superagent/blob/master/HISTORY.md)
- [Commits](https://github.com/visionmedia/superagent/compare/v5.2.1...v5.2.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-24 14:28:37 +01:00
dependabot-preview[bot] 706a7b441a build(deps): bump aws-sdk from 2.619.0 to 2.624.0 (#11897)
Bumps [aws-sdk](https://github.com/aws/aws-sdk-js) from 2.619.0 to 2.624.0.
- [Release notes](https://github.com/aws/aws-sdk-js/releases)
- [Changelog](https://github.com/aws/aws-sdk-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-js/compare/v2.619.0...v2.624.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-24 14:28:26 +01:00
dependabot-preview[bot] a8baa8fcfe build(deps): bump mongoose from 5.8.11 to 5.9.2 (#11901)
Bumps [mongoose](https://github.com/Automattic/mongoose) from 5.8.11 to 5.9.2.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/History.md)
- [Commits](https://github.com/Automattic/mongoose/compare/5.8.11...5.9.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-24 14:28:14 +01:00
dependabot-preview[bot] 368cf91e32 build(deps-dev): bump sinon-chai from 3.4.0 to 3.5.0
Bumps [sinon-chai](https://github.com/domenic/sinon-chai) from 3.4.0 to 3.5.0.
- [Release notes](https://github.com/domenic/sinon-chai/releases)
- [Changelog](https://github.com/domenic/sinon-chai/blob/master/CHANGELOG.md)
- [Commits](https://github.com/domenic/sinon-chai/compare/3.4.0...3.5.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-24 08:12:17 +00:00
dependabot-preview[bot] 23fc969432 build(deps): bump svg-inline-loader in /website/client
Bumps [svg-inline-loader](https://github.com/sairion/svg-inline-loader) from 0.8.0 to 0.8.2.
- [Release notes](https://github.com/sairion/svg-inline-loader/releases)
- [Changelog](https://github.com/webpack-contrib/svg-inline-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sairion/svg-inline-loader/compare/v0.8.0...v0.8.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-24 08:08:33 +00:00
Sabe Jones 5db606dcfd fix(event): end Valentine's NPCs 2020-02-20 14:26:25 -06:00
Sabe Jones a7fd8f7f52 4.134.2 2020-02-20 13:26:49 -06:00
Phillip Thelen 0b57c0a22d Unify behaviour for shops (#11829)
* Change price for basilist and dustbunnies

* return correct unlockCondition for moon quests

* Fix basilist not being buyable
2020-02-20 13:24:43 -06:00
Alys 0891908cba Merge remote-tracking branch 'upstream/develop' into apidocs-comment-fixes 2020-02-20 09:47:44 +10:00
Alys 15976e906a apply eslint-disable max-len around block comments that need to have a long line
The `@api ` lines can't have a line break in them because it would
cause the first part of the text to not be displayed on the apidocs
website.

Using `// eslint-disable-line max-len` at the end of an `@api `
line doesn't work, possibly because it's nesting a comment inside
a multi-line comment.

The only way I've found to ignore the `max-len` rule is to put
disable and enable comments around the whole comment block.
2020-02-08 16:06:00 +10:00
Alys ac52da5be2 fix lines that are too long
Each line was fixed by one of these:
- changing the wording
- breaking into separate lines
- adding eslint-disable-line max-len (necessary for `@api ` lines because
a line break there causes the first part of the text to not be displayed
on the apidocs website)
2020-02-08 14:55:21 +10:00
Alys 1b39338eec make one extra small change for consistency 2020-02-08 14:30:48 +10:00
Alys 6fe87a8140 make further minor tweaks to apidocs that were previously changed 2020-02-08 14:26:01 +10:00
Alys c5d0ff63a5 make corrections and improvements to apidocs (no code changes) 2020-02-08 14:12:20 +10:00
88 changed files with 6915 additions and 6774 deletions
+5 -2
View File
@@ -8,13 +8,16 @@ const BASE_URL = nconf.get('BASE_URL');
const EMAIL_SLUG = 'mandrill-email-slug'; // Set email template to send
const MIGRATION_NAME = 'bulk-email';
const progressCount = 1000;
const progressCount = 250;
let count = 0;
async function updateUser (user) {
count += 1;
if (count % progressCount === 0) console.warn(`${count} ${user._id}`);
if (count % progressCount === 0) {
console.warn(`${count} ${user._id}`);
await new Promise(resolve => setTimeout(resolve, 5000));
}
await sendTxn(
user,
+47 -17
View File
@@ -1,6 +1,6 @@
{
"name": "habitica",
"version": "4.134.1",
"version": "4.135.1",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -1829,9 +1829,9 @@
"integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
},
"aws-sdk": {
"version": "2.619.0",
"resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.619.0.tgz",
"integrity": "sha512-qujQf27p3mrGZGCL+C+vXCEB08AMm6gS1572fgHrVLBXfy6SjhV4dzEYtt+ZptQm+8z0zuHsDqghJuBCcdpxqQ==",
"version": "2.624.0",
"resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.624.0.tgz",
"integrity": "sha512-6MhbdND7A5lEBiNSZ/HLwhKgrysmwTy6C47H7vfuVnY25hDkIND3C0PLqeRyskUqxv0RqsiAB4kqiMtpE08IGA==",
"requires": {
"buffer": "4.9.1",
"events": "1.1.1",
@@ -3942,6 +3942,11 @@
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
},
"denque": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz",
"integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ=="
},
"depd": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
@@ -9112,6 +9117,7 @@
"version": "3.4.1",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.4.1.tgz",
"integrity": "sha512-juqt5/Z42J4DcE7tG7UdVaTKmUC6zinF4yioPfpeOSNBieWSK6qCY+0tfGQcHLKrauWPDdMZVROHJOa8q2pWsA==",
"dev": true,
"requires": {
"bson": "^1.1.1",
"require_optional": "^1.0.1",
@@ -9120,13 +9126,13 @@
}
},
"mongoose": {
"version": "5.8.11",
"resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.8.11.tgz",
"integrity": "sha512-Yz0leNEJsAtNtMTxTDEadacLWt58gaVeBVL3c1Z3vaBoc159aJqlf+T8jaL9mAdBxKndF5YWhh6Q719xac7cjA==",
"version": "5.9.2",
"resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.9.2.tgz",
"integrity": "sha512-Sa1qfqBvUfAgsrXpZjbBoIx8PEDUJSKF5Ous8gnBFI7TPiueSgJjg6GRA7A0teU8AB/vd0h8rl1rD5RQNfWhIw==",
"requires": {
"bson": "~1.1.1",
"kareem": "2.3.1",
"mongodb": "3.4.1",
"mongodb": "3.5.3",
"mongoose-legacy-pluralize": "1.0.2",
"mpath": "0.6.0",
"mquery": "3.2.2",
@@ -9135,6 +9141,30 @@
"safe-buffer": "5.1.2",
"sift": "7.0.1",
"sliced": "1.0.1"
},
"dependencies": {
"bl": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/bl/-/bl-2.2.0.tgz",
"integrity": "sha512-wbgvOpqopSr7uq6fJrLH8EsvYMJf9gzfo2jCsL2eTy75qXPukA4pCgHamOQkZtY5vmfVtjB+P3LNlMHW5CEZXA==",
"requires": {
"readable-stream": "^2.3.5",
"safe-buffer": "^5.1.1"
}
},
"mongodb": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.5.3.tgz",
"integrity": "sha512-II7P7A3XUdPiXRgcN96qIoRa1oesM6qLNZkzfPluNZjVkgQk3jnQwOT6/uDk4USRDTTLjNFw2vwfmbRGTA7msg==",
"requires": {
"bl": "^2.2.0",
"bson": "^1.1.1",
"denque": "^1.4.1",
"require_optional": "^1.0.1",
"safe-buffer": "^5.1.2",
"saslprep": "^1.0.0"
}
}
}
},
"mongoose-legacy-pluralize": {
@@ -11540,9 +11570,9 @@
}
},
"sinon-chai": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.4.0.tgz",
"integrity": "sha512-BpVxsjEkGi6XPbDXrgWUe7Cb1ZzIfxKUbu/MmH5RoUnS7AXpKo3aIYIyQUg0FMvlUL05aPt7VZuAdaeQhEnWxg==",
"version": "3.5.0",
"resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.5.0.tgz",
"integrity": "sha512-IifbusYiQBpUxxFJkR3wTU68xzBN0+bxCScEaKMjBvAQERg6FnTTc1F17rseLb1tjmkJ23730AXpFI0c47FgAg==",
"dev": true
},
"sinon-stub-promise": {
@@ -12184,9 +12214,9 @@
"integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls="
},
"superagent": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/superagent/-/superagent-5.2.1.tgz",
"integrity": "sha512-46b4Lkwnlz7Ebdv2FBbfuqb3kVkG1jV/SK3EW6NnwL9a3T4h5hHtegNEQfbXvTFbDoUZXId4W3dMgap2f6ic1g==",
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/superagent/-/superagent-5.2.2.tgz",
"integrity": "sha512-pMWBUnIllK4ZTw7p/UaobiQPwAO5w/1NRRTDpV0FTVNmECztsxKspj3ZWEordVEaqpZtmOQJJna4yTLyC/q7PQ==",
"requires": {
"component-emitter": "^1.3.0",
"cookiejar": "^2.1.2",
@@ -12217,9 +12247,9 @@
"integrity": "sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA=="
},
"readable-stream": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
"integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
"integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
"requires": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
+5 -5
View File
@@ -1,7 +1,7 @@
{
"name": "habitica",
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
"version": "4.134.1",
"version": "4.135.1",
"main": "./website/server/index.js",
"dependencies": {
"@babel/core": "^7.8.4",
@@ -14,7 +14,7 @@
"amplitude": "^3.5.0",
"apidoc": "^0.17.5",
"apn": "^2.2.0",
"aws-sdk": "^2.619.0",
"aws-sdk": "^2.624.0",
"bcrypt": "^3.0.8",
"body-parser": "^1.18.3",
"compression": "^1.7.4",
@@ -46,7 +46,7 @@
"method-override": "^3.0.0",
"moment": "^2.24.0",
"moment-recur": "^1.0.7",
"mongoose": "^5.8.11",
"mongoose": "^5.9.2",
"morgan": "^1.7.0",
"nconf": "^0.10.0",
"node-gcm": "^1.0.2",
@@ -63,7 +63,7 @@
"rimraf": "^3.0.2",
"short-uuid": "^3.0.0",
"stripe": "^7.15.0",
"superagent": "^5.2.1",
"superagent": "^5.2.2",
"universal-analytics": "^0.4.17",
"useragent": "^2.1.9",
"uuid": "^3.4.0",
@@ -113,7 +113,7 @@
"monk": "^7.1.2",
"require-again": "^2.0.0",
"sinon": "^7.2.4",
"sinon-chai": "^3.4.0",
"sinon-chai": "^3.5.0",
"sinon-stub-promise": "^4.0.0"
},
"optionalDependencies": {}
+2 -1
View File
@@ -34,11 +34,12 @@ async function deleteAmplitudeData (userId, email) {
}
async function deleteHabiticaData (user, email) {
const truncatedEmail = email.slice(0, email.indexOf('@'));
await User.update(
{ _id: user._id },
{
$set: {
'auth.local.email': email,
'auth.local.email': user.auth.local.email ? email : `${truncatedEmail}@example.com`,
'auth.local.hashed_password': '$2a$10$QDnNh1j1yMPnTXDEOV38xOePEWFd4X8DSYwAM8XTmqmacG5X0DKjW',
'auth.local.passwordHashMethod': 'bcrypt',
},
+19 -42
View File
@@ -7814,9 +7814,9 @@
"integrity": "sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA=="
},
"bootstrap-vue": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-2.4.2.tgz",
"integrity": "sha512-gtf0QwbtVyNrnXhL3eyrSrcW0/CVilEkOFddYaVAsJCIFMhUjurmzryw+Dh+fOzJmmKRqRxhkLUIGqlkwAcsbg==",
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-2.5.0.tgz",
"integrity": "sha512-LixZePxJqIkwsha2WAjAu7ZDH+oJ+JLxPGsl1SIbWebcEYZ+QtGx4JM2nR287t/0uWYGO+/oJ0KlaSO662VtLA==",
"requires": {
"@nuxt/opencollective": "^0.3.0",
"bootstrap": ">=4.4.1 <5.0.0",
@@ -10556,9 +10556,9 @@
}
},
"eslint-plugin-vue": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-6.2.0.tgz",
"integrity": "sha512-6AnZKycVWbwQtL/RyX77Rytm9r16bfYsd5oy65eoSkNFzWQ5qAisdmqUG08v1InTmAh6mbR24X1HMEvoI24wGQ==",
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-6.2.1.tgz",
"integrity": "sha512-MiIDOotoWseIfLIfGeDzF6sDvHkVvGd2JgkvjyHtN3q4RoxdAXrAMuI3SXTOKatljgacKwpNAYShmcKZa4yZzw==",
"requires": {
"natural-compare": "^1.4.0",
"semver": "^5.6.0",
@@ -11253,9 +11253,9 @@
"integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
},
"fp-ts": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.4.2.tgz",
"integrity": "sha512-/6dNmbu2CRhwR+/OpjLYT3OAlIlyrnY1qjbGDeyYkisTqQfbIdWL1P4sn28yKhcBLcfIvjo9614sfo0EKscOMA=="
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.5.1.tgz",
"integrity": "sha512-IjePHUJwegS9h7+cRCywoL/Nfha3UnMd3VHVg4gycv69nAQPOJ3b/XnjtF5ggTBF4gjLZcNaHjZEYOsRcDeGaA=="
},
"fragment-cache": {
"version": "0.2.1",
@@ -12819,9 +12819,9 @@
}
},
"inspectpack": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/inspectpack/-/inspectpack-4.3.1.tgz",
"integrity": "sha512-EF8MsrIxEmjG6uuo3bKIAzAaRDp1vq+gLG9oZ+D50kaQJnQOwwJp2MPvBk6GslUkIO64u524LwbzRv0AYd0qBQ==",
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/inspectpack/-/inspectpack-4.4.0.tgz",
"integrity": "sha512-V9vjuP5OqAk3jnCZ0M9TIhZlRNdd9v1fggwAHHOTYvxqFRkAtEbjj1dII6kpj6tN8+yHKBL5u9gf9Lp7GGOLHw==",
"requires": {
"chalk": "^3.0.0",
"fp-ts": "^2.3.1",
@@ -13126,9 +13126,9 @@
"integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA=="
},
"io-ts": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/io-ts/-/io-ts-2.0.6.tgz",
"integrity": "sha512-WNfGzm4csMVwL4hX6QlpQWu65SV6GmOUtDo259GKlLYH1cC5bpOENgYHqQIRJ9uR3FuU1RQKDke5STwHZAn3KA=="
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/io-ts/-/io-ts-2.1.1.tgz",
"integrity": "sha512-6mDCiTc/0uNtC8M1u/kcNiw5JUTlREFCGV7pjcbrQrUDguLkOpuzb4wbJcU78G74QvkhQdvT3F3dAupycXN95g=="
},
"io-ts-reporters": {
"version": "1.0.0",
@@ -19049,36 +19049,13 @@
}
},
"svg-inline-loader": {
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/svg-inline-loader/-/svg-inline-loader-0.8.0.tgz",
"integrity": "sha512-rynplY2eXFrdNomL1FvyTFQlP+dx0WqbzHglmNtA9M4IHRC3no2aPAl3ny9lUpJzFzFMZfWRK5YIclNU+FRePA==",
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/svg-inline-loader/-/svg-inline-loader-0.8.2.tgz",
"integrity": "sha512-kbrcEh5n5JkypaSC152eGfGcnT4lkR0eSfvefaUJkLqgGjRQJyKDvvEE/CCv5aTSdfXuc+N98w16iAojhShI3g==",
"requires": {
"loader-utils": "^0.2.11",
"loader-utils": "^1.1.0",
"object-assign": "^4.0.1",
"simple-html-tokenizer": "^0.1.1"
},
"dependencies": {
"big.js": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
"integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q=="
},
"json5": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
"integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE="
},
"loader-utils": {
"version": "0.2.17",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz",
"integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=",
"requires": {
"big.js": "^3.1.3",
"emojis-list": "^2.0.0",
"json5": "^0.5.0",
"object-assign": "^4.0.1"
}
}
}
},
"svg-tags": {
+4 -4
View File
@@ -29,16 +29,16 @@
"axios-progress-bar": "^1.2.0",
"babel-eslint": "^10.0.1",
"bootstrap": "^4.4.1",
"bootstrap-vue": "^2.4.2",
"bootstrap-vue": "^2.5.0",
"chai": "^4.1.2",
"core-js": "^3.6.4",
"eslint": "^6.8.0",
"eslint-config-habitrpg": "^6.2.0",
"eslint-plugin-mocha": "^5.3.0",
"eslint-plugin-vue": "^6.2.0",
"eslint-plugin-vue": "^6.2.1",
"habitica-markdown": "^1.3.2",
"hellojs": "^1.18.4",
"inspectpack": "^4.3.1",
"inspectpack": "^4.4.0",
"intro.js": "^2.9.3",
"jquery": "^3.4.1",
"lodash": "^4.17.15",
@@ -47,7 +47,7 @@
"sass": "^1.25.0",
"sass-loader": "^8.0.2",
"smartbanner.js": "^1.15.0",
"svg-inline-loader": "^0.8.0",
"svg-inline-loader": "^0.8.2",
"svg-url-loader": "^3.0.3",
"svgo": "^1.3.2",
"svgo-loader": "^2.2.1",
@@ -10,7 +10,7 @@
width: 423px;
height: 147px;
}
.promo_mystery_022020 {
.promo_mystery_202003 {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -668px -148px;
width: 282px;
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,420 +1,444 @@
.Pet-Wolf-IcySnow {
.Pet-Wolf-Glass {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -82px 0px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Peppermint {
.Pet-Wolf-Glow {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -164px -400px;
background-position: -492px -400px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Rainbow {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: 0px -300px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Red {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -164px 0px;
width: 81px;
height: 99px;
}
.Pet-Wolf-RoseQuartz {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: 0px -100px;
width: 81px;
height: 99px;
}
.Pet-Wolf-RoyalPurple {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -82px -100px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Ruby {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -164px -100px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Shade {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -246px 0px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Shadow {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -246px -100px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Shimmer {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: 0px -200px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Silver {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -82px -200px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Skeleton {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -164px -200px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Spooky {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -246px -200px;
width: 81px;
height: 99px;
}
.Pet-Wolf-StarryNight {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -328px 0px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Sunshine {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -328px -100px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Thunderstorm {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -328px -200px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Veggie {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: 0px 0px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Veteran {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -82px -300px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Watery {
.Pet-Wolf-Golden {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -164px -300px;
width: 81px;
height: 99px;
}
.Pet-Wolf-White {
.Pet-Wolf-Holly {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -164px 0px;
width: 81px;
height: 99px;
}
.Pet-Wolf-IcySnow {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: 0px -100px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Peppermint {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -82px -100px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Rainbow {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -164px -100px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Red {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -246px 0px;
width: 81px;
height: 99px;
}
.Pet-Wolf-RoseQuartz {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -246px -100px;
width: 81px;
height: 99px;
}
.Pet-Wolf-RoyalPurple {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: 0px -200px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Ruby {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -82px -200px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Shade {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -164px -200px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Shadow {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -246px -200px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Shimmer {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -328px 0px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Silver {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -328px -100px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Skeleton {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -328px -200px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Spooky {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: 0px -300px;
width: 81px;
height: 99px;
}
.Pet-Wolf-StarryNight {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -82px -300px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Sunshine {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: 0px 0px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Thunderstorm {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -246px -300px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Zombie {
.Pet-Wolf-Veggie {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -328px -300px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Base {
.Pet-Wolf-Veteran {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -410px 0px;
width: 81px;
height: 99px;
}
.Pet-Yarn-CottonCandyBlue {
.Pet-Wolf-Watery {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -410px -100px;
width: 81px;
height: 99px;
}
.Pet-Yarn-CottonCandyPink {
.Pet-Wolf-White {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -410px -200px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Desert {
.Pet-Wolf-Zombie {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -410px -300px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Golden {
.Pet-Yarn-Base {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -492px 0px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Red {
.Pet-Yarn-CottonCandyBlue {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -492px -100px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Shade {
.Pet-Yarn-CottonCandyPink {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -492px -200px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Skeleton {
.Pet-Yarn-Desert {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -492px -300px;
width: 81px;
height: 99px;
}
.Pet-Yarn-White {
.Pet-Yarn-Golden {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: 0px -400px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Zombie {
.Pet-Yarn-Red {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -82px -400px;
width: 81px;
height: 99px;
}
.Pet_HatchingPotion_Amber {
.Pet-Yarn-Shade {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -164px -400px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Skeleton {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -246px -400px;
width: 68px;
height: 68px;
width: 81px;
height: 99px;
}
.Pet_HatchingPotion_Aquatic {
.Pet-Yarn-White {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -315px -400px;
width: 68px;
height: 68px;
background-position: -328px -400px;
width: 81px;
height: 99px;
}
.Pet_HatchingPotion_Aurora {
.Pet-Yarn-Zombie {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -384px -400px;
width: 68px;
height: 68px;
background-position: -410px -400px;
width: 81px;
height: 99px;
}
.Pet_HatchingPotion_Base {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -453px -400px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Bronze {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: 0px -638px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Celestial {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -69px -500px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_CottonCandyBlue {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -138px -500px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_CottonCandyPink {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -207px -500px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Cupid {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -276px -500px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Desert {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -345px -500px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Ember {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -414px -500px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Fairy {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -483px -500px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Floral {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -574px 0px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Frost {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -574px -69px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Ghost {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -574px -138px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Glass {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -574px -207px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Glow {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -574px -276px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Golden {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -574px -345px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Holly {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -574px -414px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_IcySnow {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -574px -483px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Peppermint {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: 0px -569px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Purple {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -69px -569px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Rainbow {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -138px -569px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Red {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -207px -569px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_RoseQuartz {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -276px -569px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_RoyalPurple {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -345px -569px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Ruby {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -414px -569px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Shade {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -483px -569px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Shadow {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -552px -569px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Shimmer {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -643px 0px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Silver {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -643px -69px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Skeleton {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -643px -138px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Spooky {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -643px -207px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_StarryNight {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -643px -276px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Sunshine {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -643px -345px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Thunderstorm {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -643px -414px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Watery {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -643px -483px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_White {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -643px -552px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Zombie {
.Pet_HatchingPotion_Amber {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: 0px -500px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Aquatic {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -69px -500px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Aurora {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -276px -638px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Base {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -207px -500px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Bronze {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -276px -500px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Celestial {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -345px -500px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_CottonCandyBlue {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -414px -500px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_CottonCandyPink {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -483px -500px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Cupid {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -574px 0px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Desert {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -574px -69px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Ember {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -574px -138px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Fairy {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -574px -207px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Floral {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -574px -276px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Frost {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -574px -345px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Ghost {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -574px -414px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Glass {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -574px -483px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Glow {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: 0px -569px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Golden {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -69px -569px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Holly {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -138px -569px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_IcySnow {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -207px -569px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Peppermint {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -276px -569px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Purple {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -345px -569px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Rainbow {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -414px -569px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Red {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -483px -569px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_RoseQuartz {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -552px -569px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_RoyalPurple {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -643px 0px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Ruby {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -643px -69px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Shade {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -643px -138px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Shadow {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -643px -207px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Shimmer {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -643px -276px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Silver {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -643px -345px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Skeleton {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -643px -414px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Spooky {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -643px -483px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_StarryNight {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -643px -552px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Sunshine {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: 0px -638px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Thunderstorm {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -69px -638px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Watery {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -138px -638px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_White {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -207px -638px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Zombie {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -138px -500px;
width: 68px;
height: 68px;
}
File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 299 KiB

After

Width:  |  Height:  |  Size: 298 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 348 KiB

After

Width:  |  Height:  |  Size: 347 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 182 KiB

After

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 KiB

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 164 KiB

After

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 KiB

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 154 KiB

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 KiB

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 176 KiB

After

Width:  |  Height:  |  Size: 180 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 165 KiB

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

After

Width:  |  Height:  |  Size: 134 KiB

@@ -2,11 +2,11 @@
// possible values are: normal, fall, habitoween, thanksgiving, winter, nye, birthday, valentines, spring, summer
// more to be added on future seasons
$npc_market_flavor: 'valentines';
$npc_market_flavor: 'normal';
$npc_quests_flavor: 'normal';
$npc_seasonal_flavor: 'normal';
$npc_timetravelers_flavor: 'normal';
$npc_tavern_flavor: 'valentines';
$npc_tavern_flavor: 'normal';
$restingToolbarHeight: 40px;
$menuToolbarHeight: 56px;
@@ -2,19 +2,38 @@
<div
class="notification d-flex flex-column justify-content-center text-center"
>
<strong class="mx-auto mb-2"> {{ $t('g1g1Announcement') }} </strong>
<p class="mx-4"> {{ $t('g1g1Details') }} </p>
<strong
class="mx-auto mb-2"
v-once
>
{{ $t('g1g1Announcement') }}
</strong>
<p
class="mx-4"
v-once
>
{{ $t('g1g1Details') }}
</p>
<div
class="btn-secondary mx-auto d-flex"
@click="showSelectUser()"
>
<div class="m-auto"> {{ $t('sendGift') }} </div>
<div
class="m-auto"
v-once
>
{{ $t('sendGift') }}
</div>
</div>
<div
class="notification-remove"
@click.stop="remove()"
>
<div class="svg-icon" v-html="icons.close"></div>
<div
class="svg-icon"
v-html="icons.close"
v-once
></div>
</div>
</div>
</template>
@@ -173,7 +173,6 @@ export default {
methods: {
close () {
this.$root.$emit('habitica::dismiss-modal', 'select-user-modal');
this.$root.$emit('bv::hide::modal', 'select-user-modal');
},
searchUser: debounce(async function userSearch (searchTerm) {
this.foundUser = {};
@@ -245,7 +245,6 @@ export default {
close () {
this.paymentData = {};
this.$root.$emit('habitica::dismiss-modal', 'payments-success-modal');
this.$root.$emit('bv::hide::modal', 'payments-success-modal');
},
},
};
@@ -209,7 +209,6 @@
<!-- eslint-disable vue/no-use-v-if-with-v-for, max-len -->
<div
v-for="(items, key) in getGrouped(questItems(category, selectedSortItemsBy,searchTextThrottled, hideLocked, hidePinned))"
v-if="key !== 'questGroupEarnable'"
:key="key"
class="group"
>
+6 -3
View File
@@ -78,9 +78,8 @@ async function buyArmoire (store, params) {
// @TODO: We might need to abstract notifications to library rather than mixin
const notificationOptions = isExperience
? {
text: `+ ${item.value}`,
type: 'xp',
flavorMessage: message,
text: message,
type: 'success',
}
: {
text: message,
@@ -93,6 +92,10 @@ async function buyArmoire (store, params) {
timeout: true,
...notificationOptions,
});
if (isExperience) {
await store.dispatch('user:fetch', { forceLoad: true });
}
}
}
+4
View File
@@ -1458,6 +1458,8 @@
"headMystery201912Notes": "This glittering snowflake grants you resistance to the biting cold no matter how high you fly! Confers no benefit. December 2019 Subscriber Item.",
"headMystery202001Text": "Fabled Fox Ears",
"headMystery202001Notes": "Your hearing will be so sharp, you'll hear the stars twinkling and the moon spinning. Confers no benefit. January 2020 Subscriber Item.",
"headMystery202003Text": "Barbed Helm",
"headMystery202003Notes": "Be careful, this helm is sharp in more ways than one! Confers no benefit. March 2020 Subscriber Item.",
"headMystery301404Text": "Fancy Top Hat",
"headMystery301404Notes": "A fancy top hat for the finest of gentlefolk! January 3015 Subscriber Item. Confers no benefit.",
"headMystery301405Text": "Basic Top Hat",
@@ -2017,6 +2019,8 @@
"bodyMystery201901Notes": "These shimmering pauldrons are strong, but will rest on your shoulders as weightlessly as a ray of dancing light. Confers no benefit. January 2019 Subscriber Item.",
"bodyMystery202002Text": "Stylish Sweetheart Scarf",
"bodyMystery202002Notes": "For when your heart is warm but the breezes of February are brisk. Confers no benefit. February 2020 Subscriber Item.",
"bodyMystery202003Text": "Barbed Pauldrons",
"bodyMystery202003Notes": "They're like shoulder pads that are on a whole other level. Confers no benefit. March 2020 Subscriber Item.",
"bodyArmoireCozyScarfText": "Cozy Scarf",
"bodyArmoireCozyScarfNotes": "This fine scarf will keep you warm as you go about your wintry business. Increases Constitution and Perception by <%= attrs %> each. Enchanted Armoire: Lamplighter's Set (Item 4 of 4).",
@@ -171,6 +171,7 @@
"mysterySet201912": "Polar Pixie Set",
"mysterySet202001": "Fabled Fox Set",
"mysterySet202002": "Stylish Sweetheart Set",
"mysterySet202003": "Barbed Battler Set",
"mysterySet301404": "Steampunk Standard Set",
"mysterySet301405": "Steampunk Accessories Set",
"mysterySet301703": "Peacock Steampunk Set",
@@ -439,6 +439,12 @@ const body = {
mystery: '202002',
value: 0,
},
202003: {
text: t('bodyMystery202003Text'),
notes: t('bodyMystery202003Notes'),
mystery: '202003',
value: 0,
},
};
const eyewear = {
@@ -793,6 +799,12 @@ const head = {
mystery: '202001',
value: 0,
},
202003: {
text: t('headMystery202003Text'),
notes: t('headMystery202003Notes'),
mystery: '202003',
value: 0,
},
301404: {
text: t('headMystery301404Text'),
notes: t('headMystery301404Notes'),
+5 -5
View File
@@ -1067,7 +1067,7 @@ const quests = {
notes: t('questBasilistNotes'),
group: 'questGroupEarnable',
completion: t('questBasilistCompletion'),
value: 4,
goldValue: 100,
category: 'unlockable',
unlockCondition: {
condition: 'party invite',
@@ -2238,7 +2238,7 @@ const quests = {
notes: t('questDustBunniesNotes'),
group: 'questGroupEarnable',
completion: t('questDustBunniesCompletion'),
value: 4,
value: 1,
category: 'unlockable',
unlockCondition: {
condition: 'party invite',
@@ -2262,7 +2262,7 @@ const quests = {
value: 4,
category: 'unlockable',
unlockCondition: {
condition: 'party invite',
condition: 'login reward',
incentiveThreshold: 7,
text: t('loginReward', { count: 7 }),
},
@@ -2293,7 +2293,7 @@ const quests = {
value: 4,
category: 'unlockable',
unlockCondition: {
condition: 'party invite',
condition: 'login reward',
incentiveThreshold: 22,
text: t('loginReward', { count: 22 }),
},
@@ -2323,7 +2323,7 @@ const quests = {
value: 4,
category: 'unlockable',
unlockCondition: {
condition: 'party invite',
condition: 'login reward',
incentiveThreshold: 40,
text: t('loginReward', { count: 40 }),
},
@@ -10,6 +10,7 @@ import {
import randomVal, * as randomValFns from '../../libs/randomVal';
import { removeItemByPath } from '../pinnedGearUtils';
import { AbstractGoldItemOperation } from './abstractBuyOperation';
import updateStats from '../../fns/updateStats';
// TODO this is only used on the server
// move out of common?
@@ -156,6 +157,7 @@ export class BuyArmoireOperation extends AbstractGoldItemOperation { // eslint-d
_experienceResult (user) {
const armoireExp = Math.floor(randomValFns.trueRandom() * 40 + 10);
user.stats.exp += armoireExp;
updateStats(user, user.stats, this.req);
return {
message: this.i18n('armoireExp'),
@@ -42,7 +42,7 @@ export class BuyQuestWithGoldOperation extends AbstractGoldItemOperation { // es
if (!item) throw new NotFound(errorMessage('questNotFound', { key }));
if (!(item.category === 'gold' && item.goldValue)) {
if (!(item.goldValue)) {
throw new NotAuthorized(this.i18n('questNotGoldPurchasable', { key }));
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 493 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 823 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 451 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 893 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 491 B

After

Width:  |  Height:  |  Size: 282 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

+11 -7
View File
@@ -29,7 +29,7 @@ const api = {};
/**
* @api {post} /api/v3/user/auth/local/register Register
* @apiDescription Register a new user with email, login name, and password or
* attach local auth to a social user
* attach local authentication to a social auth user
* @apiName UserRegisterLocal
* @apiGroup User
*
@@ -148,12 +148,14 @@ api.loginSocial = {
/**
* @api {put} /api/v3/user/auth/update-username Update username
* @apiDescription Update the username of a local user
* @apiDescription Update and verify the user's username
* @apiName UpdateUsername
* @apiGroup User
*
* @apiParam (Body) {String} username The new username
* @apiParam (Body) {String} password The user's password if they use local authentication.
* Omit if they use social auth.
*
* @apiSuccess {String} data.username The new username
* */
api.updateUsername = {
@@ -196,6 +198,8 @@ api.updateUsername = {
// save username
user.auth.local.lowerCaseUsername = newUsername.toLowerCase();
user.auth.local.username = newUsername;
// reward user for verifying their username
if (!user.flags.verifiedUsername) {
user.flags.verifiedUsername = true;
if (user.items.pets['Bear-Veteran']) {
@@ -277,7 +281,7 @@ api.updatePassword = {
};
/**
* @api {post} /api/v3/user/reset-password Reset password
* @api {post} /api/v3/user/reset-password Reset password (email a reset link)
* @apiDescription Send the user an email to let them reset their password
* @apiName ResetPassword
* @apiGroup User
@@ -371,7 +375,7 @@ api.updateEmail = {
};
/**
* @api {post} /api/v3/user/auth/reset-password-set-new-one Reset Password Set New one
* @api {post} /api/v3/user/auth/reset-password-set-new-one Reset password (set a new one)
* @apiDescription Set a new password for a user that reset theirs. Not meant for public usage.
* @apiName ResetPasswordSetNewOne
* @apiGroup User
@@ -424,8 +428,8 @@ api.resetPasswordSetNewOne = {
/**
* @api {delete} /api/v3/user/auth/social/:network Delete social authentication method
* @apiDescription Remove a social authentication method (only facebook supported)
* from a user profile. The user must have local authentication enabled
* @apiDescription Remove a social authentication method from a user profile.
* The user must have another authentication method enabled.
* @apiName UserDeleteSocial
* @apiGroup User
*
@@ -513,7 +513,7 @@ api.getGroupChallenges = {
};
/**
* @api {get} /api/v3/challenges/:challengeId Get a challenge given its id
* @api {get} /api/v3/challenges/:challengeId Get a challenge
* @apiName GetChallenge
* @apiGroup Challenge
*
+4 -1
View File
@@ -4,8 +4,11 @@ import cron from '../../middlewares/cron';
const api = {};
/**
* @api {post} /api/v3/cron Runs cron
* @api {post} /api/v3/cron Run cron
* @apiName Cron
* @apiDescription This causes cron to run. It assumes that the user has already been shown
* the Record Yesterday's Activity ("Check off any Dailies you did yesterday") screen and
* so it will immediately apply damage for incomplete due Dailies.
* @apiGroup Cron
*
* @apiSuccess {Object} data An empty Object
+5 -5
View File
@@ -93,7 +93,7 @@ api.getPatrons = {
};
/**
* @api {get} /api/v3/hall/heroes Get all Heroes
* @api {get} /api/v3/hall/heroes Get all Heroes (contributors)
* @apiName GetHeroes
* @apiGroup Hall
*
@@ -154,7 +154,7 @@ const heroAdminFields = 'contributor balance profile.name purchased items auth f
* @apiGroup Hall
* @apiPermission Admin
*
* @apiDescription Returns the profile of the given user
* @apiDescription Returns the profile of the given user. User does not need to be a contributor.
*
* @apiSuccess {Object} data The user object
*
@@ -208,9 +208,9 @@ const gemsPerTier = {
* @apiGroup Hall
* @apiPermission Admin
*
* @apiDescription Update user's gem balance, contributions & contribution tier
* and admin status. Grant items, block / unblock user's account
* and revoke / unrevoke chat privileges.
* @apiDescription Update user's gem balance, contributions and contribution tier,
* or admin status. Grant items. Block / unblock user's account.
* Revoke / unrevoke chat privileges.
*
* @apiExample Example Body:
* {
+3 -3
View File
@@ -658,8 +658,8 @@ api.getObjectionsToInteraction = {
* @apiName SendPrivateMessage
* @apiGroup Member
*
* @apiParam (Body) {String} message Body parameter - The message
* @apiParam (Body) {UUID} toUserId Body parameter - The user to contact
* @apiParam (Body) {String} message The message
* @apiParam (Body) {UUID} toUserId The id of the user to contact
*
* @apiSuccess {Object} data.message The message just sent
*
@@ -698,7 +698,7 @@ api.sendPrivateMessage = {
* @apiGroup Member
*
* @apiParam (Body) {String} message The message to the user
* @apiParam (Body) {UUID} toUserId The toUser _id
* @apiParam (Body) {UUID} toUserId The user to send the gift to
* @apiParam (Body) {Integer} gemAmount The number of gems to send
*
* @apiSuccess {Object} data An empty Object
+54 -29
View File
@@ -4,7 +4,7 @@ const api = {};
// @TODO export this const, cannot export it from here because only routes are exported from
// controllers
const LAST_ANNOUNCEMENT_TITLE = 'BLOG POSTS: PARTY PARTICIPATION AND OUR FAVO(U)RITE GUILDS!';
const LAST_ANNOUNCEMENT_TITLE = 'NEW SUBSCRIBER ITEMS, RESOLUTION SUCCESS CHALLENGE, AND TAKE THIS CHALLENGE!';
const worldDmg = { // @TODO
bailey: false,
};
@@ -31,43 +31,66 @@ api.getNews = {
<div class="mr-3 ${baileyClass}"></div>
<div class="media-body">
<h1 class="align-self-center">${res.t('newStuff')}</h1>
<h2>2/20/2020 - ${LAST_ANNOUNCEMENT_TITLE}</h2>
<h2>3/2/2020 - ${LAST_ANNOUNCEMENT_TITLE}</h2>
</div>
</div>
<hr/>
<div class="promo_mystery_202003 center-block"></div>
<h3>March Subscriber Items Revealed!</h3>
<p>
The March Subscriber Item has been revealed: the Barbed Battler Item Set! <a
href='/user/settings/subscription'>Subscribe to Habitica</a> by March 31 to receive this
exciting set! If you're already an active subscriber, reload the site and then head to
Inventory > Items to claim your gear!
</p>
<p>
Subscribers also receive the ability to buy Gems with Gold -- the longer you subscribe,
the more gems you can buy per month! There are other perks as well, such as longer access
to uncompressed data and a cute Jackalope pet. Best of all, subscriptions let us keep
Habitica running. Thank you very much for your support -- it means a lot to us.
</p>
<div class="small mb-3">by Beffymaroo</div>
<div class="scene_gaining_achievement center-block"></div>
<h3>Use Case Spotlight: Party Participation</h3>
<h3>New Resolution Success Challenge and Take This Challenge!</h3>
<p>
This month's <a
href='https://habitica.wordpress.com/2020/02/20/use-case-spotlight-party-cipation/'
target='_blank'>Use Case Spotlight</a> is about Party Participation! It features a number
of great suggestions submitted by Habiticans in the <a
href='/groups/guild/1d3a10bf-60aa-4806-a38b-82d1084a59e6'>Use Case Spotlights Guild</a>.
We hope it helps any of you who might be looking for ways to keep your quest party
engaged and excited to win battles with good habits.
The Habitica team has launched a special official Challenge series hosted in the <a
href='/groups/guild/6e6a8bd3-9f5f-4351-9188-9f11fcd80a99' target='_blank'>Official New
Year's Resolution Guild</a>. These Challenges are designed to help you build and maintain
goals that are destined for success and then stick with them as the year progresses. For
this month's Challenge, <a href='/challenges/ad50c909-eb5d-4b34-83ca-52b2122f1451'>Reach
for Your First Achievement</a>, we're focusing on setting smaller mini-goals as
milestones! It has a 15 Gem prize, which will be awarded to five lucky winners on April
1st.
</p>
<p>
Plus, we're collecting user submissions for the next spotlight! How do you use Habitica
to manage conflicting needs, like productivity versus self-care? Well be featuring
player-submitted examples in Use Case Spotlights on the Habitica Blog next month, so post
your suggestions in the Use Case Spotlight Guild now. We look forward to learning more
about how you use Habitica to improve your life and get things done!
</p>
<div class="small mb-3">by shanaqui</div>
<div class="scene_shanaqui center-block"></div>
<h3>Guild Spotlight: Shanaqui's Favourites</h3>
<p>
For this year's Guild Spotlight series, we're highlighting some favourites from
Habitica's staff, moderators, and maybe some high-level contributors!
Congratulations to the winners of the February Challenge: @2muchomework, @Meylin_uwu,
@OpCit, @dejavudu, and @rebeccafae!
</p>
<p>
This month we're kicking things off with some <a
href='https://habitica.wordpress.com/2020/02/20/guild-spotlights-our-favourites/'
target='_blank'>picks from shanaqui!</a> If you want to curate your Habitica experience
and join active, positive Guilds, this is a great way to pick up some new ideas for
Guilds to join.
The next Take This Challenge has also launched, "<a
href='/challenges/96980722-77b2-4a76-8bba-358558fe1a19'>Gaining Inspiration Points!</a>",
with a focus on capturing creativity. Be sure to check it out to earn additional pieces
of the Take This armor set!
</p>
<div class="small mb-3">by shanaqui</div>
<p>
<a href='http://www.takethis.org/' target='_blank'>Take This</a> is a nonprofit that
seeks to inform the gamer community about mental health issues, to provide education
about mental disorders and mental illness prevention, and to reduce the stigma of mental
illness.
</p>
<p>
Congratulations to the winners of the last Take This Challenge, "Multiplayer Co-Op
Exercise!": grand prize winner SimpleMan, and runners-up @damole, @BrittySpitty1013,
@LeScalpeurDeCarottes, @Eziorocks, and @k4m3n! Plus, all participants in that Challenge
have received a piece of the <a
href='http://habitica.wikia.com/wiki/Event_Item_Sequences#Take_This_Armor_Set'
target='_blank'>Take This item set</a> if they hadn't completed it already. It is located
in your Rewards column. Enjoy!
</p>
<div class="small mb-3">
by Doctor B, the Take This team, Lemoness, Beffymaroo, and SabreCat
</div>
<div class="promo_take_this center-block"></div>
</div>
`,
});
@@ -75,8 +98,10 @@ api.getNews = {
};
/**
* @api {post} /api/v3/news/tell-me-later Get latest Bailey announcement in a second moment
* @api {post} /api/v3/news/tell-me-later Allow latest Bailey announcement to be read later
* @apiName TellMeLaterNews
* @apiDescription Add a notification to allow viewing of the latest "New Stuff by Bailey" message.
* Prevent this specific Bailey message from appearing automatically.
* @apiGroup News
*
*
+2 -2
View File
@@ -78,7 +78,7 @@ api.getTags = {
};
/**
* @api {get} /api/v3/tags/:tagId Get a tag given its id
* @api {get} /api/v3/tags/:tagId Get a tag
* @apiName GetTag
* @apiGroup Tag
*
@@ -199,7 +199,7 @@ api.reorderTags = {
};
/**
* @api {delete} /api/v3/tags/:tagId Delete a user tag given its id
* @api {delete} /api/v3/tags/:tagId Delete a user tag
* @apiName DeleteTag
* @apiGroup Tag
*
+3 -1
View File
@@ -1479,6 +1479,8 @@ api.unlinkOneTask = {
/**
* @api {post} /api/v3/tasks/clearCompletedTodos Delete user's completed todos
* @apiName ClearCompletedTodos
* @apiDescription Deletes all of a user's completed To-Dos except
* those belonging to active Challenges and Group Plans.
* @apiGroup Task
*
* @apiExample {curl} Example call:
@@ -1523,7 +1525,7 @@ api.clearCompletedTodos = {
};
/**
* @api {delete} /api/v3/tasks/:taskId Delete a task given its id
* @api {delete} /api/v3/tasks/:taskId Delete a task
* @apiName DeleteTask
* @apiGroup Task
*
@@ -178,7 +178,7 @@ api.groupMoveTask = {
* @apiParam (Path) {UUID} taskId The id of the task that will be assigned
* @apiParam (Path) {UUID} assignedUserId The id of the user that will be assigned to the task
*
* @apiSuccess data An object if a single task was created, otherwise an array of tasks
* @apiSuccess data The assigned task
*/
api.assignTask = {
method: 'POST',
@@ -246,14 +246,14 @@ api.assignTask = {
/**
* @api {post} /api/v3/tasks/:taskId/unassign/:assignedUserId Unassign a user from a task
* @apiDescription Unassigns a user to from a group task
* @apiDescription Unassigns a user from a group task
* @apiName UnassignTask
* @apiGroup Task
*
* @apiParam (Path) {UUID} taskId The id of the task that will be assigned
* @apiParam (Path) {UUID} taskId The id of the task that is the original group task
* @apiParam (Path) {UUID} assignedUserId The id of the user that will be unassigned from the task
*
* @apiSuccess data An object if a single task was created, otherwise an array of tasks
* @apiSuccess data The unassigned task
*/
api.unassignTask = {
method: 'POST',
@@ -398,8 +398,8 @@ api.approveTask = {
};
/**
* @api {post} /api/v3/tasks/:taskId/needs-work/:userId Group task needs more work
* @apiDescription Mark an assigned group task as needeing more work before it can be approved
* @api {post} /api/v3/tasks/:taskId/needs-work/:userId Require more work for a group task
* @apiDescription Mark an assigned group task as needing more work before it can be approved
* @apiVersion 3.0.0
* @apiName TaskNeedsWork
* @apiGroup Task
+51 -44
View File
@@ -41,28 +41,28 @@ const api = {};
* @apiGroup User
*
* @apiDescription The user profile contains data related to the authenticated
* user including (but not limited to);
* Achievements
* Authentications (including types and timestamps)
* Challenges
* Flags (including armoire, tutorial, tour etc...)
* Guilds
* History (including timestamps and values)
* Inbox
* Invitations (to parties/guilds)
* Items (character's full inventory)
* New Messages (flags for groups/guilds that have new messages)
* Notifications
* Party (includes current quest information)
* Preferences (user selected prefs)
* Profile (name, photo url, blurb)
* Purchased (includes purchase history, gem purchased items, plans)
* PushDevices (identifiers for mobile devices authorized)
* Stats (standard RPG stats, class, buffs, xp, etc..)
* Tags
* TasksOrder (list of all ids for dailys, habits, rewards and todos)
* user including (but not limited to):
* Achievements;
* Authentications (including types and timestamps);
* Challenges memberships (Challenge IDs);
* Flags (including armoire, tutorial, tour etc...);
* Guilds memberships (Guild IDs);
* History (including timestamps and values, only for Experience and summed To-Do values);
* Inbox;
* Invitations (to parties/guilds);
* Items (character's full inventory);
* New Messages (flags for party/guilds that have new messages; also reported in Notifications);
* Notifications;
* Party (includes current quest information);
* Preferences (user selected prefs);
* Profile (name, photo url, blurb);
* Purchased (includes subscription data and some gem-purchased items);
* PushDevices (identifiers for mobile devices authorized);
* Stats (standard RPG stats, class, buffs, xp, etc..);
* Tags;
* TasksOrder (list of all IDs for Dailys, Habits, Rewards and To-Dos).
*
* @apiParam (Query) {String} [userFields] A list of comma separated user fields to
* @apiParam (Query) {String} [userFields] A list of comma-separated user fields to
* be returned instead of the entire document.
* Notifications are always returned.
*
@@ -92,7 +92,7 @@ api.getUser = {
/**
* @api {get} /api/v3/user/inventory/buy
* Get the gear items available for purchase for the authenticated user
* Get equipment/gear items available for purchase for the authenticated user
* @apiName UserGetBuyList
* @apiGroup User
*
@@ -231,7 +231,8 @@ api.updateUser = {
* @apiName UserDelete
* @apiGroup User
*
* @apiParam (Body) {String} password The user's password if the account uses local authentication
* @apiParam (Body) {String} password The user's password if the account uses local authentication,
* otherwise the localized word "DELETE"
* @apiParam (Body) {String} feedback User's optional feedback explaining reasons for deletion
*
* @apiSuccess {Object} data An empty Object
@@ -242,9 +243,14 @@ api.updateUser = {
* "data": {}
* }
*
* @apiError {BadRequest} MissingPassword The password was not included in the request
* @apiError {BadRequest} LengthExceeded The feedback provided is longer than 10K
* @apiError {BadRequest} NotAuthorized There is no account that uses those credentials.
* @apiError {BadRequest} MissingPassword Missing password.
* @apiError {BadRequest} NotAuthorized Wrong password.
* @apiError {BadRequest} NotAuthorized Please type DELETE in all capital letters to
* delete your account.
* @apiError {BadRequest} BadRequest Account deletion feedback is limited to 10,000 characters.
* For lengthy feedback, email ${TECH_ASSISTANCE_EMAIL}.
* @apiError {BadRequest} NotAuthorized You have an active subscription,
* cancel your plan before deleting your account.
*
* @apiErrorExample {json} Example error:
* {
@@ -279,7 +285,7 @@ api.deleteUser = {
}
const { feedback } = req.body;
if (feedback && feedback.length > 10000) throw new BadRequest(`Account deletion feedback is limited to 10,000 characters. For lengthy feedback, email ${TECH_ASSISTANCE_EMAIL}.`);
if (feedback && feedback.length > 10000) throw new BadRequest(`Account deletion feedback is limited to 10,000 characters. For lengthy feedback, email ${TECH_ASSISTANCE_EMAIL}.`); // @TODO localize this string
if (plan && plan.customerId && !plan.dateTerminated) {
throw new NotAuthorized(res.t('cannotDeleteActiveAccount'));
@@ -333,14 +339,14 @@ function _cleanChecklist (task) {
* @apiGroup User
*
* @apiDescription Returns the user's data without:
* Authentication information
* NewMessages/Invitations/Inbox
* Profile
* Purchased information
* Contributor information
* Special items
* Webhooks
* Notifications
* Authentication information,
* NewMessages/Invitations/Inbox,
* Profile,
* Purchased information,
* Contributor information,
* Special items,
* Webhooks,
* Notifications.
*
* @apiSuccess {Object} data.user
* @apiSuccess {Object} data.tasks
@@ -537,7 +543,7 @@ api.buyGear = {
};
/**
* @api {post} /api/v3/user/buy-armoire Buy an armoire item
* @api {post} /api/v3/user/buy-armoire Buy an Enchanted Armoire item
* @apiName UserBuyArmoire
* @apiGroup User
*
@@ -619,8 +625,9 @@ api.buyHealthPotion = {
};
/**
* @api {post} /api/v3/user/buy-mystery-set/:key Buy a mystery set
* @api {post} /api/v3/user/buy-mystery-set/:key Buy a Mystery Item set
* @apiName UserBuyMysterySet
* @apiDescription This buys a Mystery Item set using an Hourglass.
* @apiGroup User
*
* @apiParam (Path) {String} key The mystery set to buy
@@ -703,7 +710,7 @@ api.buyQuest = {
};
/**
* @api {post} /api/v3/user/buy-special-spell/:key Buy special "spell" item
* @api {post} /api/v3/user/buy-special-spell/:key Buy special item (card, avatar transformation)
* @apiDescription Includes gift cards (e.g., birthday card), and avatar Transformation
* Items and their antidotes (e.g., Snowball item and Salt reward).
* @apiName UserBuySpecialSpell
@@ -1003,6 +1010,8 @@ api.purchase = {
/**
* @api {post} /api/v3/user/purchase-hourglass/:type/:key Purchase Hourglass-purchasable item
* @apiName UserPurchaseHourglass
* @apiDescription Purchases an Hourglass-purchasable item.
* Does not include Mystery Item sets (use /api/v3/user/buy-mystery-set/:key).
* @apiGroup User
*
* @apiParam (Path) {String="pets","mounts"} type The type of item to purchase
@@ -1492,7 +1501,7 @@ api.clearMessages = {
};
/**
* @api {post} /api/v3/user/mark-pms-read Marks Private Messages as read
* @api {post} /api/v3/user/mark-pms-read Mark Private Messages as read
* @apiName markPmsRead
* @apiGroup User
*
@@ -1517,7 +1526,7 @@ api.markPmsRead = {
/* NOTE this route has also an API v4 version */
/**
* @api {post} /api/v3/user/reroll Reroll a user using the Fortify Potion
* @api {post} /api/v3/user/reroll Reroll a user (reset tasks) using the Fortify Potion
* @apiName UserReroll
* @apiGroup User
*
@@ -1580,14 +1589,12 @@ api.userReset = {
};
/**
* @api {post} /api/v3/user/custom-day-start
* Set preferences.dayStart (Custom Day Start time) for user
* @api {post} /api/v3/user/custom-day-start Set Custom Day Start time for user.
* @apiName setCustomDayStart
* @apiGroup User
*
*
* @apiParam (Body) {number} [dayStart=0] The hour number 0-23 for day to begin.
* If body is not included, will default to 0.
* If not supplied, will default to 0.
*
* @apiParamExample {json} Request-Example:
* {"dayStart":2}
@@ -30,29 +30,30 @@ const api = {};
* the necessary fields will be populated. The user is always returned.
*
* @apiDescription Skill Key to Name Mapping
* Mage
* fireball: "Burst of Flames"
* mpheal: "Ethereal Surge"
* earth: "Earthquake"
* frost: "Chilling Frost"
*
* Warrior
* smash: "Brutal Smash"
* defensiveStance: "Defensive Stance"
* valorousPresence: "Valorous Presence"
* intimidate: "Intimidating Gaze"
* Mage:
* fireball="Burst of Flames",
* mpheal="Ethereal Surge",
* earth="Earthquake",
* frost="Chilling Frost"
*
* Rogue
* pickPocket: "Pickpocket"
* backStab: "Backstab"
* toolsOfTrade: "Tools of the Trade"
* stealth: "Stealth"
* Warrior:
* smash="Brutal Smash",
* defensiveStance="Defensive Stance",
* valorousPresence="Valorous Presence",
* intimidate="Intimidating Gaze"
*
* Healer
* heal: "Healing Light"
* protectAura: "Protective Aura"
* brightness: "Searing Brightness"
* healAll: "Blessing"
* Rogue:
* pickPocket="Pickpocket",
* backStab="Backstab",
* toolsOfTrade="Tools of the Trade",
* stealth="Stealth"
*
* Healer:
* heal="Healing Light",
* protectAura="Protective Aura",
* brightness="Searing Brightness",
* healAll="Blessing"
*
* @apiError (400) {NotAuthorized} Not enough mana.
* @apiUse TaskNotFound
@@ -9,6 +9,7 @@ const api = {};
* Allocate a single Stat Point (previously called Attribute Point)
* @apiName UserAllocate
* @apiGroup User
* @apiDescription Allocates a single Stat Point.
*
* @apiParam (Query) {String="str","con","int","per"} stat The Stat to increase. Default is 'str'
*
+3 -1
View File
@@ -77,7 +77,9 @@ api.clearMessages = {
* @api {get} /api/v4/inbox/conversations Get the conversations for a user
* @apiName conversations
* @apiGroup Inbox
* @apiDescription Get the conversations for a user
* @apiDescription Get the conversations for a user.
* This is for API v4 which must not be used in third-party tools.
* For API v3, use "Get inbox messages for a user".
*
* @apiSuccess {Array} data An array of inbox conversations
*
+4 -2
View File
@@ -5,8 +5,10 @@ const api = {};
/**
* @api {post} /api/v4/members/flag-private-message/:messageId Flag a private message
* @apiDescription An email and slack message are sent
* to the moderators about every flagged message.
* @apiDescription Moderators are notified about every flagged message,
* including the sender, recipient, and full content of the message.
* This is for API v4 which must not be used in third-party tools as it can change without notice.
* There is no equivalent route in API v3.
* @apiName FlagPrivateMessage
* @apiGroup Member
*
@@ -161,6 +161,7 @@ api.exportUserDataJson = {
/**
* @api {get} /export/userdata.xml Export user data in XML format
* @apiName ExportUserDataXml
* @apiDescription This XML export feature is not currently working (https://github.com/HabitRPG/habitica/issues/10100).
* @apiGroup DataExport
*
* @apiSuccess {XML} File An xml file of the user object.
@@ -224,6 +225,7 @@ api.exportUserAvatarHtml = {
/**
* @api {get} /export/avatar-:uuid.png Render a user avatar as a PNG file
* @apiName ExportUserAvatarPng
* @apiDescription This PNG export feature is not currently working (https://github.com/HabitRPG/habitica/issues/9489).
* @apiGroup DataExport
*
* @apiParam (Path) {String} uuid The User ID of the user
@@ -293,6 +295,7 @@ api.exportUserAvatarPng = {
/**
* @api {get} /export/inbox.html Export user private messages as HTML document
* @apiName ExportUserPrivateMessages
* @apiDescription This HTML export feature is not currently working (https://github.com/HabitRPG/habitica/issues/9489).
* @apiGroup DataExport
*
* @apiSuccess {HTML} File An html page of the user's private messages.
@@ -8,14 +8,15 @@ import {
const api = {};
/**
* @api {get} /email/unsubscribe Unsubscribe an email or user from email notifications
* @apiDescription Does not require authentication
* @api {get} /email/unsubscribe Unsubscribe an email address or user from email notifications
* @apiName UnsubscribeEmail
* @apiGroup Unsubscribe
* @apiDescription This is a GET method included in official emails from Habitica
* that will unsubscribe the user from emails.
* Does not require authentication.
*
* @apiParam (Query) {String} code An unsubscription code
* @apiParam (Query) {String} code An unsubscription code that contains an encrypted User ID or
* email address
*
* @apiSuccess {String} Webpage An html success message
*
-1
View File
@@ -95,7 +95,6 @@ const bannedSlurs = [
'sluts',
'spics',
'tranny',
'trannies',
+5
View File
@@ -69,6 +69,10 @@
// These words are blocked from use in the Tavern but do not appear in bannedSlurs.js
// because we do not want people to be automatically muted when the words are used
// appropriately in guilds.
// As of 2020-02-26, 'sluts' is also here rather than in bannedSlurs.js because
// "Expanded Party: Polyamorous Adventurers" guild (17bb8393-2d74-42de-8dcb-315a5f596636)
// wants to discuss https://en.wikipedia.org/wiki/The_Ethical_Slut (a book) and
// we've decided to allow that.
// DO NOT EDIT! See the comments at the top of this file.
@@ -147,6 +151,7 @@ const bannedWords = [
'fag',
'slut',
'sluts',
'retard',
'retards',
'bastard',
@@ -44,6 +44,7 @@ const guildsAllowingBannedWords = {
'612e5766-a171-4e0a-b02b-c55a9fe786e4': true, // Compulsive Overeaters
'726058f7-4452-47a3-aa86-e995d1ac031c': true, // Conscientious Consumption
'c59147bf-46c1-4ec8-a63f-9a8ebfcf9987': true, // Culinary Institute of Habitica
'9ffb19bb-1356-4ead-b585-c5031b5393b1': true, // Cynophiles
'202ab416-92b7-4cbe-97d7-772776c8f911': true, // Danish Translators
'6c6f4df6-8bc2-4a4c-a5a1-d4f1ef447989': true, // Dar al-Arqam
'ad251001-c1c5-4227-b165-6549a5b9e267': true, // Das Planertarium
@@ -57,6 +58,7 @@ const guildsAllowingBannedWords = {
'955fdbb8-f1b3-40cb-b528-8d292b312a6a': true, // Egyptology Unearthed
'a4cd281d-4683-4604-86f3-d2cc955e1544': true, // En espanol
'4c366cdd-9ece-4ee1-9bc5-fa0d0c8df63f': true, // Essential Habits of a Christian
'17bb8393-2d74-42de-8dcb-315a5f596636': true, // Expanded Party: Polyamorous Adventurers
'414381ad-08bf-4fe4-b767-c0e874660438': true, // FOCUS - Fellowship of Catholic University Students
'1705f33f-9303-4b78-93ac-e21ed2d08df8': true, // Fitbit Guild
'2ed36580-011f-4abb-94fc-e52022f38f6f': true, // Foodies
@@ -117,6 +119,7 @@ const guildsAllowingBannedWords = {
'8dc268f5-5f6d-41a0-82ca-a248dfd240c4': true, // Portugal Fenomenal
'77e13b13-e3ba-4e45-badf-9e448bb9be64': true, // Portuguese Translators
'46bc163e-f34e-4216-b916-9062d30a141f': true, // Procurando Grupo Brasil (Pedir Convite)
'14ae3965-0536-4b63-bc55-3dbd6660e3af': true, // Purely Positive Dog Trainers
'00698a77-cda2-4f49-a59f-f32205078903': true, // Quit Soda Support Group
'3584819a-a854-4768-ba49-8880fc0dda14': true, // Reiki Br
'd7838bfa-4577-4a4f-b922-65834e4a824c': true, // Rhyme Commando
@@ -137,8 +140,6 @@ const guildsAllowingBannedWords = {
'8e389264-ada0-4834-828c-ef65679e929c': true, // Witches, Pagans, and Diviners
'0ff469a9-677f-4dcd-a091-2d2d3cebcaa8': true, // Writers of Ideas: Speculative Fiction Authors
'f371368a-b3b0-4a81-a400-3bd59fc0a89d': true, // Youtube francophone
'9ffb19bb-1356-4ead-b585-c5031b5393b1': true, // Cynophiles
'14ae3965-0536-4b63-bc55-3dbd6660e3af': true, // Purely Positive Dog Trainers
};
export default guildsAllowingBannedWords;
+6
View File
@@ -162,6 +162,12 @@ TaskSchema.plugin(baseModel, {
}
}
// Fix issue where iOS was sending null as the value of the attribute field
// See https://github.com/HabitRPG/habitica-ios/commit/4cd05f80363502eb7652e057aa564c85546f7806
if (taskObj.attribute === null) {
taskObj.attribute = 'str';
}
return taskObj;
},
private: [],