mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-16 14:17:22 +01:00
commit934b85d716Author: Sabe Jones <sabe@habitica.com> Date: Thu May 9 09:27:28 2024 -0500 5.24.2 commitc6df34a7fcAuthor: Sabe Jones <sabe@habitica.com> Date: Thu May 9 09:27:24 2024 -0500 chore(subproj): update habitica-images commitc51c90ba41Author: Sabe Jones <sabe@habitica.com> Date: Thu May 9 09:26:49 2024 -0500 Squashed commit of the following: commit 7d6320ee2d6e1dac5ac025c188162cba35ed49bf Author: Sabe Jones <sabe@habitica.com> Date: Mon May 6 16:22:53 2024 -0500 fix(faq): copy updates commit 234870a7b2bc3b23ba2a044a1010fdc9b417bc45 Author: Sabe Jones <sabe@habitica.com> Date: Fri May 3 16:06:48 2024 -0500 fix(faq): cleaner layout commit 06f162cc7a6a2b94b916ae0514b08ede09e7a2dc Author: Sabe Jones <sabe@habitica.com> Date: Tue Apr 30 17:21:50 2024 -0500 feat(faq): Content Schedule notes commitd3f420144cAuthor: Weblate <noreply@weblate.org> Date: Thu May 9 16:22:33 2024 +0200 Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (3089 of 3089 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (15 of 15 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 98.5% (762 of 773 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (378 of 378 strings) Translated using Weblate (German) Currently translated at 82.6% (214 of 259 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 98.5% (762 of 773 strings) Translated using Weblate (German) Currently translated at 97.4% (753 of 773 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 98.5% (762 of 773 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (131 of 131 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (2 of 2 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (3089 of 3089 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (259 of 259 strings) Translated using Weblate (German) Currently translated at 100.0% (868 of 868 strings) Translated using Weblate (German) Currently translated at 75.2% (195 of 259 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (113 of 113 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (239 of 239 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 98.5% (762 of 773 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (189 of 189 strings) Translated using Weblate (German) Currently translated at 97.1% (751 of 773 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (140 of 140 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (113 of 113 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (427 of 427 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (239 of 239 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 98.5% (762 of 773 strings) Translated using Weblate (German) Currently translated at 96.2% (744 of 773 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (110 of 110 strings) Translated using Weblate (German) Currently translated at 99.8% (867 of 868 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (167 of 167 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (259 of 259 strings) Translated using Weblate (German) Currently translated at 98.7% (229 of 232 strings) Translated using Weblate (German) Currently translated at 100.0% (378 of 378 strings) Translated using Weblate (German) Currently translated at 100.0% (167 of 167 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (140 of 140 strings) Translated using Weblate (German) Currently translated at 89.5% (2766 of 3089 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 98.5% (762 of 773 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (868 of 868 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (167 of 167 strings) Translated using Weblate (German) Currently translated at 89.3% (2760 of 3089 strings) Translated using Weblate (French) Currently translated at 100.0% (3089 of 3089 strings) Translated using Weblate (French) Currently translated at 100.0% (232 of 232 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (286 of 286 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (3089 of 3089 strings) Translated using Weblate (French) Currently translated at 99.9% (3088 of 3089 strings) Translated using Weblate (German) Currently translated at 89.1% (2754 of 3089 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (182 of 182 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 98.4% (761 of 773 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (868 of 868 strings) Translated using Weblate (French) Currently translated at 100.0% (868 of 868 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (167 of 167 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (232 of 232 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (3089 of 3089 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 98.4% (761 of 773 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (378 of 378 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 99.3% (862 of 868 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (167 of 167 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (427 of 427 strings) Translated using Weblate (German) Currently translated at 89.0% (2752 of 3089 strings) Translated using Weblate (German) Currently translated at 89.0% (2750 of 3089 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (232 of 232 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (3089 of 3089 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (773 of 773 strings) Translated using Weblate (French) Currently translated at 100.0% (773 of 773 strings) Translated using Weblate (Ukrainian) Currently translated at 99.7% (377 of 378 strings) Translated using Weblate (French) Currently translated at 100.0% (378 of 378 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (378 of 378 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (868 of 868 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (167 of 167 strings) Translated using Weblate (French) Currently translated at 100.0% (167 of 167 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (259 of 259 strings) Translated using Weblate (German) Currently translated at 88.9% (2747 of 3089 strings) Translated using Weblate (French) Currently translated at 100.0% (259 of 259 strings) Translated using Weblate (German) Currently translated at 88.7% (2740 of 3089 strings) Translated using Weblate (German) Currently translated at 88.8% (2734 of 3077 strings) Translated using Weblate (Korean) Currently translated at 79.8% (131 of 164 strings) Translated using Weblate (Korean) Currently translated at 79.8% (131 of 164 strings) Co-authored-by: Finrod <963505255@qq.com> Co-authored-by: Jaime Martí <jaumemarti77@icloud.com> Co-authored-by: Lapin <sirocuro01@gmail.com> Co-authored-by: Sophie LE MASLE <sophiesuff@gmail.com> Co-authored-by: Tetiana <merekka13@gmail.com> Co-authored-by: Toro Mor <thomas.bizer@gmx.de> Co-authored-by: Weblate <noreply@weblate.org> Co-authored-by: 박동훈 <creator98@naver.com> Translate-URL: https://translate.habitica.com/projects/habitica/achievements/de/ Translate-URL: https://translate.habitica.com/projects/habitica/achievements/fr/ Translate-URL: https://translate.habitica.com/projects/habitica/achievements/ko/ Translate-URL: https://translate.habitica.com/projects/habitica/achievements/uk/ Translate-URL: https://translate.habitica.com/projects/habitica/achievements/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/de/ Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/fr/ Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/uk/ Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/challenge/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/character/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/content/de/ Translate-URL: https://translate.habitica.com/projects/habitica/content/es/ Translate-URL: https://translate.habitica.com/projects/habitica/content/fr/ Translate-URL: https://translate.habitica.com/projects/habitica/content/uk/ Translate-URL: https://translate.habitica.com/projects/habitica/content/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/death/uk/ Translate-URL: https://translate.habitica.com/projects/habitica/front/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/ Translate-URL: https://translate.habitica.com/projects/habitica/gear/es/ Translate-URL: https://translate.habitica.com/projects/habitica/gear/fr/ Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/generic/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/groups/uk/ Translate-URL: https://translate.habitica.com/projects/habitica/groups/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/limited/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/noscript/uk/ Translate-URL: https://translate.habitica.com/projects/habitica/npc/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/pets/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/de/ Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/fr/ Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/uk/ Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/settings/de/ Translate-URL: https://translate.habitica.com/projects/habitica/settings/es/ Translate-URL: https://translate.habitica.com/projects/habitica/settings/fr/ Translate-URL: https://translate.habitica.com/projects/habitica/settings/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/de/ Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/es/ Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/fr/ Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/tasks/zh_Hans/ Translation: Habitica/Achievements Translation: Habitica/Backgrounds Translation: Habitica/Challenge Translation: Habitica/Character Translation: Habitica/Content Translation: Habitica/Death Translation: Habitica/Front Translation: Habitica/Gear Translation: Habitica/Generic Translation: Habitica/Groups Translation: Habitica/Limited Translation: Habitica/Noscript Translation: Habitica/Npc Translation: Habitica/Pets Translation: Habitica/Questscontent Translation: Habitica/Settings Translation: Habitica/Subscriber Translation: Habitica/Tasks commit1567f1c283Author: Natalie <78037386+CuriousMagpie@users.noreply.github.com> Date: Tue May 7 17:21:06 2024 -0400 remove dempendabot.yml (#15193) commit3e19b8aa96Author: Sabe Jones <sabe@habitica.com> Date: Fri Apr 26 15:26:23 2024 -0500 5.24.1 commitd1bc1ab05aMerge:2d4ee636ae13149d4acfAuthor: Sabe Jones <sabe@habitica.com> Date: Fri Apr 26 15:25:51 2024 -0500 Merge branch 'develop' into release commit13149d4acfMerge:42964c91f34b796fae5dAuthor: Weblate <noreply@weblate.org> Date: Fri Apr 26 22:24:45 2024 +0200 Merge branch 'origin/develop' into Weblate. commit2d4ee636aeAuthor: Sabe Jones <sabe@habitica.com> Date: Fri Apr 26 15:22:08 2024 -0500 5.24.0 commit42964c91f3Author: Phillip Thelen <phillip@habitica.com> Date: Fri Apr 26 22:15:18 2024 +0200 Fix issue with gift sub processing (#15184) * Fix issue with gift sub processing * Update cron.js commitde62207504Author: Natalie <78037386+CuriousMagpie@users.noreply.github.com> Date: Fri Apr 26 16:14:45 2024 -0400 May 2024 Content Prebuild (#15185) * 2024-05 css update * add May subscriber items, enchanted armoire (text placeholders), potions, and quest bundles * typo correction * add May achievement * content fixes after local testing * canonical date fix * fix potion descriptions, add periods to background descriptions * fix canonical date * updated armoire items * fix stat display on item * Fixing merge conflicts * resolve merge conflicts * add leading zero to mp drain for mushroom quest * fix timezones * proofreading pass * fix linting errors * date fixes & linter fixes * correct armoire expression at end of file * fix(autolint): roll back Prettier change --------- Co-authored-by: Sabe Jones <sabe@habitica.com> commit4b796fae5dAuthor: Weblate <noreply@weblate.org> Date: Fri Apr 26 11:41:11 2024 +0200 Translated using Weblate (German) Currently translated at 88.7% (2731 of 3077 strings) Translated using Weblate (German) Currently translated at 88.6% (2729 of 3077 strings) Translated using Weblate (German) Currently translated at 88.6% (2727 of 3077 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (286 of 286 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (110 of 110 strings) Translated using Weblate (Ukrainian) Currently translated at 99.8% (860 of 861 strings) Translated using Weblate (German) Currently translated at 88.5% (2726 of 3077 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (377 of 377 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (861 of 861 strings) Translated using Weblate (German) Currently translated at 88.5% (2724 of 3077 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (861 of 861 strings) Translated using Weblate (German) Currently translated at 98.9% (283 of 286 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (377 of 377 strings) Translated using Weblate (Ukrainian) Currently translated at 97.5% (160 of 164 strings) Translated using Weblate (German) Currently translated at 89.8% (257 of 286 strings) Translated using Weblate (German) Currently translated at 87.7% (251 of 286 strings) Translated using Weblate (German) Currently translated at 99.8% (860 of 861 strings) Translated using Weblate (German) Currently translated at 97.6% (841 of 861 strings) Translated using Weblate (Ukrainian) Currently translated at 98.8% (256 of 259 strings) Translated using Weblate (German) Currently translated at 91.8% (392 of 427 strings) Translated using Weblate (German) Currently translated at 91.1% (389 of 427 strings) Translated using Weblate (German) Currently translated at 88.7% (379 of 427 strings) Translated using Weblate (French) Currently translated at 100.0% (3077 of 3077 strings) Translated using Weblate (French) Currently translated at 100.0% (231 of 231 strings) Translated using Weblate (French) Currently translated at 100.0% (286 of 286 strings) Translated using Weblate (French) Currently translated at 99.1% (3050 of 3077 strings) Translated using Weblate (German) Currently translated at 88.0% (376 of 427 strings) Translated using Weblate (German) Currently translated at 98.7% (228 of 231 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (113 of 113 strings) Translated using Weblate (Dutch) Currently translated at 84.5% (2602 of 3077 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (164 of 164 strings) Translated using Weblate (Romanian) Currently translated at 92.8% (130 of 140 strings) Translated using Weblate (German) Currently translated at 97.8% (226 of 231 strings) Translated using Weblate (Romanian) Currently translated at 75.0% (6 of 8 strings) Translated using Weblate (Romanian) Currently translated at 96.6% (58 of 60 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (861 of 861 strings) Translated using Weblate (German) Currently translated at 95.2% (220 of 231 strings) Translated using Weblate (French) Currently translated at 98.7% (3040 of 3077 strings) Translated using Weblate (French) Currently translated at 100.0% (861 of 861 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (94 of 94 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (13 of 13 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (286 of 286 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 99.6% (761 of 764 strings) Translated using Weblate (German) Currently translated at 54.9% (50 of 91 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (286 of 286 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 98.7% (3037 of 3077 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (3077 of 3077 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (239 of 239 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 99.6% (761 of 764 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (189 of 189 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (861 of 861 strings) Translated using Weblate (Portuguese) Currently translated at 99.3% (163 of 164 strings) Translated using Weblate (German) Currently translated at 94.8% (219 of 231 strings) Translated using Weblate (German) Currently translated at 84.2% (241 of 286 strings) Translated using Weblate (German) Currently translated at 51.6% (47 of 91 strings) Translated using Weblate (Portuguese) Currently translated at 98.1% (161 of 164 strings) Translated using Weblate (Spanish) Currently translated at 99.8% (3072 of 3077 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (94 of 94 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (286 of 286 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (239 of 239 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 99.6% (761 of 764 strings) Translated using Weblate (German) Currently translated at 49.4% (45 of 91 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (377 of 377 strings) Translated using Weblate (Spanish (Latin America)) Currently translated at 89.7% (253 of 282 strings) Translated using Weblate (Spanish (Latin America)) Currently translated at 2.1% (3 of 137 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (3077 of 3077 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (239 of 239 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 99.6% (761 of 764 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (427 of 427 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 99.6% (761 of 764 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (231 of 231 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (56 of 56 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (3077 of 3077 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 98.9% (756 of 764 strings) Translated using Weblate (German) Currently translated at 48.3% (44 of 91 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (377 of 377 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (861 of 861 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 98.0% (749 of 764 strings) Translated using Weblate (German) Currently translated at 97.3% (744 of 764 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (377 of 377 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (164 of 164 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (231 of 231 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (113 of 113 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (131 of 131 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (22 of 22 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (8 of 8 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (3077 of 3077 strings) Translated using Weblate (Spanish) Currently translated at 99.8% (3071 of 3077 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (377 of 377 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 99.1% (3051 of 3077 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (377 of 377 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (861 of 861 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (140 of 140 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (230 of 230 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (94 of 94 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (131 of 131 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (427 of 427 strings) Translated using Weblate (German) Currently translated at 86.6% (370 of 427 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (3035 of 3035 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (3035 of 3035 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (239 of 239 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (182 of 182 strings) Translated using Weblate (Russian) Currently translated at 29.9% (41 of 137 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 98.0% (749 of 764 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (764 of 764 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (91 of 91 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (377 of 377 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (110 of 110 strings) Translated using Weblate (German) Currently translated at 97.8% (836 of 854 strings) Co-authored-by: Antonio Spinelli <tonicospinelli@users.noreply.translate.habitica.com> Co-authored-by: Céu <marcel.ufscar@gmail.com> Co-authored-by: Ellen A M <ellen_a_m@hotmail.com> Co-authored-by: Finrod <963505255@qq.com> Co-authored-by: Jaime Martí <jaumemarti77@icloud.com> Co-authored-by: Julian Brito <hackoogamer0852@gmail.com> Co-authored-by: Luã Fhelyp Guimarães <fhelypg@gmail.com> Co-authored-by: Sophie LE MASLE <sophiesuff@gmail.com> Co-authored-by: Tetiana <merekka13@gmail.com> Co-authored-by: Toro Mor <thomas.bizer@gmx.de> Co-authored-by: Weblate <noreply@weblate.org> Co-authored-by: Χρήστος Joia <hristosjoia@gmail.com> Co-authored-by: Катя Скибицкая <katerrina9993@gmail.com> Translate-URL: https://translate.habitica.com/projects/habitica/achievements/pt/ Translate-URL: https://translate.habitica.com/projects/habitica/achievements/uk/ Translate-URL: https://translate.habitica.com/projects/habitica/achievements/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/de/ Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/es/ Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/fr/ Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/pt_BR/ Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/uk/ Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/challenge/uk/ Translate-URL: https://translate.habitica.com/projects/habitica/challenge/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/character/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/de/ Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/content/pt_BR/ Translate-URL: https://translate.habitica.com/projects/habitica/content/uk/ Translate-URL: https://translate.habitica.com/projects/habitica/content/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/faq/es_419/ Translate-URL: https://translate.habitica.com/projects/habitica/faq/ru/ Translate-URL: https://translate.habitica.com/projects/habitica/front/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/ Translate-URL: https://translate.habitica.com/projects/habitica/gear/es/ Translate-URL: https://translate.habitica.com/projects/habitica/gear/fr/ Translate-URL: https://translate.habitica.com/projects/habitica/gear/nl/ Translate-URL: https://translate.habitica.com/projects/habitica/gear/pt_BR/ Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/generic/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/groups/de/ Translate-URL: https://translate.habitica.com/projects/habitica/groups/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/inventory/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/limited/de/ Translate-URL: https://translate.habitica.com/projects/habitica/limited/es/ Translate-URL: https://translate.habitica.com/projects/habitica/limited/es_419/ Translate-URL: https://translate.habitica.com/projects/habitica/limited/fr/ Translate-URL: https://translate.habitica.com/projects/habitica/limited/uk/ Translate-URL: https://translate.habitica.com/projects/habitica/limited/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/loginincentives/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/messages/ro/ Translate-URL: https://translate.habitica.com/projects/habitica/npc/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/overview/ro/ Translate-URL: https://translate.habitica.com/projects/habitica/pets/nl/ Translate-URL: https://translate.habitica.com/projects/habitica/pets/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/quests/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/de/ Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/uk/ Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/rebirth/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/settings/uk/ Translate-URL: https://translate.habitica.com/projects/habitica/spells/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/de/ Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/es/ Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/fr/ Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/zh_Hans/ Translate-URL: https://translate.habitica.com/projects/habitica/tasks/ro/ Translate-URL: https://translate.habitica.com/projects/habitica/tasks/zh_Hans/ Translation: Habitica/Achievements Translation: Habitica/Backgrounds Translation: Habitica/Challenge Translation: Habitica/Character Translation: Habitica/Communityguidelines Translation: Habitica/Content Translation: Habitica/Faq Translation: Habitica/Front Translation: Habitica/Gear Translation: Habitica/Generic Translation: Habitica/Groups Translation: Habitica/Inventory Translation: Habitica/Limited Translation: Habitica/Loginincentives Translation: Habitica/Messages Translation: Habitica/Npc Translation: Habitica/Overview Translation: Habitica/Pets Translation: Habitica/Quests Translation: Habitica/Questscontent Translation: Habitica/Rebirth Translation: Habitica/Settings Translation: Habitica/Spells Translation: Habitica/Subscriber Translation: Habitica/Tasks commit2e9573ef92Author: Yeah Jack <95103974+Yeah-Jack@users.noreply.github.com> Date: Thu Apr 25 21:25:33 2024 +0200 Update README.md for better grammar (#15103) commit384bfce3ebAuthor: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu Apr 25 14:34:51 2024 -0400 chore(deps): bump express from 4.18.2 to 4.19.2 in /website/client (#15189) Bumps [express](https://github.com/expressjs/express) from 4.18.2 to 4.19.2. - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/master/History.md) - [Commits](https://github.com/expressjs/express/compare/4.18.2...4.19.2) --- updated-dependencies: - dependency-name: express dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit5a8c7fb924Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu Apr 25 14:34:24 2024 -0400 chore(deps): bump webpack-dev-middleware in /website/client (#15188) Bumps [webpack-dev-middleware](https://github.com/webpack/webpack-dev-middleware) from 5.3.3 to 5.3.4. - [Release notes](https://github.com/webpack/webpack-dev-middleware/releases) - [Changelog](https://github.com/webpack/webpack-dev-middleware/blob/v5.3.4/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-middleware/compare/v5.3.3...v5.3.4) --- updated-dependencies: - dependency-name: webpack-dev-middleware dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit246775256eAuthor: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu Apr 25 14:34:01 2024 -0400 chore(deps): bump express from 4.18.2 to 4.19.2 (#15190) Bumps [express](https://github.com/expressjs/express) from 4.18.2 to 4.19.2. - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/master/History.md) - [Commits](https://github.com/expressjs/express/compare/4.18.2...4.19.2) --- updated-dependencies: - dependency-name: express dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commitfa4cd8dd5aAuthor: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu Apr 25 14:32:59 2024 -0400 chore(deps): bump tar from 6.2.0 to 6.2.1 (#15191) Bumps [tar](https://github.com/isaacs/node-tar) from 6.2.0 to 6.2.1. - [Release notes](https://github.com/isaacs/node-tar/releases) - [Changelog](https://github.com/isaacs/node-tar/blob/main/CHANGELOG.md) - [Commits](https://github.com/isaacs/node-tar/compare/v6.2.0...v6.2.1) --- updated-dependencies: - dependency-name: tar dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit5224e063f7Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu Apr 25 14:32:36 2024 -0400 chore(deps): bump axios from 0.21.4 to 1.6.8 (#15192) Bumps [axios](https://github.com/axios/axios) from 0.21.4 to 1.6.8. - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v0.21.4...v1.6.8) --- updated-dependencies: - dependency-name: axios dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commite5e8b9a7ecAuthor: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu Apr 25 14:19:21 2024 -0400 build(deps): bump chai from 4.3.7 to 5.1.0 in /website/client (#15144) Bumps [chai](https://github.com/chaijs/chai) from 4.3.7 to 5.1.0. - [Release notes](https://github.com/chaijs/chai/releases) - [Changelog](https://github.com/chaijs/chai/blob/main/History.md) - [Commits](https://github.com/chaijs/chai/compare/v4.3.7...v5.1.0) --- updated-dependencies: - dependency-name: chai dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit7cd76c50ebAuthor: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu Apr 25 14:18:07 2024 -0400 build(deps): bump axios from 0.27.2 to 0.28.0 in /website/client (#15148) Bumps [axios](https://github.com/axios/axios) from 0.27.2 to 0.28.0. - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v0.28.0/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v0.27.2...v0.28.0) --- updated-dependencies: - dependency-name: axios dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commitb520202544Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu Apr 25 14:17:17 2024 -0400 build(deps): bump sass-loader from 8.0.2 to 14.1.1 in /website/client (#15159) Bumps [sass-loader](https://github.com/webpack-contrib/sass-loader) from 8.0.2 to 14.1.1. - [Release notes](https://github.com/webpack-contrib/sass-loader/releases) - [Changelog](https://github.com/webpack-contrib/sass-loader/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack-contrib/sass-loader/compare/v8.0.2...v14.1.1) --- updated-dependencies: - dependency-name: sass-loader dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commitbbae882edaAuthor: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu Apr 25 14:12:46 2024 -0400 chore(deps): bump follow-redirects in /website/client (#15179) Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.3 to 1.15.6. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.3...v1.15.6) --- updated-dependencies: - dependency-name: follow-redirects dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commitee93c8bec5Author: Sabe Jones <sabe@habitica.com> Date: Mon Apr 8 15:49:20 2024 -0500 5.23.0 commitc65e93e514Author: Sabe Jones <sabe@habitica.com> Date: Mon Apr 8 15:49:17 2024 -0500 chore(git): update subproject commit0fd808727cAuthor: Sabe Jones <sabe@habitica.com> Date: Mon Apr 8 15:48:32 2024 -0500 Squashed commit of the following: commit 3c3787091a2e8a94857352c3655f60138a3b20b7 Merge: 76a00d630876d7f02fe8Author: Sabe Jones <sabe@habitica.com> Date: Mon Apr 8 15:47:35 2024 -0500 Merge branch 'release' into 2024-04-april-fool-items commit 76a00d6308997c50ae5f5e9d6170a09a1a8cbac7 Author: Sabe Jones <sabe@habitica.com> Date: Thu Mar 28 16:08:39 2024 -0500 fix(quest): revise rage text commit c2e13f8af245993f61eb614d6be609c833c2e711 Author: Sabe Jones <sabe@habitica.com> Date: Thu Mar 28 12:57:17 2024 -0500 fix(quest): correct rage and "guscompletion" commit ecdeb82df998ab75eceae3e877c1758187b1d22c Author: Sabe Jones <sabe@habitica.com> Date: Thu Mar 28 08:55:18 2024 -0500 fix(events): correct dates and times commit 232de436bbe7ba4c13f04ed66cc3b8a4a794d884 Author: Sabe Jones <sabe@habitica.com> Date: Wed Mar 27 09:03:06 2024 -0500 fix(content): a few more unruly Fungus commit 955e6e73387788797d1a83a037f73aa472515cec Author: Sabe Jones <sabe@habitica.com> Date: Wed Mar 27 09:00:03 2024 -0500 feat(content): wacky potions 2024 by @CuriousMagpie commit 34b72be4f447f00c31169c4cd6e8ba79655adf8a Author: Sabe Jones <sabe@habitica.com> Date: Wed Mar 27 08:56:27 2024 -0500 feat(event): AF by @CuriousMagpie
736 lines
25 KiB
JavaScript
736 lines
25 KiB
JavaScript
import { Schema } from 'mongoose';
|
|
import validator from 'validator';
|
|
import shared from '../../../common';
|
|
import { // eslint-disable-line import/no-cycle
|
|
getDefaultOwnedGear,
|
|
} from '../../libs/items/utils';
|
|
import { schema as PushDeviceSchema } from '../pushDevice';
|
|
import { schema as SubscriptionPlanSchema } from '../subscriptionPlan';
|
|
import { schema as TagSchema } from '../tag';
|
|
import { schema as UserNotificationSchema } from '../userNotification';
|
|
import { schema as WebhookSchema } from '../webhook';
|
|
|
|
const RESTRICTED_EMAIL_DOMAINS = Object.freeze(['habitica.com', 'habitrpg.com']);
|
|
|
|
// User schema definition
|
|
export const UserSchema = new Schema({
|
|
apiToken: {
|
|
$type: String,
|
|
default: shared.uuid,
|
|
},
|
|
|
|
auth: {
|
|
blocked: Boolean,
|
|
facebook: {
|
|
$type: Schema.Types.Mixed,
|
|
default: () => ({}),
|
|
},
|
|
google: {
|
|
$type: Schema.Types.Mixed,
|
|
default: () => ({}),
|
|
},
|
|
apple: { $type: Schema.Types.Mixed, default: () => ({}) },
|
|
local: {
|
|
email: {
|
|
$type: String,
|
|
validate: [{
|
|
validator: v => validator.isEmail(v),
|
|
message: shared.i18n.t('invalidEmail'),
|
|
}, {
|
|
validator (email) {
|
|
const lowercaseEmail = email.toLowerCase();
|
|
|
|
return RESTRICTED_EMAIL_DOMAINS.every(domain => !lowercaseEmail.endsWith(`@${domain}`));
|
|
},
|
|
message: shared.i18n.t('invalidEmailDomain', { domains: RESTRICTED_EMAIL_DOMAINS.join(', ') }),
|
|
}],
|
|
},
|
|
username: {
|
|
$type: String,
|
|
},
|
|
// Store a lowercase version of username to check for duplicates
|
|
lowerCaseUsername: String,
|
|
hashed_password: String, // eslint-disable-line camelcase
|
|
// Legacy password are hashed with SHA1, new ones with bcrypt
|
|
passwordHashMethod: {
|
|
$type: String,
|
|
enum: ['bcrypt', 'sha1'],
|
|
},
|
|
salt: String, // Salt for SHA1 encrypted passwords, not stored for bcrypt,
|
|
// Used to validate password reset codes and make sure only the most recent one can be used
|
|
passwordResetCode: String,
|
|
},
|
|
timestamps: {
|
|
created: { $type: Date, default: Date.now },
|
|
loggedin: { $type: Date, default: Date.now },
|
|
updated: { $type: Date, default: Date.now },
|
|
},
|
|
},
|
|
// We want to know *every* time an object updates.
|
|
// Mongoose uses __v to designate when an object contains arrays which
|
|
// have been updated, but we want *every* update
|
|
_v: { $type: Number, default: 0 },
|
|
migration: String,
|
|
achievements: {
|
|
originalUser: Boolean,
|
|
habitSurveys: Number,
|
|
ultimateGearSets: {
|
|
healer: { $type: Boolean, default: false },
|
|
wizard: { $type: Boolean, default: false },
|
|
rogue: { $type: Boolean, default: false },
|
|
warrior: { $type: Boolean, default: false },
|
|
},
|
|
beastMaster: Boolean,
|
|
beastMasterCount: Number,
|
|
mountMaster: Boolean,
|
|
mountMasterCount: Number,
|
|
triadBingo: Boolean,
|
|
triadBingoCount: Number,
|
|
veteran: Boolean,
|
|
snowball: Number,
|
|
spookySparkles: Number,
|
|
shinySeed: Number,
|
|
seafoam: Number,
|
|
streak: { $type: Number, default: 0 },
|
|
challenges: Array,
|
|
quests: {
|
|
$type: Schema.Types.Mixed,
|
|
default: () => ({}),
|
|
},
|
|
rebirths: Number,
|
|
rebirthLevel: Number,
|
|
perfect: { $type: Number, default: 0 },
|
|
habitBirthdays: Number,
|
|
valentine: Number,
|
|
nye: Number,
|
|
habiticaDays: Number,
|
|
greeting: Number,
|
|
thankyou: Number,
|
|
costumeContests: Number,
|
|
birthday: Number,
|
|
partyUp: Boolean,
|
|
partyOn: Boolean,
|
|
congrats: Number,
|
|
getwell: Number,
|
|
goodluck: Number,
|
|
royallyLoyal: Boolean,
|
|
joinedGuild: Boolean,
|
|
joinedChallenge: Boolean,
|
|
invitedFriend: Boolean,
|
|
lostMasterclasser: Boolean,
|
|
mindOverMatter: Boolean,
|
|
justAddWater: Boolean,
|
|
backToBasics: Boolean,
|
|
allYourBase: Boolean,
|
|
dustDevil: Boolean,
|
|
aridAuthority: Boolean,
|
|
kickstarter2019: Boolean,
|
|
monsterMagus: Boolean,
|
|
undeadUndertaker: Boolean,
|
|
primedForPainting: Boolean,
|
|
pearlyPro: Boolean,
|
|
tickledPink: Boolean,
|
|
rosyOutlook: Boolean,
|
|
bugBonanza: Boolean,
|
|
bareNecessities: Boolean,
|
|
freshwaterFriends: Boolean,
|
|
goodAsGold: Boolean,
|
|
allThatGlitters: Boolean,
|
|
boneCollector: Boolean,
|
|
skeletonCrew: Boolean,
|
|
seeingRed: Boolean,
|
|
redLetterDay: Boolean,
|
|
legendaryBestiary: Boolean,
|
|
seasonalSpecialist: Boolean,
|
|
violetsAreBlue: Boolean,
|
|
wildBlueYonder: Boolean,
|
|
domesticated: Boolean,
|
|
shadyCustomer: Boolean,
|
|
shadeOfItAll: Boolean,
|
|
zodiacZookeeper: Boolean,
|
|
birdsOfAFeather: Boolean,
|
|
reptacularRumble: Boolean,
|
|
woodlandWizard: Boolean,
|
|
boneToPick: Boolean,
|
|
polarPro: Boolean,
|
|
plantParent: Boolean,
|
|
dinosaurDynasty: Boolean,
|
|
bonelessBoss: Boolean,
|
|
duneBuddy: Boolean,
|
|
roughRider: Boolean,
|
|
rodentRuler: Boolean,
|
|
cats: Boolean,
|
|
// Onboarding Guide
|
|
createdTask: Boolean,
|
|
completedTask: Boolean,
|
|
hatchedPet: Boolean,
|
|
fedPet: Boolean,
|
|
purchasedEquipment: Boolean,
|
|
groupsBeta2022: Boolean,
|
|
},
|
|
|
|
backer: {
|
|
tier: Number,
|
|
npc: String,
|
|
tokensApplied: Boolean,
|
|
},
|
|
|
|
contributor: {
|
|
// 1-9, see https://habitica.fandom.com/wiki/Contributor_Rewards
|
|
level: {
|
|
$type: Number,
|
|
min: 0,
|
|
max: 9,
|
|
},
|
|
admin: Boolean,
|
|
// Artisan, Friend, Blacksmith, etc
|
|
text: String,
|
|
// a markdown textarea to list their contributions + links
|
|
contributions: String,
|
|
// user can own Critical Hammer of Bug-Crushing if this has a truthy value
|
|
critical: String,
|
|
},
|
|
permissions: {
|
|
fullAccess: Boolean, // esentially what was previously contributor.admin. Can do everything
|
|
news: Boolean,
|
|
userSupport: Boolean, // access User Support feature in Admin Panel
|
|
challengeAdmin: Boolean, // Can manage and administrate challenges
|
|
moderator: Boolean, // Can ban, flag users and manage social spaces
|
|
coupons: Boolean, // Can generate and request coupons
|
|
},
|
|
balance: { $type: Number, default: 0 },
|
|
|
|
purchased: {
|
|
ads: { $type: Boolean, default: false },
|
|
// eg, {skeleton: true, pumpkin: true, eb052b: true}
|
|
skin: {
|
|
$type: Schema.Types.Mixed,
|
|
default: () => ({}),
|
|
},
|
|
hair: {
|
|
$type: Schema.Types.Mixed,
|
|
default: () => ({}),
|
|
},
|
|
shirt: {
|
|
$type: Schema.Types.Mixed,
|
|
default: () => ({}),
|
|
},
|
|
background: {
|
|
$type: Schema.Types.Mixed,
|
|
default: () => ({}),
|
|
},
|
|
txnCount: { $type: Number, default: 0 },
|
|
mobileChat: Boolean,
|
|
plan: {
|
|
$type: SubscriptionPlanSchema,
|
|
default: () => ({}),
|
|
},
|
|
},
|
|
|
|
flags: {
|
|
customizationsNotification: { $type: Boolean, default: false },
|
|
showTour: { $type: Boolean, default: true },
|
|
tour: {
|
|
// -1 indicates "uninitiated", -2 means "complete",
|
|
// any other number is the current tour step (0-index)
|
|
intro: { $type: Number, default: -1 },
|
|
classes: { $type: Number, default: -1 },
|
|
stats: { $type: Number, default: -1 },
|
|
tavern: { $type: Number, default: -1 },
|
|
party: { $type: Number, default: -1 },
|
|
guilds: { $type: Number, default: -1 },
|
|
challenges: { $type: Number, default: -1 },
|
|
market: { $type: Number, default: -1 },
|
|
pets: { $type: Number, default: -1 },
|
|
mounts: { $type: Number, default: -1 },
|
|
hall: { $type: Number, default: -1 },
|
|
equipment: { $type: Number, default: -1 },
|
|
groupPlans: { $type: Number, default: -1 },
|
|
},
|
|
tutorial: {
|
|
common: {
|
|
habits: { $type: Boolean, default: false },
|
|
dailies: { $type: Boolean, default: false },
|
|
todos: { $type: Boolean, default: false },
|
|
rewards: { $type: Boolean, default: false },
|
|
party: { $type: Boolean, default: false },
|
|
pets: { $type: Boolean, default: false },
|
|
gems: { $type: Boolean, default: false },
|
|
skills: { $type: Boolean, default: false },
|
|
classes: { $type: Boolean, default: false },
|
|
tavern: { $type: Boolean, default: false },
|
|
equipment: { $type: Boolean, default: false },
|
|
items: { $type: Boolean, default: false },
|
|
mounts: { $type: Boolean, default: false },
|
|
inbox: { $type: Boolean, default: false },
|
|
stats: { $type: Boolean, default: false },
|
|
},
|
|
ios: {
|
|
addTask: { $type: Boolean, default: false },
|
|
editTask: { $type: Boolean, default: false },
|
|
deleteTask: { $type: Boolean, default: false },
|
|
filterTask: { $type: Boolean, default: false },
|
|
groupPets: { $type: Boolean, default: false },
|
|
inviteParty: { $type: Boolean, default: false },
|
|
reorderTask: { $type: Boolean, default: false },
|
|
},
|
|
},
|
|
dropsEnabled: { $type: Boolean, default: false }, // unused
|
|
itemsEnabled: { $type: Boolean, default: false },
|
|
lastNewStuffRead: { $type: String, default: '' },
|
|
// The newStuff field was changed to be a computed property when returning the user in json,
|
|
// so that it doesn't have to be updated for each bailey post.
|
|
// See models/user/hooks#toJSONTransform
|
|
// newStuff: { $type: Boolean, default: false },
|
|
rewrite: { $type: Boolean, default: true },
|
|
classSelected: { $type: Boolean, default: false },
|
|
mathUpdates: Boolean,
|
|
rebirthEnabled: { $type: Boolean, default: false },
|
|
lastFreeRebirth: Date,
|
|
levelDrops: {
|
|
$type: Schema.Types.Mixed,
|
|
default: () => ({}),
|
|
},
|
|
chatRevoked: Boolean,
|
|
chatShadowMuted: Boolean,
|
|
// Used to track the status of recapture emails sent to each user,
|
|
// can be 0 - no email sent - 1, 2, 3 or 4 - 4 means no more email will be sent to the user
|
|
recaptureEmailsPhase: { $type: Number, default: 0 },
|
|
// Needed to track the tip to send inside the email
|
|
weeklyRecapEmailsPhase: { $type: Number, default: 0 },
|
|
// Used to track when the next weekly recap should be sent
|
|
lastWeeklyRecap: { $type: Date, default: Date.now },
|
|
// Used to enable weekly recap emails as users login
|
|
lastWeeklyRecapDiscriminator: Boolean,
|
|
onboardingEmailsPhase: String, // Keep track of the latest onboarding email sent
|
|
communityGuidelinesAccepted: { $type: Boolean, default: false },
|
|
cronCount: { $type: Number, default: 0 },
|
|
welcomed: { $type: Boolean, default: false },
|
|
armoireEnabled: { $type: Boolean, default: true },
|
|
armoireOpened: { $type: Boolean, default: false },
|
|
armoireEmpty: { $type: Boolean, default: false },
|
|
cardReceived: { $type: Boolean, default: false },
|
|
warnedLowHealth: { $type: Boolean, default: false },
|
|
verifiedUsername: { $type: Boolean, default: false },
|
|
thirdPartyTools: { $type: Date },
|
|
},
|
|
|
|
history: {
|
|
exp: Array, // [{date: Date, value: Number}], // big peformance issues if these are defined
|
|
todos: Array, // [{data: Date, value: Number}] // big peformance issues if these are defined
|
|
},
|
|
|
|
items: {
|
|
gear: {
|
|
owned: {
|
|
$type: Schema.Types.Mixed,
|
|
default: () => getDefaultOwnedGear(),
|
|
},
|
|
|
|
equipped: {
|
|
weapon: String,
|
|
armor: { $type: String, default: 'armor_base_0' },
|
|
head: { $type: String, default: 'head_base_0' },
|
|
shield: { $type: String, default: 'shield_base_0' },
|
|
back: String,
|
|
headAccessory: String,
|
|
eyewear: String,
|
|
body: String,
|
|
},
|
|
costume: {
|
|
weapon: String,
|
|
armor: { $type: String, default: 'armor_base_0' },
|
|
head: { $type: String, default: 'head_base_0' },
|
|
shield: { $type: String, default: 'shield_base_0' },
|
|
back: String,
|
|
headAccessory: String,
|
|
eyewear: String,
|
|
body: String,
|
|
},
|
|
},
|
|
|
|
special: {
|
|
snowball: { $type: Number, default: 0 },
|
|
spookySparkles: { $type: Number, default: 0 },
|
|
shinySeed: { $type: Number, default: 0 },
|
|
seafoam: { $type: Number, default: 0 },
|
|
valentine: { $type: Number, default: 0 },
|
|
valentineReceived: Array, // array of strings, by sender name
|
|
nye: { $type: Number, default: 0 },
|
|
nyeReceived: Array,
|
|
greeting: { $type: Number, default: 0 },
|
|
greetingReceived: Array,
|
|
thankyou: { $type: Number, default: 0 },
|
|
thankyouReceived: Array,
|
|
birthday: { $type: Number, default: 0 },
|
|
birthdayReceived: Array,
|
|
congrats: { $type: Number, default: 0 },
|
|
congratsReceived: Array,
|
|
getwell: { $type: Number, default: 0 },
|
|
getwellReceived: Array,
|
|
goodluck: { $type: Number, default: 0 },
|
|
goodluckReceived: Array,
|
|
},
|
|
|
|
// -------------- Animals -------------------
|
|
// Complex bit here. The result looks like:
|
|
// pets: {
|
|
// 'Wolf-Desert': 0, // 0 means does not own
|
|
// 'PandaCub-Red': 10, // Number represents "Growth Points"
|
|
// etc...
|
|
// }
|
|
pets: {
|
|
$type: Schema.Types.Mixed,
|
|
default: () => ({}),
|
|
},
|
|
currentPet: { $type: String, default: '' }, // Cactus-Desert
|
|
|
|
// eggs: {
|
|
// 'PandaCub': 0, // 0 indicates "doesn't own"
|
|
// 'Wolf': 5 // Number indicates "stacking"
|
|
// }
|
|
eggs: {
|
|
$type: Schema.Types.Mixed,
|
|
default: () => ({}),
|
|
},
|
|
|
|
// hatchingPotions: {
|
|
// 'Desert': 0, // 0 indicates "doesn't own"
|
|
// 'CottonCandyBlue': 5 // Number indicates "stacking"
|
|
// }
|
|
hatchingPotions: {
|
|
$type: Schema.Types.Mixed,
|
|
default: () => ({}),
|
|
},
|
|
|
|
// Food: {
|
|
// 'Watermelon': 0, // 0 indicates "doesn't own"
|
|
// 'RottenMeat': 5 // Number indicates "stacking"
|
|
// }
|
|
food: {
|
|
$type: Schema.Types.Mixed,
|
|
default: () => ({}),
|
|
},
|
|
|
|
// mounts: {
|
|
// 'Wolf-Desert': true,
|
|
// 'PandaCub-Red': false,
|
|
// etc...
|
|
// }
|
|
mounts: {
|
|
$type: Schema.Types.Mixed,
|
|
default: () => ({}),
|
|
},
|
|
currentMount: { $type: String, default: '' }, // Cactus-Desert
|
|
|
|
// Quests: {
|
|
// 'boss_0': 0, // 0 indicates "doesn't own"
|
|
// 'collection_honey': 5 // Number indicates "stacking"
|
|
// }
|
|
quests: {
|
|
$type: Schema.Types.Mixed,
|
|
default: () => ({}),
|
|
},
|
|
|
|
lastDrop: {
|
|
date: { $type: Date, default: Date.now },
|
|
count: { $type: Number, default: 0 },
|
|
},
|
|
},
|
|
|
|
lastCron: { $type: Date, default: Date.now },
|
|
_cronSignature: { $type: String, default: 'NOT_RUNNING' }, // Private property used to avoid double cron
|
|
// Lock property to avoid double subscription. Not strictly private because we query on it
|
|
_subSignature: { $type: String, default: 'NOT_RUNNING' },
|
|
|
|
// {GROUP_ID: Boolean}, represents whether they have unseen chat messages
|
|
newMessages: {
|
|
$type: Schema.Types.Mixed,
|
|
default: () => ({}),
|
|
},
|
|
|
|
challenges: [{ $type: String, ref: 'Challenge', validate: [v => validator.isUUID(v), 'Invalid uuid for user challenges.'] }],
|
|
|
|
invitations: {
|
|
// Using an array without validation because otherwise mongoose
|
|
// treat this as a subdocument and applies _id by default
|
|
// Schema is (id, name, inviter, publicGuild)
|
|
// TODO one way to fix is https://mongoosejs.com/docs/guide.html#_id
|
|
guilds: { $type: Array, default: () => [] },
|
|
// Using a Mixed type because otherwise user.invitations.party = {}
|
|
// to reset invitation, causes validation to fail TODO
|
|
// schema is the same as for guild invitations (id, name, inviter)
|
|
party: {
|
|
$type: Schema.Types.Mixed,
|
|
default: () => ({}),
|
|
},
|
|
parties: [{
|
|
id: {
|
|
$type: String,
|
|
ref: 'Group',
|
|
required: true,
|
|
validate: [v => validator.isUUID(v), 'Invalid uuid for user invitation party id.'],
|
|
},
|
|
name: {
|
|
$type: String,
|
|
required: true,
|
|
},
|
|
inviter: {
|
|
$type: String,
|
|
ref: 'User',
|
|
required: true,
|
|
validate: [v => validator.isUUID(v), 'Invalid uuid for user invitation inviter id.'],
|
|
},
|
|
cancelledPlan: {
|
|
$type: Boolean,
|
|
},
|
|
}],
|
|
},
|
|
|
|
guilds: [{ $type: String, ref: 'Group', validate: [v => validator.isUUID(v), 'Invalid uuid for user guild.'] }],
|
|
|
|
party: {
|
|
_id: { $type: String, validate: [v => validator.isUUID(v), 'Invalid uuid for user party.'], ref: 'Group' },
|
|
order: { $type: String, default: 'level' },
|
|
orderAscending: { $type: String, default: 'ascending' },
|
|
quest: {
|
|
key: String,
|
|
progress: {
|
|
up: { $type: Number, default: 0 },
|
|
down: { $type: Number, default: 0 },
|
|
collect: {
|
|
$type: Schema.Types.Mixed,
|
|
default: () => ({}),
|
|
},
|
|
collectedItems: { $type: Number, default: 0 },
|
|
},
|
|
// When quest is done, we move it from key => completed,
|
|
// and it's a one-time flag (for modal) that they unset by clicking "ok" in browser
|
|
completed: String,
|
|
// Set to true when invite is pending, set to false when quest
|
|
// invite is accepted or rejected, quest starts, or quest is cancelled
|
|
RSVPNeeded: { $type: Boolean, default: false },
|
|
},
|
|
seeking: Date,
|
|
},
|
|
preferences: {
|
|
dayStart: {
|
|
$type: Number, default: 0, min: 0, max: 23,
|
|
},
|
|
size: { $type: String, enum: ['broad', 'slim'], default: 'slim' },
|
|
hair: {
|
|
color: { $type: String, default: 'red' },
|
|
base: { $type: Number, default: 3 },
|
|
bangs: { $type: Number, default: 1 },
|
|
beard: { $type: Number, default: 0 },
|
|
mustache: { $type: Number, default: 0 },
|
|
flower: { $type: Number, default: 1 },
|
|
},
|
|
hideHeader: { $type: Boolean, default: false },
|
|
skin: { $type: String, default: '915533' },
|
|
shirt: { $type: String, default: 'blue' },
|
|
timezoneOffset: { $type: Number, default: 0 },
|
|
sound: { $type: String, default: 'rosstavoTheme', enum: ['off', ...shared.content.audioThemes] },
|
|
chair: { $type: String, default: 'none' },
|
|
timezoneOffsetAtLastCron: Number,
|
|
language: String,
|
|
automaticAllocation: Boolean,
|
|
allocationMode: { $type: String, enum: ['flat', 'classbased', 'taskbased'], default: 'flat' },
|
|
autoEquip: { $type: Boolean, default: true },
|
|
costume: { $type: Boolean, default: false },
|
|
dateFormat: { $type: String, enum: ['MM/dd/yyyy', 'dd/MM/yyyy', 'yyyy/MM/dd'], default: 'MM/dd/yyyy' },
|
|
sleep: { $type: Boolean, default: false },
|
|
stickyHeader: { $type: Boolean, default: true },
|
|
disableClasses: { $type: Boolean, default: false },
|
|
newTaskEdit: { $type: Boolean, default: false },
|
|
// not used anymore, now the current filter is saved in preferences.activeFilter
|
|
dailyDueDefaultView: { $type: Boolean, default: false },
|
|
// deprecated, unused
|
|
advancedCollapsed: { $type: Boolean, default: false },
|
|
toolbarCollapsed: { $type: Boolean, default: false },
|
|
reverseChatOrder: { $type: Boolean, default: false },
|
|
developerMode: { $type: Boolean, default: false },
|
|
background: String,
|
|
// deprecated, unused
|
|
displayInviteToPartyWhenPartyIs1: { $type: Boolean, default: true },
|
|
webhooks: {
|
|
$type: Schema.Types.Mixed,
|
|
default: () => ({}),
|
|
},
|
|
// For the following fields make sure to use strict
|
|
// comparison when searching for falsey values (=== false)
|
|
// As users who didn't login after these were introduced may have them undefined/null
|
|
emailNotifications: {
|
|
unsubscribeFromAll: { $type: Boolean, default: false },
|
|
newPM: { $type: Boolean, default: true },
|
|
kickedGroup: { $type: Boolean, default: true },
|
|
wonChallenge: { $type: Boolean, default: true },
|
|
giftedGems: { $type: Boolean, default: true },
|
|
giftedSubscription: { $type: Boolean, default: true },
|
|
invitedParty: { $type: Boolean, default: true },
|
|
invitedGuild: { $type: Boolean, default: true },
|
|
questStarted: { $type: Boolean, default: true },
|
|
invitedQuest: { $type: Boolean, default: true },
|
|
// remindersToLogin: {$type: Boolean, default: true},
|
|
// importantAnnouncements are in fact the recapture emails
|
|
importantAnnouncements: { $type: Boolean, default: true },
|
|
weeklyRecaps: { $type: Boolean, default: true },
|
|
onboarding: { $type: Boolean, default: true },
|
|
majorUpdates: { $type: Boolean, default: true },
|
|
subscriptionReminders: { $type: Boolean, default: true },
|
|
contentRelease: { $type: Boolean, default: true },
|
|
},
|
|
pushNotifications: {
|
|
unsubscribeFromAll: { $type: Boolean, default: false },
|
|
newPM: { $type: Boolean, default: true },
|
|
wonChallenge: { $type: Boolean, default: true },
|
|
giftedGems: { $type: Boolean, default: true },
|
|
giftedSubscription: { $type: Boolean, default: true },
|
|
invitedParty: { $type: Boolean, default: true },
|
|
invitedGuild: { $type: Boolean, default: true },
|
|
questStarted: { $type: Boolean, default: true },
|
|
invitedQuest: { $type: Boolean, default: true },
|
|
majorUpdates: { $type: Boolean, default: true },
|
|
mentionParty: { $type: Boolean, default: true },
|
|
mentionJoinedGuild: { $type: Boolean, default: true },
|
|
mentionUnjoinedGuild: { $type: Boolean, default: true },
|
|
partyActivity: { $type: Boolean, default: true },
|
|
contentRelease: { $type: Boolean, default: true },
|
|
},
|
|
suppressModals: {
|
|
levelUp: { $type: Boolean, default: false },
|
|
hatchPet: { $type: Boolean, default: false },
|
|
raisePet: { $type: Boolean, default: false },
|
|
streak: { $type: Boolean, default: false },
|
|
},
|
|
tasks: {
|
|
groupByChallenge: { $type: Boolean, default: false }, // @TODO remove? not used
|
|
confirmScoreNotes: { $type: Boolean, default: false }, // @TODO remove? not used
|
|
mirrorGroupTasks: [
|
|
{ $type: String, validate: [v => validator.isUUID(v), 'Invalid group UUID.'], ref: 'Group' },
|
|
],
|
|
activeFilter: {
|
|
habit: { $type: String, default: 'all' },
|
|
daily: { $type: String, default: 'all' },
|
|
todo: { $type: String, default: 'remaining' },
|
|
reward: { $type: String, default: 'all' },
|
|
},
|
|
},
|
|
improvementCategories: {
|
|
$type: Array,
|
|
validate: categories => {
|
|
const validCategories = ['work', 'exercise', 'healthWellness', 'school', 'teams', 'chores', 'creativity'];
|
|
const isValidCategory = categories
|
|
.every(category => validCategories.indexOf(category) !== -1);
|
|
return isValidCategory;
|
|
},
|
|
},
|
|
},
|
|
profile: {
|
|
blurb: String,
|
|
imageUrl: String,
|
|
name: {
|
|
$type: String,
|
|
required: true,
|
|
trim: true,
|
|
},
|
|
flags: { $type: Schema.Types.Mixed },
|
|
},
|
|
stats: {
|
|
hp: { $type: Number, default: shared.maxHealth },
|
|
mp: { $type: Number, default: 10, min: 0 },
|
|
exp: { $type: Number, default: 0 },
|
|
gp: { $type: Number, default: 0, min: 0 },
|
|
lvl: {
|
|
$type: Number,
|
|
default: 1,
|
|
min: 1,
|
|
max: shared.constants.MAX_LEVEL_HARD_CAP,
|
|
},
|
|
|
|
// Class System
|
|
class: {
|
|
$type: String, enum: shared.content.classes, default: 'warrior', required: true,
|
|
},
|
|
points: { $type: Number, default: 0, min: 0 },
|
|
str: { $type: Number, default: 0, min: 0 },
|
|
con: { $type: Number, default: 0, min: 0 },
|
|
int: { $type: Number, default: 0, min: 0 },
|
|
per: { $type: Number, default: 0, min: 0 },
|
|
buffs: {
|
|
str: { $type: Number, default: 0, min: 0 },
|
|
int: { $type: Number, default: 0, min: 0 },
|
|
per: { $type: Number, default: 0, min: 0 },
|
|
con: { $type: Number, default: 0, min: 0 },
|
|
stealth: { $type: Number, default: 0, min: 0 },
|
|
streaks: { $type: Boolean, default: false },
|
|
snowball: { $type: Boolean, default: false },
|
|
spookySparkles: { $type: Boolean, default: false },
|
|
shinySeed: { $type: Boolean, default: false },
|
|
seafoam: { $type: Boolean, default: false },
|
|
},
|
|
training: {
|
|
int: { $type: Number, default: 0 },
|
|
per: { $type: Number, default: 0 },
|
|
str: { $type: Number, default: 0 },
|
|
con: { $type: Number, default: 0 },
|
|
},
|
|
},
|
|
|
|
notifications: [UserNotificationSchema],
|
|
tags: [TagSchema],
|
|
|
|
inbox: {
|
|
// messages are stored in the Inbox collection
|
|
newMessages: { $type: Number, default: 0 },
|
|
blocks: { $type: Array, default: () => [] },
|
|
optOut: { $type: Boolean, default: false },
|
|
},
|
|
tasksOrder: {
|
|
habits: [{ $type: String, ref: 'Task' }],
|
|
dailys: [{ $type: String, ref: 'Task' }],
|
|
todos: [{ $type: String, ref: 'Task' }],
|
|
rewards: [{ $type: String, ref: 'Task' }],
|
|
},
|
|
extra: {
|
|
$type: Schema.Types.Mixed,
|
|
default: () => ({}),
|
|
},
|
|
pushDevices: [PushDeviceSchema],
|
|
_ABtests: {
|
|
$type: Schema.Types.Mixed,
|
|
default: () => ({}),
|
|
},
|
|
webhooks: [WebhookSchema],
|
|
loginIncentives: { $type: Number, default: 0 },
|
|
invitesSent: { $type: Number, default: 0 },
|
|
|
|
// Items manually pinned by the user
|
|
pinnedItems: [{
|
|
_id: false,
|
|
path: { $type: String },
|
|
type: { $type: String },
|
|
}],
|
|
// Ordered array of shown pinned items,
|
|
// necessary for sorting because seasonal items are not stored in pinnedItems
|
|
pinnedItemsOrder: [{ $type: String }],
|
|
// Items the user manually unpinned from the ones suggested by Habitica
|
|
unpinnedItems: [{
|
|
_id: false,
|
|
path: { $type: String },
|
|
type: { $type: String },
|
|
}],
|
|
|
|
// only visible to staff and moderators
|
|
secret: {
|
|
text: String,
|
|
},
|
|
}, {
|
|
skipVersioning: { notifications: true },
|
|
strict: true,
|
|
minimize: false, // So empty objects are returned
|
|
typeKey: '$type', // So that we can use fields named `type`
|
|
});
|
|
|
|
export default UserSchema; // fallback export until all imports using the Named one
|