Merge branch 'api-v3-groups' into api-v3-members
1
.gitignore
vendored
@@ -28,5 +28,6 @@ website/public/docs
|
|||||||
coverage
|
coverage
|
||||||
coverage.html
|
coverage.html
|
||||||
common/dist/scripts/*
|
common/dist/scripts/*
|
||||||
|
common/dist/sprites/habitrpg-shared.css
|
||||||
|
|
||||||
test/spec/mocks/translations.js
|
test/spec/mocks/translations.js
|
||||||
|
|||||||
1
common/dist/sprites/habitrpg-shared.css
vendored
@@ -18,7 +18,7 @@
|
|||||||
}
|
}
|
||||||
.2014_Fall_Warrior_PROMO {
|
.2014_Fall_Warrior_PROMO {
|
||||||
background-image: url(spritesmith-largeSprites-0.png);
|
background-image: url(spritesmith-largeSprites-0.png);
|
||||||
background-position: -452px -417px;
|
background-position: -306px -402px;
|
||||||
width: 90px;
|
width: 90px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
@@ -54,7 +54,7 @@
|
|||||||
}
|
}
|
||||||
.promo_dilatoryDistress {
|
.promo_dilatoryDistress {
|
||||||
background-image: url(spritesmith-largeSprites-0.png);
|
background-image: url(spritesmith-largeSprites-0.png);
|
||||||
background-position: -91px -1085px;
|
background-position: -364px -1085px;
|
||||||
width: 90px;
|
width: 90px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
@@ -78,7 +78,7 @@
|
|||||||
}
|
}
|
||||||
.promo_enchanted_armoire_201509 {
|
.promo_enchanted_armoire_201509 {
|
||||||
background-image: url(spritesmith-largeSprites-0.png);
|
background-image: url(spritesmith-largeSprites-0.png);
|
||||||
background-position: -364px -1085px;
|
background-position: -91px -1085px;
|
||||||
width: 90px;
|
width: 90px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
@@ -90,7 +90,7 @@
|
|||||||
}
|
}
|
||||||
.promo_enchanted_armoire_201601 {
|
.promo_enchanted_armoire_201601 {
|
||||||
background-image: url(spritesmith-largeSprites-0.png);
|
background-image: url(spritesmith-largeSprites-0.png);
|
||||||
background-position: -306px -402px;
|
background-position: -452px -417px;
|
||||||
width: 90px;
|
width: 90px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
@@ -318,13 +318,13 @@
|
|||||||
}
|
}
|
||||||
.promo_springclasses2014 {
|
.promo_springclasses2014 {
|
||||||
background-image: url(spritesmith-largeSprites-0.png);
|
background-image: url(spritesmith-largeSprites-0.png);
|
||||||
background-position: -648px -724px;
|
background-position: -1119px 0px;
|
||||||
width: 288px;
|
width: 288px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
.promo_springclasses2015 {
|
.promo_springclasses2015 {
|
||||||
background-image: url(spritesmith-largeSprites-0.png);
|
background-image: url(spritesmith-largeSprites-0.png);
|
||||||
background-position: -1119px 0px;
|
background-position: -648px -724px;
|
||||||
width: 288px;
|
width: 288px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
common/dist/sprites/spritesmith-largeSprites-0.png
vendored
|
Before Width: | Height: | Size: 212 KiB After Width: | Height: | Size: 213 KiB |
560
common/dist/sprites/spritesmith-main-0.css
vendored
BIN
common/dist/sprites/spritesmith-main-0.png
vendored
|
Before Width: | Height: | Size: 274 KiB After Width: | Height: | Size: 274 KiB |
1760
common/dist/sprites/spritesmith-main-1.css
vendored
BIN
common/dist/sprites/spritesmith-main-1.png
vendored
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 61 KiB |
1274
common/dist/sprites/spritesmith-main-10.css
vendored
BIN
common/dist/sprites/spritesmith-main-10.png
vendored
|
Before Width: | Height: | Size: 153 KiB After Width: | Height: | Size: 152 KiB |
1716
common/dist/sprites/spritesmith-main-11.css
vendored
BIN
common/dist/sprites/spritesmith-main-11.png
vendored
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 98 KiB |
1576
common/dist/sprites/spritesmith-main-2.css
vendored
BIN
common/dist/sprites/spritesmith-main-2.png
vendored
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
492
common/dist/sprites/spritesmith-main-3.css
vendored
BIN
common/dist/sprites/spritesmith-main-3.png
vendored
|
Before Width: | Height: | Size: 141 KiB After Width: | Height: | Size: 142 KiB |
72
common/dist/sprites/spritesmith-main-4.css
vendored
@@ -858,13 +858,13 @@
|
|||||||
}
|
}
|
||||||
.headAccessory_mystery_301405 {
|
.headAccessory_mystery_301405 {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -910px -1061px;
|
background-position: -1001px -1061px;
|
||||||
width: 90px;
|
width: 90px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
.head_mystery_301405 {
|
.head_mystery_301405 {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -1001px -1061px;
|
background-position: -910px -1061px;
|
||||||
width: 90px;
|
width: 90px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
@@ -882,13 +882,13 @@
|
|||||||
}
|
}
|
||||||
.shop_headAccessory_mystery_301405 {
|
.shop_headAccessory_mystery_301405 {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -1066px -1516px;
|
background-position: -1025px -1516px;
|
||||||
width: 40px;
|
width: 40px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
}
|
}
|
||||||
.shop_head_mystery_301405 {
|
.shop_head_mystery_301405 {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -1025px -1516px;
|
background-position: -1066px -1516px;
|
||||||
width: 40px;
|
width: 40px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
}
|
}
|
||||||
@@ -948,97 +948,97 @@
|
|||||||
}
|
}
|
||||||
.headAccessory_special_spring2015Healer {
|
.headAccessory_special_spring2015Healer {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: 0px -1152px;
|
background-position: -728px -1152px;
|
||||||
width: 90px;
|
width: 90px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
.headAccessory_special_spring2015Mage {
|
.headAccessory_special_spring2015Mage {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -91px -1152px;
|
background-position: -819px -1152px;
|
||||||
width: 90px;
|
width: 90px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
.headAccessory_special_spring2015Rogue {
|
.headAccessory_special_spring2015Rogue {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -182px -1152px;
|
background-position: -910px -1152px;
|
||||||
width: 90px;
|
width: 90px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
.headAccessory_special_spring2015Warrior {
|
.headAccessory_special_spring2015Warrior {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -273px -1152px;
|
background-position: -1001px -1152px;
|
||||||
width: 90px;
|
width: 90px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
.headAccessory_special_springHealer {
|
.headAccessory_special_springHealer {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -364px -1152px;
|
background-position: -1092px -1152px;
|
||||||
width: 90px;
|
width: 90px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
.headAccessory_special_springMage {
|
.headAccessory_special_springMage {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -455px -1152px;
|
background-position: -1183px -1152px;
|
||||||
width: 90px;
|
width: 90px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
.headAccessory_special_springRogue {
|
.headAccessory_special_springRogue {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -546px -1152px;
|
background-position: -1300px 0px;
|
||||||
width: 90px;
|
width: 90px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
.headAccessory_special_springWarrior {
|
.headAccessory_special_springWarrior {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -637px -1152px;
|
background-position: -1300px -91px;
|
||||||
width: 90px;
|
width: 90px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
.head_special_spring2015Healer {
|
.head_special_spring2015Healer {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -728px -1152px;
|
background-position: 0px -1152px;
|
||||||
width: 90px;
|
width: 90px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
.head_special_spring2015Mage {
|
.head_special_spring2015Mage {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -819px -1152px;
|
background-position: -91px -1152px;
|
||||||
width: 90px;
|
width: 90px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
.head_special_spring2015Rogue {
|
.head_special_spring2015Rogue {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -910px -1152px;
|
background-position: -182px -1152px;
|
||||||
width: 90px;
|
width: 90px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
.head_special_spring2015Warrior {
|
.head_special_spring2015Warrior {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -1001px -1152px;
|
background-position: -273px -1152px;
|
||||||
width: 90px;
|
width: 90px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
.head_special_springHealer {
|
.head_special_springHealer {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -1092px -1152px;
|
background-position: -364px -1152px;
|
||||||
width: 90px;
|
width: 90px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
.head_special_springMage {
|
.head_special_springMage {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -1183px -1152px;
|
background-position: -455px -1152px;
|
||||||
width: 90px;
|
width: 90px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
.head_special_springRogue {
|
.head_special_springRogue {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -1300px 0px;
|
background-position: -546px -1152px;
|
||||||
width: 90px;
|
width: 90px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
.head_special_springWarrior {
|
.head_special_springWarrior {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -1300px -91px;
|
background-position: -637px -1152px;
|
||||||
width: 90px;
|
width: 90px;
|
||||||
height: 90px;
|
height: 90px;
|
||||||
}
|
}
|
||||||
@@ -1128,97 +1128,97 @@
|
|||||||
}
|
}
|
||||||
.shop_headAccessory_special_spring2015Healer {
|
.shop_headAccessory_special_spring2015Healer {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -615px -1516px;
|
background-position: -287px -1516px;
|
||||||
width: 40px;
|
width: 40px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
}
|
}
|
||||||
.shop_headAccessory_special_spring2015Mage {
|
.shop_headAccessory_special_spring2015Mage {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -574px -1516px;
|
background-position: -246px -1516px;
|
||||||
width: 40px;
|
width: 40px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
}
|
}
|
||||||
.shop_headAccessory_special_spring2015Rogue {
|
.shop_headAccessory_special_spring2015Rogue {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -533px -1516px;
|
background-position: -205px -1516px;
|
||||||
width: 40px;
|
width: 40px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
}
|
}
|
||||||
.shop_headAccessory_special_spring2015Warrior {
|
.shop_headAccessory_special_spring2015Warrior {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -492px -1516px;
|
background-position: -164px -1516px;
|
||||||
width: 40px;
|
width: 40px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
}
|
}
|
||||||
.shop_headAccessory_special_springHealer {
|
.shop_headAccessory_special_springHealer {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -451px -1516px;
|
background-position: -123px -1516px;
|
||||||
width: 40px;
|
width: 40px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
}
|
}
|
||||||
.shop_headAccessory_special_springMage {
|
.shop_headAccessory_special_springMage {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -410px -1516px;
|
background-position: -82px -1516px;
|
||||||
width: 40px;
|
width: 40px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
}
|
}
|
||||||
.shop_headAccessory_special_springRogue {
|
.shop_headAccessory_special_springRogue {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -369px -1516px;
|
background-position: -41px -1516px;
|
||||||
width: 40px;
|
width: 40px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
}
|
}
|
||||||
.shop_headAccessory_special_springWarrior {
|
.shop_headAccessory_special_springWarrior {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -328px -1516px;
|
background-position: 0px -1516px;
|
||||||
width: 40px;
|
width: 40px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
}
|
}
|
||||||
.shop_head_special_spring2015Healer {
|
.shop_head_special_spring2015Healer {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -287px -1516px;
|
background-position: -615px -1516px;
|
||||||
width: 40px;
|
width: 40px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
}
|
}
|
||||||
.shop_head_special_spring2015Mage {
|
.shop_head_special_spring2015Mage {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -246px -1516px;
|
background-position: -574px -1516px;
|
||||||
width: 40px;
|
width: 40px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
}
|
}
|
||||||
.shop_head_special_spring2015Rogue {
|
.shop_head_special_spring2015Rogue {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -205px -1516px;
|
background-position: -533px -1516px;
|
||||||
width: 40px;
|
width: 40px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
}
|
}
|
||||||
.shop_head_special_spring2015Warrior {
|
.shop_head_special_spring2015Warrior {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -164px -1516px;
|
background-position: -492px -1516px;
|
||||||
width: 40px;
|
width: 40px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
}
|
}
|
||||||
.shop_head_special_springHealer {
|
.shop_head_special_springHealer {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -123px -1516px;
|
background-position: -451px -1516px;
|
||||||
width: 40px;
|
width: 40px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
}
|
}
|
||||||
.shop_head_special_springMage {
|
.shop_head_special_springMage {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -82px -1516px;
|
background-position: -410px -1516px;
|
||||||
width: 40px;
|
width: 40px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
}
|
}
|
||||||
.shop_head_special_springRogue {
|
.shop_head_special_springRogue {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: -41px -1516px;
|
background-position: -369px -1516px;
|
||||||
width: 40px;
|
width: 40px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
}
|
}
|
||||||
.shop_head_special_springWarrior {
|
.shop_head_special_springWarrior {
|
||||||
background-image: url(spritesmith-main-4.png);
|
background-image: url(spritesmith-main-4.png);
|
||||||
background-position: 0px -1516px;
|
background-position: -328px -1516px;
|
||||||
width: 40px;
|
width: 40px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
common/dist/sprites/spritesmith-main-4.png
vendored
|
Before Width: | Height: | Size: 129 KiB After Width: | Height: | Size: 129 KiB |
500
common/dist/sprites/spritesmith-main-5.css
vendored
BIN
common/dist/sprites/spritesmith-main-5.png
vendored
|
Before Width: | Height: | Size: 374 KiB After Width: | Height: | Size: 370 KiB |
614
common/dist/sprites/spritesmith-main-6.css
vendored
BIN
common/dist/sprites/spritesmith-main-6.png
vendored
|
Before Width: | Height: | Size: 175 KiB After Width: | Height: | Size: 175 KiB |
648
common/dist/sprites/spritesmith-main-7.css
vendored
BIN
common/dist/sprites/spritesmith-main-7.png
vendored
|
Before Width: | Height: | Size: 142 KiB After Width: | Height: | Size: 134 KiB |
978
common/dist/sprites/spritesmith-main-8.css
vendored
BIN
common/dist/sprites/spritesmith-main-8.png
vendored
|
Before Width: | Height: | Size: 146 KiB After Width: | Height: | Size: 145 KiB |
1000
common/dist/sprites/spritesmith-main-9.css
vendored
BIN
common/dist/sprites/spritesmith-main-9.png
vendored
|
Before Width: | Height: | Size: 144 KiB After Width: | Height: | Size: 142 KiB |
|
After Width: | Height: | Size: 22 KiB |
BIN
common/img/sprites/spritesmith/quests/quest_sabretooth.png
Normal file
|
After Width: | Height: | Size: 7.1 KiB |
|
After Width: | Height: | Size: 436 B |
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 3.6 KiB |
|
After Width: | Height: | Size: 3.5 KiB |
|
After Width: | Height: | Size: 3.5 KiB |
|
After Width: | Height: | Size: 3.5 KiB |
|
After Width: | Height: | Size: 3.6 KiB |
|
After Width: | Height: | Size: 3.6 KiB |
|
After Width: | Height: | Size: 3.6 KiB |
|
After Width: | Height: | Size: 3.5 KiB |
|
After Width: | Height: | Size: 3.6 KiB |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 3.2 KiB |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 3.5 KiB |
@@ -125,8 +125,9 @@
|
|||||||
"mageText": "Mages learn swiftly, gaining Experience and Levels faster than other classes. They also get a great deal of Mana for using special abilities. Play a Mage if you enjoy the tactical game aspects of Habit, or if you are strongly motivated by leveling up and unlocking advanced features!",
|
"mageText": "Mages learn swiftly, gaining Experience and Levels faster than other classes. They also get a great deal of Mana for using special abilities. Play a Mage if you enjoy the tactical game aspects of Habit, or if you are strongly motivated by leveling up and unlocking advanced features!",
|
||||||
"rogueText": "Rogues love to accumulate wealth, gaining more Gold than anyone else, and are adept at finding random items. Their iconic Stealth ability lets them duck the consequences of missed Dailies. Play a Rogue if you find strong motivation from Rewards and Achievements, striving for loot and badges!",
|
"rogueText": "Rogues love to accumulate wealth, gaining more Gold than anyone else, and are adept at finding random items. Their iconic Stealth ability lets them duck the consequences of missed Dailies. Play a Rogue if you find strong motivation from Rewards and Achievements, striving for loot and badges!",
|
||||||
"healerText": "Healers stand impervious against harm, and extend that protection to others. Missed Dailies and bad Habits don't faze them much, and they have ways to recover Health from failure. Play a Healer if you enjoy assisting others in your Party, or if the idea of cheating Death through hard work inspires you!",
|
"healerText": "Healers stand impervious against harm, and extend that protection to others. Missed Dailies and bad Habits don't faze them much, and they have ways to recover Health from failure. Play a Healer if you enjoy assisting others in your Party, or if the idea of cheating Death through hard work inspires you!",
|
||||||
"optOut": "Opt Out",
|
"optOutOfClasses": "Opt Out",
|
||||||
"optOutText": "Can't be bothered with classes? Want to choose later? Opt out - you'll be a warrior with no special abilities. You can read about the class system later on the wiki and enable classes at any time under User -> Stats.",
|
"optOutOfPMs": "Opt Out",
|
||||||
|
"optOutOfClassesText": "Can't be bothered with classes? Want to choose later? Opt out - you'll be a warrior with no special abilities. You can read about the class system later on the wiki and enable classes at any time under User -> Stats.",
|
||||||
"select": "Select",
|
"select": "Select",
|
||||||
"stealth": "Stealth",
|
"stealth": "Stealth",
|
||||||
"stealthNewDay": "When a new day begins, you will avoid damage from this many missed Dailies.",
|
"stealthNewDay": "When a new day begins, you will avoid damage from this many missed Dailies.",
|
||||||
|
|||||||
@@ -147,6 +147,10 @@
|
|||||||
"questEggUnicornMountText": "Winged Unicorn",
|
"questEggUnicornMountText": "Winged Unicorn",
|
||||||
"questEggUnicornAdjective": "a magical",
|
"questEggUnicornAdjective": "a magical",
|
||||||
|
|
||||||
|
"questEggSabretoothText": "Sabretooth Tiger",
|
||||||
|
"questEggSabretoothMountText": "Sabretooth Tiger",
|
||||||
|
"questEggSabretoothAdjective": "a ferocious",
|
||||||
|
|
||||||
"eggNotes": "Find a hatching potion to pour on this egg, and it will hatch into <%= eggAdjective(locale) %> <%= eggText(locale) %>.",
|
"eggNotes": "Find a hatching potion to pour on this egg, and it will hatch into <%= eggAdjective(locale) %> <%= eggText(locale) %>.",
|
||||||
|
|
||||||
"hatchingPotionBase": "Base",
|
"hatchingPotionBase": "Base",
|
||||||
|
|||||||
@@ -325,5 +325,12 @@
|
|||||||
"questUnicornCompletion": "Impressed by your diligence and strength, the Unicorn Queen at last agrees that your cause is worthy. She allows you to ride on her back as she soars to the source of Conquest Creek. As she lowers her golden horn to the befouled waters, a brilliant blue light rises from the water’s surface. It is so blinding that you are forced to close your eyes. When you open them a moment later, the unicorn is gone. However, @rosiesully lets out a cry of delight: the water is now clear, and three shining eggs rest at the creek’s edge.",
|
"questUnicornCompletion": "Impressed by your diligence and strength, the Unicorn Queen at last agrees that your cause is worthy. She allows you to ride on her back as she soars to the source of Conquest Creek. As she lowers her golden horn to the befouled waters, a brilliant blue light rises from the water’s surface. It is so blinding that you are forced to close your eyes. When you open them a moment later, the unicorn is gone. However, @rosiesully lets out a cry of delight: the water is now clear, and three shining eggs rest at the creek’s edge.",
|
||||||
"questUnicornBoss": "The Unicorn Queen",
|
"questUnicornBoss": "The Unicorn Queen",
|
||||||
"questUnicornDropUnicornEgg": "Unicorn (Egg)",
|
"questUnicornDropUnicornEgg": "Unicorn (Egg)",
|
||||||
"questUnicornUnlockText": "Unlocks purchasable Unicorn eggs in the Market"
|
"questUnicornUnlockText": "Unlocks purchasable Unicorn eggs in the Market",
|
||||||
|
|
||||||
|
"questSabretoothText": "The Sabre Cat",
|
||||||
|
"questSabretoothNotes": "A roaring monster is terrorizing Habitica! The creature stalks through the wilds and woods, then bursts forth to attack before vanishing again. It's been hunting innocent pandas and frightening the flying pigs into fleeing their pens to roost in the trees. @Inventrix and @icefelis explain that the Zombie Sabre Cat was set free while they were excavating in the ancient, untouched ice-fields of the Stoikalm Steppes. \"It was perfectly friendly at first – I don't know what happened. Please, you have to help us recapture it! Only a champion of Habitica can subdue this prehistoric beast!\"",
|
||||||
|
"questSabretoothCompletion": "After a long and tiring battle, you wrestle the Zombie Sabre Cat to the ground. As you are finally able to approach, you notice a nasty cavity in one of its sabre teeth. Realising the true cause of the cat's wrath, you're able to get the cavity filled by @Fandekasp, and advise everyone to avoid feeding their friend sweets in future. The Sabre Cat flourishes, and in gratitude, its tamers send you a generous reward – a clutch of sabretooth eggs!",
|
||||||
|
"questSabretoothBoss": "Zombie Sabre Cat",
|
||||||
|
"questSabretoothDropSabretoothEgg": "Sabretooth (Egg)",
|
||||||
|
"questSabretoothUnlockText": "Unlocks purchasable Sabretooth eggs in the Market"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,6 @@
|
|||||||
"dailyDueDefaultView": "Set Dailies default to 'due' tab",
|
"dailyDueDefaultView": "Set Dailies default to 'due' tab",
|
||||||
"dailyDueDefaultViewPop": "With this option set, the Dailies tasks will default to 'due' instead of 'all'",
|
"dailyDueDefaultViewPop": "With this option set, the Dailies tasks will default to 'due' instead of 'all'",
|
||||||
"reverseChatOrder": "Show chat messages in reverse order",
|
"reverseChatOrder": "Show chat messages in reverse order",
|
||||||
"reverseChatOrderPop": "Show the messages in the Tarvern, Guild, and Party chats in reverse order, so that the oldest are on top.",
|
|
||||||
"startCollapsed": "Tag list in tasks starts collapsed",
|
"startCollapsed": "Tag list in tasks starts collapsed",
|
||||||
"startCollapsedPop": "With this option set, the list of task tags will be hidden when you first open a task for editing.",
|
"startCollapsedPop": "With this option set, the list of task tags will be hidden when you first open a task for editing.",
|
||||||
"startAdvCollapsed": "Advanced Options in tasks start collapsed",
|
"startAdvCollapsed": "Advanced Options in tasks start collapsed",
|
||||||
|
|||||||
@@ -932,6 +932,13 @@ api.questEggs = {
|
|||||||
return u.achievements.quests && (u.achievements.quests.unicorn != null) > 0;
|
return u.achievements.quests && (u.achievements.quests.unicorn != null) > 0;
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
Sabretooth: {
|
||||||
|
text: t('questEggSabretoothText'),
|
||||||
|
adjective: t('questEggSabretoothAdjective'),
|
||||||
|
canBuy: (function(u) {
|
||||||
|
return u.achievements.quests && (u.achievements.quests.sabretooth != null) > 0;
|
||||||
|
})
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
_.each(api.questEggs, function(egg, key) {
|
_.each(api.questEggs, function(egg, key) {
|
||||||
@@ -2981,6 +2988,38 @@ api.quests = {
|
|||||||
unlock: t('questUnicornUnlockText')
|
unlock: t('questUnicornUnlockText')
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
sabretooth: {
|
||||||
|
text: t('questSabretoothText'),
|
||||||
|
notes: t('questSabretoothNotes'),
|
||||||
|
completion: t('questSabretoothCompletion'),
|
||||||
|
value: 4,
|
||||||
|
category: 'pet',
|
||||||
|
boss: {
|
||||||
|
name: t('questSabretoothBoss'),
|
||||||
|
hp: 1000,
|
||||||
|
str: 2
|
||||||
|
},
|
||||||
|
drop: {
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
type: 'eggs',
|
||||||
|
key: 'Sabretooth',
|
||||||
|
text: t('questSabretoothDropSabretoothEgg')
|
||||||
|
}, {
|
||||||
|
type: 'eggs',
|
||||||
|
key: 'Sabretooth',
|
||||||
|
text: t('questSabretoothDropSabretoothEgg')
|
||||||
|
}, {
|
||||||
|
type: 'eggs',
|
||||||
|
key: 'Sabretooth',
|
||||||
|
text: t('questSabretoothDropSabretoothEgg')
|
||||||
|
}
|
||||||
|
],
|
||||||
|
gp: 67,
|
||||||
|
exp: 650,
|
||||||
|
unlock: t('questSabretoothUnlockText')
|
||||||
|
}
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
_.each(api.quests, function(v, key) {
|
_.each(api.quests, function(v, key) {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import {
|
|||||||
generateGroup,
|
generateGroup,
|
||||||
generateUser,
|
generateUser,
|
||||||
resetHabiticaDB,
|
resetHabiticaDB,
|
||||||
} from '../../../helpers/api-integration.helper';
|
} from '../../../helpers/api-integration/v2';
|
||||||
|
|
||||||
describe('GET /groups', () => {
|
describe('GET /groups', () => {
|
||||||
const NUMBER_OF_PUBLIC_GUILDS = 3;
|
const NUMBER_OF_PUBLIC_GUILDS = 3;
|
||||||
@@ -22,6 +22,7 @@ describe('GET /groups', () => {
|
|||||||
name: 'public guild - is member',
|
name: 'public guild - is member',
|
||||||
type: 'guild',
|
type: 'guild',
|
||||||
privacy: 'public',
|
privacy: 'public',
|
||||||
|
}, {
|
||||||
members: [leader._id, user._id],
|
members: [leader._id, user._id],
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -35,6 +36,7 @@ describe('GET /groups', () => {
|
|||||||
name: 'private guild - is member',
|
name: 'private guild - is member',
|
||||||
type: 'guild',
|
type: 'guild',
|
||||||
privacy: 'private',
|
privacy: 'private',
|
||||||
|
}, {
|
||||||
members: [leader._id, user._id],
|
members: [leader._id, user._id],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import {
|
|||||||
createAndPopulateGroup,
|
createAndPopulateGroup,
|
||||||
generateUser,
|
generateUser,
|
||||||
translate as t,
|
translate as t,
|
||||||
} from '../../../helpers/api-integration.helper';
|
} from '../../../helpers/api-integration/v2';
|
||||||
import {
|
import {
|
||||||
find,
|
find,
|
||||||
each,
|
each,
|
||||||
@@ -24,7 +24,7 @@ describe('GET /groups/:id', () => {
|
|||||||
groupDetails,
|
groupDetails,
|
||||||
});
|
});
|
||||||
|
|
||||||
leader = groupData.leader;
|
leader = groupData.groupLeader;
|
||||||
member = groupData.members[0];
|
member = groupData.members[0];
|
||||||
createdGroup = groupData.group;
|
createdGroup = groupData.group;
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import {
|
|||||||
generateGroup,
|
generateGroup,
|
||||||
generateUser,
|
generateUser,
|
||||||
translate as t,
|
translate as t,
|
||||||
} from '../../../helpers/api-integration.helper';
|
} from '../../../helpers/api-integration/v2';
|
||||||
|
|
||||||
describe('POST /groups', () => {
|
describe('POST /groups', () => {
|
||||||
context('All groups', () => {
|
context('All groups', () => {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import {
|
|||||||
generateGroup,
|
generateGroup,
|
||||||
generateUser,
|
generateUser,
|
||||||
translate as t,
|
translate as t,
|
||||||
} from '../../../helpers/api-integration.helper';
|
} from '../../../helpers/api-integration/v2';
|
||||||
|
|
||||||
describe('POST /groups/:id', () => {
|
describe('POST /groups/:id', () => {
|
||||||
context('user is not the leader of the group', () => {
|
context('user is not the leader of the group', () => {
|
||||||
@@ -58,10 +58,10 @@ describe('POST /groups/:id', () => {
|
|||||||
description: 'New group description',
|
description: 'New group description',
|
||||||
});
|
});
|
||||||
|
|
||||||
let group = await user.get(`/groups/${usersGroup._id}`);
|
await usersGroup.sync();
|
||||||
|
|
||||||
expect(group.name).to.eql('New Group Title');
|
expect(usersGroup.name).to.eql('New Group Title');
|
||||||
expect(group.description).to.eql('New group description');
|
expect(usersGroup.description).to.eql('New group description');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ import {
|
|||||||
createAndPopulateGroup,
|
createAndPopulateGroup,
|
||||||
generateUser,
|
generateUser,
|
||||||
translate as t,
|
translate as t,
|
||||||
} from '../../../helpers/api-integration.helper';
|
} from '../../../helpers/api-integration/v2';
|
||||||
import { each, find } from 'lodash';
|
import { each } from 'lodash';
|
||||||
|
|
||||||
describe('POST /groups/:id/join', () => {
|
describe('POST /groups/:id/join', () => {
|
||||||
context('user is already a member of the group', () => {
|
context('user is already a member of the group', () => {
|
||||||
@@ -30,10 +30,9 @@ describe('POST /groups/:id/join', () => {
|
|||||||
it(`allows user to join a ${groupType}`, async () => {
|
it(`allows user to join a ${groupType}`, async () => {
|
||||||
await invitee.post(`/groups/${group._id}/join`);
|
await invitee.post(`/groups/${group._id}/join`);
|
||||||
|
|
||||||
let members = (await invitee.get(`/groups/${group._id}`)).members;
|
await group.sync();
|
||||||
let userInGroup = find(members, '_id', invitee._id);
|
|
||||||
|
|
||||||
expect(userInGroup).to.exist;
|
expect(group.members).to.include(invitee._id);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -79,10 +78,9 @@ describe('POST /groups/:id/join', () => {
|
|||||||
it('allows user to join a public guild', async () => {
|
it('allows user to join a public guild', async () => {
|
||||||
await user.post(`/groups/${group._id}/join`);
|
await user.post(`/groups/${group._id}/join`);
|
||||||
|
|
||||||
let members = (await user.get(`/groups/${group._id}`)).members;
|
await group.sync();
|
||||||
let userInGroup = find(members, '_id', user._id);
|
|
||||||
|
|
||||||
expect(userInGroup).to.exist;
|
expect(group.members).to.include(user._id);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -98,14 +96,16 @@ describe('POST /groups/:id/join', () => {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
group = groupData.group;
|
group = groupData.group;
|
||||||
await groupData.leader.post(`/groups/${group._id}/leave`);
|
await groupData.groupLeader.post(`/groups/${group._id}/leave`);
|
||||||
user = await generateUser();
|
user = await generateUser();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('makes the joining user the leader', async () => {
|
it('makes the joining user the leader', async () => {
|
||||||
await user.post(`/groups/${group._id}/join`);
|
await user.post(`/groups/${group._id}/join`);
|
||||||
|
|
||||||
await expect(user.get(`/groups/${group._id}`)).to.eventually.have.deep.property('leader._id', user._id);
|
await group.sync();
|
||||||
|
|
||||||
|
await expect(group.leader).to.eql(user._id);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
import {
|
import {
|
||||||
checkExistence,
|
checkExistence,
|
||||||
createAndPopulateGroup,
|
createAndPopulateGroup,
|
||||||
} from '../../../helpers/api-integration.helper';
|
} from '../../../helpers/api-integration/v2';
|
||||||
import { find } from 'lodash';
|
|
||||||
|
|
||||||
describe('POST /groups/:id/leave', () => {
|
describe('POST /groups/:id/leave', () => {
|
||||||
context('user is not member of the group', () => {
|
context('user is not member of the group', () => {
|
||||||
@@ -29,10 +28,9 @@ describe('POST /groups/:id/leave', () => {
|
|||||||
it('leaves the group', async () => {
|
it('leaves the group', async () => {
|
||||||
await user.post(`/groups/${group._id}/leave`);
|
await user.post(`/groups/${group._id}/leave`);
|
||||||
|
|
||||||
let members = (await user.get(`/groups/${group._id}`)).members;
|
await group.sync();
|
||||||
let userInGroup = find(members, '_id', user._id);
|
|
||||||
|
|
||||||
expect(userInGroup).to.not.be.ok;
|
expect(group.members).to.not.include(user._id);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -48,7 +46,7 @@ describe('POST /groups/:id/leave', () => {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
user = groupData.leader;
|
user = groupData.groupLeader;
|
||||||
group = groupData.group;
|
group = groupData.group;
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -71,7 +69,7 @@ describe('POST /groups/:id/leave', () => {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
user = groupData.leader;
|
user = groupData.groupLeader;
|
||||||
group = groupData.group;
|
group = groupData.group;
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -95,7 +93,7 @@ describe('POST /groups/:id/leave', () => {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
user = groupData.leader;
|
user = groupData.groupLeader;
|
||||||
group = groupData.group;
|
group = groupData.group;
|
||||||
invitee1 = groupData.invitees[0];
|
invitee1 = groupData.invitees[0];
|
||||||
invitee2 = groupData.invitees[1];
|
invitee2 = groupData.invitees[1];
|
||||||
@@ -122,7 +120,7 @@ describe('POST /groups/:id/leave', () => {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
user = groupData.leader;
|
user = groupData.groupLeader;
|
||||||
group = groupData.group;
|
group = groupData.group;
|
||||||
invitee1 = groupData.invitees[0];
|
invitee1 = groupData.invitees[0];
|
||||||
invitee2 = groupData.invitees[1];
|
invitee2 = groupData.invitees[1];
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import {
|
import {
|
||||||
createAndPopulateGroup,
|
createAndPopulateGroup,
|
||||||
translate as t,
|
translate as t,
|
||||||
} from '../../../helpers/api-integration.helper';
|
} from '../../../helpers/api-integration/v2';
|
||||||
|
|
||||||
describe('POST /groups/:id/removeMember', () => {
|
describe('POST /groups/:id/removeMember', () => {
|
||||||
context('user is not member of the group', () => {
|
context('user is not member of the group', () => {
|
||||||
@@ -24,7 +24,7 @@ describe('POST /groups/:id/removeMember', () => {
|
|||||||
privacy: 'public',
|
privacy: 'public',
|
||||||
},
|
},
|
||||||
}).then((res) => {
|
}).then((res) => {
|
||||||
leader = res.leader;
|
leader = res.groupLeader;
|
||||||
member = res.members[0];
|
member = res.members[0];
|
||||||
group = res.group;
|
group = res.group;
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import {
|
import {
|
||||||
createAndPopulateGroup,
|
createAndPopulateGroup,
|
||||||
translate as t,
|
translate as t,
|
||||||
} from '../../../../helpers/api-integration.helper';
|
} from '../../../../helpers/api-integration/v2';
|
||||||
|
|
||||||
describe('DELETE /groups/:id/chat', () => {
|
describe('DELETE /groups/:id/chat', () => {
|
||||||
let group, message, user;
|
let group, message, user;
|
||||||
@@ -14,7 +14,7 @@ describe('DELETE /groups/:id/chat', () => {
|
|||||||
},
|
},
|
||||||
}).then((res) => {
|
}).then((res) => {
|
||||||
group = res.group;
|
group = res.group;
|
||||||
user = res.leader;
|
user = res.groupLeader;
|
||||||
|
|
||||||
return user.post(`/groups/${group._id}/chat`, null, { message: 'Some message' });
|
return user.post(`/groups/${group._id}/chat`, null, { message: 'Some message' });
|
||||||
}).then((res) => {
|
}).then((res) => {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import {
|
import {
|
||||||
createAndPopulateGroup,
|
createAndPopulateGroup,
|
||||||
} from '../../../../helpers/api-integration.helper';
|
} from '../../../../helpers/api-integration/v2';
|
||||||
|
|
||||||
describe('GET /groups/:id/chat', () => {
|
describe('GET /groups/:id/chat', () => {
|
||||||
context('group with multiple messages', () => {
|
context('group with multiple messages', () => {
|
||||||
@@ -16,7 +16,7 @@ describe('GET /groups/:id/chat', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
group = groupData.group;
|
group = groupData.group;
|
||||||
user = groupData.leader;
|
user = groupData.groupLeader;
|
||||||
member = groupData.members[0];
|
member = groupData.members[0];
|
||||||
|
|
||||||
await member.post(`/groups/${group._id}/chat`, null, { message: 'Group member message' });
|
await member.post(`/groups/${group._id}/chat`, null, { message: 'Group member message' });
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import {
|
import {
|
||||||
createAndPopulateGroup,
|
createAndPopulateGroup,
|
||||||
translate as t,
|
translate as t,
|
||||||
} from '../../../../helpers/api-integration.helper';
|
} from '../../../../helpers/api-integration/v2';
|
||||||
|
|
||||||
describe('POST /groups/:id/chat', () => {
|
describe('POST /groups/:id/chat', () => {
|
||||||
let group, user;
|
let group, user;
|
||||||
@@ -14,7 +14,7 @@ describe('POST /groups/:id/chat', () => {
|
|||||||
},
|
},
|
||||||
}).then((res) => {
|
}).then((res) => {
|
||||||
group = res.group;
|
group = res.group;
|
||||||
user = res.leader;
|
user = res.groupLeader;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -2,27 +2,26 @@ import {
|
|||||||
createAndPopulateGroup,
|
createAndPopulateGroup,
|
||||||
generateUser,
|
generateUser,
|
||||||
translate as t,
|
translate as t,
|
||||||
} from '../../../../helpers/api-integration.helper';
|
} from '../../../../helpers/api-integration/v2';
|
||||||
|
|
||||||
describe('POST /groups/:id/chat/:id/clearflags', () => {
|
describe('POST /groups/:id/chat/:id/clearflags', () => {
|
||||||
let group;
|
let guild;
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
return createAndPopulateGroup({
|
let { group } = await createAndPopulateGroup({
|
||||||
groupDetails: {
|
groupDetails: {
|
||||||
type: 'guild',
|
type: 'guild',
|
||||||
privacy: 'public',
|
privacy: 'public',
|
||||||
members: 1,
|
members: 1,
|
||||||
flagCount: 1,
|
|
||||||
chat: [{
|
chat: [{
|
||||||
id: 'message-to-clear',
|
id: 'message-to-clear',
|
||||||
flagCount: 1,
|
flagCount: 1,
|
||||||
flags: { 'some-id': true },
|
flags: { 'some-id': true },
|
||||||
}],
|
}],
|
||||||
},
|
},
|
||||||
}).then((res) => {
|
|
||||||
group = res.group;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
guild = group;
|
||||||
});
|
});
|
||||||
|
|
||||||
context('non admin', () => {
|
context('non admin', () => {
|
||||||
@@ -33,7 +32,7 @@ describe('POST /groups/:id/chat/:id/clearflags', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('cannot clear flags', async () => {
|
it('cannot clear flags', async () => {
|
||||||
return expect(nonadmin.post(`/groups/${group._id}/chat/message-to-clear/clearflags`))
|
return expect(nonadmin.post(`/groups/${guild._id}/chat/message-to-clear/clearflags`))
|
||||||
.to.eventually.be.rejected.and.eql({
|
.to.eventually.be.rejected.and.eql({
|
||||||
code: 401,
|
code: 401,
|
||||||
text: t('messageGroupChatAdminClearFlagCount'),
|
text: t('messageGroupChatAdminClearFlagCount'),
|
||||||
@@ -53,23 +52,23 @@ describe('POST /groups/:id/chat/:id/clearflags', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('clears flags', async () => {
|
it('clears flags', async () => {
|
||||||
return admin.post(`/groups/${group._id}/chat/message-to-clear/clearflags`).then(() => {
|
return admin.post(`/groups/${guild._id}/chat/message-to-clear/clearflags`).then(() => {
|
||||||
return admin.get(`/groups/${group._id}/chat`);
|
return admin.get(`/groups/${guild._id}/chat`);
|
||||||
}).then((messages) => {
|
}).then((messages) => {
|
||||||
expect(messages[0].flagCount).to.eql(0);
|
expect(messages[0].flagCount).to.eql(0);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('leaves old flags on the flag object', async () => {
|
it('leaves old flags on the flag object', async () => {
|
||||||
return admin.post(`/groups/${group._id}/chat/message-to-clear/clearflags`).then(() => {
|
return admin.post(`/groups/${guild._id}/chat/message-to-clear/clearflags`).then(() => {
|
||||||
return admin.get(`/groups/${group._id}/chat`);
|
return admin.get(`/groups/${guild._id}/chat`);
|
||||||
}).then((messages) => {
|
}).then((messages) => {
|
||||||
expect(messages[0].flags).to.have.property('some-id', true);
|
expect(messages[0].flags).to.have.property('some-id', true);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('returns error if message does not exist', async () => {
|
it('returns error if message does not exist', async () => {
|
||||||
return expect(admin.post(`/groups/${group._id}/chat/non-existant-message/clearflags`))
|
return expect(admin.post(`/groups/${guild._id}/chat/non-existant-message/clearflags`))
|
||||||
.to.eventually.be.rejected.and.eql({
|
.to.eventually.be.rejected.and.eql({
|
||||||
code: 404,
|
code: 404,
|
||||||
text: t('messageGroupChatNotFound'),
|
text: t('messageGroupChatNotFound'),
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import {
|
|||||||
createAndPopulateGroup,
|
createAndPopulateGroup,
|
||||||
generateUser,
|
generateUser,
|
||||||
translate as t,
|
translate as t,
|
||||||
} from '../../../../helpers/api-integration.helper';
|
} from '../../../../helpers/api-integration/v2';
|
||||||
|
|
||||||
describe('POST /groups/:id/chat/:id/flag', () => {
|
describe('POST /groups/:id/chat/:id/flag', () => {
|
||||||
context('another member\'s message', () => {
|
context('another member\'s message', () => {
|
||||||
@@ -17,7 +17,7 @@ describe('POST /groups/:id/chat/:id/flag', () => {
|
|||||||
members: 1,
|
members: 1,
|
||||||
}).then((res) => {
|
}).then((res) => {
|
||||||
group = res.group;
|
group = res.group;
|
||||||
user = res.leader;
|
user = res.groupLeader;
|
||||||
member = res.members[0];
|
member = res.members[0];
|
||||||
|
|
||||||
return member.post(`/groups/${group._id}/chat`, null, { message: 'Group member message' });
|
return member.post(`/groups/${group._id}/chat`, null, { message: 'Group member message' });
|
||||||
@@ -56,7 +56,7 @@ describe('POST /groups/:id/chat/:id/flag', () => {
|
|||||||
},
|
},
|
||||||
}).then((res) => {
|
}).then((res) => {
|
||||||
group = res.group;
|
group = res.group;
|
||||||
user = res.leader;
|
user = res.groupLeader;
|
||||||
|
|
||||||
return user.post(`/groups/${group._id}/chat`, null, { message: 'User\'s own message' });
|
return user.post(`/groups/${group._id}/chat`, null, { message: 'User\'s own message' });
|
||||||
}).then((res) => {
|
}).then((res) => {
|
||||||
@@ -84,7 +84,7 @@ describe('POST /groups/:id/chat/:id/flag', () => {
|
|||||||
},
|
},
|
||||||
}).then((res) => {
|
}).then((res) => {
|
||||||
group = res.group;
|
group = res.group;
|
||||||
user = res.leader;
|
user = res.groupLeader;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -121,7 +121,7 @@ describe('POST /groups/:id/chat/:id/flag', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
group = groupData.group;
|
group = groupData.group;
|
||||||
user = groupData.leader;
|
user = groupData.groupLeader;
|
||||||
});
|
});
|
||||||
|
|
||||||
it('changes only the message that is flagged', async () => {
|
it('changes only the message that is flagged', async () => {
|
||||||
@@ -166,7 +166,7 @@ describe('POST /groups/:id/chat/:id/flag', () => {
|
|||||||
members: 1,
|
members: 1,
|
||||||
}).then((res) => {
|
}).then((res) => {
|
||||||
group = res.group;
|
group = res.group;
|
||||||
user = res.leader;
|
user = res.groupLeader;
|
||||||
member = res.members[0];
|
member = res.members[0];
|
||||||
|
|
||||||
return member.post(`/groups/${group._id}/chat`, null, { message: 'Group member message' });
|
return member.post(`/groups/${group._id}/chat`, null, { message: 'Group member message' });
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import {
|
|||||||
createAndPopulateGroup,
|
createAndPopulateGroup,
|
||||||
generateUser,
|
generateUser,
|
||||||
translate as t,
|
translate as t,
|
||||||
} from '../../../../helpers/api-integration.helper';
|
} from '../../../../helpers/api-integration/v2';
|
||||||
|
|
||||||
describe('POST /groups/:id/chat/:id/like', () => {
|
describe('POST /groups/:id/chat/:id/like', () => {
|
||||||
context('another member\'s message', () => {
|
context('another member\'s message', () => {
|
||||||
@@ -17,7 +17,7 @@ describe('POST /groups/:id/chat/:id/like', () => {
|
|||||||
members: 1,
|
members: 1,
|
||||||
}).then((res) => {
|
}).then((res) => {
|
||||||
group = res.group;
|
group = res.group;
|
||||||
user = res.leader;
|
user = res.groupLeader;
|
||||||
member = res.members[0];
|
member = res.members[0];
|
||||||
|
|
||||||
return member.post(`/groups/${group._id}/chat`, null, { message: 'Group member message' });
|
return member.post(`/groups/${group._id}/chat`, null, { message: 'Group member message' });
|
||||||
@@ -53,7 +53,7 @@ describe('POST /groups/:id/chat/:id/like', () => {
|
|||||||
},
|
},
|
||||||
}).then((res) => {
|
}).then((res) => {
|
||||||
group = res.group;
|
group = res.group;
|
||||||
user = res.leader;
|
user = res.groupLeader;
|
||||||
|
|
||||||
return user.post(`/groups/${group._id}/chat`, null, { message: 'User\'s own message' });
|
return user.post(`/groups/${group._id}/chat`, null, { message: 'User\'s own message' });
|
||||||
}).then((res) => {
|
}).then((res) => {
|
||||||
@@ -94,7 +94,7 @@ describe('POST /groups/:id/chat/:id/like', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
group = groupData.group;
|
group = groupData.group;
|
||||||
user = groupData.leader;
|
user = groupData.groupLeader;
|
||||||
});
|
});
|
||||||
|
|
||||||
it('changes only the message that is liked', async () => {
|
it('changes only the message that is liked', async () => {
|
||||||
@@ -134,7 +134,7 @@ describe('POST /groups/:id/chat/:id/like', () => {
|
|||||||
},
|
},
|
||||||
}).then((res) => {
|
}).then((res) => {
|
||||||
group = res.group;
|
group = res.group;
|
||||||
user = res.leader;
|
user = res.groupLeader;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import {
|
|||||||
generateUser,
|
generateUser,
|
||||||
requester,
|
requester,
|
||||||
translate as t,
|
translate as t,
|
||||||
} from '../../../helpers/api-integration.helper';
|
} from '../../../helpers/api-integration/v2';
|
||||||
import { v4 as generateRandomUserName } from 'uuid';
|
import { v4 as generateRandomUserName } from 'uuid';
|
||||||
import { each } from 'lodash';
|
import { each } from 'lodash';
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import {requester} from '../../../helpers/api-integration.helper';
|
import {requester} from '../../../helpers/api-integration/v2';
|
||||||
|
|
||||||
describe('Status', () => {
|
describe('Status', () => {
|
||||||
it('returns a status of up when server is up', async () => {
|
it('returns a status of up when server is up', async () => {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import {
|
|||||||
createAndPopulateGroup,
|
createAndPopulateGroup,
|
||||||
generateGroup,
|
generateGroup,
|
||||||
generateUser,
|
generateUser,
|
||||||
} from '../../../helpers/api-integration.helper';
|
} from '../../../helpers/api-integration/v2';
|
||||||
import { find } from 'lodash';
|
import { find } from 'lodash';
|
||||||
|
|
||||||
describe('DELETE /user', () => {
|
describe('DELETE /user', () => {
|
||||||
@@ -36,28 +36,30 @@ describe('DELETE /user', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('deletes party when user is the only member', async () => {
|
it('deletes party when user is the only member', async () => {
|
||||||
return expect(user.del('/user').then(() => {
|
await user.del('/user');
|
||||||
return checkExistence('groups', party._id);
|
await expect(checkExistence('groups', party._id)).to.eventually.eql(false);
|
||||||
})).to.eventually.eql(false);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
context('last member of a private guild', () => {
|
context('last member of a private guild', () => {
|
||||||
let guild;
|
let guild, lastMember;
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
return generateGroup(user, {
|
let {
|
||||||
|
groupLeader,
|
||||||
|
group,
|
||||||
|
} = await createAndPopulateGroup({
|
||||||
type: 'guild',
|
type: 'guild',
|
||||||
privacy: 'private',
|
privacy: 'private',
|
||||||
}).then((group) => {
|
|
||||||
guild = group;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
guild = group;
|
||||||
|
lastMember = groupLeader;
|
||||||
});
|
});
|
||||||
|
|
||||||
it('deletes guild when user is the only member', async () => {
|
it('deletes guild when user is the only member', async () => {
|
||||||
return expect(user.del('/user').then(() => {
|
await lastMember.del('/user');
|
||||||
return checkExistence('groups', guild._id);
|
await expect(checkExistence('groups', guild._id)).to.eventually.eql(false);
|
||||||
})).to.eventually.eql(false);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -74,7 +76,7 @@ describe('DELETE /user', () => {
|
|||||||
}).then((res) => {
|
}).then((res) => {
|
||||||
group = res.group;
|
group = res.group;
|
||||||
newLeader = res.members[0];
|
newLeader = res.members[0];
|
||||||
oldLeader = res.leader;
|
oldLeader = res.groupLeader;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import {
|
import {
|
||||||
generateUser,
|
generateUser,
|
||||||
} from '../../../helpers/api-integration.helper';
|
} from '../../../helpers/api-integration/v2';
|
||||||
|
|
||||||
describe('GET /user', () => {
|
describe('GET /user', () => {
|
||||||
let user;
|
let user;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import {
|
import {
|
||||||
generateUser,
|
generateUser,
|
||||||
} from '../../../helpers/api-integration.helper';
|
} from '../../../helpers/api-integration/v2';
|
||||||
|
|
||||||
describe('GET /user/tags', () => {
|
describe('GET /user/tags', () => {
|
||||||
let user;
|
let user;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import {
|
import {
|
||||||
generateUser,
|
generateUser,
|
||||||
translate as t,
|
translate as t,
|
||||||
} from '../../../helpers/api-integration.helper';
|
} from '../../../helpers/api-integration/v2';
|
||||||
|
|
||||||
describe('GET /user/tags/id', () => {
|
describe('GET /user/tags/id', () => {
|
||||||
let user;
|
let user;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import {
|
import {
|
||||||
generateUser,
|
generateUser,
|
||||||
translate as t,
|
translate as t,
|
||||||
} from '../../../helpers/api-integration.helper';
|
} from '../../../helpers/api-integration/v2';
|
||||||
|
|
||||||
import { each, get } from 'lodash';
|
import { each, get } from 'lodash';
|
||||||
|
|
||||||
@@ -14,15 +14,17 @@ describe('PUT /user', () => {
|
|||||||
|
|
||||||
context('Allowed Operations', () => {
|
context('Allowed Operations', () => {
|
||||||
it('updates the user', async () => {
|
it('updates the user', async () => {
|
||||||
let updatedUser = await user.put('/user', {
|
await user.put('/user', {
|
||||||
'profile.name': 'Frodo',
|
'profile.name': 'Frodo',
|
||||||
'preferences.costume': true,
|
'preferences.costume': true,
|
||||||
'stats.hp': 14,
|
'stats.hp': 14,
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(updatedUser.profile.name).to.eql('Frodo');
|
await user.sync();
|
||||||
expect(updatedUser.preferences.costume).to.eql(true);
|
|
||||||
expect(updatedUser.stats.hp).to.eql(14);
|
expect(user.profile.name).to.eql('Frodo');
|
||||||
|
expect(user.preferences.costume).to.eql(true);
|
||||||
|
expect(user.stats.hp).to.eql(14);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import {
|
import {
|
||||||
generateUser,
|
generateUser,
|
||||||
} from '../../../../helpers/api-integration.helper';
|
} from '../../../../helpers/api-integration/v2';
|
||||||
import { each } from 'lodash';
|
import { each } from 'lodash';
|
||||||
|
|
||||||
describe('GET /user/anonymized', () => {
|
describe('GET /user/anonymized', () => {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import {
|
import {
|
||||||
generateUser,
|
generateUser,
|
||||||
translate as t,
|
translate as t,
|
||||||
} from '../../../../helpers/api-integration.helper';
|
} from '../../../../helpers/api-integration/v2';
|
||||||
|
|
||||||
import { each } from 'lodash';
|
import { each } from 'lodash';
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import {
|
import {
|
||||||
generateUser,
|
generateUser,
|
||||||
} from '../../../../helpers/api-integration.helper';
|
} from '../../../../helpers/api-integration/v2';
|
||||||
|
|
||||||
describe('POST /user/pushDevice', () => {
|
describe('POST /user/pushDevice', () => {
|
||||||
let user;
|
let user;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import {
|
import {
|
||||||
generateUser,
|
generateUser,
|
||||||
translate as t,
|
translate as t,
|
||||||
} from '../../../../helpers/api-integration.helper';
|
} from '../../../../helpers/api-integration/v2';
|
||||||
|
|
||||||
describe('DELETE /user/tasks/:id', () => {
|
describe('DELETE /user/tasks/:id', () => {
|
||||||
let user, task;
|
let user, task;
|
||||||
|
|||||||