From 5653030c64766e1ee7be5853545a658a9112908b Mon Sep 17 00:00:00 2001 From: Mark Kop Date: Sun, 22 Sep 2019 18:00:31 -0300 Subject: [PATCH 01/72] add firefox chat extension --- website/client/components/settings/api.vue | 6 +- website/common/locales/en/settings.json | 416 ++++++++++----------- 2 files changed, 210 insertions(+), 212 deletions(-) diff --git a/website/client/components/settings/api.vue b/website/client/components/settings/api.vue index 291c3640f8..6b2b8e138f 100644 --- a/website/client/components/settings/api.vue +++ b/website/client/components/settings/api.vue @@ -22,10 +22,8 @@ a(target='_blank' href='https://www.beeminder.com/habitica') {{ $t('beeminder') }} br | {{ $t('beeminderDesc') }} - li - a(target='_blank' href='https://chrome.google.com/webstore/detail/habitrpg-chat-client/hidkdfgonpoaiannijofifhjidbnilbb') {{ $t('chromeChatExtension') }} - br - | {{ $t('chromeChatExtensionDesc') }} + li(v-html="$t('chatExtension')") + | {{ $t('chatExtensionDesc') }} li a(target='_blank' :href='`https://oldgods.net/habitica/habitrpg_user_data_display.html?uuid=` + user._id') {{ $t('dataTool') }} br diff --git a/website/common/locales/en/settings.json b/website/common/locales/en/settings.json index 07a57a5cb1..5568c07f0b 100644 --- a/website/common/locales/en/settings.json +++ b/website/common/locales/en/settings.json @@ -1,210 +1,210 @@ { - "settings": "Settings", - "language": "Language", - "americanEnglishGovern": "In the event of a discrepancy in the translations, the American English version governs.", - "helpWithTranslation": "Would you like to help with the translation of Habitica? Great! Then visit this Trello card.", - "showHeaderPop": "Show your avatar, Health/Experience bars, and party.", - "stickyHeader": "Sticky header", - "stickyHeaderPop": "Affix the header to the top of the screen. Unchecked means it scrolls out of view.", - "newTaskEdit": "Open new tasks in edit mode", - "newTaskEditPop": "With this option set, new tasks will immediately open for you to add details like notes and tags.", - "dailyDueDefaultView": "Set Dailies default to 'due' tab", - "dailyDueDefaultViewPop": "With this option set, the Dailies tasks will default to 'due' instead of 'all'", - "reverseChatOrder": "Show chat messages in reverse order", - "startAdvCollapsed": "Advanced Settings in tasks start collapsed", - "startAdvCollapsedPop": "With this option set, Advanced Settings will be hidden when you first open a task for editing.", - "dontShowAgain": "Don't show this again", - "suppressLevelUpModal": "Don't show popup when gaining a level", - "suppressHatchPetModal": "Don't show popup when hatching a pet", - "suppressRaisePetModal": "Don't show popup when raising a pet into a mount", - "suppressStreakModal": "Don't show popup when attaining a Streak achievement", - "showTour": "Show Tour", - "restartTour": "Restart the introductory tour from when you first joined Habitica.", - "showBailey": "Show Bailey", - "showBaileyPop": "Bring Bailey the Town Crier out of hiding so you can review past news.", - "fixVal": "Fix Character Values", - "fixValPop": "Manually change values like Health, Level, and Gold.", - "invalidLevel": "Invalid value: Level must be 1 or greater.", - "enableClass": "Enable Class System", - "enableClassPop": "You opted out of the class system initially. Would you like now to opt-in?", - "classTourPop": "Show the tour for using the class system.", - "resetAccount": "Reset Account", - "resetAccPop": "Start over, removing all levels, gold, gear, history, and tasks.", - "deleteAccount": "Delete Account", - "deleteAccPop": "Cancel and remove your Habitica account.", - "feedback": "If you'd like to give us feedback, please enter it below - we'd love to know what you liked or didn't like about Habitica! Don't speak English well? No problem! Use the language you prefer.", - "qrCode": "QR Code", - "dataExport": "Data Export", - "saveData": "Here are a few options for saving your data.", - "habitHistory": "Habit History", - "exportHistory": "Export History:", - "csv": "(CSV)", - "userData": "User Data", - "exportUserData": "Export User Data:", - "export": "Export", - "xml": "(XML)", - "json": "(JSON)", - "customDayStart": "Custom Day Start", - "sureChangeCustomDayStartTime": "Are you sure you want to change your Custom Day Start time? Your Dailies will next reset the first time you use Habitica after <%= time %>. Make sure you have completed your Dailies before then!", - "changeCustomDayStart": "Change Custom Day Start?", - "sureChangeCustomDayStart": "Are you sure you want to change your custom day start?", - "customDayStartHasChanged": "Your custom day start has changed.", - "nextCron": "Your Dailies will next reset the first time you use Habitica after <%= time %>. Make sure you have completed your Dailies before this time!", - "customDayStartInfo1": "Habitica defaults to check and reset your Dailies at midnight in your own time zone each day. You can customize that time here.", - "misc": "Misc", - "showHeader": "Show Header", - "changePass": "Change Password", - "changeUsername": "Change Username", - "changeEmail": "Change Email Address", - "newEmail": "New Email Address", - "oldPass": "Old Password", - "newPass": "New Password", - "confirmPass": "Confirm New Password", - "newUsername": "New Username", - "dangerZone": "Danger Zone", - "resetText1": "WARNING! This resets many parts of your account. This is highly discouraged, but some people find it useful in the beginning after playing with the site for a short time.", - "resetText2": "You will lose all your levels, Gold, and Experience points. All your tasks (except those from challenges) will be deleted permanently and you will lose all of their historical data. You will lose all your equipment but you will be able to buy it all back, including all limited edition equipment or subscriber Mystery items that you already own (you will need to be in the correct class to re-buy class-specific gear). You will keep your current class and your pets and mounts. You might prefer to use an Orb of Rebirth instead, which is a much safer option and which will preserve your tasks and equipment.", - "deleteLocalAccountText": "Are you sure? This will delete your account forever, and it can never be restored! You will need to register a new account to use Habitica again. Banked or spent Gems will not be refunded. If you're absolutely certain, type your password into the text box below.", - "deleteSocialAccountText": "Are you sure? This will delete your account forever, and it can never be restored! You will need to register a new account to use Habitica again. Banked or spent Gems will not be refunded. If you're absolutely certain, type \"<%= magicWord %>\" into the text box below.", - "API": "API", - "APIv3": "API v3", - "APIText": "Copy these for use in third party applications. However, think of your API Token like a password, and do not share it publicly. You may occasionally be asked for your User ID, but never post your API Token where others can see it, including on Github.", - "APIToken": "API Token (this is a password - see warning above!)", - "showAPIToken": "Show API Token", - "hideAPIToken": "Hide API Token", - "APITokenWarning": "If you need a new API Token (e.g., if you accidentally shared it), email <%= hrefTechAssistanceEmail %> with your User ID and current Token. Once it is reset you will need to re-authorize everything by logging out of the website and mobile app and by providing the new Token to any other Habitica tools that you use.", - "thirdPartyApps": "Third Party Apps", - "dataToolDesc": "A webpage that shows you certain information from your Habitica account, such as statistics about your tasks, equipment, and skills.", - "beeminder": "Beeminder", - "beeminderDesc": "Let Beeminder automatically monitor your Habitica To-Dos. You can commit to maintaining a target number of To-Dos completed per day or per week, or you can commit to gradually reducing your remaining number of uncompleted To-Dos. (By \"commit\" Beeminder means under threat of paying actual money! But you may also just like Beeminder's fancy graphs.)", - "chromeChatExtension": "Chrome Chat Extension", - "chromeChatExtensionDesc": "The Chrome Chat Extension for Habitica adds an intuitive chat box to all of habitica.com. It allows users to chat in the Tavern, their party, and any guilds they are in.", - "otherExtensions": "Other Extensions", - "otherDesc": "Find other apps, extensions, and tools on the Habitica wiki.", - "resetDo": "Do it, reset my account!", - "resetComplete": "Reset complete!", - "fixValues": "Fix Values", - "fixValuesText1": "If you've encountered a bug or made a mistake that unfairly changed your character (damage you shouldn't have taken, Gold you didn't really earn, etc.), you can manually correct your numbers here. Yes, this makes it possible to cheat: use this feature wisely, or you'll sabotage your own habit-building!", - "fixValuesText2": "Note that you cannot restore Streaks on individual tasks here. To do that, edit the Daily and go to Advanced Settings, where you will find a Restore Streak field.", - "disabledWinterEvent": "Disabled during Winter Wonderland Event Pt.4 (since the rewards are gold-purchaseable).", - "fix21Streaks": "21-Day Streaks", - "discardChanges": "Discard Changes", - "deleteDo": "Do it, delete my account!", - "enterNumber": "Please enter a number between 0 and 24", - "fillAll": "Please fill out all fields", - "invalidPasswordResetCode": "The supplied password reset code is invalid or has expired.", - "passwordChangeSuccess": "Your password was successfully changed to the one you just chose. You can now use it to access your account.", - "passwordSuccess": "Password successfully changed", - "usernameSuccess": "Username successfully changed", - "displayNameSuccess": "Display name successfully changed", - "emailSuccess": "Email successfully changed", - "detachSocial": "De-register <%= network %>", - "detachedSocial": "Successfully removed <%= network %> authentication from your account", - "addedLocalAuth": "Successfully added local authentication", - "data": "Data", - "exportData": "Export Data", - "usernameOrEmail": "Username or Email", - "email": "Email", - "registerWithSocial": "Register with <%= network %>", - "registeredWithSocial": "Registered with <%= network %>", - "loginNameDescription": "This is what you use to log in 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 the User Icon > Profile and click the Edit button.", - "emailNotifications": "Email Notifications", - "wonChallenge": "You won a Challenge!", - "newPM": "Received Private Message", - "newPMInfo": "New Message from <%= name %>: <%= message %>", - "giftedGems": "Gifted Gems", - "giftedGemsInfo": "<%= name %> gifted you <%= amount %> Gems", - "giftedGemsFull": "Hello <%= username %>, <%= sender %> has sent you <%= gemAmount %> gems!", - "giftedSubscription": "Gifted Subscription", - "giftedSubscriptionInfo": "<%= name %> gifted you a <%= months %> month subscription", - "giftedSubscriptionFull": "Hello <%= username %>, <%= sender %> has sent you <%= monthCount %> months of subscription!", - "giftedSubscriptionWinterPromo": "Hello <%= username %>, you received <%= monthCount %> months of subscription as part of our holiday gift-giving promotion!", - "invitedParty": "Invited To Party", - "invitedGuild": "Invited To Guild", - "importantAnnouncements": "Reminders to check in to complete tasks and receive prizes", - "weeklyRecaps": "Summaries of your account activity in the past week (Note: this is currently disabled due to performance issues, but we hope to have this back up and sending e-mails again soon!)", - "onboarding": "Guidance with setting up your Habitica account", - "majorUpdates": "Important announcements", - "subscriptionReminders": "Subscriptions Reminders", - "questStarted": "Your Quest has Begun", - "invitedQuest": "Invited to Quest", - "kickedGroup": "Kicked from group", - "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 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.", - "unsubscribeAllPush": "Check to Unsubscribe from all Push Notifications", - "correctlyUnsubscribedEmailType": "Correctly unsubscribed from \"<%= emailType %>\" emails.", - "subscriptionRateText": "Recurring $<%= price %> USD every <%= months %> months", - "recurringText": "recurring", - "benefits": "Benefits", - "coupon": "Coupon", - "couponPlaceholder": "Enter Coupon Code", - "couponText": "We sometimes have events and give out promo codes for special gear. (eg, those who stop by our Wondercon booth)", - "apply": "Apply", - "resubscribe": "Resubscribe", - "promoCode": "Promo Code", - "promoCodeApplied": "Promo Code Applied! Check your inventory", - "promoPlaceholder": "Enter Promotion Code", - "displayInviteToPartyWhenPartyIs1": "Display Invite To Party button when party has 1 member.", - "couponText": "We sometimes have events and give out coupon codes for special gear. (eg, those who stop by our Wondercon booth)", - "saveCustomDayStart": "Save Custom Day Start", - "registration": "Registration", - "addLocalAuth": "Add Email and Password Login", - "generateCodes": "Generate Codes", - "generate": "Generate", - "getCodes": "Get Codes", - "webhooks": "Webhooks", - "webhooksInfo": "Habitica provides webhooks so that when certain actions occur in your account, information can be sent to a script on another website. You can specify those scripts here. Be careful with this feature because specifying an incorrect URL can cause errors or slowness in Habitica. For more information, see the wiki's Webhooks page.", - "enabled": "Enabled", - "webhookURL": "Webhook URL", - "invalidUrl": "invalid url", - "invalidEnabled": "the \"enabled\" parameter should be a boolean.", - "invalidWebhookId": "the \"id\" parameter should be a valid UUID.", - "missingWebhookId": "The webhook's id is required.", - "invalidWebhookType": "\"<%= type %>\" is not a valid value for the parameter \"type\".", - "webhookBooleanOption": "\"<%= option %>\" must be a Boolean value.", - "webhookIdAlreadyTaken": "A webhook with the id <%= id %> already exists.", - "noWebhookWithId": "There is no webhook with the id <%= id %>.", - "regIdRequired": "RegId is required", - "invalidPushClient": "Invalid client. Only Official Habitica clients can receive push notifications.", - "pushDeviceAdded": "Push device added successfully", - "pushDeviceAlreadyAdded": "The user already has the push device", - "pushDeviceNotFound": "The user has no push device with this id.", - "pushDeviceRemoved": "Push device removed successfully.", - "buyGemsGoldCap": "Cap raised to <%= amount %>", - "mysticHourglass": "<%= amount %> Mystic Hourglass", - "mysticHourglassText": "Mystic Hourglasses allow purchasing a previous month's Mystery Item set.", - "purchasedPlanId": "Recurring $<%= price %> USD each <%= months %> Month(s) (<%= plan %>)", - "purchasedPlanExtraMonths": "You have <%= months %> months of extra subscription credit.", - "consecutiveSubscription": "Consecutive Subscription", - "consecutiveMonths": "Consecutive Months:", - "gemCapExtra": "Gem Cap Extra:", - "mysticHourglasses": "Mystic Hourglasses:", - "mysticHourglassesTooltip": "Mystic Hourglasses", - "paypal": "PayPal", - "amazonPayments": "Amazon Payments", - "amazonPaymentsRecurring": "Ticking the checkbox below is necessary for your subscription to be created. It allows your Amazon account to be used for ongoing payments for this subscription. It will not cause your Amazon account to be automatically used for any future purchases.", - "timezone": "Time Zone", - "timezoneUTC": "Habitica uses the time zone set on your PC, which is: <%= utc %>", - "timezoneInfo": "If that time zone is wrong, first reload this page using your browser's reload or refresh button to ensure that Habitica has the most recent information. If it is still wrong, adjust the time zone on your PC and then reload this page again.

If you use Habitica on other PCs or mobile devices, the time zone must be the same on them all. If your Dailies have been resetting at the wrong time, repeat this check on all other PCs and on a browser on your mobile devices.", - "push": "Push", - "about": "About", - "setUsernameNotificationTitle": "Confirm your username!", - "setUsernameNotificationBody": "We will be transitioning login names to unique, public usernames soon. This username will be used for invitations, @mentions in chat, and messaging.", - "usernameIssueSlur": "Usernames may not contain inappropriate language.", - "usernameIssueForbidden": "Usernames may not contain restricted words.", - "usernameIssueLength": "Usernames must be between 1 and 20 characters.", - "usernameIssueInvalidCharacters": "Usernames can only contain letters a to z, numbers 0 to 9, hyphens, or underscores.", - "currentUsername": "Current username:", - "displaynameIssueLength": "Display Names must be between 1 and 30 characters.", - "displaynameIssueSlur": "Display Names may not contain inappropriate language.", - "goToSettings": "Go to Settings", - "usernameVerifiedConfirmation": "Your username, <%= username %>, is confirmed!", - "usernameNotVerified": "Please confirm your username.", - "changeUsernameDisclaimer": "We will be transitioning login names to unique, public usernames soon. This username will be used for invitations, @mentions in chat, and messaging.", - "verifyUsernameVeteranPet": "One of these Veteran Pets will be waiting for you after you've finished confirming!" + "settings": "Settings", + "language": "Language", + "americanEnglishGovern": "In the event of a discrepancy in the translations, the American English version governs.", + "helpWithTranslation": "Would you like to help with the translation of Habitica? Great! Then visit this Trello card.", + "showHeaderPop": "Show your avatar, Health/Experience bars, and party.", + "stickyHeader": "Sticky header", + "stickyHeaderPop": "Affix the header to the top of the screen. Unchecked means it scrolls out of view.", + "newTaskEdit": "Open new tasks in edit mode", + "newTaskEditPop": "With this option set, new tasks will immediately open for you to add details like notes and tags.", + "dailyDueDefaultView": "Set Dailies default to 'due' tab", + "dailyDueDefaultViewPop": "With this option set, the Dailies tasks will default to 'due' instead of 'all'", + "reverseChatOrder": "Show chat messages in reverse order", + "startAdvCollapsed": "Advanced Settings in tasks start collapsed", + "startAdvCollapsedPop": "With this option set, Advanced Settings will be hidden when you first open a task for editing.", + "dontShowAgain": "Don't show this again", + "suppressLevelUpModal": "Don't show popup when gaining a level", + "suppressHatchPetModal": "Don't show popup when hatching a pet", + "suppressRaisePetModal": "Don't show popup when raising a pet into a mount", + "suppressStreakModal": "Don't show popup when attaining a Streak achievement", + "showTour": "Show Tour", + "restartTour": "Restart the introductory tour from when you first joined Habitica.", + "showBailey": "Show Bailey", + "showBaileyPop": "Bring Bailey the Town Crier out of hiding so you can review past news.", + "fixVal": "Fix Character Values", + "fixValPop": "Manually change values like Health, Level, and Gold.", + "invalidLevel": "Invalid value: Level must be 1 or greater.", + "enableClass": "Enable Class System", + "enableClassPop": "You opted out of the class system initially. Would you like now to opt-in?", + "classTourPop": "Show the tour for using the class system.", + "resetAccount": "Reset Account", + "resetAccPop": "Start over, removing all levels, gold, gear, history, and tasks.", + "deleteAccount": "Delete Account", + "deleteAccPop": "Cancel and remove your Habitica account.", + "feedback": "If you'd like to give us feedback, please enter it below - we'd love to know what you liked or didn't like about Habitica! Don't speak English well? No problem! Use the language you prefer.", + "qrCode": "QR Code", + "dataExport": "Data Export", + "saveData": "Here are a few options for saving your data.", + "habitHistory": "Habit History", + "exportHistory": "Export History:", + "csv": "(CSV)", + "userData": "User Data", + "exportUserData": "Export User Data:", + "export": "Export", + "xml": "(XML)", + "json": "(JSON)", + "customDayStart": "Custom Day Start", + "sureChangeCustomDayStartTime": "Are you sure you want to change your Custom Day Start time? Your Dailies will next reset the first time you use Habitica after <%= time %>. Make sure you have completed your Dailies before then!", + "changeCustomDayStart": "Change Custom Day Start?", + "sureChangeCustomDayStart": "Are you sure you want to change your custom day start?", + "customDayStartHasChanged": "Your custom day start has changed.", + "nextCron": "Your Dailies will next reset the first time you use Habitica after <%= time %>. Make sure you have completed your Dailies before this time!", + "customDayStartInfo1": "Habitica defaults to check and reset your Dailies at midnight in your own time zone each day. You can customize that time here.", + "misc": "Misc", + "showHeader": "Show Header", + "changePass": "Change Password", + "changeUsername": "Change Username", + "changeEmail": "Change Email Address", + "newEmail": "New Email Address", + "oldPass": "Old Password", + "newPass": "New Password", + "confirmPass": "Confirm New Password", + "newUsername": "New Username", + "dangerZone": "Danger Zone", + "resetText1": "WARNING! This resets many parts of your account. This is highly discouraged, but some people find it useful in the beginning after playing with the site for a short time.", + "resetText2": "You will lose all your levels, Gold, and Experience points. All your tasks (except those from challenges) will be deleted permanently and you will lose all of their historical data. You will lose all your equipment but you will be able to buy it all back, including all limited edition equipment or subscriber Mystery items that you already own (you will need to be in the correct class to re-buy class-specific gear). You will keep your current class and your pets and mounts. You might prefer to use an Orb of Rebirth instead, which is a much safer option and which will preserve your tasks and equipment.", + "deleteLocalAccountText": "Are you sure? This will delete your account forever, and it can never be restored! You will need to register a new account to use Habitica again. Banked or spent Gems will not be refunded. If you're absolutely certain, type your password into the text box below.", + "deleteSocialAccountText": "Are you sure? This will delete your account forever, and it can never be restored! You will need to register a new account to use Habitica again. Banked or spent Gems will not be refunded. If you're absolutely certain, type \"<%= magicWord %>\" into the text box below.", + "API": "API", + "APIv3": "API v3", + "APIText": "Copy these for use in third party applications. However, think of your API Token like a password, and do not share it publicly. You may occasionally be asked for your User ID, but never post your API Token where others can see it, including on Github.", + "APIToken": "API Token (this is a password - see warning above!)", + "showAPIToken": "Show API Token", + "hideAPIToken": "Hide API Token", + "APITokenWarning": "If you need a new API Token (e.g., if you accidentally shared it), email <%= hrefTechAssistanceEmail %> with your User ID and current Token. Once it is reset you will need to re-authorize everything by logging out of the website and mobile app and by providing the new Token to any other Habitica tools that you use.", + "thirdPartyApps": "Third Party Apps", + "dataToolDesc": "A webpage that shows you certain information from your Habitica account, such as statistics about your tasks, equipment, and skills.", + "beeminder": "Beeminder", + "beeminderDesc": "Let Beeminder automatically monitor your Habitica To-Dos. You can commit to maintaining a target number of To-Dos completed per day or per week, or you can commit to gradually reducing your remaining number of uncompleted To-Dos. (By \"commit\" Beeminder means under threat of paying actual money! But you may also just like Beeminder's fancy graphs.)", + "chatExtension": "Chrome Chat Extension and Firefox Chat Extension", + "chatExtensionDesc": "The Chat Extension for Habitica adds an intuitive chat box to all of habitica.com. It allows users to chat in the Tavern, their party, and any guilds they are in.", + "otherExtensions": "Other Extensions", + "otherDesc": "Find other apps, extensions, and tools on the Habitica wiki.", + "resetDo": "Do it, reset my account!", + "resetComplete": "Reset complete!", + "fixValues": "Fix Values", + "fixValuesText1": "If you've encountered a bug or made a mistake that unfairly changed your character (damage you shouldn't have taken, Gold you didn't really earn, etc.), you can manually correct your numbers here. Yes, this makes it possible to cheat: use this feature wisely, or you'll sabotage your own habit-building!", + "fixValuesText2": "Note that you cannot restore Streaks on individual tasks here. To do that, edit the Daily and go to Advanced Settings, where you will find a Restore Streak field.", + "disabledWinterEvent": "Disabled during Winter Wonderland Event Pt.4 (since the rewards are gold-purchaseable).", + "fix21Streaks": "21-Day Streaks", + "discardChanges": "Discard Changes", + "deleteDo": "Do it, delete my account!", + "enterNumber": "Please enter a number between 0 and 24", + "fillAll": "Please fill out all fields", + "invalidPasswordResetCode": "The supplied password reset code is invalid or has expired.", + "passwordChangeSuccess": "Your password was successfully changed to the one you just chose. You can now use it to access your account.", + "passwordSuccess": "Password successfully changed", + "usernameSuccess": "Username successfully changed", + "displayNameSuccess": "Display name successfully changed", + "emailSuccess": "Email successfully changed", + "detachSocial": "De-register <%= network %>", + "detachedSocial": "Successfully removed <%= network %> authentication from your account", + "addedLocalAuth": "Successfully added local authentication", + "data": "Data", + "exportData": "Export Data", + "usernameOrEmail": "Username or Email", + "email": "Email", + "registerWithSocial": "Register with <%= network %>", + "registeredWithSocial": "Registered with <%= network %>", + "loginNameDescription": "This is what you use to log in 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 the User Icon > Profile and click the Edit button.", + "emailNotifications": "Email Notifications", + "wonChallenge": "You won a Challenge!", + "newPM": "Received Private Message", + "newPMInfo": "New Message from <%= name %>: <%= message %>", + "giftedGems": "Gifted Gems", + "giftedGemsInfo": "<%= name %> gifted you <%= amount %> Gems", + "giftedGemsFull": "Hello <%= username %>, <%= sender %> has sent you <%= gemAmount %> gems!", + "giftedSubscription": "Gifted Subscription", + "giftedSubscriptionInfo": "<%= name %> gifted you a <%= months %> month subscription", + "giftedSubscriptionFull": "Hello <%= username %>, <%= sender %> has sent you <%= monthCount %> months of subscription!", + "giftedSubscriptionWinterPromo": "Hello <%= username %>, you received <%= monthCount %> months of subscription as part of our holiday gift-giving promotion!", + "invitedParty": "Invited To Party", + "invitedGuild": "Invited To Guild", + "importantAnnouncements": "Reminders to check in to complete tasks and receive prizes", + "weeklyRecaps": "Summaries of your account activity in the past week (Note: this is currently disabled due to performance issues, but we hope to have this back up and sending e-mails again soon!)", + "onboarding": "Guidance with setting up your Habitica account", + "majorUpdates": "Important announcements", + "subscriptionReminders": "Subscriptions Reminders", + "questStarted": "Your Quest has Begun", + "invitedQuest": "Invited to Quest", + "kickedGroup": "Kicked from group", + "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 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.", + "unsubscribeAllPush": "Check to Unsubscribe from all Push Notifications", + "correctlyUnsubscribedEmailType": "Correctly unsubscribed from \"<%= emailType %>\" emails.", + "subscriptionRateText": "Recurring $<%= price %> USD every <%= months %> months", + "recurringText": "recurring", + "benefits": "Benefits", + "coupon": "Coupon", + "couponPlaceholder": "Enter Coupon Code", + "couponText": "We sometimes have events and give out promo codes for special gear. (eg, those who stop by our Wondercon booth)", + "apply": "Apply", + "resubscribe": "Resubscribe", + "promoCode": "Promo Code", + "promoCodeApplied": "Promo Code Applied! Check your inventory", + "promoPlaceholder": "Enter Promotion Code", + "displayInviteToPartyWhenPartyIs1": "Display Invite To Party button when party has 1 member.", + "couponText": "We sometimes have events and give out coupon codes for special gear. (eg, those who stop by our Wondercon booth)", + "saveCustomDayStart": "Save Custom Day Start", + "registration": "Registration", + "addLocalAuth": "Add Email and Password Login", + "generateCodes": "Generate Codes", + "generate": "Generate", + "getCodes": "Get Codes", + "webhooks": "Webhooks", + "webhooksInfo": "Habitica provides webhooks so that when certain actions occur in your account, information can be sent to a script on another website. You can specify those scripts here. Be careful with this feature because specifying an incorrect URL can cause errors or slowness in Habitica. For more information, see the wiki's Webhooks page.", + "enabled": "Enabled", + "webhookURL": "Webhook URL", + "invalidUrl": "invalid url", + "invalidEnabled": "the \"enabled\" parameter should be a boolean.", + "invalidWebhookId": "the \"id\" parameter should be a valid UUID.", + "missingWebhookId": "The webhook's id is required.", + "invalidWebhookType": "\"<%= type %>\" is not a valid value for the parameter \"type\".", + "webhookBooleanOption": "\"<%= option %>\" must be a Boolean value.", + "webhookIdAlreadyTaken": "A webhook with the id <%= id %> already exists.", + "noWebhookWithId": "There is no webhook with the id <%= id %>.", + "regIdRequired": "RegId is required", + "invalidPushClient": "Invalid client. Only Official Habitica clients can receive push notifications.", + "pushDeviceAdded": "Push device added successfully", + "pushDeviceAlreadyAdded": "The user already has the push device", + "pushDeviceNotFound": "The user has no push device with this id.", + "pushDeviceRemoved": "Push device removed successfully.", + "buyGemsGoldCap": "Cap raised to <%= amount %>", + "mysticHourglass": "<%= amount %> Mystic Hourglass", + "mysticHourglassText": "Mystic Hourglasses allow purchasing a previous month's Mystery Item set.", + "purchasedPlanId": "Recurring $<%= price %> USD each <%= months %> Month(s) (<%= plan %>)", + "purchasedPlanExtraMonths": "You have <%= months %> months of extra subscription credit.", + "consecutiveSubscription": "Consecutive Subscription", + "consecutiveMonths": "Consecutive Months:", + "gemCapExtra": "Gem Cap Extra:", + "mysticHourglasses": "Mystic Hourglasses:", + "mysticHourglassesTooltip": "Mystic Hourglasses", + "paypal": "PayPal", + "amazonPayments": "Amazon Payments", + "amazonPaymentsRecurring": "Ticking the checkbox below is necessary for your subscription to be created. It allows your Amazon account to be used for ongoing payments for this subscription. It will not cause your Amazon account to be automatically used for any future purchases.", + "timezone": "Time Zone", + "timezoneUTC": "Habitica uses the time zone set on your PC, which is: <%= utc %>", + "timezoneInfo": "If that time zone is wrong, first reload this page using your browser's reload or refresh button to ensure that Habitica has the most recent information. If it is still wrong, adjust the time zone on your PC and then reload this page again.

If you use Habitica on other PCs or mobile devices, the time zone must be the same on them all. If your Dailies have been resetting at the wrong time, repeat this check on all other PCs and on a browser on your mobile devices.", + "push": "Push", + "about": "About", + "setUsernameNotificationTitle": "Confirm your username!", + "setUsernameNotificationBody": "We will be transitioning login names to unique, public usernames soon. This username will be used for invitations, @mentions in chat, and messaging.", + "usernameIssueSlur": "Usernames may not contain inappropriate language.", + "usernameIssueForbidden": "Usernames may not contain restricted words.", + "usernameIssueLength": "Usernames must be between 1 and 20 characters.", + "usernameIssueInvalidCharacters": "Usernames can only contain letters a to z, numbers 0 to 9, hyphens, or underscores.", + "currentUsername": "Current username:", + "displaynameIssueLength": "Display Names must be between 1 and 30 characters.", + "displaynameIssueSlur": "Display Names may not contain inappropriate language.", + "goToSettings": "Go to Settings", + "usernameVerifiedConfirmation": "Your username, <%= username %>, is confirmed!", + "usernameNotVerified": "Please confirm your username.", + "changeUsernameDisclaimer": "We will be transitioning login names to unique, public usernames soon. This username will be used for invitations, @mentions in chat, and messaging.", + "verifyUsernameVeteranPet": "One of these Veteran Pets will be waiting for you after you've finished confirming!" } From 6ab6fdf1f02cf163abccf969eb9c9e8a4aceffb0 Mon Sep 17 00:00:00 2001 From: Mark Kop Date: Sun, 22 Sep 2019 18:10:25 -0300 Subject: [PATCH 02/72] fix(settings): other extensions description --- website/client/components/settings/api.vue | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/website/client/components/settings/api.vue b/website/client/components/settings/api.vue index 6b2b8e138f..a6bd0ccf65 100644 --- a/website/client/components/settings/api.vue +++ b/website/client/components/settings/api.vue @@ -29,8 +29,7 @@ br | {{ $t('dataToolDesc') }} li(v-html="$t('otherExtensions')") - br - | {{ $t('otherDesc') }} + | {{ $t('otherDesc') }} hr From 9ceb45b05861f769ea859dec00f963ef1bb716ae Mon Sep 17 00:00:00 2001 From: Adam Fitzgibbon Date: Mon, 28 Oct 2019 23:04:13 -0500 Subject: [PATCH 03/72] fix padding on various pages --- website/client/src/components/groups/group.vue | 2 +- website/client/src/components/groups/tavern.vue | 8 ++++++-- website/client/src/components/tasks/user.vue | 2 ++ 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/website/client/src/components/groups/group.vue b/website/client/src/components/groups/group.vue index b6d092827b..65a99c7de1 100644 --- a/website/client/src/components/groups/group.vue +++ b/website/client/src/components/groups/group.vue @@ -255,7 +255,7 @@ .sidebar { background-color: $gray-600; padding-bottom: 2em; - + padding-right: 24px; } .buttons-wrapper { diff --git a/website/client/src/components/groups/tavern.vue b/website/client/src/components/groups/tavern.vue index ab1b16df14..2f05aa4be3 100644 --- a/website/client/src/components/groups/tavern.vue +++ b/website/client/src/components/groups/tavern.vue @@ -510,13 +510,17 @@ .sidebar { background-color: $gray-600; - padding: 0em; + padding: 0em 24px 0em 0em; .below-header-sections { - padding: 1em 1.75em 1em 1.75em; + padding: 1em 24px 1em 1.75em; } } + .px-3 { + padding-right: 24px !important; + } + .pause-button { background-color: #ffb445 !important; color: $white; diff --git a/website/client/src/components/tasks/user.vue b/website/client/src/components/tasks/user.vue index 07a6a727d9..fc04c37d6c 100644 --- a/website/client/src/components/tasks/user.vue +++ b/website/client/src/components/tasks/user.vue @@ -246,6 +246,8 @@ @import '~@/assets/scss/create-task.scss'; .user-tasks-page { + padding-left: 12px; + padding-right: 12px; padding-top: 16px; } From 2ca3c225c4fce05c912b130977f722a7c3937794 Mon Sep 17 00:00:00 2001 From: Adam Fitzgibbon Date: Tue, 29 Oct 2019 22:03:57 -0500 Subject: [PATCH 04/72] some additional padding --- website/client/src/components/groups/group.vue | 9 ++++++--- website/client/src/components/groups/tavern.vue | 5 +++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/website/client/src/components/groups/group.vue b/website/client/src/components/groups/group.vue index 65a99c7de1..fe46ad6c60 100644 --- a/website/client/src/components/groups/group.vue +++ b/website/client/src/components/groups/group.vue @@ -160,7 +160,7 @@ -
+
Date: Wed, 30 Oct 2019 13:47:35 +0100 Subject: [PATCH 05/72] Minimum password length + Static Pages fixes (#11474) * password min length: server + client side registering * tweak text, add tests * misc * use red border for invalid inputs * fix auth form for groups * remove default firefox box shadown on invalid elements * fix css in authForm * fix margings * misc fixes to forms and buttons * fix typo --- .../user/auth/POST-register_local.test.js | 18 +++++ .../auth/PUT-user_update_password.test.js | 14 ++++ website/client/src/assets/scss/button.scss | 22 ++++-- website/client/src/assets/scss/form.scss | 17 +++++ .../client/src/components/auth/authForm.vue | 43 +++++++++++- .../components/auth/registerLoginReset.vue | 61 ++++++++++++---- website/client/src/components/static/home.vue | 69 ++++++++++++------- .../src/components/static/staticWrapper.vue | 64 ++++++++--------- website/common/locales/en/front.json | 1 + website/common/script/constants.js | 2 + website/common/script/index.js | 2 + website/server/controllers/api-v3/auth.js | 4 ++ website/server/libs/auth/index.js | 5 ++ 13 files changed, 242 insertions(+), 80 deletions(-) diff --git a/test/api/v3/integration/user/auth/POST-register_local.test.js b/test/api/v3/integration/user/auth/POST-register_local.test.js index 896e20a0c0..e435d77dd0 100644 --- a/test/api/v3/integration/user/auth/POST-register_local.test.js +++ b/test/api/v3/integration/user/auth/POST-register_local.test.js @@ -326,6 +326,24 @@ describe('POST /user/auth/local/register', () => { }); }); + it('requires minimum length for the password', async () => { + const username = generateRandomUserName(); + const email = `${username}@example.com`; + const password = '1234567'; + const confirmPassword = '1234567'; + + await expect(api.post('/user/auth/local/register', { + username, + email, + password, + confirmPassword, + })).to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: t('invalidReqParams'), + }); + }); + it('requires a username', async () => { const email = `${generateRandomUserName()}@example.com`; const password = 'password'; diff --git a/test/api/v3/integration/user/auth/PUT-user_update_password.test.js b/test/api/v3/integration/user/auth/PUT-user_update_password.test.js index a46eb0f916..94fbd4f3e2 100644 --- a/test/api/v3/integration/user/auth/PUT-user_update_password.test.js +++ b/test/api/v3/integration/user/auth/PUT-user_update_password.test.js @@ -82,6 +82,20 @@ describe('PUT /user/auth/update-password', async () => { }); }); + it('returns an error when newPassword is too short', async () => { + const body = { + password, + newPassword: '1234567', + confirmPassword: '1234567', + }; + + await expect(user.put(ENDPOINT, body)).to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: t('invalidReqParams'), + }); + }); + it('returns an error when confirmPassword is missing', async () => { const body = { password, diff --git a/website/client/src/assets/scss/button.scss b/website/client/src/assets/scss/button.scss index bc649e1dc5..0a2220a215 100644 --- a/website/client/src/assets/scss/button.scss +++ b/website/client/src/assets/scss/button.scss @@ -20,7 +20,7 @@ @include btn-focus-hover-shadow(); } - &:hover:not(.btn-flat):not(.disabled) { + &:hover:not(.btn-flat):not(.disabled):not(:disabled) { @include btn-focus-hover-shadow(); border-color: transparent; } @@ -49,7 +49,7 @@ background: $purple-200; } - &:hover:not(:disabled), &:active, &.active, &:focus { + &:hover:not(:disabled):not(.disabled), &:active:not(:disabled):not(.disabled), &.active:not(:disabled):not(.disabled), &:focus:not(:disabled):not(.disabled) { background: #5d3b9c !important; color: $white; } @@ -59,7 +59,7 @@ color: $gray-50; background: $white !important; - &:hover:not(:disabled):not(.disabled), &:active, &.active, &:focus { + &:hover:not(:disabled):not(.disabled), &:active:not(:disabled):not(.disabled), &.active:not(:disabled):not(.disabled), &:focus:not(:disabled):not(.disabled) { color: $purple-200 !important; } @@ -80,7 +80,7 @@ background: $green-100; } - &:hover:not(:disabled), &:active, &.active { + &:hover:not(:disabled):not(.disabled), &:active:not(:disabled):not(.disabled), &.active:not(:disabled):not(.disabled) { background: $green-50; } } @@ -96,8 +96,12 @@ background: $blue-50; } - &:hover:not(:disabled), &:active, &.active { - background: $blue-100; + &:hover:not(:disabled):not(.disabled) { + background-color: $blue-100; + } + + &:active:not(:disabled):not(.disabled), &.active:not(:disabled):not(.disabled) { + background: $blue-50; } } @@ -108,7 +112,11 @@ background: $red-50; } - &:hover:not(:disabled), &:active, &.active { + &:hover:not(:disabled):not(.disabled) { + background: $red-100; + } + + &:active:not(:disabled):not(.disabled), &.active:not(:disabled):not(.disabled) { background: $red-100; } } diff --git a/website/client/src/assets/scss/form.scss b/website/client/src/assets/scss/form.scss index 78b7e5397a..2e5934f5d5 100644 --- a/website/client/src/assets/scss/form.scss +++ b/website/client/src/assets/scss/form.scss @@ -65,6 +65,7 @@ input, textarea, input.form-control, textarea.form-control { padding-right: 40px; background-image: url(~@/assets/svg/for-css/alert.svg); background-size: 16px 16px; + border-color: $red-100 !important; } } @@ -276,3 +277,19 @@ $bg-disabled-control: #34303a; .toggle-switch-container.no-margin { margin-top: 0 !important; } + + + +// Disable default style Firefox for invalid elements. +// Selectors taken from view-source:resource://gre-resources/forms.css on Firefox +:not(output):-moz-ui-invalid { + box-shadow: none; +} + +:not(output):-moz-ui-invalid:-moz-focusring { + box-shadow: none; +} + +output:-moz-ui-invalid { + color: inherit; +} diff --git a/website/client/src/components/auth/authForm.vue b/website/client/src/components/auth/authForm.vue index 7d3fa83e7d..993ed9cb10 100644 --- a/website/client/src/components/auth/authForm.vue +++ b/website/client/src/components/auth/authForm.vue @@ -46,6 +46,13 @@ :placeholder="$t('usernamePlaceholder')" :class="{'input-valid': usernameValid, 'input-invalid': usernameInvalid}" > +
+ {{ issue }} +
+
+ {{ $t('minPasswordLength') }} +
+
+ {{ $t('passwordConfirmationMatch') }} +
@@ -194,7 +220,7 @@ import hello from 'hellojs'; import debounce from 'lodash/debounce'; import isEmail from 'validator/lib/isEmail'; import { setUpAxios } from '@/libs/auth'; - +import { MINIMUM_PASSWORD_LENGTH } from '@/../../common/script/constants'; import facebookSquareIcon from '@/assets/svg/facebook-square.svg'; import googleIcon from '@/assets/svg/google.svg'; @@ -223,6 +249,7 @@ export default { return isEmail(this.email); }, emailInvalid () { + if (this.email.length <= 3) return false; return !this.emailValid; }, usernameValid () { @@ -230,13 +257,23 @@ export default { return this.usernameIssues.length === 0; }, usernameInvalid () { + if (this.username.length < 1) return false; return !this.usernameValid; }, + passwordValid () { + if (this.password.length <= 0) return false; + return this.password.length >= MINIMUM_PASSWORD_LENGTH; + }, + passwordInvalid () { + if (this.password.length <= 0) return false; + return this.password.length < MINIMUM_PASSWORD_LENGTH; + }, passwordConfirmValid () { if (this.passwordConfirm.length <= 3) return false; return this.passwordConfirm === this.password; }, passwordConfirmInvalid () { + if (this.passwordConfirm.length <= 3) return false; return !this.passwordConfirmValid; }, }, diff --git a/website/client/src/components/auth/registerLoginReset.vue b/website/client/src/components/auth/registerLoginReset.vue index e76d1a902d..9074a36a32 100644 --- a/website/client/src/components/auth/registerLoginReset.vue +++ b/website/client/src/components/auth/registerLoginReset.vue @@ -6,8 +6,7 @@
@@ -69,7 +68,7 @@ +
+ {{ $t('minPasswordLength') }} +
+
+ {{ $t('passwordConfirmationMatch') }} +
-
{{ $t('joinHabitica') }} -
-
+
+
@@ -796,6 +800,7 @@ import lifehacker from '@/assets/images/home/lifehacker.svg'; import makeuseof from '@/assets/images/home/make-use-of.svg'; import thenewyorktimes from '@/assets/images/home/the-new-york-times.svg'; import * as Analytics from '@/libs/analytics'; +import { MINIMUM_PASSWORD_LENGTH } from '@/../../common/script/constants'; export default { data () { @@ -844,6 +849,14 @@ export default { if (this.username.length < 1) return false; return !this.usernameValid; }, + passwordValid () { + if (this.password.length <= 0) return false; + return this.password.length >= MINIMUM_PASSWORD_LENGTH; + }, + passwordInvalid () { + if (this.password.length <= 0) return false; + return this.password.length < MINIMUM_PASSWORD_LENGTH; + }, passwordConfirmValid () { if (this.passwordConfirm.length <= 3) return false; return this.passwordConfirm === this.password; @@ -852,6 +865,12 @@ export default { if (this.passwordConfirm.length <= 3) return false; return this.passwordConfirm !== this.password; }, + signupFormInvalid () { + return this.usernameInvalid + || this.emailInvalid + || this.passwordInvalid + || this.passwordConfirmInvalid; + }, }, watch: { username () { diff --git a/website/client/src/components/static/staticWrapper.vue b/website/client/src/components/static/staticWrapper.vue index 89cb9fb77c..922a33e840 100644 --- a/website/client/src/components/static/staticWrapper.vue +++ b/website/client/src/components/static/staticWrapper.vue @@ -85,10 +85,6 @@ } } - #bottom-wrap.purple-4 { - background-color: #271b3d; - } - #purple-footer { background-color: #271b3d; @@ -115,33 +111,6 @@ } } - #bottom-wrap { - padding-top: 10em; - } - - #bottom-background { - position: relative; - - .seamless_mountains_demo_repeat { - background-image: url('~@/assets/images/auth/seamless_mountains_demo.png'); - background-repeat: repeat-x; - width: 100%; - height: 300px; - position: absolute; - z-index: 0; - bottom: 0; - } - - .midground_foreground_extended2 { - background-image: url('~@/assets/images/auth/midground_foreground_extended2.png'); - position: relative; - width: 1500px; - max-width: 100%; - height: 150px; - margin: 0 auto; - } - } - .static-wrapper { .container-fluid { margin: 5em 2em 2em 2em; @@ -171,6 +140,39 @@ } + +