diff --git a/test/api/v3/integration/chat/POST-chat.test.js b/test/api/v3/integration/chat/POST-chat.test.js index 59ac15f2f8..88ca6a6d3b 100644 --- a/test/api/v3/integration/chat/POST-chat.test.js +++ b/test/api/v3/integration/chat/POST-chat.test.js @@ -224,7 +224,7 @@ describe('POST /chat', () => { color: 'danger', author_name: `${user.profile.name} - ${user.auth.local.email} - ${user._id}`, title: 'Slur in Test Guild', - title_link: `${BASE_URL}/#/options/groups/guilds/${groupWithChat.id}`, + title_link: `${BASE_URL}/groups/guild/${groupWithChat.id}`, text: testSlurMessage, // footer: sandbox.match(/<.*?groupId=group-id&chatId=chat-id\|Flag this message>/), mrkdwn_in: [ diff --git a/test/api/v3/unit/libs/email.test.js b/test/api/v3/unit/libs/email.test.js index 918c976bd5..1597ccee73 100644 --- a/test/api/v3/unit/libs/email.test.js +++ b/test/api/v3/unit/libs/email.test.js @@ -142,12 +142,12 @@ describe('emails', () => { describe('getGroupUrl', () => { it('returns correct url if group is the tavern', () => { let getGroupUrl = require(pathToEmailLib).getGroupUrl; - expect(getGroupUrl({_id: TAVERN_ID, type: 'guild'})).to.eql('/#/options/groups/tavern'); + expect(getGroupUrl({_id: TAVERN_ID, type: 'guild'})).to.eql('/groups/tavern'); }); it('returns correct url if group is a guild', () => { let getGroupUrl = require(pathToEmailLib).getGroupUrl; - expect(getGroupUrl({_id: 'random _id', type: 'guild'})).to.eql('/#/options/groups/guilds/random _id'); + expect(getGroupUrl({_id: 'random _id', type: 'guild'})).to.eql('/groups/guild/random _id'); }); it('returns correct url if group is a party', () => { diff --git a/test/api/v3/unit/libs/slack.js b/test/api/v3/unit/libs/slack.js index 2086b97331..6c827d4958 100644 --- a/test/api/v3/unit/libs/slack.js +++ b/test/api/v3/unit/libs/slack.js @@ -71,7 +71,7 @@ describe('slack', () => { expect(IncomingWebhook.prototype.send).to.be.calledWithMatch({ attachments: [sandbox.match({ title: 'Flag in Some group', - title_link: sandbox.match(/.*\/#\/options\/groups\/guilds\/group-id/), + title_link: sandbox.match(/.*\/groups\/guild\/group-id/), })], }); }); @@ -86,7 +86,7 @@ describe('slack', () => { expect(IncomingWebhook.prototype.send).to.be.calledWithMatch({ attachments: [sandbox.match({ title: 'Flag in Tavern', - title_link: sandbox.match(/.*\/#\/options\/groups\/tavern/), + title_link: sandbox.match(/.*\/groups\/tavern/), })], }); }); diff --git a/website/client/components/chat/copyAsTodoModal.vue b/website/client/components/chat/copyAsTodoModal.vue index 18920445e7..ec19218900 100644 --- a/website/client/components/chat/copyAsTodoModal.vue +++ b/website/client/components/chat/copyAsTodoModal.vue @@ -46,7 +46,7 @@ export default { copyingMessage () { this.text = this.copyingMessage.text; let baseUrl = 'https://habitica.com'; - this.notes = `[${this.copyingMessage.user}](${baseUrl}/static/home/#?memberId=${this.copyingMessage.uuid}) wrote in [${this.groupName}](${baseUrl}/#/options/groups/${this.groupId})`; + this.notes = `[${this.copyingMessage.user}](${baseUrl}/static/home/#?memberId=${this.copyingMessage.uuid}) wrote in [${this.groupName}](${baseUrl}/groups/guild/${this.groupId})`; }, }, methods: { diff --git a/website/client/components/groups/group.vue b/website/client/components/groups/group.vue index 3e4d34856c..6c61a559a6 100644 --- a/website/client/components/groups/group.vue +++ b/website/client/components/groups/group.vue @@ -754,7 +754,7 @@ export default { // @TODO: Implement // User.sync().then(function () { - // $rootScope.hardRedirect('/#/options/groups/party'); + // $rootScope.hardRedirect('/party'); // }); }, upgradeGroup () { diff --git a/website/client/components/groups/groupFormModal.vue b/website/client/components/groups/groupFormModal.vue index 05326616e4..0a3944c071 100644 --- a/website/client/components/groups/groupFormModal.vue +++ b/website/client/components/groups/groupFormModal.vue @@ -57,7 +57,7 @@ label strong(v-once) {{$t('guildSummary')}} * div.summary-count {{charactersRemaining}} {{ $t('charactersRemaining') }} - textarea.form-control.summary-textarea(:placeholder="isParty ? $t('partyDescriptionPlaceHolder') : $t('guildSummaryPlaceholder')", v-model="workingGroup.summary") + textarea.form-control.summary-textarea(:placeholder="isParty ? $t('partyDescriptionPlaceholder') : $t('guildSummaryPlaceholder')", v-model="workingGroup.summary") // @TODO: need summary only for PUBLIC GUILDS, not for tavern, private guilds, or party .form-group diff --git a/website/client/components/groups/tavern.vue b/website/client/components/groups/tavern.vue index 1962718819..bbff3fb0e4 100644 --- a/website/client/components/groups/tavern.vue +++ b/website/client/components/groups/tavern.vue @@ -463,6 +463,10 @@ export default { name: 'Dewines', type: 'Moderator', }, + { + name: 'Fox_town', + type: 'Moderator', + }, { name: 'Megan', type: 'Moderator', diff --git a/website/client/components/payments/buyGemsModal.vue b/website/client/components/payments/buyGemsModal.vue index bdabf0c59e..d160157303 100644 --- a/website/client/components/payments/buyGemsModal.vue +++ b/website/client/components/payments/buyGemsModal.vue @@ -26,10 +26,10 @@ .row .col +featureBullet("{{ $t('gemBenefit1') }}") - +featureBullet("{{ $t('gemBenefit1') }}") + +featureBullet("{{ $t('gemBenefit2') }}") .col - +featureBullet("{{ $t('gemBenefit1') }}") - +featureBullet("{{ $t('gemBenefit1') }}") + +featureBullet("{{ $t('gemBenefit3') }}") + +featureBullet("{{ $t('gemBenefit4') }}") .card-deck .card.text-center .card-img-top diff --git a/website/client/components/settings/site.vue b/website/client/components/settings/site.vue index 03a3d2fce6..507ba866e2 100644 --- a/website/client/components/settings/site.vue +++ b/website/client/components/settings/site.vue @@ -150,11 +150,7 @@ |: {{user.auth.local.username}} p small.muted - | {{ $t('loginNameDescription1') }} - |  - a(href='/#/options/profile/profile') {{ $t('loginNameDescription2') }} - |  - | {{ $t('loginNameDescription3') }} + | {{ $t('loginNameDescription') }} p {{ $t('email') }} |: {{user.auth.local.email}} hr diff --git a/website/client/components/static/communityGuidelines.vue b/website/client/components/static/communityGuidelines.vue index 1d97ff4b5d..1c22dcad57 100644 --- a/website/client/components/static/communityGuidelines.vue +++ b/website/client/components/static/communityGuidelines.vue @@ -274,10 +274,10 @@ h2#links {{ $t('commGuideHeadingLinks') }} ul li - a(href='https://habitica.com/#/options/groups/guilds/5481ccf3-5d2d-48a9-a871-70a7380cee5a' target='_blank') {{ $t('commGuideLink01') }} + a(href='https://habitica.com/groups/guild/5481ccf3-5d2d-48a9-a871-70a7380cee5a' target='_blank') {{ $t('commGuideLink01') }} | : {{ $t('commGuideLink01description') }} li - a(href='https://habitica.com/#/options/groups/guilds/426c2c1a-eed0-4997-9b73-d30fc1397688' target='_blank') {{ $t('commGuideLink02') }} + a(href='https://habitica.com/groups/guild/426c2c1a-eed0-4997-9b73-d30fc1397688' target='_blank') {{ $t('commGuideLink02') }} | : {{ $t('commGuideLink02description') }} li span(v-html="$t('commGuideLink03')") diff --git a/website/client/components/tasks/spells.vue b/website/client/components/tasks/spells.vue index ddeae6eb57..cfc75f3dfe 100644 --- a/website/client/components/tasks/spells.vue +++ b/website/client/components/tasks/spells.vue @@ -9,7 +9,7 @@ div(v-if='user.stats.lvl > 10') .col-4.mana .img(:class='`shop_${spell.key} shop-sprite item-img`') - drawer(:title="$t('spells')", + drawer(:title="$t('skillsTitle')", v-if='user.stats.class && !user.preferences.disableClasses', v-mousePosition="30", @mouseMoved="mouseMoved($event)", :openStatus='openStatus', diff --git a/website/client/components/userMenu/profile.vue b/website/client/components/userMenu/profile.vue index 5255a14217..6274d0a552 100644 --- a/website/client/components/userMenu/profile.vue +++ b/website/client/components/userMenu/profile.vue @@ -91,12 +91,18 @@ div #achievements.standard-page.container(v-show='selectedPage === "achievements"', v-if='user.achievements') .row(v-for='(category, key) in achievements') h2.col-12.text-center {{ $t(key+'Achievs') }} - .col-3.text-center(v-for='(achievment, key) in category.achievements') - .box.achievement-container(:id='key', :class='{"achievement-unearned": !achievment.earned}') - b-popover(:target="'#' + key", triggers="hover", placement="top", :content="achievment.title + achievment.text") - .achievement(:class='achievment.icon + "2x"', v-if='achievment.earned') - .counter.badge.badge-info.stack-count(v-if='achievment.optionalCount') {{achievment.optionalCount}} - .achievement.achievement-unearned(class='achievement-unearned2x', v-if='!achievment.earned') + .col-3.text-center(v-for='(achievement, key) in category.achievements') + .box.achievement-container(:id='key', :class='{"achievement-unearned": !achievement.earned}') + b-popover( + :target="'#' + key", + triggers="hover", + placement="top", + ) + h4.popover-content-title {{ achievement.title }} + div.popover-content-text(v-html="achievement.text") + .achievement(:class='achievement.icon + "2x"', v-if='achievement.earned') + .counter.badge.badge-info.stack-count(v-if='achievement.optionalCount') {{achievement.optionalCount}} + .achievement.achievement-unearned(class='achievement-unearned2x', v-if='!achievement.earned') hr.col-12 .row .col-6(v-if='user.achievements.challenges') diff --git a/website/common/locales/en/character.json b/website/common/locales/en/character.json index c109872eda..83db4a5843 100644 --- a/website/common/locales/en/character.json +++ b/website/common/locales/en/character.json @@ -68,12 +68,12 @@ "costumeText": "If you prefer the look of other gear to what you have equipped, check the \"Use Costume\" box to visually don a costume while wearing your battle gear underneath.", "useCostume": "Use Costume", "useCostumeInfo1": "Click \"Use Costume\" to equip items to your avatar without affecting the stats from your Battle Gear! This means that you can equip for the best stats on the left, and dress up your avatar with your equipment on the right.", - "useCostumeInfo2": "Once you click \"Use Costume\" your avatar will look pretty basic... but don't worry! If you look on the left, you'll see that your Battle Gear is still equipped. Next, you can make things fancy! Anything you equip on the right won't affect your stats, but can make you look super awesome. Try out different combos, mixing sets, and coordinating your Costume with your pets, mounts, and backgrounds.

Got more questions? Check out the Costume page on the wiki. Find the perfect ensemble? Show it off in the Costume Carnival guild or brag in the Tavern!", + "useCostumeInfo2": "Once you click \"Use Costume\" your avatar will look pretty basic... but don't worry! If you look on the left, you'll see that your Battle Gear is still equipped. Next, you can make things fancy! Anything you equip on the right won't affect your stats, but can make you look super awesome. Try out different combos, mixing sets, and coordinating your Costume with your pets, mounts, and backgrounds.

Got more questions? Check out the Costume page on the wiki. Find the perfect ensemble? Show it off in the Costume Carnival guild or brag in the Tavern!", "costumePopoverText": "Select \"Use Costume\" to equip items to your avatar without affecting the stats from your Battle Gear! This means that you can dress up your avatar in whatever outfit you like while still having your best Battle Gear equipped.", "autoEquipPopoverText": "Select this option to automatically equip gear as soon as you purchase it.", "costumeDisabled": "You have disabled your costume.", "gearAchievement": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class! You have attained the following complete sets:", - "moreGearAchievements": "To attain more Ultimate Gear badges, change classes on your stats page and buy up your new class's gear!", + "moreGearAchievements": "To attain more Ultimate Gear badges, change classes on the Settings > Site page and buy your new class's gear!", "armoireUnlocked": "For more equipment, check out the Enchanted Armoire! Click on the Enchanted Armoire Reward for a random chance at special Equipment! It may also give you random XP or food items.", "ultimGearName": "Ultimate Gear - <%= ultClass %>", "ultimGearText": "Has upgraded to the maximum weapon and armor set for the <%= ultClass %> class.", diff --git a/website/common/locales/en/faq.json b/website/common/locales/en/faq.json index 2dc20148ed..59586d5ee3 100644 --- a/website/common/locales/en/faq.json +++ b/website/common/locales/en/faq.json @@ -47,19 +47,19 @@ "webFaqAnswer8": "The blue bar that appeared when you hit level 10 and chose a Class is your Mana bar. As you continue to level up, you will unlock special Skills that cost Mana to use. Each Class has different Skills, which appear after level 11 in the action bar at the bottom of the screen. Unlike your Health bar, your Mana bar does not reset when you gain a level. Instead, Mana is gained when you complete good Habits, Dailies, and To-Dos, and lost when you indulge bad Habits. You'll also regain some Mana overnight -- the more Dailies you completed, the more you will gain.", "faqQuestion9": "How do I fight monsters and go on Quests?", - "iosFaqAnswer9": "First, you need to join or start a Party (see above). Although you can battle monsters alone, we recommend playing in a group, because this will make Quests much easier. Plus, having a friend to cheer you on as you accomplish your tasks is very motivating!\n\n Next, you need a Quest Scroll, which are stored under Menu > Items. There are three ways to get a scroll:\n\n - At level 15, you get a Quest-line, aka three linked quests. More Quest-lines unlock at levels 30, 40, and 60 respectively. \n - When you invite people to your Party, you'll be rewarded with the Basi-List Scroll!\n - You can buy Quests from the Quests Page on the [website](https://habitica.com/#/options/inventory/quests) for Gold and Gems. (We will add this feature to the app in a future update.)\n\n To battle the Boss or collect items for a Collection Quest, simply complete your tasks normally, and they will be tallied into damage overnight. (Reloading by pulling down on the screen may be required to see the Boss's health bar go down.) If you are fighting a Boss and you missed any Dailies, the Boss will damage your Party at the same time that you damage the Boss. \n\n After level 11 Mages and Warriors will gain Skills that allow them to deal additional damage to the Boss, so these are excellent classes to choose at level 10 if you want to be a heavy hitter.", - "androidFaqAnswer9": "First, you need to join or start a Party (see above). Although you can battle monsters alone, we recommend playing in a group, because this will make Quests much easier. Plus, having a friend to cheer you on as you accomplish your tasks is very motivating!\n\n Next, you need a Quest Scroll, which are stored under Menu > Items. There are three ways to get a scroll:\n\n - At level 15, you get a Quest-line, aka three linked quests. More Quest-lines unlock at levels 30, 40, and 60 respectively. \n - When you invite people to your Party, you'll be rewarded with the Basi-List Scroll!\n - You can buy Quests from the Quests Page on the [website](https://habitica.com/#/options/inventory/quests) for Gold and Gems. (We will add this feature to the app in a future update.)\n\n To battle the Boss or collect items for a Collection Quest, simply complete your tasks normally, and they will be tallied into damage overnight. (Reloading by pulling down on the screen may be required to see the Boss's health bar go down.) If you are fighting a Boss and you missed any Dailies, the Boss will damage your Party at the same time that you damage the Boss. \n\n After level 11 Mages and Warriors will gain Skills that allow them to deal additional damage to the Boss, so these are excellent classes to choose at level 10 if you want to be a heavy hitter.", + "iosFaqAnswer9": "First, you need to join or start a Party (see above). Although you can battle monsters alone, we recommend playing in a group, because this will make Quests much easier. Plus, having a friend to cheer you on as you accomplish your tasks is very motivating!\n\n Next, you need a Quest Scroll, which are stored under Menu > Items. There are three ways to get a scroll:\n\n - At level 15, you get a Quest-line, aka three linked quests. More Quest-lines unlock at levels 30, 40, and 60 respectively. \n - When you invite people to your Party, you'll be rewarded with the Basi-List Scroll!\n - You can buy Quests from the Quests Shop for Gold and Gems.\n\n To battle the Boss or collect items for a Collection Quest, simply complete your tasks normally, and they will be tallied into damage overnight. (Reloading by pulling down on the screen may be required to see the Boss's health bar go down.) If you are fighting a Boss and you missed any Dailies, the Boss will damage your Party at the same time that you damage the Boss. \n\n After level 11 Mages and Warriors will gain Skills that allow them to deal additional damage to the Boss, so these are excellent classes to choose at level 10 if you want to be a heavy hitter.", + "androidFaqAnswer9": "First, you need to join or start a Party (see above). Although you can battle monsters alone, we recommend playing in a group, because this will make Quests much easier. Plus, having a friend to cheer you on as you accomplish your tasks is very motivating!\n\n Next, you need a Quest Scroll, which are stored under Menu > Items. There are three ways to get a scroll:\n\n - At level 15, you get a Quest-line, aka three linked quests. More Quest-lines unlock at levels 30, 40, and 60 respectively. \n - When you invite people to your Party, you'll be rewarded with the Basi-List Scroll!\n - You can buy Quests from the Quests Shop for Gold and Gems.\n\n To battle the Boss or collect items for a Collection Quest, simply complete your tasks normally, and they will be tallied into damage overnight. (Reloading by pulling down on the screen may be required to see the Boss's health bar go down.) If you are fighting a Boss and you missed any Dailies, the Boss will damage your Party at the same time that you damage the Boss. \n\n After level 11 Mages and Warriors will gain Skills that allow them to deal additional damage to the Boss, so these are excellent classes to choose at level 10 if you want to be a heavy hitter.", "webFaqAnswer9": "First, you need to join or start a Party by clicking \"Party\" in the navigation bar. Although you can battle monsters alone, we recommend playing in a group, because this will make quests much easier. Plus, having a friend to cheer you on as you accomplish your tasks is very motivating! Next, you need a Quest Scroll, which are stored under Inventory > Quests. There are four ways to get a scroll:\n * When you invite people to your Party, you'll be rewarded with the Basi-List Scroll!\n * At level 15, you get a Quest-line, i.e., three linked quests. More Quest-lines unlock at levels 30, 40, and 60 respectively.\n * You can buy Quests from the Quests Shop (Shops > Quests) for Gold and Gems.\n * When you check in to Habitica a certain number of times, you'll be rewarded with Quest Scrolls. You earn a Scroll during your 1st, 7th, 22nd, and 40th check-ins.\n To battle the Boss or collect items for a Collection Quest, simply complete your tasks normally, and they will be tallied into damage overnight. (Reloading may be required to see the Boss's Health bar go down.) If you are fighting a Boss and you missed any Dailies, the Boss will damage your Party at the same time that you damage the Boss. After level 11 Mages and Warriors will gain Skills that allow them to deal additional damage to the Boss, so these are excellent classes to choose at level 10 if you want to be a heavy hitter.", "faqQuestion10": "What are Gems, and how do I get them?", "iosFaqAnswer10": "Gems are purchased with real money by tapping on the Gem icon in the header. When people buy Gems, they are helping us to keep the site running. We're very grateful for their support!\n\n In addition to buying Gems directly, there are three other ways players can gain Gems:\n\n * Win a Challenge that has been set up by another player. Go to Social > Challenges to join some.\n * Subscribe and unlock the ability to buy a certain number of Gems per month.\n * Contribute your skills to the Habitica project. See this wiki page for more details: [Contributing to Habitica](http://habitica.wikia.com/wiki/Contributing_to_Habitica).\n\n Keep in mind that items purchased with Gems do not offer any statistical advantages, so players can still make use of the app without them!", "androidFaqAnswer10": "Gems are purchased with real money by tapping on the Gem icon in the header. When people buy Gems, they are helping us to keep the site running. We're very grateful for their support!\n\n In addition to buying Gems directly, there are three other ways players can gain Gems:\n\n * Win a Challenge that has been set up by another player. Go to Social > Challenges to join some.\n * Subscribe and unlock the ability to buy a certain number of Gems per month.\n * Contribute your skills to the Habitica project. See this wiki page for more details: [Contributing to Habitica](http://habitica.wikia.com/wiki/Contributing_to_Habitica).\n\n Keep in mind that items purchased with Gems do not offer any statistical advantages, so players can still make use of the app without them!", - "webFaqAnswer10": "Gems are [purchased with real money](https://habitica.com/#/options/settings/subscription), although [subscribers](https://habitica.com/#/options/settings/subscription) can purchase them with Gold. When people subscribe or buy Gems, they are helping us to keep the site running. We're very grateful for their support! In addition to buying Gems directly or becoming a subscriber, there are two other ways players can gain Gems:\n* Win a Challenge that has been set up by another player. Go to Challenges > Discover Challenges to join some.\n * Contribute your skills to the Habitica project. See this wiki page for more details: [Contributing to Habitica](http://habitica.wikia.com/wiki/Contributing_to_Habitica). Keep in mind that items purchased with Gems do not offer any statistical advantages, so players can still make use of the site without them!", + "webFaqAnswer10": "Gems are purchased with real money, although [subscribers](https://habitica.com/user/settings/subscription) can purchase them with Gold. When people subscribe or buy Gems, they are helping us to keep the site running. We're very grateful for their support! In addition to buying Gems directly or becoming a subscriber, there are two other ways players can gain Gems:\n* Win a Challenge that has been set up by another player. Go to Challenges > Discover Challenges to join some.\n * Contribute your skills to the Habitica project. See this wiki page for more details: [Contributing to Habitica](http://habitica.wikia.com/wiki/Contributing_to_Habitica). Keep in mind that items purchased with Gems do not offer any statistical advantages, so players can still make use of the site without them!", "faqQuestion11": "How do I report a bug or request a feature?", "iosFaqAnswer11": "You can report a bug, request a feature, or send feedback under Menu > About > Report a Bug and Menu > About > Send Feedback! We'll do everything we can to assist you.", "androidFaqAnswer11": "You can report a bug, request a feature, or send feedback under About > Report a Bug and About > Send us Feedback! We'll do everything we can to assist you.", - "webFaqAnswer11": "To report a bug, go to [Help > Report a Bug](https://habitica.com/#/options/groups/guilds/a29da26b-37de-4a71-b0c6-48e72a900dac) and read the points above the chat box. If you're unable to log in to Habitica, send your login details (not your password!) to [<%= techAssistanceEmail %>](<%= wikiTechAssistanceEmail %>). Don't worry, we'll get you fixed up soon! Feature requests are collected on Trello. Go to [Help > Request a Feature](https://trello.com/c/odmhIqyW/440-read-first-table-of-contents) and follow the instructions. Ta-da!", + "webFaqAnswer11": "To report a bug, go to [Help > Report a Bug](https://habitica.com/groups/guild/a29da26b-37de-4a71-b0c6-48e72a900dac) and read the points above the chat box. If you're unable to log in to Habitica, send your login details (not your password!) to [<%= techAssistanceEmail %>](<%= wikiTechAssistanceEmail %>). Don't worry, we'll get you fixed up soon! Feature requests are collected on Trello. Go to [Help > Request a Feature](https://trello.com/c/odmhIqyW/440-read-first-table-of-contents) and follow the instructions. Ta-da!", "faqQuestion12": "How do I battle a World Boss?", "iosFaqAnswer12": "World Bosses are special monsters that appear in the Tavern. All active users are automatically battling the Boss, and their tasks and Skills will damage the Boss as usual.\n\n You can also be in a normal Quest at the same time. Your tasks and Skills will count towards both the World Boss and the Boss/Collection Quest in your party.\n\n A World Boss will never hurt you or your account in any way. Instead, it has a Rage Bar that fills when users skip Dailies. If its Rage bar fills, it will attack one of the Non-Player Characters around the site and their image will change.\n\n You can read more about [past World Bosses](http://habitica.wikia.com/wiki/World_Bosses) on the wiki.", @@ -68,5 +68,5 @@ "iosFaqStillNeedHelp": "If you have a question that isn't on this list or on the [Wiki FAQ](http://habitica.wikia.com/wiki/FAQ), come ask in the Tavern chat under Menu > Tavern! We're happy to help.", "androidFaqStillNeedHelp": "If you have a question that isn't on this list or on the [Wiki FAQ](http://habitica.wikia.com/wiki/FAQ), come ask in the Tavern chat under Menu > Tavern! We're happy to help.", - "webFaqStillNeedHelp": "If you have a question that isn't on this list or on the [Wiki FAQ](http://habitica.wikia.com/wiki/FAQ), come ask in the [Habitica Help guild](https://habitica.com/#/options/groups/guilds/5481ccf3-5d2d-48a9-a871-70a7380cee5a)! We're happy to help." + "webFaqStillNeedHelp": "If you have a question that isn't on this list or on the [Wiki FAQ](http://habitica.wikia.com/wiki/FAQ), come ask in the [Habitica Help guild](https://habitica.com/groups/guild/5481ccf3-5d2d-48a9-a871-70a7380cee5a)! We're happy to help." } diff --git a/website/common/locales/en/front.json b/website/common/locales/en/front.json index 4fb7e37b22..d0007547e6 100644 --- a/website/common/locales/en/front.json +++ b/website/common/locales/en/front.json @@ -192,8 +192,8 @@ "unlockByline2": "Unlock new motivational tools, such as pet collecting, random rewards, spell-casting, and more!", "unlockHeadline": "As you stay productive, you unlock new content!", "useUUID": "Use UUID / API Token (For Facebook Users)", - "username": "Username", - "emailOrUsername": "Email or Username", + "username": "Login Name", + "emailOrUsername": "Email or Login Name", "watchVideos": "Watch Videos", "work": "Work", "zelahQuote": "With [Habitica], I can be persuaded to go to bed on time by the thought of gaining points for an early night or losing health for a late one!", @@ -243,9 +243,9 @@ "altAttrSlack": "Slack", "missingAuthHeaders": "Missing authentication headers.", "missingAuthParams": "Missing authentication parameters.", - "missingUsernameEmail": "Missing username or email.", + "missingUsernameEmail": "Missing Login Name or email.", "missingEmail": "Missing email.", - "missingUsername": "Missing username.", + "missingUsername": "Missing Login Name.", "missingPassword": "Missing password.", "missingNewPassword": "Missing new password.", "invalidEmailDomain": "You cannot register with emails with the following domains: <%= domains %>", @@ -254,7 +254,7 @@ "notAnEmail": "Invalid email address.", "emailTaken": "Email address is already used in an account.", "newEmailRequired": "Missing new email address.", - "usernameTaken": "Username already taken.", + "usernameTaken": "Login Name already taken.", "passwordConfirmationMatch": "Password confirmation doesn't match password.", "invalidLoginCredentials": "Incorrect username and/or email and/or password.", "passwordResetPage": "Reset Password", diff --git a/website/common/locales/en/gear.json b/website/common/locales/en/gear.json index cdd12b07d6..3b8e0e6bdc 100644 --- a/website/common/locales/en/gear.json +++ b/website/common/locales/en/gear.json @@ -1055,11 +1055,11 @@ "headArmoireAntiProcrastinationHelmText": "Anti-Procrastination Helm", "headArmoireAntiProcrastinationHelmNotes": "This mighty steel helm will help you win the fight to be healthy, happy, and productive! Increases Perception by <%= per %>. Enchanted Armoire: Anti-Procrastination Set (Item 1 of 3).", - "offhand": "shield-hand item", + "offhand": "off-hand item", "offhandCapitalized": "Off-Hand Item", - "shieldBase0Text": "No Shield-Hand Equipment", - "shieldBase0Notes": "No shield or shield-hand item.", + "shieldBase0Text": "No Off-Hand Equipment", + "shieldBase0Notes": "No shield or other off-hand item.", "shieldWarrior1Text": "Wooden Shield", "shieldWarrior1Notes": "Round shield of thick wood. Increases Constitution by <%= con %>.", diff --git a/website/common/locales/en/messages.json b/website/common/locales/en/messages.json index e1a0470906..793a4c4595 100644 --- a/website/common/locales/en/messages.json +++ b/website/common/locales/en/messages.json @@ -42,7 +42,7 @@ "messageAuthPasswordMustMatch": ":password and :confirmPassword don't match", "messageAuthCredentialsRequired": ":username, :email, :password, :confirmPassword required", - "messageAuthUsernameTaken": "Username already taken", + "messageAuthUsernameTaken": "Login Name already taken", "messageAuthEmailTaken": "Email already taken", "messageAuthNoUserFound": "No user found.", "messageAuthMustBeLoggedIn": "You must be logged in.", diff --git a/website/common/locales/en/npc.json b/website/common/locales/en/npc.json index 4ba84f2768..e21c5a93a0 100644 --- a/website/common/locales/en/npc.json +++ b/website/common/locales/en/npc.json @@ -121,6 +121,7 @@ "autoAllocateText": "If 'automatic allocation' is checked, your avatar gains stats automatically based on your tasks' attributes, which you can find in TASK > Edit > Advanced > Attributes. Eg, if you hit the gym often, and your 'Gym' Daily is set to 'Strength', you'll gain Strength automatically.", "spells": "Skills", "spellsText": "You can now unlock class-specific skills. You'll see your first at level 11. Your mana replenishes 10 points per day, plus 1 point per completed To-Do.", + "skillsTitle": "Skills", "toDo": "To-Do", "moreClass": "For more information on the class-system, see Wikia.", diff --git a/website/common/locales/en/questsContent.json b/website/common/locales/en/questsContent.json index bfed225cfc..5b176e27ed 100644 --- a/website/common/locales/en/questsContent.json +++ b/website/common/locales/en/questsContent.json @@ -122,7 +122,7 @@ "questGoldenknight3Boss": "The Iron Knight", "questGoldenknight3DropHoney": "Honey (Food)", "questGoldenknight3DropGoldenPotion": "Golden Hatching Potion", - "questGoldenknight3DropWeapon": "Mustaine's Milestone Mashing Morning Star (Shield-hand Weapon)", + "questGoldenknight3DropWeapon": "Mustaine's Milestone Mashing Morning Star (Off-hand Weapon)", "questGroupEarnable": "Earnable Quests", "questBasilistText": "The Basi-List", @@ -283,7 +283,7 @@ "questDilatoryDistress3Boss": "Adva, the Usurping Mermaid", "questDilatoryDistress3DropFish": "Fish (Food)", "questDilatoryDistress3DropWeapon": "Trident of Crashing Tides (Weapon)", - "questDilatoryDistress3DropShield": "Moonpearl Shield (Shield-Hand Item)", + "questDilatoryDistress3DropShield": "Moonpearl Shield (Off-Hand Item)", "questCheetahText": "Such a Cheetah", "questCheetahNotes": "As you hike across the Sloensteadi Savannah with your friends @PainterProphet, @tivaquinn, @Unruly Hyena, and @Crawford, you're startled to see a Cheetah screeching past with a new Habitican clamped in its jaws. Under the Cheetah's scorching paws, tasks burn away as though complete -- before anyone has the chance to actually finish them! The Habitican sees you and yells, \"Please help me! This Cheetah is making me level too quickly, but I'm not getting anything done. I want to slow down and enjoy the game. Make it stop!\" You fondly remember your own fledgling days, and know that you have to help the newbie by stopping the Cheetah!", @@ -513,7 +513,7 @@ "questStoikalmCalamity3Completion": "You subdue the Icicle Drake Queen, giving Lady Glaciate time to shatter the glowing bracelets. The Queen stiffens in apparent mortification, then quickly covers it with a haughty pose. \"Feel free to remove these extraneous items,\" she says. \"I'm afraid they simply don't fit our decor.\"

\"Also, you stole them,\" @Beffymaroo says. \"By summoning monsters from the earth.\"

The Icicle Drake Queen looks miffed. \"Take it up with that wretched bracelet saleswoman,\" she says. \"It's Tzina you want. I was essentially unaffiliated.\"

Lady Glaciate claps you on the arm. \"You did well today,\" she says, handing you a spear and a horn from the pile. \"Be proud.\"", "questStoikalmCalamity3Boss": "Icicle Drake Queen", "questStoikalmCalamity3DropBlueCottonCandy": "Blue Cotton Candy (Food)", - "questStoikalmCalamity3DropShield": "Mammoth Rider's Horn (Shield-Hand Item)", + "questStoikalmCalamity3DropShield": "Mammoth Rider's Horn (Off-Hand Item)", "questStoikalmCalamity3DropWeapon": "Mammoth Rider Spear (Weapon)", "questGuineaPigText": "The Guinea Pig Gang", @@ -562,8 +562,8 @@ "questMayhemMistiflying3Completion": "Just as you think you can’t withstand the wind any longer, you manage to snatch the mask from the Wind-Worker’s face. Instantly, the tornado is sucked away, leaving only balmy breezes and sunshine. The Wind-Worker looks around in bemusement. “Where did she go?”

“Who?” your friend @khdarkwolf asks.

“That sweet woman who offered to deliver a package for me. Tzina.” As he takes in the wind-swept city below him, his expression darkens. “Then again, maybe she wasn’t so sweet…”

The April Fool pats him on the back, then hands you two shimmering envelopes. “Here. Why don’t you let this distressed fellow rest, and take charge of the mail for a bit? I hear the magic in those envelopes will make them worth your while.”", "questMayhemMistiflying3Boss": "The Wind-Worker", "questMayhemMistiflying3DropPinkCottonCandy": "Pink Cotton Candy (Food)", - "questMayhemMistiflying3DropShield": "Roguish Rainbow Message (Shield-Hand Weapon)", - "questMayhemMistiflying3DropWeapon": "Roguish Rainbow Message (Weapon)", + "questMayhemMistiflying3DropShield": "Roguish Rainbow Message (Off-Hand Item)", + "questMayhemMistiflying3DropWeapon": "Roguish Rainbow Message (Main-Hand Item)", "featheredFriendsText": "Feathered Friends Quest Bundle", "featheredFriendsNotes": "Contains 'Help! Harpy!,' 'The Night-Owl,' and 'The Birds of Preycrastination.' Available until May 31.", diff --git a/website/common/locales/en/settings.json b/website/common/locales/en/settings.json index a67b5d62ae..901a9d98f8 100644 --- a/website/common/locales/en/settings.json +++ b/website/common/locales/en/settings.json @@ -105,9 +105,7 @@ "email": "Email", "registerWithSocial": "Register with <%= network %>", "registeredWithSocial": "Registered with <%= network %>", - "loginNameDescription1": "This is what you use to login to Habitica. To change it, use the form below. If instead you want to change the name that appears on your avatar and in chat messages, go to ", - "loginNameDescription2": "User->Profile", - "loginNameDescription3": "and click the Edit button.", + "loginNameDescription": "This is what you use to login to Habitica. To change it, use the form below. If instead you want to change the Display Name that appears on your avatar and in chat messages, go to User->Profile and click the Edit button.", "emailNotifications": "Email Notifications", "wonChallenge": "You won a Challenge!", "newPM": "Received Private Message", @@ -130,7 +128,7 @@ "remindersToLogin": "Reminders to check in to Habitica", "subscribeUsing": "Subscribe using", "unsubscribedSuccessfully": "Unsubscribed successfully!", - "unsubscribedTextUsers": "You have successfully unsubscribed from all Habitica emails. You can enable only the emails you want to receive from the settings (requires login).", + "unsubscribedTextUsers": "You have successfully unsubscribed from all Habitica emails. You can enable only the emails you want to receive from Settings > > Notifications (requires login).", "unsubscribedTextOthers": "You won't receive any other email from Habitica.", "unsubscribeAllEmails": "Check to Unsubscribe from Emails", "unsubscribeAllEmailsText": "By checking this box, I certify that I understand that by unsubscribing from all emails, Habitica will never be able to notify me via email about important changes to the site or my account.", diff --git a/website/common/locales/en/subscriber.json b/website/common/locales/en/subscriber.json index 102678a50e..ba25946fd2 100644 --- a/website/common/locales/en/subscriber.json +++ b/website/common/locales/en/subscriber.json @@ -77,8 +77,8 @@ "buyGemsAllow1": "You can buy", "buyGemsAllow2": "more Gems this month", "purchaseGemsSeparately": "Purchase Additional Gems", - "subFreeGemsHow": "Habitica players can earn Gems for free by winning challenges that award Gems as a prize, or as a contributor reward by helping the development of Habitica.", - "seeSubscriptionDetails": "Go to Settings > Subscription to see your subscription details!", + "subFreeGemsHow": "Habitica players can earn Gems for free by winning challenges that award Gems as a prize, or as a contributor reward by helping the development of Habitica.", + "seeSubscriptionDetails": "Go to Settings > Subscription to see your subscription details!", "timeTravelers": "Time Travelers", "timeTravelersTitleNoSub": "<%= linkStartTyler %>Tyler<%= linkEnd %> and <%= linkStartVicky %>Vicky<%= linkEnd %>", "timeTravelersTitle": "Mysterious Time Travelers", @@ -191,7 +191,7 @@ "gemBenefit2": "Backgrounds to immerse your avatar in the world of Habitica!", "gemBenefit3": "Exciting Quest chains that drop pet eggs.", "gemBenefit4": "Reset your avatar's attribute points and change its Class.", - "subscriptionBenefitLeadin": "Support Habitica by becoming a subscriber and you’ll receive these useful benefits!", + "subscriptionBenefitLeadin": "Support Habitica by becoming a subscriber and you'll receive these useful benefits!", "subscriptionBenefit1": "Alexander the Merchant will sell you Gems, for 20 Gold each!", "subscriptionBenefit2": "Completed To-Dos and task history are available for longer.", "subscriptionBenefit3": "Discover more items in Habitica with a doubled daily drop cap.", diff --git a/website/common/script/content/spells.js b/website/common/script/content/spells.js index 14ca350b86..53ba262450 100644 --- a/website/common/script/content/spells.js +++ b/website/common/script/content/spells.js @@ -17,7 +17,7 @@ import updateStats from '../fns/updateStats'; * {cast}: the function that's run to perform the ability's action. This is pretty slick - because this is exported to the web, this function can be performed on the client and on the server. `user` param is self (needed for determining your - own stats for effectiveness of cast), and `target` param is one of [task, party, user]. In the case of `self` spells, + own stats for effectiveness of cast), and `target` param is one of [task, party, user]. In the case of `self` skills, you act on `user` instead of `target`. You can trust these are the correct objects, as long as the `target` attr of the spell is correct. Take a look at habitrpg/website/server/models/user.js and habitrpg/website/server/models/task.js for what attributes are available on each model. Note `task.value` is its "redness". If party is passed in, it's an array of users, diff --git a/website/server/controllers/api-v3/groups.js b/website/server/controllers/api-v3/groups.js index fddb784e99..74666a5f78 100644 --- a/website/server/controllers/api-v3/groups.js +++ b/website/server/controllers/api-v3/groups.js @@ -773,8 +773,8 @@ function _sendMessageToRemoved (group, removedUser, message, isInGroup) { sendTxnEmail(removedUser, subject, [ {name: 'GROUP_NAME', content: group.name}, {name: 'MESSAGE', content: message}, - {name: 'GUILDS_LINK', content: '/#/options/groups/guilds/public'}, - {name: 'PARTY_WANTED_GUILD', content: '/#/options/groups/guilds/f2db2a7f-13c5-454d-b3ee-ea1f5089e601'}, + {name: 'GUILDS_LINK', content: '/groups/discovery'}, + {name: 'PARTY_WANTED_GUILD', content: '/groups/guild/f2db2a7f-13c5-454d-b3ee-ea1f5089e601'}, ]); } } @@ -954,12 +954,12 @@ async function _inviteByUUID (uuid, group, inviter, req, res) { if (group.type === 'guild') { emailVars.push( {name: 'GUILD_NAME', content: group.name}, - {name: 'GUILD_URL', content: '/#/options/groups/guilds/public'} + {name: 'GUILD_URL', content: '/groups/discovery'} ); } else { emailVars.push( {name: 'PARTY_NAME', content: group.name}, - {name: 'PARTY_URL', content: '/#/options/groups/party'} + {name: 'PARTY_URL', content: '/party'} ); } diff --git a/website/server/controllers/api-v3/members.js b/website/server/controllers/api-v3/members.js index 1d4de2c7f2..938019e4c3 100644 --- a/website/server/controllers/api-v3/members.js +++ b/website/server/controllers/api-v3/members.js @@ -170,8 +170,8 @@ api.getMemberAchievements = { }; // Return a request handler for getMembersForGroup / getInvitesForGroup / getMembersForChallenge -// type is `invites` or `members` function _getMembersForItem (type) { + // check for allowed `type` if (['group-members', 'group-invites', 'challenge-members'].indexOf(type) === -1) { throw new Error('Type must be one of "group-members", "group-invites", "challenge-members"'); } @@ -245,6 +245,7 @@ function _getMembersForItem (type) { query['invitations.guilds.id'] = group._id; } else { query['invitations.party.id'] = group._id; // group._id and not groupId because groupId could be === 'party' + // @TODO invitations are now stored like this: `'invitations.parties': []` Probably need a database index for it. } } @@ -467,7 +468,6 @@ api.sendPrivateMessage = { if (receiver.preferences.emailNotifications.newPM !== false) { sendTxnEmail(receiver, 'new-pm', [ {name: 'SENDER', content: getUserInfo(sender, ['name']).name}, - {name: 'PMS_INBOX_URL', content: '/#/options/groups/inbox'}, ]); } if (receiver.preferences.pushNotifications.newPM !== false) { diff --git a/website/server/controllers/api-v3/quests.js b/website/server/controllers/api-v3/quests.js index e1d48a2063..26345f64b3 100644 --- a/website/server/controllers/api-v3/quests.js +++ b/website/server/controllers/api-v3/quests.js @@ -137,7 +137,7 @@ api.inviteToQuest = { sendTxnEmail(membersToEmail, `invite-${quest.boss ? 'boss' : 'collection'}-quest`, [ {name: 'QUEST_NAME', content: quest.text()}, {name: 'INVITER', content: inviterVars.name}, - {name: 'PARTY_URL', content: '/#/options/groups/party'}, + {name: 'PARTY_URL', content: '/party'}, ]); // track that the inviting user has accepted the quest diff --git a/website/server/libs/email.js b/website/server/libs/email.js index 39e0256071..ed53e7e315 100644 --- a/website/server/libs/email.js +++ b/website/server/libs/email.js @@ -73,9 +73,9 @@ export function getUserInfo (user, fields = []) { export function getGroupUrl (group) { let groupUrl; if (group._id === TAVERN_ID) { - groupUrl = '/#/options/groups/tavern'; + groupUrl = '/groups/tavern'; } else if (group.type === 'guild') { - groupUrl = `/#/options/groups/guilds/${group._id}`; + groupUrl = `/groups/guild/${group._id}`; } else if (group.type === 'party') { groupUrl = 'party'; } diff --git a/website/server/libs/slack.js b/website/server/libs/slack.js index 799f97a5bd..b0eabd446e 100644 --- a/website/server/libs/slack.js +++ b/website/server/libs/slack.js @@ -34,9 +34,9 @@ function sendFlagNotification ({ let text = `${flagger.profile.name} (${flagger.id}) flagged a message (language: ${flagger.preferences.language})`; if (group.id === TAVERN_ID) { - titleLink = `${BASE_URL}/#/options/groups/tavern`; + titleLink = `${BASE_URL}/groups/tavern`; } else if (group.privacy === 'public') { - titleLink = `${BASE_URL}/#/options/groups/guilds/${group.id}`; + titleLink = `${BASE_URL}/groups/guild/${group.id}`; } else { title += ` - (${group.privacy} ${group.type})`; } @@ -109,9 +109,9 @@ function sendSlurNotification ({ let text = `${author.profile.name} (${author._id}) tried to post a slur`; if (group.id === TAVERN_ID) { - titleLink = `${BASE_URL}/#/options/groups/tavern`; + titleLink = `${BASE_URL}/groups/tavern`; } else if (group.privacy === 'public') { - titleLink = `${BASE_URL}/#/options/groups/guilds/${group.id}`; + titleLink = `${BASE_URL}/groups/guild/${group.id}`; } else { title += ` - (${group.privacy} ${group.type})`; } diff --git a/website/server/models/group.js b/website/server/models/group.js index 56a33c415b..dc3cb66dc9 100644 --- a/website/server/models/group.js +++ b/website/server/models/group.js @@ -396,6 +396,7 @@ schema.statics.validateInvitations = async function getInvitationError (uuids, e // Count how many invitations currently exist in the party let query = {}; query['invitations.party.id'] = group._id; + // @TODO invitations are now stored like this: `'invitations.parties': []` let groupInvites = await User.count(query).exec(); memberCount += groupInvites; @@ -615,7 +616,7 @@ schema.methods.startQuest = async function startQuest (user) { member._id !== user._id; }); sendTxnEmail(membersToEmail, 'quest-started', [ - { name: 'PARTY_URL', content: '/#/options/groups/party' }, + { name: 'PARTY_URL', content: '/party' }, ]); let membersToPush = _.filter(membersToNotify, (member) => { // send push notifications and filter users that disabled emails