Habiticalib 0.3.3__tar.gz → 0.3.4__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.
- {habiticalib-0.3.3 → habiticalib-0.3.4}/.github/workflows/build.yml +4 -6
- {habiticalib-0.3.3 → habiticalib-0.3.4}/PKG-INFO +1 -1
- {habiticalib-0.3.3 → habiticalib-0.3.4}/pyproject.toml +30 -11
- {habiticalib-0.3.3 → habiticalib-0.3.4}/src/habiticalib/__init__.py +2 -2
- habiticalib-0.3.4/src/habiticalib/const.py +48 -0
- {habiticalib-0.3.3 → habiticalib-0.3.4}/src/habiticalib/lib.py +23 -17
- {habiticalib-0.3.3 → habiticalib-0.3.4}/src/habiticalib/types.py +4 -3
- habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar.png +0 -0
- habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[animated_background].png +0 -0
- habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[default].png +0 -0
- habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[kickstarter_backer_gear].png +0 -0
- habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[kickstarter_pet_mount].png +0 -0
- habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[seafoam].png +0 -0
- habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[shinySeed].png +0 -0
- habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[sleeping].png +0 -0
- habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[snowball].png +0 -0
- habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[special_0].png +0 -0
- habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[special_1].png +0 -0
- habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[spookySparkles].png +0 -0
- habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[weapon_critical].png +0 -0
- habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[with_chair].png +0 -0
- habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_to_file.png +0 -0
- habiticalib-0.3.4/tests/__snapshots__/test_avatar.ambr +4 -0
- habiticalib-0.3.4/tests/__snapshots__/test_login.ambr +4 -0
- habiticalib-0.3.4/tests/__snapshots__/test_tasks.ambr +19 -0
- habiticalib-0.3.3/tests/__snapshots__/test_lib.ambr → habiticalib-0.3.4/tests/__snapshots__/test_user.ambr +4 -4
- habiticalib-0.3.4/tests/conftest.py +126 -0
- habiticalib-0.3.4/tests/fixtures/empty_data.json +27 -0
- habiticalib-0.3.4/tests/fixtures/task.json +67 -0
- habiticalib-0.3.4/tests/fixtures/task_order.json +35 -0
- habiticalib-0.3.4/tests/fixtures/tasks.json +913 -0
- habiticalib-0.3.4/tests/fixtures/user_anonymized.json +1791 -0
- habiticalib-0.3.4/tests/fixtures/user_styles_animated_background.json +57 -0
- habiticalib-0.3.4/tests/fixtures/user_styles_kickstarter.json +57 -0
- habiticalib-0.3.3/tests/fixtures/user_styles_kickstarter.json → habiticalib-0.3.4/tests/fixtures/user_styles_kickstarter_pets.json +1 -1
- {habiticalib-0.3.3 → habiticalib-0.3.4}/tests/fixtures/user_styles_seafoam.json +3 -3
- {habiticalib-0.3.3 → habiticalib-0.3.4}/tests/fixtures/user_styles_shinySeed.json +4 -4
- {habiticalib-0.3.3 → habiticalib-0.3.4}/tests/fixtures/user_styles_sleeping.json +2 -2
- {habiticalib-0.3.3 → habiticalib-0.3.4}/tests/fixtures/user_styles_snowball.json +3 -3
- habiticalib-0.3.4/tests/fixtures/user_styles_special_0.json +57 -0
- habiticalib-0.3.4/tests/fixtures/user_styles_special_1.json +57 -0
- {habiticalib-0.3.3 → habiticalib-0.3.4}/tests/fixtures/user_styles_spookySparkles.json +3 -3
- habiticalib-0.3.4/tests/fixtures/user_styles_weapon_critical.json +57 -0
- {habiticalib-0.3.3 → habiticalib-0.3.4}/tests/fixtures/user_styles_with_chair.json +14 -14
- habiticalib-0.3.4/tests/test_avatar.py +110 -0
- habiticalib-0.3.4/tests/test_login.py +18 -0
- habiticalib-0.3.4/tests/test_tasks.py +329 -0
- habiticalib-0.3.4/tests/test_user.py +53 -0
- habiticalib-0.3.3/src/habiticalib/const.py +0 -18
- habiticalib-0.3.3/tests/__snapshots__/test_avatar.ambr +0 -28
- habiticalib-0.3.3/tests/conftest.py +0 -49
- habiticalib-0.3.3/tests/test_avatar.py +0 -100
- habiticalib-0.3.3/tests/test_init.py +0 -16
- habiticalib-0.3.3/tests/test_lib.py +0 -30
- {habiticalib-0.3.3 → habiticalib-0.3.4}/.cruft.json +0 -0
- {habiticalib-0.3.3 → habiticalib-0.3.4}/.editorconfig +0 -0
- {habiticalib-0.3.3 → habiticalib-0.3.4}/.github/FUNDING.yml +0 -0
- {habiticalib-0.3.3 → habiticalib-0.3.4}/.github/dependabot.yml +0 -0
- {habiticalib-0.3.3 → habiticalib-0.3.4}/.github/labels.yml +0 -0
- {habiticalib-0.3.3 → habiticalib-0.3.4}/.github/release-drafter.yml +0 -0
- {habiticalib-0.3.3 → habiticalib-0.3.4}/.github/workflows/documentation.yml +0 -0
- {habiticalib-0.3.3 → habiticalib-0.3.4}/.github/workflows/draft.yml +0 -0
- {habiticalib-0.3.3 → habiticalib-0.3.4}/.github/workflows/labeler.yml +0 -0
- {habiticalib-0.3.3 → habiticalib-0.3.4}/.gitignore +0 -0
- {habiticalib-0.3.3 → habiticalib-0.3.4}/.pre-commit-config.yaml +0 -0
- {habiticalib-0.3.3 → habiticalib-0.3.4}/.vscode/settings.json +0 -0
- {habiticalib-0.3.3 → habiticalib-0.3.4}/LICENSE +0 -0
- {habiticalib-0.3.3 → habiticalib-0.3.4}/README.md +0 -0
- {habiticalib-0.3.3 → habiticalib-0.3.4}/docs/index.md +0 -0
- {habiticalib-0.3.3 → habiticalib-0.3.4}/docs/reference/habiticalib.md +0 -0
- {habiticalib-0.3.3 → habiticalib-0.3.4}/mkdocs.yml +0 -0
- {habiticalib-0.3.3 → habiticalib-0.3.4}/src/habiticalib/exceptions.py +0 -0
- {habiticalib-0.3.3 → habiticalib-0.3.4}/src/habiticalib/ha.py +0 -0
- {habiticalib-0.3.3 → habiticalib-0.3.4}/src/habiticalib/helpers.py +0 -0
- {habiticalib-0.3.3 → habiticalib-0.3.4}/src/habiticalib/py.typed +0 -0
- {habiticalib-0.3.3 → habiticalib-0.3.4}/tests/__init__.py +0 -0
- {habiticalib-0.3.3 → habiticalib-0.3.4}/tests/fixtures/login.json +0 -0
- {habiticalib-0.3.3 → habiticalib-0.3.4}/tests/fixtures/user.json +0 -0
- {habiticalib-0.3.3 → habiticalib-0.3.4}/tests/fixtures/user_styles.json +0 -0
@@ -8,7 +8,7 @@ jobs:
|
|
8
8
|
runs-on: ubuntu-latest
|
9
9
|
strategy:
|
10
10
|
matrix:
|
11
|
-
python_version: [
|
11
|
+
python_version: ["3.12"]
|
12
12
|
|
13
13
|
steps:
|
14
14
|
- uses: actions/checkout@v4
|
@@ -17,16 +17,14 @@ jobs:
|
|
17
17
|
with:
|
18
18
|
python-version: ${{ matrix.python_version }}
|
19
19
|
- name: Install dependencies
|
20
|
-
run:
|
21
|
-
python -m pip install --upgrade pip
|
22
|
-
pip install hatch
|
23
|
-
hatch env create
|
20
|
+
run: pipx install hatch
|
24
21
|
- name: Lint and typecheck
|
25
22
|
run: |
|
26
23
|
hatch run lint-check
|
27
24
|
- name: Test
|
28
25
|
run: |
|
29
|
-
hatch
|
26
|
+
hatch test --all
|
27
|
+
|
30
28
|
- uses: codecov/codecov-action@v5
|
31
29
|
with:
|
32
30
|
token: ${{ secrets.CODECOV_TOKEN }}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: Habiticalib
|
3
|
-
Version: 0.3.
|
3
|
+
Version: 0.3.4
|
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
|
@@ -4,7 +4,7 @@ line-length = 88
|
|
4
4
|
|
5
5
|
[tool.ruff.lint]
|
6
6
|
select = ["ALL"]
|
7
|
-
ignore = ["TRY003", "D202", "D213", "D417", "ANN003", "ANN401", "E501", "COM812", "ISC001"]
|
7
|
+
ignore = ["TRY003", "D202", "D213", "D417", "ANN003", "ANN401", "E501", "COM812", "ISC001", "A005"]
|
8
8
|
|
9
9
|
[tool.ruff.lint.isort]
|
10
10
|
force-sort-within-sections = true
|
@@ -32,6 +32,7 @@ testpaths = ["tests"]
|
|
32
32
|
pythonpath = ["src"]
|
33
33
|
addopts = "--cov=src/habiticalib --cov-report=term-missing"
|
34
34
|
asyncio_mode = "auto"
|
35
|
+
asyncio_default_fixture_loop_scope = "function"
|
35
36
|
|
36
37
|
[tool.pylint.DESIGN]
|
37
38
|
max-attributes = 8
|
@@ -53,6 +54,11 @@ ignore-imports = true
|
|
53
54
|
[tool.pylint.FORMAT]
|
54
55
|
max-line-length = 88
|
55
56
|
|
57
|
+
[tool.coverage.report]
|
58
|
+
exclude_lines = [
|
59
|
+
"if TYPE_CHECKING:",
|
60
|
+
]
|
61
|
+
|
56
62
|
[tool.hatch]
|
57
63
|
|
58
64
|
[tool.hatch.metadata]
|
@@ -68,20 +74,33 @@ python = "3.12"
|
|
68
74
|
dependencies = [
|
69
75
|
"aiohttp==3.11.11",
|
70
76
|
"mashumaro==3.15",
|
71
|
-
"orjson==3.10.
|
72
|
-
"Pillow==11.
|
73
|
-
"mypy==1.14.
|
74
|
-
"ruff==0.
|
77
|
+
"orjson==3.10.15",
|
78
|
+
"Pillow==11.1.0",
|
79
|
+
"mypy==1.14.1",
|
80
|
+
"ruff==0.9.4",
|
75
81
|
"pytest==8.3.4",
|
76
82
|
"pytest-cov==6.0.0",
|
77
|
-
"mkdocs-material==9.
|
83
|
+
"mkdocs-material==9.6.1",
|
78
84
|
"mkdocstrings[python]==0.27.0",
|
79
|
-
"pytest-asyncio==0.25.
|
80
|
-
"aioresponses==0.7.
|
81
|
-
"pre-commit==4.0
|
82
|
-
"syrupy==4.8.
|
85
|
+
"pytest-asyncio==0.25.3",
|
86
|
+
"aioresponses==0.7.8",
|
87
|
+
"pre-commit==4.1.0",
|
88
|
+
"syrupy==4.8.1"
|
83
89
|
]
|
84
|
-
|
90
|
+
|
91
|
+
[tool.hatch.envs.hatch-test]
|
92
|
+
parallel = true
|
93
|
+
extra-dependencies = [
|
94
|
+
"aioresponses==0.7.8",
|
95
|
+
"pytest-asyncio==0.25.3",
|
96
|
+
"syrupy==4.8.1",
|
97
|
+
"pytest-cov==6.0.0",
|
98
|
+
]
|
99
|
+
extra-args = ["--cov-report=xml", "-vv"]
|
100
|
+
type = "virtual"
|
101
|
+
|
102
|
+
[[tool.hatch.envs.hatch-test.matrix]]
|
103
|
+
python = ["3.13", "3.12"]
|
85
104
|
|
86
105
|
[tool.hatch.envs.default.scripts]
|
87
106
|
test = "pytest"
|
@@ -33,7 +33,7 @@ from .types import (
|
|
33
33
|
HabiticaTaskOrderResponse,
|
34
34
|
HabiticaTaskResponse,
|
35
35
|
HabiticaTasksResponse,
|
36
|
-
|
36
|
+
HabiticaUserAnonymizedResponse,
|
37
37
|
HabiticaUserExport,
|
38
38
|
HabiticaUserResponse,
|
39
39
|
Language,
|
@@ -82,7 +82,7 @@ __all__ = [
|
|
82
82
|
"HabiticaTaskOrderResponse",
|
83
83
|
"HabiticaTaskResponse",
|
84
84
|
"HabiticaTasksResponse",
|
85
|
-
"
|
85
|
+
"HabiticaUserAnonymizedResponse",
|
86
86
|
"HabiticaUserExport",
|
87
87
|
"HabiticaUserResponse",
|
88
88
|
"Language",
|
@@ -0,0 +1,48 @@
|
|
1
|
+
"""Constants for Habiticalib."""
|
2
|
+
|
3
|
+
__version__ = "0.3.4"
|
4
|
+
|
5
|
+
DEFAULT_URL = "https://habitica.com/"
|
6
|
+
ASSETS_URL = "https://habitica-assets.s3.amazonaws.com/mobileApp/images/"
|
7
|
+
|
8
|
+
DEVELOPER_ID = "4c4ca53f-c059-4ffa-966e-9d29dd405daf"
|
9
|
+
|
10
|
+
# Assets that doesn't follow name conventions like 2019 Kickstarter gear
|
11
|
+
# https://github.com/HabitRPG/habitica/blob/develop/website/client/src/assets/css/sprites.css
|
12
|
+
SPECIAL_ASSETS = {
|
13
|
+
"armor_special_ks2019": "BackerOnly-Equip-MythicGryphonArmor.gif",
|
14
|
+
"back_special_heroicAureole": "back_special_heroicAureole.gif",
|
15
|
+
"background_airship": "background_airship.gif",
|
16
|
+
"background_clocktower": "background_clocktower.gif",
|
17
|
+
"background_steamworks": "background_steamworks.gif",
|
18
|
+
"broad_armor_special_0": "BackerOnly-Equip-ShadeArmor.gif",
|
19
|
+
"broad_armor_special_1": "ContributorOnly-Equip-CrystalArmor.gif",
|
20
|
+
"broad_armor_special_ks2019": "BackerOnly-Equip-MythicGryphonArmor.gif",
|
21
|
+
"eyewear_special_ks2019": "BackerOnly-Equip-MythicGryphonVisor.gif",
|
22
|
+
"head_special_0": "BackerOnly-Equip-ShadeHelmet.gif",
|
23
|
+
"head_special_1": "ContributorOnly-Equip-CrystalHelmet.gif",
|
24
|
+
"head_special_ks2019": "BackerOnly-Equip-MythicGryphonHelm.gif",
|
25
|
+
"Mount_Body_Gryphon-Gryphatrice": "BackerOnly-Mount-Body-Gryphatrice.gif",
|
26
|
+
"Mount_Head_Gryphon-Gryphatrice": "BackerOnly-Mount-Head-Gryphatrice.gif",
|
27
|
+
"Pet-Gryphatrice-Jubilant": "Pet-Gryphatrice-Jubilant.gif",
|
28
|
+
"Pet-Gryphon-Gryphatrice": "BackerOnly-Pet-Gryphatrice.gif",
|
29
|
+
"Pet-Wolf-Cerberus": "BackerOnly-Pet-CerberusPup.gif",
|
30
|
+
"shield_special_0": "BackerOnly-Shield-TormentedSkull.gif",
|
31
|
+
"shield_special_ks2019": "BackerOnly-Equip-MythicGryphonShield.gif",
|
32
|
+
"slim_armor_special_0": "BackerOnly-Equip-ShadeArmor.gif",
|
33
|
+
"slim_armor_special_1": "ContributorOnly-Equip-CrystalArmor.gif",
|
34
|
+
"slim_armor_special_ks2019": "BackerOnly-Equip-MythicGryphonArmor.gif",
|
35
|
+
"weapon_special_0": "BackerOnly-Weapon-DarkSoulsBlade.gif",
|
36
|
+
"weapon_special_critical": "weapon_special_critical.gif",
|
37
|
+
"weapon_special_ks2019": "BackerOnly-Equip-MythicGryphonGlaive.gif",
|
38
|
+
}
|
39
|
+
|
40
|
+
SPECIAL_ASSETS_OFFSET = {
|
41
|
+
"head_special_0": (-3, -18),
|
42
|
+
"weapon_special_0": (-3, -18),
|
43
|
+
"weapon_special_critical": (-12, 12),
|
44
|
+
"weapon_special_1": (-12, 0),
|
45
|
+
"head_special_1": (0, 3),
|
46
|
+
}
|
47
|
+
|
48
|
+
PAGE_LIMIT = 60
|
@@ -6,6 +6,7 @@ import asyncio
|
|
6
6
|
from http import HTTPStatus
|
7
7
|
from io import BytesIO
|
8
8
|
import logging
|
9
|
+
from operator import add
|
9
10
|
from typing import IO, TYPE_CHECKING, Any, Self
|
10
11
|
|
11
12
|
from aiohttp import ClientError, ClientResponseError, ClientSession
|
@@ -13,7 +14,13 @@ from habitipy.aio import HabitipyAsync # type: ignore[import-untyped]
|
|
13
14
|
from PIL import Image
|
14
15
|
from yarl import URL
|
15
16
|
|
16
|
-
from .const import
|
17
|
+
from .const import (
|
18
|
+
ASSETS_URL,
|
19
|
+
DEFAULT_URL,
|
20
|
+
PAGE_LIMIT,
|
21
|
+
SPECIAL_ASSETS,
|
22
|
+
SPECIAL_ASSETS_OFFSET,
|
23
|
+
)
|
17
24
|
from .exceptions import (
|
18
25
|
BadRequestError,
|
19
26
|
NotAuthorizedError,
|
@@ -47,7 +54,7 @@ from .types import (
|
|
47
54
|
HabiticaTaskOrderResponse,
|
48
55
|
HabiticaTaskResponse,
|
49
56
|
HabiticaTasksResponse,
|
50
|
-
|
57
|
+
HabiticaUserAnonymizedResponse,
|
51
58
|
HabiticaUserExport,
|
52
59
|
HabiticaUserResponse,
|
53
60
|
Language,
|
@@ -113,7 +120,7 @@ class Habitica:
|
|
113
120
|
async def _request(self, method: str, url: URL, **kwargs) -> str:
|
114
121
|
"""Handle API request."""
|
115
122
|
async with self._session.request(
|
116
|
-
method,
|
123
|
+
method.upper(),
|
117
124
|
url,
|
118
125
|
headers=self._headers,
|
119
126
|
**kwargs,
|
@@ -255,7 +262,7 @@ class Habitica:
|
|
255
262
|
|
256
263
|
async def get_user_anonymized(
|
257
264
|
self,
|
258
|
-
) ->
|
265
|
+
) -> HabiticaUserAnonymizedResponse:
|
259
266
|
"""Get the authenticated user's anonymized profile.
|
260
267
|
|
261
268
|
This method retrieves the user's profile data while excluding sensitive
|
@@ -292,7 +299,7 @@ class Habitica:
|
|
292
299
|
|
293
300
|
url = url / "anonymized"
|
294
301
|
|
295
|
-
return
|
302
|
+
return HabiticaUserAnonymizedResponse.from_json(
|
296
303
|
await self._request("get", url=url),
|
297
304
|
)
|
298
305
|
|
@@ -1808,9 +1815,9 @@ class Habitica:
|
|
1808
1815
|
-------
|
1809
1816
|
None
|
1810
1817
|
"""
|
1811
|
-
|
1812
|
-
|
1813
|
-
|
1818
|
+
|
1819
|
+
url = URL(ASSETS_URL) / SPECIAL_ASSETS.get(asset, f"{asset}.png")
|
1820
|
+
|
1814
1821
|
try:
|
1815
1822
|
if not (asset_data := self._assets_cache.get(asset)):
|
1816
1823
|
async with self._session.get(url) as r:
|
@@ -1819,18 +1826,20 @@ class Habitica:
|
|
1819
1826
|
self._cache_asset(asset, asset_data)
|
1820
1827
|
except ClientResponseError as e:
|
1821
1828
|
_LOGGER.exception(
|
1822
|
-
"Failed to load %s
|
1829
|
+
"Failed to load %s due to error [%s]: %s",
|
1823
1830
|
asset,
|
1824
1831
|
e.status,
|
1825
1832
|
e.message,
|
1826
1833
|
)
|
1827
1834
|
except ClientError:
|
1828
1835
|
_LOGGER.exception(
|
1829
|
-
"Failed to load %s
|
1836
|
+
"Failed to load %s due to a request error",
|
1830
1837
|
asset,
|
1831
1838
|
)
|
1832
1839
|
else:
|
1833
1840
|
fetched_image = Image.open(asset_data).convert("RGBA")
|
1841
|
+
if offset := SPECIAL_ASSETS_OFFSET.get(asset):
|
1842
|
+
position = tuple(map(add, position, offset))
|
1834
1843
|
image.paste(fetched_image, position, fetched_image)
|
1835
1844
|
|
1836
1845
|
async def generate_avatar( # noqa: PLR0912, PLR0915
|
@@ -1895,11 +1904,8 @@ class Habitica:
|
|
1895
1904
|
)
|
1896
1905
|
gear = getattr(gear_set, gear_type)
|
1897
1906
|
if gear and gear != f"{gear_type}_base_0":
|
1898
|
-
# 2019 Kickstarter gear doesn't follow name conventions
|
1899
|
-
if special_ks2019 := BACKER_ONLY_GEAR.get(gear):
|
1900
|
-
gear = special_ks2019
|
1901
1907
|
# armor has slim and broad size options
|
1902
|
-
|
1908
|
+
if gear_type == "armor":
|
1903
1909
|
gear = f"{preferences.size}_{gear}"
|
1904
1910
|
await self.paste_image(image, gear, (24, mount_offset_y))
|
1905
1911
|
|
@@ -1928,7 +1934,7 @@ class Habitica:
|
|
1928
1934
|
):
|
1929
1935
|
if stats.buffs.spookySparkles:
|
1930
1936
|
await self.paste_image(image, "ghost", (24, mount_offset_y))
|
1931
|
-
if stats.buffs.
|
1937
|
+
if stats.buffs.snowball:
|
1932
1938
|
await self.paste_image(
|
1933
1939
|
image,
|
1934
1940
|
f"avatar_snowball_{stats.Class}",
|
@@ -1961,7 +1967,7 @@ class Habitica:
|
|
1961
1967
|
await self.paste_image(
|
1962
1968
|
image,
|
1963
1969
|
f"chair_{preferences.chair}",
|
1964
|
-
(24,
|
1970
|
+
(24, mount_offset_y),
|
1965
1971
|
)
|
1966
1972
|
|
1967
1973
|
# Fetch and paste the back accessory
|
@@ -1970,7 +1976,7 @@ class Habitica:
|
|
1970
1976
|
# Fetch and paste the skin
|
1971
1977
|
await self.paste_image(
|
1972
1978
|
image,
|
1973
|
-
f"skin_{preferences.skin}{
|
1979
|
+
f"skin_{preferences.skin}{'_sleep' if preferences.sleep else ''}",
|
1974
1980
|
(24, mount_offset_y),
|
1975
1981
|
)
|
1976
1982
|
|
@@ -903,6 +903,7 @@ class Task(TypedDict("Task", {"type": NotRequired[TaskType]}), total=True):
|
|
903
903
|
weeksOfMonth: NotRequired[list[int]]
|
904
904
|
completed: NotRequired[bool]
|
905
905
|
streak: NotRequired[int]
|
906
|
+
value: NotRequired[float]
|
906
907
|
|
907
908
|
|
908
909
|
@dataclass(kw_only=True)
|
@@ -914,7 +915,7 @@ class TaskData:
|
|
914
915
|
Type: TaskType | None = field(default=None, metadata=field_options(alias="type"))
|
915
916
|
text: str | None = None
|
916
917
|
notes: str | None = None
|
917
|
-
tags: list[UUID]
|
918
|
+
tags: list[UUID] = field(default_factory=list)
|
918
919
|
value: float | None = None
|
919
920
|
priority: TaskPriority | None = None
|
920
921
|
attribute: Attributes | None = None
|
@@ -929,7 +930,7 @@ class TaskData:
|
|
929
930
|
counterUp: int | None = None
|
930
931
|
counterDown: int | None = None
|
931
932
|
frequency: Frequency | None = None
|
932
|
-
history: list[EntryHistory]
|
933
|
+
history: list[EntryHistory] = field(default_factory=list)
|
933
934
|
alias: str | None = None
|
934
935
|
everyX: int | None = None
|
935
936
|
startDate: datetime | None = None
|
@@ -1059,7 +1060,7 @@ class UserAnonymizedData:
|
|
1059
1060
|
|
1060
1061
|
|
1061
1062
|
@dataclass(kw_only=True)
|
1062
|
-
class
|
1063
|
+
class HabiticaUserAnonymizedResponse(DataClassORJSONMixin):
|
1063
1064
|
"""Representation of a anonymized user data export."""
|
1064
1065
|
|
1065
1066
|
data: UserAnonymizedData
|
Binary file
|
habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[default].png
ADDED
Binary file
|
Binary file
|
Binary file
|
habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[seafoam].png
ADDED
Binary file
|
habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[shinySeed].png
ADDED
Binary file
|
habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[sleeping].png
ADDED
Binary file
|
habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[snowball].png
ADDED
Binary file
|
habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[special_0].png
ADDED
Binary file
|
habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[special_1].png
ADDED
Binary file
|
Binary file
|
Binary file
|
habiticalib-0.3.4/tests/__snapshots__/test_avatar/test_generate_avatar_from_styles[with_chair].png
ADDED
Binary file
|
Binary file
|
@@ -0,0 +1,4 @@
|
|
1
|
+
# serializer version: 1
|
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=<HabiticaClass.WARRIOR: 'warrior'>))
|
4
|
+
# ---
|
@@ -0,0 +1,4 @@
|
|
1
|
+
# serializer version: 1
|
2
|
+
# name: test_login
|
3
|
+
HabiticaLoginResponse(data=LoginData(id=UUID('a380546a-94be-4b8e-8a0b-23e0d5c03303'), apiToken='cd0e5985-17de-4b4f-849e-5d506c5e4382', newUser=False, username='test-username', passwordResetCode=None), success=True, notifications=[], userV=None, appVersion='5.30.0')
|
4
|
+
# ---
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# serializer version: 1
|
2
|
+
# name: test_create_task_response
|
3
|
+
HabiticaTaskResponse(data=TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.HABIT: 'habit'>, text='task text', notes='task notes', tags=[], value=0.0, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2024, 9, 22, 16, 41, 39, 555000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2024, 10, 26, 16, 48, 8, 742000, tzinfo=datetime.timezone.utc), date=None, id=UUID('7bc0d924-f5e5-48a6-af7f-8075f8c94e0f'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=True, down=False, counterUp=0, counterDown=0, frequency=<Frequency.DAILY: 'daily'>, history=[EntryHistory(date=datetime.datetime(2024, 10, 7, 19, 19, 47, 306000, tzinfo=datetime.timezone.utc), value=1.0, scoredUp=1, scoredDown=0, isDue=None, completed=None), EntryHistory(date=datetime.datetime(2024, 10, 16, 20, 19, 11, 168000, tzinfo=datetime.timezone.utc), value=8.184193475367, scoredUp=9, scoredDown=0, isDue=None, completed=None)], alias='counter_test', everyX=None, startDate=None, streak=None, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[], yesterDaily=None, completed=None, collapseChecklist=False, checklist=[], isDue=None, repeat=Repeat(m=True, t=True, w=True, th=False, f=False, s=False, su=False)), success=True, notifications=[NotificationsUser(Type='ITEM_RECEIVED', data={'icon': 'notif_orca_mount', 'title': 'Orcas for Summer Splash!', 'text': "To celebrate Summer Splash, we've given you an Orca Mount!", 'destination': 'stable'}, seen=True, id=UUID('b7a85df1-06ed-4ab1-b56d-43418fc6a5e5')), NotificationsUser(Type='UNALLOCATED_STATS_POINTS', data={'points': 2}, seen=True, id=UUID('bc3f8a69-231f-4eb1-ba48-a00b6c0e0f37'))], userV=589, appVersion='5.28.6')
|
4
|
+
# ---
|
5
|
+
# name: test_delete_task
|
6
|
+
HabiticaResponse(data=None, success=True, notifications=[NotificationsUser(Type='ITEM_RECEIVED', data={'icon': 'notif_orca_mount', 'title': 'Orcas for Summer Splash!', 'text': "To celebrate Summer Splash, we've given you an Orca Mount!", 'destination': 'stable'}, seen=True, id=UUID('b7a85df1-06ed-4ab1-b56d-43418fc6a5e5')), NotificationsUser(Type='UNALLOCATED_STATS_POINTS', data={'points': 2}, seen=True, id=UUID('bc3f8a69-231f-4eb1-ba48-a00b6c0e0f37'))], userV=589, appVersion='5.28.6')
|
7
|
+
# ---
|
8
|
+
# name: test_get_task
|
9
|
+
HabiticaTaskResponse(data=TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.HABIT: 'habit'>, text='task text', notes='task notes', tags=[], value=0.0, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2024, 9, 22, 16, 41, 39, 555000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2024, 10, 26, 16, 48, 8, 742000, tzinfo=datetime.timezone.utc), date=None, id=UUID('7bc0d924-f5e5-48a6-af7f-8075f8c94e0f'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=True, down=False, counterUp=0, counterDown=0, frequency=<Frequency.DAILY: 'daily'>, history=[EntryHistory(date=datetime.datetime(2024, 10, 7, 19, 19, 47, 306000, tzinfo=datetime.timezone.utc), value=1.0, scoredUp=1, scoredDown=0, isDue=None, completed=None), EntryHistory(date=datetime.datetime(2024, 10, 16, 20, 19, 11, 168000, tzinfo=datetime.timezone.utc), value=8.184193475367, scoredUp=9, scoredDown=0, isDue=None, completed=None)], alias='counter_test', everyX=None, startDate=None, streak=None, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[], yesterDaily=None, completed=None, collapseChecklist=False, checklist=[], isDue=None, repeat=Repeat(m=True, t=True, w=True, th=False, f=False, s=False, su=False)), success=True, notifications=[NotificationsUser(Type='ITEM_RECEIVED', data={'icon': 'notif_orca_mount', 'title': 'Orcas for Summer Splash!', 'text': "To celebrate Summer Splash, we've given you an Orca Mount!", 'destination': 'stable'}, seen=True, id=UUID('b7a85df1-06ed-4ab1-b56d-43418fc6a5e5')), NotificationsUser(Type='UNALLOCATED_STATS_POINTS', data={'points': 2}, seen=True, id=UUID('bc3f8a69-231f-4eb1-ba48-a00b6c0e0f37'))], userV=589, appVersion='5.28.6')
|
10
|
+
# ---
|
11
|
+
# name: test_get_tasks
|
12
|
+
HabiticaTasksResponse(data=[TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.HABIT: 'habit'>, text='task text', notes='task notes', tags=[], value=0.0, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2024, 9, 22, 16, 41, 39, 555000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2024, 10, 26, 16, 48, 8, 742000, tzinfo=datetime.timezone.utc), date=None, id=UUID('7bc0d924-f5e5-48a6-af7f-8075f8c94e0f'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=True, down=False, counterUp=0, counterDown=0, frequency=<Frequency.DAILY: 'daily'>, history=[EntryHistory(date=datetime.datetime(2024, 10, 7, 19, 19, 47, 306000, tzinfo=datetime.timezone.utc), value=1.0, scoredUp=1, scoredDown=0, isDue=None, completed=None), EntryHistory(date=datetime.datetime(2024, 10, 16, 20, 19, 11, 168000, tzinfo=datetime.timezone.utc), value=8.184193475367, scoredUp=9, scoredDown=0, isDue=None, completed=None)], alias='counter_test', everyX=None, startDate=None, streak=None, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[], yesterDaily=None, completed=None, collapseChecklist=False, checklist=[], isDue=None, repeat=Repeat(m=True, t=True, w=True, th=False, f=False, s=False, su=False)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.HABIT: 'habit'>, text='task text', notes='task notes', tags=[], value=3.853133245658556, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2024, 9, 22, 16, 41, 39, 555000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2024, 12, 14, 1, 34, 39, 602000, tzinfo=datetime.timezone.utc), date=None, id=UUID('5e1bf953-af75-492c-ba02-c18789758d26'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=True, down=True, counterUp=0, counterDown=0, frequency=<Frequency.DAILY: 'daily'>, history=[EntryHistory(date=datetime.datetime(2024, 10, 16, 20, 19, 5, 151000, tzinfo=datetime.timezone.utc), value=3.853133245658556, scoredUp=4, scoredDown=0, isDue=None, completed=None)], alias=None, everyX=None, startDate=None, streak=None, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[], yesterDaily=None, completed=None, collapseChecklist=False, checklist=[], isDue=None, repeat=Repeat(m=True, t=True, w=True, th=False, f=False, s=False, su=False)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.TODO: 'todo'>, text='task text', notes='task notes', tags=[], value=-68.61448963773076, priority=<TaskPriority.TRIVIAL: 0.1>, attribute=<Attributes.STR: 'str'>, byHabitica=True, createdAt=datetime.datetime(2024, 9, 22, 16, 41, 39, 555000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2025, 2, 1, 15, 6, 43, 570000, tzinfo=datetime.timezone.utc), date=None, id=UUID('e8be3a26-6d3b-43bc-9aac-8246a8bedaed'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=None, down=None, counterUp=None, counterDown=None, frequency=None, history=[], alias='task-alias', everyX=None, startDate=None, streak=None, reminders=[Reminders(id=UUID('3e636b09-4a8c-4b2b-a525-29361b510d5b'), time=datetime.datetime(2024, 10, 13, 20, 51, 49, 391000, tzinfo=datetime.timezone.utc), startDate=None)], daysOfMonth=[], weeksOfMonth=[], nextDue=[], yesterDaily=None, completed=False, collapseChecklist=True, checklist=[Checklist(id=UUID('fde91e22-fc27-40e6-a861-d2da47b5e7fd'), text='item 0', completed=True), Checklist(id=UUID('532ba006-1115-4db4-b19d-bb255e3dc3de'), text='item 1', completed=False), Checklist(id=UUID('08da262f-c4f6-4a59-9c33-340e87a7ef27'), text='item 2', completed=False)], isDue=None, repeat=Repeat(m=True, t=True, w=True, th=False, f=False, s=False, su=False)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.REWARD: 'reward'>, text='task text', notes='task notes', tags=[UUID('50021cf7-b9f2-4f94-b80d-0263ce7cf3ec')], value=1.0, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2024, 9, 22, 16, 41, 39, 555000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2024, 10, 17, 22, 25, 27, 43000, tzinfo=datetime.timezone.utc), date=None, id=UUID('93eb1e9c-4d14-4a94-b699-279963ecf410'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=None, down=None, counterUp=None, counterDown=None, frequency=None, history=[], alias=None, everyX=None, startDate=None, streak=None, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[], yesterDaily=None, completed=None, collapseChecklist=False, checklist=[], isDue=None, repeat=Repeat(m=True, t=True, w=True, th=False, f=False, s=False, su=False)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.HABIT: 'habit'>, text='task text', notes='task notes', tags=[], value=0.0, priority=<TaskPriority.HARD: 2>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2024, 10, 7, 19, 8, 12, 325000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2025, 2, 1, 15, 6, 43, 571000, tzinfo=datetime.timezone.utc), date=None, id=UUID('67894647-f6e6-4f1a-824c-62a7fffff752'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=True, down=False, counterUp=0, counterDown=0, frequency=<Frequency.MONTHLY: 'monthly'>, history=[EntryHistory(date=datetime.datetime(2024, 10, 16, 20, 19, 3, 714000, tzinfo=datetime.timezone.utc), value=7.355994112832055, scoredUp=8, scoredDown=0, isDue=None, completed=None)], alias='test_habit', everyX=None, startDate=None, streak=None, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[], yesterDaily=None, completed=None, collapseChecklist=False, checklist=[], isDue=None, repeat=Repeat(m=True, t=True, w=True, th=False, f=False, s=False, su=False)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.TODO: 'todo'>, text='task text', notes='task notes', tags=[], value=-10.065628947026687, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2025, 1, 6, 18, 23, 10, 551000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2025, 2, 1, 15, 6, 43, 560000, tzinfo=datetime.timezone.utc), date=None, id=UUID('75a4ac64-e8ac-44b8-b300-2086af8d2845'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=None, down=None, counterUp=None, counterDown=None, frequency=None, history=[], alias=None, everyX=None, startDate=None, streak=None, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[], yesterDaily=None, completed=False, collapseChecklist=False, checklist=[], isDue=None, repeat=Repeat(m=True, t=True, w=True, th=False, f=False, s=False, su=False)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.TODO: 'todo'>, text='task text', notes='task notes', tags=[], value=-10.065632848406528, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2025, 1, 6, 20, 22, 27, 696000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2025, 2, 1, 15, 6, 43, 561000, tzinfo=datetime.timezone.utc), date=None, id=UUID('2cae3698-0ca3-441d-ac4e-980323956f42'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=None, down=None, counterUp=None, counterDown=None, frequency=None, history=[], alias=None, everyX=None, startDate=None, streak=None, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[], yesterDaily=None, completed=False, collapseChecklist=False, checklist=[], isDue=None, repeat=Repeat(m=True, t=True, w=True, th=False, f=False, s=False, su=False)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.TODO: 'todo'>, text='task text', notes='task notes', tags=[], value=-4.16134259811365, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2025, 1, 6, 20, 24, 32, 936000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2025, 2, 1, 15, 6, 43, 561000, tzinfo=datetime.timezone.utc), date=None, id=UUID('a029cb52-1012-4d36-91af-b45c0bdbda69'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=None, down=None, counterUp=None, counterDown=None, frequency=None, history=[], alias=None, everyX=None, startDate=None, streak=None, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[], yesterDaily=None, completed=False, collapseChecklist=False, checklist=[], isDue=None, repeat=Repeat(m=True, t=True, w=True, th=False, f=False, s=False, su=False)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.TODO: 'todo'>, text='task text', notes='task notes', tags=[], value=-4.16134259811365, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2025, 1, 6, 20, 29, 0, 542000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2025, 2, 1, 15, 6, 43, 561000, tzinfo=datetime.timezone.utc), date=None, id=UUID('203048ee-4020-48ef-99ef-3a20c7c9a8b3'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=None, down=None, counterUp=None, counterDown=None, frequency=None, history=[], alias=None, everyX=None, startDate=None, streak=None, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[], yesterDaily=None, completed=False, collapseChecklist=False, checklist=[], isDue=None, repeat=Repeat(m=True, t=True, w=True, th=False, f=False, s=False, su=False)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.TODO: 'todo'>, text='task text', notes='task notes', tags=[], value=-10.065631750759767, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2025, 1, 6, 20, 30, 16, 745000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2025, 2, 1, 15, 6, 43, 561000, tzinfo=datetime.timezone.utc), date=None, id=UUID('9983f4c9-04be-446c-99d2-fca07e9e2dcd'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=None, down=None, counterUp=None, counterDown=None, frequency=None, history=[], alias=None, everyX=None, startDate=None, streak=None, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[], yesterDaily=None, completed=False, collapseChecklist=False, checklist=[], isDue=None, repeat=Repeat(m=True, t=True, w=True, th=False, f=False, s=False, su=False)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.DAILY: 'daily'>, text='task text', notes='task notes', tags=[], value=2.992271863689143, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2025, 1, 6, 22, 42, 49, 719000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2025, 2, 1, 15, 6, 43, 561000, tzinfo=datetime.timezone.utc), date=None, id=UUID('8b54b538-7fe5-4132-91e1-4eebac0073f5'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=None, down=None, counterUp=None, counterDown=None, frequency=<Frequency.WEEKLY: 'weekly'>, history=[EntryHistory(date=datetime.datetime(2025, 1, 6, 23, 0, 9, 684000, tzinfo=datetime.timezone.utc), value=1.0, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 10, 1, 12, 46, 313000, tzinfo=datetime.timezone.utc), value=1.9747, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 10, 23, 2, 8, 864000, tzinfo=datetime.timezone.utc), value=1.024043774264157, scoredUp=None, scoredDown=None, isDue=True, completed=False), EntryHistory(date=datetime.datetime(2025, 1, 13, 17, 48, 43, 163000, tzinfo=datetime.timezone.utc), value=1.998143412564751, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 13, 23, 0, 47, 611000, tzinfo=datetime.timezone.utc), value=2.9482287028135716, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 15, 17, 31, 41, 493000, tzinfo=datetime.timezone.utc), value=2.020995311995297, scoredUp=None, scoredDown=None, isDue=True, completed=False), EntryHistory(date=datetime.datetime(2025, 1, 18, 18, 22, 21, 871000, tzinfo=datetime.timezone.utc), value=2.9705244023522885, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 20, 11, 47, 2, 983000, tzinfo=datetime.timezone.utc), value=3.8972281794078136, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 2, 1, 15, 6, 43, 541000, tzinfo=datetime.timezone.utc), value=2.992271863689143, scoredUp=None, scoredDown=None, isDue=True, completed=False)], alias=None, everyX=1, startDate=datetime.datetime(2025, 1, 5, 23, 0, tzinfo=datetime.timezone.utc), streak=0, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[datetime.datetime(2025, 2, 2, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 3, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 4, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 5, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 6, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 7, 23, 0, tzinfo=datetime.timezone.utc)], yesterDaily=True, completed=False, collapseChecklist=False, checklist=[], isDue=True, repeat=Repeat(m=True, t=True, w=True, th=True, f=True, s=True, su=True)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.DAILY: 'daily'>, text='task text', notes='task notes', tags=[], value=4.800754343722116, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2025, 1, 6, 22, 42, 52, 877000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2025, 2, 1, 15, 6, 43, 561000, tzinfo=datetime.timezone.utc), date=None, id=UUID('c65a4932-f81d-4e83-a1f5-b94bc1b5a505'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=None, down=None, counterUp=None, counterDown=None, frequency=<Frequency.WEEKLY: 'weekly'>, history=[EntryHistory(date=datetime.datetime(2025, 1, 6, 23, 0, 9, 696000, tzinfo=datetime.timezone.utc), value=1.0, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 10, 1, 12, 46, 316000, tzinfo=datetime.timezone.utc), value=1.9747, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 10, 23, 2, 8, 865000, tzinfo=datetime.timezone.utc), value=1.024043774264157, scoredUp=None, scoredDown=None, isDue=True, completed=False), EntryHistory(date=datetime.datetime(2025, 1, 13, 17, 48, 43, 166000, tzinfo=datetime.timezone.utc), value=1.998143412564751, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 13, 23, 0, 47, 613000, tzinfo=datetime.timezone.utc), value=2.9482287028135716, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 15, 17, 31, 41, 305000, tzinfo=datetime.timezone.utc), value=3.8754620936318465, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 18, 18, 22, 21, 876000, tzinfo=datetime.timezone.utc), value=4.780923305699728, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 20, 11, 47, 2, 987000, tzinfo=datetime.timezone.utc), value=5.665617021312497, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 2, 1, 15, 6, 43, 542000, tzinfo=datetime.timezone.utc), value=4.800754343722116, scoredUp=None, scoredDown=None, isDue=True, completed=False)], alias=None, everyX=1, startDate=datetime.datetime(2025, 1, 5, 23, 0, tzinfo=datetime.timezone.utc), streak=0, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[datetime.datetime(2025, 2, 2, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 3, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 4, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 5, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 6, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 7, 23, 0, tzinfo=datetime.timezone.utc)], yesterDaily=True, completed=False, collapseChecklist=False, checklist=[], isDue=True, repeat=Repeat(m=True, t=True, w=True, th=True, f=True, s=True, su=True)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.DAILY: 'daily'>, text='task text', notes='task notes', tags=[], value=2.992271863689143, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2025, 1, 6, 22, 42, 56, 440000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2025, 2, 1, 15, 6, 43, 561000, tzinfo=datetime.timezone.utc), date=None, id=UUID('1b21023c-b1e6-4b11-bcfa-9d48473033a1'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=None, down=None, counterUp=None, counterDown=None, frequency=<Frequency.WEEKLY: 'weekly'>, history=[EntryHistory(date=datetime.datetime(2025, 1, 6, 23, 0, 9, 693000, tzinfo=datetime.timezone.utc), value=1.0, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 10, 1, 12, 46, 314000, tzinfo=datetime.timezone.utc), value=1.9747, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 10, 23, 2, 8, 866000, tzinfo=datetime.timezone.utc), value=1.024043774264157, scoredUp=None, scoredDown=None, isDue=True, completed=False), EntryHistory(date=datetime.datetime(2025, 1, 13, 17, 48, 43, 165000, tzinfo=datetime.timezone.utc), value=1.998143412564751, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 13, 23, 0, 47, 612000, tzinfo=datetime.timezone.utc), value=2.9482287028135716, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 15, 17, 31, 41, 494000, tzinfo=datetime.timezone.utc), value=2.020995311995297, scoredUp=None, scoredDown=None, isDue=True, completed=False), EntryHistory(date=datetime.datetime(2025, 1, 18, 18, 22, 21, 873000, tzinfo=datetime.timezone.utc), value=2.9705244023522885, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 20, 11, 47, 2, 985000, tzinfo=datetime.timezone.utc), value=3.8972281794078136, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 2, 1, 15, 6, 43, 543000, tzinfo=datetime.timezone.utc), value=2.992271863689143, scoredUp=None, scoredDown=None, isDue=True, completed=False)], alias=None, everyX=1, startDate=datetime.datetime(2025, 1, 5, 23, 0, tzinfo=datetime.timezone.utc), streak=0, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[datetime.datetime(2025, 2, 2, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 3, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 4, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 5, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 6, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 7, 23, 0, tzinfo=datetime.timezone.utc)], yesterDaily=True, completed=False, collapseChecklist=False, checklist=[], isDue=True, repeat=Repeat(m=True, t=True, w=True, th=True, f=True, s=True, su=True)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.DAILY: 'daily'>, text='task text', notes='task notes', tags=[], value=1.048665488039431, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2025, 1, 13, 18, 36, 13, 598000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2025, 2, 1, 15, 6, 43, 561000, tzinfo=datetime.timezone.utc), date=None, id=UUID('dad786c2-d333-4a24-b81e-4714537b0fec'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=None, down=None, counterUp=None, counterDown=None, frequency=<Frequency.WEEKLY: 'weekly'>, history=[EntryHistory(date=datetime.datetime(2025, 1, 13, 23, 0, 47, 609000, tzinfo=datetime.timezone.utc), value=1.0, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 15, 17, 31, 41, 495000, tzinfo=datetime.timezone.utc), value=0.02529999999999999, scoredUp=None, scoredDown=None, isDue=True, completed=False), EntryHistory(date=datetime.datetime(2025, 1, 18, 18, 22, 21, 868000, tzinfo=datetime.timezone.utc), value=1.0246518837628547, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 20, 11, 47, 2, 982000, tzinfo=datetime.timezone.utc), value=1.9987363426517264, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 2, 1, 15, 6, 43, 543000, tzinfo=datetime.timezone.utc), value=1.048665488039431, scoredUp=None, scoredDown=None, isDue=True, completed=False)], alias=None, everyX=1, startDate=datetime.datetime(2025, 1, 12, 23, 0, tzinfo=datetime.timezone.utc), streak=0, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[datetime.datetime(2025, 2, 2, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 3, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 4, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 5, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 6, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 7, 23, 0, tzinfo=datetime.timezone.utc)], yesterDaily=True, completed=False, collapseChecklist=False, checklist=[], isDue=True, repeat=Repeat(m=True, t=True, w=True, th=True, f=True, s=True, su=True)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.DAILY: 'daily'>, text='task text', notes='task notes', tags=[], value=1.048665488039431, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2025, 1, 13, 18, 36, 15, 291000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2025, 2, 1, 15, 6, 43, 561000, tzinfo=datetime.timezone.utc), date=None, id=UUID('a41c65d3-f97b-4fac-8bd8-1e9c43be99d1'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=None, down=None, counterUp=None, counterDown=None, frequency=<Frequency.WEEKLY: 'weekly'>, history=[EntryHistory(date=datetime.datetime(2025, 1, 13, 23, 0, 47, 608000, tzinfo=datetime.timezone.utc), value=1.0, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 15, 17, 31, 41, 496000, tzinfo=datetime.timezone.utc), value=0.02529999999999999, scoredUp=None, scoredDown=None, isDue=True, completed=False), EntryHistory(date=datetime.datetime(2025, 1, 18, 18, 22, 21, 864000, tzinfo=datetime.timezone.utc), value=1.0246518837628547, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 20, 11, 47, 2, 980000, tzinfo=datetime.timezone.utc), value=1.9987363426517264, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 2, 1, 15, 6, 43, 546000, tzinfo=datetime.timezone.utc), value=1.048665488039431, scoredUp=None, scoredDown=None, isDue=True, completed=False)], alias=None, everyX=1, startDate=datetime.datetime(2025, 1, 12, 23, 0, tzinfo=datetime.timezone.utc), streak=0, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[datetime.datetime(2025, 2, 2, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 3, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 4, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 5, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 6, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 2, 7, 23, 0, tzinfo=datetime.timezone.utc)], yesterDaily=True, completed=False, collapseChecklist=False, checklist=[], isDue=True, repeat=Repeat(m=True, t=True, w=True, th=True, f=True, s=True, su=True)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.DAILY: 'daily'>, text='task text', notes='task notes', tags=[], value=1.9987363426517264, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2025, 1, 13, 18, 36, 17, 152000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2025, 2, 1, 15, 6, 43, 561000, tzinfo=datetime.timezone.utc), date=None, id=UUID('d9247fff-37ec-4c7e-9b15-de79b99a830f'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=None, down=None, counterUp=None, counterDown=None, frequency=<Frequency.WEEKLY: 'weekly'>, history=[EntryHistory(date=datetime.datetime(2025, 1, 13, 23, 0, 47, 605000, tzinfo=datetime.timezone.utc), value=1.0, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 15, 17, 31, 41, 496000, tzinfo=datetime.timezone.utc), value=0.02529999999999999, scoredUp=None, scoredDown=None, isDue=True, completed=False), EntryHistory(date=datetime.datetime(2025, 1, 18, 18, 22, 21, 862000, tzinfo=datetime.timezone.utc), value=1.0246518837628547, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 1, 20, 11, 47, 2, 978000, tzinfo=datetime.timezone.utc), value=1.9987363426517264, scoredUp=None, scoredDown=None, isDue=True, completed=True), EntryHistory(date=datetime.datetime(2025, 2, 1, 15, 6, 43, 547000, tzinfo=datetime.timezone.utc), value=1.9987363426517264, scoredUp=None, scoredDown=None, isDue=False, completed=False)], alias=None, everyX=0, startDate=datetime.datetime(2025, 1, 12, 23, 0, tzinfo=datetime.timezone.utc), streak=2, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[datetime.datetime(2025, 1, 20, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 1, 21, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 1, 22, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 1, 23, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 1, 24, 23, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 1, 26, 23, 0, tzinfo=datetime.timezone.utc)], yesterDaily=True, completed=False, collapseChecklist=False, checklist=[], isDue=False, repeat=Repeat(m=True, t=True, w=True, th=True, f=True, s=True, su=True)), TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.TODO: 'todo'>, text='task text', notes='task notes', tags=[], value=-2.025956256651074, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2025, 1, 18, 18, 45, 4, 942000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2025, 2, 1, 15, 6, 43, 561000, tzinfo=datetime.timezone.utc), date=None, id=UUID('cfd7c79b-ac4d-4133-923f-36f169308b0d'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=None, down=None, counterUp=None, counterDown=None, frequency=None, history=[], alias=None, everyX=None, startDate=None, streak=None, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[], yesterDaily=None, completed=False, collapseChecklist=False, checklist=[], isDue=None, repeat=Repeat(m=True, t=True, w=True, th=False, f=False, s=False, su=False))], success=True, notifications=[NotificationsUser(Type='ITEM_RECEIVED', data={'icon': 'notif_orca_mount', 'title': 'Orcas for Summer Splash!', 'text': "To celebrate Summer Splash, we've given you an Orca Mount!", 'destination': 'stable'}, seen=True, id=UUID('b7a85df1-06ed-4ab1-b56d-43418fc6a5e5')), NotificationsUser(Type='UNALLOCATED_STATS_POINTS', data={'points': 2}, seen=True, id=UUID('bc3f8a69-231f-4eb1-ba48-a00b6c0e0f37'))], userV=589, appVersion='5.28.6')
|
13
|
+
# ---
|
14
|
+
# name: test_reorder_task
|
15
|
+
HabiticaTaskOrderResponse(data=[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')], success=True, notifications=[NotificationsUser(Type='ITEM_RECEIVED', data={'icon': 'notif_orca_mount', 'title': 'Orcas for Summer Splash!', 'text': "To celebrate Summer Splash, we've given you an Orca Mount!", 'destination': 'stable'}, seen=True, id=UUID('b7a85df1-06ed-4ab1-b56d-43418fc6a5e5')), NotificationsUser(Type='UNALLOCATED_STATS_POINTS', data={'points': 2}, seen=True, id=UUID('bc3f8a69-231f-4eb1-ba48-a00b6c0e0f37'))], userV=589, appVersion='5.28.6')
|
16
|
+
# ---
|
17
|
+
# name: test_update_task
|
18
|
+
HabiticaTaskResponse(data=TaskData(challenge=Challenge(id=None, taskId=None, shortName=None, broken=None, winner=None), group=GroupTask(assignedUsers=[], id=None, assignedDate=None, assigningUsername=None, assignedUsersDetail={}, taskId=None, managerNotes=None, completedBy=CompletedBy(userId=None, date=None)), Type=<TaskType.HABIT: 'habit'>, text='task text', notes='task notes', tags=[], value=0.0, priority=<TaskPriority.EASY: 1>, attribute=<Attributes.STR: 'str'>, byHabitica=False, createdAt=datetime.datetime(2024, 9, 22, 16, 41, 39, 555000, tzinfo=datetime.timezone.utc), updatedAt=datetime.datetime(2024, 10, 26, 16, 48, 8, 742000, tzinfo=datetime.timezone.utc), date=None, id=UUID('7bc0d924-f5e5-48a6-af7f-8075f8c94e0f'), userId=UUID('2a61fddc-654f-4ded-b906-bb8a6da680d5'), up=True, down=False, counterUp=0, counterDown=0, frequency=<Frequency.DAILY: 'daily'>, history=[EntryHistory(date=datetime.datetime(2024, 10, 7, 19, 19, 47, 306000, tzinfo=datetime.timezone.utc), value=1.0, scoredUp=1, scoredDown=0, isDue=None, completed=None), EntryHistory(date=datetime.datetime(2024, 10, 16, 20, 19, 11, 168000, tzinfo=datetime.timezone.utc), value=8.184193475367, scoredUp=9, scoredDown=0, isDue=None, completed=None)], alias='counter_test', everyX=None, startDate=None, streak=None, reminders=[], daysOfMonth=[], weeksOfMonth=[], nextDue=[], yesterDaily=None, completed=None, collapseChecklist=False, checklist=[], isDue=None, repeat=Repeat(m=True, t=True, w=True, th=False, f=False, s=False, su=False)), success=True, notifications=[NotificationsUser(Type='ITEM_RECEIVED', data={'icon': 'notif_orca_mount', 'title': 'Orcas for Summer Splash!', 'text': "To celebrate Summer Splash, we've given you an Orca Mount!", 'destination': 'stable'}, seen=True, id=UUID('b7a85df1-06ed-4ab1-b56d-43418fc6a5e5')), NotificationsUser(Type='UNALLOCATED_STATS_POINTS', data={'points': 2}, seen=True, id=UUID('bc3f8a69-231f-4eb1-ba48-a00b6c0e0f37'))], userV=589, appVersion='5.28.6')
|
19
|
+
# ---
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# serializer version: 1
|
2
|
-
# name:
|
3
|
-
HabiticaLoginResponse(data=LoginData(id=UUID('a380546a-94be-4b8e-8a0b-23e0d5c03303'), apiToken='cd0e5985-17de-4b4f-849e-5d506c5e4382', newUser=False, username='test-username', passwordResetCode=None), success=True, notifications=[], userV=None, appVersion='5.30.0')
|
4
|
-
# ---
|
5
|
-
# name: test_user
|
2
|
+
# name: test_get_user
|
6
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=<Language.DE: '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')
|
7
4
|
# ---
|
5
|
+
# name: test_get_user_anonymized
|
6
|
+
HabiticaUserAnonymizedResponse(data=UserAnonymizedData(user=UserData(id=None, preferences=PreferencesUser(hair=HairPreferences(color=None, base=None, bangs=None, beard=None, mustache=None, flower=None), emailNotifications=EmailNotificationsPreferences(unsubscribeFromAll=None, newPM=None, kickedGroup=None, wonChallenge=None, giftedGems=None, giftedSubscription=None, invitedParty=None, invitedGuild=None, questStarted=None, invitedQuest=None, importantAnnouncements=None, weeklyRecaps=None, onboarding=None, majorUpdates=None, subscriptionReminders=None, contentRelease=None), pushNotifications=PushNotificationsPreferences(unsubscribeFromAll=None, newPM=None, wonChallenge=None, giftedGems=None, giftedSubscription=None, invitedParty=None, invitedGuild=None, questStarted=None, invitedQuest=None, majorUpdates=None, mentionParty=None, mentionJoinedGuild=None, mentionUnjoinedGuild=None, partyActivity=None, contentRelease=None), suppressModals=SuppressModalsPreferences(levelUp=None, hatchPet=None, raisePet=None, streak=None), tasks=TasksPreferences(activeFilter=ActiveFilterTask(habit=None, daily=None, todo=None, reward=None), groupByChallenge=None, confirmScoreNotes=None, mirrorGroupTasks=[]), dayStart=None, size=None, hideHeader=None, skin=None, shirt=None, timezoneOffset=None, sound=None, chair=None, allocationMode=None, autoEquip=None, costume=None, dateFormat=None, sleep=None, stickyHeader=None, disableClasses=None, newTaskEdit=None, dailyDueDefaultView=None, advancedCollapsed=None, toolbarCollapsed=None, reverseChatOrder=None, developerMode=None, displayInviteToPartyWhenPartyIs1=None, background=None, automaticAllocation=None, webhooks={}, improvementCategories=[], timezoneOffsetAtLastCron=None, language=None), flags=FlagsUser(customizationsNotification=None, tour=TourFlags(intro=None, classes=None, stats=None, tavern=None, party=None, guilds=None, challenges=None, market=None, pets=None, mounts=None, hall=None, equipment=None, groupPlans=None), showTour=None, tutorial=TutorialFlags(common=None, ios=None), dropsEnabled=None, itemsEnabled=None, lastNewStuffRead=None, rewrite=None, classSelected=None, rebirthEnabled=None, levelDrops={}, recaptureEmailsPhase=None, weeklyRecapEmailsPhase=None, lastWeeklyRecap=None, communityGuidelinesAccepted=None, cronCount=None, welcomed=None, armoireEnabled=None, armoireOpened=None, armoireEmpty=None, cardReceived=None, warnedLowHealth=None, verifiedUsername=None, newStuff=None, thirdPartyTools=None, mathUpdates=None, lastFreeRebirth=None, chatRevoked=None, chatShadowMuted=None, lastWeeklyRecapDiscriminator=None, onboardingEmailsPhase=None), auth=AuthUser(local=LocalAuth(email=None, username=None, lowerCaseUsername=None, has_password=None), timestamps=LocalTimestamps(created=None, loggedin=None, updated=None), facebook=None, google=None, apple=None), achievements=AchievementsUser(ultimateGearSets=UltimateGearSetsAchievments(healer=None, wizard=None, rogue=None, warrior=None), streak=None, challenges=[], perfect=None, 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=None, gemCapExtra=None, offset=None, count=None), mysteryItems=[], gemsBought=None, extraMonths=None, dateUpdated=None, perkMonthCount=None, quantity=None), txnCount=None, background={}, shirt={}, hair={}, skin={}, ads=None, mobileChat=None), history=HistoryUser(todos=[], exp=[]), items=ItemsUser(gear=GearItems(equipped=EquippedGear(weapon=None, armor=None, head=None, shield=None, back=None, headAccessory=None, eyewear=None, body=None), costume=EquippedGear(weapon=None, armor=None, head=None, shield=None, back=None, headAccessory=None, eyewear=None, body=None), owned={}), special=SpecialItems(birthdayReceived=[], birthday=None, thankyouReceived=[], thankyou=None, greetingReceived=[], greeting=None, nyeReceived=[], nye=None, valentineReceived=[], valentine=None, seafoam=None, shinySeed=None, spookySparkles=None, snowball=None, congrats=None, congratsReceived=[], getwell=None, getwellReceived=[], goodluck=None, goodluckReceived=[]), lastDrop=LastDropItems(count=None, date=None), currentMount=None, currentPet=None, quests={}, mounts={}, food={}, hatchingPotions={}, eggs={}, pets={}), invitations=InvitationsUser(party={}, guilds=[], parties=[]), party=PartyUser(quest=QuestParty(progress=ProgressQuest(up=None, down=None, collect={}, collectedItems=None), RSVPNeeded=None, key=None, completed=None), order=None, orderAscending=None, _id=None), profile=ProfileUser(blurb=None, imageUrl=None, name=None), stats=StatsUser(buffs=BuffsStats(Str=None, per=None, con=None, stealth=None, streaks=None, seafoam=None, shinySeed=None, snowball=None, spookySparkles=None, Int=None), training=TrainingStats(Str=None, per=None, con=None, Int=None), hp=None, mp=None, exp=None, gp=None, lvl=None, Class=None, points=None, Str=None, con=None, per=None, toNextLevel=None, maxHealth=None, maxMP=None, Int=None), notifications=[], tags=[], inbox=InboxUser(newMessages=None, optOut=None, blocks=[], messages={}), tasksOrder=TasksOrderUser(habits=[], dailys=[], todos=[], rewards=[]), extra={}, pushDevices=[], webhooks=[], loginIncentives=None, invitesSent=None, pinnedItems=[], pinnedItemsOrder=[], unpinnedItems=[], secret=None, balance=None, lastCron=None, needsCron=None, challenges=[], guilds=[], newMessages={}), tasks=[]))
|
7
|
+
# ---
|