Compare commits
64 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 168ed02226 | |||
| aa253cf72e | |||
| 247742c60d | |||
| 7d89deb094 | |||
| c128b701fa | |||
| f01e13ffc0 | |||
| 4e9d631b71 | |||
| f1de7c02e9 | |||
| 4f305bd505 | |||
| 024feaa2f4 | |||
| d2dc8f1856 | |||
| 364ed8dbab | |||
| 73328b6dab | |||
| e3a08c1905 | |||
| dad0eea9e0 | |||
| 76849cdcaa | |||
| eb6ac42717 | |||
| d44a298e2d | |||
| 864ca91144 | |||
| 78816dd4cb | |||
| 6a99daebac | |||
| c9ee6c7f73 | |||
| e2f4b0e3dc | |||
| 369702884a | |||
| d438990d18 | |||
| 7d3213fd66 | |||
| bde4eafc05 | |||
| 5a2ba27808 | |||
| 024268a51e | |||
| f7281e71e8 | |||
| 91438aff90 | |||
| 91ed55cf66 | |||
| 4275da0a2e | |||
| d9f48dcbb0 | |||
| bd6f901ccf | |||
| 884bf02961 | |||
| 7d42e8fc71 | |||
| 0442b87608 | |||
| c1d1a3e14e | |||
| dd5a9aa6cc | |||
| 0bb6e5f3fc | |||
| 69347df050 | |||
| 9cad5525e6 | |||
| b1e6aceffe | |||
| 17068875f4 | |||
| 342fc2e344 | |||
| b8b1557e49 | |||
| f90ef04e83 | |||
| d0561512de | |||
| b84c672f33 | |||
| aafbb889be | |||
| 13865bcf49 | |||
| f9ca69196a | |||
| 0e77df6e7b | |||
| f2d9bdf7ae | |||
| 2d7e280598 | |||
| d1de41290d | |||
| 6956f5345e | |||
| cc68abb67e | |||
| b48be4e619 | |||
| 7a543d07a4 | |||
| 9115be68b2 | |||
| 83bd4dcf60 | |||
| 92b02295b5 |
@@ -97,5 +97,9 @@
|
||||
"COMMUNITY_MANAGER_EMAIL" : "leslie@habitica.com",
|
||||
"TECH_ASSISTANCE_EMAIL" : "admin@habitica.com",
|
||||
"PRESS_ENQUIRY_EMAIL" : "leslie@habitica.com"
|
||||
},
|
||||
"LOGGLY" : {
|
||||
"TOKEN" : "example-token",
|
||||
"SUBDOMAIN" : "exmaple-subdomain"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
var migrationName = '20170404_takeThis.js'; // Update per month
|
||||
var migrationName = '20170502_takeThis.js'; // Update per month
|
||||
var authorName = 'Sabe'; // in case script author needs to know when their ...
|
||||
var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done
|
||||
|
||||
@@ -14,7 +14,7 @@ function processUsers(lastId) {
|
||||
// specify a query to limit the affected users (empty for all users):
|
||||
var query = {
|
||||
'migration':{$ne:migrationName},
|
||||
'challenges':{$in:['630018a7-49ab-4e95-ac26-12417b746e1c']} // Update per month
|
||||
'challenges':{$in:['69999331-d4ea-45a0-8c3f-f725d22b56c8']} // Update per month
|
||||
};
|
||||
|
||||
if (lastId) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "habitica",
|
||||
"version": "3.88.0",
|
||||
"version": "3.90.1",
|
||||
"dependencies": {
|
||||
"@gulp-sourcemaps/map-sources": {
|
||||
"version": "1.0.0",
|
||||
@@ -15,7 +15,7 @@
|
||||
"abbrev": {
|
||||
"version": "1.1.0",
|
||||
"from": "abbrev@>=1.0.0 <2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz"
|
||||
},
|
||||
"accepts": {
|
||||
"version": "1.3.3",
|
||||
@@ -25,12 +25,12 @@
|
||||
"acorn": {
|
||||
"version": "4.0.11",
|
||||
"from": "acorn@>=4.0.3 <5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.11.tgz"
|
||||
"resolved": "http://registry.npmjs.org/acorn/-/acorn-4.0.11.tgz"
|
||||
},
|
||||
"acorn-dynamic-import": {
|
||||
"version": "2.0.2",
|
||||
"from": "acorn-dynamic-import@>=2.0.0 <3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz"
|
||||
"resolved": "http://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz"
|
||||
},
|
||||
"acorn-globals": {
|
||||
"version": "1.0.9",
|
||||
@@ -288,12 +288,12 @@
|
||||
"apidoc": {
|
||||
"version": "0.17.5",
|
||||
"from": "apidoc@>=0.17.5 <0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/apidoc/-/apidoc-0.17.5.tgz"
|
||||
"resolved": "http://registry.npmjs.org/apidoc/-/apidoc-0.17.5.tgz"
|
||||
},
|
||||
"apidoc-core": {
|
||||
"version": "0.8.2",
|
||||
"from": "apidoc-core@>=0.8.1 <0.9.0",
|
||||
"resolved": "https://registry.npmjs.org/apidoc-core/-/apidoc-core-0.8.2.tgz",
|
||||
"resolved": "http://registry.npmjs.org/apidoc-core/-/apidoc-core-0.8.2.tgz",
|
||||
"dependencies": {
|
||||
"glob": {
|
||||
"version": "7.1.1",
|
||||
@@ -321,7 +321,7 @@
|
||||
"aproba": {
|
||||
"version": "1.1.1",
|
||||
"from": "aproba@>=1.0.3 <2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz"
|
||||
"resolved": "http://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz"
|
||||
},
|
||||
"archive-type": {
|
||||
"version": "3.2.0",
|
||||
@@ -461,7 +461,7 @@
|
||||
"astw": {
|
||||
"version": "2.2.0",
|
||||
"from": "astw@>=2.0.0 <3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/astw/-/astw-2.2.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/astw/-/astw-2.2.0.tgz"
|
||||
},
|
||||
"async": {
|
||||
"version": "1.5.2",
|
||||
@@ -482,7 +482,7 @@
|
||||
"async-foreach": {
|
||||
"version": "0.1.3",
|
||||
"from": "async-foreach@>=0.1.3 <0.2.0",
|
||||
"resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz"
|
||||
"resolved": "http://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz"
|
||||
},
|
||||
"asynckit": {
|
||||
"version": "0.4.0",
|
||||
@@ -539,7 +539,7 @@
|
||||
"aws4": {
|
||||
"version": "1.6.0",
|
||||
"from": "aws4@>=1.2.1 <2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz"
|
||||
},
|
||||
"axios": {
|
||||
"version": "0.15.3",
|
||||
@@ -569,12 +569,12 @@
|
||||
"babel-helper-define-map": {
|
||||
"version": "6.23.0",
|
||||
"from": "babel-helper-define-map@>=6.23.0 <7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.23.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.23.0.tgz"
|
||||
},
|
||||
"babel-helper-function-name": {
|
||||
"version": "6.23.0",
|
||||
"from": "babel-helper-function-name@>=6.22.0 <7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.23.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.23.0.tgz"
|
||||
},
|
||||
"babel-helper-get-function-arity": {
|
||||
"version": "6.22.0",
|
||||
@@ -589,7 +589,7 @@
|
||||
"babel-helper-optimise-call-expression": {
|
||||
"version": "6.23.0",
|
||||
"from": "babel-helper-optimise-call-expression@>=6.23.0 <7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.23.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.23.0.tgz"
|
||||
},
|
||||
"babel-helper-regex": {
|
||||
"version": "6.22.0",
|
||||
@@ -604,12 +604,12 @@
|
||||
"babel-helper-replace-supers": {
|
||||
"version": "6.23.0",
|
||||
"from": "babel-helper-replace-supers@>=6.23.0 <7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.23.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.23.0.tgz"
|
||||
},
|
||||
"babel-helpers": {
|
||||
"version": "6.23.0",
|
||||
"from": "babel-helpers@>=6.23.0 <7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.23.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/babel-helpers/-/babel-helpers-6.23.0.tgz"
|
||||
},
|
||||
"babel-loader": {
|
||||
"version": "6.4.1",
|
||||
@@ -619,7 +619,7 @@
|
||||
"babel-messages": {
|
||||
"version": "6.23.0",
|
||||
"from": "babel-messages@>=6.23.0 <7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz"
|
||||
},
|
||||
"babel-plugin-check-es2015-constants": {
|
||||
"version": "6.22.0",
|
||||
@@ -668,12 +668,12 @@
|
||||
"babel-plugin-transform-es2015-block-scoping": {
|
||||
"version": "6.23.0",
|
||||
"from": "babel-plugin-transform-es2015-block-scoping@>=6.22.0 <7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.23.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.23.0.tgz"
|
||||
},
|
||||
"babel-plugin-transform-es2015-classes": {
|
||||
"version": "6.23.0",
|
||||
"from": "babel-plugin-transform-es2015-classes@>=6.22.0 <7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.23.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.23.0.tgz"
|
||||
},
|
||||
"babel-plugin-transform-es2015-computed-properties": {
|
||||
"version": "6.22.0",
|
||||
@@ -683,7 +683,7 @@
|
||||
"babel-plugin-transform-es2015-destructuring": {
|
||||
"version": "6.23.0",
|
||||
"from": "babel-plugin-transform-es2015-destructuring@>=6.22.0 <7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz"
|
||||
},
|
||||
"babel-plugin-transform-es2015-duplicate-keys": {
|
||||
"version": "6.22.0",
|
||||
@@ -693,7 +693,7 @@
|
||||
"babel-plugin-transform-es2015-for-of": {
|
||||
"version": "6.23.0",
|
||||
"from": "babel-plugin-transform-es2015-for-of@>=6.22.0 <7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz"
|
||||
},
|
||||
"babel-plugin-transform-es2015-function-name": {
|
||||
"version": "6.22.0",
|
||||
@@ -718,7 +718,7 @@
|
||||
"babel-plugin-transform-es2015-modules-systemjs": {
|
||||
"version": "6.23.0",
|
||||
"from": "babel-plugin-transform-es2015-modules-systemjs@>=6.22.0 <7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.23.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.23.0.tgz"
|
||||
},
|
||||
"babel-plugin-transform-es2015-modules-umd": {
|
||||
"version": "6.24.0",
|
||||
@@ -733,7 +733,7 @@
|
||||
"babel-plugin-transform-es2015-parameters": {
|
||||
"version": "6.23.0",
|
||||
"from": "babel-plugin-transform-es2015-parameters@>=6.22.0 <7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.23.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.23.0.tgz"
|
||||
},
|
||||
"babel-plugin-transform-es2015-shorthand-properties": {
|
||||
"version": "6.22.0",
|
||||
@@ -758,7 +758,7 @@
|
||||
"babel-plugin-transform-es2015-typeof-symbol": {
|
||||
"version": "6.23.0",
|
||||
"from": "babel-plugin-transform-es2015-typeof-symbol@>=6.22.0 <7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz"
|
||||
},
|
||||
"babel-plugin-transform-es2015-unicode-regex": {
|
||||
"version": "6.22.0",
|
||||
@@ -768,7 +768,7 @@
|
||||
"babel-plugin-transform-object-rest-spread": {
|
||||
"version": "6.23.0",
|
||||
"from": "babel-plugin-transform-object-rest-spread@>=6.16.0 <7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz"
|
||||
},
|
||||
"babel-plugin-transform-regenerator": {
|
||||
"version": "6.22.0",
|
||||
@@ -783,7 +783,7 @@
|
||||
"babel-polyfill": {
|
||||
"version": "6.23.0",
|
||||
"from": "babel-polyfill@>=6.6.1 <7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.23.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.23.0.tgz"
|
||||
},
|
||||
"babel-preset-es2015": {
|
||||
"version": "6.24.0",
|
||||
@@ -798,22 +798,22 @@
|
||||
"babel-runtime": {
|
||||
"version": "6.23.0",
|
||||
"from": "babel-runtime@>=6.11.6 <7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz"
|
||||
},
|
||||
"babel-template": {
|
||||
"version": "6.23.0",
|
||||
"from": "babel-template@>=6.23.0 <7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.23.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/babel-template/-/babel-template-6.23.0.tgz"
|
||||
},
|
||||
"babel-traverse": {
|
||||
"version": "6.23.1",
|
||||
"from": "babel-traverse@>=6.23.1 <7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.23.1.tgz"
|
||||
"resolved": "http://registry.npmjs.org/babel-traverse/-/babel-traverse-6.23.1.tgz"
|
||||
},
|
||||
"babel-types": {
|
||||
"version": "6.23.0",
|
||||
"from": "babel-types@>=6.23.0 <7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.23.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/babel-types/-/babel-types-6.23.0.tgz"
|
||||
},
|
||||
"babelify": {
|
||||
"version": "7.3.0",
|
||||
@@ -860,8 +860,8 @@
|
||||
},
|
||||
"basic-auth": {
|
||||
"version": "1.1.0",
|
||||
"from": "basic-auth@>=1.0.4 <2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.1.0.tgz"
|
||||
"from": "basic-auth@>=1.1.0 <1.2.0",
|
||||
"resolved": "http://registry.npmjs.org/basic-auth/-/basic-auth-1.1.0.tgz"
|
||||
},
|
||||
"bcrypt": {
|
||||
"version": "1.0.2",
|
||||
@@ -973,7 +973,7 @@
|
||||
"bluebird": {
|
||||
"version": "3.5.0",
|
||||
"from": "bluebird@>=3.3.5 <4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz"
|
||||
},
|
||||
"bn.js": {
|
||||
"version": "4.11.6",
|
||||
@@ -983,7 +983,7 @@
|
||||
"body-parser": {
|
||||
"version": "1.17.1",
|
||||
"from": "body-parser@>=1.15.0 <2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.17.1.tgz",
|
||||
"resolved": "http://registry.npmjs.org/body-parser/-/body-parser-1.17.1.tgz",
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "2.6.1",
|
||||
@@ -993,7 +993,7 @@
|
||||
"qs": {
|
||||
"version": "6.4.0",
|
||||
"from": "qs@6.4.0",
|
||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/qs/-/qs-6.4.0.tgz"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -1010,7 +1010,7 @@
|
||||
"bootstrap": {
|
||||
"version": "4.0.0-alpha.6",
|
||||
"from": "bootstrap@>=4.0.0-alpha.6 <5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.0.0-alpha.6.tgz"
|
||||
"resolved": "http://registry.npmjs.org/bootstrap/-/bootstrap-4.0.0-alpha.6.tgz"
|
||||
},
|
||||
"bower": {
|
||||
"version": "1.3.12",
|
||||
@@ -1628,7 +1628,7 @@
|
||||
"cached-path-relative": {
|
||||
"version": "1.0.1",
|
||||
"from": "cached-path-relative@>=1.0.0 <2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz"
|
||||
"resolved": "http://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz"
|
||||
},
|
||||
"caller-path": {
|
||||
"version": "0.1.0",
|
||||
@@ -1882,12 +1882,12 @@
|
||||
"cli-cursor": {
|
||||
"version": "2.1.0",
|
||||
"from": "cli-cursor@>=2.1.0 <3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz"
|
||||
},
|
||||
"cli-spinners": {
|
||||
"version": "1.0.0",
|
||||
"from": "cli-spinners@>=1.0.0 <2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.0.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/cli-spinners/-/cli-spinners-1.0.0.tgz"
|
||||
},
|
||||
"cli-width": {
|
||||
"version": "2.1.0",
|
||||
@@ -1915,7 +1915,7 @@
|
||||
"clone-deep": {
|
||||
"version": "0.2.4",
|
||||
"from": "clone-deep@>=0.2.4 <0.3.0",
|
||||
"resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz"
|
||||
"resolved": "http://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz"
|
||||
},
|
||||
"clone-stats": {
|
||||
"version": "0.0.1",
|
||||
@@ -2316,7 +2316,7 @@
|
||||
"qs": {
|
||||
"version": "6.3.2",
|
||||
"from": "qs@>=6.3.0 <6.4.0",
|
||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz",
|
||||
"resolved": "http://registry.npmjs.org/qs/-/qs-6.3.2.tgz",
|
||||
"dev": true
|
||||
},
|
||||
"request": {
|
||||
@@ -2356,7 +2356,7 @@
|
||||
"is-windows": {
|
||||
"version": "1.0.0",
|
||||
"from": "is-windows@>=1.0.0 <2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.0.tgz",
|
||||
"resolved": "http://registry.npmjs.org/is-windows/-/is-windows-1.0.0.tgz",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
@@ -3006,7 +3006,7 @@
|
||||
"detective": {
|
||||
"version": "4.5.0",
|
||||
"from": "detective@>=4.0.0 <5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/detective/-/detective-4.5.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/detective/-/detective-4.5.0.tgz"
|
||||
},
|
||||
"di": {
|
||||
"version": "0.0.1",
|
||||
@@ -3325,7 +3325,7 @@
|
||||
"enhanced-resolve": {
|
||||
"version": "3.1.0",
|
||||
"from": "enhanced-resolve@>=3.0.0 <4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.1.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.1.0.tgz"
|
||||
},
|
||||
"ent": {
|
||||
"version": "2.2.0",
|
||||
@@ -3346,7 +3346,7 @@
|
||||
"error-ex": {
|
||||
"version": "1.3.1",
|
||||
"from": "error-ex@>=1.2.0 <2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz"
|
||||
"resolved": "http://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz"
|
||||
},
|
||||
"es5-ext": {
|
||||
"version": "0.10.15",
|
||||
@@ -3811,7 +3811,7 @@
|
||||
},
|
||||
"express-basic-auth": {
|
||||
"version": "1.0.1",
|
||||
"from": "express-basic-auth@>=1.0.1 <2.0.0",
|
||||
"from": "https://registry.npmjs.org/express-basic-auth/-/express-basic-auth-1.0.1.tgz",
|
||||
"resolved": "https://registry.npmjs.org/express-basic-auth/-/express-basic-auth-1.0.1.tgz"
|
||||
},
|
||||
"express-csv": {
|
||||
@@ -3859,7 +3859,7 @@
|
||||
"extract-text-webpack-plugin": {
|
||||
"version": "2.1.0",
|
||||
"from": "extract-text-webpack-plugin@>=2.0.0-rc.3 <3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-2.1.0.tgz",
|
||||
"resolved": "http://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-2.1.0.tgz",
|
||||
"dependencies": {
|
||||
"async": {
|
||||
"version": "2.2.0",
|
||||
@@ -4029,7 +4029,7 @@
|
||||
"filesize": {
|
||||
"version": "3.5.6",
|
||||
"from": "filesize@>=3.5.4 <4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/filesize/-/filesize-3.5.6.tgz",
|
||||
"resolved": "http://registry.npmjs.org/filesize/-/filesize-3.5.6.tgz",
|
||||
"dev": true
|
||||
},
|
||||
"fill-range": {
|
||||
@@ -4194,7 +4194,7 @@
|
||||
"fs-extra": {
|
||||
"version": "2.0.0",
|
||||
"from": "fs-extra@>=2.0.0 <2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.0.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/fs-extra/-/fs-extra-2.0.0.tgz"
|
||||
},
|
||||
"fs-write-stream-atomic": {
|
||||
"version": "1.0.10",
|
||||
@@ -4244,7 +4244,7 @@
|
||||
"gauge": {
|
||||
"version": "2.7.3",
|
||||
"from": "gauge@>=2.7.1 <2.8.0",
|
||||
"resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.3.tgz"
|
||||
"resolved": "http://registry.npmjs.org/gauge/-/gauge-2.7.3.tgz"
|
||||
},
|
||||
"gaze": {
|
||||
"version": "0.5.2",
|
||||
@@ -4421,7 +4421,7 @@
|
||||
"globby": {
|
||||
"version": "6.1.0",
|
||||
"from": "globby@>=6.1.0 <7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
|
||||
"resolved": "http://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
|
||||
"dependencies": {
|
||||
"glob": {
|
||||
"version": "7.1.1",
|
||||
@@ -5327,7 +5327,7 @@
|
||||
"har-schema": {
|
||||
"version": "1.0.5",
|
||||
"from": "har-schema@>=1.0.5 <2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz"
|
||||
"resolved": "http://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz"
|
||||
},
|
||||
"har-validator": {
|
||||
"version": "2.0.6",
|
||||
@@ -5507,7 +5507,7 @@
|
||||
"http-errors": {
|
||||
"version": "1.6.1",
|
||||
"from": "http-errors@>=1.6.1 <1.7.0",
|
||||
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz"
|
||||
"resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz"
|
||||
},
|
||||
"http-proxy": {
|
||||
"version": "1.16.2",
|
||||
@@ -5524,7 +5524,7 @@
|
||||
"http-proxy-middleware": {
|
||||
"version": "0.17.4",
|
||||
"from": "http-proxy-middleware@>=0.17.0 <0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz",
|
||||
"resolved": "http://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"is-extglob": {
|
||||
@@ -5785,7 +5785,7 @@
|
||||
"sax": {
|
||||
"version": "1.2.2",
|
||||
"from": "sax@>=1.2.1 <1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.2.tgz",
|
||||
"resolved": "http://registry.npmjs.org/sax/-/sax-1.2.2.tgz",
|
||||
"optional": true
|
||||
},
|
||||
"svgo": {
|
||||
@@ -5826,7 +5826,7 @@
|
||||
"in-publish": {
|
||||
"version": "2.0.0",
|
||||
"from": "in-publish@>=2.0.0 <3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz"
|
||||
},
|
||||
"indent-string": {
|
||||
"version": "2.1.0",
|
||||
@@ -6011,7 +6011,7 @@
|
||||
"ip": {
|
||||
"version": "1.1.5",
|
||||
"from": "ip@>=1.1.2 <2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz"
|
||||
"resolved": "http://registry.npmjs.org/ip/-/ip-1.1.5.tgz"
|
||||
},
|
||||
"ip-regex": {
|
||||
"version": "1.0.3",
|
||||
@@ -6172,12 +6172,12 @@
|
||||
"is-plain-object": {
|
||||
"version": "2.0.1",
|
||||
"from": "is-plain-object@>=2.0.1 <3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.1.tgz",
|
||||
"resolved": "http://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.1.tgz",
|
||||
"dependencies": {
|
||||
"isobject": {
|
||||
"version": "1.0.2",
|
||||
"from": "isobject@>=1.0.0 <2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/isobject/-/isobject-1.0.2.tgz"
|
||||
"resolved": "http://registry.npmjs.org/isobject/-/isobject-1.0.2.tgz"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -6559,7 +6559,7 @@
|
||||
"js-yaml": {
|
||||
"version": "3.8.2",
|
||||
"from": "js-yaml@>=3.1.0 <4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.8.2.tgz",
|
||||
"resolved": "http://registry.npmjs.org/js-yaml/-/js-yaml-3.8.2.tgz",
|
||||
"dependencies": {
|
||||
"esprima": {
|
||||
"version": "3.1.3",
|
||||
@@ -6576,7 +6576,7 @@
|
||||
"jsbn": {
|
||||
"version": "0.1.1",
|
||||
"from": "jsbn@>=0.1.0 <0.2.0",
|
||||
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
|
||||
"resolved": "http://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
|
||||
"optional": true
|
||||
},
|
||||
"jsesc": {
|
||||
@@ -6669,7 +6669,7 @@
|
||||
"kareem": {
|
||||
"version": "1.2.1",
|
||||
"from": "kareem@1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/kareem/-/kareem-1.2.1.tgz"
|
||||
"resolved": "http://registry.npmjs.org/kareem/-/kareem-1.2.1.tgz"
|
||||
},
|
||||
"karma": {
|
||||
"version": "1.5.0",
|
||||
@@ -6892,7 +6892,7 @@
|
||||
"karma-sinon-stub-promise": {
|
||||
"version": "1.0.0",
|
||||
"from": "karma-sinon-stub-promise@>=1.0.0 <2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/karma-sinon-stub-promise/-/karma-sinon-stub-promise-1.0.0.tgz",
|
||||
"resolved": "http://registry.npmjs.org/karma-sinon-stub-promise/-/karma-sinon-stub-promise-1.0.0.tgz",
|
||||
"dev": true
|
||||
},
|
||||
"karma-sourcemap-loader": {
|
||||
@@ -7350,7 +7350,7 @@
|
||||
},
|
||||
"lodash.clone": {
|
||||
"version": "3.0.3",
|
||||
"from": "lodash.clone@3.0.3",
|
||||
"from": "lodash.clone@>=3.0.3 <4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-3.0.3.tgz",
|
||||
"dev": true
|
||||
},
|
||||
@@ -7361,7 +7361,7 @@
|
||||
},
|
||||
"lodash.create": {
|
||||
"version": "3.1.1",
|
||||
"from": "lodash.create@3.1.1",
|
||||
"from": "lodash.create@>=3.1.1 <4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz"
|
||||
},
|
||||
"lodash.debounce": {
|
||||
@@ -7462,7 +7462,7 @@
|
||||
"lodash.mergewith": {
|
||||
"version": "4.6.0",
|
||||
"from": "lodash.mergewith@>=4.6.0 <5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz"
|
||||
},
|
||||
"lodash.now": {
|
||||
"version": "2.4.1",
|
||||
@@ -7488,7 +7488,7 @@
|
||||
"lodash.tail": {
|
||||
"version": "4.1.1",
|
||||
"from": "lodash.tail@>=4.1.1 <5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz"
|
||||
"resolved": "http://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz"
|
||||
},
|
||||
"lodash.template": {
|
||||
"version": "3.6.2",
|
||||
@@ -7641,7 +7641,7 @@
|
||||
"markdown-it": {
|
||||
"version": "8.3.1",
|
||||
"from": "markdown-it@>=8.2.2 <9.0.0",
|
||||
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.3.1.tgz"
|
||||
"resolved": "http://registry.npmjs.org/markdown-it/-/markdown-it-8.3.1.tgz"
|
||||
},
|
||||
"markdown-it-emoji": {
|
||||
"version": "1.3.0",
|
||||
@@ -7810,12 +7810,12 @@
|
||||
"mixin-object": {
|
||||
"version": "2.0.1",
|
||||
"from": "mixin-object@>=2.0.1 <3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz",
|
||||
"resolved": "http://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz",
|
||||
"dependencies": {
|
||||
"for-in": {
|
||||
"version": "0.1.8",
|
||||
"from": "for-in@>=0.1.3 <0.2.0",
|
||||
"resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz"
|
||||
"resolved": "http://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -7896,7 +7896,7 @@
|
||||
"module-deps": {
|
||||
"version": "4.1.1",
|
||||
"from": "module-deps@>=4.0.2 <5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/module-deps/-/module-deps-4.1.1.tgz"
|
||||
"resolved": "http://registry.npmjs.org/module-deps/-/module-deps-4.1.1.tgz"
|
||||
},
|
||||
"moment": {
|
||||
"version": "2.18.1",
|
||||
@@ -7962,7 +7962,7 @@
|
||||
"morgan": {
|
||||
"version": "1.8.1",
|
||||
"from": "morgan@>=1.7.0 <2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/morgan/-/morgan-1.8.1.tgz",
|
||||
"resolved": "http://registry.npmjs.org/morgan/-/morgan-1.8.1.tgz",
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "2.6.1",
|
||||
@@ -8048,7 +8048,7 @@
|
||||
"muri": {
|
||||
"version": "1.2.1",
|
||||
"from": "muri@1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/muri/-/muri-1.2.1.tgz"
|
||||
"resolved": "http://registry.npmjs.org/muri/-/muri-1.2.1.tgz"
|
||||
},
|
||||
"mute-stream": {
|
||||
"version": "0.0.4",
|
||||
@@ -8214,7 +8214,7 @@
|
||||
"node-forge": {
|
||||
"version": "0.6.49",
|
||||
"from": "node-forge@>=0.6.20 <0.7.0",
|
||||
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.6.49.tgz"
|
||||
"resolved": "http://registry.npmjs.org/node-forge/-/node-forge-0.6.49.tgz"
|
||||
},
|
||||
"node-gcm": {
|
||||
"version": "0.14.5",
|
||||
@@ -8314,6 +8314,38 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"node-loggly-bulk": {
|
||||
"version": "1.1.3",
|
||||
"from": "node-loggly-bulk@>=1.1.0 <1.2.0",
|
||||
"resolved": "http://registry.npmjs.org/node-loggly-bulk/-/node-loggly-bulk-1.1.3.tgz",
|
||||
"dependencies": {
|
||||
"bl": {
|
||||
"version": "1.0.3",
|
||||
"from": "bl@>=1.0.0 <1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/bl/-/bl-1.0.3.tgz"
|
||||
},
|
||||
"node-uuid": {
|
||||
"version": "1.4.8",
|
||||
"from": "node-uuid@>=1.4.7 <1.5.0",
|
||||
"resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz"
|
||||
},
|
||||
"qs": {
|
||||
"version": "5.2.1",
|
||||
"from": "qs@>=5.2.0 <5.3.0",
|
||||
"resolved": "https://registry.npmjs.org/qs/-/qs-5.2.1.tgz"
|
||||
},
|
||||
"request": {
|
||||
"version": "2.67.0",
|
||||
"from": "request@>=2.67.0 <2.68.0",
|
||||
"resolved": "https://registry.npmjs.org/request/-/request-2.67.0.tgz"
|
||||
},
|
||||
"tough-cookie": {
|
||||
"version": "2.2.2",
|
||||
"from": "tough-cookie@>=2.2.0 <2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.2.tgz"
|
||||
}
|
||||
}
|
||||
},
|
||||
"node-pre-gyp": {
|
||||
"version": "0.6.32",
|
||||
"from": "node-pre-gyp@0.6.32",
|
||||
@@ -8322,7 +8354,7 @@
|
||||
"caseless": {
|
||||
"version": "0.12.0",
|
||||
"from": "caseless@>=0.12.0 <0.13.0",
|
||||
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz"
|
||||
},
|
||||
"form-data": {
|
||||
"version": "2.1.2",
|
||||
@@ -8336,8 +8368,8 @@
|
||||
},
|
||||
"har-validator": {
|
||||
"version": "4.2.1",
|
||||
"from": "har-validator@>=4.2.1 <4.3.0",
|
||||
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz"
|
||||
"from": "har-validator@>=4.2.0 <4.3.0",
|
||||
"resolved": "http://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz"
|
||||
},
|
||||
"qs": {
|
||||
"version": "6.4.0",
|
||||
@@ -8389,7 +8421,7 @@
|
||||
"gaze": {
|
||||
"version": "1.1.2",
|
||||
"from": "gaze@>=1.0.0 <2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz"
|
||||
"resolved": "http://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz"
|
||||
},
|
||||
"glob": {
|
||||
"version": "7.1.1",
|
||||
@@ -8399,7 +8431,7 @@
|
||||
"globule": {
|
||||
"version": "1.1.0",
|
||||
"from": "globule@>=1.0.0 <2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/globule/-/globule-1.1.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/globule/-/globule-1.1.0.tgz"
|
||||
},
|
||||
"har-validator": {
|
||||
"version": "4.2.1",
|
||||
@@ -8697,7 +8729,7 @@
|
||||
"object-hash": {
|
||||
"version": "1.1.7",
|
||||
"from": "object-hash@>=1.1.4 <2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.1.7.tgz",
|
||||
"resolved": "http://registry.npmjs.org/object-hash/-/object-hash-1.1.7.tgz",
|
||||
"dev": true
|
||||
},
|
||||
"object-inspect": {
|
||||
@@ -9030,12 +9062,12 @@
|
||||
"passport": {
|
||||
"version": "0.3.2",
|
||||
"from": "passport@>=0.3.2 <0.4.0",
|
||||
"resolved": "https://registry.npmjs.org/passport/-/passport-0.3.2.tgz"
|
||||
"resolved": "http://registry.npmjs.org/passport/-/passport-0.3.2.tgz"
|
||||
},
|
||||
"passport-facebook": {
|
||||
"version": "2.1.1",
|
||||
"from": "passport-facebook@>=2.0.0 <3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/passport-facebook/-/passport-facebook-2.1.1.tgz"
|
||||
"resolved": "http://registry.npmjs.org/passport-facebook/-/passport-facebook-2.1.1.tgz"
|
||||
},
|
||||
"passport-google-oauth20": {
|
||||
"version": "1.0.0",
|
||||
@@ -9148,7 +9180,7 @@
|
||||
"performance-now": {
|
||||
"version": "0.2.0",
|
||||
"from": "performance-now@>=0.2.0 <0.3.0",
|
||||
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz"
|
||||
},
|
||||
"phantom-bridge": {
|
||||
"version": "2.0.1",
|
||||
@@ -9178,7 +9210,7 @@
|
||||
"qs": {
|
||||
"version": "6.3.2",
|
||||
"from": "qs@>=6.3.0 <6.4.0",
|
||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz"
|
||||
"resolved": "http://registry.npmjs.org/qs/-/qs-6.3.2.tgz"
|
||||
},
|
||||
"request": {
|
||||
"version": "2.79.0",
|
||||
@@ -9257,7 +9289,7 @@
|
||||
"pkginfo": {
|
||||
"version": "0.4.0",
|
||||
"from": "pkginfo@>=0.4.0 <0.5.0",
|
||||
"resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/pkginfo/-/pkginfo-0.4.0.tgz"
|
||||
},
|
||||
"plur": {
|
||||
"version": "2.1.2",
|
||||
@@ -9277,8 +9309,8 @@
|
||||
},
|
||||
"postcss": {
|
||||
"version": "5.2.16",
|
||||
"from": "postcss@>=5.2.16 <6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.16.tgz",
|
||||
"from": "postcss@>=5.2.15 <6.0.0",
|
||||
"resolved": "http://registry.npmjs.org/postcss/-/postcss-5.2.16.tgz",
|
||||
"dependencies": {
|
||||
"supports-color": {
|
||||
"version": "3.2.3",
|
||||
@@ -9295,12 +9327,12 @@
|
||||
"postcss-colormin": {
|
||||
"version": "2.2.2",
|
||||
"from": "postcss-colormin@>=2.1.8 <3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz"
|
||||
"resolved": "http://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz"
|
||||
},
|
||||
"postcss-convert-values": {
|
||||
"version": "2.6.1",
|
||||
"from": "postcss-convert-values@>=2.3.4 <3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz"
|
||||
"resolved": "http://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz"
|
||||
},
|
||||
"postcss-discard-comments": {
|
||||
"version": "2.0.4",
|
||||
@@ -9330,7 +9362,7 @@
|
||||
"postcss-easy-import": {
|
||||
"version": "2.0.0",
|
||||
"from": "postcss-easy-import@>=2.0.0 <3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/postcss-easy-import/-/postcss-easy-import-2.0.0.tgz",
|
||||
"resolved": "http://registry.npmjs.org/postcss-easy-import/-/postcss-easy-import-2.0.0.tgz",
|
||||
"dependencies": {
|
||||
"is-extglob": {
|
||||
"version": "2.1.1",
|
||||
@@ -9352,22 +9384,22 @@
|
||||
"postcss-import": {
|
||||
"version": "9.1.0",
|
||||
"from": "postcss-import@>=9.1.0 <10.0.0",
|
||||
"resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-9.1.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/postcss-import/-/postcss-import-9.1.0.tgz"
|
||||
},
|
||||
"postcss-load-config": {
|
||||
"version": "1.2.0",
|
||||
"from": "postcss-load-config@>=1.1.0 <2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz"
|
||||
},
|
||||
"postcss-load-options": {
|
||||
"version": "1.2.0",
|
||||
"from": "postcss-load-options@>=1.2.0 <2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz"
|
||||
},
|
||||
"postcss-load-plugins": {
|
||||
"version": "2.3.0",
|
||||
"from": "postcss-load-plugins@>=2.3.0 <3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz"
|
||||
},
|
||||
"postcss-merge-idents": {
|
||||
"version": "2.1.7",
|
||||
@@ -9547,7 +9579,7 @@
|
||||
"private": {
|
||||
"version": "0.1.7",
|
||||
"from": "private@>=0.1.6 <0.2.0",
|
||||
"resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz"
|
||||
"resolved": "http://registry.npmjs.org/private/-/private-0.1.7.tgz"
|
||||
},
|
||||
"process": {
|
||||
"version": "0.11.9",
|
||||
@@ -9646,7 +9678,7 @@
|
||||
},
|
||||
"proxy-agent": {
|
||||
"version": "2.0.0",
|
||||
"from": "proxy-agent@2.0.0",
|
||||
"from": "proxy-agent@>=2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-2.0.0.tgz",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
@@ -9681,7 +9713,7 @@
|
||||
"pug": {
|
||||
"version": "2.0.0-beta11",
|
||||
"from": "pug@>=2.0.0-beta11 <3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/pug/-/pug-2.0.0-beta11.tgz"
|
||||
"resolved": "http://registry.npmjs.org/pug/-/pug-2.0.0-beta11.tgz"
|
||||
},
|
||||
"pug-attrs": {
|
||||
"version": "2.0.2",
|
||||
@@ -9725,7 +9757,7 @@
|
||||
"pug-filters": {
|
||||
"version": "2.1.1",
|
||||
"from": "pug-filters@>=2.1.1 <3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-2.1.1.tgz",
|
||||
"resolved": "http://registry.npmjs.org/pug-filters/-/pug-filters-2.1.1.tgz",
|
||||
"dependencies": {
|
||||
"asap": {
|
||||
"version": "2.0.5",
|
||||
@@ -9774,7 +9806,7 @@
|
||||
"pug-lexer": {
|
||||
"version": "3.0.0",
|
||||
"from": "pug-lexer@>=3.0.0 <4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-3.0.0.tgz",
|
||||
"resolved": "http://registry.npmjs.org/pug-lexer/-/pug-lexer-3.0.0.tgz",
|
||||
"dependencies": {
|
||||
"character-parser": {
|
||||
"version": "2.2.0",
|
||||
@@ -9786,12 +9818,12 @@
|
||||
"pug-linker": {
|
||||
"version": "2.0.2",
|
||||
"from": "pug-linker@>=2.0.2 <3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-2.0.2.tgz"
|
||||
"resolved": "http://registry.npmjs.org/pug-linker/-/pug-linker-2.0.2.tgz"
|
||||
},
|
||||
"pug-load": {
|
||||
"version": "2.0.5",
|
||||
"from": "pug-load@>=2.0.5 <3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.5.tgz"
|
||||
"resolved": "http://registry.npmjs.org/pug-load/-/pug-load-2.0.5.tgz"
|
||||
},
|
||||
"pug-parser": {
|
||||
"version": "2.0.2",
|
||||
@@ -9811,7 +9843,7 @@
|
||||
"pug-walk": {
|
||||
"version": "1.1.1",
|
||||
"from": "pug-walk@>=1.1.1 <2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.1.tgz"
|
||||
"resolved": "http://registry.npmjs.org/pug-walk/-/pug-walk-1.1.1.tgz"
|
||||
},
|
||||
"pump": {
|
||||
"version": "0.3.5",
|
||||
@@ -9854,12 +9886,12 @@
|
||||
"qs": {
|
||||
"version": "6.2.3",
|
||||
"from": "qs@>=6.2.0 <6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz"
|
||||
"resolved": "http://registry.npmjs.org/qs/-/qs-6.2.3.tgz"
|
||||
},
|
||||
"query-string": {
|
||||
"version": "4.3.2",
|
||||
"from": "query-string@>=4.1.0 <5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.2.tgz"
|
||||
"resolved": "http://registry.npmjs.org/query-string/-/query-string-4.3.2.tgz"
|
||||
},
|
||||
"querystring": {
|
||||
"version": "0.2.0",
|
||||
@@ -10262,7 +10294,7 @@
|
||||
"restore-cursor": {
|
||||
"version": "2.0.0",
|
||||
"from": "restore-cursor@>=2.0.0 <3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
|
||||
"resolved": "http://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
|
||||
"dependencies": {
|
||||
"onetime": {
|
||||
"version": "2.0.1",
|
||||
@@ -10345,7 +10377,7 @@
|
||||
"sass-graph": {
|
||||
"version": "2.1.2",
|
||||
"from": "sass-graph@>=2.1.1 <3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.1.2.tgz",
|
||||
"resolved": "http://registry.npmjs.org/sass-graph/-/sass-graph-2.1.2.tgz",
|
||||
"dependencies": {
|
||||
"cliui": {
|
||||
"version": "3.2.0",
|
||||
@@ -10589,7 +10621,7 @@
|
||||
"setprototypeof": {
|
||||
"version": "1.0.3",
|
||||
"from": "setprototypeof@1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz"
|
||||
"resolved": "http://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz"
|
||||
},
|
||||
"sha.js": {
|
||||
"version": "2.4.8",
|
||||
@@ -10599,17 +10631,17 @@
|
||||
"shallow-clone": {
|
||||
"version": "0.1.2",
|
||||
"from": "shallow-clone@>=0.1.2 <0.2.0",
|
||||
"resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz",
|
||||
"resolved": "http://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz",
|
||||
"dependencies": {
|
||||
"kind-of": {
|
||||
"version": "2.0.1",
|
||||
"from": "kind-of@>=2.0.1 <3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz"
|
||||
"resolved": "http://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz"
|
||||
},
|
||||
"lazy-cache": {
|
||||
"version": "0.2.7",
|
||||
"from": "lazy-cache@>=0.2.3 <0.3.0",
|
||||
"resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz"
|
||||
"resolved": "http://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -10942,7 +10974,7 @@
|
||||
"sshpk": {
|
||||
"version": "1.11.0",
|
||||
"from": "sshpk@>=1.7.0 <2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.11.0.tgz",
|
||||
"resolved": "http://registry.npmjs.org/sshpk/-/sshpk-1.11.0.tgz",
|
||||
"dependencies": {
|
||||
"assert-plus": {
|
||||
"version": "1.0.0",
|
||||
@@ -11048,7 +11080,7 @@
|
||||
"stdout-stream": {
|
||||
"version": "1.4.0",
|
||||
"from": "stdout-stream@>=1.4.0 <2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz"
|
||||
},
|
||||
"stream-browserify": {
|
||||
"version": "2.0.1",
|
||||
@@ -11332,14 +11364,14 @@
|
||||
"sax": {
|
||||
"version": "1.2.2",
|
||||
"from": "sax@>=1.2.1 <1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.2.tgz"
|
||||
"resolved": "http://registry.npmjs.org/sax/-/sax-1.2.2.tgz"
|
||||
}
|
||||
}
|
||||
},
|
||||
"syntax-error": {
|
||||
"version": "1.3.0",
|
||||
"from": "syntax-error@>=1.1.1 <2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.3.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/syntax-error/-/syntax-error-1.3.0.tgz"
|
||||
},
|
||||
"table": {
|
||||
"version": "3.8.3",
|
||||
@@ -11463,7 +11495,7 @@
|
||||
"tether": {
|
||||
"version": "1.4.0",
|
||||
"from": "tether@>=1.4.0 <2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/tether/-/tether-1.4.0.tgz"
|
||||
"resolved": "http://registry.npmjs.org/tether/-/tether-1.4.0.tgz"
|
||||
},
|
||||
"text-table": {
|
||||
"version": "0.2.0",
|
||||
@@ -11541,6 +11573,11 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"timespan": {
|
||||
"version": "2.3.0",
|
||||
"from": "timespan@>=2.3.0 <2.4.0",
|
||||
"resolved": "http://registry.npmjs.org/timespan/-/timespan-2.3.0.tgz"
|
||||
},
|
||||
"tiny-lr-fork": {
|
||||
"version": "0.0.5",
|
||||
"from": "tiny-lr-fork@0.0.5",
|
||||
@@ -11592,7 +11629,7 @@
|
||||
"toposort": {
|
||||
"version": "1.0.3",
|
||||
"from": "toposort@>=1.0.0 <2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.3.tgz"
|
||||
"resolved": "http://registry.npmjs.org/toposort/-/toposort-1.0.3.tgz"
|
||||
},
|
||||
"touch": {
|
||||
"version": "0.0.2",
|
||||
@@ -11671,7 +11708,7 @@
|
||||
"trim-right": {
|
||||
"version": "1.0.1",
|
||||
"from": "trim-right@>=1.0.1 <2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz"
|
||||
"resolved": "http://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz"
|
||||
},
|
||||
"tryit": {
|
||||
"version": "1.0.3",
|
||||
@@ -12314,7 +12351,7 @@
|
||||
},
|
||||
"watchpack": {
|
||||
"version": "1.3.1",
|
||||
"from": "watchpack@>=1.3.1 <2.0.0",
|
||||
"from": "watchpack@>=1.2.0 <2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.3.1.tgz",
|
||||
"dependencies": {
|
||||
"async": {
|
||||
@@ -12440,7 +12477,7 @@
|
||||
"webpack-merge": {
|
||||
"version": "2.6.1",
|
||||
"from": "webpack-merge@>=2.6.1 <3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-2.6.1.tgz"
|
||||
"resolved": "http://registry.npmjs.org/webpack-merge/-/webpack-merge-2.6.1.tgz"
|
||||
},
|
||||
"webpack-sources": {
|
||||
"version": "0.1.5",
|
||||
@@ -12489,6 +12526,11 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"winston-loggly-bulk": {
|
||||
"version": "1.4.2",
|
||||
"from": "winston-loggly-bulk@>=1.4.2 <2.0.0",
|
||||
"resolved": "http://registry.npmjs.org/winston-loggly-bulk/-/winston-loggly-bulk-1.4.2.tgz"
|
||||
},
|
||||
"with": {
|
||||
"version": "4.0.3",
|
||||
"from": "with@>=4.0.0 <4.1.0",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "habitica",
|
||||
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
|
||||
"version": "3.88.0",
|
||||
"version": "3.90.1",
|
||||
"main": "./website/server/index.js",
|
||||
"dependencies": {
|
||||
"@slack/client": "^3.8.1",
|
||||
@@ -124,6 +124,7 @@
|
||||
"webpack": "^2.2.1",
|
||||
"webpack-merge": "^2.6.1",
|
||||
"winston": "^2.1.0",
|
||||
"winston-loggly-bulk": "^1.4.2",
|
||||
"xml2js": "^0.4.4"
|
||||
},
|
||||
"private": true,
|
||||
|
||||
@@ -4,11 +4,17 @@ import {
|
||||
sleep,
|
||||
server,
|
||||
} from '../../../../helpers/api-v3-integration.helper';
|
||||
import {
|
||||
SPAM_MESSAGE_LIMIT,
|
||||
SPAM_MIN_EXEMPT_CONTRIB_LEVEL,
|
||||
TAVERN_ID,
|
||||
} from '../../../../../website/server/models/group';
|
||||
import { v4 as generateUUID } from 'uuid';
|
||||
|
||||
describe('POST /chat', () => {
|
||||
let user, groupWithChat, userWithChatRevoked, member;
|
||||
let user, groupWithChat, member, additionalMember;
|
||||
let testMessage = 'Test Message';
|
||||
let testBannedWordMessage = 'TEST_PLACEHOLDER_SWEAR_WORD_HERE';
|
||||
|
||||
before(async () => {
|
||||
let { group, groupLeader, members } = await createAndPopulateGroup({
|
||||
@@ -22,8 +28,8 @@ describe('POST /chat', () => {
|
||||
|
||||
user = groupLeader;
|
||||
groupWithChat = group;
|
||||
userWithChatRevoked = await members[0].update({'flags.chatRevoked': true});
|
||||
member = members[0];
|
||||
additionalMember = members[1];
|
||||
});
|
||||
|
||||
it('Returns an error when no message is provided', async () => {
|
||||
@@ -62,6 +68,7 @@ describe('POST /chat', () => {
|
||||
});
|
||||
|
||||
it('returns an error when chat privileges are revoked when sending a message to a public guild', async () => {
|
||||
let userWithChatRevoked = await member.update({'flags.chatRevoked': true});
|
||||
await expect(userWithChatRevoked.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage})).to.eventually.be.rejected.and.eql({
|
||||
code: 404,
|
||||
error: 'NotFound',
|
||||
@@ -69,6 +76,96 @@ describe('POST /chat', () => {
|
||||
});
|
||||
});
|
||||
|
||||
context('banned word', () => {
|
||||
it('returns an error when chat message contains a banned word in tavern', async () => {
|
||||
await expect(user.post('/groups/habitrpg/chat', { message: testBannedWordMessage}))
|
||||
.to.eventually.be.rejected.and.eql({
|
||||
code: 400,
|
||||
error: 'BadRequest',
|
||||
message: t('bannedWordUsed'),
|
||||
});
|
||||
});
|
||||
|
||||
it('errors when word is part of a phrase', async () => {
|
||||
let wordInPhrase = `phrase ${testBannedWordMessage} end`;
|
||||
await expect(user.post('/groups/habitrpg/chat', { message: wordInPhrase}))
|
||||
.to.eventually.be.rejected.and.eql({
|
||||
code: 400,
|
||||
error: 'BadRequest',
|
||||
message: t('bannedWordUsed'),
|
||||
});
|
||||
});
|
||||
|
||||
it('errors when word is surrounded by non alphabet characters', async () => {
|
||||
let wordInPhrase = `_!${testBannedWordMessage}@_`;
|
||||
await expect(user.post('/groups/habitrpg/chat', { message: wordInPhrase}))
|
||||
.to.eventually.be.rejected.and.eql({
|
||||
code: 400,
|
||||
error: 'BadRequest',
|
||||
message: t('bannedWordUsed'),
|
||||
});
|
||||
});
|
||||
|
||||
it('does not error when bad word is suffix of a word', async () => {
|
||||
let wordAsSuffix = `prefix${testBannedWordMessage}`;
|
||||
let message = await user.post('/groups/habitrpg/chat', { message: wordAsSuffix});
|
||||
|
||||
expect(message.message.id).to.exist;
|
||||
});
|
||||
|
||||
it('does not error when bad word is prefix of a word', async () => {
|
||||
let wordAsPrefix = `${testBannedWordMessage}suffix`;
|
||||
let message = await user.post('/groups/habitrpg/chat', { message: wordAsPrefix});
|
||||
|
||||
expect(message.message.id).to.exist;
|
||||
});
|
||||
|
||||
it('does not error when sending a chat message containing a banned word to a party', async () => {
|
||||
let { group, members } = await createAndPopulateGroup({
|
||||
groupDetails: {
|
||||
name: 'Party',
|
||||
type: 'party',
|
||||
privacy: 'private',
|
||||
},
|
||||
members: 1,
|
||||
});
|
||||
|
||||
let message = await members[0].post(`/groups/${group._id}/chat`, { message: testBannedWordMessage});
|
||||
|
||||
expect(message.message.id).to.exist;
|
||||
});
|
||||
|
||||
it('does not error when sending a chat message containing a banned word to a public guild', async () => {
|
||||
let { group, members } = await createAndPopulateGroup({
|
||||
groupDetails: {
|
||||
name: 'public guild',
|
||||
type: 'guild',
|
||||
privacy: 'public',
|
||||
},
|
||||
members: 1,
|
||||
});
|
||||
|
||||
let message = await members[0].post(`/groups/${group._id}/chat`, { message: testBannedWordMessage});
|
||||
|
||||
expect(message.message.id).to.exist;
|
||||
});
|
||||
|
||||
it('does not error when sending a chat message containing a banned word to a private guild', async () => {
|
||||
let { group, members } = await createAndPopulateGroup({
|
||||
groupDetails: {
|
||||
name: 'private guild',
|
||||
type: 'guild',
|
||||
privacy: 'private',
|
||||
},
|
||||
members: 1,
|
||||
});
|
||||
|
||||
let message = await members[0].post(`/groups/${group._id}/chat`, { message: testBannedWordMessage});
|
||||
|
||||
expect(message.message.id).to.exist;
|
||||
});
|
||||
});
|
||||
|
||||
it('does not error when sending a message to a private guild with a user with revoked chat', async () => {
|
||||
let { group, members } = await createAndPopulateGroup({
|
||||
groupDetails: {
|
||||
@@ -173,4 +270,30 @@ describe('POST /chat', () => {
|
||||
expect(message.message.id).to.exist;
|
||||
expect(memberWithNotification.newMessages[`${group._id}`]).to.exist;
|
||||
});
|
||||
|
||||
context('Spam prevention', () => {
|
||||
it('Returns an error when the user has been posting too many messages', async () => {
|
||||
// Post as many messages are needed to reach the spam limit
|
||||
for (let i = 0; i < SPAM_MESSAGE_LIMIT; i++) {
|
||||
let result = await additionalMember.post(`/groups/${TAVERN_ID}/chat`, { message: testMessage }); // eslint-disable-line no-await-in-loop
|
||||
expect(result.message.id).to.exist;
|
||||
}
|
||||
|
||||
await expect(additionalMember.post(`/groups/${TAVERN_ID}/chat`, { message: testMessage })).to.eventually.be.rejected.and.eql({
|
||||
code: 401,
|
||||
error: 'NotAuthorized',
|
||||
message: t('messageGroupChatSpam'),
|
||||
});
|
||||
});
|
||||
|
||||
it('contributor should not receive spam alert', async () => {
|
||||
let userSocialite = await member.update({'contributor.level': SPAM_MIN_EXEMPT_CONTRIB_LEVEL, 'flags.chatRevoked': false});
|
||||
|
||||
// Post 1 more message than the spam limit to ensure they do not reach the limit
|
||||
for (let i = 0; i < SPAM_MESSAGE_LIMIT + 1; i++) {
|
||||
let result = await userSocialite.post(`/groups/${TAVERN_ID}/chat`, { message: testMessage }); // eslint-disable-line no-await-in-loop
|
||||
expect(result.message.id).to.exist;
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -0,0 +1,93 @@
|
||||
import {
|
||||
createAndPopulateGroup,
|
||||
translate as t,
|
||||
} from '../../../../helpers/api-v3-integration.helper';
|
||||
import { find } from 'lodash';
|
||||
|
||||
describe('POST /group/:groupId/remove-manager', () => {
|
||||
let leader, nonLeader, groupToUpdate;
|
||||
let groupName = 'Test Public Guild';
|
||||
let groupType = 'guild';
|
||||
let nonManager;
|
||||
|
||||
function findAssignedTask (memberTask) {
|
||||
return memberTask.group.id === groupToUpdate._id;
|
||||
}
|
||||
|
||||
beforeEach(async () => {
|
||||
let { group, groupLeader, members } = await createAndPopulateGroup({
|
||||
groupDetails: {
|
||||
name: groupName,
|
||||
type: groupType,
|
||||
privacy: 'public',
|
||||
},
|
||||
members: 1,
|
||||
});
|
||||
|
||||
groupToUpdate = group;
|
||||
leader = groupLeader;
|
||||
nonLeader = members[0];
|
||||
nonManager = members[0];
|
||||
});
|
||||
|
||||
it('returns an error when a non group leader tries to add member', async () => {
|
||||
await expect(nonLeader.post(`/groups/${groupToUpdate._id}/remove-manager`, {
|
||||
managerId: nonLeader._id,
|
||||
})).to.eventually.be.rejected.and.eql({
|
||||
code: 401,
|
||||
error: 'NotAuthorized',
|
||||
message: t('messageGroupOnlyLeaderCanUpdate'),
|
||||
});
|
||||
});
|
||||
|
||||
it('returns an error when manager does not exist', async () => {
|
||||
await expect(leader.post(`/groups/${groupToUpdate._id}/remove-manager`, {
|
||||
managerId: nonManager._id,
|
||||
})).to.eventually.be.rejected.and.eql({
|
||||
code: 401,
|
||||
error: 'NotAuthorized',
|
||||
message: t('userIsNotManager'),
|
||||
});
|
||||
});
|
||||
|
||||
it('allows a leader to remove managers', async () => {
|
||||
await leader.post(`/groups/${groupToUpdate._id}/add-manager`, {
|
||||
managerId: nonLeader._id,
|
||||
});
|
||||
|
||||
let updatedGroup = await leader.post(`/groups/${groupToUpdate._id}/remove-manager`, {
|
||||
managerId: nonLeader._id,
|
||||
});
|
||||
|
||||
expect(updatedGroup.managers[nonLeader._id]).to.not.exist;
|
||||
});
|
||||
|
||||
it('removes group approval notifications from a manager that is removed', async () => {
|
||||
await leader.post(`/groups/${groupToUpdate._id}/add-manager`, {
|
||||
managerId: nonLeader._id,
|
||||
});
|
||||
let task = await leader.post(`/tasks/group/${groupToUpdate._id}`, {
|
||||
text: 'test todo',
|
||||
type: 'todo',
|
||||
requiresApproval: true,
|
||||
});
|
||||
await nonLeader.post(`/tasks/${task._id}/assign/${leader._id}`);
|
||||
let memberTasks = await leader.get('/tasks/user');
|
||||
let syncedTask = find(memberTasks, findAssignedTask);
|
||||
await expect(leader.post(`/tasks/${syncedTask._id}/score/up`))
|
||||
.to.eventually.be.rejected.and.to.eql({
|
||||
code: 401,
|
||||
error: 'NotAuthorized',
|
||||
message: t('taskApprovalHasBeenRequested'),
|
||||
});
|
||||
|
||||
let updatedGroup = await leader.post(`/groups/${groupToUpdate._id}/remove-manager`, {
|
||||
managerId: nonLeader._id,
|
||||
});
|
||||
|
||||
await nonLeader.sync();
|
||||
|
||||
expect(nonLeader.notifications.length).to.equal(0);
|
||||
expect(updatedGroup.managers[nonLeader._id]).to.not.exist;
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,85 @@
|
||||
import {
|
||||
generateUser,
|
||||
createAndPopulateGroup,
|
||||
translate as t,
|
||||
} from '../../../../helpers/api-v3-integration.helper';
|
||||
|
||||
describe('POST /group/:groupId/add-manager', () => {
|
||||
let leader, nonLeader, groupToUpdate;
|
||||
let groupName = 'Test Public Guild';
|
||||
let groupType = 'guild';
|
||||
let nonMember;
|
||||
|
||||
context('Guilds', () => {
|
||||
beforeEach(async () => {
|
||||
let { group, groupLeader, members } = await createAndPopulateGroup({
|
||||
groupDetails: {
|
||||
name: groupName,
|
||||
type: groupType,
|
||||
privacy: 'public',
|
||||
},
|
||||
members: 1,
|
||||
});
|
||||
|
||||
groupToUpdate = group;
|
||||
leader = groupLeader;
|
||||
nonLeader = members[0];
|
||||
nonMember = await generateUser();
|
||||
});
|
||||
|
||||
it('returns an error when a non group leader tries to add member', async () => {
|
||||
await expect(nonLeader.post(`/groups/${groupToUpdate._id}/add-manager`, {
|
||||
managerId: nonLeader._id,
|
||||
})).to.eventually.be.rejected.and.eql({
|
||||
code: 401,
|
||||
error: 'NotAuthorized',
|
||||
message: t('messageGroupOnlyLeaderCanUpdate'),
|
||||
});
|
||||
});
|
||||
|
||||
it('returns an error when trying to promote a non member', async () => {
|
||||
await expect(leader.post(`/groups/${groupToUpdate._id}/add-manager`, {
|
||||
managerId: nonMember._id,
|
||||
})).to.eventually.be.rejected.and.eql({
|
||||
code: 401,
|
||||
error: 'NotAuthorized',
|
||||
message: t('userMustBeMember'),
|
||||
});
|
||||
});
|
||||
|
||||
it('allows a leader to add managers', async () => {
|
||||
let updatedGroup = await leader.post(`/groups/${groupToUpdate._id}/add-manager`, {
|
||||
managerId: nonLeader._id,
|
||||
});
|
||||
|
||||
expect(updatedGroup.managers[nonLeader._id]).to.be.true;
|
||||
});
|
||||
});
|
||||
|
||||
context('Party', () => {
|
||||
let party, partyLeader, partyNonLeader;
|
||||
|
||||
beforeEach(async () => {
|
||||
let { group, groupLeader, members } = await createAndPopulateGroup({
|
||||
groupDetails: {
|
||||
name: groupName,
|
||||
type: 'party',
|
||||
privacy: 'private',
|
||||
},
|
||||
members: 1,
|
||||
});
|
||||
|
||||
party = group;
|
||||
partyLeader = groupLeader;
|
||||
partyNonLeader = members[0];
|
||||
});
|
||||
|
||||
it('allows leader of party to add managers', async () => {
|
||||
let updatedGroup = await partyLeader.post(`/groups/${party._id}/add-manager`, {
|
||||
managerId: partyNonLeader._id,
|
||||
});
|
||||
|
||||
expect(updatedGroup.managers[partyNonLeader._id]).to.be.true;
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -4,7 +4,7 @@ import {
|
||||
} from '../../../../../helpers/api-integration/v3';
|
||||
import { find } from 'lodash';
|
||||
|
||||
describe('DELETE /tasks/:id', () => {
|
||||
describe('Groups DELETE /tasks/:id', () => {
|
||||
let user, guild, member, member2, task;
|
||||
|
||||
function findAssignedTask (memberTask) {
|
||||
@@ -48,6 +48,21 @@ describe('DELETE /tasks/:id', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('allows a manager to delete a group task', async () => {
|
||||
await user.post(`/groups/${guild._id}/add-manager`, {
|
||||
managerId: member2._id,
|
||||
});
|
||||
|
||||
await member2.del(`/tasks/${task._id}`);
|
||||
|
||||
await expect(user.get(`/tasks/${task._id}`))
|
||||
.to.eventually.be.rejected.and.eql({
|
||||
code: 404,
|
||||
error: 'NotFound',
|
||||
message: t('taskNotFound'),
|
||||
});
|
||||
});
|
||||
|
||||
it('unlinks assigned user', async () => {
|
||||
await user.del(`/tasks/${task._id}`);
|
||||
|
||||
|
||||
@@ -55,4 +55,13 @@ describe('GET /approvals/group/:groupId', () => {
|
||||
let approvals = await user.get(`/approvals/group/${guild._id}`);
|
||||
expect(approvals[0]._id).to.equal(syncedTask._id);
|
||||
});
|
||||
|
||||
it('allows managers to get a list of task that need approval', async () => {
|
||||
await user.post(`/groups/${guild._id}/add-manager`, {
|
||||
managerId: member._id,
|
||||
});
|
||||
|
||||
let approvals = await member.get(`/approvals/group/${guild._id}`);
|
||||
expect(approvals[0]._id).to.equal(syncedTask._id);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -5,7 +5,7 @@ import {
|
||||
import { find } from 'lodash';
|
||||
|
||||
describe('POST /tasks/:id/approve/:userId', () => {
|
||||
let user, guild, member, task;
|
||||
let user, guild, member, member2, task;
|
||||
|
||||
function findAssignedTask (memberTask) {
|
||||
return memberTask.group.id === guild._id;
|
||||
@@ -17,12 +17,13 @@ describe('POST /tasks/:id/approve/:userId', () => {
|
||||
name: 'Test Guild',
|
||||
type: 'guild',
|
||||
},
|
||||
members: 1,
|
||||
members: 2,
|
||||
});
|
||||
|
||||
guild = group;
|
||||
user = groupLeader;
|
||||
member = members[0];
|
||||
member2 = members[1];
|
||||
|
||||
task = await user.post(`/tasks/group/${guild._id}`, {
|
||||
text: 'test todo',
|
||||
@@ -69,4 +70,74 @@ describe('POST /tasks/:id/approve/:userId', () => {
|
||||
expect(syncedTask.group.approval.approvingUser).to.equal(user._id);
|
||||
expect(syncedTask.group.approval.dateApproved).to.be.a('string'); // date gets converted to a string as json doesn't have a Date type
|
||||
});
|
||||
|
||||
it('allows a manager to approve an assigned user', async () => {
|
||||
await user.post(`/groups/${guild._id}/add-manager`, {
|
||||
managerId: member2._id,
|
||||
});
|
||||
|
||||
await member2.post(`/tasks/${task._id}/assign/${member._id}`);
|
||||
await member2.post(`/tasks/${task._id}/approve/${member._id}`);
|
||||
|
||||
let memberTasks = await member.get('/tasks/user');
|
||||
let syncedTask = find(memberTasks, findAssignedTask);
|
||||
|
||||
await member.sync();
|
||||
|
||||
expect(member.notifications.length).to.equal(2);
|
||||
expect(member.notifications[0].type).to.equal('GROUP_TASK_APPROVED');
|
||||
expect(member.notifications[0].data.message).to.equal(t('yourTaskHasBeenApproved', {taskText: task.text}));
|
||||
expect(member.notifications[1].type).to.equal('SCORED_TASK');
|
||||
expect(member.notifications[1].data.message).to.equal(t('yourTaskHasBeenApproved', {taskText: task.text}));
|
||||
|
||||
expect(syncedTask.group.approval.approved).to.be.true;
|
||||
expect(syncedTask.group.approval.approvingUser).to.equal(member2._id);
|
||||
expect(syncedTask.group.approval.dateApproved).to.be.a('string'); // date gets converted to a string as json doesn't have a Date type
|
||||
});
|
||||
|
||||
it('removes approval pending notifications from managers', async () => {
|
||||
await user.post(`/groups/${guild._id}/add-manager`, {
|
||||
managerId: member2._id,
|
||||
});
|
||||
|
||||
await member2.post(`/tasks/${task._id}/assign/${member._id}`);
|
||||
let memberTasks = await member.get('/tasks/user');
|
||||
let syncedTask = find(memberTasks, findAssignedTask);
|
||||
await expect(member.post(`/tasks/${syncedTask._id}/score/up`))
|
||||
.to.eventually.be.rejected.and.to.eql({
|
||||
code: 401,
|
||||
error: 'NotAuthorized',
|
||||
message: t('taskApprovalHasBeenRequested'),
|
||||
});
|
||||
|
||||
await user.sync();
|
||||
await member2.sync();
|
||||
expect(user.notifications.length).to.equal(1);
|
||||
expect(user.notifications[0].type).to.equal('GROUP_TASK_APPROVAL');
|
||||
expect(member2.notifications.length).to.equal(1);
|
||||
expect(member2.notifications[0].type).to.equal('GROUP_TASK_APPROVAL');
|
||||
|
||||
await member2.post(`/tasks/${task._id}/approve/${member._id}`);
|
||||
|
||||
await user.sync();
|
||||
await member2.sync();
|
||||
|
||||
expect(user.notifications.length).to.equal(0);
|
||||
expect(member2.notifications.length).to.equal(0);
|
||||
});
|
||||
|
||||
it('prevents double approval on a task', async () => {
|
||||
await user.post(`/groups/${guild._id}/add-manager`, {
|
||||
managerId: member2._id,
|
||||
});
|
||||
|
||||
await member2.post(`/tasks/${task._id}/assign/${member._id}`);
|
||||
await member2.post(`/tasks/${task._id}/approve/${member._id}`);
|
||||
await expect(user.post(`/tasks/${task._id}/approve/${member._id}`))
|
||||
.to.eventually.be.rejected.and.to.eql({
|
||||
code: 401,
|
||||
error: 'NotAuthorized',
|
||||
message: t('canOnlyApproveTaskOnce'),
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -5,7 +5,7 @@ import {
|
||||
import { find } from 'lodash';
|
||||
|
||||
describe('POST /tasks/:id/score/:direction', () => {
|
||||
let user, guild, member, task;
|
||||
let user, guild, member, member2, task;
|
||||
|
||||
function findAssignedTask (memberTask) {
|
||||
return memberTask.group.id === guild._id;
|
||||
@@ -17,12 +17,13 @@ describe('POST /tasks/:id/score/:direction', () => {
|
||||
name: 'Test Guild',
|
||||
type: 'guild',
|
||||
},
|
||||
members: 1,
|
||||
members: 2,
|
||||
});
|
||||
|
||||
guild = group;
|
||||
user = groupLeader;
|
||||
member = members[0];
|
||||
member2 = members[1];
|
||||
|
||||
task = await user.post(`/tasks/group/${guild._id}`, {
|
||||
text: 'test todo',
|
||||
@@ -56,6 +57,7 @@ describe('POST /tasks/:id/score/:direction', () => {
|
||||
expect(user.notifications[0].data.message).to.equal(t('userHasRequestedTaskApproval', {
|
||||
user: member.auth.local.username,
|
||||
taskName: updatedTask.text,
|
||||
taskId: updatedTask._id,
|
||||
}, 'cs')); // This test only works if we have the notification translated
|
||||
expect(user.notifications[0].data.groupId).to.equal(guild._id);
|
||||
|
||||
@@ -63,6 +65,42 @@ describe('POST /tasks/:id/score/:direction', () => {
|
||||
expect(updatedTask.group.approval.requestedDate).to.be.a('string'); // date gets converted to a string as json doesn't have a Date type
|
||||
});
|
||||
|
||||
it('sends notifications to all managers', async () => {
|
||||
await user.post(`/groups/${guild._id}/add-manager`, {
|
||||
managerId: member2._id,
|
||||
});
|
||||
let memberTasks = await member.get('/tasks/user');
|
||||
let syncedTask = find(memberTasks, findAssignedTask);
|
||||
|
||||
await expect(member.post(`/tasks/${syncedTask._id}/score/up`))
|
||||
.to.eventually.be.rejected.and.to.eql({
|
||||
code: 401,
|
||||
error: 'NotAuthorized',
|
||||
message: t('taskApprovalHasBeenRequested'),
|
||||
});
|
||||
let updatedTask = await member.get(`/tasks/${syncedTask._id}`);
|
||||
await user.sync();
|
||||
await member2.sync();
|
||||
|
||||
expect(user.notifications.length).to.equal(1);
|
||||
expect(user.notifications[0].type).to.equal('GROUP_TASK_APPROVAL');
|
||||
expect(user.notifications[0].data.message).to.equal(t('userHasRequestedTaskApproval', {
|
||||
user: member.auth.local.username,
|
||||
taskName: updatedTask.text,
|
||||
taskId: updatedTask._id,
|
||||
}));
|
||||
expect(user.notifications[0].data.groupId).to.equal(guild._id);
|
||||
|
||||
expect(member2.notifications.length).to.equal(1);
|
||||
expect(member2.notifications[0].type).to.equal('GROUP_TASK_APPROVAL');
|
||||
expect(member2.notifications[0].data.message).to.equal(t('userHasRequestedTaskApproval', {
|
||||
user: member.auth.local.username,
|
||||
taskName: updatedTask.text,
|
||||
taskId: updatedTask._id,
|
||||
}));
|
||||
expect(member2.notifications[0].data.groupId).to.equal(guild._id);
|
||||
});
|
||||
|
||||
it('errors when approval has already been requested', async () => {
|
||||
let memberTasks = await member.get('/tasks/user');
|
||||
let syncedTask = find(memberTasks, findAssignedTask);
|
||||
|
||||
@@ -1,16 +1,29 @@
|
||||
import {
|
||||
generateUser,
|
||||
generateGroup,
|
||||
createAndPopulateGroup,
|
||||
translate as t,
|
||||
} from '../../../../../helpers/api-v3-integration.helper';
|
||||
import { v4 as generateUUID } from 'uuid';
|
||||
|
||||
describe('POST /tasks/group/:groupid', () => {
|
||||
let user, guild;
|
||||
let user, guild, manager;
|
||||
let groupName = 'Test Public Guild';
|
||||
let groupType = 'guild';
|
||||
|
||||
beforeEach(async () => {
|
||||
user = await generateUser({balance: 1});
|
||||
guild = await generateGroup(user, {type: 'guild'});
|
||||
let { group, groupLeader, members } = await createAndPopulateGroup({
|
||||
groupDetails: {
|
||||
name: groupName,
|
||||
type: groupType,
|
||||
privacy: 'private',
|
||||
},
|
||||
members: 1,
|
||||
});
|
||||
|
||||
guild = group;
|
||||
user = groupLeader;
|
||||
manager = members[0];
|
||||
});
|
||||
|
||||
it('returns error when group is not found', async () => {
|
||||
@@ -116,4 +129,27 @@ describe('POST /tasks/group/:groupid', () => {
|
||||
expect(task.everyX).to.eql(5);
|
||||
expect(new Date(task.startDate)).to.eql(now);
|
||||
});
|
||||
|
||||
it('allows a manager to add a group task', async () => {
|
||||
await user.post(`/groups/${guild._id}/add-manager`, {
|
||||
managerId: manager._id,
|
||||
});
|
||||
|
||||
let task = await manager.post(`/tasks/group/${guild._id}`, {
|
||||
text: 'test habit',
|
||||
type: 'habit',
|
||||
up: false,
|
||||
down: true,
|
||||
notes: 1976,
|
||||
});
|
||||
|
||||
let groupTask = await manager.get(`/tasks/group/${guild._id}`);
|
||||
|
||||
expect(groupTask[0].group.id).to.equal(guild._id);
|
||||
expect(task.text).to.eql('test habit');
|
||||
expect(task.notes).to.eql('1976');
|
||||
expect(task.type).to.eql('habit');
|
||||
expect(task.up).to.eql(false);
|
||||
expect(task.down).to.eql(true);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -6,7 +6,7 @@ import {
|
||||
import { v4 as generateUUID } from 'uuid';
|
||||
import { find } from 'lodash';
|
||||
|
||||
describe('POST /tasks/:taskId', () => {
|
||||
describe('POST /tasks/:taskId/assign/:memberId', () => {
|
||||
let user, guild, member, member2, task;
|
||||
|
||||
function findAssignedTask (memberTask) {
|
||||
@@ -130,4 +130,19 @@ describe('POST /tasks/:taskId', () => {
|
||||
expect(member1SyncedTask).to.exist;
|
||||
expect(member2SyncedTask).to.exist;
|
||||
});
|
||||
|
||||
it('allows a manager to assign tasks', async () => {
|
||||
await user.post(`/groups/${guild._id}/add-manager`, {
|
||||
managerId: member2._id,
|
||||
});
|
||||
|
||||
await member2.post(`/tasks/${task._id}/assign/${member._id}`);
|
||||
|
||||
let groupTask = await member2.get(`/tasks/group/${guild._id}`);
|
||||
let memberTasks = await member.get('/tasks/user');
|
||||
let syncedTask = find(memberTasks, findAssignedTask);
|
||||
|
||||
expect(groupTask[0].group.assignedUsers).to.contain(member._id);
|
||||
expect(syncedTask).to.exist;
|
||||
});
|
||||
});
|
||||
|
||||
@@ -114,4 +114,19 @@ describe('POST /tasks/:taskId/unassign/:memberId', () => {
|
||||
expect(groupTask[0].group.assignedUsers).to.contain(member2._id);
|
||||
expect(member2SyncedTask).to.exist;
|
||||
});
|
||||
|
||||
it('allows a manager to unassign a user from a task', async () => {
|
||||
await user.post(`/groups/${guild._id}/add-manager`, {
|
||||
managerId: member2._id,
|
||||
});
|
||||
|
||||
await member2.post(`/tasks/${task._id}/unassign/${member._id}`);
|
||||
|
||||
let groupTask = await member2.get(`/tasks/group/${guild._id}`);
|
||||
let memberTasks = await member.get('/tasks/user');
|
||||
let syncedTask = find(memberTasks, findAssignedTask);
|
||||
|
||||
expect(groupTask[0].group.assignedUsers).to.not.contain(member._id);
|
||||
expect(syncedTask).to.not.exist;
|
||||
});
|
||||
});
|
||||
|
||||
@@ -89,4 +89,25 @@ describe('PUT /tasks/:id', () => {
|
||||
expect(member2SyncedTask.up).to.eql(false);
|
||||
expect(member2SyncedTask.down).to.eql(false);
|
||||
});
|
||||
|
||||
it('updates the linked tasks', async () => {
|
||||
await user.post(`/groups/${guild._id}/add-manager`, {
|
||||
managerId: member2._id,
|
||||
});
|
||||
|
||||
await member2.put(`/tasks/${task._id}`, {
|
||||
text: 'some new text',
|
||||
up: false,
|
||||
down: false,
|
||||
notes: 'some new notes',
|
||||
});
|
||||
|
||||
|
||||
let memberTasks = await member.get('/tasks/user');
|
||||
let syncedTask = find(memberTasks, findAssignedTask);
|
||||
|
||||
expect(syncedTask.text).to.eql('some new text');
|
||||
expect(syncedTask.up).to.eql(false);
|
||||
expect(syncedTask.down).to.eql(false);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -603,6 +603,64 @@ describe('Purchasing a subscription for group', () => {
|
||||
expect(updatedUser.purchased.plan.dateCreated).to.exist;
|
||||
});
|
||||
|
||||
it('does not modify a user with a Google subscription', async () => {
|
||||
plan.customerId = 'random';
|
||||
plan.paymentMethod = api.constants.GOOGLE_PAYMENT_METHOD;
|
||||
|
||||
let recipient = new User();
|
||||
recipient.profile.name = 'recipient';
|
||||
recipient.purchased.plan = plan;
|
||||
recipient.guilds.push(group._id);
|
||||
await recipient.save();
|
||||
|
||||
user.guilds.push(group._id);
|
||||
await user.save();
|
||||
data.groupId = group._id;
|
||||
|
||||
await api.createSubscription(data);
|
||||
|
||||
let updatedUser = await User.findById(recipient._id).exec();
|
||||
|
||||
expect(updatedUser.purchased.plan.planId).to.eql('basic_3mo');
|
||||
expect(updatedUser.purchased.plan.customerId).to.eql('random');
|
||||
expect(updatedUser.purchased.plan.dateUpdated).to.exist;
|
||||
expect(updatedUser.purchased.plan.gemsBought).to.eql(0);
|
||||
expect(updatedUser.purchased.plan.paymentMethod).to.eql(api.constants.GOOGLE_PAYMENT_METHOD);
|
||||
expect(updatedUser.purchased.plan.extraMonths).to.eql(0);
|
||||
expect(updatedUser.purchased.plan.dateTerminated).to.eql(null);
|
||||
expect(updatedUser.purchased.plan.lastBillingDate).to.exist;
|
||||
expect(updatedUser.purchased.plan.dateCreated).to.exist;
|
||||
});
|
||||
|
||||
it('does not modify a user with an iOS subscription', async () => {
|
||||
plan.customerId = 'random';
|
||||
plan.paymentMethod = api.constants.IOS_PAYMENT_METHOD;
|
||||
|
||||
let recipient = new User();
|
||||
recipient.profile.name = 'recipient';
|
||||
recipient.purchased.plan = plan;
|
||||
recipient.guilds.push(group._id);
|
||||
await recipient.save();
|
||||
|
||||
user.guilds.push(group._id);
|
||||
await user.save();
|
||||
data.groupId = group._id;
|
||||
|
||||
await api.createSubscription(data);
|
||||
|
||||
let updatedUser = await User.findById(recipient._id).exec();
|
||||
|
||||
expect(updatedUser.purchased.plan.planId).to.eql('basic_3mo');
|
||||
expect(updatedUser.purchased.plan.customerId).to.eql('random');
|
||||
expect(updatedUser.purchased.plan.dateUpdated).to.exist;
|
||||
expect(updatedUser.purchased.plan.gemsBought).to.eql(0);
|
||||
expect(updatedUser.purchased.plan.paymentMethod).to.eql(api.constants.IOS_PAYMENT_METHOD);
|
||||
expect(updatedUser.purchased.plan.extraMonths).to.eql(0);
|
||||
expect(updatedUser.purchased.plan.dateTerminated).to.eql(null);
|
||||
expect(updatedUser.purchased.plan.lastBillingDate).to.exist;
|
||||
expect(updatedUser.purchased.plan.dateCreated).to.exist;
|
||||
});
|
||||
|
||||
it('updates a user with a cancelled but active group subscription', async () => {
|
||||
plan.key = 'basic_earned';
|
||||
plan.customerId = api.constants.GROUP_PLAN_CUSTOMER_ID;
|
||||
|
||||
@@ -2,7 +2,13 @@ import moment from 'moment';
|
||||
import { v4 as generateUUID } from 'uuid';
|
||||
import validator from 'validator';
|
||||
import { sleep } from '../../../../helpers/api-unit.helper';
|
||||
import { model as Group, INVITES_LIMIT } from '../../../../../website/server/models/group';
|
||||
import {
|
||||
SPAM_MESSAGE_LIMIT,
|
||||
SPAM_MIN_EXEMPT_CONTRIB_LEVEL,
|
||||
SPAM_WINDOW_LENGTH,
|
||||
INVITES_LIMIT,
|
||||
model as Group,
|
||||
} from '../../../../../website/server/models/group';
|
||||
import { model as User } from '../../../../../website/server/models/user';
|
||||
import { quests as questScrolls } from '../../../../../website/common/script/content';
|
||||
import { groupChatReceivedWebhook } from '../../../../../website/server/libs/webhook';
|
||||
@@ -595,6 +601,99 @@ describe('Group Model', () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('#checkChatSpam', () => {
|
||||
let testUser, testTime, tavern;
|
||||
let testUserID = '1';
|
||||
beforeEach(async () => {
|
||||
testTime = Date.now();
|
||||
|
||||
tavern = new Group({
|
||||
name: 'test tavern',
|
||||
type: 'guild',
|
||||
privacy: 'public',
|
||||
});
|
||||
tavern._id = TAVERN_ID;
|
||||
|
||||
testUser = {
|
||||
_id: testUserID,
|
||||
};
|
||||
});
|
||||
|
||||
function generateTestMessage (overrides = {}) {
|
||||
return Object.assign({}, {
|
||||
text: 'test message',
|
||||
uuid: testUserID,
|
||||
timestamp: testTime,
|
||||
}, overrides);
|
||||
}
|
||||
|
||||
it('group that is not the tavern returns false, while tavern returns true', async () => {
|
||||
for (let i = 0; i < SPAM_MESSAGE_LIMIT; i++) {
|
||||
party.chat.push(generateTestMessage());
|
||||
}
|
||||
expect(party.checkChatSpam(testUser)).to.eql(false);
|
||||
|
||||
for (let i = 0; i < SPAM_MESSAGE_LIMIT; i++) {
|
||||
tavern.chat.push(generateTestMessage());
|
||||
}
|
||||
expect(tavern.checkChatSpam(testUser)).to.eql(true);
|
||||
});
|
||||
|
||||
it('high enough contributor returns false', async () => {
|
||||
let highContributor = testUser;
|
||||
highContributor.contributor = {
|
||||
level: SPAM_MIN_EXEMPT_CONTRIB_LEVEL,
|
||||
};
|
||||
|
||||
for (let i = 0; i < SPAM_MESSAGE_LIMIT; i++) {
|
||||
tavern.chat.push(generateTestMessage());
|
||||
}
|
||||
|
||||
expect(tavern.checkChatSpam(highContributor)).to.eql(false);
|
||||
});
|
||||
|
||||
it('chat with no messages returns false', async () => {
|
||||
expect(tavern.chat.length).to.eql(0);
|
||||
expect(tavern.checkChatSpam(testUser)).to.eql(false);
|
||||
});
|
||||
|
||||
it('user has not reached limit but another one has returns false', async () => {
|
||||
let otherUserID = '2';
|
||||
|
||||
for (let i = 0; i < SPAM_MESSAGE_LIMIT; i++) {
|
||||
tavern.chat.push(generateTestMessage({uuid: otherUserID}));
|
||||
}
|
||||
|
||||
expect(tavern.checkChatSpam(testUser)).to.eql(false);
|
||||
});
|
||||
|
||||
it('user messages is less than the limit returns false', async () => {
|
||||
for (let i = 0; i < SPAM_MESSAGE_LIMIT - 1; i++) {
|
||||
tavern.chat.push(generateTestMessage());
|
||||
}
|
||||
|
||||
expect(tavern.checkChatSpam(testUser)).to.eql(false);
|
||||
});
|
||||
|
||||
it('user has reached the message limit outside of window returns false', async () => {
|
||||
for (let i = 0; i < SPAM_MESSAGE_LIMIT - 1; i++) {
|
||||
tavern.chat.push(generateTestMessage());
|
||||
}
|
||||
let earlierTimestamp = testTime - SPAM_WINDOW_LENGTH - 1;
|
||||
tavern.chat.push(generateTestMessage({timestamp: earlierTimestamp}));
|
||||
|
||||
expect(tavern.checkChatSpam(testUser)).to.eql(false);
|
||||
});
|
||||
|
||||
it('user has posted too many messages in limit returns true', async () => {
|
||||
for (let i = 0; i < SPAM_MESSAGE_LIMIT; i++) {
|
||||
tavern.chat.push(generateTestMessage());
|
||||
}
|
||||
|
||||
expect(tavern.checkChatSpam(testUser)).to.eql(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#leaveGroup', () => {
|
||||
it('removes user from group quest', async () => {
|
||||
party.quest.members = {
|
||||
|
||||
@@ -334,4 +334,34 @@ describe('Settings Controller', function () {
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
context('Fixing character values', function () {
|
||||
describe('#restore', function () {
|
||||
var blankRestoreValues = {
|
||||
stats: {
|
||||
hp: 0,
|
||||
exp: 0,
|
||||
gp: 0,
|
||||
lvl: 0,
|
||||
mp: 0,
|
||||
},
|
||||
achievements: {
|
||||
streak: 0,
|
||||
},
|
||||
};
|
||||
|
||||
it('doesn\'t update character values when level is less than 1', function () {
|
||||
scope.restoreValues = blankRestoreValues;
|
||||
scope.restore();
|
||||
expect(User.set).to.not.be.called;
|
||||
});
|
||||
|
||||
it('updates character values when level is at least 1', function () {
|
||||
scope.restoreValues = blankRestoreValues;
|
||||
scope.restoreValues.stats.lvl = 1;
|
||||
scope.restore();
|
||||
expect(User.set).to.be.called;
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -16,7 +16,7 @@ nvm use
|
||||
nvm alias default current
|
||||
|
||||
echo Update npm...
|
||||
npm install -g npm@3
|
||||
npm install -g npm@4
|
||||
|
||||
echo Installing global modules...
|
||||
npm install -g gulp bower grunt-cli mocha
|
||||
npm install -g gulp bower grunt-cli mocha node-pre-gyp
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
/* Comment out for holiday events */
|
||||
/* .npc_ian {
|
||||
.npc_ian {
|
||||
background: url("/npc_ian.gif") no-repeat;
|
||||
width: 78px;
|
||||
height: 135px;
|
||||
} */
|
||||
}
|
||||
|
||||
.quest_burnout {
|
||||
background: url("/quest_burnout.gif") no-repeat;
|
||||
|
||||
@@ -6,25 +6,25 @@
|
||||
}
|
||||
.promo_backgrounds_armoire_201602 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1573px 0px;
|
||||
background-position: -1573px -295px;
|
||||
width: 141px;
|
||||
height: 294px;
|
||||
}
|
||||
.promo_backgrounds_armoire_201603 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -849px -600px;
|
||||
background-position: -1573px 0px;
|
||||
width: 141px;
|
||||
height: 294px;
|
||||
}
|
||||
.promo_backgrounds_armoire_201604 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1150px 0px;
|
||||
background-position: -1150px -442px;
|
||||
width: 140px;
|
||||
height: 441px;
|
||||
}
|
||||
.promo_backgrounds_armoire_201605 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -423px -1042px;
|
||||
background-position: -1291px -442px;
|
||||
width: 140px;
|
||||
height: 441px;
|
||||
}
|
||||
@@ -42,37 +42,37 @@
|
||||
}
|
||||
.promo_backgrounds_armoire_201608 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -568px -600px;
|
||||
background-position: -710px -600px;
|
||||
width: 140px;
|
||||
height: 439px;
|
||||
}
|
||||
.promo_backgrounds_armoire_201609 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -709px -600px;
|
||||
background-position: -851px -600px;
|
||||
width: 139px;
|
||||
height: 438px;
|
||||
}
|
||||
.promo_backgrounds_armoire_201610 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1291px 0px;
|
||||
background-position: -1432px 0px;
|
||||
width: 140px;
|
||||
height: 441px;
|
||||
}
|
||||
.promo_backgrounds_armoire_201611 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -141px -1042px;
|
||||
background-position: 0px -1042px;
|
||||
width: 140px;
|
||||
height: 441px;
|
||||
}
|
||||
.promo_backgrounds_armoire_201612 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1432px 0px;
|
||||
background-position: -141px -1042px;
|
||||
width: 140px;
|
||||
height: 441px;
|
||||
}
|
||||
.promo_backgrounds_armoire_201701 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1150px -442px;
|
||||
background-position: -282px -1042px;
|
||||
width: 140px;
|
||||
height: 441px;
|
||||
}
|
||||
@@ -84,11 +84,17 @@
|
||||
}
|
||||
.promo_backgrounds_armoire_201703 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -142px -600px;
|
||||
background-position: -840px -148px;
|
||||
width: 141px;
|
||||
height: 441px;
|
||||
}
|
||||
.promo_backgrounds_armoire_201704 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -426px -600px;
|
||||
width: 141px;
|
||||
height: 441px;
|
||||
}
|
||||
.promo_backgrounds_armoire_201705 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: 0px -600px;
|
||||
width: 141px;
|
||||
@@ -96,7 +102,7 @@
|
||||
}
|
||||
.promo_bees {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -982px -148px;
|
||||
background-position: -142px -600px;
|
||||
width: 141px;
|
||||
height: 441px;
|
||||
}
|
||||
@@ -132,7 +138,7 @@
|
||||
}
|
||||
.promo_classes_fall_2016 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1573px -295px;
|
||||
background-position: -1573px -590px;
|
||||
width: 103px;
|
||||
height: 348px;
|
||||
}
|
||||
@@ -144,49 +150,49 @@
|
||||
}
|
||||
.promo_contrib_spotlight_Keith {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1573px -980px;
|
||||
background-position: -1715px -1536px;
|
||||
width: 87px;
|
||||
height: 111px;
|
||||
}
|
||||
.promo_contrib_spotlight_beffymaroo {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1715px -922px;
|
||||
background-position: -1715px -626px;
|
||||
width: 114px;
|
||||
height: 147px;
|
||||
}
|
||||
.promo_contrib_spotlight_blade {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1573px -868px;
|
||||
background-position: -1715px -1424px;
|
||||
width: 89px;
|
||||
height: 111px;
|
||||
}
|
||||
.promo_contrib_spotlight_cantras {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1573px -1201px;
|
||||
background-position: -1803px -1536px;
|
||||
width: 87px;
|
||||
height: 109px;
|
||||
}
|
||||
.promo_contrib_spotlight_dewines {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1573px -1092px;
|
||||
background-position: -1573px -939px;
|
||||
width: 89px;
|
||||
height: 108px;
|
||||
}
|
||||
.promo_contrib_spotlight_megan {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1573px -644px;
|
||||
background-position: -1715px -1200px;
|
||||
width: 90px;
|
||||
height: 111px;
|
||||
}
|
||||
.promo_contrib_spotlight_shanaqui {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1573px -756px;
|
||||
background-position: -1715px -1312px;
|
||||
width: 90px;
|
||||
height: 111px;
|
||||
}
|
||||
.promo_cow {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1291px -442px;
|
||||
background-position: -1432px -442px;
|
||||
width: 140px;
|
||||
height: 441px;
|
||||
}
|
||||
@@ -198,7 +204,7 @@
|
||||
}
|
||||
.promo_dilatoryDistress {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -182px -1755px;
|
||||
background-position: -1474px -1664px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
@@ -216,37 +222,37 @@
|
||||
}
|
||||
.promo_enchanted_armoire_201507 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: 0px -1664px;
|
||||
background-position: -1341px -1042px;
|
||||
width: 217px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_enchanted_armoire_201508 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -218px -1664px;
|
||||
background-position: -468px -1664px;
|
||||
width: 180px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_enchanted_armoire_201509 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1415px -1664px;
|
||||
background-position: -928px -1664px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_enchanted_armoire_201511 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1715px -1428px;
|
||||
background-position: -1715px -1018px;
|
||||
width: 122px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_enchanted_armoire_201601 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -273px -1755px;
|
||||
background-position: -364px -1767px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_fairy_potions {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -840px -148px;
|
||||
background-position: -982px -148px;
|
||||
width: 141px;
|
||||
height: 441px;
|
||||
}
|
||||
@@ -258,7 +264,7 @@
|
||||
}
|
||||
.promo_ghost_potions {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: 0px -1042px;
|
||||
background-position: -1291px 0px;
|
||||
width: 140px;
|
||||
height: 441px;
|
||||
}
|
||||
@@ -276,25 +282,25 @@
|
||||
}
|
||||
.promo_habitoween_2016 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -282px -1042px;
|
||||
background-position: -1150px 0px;
|
||||
width: 140px;
|
||||
height: 441px;
|
||||
}
|
||||
.promo_haunted_hair {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1715px -1070px;
|
||||
background-position: -1715px -774px;
|
||||
width: 100px;
|
||||
height: 137px;
|
||||
}
|
||||
.promo_holly_potions {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -426px -600px;
|
||||
background-position: -568px -600px;
|
||||
width: 141px;
|
||||
height: 440px;
|
||||
}
|
||||
.promo_item_notif {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -849px -895px;
|
||||
background-position: 0px -1664px;
|
||||
width: 249px;
|
||||
height: 102px;
|
||||
}
|
||||
@@ -312,13 +318,13 @@
|
||||
}
|
||||
.promo_mystery_201405 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1779px -1664px;
|
||||
background-position: 0px -1767px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201406 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: 0px -1755px;
|
||||
background-position: -1432px -884px;
|
||||
width: 90px;
|
||||
height: 96px;
|
||||
}
|
||||
@@ -330,169 +336,169 @@
|
||||
}
|
||||
.promo_mystery_201408 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1829px -1208px;
|
||||
background-position: -1821px -912px;
|
||||
width: 60px;
|
||||
height: 71px;
|
||||
}
|
||||
.promo_mystery_201409 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1688px -1664px;
|
||||
background-position: -182px -1767px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201410 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1573px -1417px;
|
||||
background-position: -1806px -1200px;
|
||||
width: 72px;
|
||||
height: 63px;
|
||||
}
|
||||
.promo_mystery_201411 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -91px -1755px;
|
||||
background-position: -837px -1664px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201412 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1836px -1519px;
|
||||
background-position: -1836px -1109px;
|
||||
width: 42px;
|
||||
height: 66px;
|
||||
}
|
||||
.promo_mystery_201501 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1830px -1004px;
|
||||
background-position: -1830px -708px;
|
||||
width: 48px;
|
||||
height: 63px;
|
||||
}
|
||||
.promo_mystery_201502 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -960px -1664px;
|
||||
background-position: -91px -1767px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201503 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1233px -1664px;
|
||||
background-position: -1656px -1664px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201504 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1821px -1322px;
|
||||
background-position: -1806px -1312px;
|
||||
width: 60px;
|
||||
height: 69px;
|
||||
}
|
||||
.promo_mystery_201505 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1597px -1664px;
|
||||
background-position: -1110px -1664px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201506 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1838px -1428px;
|
||||
background-position: -1838px -1018px;
|
||||
width: 42px;
|
||||
height: 69px;
|
||||
}
|
||||
.promo_mystery_201507 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1432px -884px;
|
||||
background-position: -1573px -1260px;
|
||||
width: 90px;
|
||||
height: 105px;
|
||||
}
|
||||
.promo_mystery_201508 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -775px -1664px;
|
||||
background-position: -1291px -884px;
|
||||
width: 93px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201509 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -455px -1755px;
|
||||
background-position: -273px -1767px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201510 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -399px -1664px;
|
||||
background-position: -1150px -884px;
|
||||
width: 93px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201511 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -364px -1755px;
|
||||
background-position: -1019px -1664px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201512 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1830px -922px;
|
||||
background-position: -1830px -626px;
|
||||
width: 60px;
|
||||
height: 81px;
|
||||
}
|
||||
.promo_mystery_201601 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1715px -1519px;
|
||||
background-position: -1715px -1109px;
|
||||
width: 120px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201602 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1051px -1664px;
|
||||
background-position: -1292px -1664px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201603 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1142px -1664px;
|
||||
background-position: -1383px -1664px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201604 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -493px -1664px;
|
||||
background-position: -991px -895px;
|
||||
width: 93px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201605 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1324px -1664px;
|
||||
background-position: -1565px -1664px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201606 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1573px -1311px;
|
||||
background-position: -1573px -1048px;
|
||||
width: 90px;
|
||||
height: 105px;
|
||||
}
|
||||
.promo_mystery_201607 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1506px -1664px;
|
||||
background-position: -1747px -1664px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201608 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -587px -1664px;
|
||||
background-position: -649px -1664px;
|
||||
width: 93px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201609 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -681px -1664px;
|
||||
background-position: -743px -1664px;
|
||||
width: 93px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201610 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1816px -1070px;
|
||||
background-position: -1816px -774px;
|
||||
width: 63px;
|
||||
height: 84px;
|
||||
}
|
||||
.promo_mystery_201611 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1150px -884px;
|
||||
background-position: -1573px -1366px;
|
||||
width: 90px;
|
||||
height: 99px;
|
||||
}
|
||||
@@ -504,7 +510,7 @@
|
||||
}
|
||||
.promo_mystery_201701 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1291px -884px;
|
||||
background-position: -1573px -1154px;
|
||||
width: 90px;
|
||||
height: 105px;
|
||||
}
|
||||
@@ -522,31 +528,31 @@
|
||||
}
|
||||
.promo_mystery_201704 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -869px -1664px;
|
||||
background-position: -1201px -1664px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_3014 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1341px -1042px;
|
||||
background-position: -250px -1664px;
|
||||
width: 217px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_new_hair_fall2016 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1432px -442px;
|
||||
background-position: -423px -1042px;
|
||||
width: 140px;
|
||||
height: 441px;
|
||||
}
|
||||
.promo_orca {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1715px -1322px;
|
||||
background-position: -1715px -912px;
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.promo_partyhats {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1715px -1610px;
|
||||
background-position: -1432px -981px;
|
||||
width: 115px;
|
||||
height: 47px;
|
||||
}
|
||||
@@ -574,27 +580,3 @@
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
.promo_peppermint_flame {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1715px -626px;
|
||||
width: 140px;
|
||||
height: 147px;
|
||||
}
|
||||
.promo_pet_skins {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1715px -774px;
|
||||
width: 140px;
|
||||
height: 147px;
|
||||
}
|
||||
.customize-option.promo_pet_skins {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1740px -789px;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
.promo_pyromancer {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1715px -1208px;
|
||||
width: 113px;
|
||||
height: 113px;
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 1.0 MiB After Width: | Height: | Size: 1.0 MiB |
@@ -1,6 +1,30 @@
|
||||
.promo_peppermint_flame {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1629px -934px;
|
||||
width: 140px;
|
||||
height: 147px;
|
||||
}
|
||||
.promo_pet_skins {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1488px -934px;
|
||||
width: 140px;
|
||||
height: 147px;
|
||||
}
|
||||
.customize-option.promo_pet_skins {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1513px -949px;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
.promo_pyromancer {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1639px -632px;
|
||||
width: 113px;
|
||||
height: 113px;
|
||||
}
|
||||
.promo_rainbow_armor {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1488px -1341px;
|
||||
background-position: -1358px -556px;
|
||||
width: 92px;
|
||||
height: 103px;
|
||||
}
|
||||
@@ -30,13 +54,13 @@
|
||||
}
|
||||
.promo_splashyskins {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1488px -1082px;
|
||||
background-position: -1488px -1230px;
|
||||
width: 198px;
|
||||
height: 91px;
|
||||
}
|
||||
.customize-option.promo_splashyskins {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1513px -1097px;
|
||||
background-position: -1513px -1245px;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
@@ -54,7 +78,7 @@
|
||||
}
|
||||
.promo_spring_classes_2017 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -589px -916px;
|
||||
background-position: -899px -916px;
|
||||
width: 309px;
|
||||
height: 147px;
|
||||
}
|
||||
@@ -120,7 +144,7 @@
|
||||
}
|
||||
.promo_takethis_armor {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1639px -632px;
|
||||
background-position: -1358px -377px;
|
||||
width: 114px;
|
||||
height: 87px;
|
||||
}
|
||||
@@ -132,19 +156,19 @@
|
||||
}
|
||||
.promo_turkey_day_2016 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: 0px -765px;
|
||||
background-position: -1076px 0px;
|
||||
width: 140px;
|
||||
height: 441px;
|
||||
}
|
||||
.promo_unconventional_armor {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1639px -720px;
|
||||
background-position: -1639px -871px;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
.promo_unconventional_armor2 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1687px -1082px;
|
||||
background-position: -1687px -1230px;
|
||||
width: 70px;
|
||||
height: 74px;
|
||||
}
|
||||
@@ -156,7 +180,7 @@
|
||||
}
|
||||
.promo_veteran_pets {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1627px -934px;
|
||||
background-position: -1627px -1082px;
|
||||
width: 146px;
|
||||
height: 75px;
|
||||
}
|
||||
@@ -174,7 +198,7 @@
|
||||
}
|
||||
.promo_winter_fireworks {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1488px -934px;
|
||||
background-position: -1488px -1082px;
|
||||
width: 138px;
|
||||
height: 147px;
|
||||
}
|
||||
@@ -186,19 +210,19 @@
|
||||
}
|
||||
.promo_wintery_skins {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1076px 0px;
|
||||
background-position: 0px -765px;
|
||||
width: 140px;
|
||||
height: 441px;
|
||||
}
|
||||
.customize-option.promo_wintery_skins {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1101px -15px;
|
||||
background-position: -25px -780px;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
.promo_winteryhair {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1488px -1174px;
|
||||
background-position: -1488px -1322px;
|
||||
width: 152px;
|
||||
height: 75px;
|
||||
}
|
||||
@@ -210,7 +234,7 @@
|
||||
}
|
||||
.npc_viirus {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1488px -1250px;
|
||||
background-position: -1358px -465px;
|
||||
width: 108px;
|
||||
height: 90px;
|
||||
}
|
||||
@@ -222,7 +246,7 @@
|
||||
}
|
||||
.promo_backtoschool {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1488px -481px;
|
||||
background-position: -1488px -632px;
|
||||
width: 150px;
|
||||
height: 150px;
|
||||
}
|
||||
@@ -234,13 +258,13 @@
|
||||
}
|
||||
.promo_startingover {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1488px -632px;
|
||||
background-position: -1488px -783px;
|
||||
width: 150px;
|
||||
height: 150px;
|
||||
}
|
||||
.promo_valentines {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -899px -916px;
|
||||
background-position: -589px -916px;
|
||||
width: 309px;
|
||||
height: 147px;
|
||||
}
|
||||
@@ -252,7 +276,7 @@
|
||||
}
|
||||
.scene_coding {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1488px -330px;
|
||||
background-position: -1488px -481px;
|
||||
width: 150px;
|
||||
height: 150px;
|
||||
}
|
||||
@@ -276,7 +300,7 @@
|
||||
}
|
||||
.scene_phone_peek {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1488px -783px;
|
||||
background-position: -1488px -330px;
|
||||
width: 150px;
|
||||
height: 150px;
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 333 KiB After Width: | Height: | Size: 340 KiB |
|
Before Width: | Height: | Size: 498 KiB After Width: | Height: | Size: 507 KiB |
|
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 144 KiB After Width: | Height: | Size: 141 KiB |
|
Before Width: | Height: | Size: 141 KiB After Width: | Height: | Size: 138 KiB |
|
Before Width: | Height: | Size: 155 KiB After Width: | Height: | Size: 158 KiB |
|
Before Width: | Height: | Size: 146 KiB After Width: | Height: | Size: 146 KiB |
|
Before Width: | Height: | Size: 156 KiB After Width: | Height: | Size: 154 KiB |
|
Before Width: | Height: | Size: 179 KiB After Width: | Height: | Size: 177 KiB |
|
Before Width: | Height: | Size: 158 KiB After Width: | Height: | Size: 159 KiB |
|
Before Width: | Height: | Size: 120 KiB After Width: | Height: | Size: 122 KiB |
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 57 KiB |
|
Before Width: | Height: | Size: 109 KiB After Width: | Height: | Size: 110 KiB |
|
Before Width: | Height: | Size: 153 KiB After Width: | Height: | Size: 153 KiB |
|
Before Width: | Height: | Size: 143 KiB After Width: | Height: | Size: 143 KiB |
|
Before Width: | Height: | Size: 204 KiB After Width: | Height: | Size: 195 KiB |
|
Before Width: | Height: | Size: 447 KiB After Width: | Height: | Size: 440 KiB |
|
Before Width: | Height: | Size: 166 KiB After Width: | Height: | Size: 183 KiB |
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 5.5 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 7.0 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 3.2 KiB |
|
After Width: | Height: | Size: 3.2 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 5.0 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 5.8 KiB |
|
After Width: | Height: | Size: 16 KiB |
@@ -215,3 +215,6 @@ group-members-autocomplete
|
||||
background #ff6633
|
||||
color #fff
|
||||
cursor pointer
|
||||
|
||||
.add-manager-button, .remove-manager-button
|
||||
margin-left: 1rem;
|
||||
|
||||
@@ -160,8 +160,10 @@ habitrpg.controller('GroupTasksCtrl', ['$scope', 'Shared', 'Tasks', 'User', '$ro
|
||||
|
||||
$scope.checkGroupAccess = function (group) {
|
||||
if (!group || !group.leader) return true;
|
||||
if (User.user._id !== group.leader._id) return false;
|
||||
return true;
|
||||
var userId = User.user._id;
|
||||
var leader = group.leader._id === userId;
|
||||
var isManager = Boolean(group.managers[userId]);
|
||||
return leader || isManager;
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
'use strict';
|
||||
|
||||
habitrpg.controller('ChatCtrl', ['$scope', 'Groups', 'Chat', 'User', '$http', 'ApiUrl', 'Notification', 'Members', '$rootScope', 'Analytics',
|
||||
function($scope, Groups, Chat, User, $http, ApiUrl, Notification, Members, $rootScope, Analytics){
|
||||
function($scope, Groups, Chat, User, $http, ApiUrl, Notification, Members, $rootScope, Analytics) {
|
||||
$scope.message = {content:''};
|
||||
$scope._sending = false;
|
||||
|
||||
@@ -23,7 +23,7 @@ habitrpg.controller('ChatCtrl', ['$scope', 'Groups', 'Chat', 'User', '$http', 'A
|
||||
return message.highlight;
|
||||
}
|
||||
|
||||
$scope.postChat = function(group, message){
|
||||
$scope.postChat = function(group, message) {
|
||||
if (_.isEmpty(message) || $scope._sending) return;
|
||||
$scope._sending = true;
|
||||
|
||||
@@ -55,8 +55,12 @@ habitrpg.controller('ChatCtrl', ['$scope', 'Groups', 'Chat', 'User', '$http', 'A
|
||||
} else {
|
||||
Analytics.track({'hitType':'event','eventCategory':'behavior','eventAction':'group chat','groupType':group.type,'privacy':group.privacy});
|
||||
}
|
||||
}, function(err){
|
||||
})
|
||||
.catch(function (err) {
|
||||
$scope._sending = false;
|
||||
if (err.data.message === env.t('bannedWordUsed')) {
|
||||
alert(err.data.message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -128,5 +128,37 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', '
|
||||
.then(function (response) {
|
||||
$rootScope.openModal('private-message', {controller: 'MemberModalCtrl'});
|
||||
});
|
||||
};
|
||||
|
||||
$scope.memberProfileName = function (memberId) {
|
||||
var member = _.find($scope.groupCopy.members, function (member) { return member._id === memberId; });
|
||||
return member.profile.name;
|
||||
};
|
||||
|
||||
$scope.addManager = function () {
|
||||
Groups.Group.addManager($scope.groupCopy._id, $scope.groupCopy._newManager)
|
||||
.then(function (response) {
|
||||
$scope.groupCopy._newManager = '';
|
||||
$scope.groupCopy.managers = response.data.data.managers;
|
||||
});
|
||||
};
|
||||
|
||||
$scope.removeManager = function (memberId) {
|
||||
Groups.Group.removeManager($scope.groupCopy._id, memberId)
|
||||
.then(function (response) {
|
||||
$scope.groupCopy._newManager = '';
|
||||
$scope.groupCopy.managers = response.data.data.managers;
|
||||
});
|
||||
};
|
||||
|
||||
$scope.isManager = function (memberId, group) {
|
||||
return Boolean(group.managers[memberId]);
|
||||
}
|
||||
|
||||
$scope.userCanApprove = function (userId, group) {
|
||||
if (!group) return false;
|
||||
var leader = group.leader._id === userId;
|
||||
var userIsManager = !!group.managers[userId];
|
||||
return leader || userIsManager;
|
||||
};
|
||||
}]);
|
||||
|
||||
@@ -1,16 +1,45 @@
|
||||
"use strict";
|
||||
|
||||
habitrpg.controller("HallHeroesCtrl", ['$scope', '$rootScope', 'User', 'Notification', 'ApiUrl', 'Hall',
|
||||
function($scope, $rootScope, User, Notification, ApiUrl, Hall) {
|
||||
habitrpg.controller("HallHeroesCtrl", ['$scope', '$rootScope', 'User', 'Notification', 'ApiUrl', 'Hall', 'Content',
|
||||
function($scope, $rootScope, User, Notification, ApiUrl, Hall, Content) {
|
||||
$scope.hero = undefined;
|
||||
$scope.currentHeroIndex = undefined;
|
||||
$scope.heroes = [];
|
||||
$scope.allItemPaths = getAllItemPaths();
|
||||
|
||||
Hall.getHeroes()
|
||||
.then(function (response) {
|
||||
$scope.heroes = response.data.data;
|
||||
});
|
||||
|
||||
function _getFormattedItemReference (pathPrefix, keys, values) {
|
||||
var finishedString = '\n'.concat('path: ', pathPrefix, ', ', 'value: {', values, '}\n');
|
||||
|
||||
_.each(keys, function (key) {
|
||||
finishedString = finishedString.concat('\t', pathPrefix, '.', key, '\n');
|
||||
});
|
||||
return finishedString;
|
||||
}
|
||||
|
||||
function getAllItemPaths () {
|
||||
var quests = _getFormattedItemReference('items.quests', _.keys(Content.quests), 'Numeric Quantity');
|
||||
var mounts = _getFormattedItemReference('items.mounts', _.keys(Content.mountInfo), 'Boolean');
|
||||
var food = _getFormattedItemReference('items.food', _.keys(Content.food), 'Numeric Quantity');
|
||||
var eggs = _getFormattedItemReference('items.eggs', _.keys(Content.eggs), 'Numeric Quantity');
|
||||
var hatchingPotions = _getFormattedItemReference('items.hatchingPotions', _.keys(Content.hatchingPotions), 'Numeric Quantity');
|
||||
var pets = _getFormattedItemReference('items.pets', _.keys(Content.petInfo), '-1: Owns Mount, 0: Not Owned, 1-49: Progress to mount');
|
||||
var special = _getFormattedItemReference('items.special', _.keys(Content.special), 'Numeric Quantity');
|
||||
var gear = _getFormattedItemReference('items.gear.owned', _.keys(Content.gear.flat), 'Boolean');
|
||||
|
||||
var equippedGear = '\nEquipped Gear:\n\titems.gear.{equipped/costume}.{head/headAccessory/eyewear/armor/body/back/shield/weapon}.{gearKey}\n';
|
||||
var equippedPet = '\nEquipped Pet:\n\titems.currentPet.{petKey}\n';
|
||||
var equippedMount = '\nEquipped Mount:\n\titems.currentMount.{mountKey}\n';
|
||||
|
||||
var data = quests.concat(mounts, food, eggs, hatchingPotions, pets, special, gear, equippedGear, equippedPet, equippedMount);
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
$scope.loadHero = function(uuid, heroIndex) {
|
||||
$scope.currentHeroIndex = heroIndex;
|
||||
Hall.getHero(uuid)
|
||||
|
||||
@@ -116,10 +116,10 @@ angular.module('habitrpg')
|
||||
return selectNotificationValue(false, false, false, false, false, true, false, false);
|
||||
};
|
||||
|
||||
$scope.viewGroupApprovalNotification = function (notification, $index) {
|
||||
$scope.viewGroupApprovalNotification = function (notification, $index, navigate) {
|
||||
User.readNotification(notification.id);
|
||||
User.user.groupNotifications.splice($index, 1);
|
||||
$state.go("options.social.guilds.detail", {gid: notification.data.groupId});
|
||||
if (navigate) $state.go("options.social.guilds.detail", {gid: notification.data.groupId});
|
||||
};
|
||||
|
||||
$scope.groupApprovalNotificationIcon = function (notification) {
|
||||
|
||||
@@ -89,14 +89,20 @@ habitrpg.controller('NotificationCtrl',
|
||||
var notificationsToRead = [];
|
||||
var scoreTaskNotification;
|
||||
|
||||
User.user.groupNotifications = []; // Flush group notifictions
|
||||
|
||||
after.forEach(function (notification) {
|
||||
if (lastShownNotifications.indexOf(notification.id) !== -1) {
|
||||
return;
|
||||
}
|
||||
|
||||
lastShownNotifications.push(notification.id);
|
||||
if (lastShownNotifications.length > 10) {
|
||||
lastShownNotifications.splice(0, 9);
|
||||
// Some notifications are not marked read here, so we need to fix this system
|
||||
// to handle notifications differently
|
||||
if (['GROUP_TASK_APPROVED', 'GROUP_TASK_APPROVAL'].indexOf(notification.type) === -1) {
|
||||
lastShownNotifications.push(notification.id);
|
||||
if (lastShownNotifications.length > 10) {
|
||||
lastShownNotifications.splice(0, 9);
|
||||
}
|
||||
}
|
||||
|
||||
var markAsRead = true;
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
|
||||
// Make user and settings available for everyone through root scope.
|
||||
habitrpg.controller('SettingsCtrl',
|
||||
['$scope', 'User', '$rootScope', '$http', 'ApiUrl', 'Guide', '$location', '$timeout', 'Content', 'Notification', 'Shared', 'Social', '$compile',
|
||||
function($scope, User, $rootScope, $http, ApiUrl, Guide, $location, $timeout, Content, Notification, Shared, Social, $compile) {
|
||||
['$scope', 'User', '$rootScope', '$http', 'ApiUrl', 'Guide', '$location', '$modalStack', '$timeout', 'Content', 'Notification', 'Shared', 'Social', '$compile',
|
||||
function($scope, User, $rootScope, $http, ApiUrl, Guide, $location, $modalStack, $timeout, Content, Notification, Shared, Social, $compile) {
|
||||
var RELEASE_ANIMAL_TYPES = {
|
||||
pets: 'releasePets',
|
||||
mounts: 'releaseMounts',
|
||||
@@ -164,14 +164,21 @@ habitrpg.controller('SettingsCtrl',
|
||||
$scope.restore = function(){
|
||||
var stats = $scope.restoreValues.stats,
|
||||
achievements = $scope.restoreValues.achievements;
|
||||
|
||||
if (stats.lvl < 1) {
|
||||
Notification.error(env.t('invalidLevel'), true);
|
||||
return;
|
||||
}
|
||||
|
||||
User.set({
|
||||
"stats.hp": stats.hp,
|
||||
"stats.exp": stats.exp,
|
||||
"stats.gp": stats.gp,
|
||||
"stats.lvl": stats.lvl,
|
||||
"stats.mp": stats.mp,
|
||||
"achievements.streak": achievements.streak
|
||||
'stats.hp': stats.hp,
|
||||
'stats.exp': stats.exp,
|
||||
'stats.gp': stats.gp,
|
||||
'stats.lvl': stats.lvl,
|
||||
'stats.mp': stats.mp,
|
||||
'achievements.streak': achievements.streak
|
||||
});
|
||||
$modalStack.dismissAll();
|
||||
}
|
||||
|
||||
$scope.reset = function(){
|
||||
|
||||
@@ -108,6 +108,26 @@ angular.module('habitrpg')
|
||||
});
|
||||
};
|
||||
|
||||
Group.addManager = function(gid, memberId) {
|
||||
return $http({
|
||||
method: "POST",
|
||||
url: groupApiURLPrefix + '/' + gid + '/add-manager/',
|
||||
data: {
|
||||
managerId: memberId,
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
Group.removeManager = function(gid, memberId) {
|
||||
return $http({
|
||||
method: "POST",
|
||||
url: groupApiURLPrefix + '/' + gid + '/remove-manager/',
|
||||
data: {
|
||||
managerId: memberId,
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
$rootScope.$on('syncPartyRequest', function (event, options) {
|
||||
if (options.type === 'user_update') {
|
||||
var index = _.findIndex(data.party.members, function(user) { return user._id === options.user._id; });
|
||||
@@ -221,7 +241,7 @@ angular.module('habitrpg')
|
||||
|
||||
function inviteOrStartParty (group) {
|
||||
Analytics.track({'hitType':'event','eventCategory':'button','eventAction':'click','eventLabel':'Invite Friends'});
|
||||
|
||||
|
||||
var sendInviteText = window.env.t('sendInvitations');
|
||||
if (group.type !== 'party' && group.type !== 'guild') {
|
||||
$location.path("/options/groups/party");
|
||||
|
||||
@@ -6,25 +6,25 @@
|
||||
}
|
||||
.promo_backgrounds_armoire_201602 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1573px 0px;
|
||||
background-position: -1573px -295px;
|
||||
width: 141px;
|
||||
height: 294px;
|
||||
}
|
||||
.promo_backgrounds_armoire_201603 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -849px -600px;
|
||||
background-position: -1573px 0px;
|
||||
width: 141px;
|
||||
height: 294px;
|
||||
}
|
||||
.promo_backgrounds_armoire_201604 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1150px 0px;
|
||||
background-position: -1150px -442px;
|
||||
width: 140px;
|
||||
height: 441px;
|
||||
}
|
||||
.promo_backgrounds_armoire_201605 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -423px -1042px;
|
||||
background-position: -1291px -442px;
|
||||
width: 140px;
|
||||
height: 441px;
|
||||
}
|
||||
@@ -42,37 +42,37 @@
|
||||
}
|
||||
.promo_backgrounds_armoire_201608 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -568px -600px;
|
||||
background-position: -710px -600px;
|
||||
width: 140px;
|
||||
height: 439px;
|
||||
}
|
||||
.promo_backgrounds_armoire_201609 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -709px -600px;
|
||||
background-position: -851px -600px;
|
||||
width: 139px;
|
||||
height: 438px;
|
||||
}
|
||||
.promo_backgrounds_armoire_201610 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1291px 0px;
|
||||
background-position: -1432px 0px;
|
||||
width: 140px;
|
||||
height: 441px;
|
||||
}
|
||||
.promo_backgrounds_armoire_201611 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -141px -1042px;
|
||||
background-position: 0px -1042px;
|
||||
width: 140px;
|
||||
height: 441px;
|
||||
}
|
||||
.promo_backgrounds_armoire_201612 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1432px 0px;
|
||||
background-position: -141px -1042px;
|
||||
width: 140px;
|
||||
height: 441px;
|
||||
}
|
||||
.promo_backgrounds_armoire_201701 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1150px -442px;
|
||||
background-position: -282px -1042px;
|
||||
width: 140px;
|
||||
height: 441px;
|
||||
}
|
||||
@@ -84,11 +84,17 @@
|
||||
}
|
||||
.promo_backgrounds_armoire_201703 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -142px -600px;
|
||||
background-position: -840px -148px;
|
||||
width: 141px;
|
||||
height: 441px;
|
||||
}
|
||||
.promo_backgrounds_armoire_201704 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -426px -600px;
|
||||
width: 141px;
|
||||
height: 441px;
|
||||
}
|
||||
.promo_backgrounds_armoire_201705 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: 0px -600px;
|
||||
width: 141px;
|
||||
@@ -96,7 +102,7 @@
|
||||
}
|
||||
.promo_bees {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -982px -148px;
|
||||
background-position: -142px -600px;
|
||||
width: 141px;
|
||||
height: 441px;
|
||||
}
|
||||
@@ -132,7 +138,7 @@
|
||||
}
|
||||
.promo_classes_fall_2016 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1573px -295px;
|
||||
background-position: -1573px -590px;
|
||||
width: 103px;
|
||||
height: 348px;
|
||||
}
|
||||
@@ -144,49 +150,49 @@
|
||||
}
|
||||
.promo_contrib_spotlight_Keith {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1573px -980px;
|
||||
background-position: -1715px -1536px;
|
||||
width: 87px;
|
||||
height: 111px;
|
||||
}
|
||||
.promo_contrib_spotlight_beffymaroo {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1715px -922px;
|
||||
background-position: -1715px -626px;
|
||||
width: 114px;
|
||||
height: 147px;
|
||||
}
|
||||
.promo_contrib_spotlight_blade {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1573px -868px;
|
||||
background-position: -1715px -1424px;
|
||||
width: 89px;
|
||||
height: 111px;
|
||||
}
|
||||
.promo_contrib_spotlight_cantras {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1573px -1201px;
|
||||
background-position: -1803px -1536px;
|
||||
width: 87px;
|
||||
height: 109px;
|
||||
}
|
||||
.promo_contrib_spotlight_dewines {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1573px -1092px;
|
||||
background-position: -1573px -939px;
|
||||
width: 89px;
|
||||
height: 108px;
|
||||
}
|
||||
.promo_contrib_spotlight_megan {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1573px -644px;
|
||||
background-position: -1715px -1200px;
|
||||
width: 90px;
|
||||
height: 111px;
|
||||
}
|
||||
.promo_contrib_spotlight_shanaqui {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1573px -756px;
|
||||
background-position: -1715px -1312px;
|
||||
width: 90px;
|
||||
height: 111px;
|
||||
}
|
||||
.promo_cow {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1291px -442px;
|
||||
background-position: -1432px -442px;
|
||||
width: 140px;
|
||||
height: 441px;
|
||||
}
|
||||
@@ -198,7 +204,7 @@
|
||||
}
|
||||
.promo_dilatoryDistress {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -182px -1755px;
|
||||
background-position: -1474px -1664px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
@@ -216,37 +222,37 @@
|
||||
}
|
||||
.promo_enchanted_armoire_201507 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: 0px -1664px;
|
||||
background-position: -1341px -1042px;
|
||||
width: 217px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_enchanted_armoire_201508 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -218px -1664px;
|
||||
background-position: -468px -1664px;
|
||||
width: 180px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_enchanted_armoire_201509 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1415px -1664px;
|
||||
background-position: -928px -1664px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_enchanted_armoire_201511 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1715px -1428px;
|
||||
background-position: -1715px -1018px;
|
||||
width: 122px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_enchanted_armoire_201601 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -273px -1755px;
|
||||
background-position: -364px -1767px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_fairy_potions {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -840px -148px;
|
||||
background-position: -982px -148px;
|
||||
width: 141px;
|
||||
height: 441px;
|
||||
}
|
||||
@@ -258,7 +264,7 @@
|
||||
}
|
||||
.promo_ghost_potions {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: 0px -1042px;
|
||||
background-position: -1291px 0px;
|
||||
width: 140px;
|
||||
height: 441px;
|
||||
}
|
||||
@@ -276,25 +282,25 @@
|
||||
}
|
||||
.promo_habitoween_2016 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -282px -1042px;
|
||||
background-position: -1150px 0px;
|
||||
width: 140px;
|
||||
height: 441px;
|
||||
}
|
||||
.promo_haunted_hair {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1715px -1070px;
|
||||
background-position: -1715px -774px;
|
||||
width: 100px;
|
||||
height: 137px;
|
||||
}
|
||||
.promo_holly_potions {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -426px -600px;
|
||||
background-position: -568px -600px;
|
||||
width: 141px;
|
||||
height: 440px;
|
||||
}
|
||||
.promo_item_notif {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -849px -895px;
|
||||
background-position: 0px -1664px;
|
||||
width: 249px;
|
||||
height: 102px;
|
||||
}
|
||||
@@ -312,13 +318,13 @@
|
||||
}
|
||||
.promo_mystery_201405 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1779px -1664px;
|
||||
background-position: 0px -1767px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201406 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: 0px -1755px;
|
||||
background-position: -1432px -884px;
|
||||
width: 90px;
|
||||
height: 96px;
|
||||
}
|
||||
@@ -330,169 +336,169 @@
|
||||
}
|
||||
.promo_mystery_201408 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1829px -1208px;
|
||||
background-position: -1821px -912px;
|
||||
width: 60px;
|
||||
height: 71px;
|
||||
}
|
||||
.promo_mystery_201409 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1688px -1664px;
|
||||
background-position: -182px -1767px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201410 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1573px -1417px;
|
||||
background-position: -1806px -1200px;
|
||||
width: 72px;
|
||||
height: 63px;
|
||||
}
|
||||
.promo_mystery_201411 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -91px -1755px;
|
||||
background-position: -837px -1664px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201412 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1836px -1519px;
|
||||
background-position: -1836px -1109px;
|
||||
width: 42px;
|
||||
height: 66px;
|
||||
}
|
||||
.promo_mystery_201501 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1830px -1004px;
|
||||
background-position: -1830px -708px;
|
||||
width: 48px;
|
||||
height: 63px;
|
||||
}
|
||||
.promo_mystery_201502 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -960px -1664px;
|
||||
background-position: -91px -1767px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201503 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1233px -1664px;
|
||||
background-position: -1656px -1664px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201504 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1821px -1322px;
|
||||
background-position: -1806px -1312px;
|
||||
width: 60px;
|
||||
height: 69px;
|
||||
}
|
||||
.promo_mystery_201505 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1597px -1664px;
|
||||
background-position: -1110px -1664px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201506 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1838px -1428px;
|
||||
background-position: -1838px -1018px;
|
||||
width: 42px;
|
||||
height: 69px;
|
||||
}
|
||||
.promo_mystery_201507 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1432px -884px;
|
||||
background-position: -1573px -1260px;
|
||||
width: 90px;
|
||||
height: 105px;
|
||||
}
|
||||
.promo_mystery_201508 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -775px -1664px;
|
||||
background-position: -1291px -884px;
|
||||
width: 93px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201509 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -455px -1755px;
|
||||
background-position: -273px -1767px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201510 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -399px -1664px;
|
||||
background-position: -1150px -884px;
|
||||
width: 93px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201511 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -364px -1755px;
|
||||
background-position: -1019px -1664px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201512 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1830px -922px;
|
||||
background-position: -1830px -626px;
|
||||
width: 60px;
|
||||
height: 81px;
|
||||
}
|
||||
.promo_mystery_201601 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1715px -1519px;
|
||||
background-position: -1715px -1109px;
|
||||
width: 120px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201602 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1051px -1664px;
|
||||
background-position: -1292px -1664px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201603 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1142px -1664px;
|
||||
background-position: -1383px -1664px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201604 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -493px -1664px;
|
||||
background-position: -991px -895px;
|
||||
width: 93px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201605 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1324px -1664px;
|
||||
background-position: -1565px -1664px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201606 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1573px -1311px;
|
||||
background-position: -1573px -1048px;
|
||||
width: 90px;
|
||||
height: 105px;
|
||||
}
|
||||
.promo_mystery_201607 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1506px -1664px;
|
||||
background-position: -1747px -1664px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201608 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -587px -1664px;
|
||||
background-position: -649px -1664px;
|
||||
width: 93px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201609 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -681px -1664px;
|
||||
background-position: -743px -1664px;
|
||||
width: 93px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_201610 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1816px -1070px;
|
||||
background-position: -1816px -774px;
|
||||
width: 63px;
|
||||
height: 84px;
|
||||
}
|
||||
.promo_mystery_201611 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1150px -884px;
|
||||
background-position: -1573px -1366px;
|
||||
width: 90px;
|
||||
height: 99px;
|
||||
}
|
||||
@@ -504,7 +510,7 @@
|
||||
}
|
||||
.promo_mystery_201701 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1291px -884px;
|
||||
background-position: -1573px -1154px;
|
||||
width: 90px;
|
||||
height: 105px;
|
||||
}
|
||||
@@ -522,31 +528,31 @@
|
||||
}
|
||||
.promo_mystery_201704 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -869px -1664px;
|
||||
background-position: -1201px -1664px;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_mystery_3014 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1341px -1042px;
|
||||
background-position: -250px -1664px;
|
||||
width: 217px;
|
||||
height: 90px;
|
||||
}
|
||||
.promo_new_hair_fall2016 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1432px -442px;
|
||||
background-position: -423px -1042px;
|
||||
width: 140px;
|
||||
height: 441px;
|
||||
}
|
||||
.promo_orca {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1715px -1322px;
|
||||
background-position: -1715px -912px;
|
||||
width: 105px;
|
||||
height: 105px;
|
||||
}
|
||||
.promo_partyhats {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1715px -1610px;
|
||||
background-position: -1432px -981px;
|
||||
width: 115px;
|
||||
height: 47px;
|
||||
}
|
||||
@@ -574,27 +580,3 @@
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
.promo_peppermint_flame {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1715px -626px;
|
||||
width: 140px;
|
||||
height: 147px;
|
||||
}
|
||||
.promo_pet_skins {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1715px -774px;
|
||||
width: 140px;
|
||||
height: 147px;
|
||||
}
|
||||
.customize-option.promo_pet_skins {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1740px -789px;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
.promo_pyromancer {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-0.png);
|
||||
background-position: -1715px -1208px;
|
||||
width: 113px;
|
||||
height: 113px;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,30 @@
|
||||
.promo_peppermint_flame {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1629px -934px;
|
||||
width: 140px;
|
||||
height: 147px;
|
||||
}
|
||||
.promo_pet_skins {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1488px -934px;
|
||||
width: 140px;
|
||||
height: 147px;
|
||||
}
|
||||
.customize-option.promo_pet_skins {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1513px -949px;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
.promo_pyromancer {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1639px -632px;
|
||||
width: 113px;
|
||||
height: 113px;
|
||||
}
|
||||
.promo_rainbow_armor {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1488px -1341px;
|
||||
background-position: -1358px -556px;
|
||||
width: 92px;
|
||||
height: 103px;
|
||||
}
|
||||
@@ -30,13 +54,13 @@
|
||||
}
|
||||
.promo_splashyskins {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1488px -1082px;
|
||||
background-position: -1488px -1230px;
|
||||
width: 198px;
|
||||
height: 91px;
|
||||
}
|
||||
.customize-option.promo_splashyskins {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1513px -1097px;
|
||||
background-position: -1513px -1245px;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
@@ -54,7 +78,7 @@
|
||||
}
|
||||
.promo_spring_classes_2017 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -589px -916px;
|
||||
background-position: -899px -916px;
|
||||
width: 309px;
|
||||
height: 147px;
|
||||
}
|
||||
@@ -120,7 +144,7 @@
|
||||
}
|
||||
.promo_takethis_armor {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1639px -632px;
|
||||
background-position: -1358px -377px;
|
||||
width: 114px;
|
||||
height: 87px;
|
||||
}
|
||||
@@ -132,19 +156,19 @@
|
||||
}
|
||||
.promo_turkey_day_2016 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: 0px -765px;
|
||||
background-position: -1076px 0px;
|
||||
width: 140px;
|
||||
height: 441px;
|
||||
}
|
||||
.promo_unconventional_armor {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1639px -720px;
|
||||
background-position: -1639px -871px;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
.promo_unconventional_armor2 {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1687px -1082px;
|
||||
background-position: -1687px -1230px;
|
||||
width: 70px;
|
||||
height: 74px;
|
||||
}
|
||||
@@ -156,7 +180,7 @@
|
||||
}
|
||||
.promo_veteran_pets {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1627px -934px;
|
||||
background-position: -1627px -1082px;
|
||||
width: 146px;
|
||||
height: 75px;
|
||||
}
|
||||
@@ -174,7 +198,7 @@
|
||||
}
|
||||
.promo_winter_fireworks {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1488px -934px;
|
||||
background-position: -1488px -1082px;
|
||||
width: 138px;
|
||||
height: 147px;
|
||||
}
|
||||
@@ -186,19 +210,19 @@
|
||||
}
|
||||
.promo_wintery_skins {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1076px 0px;
|
||||
background-position: 0px -765px;
|
||||
width: 140px;
|
||||
height: 441px;
|
||||
}
|
||||
.customize-option.promo_wintery_skins {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1101px -15px;
|
||||
background-position: -25px -780px;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
.promo_winteryhair {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1488px -1174px;
|
||||
background-position: -1488px -1322px;
|
||||
width: 152px;
|
||||
height: 75px;
|
||||
}
|
||||
@@ -210,7 +234,7 @@
|
||||
}
|
||||
.npc_viirus {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1488px -1250px;
|
||||
background-position: -1358px -465px;
|
||||
width: 108px;
|
||||
height: 90px;
|
||||
}
|
||||
@@ -222,7 +246,7 @@
|
||||
}
|
||||
.promo_backtoschool {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1488px -481px;
|
||||
background-position: -1488px -632px;
|
||||
width: 150px;
|
||||
height: 150px;
|
||||
}
|
||||
@@ -234,13 +258,13 @@
|
||||
}
|
||||
.promo_startingover {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1488px -632px;
|
||||
background-position: -1488px -783px;
|
||||
width: 150px;
|
||||
height: 150px;
|
||||
}
|
||||
.promo_valentines {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -899px -916px;
|
||||
background-position: -589px -916px;
|
||||
width: 309px;
|
||||
height: 147px;
|
||||
}
|
||||
@@ -252,7 +276,7 @@
|
||||
}
|
||||
.scene_coding {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1488px -330px;
|
||||
background-position: -1488px -481px;
|
||||
width: 150px;
|
||||
height: 150px;
|
||||
}
|
||||
@@ -276,7 +300,7 @@
|
||||
}
|
||||
.scene_phone_peek {
|
||||
background-image: url(/static/sprites/spritesmith-largeSprites-1.png);
|
||||
background-position: -1488px -783px;
|
||||
background-position: -1488px -330px;
|
||||
width: 150px;
|
||||
height: 150px;
|
||||
}
|
||||
|
||||