Habiticalib 0.1.0a2__py3-none-any.whl → 0.2.0__py3-none-any.whl
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/__init__.py +34 -2
- habiticalib/const.py +3 -1
- habiticalib/exceptions.py +13 -4
- habiticalib/helpers.py +25 -1
- habiticalib/lib.py +508 -25
- habiticalib/types.py +488 -66
- {habiticalib-0.1.0a2.dist-info → habiticalib-0.2.0.dist-info}/METADATA +3 -3
- habiticalib-0.2.0.dist-info/RECORD +11 -0
- {habiticalib-0.1.0a2.dist-info → habiticalib-0.2.0.dist-info}/WHEEL +1 -1
- habiticalib-0.1.0a2.dist-info/RECORD +0 -11
- {habiticalib-0.1.0a2.dist-info → habiticalib-0.2.0.dist-info}/licenses/LICENSE +0 -0
habiticalib/types.py
CHANGED
@@ -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
|
97
|
-
timestamps: LocalTimestamps
|
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
|
@@ -590,7 +591,7 @@ class PreferencesUser:
|
|
590
591
|
webhooks: dict = field(default_factory=dict)
|
591
592
|
improvementCategories: list[str] = field(default_factory=list)
|
592
593
|
timezoneOffsetAtLastCron: int | None = None
|
593
|
-
language:
|
594
|
+
language: Language | None = None
|
594
595
|
|
595
596
|
|
596
597
|
@dataclass(kw_only=True)
|
@@ -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:
|
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
|
@@ -674,10 +686,10 @@ class InboxUser:
|
|
674
686
|
class TasksOrderUser:
|
675
687
|
"""TasksOrder user data."""
|
676
688
|
|
677
|
-
habits: list[
|
678
|
-
dailys: list[
|
679
|
-
todos: list[
|
680
|
-
rewards: list[
|
689
|
+
habits: list[UUID] = field(default_factory=list)
|
690
|
+
dailys: list[UUID] = field(default_factory=list)
|
691
|
+
todos: list[UUID] = field(default_factory=list)
|
692
|
+
rewards: list[UUID] = field(default_factory=list)
|
681
693
|
|
682
694
|
|
683
695
|
@dataclass(kw_only=True)
|
@@ -717,7 +729,7 @@ class UserData:
|
|
717
729
|
|
718
730
|
id: UUID | None = None
|
719
731
|
preferences: PreferencesUser = field(default_factory=PreferencesUser)
|
720
|
-
flags: FlagsUser
|
732
|
+
flags: FlagsUser = field(default_factory=FlagsUser)
|
721
733
|
auth: AuthUser = field(default_factory=AuthUser)
|
722
734
|
achievements: AchievementsUser = field(default_factory=AchievementsUser)
|
723
735
|
backer: BackerUser = field(default_factory=BackerUser)
|
@@ -746,8 +758,8 @@ class UserData:
|
|
746
758
|
balance: float | None = None
|
747
759
|
lastCron: datetime | None = None
|
748
760
|
needsCron: bool | None = None
|
749
|
-
challenges: list[
|
750
|
-
guilds: list[
|
761
|
+
challenges: list[UUID] = field(default_factory=list)
|
762
|
+
guilds: list[UUID] = field(default_factory=list)
|
751
763
|
newMessages: dict[str, bool] = field(default_factory=dict)
|
752
764
|
|
753
765
|
|
@@ -758,6 +770,13 @@ class HabiticaUserResponse(HabiticaResponse):
|
|
758
770
|
data: UserData
|
759
771
|
|
760
772
|
|
773
|
+
@dataclass(kw_only=True)
|
774
|
+
class HabiticaGroupMembersResponse(HabiticaResponse):
|
775
|
+
"""Representation of a group members data response."""
|
776
|
+
|
777
|
+
data: list[UserData]
|
778
|
+
|
779
|
+
|
761
780
|
@dataclass(kw_only=True)
|
762
781
|
class CompletedBy:
|
763
782
|
"""Task group completedby data."""
|
@@ -850,38 +869,31 @@ class Frequency(StrEnum):
|
|
850
869
|
YEARLY = "yearly"
|
851
870
|
|
852
871
|
|
853
|
-
|
854
|
-
class Task(DataClassORJSONMixin):
|
872
|
+
class Task(TypedDict("Task", {"type": NotRequired[TaskType]}), total=True):
|
855
873
|
"""Representation of a task."""
|
856
874
|
|
857
|
-
|
858
|
-
|
859
|
-
|
860
|
-
|
861
|
-
|
862
|
-
|
863
|
-
|
864
|
-
|
865
|
-
|
866
|
-
|
867
|
-
|
868
|
-
|
869
|
-
|
870
|
-
|
871
|
-
|
872
|
-
|
873
|
-
|
874
|
-
|
875
|
-
|
876
|
-
|
877
|
-
|
878
|
-
|
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:
|
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
|
-
|
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(
|
1090
|
+
class HabiticaScoreResponse(HabiticaResponse, DataClassORJSONMixin):
|
1069
1091
|
"""Representation of a score response."""
|
1070
1092
|
|
1071
|
-
|
1072
|
-
_tmp: TmpScore = field(default_factory=TmpScore)
|
1093
|
+
data: ScoreData
|
1073
1094
|
|
1074
1095
|
|
1075
1096
|
@dataclass(kw_only=True)
|
@@ -1086,6 +1107,25 @@ class HabiticaTagResponse(HabiticaResponse, DataClassORJSONMixin):
|
|
1086
1107
|
data: TagsUser
|
1087
1108
|
|
1088
1109
|
|
1110
|
+
@dataclass(kw_only=True)
|
1111
|
+
class QuestData:
|
1112
|
+
"""Quest data."""
|
1113
|
+
|
1114
|
+
progress: ProgressQuest = field(default_factory=ProgressQuest)
|
1115
|
+
active: bool = False
|
1116
|
+
members: dict[str, bool | None]
|
1117
|
+
extra: dict | None = None
|
1118
|
+
key: str
|
1119
|
+
leader: UUID | None = None
|
1120
|
+
|
1121
|
+
|
1122
|
+
@dataclass(kw_only=True)
|
1123
|
+
class HabiticaQuestResponse(HabiticaResponse, DataClassORJSONMixin):
|
1124
|
+
"""Representation of a quest response."""
|
1125
|
+
|
1126
|
+
data: QuestData
|
1127
|
+
|
1128
|
+
|
1089
1129
|
@dataclass
|
1090
1130
|
class ChangeClassData:
|
1091
1131
|
"""Change class data."""
|
@@ -1107,7 +1147,14 @@ class HabiticaClassSystemResponse(HabiticaResponse, DataClassORJSONMixin):
|
|
1107
1147
|
class HabiticaTaskOrderResponse(HabiticaResponse):
|
1108
1148
|
"""Representation of a reorder task response."""
|
1109
1149
|
|
1110
|
-
data:
|
1150
|
+
data: list[UUID] = field(default_factory=list)
|
1151
|
+
|
1152
|
+
|
1153
|
+
@dataclass
|
1154
|
+
class HabiticaSleepResponse(HabiticaResponse):
|
1155
|
+
"""Representation of a sleep response."""
|
1156
|
+
|
1157
|
+
data: bool
|
1111
1158
|
|
1112
1159
|
|
1113
1160
|
class TaskFilter(StrEnum):
|
@@ -1166,7 +1213,7 @@ class Skill(StrEnum):
|
|
1166
1213
|
VALOROUS_PRESENCE = "valorousPresence"
|
1167
1214
|
INTIMIDATING_GAZE = "intimidate"
|
1168
1215
|
# Rogue skills
|
1169
|
-
PICKPOCKET = "
|
1216
|
+
PICKPOCKET = "pickPocket"
|
1170
1217
|
BACKSTAB = "backStab"
|
1171
1218
|
TOOLS_OF_THE_TRADE = "toolsOfTrade"
|
1172
1219
|
STEALTH = "stealth"
|
@@ -1187,15 +1234,6 @@ class Skill(StrEnum):
|
|
1187
1234
|
PETAL_FREE_POTION = "petalFreePotion"
|
1188
1235
|
|
1189
1236
|
|
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
1237
|
class Direction(StrEnum):
|
1200
1238
|
"""Direction to score a task."""
|
1201
1239
|
|
@@ -1210,3 +1248,387 @@ class TaskPriority(Enum):
|
|
1210
1248
|
EASY = 1
|
1211
1249
|
MEDIUM = 1.5
|
1212
1250
|
HARD = 2
|
1251
|
+
|
1252
|
+
|
1253
|
+
@dataclass
|
1254
|
+
class AchievmentContent:
|
1255
|
+
"""Achievment content data."""
|
1256
|
+
|
1257
|
+
icon: str
|
1258
|
+
key: str
|
1259
|
+
titleKey: str | None = None
|
1260
|
+
textKey: str | None = None
|
1261
|
+
singularTitleKey: str | None = None
|
1262
|
+
singularTextKey: str | None = None
|
1263
|
+
pluralTitleKey: str | None = None
|
1264
|
+
pluralTextKey: str | None = None
|
1265
|
+
|
1266
|
+
|
1267
|
+
@dataclass
|
1268
|
+
class AnimalColorAchievementContent:
|
1269
|
+
"""animalColorAchievement content data."""
|
1270
|
+
|
1271
|
+
color: str
|
1272
|
+
petAchievement: str
|
1273
|
+
petNotificationType: str
|
1274
|
+
mountAchievement: str
|
1275
|
+
mountNotificationType: str
|
1276
|
+
|
1277
|
+
|
1278
|
+
@dataclass
|
1279
|
+
class AnimalSetAchievementContent:
|
1280
|
+
"""animalSetAchievements content data."""
|
1281
|
+
|
1282
|
+
Type: str = field(metadata=field_options(alias="type"))
|
1283
|
+
species: list[str]
|
1284
|
+
achievementKey: str
|
1285
|
+
notificationType: str
|
1286
|
+
|
1287
|
+
|
1288
|
+
@dataclass
|
1289
|
+
class StableAchievementContent:
|
1290
|
+
"""stableAchievements content data."""
|
1291
|
+
|
1292
|
+
masterAchievement: str
|
1293
|
+
masterNotificationType: str
|
1294
|
+
|
1295
|
+
|
1296
|
+
@dataclass
|
1297
|
+
class PetSetCompleteAchievsContent:
|
1298
|
+
"""petSetCompleteAchievs content data."""
|
1299
|
+
|
1300
|
+
color: str
|
1301
|
+
petAchievement: str
|
1302
|
+
petNotificationType: str
|
1303
|
+
|
1304
|
+
|
1305
|
+
@dataclass
|
1306
|
+
class QuestBossRage:
|
1307
|
+
"""QuestBossRage content data."""
|
1308
|
+
|
1309
|
+
title: str
|
1310
|
+
description: str
|
1311
|
+
value: float
|
1312
|
+
effect: str | None = None
|
1313
|
+
healing: float | None = None
|
1314
|
+
|
1315
|
+
|
1316
|
+
@dataclass
|
1317
|
+
class QuestBoss:
|
1318
|
+
"""QuestBoss content data."""
|
1319
|
+
|
1320
|
+
name: str
|
1321
|
+
hp: float
|
1322
|
+
Str: float = field(metadata=field_options(alias="str"))
|
1323
|
+
Def: float = field(metadata=field_options(alias="def"))
|
1324
|
+
rage: QuestBossRage | None = None
|
1325
|
+
|
1326
|
+
|
1327
|
+
@dataclass
|
1328
|
+
class QuestItem:
|
1329
|
+
"""QuestItem content data."""
|
1330
|
+
|
1331
|
+
Type: str = field(metadata=field_options(alias="type"))
|
1332
|
+
key: str
|
1333
|
+
text: str
|
1334
|
+
|
1335
|
+
|
1336
|
+
@dataclass
|
1337
|
+
class QuestDrop:
|
1338
|
+
"""QuestDrop content data."""
|
1339
|
+
|
1340
|
+
gp: float
|
1341
|
+
exp: float
|
1342
|
+
items: list[QuestItem] | None = None
|
1343
|
+
|
1344
|
+
|
1345
|
+
@dataclass
|
1346
|
+
class QuestCollect:
|
1347
|
+
"""QuestCollect content data."""
|
1348
|
+
|
1349
|
+
text: str
|
1350
|
+
count: int
|
1351
|
+
|
1352
|
+
|
1353
|
+
@dataclass
|
1354
|
+
class QuestUnlockCondition:
|
1355
|
+
"""QuestUnlockCondition content data."""
|
1356
|
+
|
1357
|
+
condition: str
|
1358
|
+
text: str
|
1359
|
+
|
1360
|
+
|
1361
|
+
@dataclass
|
1362
|
+
class QuestsContent:
|
1363
|
+
"""petSetCompleteAchievs content data."""
|
1364
|
+
|
1365
|
+
text: str
|
1366
|
+
notes: str
|
1367
|
+
|
1368
|
+
completion: str
|
1369
|
+
category: str
|
1370
|
+
|
1371
|
+
drop: QuestDrop
|
1372
|
+
key: str
|
1373
|
+
goldValue: float | None = None
|
1374
|
+
value: float | None = None
|
1375
|
+
previous: str | None = None
|
1376
|
+
prereqQuests: list[str] | None = None
|
1377
|
+
collect: dict[str, QuestCollect] | None = None
|
1378
|
+
unlockCondition: QuestUnlockCondition | None = None
|
1379
|
+
boss: QuestBoss | None = None
|
1380
|
+
group: str | None = None
|
1381
|
+
|
1382
|
+
|
1383
|
+
@dataclass
|
1384
|
+
class ItemListEntry:
|
1385
|
+
"""ItemListEntry content data."""
|
1386
|
+
|
1387
|
+
localeKey: str
|
1388
|
+
isEquipment: bool
|
1389
|
+
|
1390
|
+
|
1391
|
+
@dataclass
|
1392
|
+
class ItemListContent:
|
1393
|
+
"""ItemListContent content data."""
|
1394
|
+
|
1395
|
+
weapon: ItemListEntry
|
1396
|
+
armor: ItemListEntry
|
1397
|
+
head: ItemListEntry
|
1398
|
+
shield: ItemListEntry
|
1399
|
+
back: ItemListEntry
|
1400
|
+
body: ItemListEntry
|
1401
|
+
headAccessory: ItemListEntry
|
1402
|
+
eyewear: ItemListEntry
|
1403
|
+
hatchingPotions: ItemListEntry
|
1404
|
+
premiumHatchingPotions: ItemListEntry
|
1405
|
+
eggs: ItemListEntry
|
1406
|
+
quests: ItemListEntry
|
1407
|
+
food: ItemListEntry
|
1408
|
+
Saddle: ItemListEntry
|
1409
|
+
bundles: ItemListEntry
|
1410
|
+
|
1411
|
+
|
1412
|
+
@dataclass
|
1413
|
+
class GearEntry:
|
1414
|
+
"""GearEntry content data."""
|
1415
|
+
|
1416
|
+
text: str
|
1417
|
+
notes: str
|
1418
|
+
Int: int = field(metadata=field_options(alias="int"))
|
1419
|
+
value: int
|
1420
|
+
Type: str = field(metadata=field_options(alias="type"))
|
1421
|
+
key: str
|
1422
|
+
Set: str = field(metadata=field_options(alias="set"))
|
1423
|
+
klass: str
|
1424
|
+
index: str
|
1425
|
+
Str: int = field(metadata=field_options(alias="str"))
|
1426
|
+
per: int
|
1427
|
+
con: int
|
1428
|
+
|
1429
|
+
|
1430
|
+
@dataclass
|
1431
|
+
class GearClass:
|
1432
|
+
"""GearClass content data."""
|
1433
|
+
|
1434
|
+
base: dict[str, GearEntry] | None = None
|
1435
|
+
warrior: dict[str, GearEntry] | None = None
|
1436
|
+
wizard: dict[str, GearEntry] | None = None
|
1437
|
+
rogue: dict[str, GearEntry] | None = None
|
1438
|
+
special: dict[str, GearEntry] | None = None
|
1439
|
+
armoire: dict[str, GearEntry] | None = None
|
1440
|
+
mystery: dict[str, GearEntry] | None = None
|
1441
|
+
healer: dict[str, GearEntry] | None = None
|
1442
|
+
|
1443
|
+
|
1444
|
+
@dataclass
|
1445
|
+
class GearType:
|
1446
|
+
"""GearType content data."""
|
1447
|
+
|
1448
|
+
weapon: GearClass
|
1449
|
+
armor: GearClass
|
1450
|
+
head: GearClass
|
1451
|
+
shield: GearClass
|
1452
|
+
back: GearClass
|
1453
|
+
body: GearClass
|
1454
|
+
headAccessory: GearClass
|
1455
|
+
eyewear: GearClass
|
1456
|
+
|
1457
|
+
|
1458
|
+
@dataclass
|
1459
|
+
class GearContent:
|
1460
|
+
"""GearContent content data."""
|
1461
|
+
|
1462
|
+
tree: GearType
|
1463
|
+
flat: dict[str, GearEntry]
|
1464
|
+
|
1465
|
+
|
1466
|
+
@dataclass
|
1467
|
+
class SpellEntry:
|
1468
|
+
"""SpellEntry content data."""
|
1469
|
+
|
1470
|
+
text: str
|
1471
|
+
mana: int
|
1472
|
+
target: str
|
1473
|
+
notes: str
|
1474
|
+
key: str
|
1475
|
+
previousPurchase: bool | None = None
|
1476
|
+
limited: bool | None = None
|
1477
|
+
lvl: int | None = None
|
1478
|
+
value: int | None = None
|
1479
|
+
immediateUse: bool | None = None
|
1480
|
+
purchaseType: str | None = None
|
1481
|
+
silent: bool | None = None
|
1482
|
+
|
1483
|
+
|
1484
|
+
@dataclass
|
1485
|
+
class SpellsClass:
|
1486
|
+
"""SpellsClass content data."""
|
1487
|
+
|
1488
|
+
wizard: dict[str, SpellEntry]
|
1489
|
+
warrior: dict[str, SpellEntry]
|
1490
|
+
rogue: dict[str, SpellEntry]
|
1491
|
+
healer: dict[str, SpellEntry]
|
1492
|
+
special: dict[str, SpellEntry]
|
1493
|
+
|
1494
|
+
|
1495
|
+
@dataclass
|
1496
|
+
class CarTypes:
|
1497
|
+
"""CarTypes content data."""
|
1498
|
+
|
1499
|
+
key: str
|
1500
|
+
messageOptions: int
|
1501
|
+
yearRound: bool = False
|
1502
|
+
|
1503
|
+
|
1504
|
+
@dataclass
|
1505
|
+
class SpecialItemEntry:
|
1506
|
+
"""Item content data."""
|
1507
|
+
|
1508
|
+
key: str | None = None
|
1509
|
+
text: str | None = None
|
1510
|
+
notes: str | None = None
|
1511
|
+
immediateUse: bool | None = None
|
1512
|
+
limited: bool | None = None
|
1513
|
+
mana: int | None = None
|
1514
|
+
previousPurchase: bool | None = None
|
1515
|
+
purchaseType: str | None = None
|
1516
|
+
silent: bool | None = None
|
1517
|
+
target: str | None = None
|
1518
|
+
value: int | None = None
|
1519
|
+
|
1520
|
+
|
1521
|
+
@dataclass
|
1522
|
+
class EggEntry:
|
1523
|
+
"""Egg content data."""
|
1524
|
+
|
1525
|
+
text: str | None = None
|
1526
|
+
mountText: str | None = None
|
1527
|
+
adjective: str | None = None
|
1528
|
+
value: int | None = None
|
1529
|
+
key: str | None = None
|
1530
|
+
notes: str | None = None
|
1531
|
+
|
1532
|
+
|
1533
|
+
@dataclass
|
1534
|
+
class HatchingPotionEntry:
|
1535
|
+
"""Hatching potion content data."""
|
1536
|
+
|
1537
|
+
value: int | None = None
|
1538
|
+
key: str | None = None
|
1539
|
+
text: str | None = None
|
1540
|
+
notes: str | None = None
|
1541
|
+
premium: bool | None = None
|
1542
|
+
limited: bool | None = None
|
1543
|
+
_addlNotes: str | None = None
|
1544
|
+
wacky: bool | None = None
|
1545
|
+
|
1546
|
+
|
1547
|
+
@dataclass
|
1548
|
+
class PetEntry:
|
1549
|
+
"""Pet content data."""
|
1550
|
+
|
1551
|
+
key: str | None = None
|
1552
|
+
Type: str | None = field(default=None, metadata=field_options(alias="type"))
|
1553
|
+
potion: str | None = None
|
1554
|
+
egg: str | None = None
|
1555
|
+
text: str | None = None
|
1556
|
+
|
1557
|
+
|
1558
|
+
@dataclass
|
1559
|
+
class InventoryItemEntry:
|
1560
|
+
"""Inventory item content data."""
|
1561
|
+
|
1562
|
+
text: str | None = None
|
1563
|
+
textA: str | None = None
|
1564
|
+
textThe: str | None = None
|
1565
|
+
target: str | None = None
|
1566
|
+
value: int | None = None
|
1567
|
+
key: str | None = None
|
1568
|
+
notes: str | None = None
|
1569
|
+
canDrop: bool | None = None
|
1570
|
+
|
1571
|
+
|
1572
|
+
@dataclass
|
1573
|
+
class ContentData:
|
1574
|
+
"""Content data."""
|
1575
|
+
|
1576
|
+
achievements: dict[str, AchievmentContent]
|
1577
|
+
questSeriesAchievements: dict[str, list[str]]
|
1578
|
+
animalColorAchievements: list[AnimalColorAchievementContent]
|
1579
|
+
animalSetAchievements: dict[str, AnimalSetAchievementContent]
|
1580
|
+
stableAchievements: dict[str, StableAchievementContent]
|
1581
|
+
petSetCompleteAchievs: list[PetSetCompleteAchievsContent]
|
1582
|
+
quests: dict[str, QuestsContent]
|
1583
|
+
questsByLevel: list[QuestsContent]
|
1584
|
+
userCanOwnQuestCategories: list[str]
|
1585
|
+
itemList: ItemListContent
|
1586
|
+
gear: GearContent
|
1587
|
+
spells: SpellsClass
|
1588
|
+
audioThemes: list[str]
|
1589
|
+
# mystery
|
1590
|
+
officialPinnedItems: list
|
1591
|
+
# bundles
|
1592
|
+
# potion
|
1593
|
+
# armoire
|
1594
|
+
# events
|
1595
|
+
# repeatingEvents
|
1596
|
+
classes: list[str]
|
1597
|
+
gearTypes: list[str]
|
1598
|
+
cardTypes: dict[str, CarTypes]
|
1599
|
+
special: dict[str, SpecialItemEntry]
|
1600
|
+
dropEggs: dict[str, EggEntry]
|
1601
|
+
questEggs: dict[str, EggEntry]
|
1602
|
+
eggs: dict[str, EggEntry]
|
1603
|
+
# timeTravelStable
|
1604
|
+
dropHatchingPotions: dict[str, HatchingPotionEntry]
|
1605
|
+
premiumHatchingPotions: dict[str, HatchingPotionEntry]
|
1606
|
+
wackyHatchingPotions: dict[str, HatchingPotionEntry]
|
1607
|
+
hatchingPotions: dict[str, HatchingPotionEntry]
|
1608
|
+
pets: dict[str, bool]
|
1609
|
+
premiumPets: dict[str, bool]
|
1610
|
+
questPets: dict[str, bool]
|
1611
|
+
specialPets: dict[str, str]
|
1612
|
+
wackyPets: dict[str, bool]
|
1613
|
+
petInfo: dict[str, PetEntry]
|
1614
|
+
mounts: dict[str, bool]
|
1615
|
+
premiumMounts: dict[str, bool]
|
1616
|
+
questMounts: dict[str, bool]
|
1617
|
+
specialMounts: dict[str, str]
|
1618
|
+
mountInfo: dict[str, PetEntry]
|
1619
|
+
food: dict[str, InventoryItemEntry]
|
1620
|
+
# appearances
|
1621
|
+
# backgrounds
|
1622
|
+
# backgroundsFlat
|
1623
|
+
# userDefaults
|
1624
|
+
# tasksByCategory
|
1625
|
+
# userDefaultsMobile
|
1626
|
+
# faq
|
1627
|
+
# loginIncentives
|
1628
|
+
|
1629
|
+
|
1630
|
+
@dataclass
|
1631
|
+
class HabiticaContentResponse(HabiticaResponse):
|
1632
|
+
"""Representation of a content response."""
|
1633
|
+
|
1634
|
+
data: ContentData
|