Compare commits

..

148 Commits

Author SHA1 Message Date
Matteo Pagliazzi 289032047c 4.137.1 2020-03-18 19:39:37 +01:00
Matteo Pagliazzi 6f5515214a update mongoose options 2020-03-18 19:36:10 +01:00
Sabe Jones bbbc06733b 4.137.0 2020-03-17 09:12:06 -05:00
Sabe Jones 92c3a640ee feat(content): Bug Bonanza achievement 2020-03-17 09:11:41 -05:00
Sabe Jones bb8bd8842d 4.136.4 2020-03-14 06:49:55 -05:00
Matteo Pagliazzi 1411706963 fix(party members): clone array to avoid infinite loops, fixes #11969 2020-03-13 23:48:10 +01:00
Sabe Jones e94631a002 fix(test): food expectation, sigh 2020-03-13 11:10:28 -05:00
Sabe Jones 39bb60638f feat(content): Pi Day 2020 2020-03-13 10:59:52 -05:00
Sabe Jones 71e34e654c 4.136.3 2020-03-12 14:53:11 -05:00
Matteo Pagliazzi f01aba15be fix(lint): run npm lint to fix formatting 2020-03-11 13:04:03 +01:00
Melior fd4e760c05 Merge branch 'origin/develop' into Weblate. 2020-03-10 20:32:00 +01:00
Melior b5ed65b164 Translated using Weblate (Latin)
Currently translated at 98.6% (227 of 230 strings)

Translation: Habitica/Character
Translate-URL: https://translate.habitica.com/projects/habitica/character/la/

Translated using Weblate (Vietnamese)

Currently translated at 17.5% (13 of 74 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/vi/

Translated using Weblate (Japanese)

Currently translated at 98.6% (141 of 143 strings)

Translation: Habitica/Pets
Translate-URL: https://translate.habitica.com/projects/habitica/pets/ja/

Translated using Weblate (Japanese)

Currently translated at 100.0% (298 of 298 strings)

Translation: Habitica/Generic
Translate-URL: https://translate.habitica.com/projects/habitica/generic/ja/

Translated using Weblate (Latin)

Currently translated at 100.0% (74 of 74 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/la/

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (143 of 143 strings)

Translation: Habitica/Pets
Translate-URL: https://translate.habitica.com/projects/habitica/pets/zh_Hant/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (143 of 143 strings)

Translation: Habitica/Pets
Translate-URL: https://translate.habitica.com/projects/habitica/pets/zh_Hans/

Translated using Weblate (Russian)

Currently translated at 99.3% (142 of 143 strings)

Translation: Habitica/Pets
Translate-URL: https://translate.habitica.com/projects/habitica/pets/ru/

Translated using Weblate (French)

Currently translated at 100.0% (143 of 143 strings)

Translation: Habitica/Pets
Translate-URL: https://translate.habitica.com/projects/habitica/pets/fr/

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (143 of 143 strings)

Translation: Habitica/Pets
Translate-URL: https://translate.habitica.com/projects/habitica/pets/en_GB/

Translated using Weblate (German)

Currently translated at 100.0% (143 of 143 strings)

Translation: Habitica/Pets
Translate-URL: https://translate.habitica.com/projects/habitica/pets/de/

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (172 of 172 strings)

Translation: Habitica/Npc
Translate-URL: https://translate.habitica.com/projects/habitica/npc/zh_Hant/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (172 of 172 strings)

Translation: Habitica/Npc
Translate-URL: https://translate.habitica.com/projects/habitica/npc/zh_Hans/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (172 of 172 strings)

Translation: Habitica/Npc
Translate-URL: https://translate.habitica.com/projects/habitica/npc/pt_BR/

Translated using Weblate (French)

Currently translated at 100.0% (172 of 172 strings)

Translation: Habitica/Npc
Translate-URL: https://translate.habitica.com/projects/habitica/npc/fr/

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (8 of 8 strings)

Translation: Habitica/Overview
Translate-URL: https://translate.habitica.com/projects/habitica/overview/zh_Hant/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (8 of 8 strings)

Translation: Habitica/Overview
Translate-URL: https://translate.habitica.com/projects/habitica/overview/zh_Hans/

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (172 of 172 strings)

Translation: Habitica/Npc
Translate-URL: https://translate.habitica.com/projects/habitica/npc/en_GB/

Translated using Weblate (Russian)

Currently translated at 100.0% (8 of 8 strings)

Translation: Habitica/Overview
Translate-URL: https://translate.habitica.com/projects/habitica/overview/ru/

Translated using Weblate (French)

Currently translated at 100.0% (8 of 8 strings)

Translation: Habitica/Overview
Translate-URL: https://translate.habitica.com/projects/habitica/overview/fr/

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (8 of 8 strings)

Translation: Habitica/Overview
Translate-URL: https://translate.habitica.com/projects/habitica/overview/en_GB/

Translated using Weblate (German)

Currently translated at 100.0% (172 of 172 strings)

Translation: Habitica/Npc
Translate-URL: https://translate.habitica.com/projects/habitica/npc/de/

Translated using Weblate (Russian)

Currently translated at 100.0% (67 of 67 strings)

Translation: Habitica/Messages
Translate-URL: https://translate.habitica.com/projects/habitica/messages/ru/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (27 of 27 strings)

Translation: Habitica/Loginincentives
Translate-URL: https://translate.habitica.com/projects/habitica/loginincentives/zh_Hans/

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (492 of 492 strings)

Translation: Habitica/Groups
Translate-URL: https://translate.habitica.com/projects/habitica/groups/zh_Hant/

Translated using Weblate (French)

Currently translated at 100.0% (492 of 492 strings)

Translation: Habitica/Groups
Translate-URL: https://translate.habitica.com/projects/habitica/groups/fr/

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (492 of 492 strings)

Translation: Habitica/Groups
Translate-URL: https://translate.habitica.com/projects/habitica/groups/en_GB/

Translated using Weblate (German)

Currently translated at 100.0% (492 of 492 strings)

Translation: Habitica/Groups
Translate-URL: https://translate.habitica.com/projects/habitica/groups/de/

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (6 of 6 strings)

Translation: Habitica/Inventory
Translate-URL: https://translate.habitica.com/projects/habitica/inventory/zh_Hant/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (6 of 6 strings)

Translation: Habitica/Inventory
Translate-URL: https://translate.habitica.com/projects/habitica/inventory/zh_Hans/

Translated using Weblate (Russian)

Currently translated at 100.0% (6 of 6 strings)

Translation: Habitica/Inventory
Translate-URL: https://translate.habitica.com/projects/habitica/inventory/ru/

Translated using Weblate (French)

Currently translated at 100.0% (6 of 6 strings)

Translation: Habitica/Inventory
Translate-URL: https://translate.habitica.com/projects/habitica/inventory/fr/

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (6 of 6 strings)

Translation: Habitica/Inventory
Translate-URL: https://translate.habitica.com/projects/habitica/inventory/en_GB/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.6% (2046 of 2053 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/pt_BR/

Translated using Weblate (Dutch)

Currently translated at 89.4% (1836 of 2053 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/nl/

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (298 of 298 strings)

Translation: Habitica/Generic
Translate-URL: https://translate.habitica.com/projects/habitica/generic/zh_Hant/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (298 of 298 strings)

Translation: Habitica/Generic
Translate-URL: https://translate.habitica.com/projects/habitica/generic/zh_Hans/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (298 of 298 strings)

Translation: Habitica/Generic
Translate-URL: https://translate.habitica.com/projects/habitica/generic/pt_BR/

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (298 of 298 strings)

Translation: Habitica/Generic
Translate-URL: https://translate.habitica.com/projects/habitica/generic/en_GB/

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (56 of 56 strings)

Translation: Habitica/Faq
Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hant/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (56 of 56 strings)

Translation: Habitica/Faq
Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hans/

Translated using Weblate (Russian)

Currently translated at 96.4% (54 of 56 strings)

Translation: Habitica/Faq
Translate-URL: https://translate.habitica.com/projects/habitica/faq/ru/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (56 of 56 strings)

Translation: Habitica/Faq
Translate-URL: https://translate.habitica.com/projects/habitica/faq/pt_BR/

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (56 of 56 strings)

Translation: Habitica/Faq
Translate-URL: https://translate.habitica.com/projects/habitica/faq/en_GB/

Translated using Weblate (German)

Currently translated at 100.0% (56 of 56 strings)

Translation: Habitica/Faq
Translate-URL: https://translate.habitica.com/projects/habitica/faq/de/

Translated using Weblate (Japanese)

Currently translated at 97.0% (665 of 685 strings)

Translation: Habitica/Questscontent
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/ja/

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (356 of 356 strings)

Translation: Habitica/Content
Translate-URL: https://translate.habitica.com/projects/habitica/content/zh_Hant/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (356 of 356 strings)

Translation: Habitica/Content
Translate-URL: https://translate.habitica.com/projects/habitica/content/zh_Hans/

Translated using Weblate (Russian)

Currently translated at 100.0% (356 of 356 strings)

Translation: Habitica/Content
Translate-URL: https://translate.habitica.com/projects/habitica/content/ru/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (356 of 356 strings)

Translation: Habitica/Content
Translate-URL: https://translate.habitica.com/projects/habitica/content/pt_BR/

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (356 of 356 strings)

Translation: Habitica/Content
Translate-URL: https://translate.habitica.com/projects/habitica/content/en_GB/

Translated using Weblate (Russian)

Currently translated at 100.0% (230 of 230 strings)

Translation: Habitica/Character
Translate-URL: https://translate.habitica.com/projects/habitica/character/ru/

Translated using Weblate (English (Pirate))

Currently translated at 100.0% (230 of 230 strings)

Translation: Habitica/Character
Translate-URL: https://translate.habitica.com/projects/habitica/character/en@pirate/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (515 of 515 strings)

Translation: Habitica/Backgrounds
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/pt_BR/

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (74 of 74 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/zh_Hant/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (74 of 74 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/zh_Hans/

Translated using Weblate (Russian)

Currently translated at 98.6% (73 of 74 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/ru/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (74 of 74 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/pt_BR/

Translated using Weblate (Dutch)

Currently translated at 100.0% (74 of 74 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/nl/

Translated using Weblate (French)

Currently translated at 100.0% (74 of 74 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/fr/

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (74 of 74 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/en_GB/

Translated using Weblate (German)

Currently translated at 100.0% (74 of 74 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/de/

Translated using Weblate (Russian)

Currently translated at 100.0% (356 of 356 strings)

Translation: Habitica/Content
Translate-URL: https://translate.habitica.com/projects/habitica/content/ru/

Translated using Weblate (French)

Currently translated at 100.0% (56 of 56 strings)

Translation: Habitica/Faq
Translate-URL: https://translate.habitica.com/projects/habitica/faq/fr/

Translated using Weblate (French)

Currently translated at 100.0% (298 of 298 strings)

Translation: Habitica/Generic
Translate-URL: https://translate.habitica.com/projects/habitica/generic/fr/

Translated using Weblate (German)

Currently translated at 100.0% (298 of 298 strings)

Translation: Habitica/Generic
Translate-URL: https://translate.habitica.com/projects/habitica/generic/de/

Translated using Weblate (French)

Currently translated at 100.0% (356 of 356 strings)

Translation: Habitica/Content
Translate-URL: https://translate.habitica.com/projects/habitica/content/fr/

Translated using Weblate (Russian)

Currently translated at 100.0% (212 of 212 strings)

Translation: Habitica/Settings
Translate-URL: https://translate.habitica.com/projects/habitica/settings/ru/

Translated using Weblate (German)

Currently translated at 100.0% (8 of 8 strings)

Translation: Habitica/Overview
Translate-URL: https://translate.habitica.com/projects/habitica/overview/de/

Translated using Weblate (German)

Currently translated at 99.5% (490 of 492 strings)

Translation: Habitica/Groups
Translate-URL: https://translate.habitica.com/projects/habitica/groups/de/

Translated using Weblate (German)

Currently translated at 100.0% (6 of 6 strings)

Translation: Habitica/Inventory
Translate-URL: https://translate.habitica.com/projects/habitica/inventory/de/

Translated using Weblate (German)

Currently translated at 96.4% (54 of 56 strings)

Translation: Habitica/Faq
Translate-URL: https://translate.habitica.com/projects/habitica/faq/de/

Translated using Weblate (German)

Currently translated at 97.2% (72 of 74 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/de/

Translated using Weblate (Dutch)

Currently translated at 89.2% (1833 of 2053 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/nl/

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (230 of 230 strings)

Translation: Habitica/Character
Translate-URL: https://translate.habitica.com/projects/habitica/character/zh_Hant/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (230 of 230 strings)

Translation: Habitica/Character
Translate-URL: https://translate.habitica.com/projects/habitica/character/zh_Hans/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (65 of 65 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/zh_Hans/

Translated using Weblate (Turkish)

Currently translated at 71.8% (51 of 71 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/tr/

Translated using Weblate (Korean)

Currently translated at 37.4% (55 of 147 strings)

Translation: Habitica/Pets
Translate-URL: https://translate.habitica.com/projects/habitica/pets/ko/

Translated using Weblate (Korean)

Currently translated at 12.5% (41 of 328 strings)

Translation: Habitica/Front
Translate-URL: https://translate.habitica.com/projects/habitica/front/ko/

Translated using Weblate (Vietnamese)

Currently translated at 98.9% (295 of 298 strings)

Translation: Habitica/Generic
Translate-URL: https://translate.habitica.com/projects/habitica/generic/vi/

Translated using Weblate (Korean)

Currently translated at 84.8% (1742 of 2053 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ko/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (247 of 247 strings)

Translation: Habitica/Subscriber
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/zh_Hans/

Translated using Weblate (Dutch)

Currently translated at 85.0% (210 of 247 strings)

Translation: Habitica/Subscriber
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/nl/

Translated using Weblate (Dutch)

Currently translated at 100.0% (489 of 489 strings)

Translation: Habitica/Groups
Translate-URL: https://translate.habitica.com/projects/habitica/groups/nl/

Translated using Weblate (Dutch)

Currently translated at 89.1% (1831 of 2053 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/nl/

Translated using Weblate (French)

Currently translated at 100.0% (2053 of 2053 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/fr/

Translated using Weblate (Czech)

Currently translated at 96.8% (122 of 126 strings)

Translation: Habitica/Communityguidelines
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/cs/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (356 of 356 strings)

Translation: Habitica/Content
Translate-URL: https://translate.habitica.com/projects/habitica/content/zh_Hans/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (230 of 230 strings)

Translation: Habitica/Character
Translate-URL: https://translate.habitica.com/projects/habitica/character/zh_Hans/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (230 of 230 strings)

Translation: Habitica/Character
Translate-URL: https://translate.habitica.com/projects/habitica/character/zh_Hans/

Translated using Weblate (French)

Currently translated at 100.0% (515 of 515 strings)

Translation: Habitica/Backgrounds
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/fr/

Translated using Weblate (Icelandic)

Currently translated at 100.0% (4 of 4 strings)

Translation: Habitica/Noscript
Translate-URL: https://translate.habitica.com/projects/habitica/noscript/is/

Translated using Weblate (Icelandic)

Currently translated at 100.0% (12 of 12 strings)

Translation: Habitica/Merch
Translate-URL: https://translate.habitica.com/projects/habitica/merch/is/

Translated using Weblate (Icelandic)

Currently translated at 16.9% (12 of 71 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/is/

Translated using Weblate (Dutch)

Currently translated at 100.0% (211 of 211 strings)

Translation: Habitica/Tasks
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/nl/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (140 of 140 strings)

Translation: Habitica/Quests
Translate-URL: https://translate.habitica.com/projects/habitica/quests/zh_Hans/

Translated using Weblate (English (Pirate))

Currently translated at 100.0% (140 of 140 strings)

Translation: Habitica/Quests
Translate-URL: https://translate.habitica.com/projects/habitica/quests/en@pirate/

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (147 of 147 strings)

Translation: Habitica/Pets
Translate-URL: https://translate.habitica.com/projects/habitica/pets/zh_Hant/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (147 of 147 strings)

Translation: Habitica/Pets
Translate-URL: https://translate.habitica.com/projects/habitica/pets/zh_Hans/

Translated using Weblate (Dutch)

Currently translated at 100.0% (147 of 147 strings)

Translation: Habitica/Pets
Translate-URL: https://translate.habitica.com/projects/habitica/pets/nl/

Translated using Weblate (English (Pirate))

Currently translated at 100.0% (147 of 147 strings)

Translation: Habitica/Pets
Translate-URL: https://translate.habitica.com/projects/habitica/pets/en@pirate/

Translated using Weblate (English (Pirate))

Currently translated at 100.0% (172 of 172 strings)

Translation: Habitica/Npc
Translate-URL: https://translate.habitica.com/projects/habitica/npc/en@pirate/

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (175 of 175 strings)

Translation: Habitica/Limited
Translate-URL: https://translate.habitica.com/projects/habitica/limited/zh_Hant/

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (175 of 175 strings)

Translation: Habitica/Limited
Translate-URL: https://translate.habitica.com/projects/habitica/limited/en_GB/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (485 of 485 strings)

Translation: Habitica/Groups
Translate-URL: https://translate.habitica.com/projects/habitica/groups/zh_Hans/

Translated using Weblate (Russian)

Currently translated at 99.7% (488 of 489 strings)

Translation: Habitica/Groups
Translate-URL: https://translate.habitica.com/projects/habitica/groups/ru/

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (2053 of 2053 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hant/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (2053 of 2053 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (2053 of 2053 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/

Translated using Weblate (Russian)

Currently translated at 99.3% (2040 of 2053 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ru/

Translated using Weblate (Dutch)

Currently translated at 88.9% (1827 of 2053 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/nl/

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (2053 of 2053 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/en_GB/

Translated using Weblate (German)

Currently translated at 100.0% (2053 of 2053 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/

Translated using Weblate (Dutch)

Currently translated at 100.0% (298 of 298 strings)

Translation: Habitica/Generic
Translate-URL: https://translate.habitica.com/projects/habitica/generic/nl/

Translated using Weblate (English (Pirate))

Currently translated at 100.0% (298 of 298 strings)

Translation: Habitica/Generic
Translate-URL: https://translate.habitica.com/projects/habitica/generic/en@pirate/

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (328 of 328 strings)

Translation: Habitica/Front
Translate-URL: https://translate.habitica.com/projects/habitica/front/zh_Hant/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (328 of 328 strings)

Translation: Habitica/Front
Translate-URL: https://translate.habitica.com/projects/habitica/front/zh_Hans/

Translated using Weblate (Dutch)

Currently translated at 100.0% (328 of 328 strings)

Translation: Habitica/Front
Translate-URL: https://translate.habitica.com/projects/habitica/front/nl/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (63 of 63 strings)

Translation: Habitica/Defaulttasks
Translate-URL: https://translate.habitica.com/projects/habitica/defaulttasks/zh_Hans/

Translated using Weblate (Dutch)

Currently translated at 100.0% (63 of 63 strings)

Translation: Habitica/Defaulttasks
Translate-URL: https://translate.habitica.com/projects/habitica/defaulttasks/nl/

Translated using Weblate (Dutch)

Currently translated at 100.0% (356 of 356 strings)

Translation: Habitica/Content
Translate-URL: https://translate.habitica.com/projects/habitica/content/nl/

Translated using Weblate (English (Pirate))

Currently translated at 100.0% (356 of 356 strings)

Translation: Habitica/Content
Translate-URL: https://translate.habitica.com/projects/habitica/content/en@pirate/

Translated using Weblate (Dutch)

Currently translated at 100.0% (230 of 230 strings)

Translation: Habitica/Character
Translate-URL: https://translate.habitica.com/projects/habitica/character/nl/

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (515 of 515 strings)

Translation: Habitica/Backgrounds
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/zh_Hant/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (515 of 515 strings)

Translation: Habitica/Backgrounds
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/zh_Hans/

Translated using Weblate (Russian)

Currently translated at 98.2% (506 of 515 strings)

Translation: Habitica/Backgrounds
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ru/

Translated using Weblate (Dutch)

Currently translated at 100.0% (515 of 515 strings)

Translation: Habitica/Backgrounds
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/nl/

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (515 of 515 strings)

Translation: Habitica/Backgrounds
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/en_GB/

Translated using Weblate (English (Pirate))

Currently translated at 100.0% (515 of 515 strings)

Translation: Habitica/Backgrounds
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/en@pirate/

Translated using Weblate (German)

Currently translated at 100.0% (515 of 515 strings)

Translation: Habitica/Backgrounds
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/de/

Translated using Weblate (English (Pirate))

Currently translated at 100.0% (71 of 71 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/en@pirate/

Translated using Weblate (English (Pirate))

Currently translated at 100.0% (212 of 212 strings)

Translation: Habitica/Settings
Translate-URL: https://translate.habitica.com/projects/habitica/settings/en@pirate/

Translated using Weblate (German)

Currently translated at 100.0% (2053 of 2053 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/

Translated using Weblate (German)

Currently translated at 100.0% (2053 of 2053 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/

Translated using Weblate (English (United Kingdom))

Currently translated at 98.6% (508 of 515 strings)

Translation: Habitica/Backgrounds
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/en_GB/
2020-03-10 20:31:40 +01:00
Sabe Jones 4ee14e7c2a Merge branch 'release' into develop 2020-03-10 14:26:47 -05:00
Sabe Jones f40fb510a9 4.136.2 2020-03-10 14:25:42 -05:00
Sabe Jones 86951916e8 feat(content): enable bug hugging 2020-03-10 14:25:30 -05:00
Matteo Pagliazzi fde8e54783 fix(readme): remove greenkeeper badge 2020-03-10 11:45:37 +01:00
Matteo Pagliazzi 276e882092 fix(challenges): handle case where challenge has no categories or result is empty 2020-03-09 21:17:27 +01:00
Alec Brickner 88bfed7efe Ensure official challenges are listed first (fixes #11018) (#11030)
* Ensure official challenges are listed first

* Fix lint errors

* Move query creation into separate function

* switching branches

* Fixes and tests

* Formatting fixes

* Linting

* fix tests
2020-03-09 20:08:28 +01:00
Nik 0936c2ff86 Special case for member profile name. (#11918)
* Special case for member profile name.

Use a case insensitive order by

* Use of localeCompare function for name comparison
2020-03-09 17:59:30 +01:00
Nik bdedf8f563 Fix asc/desc sort order when sorted by name (#11919)
* Fix asc/desc sort order when sorted by name

* Revert changes.

Use localeCompare but considering sort order
2020-03-09 17:56:43 +01:00
Carl Vuorinen 9220323483 Move collapseChecklist tooltip (#11954)
So that checklist items can be checked even when tooltip shown
Fixes #11888
2020-03-09 17:28:09 +01:00
Matteo Pagliazzi 80c93ad934 Merge branch 'release' into develop 2020-03-09 16:22:08 +01:00
Matteo Pagliazzi 010da977a4 fix(sign up): prevent double request to sign up route 2020-03-09 16:21:57 +01:00
Matteo Pagliazzi b9bfb3f722 fix(logs): call split on strings only 2020-03-09 16:18:57 +01:00
Joanna Cholewa effb66a089 Replace setUsernameNotificationBody setting with changeUsernameDisclaimer and alter disclaimer text (#11953) 2020-03-09 15:48:54 +01:00
Matteo Pagliazzi dbdb5f81a5 Merge branch 'release' into develop 2020-03-09 15:16:22 +01:00
Matteo Pagliazzi 2062e78959 fix(logs): FCM, only log defined errors 2020-03-09 15:16:10 +01:00
Matteo Pagliazzi 018c5edfdd fix(logs): FCM, only log defined errors 2020-03-09 15:13:15 +01:00
dependabot-preview[bot] b0a3e58d66 build(deps): bump @babel/core from 7.8.6 to 7.8.7 (#11961)
Bumps [@babel/core](https://github.com/babel/babel) from 7.8.6 to 7.8.7.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/compare/v7.8.6...v7.8.7)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-03-09 13:36:27 +01:00
dependabot-preview[bot] 99960da2eb build(deps): bump bootstrap-vue from 2.5.0 to 2.6.1 in /website/client (#11963)
Bumps [bootstrap-vue](https://github.com/bootstrap-vue/bootstrap-vue) from 2.5.0 to 2.6.1.
- [Release notes](https://github.com/bootstrap-vue/bootstrap-vue/releases)
- [Changelog](https://github.com/bootstrap-vue/bootstrap-vue/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/bootstrap-vue/bootstrap-vue/compare/v2.5.0...v2.6.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-03-09 13:33:38 +01:00
dependabot-preview[bot] 8c293505c4 build(deps): bump aws-sdk from 2.630.0 to 2.635.0 (#11960)
Bumps [aws-sdk](https://github.com/aws/aws-sdk-js) from 2.630.0 to 2.635.0.
- [Release notes](https://github.com/aws/aws-sdk-js/releases)
- [Changelog](https://github.com/aws/aws-sdk-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-js/compare/v2.630.0...v2.635.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-03-09 13:33:26 +01:00
dependabot-preview[bot] 10ac99fc2e build(deps): bump @babel/preset-env from 7.8.6 to 7.8.7 (#11958)
Bumps [@babel/preset-env](https://github.com/babel/babel) from 7.8.6 to 7.8.7.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/compare/v7.8.6...v7.8.7)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-03-09 13:33:12 +01:00
dependabot-preview[bot] 34c7d4e3b8 build(deps): bump gulp-nodemon from 2.4.2 to 2.5.0 (#11955)
Bumps [gulp-nodemon](https://github.com/JacksonGariety/gulp-nodemon) from 2.4.2 to 2.5.0.
- [Release notes](https://github.com/JacksonGariety/gulp-nodemon/releases)
- [Commits](https://github.com/JacksonGariety/gulp-nodemon/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-03-09 13:31:51 +01:00
dependabot-preview[bot] 50d9a355b0 build(deps): bump mongoose from 5.9.2 to 5.9.3 (#11956)
Bumps [mongoose](https://github.com/Automattic/mongoose) from 5.9.2 to 5.9.3.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/History.md)
- [Commits](https://github.com/Automattic/mongoose/compare/5.9.2...5.9.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-03-09 13:31:16 +01:00
dependabot-preview[bot] 35b5285ce6 build(deps): bump eslint-plugin-vue in /website/client (#11964)
Bumps [eslint-plugin-vue](https://github.com/vuejs/eslint-plugin-vue) from 6.2.1 to 6.2.2.
- [Release notes](https://github.com/vuejs/eslint-plugin-vue/releases)
- [Commits](https://github.com/vuejs/eslint-plugin-vue/compare/v6.2.1...v6.2.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-03-09 13:30:18 +01:00
Sabe Jones 2001b27c26 fix(test): comment unreliable error message 2020-03-07 13:31:50 -06:00
Sabe Jones 7064b363e0 fix(test): comment unreliable error message 2020-03-07 13:31:31 -06:00
Sabe Jones c5147a696d 4.136.1 2020-03-07 13:18:39 -06:00
Sabe Jones bd8e67a2ea Adventure Guide Prep (#11883)
* WIP(adventure): prereqs

* WIP(drops): new modal

* WIP(adventure): analytics fixes etc

* feat(adventure): random egg+potion on 2nd task

* fix(lint): noworkies

* fix(modal): correctly construct classes

* fix(tests): expectations and escape

* fix(first-drops): address comments

* fix(first-drops): don't give random drops until first drops

* fix(drops): remove more Level 3 references

* refactor(drops): no need for cloning

* refactor(drops): unnecessary export

* fix(first-drops): force sync

* fix(first-drops): move to server

* fix(first-drops): escape in case we get here with >0 items

* fix(lint): line length

* fix(pet-food): remove unused string
2020-03-07 13:03:13 -06:00
Matteo Pagliazzi db1bda1bcd tests(message model): add unit tests 2020-03-04 17:51:14 +01:00
negue fe6c21800c Fixing layout issues for the private messages page (#11766)
* fix: first batch of layout issues for private messages + auto sizing textarea

* username second line - open profile on face-avatar/conversation name - fix textarea height

* refresh on sync

* new "you dont have any messages" style + changed min textarea height

* new conversationItem style / layout

* reset message unread on reload

* fix styles / textarea height

* list optOut / chatRevoked informations for each conversation + show why its disabled

* Block / Unblock - correct disabled states - $gray-200 instead of 300/400

* canReceive not checking chatRevoked

* fix: faceAvatar / userLink open the selected conversation user

* check if the target user is blocking the logged-in user

* check if blocks is undefined

* max-height instead of height

* fix "no messages" state + canReceive on a new conversation

* fixed conversations width (280px on max 768 width page)

* call autosize after message is sent

* only color the placeholder

* only load the current user avatar/settings/flags

* show only the current avatar on private messages
2020-03-04 17:50:08 +01:00
Matteo Pagliazzi 2ff9dfe965 Fix username links resulting in truncated chat messages (#11945)
* introduce MAX_MESSAGE_LENGTH constant

* add test

* fix path

* fix and tests

* fix typo in tests
2020-03-04 11:49:14 +01:00
Melior 75068ceb9e Merge branch 'origin/develop' into Weblate. 2020-03-03 23:20:08 +01:00
Melior 462eac2599 Translated using Weblate (Latin)
Currently translated at 88.3% (449 of 508 strings)

Translation: Habitica/Backgrounds
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/la/

Translated using Weblate (Dutch)

Currently translated at 94.2% (479 of 508 strings)

Translation: Habitica/Backgrounds
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/nl/

Translated using Weblate (Dutch)

Currently translated at 100.0% (65 of 65 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/nl/

Translated using Weblate (Japanese)

Currently translated at 100.0% (212 of 212 strings)

Translation: Habitica/Settings
Translate-URL: https://translate.habitica.com/projects/habitica/settings/ja/
2020-03-03 23:19:11 +01:00
Sabe Jones 3fe307f6ea Merge branch 'release' into develop 2020-03-03 16:15:52 -06:00
Sabe Jones bb418da91f 4.136.0 2020-03-03 16:12:57 -06:00
Sabe Jones 08856ecc9f chore(news): nother Bailey 2020-03-03 16:12:30 -06:00
Sabe Jones 9e925513b0 Merge branch 'sabrecat/armoire-202003' into release 2020-03-03 15:28:05 -06:00
Melior d747e97cea Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (247 of 247 strings)

Translation: Habitica/Subscriber
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/zh_Hant/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (247 of 247 strings)

Translation: Habitica/Subscriber
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/zh_Hans/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (247 of 247 strings)

Translation: Habitica/Subscriber
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/pt_BR/

Translated using Weblate (French)

Currently translated at 100.0% (247 of 247 strings)

Translation: Habitica/Subscriber
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/fr/

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (247 of 247 strings)

Translation: Habitica/Subscriber
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/en_GB/

Translated using Weblate (German)

Currently translated at 100.0% (247 of 247 strings)

Translation: Habitica/Subscriber
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/de/

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (2045 of 2045 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hant/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (2045 of 2045 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (2045 of 2045 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2045 of 2045 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/pt_BR/

Translated using Weblate (French)

Currently translated at 100.0% (2045 of 2045 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/fr/

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (2045 of 2045 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/en_GB/

Translated using Weblate (German)

Currently translated at 100.0% (2045 of 2045 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (298 of 298 strings)

Translation: Habitica/Generic
Translate-URL: https://translate.habitica.com/projects/habitica/generic/pt_BR/
2020-03-02 23:41:14 +01:00
Sabe Jones bccd8e0000 Merge branch 'release' into develop 2020-03-02 16:21:24 -06:00
Sabe Jones 1035af0d25 4.135.1 2020-03-02 16:20:56 -06:00
Sabe Jones 80b302c997 chore(news): Bailey 2020-03-02 16:20:48 -06:00
Matteo Pagliazzi f448c8cdfb Merge branch 'MynahMarie-fix_addlNotes' into develop 2020-03-02 22:42:48 +01:00
Matteo Pagliazzi 77195c64cf add missing june2018 string 2020-03-02 22:42:28 +01:00
Matteo Pagliazzi 1efc030544 Merge branch 'fix_addlNotes' of https://github.com/MynahMarie/habitica into MynahMarie-fix_addlNotes 2020-03-02 22:38:58 +01:00
tsukimi2 5ad30e815a Change where members info is retrieved in Group component: Fixes #11737 (#11886)
* Change where members info is retrieved in Group component.

In Group component, changes the place where members data is retrieved from the load function originally to within the watch group function, so that when group data has changed, the code will update the corresponding members data as well.

* Moving the code for loading members data from watcher to inside fetchGuilds function

* Complying with lint

Co-authored-by: kazekunGb <eynsan@yahoo.co.uk>
Co-authored-by: Matteo Pagliazzi <matteopagliazzi@gmail.com>
2020-03-02 22:09:53 +01:00
Alec Brickner 966bcf8010 Ensure first-time purchases are synced (#11915)
* Ensure first-time purchases are synced

* whitespace commit to trigger tests

* Undo whitespace commit

* more whitespace

* remove the whitespace
2020-03-02 21:34:23 +01:00
Sabe Jones 8ebda9f7bd fix(content): missing strings 2020-03-02 07:47:04 -06:00
Sabe Jones 6192b563e9 chore(sprites): compile 2020-03-02 07:33:03 -06:00
Sabe Jones 6763e178d4 feat(content): armoire and Bee Gees 2020-03-02 07:32:53 -06:00
Matteo Pagliazzi 6a9025200c fix(logs): disable colors in production logs 2020-03-02 11:33:11 +01:00
Matteo Pagliazzi 4e3481445c fix(logs): log text message in production 2020-03-02 11:20:56 +01:00
Matteo Pagliazzi 8300464cfc Merge pull request #11887 from HabitRPG/stackdriver-winston
Logs improvements
2020-03-02 11:05:15 +01:00
Matteo Pagliazzi abb4899552 Merge pull request #11916 from HabitRPG/fix-corrupt-data
Fix corrupt data
2020-03-02 11:03:32 +01:00
Matteo Pagliazzi 90f88c42f6 remove console.log 2020-03-02 10:26:21 +01:00
Matteo Pagliazzi a4f84342ca build(deps): bump @storybook/addon-actions in /website/client (#11929)
Bumps [@storybook/addon-actions](https://github.com/storybookjs/storybook/tree/HEAD/addons/actions) from 5.3.13 to 5.3.14.
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v5.3.14/addons/actions)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-02 10:18:24 +01:00
dependabot-preview[bot] a90d1187e0 build(deps): bump @vue/cli-plugin-unit-mocha in /website/client (#11937)
Bumps [@vue/cli-plugin-unit-mocha](https://github.com/vuejs/vue-cli/tree/HEAD/packages/@vue/cli-plugin-unit-mocha) from 4.2.2 to 4.2.3.
- [Release notes](https://github.com/vuejs/vue-cli/releases)
- [Changelog](https://github.com/vuejs/vue-cli/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue-cli/commits/v4.2.3/packages/@vue/cli-plugin-unit-mocha)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-02 10:18:17 +01:00
dependabot-preview[bot] 88b130a219 build(deps): bump @storybook/addon-actions in /website/client
Bumps [@storybook/addon-actions](https://github.com/storybookjs/storybook/tree/HEAD/addons/actions) from 5.3.13 to 5.3.14.
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v5.3.14/addons/actions)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-02 09:17:33 +00:00
dependabot-preview[bot] 637e179951 build(deps): bump @vue/cli-plugin-eslint in /website/client (#11928)
Bumps [@vue/cli-plugin-eslint](https://github.com/vuejs/vue-cli/tree/HEAD/packages/@vue/cli-plugin-eslint) from 4.2.2 to 4.2.3.
- [Release notes](https://github.com/vuejs/vue-cli/releases)
- [Changelog](https://github.com/vuejs/vue-cli/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue-cli/commits/v4.2.3/packages/@vue/cli-plugin-eslint)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-02 10:16:38 +01:00
dependabot-preview[bot] 49e0077c67 build(deps): bump @babel/preset-env from 7.8.4 to 7.8.6 (#11927)
Bumps [@babel/preset-env](https://github.com/babel/babel) from 7.8.4 to 7.8.6.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/compare/v7.8.4...v7.8.6)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-02 10:15:02 +01:00
dependabot-preview[bot] 0787582e58 build(deps): bump @storybook/addon-notes in /website/client (#11933)
Bumps [@storybook/addon-notes](https://github.com/storybookjs/storybook/tree/HEAD/addons/notes) from 5.3.13 to 5.3.14.
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/v5.3.14/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v5.3.14/addons/notes)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-02 10:14:02 +01:00
dependabot-preview[bot] 1c942eb8f3 build(deps): bump @storybook/addon-knobs in /website/client (#11932)
Bumps [@storybook/addon-knobs](https://github.com/storybookjs/storybook/tree/HEAD/addons/knobs) from 5.3.13 to 5.3.14.
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v5.3.14/addons/knobs)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-02 10:13:50 +01:00
dependabot-preview[bot] d67f6ae471 build(deps): bump aws-sdk from 2.624.0 to 2.630.0 (#11922)
Bumps [aws-sdk](https://github.com/aws/aws-sdk-js) from 2.624.0 to 2.630.0.
- [Release notes](https://github.com/aws/aws-sdk-js/releases)
- [Changelog](https://github.com/aws/aws-sdk-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-js/compare/v2.624.0...v2.630.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-02 10:11:49 +01:00
dependabot-preview[bot] 55baed38b5 build(deps): bump @babel/core from 7.8.4 to 7.8.6 (#11923)
Bumps [@babel/core](https://github.com/babel/babel) from 7.8.4 to 7.8.6.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/compare/v7.8.4...v7.8.6)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-02 10:11:41 +01:00
dependabot-preview[bot] 7ef55d0283 build(deps): bump helmet from 3.21.2 to 3.21.3 (#11926)
Bumps [helmet](https://github.com/helmetjs/helmet) from 3.21.2 to 3.21.3.
- [Release notes](https://github.com/helmetjs/helmet/releases)
- [Changelog](https://github.com/helmetjs/helmet/blob/master/CHANGELOG.md)
- [Commits](https://github.com/helmetjs/helmet/compare/v3.21.2...v3.21.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-02 10:11:24 +01:00
dependabot-preview[bot] 8fac74e812 build(deps): bump @babel/register from 7.8.3 to 7.8.6 (#11921)
Bumps [@babel/register](https://github.com/babel/babel) from 7.8.3 to 7.8.6.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/compare/v7.8.3...v7.8.6)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-02 10:11:13 +01:00
dependabot-preview[bot] 3f2d1bf430 build(deps): bump @vue/cli-service in /website/client (#11936)
Bumps [@vue/cli-service](https://github.com/vuejs/vue-cli/tree/HEAD/packages/@vue/cli-service) from 4.2.2 to 4.2.3.
- [Release notes](https://github.com/vuejs/vue-cli/releases)
- [Changelog](https://github.com/vuejs/vue-cli/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue-cli/commits/v4.2.3/packages/@vue/cli-service)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-02 10:10:46 +01:00
dependabot-preview[bot] 42cfc7d851 build(deps): bump @storybook/vue in /website/client (#11934)
Bumps [@storybook/vue](https://github.com/storybookjs/storybook/tree/HEAD/app/vue) from 5.3.13 to 5.3.14.
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v5.3.14/app/vue)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-02 10:10:32 +01:00
dependabot-preview[bot] ef7724203e build(deps): bump sass from 1.25.0 to 1.26.2 in /website/client (#11938)
Bumps [sass](https://github.com/sass/dart-sass) from 1.25.0 to 1.26.2.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.25.0...1.26.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-02 10:10:14 +01:00
dependabot-preview[bot] 09cec21cde build(deps): bump @storybook/addon-links in /website/client (#11939)
Bumps [@storybook/addon-links](https://github.com/storybookjs/storybook/tree/HEAD/addons/links) from 5.3.13 to 5.3.14.
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v5.3.14/addons/links)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-02 10:10:08 +01:00
dependabot-preview[bot] fc987c11e9 build(deps): bump vue-router from 3.1.5 to 3.1.6 in /website/client (#11931)
Bumps [vue-router](https://github.com/vuejs/vue-router) from 3.1.5 to 3.1.6.
- [Release notes](https://github.com/vuejs/vue-router/releases)
- [Changelog](https://github.com/vuejs/vue-router/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue-router/compare/v3.1.5...v3.1.6)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-02 10:09:54 +01:00
dependabot-preview[bot] 3678861c48 build(deps): bump @vue/cli-plugin-router in /website/client (#11935)
Bumps [@vue/cli-plugin-router](https://github.com/vuejs/vue-cli/tree/HEAD/packages/@vue/cli-plugin-router) from 4.2.2 to 4.2.3.
- [Release notes](https://github.com/vuejs/vue-cli/releases)
- [Changelog](https://github.com/vuejs/vue-cli/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue-cli/commits/v4.2.3/packages/@vue/cli-plugin-router)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-02 10:09:30 +01:00
dependabot-preview[bot] a6463e1fba build(deps): bump babel-eslint from 10.0.3 to 10.1.0 in /website/client (#11942)
Bumps [babel-eslint](https://github.com/babel/babel-eslint) from 10.0.3 to 10.1.0.
- [Release notes](https://github.com/babel/babel-eslint/releases)
- [Commits](https://github.com/babel/babel-eslint/compare/v10.0.3...v10.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-02 10:09:02 +01:00
dependabot-preview[bot] 0e4d4c2235 build(deps): bump webpack from 4.41.6 to 4.42.0 in /website/client (#11940)
Bumps [webpack](https://github.com/webpack/webpack) from 4.41.6 to 4.42.0.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v4.41.6...v4.42.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-02 10:08:49 +01:00
dependabot-preview[bot] 09b76008ea build(deps): bump @vue/cli-plugin-babel in /website/client (#11943)
Bumps [@vue/cli-plugin-babel](https://github.com/vuejs/vue-cli/tree/HEAD/packages/@vue/cli-plugin-babel) from 4.2.2 to 4.2.3.
- [Release notes](https://github.com/vuejs/vue-cli/releases)
- [Changelog](https://github.com/vuejs/vue-cli/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue-cli/commits/v4.2.3/packages/@vue/cli-plugin-babel)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-02 10:08:37 +01:00
Matteo Pagliazzi c2a79e1d7c fix tests 2020-03-01 22:37:29 +01:00
Matteo Pagliazzi c5208f0ef6 fix tags 2020-03-01 22:21:53 +01:00
Matteo Pagliazzi 979d0c519d add final tests for push devices and notifications 2020-03-01 22:10:11 +01:00
Matteo Pagliazzi 3f5ee32684 fix invalid push devices 2020-03-01 21:49:52 +01:00
Matteo Pagliazzi 6deee0ffc8 notifications tests 2020-03-01 21:29:57 +01:00
Matteo Pagliazzi a11e4d0512 fix lint 2020-03-01 20:53:33 +01:00
Matteo Pagliazzi 118e3580d6 refactor notifications cleanup 2020-03-01 20:06:24 +01:00
Matteo Pagliazzi 343f276705 re-enable notifications validation 2020-03-01 13:30:22 +01:00
Tom Thorpe c00a1d74f9 Allow group links on challenge details to be opened in a new tab (#11889)
* - Use `router-link` in `groupLink` to make links that can be followed in a new tab

* - Add back the missing `if` statement that was removed in error
2020-02-29 18:46:41 +01:00
Matteo Pagliazzi ae3f014bb2 add ability to disable console logs in prod while keeping loggly active 2020-02-29 17:48:09 +01:00
Matteo Pagliazzi 15e6cef7c4 fix tests 2020-02-29 17:40:46 +01:00
Melior b8c2d5eb20 Merge branch 'origin/develop' into Weblate. 2020-02-28 22:32:27 +01:00
Melior a444e876d1 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (2041 of 2041 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/
2020-02-28 22:32:14 +01:00
Sabe Jones 24b347af8e Merge branch 'release' into develop 2020-02-28 15:28:21 -06:00
Sabe Jones 76039020f5 4.135.0 2020-02-28 15:27:58 -06:00
Sabe Jones cbcfb21deb chore(sprites): compile 2020-02-28 15:27:22 -06:00
Sabe Jones f47ec3d85f feat(content): mystery set March 2020 2020-02-28 15:27:14 -06:00
dependabot-preview[bot] 517d56f9fc build(deps-dev): bump chalk from 2.4.2 to 3.0.0 (#11531)
Bumps [chalk](https://github.com/chalk/chalk) from 2.4.2 to 3.0.0.
- [Release notes](https://github.com/chalk/chalk/releases)
- [Commits](https://github.com/chalk/chalk/compare/v2.4.2...v3.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-28 19:33:38 +01:00
Matteo Pagliazzi a5c4871183 Merge branch 'develop' into stackdriver-winston 2020-02-28 19:32:22 +01:00
Sabe Jones aee08ba0f9 fix(bulk-email): wait 5s per 250 messages for server queue 2020-02-28 13:35:27 +00:00
Sabe Jones e1f9cac37a fix(gdpr): forbidden domain 2020-02-28 13:30:41 +00:00
Sabe Jones c9bb96d2be fix(gdpr): unique key fix 2020-02-28 13:30:15 +00:00
Melior b0d86ff37b Merge branch 'origin/develop' into Weblate. 2020-02-27 22:04:57 +01:00
Melior 3f3ebeffa1 Translated using Weblate (Latin)
Currently translated at 100.0% (71 of 71 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/la/

Translated using Weblate (Japanese)

Currently translated at 100.0% (172 of 172 strings)

Translation: Habitica/Npc
Translate-URL: https://translate.habitica.com/projects/habitica/npc/ja/

Translated using Weblate (Japanese)

Currently translated at 100.0% (489 of 489 strings)

Translation: Habitica/Groups
Translate-URL: https://translate.habitica.com/projects/habitica/groups/ja/

Translated using Weblate (Japanese)

Currently translated at 100.0% (328 of 328 strings)

Translation: Habitica/Front
Translate-URL: https://translate.habitica.com/projects/habitica/front/ja/

Translated using Weblate (Indonesian)

Currently translated at 18.3% (13 of 71 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/id/

Translated using Weblate (Belarusian)

Currently translated at 97.3% (476 of 489 strings)

Translation: Habitica/Groups
Translate-URL: https://translate.habitica.com/projects/habitica/groups/be/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (211 of 211 strings)

Translation: Habitica/Tasks
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/pt_BR/

Translated using Weblate (Russian)

Currently translated at 94.3% (232 of 246 strings)

Translation: Habitica/Subscriber
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/ru/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (172 of 172 strings)

Translation: Habitica/Npc
Translate-URL: https://translate.habitica.com/projects/habitica/npc/pt_BR/

Translated using Weblate (Russian)

Currently translated at 99.5% (487 of 489 strings)

Translation: Habitica/Groups
Translate-URL: https://translate.habitica.com/projects/habitica/groups/ru/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (489 of 489 strings)

Translation: Habitica/Groups
Translate-URL: https://translate.habitica.com/projects/habitica/groups/pt_BR/

Translated using Weblate (Japanese)

Currently translated at 99.7% (488 of 489 strings)

Translation: Habitica/Groups
Translate-URL: https://translate.habitica.com/projects/habitica/groups/ja/

Translated using Weblate (Russian)

Currently translated at 99.8% (2037 of 2041 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ru/

Translated using Weblate (Russian)

Currently translated at 99.7% (683 of 685 strings)

Translation: Habitica/Questscontent
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/ru/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (685 of 685 strings)

Translation: Habitica/Questscontent
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pt_BR/

Translated using Weblate (Russian)

Currently translated at 99.4% (505 of 508 strings)

Translation: Habitica/Backgrounds
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ru/

Translated using Weblate (Russian)

Currently translated at 100.0% (71 of 71 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/ru/

Translated using Weblate (Russian)

Currently translated at 99.5% (211 of 212 strings)

Translation: Habitica/Settings
Translate-URL: https://translate.habitica.com/projects/habitica/settings/ru/

Translated using Weblate (German)

Currently translated at 100.0% (212 of 212 strings)

Translation: Habitica/Settings
Translate-URL: https://translate.habitica.com/projects/habitica/settings/de/

Translated using Weblate (German)

Currently translated at 100.0% (172 of 172 strings)

Translation: Habitica/Npc
Translate-URL: https://translate.habitica.com/projects/habitica/npc/de/

Translated using Weblate (German)

Currently translated at 100.0% (147 of 147 strings)

Translation: Habitica/Pets
Translate-URL: https://translate.habitica.com/projects/habitica/pets/de/

Translated using Weblate (German)

Currently translated at 100.0% (2041 of 2041 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/

Translated using Weblate (Vietnamese)

Currently translated at 34.4% (113 of 328 strings)

Translation: Habitica/Front
Translate-URL: https://translate.habitica.com/projects/habitica/front/vi/

Translated using Weblate (Vietnamese)

Currently translated at 80.7% (410 of 508 strings)

Translation: Habitica/Backgrounds
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/vi/

Translated using Weblate (Russian)

Currently translated at 92.2% (227 of 246 strings)

Translation: Habitica/Subscriber
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/ru/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (246 of 246 strings)

Translation: Habitica/Subscriber
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/pt_BR/

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (246 of 246 strings)

Translation: Habitica/Subscriber
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/en_GB/

Translated using Weblate (German)

Currently translated at 100.0% (246 of 246 strings)

Translation: Habitica/Subscriber
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/de/

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (140 of 140 strings)

Translation: Habitica/Quests
Translate-URL: https://translate.habitica.com/projects/habitica/quests/zh_Hant/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (140 of 140 strings)

Translation: Habitica/Quests
Translate-URL: https://translate.habitica.com/projects/habitica/quests/zh_Hans/

Translated using Weblate (Russian)

Currently translated at 99.2% (139 of 140 strings)

Translation: Habitica/Quests
Translate-URL: https://translate.habitica.com/projects/habitica/quests/ru/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (140 of 140 strings)

Translation: Habitica/Quests
Translate-URL: https://translate.habitica.com/projects/habitica/quests/pt_BR/

Translated using Weblate (French)

Currently translated at 100.0% (140 of 140 strings)

Translation: Habitica/Quests
Translate-URL: https://translate.habitica.com/projects/habitica/quests/fr/

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (140 of 140 strings)

Translation: Habitica/Quests
Translate-URL: https://translate.habitica.com/projects/habitica/quests/en_GB/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (172 of 172 strings)

Translation: Habitica/Npc
Translate-URL: https://translate.habitica.com/projects/habitica/npc/pt_BR/

Translated using Weblate (French)

Currently translated at 100.0% (172 of 172 strings)

Translation: Habitica/Npc
Translate-URL: https://translate.habitica.com/projects/habitica/npc/fr/

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (172 of 172 strings)

Translation: Habitica/Npc
Translate-URL: https://translate.habitica.com/projects/habitica/npc/en_GB/

Translated using Weblate (German)

Currently translated at 100.0% (172 of 172 strings)

Translation: Habitica/Npc
Translate-URL: https://translate.habitica.com/projects/habitica/npc/de/

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (489 of 489 strings)

Translation: Habitica/Groups
Translate-URL: https://translate.habitica.com/projects/habitica/groups/zh_Hant/

Translated using Weblate (Russian)

Currently translated at 99.1% (485 of 489 strings)

Translation: Habitica/Groups
Translate-URL: https://translate.habitica.com/projects/habitica/groups/ru/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (489 of 489 strings)

Translation: Habitica/Groups
Translate-URL: https://translate.habitica.com/projects/habitica/groups/pt_BR/

Translated using Weblate (French)

Currently translated at 100.0% (489 of 489 strings)

Translation: Habitica/Groups
Translate-URL: https://translate.habitica.com/projects/habitica/groups/fr/

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (489 of 489 strings)

Translation: Habitica/Groups
Translate-URL: https://translate.habitica.com/projects/habitica/groups/en_GB/

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (328 of 328 strings)

Translation: Habitica/Front
Translate-URL: https://translate.habitica.com/projects/habitica/front/zh_Hant/

Translated using Weblate (Russian)

Currently translated at 100.0% (328 of 328 strings)

Translation: Habitica/Front
Translate-URL: https://translate.habitica.com/projects/habitica/front/ru/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (328 of 328 strings)

Translation: Habitica/Front
Translate-URL: https://translate.habitica.com/projects/habitica/front/pt_BR/

Translated using Weblate (French)

Currently translated at 100.0% (328 of 328 strings)

Translation: Habitica/Front
Translate-URL: https://translate.habitica.com/projects/habitica/front/fr/

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (328 of 328 strings)

Translation: Habitica/Front
Translate-URL: https://translate.habitica.com/projects/habitica/front/en_GB/

Translated using Weblate (German)

Currently translated at 100.0% (328 of 328 strings)

Translation: Habitica/Front
Translate-URL: https://translate.habitica.com/projects/habitica/front/de/

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (356 of 356 strings)

Translation: Habitica/Content
Translate-URL: https://translate.habitica.com/projects/habitica/content/zh_Hant/

Translated using Weblate (Hungarian)

Currently translated at 81.2% (413 of 508 strings)

Translation: Habitica/Backgrounds
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/hu/

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (71 of 71 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/zh_Hant/

Translated using Weblate (Russian)

Currently translated at 97.1% (69 of 71 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/ru/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (71 of 71 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/pt_BR/

Translated using Weblate (French)

Currently translated at 100.0% (71 of 71 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/fr/

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (71 of 71 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/en_GB/

Translated using Weblate (German)

Currently translated at 100.0% (71 of 71 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/de/

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (212 of 212 strings)

Translation: Habitica/Settings
Translate-URL: https://translate.habitica.com/projects/habitica/settings/zh_Hant/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (212 of 212 strings)

Translation: Habitica/Settings
Translate-URL: https://translate.habitica.com/projects/habitica/settings/zh_Hans/

Translated using Weblate (Russian)

Currently translated at 98.5% (209 of 212 strings)

Translation: Habitica/Settings
Translate-URL: https://translate.habitica.com/projects/habitica/settings/ru/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (212 of 212 strings)

Translation: Habitica/Settings
Translate-URL: https://translate.habitica.com/projects/habitica/settings/pt_BR/

Translated using Weblate (French)

Currently translated at 100.0% (212 of 212 strings)

Translation: Habitica/Settings
Translate-URL: https://translate.habitica.com/projects/habitica/settings/fr/

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (212 of 212 strings)

Translation: Habitica/Settings
Translate-URL: https://translate.habitica.com/projects/habitica/settings/en_GB/

Translated using Weblate (German)

Currently translated at 100.0% (212 of 212 strings)

Translation: Habitica/Settings
Translate-URL: https://translate.habitica.com/projects/habitica/settings/de/

Translated using Weblate (German)

Currently translated at 100.0% (246 of 246 strings)

Translation: Habitica/Subscriber
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/de/

Translated using Weblate (German)

Currently translated at 100.0% (246 of 246 strings)

Translation: Habitica/Subscriber
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/de/

Translated using Weblate (German)

Currently translated at 100.0% (71 of 71 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/de/

Translated using Weblate (German)

Currently translated at 100.0% (71 of 71 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/de/

Translated using Weblate (German)

Currently translated at 100.0% (71 of 71 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/de/

Translated using Weblate (German)

Currently translated at 100.0% (140 of 140 strings)

Translation: Habitica/Quests
Translate-URL: https://translate.habitica.com/projects/habitica/quests/de/

Translated using Weblate (German)

Currently translated at 100.0% (140 of 140 strings)

Translation: Habitica/Quests
Translate-URL: https://translate.habitica.com/projects/habitica/quests/de/

Translated using Weblate (German)

Currently translated at 100.0% (489 of 489 strings)

Translation: Habitica/Groups
Translate-URL: https://translate.habitica.com/projects/habitica/groups/de/

Translated using Weblate (German)

Currently translated at 100.0% (489 of 489 strings)

Translation: Habitica/Groups
Translate-URL: https://translate.habitica.com/projects/habitica/groups/de/

Translated using Weblate (German)

Currently translated at 99.5% (211 of 212 strings)

Translation: Habitica/Settings
Translate-URL: https://translate.habitica.com/projects/habitica/settings/de/

Merge branch 'origin/develop' into Weblate.

Translated using Weblate (Spanish (Latin America))

Currently translated at 90.6% (621 of 685 strings)

Translation: Habitica/Questscontent
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/es_419/

Translated using Weblate (Spanish (Latin America))

Currently translated at 100.0% (67 of 67 strings)

Translation: Habitica/Messages
Translate-URL: https://translate.habitica.com/projects/habitica/messages/es_419/

Translated using Weblate (Spanish (Latin America))

Currently translated at 100.0% (134 of 134 strings)

Translation: Habitica/Challenge
Translate-URL: https://translate.habitica.com/projects/habitica/challenge/es_419/

Translated using Weblate (Polish)

Currently translated at 100.0% (174 of 174 strings)

Translation: Habitica/Limited
Translate-URL: https://translate.habitica.com/projects/habitica/limited/pl/

Translated using Weblate (Polish)

Currently translated at 100.0% (356 of 356 strings)

Translation: Habitica/Content
Translate-URL: https://translate.habitica.com/projects/habitica/content/pl/

Translated using Weblate (Polish)

Currently translated at 100.0% (508 of 508 strings)

Translation: Habitica/Backgrounds
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/pl/

Translated using Weblate (Finnish)

Currently translated at 9.5% (14 of 147 strings)

Translation: Habitica/Pets
Translate-URL: https://translate.habitica.com/projects/habitica/pets/fi/

Translated using Weblate (Finnish)

Currently translated at 0.3% (1 of 328 strings)

Translation: Habitica/Front
Translate-URL: https://translate.habitica.com/projects/habitica/front/fi/

Translated using Weblate (Finnish)

Currently translated at 99.1% (228 of 230 strings)

Translation: Habitica/Character
Translate-URL: https://translate.habitica.com/projects/habitica/character/fi/

Translated using Weblate (Finnish)

Currently translated at 81.8% (416 of 508 strings)

Translation: Habitica/Backgrounds
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/fi/

Translated using Weblate (Finnish)

Currently translated at 92.0% (127 of 138 strings)

Translation: Habitica/Quests
Translate-URL: https://translate.habitica.com/projects/habitica/quests/fi/

Translated using Weblate (Finnish)

Currently translated at 64.6% (42 of 65 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/fi/

Translated using Weblate (Finnish)

Currently translated at 85.4% (1744 of 2041 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/fi/

Translated using Weblate (Finnish)

Currently translated at 98.5% (208 of 211 strings)

Translation: Habitica/Settings
Translate-URL: https://translate.habitica.com/projects/habitica/settings/fi/

Translated using Weblate (Spanish (Latin America))

Currently translated at 85.4% (585 of 685 strings)

Translation: Habitica/Questscontent
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/es_419/

Translated using Weblate (Spanish (Latin America))

Currently translated at 100.0% (67 of 67 strings)

Translation: Habitica/Messages
Translate-URL: https://translate.habitica.com/projects/habitica/messages/es_419/

Translated using Weblate (Spanish (Latin America))

Currently translated at 100.0% (31 of 31 strings)

Translation: Habitica/Maintenance
Translate-URL: https://translate.habitica.com/projects/habitica/maintenance/es_419/

Translated using Weblate (Spanish (Latin America))

Currently translated at 100.0% (27 of 27 strings)

Translation: Habitica/Loginincentives
Translate-URL: https://translate.habitica.com/projects/habitica/loginincentives/es_419/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (36 of 36 strings)

Translation: Habitica/Loadingscreentips
Translate-URL: https://translate.habitica.com/projects/habitica/loadingscreentips/zh_Hans/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (233 of 233 strings)

Translation: Habitica/Subscriber
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/zh_Hans/

Translated using Weblate (English (Pirate))

Currently translated at 100.0% (57 of 57 strings)

Translation: Habitica/Spells
Translate-URL: https://translate.habitica.com/projects/habitica/spells/en@pirate/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (147 of 147 strings)

Translation: Habitica/Pets
Translate-URL: https://translate.habitica.com/projects/habitica/pets/zh_Hans/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (171 of 171 strings)

Translation: Habitica/Npc
Translate-URL: https://translate.habitica.com/projects/habitica/npc/zh_Hans/

Translated using Weblate (Spanish (Latin America))

Currently translated at 100.0% (8 of 8 strings)

Translation: Habitica/Overview
Translate-URL: https://translate.habitica.com/projects/habitica/overview/es_419/

Translated using Weblate (Spanish (Latin America))

Currently translated at 99.1% (228 of 230 strings)

Translation: Habitica/Character
Translate-URL: https://translate.habitica.com/projects/habitica/character/es_419/

Translated using Weblate (Dutch)

Currently translated at 100.0% (67 of 67 strings)

Translation: Habitica/Messages
Translate-URL: https://translate.habitica.com/projects/habitica/messages/nl/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (31 of 31 strings)

Translation: Habitica/Maintenance
Translate-URL: https://translate.habitica.com/projects/habitica/maintenance/zh_Hans/

Translated using Weblate (English (Pirate))

Currently translated at 91.3% (159 of 174 strings)

Translation: Habitica/Limited
Translate-URL: https://translate.habitica.com/projects/habitica/limited/en@pirate/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (485 of 485 strings)

Translation: Habitica/Groups
Translate-URL: https://translate.habitica.com/projects/habitica/groups/zh_Hans/

Translated using Weblate (English (Pirate))

Currently translated at 100.0% (485 of 485 strings)

Translation: Habitica/Groups
Translate-URL: https://translate.habitica.com/projects/habitica/groups/en@pirate/

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (2041 of 2041 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hant/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (298 of 298 strings)

Translation: Habitica/Generic
Translate-URL: https://translate.habitica.com/projects/habitica/generic/zh_Hans/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (328 of 328 strings)

Translation: Habitica/Front
Translate-URL: https://translate.habitica.com/projects/habitica/front/zh_Hans/

Translated using Weblate (Dutch)

Currently translated at 99.6% (327 of 328 strings)

Translation: Habitica/Front
Translate-URL: https://translate.habitica.com/projects/habitica/front/nl/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (56 of 56 strings)

Translation: Habitica/Faq
Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hans/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (685 of 685 strings)

Translation: Habitica/Questscontent
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/zh_Hans/

Translated using Weblate (Dutch)

Currently translated at 99.7% (355 of 356 strings)

Translation: Habitica/Content
Translate-URL: https://translate.habitica.com/projects/habitica/content/nl/

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (230 of 230 strings)

Translation: Habitica/Character
Translate-URL: https://translate.habitica.com/projects/habitica/character/zh_Hant/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (230 of 230 strings)

Translation: Habitica/Character
Translate-URL: https://translate.habitica.com/projects/habitica/character/zh_Hans/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (65 of 65 strings)

Translation: Habitica/Achievements
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/zh_Hans/

Translated using Weblate (Dutch)

Currently translated at 100.0% (211 of 211 strings)

Translation: Habitica/Settings
Translate-URL: https://translate.habitica.com/projects/habitica/settings/nl/

Translated using Weblate (Finnish)

Currently translated at 85.4% (1744 of 2041 strings)

Translation: Habitica/Gear
Translate-URL: https://translate.habitica.com/projects/habitica/gear/fi/

Translated using Weblate (Spanish (Latin America))

Currently translated at 85.2% (584 of 685 strings)

Translation: Habitica/Questscontent
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/es_419/

Translated using Weblate (Spanish (Latin America))

Currently translated at 85.2% (584 of 685 strings)

Translation: Habitica/Questscontent
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/es_419/
2020-02-27 22:04:41 +01:00
Sabe Jones 1bb337d235 4.134.4 2020-02-27 15:00:52 -06:00
Sabe Jones 07d6969764 Merge branch 'develop' into release 2020-02-27 15:00:46 -06:00
Sabe Jones 5807db9053 chore(news): Last Chance Bailey 2020-02-27 15:00:33 -06:00
Matteo Pagliazzi 6543a43854 wip test 2020-02-27 12:16:53 +01:00
Matteo Pagliazzi a046930097 Merge branch 'develop' into stackdriver-winston 2020-02-26 18:40:25 +01:00
Alys 7579bec587 allow another guild to use banned words in appropriate contexts
This commit also puts the list of guilds into alphabetical order.
2020-02-26 07:45:31 +10:00
Alys c1e7fed4d4 move a word from slurs to swears as discussed with beffymaroo and mods 2020-02-26 07:44:36 +10:00
agentx999 bad148148c Enchanted Armoire immediately updates XP stat in header (fixes #11827) (#11884)
* sync user if Armoire gives XP

* user can level up from Armoire

* remove XP amount from Armoire XP notification
2020-02-24 22:19:48 +01:00
Matteo Pagliazzi 0280513a00 improvements to apidocs comments (#11832)
* make corrections and improvements to apidocs (no code changes)

* make further minor tweaks to apidocs that were previously changed

* make one extra small change for consistency

* fix lines that are too long

Each line was fixed by one of these:
- changing the wording
- breaking into separate lines
- adding eslint-disable-line max-len (necessary for `@api ` lines because
a line break there causes the first part of the text to not be displayed
on the apidocs website)

* apply eslint-disable max-len around block comments that need to have a long line

The `@api ` lines can't have a line break in them because it would
cause the first part of the text to not be displayed on the apidocs
website.

Using `// eslint-disable-line max-len` at the end of an `@api `
line doesn't work, possibly because it's nesting a comment inside
a multi-line comment.

The only way I've found to ignore the `max-len` rule is to put
disable and enable comments around the whole comment block.
2020-02-24 21:22:29 +01:00
Sabe Jones e502588abc Improve G1G1 process (#11792)
* WIP(g1g1): notif

* WIP(g1g1): notif cont'd

* WIP(gifting): partial modal implementation

* feat(gifting): select giftee modal

* fix(gifting): notification order, modal dismiss

* fix(modals): correct some repops

* fix(gifting): style updates

* fix(modals): new dismiss logic

* fix(modals): new dismiss no go??

* refactor(close): catch up with dismiss functionality

* refactor(g1g1): optimizations
2020-02-24 16:54:56 +01:00
Matteo Pagliazzi 5718d8396d build(deps): bump svg-inline-loader in /website/client (#11891)
Bumps [svg-inline-loader](https://github.com/sairion/svg-inline-loader) from 0.8.0 to 0.8.2.
- [Release notes](https://github.com/sairion/svg-inline-loader/releases)
- [Changelog](https://github.com/webpack-contrib/svg-inline-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sairion/svg-inline-loader/compare/v0.8.0...v0.8.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-24 14:29:55 +01:00
dependabot-preview[bot] b59a63ecbe build(deps): bump bootstrap-vue from 2.4.2 to 2.5.0 in /website/client (#11893)
Bumps [bootstrap-vue](https://github.com/bootstrap-vue/bootstrap-vue) from 2.4.2 to 2.5.0.
- [Release notes](https://github.com/bootstrap-vue/bootstrap-vue/releases)
- [Changelog](https://github.com/bootstrap-vue/bootstrap-vue/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/bootstrap-vue/bootstrap-vue/compare/v2.4.2...v2.5.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-24 14:29:39 +01:00
dependabot-preview[bot] f0465aab5e build(deps): bump inspectpack from 4.3.1 to 4.4.0 in /website/client (#11892)
Bumps [inspectpack](https://github.com/FormidableLabs/inspectpack) from 4.3.1 to 4.4.0.
- [Release notes](https://github.com/FormidableLabs/inspectpack/releases)
- [Changelog](https://github.com/FormidableLabs/inspectpack/blob/master/HISTORY.md)
- [Commits](https://github.com/FormidableLabs/inspectpack/compare/v4.3.1...v4.4.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-24 14:29:29 +01:00
dependabot-preview[bot] 39ee78127c build(deps): bump eslint-plugin-vue in /website/client (#11894)
Bumps [eslint-plugin-vue](https://github.com/vuejs/eslint-plugin-vue) from 6.2.0 to 6.2.1.
- [Release notes](https://github.com/vuejs/eslint-plugin-vue/releases)
- [Commits](https://github.com/vuejs/eslint-plugin-vue/compare/v6.2.0...v6.2.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-24 14:29:04 +01:00
Matteo Pagliazzi 4658025f3f build(deps-dev): bump sinon-chai from 3.4.0 to 3.5.0 (#11895)
Bumps [sinon-chai](https://github.com/domenic/sinon-chai) from 3.4.0 to 3.5.0.
- [Release notes](https://github.com/domenic/sinon-chai/releases)
- [Changelog](https://github.com/domenic/sinon-chai/blob/master/CHANGELOG.md)
- [Commits](https://github.com/domenic/sinon-chai/compare/3.4.0...3.5.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-24 14:28:53 +01:00
dependabot-preview[bot] 46417b4124 build(deps): bump superagent from 5.2.1 to 5.2.2 (#11896)
Bumps [superagent](https://github.com/visionmedia/superagent) from 5.2.1 to 5.2.2.
- [Release notes](https://github.com/visionmedia/superagent/releases)
- [Changelog](https://github.com/visionmedia/superagent/blob/master/HISTORY.md)
- [Commits](https://github.com/visionmedia/superagent/compare/v5.2.1...v5.2.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-24 14:28:37 +01:00
dependabot-preview[bot] 706a7b441a build(deps): bump aws-sdk from 2.619.0 to 2.624.0 (#11897)
Bumps [aws-sdk](https://github.com/aws/aws-sdk-js) from 2.619.0 to 2.624.0.
- [Release notes](https://github.com/aws/aws-sdk-js/releases)
- [Changelog](https://github.com/aws/aws-sdk-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-js/compare/v2.619.0...v2.624.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-24 14:28:26 +01:00
dependabot-preview[bot] a8baa8fcfe build(deps): bump mongoose from 5.8.11 to 5.9.2 (#11901)
Bumps [mongoose](https://github.com/Automattic/mongoose) from 5.8.11 to 5.9.2.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/History.md)
- [Commits](https://github.com/Automattic/mongoose/compare/5.8.11...5.9.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-24 14:28:14 +01:00
dependabot-preview[bot] 368cf91e32 build(deps-dev): bump sinon-chai from 3.4.0 to 3.5.0
Bumps [sinon-chai](https://github.com/domenic/sinon-chai) from 3.4.0 to 3.5.0.
- [Release notes](https://github.com/domenic/sinon-chai/releases)
- [Changelog](https://github.com/domenic/sinon-chai/blob/master/CHANGELOG.md)
- [Commits](https://github.com/domenic/sinon-chai/compare/3.4.0...3.5.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-24 08:12:17 +00:00
dependabot-preview[bot] 23fc969432 build(deps): bump svg-inline-loader in /website/client
Bumps [svg-inline-loader](https://github.com/sairion/svg-inline-loader) from 0.8.0 to 0.8.2.
- [Release notes](https://github.com/sairion/svg-inline-loader/releases)
- [Changelog](https://github.com/webpack-contrib/svg-inline-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sairion/svg-inline-loader/compare/v0.8.0...v0.8.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-24 08:08:33 +00:00
Matteo Pagliazzi 6a5e1dda0e fixes 2020-02-20 20:58:42 +01:00
Matteo Pagliazzi 70326e5b5b upgrade loggly transport 2020-02-20 20:54:32 +01:00
Matteo Pagliazzi c91c152b53 fix error messages in console 2020-02-20 20:51:16 +01:00
Matteo Pagliazzi 362313fe0a fix info messages 2020-02-20 20:05:58 +01:00
Matteo Pagliazzi ed5dfd0228 start upgrading winston 2020-02-20 19:37:31 +01:00
Alys 0891908cba Merge remote-tracking branch 'upstream/develop' into apidocs-comment-fixes 2020-02-20 09:47:44 +10:00
MynahMarie b9a3ee7f30 remove unecessary checks for addlNotes in getItemInfo.js 2020-02-18 12:42:59 +02:00
MynahMarie ea3938a91e call t on eventAvailabitily and intergrate change from develop branch 2020-02-18 11:45:57 +02:00
MynahMarie fdfbade493 fix merge conflict 2020-02-18 11:06:50 +02:00
Alys 15976e906a apply eslint-disable max-len around block comments that need to have a long line
The `@api ` lines can't have a line break in them because it would
cause the first part of the text to not be displayed on the apidocs
website.

Using `// eslint-disable-line max-len` at the end of an `@api `
line doesn't work, possibly because it's nesting a comment inside
a multi-line comment.

The only way I've found to ignore the `max-len` rule is to put
disable and enable comments around the whole comment block.
2020-02-08 16:06:00 +10:00
Alys ac52da5be2 fix lines that are too long
Each line was fixed by one of these:
- changing the wording
- breaking into separate lines
- adding eslint-disable-line max-len (necessary for `@api ` lines because
a line break there causes the first part of the text to not be displayed
on the apidocs website)
2020-02-08 14:55:21 +10:00
Alys 1b39338eec make one extra small change for consistency 2020-02-08 14:30:48 +10:00
Alys 6fe87a8140 make further minor tweaks to apidocs that were previously changed 2020-02-08 14:26:01 +10:00
Alys c5d0ff63a5 make corrections and improvements to apidocs (no code changes) 2020-02-08 14:12:20 +10:00
MynahMarie 301b171f55 Merge branch 'develop' into fix_addlNotes 2020-02-05 10:53:52 +02:00
MynahMarie 08baa2ca20 remove package-lock.json from PR 2020-02-05 10:44:45 +02:00
MynahMarie 7c83cfe9b4 fix merge conflicts 2020-02-03 16:23:47 +02:00
MynahMarie 3045be3ddf ref issue #11794 - Add error check in _addlNotes field. 2020-02-02 14:56:20 +02:00
MynahMarie 81c58d2122 update package.json 2020-02-02 11:54:45 +02:00
406 changed files with 27923 additions and 26585 deletions
-2
View File
@@ -1,8 +1,6 @@
Habitica ![Build Status](https://github.com/HabitRPG/habitica/workflows/Test/badge.svg) [![Code Climate](https://codeclimate.com/github/HabitRPG/habitrpg.svg)](https://codeclimate.com/github/HabitRPG/habitrpg) [![Bountysource](https://api.bountysource.com/badge/tracker?tracker_id=68393)](https://www.bountysource.com/trackers/68393-habitrpg?utm_source=68393&utm_medium=shield&utm_campaign=TRACKER_BADGE) [![Open Source Helpers](https://www.codetriage.com/habitrpg/habitica/badges/users.svg)](https://www.codetriage.com/habitrpg/habitica)
===============
[![Greenkeeper badge](https://badges.greenkeeper.io/HabitRPG/habitica.svg)](https://greenkeeper.io/)
[Habitica](https://habitica.com) is an open source habit building program which treats your life like a Role Playing Game. Level up as you succeed, lose HP as you fail, earn money to buy weapons and armor.
**We need more programmers!** Your assistance will be greatly appreciated. The wiki pages below and the additional pages they link to will tell you how to get started on contributing code and where you can go to seek further help or ask questions:
+2 -2
View File
@@ -32,7 +32,7 @@
"LOGGLY_SUBDOMAIN": "example-subdomain",
"LOGGLY_TOKEN": "example-token",
"MAINTENANCE_MODE": "false",
"NODE_DB_URI": "mongodb://localhost/habitrpg",
"NODE_DB_URI": "mongodb://localhost:27017/habitrpg",
"MONGODB_POOL_SIZE": "10",
"NODE_ENV": "development",
"PATH": "bin:node_modules/.bin:/usr/local/bin:/usr/bin:/bin",
@@ -70,7 +70,7 @@
"SLACK_URL": "https://hooks.slack.com/services/some-url",
"STRIPE_API_KEY": "aaaabbbbccccddddeeeeffff00001111",
"STRIPE_PUB_KEY": "22223333444455556666777788889999",
"TEST_DB_URI": "mongodb://localhost/habitrpg_test",
"TEST_DB_URI": "mongodb://localhost:27017/habitrpg_test",
"TRANSIFEX_SLACK_CHANNEL": "transifex",
"WEB_CONCURRENCY": 1,
"SKIP_SSL_CHECK_KEY": "key",
+5 -2
View File
@@ -8,13 +8,16 @@ const BASE_URL = nconf.get('BASE_URL');
const EMAIL_SLUG = 'mandrill-email-slug'; // Set email template to send
const MIGRATION_NAME = 'bulk-email';
const progressCount = 1000;
const progressCount = 250;
let count = 0;
async function updateUser (user) {
count += 1;
if (count % progressCount === 0) console.warn(`${count} ${user._id}`);
if (count % progressCount === 0) {
console.warn(`${count} ${user._id}`);
await new Promise(resolve => setTimeout(resolve, 5000));
}
await sendTxn(
user,
+19 -9
View File
@@ -3,7 +3,7 @@ import { v4 as uuid } from 'uuid';
import { model as User } from '../../website/server/models/user';
const MIGRATION_NAME = '20190314_pi_day';
const MIGRATION_NAME = '20200314_pi_day';
const progressCount = 1000;
let count = 0;
@@ -24,27 +24,37 @@ async function updateUser (user) {
'items.food.Pie_Red': 1,
};
const set = {};
let push;
set.migration = MIGRATION_NAME;
set['items.gear.owned.head_special_piDay'] = false;
set['items.gear.owned.shield_special_piDay'] = false;
const push = [
{ type: 'marketGear', path: 'gear.flat.head_special_piDay', _id: uuid() },
{ type: 'marketGear', path: 'gear.flat.shield_special_piDay', _id: uuid() },
];
if (typeof user.items.gear.owned.head_special_piDay !== 'undefined') {
push = false;
} else {
set['items.gear.owned.head_special_piDay'] = false;
set['items.gear.owned.shield_special_piDay'] = false;
push = [
{ type: 'marketGear', path: 'gear.flat.head_special_piDay', _id: uuid() },
{ type: 'marketGear', path: 'gear.flat.shield_special_piDay', _id: uuid() },
];
}
if (count % progressCount === 0) console.warn(`${count} ${user._id}`);
if (push) {
return User
.update({ _id: user._id }, { $inc: inc, $set: set, $push: { pinnedItems: { $each: push } } })
.exec();
}
return User
.update({ _id: user._id }, { $inc: inc, $set: set, $push: { pinnedItems: { $each: push } } })
.update({ _id: user._id }, { $inc: inc, $set: set })
.exec();
}
export default async function processUsers () {
const query = {
migration: { $ne: MIGRATION_NAME },
'auth.timestamps.loggedin': { $gt: new Date('2019-02-15') },
'auth.timestamps.loggedin': { $gt: new Date('2020-02-15') },
};
const fields = {
+705 -144
View File
File diff suppressed because it is too large Load Diff
+13 -13
View File
@@ -1,12 +1,12 @@
{
"name": "habitica",
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
"version": "4.134.3",
"version": "4.137.1",
"main": "./website/server/index.js",
"dependencies": {
"@babel/core": "^7.8.4",
"@babel/preset-env": "^7.8.4",
"@babel/register": "^7.8.3",
"@babel/core": "^7.8.7",
"@babel/preset-env": "^7.8.7",
"@babel/register": "^7.8.6",
"@google-cloud/trace-agent": "^4.2.5",
"@slack/client": "^3.8.1",
"accepts": "^1.3.5",
@@ -14,7 +14,7 @@
"amplitude": "^3.5.0",
"apidoc": "^0.17.5",
"apn": "^2.2.0",
"aws-sdk": "^2.619.0",
"aws-sdk": "^2.635.0",
"bcrypt": "^3.0.8",
"body-parser": "^1.18.3",
"compression": "^1.7.4",
@@ -34,10 +34,10 @@
"gulp": "^4.0.0",
"gulp-babel": "^8.0.0",
"gulp-imagemin": "^6.2.0",
"gulp-nodemon": "^2.4.1",
"gulp-nodemon": "^2.5.0",
"gulp.spritesmith": "^6.9.0",
"habitica-markdown": "^1.3.2",
"helmet": "^3.21.2",
"helmet": "^3.21.3",
"image-size": "^0.8.3",
"in-app-purchase": "^1.11.3",
"js2xmlparser": "^4.0.1",
@@ -46,7 +46,7 @@
"method-override": "^3.0.0",
"moment": "^2.24.0",
"moment-recur": "^1.0.7",
"mongoose": "^5.8.11",
"mongoose": "^5.9.3",
"morgan": "^1.7.0",
"nconf": "^0.10.0",
"node-gcm": "^1.0.2",
@@ -63,14 +63,14 @@
"rimraf": "^3.0.2",
"short-uuid": "^3.0.0",
"stripe": "^7.15.0",
"superagent": "^5.2.1",
"superagent": "^5.2.2",
"universal-analytics": "^0.4.17",
"useragent": "^2.1.9",
"uuid": "^3.4.0",
"validator": "^11.0.0",
"vinyl-buffer": "^1.0.1",
"winston": "^2.4.3",
"winston-loggly-bulk": "^2.0.2",
"winston": "^3.2.1",
"winston-loggly-bulk": "^3.0.1",
"xml2js": "^0.4.23"
},
"private": true,
@@ -106,14 +106,14 @@
"axios": "^0.19.2",
"chai": "^4.1.2",
"chai-as-promised": "^7.1.1",
"chalk": "^2.4.1",
"chalk": "^3.0.0",
"expect.js": "^0.3.1",
"istanbul": "^1.1.0-alpha.1",
"mocha": "^5.1.1",
"monk": "^7.1.2",
"require-again": "^2.0.0",
"sinon": "^7.2.4",
"sinon-chai": "^3.4.0",
"sinon-chai": "^3.5.0",
"sinon-stub-promise": "^4.0.0"
},
"optionalDependencies": {}
+2 -1
View File
@@ -34,11 +34,12 @@ async function deleteAmplitudeData (userId, email) {
}
async function deleteHabiticaData (user, email) {
const truncatedEmail = email.slice(0, email.indexOf('@'));
await User.update(
{ _id: user._id },
{
$set: {
'auth.local.email': email,
'auth.local.email': user.auth.local.email ? email : `${truncatedEmail}@example.com`,
'auth.local.hashed_password': '$2a$10$QDnNh1j1yMPnTXDEOV38xOePEWFd4X8DSYwAM8XTmqmacG5X0DKjW',
'auth.local.passwordHashMethod': 'bcrypt',
},
+37 -32
View File
@@ -1,14 +1,27 @@
import winston from 'winston';
import logger from '../../../../website/server/libs/logger';
import logger, { _loggerConfig } from '../../../../website/server/libs/logger';
import {
NotFound,
} from '../../../../website/server/libs/errors';
describe('logger', () => {
let logSpy;
let infoSpy;
let warnSpy;
let errorSpy;
const originalLoggingEnabled = _loggerConfig.loggingEnabled;
before(() => { // enable logging in tests
_loggerConfig.loggingEnabled = true;
});
after(() => { // reset value of _loggerConfig.loggingEnabled
_loggerConfig.loggingEnabled = originalLoggingEnabled;
});
beforeEach(() => {
logSpy = sandbox.stub(winston.Logger.prototype, 'log');
infoSpy = sandbox.stub(_loggerConfig.logger, 'info');
warnSpy = sandbox.stub(_loggerConfig.logger, 'warn');
errorSpy = sandbox.stub(_loggerConfig.logger, 'error');
});
afterEach(() => {
@@ -18,8 +31,8 @@ describe('logger', () => {
describe('info', () => {
it('calls winston\'s info log', () => {
logger.info(1, 2, 3);
expect(logSpy).to.be.calledOnce;
expect(logSpy).to.be.calledWith('info', 1, 2, 3);
expect(infoSpy).to.be.calledOnce;
expect(infoSpy).to.be.calledWith(1, 2, 3);
});
});
@@ -27,8 +40,8 @@ describe('logger', () => {
context('non-error object', () => {
it('passes through arguments if the first arg is not an error object', () => {
logger.error(1, 2, 3, 4);
expect(logSpy).to.be.calledOnce;
expect(logSpy).to.be.calledWith('error', 1, 2, 3, 4);
expect(errorSpy).to.be.calledOnce;
expect(errorSpy).to.be.calledWith(1, 2, 3, 4);
});
});
@@ -39,9 +52,8 @@ describe('logger', () => {
data: 1,
}, 2, 3);
expect(logSpy).to.be.calledOnce;
expect(logSpy).to.be.calledWith(
'error',
expect(errorSpy).to.be.calledOnce;
expect(errorSpy).to.be.calledWith(
errInstance.stack,
{ data: 1, fullError: errInstance },
2,
@@ -58,9 +70,8 @@ describe('logger', () => {
fullError: anotherError,
}, 2, 3);
expect(logSpy).to.be.calledOnce;
expect(logSpy).to.be.calledWith(
'error',
expect(errorSpy).to.be.calledOnce;
expect(errorSpy).to.be.calledWith(
errInstance.stack,
{ data: 1, fullError: anotherError },
2,
@@ -73,9 +84,8 @@ describe('logger', () => {
logger.error(errInstance, null, 2, 3);
expect(logSpy).to.be.calledOnce;
expect(logSpy).to.be.calledWith(
'error',
expect(errorSpy).to.be.calledOnce;
expect(errorSpy).to.be.calledWith(
errInstance.stack,
null,
2,
@@ -88,9 +98,8 @@ describe('logger', () => {
logger.error(errInstance, true, 2, 3);
expect(logSpy).to.be.calledOnce;
expect(logSpy).to.be.calledWith(
'error',
expect(errorSpy).to.be.calledOnce;
expect(errorSpy).to.be.calledWith(
errInstance.stack,
true,
2,
@@ -103,9 +112,8 @@ describe('logger', () => {
logger.error(errInstance, { httpCode: 400 }, 2, 3);
expect(logSpy).to.be.calledOnce;
expect(logSpy).to.be.calledWith(
'error',
expect(errorSpy).to.be.calledOnce;
expect(errorSpy).to.be.calledWith(
errInstance.stack,
{ httpCode: 400, fullError: errInstance },
2,
@@ -121,9 +129,8 @@ describe('logger', () => {
httpCode: 502,
}, 2, 3);
expect(logSpy).to.be.calledOnce;
expect(logSpy).to.be.calledWith(
'error',
expect(errorSpy).to.be.calledOnce;
expect(errorSpy).to.be.calledWith(
errInstance.stack,
{ httpCode: 502, isHandledError: true, fullError: errInstance },
2,
@@ -139,9 +146,8 @@ describe('logger', () => {
httpCode: 403,
}, 2, 3);
expect(logSpy).to.be.calledOnce;
expect(logSpy).to.be.calledWith(
'warn',
expect(warnSpy).to.be.calledOnce;
expect(warnSpy).to.be.calledWith(
errInstance.stack,
{ httpCode: 403, isHandledError: true, fullError: errInstance },
2,
@@ -156,9 +162,8 @@ describe('logger', () => {
logger.error(errInstance, {}, 2, 3);
expect(logSpy).to.be.calledOnce;
expect(logSpy).to.be.calledWith(
'error',
expect(errorSpy).to.be.calledOnce;
expect(errorSpy).to.be.calledWith(
errInstance.stack,
{
fullError: {
+4 -37
View File
@@ -34,7 +34,7 @@ describe('response middleware', () => {
expect(res.json).to.be.calledWith({
success: true,
data: { field: 1 },
notifications: [],
notifications: res.locals.user.notifications,
userV: res.locals.user._v,
appVersion: packageInfo.version,
});
@@ -52,7 +52,7 @@ describe('response middleware', () => {
success: true,
data: { field: 1 },
message: 'hello',
notifications: [],
notifications: res.locals.user.notifications,
userV: res.locals.user._v,
appVersion: packageInfo.version,
});
@@ -69,7 +69,7 @@ describe('response middleware', () => {
expect(res.json).to.be.calledWith({
success: false,
data: { field: 1 },
notifications: [],
notifications: res.locals.user.notifications,
userV: res.locals.user._v,
appVersion: packageInfo.version,
});
@@ -84,42 +84,9 @@ describe('response middleware', () => {
expect(res.json).to.be.calledWith({
success: true,
data: { field: 1 },
notifications: [],
notifications: res.locals.user.notifications,
userV: 0,
appVersion: packageInfo.version,
});
});
it('returns notifications if a user is authenticated', () => {
const { user } = res.locals;
user.notifications = [
null, // invalid, not an object
{ seen: true }, // invalid, no type or id
{ id: 123 }, // invalid, no type
// invalid, no id, not included here because the id would be added automatically
// {type: 'ABC'},
{ type: 'ABC', id: '123' }, // valid
];
responseMiddleware(req, res, next);
res.respond(200, { field: 1 });
expect(res.json).to.be.calledOnce;
expect(res.json).to.be.calledWith({
success: true,
data: { field: 1 },
notifications: [
{
type: 'ABC',
id: '123',
data: {},
seen: false,
},
],
userV: res.locals.user._v,
appVersion: packageInfo.version,
});
});
});
+18
View File
@@ -0,0 +1,18 @@
import { sanitizeText } from '../../../../website/server/models/message';
import { MAX_MESSAGE_LENGTH } from '../../../../website/common/script/constants';
describe('Message Model', () => {
context('sanitizeText', () => {
it('trims messages to the max length', () => {
const veryLongMessage = `
123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789.
THIS PART WON'T BE IN THE MESSAGE (over 3000)
`;
expect(veryLongMessage.length > MAX_MESSAGE_LENGTH).to.equal(true);
const sanitizedText = sanitizeText(veryLongMessage);
expect(sanitizedText).to.not.contain('MESSAGE');
expect(sanitizedText.length).to.equal(MAX_MESSAGE_LENGTH);
});
});
});
+33
View File
@@ -0,0 +1,33 @@
import { model as PushDevice } from '../../../../website/server/models/pushDevice';
describe('PushDevice Model', () => {
context('cleanupCorruptData', () => {
it('converts an array of push devices to a safe version', () => {
const pushDevices = [
null, // invalid, not an object
{ regId: '123' }, // invalid, no type
{ type: 'android' }, // invalid, no regId
new PushDevice({ type: 'android', regId: '1234' }), // valid
];
const safePushDevices = PushDevice.cleanupCorruptData(pushDevices);
expect(safePushDevices.length).to.equal(1);
expect(safePushDevices[0].type).to.equal('android');
expect(safePushDevices[0].regId).to.equal('1234');
});
it('removes duplicates', () => {
const pushDevices = [
new PushDevice({ type: 'android', regId: '1234' }),
new PushDevice({ type: 'android', regId: '1234' }),
new PushDevice({ type: 'iphone', regId: '1234' }), // not duplicate
new PushDevice({ type: 'android', regId: '12345' }), // not duplicate
];
const safePushDevices = PushDevice.cleanupCorruptData(pushDevices);
expect(safePushDevices.length).to.equal(3);
expect(safePushDevices[0].type).to.equal('android');
expect(safePushDevices[0].regId).to.equal('1234');
});
});
});
+19
View File
@@ -0,0 +1,19 @@
import { model as Tag } from '../../../../website/server/models/tag';
describe('Tag Model', () => {
context('cleanupCorruptData', () => {
it('converts an array of tags to a safe version', () => {
const tags = [
null, // invalid, not an object
{ name: '123' }, // invalid, no id
{ id: '123' }, // invalid, no name
new Tag({ name: 'ABC', id: 123 }), // valid
];
const safetags = Tag.cleanupCorruptData(tags);
expect(safetags.length).to.equal(1);
expect(safetags[0].name).to.equal('ABC');
expect(safetags[0].id).to.equal('123');
});
});
});
+140 -20
View File
@@ -181,6 +181,146 @@ describe('User Model', () => {
});
});
context('post init', () => {
it('removes invalid tags when loading the user', async () => {
let user = new User();
await user.save();
await user.update({
$set: {
tags: [
null, // invalid, not an object
// { name: '123' }, // invalid, no id - generated automatically
{ id: '123' }, // invalid, no name
{ name: 'ABC', id: '1234' }, // valid
],
},
}).exec();
user = await User.findById(user._id).exec();
const userToJSON = user.toJSON();
expect(userToJSON.tags.length).to.equal(1);
expect(userToJSON.tags[0]).to.have.all.keys(['id', 'name']);
expect(userToJSON.tags[0].id).to.equal('1234');
expect(userToJSON.tags[0].name).to.equal('ABC');
});
it('removes invalid push devices when loading the user', async () => {
let user = new User();
await user.save();
await user.update({
$set: {
pushDevices: [
null, // invalid, not an object
{ regId: '123' }, // invalid, no type
{ type: 'android' }, // invalid, no regId
{ type: 'android', regId: '1234' }, // valid
],
},
}).exec();
user = await User.findById(user._id).exec();
const userToJSON = user.toJSON();
expect(userToJSON.pushDevices.length).to.equal(1);
expect(userToJSON.pushDevices[0]).to.have.all.keys(['regId', 'type', 'createdAt', 'updatedAt']);
expect(userToJSON.pushDevices[0].type).to.equal('android');
expect(userToJSON.pushDevices[0].regId).to.equal('1234');
});
it('removes duplicate push devices when loading the user', async () => {
let user = new User();
await user.save();
await user.update({
$set: {
pushDevices: [
{ type: 'android', regId: '1234' },
{ type: 'android', regId: '1234' },
],
},
}).exec();
user = await User.findById(user._id).exec();
const userToJSON = user.toJSON();
expect(userToJSON.pushDevices.length).to.equal(1);
expect(userToJSON.pushDevices[0]).to.have.all.keys(['regId', 'type', 'createdAt', 'updatedAt']);
expect(userToJSON.pushDevices[0].type).to.equal('android');
expect(userToJSON.pushDevices[0].regId).to.equal('1234');
});
it('removes invalid notifications when loading the user', async () => {
let user = new User();
await user.save();
await user.update({
$set: {
notifications: [
null, // invalid, not an object
{ seen: true }, // invalid, no type or id
{ id: 123 }, // invalid, no type
// invalid, no id, not included here because the id would be added automatically
// {type: 'ABC'},
{ type: 'ABC', id: '123' }, // valid
],
},
}).exec();
user = await User.findById(user._id).exec();
const userToJSON = user.toJSON();
expect(userToJSON.notifications.length).to.equal(1);
expect(userToJSON.notifications[0]).to.have.all.keys(['data', 'id', 'type', 'seen']);
expect(userToJSON.notifications[0].type).to.equal('ABC');
expect(userToJSON.notifications[0].id).to.equal('123');
});
it('removes multiple NEW_CHAT_MESSAGE for the same group', async () => {
let user = new User();
await user.save();
await user.update({
$set: {
notifications: [
{
type: 'NEW_CHAT_MESSAGE',
id: 123,
data: { group: { id: 12345 } },
},
{
type: 'NEW_CHAT_MESSAGE',
id: 1234,
data: { group: { id: 12345 } },
},
{
type: 'NEW_CHAT_MESSAGE',
id: 123,
data: { group: { id: 123456 } },
}, // not duplicate, different group
{
type: 'NEW_CHAT_MESSAGE_DIFF',
id: 123,
data: { group: { id: 12345 } },
}, // not duplicate, different type
],
},
}).exec();
user = await User.findById(user._id).exec();
const userToJSON = user.toJSON();
expect(userToJSON.notifications.length).to.equal(3);
expect(userToJSON.notifications[0]).to.have.all.keys(['data', 'id', 'type', 'seen']);
expect(userToJSON.notifications[0].type).to.equal('NEW_CHAT_MESSAGE');
expect(userToJSON.notifications[0].id).to.equal('123');
expect(userToJSON.notifications[0].data).to.deep.equal({ group: { id: 12345 } });
expect(userToJSON.notifications[0].seen).to.equal(false);
});
});
context('notifications', () => {
it('can add notifications without data', () => {
const user = new User();
@@ -195,26 +335,6 @@ describe('User Model', () => {
expect(userToJSON.notifications[0].seen).to.eql(false);
});
it('removes invalid notifications when calling toJSON', () => {
const user = new User();
user.notifications = [
null, // invalid, not an object
{ seen: true }, // invalid, no type or id
{ id: 123 }, // invalid, no type
// invalid, no id, not included here because the id would be added automatically
// {type: 'ABC'},
{ type: 'ABC', id: '123' }, // valid
];
const userToJSON = user.toJSON();
expect(userToJSON.notifications.length).to.equal(1);
expect(userToJSON.notifications[0]).to.have.all.keys(['data', 'id', 'type', 'seen']);
expect(userToJSON.notifications[0].type).to.equal('ABC');
expect(userToJSON.notifications[0].id).to.equal('123');
});
it('can add notifications with data and already marked as seen', () => {
const user = new User();
+39 -6
View File
@@ -1,7 +1,7 @@
import { model as UserNotification } from '../../../../website/server/models/userNotification';
describe('UserNotification Model', () => {
context('convertNotificationsToSafeJson', () => {
context('cleanupCorruptData', () => {
it('converts an array of notifications to a safe version', () => {
const notifications = [
null, // invalid, not an object
@@ -11,11 +11,44 @@ describe('UserNotification Model', () => {
new UserNotification({ type: 'ABC', id: 123 }), // valid
];
const notificationsToJSON = UserNotification.convertNotificationsToSafeJson(notifications);
expect(notificationsToJSON.length).to.equal(1);
expect(notificationsToJSON[0]).to.have.all.keys(['data', 'id', 'type', 'seen']);
expect(notificationsToJSON[0].type).to.equal('ABC');
expect(notificationsToJSON[0].id).to.equal('123');
const safeNotifications = UserNotification.cleanupCorruptData(notifications);
expect(safeNotifications.length).to.equal(1);
expect(safeNotifications[0].data).to.deep.equal({});
expect(safeNotifications[0].seen).to.equal(false);
expect(safeNotifications[0].type).to.equal('ABC');
expect(safeNotifications[0].id).to.equal('123');
});
it('removes multiple NEW_CHAT_MESSAGE for the same group', () => {
const notifications = [
new UserNotification({
type: 'NEW_CHAT_MESSAGE',
id: 123,
data: { group: { id: 12345 } },
}),
new UserNotification({
type: 'NEW_CHAT_MESSAGE',
id: 1234,
data: { group: { id: 12345 } },
}),
new UserNotification({
type: 'NEW_CHAT_MESSAGE',
id: 123,
data: { group: { id: 123456 } },
}), // not duplicate, different group
new UserNotification({
type: 'NEW_CHAT_MESSAGE_DIFF',
id: 123,
data: { group: { id: 12345 } },
}), // not duplicate, different type
];
const safeNotifications = UserNotification.cleanupCorruptData(notifications);
expect(safeNotifications.length).to.equal(3);
expect(safeNotifications[0].data).to.deep.equal({ group: { id: 12345 } });
expect(safeNotifications[0].seen).to.equal(false);
expect(safeNotifications[0].type).to.equal('NEW_CHAT_MESSAGE');
expect(safeNotifications[0].id).to.equal('123');
});
});
});
@@ -187,8 +187,7 @@ describe('GET challenges/groups/:groupId', () => {
});
context('official challenge is present', () => {
let publicGuild; let user; let officialChallenge; let challenge; let
challenge2;
let publicGuild; let user; let officialChallenge; let unofficialChallenges;
before(async () => {
const { group, groupLeader } = await createAndPopulateGroup({
@@ -214,10 +213,14 @@ describe('GET challenges/groups/:groupId', () => {
});
await user.post(`/challenges/${officialChallenge._id}/join`);
challenge = await generateChallenge(user, group);
await user.post(`/challenges/${challenge._id}/join`);
challenge2 = await generateChallenge(user, group);
await user.post(`/challenges/${challenge2._id}/join`);
// We add 10 extra challenges to test whether the official challenge
// (the oldest) makes it to the front page.
unofficialChallenges = [];
for (let i = 0; i < 10; i += 1) {
const challenge = await generateChallenge(user, group); // eslint-disable-line
await user.post(`/challenges/${challenge._id}/join`); // eslint-disable-line
unofficialChallenges.push(challenge);
}
});
it('should return official challenges first', async () => {
@@ -230,18 +233,17 @@ describe('GET challenges/groups/:groupId', () => {
it('should return newest challenges first, after official ones', async () => {
let challenges = await user.get(`/challenges/groups/${publicGuild._id}`);
let foundChallengeIndex = _.findIndex(challenges, { _id: challenge._id });
expect(foundChallengeIndex).to.eql(2);
foundChallengeIndex = _.findIndex(challenges, { _id: challenge2._id });
expect(foundChallengeIndex).to.eql(1);
unofficialChallenges.forEach((chal, index) => {
const foundChallengeIndex = _.findIndex(challenges, { _id: chal._id });
expect(foundChallengeIndex).to.eql(10 - index);
});
const newChallenge = await generateChallenge(user, publicGuild);
await user.post(`/challenges/${newChallenge._id}/join`);
challenges = await user.get(`/challenges/groups/${publicGuild._id}`);
foundChallengeIndex = _.findIndex(challenges, { _id: newChallenge._id });
const foundChallengeIndex = _.findIndex(challenges, { _id: newChallenge._id });
expect(foundChallengeIndex).to.eql(1);
});
});
@@ -242,7 +242,7 @@ describe('GET challenges/user', () => {
});
context('official challenge is present', () => {
let user; let officialChallenge; let challenge; let challenge2; let
let user; let officialChallenge; let unofficialChallenges; let
publicGuild;
before(async () => {
@@ -270,10 +270,14 @@ describe('GET challenges/user', () => {
});
await user.post(`/challenges/${officialChallenge._id}/join`);
challenge = await generateChallenge(user, group);
await user.post(`/challenges/${challenge._id}/join`);
challenge2 = await generateChallenge(user, group);
await user.post(`/challenges/${challenge2._id}/join`);
// We add 10 extra challenges to test whether the official challenge
// (the oldest) makes it to the front page.
unofficialChallenges = [];
for (let i = 0; i < 10; i += 1) {
const challenge = await generateChallenge(user, group); // eslint-disable-line
await user.post(`/challenges/${challenge._id}/join`); // eslint-disable-line
unofficialChallenges.push(challenge);
}
});
it('should return official challenges first', async () => {
@@ -284,20 +288,23 @@ describe('GET challenges/user', () => {
});
it('should return newest challenges first, after official ones', async () => {
let challenges = await user.get('/challenges/user');
let challenges = await user.get('/challenges/user?page=0');
let foundChallengeIndex = _.findIndex(challenges, { _id: challenge._id });
expect(foundChallengeIndex).to.eql(2);
foundChallengeIndex = _.findIndex(challenges, { _id: challenge2._id });
expect(foundChallengeIndex).to.eql(1);
unofficialChallenges.forEach((chal, index) => {
const foundChallengeIndex = _.findIndex(challenges, { _id: chal._id });
if (index === 0) {
expect(foundChallengeIndex).to.eql(-1);
} else {
expect(foundChallengeIndex).to.eql(10 - index);
}
});
const newChallenge = await generateChallenge(user, publicGuild);
await user.post(`/challenges/${newChallenge._id}/join`);
challenges = await user.get('/challenges/user');
foundChallengeIndex = _.findIndex(challenges, { _id: newChallenge._id });
const foundChallengeIndex = _.findIndex(challenges, { _id: newChallenge._id });
expect(foundChallengeIndex).to.eql(1);
});
});
+22 -3
View File
@@ -13,7 +13,7 @@ import {
SPAM_MIN_EXEMPT_CONTRIB_LEVEL,
TAVERN_ID,
} from '../../../../../website/server/models/group';
import { CHAT_FLAG_FROM_SHADOW_MUTE } from '../../../../../website/common/script/constants';
import { CHAT_FLAG_FROM_SHADOW_MUTE, MAX_MESSAGE_LENGTH } from '../../../../../website/common/script/constants';
import { getMatchesByWordArray } from '../../../../../website/server/libs/stringUtils';
import bannedWords from '../../../../../website/server/libs/bannedWords';
import guildsAllowingBannedWords from '../../../../../website/server/libs/guildsAllowingBannedWords';
@@ -494,6 +494,7 @@ describe('POST /chat', () => {
123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789.
THIS PART WON'T BE IN THE MESSAGE (over 3000)
`;
expect(veryLongMessage.length > MAX_MESSAGE_LENGTH).to.equal(true);
const newMessage = await user.post(`/groups/${groupWithChat._id}/chat`, { message: veryLongMessage });
const groupMessages = await user.get(`/groups/${groupWithChat._id}/chat`);
@@ -501,9 +502,27 @@ describe('POST /chat', () => {
expect(newMessage.message.id).to.exist;
expect(groupMessages[0].id).to.exist;
expect(newMessage.message.text.length).to.eql(3000);
expect(newMessage.message.text.length).to.eql(MAX_MESSAGE_LENGTH);
expect(newMessage.message.text).to.not.contain('MESSAGE');
expect(groupMessages[0].text.length).to.eql(3000);
expect(groupMessages[0].text.length).to.eql(MAX_MESSAGE_LENGTH);
});
it('chat message with mentions - mention link should not count towards 3000 chars limit', async () => {
const memberUsername = 'memberUsername';
await member.update({ 'auth.local.username': memberUsername });
const messageWithMentions = `hi @${memberUsername} 123456789
123456789 123456789 123456789 123456789 123456789 123456789 89 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 12345678 END.`;
expect(messageWithMentions.length).to.equal(MAX_MESSAGE_LENGTH);
const newMessage = await user.post(`/groups/${groupWithChat._id}/chat`, { message: messageWithMentions });
const groupMessages = await user.get(`/groups/${groupWithChat._id}/chat`);
const mentionLink = `[@${memberUsername}](/profile/${member._id})`;
expect(newMessage.message.text).to.include(mentionLink);
expect(newMessage.message.text).to.include(' END.');
expect(newMessage.message.text.length)
.to.eql(messageWithMentions.length - (`@${memberUsername}`).length + mentionLink.length);
expect(groupMessages[0].text.length).to.eql(newMessage.message.text.length);
});
it('creates a chat with user styles', async () => {
@@ -17,7 +17,7 @@ describe('payments - stripe - #checkout', () => {
await expect(user.post(endpoint, { id: 123 })).to.eventually.be.rejected.and.include({
code: 401,
error: 'Error',
message: 'Invalid API Key provided: aaaabbbb********************1111',
// message: 'Invalid API Key provided: aaaabbbb********************1111',
});
});
@@ -125,7 +125,7 @@ describe('PUT /user', () => {
context('Sub-Level Protected Operations', () => {
const protectedOperations = {
'class stat': { 'stats.class': 'wizard' },
'flags unless whitelisted': { 'flags.dropsEnabled': true },
'flags unless whitelisted': { 'flags.chatRevoked': true },
webhooks: { 'preferences.webhooks': [1, 2, 3] },
sleep: { 'preferences.sleep': true },
'disable classes': { 'preferences.disableClasses': true },
+1 -1
View File
@@ -109,7 +109,7 @@ describe('PUT /user', () => {
context('Sub-Level Protected Operations', () => {
const protectedOperations = {
'class stat': { 'stats.class': 'wizard' },
'flags unless whitelisted': { 'flags.dropsEnabled': true },
'flags unless whitelisted': { 'flags.chatRevoked': true },
webhooks: { 'preferences.webhooks': [1, 2, 3] },
sleep: { 'preferences.sleep': true },
'disable classes': { 'preferences.disableClasses': true },
+9 -5
View File
@@ -15,6 +15,7 @@ describe('common.fns.randomDrop', () => {
beforeEach(() => {
user = generateUser();
user._tmp = user._tmp ? user._tmp : {};
user.items.eggs.Wolf = 0;
task = generateTodo({ userId: user._id });
predictableRandom = sandbox.stub().returns(0.5);
});
@@ -34,10 +35,17 @@ describe('common.fns.randomDrop', () => {
context('drops enabled', () => {
beforeEach(() => {
user.flags.dropsEnabled = true;
task.priority = 100000;
});
it('awards an egg and a hatching potion if user has never received any', () => {
delete user.items.eggs.Wolf;
randomDrop(user, { task, predictableRandom });
expect(user._tmp.firstDrops.egg).to.be.a.string;
expect(user._tmp.firstDrops.hatchingPotion).to.be.a.string;
});
it('does nothing if user.items.lastDrop.count is exceeded', () => {
user.items.lastDrop.count = 100;
randomDrop(user, { task, predictableRandom });
@@ -46,7 +54,6 @@ describe('common.fns.randomDrop', () => {
it('drops something when the task is a todo', () => {
expect(user._tmp).to.eql({});
user.flags.dropsEnabled = true;
predictableRandom.returns(0.1);
randomDrop(user, { task, predictableRandom });
@@ -56,7 +63,6 @@ describe('common.fns.randomDrop', () => {
it('drops something when the task is a habit', () => {
task = generateHabit({ userId: user._id });
expect(user._tmp).to.eql({});
user.flags.dropsEnabled = true;
predictableRandom.returns(0.1);
randomDrop(user, { task, predictableRandom });
@@ -66,7 +72,6 @@ describe('common.fns.randomDrop', () => {
it('drops something when the task is a daily', () => {
task = generateDaily({ userId: user._id });
expect(user._tmp).to.eql({});
user.flags.dropsEnabled = true;
predictableRandom.returns(0.1);
randomDrop(user, { task, predictableRandom });
@@ -76,7 +81,6 @@ describe('common.fns.randomDrop', () => {
it('drops something when the task is a reward', () => {
task = generateReward({ userId: user._id });
expect(user._tmp).to.eql({});
user.flags.dropsEnabled = true;
predictableRandom.returns(0.1);
randomDrop(user, { task, predictableRandom });
+1 -8
View File
@@ -110,13 +110,6 @@ describe('common.fns.updateStats', () => {
expect(user.stats.points).to.eql(10);
});
it('add user notification when drops are enabled', () => {
user.stats.lvl = 3;
updateStats(user, { });
expect(user.addNotification).to.be.calledOnce;
expect(user.addNotification).to.be.calledWith('DROPS_ENABLED');
});
it('add user notification when the user levels up', () => {
const initialLvl = user.stats.lvl;
updateStats(user, {
@@ -131,7 +124,7 @@ describe('common.fns.updateStats', () => {
it('add user notification when rebirth is enabled', () => {
user.stats.lvl = 51;
updateStats(user, { });
expect(user.addNotification).to.be.calledTwice; // once is for drops enabled
expect(user.addNotification).to.be.calledOnce;
expect(user.addNotification).to.be.calledWith('REBIRTH_ENABLED');
});
-2
View File
@@ -173,7 +173,6 @@ describe('shared.ops.rebirth', () => {
it('resets a user\'s flags', () => {
user.flags.itemsEnabled = true;
user.flags.dropsEnabled = true;
user.flags.classSelected = true;
user.flags.rebirthEnabled = true;
user.flags.levelDrops = { test: 'test' };
@@ -181,7 +180,6 @@ describe('shared.ops.rebirth', () => {
rebirth(user);
expect(user.flags.itemsEnabled).to.be.false;
expect(user.flags.dropsEnabled).to.be.false;
expect(user.flags.classSelected).to.be.false;
expect(user.flags.rebirthEnabled).to.be.false;
expect(user.flags.levelDrops).to.be.empty;
+1156 -2007
View File
File diff suppressed because it is too large Load Diff
+18 -18
View File
@@ -13,41 +13,41 @@
"test:unit": "vue-cli-service test:unit --require ./tests/unit/helpers.js"
},
"dependencies": {
"@vue/cli-plugin-babel": "^4.2.2",
"@vue/cli-plugin-eslint": "^4.2.2",
"@vue/cli-plugin-router": "^4.2.2",
"@vue/cli-plugin-unit-mocha": "^4.2.2",
"@vue/cli-service": "^4.2.2",
"@storybook/addon-actions": "^5.3.13",
"@storybook/addon-knobs": "^5.3.13",
"@storybook/addon-links": "^5.3.13",
"@storybook/addon-notes": "^5.3.13",
"@storybook/vue": "^5.3.13",
"@vue/cli-plugin-babel": "^4.2.3",
"@vue/cli-plugin-eslint": "^4.2.3",
"@vue/cli-plugin-router": "^4.2.3",
"@vue/cli-plugin-unit-mocha": "^4.2.3",
"@vue/cli-service": "^4.2.3",
"@storybook/addon-actions": "^5.3.14",
"@storybook/addon-knobs": "^5.3.14",
"@storybook/addon-links": "^5.3.14",
"@storybook/addon-notes": "^5.3.14",
"@storybook/vue": "^5.3.14",
"@vue/test-utils": "1.0.0-beta.29",
"amplitude-js": "^5.9.0",
"axios": "^0.19.2",
"axios-progress-bar": "^1.2.0",
"babel-eslint": "^10.0.1",
"babel-eslint": "^10.1.0",
"bootstrap": "^4.4.1",
"bootstrap-vue": "^2.4.2",
"bootstrap-vue": "^2.6.1",
"chai": "^4.1.2",
"core-js": "^3.6.4",
"eslint": "^6.8.0",
"eslint-config-habitrpg": "^6.2.0",
"eslint-plugin-mocha": "^5.3.0",
"eslint-plugin-vue": "^6.2.0",
"eslint-plugin-vue": "^6.2.2",
"habitica-markdown": "^1.3.2",
"hellojs": "^1.18.4",
"inspectpack": "^4.3.1",
"inspectpack": "^4.4.0",
"intro.js": "^2.9.3",
"jquery": "^3.4.1",
"lodash": "^4.17.15",
"moment": "^2.24.0",
"nconf": "^0.10.0",
"sass": "^1.25.0",
"sass": "^1.26.2",
"sass-loader": "^8.0.2",
"smartbanner.js": "^1.15.0",
"svg-inline-loader": "^0.8.0",
"svg-inline-loader": "^0.8.2",
"svg-url-loader": "^3.0.3",
"svgo": "^1.3.2",
"svgo-loader": "^2.2.1",
@@ -56,11 +56,11 @@
"vue": "^2.6.11",
"vue-cli-plugin-storybook": "^0.6.1",
"vue-mugen-scroll": "^0.2.6",
"vue-router": "^3.1.5",
"vue-router": "^3.1.6",
"vue-template-compiler": "^2.6.11",
"vue2-perfect-scrollbar": "^1.3.0",
"vuedraggable": "^2.23.1",
"vuejs-datepicker": "git://github.com/habitrpg/vuejs-datepicker.git#5d237615463a84a23dd6f3f77c6ab577d68593ec",
"webpack": "^4.41.6"
"webpack": "^4.42.0"
}
}
@@ -1,60 +1,60 @@
.promo_achievement_CottonCandyPink {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -668px -444px;
background-position: -328px -316px;
width: 204px;
height: 102px;
}
.promo_armoire_backgrounds_202002 {
.promo_armoire_backgrounds_202003 {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: 0px -277px;
background-position: 0px -445px;
width: 423px;
height: 147px;
}
.promo_mystery_022020 {
.promo_cosplay {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -668px -148px;
background-position: 0px 0px;
width: 623px;
height: 167px;
}
.promo_hugabug_bundle {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -424px -445px;
width: 420px;
height: 147px;
}
.promo_mystery_202003 {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -624px -211px;
width: 282px;
height: 147px;
}
.promo_pi_day {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: 0px -593px;
width: 273px;
height: 147px;
}
.promo_take_this {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -873px -444px;
background-position: -624px -359px;
width: 96px;
height: 69px;
}
.promo_valentines_2020 {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -668px 0px;
width: 309px;
height: 147px;
}
.promo_valentines_potions {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: 0px -425px;
width: 420px;
height: 147px;
}
.scene_cake {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -424px -277px;
width: 204px;
height: 102px;
}
.scene_dailies {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: 0px 0px;
background-position: 0px -168px;
width: 327px;
height: 276px;
}
.scene_gaining_achievement {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -328px 0px;
background-position: -624px 0px;
width: 339px;
height: 210px;
}
.scene_shanaqui {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -668px -296px;
background-position: -328px -168px;
width: 282px;
height: 147px;
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,420 +1,552 @@
.Pet-Wolf-IcySnow {
.Pet-Whale-Skeleton {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -82px 0px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Peppermint {
.Pet-Whale-White {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -164px -400px;
background-position: -492px -500px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Rainbow {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: 0px -300px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Red {
.Pet-Whale-Zombie {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -164px 0px;
width: 81px;
height: 99px;
}
.Pet-Wolf-RoseQuartz {
.Pet-Wolf-Amber {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: 0px -100px;
width: 81px;
height: 99px;
}
.Pet-Wolf-RoyalPurple {
.Pet-Wolf-Aquatic {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -82px -100px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Ruby {
.Pet-Wolf-Aurora {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -164px -100px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Shade {
.Pet-Wolf-Base {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -246px 0px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Shadow {
.Pet-Wolf-Bronze {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -246px -100px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Shimmer {
.Pet-Wolf-Celestial {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: 0px -200px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Silver {
.Pet-Wolf-CottonCandyBlue {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -82px -200px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Skeleton {
.Pet-Wolf-CottonCandyPink {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -164px -200px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Spooky {
.Pet-Wolf-Cupid {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -246px -200px;
width: 81px;
height: 99px;
}
.Pet-Wolf-StarryNight {
.Pet-Wolf-Desert {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -328px 0px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Sunshine {
.Pet-Wolf-Ember {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -328px -100px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Thunderstorm {
.Pet-Wolf-Fairy {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -328px -200px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Veggie {
.Pet-Wolf-Floral {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: 0px 0px;
background-position: 0px -300px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Veteran {
.Pet-Wolf-Frost {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -82px -300px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Watery {
.Pet-Wolf-Ghost {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -164px -300px;
width: 81px;
height: 99px;
}
.Pet-Wolf-White {
.Pet-Wolf-Glass {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -246px -300px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Zombie {
.Pet-Wolf-Glow {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -328px -300px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Base {
.Pet-Wolf-Golden {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -410px 0px;
width: 81px;
height: 99px;
}
.Pet-Yarn-CottonCandyBlue {
.Pet-Wolf-Holly {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -410px -100px;
width: 81px;
height: 99px;
}
.Pet-Yarn-CottonCandyPink {
.Pet-Wolf-IcySnow {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -410px -200px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Desert {
.Pet-Wolf-Peppermint {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -410px -300px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Golden {
.Pet-Wolf-Rainbow {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -492px 0px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Red {
.Pet-Wolf-Red {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -492px -100px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Shade {
.Pet-Wolf-RoseQuartz {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -492px -200px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Skeleton {
.Pet-Wolf-RoyalPurple {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -492px -300px;
width: 81px;
height: 99px;
}
.Pet-Yarn-White {
.Pet-Wolf-Ruby {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: 0px -400px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Zombie {
.Pet-Wolf-Shade {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -82px -400px;
width: 81px;
height: 99px;
}
.Pet_HatchingPotion_Amber {
.Pet-Wolf-Shadow {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -164px -400px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Shimmer {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -246px -400px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Silver {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -328px -400px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Skeleton {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -410px -400px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Spooky {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -492px -400px;
width: 81px;
height: 99px;
}
.Pet-Wolf-StarryNight {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -574px 0px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Sunshine {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -574px -100px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Thunderstorm {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -574px -200px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Veggie {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -574px -300px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Veteran {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -574px -400px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Watery {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: 0px -500px;
width: 81px;
height: 99px;
}
.Pet-Wolf-White {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -82px -500px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Zombie {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -164px -500px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Base {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -246px -500px;
width: 81px;
height: 99px;
}
.Pet-Yarn-CottonCandyBlue {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -328px -500px;
width: 81px;
height: 99px;
}
.Pet-Yarn-CottonCandyPink {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -410px -500px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Desert {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: 0px 0px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Golden {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -574px -500px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Red {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -656px 0px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Shade {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -656px -100px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Skeleton {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -656px -200px;
width: 81px;
height: 99px;
}
.Pet-Yarn-White {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -656px -300px;
width: 81px;
height: 99px;
}
.Pet-Yarn-Zombie {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -656px -400px;
width: 81px;
height: 99px;
}
.Pet_HatchingPotion_Amber {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: 0px -600px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Aquatic {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -315px -400px;
background-position: -552px -669px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Aurora {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -384px -400px;
background-position: -69px -600px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Base {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -453px -400px;
background-position: -138px -600px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Bronze {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: 0px -638px;
background-position: -207px -600px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Celestial {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -69px -500px;
background-position: -276px -600px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_CottonCandyBlue {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -138px -500px;
background-position: -345px -600px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_CottonCandyPink {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -207px -500px;
background-position: -414px -600px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Cupid {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -276px -500px;
background-position: -483px -600px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Desert {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -345px -500px;
background-position: -552px -600px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Ember {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -414px -500px;
background-position: -621px -600px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Fairy {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -483px -500px;
background-position: 0px -669px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Floral {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -574px 0px;
background-position: -69px -669px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Frost {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -574px -69px;
background-position: -138px -669px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Ghost {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -574px -138px;
background-position: -207px -669px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Glass {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -574px -207px;
background-position: -276px -669px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Glow {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -574px -276px;
background-position: -345px -669px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Golden {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -574px -345px;
background-position: -414px -669px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Holly {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -574px -414px;
background-position: -483px -669px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_IcySnow {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -574px -483px;
background-position: -656px -500px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Peppermint {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: 0px -569px;
background-position: -621px -669px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Purple {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -69px -569px;
background-position: -738px 0px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Rainbow {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -138px -569px;
background-position: -738px -69px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Red {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -207px -569px;
background-position: -738px -138px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_RoseQuartz {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -276px -569px;
background-position: -738px -207px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_RoyalPurple {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -345px -569px;
background-position: -738px -276px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Ruby {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -414px -569px;
background-position: -738px -345px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Shade {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -483px -569px;
background-position: -738px -414px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Shadow {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -552px -569px;
background-position: -738px -483px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Shimmer {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -643px 0px;
background-position: -738px -552px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Silver {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -643px -69px;
background-position: -738px -621px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Skeleton {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -643px -138px;
background-position: 0px -738px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Spooky {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -643px -207px;
background-position: -69px -738px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_StarryNight {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -643px -276px;
background-position: -138px -738px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Sunshine {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -643px -345px;
background-position: -207px -738px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Thunderstorm {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -643px -414px;
background-position: -276px -738px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Watery {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -643px -483px;
background-position: -345px -738px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_White {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: -643px -552px;
background-position: -414px -738px;
width: 68px;
height: 68px;
}
.Pet_HatchingPotion_Zombie {
background-image: url('~@/assets/images/sprites/spritesmith-main-27.png');
background-position: 0px -500px;
background-position: -483px -738px;
width: 68px;
height: 68px;
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 179 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 475 KiB

After

Width:  |  Height:  |  Size: 473 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 672 KiB

After

Width:  |  Height:  |  Size: 658 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 299 KiB

After

Width:  |  Height:  |  Size: 286 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 348 KiB

After

Width:  |  Height:  |  Size: 353 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 182 KiB

After

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 KiB

After

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 164 KiB

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 KiB

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 154 KiB

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 KiB

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 176 KiB

After

Width:  |  Height:  |  Size: 183 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 165 KiB

After

Width:  |  Height:  |  Size: 165 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

After

Width:  |  Height:  |  Size: 163 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 129 KiB

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

After

Width:  |  Height:  |  Size: 138 KiB

+1 -2
View File
@@ -23,7 +23,7 @@ input, textarea, input.form-control, textarea.form-control {
border-radius: 2px;
font-size: 14px;
line-height: 1.43;
color: $gray-200;
color: $gray-50;
border: 1px solid $gray-400;
&:hover:not(:disabled) {
@@ -32,7 +32,6 @@ input, textarea, input.form-control, textarea.form-control {
&:active:not(:disabled), &:focus:not(:disabled) {
border-color: $purple-500;
color: $gray-50;
outline: 0;
box-shadow: none;
}
@@ -1,62 +0,0 @@
<template>
<b-modal
id="drops-enabled"
:title="$t('dropsEnabled')"
size="lg"
:hide-footer="true"
>
<div class="modal-body">
<div class="col-6 offset-3 text-center">
<p></p>
<div class="item-drop-icon Pet_Egg_Wolf"></div>
<span v-html="firstDropText"></span>
<p></p>
<div class="item-drop-icon Pet_Currency_Gem"></div>
<span v-html="$t('useGems')"></span>
</div>
</div>
<div class="modal-footer">
<div class="col-12 text-center">
<button
class="btn btn-primary"
@click="close()"
>
{{ $t('close') }}
</button>
</div>
</div>
</b-modal>
</template>
<style scoped>
.item-drop-icon {
margin: 0 auto;
}
</style>
<script>
import { mapState } from '@/libs/store';
import * as eggs from '@/../../common/script/content/eggs';
export default {
data () {
return {
eggs,
};
},
computed: {
...mapState({ user: 'user.data' }),
firstDropText () {
return this.$t('firstDrop', {
eggText: this.eggs.all.Wolf.text(),
eggNotes: this.eggs.all.Wolf.notes(),
});
},
},
methods: {
close () {
this.$root.$emit('bv::hide::modal', 'drops-enabled');
},
},
};
</script>
@@ -0,0 +1,137 @@
<template>
<b-modal
id="first-drops"
size="md"
:hide-header="true"
:hide-footer="true"
>
<div class="text-center">
<div
class="modal-close"
@click="close()"
>
<div
v-once
class="svg-icon"
v-html="icons.close"
></div>
</div>
<h2
v-once
class="mt-3 mb-4"
>
{{ $t('foundNewItems') }}
</h2>
<div class="d-flex justify-content-center">
<div
class="item-box ml-auto mr-3"
:class="eggClass"
>
</div>
<div
class="item-box mr-auto"
:class="potionClass"
>
</div>
</div>
<p
v-once
class="mt-4"
>
{{ $t('foundNewItemsExplanation') }}
</p>
<p
v-once
class="strong mb-4"
>
{{ $t('foundNewItemsCTA') }}
</p>
<button
v-once
class="btn btn-primary mb-2"
@click="toInventory()"
>
{{ $t('letsgo') }}
</button>
</div>
</b-modal>
</template>
<style lang="scss">
#first-drops {
.modal-body {
padding-left: 1.5rem;
padding-right: 1.5rem;
}
.modal-dialog {
margin-top: 15vh;
width: 21rem;
}
}
</style>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
h2 {
color: $purple-200;
}
.item-box {
background-color: $gray-600;
}
.modal-close {
position: absolute;
width: 18px;
height: 18px;
padding: 4px;
right: 16px;
top: 16px;
cursor: pointer;
.svg-icon {
width: 12px;
height: 12px;
}
}
.strong {
font-weight: bold;
}
</style>
<script>
import closeIcon from '@/assets/svg/close.svg';
export default {
data () {
return {
icons: Object.freeze({
close: closeIcon,
}),
};
},
computed: {
eggClass () {
return `Pet_Egg_${this.$store.state.firstDropsOptions.egg}`;
},
potionClass () {
return `Pet_HatchingPotion_${this.$store.state.firstDropsOptions.hatchingPotion}`;
},
},
methods: {
close () {
this.$store.state.firstDropsOptions = {
egg: '',
hatchingPotion: '',
};
this.$root.$emit('habitica::dismiss-modal', 'first-drops');
},
toInventory () {
this.$router.push('/inventory/items');
this.close();
},
},
};
</script>
@@ -21,7 +21,8 @@
<span v-if="challenge.leader === null">
{{ $t('noChallengeOwner') }}
</span>
<user-link v-else
<user-link
v-else
class="mx-1"
:user="challenge.leader"
/>
+22 -11
View File
@@ -1,10 +1,10 @@
<template>
<b-link
<router-link
v-if="group"
@click.prevent="goToGroup"
:to="toPath"
>
{{ group.name }}
</b-link>
</router-link>
</template>
<script>
@@ -12,15 +12,26 @@ import { TAVERN_ID } from '@/../../common/script/constants';
export default {
props: ['group'],
methods: {
goToGroup () {
if (this.group.type === 'party') {
this.$router.push({ name: 'party' });
} else if (this.group._id === TAVERN_ID) {
this.$router.push({ name: 'tavern' });
} else {
this.$router.push({ name: 'guild', params: { groupId: this.group._id } });
computed: {
toPath () {
if (this.group._id === TAVERN_ID) {
return {
name: 'tavern',
};
}
if (this.group.type === 'party') {
return {
name: 'party',
};
}
return {
name: 'guild',
params: {
groupId: this.group._id,
},
};
},
},
};
@@ -20,7 +20,7 @@
v-model="newMessage"
:placeholder="placeholder"
:class="{'user-entry': newMessage}"
maxlength="3000"
:maxlength="MAX_MESSAGE_LENGTH"
@keydown="updateCarretPosition"
@keyup.ctrl.enter="sendMessageShortcut()"
@keydown.tab="handleTab($event)"
@@ -30,7 +30,7 @@
@keydown.esc="handleEscape($event)"
@paste="disableMessageSendShortcut()"
></textarea>
<span>{{ currentLength }} / 3000</span>
<span>{{ currentLength }} / {{ MAX_MESSAGE_LENGTH }}</span>
<autocomplete
ref="autocomplete"
:text="newMessage"
@@ -91,6 +91,7 @@ import communityGuidelines from './communityGuidelines';
import chatMessage from '../chat/chatMessages';
import { mapState } from '@/libs/store';
import markdownDirective from '@/directives/markdown';
import { MAX_MESSAGE_LENGTH } from '@/../../common/script/constants';
export default {
directives: {
@@ -116,6 +117,7 @@ export default {
LEFT: 0,
},
textbox: this.$refs,
MAX_MESSAGE_LENGTH: MAX_MESSAGE_LENGTH.toString(),
};
},
computed: {
@@ -509,11 +509,7 @@ export default {
// Load invites
}
await this.fetchGuild();
// Fetch group members on load
this.members = await this.loadMembers({
groupId: this.group._id,
includeAllPublicFields: true,
});
this.$root.$on('updatedGroup', group => {
const updatedGroup = extend(this.group, group);
this.$set(this.group, updatedGroup);
@@ -576,6 +572,11 @@ export default {
this.$delete(this.user.newMessages, groupId);
}, 1000);
}
this.members = await this.loadMembers({
groupId: this.group._id,
includeAllPublicFields: true,
});
},
hasUnreadMessages (groupId) {
if (this.user.newMessages[groupId]) return true;
@@ -475,7 +475,7 @@ export default {
return this.$store.state.memberModalOptions.challengeId;
},
sortedMembers () {
let sortedMembers = this.members;
let sortedMembers = this.members.slice(); // shallow clone to avoid infinite loop
if (!isEmpty(this.sortOption)) {
// Use the memberlist filtered by searchTerm
@@ -483,7 +483,13 @@ export default {
// If members are to be sorted by name, use localeCompare for case-
// insensitive sort
sortedMembers.sort(
(a, b) => a.profile.name.localeCompare(b.profile.name),
(a, b) => {
if (this.sortOption.direction === 'desc') {
return b.profile.name.localeCompare(a.profile.name);
}
return a.profile.name.localeCompare(b.profile.name);
},
);
} else {
sortedMembers = orderBy(
+24 -1
View File
@@ -170,7 +170,30 @@ export default {
return Math.floor(this.currentWidth / 140) + 1;
},
sortedPartyMembers () {
return orderBy(this.partyMembers, [this.user.party.order], [this.user.party.orderAscending]);
let sortedMembers = this.partyMembers.slice(); // shallow clone to avoid infinite loop
const { order, orderAscending } = this.user.party;
if (order === 'profile.name') {
// If members are to be sorted by name, use localeCompare for case-
// insensitive sort
sortedMembers.sort(
(a, b) => {
if (orderAscending === 'desc') {
return b.profile.name.localeCompare(a.profile.name);
}
return a.profile.name.localeCompare(b.profile.name);
},
);
} else {
sortedMembers = orderBy(
sortedMembers,
[order],
[orderAscending],
);
}
return sortedMembers;
},
hideHeader () {
return ['groupPlan', 'privateMessages'].includes(this.$route.name);
@@ -2,19 +2,38 @@
<div
class="notification d-flex flex-column justify-content-center text-center"
>
<strong class="mx-auto mb-2"> {{ $t('g1g1Announcement') }} </strong>
<p class="mx-4"> {{ $t('g1g1Details') }} </p>
<strong
v-once
class="mx-auto mb-2"
>
{{ $t('g1g1Announcement') }}
</strong>
<p
v-once
class="mx-4"
>
{{ $t('g1g1Details') }}
</p>
<div
class="btn-secondary mx-auto d-flex"
@click="showSelectUser()"
>
<div class="m-auto"> {{ $t('sendGift') }} </div>
<div
v-once
class="m-auto"
>
{{ $t('sendGift') }}
</div>
</div>
<div
class="notification-remove"
@click.stop="remove()"
>
<div class="svg-icon" v-html="icons.close"></div>
<div
v-once
class="svg-icon"
v-html="icons.close"
></div>
</div>
</div>
</template>
@@ -13,7 +13,7 @@
<div class="username-notification-title">
{{ $t('setUsernameNotificationTitle') }}
</div>
<div>{{ $t('setUsernameNotificationBody') }}</div>
<div>{{ $t('changeUsernameDisclaimer') }}</div>
<div class="current-username-container mx-auto">
<label class="font-weight-bold">{{ $t('currentUsername') + " " }}</label>
<label>@</label>
@@ -133,13 +133,12 @@
</style>
<script>
import axios from 'axios';
import { mapState } from '@/libs/store';
import * as Analytics from '@/libs/analytics';
import userIcon from '@/assets/svg/user.svg';
import MenuDropdown from '../ui/customMenuDropdown';
import markPMSRead from '@/../../common/script/ops/markPMSRead';
import MessageCount from './messageCount';
import { EVENTS } from '@/libs/events';
export default {
components: {
@@ -164,11 +163,8 @@ export default {
this.$root.$emit('bv::show::modal', 'avatar-modal');
},
showPrivateMessages () {
markPMSRead(this.user);
axios.post('/api/v4/user/mark-pms-read');
if (this.$router.history.current.name === 'privateMessages') {
this.$root.$emit('pm::refresh');
this.$root.$emit(EVENTS.PM_REFRESH);
} else {
this.$router.push('/private-messages');
}
@@ -10,21 +10,7 @@
:backer="backer"
:contributor="contributor"
:name="displayName"
/><span
v-if="username"
class="username"
>@{{ username }}</span>
<div
v-if="lastMessageDate"
class="time"
>
{{ lastMessageDate | timeAgo }}
</div>
</div>
<div class="preview-row">
<div class="messagePreview">
{{ lastMessageText }}
</div>
/>
<div
v-if="userLoggedIn.id !== uuid"
class="actions"
@@ -44,16 +30,33 @@
v-html="icons.dots"
></div>
</template>
<b-dropdown-item @click="block()">
<b-dropdown-item @click="toggleBlock()">
<span class="dropdown-icon-item">
<div
class="svg-icon inline"
v-html="icons.remove"
></div><span class="text">{{ $t('block') }}</span></span>
></div><span class="text">{{ $t(isBlocked ? 'unblock' : 'block') }}</span></span>
</b-dropdown-item>
</b-dropdown>
</div>
</div>
<span class="username-row">
<span
v-if="username"
class="username"
>@{{ username }}</span> <span
v-if="lastMessageDate"
class="time"
>
{{ lastMessageDate | timeAgo }}
</span>
</span>
<div class="preview-row">
<div class="messagePreview">
{{ lastMessageText }}
</div>
</div>
</div>
</template>
@@ -79,6 +82,9 @@ export default {
...mapState({
userLoggedIn: 'user.data',
}),
isBlocked () {
return this.userLoggedIn.inbox.blocks.includes(this.uuid);
},
},
data () {
return {
@@ -101,8 +107,8 @@ export default {
dropdown.hide();
}
},
block () {
this.$store.dispatch('user:block', {
toggleBlock () {
this.$store.dispatch(this.isBlocked ? 'user:unblock' : 'user:block', {
uuid: this.uuid,
});
},
@@ -133,6 +139,12 @@ export default {
height: 16px;
width: 4px;
&:not(:hover) {
svg path {
fill: $gray-200;
}
}
svg path {
fill: $purple-300
}
@@ -144,7 +156,7 @@ export default {
@import '~@/assets/scss/colors.scss';
.conversation {
padding: 1.5rem;
padding: 1rem 1.5rem;
border-bottom: 1px solid $gray-500;
&:hover {
@@ -164,6 +176,7 @@ export default {
display: flex;
flex-direction: row;
height: 20px;
position: relative;
.user-label {
flex: 1;
@@ -172,11 +185,6 @@ export default {
white-space: nowrap;
}
.username {
flex: 1;
flex-grow: 0;
}
.time {
flex: 2;
text-align: end;
@@ -187,10 +195,15 @@ export default {
}
}
.username-row {
flex: 1;
flex-grow: 0;
font-size: 12px;
color: $gray-200;
}
.messagePreview {
//width: 100%;
height: 30px;
margin-right: 40px;
max-height: 30px;
margin-top: 4px;
font-size: 12px;
font-weight: normal;
@@ -221,7 +234,6 @@ export default {
right: 0;
display: none;
width: 16px;
margin-top: 4px;
.dots {
height: 16px;
@@ -34,10 +34,9 @@
class="d-flex flex-grow-1"
>
<avatar
v-if="msg.userStyles || (cachedProfileData[msg.uuid]
&& !cachedProfileData[msg.uuid].rejected)"
v-if="conversationOpponentUser"
class="avatar-left"
:member="msg.userStyles || cachedProfileData[msg.uuid]"
:member="conversationOpponentUser"
:avatar-only="true"
:override-top-padding="'14px'"
:hide-class-badge="true"
@@ -65,10 +64,9 @@
/>
</div>
<avatar
v-if="msg.userStyles
|| (cachedProfileData[msg.uuid] && !cachedProfileData[msg.uuid].rejected)"
v-if="user"
class="avatar-right"
:member="msg.userStyles || cachedProfileData[msg.uuid]"
:member="user"
:avatar-only="true"
:hide-class-badge="true"
:override-top-padding="'14px'"
@@ -88,18 +86,18 @@
}
.avatar {
width: 15%;
width: 170px;
min-width: 8rem;
height: 120px;
padding-top: 0 !important;
}
.avatar-left {
margin-left: -1rem;
}
.avatar-right {
margin-left: -1rem;
::v-deep .character-sprites {
margin-right: 1rem !important;
}
}
.card {
@@ -201,7 +199,6 @@
<script>
import moment from 'moment';
import axios from 'axios';
import debounce from 'lodash/debounce';
import { PerfectScrollbar } from 'vue2-perfect-scrollbar';
import { mapState } from '@/libs/store';
@@ -219,13 +216,11 @@ export default {
chat: {},
isLoading: Boolean,
canLoadMore: Boolean,
conversationOpponentUser: {},
},
data () {
return {
currentDayDividerDisplay: moment().day(),
cachedProfileData: {},
currentProfileLoadedCount: 0,
currentProfileLoadedEnd: 10,
loading: false,
handleScrollBack: false,
lastOffset: -1,
@@ -233,8 +228,6 @@ export default {
};
},
mounted () {
this.loadProfileCache();
this.$el.addEventListener('selectstart', () => this.handleSelectStart());
this.$el.addEventListener('mouseup', () => this.handleSelectChange());
},
@@ -253,7 +246,6 @@ export default {
// @TODO: We need a different lazy load mechnism.
// But honestly, adding a paging route to chat would solve this
messages () {
this.loadProfileCache();
return this.chat;
},
psOptions () {
@@ -263,9 +255,6 @@ export default {
},
},
methods: {
handleScroll () {
this.loadProfileCache(window.scrollY / 1000);
},
async triggerLoad () {
const container = this.$refs.container.$el;
@@ -284,62 +273,6 @@ export default {
this.handleScrollBack = true;
}
},
loadProfileCache: debounce(function loadProfileCache (screenPosition) {
this._loadProfileCache(screenPosition);
}, 1000),
async _loadProfileCache (screenPosition) {
if (this.loading) return;
this.loading = true;
const promises = [];
const noProfilesLoaded = Object.keys(this.cachedProfileData).length === 0;
// @TODO: write an explination
// @TODO: Remove this after enough messages are cached
if (!noProfilesLoaded && screenPosition
&& Math.floor(screenPosition) + 1 > this.currentProfileLoadedEnd / 10) {
this.currentProfileLoadedEnd = 10 * (Math.floor(screenPosition) + 1);
} else if (!noProfilesLoaded && screenPosition) {
return;
}
const aboutToCache = {};
this.messages.forEach(message => {
const { uuid } = message;
if (message.userStyles) {
this.$set(this.cachedProfileData, uuid, message.userStyles);
}
if (Boolean(uuid) && !this.cachedProfileData[uuid] && !aboutToCache[uuid]) {
if (uuid === 'system' || this.currentProfileLoadedCount === this.currentProfileLoadedEnd) return;
aboutToCache[uuid] = {};
promises.push(axios.get(`/api/v4/members/${uuid}`));
this.currentProfileLoadedCount += 1;
}
});
const results = await Promise.all(promises);
results.forEach(result => {
// We could not load the user. Maybe they were deleted.
// So, let's cache empty so we don't try again
if (!result || !result.data || result.status >= 400) {
return;
}
const userData = result.data.data;
this.$set(this.cachedProfileData, userData._id, userData);
});
// Merge in any attempts that were rejected so we don't attempt again
for (const uuid in aboutToCache) {
if (!this.cachedProfileData[uuid]) {
this.$set(this.cachedProfileData, uuid, { rejected: true });
}
}
this.loading = false;
},
displayDivider (message) {
if (this.currentDayDividerDisplay !== moment(message.timestamp).day()) {
this.currentDayDividerDisplay = moment(message.timestamp).day();
@@ -348,29 +281,8 @@ export default {
return false;
},
async showMemberModal (memberId) {
let profile = this.cachedProfileData[memberId];
if (!profile._id) {
const result = await this.$store.dispatch('members:fetchMember', { memberId });
if (result.response && result.response.status === 404) {
return this.$store.dispatch('snackbars:add', {
title: 'Habitica',
text: this.$t('messageDeletedUser'),
type: 'error',
timeout: false,
});
}
this.cachedProfileData[memberId] = result.data.data;
profile = result.data.data;
}
// Open the modal only if the data is available
if (profile && !profile.rejected) {
this.$router.push({ name: 'userProfile', params: { userId: profile._id } });
}
return null;
showMemberModal (memberId) {
this.$router.push({ name: 'userProfile', params: { userId: memberId } });
},
itemWasMounted: debounce(function itemWasMounted () {
if (this.handleScrollBack) {
@@ -13,7 +13,6 @@
<testing />
<testingletiant />
<rebirth-enabled />
<drops-enabled />
<contributor />
<won-challenge />
<ultimate-gear />
@@ -34,6 +33,7 @@
<lost-masterclasser />
<mind-over-matter />
<onboarding-complete />
<first-drops />
</div>
</template>
@@ -128,7 +128,6 @@ import questInvitation from './achievements/questInvitation';
import testing from './achievements/testing';
import testingletiant from './achievements/testingletiant';
import rebirthEnabled from './achievements/rebirthEnabled';
import dropsEnabled from './achievements/dropsEnabled';
import contributor from './achievements/contributor';
import invitedFriend from './achievements/invitedFriend';
import joinedChallenge from './achievements/joinedChallenge';
@@ -144,6 +143,7 @@ import mindOverMatter from './achievements/mindOverMatter';
import loginIncentives from './achievements/login-incentives';
import onboardingComplete from './achievements/onboardingComplete';
import verifyUsername from './settings/verifyUsername';
import firstDrops from './achievements/firstDrops';
const NOTIFICATIONS = {
CHALLENGE_JOINED_ACHIEVEMENT: {
@@ -310,6 +310,14 @@ const NOTIFICATIONS = {
achievement: 'rosyOutlook', // defined manually until the server sends all the necessary data
},
},
ACHIEVEMENT_BUG_BONANZA: {
achievement: true,
label: $t => `${$t('achievement')}: ${$t('achievementBugBonanza')}`,
modalId: 'generic-achievement',
data: {
achievement: 'bugBonanza', // defined manually until the server sends all the necessary data
},
},
};
export default {
@@ -333,7 +341,6 @@ export default {
testing,
testingletiant,
rebirthEnabled,
dropsEnabled,
contributor,
loginIncentives,
verifyUsername,
@@ -342,12 +349,12 @@ export default {
mindOverMatter,
justAddWater,
onboardingComplete,
firstDrops,
},
mixins: [notifications, guide],
data () {
// Levels that already display modals and should not trigger generic Level Up
const unlockLevels = {
3: 'drop system',
10: 'class system',
50: 'Orb of Rebirth',
};
@@ -361,7 +368,7 @@ export default {
const handledNotifications = {};
[
'GUILD_PROMPT', 'DROPS_ENABLED', 'REBIRTH_ENABLED', 'WON_CHALLENGE', 'STREAK_ACHIEVEMENT',
'GUILD_PROMPT', 'REBIRTH_ENABLED', 'WON_CHALLENGE', 'STREAK_ACHIEVEMENT',
'ULTIMATE_GEAR_ACHIEVEMENT', 'REBIRTH_ACHIEVEMENT', 'GUILD_JOINED_ACHIEVEMENT',
'CHALLENGE_JOINED_ACHIEVEMENT', 'INVITED_FRIEND_ACHIEVEMENT', 'NEW_CONTRIBUTOR_LEVEL',
'CRON', 'SCORED_TASK', 'LOGIN_INCENTIVE', 'ACHIEVEMENT_ALL_YOUR_BASE', 'ACHIEVEMENT_BACK_TO_BASICS',
@@ -369,7 +376,7 @@ export default {
'ACHIEVEMENT_MOUNT_MASTER', 'ACHIEVEMENT_TRIAD_BINGO', 'ACHIEVEMENT_DUST_DEVIL', 'ACHIEVEMENT_ARID_AUTHORITY',
'ACHIEVEMENT_MONSTER_MAGUS', 'ACHIEVEMENT_UNDEAD_UNDERTAKER', 'ACHIEVEMENT_PRIMED_FOR_PAINTING',
'ACHIEVEMENT_PEARLY_PRO', 'ACHIEVEMENT_TICKLED_PINK', 'ACHIEVEMENT_ROSY_OUTLOOK', 'ACHIEVEMENT',
'ONBOARDING_COMPLETE',
'ONBOARDING_COMPLETE', 'FIRST_DROPS', 'ACHIEVEMENT_BUG_BONANZA',
].forEach(type => {
handledNotifications[type] = true;
});
@@ -732,6 +739,13 @@ export default {
// @TODO: Use factory function instead
switch (notification.type) { // eslint-disable-line default-case
case 'FIRST_DROPS':
if (notification.data) {
this.$store.state.firstDropsOptions.egg = notification.data.egg;
this.$store.state.firstDropsOptions.hatchingPotion = notification.data.hatchingPotion;
this.$root.$emit('bv::show::modal', 'first-drops');
}
break;
case 'GUILD_PROMPT':
// @TODO: I'm pretty sure we can find better names for these
if (notification.data.textletiant === -1) {
@@ -740,9 +754,6 @@ export default {
this.$root.$emit('bv::show::modal', 'testingletiant');
}
break;
case 'DROPS_ENABLED':
this.$root.$emit('bv::show::modal', 'drops-enabled');
break;
case 'REBIRTH_ENABLED':
this.$root.$emit('bv::show::modal', 'rebirth-enabled');
break;
@@ -779,6 +790,7 @@ export default {
case 'ACHIEVEMENT_PEARLY_PRO':
case 'ACHIEVEMENT_TICKLED_PINK':
case 'ACHIEVEMENT_ROSY_OUTLOOK':
case 'ACHIEVEMENT_BUG_BONANZA':
case 'GENERIC_ACHIEVEMENT':
this.showNotificationWithModal(notification);
break;

Some files were not shown because too many files have changed in this diff Show More