Habiticalib 0.1.0a2__tar.gz → 0.1.0a3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/.github/labels.yml +0 -3
  2. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/.github/workflows/build.yml +1 -1
  3. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/PKG-INFO +2 -3
  4. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/pyproject.toml +2 -2
  5. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/src/habiticalib/__init__.py +4 -2
  6. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/src/habiticalib/const.py +1 -1
  7. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/src/habiticalib/exceptions.py +13 -4
  8. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/src/habiticalib/helpers.py +25 -1
  9. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/src/habiticalib/lib.py +24 -14
  10. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/src/habiticalib/types.py +76 -64
  11. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/tests/__snapshots__/test_avatar.ambr +1 -1
  12. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/tests/__snapshots__/test_user.ambr +1 -1
  13. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/.cruft.json +0 -0
  14. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/.editorconfig +0 -0
  15. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/.github/FUNDING.yml +0 -0
  16. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/.github/dependabot.yml +0 -0
  17. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/.github/release-drafter.yml +0 -0
  18. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/.github/workflows/documentation.yml +0 -0
  19. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/.github/workflows/draft.yml +0 -0
  20. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/.github/workflows/labeler.yml +0 -0
  21. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/.gitignore +0 -0
  22. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/.pre-commit-config.yaml +0 -0
  23. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/.vscode/settings.json +0 -0
  24. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/LICENSE +0 -0
  25. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/README.md +0 -0
  26. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/docs/index.md +0 -0
  27. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/docs/reference/habiticalib.md +0 -0
  28. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/mkdocs.yml +0 -0
  29. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/src/habiticalib/py.typed +0 -0
  30. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/tests/__init__.py +0 -0
  31. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/tests/conftest.py +0 -0
  32. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/tests/fixtures/user.json +0 -0
  33. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/tests/fixtures/user_styles.json +0 -0
  34. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/tests/fixtures/user_styles_kickstarter.json +0 -0
  35. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/tests/fixtures/user_styles_seafoam.json +0 -0
  36. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/tests/fixtures/user_styles_shinySeed.json +0 -0
  37. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/tests/fixtures/user_styles_sleeping.json +0 -0
  38. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/tests/fixtures/user_styles_snowball.json +0 -0
  39. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/tests/fixtures/user_styles_spookySparkles.json +0 -0
  40. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/tests/fixtures/user_styles_with_chair.json +0 -0
  41. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/tests/test_avatar.py +0 -0
  42. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/tests/test_init.py +0 -0
  43. {habiticalib-0.1.0a2 → habiticalib-0.1.0a3}/tests/test_user.py +0 -0
@@ -28,7 +28,6 @@
28
28
  - name: feature
29
29
  description: New feature or request
30
30
  color: a2eeef
31
- from_name: enhancement
32
31
  - name: github_actions
33
32
  description: Pull requests that update Github_actions code
34
33
  color: "000000"
@@ -53,11 +52,9 @@
53
52
  - name: code quality
54
53
  description: Code quality improvements
55
54
  color: ef67c4
56
- from_name: refactor
57
55
  - name: deprecation
58
56
  description: Removals and Deprecations
59
57
  color: 9ae7ea
60
- from_name: removal
61
58
  - name: style
62
59
  description: Style
63
60
  color: c120e5
@@ -27,7 +27,7 @@ jobs:
27
27
  - name: Test
28
28
  run: |
29
29
  hatch run test-cov-xml
30
- - uses: codecov/codecov-action@v4
30
+ - uses: codecov/codecov-action@v5
31
31
  with:
32
32
  token: ${{ secrets.CODECOV_TOKEN }}
33
33
  fail_ci_if_error: true
@@ -1,12 +1,11 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: Habiticalib
3
- Version: 0.1.0a2
3
+ Version: 0.1.0a3
4
4
  Summary: Asynchronous Python client library for the Habitica API
5
5
  Project-URL: Documentation, https://tr4nt0r.github.io/habiticalib/
6
6
  Project-URL: Source, https://github.com/tr4nt0r/habiticalib
7
7
  Author-email: Manfred Dennerlein Rodelo <manfred@dennerlein.name>
8
8
  License: MIT License
9
- License-File: LICENSE
10
9
  Classifier: License :: OSI Approved :: MIT License
11
10
  Classifier: Operating System :: OS Independent
12
11
  Classifier: Programming Language :: Python :: 3 :: Only
@@ -14,7 +13,7 @@ Requires-Python: >=3.12
14
13
  Requires-Dist: aiohttp~=3.9
15
14
  Requires-Dist: mashumaro~=3.13
16
15
  Requires-Dist: orjson~=3.10
17
- Requires-Dist: pillow~=10.4
16
+ Requires-Dist: pillow~=11.0
18
17
  Description-Content-Type: text/markdown
19
18
 
20
19
  # Habiticalib
@@ -69,7 +69,7 @@ dependencies = [
69
69
  "aiohttp==3.10.10",
70
70
  "mashumaro==3.13.1",
71
71
  "orjson==3.10.7",
72
- "Pillow==10.4.0",
72
+ "Pillow==11.0.0",
73
73
  "mypy==1.12.0",
74
74
  "ruff==0.7.0",
75
75
  "pytest==8.3.3",
@@ -125,7 +125,7 @@ dependencies = [
125
125
  "aiohttp~=3.9",
126
126
  "mashumaro~=3.13",
127
127
  "orjson~=3.10",
128
- "Pillow~=10.4"
128
+ "Pillow~=11.0"
129
129
  ]
130
130
 
131
131
  [project.urls]
@@ -6,13 +6,14 @@ from .exceptions import (
6
6
  HabiticaException,
7
7
  NotAuthorizedError,
8
8
  NotFoundError,
9
+ TooManyRequestsError,
9
10
  )
10
11
  from .lib import Habitica
11
12
  from .types import (
12
13
  Attributes,
13
- Class,
14
14
  Direction,
15
15
  Frequency,
16
+ HabiticaClass,
16
17
  HabiticaClassSystemResponse,
17
18
  HabiticaErrorResponse,
18
19
  HabiticaLoginResponse,
@@ -39,11 +40,11 @@ __all__ = [
39
40
  "ASSETS_URL",
40
41
  "Attributes",
41
42
  "BadRequestError",
42
- "Class",
43
43
  "DEFAULT_URL",
44
44
  "Direction",
45
45
  "Frequency",
46
46
  "Habitica",
47
+ "HabiticaClass",
47
48
  "HabiticaClassSystemResponse",
48
49
  "HabiticaErrorResponse",
49
50
  "HabiticaException",
@@ -65,5 +66,6 @@ __all__ = [
65
66
  "Task",
66
67
  "TaskFilter",
67
68
  "TaskType",
69
+ "TooManyRequestsError",
68
70
  "UserStyles",
69
71
  ]
@@ -1,6 +1,6 @@
1
1
  """Constants for Habiticalib."""
2
2
 
3
- __version__ = "0.1.0a2"
3
+ __version__ = "0.1.0a3"
4
4
 
5
5
  DEFAULT_URL = "https://habitica.com/"
6
6
  ASSETS_URL = "https://habitica-assets.s3.amazonaws.com/mobileApp/images/"
@@ -1,5 +1,6 @@
1
1
  """Exceptions for Habiticalib."""
2
2
 
3
+ from datetime import datetime
3
4
  from typing import Self
4
5
 
5
6
  from multidict import CIMultiDictProxy
@@ -17,10 +18,18 @@ class HabiticaException(Exception): # noqa: N818
17
18
  ) -> None:
18
19
  """Initialize the Exception."""
19
20
  self.error = error
20
- self.rate_limit = headers.get("x-ratelimit-limit")
21
- self.rate_limit_remaining = headers.get("x-ratelimit-remaining")
22
- self.rate_limit_reset = headers.get("x-ratelimit-reset")
23
- self.retry_after = headers.get("retry-after")
21
+ self.rate_limit: int | None = (
22
+ int(r) if (r := headers.get("x-ratelimit-limit")) else None
23
+ )
24
+ self.rate_limit_remaining: int | None = (
25
+ int(r) if (r := headers.get("x-ratelimit-remaining")) else None
26
+ )
27
+ self.rate_limit_reset: datetime | None = (
28
+ datetime.strptime(r[:33], "%a %b %d %Y %H:%M:%S %Z%z")
29
+ if (r := headers.get("x-ratelimit-reset"))
30
+ else None
31
+ )
32
+ self.retry_after: int = round(float(headers.get("retry-after", 0)))
24
33
 
25
34
  super().__init__(error.message)
26
35
 
@@ -1,7 +1,10 @@
1
1
  """Helper functions for Habiticalib."""
2
2
 
3
- from dataclasses import asdict
3
+ from dataclasses import asdict, is_dataclass
4
+ from datetime import date, datetime
5
+ from enum import Enum
4
6
  import platform
7
+ from typing import Any
5
8
  import uuid
6
9
 
7
10
  import aiohttp
@@ -112,3 +115,24 @@ def extract_user_styles(user_data: HabiticaUserResponse) -> UserStyles:
112
115
  """Extract user styles from a user data object."""
113
116
  data: UserData = user_data.data
114
117
  return UserStyles.from_dict(asdict(data))
118
+
119
+
120
+ def deserialize_task(value: Any) -> Any: # noqa: PLR0911
121
+ """Recursively convert Enums to values, dates to ISO strings, UUIDs to strings."""
122
+
123
+ if is_dataclass(value) and not isinstance(value, type):
124
+ # Convert dataclass to dict and recursively deserialize
125
+ return deserialize_task(asdict(value))
126
+ if isinstance(value, Enum):
127
+ return value.value # Convert Enum to its value
128
+ if isinstance(value, uuid.UUID):
129
+ return str(value) # Convert UUID to string
130
+ if isinstance(value, datetime | date):
131
+ return value.isoformat() # Convert datetime/date to ISO string
132
+ if isinstance(value, list):
133
+ # Recursively apply deserialization to each item in the list
134
+ return [deserialize_task(item) for item in value]
135
+ if isinstance(value, dict):
136
+ # Recursively apply deserialization to each key-value pair in the dictionary
137
+ return {k: deserialize_task(v) for k, v in value.items()}
138
+ return value # Return other types unchanged
@@ -19,11 +19,17 @@ from .exceptions import (
19
19
  NotFoundError,
20
20
  TooManyRequestsError,
21
21
  )
22
- from .helpers import extract_user_styles, get_user_agent, get_x_client, join_fields
22
+ from .helpers import (
23
+ deserialize_task,
24
+ extract_user_styles,
25
+ get_user_agent,
26
+ get_x_client,
27
+ join_fields,
28
+ )
23
29
  from .types import (
24
30
  Attributes,
25
- Class,
26
31
  Direction,
32
+ HabiticaClass,
27
33
  HabiticaClassSystemResponse,
28
34
  HabiticaErrorResponse,
29
35
  HabiticaLoginResponse,
@@ -378,14 +384,16 @@ class Habitica:
378
384
 
379
385
  Examples
380
386
  --------
381
- >>> new_task = Task(name="New Task", ...)
387
+ >>> new_task = Task(text="New Task", type=TaskType.TODO ...)
382
388
  >>> create_response = await habitica.create_task(new_task)
383
389
  >>> print(create_response.data) # Displays the created task information
384
390
  """
385
391
  url = self.url / "api/v3/tasks/user"
386
392
 
393
+ json = deserialize_task(task)
394
+
387
395
  return HabiticaTaskResponse.from_json(
388
- await self._request("post", url=url, json=task.to_dict()),
396
+ await self._request("post", url=url, json=json),
389
397
  )
390
398
 
391
399
  async def update_task(self, task_id: UUID, task: Task) -> HabiticaTaskResponse:
@@ -421,14 +429,16 @@ class Habitica:
421
429
  Examples
422
430
  --------
423
431
  >>> task_id = UUID("12345678-1234-5678-1234-567812345678")
424
- >>> updated_task = Task(name="Updated Task", ...)
432
+ >>> updated_task = Task(text="Updated Task", ...)
425
433
  >>> update_response = await habitica.update_task(task_id, updated_task)
426
434
  >>> print(update_response.data) # Displays the updated task information
427
435
  """
428
436
  url = self.url / "api/v3/tasks" / str(task_id)
429
437
 
438
+ json = deserialize_task(task)
439
+
430
440
  return HabiticaTaskResponse.from_json(
431
- await self._request("put", url=url, json=task.to_dict()),
441
+ await self._request("put", url=url, json=json),
432
442
  )
433
443
 
434
444
  async def delete_task(self, task_id: UUID) -> HabiticaResponse:
@@ -799,14 +809,14 @@ class Habitica:
799
809
 
800
810
  async def cast_skill(
801
811
  self,
802
- spell: Skill,
812
+ skill: Skill,
803
813
  target_id: UUID | None = None,
804
814
  ) -> HabiticaUserResponse:
805
815
  """Cast a skill (spell) in Habitica, optionally targeting a specific user, task or party.
806
816
 
807
817
  Parameters
808
818
  ----------
809
- spell : Skill
819
+ skill : Skill
810
820
  The skill (or spell) to be cast. This should be a valid `Skill` enum value.
811
821
  target_id : UUID, optional
812
822
  The unique identifier of the target for the skill. If the skill does not require a target,
@@ -832,7 +842,7 @@ class Habitica:
832
842
  TimeoutError
833
843
  If the connection times out.
834
844
  """
835
- url = self.url / "api/v3/class/cast" / spell
845
+ url = self.url / "api/v3/user/class/cast" / skill
836
846
  params = {}
837
847
 
838
848
  if target_id:
@@ -889,7 +899,7 @@ class Habitica:
889
899
 
890
900
  return HabiticaResponse.from_json(await self._request("post", url=url))
891
901
 
892
- async def change_class(self, Class: Class) -> HabiticaClassSystemResponse: # noqa: N803
902
+ async def change_class(self, Class: HabiticaClass) -> HabiticaClassSystemResponse: # noqa: N803
893
903
  """Change the user's class in Habitica.
894
904
 
895
905
  This method sends a request to the Habitica API to change the user's class
@@ -920,7 +930,7 @@ class Habitica:
920
930
 
921
931
  Examples
922
932
  --------
923
- >>> new_class = Class.WARRIOR
933
+ >>> new_class = HabiticaClass.WARRIOR
924
934
  >>> change_response = await habitica.change_class(new_class)
925
935
  >>> print(change_response.data.stats) # Displays the user's stats after class change
926
936
  """
@@ -1068,7 +1078,7 @@ class Habitica:
1068
1078
  url = self.url / "api/v3/tags"
1069
1079
 
1070
1080
  return HabiticaTagsResponse.from_json(
1071
- await self._request("post", url=url),
1081
+ await self._request("get", url=url),
1072
1082
  )
1073
1083
 
1074
1084
  async def get_tag(self, tag_id: UUID) -> HabiticaTagResponse:
@@ -1106,7 +1116,7 @@ class Habitica:
1106
1116
  url = self.url / "api/v3/tags" / str(tag_id)
1107
1117
 
1108
1118
  return HabiticaTagResponse.from_json(
1109
- await self._request("post", url=url),
1119
+ await self._request("get", url=url),
1110
1120
  )
1111
1121
 
1112
1122
  async def delete_tag(self, tag_id: UUID) -> HabiticaResponse:
@@ -1266,7 +1276,7 @@ class Habitica:
1266
1276
  url = self.url / "api/v3/reorder-tags"
1267
1277
  json = {"tagId": str(tag_id), "to": to}
1268
1278
 
1269
- return HabiticaTagResponse.from_json(
1279
+ return HabiticaResponse.from_json(
1270
1280
  await self._request("post", url=url, json=json),
1271
1281
  )
1272
1282
 
@@ -4,13 +4,13 @@
4
4
  from __future__ import annotations
5
5
 
6
6
  from dataclasses import dataclass, field
7
+ import datetime as dt
7
8
  from datetime import UTC, datetime
8
9
  from enum import Enum, StrEnum
9
- from typing import Any
10
+ from typing import Any, NotRequired, TypedDict
10
11
  from uuid import UUID # noqa: TCH003
11
12
 
12
13
  from mashumaro import field_options
13
- from mashumaro.config import BaseConfig
14
14
  from mashumaro.mixins.orjson import DataClassORJSONMixin
15
15
 
16
16
 
@@ -61,6 +61,7 @@ class LoginData:
61
61
  apiToken: str
62
62
  newUser: bool
63
63
  username: str
64
+ passwordResetCode: str | None = None
64
65
 
65
66
 
66
67
  @dataclass(kw_only=True)
@@ -74,27 +75,27 @@ class HabiticaLoginResponse(HabiticaResponse):
74
75
  class LocalAuth:
75
76
  """Auth local data."""
76
77
 
77
- email: str
78
- username: str
79
- lowerCaseUsername: str
80
- has_password: bool
78
+ email: str | None = None
79
+ username: str | None = None
80
+ lowerCaseUsername: str | None = None
81
+ has_password: bool | None = None
81
82
 
82
83
 
83
84
  @dataclass(kw_only=True)
84
85
  class LocalTimestamps:
85
86
  """Timestamps local data."""
86
87
 
87
- created: datetime
88
- loggedin: datetime
89
- updated: datetime
88
+ created: datetime | None = None
89
+ loggedin: datetime | None = None
90
+ updated: datetime | None = None
90
91
 
91
92
 
92
93
  @dataclass(kw_only=True)
93
94
  class AuthUser:
94
95
  """User auth data."""
95
96
 
96
- local: LocalAuth | None = None
97
- timestamps: LocalTimestamps | None = None
97
+ local: LocalAuth = field(default_factory=LocalAuth)
98
+ timestamps: LocalTimestamps = field(default_factory=LocalTimestamps)
98
99
  facebook: dict | None = None
99
100
  google: dict | None = None
100
101
  apple: dict | None = None
@@ -628,6 +629,15 @@ class TrainingStats:
628
629
  Int: int | None = field(default=None, metadata=field_options(alias="int"))
629
630
 
630
631
 
632
+ class HabiticaClass(StrEnum):
633
+ """Habitica's player classes."""
634
+
635
+ WARRIOR = "warrior"
636
+ ROGUE = "rogue"
637
+ MAGE = "wizard"
638
+ HEALER = "healer"
639
+
640
+
631
641
  @dataclass(kw_only=True)
632
642
  class StatsUser:
633
643
  """Stats user data."""
@@ -639,7 +649,9 @@ class StatsUser:
639
649
  exp: int | None = None
640
650
  gp: float | None = None
641
651
  lvl: int | None = None
642
- Class: str = field(default="warrior", metadata=field_options(alias="class"))
652
+ Class: HabiticaClass | None = field(
653
+ default=None, metadata=field_options(alias="class")
654
+ )
643
655
  points: int | None = None
644
656
  Str: int | None = field(default=None, metadata=field_options(alias="str"))
645
657
  con: int | None = None
@@ -650,6 +662,13 @@ class StatsUser:
650
662
  Int: int | None = field(default=None, metadata=field_options(alias="int"))
651
663
 
652
664
 
665
+ field(
666
+ metadata=field_options(
667
+ deserialize=serialize_datetime,
668
+ )
669
+ )
670
+
671
+
653
672
  @dataclass(kw_only=True)
654
673
  class TagsUser:
655
674
  """Tags user data."""
@@ -674,10 +693,10 @@ class InboxUser:
674
693
  class TasksOrderUser:
675
694
  """TasksOrder user data."""
676
695
 
677
- habits: list[str] = field(default_factory=list)
678
- dailys: list[str] = field(default_factory=list)
679
- todos: list[str] = field(default_factory=list)
680
- rewards: list[str] = field(default_factory=list)
696
+ habits: list[UUID] = field(default_factory=list)
697
+ dailys: list[UUID] = field(default_factory=list)
698
+ todos: list[UUID] = field(default_factory=list)
699
+ rewards: list[UUID] = field(default_factory=list)
681
700
 
682
701
 
683
702
  @dataclass(kw_only=True)
@@ -717,7 +736,7 @@ class UserData:
717
736
 
718
737
  id: UUID | None = None
719
738
  preferences: PreferencesUser = field(default_factory=PreferencesUser)
720
- flags: FlagsUser | None = None
739
+ flags: FlagsUser = field(default_factory=FlagsUser)
721
740
  auth: AuthUser = field(default_factory=AuthUser)
722
741
  achievements: AchievementsUser = field(default_factory=AchievementsUser)
723
742
  backer: BackerUser = field(default_factory=BackerUser)
@@ -746,8 +765,8 @@ class UserData:
746
765
  balance: float | None = None
747
766
  lastCron: datetime | None = None
748
767
  needsCron: bool | None = None
749
- challenges: list[str] = field(default_factory=list)
750
- guilds: list[str] = field(default_factory=list)
768
+ challenges: list[UUID] = field(default_factory=list)
769
+ guilds: list[UUID] = field(default_factory=list)
751
770
  newMessages: dict[str, bool] = field(default_factory=dict)
752
771
 
753
772
 
@@ -850,38 +869,31 @@ class Frequency(StrEnum):
850
869
  YEARLY = "yearly"
851
870
 
852
871
 
853
- @dataclass(kw_only=True)
854
- class Task(DataClassORJSONMixin):
872
+ class Task(TypedDict("Task", {"type": NotRequired[TaskType]}), total=True):
855
873
  """Representation of a task."""
856
874
 
857
- class Config(BaseConfig):
858
- """Config."""
859
-
860
- omit_none = True
861
-
862
- text: str | None = None
863
- attribute: Attributes | None = None
864
- alias: str | None = None
865
- notes: str | None = None
866
- tags: list[UUID] | None = None
867
- collapseChecklist: bool | None = None
868
- date: datetime | None = None
869
- priority: TaskPriority | None = None
870
- reminders: list[Reminders] | None = None
871
- checklist: list[str] | None = None
872
- Type: TaskType | None = field(default=None, metadata=field_options(alias="type"))
873
- up: bool | None = None
874
- down: bool | None = None
875
- counterUp: int | None = None
876
- counterDown: int | None = None
877
- startDate: datetime | None = None
878
- frequency: Frequency | None = None
879
- everyX: int | None = None
880
- repeat: Repeat | None = None
881
- daysOfMonth: list[int] | None = None
882
- weeksOfMonth: list[int] | None = None
883
- completed: bool | None = None
884
- streak: int | None = None
875
+ text: NotRequired[str]
876
+ attribute: NotRequired[Attributes]
877
+ alias: NotRequired[str]
878
+ notes: NotRequired[str]
879
+ tags: NotRequired[list[UUID]]
880
+ collapseChecklist: NotRequired[bool]
881
+ date: NotRequired[datetime | dt.date | None]
882
+ priority: NotRequired[TaskPriority]
883
+ reminders: NotRequired[list[Reminders]]
884
+ checklist: NotRequired[list[str]]
885
+ up: NotRequired[bool]
886
+ down: NotRequired[bool]
887
+ counterUp: NotRequired[int]
888
+ counterDown: NotRequired[int]
889
+ startDate: NotRequired[datetime | dt.date]
890
+ frequency: NotRequired[Frequency]
891
+ everyX: NotRequired[int]
892
+ repeat: NotRequired[Repeat]
893
+ daysOfMonth: NotRequired[list[int]]
894
+ weeksOfMonth: NotRequired[list[int]]
895
+ completed: NotRequired[bool]
896
+ streak: NotRequired[int]
885
897
 
886
898
 
887
899
  @dataclass(kw_only=True)
@@ -979,7 +991,7 @@ class StatsUserStyles:
979
991
  """Stats user styles data."""
980
992
 
981
993
  buffs: BuffsUserStyles = field(default_factory=BuffsUserStyles)
982
- Class: str = field(default="warrior", metadata=field_options(alias="class"))
994
+ Class: HabiticaClass = field(default=HabiticaClass.WARRIOR)
983
995
 
984
996
 
985
997
  @dataclass(kw_only=True)
@@ -1052,7 +1064,7 @@ class DropTmpScore:
1052
1064
  canDrop: bool | None = None
1053
1065
  value: int | None = None
1054
1066
  key: str | None = None
1055
- type: str | None = None
1067
+ Type: str | None = field(default=None, metadata=field_options(alias="type"))
1056
1068
  dialog: str | None = None
1057
1069
 
1058
1070
 
@@ -1064,12 +1076,21 @@ class TmpScore:
1064
1076
  drop: DropTmpScore = field(default_factory=DropTmpScore)
1065
1077
 
1066
1078
 
1079
+ @dataclass
1080
+ class ScoreData(StatsUser):
1081
+ """Scora data."""
1082
+
1083
+ delta: float | None = None
1084
+ tmp: TmpScore = field(
1085
+ default_factory=TmpScore, metadata=field_options(alias="_tmp")
1086
+ )
1087
+
1088
+
1067
1089
  @dataclass(kw_only=True)
1068
- class HabiticaScoreResponse(StatsUser, DataClassORJSONMixin):
1090
+ class HabiticaScoreResponse(HabiticaResponse, DataClassORJSONMixin):
1069
1091
  """Representation of a score response."""
1070
1092
 
1071
- delta: float | None = None
1072
- _tmp: TmpScore = field(default_factory=TmpScore)
1093
+ data: ScoreData
1073
1094
 
1074
1095
 
1075
1096
  @dataclass(kw_only=True)
@@ -1107,7 +1128,7 @@ class HabiticaClassSystemResponse(HabiticaResponse, DataClassORJSONMixin):
1107
1128
  class HabiticaTaskOrderResponse(HabiticaResponse):
1108
1129
  """Representation of a reorder task response."""
1109
1130
 
1110
- data: TasksOrderUser = field(default_factory=TasksOrderUser)
1131
+ data: list[UUID] = field(default_factory=list)
1111
1132
 
1112
1133
 
1113
1134
  class TaskFilter(StrEnum):
@@ -1187,15 +1208,6 @@ class Skill(StrEnum):
1187
1208
  PETAL_FREE_POTION = "petalFreePotion"
1188
1209
 
1189
1210
 
1190
- class Class(StrEnum):
1191
- """Habitica's player classes."""
1192
-
1193
- WARRIOR = "warrior"
1194
- ROGUE = "rogue"
1195
- MAGE = "mage"
1196
- HEALER = "healer"
1197
-
1198
-
1199
1211
  class Direction(StrEnum):
1200
1212
  """Direction to score a task."""
1201
1213
 
@@ -1,6 +1,6 @@
1
1
  # serializer version: 1
2
2
  # name: test_generate_avatar
3
- UserStyles(items=ItemsUserStyles(gear=GearItemsUserStyles(equipped=EquippedGear(weapon='weapon_special_fall2024Warrior', armor='armor_special_fall2024Warrior', head='head_special_fall2024Warrior', shield='shield_special_fall2024Warrior', back='back_mystery_201402', headAccessory='headAccessory_special_pinkHeadband', eyewear='eyewear_special_pinkHalfMoon', body='body_mystery_202003'), costume=EquippedGear(weapon=None, armor='armor_base_0', head='head_base_0', shield='shield_base_0', back=None, headAccessory=None, eyewear=None, body=None)), currentMount='Velociraptor-Base', currentPet='Rat-Shade'), preferences=PreferencesUserStyles(hair=HairPreferences(color='red', base=3, bangs=1, beard=0, mustache=0, flower=1), size='slim', skin='915533', shirt='blue', chair='none', costume=False, sleep=False, background='violet'), stats=StatsUserStyles(buffs=BuffsUserStyles(per=0, con=0, stealth=0, seafoam=False, shinySeed=False, snowball=False, spookySparkles=False), Class='warrior'))
3
+ UserStyles(items=ItemsUserStyles(gear=GearItemsUserStyles(equipped=EquippedGear(weapon='weapon_special_fall2024Warrior', armor='armor_special_fall2024Warrior', head='head_special_fall2024Warrior', shield='shield_special_fall2024Warrior', back='back_mystery_201402', headAccessory='headAccessory_special_pinkHeadband', eyewear='eyewear_special_pinkHalfMoon', body='body_mystery_202003'), costume=EquippedGear(weapon=None, armor='armor_base_0', head='head_base_0', shield='shield_base_0', back=None, headAccessory=None, eyewear=None, body=None)), currentMount='Velociraptor-Base', currentPet='Rat-Shade'), preferences=PreferencesUserStyles(hair=HairPreferences(color='red', base=3, bangs=1, beard=0, mustache=0, flower=1), size='slim', skin='915533', shirt='blue', chair='none', costume=False, sleep=False, background='violet'), stats=StatsUserStyles(buffs=BuffsUserStyles(per=0, con=0, stealth=0, seafoam=False, shinySeed=False, snowball=False, spookySparkles=False), Class=<HabiticaClass.WARRIOR: 'warrior'>))
4
4
  # ---
5
5
  # name: test_generate_avatar_from_styles[default]
6
6
  b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x8d\x00\x00\x00\x93\x08\x06\x00\x00\x00\xb3\x82\x9aN\x00\x00\x0c=IDATx\x9c\xed\x9d}pVG\x15\xc6o(\x08E\xbeI\x00C\xb0Q\x08P@)\x85\xd0\x12I\x07\x04\xca\x14i\xc1\xd1\xa1\xc0\xb4J!"\xb4J\xa7\x95RKG\x8a8\x82\xa4\x19\xc6A\xc0Z\xa1\xe0\x07f\xa8\x82S\x8b|\x16354\x14B\x84*\x1f\x81P\'@\x08P\xa0\t_\x01*P\xff\xdb\xf3\\\xdd\x9d\xf7\x9e\xde\xf7\xe3F\x9f\xdf_\x87\xcd\xde\xbd\xf7\xbe==\xcf\x9c\xddsw\xd3V,\xaa\xfa\xd8#DA\x93T?\x00i|\xd0i\x88\x9a\xa6\xf8\x8f\x01\xb9]R\xf5\x1c$\xe2\xec+?clF\x1a\xa2\x86NC\xd44\x8d\xdd\xa5\xf1\xf0\xfa\xf7\xbb\xc5\xec3\xe1\'\'\x93\xf0$\xe1Y\xf2\xf5\x8c\x98}\x9e\xfd\xc3\xb9$<\xc9\x7f\xc3HC\xd4\xd0i\x88\x9aF)O\xa7\x7f\x9aom\x9f\xf9\xcc\xe3\xd6\xf6\xfa\xbd\xfb\x8c]\x0c\x12Vs\xec\xba\xb1S\x15\xea]2\xb4\xbc\xec\xd7\xd6\xf6\xfa}\xa5\xc6~\xd1qm\xa2\xdf\x85\x91\x86\xa8\xa1\xd3\x105\x8dF\x9eP\x92\x86\x16\xce56\x86\xeb\x03\xc5\xa5^,\xf2\xbbd\x1b;+\xbf\x95\xb1_\x86P\x9f\xe8\xf0\x8e\x92\xe4\x92\xa1\x9ds\x16\xc6\x1c\xe7\xc7\xcb\xbfem\x7f1\xc1\xef\xc2HC\xd4\xd0i\x88\x9aH\xcb\x93K\x92\\\xa1\xbb\xf4Lu\xcc1Q\x9ej\xaa\xae\x18\xfb\xb9\'\x06\x19;\x11R\xe5\x92\xa40\xef\xe2\x15\x8b\x99\x95#R\x8b\xb2\x95\x08\xa9b\xa4!j\xe84DM\x1aV\xeeE\xa14\x02\xd7\x8fp\xb2\xce\x95\x19a\x18\x7f\xeb\xe0\x15k\x9f\x91}[Y\xdbQ\xaa\\\x14\xef\xac46\x86\xf7\xe9\x0f\xb7\xb7\xf6\x7f\xf5\xcd:k\x9f\xf5+g\x1a;\xc8\xbb A\xde\xcb\x97\x15\xe6\xd8\xdf\xf7\xe5\xd5{\x8d\xad\x95*\x96F\x90P\xd0i\x88\x9aHgO\xb8f\x84\xb8$\t\xa5\x01A\x99\xf8\xe1\x88~\xd6q\\R5iho\xeb8\x8b\x9b\xf7\xb3u\xf7\xf5Y5\xe3~c\x87\x91\xa4 \xef\xe5y2N\xbe\x97ml\x97T\x85\x81\x91\x86\xa8\xa1\xd3\x105\x91\x93\',W\xa8\xe9b\xcf\x1a\x82\x84n\xc4\x95\xd1\x04\x91\xaa\x97v\x1c06JR\xbf{\xa4\x0f\xb2x\xbf\xd8\xd3^y\xf7\x13\xdf+\xcc{\xe5;\x92\xe0\xca\x1b7c\x8e\x19\x04F\x1a\xa2\x86NC\xd4DB\x9ep]\x06\xd7\x80pm(\xd0Z\x8c\x12\xd7\x98\xaev\x94\xa4V\x03r\x8c}e_U\xdc\xef\x15\x06\x9f\xfcA&\x85\xd9\xdc4\x90\xb3 R\x880\xd2\x105t\x1a\xa2&\x12\xf2\x14\x04m\xc6\xe4\xc2\x95q\xe0:\x0e\xde\xab\xe4\x0b5\xc6\xbep\xf5\x82\xb1[\xbe\xd3Ql\x18\xbf{\x8e\xf4)I\x93>\xc3\xff\x91\x15\xf3^a\xdek\xe0\xf0\\\x19\xb3\xa4\xdc\xd8\xaeL*\x0c\x8c4D\r\x9d\x86\xa8\x89\x84<\xe1\xa4\x13fL\xb8n\xd2{\xa7\xfdQ\xff\xb2a\xaa\xb1\xcf\xef\xd9n\xec\xf4\xc1\xa3\x8c]U-\x12\xf3\xedg\xb7Y\xc7A\x99(n/%\x04\r-g\x18\xfbN\xe8\xdf`\x1d\xc5\xf3\xde\xdf_-6\xb4o\xbd\xf4/c\x8fn\xd3\xccq\xb5\x1d\xd7\xe7\xc6\xaeO\x8c{7O\xec\x7fVF\x1a\xa2\x86NC\xd4\xa4L\x9e\xba\xb5\xb4O.\xf9J\x0brd2*\xabG\x0bc\xa3$\xa1\xf4\xe4\x80$ed\x88\x1c\xdc\xdbS\xb2\x98_,y\xd0\xd8\xe3\xdb\xa6\x1b\xfb\xd1&[\x8c=\xa9N&\x18\xbd\xddb\xba\xd6\x9e\x0e\x80$!\xf7\x9c\x93\xd2\x8eo.\x92v\x94\xaa\xa73D\xf4\xa6;&\xdcp=\x0e\x8b\xd2\x17}Cd\xeb*\xf4\xc1\xdf\n%\x1e\xd7\xc20\xdb\xd2\xc2HC\xd4\xd0i\x88\x9a\xd4eO\xd5\xb0L\xdf\xc9\xde\x053\xa9\xbaNw\x1b\xfb\xc1\x9e\xd7\x8c\x9d\x91\xd1\xd9\xd8e\xe5"U\x9e\x97\x05\xedg\xad\xe3\x9f\xbc\xf7s\xc6n\xd30_\xfe\x00\x92\xb4y\x95<\xe7C\xd3\xa0Lb\xbf\xfd\x99\x9f\xbf!}6\xff>\xcd\xd8\xbfzAv\xde\xfdy\xb7\xcf\xd8/\x0e@\xf5/\x97\x1a;\xc8.\x19\xf8\x1b\xc6\x0bF\x1a\xa2\x86NC\xd4\xa4L\x9eNv\xbalmweR7{\xb5\x91N\xdbz\x19sw\xed\x11c?\x967\xc2\xd8\xbe\xac*[\xa4\n\xb3\xaan\xedEz\xe6m\x13\t\xf3e\x16\xd9\xb2\x8e\x83\x04\xc9\x9e\xbcl\xf9y1K\xea\xdd\xa2\x9d\xbd?P\xb4X\xde}\xd9{\x1b\x8d=\xab\xffxc?\xe7\xb8\x16%\t\xab\x01\'>\xf1Uc\xe3\xef\xa3\x85\x91\x86\xa8\xa1\xd3\x105\x91X{B\xa6\xce\xbeK\xfe\x01\x924w\xdeS\xc6^\xbbv\x9d\xb1\xd3>\x92\xb5\xff\x0ey\x92\x95\x8c\x18)\xdf+\xedX\xf9\x96\xb1\xab\xaa\xed\xf7E\t\xdb\xff\xbb7\x8d\xdd\xb0\x15\x8b\xb1\xe5\xe7rJ\x12\xe0\xba\xb6\xf2z}\xcck\x0f\x9f\xeai\xec\xf6\xe9\xf2.\xef\\\xed.\x9d\xe03[\x04\xd7\xf2\xbe;g\xac\xb11\xbbt\xad\xc1\x05\x81\x91\x86\xa8\xa1\xd3\x105I\xdd5\x02\xd7\x9bF=\xd9\xc6\xda\x07e\xe8J\xc3Ec\xbf\xf1GY\x1b:q\x18B}\xa5\xec\xea0\xe5\xe9\x81\xc6\xce\x1d8\xc4\xd8\xe5\x15\xbb\x8c}\xfb\x88\\\x8b\x92\xa4\xcd&&\x94]\xb3\xb6\xaf\xf6*\xad\xed\x981\xa1<\xa1\x94\xfch\xa8\xac\x19\xcd}{\xa8\xb1\xeb?\x96\x12\x88!\xc3$[<tN~\xc3\xfb2%\xa3\xcc\xcb\x95\t\xcfs\xe7\xece\x18A\xcaE\x10\xee\x1aABA\xa7!j\x92\x9a=\xa1$\xb9d\xa8\xa4t\x8bg#\xf3\xb3m\xc1\x96\xf6\xfbG\xdb%)\x08\x18\xa21\xa4\xe3\xa4\xdf\xbamR(\x8e\x92\x84kL\x08\x96O\xecj!!\xdd%I\x17n\x8a\xac\xcc}[J\x1dP\x92\xda\xe5\xc8\xba\xd5\xb2\x952\xd1\xf7\x9d\x02\xc9\x8c\x10\x94$\x97\xec2{"I\x85NC\xd4\xa4lro\xe1\x82\xe5q\x1f3\x88<5\xe9%\xd2\x80\x99\x94\xab|\xa2\x02\xbe!\xaa\x80\xf6\x82\xb1\xfd\xad\xfd\x9f\xdf\xf8\x9e\xfc\xe3\x86\xfd\x19P\x92.\xf7\xee#\x7f\xa8<d\xcc\r\xc3\x0f\x1a{j\x8d\xf4\xc1\x89>-a$\ta\xa4!j\xe84DMR\xe5\xe9\x8dq\x1f\x1a;g\xbed\x04{\xca\x0f\x1b{p\xee\xdd1\xdb\xfb\x0c\x90B\xf1Y\xb3\x1f\x8by_\xd7D\x1f\x82\xd9\xd3\x7f\\m\xac\xca\x0f\xe5\x99\x8b\x1d\xa7\x1a~\xba\xbf\x14\xa5\x17,\x14)\xf9\xdeZ\xf9R\xea\xf6\x1e\x19\xa75H\x12fI(I\xf5UR\x01\x98\xd6\xc4\xbe\x15\xadk\xa22^\x92\x840\xd2\x105t\x1a\xa2&e\xd9\xd3\xa9b\t\xb9\x83\'\xd9\xa5j\xca\xf4\xa1\x9e\r\x97$--\xfam\xcc>\xc8\x99;e\xe2\xae\x0c\n\xf40\xd4\xfbd\x0b2\xac\xc9K\xe5\x1b\xab\x1d\xfbV\x19\xfb7\x93\xdb\x19{\xdeh\x19\xb4l\x86\xbc\x977\xcc\xb3\xdb.\xa4 \xd1\x9b\xfc\x88Hs\xebf"\x9d\x89\x96$\x84\x91\x86\xa8\xa1\xd3\x105)\x93\xa7\x82\xf5R\x99v\xbc\xb0\xa3\xb5O\x10\x19\nC\x97k\xf6\xfb\xfa\xd7k\xb2\xac}P\x92>8\xf1\x91\xb1/\xdf\x92\x83*\xde}\xea\xbc\xb1\x9bu\xb8m\xec\x962\xb7\xe7\x07\n\xd1\xf1\xbb\xb0\x06\xa9\x86\xf0\x16\xc0\xdc\xde\xa5q\x89\x95!\x17\x8c4D\r\x9d\x86\xa8I\xaa<]\xc8\x97o\x9d\x96z\xad\x8d=\xee\xfd\x0e\xd6\xfe.\x19\xda\xbe\xe2\x92\xb5\xddU\r\x18\x04\xd7\xb7QX\x8c\xed\x9b@[-\xd7\xae\xdf"\xdb\x17e7\x97\tL\xc4\'I\xd9\x8e\x9f\x1d?Uv\\{\xd1>7\x99T\x18i\x88\x1a:\rQ\x13\x89\xef\x9epM\nqf\x19qzl,\x93\xa8:b\xcf\x98\\k:X\xc5\xd7\xad\x13\xfe\xbf\x97\x0e\xf6\x07\xf1xL_\xf6\x14\x05\x18i\x88\x1a:\rQ\x932y\xc2L\xaac\xa9dR(I\x18\x96}R\xe5\xc82\xb6\xcf\x11\x99\x1bUh_\x87r\x95I\xb8\xa4\n\xd7\x9e\\\x9f\xf4\x0e\xb9.\xdf\x8ba\xc1\xf9D\xe8\xe3{\x17/\xf6\xb9KQ\x93$\x84\x91\x86\xa8\xa1\xd3\x105\x91\xc8\x9eP\xaa<\xadTy\xf6>A\x08"U\x1b\x0eHe\x1dnY\xbe\x14\xca\x15f\xed\xc0#5\x84\xf9[\xe5\x82\'\x1f\x90-[\xbbz\xb7T\xcfy\xea\xd4\x1d\xc6n1\xb1^um"`\xa4!j\xe84DMRw\x8d\xd0\x82YU\x10P\xe6|\x9b#\x01A*\xfa\\\xc5\xe7Z\xda\x96\xca1\x855\xb0K\xb9O\xaa\xba\xda\xa5*j\x92\xc4]#H(\xe84DMB\xb2\xa7\t\xb3\x87[\xdb_/*Q\x8d\xe3\xcb\xaa\x92\x88v\xf7\t\x97\x9c]\xcc\x97\x13u\'U\x89<\xad\xf8\xab\xc8\x16J\x15\x12\x05Ir\xc1HC\xd4\xd0i\x88\x9a\xb8\xc9\x13J\x92K\x86\x82\xf4I\x04\x981\x05\xf96\xaaUK\xd9@\t7\\Bp\x1c\xd7\x06MH\xd1\xbaW\xac\xed\x95\xc3\xe4Z\x1c\xf3\xb5\x89\xb6\xde\xd1\x80\x91\x86\xa8\xa1\xd3\x105I]{BIJ\x95T\r\x19.;~\xbb\n\xd7Qn\x82H\x15\xe2\xea\xffx\xe1\x0c[\xf7F\t#\rQC\xa7!j\xe2&OQ\x90\x1e\\o\xc2\xcc(\xc8Z\x12\xee\xf8\x8d\xfb\x01\xa2T\xa1\x9c\xdd\xd5==f\x7fm\x16\xf6Z\xd1\xf1\x98\xcf\x19\x05\x18i\x88\x1a:\rQ\x93\x90\xec)\x99\x93{A$iW\x89|6\xfb\xcc\xb8\x07\x8c};S^\x1f7\x02\xda\rc\xe2YQK\xa6\xe4\x19\x1bw2?\xee\xc9\xee\x10.\x19\xd2faQ\x86\x91\x86\xa8\xa1\xd3\x105MO\x9f\x90\xca\xb1\xf6\xadu\x05\xcf\xc8\x9c\x95#c\xf6),\x90P_]\x19\xfb^8&^\xbb`\xe5\xe7\x8d\x1dd\xb2\x0eO\xd1\xc5] v\xd4J\xb9\x02J\x92K\x86\xfevT\n\xc5\xfd{\xf1\x89\xe9Z\xdb\n"IA~\x93T\x81~\xc2HC\xd4\xd0i\x88\x9aP\xd9\x93K>\xb4\xbc0\xc7\xbe\x0b\xf7\xeec\xa7\x8c\x9d\xd7\xc3\xdeg\x97\'\x99\x91\xfbH>\xe9\xef\x93\xa4M\x7f\x92k\xc7<bl\x94$\x1c\x07\xa5\xcd\xb5\x17\xdf\xbc\x82\x7f\x1a{A\x91\xc8h\x90\x82\xf6\xc6\x02#\rQC\xa7!j\xd4\xf2\x94\x08I\xea\xfbe9V\xef\xef5\xa7\xad\xfdo\xf5\x94c\x07\xbf\x98%\x87\xb6\xffy\xa3\x1c\xbc~x\xbfL\xe8\xad\xd9$\xd7N\x19\xa3+\x14\xf7K\xd2YG\xbbH\xd5\xe81\x9b\xad\xe3\x04\x91*\xb4\xb1\x0f^\x1b5\x18i\x88\x1a:\rQ\x13H\x9e\x12-IA\xc0L\'33\xd3\xd8_\x19\xfbp\xcck\xd7\x80\x84\xd5\xd6\xd6\xc6\xec\xef:\x00=\x0c\xffKR\xc5HC\xd4\xd0i\x88\x9a\x84\x17\x96\x87\x91$D+I\x08\xf6\xc7q\x82H\x15\xe2\x92-\\\x0bsI\xc9\xb1\xba\x9f\x19\xbbW\xb6\x94gh\xcf\xa8\x8a\x02\x8c4D\r\x9d\x86\xa8I\x88<\x85\x91\xa4\xce\xcd\xe4\x98\xc20\x92\xe4\xc2%U\xaf\xbe4\xde\xd88q\xe7\x9a\xd0\xdb]+\x1b\xfc\x05\x91\xa4\x8a\n9\n\xfe\xe8\xd1\xa3\xd2\xe9Sb\xc6k3\xa5D\xc3HC\xd4\xd0i\x88\x9a@\xf2\x84\x13z\xf1\x9a\xe8\x0b\x03\xae7\x05\x91\xad \xfd]\x99\x91\xab=\xc8\x84\x1bJ\xd2\xa3#\xd7\xc8\x1f\xa0\xc8\x113/\x04\xbf\x9fZ\xb0 Z\x13}\x8c4D\r\x9d\x86\xa8\x89\xc4\x8e\xe5Z\xae\xf7\xfa\x92\xb1[8\xa4\x07%\t\xfb\x7f\xcd1\xa6\xff\x84\xdc\xf8\xe0\x93$\xc0U\x18\x8f\xdfgy\xde\x96\xb8?O\xbc`\xa4!j\xe84DM\xa3\x94\'\xc4\x95\r\xf9\xda\xab\xec\xc7\x1d"X}\xb7u\xd3Criu\xec\n\xbd \xb8\xb2$\x94$_\xf9D\x80\xf5\xacT\xc1HC\xd4\xd0i\x88\x9a\xb4\x1f\xcc\xac4\x07j\xf4\xe9\xab;P\xc35\xd1\x17\xafr\x88\x83\x95\x87\x8d]}\xec\x98\xb1\xc3\xacCaVU\xbc\xac\xfe\x13\x8f\xf3\xff\xc6\xa1\x83<P\x83\x84\x80NC\xd4\x84\x92\'\xc4\xb5k\xc4\x1dG+\xac\xed\x88K\xc2\xce\x9e\x95\x90x\xbe\xae\xce\xd8Z\xa9BI\x1a\x94\x9b+c\x1e\xdck\xecE\x85u\x1eqCy"\xa1\xa0\xd3\x105q\x9b\xdcs\x95I\xa0l\xe1\xb7KH^\x8f\xae\xc6N\xef;Hu_\x94\xb0\xce\x9d\xbbX\xdbI|a\xa4!j\xe84DM\xc2\xd7\x9eP\xb6\xee\x1bc\xcf\xb0\n!s\xf1mp\x94\xd9\xdd\xd2\xdb\xf3\xb2{\xf40\xf6\xder\xd9\xf0\x0e\xbfc\xc2\xa2q\xcc\x98Hx\x18i\x88\x1a:\rQ\x93\xd4\xd2\x88 \x85\xe8\x8b\x1cRU\xe6\xdb\x7fO\xb2-\\?B\xf9\xc3\xf6 \x19\x1c^\x9b\xaa\x82\xf9\xc6\x02#\rQC\xa7!j"]\xb9\x87\xfb\xec!(UAd%P\x06GI\n\x0c#\rQC\xa7!j"-O\x89\x90\x15\xcaPx\x18i\x88\x1a:\rQ\xe3\xab\xdc#$\x08\x8c4D\r\x9d\x86\xa8\xf97}"\xaf\x8b\'\x82\x81p\x00\x00\x00\x00IEND\xaeB`\x82'
@@ -1,4 +1,4 @@
1
1
  # serializer version: 1
2
2
  # name: test_user
3
- HabiticaUserResponse(data=UserData(id=UUID('c18e1853-bded-47a9-82e2-adfdad08894d'), preferences=PreferencesUser(hair=HairPreferences(color='red', base=3, bangs=1, beard=0, mustache=0, flower=1), emailNotifications=EmailNotificationsPreferences(unsubscribeFromAll=False, newPM=True, kickedGroup=True, wonChallenge=True, giftedGems=True, giftedSubscription=True, invitedParty=True, invitedGuild=True, questStarted=True, invitedQuest=True, importantAnnouncements=True, weeklyRecaps=True, onboarding=True, majorUpdates=True, subscriptionReminders=True, contentRelease=True), pushNotifications=PushNotificationsPreferences(unsubscribeFromAll=False, newPM=True, wonChallenge=True, giftedGems=True, giftedSubscription=True, invitedParty=True, invitedGuild=True, questStarted=True, invitedQuest=True, majorUpdates=True, mentionParty=True, mentionJoinedGuild=True, mentionUnjoinedGuild=True, partyActivity=True, contentRelease=True), suppressModals=SuppressModalsPreferences(levelUp=False, hatchPet=False, raisePet=False, streak=False), tasks=TasksPreferences(activeFilter=ActiveFilterTask(habit='all', daily='all', todo='remaining', reward='all'), groupByChallenge=False, confirmScoreNotes=False, mirrorGroupTasks=[]), dayStart=0, size='slim', hideHeader=False, skin='915533', shirt='blue', timezoneOffset=-120, sound='rosstavoTheme', chair='none', allocationMode='flat', autoEquip=True, costume=False, dateFormat='MM/dd/yyyy', sleep=False, stickyHeader=True, disableClasses=False, newTaskEdit=False, dailyDueDefaultView=False, advancedCollapsed=False, toolbarCollapsed=False, reverseChatOrder=False, developerMode=False, displayInviteToPartyWhenPartyIs1=True, background='violet', automaticAllocation=None, webhooks={}, improvementCategories=[], timezoneOffsetAtLastCron=None, language='de'), flags=FlagsUser(customizationsNotification=False, tour=TourFlags(intro=-1, classes=-1, stats=-1, tavern=-1, party=-1, guilds=-1, challenges=-1, market=-1, pets=-1, mounts=-1, hall=-1, equipment=-1, groupPlans=-1), showTour=True, tutorial=TutorialFlags(common=CommonTutorial(habits=True, dailies=True, todos=True, rewards=True, party=True, pets=True, gems=True, skills=True, classes=True, tavern=True, equipment=True, items=True, mounts=True, inbox=True, stats=True), ios=IosTutorial(addTask=False, editTask=False, deleteTask=False, filterTask=False, groupPets=False, inviteParty=False, reorderTask=False)), dropsEnabled=False, itemsEnabled=False, lastNewStuffRead='', rewrite=True, classSelected=False, rebirthEnabled=False, levelDrops={}, recaptureEmailsPhase=0, weeklyRecapEmailsPhase=0, lastWeeklyRecap=datetime.datetime(2024, 10, 19, 18, 43, 39, 782000, tzinfo=datetime.timezone.utc), communityGuidelinesAccepted=False, cronCount=0, welcomed=True, armoireEnabled=True, armoireOpened=False, armoireEmpty=False, cardReceived=False, warnedLowHealth=False, verifiedUsername=True, newStuff=False, thirdPartyTools=None, mathUpdates=None, lastFreeRebirth=None, chatRevoked=None, chatShadowMuted=None, lastWeeklyRecapDiscriminator=None, onboardingEmailsPhase=None), auth=AuthUser(local=LocalAuth(email='test@example.com', username='test', lowerCaseUsername='test', has_password=True), timestamps=LocalTimestamps(created=datetime.datetime(2024, 10, 19, 18, 43, 39, 782000, tzinfo=datetime.timezone.utc), loggedin=datetime.datetime(2024, 10, 19, 18, 43, 39, 782000, tzinfo=datetime.timezone.utc), updated=datetime.datetime(2024, 10, 19, 18, 44, 51, 37000, tzinfo=datetime.timezone.utc)), facebook={}, google={}, apple={}), achievements=AchievementsUser(ultimateGearSets=UltimateGearSetsAchievments(healer=False, wizard=False, rogue=False, warrior=False), streak=0, challenges=[], perfect=0, quests=QuestsAchievments(bewilder=None, burnout=None, stressbeast=None, harpy=None, atom3=None, vice3=None, vice1=None, gryphon=None, evilsanta2=None, evilsanta=None, dilatory_derby=None, dilatory=None, atom2=None, atom1=None, dysheartener=None), backToBasics=None, dustDevil=None, primedForPainting=None, completedTask=None, createdTask=None, fedPet=None, hatchedPet=None, purchasedEquipment=None, tickledPink=None, goodAsGold=None, boneCollector=None, seeingRed=None, violetsAreBlue=None, shadyCustomer=None, joinedGuild=None, joinedChallenge=None, partyUp=None), backer=BackerUser(tier=None, npc=None, tokensApplied=None), contributor=ContributorUser(contributions=None, level=None, text=None), permissions=PermissionsUser(fullAccess=None, news=None, userSupport=None, challengeAdmin=None, moderator=None, coupons=None), purchased=PurchasedUser(plan=PlanPurchased(consecutive=ConsecutivePlan(trinkets=0, gemCapExtra=0, offset=0, count=0), mysteryItems=[], gemsBought=0, extraMonths=0, dateUpdated=None, perkMonthCount=-1, quantity=1), txnCount=0, background={'violet': True}, shirt={}, hair={}, skin={}, ads=False, mobileChat=None), history=HistoryUser(todos=[], exp=[]), items=ItemsUser(gear=GearItems(equipped=EquippedGear(weapon='weapon_special_fall2024Warrior', armor='armor_special_fall2024Warrior', head='head_special_fall2024Warrior', shield='shield_special_fall2024Warrior', back='back_mystery_201402', headAccessory='headAccessory_special_pinkHeadband', eyewear='eyewear_special_pinkHalfMoon', body='body_mystery_202003'), costume=EquippedGear(weapon=None, armor='armor_base_0', head='head_base_0', shield='shield_base_0', back=None, headAccessory=None, eyewear=None, body=None), owned={'headAccessory_special_blackHeadband': True, 'headAccessory_special_blueHeadband': True, 'headAccessory_special_greenHeadband': True, 'headAccessory_special_pinkHeadband': True, 'headAccessory_special_redHeadband': True, 'headAccessory_special_whiteHeadband': True, 'headAccessory_special_yellowHeadband': True, 'eyewear_special_blackTopFrame': True, 'eyewear_special_blueTopFrame': True, 'eyewear_special_greenTopFrame': True, 'eyewear_special_pinkTopFrame': True, 'eyewear_special_redTopFrame': True, 'eyewear_special_whiteTopFrame': True, 'eyewear_special_yellowTopFrame': True, 'eyewear_special_blackHalfMoon': True, 'eyewear_special_blueHalfMoon': True, 'eyewear_special_greenHalfMoon': True, 'eyewear_special_pinkHalfMoon': True, 'eyewear_special_redHalfMoon': True, 'eyewear_special_whiteHalfMoon': True, 'eyewear_special_yellowHalfMoon': True}), special=SpecialItems(birthdayReceived=[], birthday=0, thankyouReceived=[], thankyou=0, greetingReceived=[], greeting=0, nyeReceived=[], nye=0, valentineReceived=[], valentine=0, seafoam=0, shinySeed=0, spookySparkles=0, snowball=0, congrats=0, congratsReceived=[], getwell=0, getwellReceived=[], goodluck=0, goodluckReceived=[]), lastDrop=LastDropItems(count=0, date=datetime.datetime(2024, 10, 19, 18, 43, 39, 784000, tzinfo=datetime.timezone.utc)), currentMount='Velociraptor-Base', currentPet='Rat-Shade', quests={'dustbunnies': 1}, mounts={}, food={}, hatchingPotions={}, eggs={}, pets={}), invitations=InvitationsUser(party={}, guilds=[], parties=[]), party=PartyUser(quest=QuestParty(progress=ProgressQuest(up=0.0, down=0.0, collect={}, collectedItems=0), RSVPNeeded=False, key=None, completed=None), order='level', orderAscending='ascending', _id=None), profile=ProfileUser(blurb=None, imageUrl=None, name='test'), stats=StatsUser(buffs=BuffsStats(Str=0, per=0, con=0, stealth=0, streaks=False, seafoam=False, shinySeed=False, snowball=False, spookySparkles=False, Int=0), training=TrainingStats(Str=0.0, per=0, con=0, Int=0), hp=50.0, mp=10.0, exp=0, gp=0.0, lvl=1, Class='warrior', points=0, Str=0, con=0, per=0, toNextLevel=25, maxHealth=50, maxMP=30, Int=0), notifications=[], tags=[TagsUser(id=UUID('5358c71f-fe0f-4583-84a3-109b70c699fd'), name='Arbeit', challenge=None, group=None), TagsUser(id=UUID('45870b8b-3e1e-4e13-a722-6afcacdf689f'), name='Training', challenge=None, group=None), TagsUser(id=UUID('3e49b9db-0cc5-4070-b860-e16f1e4806a4'), name='Gesundheit + Wohlbefinden', challenge=None, group=None), TagsUser(id=UUID('0d85319e-7b9c-43e2-81ed-2a706521d5e3'), name='Schule', challenge=None, group=None), TagsUser(id=UUID('b7cf86bf-97ac-42d3-b5d0-5ffe998b62b4'), name='Teams', challenge=None, group=None), TagsUser(id=UUID('c584d792-0a9b-4646-a6ca-a67bb6ef3c36'), name='Hausarbeiten', challenge=None, group=None), TagsUser(id=UUID('0602fd13-edf2-46a7-99c0-c5084046efbb'), name='Kreativität', challenge=None, group=None)], inbox=InboxUser(newMessages=0, optOut=False, blocks=[], messages={}), tasksOrder=TasksOrderUser(habits=['21b10675-e238-4462-be11-1a4f8012fc9c', '69909140-a920-4b83-b018-b9156760aca3', '7e0679cf-e9cd-4604-b429-d061ea16ce72', '270df162-d47d-488b-9c1d-4fc4f0e2b2d2', '80ad00b5-622e-4d1a-af4d-6a6c199f3571', '0712669d-8374-4211-84ea-715cbcbae9c1', '56dee98d-038a-43f3-a514-59b1ed9a52ee', '25df4765-754c-47b1-a011-83b31f70c4fb'], dailys=['e22e9ef0-15be-478a-81c7-f9fdbb4fac10', '2a74baa2-3acd-426c-bce4-6b4bb145a8d5', 'e18d0899-7c59-41c0-affd-318b8850c3e5', '3d0cecac-73c1-462b-ab39-a39cea107e6b', '1ed21cd0-e6f5-4707-b1b4-fb376d462387', '9117ad5e-2cda-43e0-a07c-0b175d32c0eb'], todos=['ac13c62c-9375-4809-a357-0e42b01a1b43', '2388ccad-0387-4ea6-9968-2d10d994e903', '5c6efb91-6ae3-4cad-8b19-2dd2fc52a965', '80afe0b9-e367-4473-8117-b8bc7115f54a', '4cc21c36-886c-4a43-b580-877e958a37fd', '10a45996-7133-4ca1-84d8-abf1093d9dcc', 'fb867459-ae50-4cee-9017-c13206c6dfa2'], rewards=['4b18ccf6-3934-43a5-a153-31af8b2a36d9']), extra={}, pushDevices=[], webhooks=[], loginIncentives=0, invitesSent=0, pinnedItems=[PinnedItemsUser(path='gear.flat.weapon_warrior_0', Type='marketGear'), PinnedItemsUser(path='gear.flat.armor_warrior_1', Type='marketGear'), PinnedItemsUser(path='gear.flat.shield_warrior_1', Type='marketGear'), PinnedItemsUser(path='gear.flat.head_warrior_1', Type='marketGear'), PinnedItemsUser(path='potion', Type='potion'), PinnedItemsUser(path='armoire', Type='armoire')], pinnedItemsOrder=[], unpinnedItems=[], secret=None, balance=0.0, lastCron=datetime.datetime(2024, 10, 19, 18, 43, 39, 784000, tzinfo=datetime.timezone.utc), needsCron=False, challenges=[], guilds=[], newMessages={}), success=True, notifications=[], userV=5, appVersion='5.28.8')
3
+ HabiticaUserResponse(data=UserData(id=UUID('c18e1853-bded-47a9-82e2-adfdad08894d'), preferences=PreferencesUser(hair=HairPreferences(color='red', base=3, bangs=1, beard=0, mustache=0, flower=1), emailNotifications=EmailNotificationsPreferences(unsubscribeFromAll=False, newPM=True, kickedGroup=True, wonChallenge=True, giftedGems=True, giftedSubscription=True, invitedParty=True, invitedGuild=True, questStarted=True, invitedQuest=True, importantAnnouncements=True, weeklyRecaps=True, onboarding=True, majorUpdates=True, subscriptionReminders=True, contentRelease=True), pushNotifications=PushNotificationsPreferences(unsubscribeFromAll=False, newPM=True, wonChallenge=True, giftedGems=True, giftedSubscription=True, invitedParty=True, invitedGuild=True, questStarted=True, invitedQuest=True, majorUpdates=True, mentionParty=True, mentionJoinedGuild=True, mentionUnjoinedGuild=True, partyActivity=True, contentRelease=True), suppressModals=SuppressModalsPreferences(levelUp=False, hatchPet=False, raisePet=False, streak=False), tasks=TasksPreferences(activeFilter=ActiveFilterTask(habit='all', daily='all', todo='remaining', reward='all'), groupByChallenge=False, confirmScoreNotes=False, mirrorGroupTasks=[]), dayStart=0, size='slim', hideHeader=False, skin='915533', shirt='blue', timezoneOffset=-120, sound='rosstavoTheme', chair='none', allocationMode='flat', autoEquip=True, costume=False, dateFormat='MM/dd/yyyy', sleep=False, stickyHeader=True, disableClasses=False, newTaskEdit=False, dailyDueDefaultView=False, advancedCollapsed=False, toolbarCollapsed=False, reverseChatOrder=False, developerMode=False, displayInviteToPartyWhenPartyIs1=True, background='violet', automaticAllocation=None, webhooks={}, improvementCategories=[], timezoneOffsetAtLastCron=None, language='de'), flags=FlagsUser(customizationsNotification=False, tour=TourFlags(intro=-1, classes=-1, stats=-1, tavern=-1, party=-1, guilds=-1, challenges=-1, market=-1, pets=-1, mounts=-1, hall=-1, equipment=-1, groupPlans=-1), showTour=True, tutorial=TutorialFlags(common=CommonTutorial(habits=True, dailies=True, todos=True, rewards=True, party=True, pets=True, gems=True, skills=True, classes=True, tavern=True, equipment=True, items=True, mounts=True, inbox=True, stats=True), ios=IosTutorial(addTask=False, editTask=False, deleteTask=False, filterTask=False, groupPets=False, inviteParty=False, reorderTask=False)), dropsEnabled=False, itemsEnabled=False, lastNewStuffRead='', rewrite=True, classSelected=False, rebirthEnabled=False, levelDrops={}, recaptureEmailsPhase=0, weeklyRecapEmailsPhase=0, lastWeeklyRecap=datetime.datetime(2024, 10, 19, 18, 43, 39, 782000, tzinfo=datetime.timezone.utc), communityGuidelinesAccepted=False, cronCount=0, welcomed=True, armoireEnabled=True, armoireOpened=False, armoireEmpty=False, cardReceived=False, warnedLowHealth=False, verifiedUsername=True, newStuff=False, thirdPartyTools=None, mathUpdates=None, lastFreeRebirth=None, chatRevoked=None, chatShadowMuted=None, lastWeeklyRecapDiscriminator=None, onboardingEmailsPhase=None), auth=AuthUser(local=LocalAuth(email='test@example.com', username='test', lowerCaseUsername='test', has_password=True), timestamps=LocalTimestamps(created=datetime.datetime(2024, 10, 19, 18, 43, 39, 782000, tzinfo=datetime.timezone.utc), loggedin=datetime.datetime(2024, 10, 19, 18, 43, 39, 782000, tzinfo=datetime.timezone.utc), updated=datetime.datetime(2024, 10, 19, 18, 44, 51, 37000, tzinfo=datetime.timezone.utc)), facebook={}, google={}, apple={}), achievements=AchievementsUser(ultimateGearSets=UltimateGearSetsAchievments(healer=False, wizard=False, rogue=False, warrior=False), streak=0, challenges=[], perfect=0, quests=QuestsAchievments(bewilder=None, burnout=None, stressbeast=None, harpy=None, atom3=None, vice3=None, vice1=None, gryphon=None, evilsanta2=None, evilsanta=None, dilatory_derby=None, dilatory=None, atom2=None, atom1=None, dysheartener=None), backToBasics=None, dustDevil=None, primedForPainting=None, completedTask=None, createdTask=None, fedPet=None, hatchedPet=None, purchasedEquipment=None, tickledPink=None, goodAsGold=None, boneCollector=None, seeingRed=None, violetsAreBlue=None, shadyCustomer=None, joinedGuild=None, joinedChallenge=None, partyUp=None), backer=BackerUser(tier=None, npc=None, tokensApplied=None), contributor=ContributorUser(contributions=None, level=None, text=None), permissions=PermissionsUser(fullAccess=None, news=None, userSupport=None, challengeAdmin=None, moderator=None, coupons=None), purchased=PurchasedUser(plan=PlanPurchased(consecutive=ConsecutivePlan(trinkets=0, gemCapExtra=0, offset=0, count=0), mysteryItems=[], gemsBought=0, extraMonths=0, dateUpdated=None, perkMonthCount=-1, quantity=1), txnCount=0, background={'violet': True}, shirt={}, hair={}, skin={}, ads=False, mobileChat=None), history=HistoryUser(todos=[], exp=[]), items=ItemsUser(gear=GearItems(equipped=EquippedGear(weapon='weapon_special_fall2024Warrior', armor='armor_special_fall2024Warrior', head='head_special_fall2024Warrior', shield='shield_special_fall2024Warrior', back='back_mystery_201402', headAccessory='headAccessory_special_pinkHeadband', eyewear='eyewear_special_pinkHalfMoon', body='body_mystery_202003'), costume=EquippedGear(weapon=None, armor='armor_base_0', head='head_base_0', shield='shield_base_0', back=None, headAccessory=None, eyewear=None, body=None), owned={'headAccessory_special_blackHeadband': True, 'headAccessory_special_blueHeadband': True, 'headAccessory_special_greenHeadband': True, 'headAccessory_special_pinkHeadband': True, 'headAccessory_special_redHeadband': True, 'headAccessory_special_whiteHeadband': True, 'headAccessory_special_yellowHeadband': True, 'eyewear_special_blackTopFrame': True, 'eyewear_special_blueTopFrame': True, 'eyewear_special_greenTopFrame': True, 'eyewear_special_pinkTopFrame': True, 'eyewear_special_redTopFrame': True, 'eyewear_special_whiteTopFrame': True, 'eyewear_special_yellowTopFrame': True, 'eyewear_special_blackHalfMoon': True, 'eyewear_special_blueHalfMoon': True, 'eyewear_special_greenHalfMoon': True, 'eyewear_special_pinkHalfMoon': True, 'eyewear_special_redHalfMoon': True, 'eyewear_special_whiteHalfMoon': True, 'eyewear_special_yellowHalfMoon': True}), special=SpecialItems(birthdayReceived=[], birthday=0, thankyouReceived=[], thankyou=0, greetingReceived=[], greeting=0, nyeReceived=[], nye=0, valentineReceived=[], valentine=0, seafoam=0, shinySeed=0, spookySparkles=0, snowball=0, congrats=0, congratsReceived=[], getwell=0, getwellReceived=[], goodluck=0, goodluckReceived=[]), lastDrop=LastDropItems(count=0, date=datetime.datetime(2024, 10, 19, 18, 43, 39, 784000, tzinfo=datetime.timezone.utc)), currentMount='Velociraptor-Base', currentPet='Rat-Shade', quests={'dustbunnies': 1}, mounts={}, food={}, hatchingPotions={}, eggs={}, pets={}), invitations=InvitationsUser(party={}, guilds=[], parties=[]), party=PartyUser(quest=QuestParty(progress=ProgressQuest(up=0.0, down=0.0, collect={}, collectedItems=0), RSVPNeeded=False, key=None, completed=None), order='level', orderAscending='ascending', _id=None), profile=ProfileUser(blurb=None, imageUrl=None, name='test'), stats=StatsUser(buffs=BuffsStats(Str=0, per=0, con=0, stealth=0, streaks=False, seafoam=False, shinySeed=False, snowball=False, spookySparkles=False, Int=0), training=TrainingStats(Str=0.0, per=0, con=0, Int=0), hp=50.0, mp=10.0, exp=0, gp=0.0, lvl=1, Class=<HabiticaClass.WARRIOR: 'warrior'>, points=0, Str=0, con=0, per=0, toNextLevel=25, maxHealth=50, maxMP=30, Int=0), notifications=[], tags=[TagsUser(id=UUID('5358c71f-fe0f-4583-84a3-109b70c699fd'), name='Arbeit', challenge=None, group=None), TagsUser(id=UUID('45870b8b-3e1e-4e13-a722-6afcacdf689f'), name='Training', challenge=None, group=None), TagsUser(id=UUID('3e49b9db-0cc5-4070-b860-e16f1e4806a4'), name='Gesundheit + Wohlbefinden', challenge=None, group=None), TagsUser(id=UUID('0d85319e-7b9c-43e2-81ed-2a706521d5e3'), name='Schule', challenge=None, group=None), TagsUser(id=UUID('b7cf86bf-97ac-42d3-b5d0-5ffe998b62b4'), name='Teams', challenge=None, group=None), TagsUser(id=UUID('c584d792-0a9b-4646-a6ca-a67bb6ef3c36'), name='Hausarbeiten', challenge=None, group=None), TagsUser(id=UUID('0602fd13-edf2-46a7-99c0-c5084046efbb'), name='Kreativität', challenge=None, group=None)], inbox=InboxUser(newMessages=0, optOut=False, blocks=[], messages={}), tasksOrder=TasksOrderUser(habits=[UUID('21b10675-e238-4462-be11-1a4f8012fc9c'), UUID('69909140-a920-4b83-b018-b9156760aca3'), UUID('7e0679cf-e9cd-4604-b429-d061ea16ce72'), UUID('270df162-d47d-488b-9c1d-4fc4f0e2b2d2'), UUID('80ad00b5-622e-4d1a-af4d-6a6c199f3571'), UUID('0712669d-8374-4211-84ea-715cbcbae9c1'), UUID('56dee98d-038a-43f3-a514-59b1ed9a52ee'), UUID('25df4765-754c-47b1-a011-83b31f70c4fb')], dailys=[UUID('e22e9ef0-15be-478a-81c7-f9fdbb4fac10'), UUID('2a74baa2-3acd-426c-bce4-6b4bb145a8d5'), UUID('e18d0899-7c59-41c0-affd-318b8850c3e5'), UUID('3d0cecac-73c1-462b-ab39-a39cea107e6b'), UUID('1ed21cd0-e6f5-4707-b1b4-fb376d462387'), UUID('9117ad5e-2cda-43e0-a07c-0b175d32c0eb')], todos=[UUID('ac13c62c-9375-4809-a357-0e42b01a1b43'), UUID('2388ccad-0387-4ea6-9968-2d10d994e903'), UUID('5c6efb91-6ae3-4cad-8b19-2dd2fc52a965'), UUID('80afe0b9-e367-4473-8117-b8bc7115f54a'), UUID('4cc21c36-886c-4a43-b580-877e958a37fd'), UUID('10a45996-7133-4ca1-84d8-abf1093d9dcc'), UUID('fb867459-ae50-4cee-9017-c13206c6dfa2')], rewards=[UUID('4b18ccf6-3934-43a5-a153-31af8b2a36d9')]), extra={}, pushDevices=[], webhooks=[], loginIncentives=0, invitesSent=0, pinnedItems=[PinnedItemsUser(path='gear.flat.weapon_warrior_0', Type='marketGear'), PinnedItemsUser(path='gear.flat.armor_warrior_1', Type='marketGear'), PinnedItemsUser(path='gear.flat.shield_warrior_1', Type='marketGear'), PinnedItemsUser(path='gear.flat.head_warrior_1', Type='marketGear'), PinnedItemsUser(path='potion', Type='potion'), PinnedItemsUser(path='armoire', Type='armoire')], pinnedItemsOrder=[], unpinnedItems=[], secret=None, balance=0.0, lastCron=datetime.datetime(2024, 10, 19, 18, 43, 39, 784000, tzinfo=datetime.timezone.utc), needsCron=False, challenges=[], guilds=[], newMessages={}), success=True, notifications=[], userV=5, appVersion='5.28.8')
4
4
  # ---
File without changes
File without changes
File without changes
File without changes
File without changes