Compare commits

..

64 Commits

Author SHA1 Message Date
SabreCat 168ed02226 3.90.1 2017-05-09 19:30:31 +00:00
Sabe Jones aa253cf72e chore(i18n): update locales 2017-05-09 19:25:30 +00:00
SabreCat 247742c60d chore(news): Bailey
also adds Managers info to Group Plans page
2017-05-09 19:18:29 +00:00
yugensoft 7d89deb094 Continuation of PR #8675, fix internationalization (#8698)
* Made uneditable habits show counter reset frequency
Added counter reset frequency to counter tooltip
Solves issue https://github.com/HabitRPG/habitica/issues/8571

* Internationalization fix, pursuant to https://github.com/HabitRPG/habitica/pull/8675#discussion_r112982947

(cherry picked from commit 2adac35e31)
2017-05-09 18:54:38 +00:00
Sabe Jones c128b701fa chore(i18n): update locales 2017-05-09 18:52:38 +00:00
SabreCat f01e13ffc0 3.90.0 2017-05-09 17:53:03 +00:00
Alys 4e9d631b71 adjust banned words list -- TRIGGER / CONTENT WARNING: words about assault, slurs, etc 2017-05-09 09:21:06 +10:00
SabreCat f1de7c02e9 Merge branch 'develop' into release 2017-05-08 23:14:45 +00:00
yugensoft 4f305bd505 Updated vagrant script to fix bcrypt missing error (#8670)
* Updated npm version to match http://habitica.wikia.com/wiki/Setting_up_Habitica_Locally; added npm-pre-gyp dependency necessary for bcrypt to install

* changed npm version as per request https://github.com/HabitRPG/habitica/pull/8670#discussion_r112010106
2017-05-07 07:57:50 +10:00
Alys 024feaa2f4 add banned words to be blocked in Tavern Chat -- CONTENT WARNING: this commit contains slurs, swear words, etc 2017-05-06 07:37:17 +10:00
Sabe Jones d2dc8f1856 Release Mergeback 2017/05/03 (#8716)
* Content 2017/05 (#8714)

* feat(content): May 2017
Add Armoire, add BGs, end Spring Fling

* chore(sprites): compile

* chore(i18n): update locales

* 3.89.0
2017-05-03 15:02:54 -05:00
SabreCat 364ed8dbab 3.89.0 2017-05-03 18:22:12 +00:00
Sabe Jones 73328b6dab Content 2017/05 (#8714)
* feat(content): May 2017
Add Armoire, add BGs, end Spring Fling

* chore(sprites): compile

* chore(i18n): update locales
2017-05-03 13:21:25 -05:00
Keith Holliday e3a08c1905 Added loggly integration (#8690)
* Added loggly integration

* Added back console logger

* Updated shrinkwrap
2017-05-02 09:17:23 -06:00
Sabe Jones dad0eea9e0 Merge branch 'release' into develop 2017-04-28 19:31:22 +00:00
Sabe Jones 76849cdcaa 3.88.1 2017-04-28 19:30:33 +00:00
Sabe Jones eb6ac42717 chore(i18n): update locales 2017-04-28 19:29:56 +00:00
SabreCat d44a298e2d chore(news): Bailey 2017-04-28 19:24:32 +00:00
Alys 864ca91144 modify Market intro for eggs to clarify that quest eggs don't drop (#8680)
Ref: https://habitica.slack.com/archives/C02RK7DKF/p1491847171061587?thread_ts=1491779437.902223&cid=C02RK7DKF
2017-04-27 21:10:43 +10:00
Cai Lu 78816dd4cb Fix character values (#8541)
* Display an error when invalid values are given

* Add character values tests for settingsCtrl

* Only check for invalid level values

* Remove unnecessary validation function

* Min level of 1 on user model

* (tests) Removed stubbing on restore
2017-04-26 15:10:56 -06:00
Keith Holliday 6a99daebac continuation of PR #8074 Adding spam prevention - fixes #8060 (#8687)
* Adding code to look over the most recent messages to look for spam from a user

* Adding in translatable error message

* Adding 2 tests for spam detection

* Fixing changes requested for pull request

* Adding unit tests for group and fixing requested changes

* Fixing message and tests

* Forgot to remove this import

* Fixing lint errors

* Cleaning up the code and tests to be more readable

* Fixing lint errors

* Fixed linting issues

* Syntax fixes

* Updated grammar
2017-04-26 13:37:18 -06:00
SabreCat c9ee6c7f73 Merge branch 'release' into develop 2017-04-26 17:40:51 +00:00
Keith Holliday e2f4b0e3dc Group managers (#8591)
* Added abiltiy to add group managers

* Added ability to remove managers

* Added ability for managers to add group tasks

* Allower managers to assign tasks

* Allowed managers to unassign tasks

* Allow managers to delete group tasks

* Allowed managers to approve

* Added initial ui

* Added approval view for managers

* Allowed managers to edit

* Fixed lint issues

* Added spacing to buttons

* Removed leader from selection of group managers

* Code review updates

* Ensured approvals are only done once

* Added ability for parties to add managers

* Add notifications to all managers when approval is requests

* Removed tasks need approval notifications from all managers when task is approve

* Fixed linting issues

* Hid add managers UI from groups that are not subscribed

* Removed let from front end

* Fixed issues with post task url params

* Fixed string locales

* Removed extra limited strings

* Added cannotedit tasks function

* Added limit fields and notification check by taskId

* Localized string and other minor issues

* Added manager and leader indicator

* Added group notifications refresh on sync

* Added close button for group notifications

* Removed group approval notifications when manager is removed

* Moved leader/manager indicators to after hp

* Added manager fields to groups

* Spelling and syntax fixes
2017-04-25 08:28:56 -06:00
Keith Holliday 369702884a Prevented ios and android subs from being upgrade to group plans (#8646)
* Prevented ios and android subs from being upgrade to group plans

* Add admin email sender

* Updated admin email

* Updated get user email

* Fixed grammar issue
2017-04-24 08:01:27 -06:00
Keith Holliday d438990d18 Added block when user types a swear word listed in banned words (#8197)
* Added block when user types a swear word listed in banned words

* Moved banned words check to server

* Removed unused code

* Moved banned words to separate file and fixed grammar.

* Updated chat test

* Changed error to BadRequest

* Fixed regex matching

* Updated test banned word

* Moved banned words and cached regex

* Updated banned word message

* Add ban filter only for tavern

* Added tavern id constant

* Added more tests for banned words

* Added warning to banned words

* Added alert

* Added new regex to capture markdown

* Fixed lint, spelling and importing
2017-04-24 07:55:42 -06:00
yugensoft 7d3213fd66 Made uneditable habits show counter reset frequency (#8675)
Added counter reset frequency to counter tooltip
Solves issue https://github.com/HabitRPG/habitica/issues/8571
2017-04-22 14:01:06 -05:00
Alys bde4eafc05 add mountText for all drop eggs and quest eggs (#8678)
I've checked that all these added strings do exist in locales/en/content.json
2017-04-22 14:00:18 -05:00
Travis 5a2ba27808 Creating api for gifting Hall Of Heroes Item Reference (#8118)
* Creating specific api to vend item reference for gifting items to a user through the hall of heroes. closes #8100

* removed 'When in doubt, ask Tyler' from the hall of heroes line

* Moving hall of heroes item path call from server side to client side

* updating let to var

* Addressing PR comments
2017-04-22 13:57:41 -05:00
Keith Holliday 024268a51e Added wintery skins to content (#8645)
* Added wintery skins to content

* Removed features json

* Fixed some name issues
2017-04-22 13:54:57 -05:00
MathWhiz f7281e71e8 Change icon for NPC achievement (#8628)
* Change icon for NPC achievement

* Add npc icon
2017-04-22 13:52:45 -05:00
SabreCat 91438aff90 Merge branch 'release' into develop 2017-04-20 22:21:33 +00:00
Sabe Jones 91ed55cf66 Release mergeback v3.86.0 (#8685)
* 3.85.0

* New User Tasks for Mobile (#8682)

* feat(mobile): different default tasks

* fix(linting): missing space

* fix(user): correct client type logic

* test(integration): tasks by platform

* fix(test): remove only

* test(user): deeper checks on tasks

* refactor(test): whitespace for readability

* feat(subs): Jackalope Pets (#8684)

* chore(sprites): compile

* chore(i18n): update locales

* 3.86.0
2017-04-18 19:23:24 -05:00
Alys 4275da0a2e fix Shiny Seeds info about achievement (not given to caster) (#8679)
Ref: https://habitica.slack.com/archives/C02RK7DKF/p1492032261365388
2017-04-19 08:56:15 +10:00
Mateus Etto d9f48dcbb0 Fixed text of check-in prize when it is a set of backgrounds (#8599)
* Fixed text of check-in prize when it is a set of backgrounds

* Use existing i18n string for BGs name

* Added user.preferences.language as second parameter
2017-04-17 14:39:05 +10:00
Tyler Nychka bd6f901ccf Fix for automatic allocation not persisting #8641 (#8661) 2017-04-17 06:49:16 +10:00
SabreCat 884bf02961 Merge branch 'sabrecat/butterflies' into develop 2017-04-13 20:31:19 +00:00
Keith Holliday 7d42e8fc71 Added email invite limit (#8664)
* Added email invite limit

* change error message for sending too many invitations to instruct them to email us

* fix test error message to use variable in locales string

* add comment to warn about keeping INVITES_LIMIT low

If INVITES_LIMIT is allowed to be greater than MAX_EMAIL_INVITES_BY_USER
then the inviter can send more than MAX_EMAIL_INVITES_BY_USER invitations
at once.
2017-04-12 15:54:35 -05:00
SabreCat 0442b87608 fix(news): merge conflict 2017-04-11 22:23:27 +00:00
SabreCat c1d1a3e14e fix(translation): resolve merge conflict 2017-04-11 22:04:55 +00:00
SabreCat dd5a9aa6cc Merge branch 'sabrecat/egg-quest' into develop 2017-04-11 20:10:49 +00:00
Alys 0bb6e5f3fc edit the new issue template to emphasise that the Report a Bug guild should be used first (#8659) 2017-04-11 14:52:19 -05:00
Matteo Pagliazzi 69347df050 Merge branch 'Yutsuten-orb-rebirth' into develop 2017-04-11 17:10:50 +02:00
Matteo Pagliazzi 9cad5525e6 Merge branch 'orb-rebirth' of https://github.com/Yutsuten/habitica into Yutsuten-orb-rebirth 2017-04-11 17:10:42 +02:00
Matteo Pagliazzi b1e6aceffe Merge branch 'Yutsuten-checkin-complete-msg' into develop 2017-04-11 17:08:51 +02:00
Matteo Pagliazzi 17068875f4 Merge branch 'checkin-complete-msg' of https://github.com/Yutsuten/habitica into Yutsuten-checkin-complete-msg 2017-04-11 17:08:43 +02:00
Matteo Pagliazzi 342fc2e344 Merge branch 'paglias/fix-wrong-subs' into develop 2017-04-11 17:07:15 +02:00
Matteo Pagliazzi b8b1557e49 Merge branch 'develop' into paglias/fix-wrong-subs 2017-04-11 17:07:05 +02:00
Matteo Pagliazzi f90ef04e83 Merge branch 'eastwood-develop' into develop 2017-04-11 17:03:20 +02:00
Matteo Pagliazzi d0561512de Merge branch 'develop' of https://github.com/eastwood/habitica into eastwood-develop 2017-04-11 17:03:09 +02:00
Matteo Pagliazzi b84c672f33 remove wrong subscriptions from gift modal 2017-04-11 10:15:54 +02:00
Mateus Etto aafbb889be Merge branch 'develop' into checkin-complete-msg 2017-04-09 19:58:53 -03:00
SabreCat 13865bcf49 Merge branch 'viirus/androidFixes' into develop 2017-04-06 22:10:02 +00:00
SabreCat f9ca69196a fix(test): unpend party cap test 2017-04-06 19:58:33 +00:00
SabreCat 0e77df6e7b Merge branch 'sabrecat/shiny-seeds' into develop 2017-04-06 19:56:20 +00:00
Mateus Etto f2d9bdf7ae Updated comment 2017-03-28 06:57:20 -03:00
Mateus Etto 2d7e280598 Special message when complete all check-in prizes 2017-03-27 22:24:47 -03:00
Mateus Etto d1de41290d Remove Beat Master unlock for Rebirth 2017-03-27 19:59:24 -03:00
Clint Ryan 6956f5345e Removes test focus 2017-03-24 23:45:56 +11:00
Clint Ryan cc68abb67e Mock ENV function 2017-03-24 00:36:05 +11:00
Clint Ryan b48be4e619 Remoed logging 2017-03-23 00:43:59 +11:00
Clint Ryan 7a543d07a4 Fixes tests 2017-03-23 00:41:28 +11:00
Clint Ryan 9115be68b2 Fixes achievements injection. Now trying with Guide 2017-03-19 10:11:11 +11:00
Clint Ryan 83bd4dcf60 Add failing test, seeking help/advice 2017-03-14 12:35:48 +11:00
Clint Ryan 92b02295b5 Issue 8432: Pre-test for initial fix 2017-03-11 23:29:51 +11:00
421 changed files with 39800 additions and 37453 deletions
+4
View File
@@ -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"
}
}
+2 -2
View File
@@ -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) {
+160 -118
View File
@@ -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",
+2 -1
View File
@@ -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,
+125 -2
View File
@@ -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;
+100 -1
View File
@@ -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;
});
});
});
});
Executable → Regular
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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;
+75 -93
View File
@@ -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;
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

After

Width:  |  Height:  |  Size: 1.0 MiB

+43 -19
View File
@@ -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;
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 333 KiB

After

Width:  |  Height:  |  Size: 340 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 498 KiB

After

Width:  |  Height:  |  Size: 507 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 72 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

After

Width:  |  Height:  |  Size: 141 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 KiB

After

Width:  |  Height:  |  Size: 138 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 155 KiB

After

Width:  |  Height:  |  Size: 158 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 KiB

After

Width:  |  Height:  |  Size: 146 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 KiB

After

Width:  |  Height:  |  Size: 154 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 179 KiB

After

Width:  |  Height:  |  Size: 177 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 KiB

After

Width:  |  Height:  |  Size: 159 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

After

Width:  |  Height:  |  Size: 122 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 67 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 57 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 109 KiB

After

Width:  |  Height:  |  Size: 110 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 153 KiB

After

Width:  |  Height:  |  Size: 153 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 143 KiB

After

Width:  |  Height:  |  Size: 143 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 204 KiB

After

Width:  |  Height:  |  Size: 195 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 447 KiB

After

Width:  |  Height:  |  Size: 440 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

After

Width:  |  Height:  |  Size: 183 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

+3
View File
@@ -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;
};
}]);
+31 -2
View File
@@ -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;
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More