Merge branch 'release' into sabrecat/timetrav-bgs

This commit is contained in:
Sabe Jones 2020-01-09 09:59:09 -06:00
commit 0f4a5ebe6c
89 changed files with 25756 additions and 25844 deletions

2
package-lock.json generated
View file

@ -1,6 +1,6 @@
{
"name": "habitica",
"version": "4.128.2",
"version": "4.129.1",
"lockfileVersion": 1,
"requires": true,
"dependencies": {

View file

@ -1,7 +1,7 @@
{
"name": "habitica",
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
"version": "4.128.2",
"version": "4.129.1",
"main": "./website/server/index.js",
"dependencies": {
"@babel/core": "^7.7.5",

View file

@ -211,7 +211,7 @@ describe('payments/index', () => {
await api.createSubscription(data);
const msg = '`Hello recipient, sender has sent you 3 months of subscription!`';
expect(user.sendMessage).to.be.calledTwice;
expect(user.sendMessage).to.be.calledOnce;
expect(user.sendMessage).to.be.calledWith(
recipient,
{ receiverMsg: msg, senderMsg: msg, save: false },
@ -252,77 +252,6 @@ describe('payments/index', () => {
},
});
});
context('Winter 2019-20 Gift-1-Get-1 Promotion', async () => {
it('creates a gift subscription for purchaser and recipient if none exist', async () => {
await api.createSubscription(data);
expect(user.items.pets['Jackalope-RoyalPurple']).to.eql(5);
expect(user.purchased.plan.customerId).to.eql('Gift');
expect(user.purchased.plan.dateTerminated).to.exist;
expect(user.purchased.plan.dateUpdated).to.exist;
expect(user.purchased.plan.dateCreated).to.exist;
expect(recipient.items.pets['Jackalope-RoyalPurple']).to.eql(5);
expect(recipient.purchased.plan.customerId).to.eql('Gift');
expect(recipient.purchased.plan.dateTerminated).to.exist;
expect(recipient.purchased.plan.dateUpdated).to.exist;
expect(recipient.purchased.plan.dateCreated).to.exist;
});
it('adds extraMonths to existing subscription for purchaser and creates a gift subscription for recipient without sub', async () => {
user.purchased.plan = plan;
expect(user.purchased.plan.extraMonths).to.eql(0);
await api.createSubscription(data);
expect(user.purchased.plan.extraMonths).to.eql(3);
expect(recipient.items.pets['Jackalope-RoyalPurple']).to.eql(5);
expect(recipient.purchased.plan.customerId).to.eql('Gift');
expect(recipient.purchased.plan.dateTerminated).to.exist;
expect(recipient.purchased.plan.dateUpdated).to.exist;
expect(recipient.purchased.plan.dateCreated).to.exist;
});
it('adds extraMonths to existing subscription for recipient and creates a gift subscription for purchaser without sub', async () => {
recipient.purchased.plan = plan;
expect(recipient.purchased.plan.extraMonths).to.eql(0);
await api.createSubscription(data);
expect(recipient.purchased.plan.extraMonths).to.eql(3);
expect(user.items.pets['Jackalope-RoyalPurple']).to.eql(5);
expect(user.purchased.plan.customerId).to.eql('Gift');
expect(user.purchased.plan.dateTerminated).to.exist;
expect(user.purchased.plan.dateUpdated).to.exist;
expect(user.purchased.plan.dateCreated).to.exist;
});
it('adds extraMonths to existing subscriptions for purchaser and recipient', async () => {
user.purchased.plan = plan;
recipient.purchased.plan = plan;
expect(user.purchased.plan.extraMonths).to.eql(0);
expect(recipient.purchased.plan.extraMonths).to.eql(0);
await api.createSubscription(data);
expect(user.purchased.plan.extraMonths).to.eql(3);
expect(recipient.purchased.plan.extraMonths).to.eql(3);
});
it('sends a private message about the promotion', async () => {
await api.createSubscription(data);
const msg = '`Hello sender, you received 3 months of subscription as part of our holiday gift-giving promotion!`';
expect(user.sendMessage).to.be.calledTwice;
expect(user.sendMessage).to.be.calledWith(user, { senderMsg: msg });
});
});
});
context('Purchasing a subscription for self', () => {

View file

@ -64,30 +64,6 @@
></span>
</div>
</div>
<div
class="g1g1-banner d-flex justify-content-center align-items-center"
v-if="!giftingHidden">
<div
class="svg-icon svg-gifts left-gift"
v-html="icons.gifts">
</div>
<router-link class="g1g1-link" to="/user/settings/subscription">
{{ $t('g1g1Announcement') }}
</router-link>
<div
class="svg-icon svg-gifts right-gift"
v-html="icons.gifts">
</div>
<div
class="closepadding"
@click="hideGiftingBanner()">
<span
class="svg-icon inline-icon icon-10"
aria-hidden="true"
v-html="icons.close">
</span>
</div>
</div>
<notifications-display />
<app-menu />
<div class="container-fluid">
@ -172,30 +148,6 @@
flex: 1 0 auto;
}
.g1g1-banner {
width: 100%;
min-height: 2.5rem;
background-color: $teal-50;
}
.g1g1-link {
color: $white;
}
.left-gift {
margin: auto 1rem auto auto;
}
.right-gift {
margin: auto auto auto 1rem;
filter: flipH;
transform: scaleX(-1);
}
.svg-gifts {
width: 4.6rem;
}
.notification {
border-radius: 1000px;
background-color: $green-10;
@ -291,10 +243,8 @@ import {
CONSTANTS,
getLocalSetting,
removeLocalSetting,
setLocalSetting,
} from '@/libs/userlocalManager';
import gifts from '@/assets/svg/gifts.svg';
import svgClose from '@/assets/svg/close.svg';
import bannedAccountModal from '@/components/bannedAccountModal';
@ -321,7 +271,6 @@ export default {
return {
icons: Object.freeze({
close: svgClose,
gifts,
}),
selectedItemToBuy: null,
selectedSpellToBuy: null,
@ -332,7 +281,6 @@ export default {
loading: true,
currentTipNumber: 0,
bannerHidden: false,
giftingHidden: getLocalSetting(CONSTANTS.keyConstants.GIFTING_BANNER_DISPLAY) === 'dismissed2019',
};
},
computed: {
@ -726,10 +674,6 @@ export default {
hideBanner () {
this.bannerHidden = true;
},
hideGiftingBanner () {
setLocalSetting(CONSTANTS.keyConstants.GIFTING_BANNER_DISPLAY, 'dismissed2019');
this.giftingHidden = true;
},
resumeDamage () {
this.$store.dispatch('user:sleep');
},

View file

@ -1,4 +1,4 @@
.promo_armoire_backgrounds_201912 {
.promo_armoire_backgrounds_202001 {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: 0px -175px;
width: 423px;

View file

@ -562,631 +562,631 @@
width: 141px;
height: 147px;
}
.background_blacksmithy {
.background_birthday_party {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1420px -444px;
width: 141px;
height: 147px;
}
.background_blizzard {
.background_blacksmithy {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1420px -592px;
width: 141px;
height: 147px;
}
.background_blossoming_desert {
.background_blizzard {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1420px -740px;
width: 141px;
height: 147px;
}
.background_blue {
.background_blossoming_desert {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1420px -888px;
width: 141px;
height: 147px;
}
.background_bridge {
.background_blue {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1420px -1036px;
width: 141px;
height: 147px;
}
.background_bug_covered_log {
.background_bridge {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: 0px 0px;
width: 141px;
height: 147px;
}
.background_buried_treasure {
.background_bug_covered_log {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: 0px -1332px;
width: 141px;
height: 147px;
}
.background_champions_colosseum {
.background_buried_treasure {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -142px -1332px;
width: 141px;
height: 147px;
}
.background_cherry_trees {
.background_champions_colosseum {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -284px -1332px;
width: 141px;
height: 147px;
}
.background_chessboard_land {
.background_cherry_trees {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -426px -1332px;
width: 141px;
height: 147px;
}
.background_clouds {
.background_chessboard_land {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -568px -1332px;
width: 141px;
height: 147px;
}
.background_coral_reef {
.background_clouds {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -710px -1332px;
width: 141px;
height: 147px;
}
.background_cornfields {
.background_coral_reef {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -852px -1332px;
width: 141px;
height: 147px;
}
.background_cozy_barn {
.background_cornfields {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -994px -1332px;
width: 141px;
height: 147px;
}
.background_cozy_bedroom {
.background_cozy_barn {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1136px -1332px;
width: 141px;
height: 147px;
}
.background_cozy_library {
.background_cozy_bedroom {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1278px -1332px;
width: 141px;
height: 147px;
}
.background_creepy_castle {
.background_cozy_library {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1420px -1332px;
width: 141px;
height: 147px;
}
.background_crosscountry_ski_trail {
.background_creepy_castle {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1562px 0px;
width: 141px;
height: 147px;
}
.background_crystal_cave {
.background_crosscountry_ski_trail {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1562px -148px;
width: 141px;
height: 147px;
}
.background_dark_deep {
.background_crystal_cave {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1562px -296px;
width: 141px;
height: 147px;
}
.background_deep_mine {
.background_dark_deep {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1562px -444px;
width: 141px;
height: 147px;
}
.background_deep_sea {
.background_deep_mine {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1562px -592px;
width: 141px;
height: 147px;
}
.background_desert_dunes {
.background_deep_sea {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1562px -740px;
width: 141px;
height: 147px;
}
.background_dilatory_castle {
.background_desert_dunes {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1562px -888px;
width: 141px;
height: 147px;
}
.background_dilatory_city {
.background_desert_with_snow {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1562px -1036px;
width: 141px;
height: 147px;
}
.background_dilatory_ruins {
.background_dilatory_castle {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1562px -1184px;
width: 141px;
height: 147px;
}
.background_distant_castle {
.background_dilatory_city {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1562px -1332px;
width: 141px;
height: 147px;
}
.background_dojo {
.background_dilatory_ruins {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: 0px -1480px;
width: 141px;
height: 147px;
}
.background_drifting_raft {
.background_distant_castle {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -142px -1480px;
width: 141px;
height: 147px;
}
.background_driving_a_coach {
.background_dojo {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -284px -1480px;
width: 141px;
height: 147px;
}
.background_driving_a_sleigh {
.background_drifting_raft {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -426px -1480px;
width: 141px;
height: 147px;
}
.background_duck_pond {
.background_driving_a_coach {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1420px -1184px;
width: 141px;
height: 147px;
}
.background_dungeon {
.background_driving_a_sleigh {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1136px -1036px;
width: 141px;
height: 147px;
}
.background_dusty_canyons {
.background_duck_pond {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -994px -1036px;
width: 141px;
height: 147px;
}
.background_elegant_balcony {
.background_dungeon {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -852px -1036px;
width: 141px;
height: 147px;
}
.background_fairy_ring {
.background_dusty_canyons {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -710px -1036px;
width: 141px;
height: 147px;
}
.background_fantastical_shoe_store {
.background_elegant_balcony {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -568px -1036px;
width: 141px;
height: 147px;
}
.background_farmers_market {
.background_fairy_ring {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -426px -1036px;
width: 141px;
height: 147px;
}
.background_farmhouse {
.background_fantastical_shoe_store {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -284px -1036px;
width: 141px;
height: 147px;
}
.background_fiber_arts_room {
.background_farmers_market {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -142px -1036px;
width: 141px;
height: 147px;
}
.background_field_with_colored_eggs {
.background_farmhouse {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: 0px -1036px;
width: 141px;
height: 147px;
}
.background_floating_islands {
.background_fiber_arts_room {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1136px -888px;
width: 141px;
height: 147px;
}
.background_floral_meadow {
.background_field_with_colored_eggs {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1136px -740px;
width: 141px;
height: 147px;
}
.background_flower_market {
.background_floating_islands {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1136px -592px;
width: 141px;
height: 147px;
}
.customize-option.background_flower_market {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1161px -607px;
width: 60px;
height: 60px;
}
.background_flying_in_a_thunderstorm {
.background_floral_meadow {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1136px -444px;
width: 141px;
height: 147px;
}
.background_flying_over_a_field_of_wildflowers {
.background_flower_market {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1136px -296px;
width: 141px;
height: 147px;
}
.customize-option.background_flying_over_a_field_of_wildflowers {
.customize-option.background_flower_market {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1161px -311px;
width: 60px;
height: 60px;
}
.background_flying_over_an_ancient_forest {
.background_flying_in_a_thunderstorm {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1136px -148px;
width: 141px;
height: 147px;
}
.background_flying_over_icy_steppes {
.background_flying_over_a_field_of_wildflowers {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1136px 0px;
width: 141px;
height: 147px;
}
.background_flying_over_rocky_canyon {
.customize-option.background_flying_over_a_field_of_wildflowers {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -1161px -15px;
width: 60px;
height: 60px;
}
.background_flying_over_an_ancient_forest {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -994px -888px;
width: 141px;
height: 147px;
}
.background_flying_over_snowy_mountains {
.background_flying_over_icy_steppes {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -852px -888px;
width: 141px;
height: 147px;
}
.background_flying_over_tropical_islands {
.background_flying_over_rocky_canyon {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -710px -888px;
width: 141px;
height: 147px;
}
.background_foggy_moor {
.background_flying_over_snowy_mountains {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -568px -888px;
width: 141px;
height: 147px;
}
.background_forest {
.background_flying_over_tropical_islands {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -426px -888px;
width: 141px;
height: 147px;
}
.background_frigid_peak {
.background_foggy_moor {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -284px -888px;
width: 141px;
height: 147px;
}
.background_frosty_forest {
.background_forest {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -142px -888px;
width: 141px;
height: 147px;
}
.background_frozen_lake {
.background_frigid_peak {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: 0px -888px;
width: 141px;
height: 147px;
}
.background_garden_shed {
.background_frosty_forest {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -994px -740px;
width: 141px;
height: 147px;
}
.background_gazebo {
.background_frozen_lake {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -994px -592px;
width: 141px;
height: 147px;
}
.background_giant_birdhouse {
.background_garden_shed {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -994px -444px;
width: 141px;
height: 147px;
}
.background_giant_book {
.background_gazebo {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -994px -296px;
width: 141px;
height: 147px;
}
.background_giant_dandelions {
.background_giant_birdhouse {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -994px -148px;
width: 141px;
height: 147px;
}
.background_giant_florals {
.background_giant_book {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -994px 0px;
width: 141px;
height: 147px;
}
.background_giant_seashell {
.background_giant_dandelions {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -852px -740px;
width: 141px;
height: 147px;
}
.background_giant_wave {
.background_giant_florals {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -710px -740px;
width: 141px;
height: 147px;
}
.background_glowing_mushroom_cave {
.background_giant_seashell {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -568px -740px;
width: 141px;
height: 147px;
}
.background_gorgeous_greenhouse {
.background_giant_wave {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -426px -740px;
width: 141px;
height: 147px;
}
.background_grand_staircase {
.background_glowing_mushroom_cave {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -284px -740px;
width: 141px;
height: 147px;
}
.background_graveyard {
.background_gorgeous_greenhouse {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -142px -740px;
width: 141px;
height: 147px;
}
.background_green {
.background_grand_staircase {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: 0px -740px;
width: 141px;
height: 147px;
}
.background_guardian_statues {
.background_graveyard {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -852px -592px;
width: 141px;
height: 147px;
}
.background_gumdrop_land {
.background_green {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -852px -444px;
width: 141px;
height: 147px;
}
.background_habit_city_streets {
.background_guardian_statues {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -852px -296px;
width: 141px;
height: 147px;
}
.background_halflings_house {
.background_gumdrop_land {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -852px -148px;
width: 141px;
height: 147px;
}
.background_harvest_feast {
.background_habit_city_streets {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -852px 0px;
width: 141px;
height: 147px;
}
.background_harvest_fields {
.background_halflings_house {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -710px -592px;
width: 141px;
height: 147px;
}
.background_harvest_moon {
.background_harvest_feast {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -568px -592px;
width: 141px;
height: 147px;
}
.background_haunted_house {
.background_harvest_fields {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -426px -592px;
width: 141px;
height: 147px;
}
.background_holiday_market {
.background_harvest_moon {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -284px -592px;
width: 141px;
height: 147px;
}
.background_holiday_wreath {
.background_haunted_house {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -142px -592px;
width: 141px;
height: 147px;
}
.background_ice_cave {
.background_holiday_market {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: 0px -592px;
width: 141px;
height: 147px;
}
.background_iceberg {
.background_holiday_wreath {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -710px -444px;
width: 141px;
height: 147px;
}
.background_idyllic_cabin {
.background_ice_cave {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -710px -296px;
width: 141px;
height: 147px;
}
.background_in_a_classroom {
.background_iceberg {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -710px -148px;
width: 141px;
height: 147px;
}
.background_in_an_ancient_tomb {
.background_idyllic_cabin {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -710px 0px;
width: 141px;
height: 147px;
}
.background_island_waterfalls {
.background_in_a_classroom {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -568px -444px;
width: 141px;
height: 147px;
}
.background_kelp_forest {
.background_in_an_ancient_tomb {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -426px -444px;
width: 141px;
height: 147px;
}
.background_lake_with_floating_lanterns {
.background_island_waterfalls {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -284px -444px;
width: 141px;
height: 147px;
}
.background_lighthouse_shore {
.background_kelp_forest {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -142px -444px;
width: 141px;
height: 147px;
}
.background_lilypad {
.background_lake_with_floating_lanterns {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: 0px -444px;
width: 141px;
height: 147px;
}
.background_magic_beanstalk {
.background_lighthouse_shore {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -568px -296px;
width: 141px;
height: 147px;
}
.background_magical_candles {
.background_lilypad {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -568px -148px;
width: 141px;
height: 147px;
}
.background_magical_museum {
.background_magic_beanstalk {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -568px 0px;
width: 141px;
height: 147px;
}
.background_marble_temple {
.background_magical_candles {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -426px -296px;
width: 141px;
height: 147px;
}
.background_market {
.background_magical_museum {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -284px -296px;
width: 141px;
height: 147px;
}
.background_meandering_cave {
.background_marble_temple {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -142px -296px;
width: 141px;
height: 147px;
}
.background_medieval_kitchen {
.background_market {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: 0px -296px;
width: 141px;
height: 147px;
}
.background_midnight_castle {
.background_meandering_cave {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -426px -148px;
width: 141px;
height: 147px;
}
.background_midnight_clouds {
.background_medieval_kitchen {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -426px 0px;
width: 141px;
height: 147px;
}
.background_midnight_lake {
.background_midnight_castle {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -284px -148px;
width: 141px;
height: 147px;
}
.background_mist_shrouded_mountain {
.background_midnight_clouds {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -142px -148px;
width: 141px;
height: 147px;
}
.background_mistiflying_circus {
.background_midnight_lake {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: 0px -148px;
width: 141px;
height: 147px;
}
.background_monster_makers_workshop {
.background_mist_shrouded_mountain {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -284px 0px;
width: 141px;
height: 147px;
}
.background_mountain_lake {
.background_mistiflying_circus {
background-image: url('~@/assets/images/sprites/spritesmith-main-0.png');
background-position: -142px 0px;
width: 141px;

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 477 KiB

After

Width:  |  Height:  |  Size: 476 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 688 KiB

After

Width:  |  Height:  |  Size: 687 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 KiB

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 340 KiB

After

Width:  |  Height:  |  Size: 313 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 342 KiB

After

Width:  |  Height:  |  Size: 353 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 KiB

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 155 KiB

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 135 KiB

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 173 KiB

After

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 KiB

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 KiB

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 153 KiB

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 162 KiB

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 178 KiB

After

Width:  |  Height:  |  Size: 178 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 160 KiB

After

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 150 KiB

After

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 KiB

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 129 KiB

After

Width:  |  Height:  |  Size: 134 KiB

View file

@ -121,7 +121,7 @@
v-if="editing"
class="menu-container col-2"
:class="{active: activeTopPage === 'backgrounds'}"
@click="changeTopPage('backgrounds', '2019')"
@click="changeTopPage('backgrounds', '2020')"
>
<div class="menu-item">
<div
@ -1160,7 +1160,7 @@ export default {
},
],
bgSubMenuItems: ['2019', '2018', '2017', '2016', '2015', '2014'].map(y => ({
bgSubMenuItems: ['2020', '2019', '2018', '2017', '2016', '2015', '2014'].map(y => ({
id: y,
label: y,
})),
@ -1183,6 +1183,7 @@ export default {
2017: [],
2018: [],
2019: [],
2020: [],
};
// Hack to force update for now until we restructure the data

View file

@ -76,7 +76,7 @@
</h3>
<div class="panel-body">
<div class="row">
<div class="col-md-4">
<div class="col-md-12">
<div class="form-group">
<!-- eslint-disable vue/no-use-v-if-with-v-for -->
<div
@ -98,11 +98,6 @@
</div>
</div>
</div>
<div class="col-md-8">
<h4 v-once> {{ $t('winterPromoGiftHeader') }} </h4>
<p v-once> {{ $t('winterPromoGiftDetails1') }} </p>
<p v-once> {{ $t('winterPromoGiftDetails2') }} </p>
</div>
</div>
</div>
</div>

View file

@ -1,19 +1,5 @@
<template>
<div class="standard-page pt-0 px-0">
<div class="banner-g1g1 mx-n3 d-flex justify-content-center">
<div
class="svg-icon svg-gifts my-auto mr-5 ml-auto"
v-html="icons.giftsVertical">
</div>
<div class="my-auto text-center">
<strong> {{ $t('g1g1Announcement') }} </strong>
<div class="mt-1"> {{ $t('g1g1Details') }} </div>
</div>
<div
class="svg-icon svg-gifts gifts-right my-auto ml-5 mr-auto"
v-html="icons.giftsVertical">
</div>
</div>
<h1>{{ $t('subscription') }}</h1>
<div class="row">
<div class="col-6">
@ -251,11 +237,6 @@
{{ $t('giftSubscriptionText4') }}
</h4>
</div>
<div class="col-6">
<h2 v-once> {{ $t('winterPromoGiftHeader') }} </h2>
<p v-once> {{ $t('winterPromoGiftDetails1') }} </p>
<p v-once> {{ $t('winterPromoGiftDetails2') }} </p>
</div>
</div>
</div>
</template>
@ -267,25 +248,9 @@
color: $white;
}
.banner-g1g1 {
height: 5.75rem;
background-color: $teal-50;
color: $white;
}
.gifts-right {
filter: flipH;
transform: scaleX(-1);
}
.subscribe-pay {
margin-top: 1em;
}
.svg-gifts {
width: 55px;
height: 65px;
}
</style>
<script>
@ -302,7 +267,6 @@ import notificationsMixin from '../../mixins/notifications';
import amazonButton from '@/components/payments/amazonButton';
import creditCardIcon from '@/assets/svg/credit-card-icon.svg';
import giftsVertical from '@/assets/svg/gifts-vertical.svg';
export default {
components: {
@ -331,7 +295,6 @@ export default {
},
icons: Object.freeze({
creditCardIcon,
giftsVertical,
}),
};
},

View file

@ -20,10 +20,6 @@
z-index: 1400; // 1400 is above modal backgrounds
&-top-pos {
&-double {
top: 145px;
}
&-normal {
top: 65px;
}
@ -38,7 +34,6 @@
<script>
import { mapState } from '@/libs/store';
import notification from './notification';
import { CONSTANTS, getLocalSetting } from '@/libs/userlocalManager';
export default {
components: {
@ -52,9 +47,7 @@ export default {
notificationsTopPos () {
const base = 'notifications-top-pos-';
let modifier = '';
if (this.userSleeping && this.giftingShown) {
modifier = 'double';
} else if (this.userSleeping || this.giftingShown) {
if (this.userSleeping) {
modifier = 'sleeping';
} else {
modifier = 'normal';
@ -62,10 +55,5 @@ export default {
return `${base}${modifier}`;
},
},
data () {
return {
giftingShown: getLocalSetting(CONSTANTS.keyConstants.GIFTING_BANNER_DISPLAY) !== 'dismissed',
};
},
};
</script>

View file

@ -6,7 +6,6 @@ const CONSTANTS = {
CURRENT_EQUIPMENT_DRAWER_TAB: 'current-equipment-drawer-tab',
STABLE_SORT_STATE: 'stable-sort-state',
ONBOARDING_PANEL_STATE: 'onboarding-panel-state',
GIFTING_BANNER_DISPLAY: 'gifting-banner-display',
},
drawerStateValues: {
DRAWER_CLOSED: 'drawer-closed',

View file

@ -555,6 +555,14 @@
"backgroundWinterNocturneText": "Winter Nocturne",
"backgroundWinterNocturneNotes": "Bask in the starlight of a Winter Nocturne.",
"backgrounds012020": "SET 68: Released January 2020",
"backgroundBirthdayPartyText": "Birthday Party",
"backgroundBirthdayPartyNotes": "Celebrate the Birthday Party of your favorite Habitican.",
"backgroundDesertWithSnowText": "Snowy Desert",
"backgroundDesertWithSnowNotes": "Witness the rare and quiet beauty of a Snowy Desert.",
"backgroundSnowglobeText": "Snowglobe",
"backgroundSnowglobeNotes": "Shake up a Snowglobe and take your place in a microcosm of a winter landscape.",
"timeTravelBackgrounds": "Steampunk Backgrounds",
"backgroundAirshipText": "Airship",
"backgroundAirshipNotes": "Become a sky sailor on board your very own Airship.",

View file

@ -469,6 +469,8 @@
"weaponArmoireShadowMastersMaceNotes": "Creatures of darkness will obey your every command when you wave this glowing mace. Increases Perception by <%= per %>. Enchanted Armoire: Shadow Master Set (Item 3 of 4).",
"weaponArmoireAlchemistsDistillerText": "Alchemist's Distiller",
"weaponArmoireAlchemistsDistillerNotes": "Purify metals and other magical compounds with this shiny brass instrument. Increases Strength by <%= str %> and Intelligence by <%= int %>. Enchanted Armoire: Alchemist Set (Item 3 of 4).",
"weaponArmoireHappyBannerText": "Happy Banner",
"weaponArmoireHappyBannerNotes": "Is the “H” for Happy, or Habitica? Your choice! Increases Perception by <%= per %>. Enchanted Armoire: Happy Birthday Set (Item 3 of 4).",
"armor": "armor",
"armorCapitalized": "Armor",
@ -1012,6 +1014,8 @@
"armorArmoireAlchemistsRobeNotes": "Any number of dangerous elixirs are involved in creating arcane metals and gems, and these heavy robes will protect you from harm and unintended side effects! Increases Constitution by <%= con %> and Perception by <%= per %>. Enchanted Armoire: Alchemist Set (Item 1 of 4).",
"armorArmoireDuffleCoatText": "Duffle Coat",
"armorArmoireDuffleCoatNotes": "Travel frosty realms in style with this cozy wool coat. Increases Constitution and Perception by <%= attrs %> each. Enchanted Armoire: Duffle Coat Set (Item 1 of 2).",
"armorArmoireLayerCakeArmorText": "Layer Cake Armor",
"armorArmoireLayerCakeArmorNotes": "It's protective and tasty! Increases Constitution by <%= con %>. Enchanted Armoire: Happy Birthday Set (Item 2 of 4).",
"headgear": "helm",
"headgearCapitalized": "Headgear",
@ -1573,6 +1577,8 @@
"headArmoireAlchemistsHatNotes": "While hats are not strictly necessary for alchemical practice, looking cool certainly doesn't hurt anything! Increases Perception by <%= per %>. Enchanted Armoire: Alchemist Set (Item 2 of 4).",
"headArmoireEarflapHatText": "Earflap Hat",
"headArmoireEarflapHatNotes": "If you're looking to keep your head toasty warm, this hat has you covered! Increases Intelligence and Strength by <%= attrs %> each. Enchanted Armoire: Duffle Coat Set (Item 2 of 2).",
"headArmoireFrostedHelmText": "Frosted Helm",
"headArmoireFrostedHelmNotes": "The perfect headgear for any celebration! Increases Intelligence by <%= int %>. Enchanted Armoire: Happy Birthday Set (Item 1 of 4).",
"offhand": "off-hand item",
"offhandCapitalized": "Off-Hand Item",
@ -1875,6 +1881,8 @@
"shieldArmoireMasteredShadowNotes": "Your powers have brought these swirling shadows to your side to do your bidding. Increases Perception and Constitution by <%= attrs %> each. Enchanted Armoire: Shadow Master Set (Item 4 of 4).",
"shieldArmoireAlchemistsScaleText": "Alchemist's Scale",
"shieldArmoireAlchemistsScaleNotes": "Ensure that your mystical ingredients are properly measured using this fine piece of equipment. Increases Intelligence by <%= int %>. Enchanted Armoire: Alchemist Set (Item 4 of 4).",
"shieldArmoireBirthdayBannerText": "Birthday Banner",
"shieldArmoireBirthdayBannerNotes": "Celebrate your special day, the special day of someone you love, or break this out for Habitica's Birthday on January 31! Increases Strength by <%= str %>. Enchanted Armoire: Happy Birthday Set (Item 4 of 4).",
"back": "Back Accessory",
"backCapitalized": "Back Accessory",

View file

@ -941,6 +941,20 @@ const backgrounds = {
notes: t('backgroundWinterNocturneNotes'),
},
},
backgrounds012020: {
birthday_party: {
text: t('backgroundBirthdayPartyText'),
notes: t('backgroundBirthdayPartyNotes'),
},
desert_with_snow: {
text: t('backgroundDesertWithSnowText'),
notes: t('backgroundDesertWithSnowNotes'),
},
snowglobe: {
text: t('backgroundSnowglobeText'),
notes: t('backgroundSnowglobeNotes'),
},
},
incentiveBackgrounds: {
violet: {
text: t('backgroundVioletText'),

View file

@ -516,6 +516,14 @@ const armor = {
set: 'duffle',
canOwn: ownsItem('armor_armoire_duffleCoat'),
},
layerCakeArmor: {
text: t('armorArmoireLayerCakeArmorText'),
notes: t('armorArmoireLayerCakeArmorNotes', { con: 13 }),
value: 100,
con: 13,
set: 'birthday',
canOwn: ownsItem('armor_armoire_layerCakeArmor'),
},
};
const body = {
@ -1055,6 +1063,14 @@ const head = {
set: 'duffle',
canOwn: ownsItem('head_armoire_earflapHat'),
},
frostedHelm: {
text: t('headArmoireFrostedHelmText'),
notes: t('headArmoireFrostedHelmNotes', { int: 13 }),
value: 100,
int: 13,
set: 'birthday',
canOwn: ownsItem('head_armoire_frostedHelm'),
},
};
const shield = {
@ -1342,6 +1358,14 @@ const shield = {
set: 'alchemist',
canOwn: ownsItem('shield_armoire_alchemistsScale'),
},
birthdayBanner: {
text: t('shieldArmoireBirthdayBannerText'),
notes: t('shieldArmoireBirthdayBannerNotes', { str: 7 }),
value: 100,
str: 7,
set: 'birthday',
canOwn: ownsItem('shield_armoire_birthdayBanner'),
},
};
const headAccessory = {
@ -1797,6 +1821,14 @@ const weapon = {
set: 'alchemist',
canOwn: ownsItem('weapon_armoire_alchemistsDistiller'),
},
happyBanner: {
text: t('weaponArmoireHappyBannerText'),
notes: t('weaponArmoireHappyBannerNotes', { per: 7 }),
value: 100,
per: 7,
set: 'birthday',
canOwn: ownsItem('weapon_armoire_happyBanner'),
},
};
export {

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,017 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 605 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 867 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 502 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 467 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,017 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 579 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View file

@ -4,7 +4,7 @@ const api = {};
// @TODO export this const, cannot export it from here because only routes are exported from
// controllers
const LAST_ANNOUNCEMENT_TITLE = 'JANUARY SUBSCRIBER ITEMS AND OFFICIAL HABITICA CHALLENGES!';
const LAST_ANNOUNCEMENT_TITLE = 'JANUARY BACKGROUNDS AND ARMOIRE ITEMS!';
const worldDmg = { // @TODO
bailey: false,
};
@ -31,68 +31,23 @@ api.getNews = {
<div class="mr-3 ${baileyClass}"></div>
<div class="media-body">
<h1 class="align-self-center">${res.t('newStuff')}</h1>
<h2>1/1/2020 - ${LAST_ANNOUNCEMENT_TITLE}</h2>
<h2>1/6/2020 - ${LAST_ANNOUNCEMENT_TITLE}</h2>
</div>
</div>
<hr/>
<div class="promo_mystery_202001 center-block"></div>
<h3>January Subscriber Items Revealed!</h3>
<div class="promo_armoire_backgrounds_202001 center-block"></div>
<p>
The January Subscriber Items have been revealed: the Fabled Fox Item Set! You'll receive
this set if you <a href='/user/settings/subscription'>subscribe to Habitica</a> by
January 31. If you're already an active subscriber, reload the site and then head to
Inventory > Items to claim your gear!
Weve added three new backgrounds to the Background Shop! Now your avatar can celebrate
at a Birthday Party, gaze at the quiet beauty of a Snowy Desert, and strike a festive
pose In A Snowglobe. Check them out under User Icon > Backgrounds!
</p>
<p>
Subscribers also receive the ability to buy Gems with Gold and other awesome perks! Plus,
our Gift-One-Get-One promotion is running now, so it's the perfect time to check it out.
Gift-One-Get-One runs until January 6.
</p>
<p>Thank you very much for your support -- it means a lot to us.</p>
<div class="small mb-3">by Beffymaroo</div>
<div class="scene_list center-block"></div>
<h3>January 2020 Resolution Success Challenge and Take This Challenge</h3>
<p>
The Habitica team has launched a special official Challenge series hosted in the <a
href='/groups/guild/6e6a8bd3-9f5f-4351-9188-9f11fcd80a99' target='_blank'>Official New
Year's Resolution Guild</a>. These Challenges are designed to help you build and maintain
goals that are destined for success and then stick with them as 2020 progresses.
</p>
<p>
Check out the first New Year's Resolution Challenge of the year to start your path to
resolution success! In <a href='/challenges/463efbbf-8d98-413d-9bdc-708ab336414e'>Begin
Your Quest</a>, we're focusing on choosing realistic and achievable resolutions! One
grand-prize winner will receive their choice of a one-month gift subscription to Habitica
or 25 Gems when it closes on February 3rd. Four lucky runners-up will get a 15 Gem prize.
</p>
<p>
Congratulations to the winners of December's Challenge, @AndoJun, @SilverSquirrel,
@CathB, @IntegrationAsh, and @DerRue!
</p>
<div class="promo_take_this center-block"></div>
<p>
The next Take This Challenge has also launched, <a
href='/challenges/8a4beff7-ce41-48de-b963-7194f85b656e'>Hero's Triumph</a>, with a focus
on volunteering. Be sure to check it out to earn additional pieces of the Take This armor
set!
</p>
<p>
<a href='http://www.takethis.org/' target='_blank'>Take This</a> is a nonprofit that
seeks to inform the gamer community about mental health issues, to provide education
about mental disorders and mental illness prevention, and to reduce the stigma of mental
illness.
</p>
<p>
Congratulations to the winners of the last Take This Challenge, "Test Thy Courage!":
grand prize winner @r-flan2020, and runners-up @SPLOOean, @Bobette37, @WizardGnome,
@pearlygeek, and @drilcipher! Plus, all participants in that Challenge have received a
piece of the <a
href='http://habitica.wikia.com/wiki/Event_Item_Sequences#Take_This_Armor_Set' target=
'_blank'>Take This item set</a> if they hadn't completed it already. It is located in
your Rewards column. Enjoy!
Plus, theres new Gold-purchasable equipment in the Enchanted Armoire, including the
Birthday Cake set. Better work hard on your real-life tasks to earn all the pieces!
Enjoy :)
</p>
<div class="small mb-3">
by Doctor B, the Take This team, Lemoness, Beffymaroo, and SabreCat
by FolleMente, Shine Caramia, Aspiring Advocate, gawrone, katieslug, and SabreCat
</div>
</div>
`,

View file

@ -234,20 +234,6 @@ async function createSubscription (data) {
// Only send push notifications if sending to a user other than yourself
if (data.gift.member._id !== data.user._id) {
const promoData = {
user: data.user,
gift: {
member: data.user,
subscription: {
key: data.gift.subscription.key,
},
},
paymentMethod: data.paymentMethod,
promo: 'Winter',
promoUsername: data.gift.member.auth.local.username,
};
await this.createSubscription(promoData);
if (data.gift.member.preferences.pushNotifications.giftedSubscription !== false) {
sendPushNotification(data.gift.member,
{

View file

@ -182,7 +182,7 @@ function sendSubscriptionNotification ({
let text;
const timestamp = new Date();
if (recipient.id) {
text = `${buyer.name} ${buyer.id} ${buyer.email} bought a ${months}-month gift subscription for ${recipient.name} ${recipient.id} ${recipient.email} and got a promo using ${paymentMethod} on ${timestamp}`;
text = `${buyer.name} ${buyer.id} ${buyer.email} bought a ${months}-month gift subscription for ${recipient.name} ${recipient.id} ${recipient.email} using ${paymentMethod} on ${timestamp}`;
} else if (groupId) {
text = `${buyer.name} ${buyer.id} ${buyer.email} bought a 1-month recurring group-plan for ${groupId} using ${paymentMethod} on ${timestamp}`;
} else {