Merge branch 'develop' into armoire
Conflicts: common/dist/sprites/habitrpg-shared.css common/dist/sprites/spritesmith0.css common/dist/sprites/spritesmith0.png common/dist/sprites/spritesmith1.css common/dist/sprites/spritesmith1.png common/dist/sprites/spritesmith2.css common/dist/sprites/spritesmith2.png common/dist/sprites/spritesmith3.css common/dist/sprites/spritesmith3.png common/dist/sprites/spritesmith4.css common/dist/sprites/spritesmith4.png common/dist/sprites/spritesmith5.css common/dist/sprites/spritesmith5.png common/dist/sprites/spritesmith6.css common/dist/sprites/spritesmith6.png
2
common/dist/sprites/habitrpg-shared.css
vendored
1382
common/dist/sprites/spritesmith0.css
vendored
BIN
common/dist/sprites/spritesmith0.png
vendored
|
Before Width: | Height: | Size: 287 KiB After Width: | Height: | Size: 304 KiB |
1548
common/dist/sprites/spritesmith1.css
vendored
BIN
common/dist/sprites/spritesmith1.png
vendored
|
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 77 KiB |
2234
common/dist/sprites/spritesmith2.css
vendored
BIN
common/dist/sprites/spritesmith2.png
vendored
|
Before Width: | Height: | Size: 153 KiB After Width: | Height: | Size: 153 KiB |
778
common/dist/sprites/spritesmith3.css
vendored
BIN
common/dist/sprites/spritesmith3.png
vendored
|
Before Width: | Height: | Size: 150 KiB After Width: | Height: | Size: 153 KiB |
774
common/dist/sprites/spritesmith4.css
vendored
BIN
common/dist/sprites/spritesmith4.png
vendored
|
Before Width: | Height: | Size: 678 KiB After Width: | Height: | Size: 679 KiB |
48
common/dist/sprites/spritesmith5.css
vendored
@@ -1,6 +1,6 @@
|
|||||||
.Mount_Body_Deer-CottonCandyPink {
|
.Mount_Body_Deer-CottonCandyPink {
|
||||||
background-image: url(spritesmith5.png);
|
background-image: url(spritesmith5.png);
|
||||||
background-position: -998px -848px;
|
background-position: -998px -742px;
|
||||||
width: 105px;
|
width: 105px;
|
||||||
height: 105px;
|
height: 105px;
|
||||||
}
|
}
|
||||||
@@ -132,13 +132,13 @@
|
|||||||
}
|
}
|
||||||
.Mount_Body_Egg-Golden {
|
.Mount_Body_Egg-Golden {
|
||||||
background-image: url(spritesmith5.png);
|
background-image: url(spritesmith5.png);
|
||||||
background-position: -1272px -1940px;
|
background-position: -954px -1940px;
|
||||||
width: 105px;
|
width: 105px;
|
||||||
height: 105px;
|
height: 105px;
|
||||||
}
|
}
|
||||||
.Mount_Body_Egg-Red {
|
.Mount_Body_Egg-Red {
|
||||||
background-image: url(spritesmith5.png);
|
background-image: url(spritesmith5.png);
|
||||||
background-position: -318px -544px;
|
background-position: -1272px -1940px;
|
||||||
width: 105px;
|
width: 105px;
|
||||||
height: 105px;
|
height: 105px;
|
||||||
}
|
}
|
||||||
@@ -456,85 +456,85 @@
|
|||||||
}
|
}
|
||||||
.Mount_Body_LionCub-Skeleton {
|
.Mount_Body_LionCub-Skeleton {
|
||||||
background-image: url(spritesmith5.png);
|
background-image: url(spritesmith5.png);
|
||||||
background-position: -998px -530px;
|
background-position: 0px -986px;
|
||||||
width: 105px;
|
width: 111px;
|
||||||
height: 105px;
|
height: 105px;
|
||||||
}
|
}
|
||||||
.Mount_Body_LionCub-White {
|
.Mount_Body_LionCub-White {
|
||||||
background-image: url(spritesmith5.png);
|
background-image: url(spritesmith5.png);
|
||||||
background-position: -998px -636px;
|
background-position: -998px -530px;
|
||||||
width: 105px;
|
width: 105px;
|
||||||
height: 105px;
|
height: 105px;
|
||||||
}
|
}
|
||||||
.Mount_Body_LionCub-Zombie {
|
.Mount_Body_LionCub-Zombie {
|
||||||
background-image: url(spritesmith5.png);
|
background-image: url(spritesmith5.png);
|
||||||
background-position: -998px -742px;
|
background-position: -998px -636px;
|
||||||
width: 105px;
|
width: 105px;
|
||||||
height: 105px;
|
height: 105px;
|
||||||
}
|
}
|
||||||
.Mount_Body_Mammoth-Base {
|
.Mount_Body_Mammoth-Base {
|
||||||
background-image: url(spritesmith5.png);
|
background-image: url(spritesmith5.png);
|
||||||
background-position: -106px -544px;
|
background-position: 0px -544px;
|
||||||
width: 105px;
|
width: 105px;
|
||||||
height: 123px;
|
height: 123px;
|
||||||
}
|
}
|
||||||
.Mount_Body_MantisShrimp-Base {
|
.Mount_Body_MantisShrimp-Base {
|
||||||
background-image: url(spritesmith5.png);
|
background-image: url(spritesmith5.png);
|
||||||
background-position: 0px -986px;
|
background-position: -112px -986px;
|
||||||
width: 108px;
|
width: 108px;
|
||||||
height: 105px;
|
height: 105px;
|
||||||
}
|
}
|
||||||
.Mount_Body_Octopus-Base {
|
.Mount_Body_Octopus-Base {
|
||||||
background-image: url(spritesmith5.png);
|
background-image: url(spritesmith5.png);
|
||||||
background-position: -109px -986px;
|
background-position: -998px -848px;
|
||||||
width: 105px;
|
width: 105px;
|
||||||
height: 105px;
|
height: 105px;
|
||||||
}
|
}
|
||||||
.Mount_Body_Octopus-CottonCandyBlue {
|
.Mount_Body_Octopus-CottonCandyBlue {
|
||||||
background-image: url(spritesmith5.png);
|
background-image: url(spritesmith5.png);
|
||||||
background-position: -215px -986px;
|
background-position: -221px -986px;
|
||||||
width: 105px;
|
width: 105px;
|
||||||
height: 105px;
|
height: 105px;
|
||||||
}
|
}
|
||||||
.Mount_Body_Octopus-CottonCandyPink {
|
.Mount_Body_Octopus-CottonCandyPink {
|
||||||
background-image: url(spritesmith5.png);
|
background-image: url(spritesmith5.png);
|
||||||
background-position: -321px -986px;
|
background-position: -327px -986px;
|
||||||
width: 105px;
|
width: 105px;
|
||||||
height: 105px;
|
height: 105px;
|
||||||
}
|
}
|
||||||
.Mount_Body_Octopus-Desert {
|
.Mount_Body_Octopus-Desert {
|
||||||
background-image: url(spritesmith5.png);
|
background-image: url(spritesmith5.png);
|
||||||
background-position: -427px -986px;
|
background-position: -433px -986px;
|
||||||
width: 105px;
|
width: 105px;
|
||||||
height: 105px;
|
height: 105px;
|
||||||
}
|
}
|
||||||
.Mount_Body_Octopus-Golden {
|
.Mount_Body_Octopus-Golden {
|
||||||
background-image: url(spritesmith5.png);
|
background-image: url(spritesmith5.png);
|
||||||
background-position: -533px -986px;
|
background-position: -539px -986px;
|
||||||
width: 105px;
|
width: 105px;
|
||||||
height: 105px;
|
height: 105px;
|
||||||
}
|
}
|
||||||
.Mount_Body_Octopus-Red {
|
.Mount_Body_Octopus-Red {
|
||||||
background-image: url(spritesmith5.png);
|
background-image: url(spritesmith5.png);
|
||||||
background-position: -639px -986px;
|
background-position: -645px -986px;
|
||||||
width: 105px;
|
width: 105px;
|
||||||
height: 105px;
|
height: 105px;
|
||||||
}
|
}
|
||||||
.Mount_Body_Octopus-Shade {
|
.Mount_Body_Octopus-Shade {
|
||||||
background-image: url(spritesmith5.png);
|
background-image: url(spritesmith5.png);
|
||||||
background-position: -745px -986px;
|
background-position: -751px -986px;
|
||||||
width: 105px;
|
width: 105px;
|
||||||
height: 105px;
|
height: 105px;
|
||||||
}
|
}
|
||||||
.Mount_Body_Octopus-Skeleton {
|
.Mount_Body_Octopus-Skeleton {
|
||||||
background-image: url(spritesmith5.png);
|
background-image: url(spritesmith5.png);
|
||||||
background-position: -851px -986px;
|
background-position: -857px -986px;
|
||||||
width: 105px;
|
width: 105px;
|
||||||
height: 105px;
|
height: 105px;
|
||||||
}
|
}
|
||||||
.Mount_Body_Octopus-White {
|
.Mount_Body_Octopus-White {
|
||||||
background-image: url(spritesmith5.png);
|
background-image: url(spritesmith5.png);
|
||||||
background-position: -957px -986px;
|
background-position: -963px -986px;
|
||||||
width: 105px;
|
width: 105px;
|
||||||
height: 105px;
|
height: 105px;
|
||||||
}
|
}
|
||||||
@@ -1158,7 +1158,7 @@
|
|||||||
}
|
}
|
||||||
.Mount_Body_Spider-CottonCandyPink {
|
.Mount_Body_Spider-CottonCandyPink {
|
||||||
background-image: url(spritesmith5.png);
|
background-image: url(spritesmith5.png);
|
||||||
background-position: -212px -544px;
|
background-position: -318px -544px;
|
||||||
width: 105px;
|
width: 105px;
|
||||||
height: 105px;
|
height: 105px;
|
||||||
}
|
}
|
||||||
@@ -1260,7 +1260,7 @@
|
|||||||
}
|
}
|
||||||
.Mount_Body_TRex-Zombie {
|
.Mount_Body_TRex-Zombie {
|
||||||
background-image: url(spritesmith5.png);
|
background-image: url(spritesmith5.png);
|
||||||
background-position: -136px 0px;
|
background-position: 0px 0px;
|
||||||
width: 135px;
|
width: 135px;
|
||||||
height: 135px;
|
height: 135px;
|
||||||
}
|
}
|
||||||
@@ -1332,7 +1332,7 @@
|
|||||||
}
|
}
|
||||||
.Mount_Body_Wolf-Base {
|
.Mount_Body_Wolf-Base {
|
||||||
background-image: url(spritesmith5.png);
|
background-image: url(spritesmith5.png);
|
||||||
background-position: 0px 0px;
|
background-position: -136px 0px;
|
||||||
width: 135px;
|
width: 135px;
|
||||||
height: 135px;
|
height: 135px;
|
||||||
}
|
}
|
||||||
@@ -2046,9 +2046,9 @@
|
|||||||
}
|
}
|
||||||
.Mount_Head_LionCub-Skeleton {
|
.Mount_Head_LionCub-Skeleton {
|
||||||
background-image: url(spritesmith5.png);
|
background-image: url(spritesmith5.png);
|
||||||
background-position: -954px -1940px;
|
background-position: -212px -544px;
|
||||||
width: 105px;
|
width: 105px;
|
||||||
height: 105px;
|
height: 110px;
|
||||||
}
|
}
|
||||||
.Mount_Head_LionCub-White {
|
.Mount_Head_LionCub-White {
|
||||||
background-image: url(spritesmith5.png);
|
background-image: url(spritesmith5.png);
|
||||||
@@ -2064,7 +2064,7 @@
|
|||||||
}
|
}
|
||||||
.Mount_Head_Mammoth-Base {
|
.Mount_Head_Mammoth-Base {
|
||||||
background-image: url(spritesmith5.png);
|
background-image: url(spritesmith5.png);
|
||||||
background-position: 0px -544px;
|
background-position: -106px -544px;
|
||||||
width: 105px;
|
width: 105px;
|
||||||
height: 123px;
|
height: 123px;
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
common/dist/sprites/spritesmith5.png
vendored
|
Before Width: | Height: | Size: 357 KiB After Width: | Height: | Size: 357 KiB |
|
After Width: | Height: | Size: 7.7 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 999 B After Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 825 B After Width: | Height: | Size: 3.6 KiB |
@@ -95,5 +95,13 @@
|
|||||||
"backgroundMountainLakeText": "Mountain Lake",
|
"backgroundMountainLakeText": "Mountain Lake",
|
||||||
"backgroundMountainLakeNotes": "Dip your toes in a Mountain Lake.",
|
"backgroundMountainLakeNotes": "Dip your toes in a Mountain Lake.",
|
||||||
"backgroundPagodasText": "Pagodas",
|
"backgroundPagodasText": "Pagodas",
|
||||||
"backgroundPagodasNotes": "Climb to the top of Pagodas."
|
"backgroundPagodasNotes": "Climb to the top of Pagodas.",
|
||||||
|
|
||||||
|
"backgrounds062015": "SET 13: Released June 2015",
|
||||||
|
"backgroundDriftingRaftText": "Drifting Raft",
|
||||||
|
"backgroundDriftingRaftNotes": "Paddle a Drifting Raft.",
|
||||||
|
"backgroundShimmeryBubblesText": "Shimmery Bubbles",
|
||||||
|
"backgroundShimmeryBubblesNotes": "Float through a sea of Shimmery Bubbles.",
|
||||||
|
"backgroundIslandWaterfallsText": "Island Waterfalls",
|
||||||
|
"backgroundIslandWaterfallsNotes": "Picnic near Island Waterfalls."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -116,5 +116,8 @@
|
|||||||
"sendGiftFromBalance": "From Balance",
|
"sendGiftFromBalance": "From Balance",
|
||||||
"sendGiftPurchase": "Purchase",
|
"sendGiftPurchase": "Purchase",
|
||||||
"sendGiftMessagePlaceholder": "Personal message (optional)",
|
"sendGiftMessagePlaceholder": "Personal message (optional)",
|
||||||
"sendGiftSubscription": "<%= months %> Month(s): $<%= price %>"
|
"sendGiftSubscription": "<%= months %> Month(s): $<%= price %>",
|
||||||
|
"inviteFriends": "Invite Friends",
|
||||||
|
"startAParty": "Start a Party",
|
||||||
|
"addToParty": "Add someone to your party"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -118,5 +118,7 @@
|
|||||||
"resubscribe": "Resubscribe",
|
"resubscribe": "Resubscribe",
|
||||||
"promoCode": "Promo Code",
|
"promoCode": "Promo Code",
|
||||||
"promoCodeApplied": "Promo Code Applied! Check your inventory",
|
"promoCodeApplied": "Promo Code Applied! Check your inventory",
|
||||||
"promoPlaceholder": "Enter Promotion Code"
|
"promoPlaceholder": "Enter Promotion Code",
|
||||||
|
"couponText": "We sometimes have events and give out coupon codes for special gear. (eg, those who stop by our Wondercon booth)",
|
||||||
|
"displayInviteToPartyWhenPartyIs1": "Display Invite To Party button when party has 1 member."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1855,6 +1855,16 @@ api.backgrounds =
|
|||||||
pagodas:
|
pagodas:
|
||||||
text: t('backgroundPagodasText')
|
text: t('backgroundPagodasText')
|
||||||
notes: t('backgroundPagodasNotes')
|
notes: t('backgroundPagodasNotes')
|
||||||
|
backgrounds062015:
|
||||||
|
drifting_raft:
|
||||||
|
text: t('backgroundDriftingRaftText')
|
||||||
|
notes: t('backgroundDriftingRaftNotes')
|
||||||
|
shimmery_bubbles:
|
||||||
|
text: t('backgroundShimmeryBubblesText')
|
||||||
|
notes: t('backgroundShimmeryBubblesNotes')
|
||||||
|
island_waterfalls:
|
||||||
|
text: t('backgroundIslandWaterfallsText')
|
||||||
|
notes: t('backgroundIslandWaterfallsNotes')
|
||||||
|
|
||||||
api.subscriptionBlocks =
|
api.subscriptionBlocks =
|
||||||
basic_earned: months:1, price:5
|
basic_earned: months:1, price:5
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
'use strict'
|
'use strict'
|
||||||
|
#@TODO: Have to mock most things to get to the parts that
|
||||||
|
#call pushNotify. Consider refactoring group controller
|
||||||
|
#so things are easier to test
|
||||||
|
|
||||||
app = require("../../website/src/server")
|
app = require("../../website/src/server")
|
||||||
rewire = require('rewire')
|
rewire = require('rewire')
|
||||||
@@ -78,7 +81,6 @@ describe "Push-Notifications", ->
|
|||||||
recipient = null
|
recipient = null
|
||||||
|
|
||||||
groups = rewire("../../website/src/controllers/groups")
|
groups = rewire("../../website/src/controllers/groups")
|
||||||
groups.__set__('questStart', -> true)
|
|
||||||
groups.__set__('pushNotify', pushSpy)
|
groups.__set__('pushNotify', pushSpy)
|
||||||
|
|
||||||
before (done) ->
|
before (done) ->
|
||||||
@@ -150,6 +152,7 @@ describe "Push-Notifications", ->
|
|||||||
group = { _id: 'party-id', name: 'party-name', type: 'party', members: [user._id, recipient._id], invites: [], quest: {}}
|
group = { _id: 'party-id', name: 'party-name', type: 'party', members: [user._id, recipient._id], invites: [], quest: {}}
|
||||||
user.items.quests.hedgehog = 5
|
user.items.quests.hedgehog = 5
|
||||||
group.save = (cb) -> cb(null, group)
|
group.save = (cb) -> cb(null, group)
|
||||||
|
group.markModified = -> true
|
||||||
req = {
|
req = {
|
||||||
body: { uuids: [recipient._id] }
|
body: { uuids: [recipient._id] }
|
||||||
query: { key: 'hedgehog' }
|
query: { key: 'hedgehog' }
|
||||||
@@ -171,6 +174,51 @@ describe "Push-Notifications", ->
|
|||||||
done()
|
done()
|
||||||
, 100
|
, 100
|
||||||
|
|
||||||
|
it "sends a push notification to participating members when quest starts", (done) ->
|
||||||
|
group = { _id: 'party-id', name: 'party-name', type: 'party', members: [user._id, recipient._id], invites: []}
|
||||||
|
group.quest = {
|
||||||
|
key: 'hedgehog'
|
||||||
|
progress: { hp: 100 }
|
||||||
|
members: {}
|
||||||
|
}
|
||||||
|
group.quest.members[recipient._id] = true
|
||||||
|
group.save = (cb) -> cb(null, group)
|
||||||
|
group.markModified = -> true
|
||||||
|
req = {
|
||||||
|
body: { uuids: [recipient._id] }
|
||||||
|
query: { }
|
||||||
|
# force: true
|
||||||
|
}
|
||||||
|
res = {
|
||||||
|
locals: { group: group, user: user }
|
||||||
|
json: -> return true
|
||||||
|
}
|
||||||
|
userMock = {
|
||||||
|
findOne: (arg, arg2, cb) ->
|
||||||
|
cb(null, recipient)
|
||||||
|
update: (arg, arg2, cb) ->
|
||||||
|
cb(null, user)
|
||||||
|
}
|
||||||
|
groups.__set__('User', userMock)
|
||||||
|
groups.__set__('populateQuery',
|
||||||
|
(arg, arg2, arg3) ->
|
||||||
|
return {
|
||||||
|
exec: -> group.members
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
groups.questAccept req, res
|
||||||
|
|
||||||
|
setTimeout -> # Allow questAccept to finish
|
||||||
|
expect(pushSpy.sendNotify).to.have.been.calledTwice
|
||||||
|
expect(pushSpy.sendNotify).to.have.been.calledWith(
|
||||||
|
recipient,
|
||||||
|
'HabitRPG',
|
||||||
|
'Your Quest has Begun: The Hedgebeast'
|
||||||
|
)
|
||||||
|
done()
|
||||||
|
, 100
|
||||||
|
|
||||||
describe "Gifts", ->
|
describe "Gifts", ->
|
||||||
|
|
||||||
recipient = null
|
recipient = null
|
||||||
|
|||||||
56
test/spec/headerCtrlSpec.js
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
describe('Header Controller', function() {
|
||||||
|
var scope, ctrl, user, $location, $rootScope;
|
||||||
|
|
||||||
|
beforeEach(function() {
|
||||||
|
module(function($provide) {
|
||||||
|
$provide.value('User', {});
|
||||||
|
});
|
||||||
|
|
||||||
|
inject(function(_$rootScope_, _$controller_, _$location_){
|
||||||
|
user = specHelper.newUser();
|
||||||
|
user._id = "unique-user-id"
|
||||||
|
|
||||||
|
scope = _$rootScope_.$new();
|
||||||
|
$rootScope = _$rootScope_;
|
||||||
|
|
||||||
|
$location = _$location_;
|
||||||
|
|
||||||
|
// Load RootCtrl to ensure shared behaviors are loaded
|
||||||
|
_$controller_('RootCtrl', {$scope: scope, User: {user: user}});
|
||||||
|
|
||||||
|
ctrl = _$controller_('HeaderCtrl', {$scope: scope, User: {user: user}});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
context('inviteOrStartParty', function(){
|
||||||
|
beforeEach(function(){
|
||||||
|
sinon.stub($location, 'path');
|
||||||
|
sinon.stub($rootScope, 'openModal');
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(function(){
|
||||||
|
$location.path.restore();
|
||||||
|
$rootScope.openModal.restore();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('redirects to party page if user does not have a party', function(){
|
||||||
|
var group = {};
|
||||||
|
scope.inviteOrStartParty(group);
|
||||||
|
|
||||||
|
expect($location.path).to.be.calledWith("/options/groups/party");
|
||||||
|
expect($rootScope.openModal).to.not.be.called;
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Opens invite-friends modal if user has a party', function(){
|
||||||
|
var group = {
|
||||||
|
type: 'party'
|
||||||
|
};
|
||||||
|
scope.inviteOrStartParty(group);
|
||||||
|
|
||||||
|
expect($rootScope.openModal).to.be.calledOnce;
|
||||||
|
expect($location.path).to.not.be.called;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -98,7 +98,7 @@
|
|||||||
@media (min-width: 70em)
|
@media (min-width: 70em)
|
||||||
.site-header
|
.site-header
|
||||||
width: 70%
|
width: 70%
|
||||||
|
|
||||||
|
|
||||||
// this is a wrapper for avatars in the header
|
// this is a wrapper for avatars in the header
|
||||||
// inside this is the actual `herobox` module
|
// inside this is the actual `herobox` module
|
||||||
@@ -125,7 +125,7 @@
|
|||||||
hrpg-label-color-mixin(darken($color-herobox, 16.18%))
|
hrpg-label-color-mixin(darken($color-herobox, 16.18%))
|
||||||
width: 2.618em
|
width: 2.618em
|
||||||
text-align:center
|
text-align:center
|
||||||
margin-right: 0.618em
|
margin-right: 0.618em
|
||||||
.meter
|
.meter
|
||||||
position: relative
|
position: relative
|
||||||
overflow: hidden
|
overflow: hidden
|
||||||
@@ -161,7 +161,7 @@
|
|||||||
white-space: nowrap
|
white-space: nowrap
|
||||||
&.value
|
&.value
|
||||||
right: 0.382em
|
right: 0.382em
|
||||||
|
|
||||||
// boss.jade only
|
// boss.jade only
|
||||||
[class^="quest_"] + &
|
[class^="quest_"] + &
|
||||||
min-width: 220px
|
min-width: 220px
|
||||||
@@ -172,4 +172,8 @@
|
|||||||
header .hero-stats
|
header .hero-stats
|
||||||
background-color: darken($color-herobox, 4%)
|
background-color: darken($color-herobox, 4%)
|
||||||
border-right: 1px solid darken($color-herobox, 12%)
|
border-right: 1px solid darken($color-herobox, 12%)
|
||||||
|
|
||||||
|
button.party-invite
|
||||||
|
right: 10px;
|
||||||
|
position: absolute;
|
||||||
|
top: 55px;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
habitrpg.controller("HeaderCtrl", ['$scope', 'Groups', 'User',
|
habitrpg.controller("HeaderCtrl", ['$scope', 'Groups', 'User', '$location', '$rootScope',
|
||||||
function($scope, Groups, User) {
|
function($scope, Groups, User, $location, $rootScope) {
|
||||||
|
|
||||||
$scope.Math = window.Math;
|
$scope.Math = window.Math;
|
||||||
$scope.user = User.user;
|
$scope.user = User.user;
|
||||||
@@ -16,6 +16,19 @@ habitrpg.controller("HeaderCtrl", ['$scope', 'Groups', 'User',
|
|||||||
$scope.$watch('user.party.orderAscending', triggerResort);
|
$scope.$watch('user.party.orderAscending', triggerResort);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$scope.inviteOrStartParty = function(group) {
|
||||||
|
if (group.type === "party") {
|
||||||
|
$rootScope.openModal('invite-friends', {
|
||||||
|
controller:'InviteToGroupCtrl',
|
||||||
|
resolve: {
|
||||||
|
injectedGroup: function(){ return group; }
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
$location.path("/options/groups/party");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function resortParty() {
|
function resortParty() {
|
||||||
var result = _.sortBy(
|
var result = _.sortBy(
|
||||||
_.filter($scope.party.members, function(member){
|
_.filter($scope.party.members, function(member){
|
||||||
|
|||||||
@@ -831,13 +831,18 @@ questStart = function(req, res, next) {
|
|||||||
updates['$set']['party.quest.progress.collect'] = collected;
|
updates['$set']['party.quest.progress.collect'] = collected;
|
||||||
updates['$set']['party.quest.completed'] = null;
|
updates['$set']['party.quest.completed'] = null;
|
||||||
questMembers[m] = true;
|
questMembers[m] = true;
|
||||||
|
|
||||||
|
User.findOne({_id: m}, {pushDevices: 1}, function(err, user){
|
||||||
|
pushNotify.sendNotify(user, "HabitRPG", shared.i18n.t('questStarted') + ": "+ quest.text() );
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
updates['$set']['party.quest'] = Group.cleanQuestProgress();
|
updates['$set']['party.quest'] = Group.cleanQuestProgress();
|
||||||
}
|
}
|
||||||
|
|
||||||
parallel.push(function(cb2){
|
parallel.push(function(cb2){
|
||||||
User.update({_id:m},updates,cb2);
|
User.update({_id:m},updates,cb2);
|
||||||
});
|
});
|
||||||
})
|
});
|
||||||
|
|
||||||
group.quest.active = true;
|
group.quest.active = true;
|
||||||
if (quest.boss) {
|
if (quest.boss) {
|
||||||
@@ -913,10 +918,6 @@ api.questAccept = function(req, res, next) {
|
|||||||
group.quest.leader = user._id;
|
group.quest.leader = user._id;
|
||||||
} else {
|
} else {
|
||||||
group.quest.members[m] = undefined;
|
group.quest.members[m] = undefined;
|
||||||
|
|
||||||
User.findById(m, function(err,groupMember){
|
|
||||||
pushNotify.sendNotify(groupMember, shared.i18n.t('questInvitationTitle'), shared.i18n.t('questInvitationInfo', { quest: quest.text() }));
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -924,7 +925,7 @@ api.questAccept = function(req, res, next) {
|
|||||||
_id: {
|
_id: {
|
||||||
$in: _.without(group.members, user._id)
|
$in: _.without(group.members, user._id)
|
||||||
}
|
}
|
||||||
}, {auth: 1, preferences: 1, profile: 1}, function(err, members){
|
}, {auth: 1, preferences: 1, profile: 1, pushDevices: 1}, function(err, members){
|
||||||
if(err) return next(err);
|
if(err) return next(err);
|
||||||
|
|
||||||
var inviterVars = utils.getUserInfo(user, ['name', 'email']);
|
var inviterVars = utils.getUserInfo(user, ['name', 'email']);
|
||||||
@@ -940,6 +941,10 @@ api.questAccept = function(req, res, next) {
|
|||||||
{name: 'PARTY_URL', content: '/#/options/groups/party'}
|
{name: 'PARTY_URL', content: '/#/options/groups/party'}
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
_.each(members, function(groupMember){
|
||||||
|
pushNotify.sendNotify(groupMember, shared.i18n.t('questInvitationTitle'), shared.i18n.t('questInvitationInfo', { quest: quest.text() }));
|
||||||
|
});
|
||||||
|
|
||||||
questStart(req,res,next);
|
questStart(req,res,next);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -325,6 +325,7 @@ var UserSchema = new Schema({
|
|||||||
advancedCollapsed: {type: Boolean, 'default': false},
|
advancedCollapsed: {type: Boolean, 'default': false},
|
||||||
toolbarCollapsed: {type:Boolean, 'default':false},
|
toolbarCollapsed: {type:Boolean, 'default':false},
|
||||||
background: String,
|
background: String,
|
||||||
|
displayInviteToPartyWhenPartyIs1: { type:Boolean, 'default':true},
|
||||||
webhooks: {type: Schema.Types.Mixed, 'default': {}},
|
webhooks: {type: Schema.Types.Mixed, 'default': {}},
|
||||||
// For this fields make sure to use strict comparison when searching for falsey values (=== false)
|
// For this fields make sure to use strict comparison when searching for falsey values (=== false)
|
||||||
// As users who didn't login after these were introduced may have them undefined/null
|
// As users who didn't login after these were introduced may have them undefined/null
|
||||||
|
|||||||
@@ -66,6 +66,10 @@ script(type='text/ng-template', id='partials/options.settings.settings.html')
|
|||||||
label
|
label
|
||||||
input(type='checkbox', ng-model='user.preferences.dailyDueDefaultView', ng-change='set({"preferences.dailyDueDefaultView": user.preferences.dailyDueDefaultView?true: false})')
|
input(type='checkbox', ng-model='user.preferences.dailyDueDefaultView', ng-change='set({"preferences.dailyDueDefaultView": user.preferences.dailyDueDefaultView?true: false})')
|
||||||
span.hint(popover-trigger='mouseenter', popover-placement='right', popover=env.t('dailyDueDefaultViewPop'))=env.t('dailyDueDefaultView')
|
span.hint(popover-trigger='mouseenter', popover-placement='right', popover=env.t('dailyDueDefaultViewPop'))=env.t('dailyDueDefaultView')
|
||||||
|
.checkbox(ng-if='party.memberCount === 1')
|
||||||
|
label
|
||||||
|
input(type='checkbox', ng-model='user.preferences.displayInviteToPartyWhenPartyIs1', ng-change='set({"preferences.displayInviteToPartyWhenPartyIs1": user.preferences.displayInviteToPartyWhenPartyIs1 ? true : false})')
|
||||||
|
span.hint(popover-trigger='mouseenter', popover-placement='right', popover=env.t('displayInviteToPartyWhenPartyIs1'))=env.t('displayInviteToPartyWhenPartyIs1')
|
||||||
// button.btn.btn-default(ng-click='showTour()', popover-placement='right', popover-trigger='mouseenter', popover=env.t('restartTour'))= env.t('showTour')
|
// button.btn.btn-default(ng-click='showTour()', popover-placement='right', popover-trigger='mouseenter', popover=env.t('restartTour'))= env.t('showTour')
|
||||||
button.btn.btn-default(ng-click='showBailey()', popover-trigger='mouseenter', popover-placement='right', popover=env.t('showBaileyPop'))= env.t('showBailey')
|
button.btn.btn-default(ng-click='showBailey()', popover-trigger='mouseenter', popover-placement='right', popover=env.t('showBaileyPop'))= env.t('showBailey')
|
||||||
button.btn.btn-default(ng-click='openRestoreModal()', popover-trigger='mouseenter', popover-placement='right', popover=env.t('fixValPop'))= env.t('fixVal')
|
button.btn.btn-default(ng-click='openRestoreModal()', popover-trigger='mouseenter', popover-placement='right', popover=env.t('fixValPop'))= env.t('fixVal')
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ a.pull-right.gem-wallet(ng-if='group.type!="party"', popover-trigger='mouseenter
|
|||||||
.panel-heading
|
.panel-heading
|
||||||
h3.panel-title
|
h3.panel-title
|
||||||
=env.t('members')
|
=env.t('members')
|
||||||
button.pull-right.btn.btn-primary(ng-click="openInviteModal(group)")=env.t('inviteFriends')
|
button.pull-right.btn.btn-primary(ng-click="openInviteModal(group)")=env.t("inviteFriends")
|
||||||
.panel-body.modal-fixed-height
|
.panel-body.modal-fixed-height
|
||||||
div.form-group(ng-if='::group.type=="party"')
|
div.form-group(ng-if='::group.type=="party"')
|
||||||
p=env.t('partyList')
|
p=env.t('partyList')
|
||||||
|
|||||||
@@ -32,5 +32,8 @@
|
|||||||
|
|
||||||
// party
|
// party
|
||||||
span(ng-controller='PartyCtrl')
|
span(ng-controller='PartyCtrl')
|
||||||
|
button.party-invite.pull-right.btn.btn-primary(ng-click="inviteOrStartParty(group)",
|
||||||
|
ng-if="(!party.members || party.memberCount === 1) && user.preferences.displayInviteToPartyWhenPartyIs1",
|
||||||
|
popover="{{!party.members ? env.t('startAParty') : env.t('addToParty')}}", popover-placement="left", popover-trigger="mouseenter")=env.t("inviteFriends")
|
||||||
.herobox-wrap(ng-repeat='profile in partyMinusSelf')
|
.herobox-wrap(ng-repeat='profile in partyMinusSelf')
|
||||||
+herobox()
|
+herobox()
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
h5 6/1/2015 - JUNE MYSTERY ITEM AND NEW MOUNT POSITIONING!
|
h5 6/1/2015 - JUNE BACKGROUNDS AND NEW MOUNT POSITIONING!
|
||||||
hr
|
hr
|
||||||
tr
|
tr
|
||||||
td
|
td
|
||||||
.inventory_present_06.pull-right
|
.background_island_waterfalls.pull-right
|
||||||
h5 June Mystery Item!
|
h5 June Backgrounds Revealed
|
||||||
p Ooh, how mysterious! All Habiticans who are <a href='/#/options/settings/subscription' target='_blank'>subscribed</a> during the month of June will receive the June Mystery Item Set, as well as the ability to buy Gems with Gold! The June Item Set will be revealed on the 25th, so keep your eyes peeled. Thanks for supporting the site <3
|
p There are three new avatar backgrounds in the <a href='/#/options/profile/backgrounds' target='_blank'>Background Shop</a>! Now your avatar can paddle a Drifting Raft, float through a sea of Shimmery Bubbles, or picnic near Island Waterfalls!
|
||||||
|
p.small.muted by (in order): Teto is Great, beffymaroo, and UncommonCriminal
|
||||||
tr
|
tr
|
||||||
td
|
td
|
||||||
h5 New Mount Positioning!
|
h5 New Mount Positioning!
|
||||||
@@ -16,6 +17,12 @@ a(href='/static/old-news', target='_blank') Read older news
|
|||||||
|
|
||||||
mixin oldNews
|
mixin oldNews
|
||||||
|
|
||||||
|
h5 6/1/2015 - JUNE MYSTERY ITEM AND NEW MOUNT POSITIONING!
|
||||||
|
tr
|
||||||
|
td
|
||||||
|
.inventory_present_06.pull-right
|
||||||
|
h5 June Mystery Item!
|
||||||
|
p Ooh, how mysterious! All Habiticans who are <a href='/#/options/settings/subscription' target='_blank'>subscribed</a> during the month of June will receive the June Mystery Item Set, as well as the ability to buy Gems with Gold! The June Item Set will be revealed on the 25th, so keep your eyes peeled. Thanks for supporting the site <3
|
||||||
h5 5/31/2015 - PUSH NOTIFICATIONS FOR ANDROID, AND LAST CHANCE FOR GREEN KNIGHT SUBSCRIBER ITEMS!
|
h5 5/31/2015 - PUSH NOTIFICATIONS FOR ANDROID, AND LAST CHANCE FOR GREEN KNIGHT SUBSCRIBER ITEMS!
|
||||||
tr
|
tr
|
||||||
td
|
td
|
||||||
|
|||||||