diff --git a/Dockerfile-Production b/Dockerfile-Production index 568add8faf..de41436979 100644 --- a/Dockerfile-Production +++ b/Dockerfile-Production @@ -6,7 +6,7 @@ RUN npm install -g gulp grunt-cli bower mocha # Clone Habitica repo and install dependencies RUN mkdir -p /usr/src/habitrpg WORKDIR /usr/src/habitrpg -RUN git clone --branch v3.99.0 https://github.com/HabitRPG/habitica.git /usr/src/habitrpg +RUN git clone --branch v3.102.2 https://github.com/HabitRPG/habitica.git /usr/src/habitrpg RUN npm install RUN bower install --allow-root RUN gulp build:prod --force diff --git a/package.json b/package.json index 558348bff1..64d93e4ae0 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "habitica", "description": "A habit tracker app which treats your goals like a Role Playing Game.", - "version": "3.102.1", + "version": "3.102.2", "main": "./website/server/index.js", "dependencies": { "@slack/client": "^3.8.1", diff --git a/website/assets/sprites/dist/spritesmith-largeSprites-0.css b/website/assets/sprites/dist/spritesmith-largeSprites-0.css index e59f5516bb..39e4f871b5 100644 --- a/website/assets/sprites/dist/spritesmith-largeSprites-0.css +++ b/website/assets/sprites/dist/spritesmith-largeSprites-0.css @@ -1,36 +1,36 @@ .promo_android { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -1748px -176px; + background-position: -1748px 0px; width: 175px; height: 175px; } .promo_aquatic_potions { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -447px -148px; + background-position: -589px -148px; width: 141px; height: 441px; } .promo_backgrounds_armoire_201602 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -1606px 0px; + background-position: -1606px -295px; width: 141px; height: 294px; } .promo_backgrounds_armoire_201603 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -1606px -295px; + background-position: -1606px -590px; width: 141px; height: 294px; } .promo_backgrounds_armoire_201604 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: 0px -894px; + background-position: -1325px -441px; width: 140px; height: 441px; } .promo_backgrounds_armoire_201605 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -705px -894px; + background-position: -987px -894px; width: 140px; height: 441px; } @@ -60,25 +60,25 @@ } .promo_backgrounds_armoire_201610 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -141px -894px; + background-position: -282px -894px; width: 140px; height: 441px; } .promo_backgrounds_armoire_201611 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -564px -894px; + background-position: -141px -894px; width: 140px; height: 441px; } .promo_backgrounds_armoire_201612 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -423px -894px; + background-position: 0px -894px; width: 140px; height: 441px; } .promo_backgrounds_armoire_201701 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -846px -894px; + background-position: -705px -894px; width: 140px; height: 441px; } @@ -102,31 +102,31 @@ } .promo_backgrounds_armoire_201705 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -1183px -442px; + background-position: -447px -148px; width: 141px; height: 441px; } .promo_backgrounds_armoire_201706 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -899px -442px; + background-position: -1183px -442px; width: 141px; height: 441px; } .promo_backgrounds_armoire_201707 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -899px 0px; + background-position: -899px -442px; width: 141px; height: 441px; } .promo_bees { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -757px -442px; + background-position: -899px 0px; width: 141px; height: 441px; } .promo_bundle_feathered { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -140px -305px; + background-position: -757px -442px; width: 141px; height: 441px; } @@ -150,7 +150,7 @@ } .promo_checkin_incentives { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -1606px -590px; + background-position: -1606px 0px; width: 141px; height: 294px; } @@ -162,7 +162,7 @@ } .promo_classes_fall_2015 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -558px -1336px; + background-position: -823px -1336px; width: 377px; height: 99px; } @@ -228,7 +228,7 @@ } .promo_cow { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -282px -894px; + background-position: -564px -894px; width: 140px; height: 441px; } @@ -252,7 +252,7 @@ } .promo_enchanted_armoire { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -936px -1336px; + background-position: -1201px -1336px; width: 374px; height: 76px; } @@ -270,7 +270,7 @@ } .promo_enchanted_armoire_201509 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -1543px -1484px; + background-position: -1088px -1484px; width: 90px; height: 90px; } @@ -282,13 +282,13 @@ } .promo_enchanted_armoire_201601 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -1634px -1484px; + background-position: -906px -1484px; width: 90px; height: 90px; } .promo_fairy_potions { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -589px -148px; + background-position: -140px -305px; width: 141px; height: 441px; } @@ -300,13 +300,13 @@ } .promo_ghost_potions { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -987px -894px; + background-position: -846px -894px; width: 140px; height: 441px; } .promo_habitica { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -1748px 0px; + background-position: -1748px -176px; width: 175px; height: 175px; } @@ -318,7 +318,7 @@ } .promo_habitoween_2016 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -1325px -441px; + background-position: -423px -894px; width: 140px; height: 441px; } @@ -346,6 +346,12 @@ width: 276px; height: 147px; } +.promo_king_manta { + background-image: url(/static/sprites/spritesmith-largeSprites-0.png); + background-position: -558px -1336px; + width: 264px; + height: 147px; +} .promo_more_checkin_incentives { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); background-position: -306px 0px; @@ -354,7 +360,7 @@ } .promo_mystery_201405 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -906px -1484px; + background-position: -1543px -1484px; width: 90px; height: 90px; } @@ -378,7 +384,7 @@ } .promo_mystery_201409 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -341px -1585px; + background-position: -1634px -1484px; width: 90px; height: 90px; } @@ -390,7 +396,7 @@ } .promo_mystery_201411 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -815px -1484px; + background-position: -614px -1585px; width: 90px; height: 90px; } @@ -408,7 +414,7 @@ } .promo_mystery_201502 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -1088px -1484px; + background-position: -815px -1484px; width: 90px; height: 90px; } @@ -438,13 +444,13 @@ } .promo_mystery_201507 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -1467px -879px; + background-position: -1467px -773px; width: 90px; height: 105px; } .promo_mystery_201508 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -1467px -1167px; + background-position: -140px -747px; width: 93px; height: 90px; } @@ -456,7 +462,7 @@ } .promo_mystery_201510 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -140px -747px; + background-position: -721px -1484px; width: 93px; height: 90px; } @@ -504,13 +510,13 @@ } .promo_mystery_201606 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -1467px -773px; + background-position: -1467px -879px; width: 90px; height: 105px; } .promo_mystery_201607 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -614px -1585px; + background-position: -341px -1585px; width: 90px; height: 90px; } @@ -522,7 +528,7 @@ } .promo_mystery_201609 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -721px -1484px; + background-position: -1467px -1167px; width: 93px; height: 90px; } diff --git a/website/assets/sprites/dist/spritesmith-largeSprites-0.png b/website/assets/sprites/dist/spritesmith-largeSprites-0.png index bc2af2641e..e781a2f326 100644 Binary files a/website/assets/sprites/dist/spritesmith-largeSprites-0.png and b/website/assets/sprites/dist/spritesmith-largeSprites-0.png differ diff --git a/website/assets/sprites/spritesmith_large/promo/promo_king_manta.png b/website/assets/sprites/spritesmith_large/promo/promo_king_manta.png new file mode 100644 index 0000000000..0485ace17d Binary files /dev/null and b/website/assets/sprites/spritesmith_large/promo/promo_king_manta.png differ diff --git a/website/client-old/js/controllers/notificationCtrl.js b/website/client-old/js/controllers/notificationCtrl.js index e66be981f3..dc55e8395c 100644 --- a/website/client-old/js/controllers/notificationCtrl.js +++ b/website/client-old/js/controllers/notificationCtrl.js @@ -1,8 +1,8 @@ 'use strict'; habitrpg.controller('NotificationCtrl', - ['$scope', '$rootScope', 'Shared', 'Content', 'User', 'Guide', 'Notification', 'Analytics', 'Achievement', 'Social', 'Tasks', - function ($scope, $rootScope, Shared, Content, User, Guide, Notification, Analytics, Achievement, Social, Tasks) { + ['$scope', '$rootScope', 'Shared', 'Content', 'User', 'Guide', 'Notification', 'Analytics', 'Achievement', 'Social', 'Tasks', '$modal', + function ($scope, $rootScope, Shared, Content, User, Guide, Notification, Analytics, Achievement, Social, Tasks, $modal) { var isRunningYesterdailies = false; $rootScope.$watch('user', function (after, before) { @@ -53,7 +53,8 @@ habitrpg.controller('NotificationCtrl', modalScope.processingYesterdailies = true; $scope.yesterDailiesModalOpen = true; - $rootScope.openModal('yesterDailies', { + $modal.open({ + templateUrl: 'modals/yesterDailies.html', scope: modalScope, backdrop: 'static', controller: ['$scope', 'Tasks', 'User', '$rootScope', function ($scope, Tasks, User, $rootScope) { diff --git a/website/client-old/js/services/userServices.js b/website/client-old/js/services/userServices.js index 5ba7b008c4..9001450b86 100644 --- a/website/client-old/js/services/userServices.js +++ b/website/client-old/js/services/userServices.js @@ -423,7 +423,7 @@ angular.module('habitrpg') url: 'api/v3/cron', }) .then(function (response) { - sync(); + return sync(); }) }, diff --git a/website/client/assets/css/sprites/spritesmith-largeSprites-0.css b/website/client/assets/css/sprites/spritesmith-largeSprites-0.css index e59f5516bb..39e4f871b5 100644 --- a/website/client/assets/css/sprites/spritesmith-largeSprites-0.css +++ b/website/client/assets/css/sprites/spritesmith-largeSprites-0.css @@ -1,36 +1,36 @@ .promo_android { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -1748px -176px; + background-position: -1748px 0px; width: 175px; height: 175px; } .promo_aquatic_potions { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -447px -148px; + background-position: -589px -148px; width: 141px; height: 441px; } .promo_backgrounds_armoire_201602 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -1606px 0px; + background-position: -1606px -295px; width: 141px; height: 294px; } .promo_backgrounds_armoire_201603 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -1606px -295px; + background-position: -1606px -590px; width: 141px; height: 294px; } .promo_backgrounds_armoire_201604 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: 0px -894px; + background-position: -1325px -441px; width: 140px; height: 441px; } .promo_backgrounds_armoire_201605 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -705px -894px; + background-position: -987px -894px; width: 140px; height: 441px; } @@ -60,25 +60,25 @@ } .promo_backgrounds_armoire_201610 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -141px -894px; + background-position: -282px -894px; width: 140px; height: 441px; } .promo_backgrounds_armoire_201611 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -564px -894px; + background-position: -141px -894px; width: 140px; height: 441px; } .promo_backgrounds_armoire_201612 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -423px -894px; + background-position: 0px -894px; width: 140px; height: 441px; } .promo_backgrounds_armoire_201701 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -846px -894px; + background-position: -705px -894px; width: 140px; height: 441px; } @@ -102,31 +102,31 @@ } .promo_backgrounds_armoire_201705 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -1183px -442px; + background-position: -447px -148px; width: 141px; height: 441px; } .promo_backgrounds_armoire_201706 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -899px -442px; + background-position: -1183px -442px; width: 141px; height: 441px; } .promo_backgrounds_armoire_201707 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -899px 0px; + background-position: -899px -442px; width: 141px; height: 441px; } .promo_bees { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -757px -442px; + background-position: -899px 0px; width: 141px; height: 441px; } .promo_bundle_feathered { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -140px -305px; + background-position: -757px -442px; width: 141px; height: 441px; } @@ -150,7 +150,7 @@ } .promo_checkin_incentives { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -1606px -590px; + background-position: -1606px 0px; width: 141px; height: 294px; } @@ -162,7 +162,7 @@ } .promo_classes_fall_2015 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -558px -1336px; + background-position: -823px -1336px; width: 377px; height: 99px; } @@ -228,7 +228,7 @@ } .promo_cow { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -282px -894px; + background-position: -564px -894px; width: 140px; height: 441px; } @@ -252,7 +252,7 @@ } .promo_enchanted_armoire { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -936px -1336px; + background-position: -1201px -1336px; width: 374px; height: 76px; } @@ -270,7 +270,7 @@ } .promo_enchanted_armoire_201509 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -1543px -1484px; + background-position: -1088px -1484px; width: 90px; height: 90px; } @@ -282,13 +282,13 @@ } .promo_enchanted_armoire_201601 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -1634px -1484px; + background-position: -906px -1484px; width: 90px; height: 90px; } .promo_fairy_potions { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -589px -148px; + background-position: -140px -305px; width: 141px; height: 441px; } @@ -300,13 +300,13 @@ } .promo_ghost_potions { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -987px -894px; + background-position: -846px -894px; width: 140px; height: 441px; } .promo_habitica { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -1748px 0px; + background-position: -1748px -176px; width: 175px; height: 175px; } @@ -318,7 +318,7 @@ } .promo_habitoween_2016 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -1325px -441px; + background-position: -423px -894px; width: 140px; height: 441px; } @@ -346,6 +346,12 @@ width: 276px; height: 147px; } +.promo_king_manta { + background-image: url(/static/sprites/spritesmith-largeSprites-0.png); + background-position: -558px -1336px; + width: 264px; + height: 147px; +} .promo_more_checkin_incentives { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); background-position: -306px 0px; @@ -354,7 +360,7 @@ } .promo_mystery_201405 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -906px -1484px; + background-position: -1543px -1484px; width: 90px; height: 90px; } @@ -378,7 +384,7 @@ } .promo_mystery_201409 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -341px -1585px; + background-position: -1634px -1484px; width: 90px; height: 90px; } @@ -390,7 +396,7 @@ } .promo_mystery_201411 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -815px -1484px; + background-position: -614px -1585px; width: 90px; height: 90px; } @@ -408,7 +414,7 @@ } .promo_mystery_201502 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -1088px -1484px; + background-position: -815px -1484px; width: 90px; height: 90px; } @@ -438,13 +444,13 @@ } .promo_mystery_201507 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -1467px -879px; + background-position: -1467px -773px; width: 90px; height: 105px; } .promo_mystery_201508 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -1467px -1167px; + background-position: -140px -747px; width: 93px; height: 90px; } @@ -456,7 +462,7 @@ } .promo_mystery_201510 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -140px -747px; + background-position: -721px -1484px; width: 93px; height: 90px; } @@ -504,13 +510,13 @@ } .promo_mystery_201606 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -1467px -773px; + background-position: -1467px -879px; width: 90px; height: 105px; } .promo_mystery_201607 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -614px -1585px; + background-position: -341px -1585px; width: 90px; height: 90px; } @@ -522,7 +528,7 @@ } .promo_mystery_201609 { background-image: url(/static/sprites/spritesmith-largeSprites-0.png); - background-position: -721px -1484px; + background-position: -1467px -1167px; width: 93px; height: 90px; } diff --git a/website/common/locales/id/backgrounds.json b/website/common/locales/id/backgrounds.json index 39d0bbddf3..ac22022827 100644 --- a/website/common/locales/id/backgrounds.json +++ b/website/common/locales/id/backgrounds.json @@ -253,34 +253,34 @@ "backgroundMagicBeanstalkNotes": "Mendaki Pohon Kacang Sihir.", "backgroundMeanderingCaveText": "Gua Berkelok-kelok", "backgroundMeanderingCaveNotes": "Jelajahi Gua Berkelok-kelok.", - "backgroundMistiflyingCircusText": "Mistiflying Circus", - "backgroundMistiflyingCircusNotes": "Carouse in the Mistiflying Circus.", - "backgrounds042017": "SET 35: Released April 2017", - "backgroundBugCoveredLogText": "Bug-Covered Log", - "backgroundBugCoveredLogNotes": "Investigate a Bug-Covered Log.", - "backgroundGiantBirdhouseText": "Giant Birdhouse", - "backgroundGiantBirdhouseNotes": "Perch in a Giant Birdhouse.", - "backgroundMistShroudedMountainText": "Mist-Shrouded Mountain", - "backgroundMistShroudedMountainNotes": "Summit a Mist-Shrouded Mountain.", - "backgrounds052017": "SET 36: Released May 2017", - "backgroundGuardianStatuesText": "Guardian Statues", - "backgroundGuardianStatuesNotes": "Stand vigil in front of Guardian Statues.", - "backgroundHabitCityStreetsText": "Habit City Streets", - "backgroundHabitCityStreetsNotes": "Explore the Streets of Habit City.", - "backgroundOnATreeBranchText": "On a Tree Branch", - "backgroundOnATreeBranchNotes": "Perch On a Tree Branch.", - "backgrounds062017": "SET 37: Released June 2017", - "backgroundBuriedTreasureText": "Buried Treasure", - "backgroundBuriedTreasureNotes": "Unearth Buried Treasure.", - "backgroundOceanSunriseText": "Ocean Sunrise", - "backgroundOceanSunriseNotes": "Admire an Ocean Sunrise.", - "backgroundSandcastleText": "Sandcastle", - "backgroundSandcastleNotes": "Rule over a Sandcastle.", - "backgrounds072017": "SET 38: Released July 2017", - "backgroundGiantSeashellText": "Giant Seashell", - "backgroundGiantSeashellNotes": "Lounge in a Giant Seashell.", - "backgroundKelpForestText": "Kelp Forest", - "backgroundKelpForestNotes": "Swim through a Kelp Forest.", - "backgroundMidnightLakeText": "Midnight Lake", - "backgroundMidnightLakeNotes": "Rest by a Midnight Lake." + "backgroundMistiflyingCircusText": "Sirkus Mistiflying", + "backgroundMistiflyingCircusNotes": "Bersenang-senang di Sirkus Mistiflying", + "backgrounds042017": "SET 35: Dirilis April 2017", + "backgroundBugCoveredLogText": "Batang Pohon Berserubung Serangga", + "backgroundBugCoveredLogNotes": "Investigasi Batang Pohon Berserubung Serangga", + "backgroundGiantBirdhouseText": "Rumah Burung Raksasa", + "backgroundGiantBirdhouseNotes": "Bertengker di Rumah Burung Raksasa", + "backgroundMistShroudedMountainText": "Pegunungan Berserabut Kabut", + "backgroundMistShroudedMountainNotes": "Mendaki Pegunungan Berserabut Kabut", + "backgrounds052017": "SET 36: Dirilis Mei 2017", + "backgroundGuardianStatuesText": "Patung Penunggu", + "backgroundGuardianStatuesNotes": "Berjaga-jaga di depan Patung Penunggu", + "backgroundHabitCityStreetsText": "Jalanan Kota Habit", + "backgroundHabitCityStreetsNotes": "Bereksplorasi di Jalanan Kota Habit", + "backgroundOnATreeBranchText": "Di Ranting Pohon", + "backgroundOnATreeBranchNotes": "Bertengker di Ranting Pohon", + "backgrounds062017": "SET 37: Dirilis Juni 2017", + "backgroundBuriedTreasureText": "Harta Karun Tersembunyi", + "backgroundBuriedTreasureNotes": "Galilah Harta Karun Tersembunyi", + "backgroundOceanSunriseText": "Matahari Terbit di Tepi Lautan", + "backgroundOceanSunriseNotes": "Mengagumi Matahari Terbit di Tepi Lautan", + "backgroundSandcastleText": "Istana Pasir", + "backgroundSandcastleNotes": "Memerintah Sebuah Istana Pasir", + "backgrounds072017": "SET 38: Dirilis Juli 2017", + "backgroundGiantSeashellText": "Kerang Raksasa", + "backgroundGiantSeashellNotes": "Bermalas-malas di Kerang Raksasa", + "backgroundKelpForestText": "Hutan Rumput Laut", + "backgroundKelpForestNotes": "Berenang di Hutan Rumput Laut", + "backgroundMidnightLakeText": "Danau Tengah Malam", + "backgroundMidnightLakeNotes": "Beristirahat di Danau Tengah Malam" } \ No newline at end of file diff --git a/website/common/locales/id/challenge.json b/website/common/locales/id/challenge.json index a198cf38dd..d0dd7f7f0b 100644 --- a/website/common/locales/id/challenge.json +++ b/website/common/locales/id/challenge.json @@ -80,6 +80,6 @@ "userAlreadyInChallenge": "Pengguna telah berpartisipasi di dalam tantangan ini.", "cantOnlyUnlinkChalTask": "Hanya tugas tantangan rusak yang dapat diputuskan.", "shortNameTooShort": "Nama Label harus setidaknya memiliki 3 karakter.", - "joinedChallenge": "Joined a Challenge", - "joinedChallengeText": "This user put themselves to the test by joining a Challenge!" + "joinedChallenge": "Bergabung dengan sebuah Tantangan", + "joinedChallengeText": "User ini telah mengetes dirinya dengan bergabung pada sebuah Tantangan!" } \ No newline at end of file diff --git a/website/common/locales/id/character.json b/website/common/locales/id/character.json index 87396d56fd..c59e40ada1 100644 --- a/website/common/locales/id/character.json +++ b/website/common/locales/id/character.json @@ -1,5 +1,5 @@ { - "communityGuidelinesWarning": "Please keep in mind that your Display Name, profile photo, and blurb must comply with the Community Guidelines (e.g. no profanity, no adult topics, no insults, etc). If you have any questions about whether or not something is appropriate, feel free to email <%= hrefBlankCommunityManagerEmail %>!", + "communityGuidelinesWarning": "Ingatlah bahwa Nama Tampilan, foto profil, dan celotehmu harus mengikuti Pedoman Komunitas (misalnya, tidak menggunakan bahasa senonoh, topik dewasa, penghinaan, dsb). Jika kamu mempunyai pertanyaan apapun mengenai pantasnya sesuatu hal, silahkan email <%= hrefBlankCommunityManagerEmail %>!", "profile": "Profil", "avatar": "Ubah Tampilan Avatar", "other": "Lainnya", diff --git a/website/common/locales/id/communityguidelines.json b/website/common/locales/id/communityguidelines.json index 1f117deb73..52a2f2d0c2 100644 --- a/website/common/locales/id/communityguidelines.json +++ b/website/common/locales/id/communityguidelines.json @@ -12,7 +12,7 @@ "commGuideList01B": "Tabiat yang Rajin. Habiticans bekerja keras untuk memperbaiki hidup mereka, juga untuk membangun dan memperbaiki situs ini secara terus-menerus. Kami adalah proyek open-source, yang berarti kami sebisa mungkin selalu berusaha untuk membuat situs ini menjadi tempat terbaik.", "commGuideList01C": "Perilaku yang Suportif. Habiticans senang jika orang lain senang dan saling menghibur pada saat-saat yang sulit. Kita saling menguatkan, bergantung pada satu sama lain, dan belajar pada satu sama lain. Dalam kelompok, kita melakukan hal ini melalui mantera; di ruang chat, kita melakukan ini dengan kata-kata yang ramah dan suportif.", "commGuideList01D": "Sikap Saling Menghargai. Kita berasal dari latar belakang yang berbeda, juga memiliki keahlian dan opini yang berbeda. Itulah yang membuat komunitas kita sangat menakjubkan. Habiticans menghargai perbedaan ini, bahkan merayakannya. Jangan pergi ke mana-mana, dan kamu akan segera mendapatkan teman-teman baru dari berbagai lapisan komunitas.", - "commGuideHeadingMeet": "Meet the Staff and Mods!", + "commGuideHeadingMeet": "Temuilah para Staff dan Moderator!", "commGuidePara006": "Habitica memiliki beberapa ksatria yang bersatu padu dengan anggota staff untuk menjaga komunitas ini tetap damai, puas, dan bebas dari pengganggu. Masing-masing memiliki domain yang spesifik, namun sewaktu-waktu dapat dipanggil untuk membantu di lingkup sosial yang lain. Staff dan Moderator sering kali memulai pernyataan resmi dengan kata-kata \"Mod Talk\" atau \"Mod Hat On\"", "commGuidePara007": "Staf punya warna ungu dengan tanda mahkota. Gelar mereka adalah \"Pahlawan\".", "commGuidePara008": "Moderator memiliki tag biru gelap dengan tanda bintang. Gelar mereka adalah \"Pengawal\", kecuali Bailey, yang merupakan NPC dan memiliki tag hitam-hijau dengan tanda bintang.", diff --git a/website/common/locales/id/content.json b/website/common/locales/id/content.json index 61fcaf0e1a..f641a3c3a7 100644 --- a/website/common/locales/id/content.json +++ b/website/common/locales/id/content.json @@ -152,8 +152,8 @@ "questEggButterflyText": "Ulat", "questEggButterflyMountText": "Kupu-kupu", "questEggButterflyAdjective": "a cute", - "questEggNudibranchText": "Nudibranch", - "questEggNudibranchMountText": "Nudibranch", + "questEggNudibranchText": "Nudibranchia", + "questEggNudibranchMountText": "Nudibranchia", "questEggNudibranchAdjective": "a nifty", "eggNotes": "Dapatkan obat penetas untuk diberikan pada telur ini, dan ia akan menetas menjadi <%= eggText(locale) %> yang <%= eggAdjective(locale) %>;", "hatchingPotionBase": "Biasa", diff --git a/website/common/locales/id/contrib.json b/website/common/locales/id/contrib.json index 9bb9f1a042..4317290795 100644 --- a/website/common/locales/id/contrib.json +++ b/website/common/locales/id/contrib.json @@ -62,7 +62,7 @@ "surveysMultiple": "Membantu Habitica berkembang sebanyak <%= count %> kali, baik dengan mengisi survey atau membantu dalam pengujian utama. Terima kasih!", "currentSurvey": "Kuisioner Sekarang", "surveyWhen": "Lencana akan diberikan kepada semua peserta ketika survei telah diproses, pada akhir Maret.", - "blurbInbox": "This is where your private messages are stored! You can send someone a message by clicking on the envelope icon next to their name in Tavern, Party, or Guild Chat. If you've received an inappropriate PM, you should email a screenshot of it to Lemoness (<%= hrefCommunityManagerEmail %>)", + "blurbInbox": "Di sinilah pesan pribadimu disimpan! Kamu dapat mengirimkan pesan ke seseorang dengan menekan ikon amplop di sebelah nama mereka di Kedai Minuman, Party, atau Guild Chat. Jika kamu menerima PM yang tidak pantas, kirimlah screenshot tersebut melalui email ke Lemoness (<%= hrefCommunityManagerEmail %>)", "blurbGuildsPage": "Guild adalah grup obrolan bertopik yang dibuat oleh pengguna, untuk pengguna. Telusuri daftar tema dan bergabunglah dengan guild yang menarik untukmu!", "blurbChallenges": "Tantangan dibuat oleh sesama pemain. Bergabung pada sebuah tantangan akan menambah tugas ke daftarmu, dan memenangkan tantangan akan memberikanmu lencana dan terkadang hadiah permata!", "blurbHallPatrons": "Ini adalah Aula para Pelindung, di mana kami memberi penghormatan pada petualang pemberani yang membantu Kickstarter awal Habitica. Kami berterima kasih kepada mereka yang membantu kami menjadikan Habitica kenyataan!", diff --git a/website/common/locales/id/front.json b/website/common/locales/id/front.json index d75b7493f7..271b689990 100644 --- a/website/common/locales/id/front.json +++ b/website/common/locales/id/front.json @@ -134,7 +134,7 @@ "playButtonFull": "Masuk Habitica", "presskit": "Paket Pres", "presskitDownload": "Mengunduh seluruh gambar:", - "presskitText": "Thanks for your interest in Habitica! The following images can be used for articles or videos about Habitica. For more information, please contact Siena Leslie at <%= pressEnquiryEmail %>.", + "presskitText": "Terima kasih untuk ketertarikan anda pada Habitica! Gambar-gamar berikut ini dapat digunakan untuk artikel atau video mengenai Habitica. Untuk informasi lebih lanjut, silahkan hubungi Siena Leslie di <%= pressEnquiryEmail %>.", "pkVideo": "Video", "pkPromo": "Promo", "pkLogo": "Logo", @@ -259,7 +259,7 @@ "passwordResetEmailHtml": "Kalau kamu meminta reset kata sandi untuk <%= username %> di Habitica, \">klik di sini untuk membuat kata sandi baru. Tautan akan hangus setelah 24 jam.

Kalau kamu tidak pernah meminta reset kata sandi, abaikan saja email ini.", "invalidLoginCredentialsLong": "O-oh - nama pengguna atau kata sandi tidak benar.\n- Pastikan nama pengguna atau email diketikkan dengan benar.\n- Kamu mungkin mendaftar dengan menggunakan Facebook, bukan email. Periksa ulang dengan mencoba masuk melalui Facebook.\n- Jika kamu lupa kata sandi, klik \"Lupa Kata Sandi\".", "invalidCredentials": "Tidak ada akun yang menggunakan credential tersebut.", - "accountSuspended": "Account has been suspended, please contact <%= communityManagerEmail %> with your User ID \"<%= userId %>\" for assistance.", + "accountSuspended": "Akun anda telah disuspend, mohon hubungi <%= communityManagerEmail %> dengan User ID anda \"<%= userId %>\" untuk bantuan.", "unsupportedNetwork": "Jaringan ini saat ini belum didukung.", "cantDetachSocial": "Akun tidak memiliki metode autentikasi lain; tidak dapat memutuskan metode autentikasi ini.", "onlySocialAttachLocal": "Autentikasi lokal dapat ditambahkan hanya pada akun sosial.", diff --git a/website/common/locales/it/gear.json b/website/common/locales/it/gear.json index 3449a8bba1..64a456f016 100644 --- a/website/common/locales/it/gear.json +++ b/website/common/locales/it/gear.json @@ -802,8 +802,8 @@ "headSpecialSpring2017MageNotes": "Questo cappello può aiutarti a lanciare potenti incantesimi... o lo puoi usare per evocare delle palline da tennis. A te la scelta. Aumenta la Percezione di <%= per %>. Edizione limitata, primavera 2017.", "headSpecialSpring2017HealerText": "Tiara di Petali", "headSpecialSpring2017HealerNotes": "Questa delicata corona emana il confortante aroma dei nuovi fiori primaverili. Aumenta l’Intelligenza di <%= int %>. Edizione limitata, primavera 2017.", - "headSpecialSummer2017RogueText": "Sea Dragon Helm", - "headSpecialSummer2017RogueNotes": "This helm changes colors to help you blend in with your surroundings. Increases Perception by <%= per %>. Limited Edition 2017 Summer Gear.", + "headSpecialSummer2017RogueText": "Elmo del Drago Marino", + "headSpecialSummer2017RogueNotes": "Questo elmo cambia colore per aiutarti a mimettizarti nell'ambiente. Aumenta la Percezione di <%= per %>. Edizione limitata, estate 2017.", "headSpecialSummer2017WarriorText": "Elmo Castello di Sabbia", "headSpecialSummer2017WarriorNotes": "L'elmo più raffinato che si possa sperare di indossare... per lo meno fino all'arrivo della marea. Aumenta la Forza di <%= str % >. Edizione limitata, estate 2017.", "headSpecialSummer2017MageText": "Whirlpool Hat", diff --git a/website/common/locales/nl/backgrounds.json b/website/common/locales/nl/backgrounds.json index 61c8860611..12afd0172e 100644 --- a/website/common/locales/nl/backgrounds.json +++ b/website/common/locales/nl/backgrounds.json @@ -270,10 +270,10 @@ "backgroundOnATreeBranchText": "Op een Boomtak", "backgroundOnATreeBranchNotes": "Strijk neer op een boomtak.", "backgrounds062017": "SET 37: uitgebracht in juni 2017", - "backgroundBuriedTreasureText": "Begraven schat", - "backgroundBuriedTreasureNotes": "Graaf begraven schatten op.", - "backgroundOceanSunriseText": "Oceaan met zonsopgang", - "backgroundOceanSunriseNotes": "Bewonder een oceaan met zonsopgang.", + "backgroundBuriedTreasureText": "Begraven Schat", + "backgroundBuriedTreasureNotes": "Graaf verborgen schatten op.", + "backgroundOceanSunriseText": "Oceaan met Zonsopgang", + "backgroundOceanSunriseNotes": "Bewonder een zonsopgang boven de oceaan.", "backgroundSandcastleText": "Zandkasteel", "backgroundSandcastleNotes": "Heers over een zandkasteel", "backgrounds072017": "SET 38: Uitgebracht in juli 2017", diff --git a/website/common/locales/nl/limited.json b/website/common/locales/nl/limited.json index 2fdddf16ee..58dad594cf 100644 --- a/website/common/locales/nl/limited.json +++ b/website/common/locales/nl/limited.json @@ -112,6 +112,6 @@ "dateEndApril": "19 april", "dateEndMay": "17 mei", "dateEndJune": "14 juni", - "dateEndJuly": "Juli 29", + "dateEndJuly": "29 juli", "discountBundle": "bundel" } \ No newline at end of file diff --git a/website/common/locales/nl/pets.json b/website/common/locales/nl/pets.json index 1f2e77d719..afc564332b 100644 --- a/website/common/locales/nl/pets.json +++ b/website/common/locales/nl/pets.json @@ -74,7 +74,7 @@ "earnedCompanion": "Door al jouw productiviteit heb je een nieuwe kameraad verdiend. Voer hem en laat hem groeien! ", "feedPet": "<%= text %> aan je <%= name %> voeren?", "useSaddle": "<%= pet %> zadelen?", - "raisedPet": "undefined", + "raisedPet": "Je hebt je <%= pet %> laten opgroeien!", "earnedSteed": "Door het voltooien van taken heb je een trouw ros verdiend!", "rideNow": "Berijd nu", "rideLater": "Berijd later", diff --git a/website/common/locales/ru/gear.json b/website/common/locales/ru/gear.json index 478334d0d0..d26d1fd5fa 100644 --- a/website/common/locales/ru/gear.json +++ b/website/common/locales/ru/gear.json @@ -1081,7 +1081,7 @@ "shieldSpecialSummer2017WarriorText": "Scallop Shield", "shieldSpecialSummer2017WarriorNotes": "This shell that you just found is both decorative AND defensive! Increases Constitution by <%= con %>. Limited Edition 2017 Summer Gear.", "shieldSpecialSummer2017HealerText": "Щит из раковины моллюска", - "shieldSpecialSummer2017HealerNotes": "Этот щит волшебной устрицы постоянно порождает жемчуг так де как и защищает. Увеличивает телосложение на <%= con %>. Ограниченный выпуск лета 2017.", + "shieldSpecialSummer2017HealerNotes": "Этот щит волшебной устрицы постоянно порождает жемчуг, а так же защищает. Увеличивает телосложение на <%= con %>. Ограниченный выпуск лета 2017.", "shieldMystery201601Text": "Уничтожитель Решительности", "shieldMystery201601Notes": "Этот клинок может быть использован, чтобы парировать все отвлечения. Бонусов не дает. Подарок подписчикам января 2016.", "shieldMystery201701Text": "Время-Замораживающий Щит", diff --git a/website/common/locales/ru/groups.json b/website/common/locales/ru/groups.json index b91e880ab8..e086e49fb6 100644 --- a/website/common/locales/ru/groups.json +++ b/website/common/locales/ru/groups.json @@ -209,7 +209,7 @@ "onlyCreatorOrAdminCanDeleteChat": "Вы не авторизованы чтобы удаить это сообщение!", "onlyGroupLeaderCanEditTasks": "Вы не авторизованы, чтобы редактировать задачи!", "onlyGroupTasksCanBeAssigned": "Можно назначать только командные задачи", - "chatPrivilegesRevoked": "Your chat privileges have been revoked.", + "chatPrivilegesRevoked": "Ваши права в чате были отменены.", "newChatMessagePlainNotification": "Новое сообщение в <%= groupName %> от <%= authorName %>. Нажмите, чтобы открыть чат!", "newChatMessageTitle": "Новое сообщение в <%= groupName %>", "exportInbox": "Экспортировать сообщения", diff --git a/website/common/locales/ru/subscriber.json b/website/common/locales/ru/subscriber.json index f722362c2f..c59a7777d9 100644 --- a/website/common/locales/ru/subscriber.json +++ b/website/common/locales/ru/subscriber.json @@ -169,5 +169,5 @@ "missingCustomerId": "Отсутствует req.query.customerId", "missingPaypalBlock": "Отсутствует req.session.paypalBlock", "missingSubKey": "Отсутствует req.query.sub", - "paypalCanceled": "Your subscription has been canceled" + "paypalCanceled": "Ваша подписка была отменена" } \ No newline at end of file diff --git a/website/server/libs/taskManager.js b/website/server/libs/taskManager.js index 5aba20be57..fcf580e7e5 100644 --- a/website/server/libs/taskManager.js +++ b/website/server/libs/taskManager.js @@ -30,12 +30,14 @@ export function setNextDue (task, user, dueDateOption) { let dateTaskIsDue = Date.now(); if (dueDateOption) { // @TODO Add required ISO format - dateTaskIsDue = moment(dueDateOption).add(user.preferences.timezoneOffset, 'minutes'); + dateTaskIsDue = moment(dueDateOption); // If not time is supplied. Let's assume we want start of Custom Day Start day. if (dateTaskIsDue.hour() === 0 && dateTaskIsDue.minute() === 0 && dateTaskIsDue.second() === 0 && dateTaskIsDue.millisecond() === 0) { + dateTaskIsDue.add(user.preferences.timezoneOffset, 'minutes'); dateTaskIsDue.add(user.preferences.dayStart, 'hours'); } + now = dateTaskIsDue; } diff --git a/website/server/middlewares/cron.js b/website/server/middlewares/cron.js index 55bff14066..409a5edefd 100644 --- a/website/server/middlewares/cron.js +++ b/website/server/middlewares/cron.js @@ -7,6 +7,36 @@ import { recoverCron, cron } from '../libs/cron'; import { v4 as uuid } from 'uuid'; import logger from '../libs/logger'; +async function checkForActiveCron (user, now) { + let _cronSignature = uuid(); + + // To avoid double cron we first set _cronSignature and then check that it's not changed while processing + let userUpdateResult = await User.update({ + _id: user._id, + _cronSignature: 'NOT_RUNNING', // Check that in the meantime another cron has not started + }, { + $set: { + _cronSignature, + lastCron: now, // setting lastCron now so we don't risk re-running parts of cron if it fails + 'auth.timestamps.loggedin': now, + }, + }).exec(); + + // If the cron signature is already set, cron is running in another request + // throw an error and recover later, + if (userUpdateResult.nMatched === 0 || userUpdateResult.nModified === 0) { + throw new Error('CRON_ALREADY_RUNNING'); + } +} + +async function unlockUser (user) { + await User.update({ + _id: user._id, + }, { + _cronSignature: 'NOT_RUNNING', + }).exec(); +} + async function cronAsync (req, res) { let user = res.locals.user; if (!user) return null; // User might not be available when authentication is not mandatory @@ -17,31 +47,14 @@ async function cronAsync (req, res) { try { let {daysMissed, timezoneOffsetFromUserPrefs} = user.daysUserHasMissed(now, req); + await checkForActiveCron(user, now); + if (daysMissed <= 0) { if (user.isModified()) await user.save(); + await unlockUser(user); return null; } - let _cronSignature = uuid(); - - // To avoid double cron we first set _cronSignature and then check that it's not changed while processing - let userUpdateResult = await User.update({ - _id: user._id, - _cronSignature: 'NOT_RUNNING', // Check that in the meantime another cron has not started - }, { - $set: { - _cronSignature, - lastCron: now, // setting lastCron now so we don't risk re-running parts of cron if it fails - 'auth.timestamps.loggedin': now, - }, - }).exec(); - - // If the cron signature is already set, cron is running in another request - // throw an error and recover later, - if (userUpdateResult.nMatched === 0 || userUpdateResult.nModified === 0) { - throw new Error('CRON_ALREADY_RUNNING'); - } - let tasks = await Tasks.Task.find({ userId: user._id, $or: [ // Exclude completed todos diff --git a/website/static/sprites/spritesmith-largeSprites-0.png b/website/static/sprites/spritesmith-largeSprites-0.png index bc2af2641e..e781a2f326 100644 Binary files a/website/static/sprites/spritesmith-largeSprites-0.png and b/website/static/sprites/spritesmith-largeSprites-0.png differ diff --git a/website/views/shared/new-stuff.jade b/website/views/shared/new-stuff.jade index e66e1e14bc..f0459e913e 100644 --- a/website/views/shared/new-stuff.jade +++ b/website/views/shared/new-stuff.jade @@ -1,25 +1,32 @@ -.promo_bundle_splashy.pull-right -h2 7/11/2017 - NEW DISCOUNTED PET QUEST BUNDLE AND ORCAS FOR EVERYONE +h2 7/13/2017 - BEHIND THE SCENES: KING MANTA hr tr td - h3 New Discounted Pet Quest Bundle: Splashy Pals - p If you're a fan of sea creatures, you're in luck! From now until July 31, you can purchase the Splashy Pals Pet Quest Bundle and receive the Seahorse, Sea Turtle, and Whale quests, all for only 7 Gems! That's a discount of 5 Gems from the price of purchasing them separately. Check it out in the Quest Shop today! - p.small.muted by Lemoness and SabreCat - p.small.muted Art by McCoyly, krazjega, UncommonCriminal, zoebeagle, Kiwibot, JessicaChase, Scarabsi, JaizakArpaik - p.small.muted Writing by Calae, Ginger_Hanna, Lemoness - tr - td - .promo_orcas.pull-left.slight-right-margin - h3 Orcas for Everyone! - p Looks like there are even more sea animals riding the waves around the city of Dilatory: Some friendly Orcas are swimming into Habiticans' stables! In honor of the Summer Splash event, everyone gets a free Orca mount or, if you already had the Orca mount, a cute Orca pet. Enjoy! - p.small.muted by Beffymaroo and UncommonCriminal + .promo_king_manta.center-block + h3 Behind the Scenes Blog Post: King Manta! + p Have you ever wanted to know more about King Manta, the Mage Masterclasser? Today's blog post features a spotlight on the ruler of the undersea city of Dilatory! Check it out now to learn about how he learned his masterful magic skills, his friends and family, and his hobbies! + p.small.muted by Lemoness if menuItem !== 'oldNews' hr a(href='/static/old-news', target='_blank') Read older news mixin oldNews + h2 7/11/2017 - NEW DISCOUNTED PET QUEST BUNDLE AND ORCAS FOR EVERYONE + .promo_bundle_splashy.pull-right + tr + td + h3 New Discounted Pet Quest Bundle: Splashy Pals + p If you're a fan of sea creatures, you're in luck! From now until July 31, you can purchase the Splashy Pals Pet Quest Bundle and receive the Seahorse, Sea Turtle, and Whale quests, all for only 7 Gems! That's a discount of 5 Gems from the price of purchasing them separately. Check it out in the Quest Shop today! + p.small.muted by Lemoness and SabreCat + p.small.muted Art by McCoyly, krazjega, UncommonCriminal, zoebeagle, Kiwibot, JessicaChase, Scarabsi, JaizakArpaik + p.small.muted Writing by Calae, Ginger_Hanna, Lemoness + tr + td + .promo_orcas.pull-left.slight-right-margin + h3 Orcas for Everyone! + p Looks like there are even more sea animals riding the waves around the city of Dilatory: Some friendly Orcas are swimming into Habiticans' stables! In honor of the Summer Splash event, everyone gets a free Orca mount or, if you already had the Orca mount, a cute Orca pet. Enjoy! + p.small.muted by Beffymaroo and UncommonCriminal h2 7/5/2017 - RECORD YESTERDAY'S ACTIVITY, SPLASHY SKINS, AND SEAFOAM .scene_dailies.pull-right tr