Habiticalib 0.3.5__py3-none-any.whl → 0.3.7rc0__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.
@@ -33,18 +33,140 @@ def serialize_datetime(date: str | int | None) -> datetime | None:
33
33
  return None
34
34
 
35
35
 
36
+ @dataclass
37
+ class BaseModel(DataClassORJSONMixin):
38
+ """Base config for dataclasses."""
39
+
40
+ class Config(BaseConfig):
41
+ """Configuration for TaskData."""
42
+
43
+ aliases = { # noqa: RUF012
44
+ "Type": "type",
45
+ "Str": "str",
46
+ "Int": "int",
47
+ "Class": "class",
48
+ "tmp": "_tmp",
49
+ "Def": "def",
50
+ "Set": "set",
51
+ }
52
+ serialize_by_alias = True
53
+ omit_none = True
54
+
55
+ def __eq__(self, value: object) -> bool:
56
+ """Check if two instances are equal."""
57
+ if issubclass(type(value), type(self)):
58
+ return all(
59
+ getattr(self, field) == getattr(value, field)
60
+ for field in self.__dataclass_fields__
61
+ )
62
+ return super().__eq__(value)
63
+
64
+
36
65
  @dataclass(kw_only=True)
37
- class NotificationsUser:
66
+ class EquippedGear(BaseModel):
67
+ """Gear equipped data."""
68
+
69
+ weapon: str | None = None
70
+ armor: str | None = None
71
+ head: str | None = None
72
+ shield: str | None = None
73
+ back: str | None = None
74
+ headAccessory: str | None = None
75
+ eyewear: str | None = None
76
+ body: str | None = None
77
+
78
+
79
+ @dataclass(kw_only=True, eq=False)
80
+ class GearItemsAvatar(BaseModel):
81
+ """Items gear avatar data."""
82
+
83
+ equipped: EquippedGear = field(default_factory=EquippedGear)
84
+ costume: EquippedGear = field(default_factory=EquippedGear)
85
+
86
+
87
+ @dataclass(kw_only=True, eq=False)
88
+ class ItemsAvatar(BaseModel):
89
+ """Items avatar data."""
90
+
91
+ gear: GearItemsAvatar = field(default_factory=GearItemsAvatar)
92
+ currentMount: str | None = None
93
+ currentPet: str | None = None
94
+
95
+
96
+ class HabiticaClass(StrEnum):
97
+ """Habitica's player classes."""
98
+
99
+ WARRIOR = "warrior"
100
+ ROGUE = "rogue"
101
+ MAGE = "wizard"
102
+ HEALER = "healer"
103
+
104
+
105
+ @dataclass(kw_only=True)
106
+ class HairPreferences(BaseModel):
107
+ """Hair preferences data."""
108
+
109
+ color: str | None = None
110
+ base: int | None = None
111
+ bangs: int | None = None
112
+ beard: int | None = None
113
+ mustache: int | None = None
114
+ flower: int | None = None
115
+
116
+
117
+ @dataclass(kw_only=True, eq=False)
118
+ class PreferencesAvatar(BaseModel):
119
+ """Preferences avatar data."""
120
+
121
+ hair: HairPreferences = field(default_factory=HairPreferences)
122
+ size: str | None = None
123
+ skin: str | None = None
124
+ shirt: str | None = None
125
+ chair: str | None = None
126
+ costume: bool | None = None
127
+ sleep: bool | None = None
128
+ background: str | None = None
129
+
130
+
131
+ @dataclass(kw_only=True, eq=False)
132
+ class BuffsStatsavatar(BaseModel):
133
+ """Buffs stats avatar data."""
134
+
135
+ seafoam: bool | None = None
136
+ shinySeed: bool | None = None
137
+ snowball: bool | None = None
138
+ spookySparkles: bool | None = None
139
+
140
+
141
+ @dataclass(kw_only=True, eq=False)
142
+ class StatsAvatar(BaseModel):
143
+ """Stats avatar data."""
144
+
145
+ buffs: BuffsStatsavatar = field(default_factory=BuffsStatsavatar)
146
+ Class: HabiticaClass = HabiticaClass.WARRIOR
147
+
148
+
149
+ @dataclass(kw_only=True, eq=False)
150
+ class Avatar(BaseModel):
151
+ """Represents data for avatar visuals."""
152
+
153
+ items: ItemsAvatar = field(default_factory=ItemsAvatar)
154
+ preferences: PreferencesAvatar = field(default_factory=PreferencesAvatar)
155
+ stats: StatsAvatar = field(default_factory=StatsAvatar)
156
+
157
+
158
+ @dataclass(kw_only=True)
159
+ class NotificationsUser(BaseModel):
38
160
  """Notifications User data."""
39
161
 
40
- Type: str = field(metadata=field_options(alias="type"))
162
+ Type: str
41
163
  data: dict[str, Any]
42
164
  seen: bool
43
165
  id: UUID
44
166
 
45
167
 
46
168
  @dataclass(kw_only=True)
47
- class HabiticaResponse(DataClassORJSONMixin):
169
+ class HabiticaResponse(BaseModel):
48
170
  """Representation of a base Habitica API response."""
49
171
 
50
172
  data: Any
@@ -55,7 +177,7 @@ class HabiticaResponse(DataClassORJSONMixin):
55
177
 
56
178
 
57
179
  @dataclass(kw_only=True)
58
- class LoginData:
180
+ class LoginData(BaseModel):
59
181
  """Login data."""
60
182
 
61
183
  id: UUID
@@ -73,7 +195,7 @@ class HabiticaLoginResponse(HabiticaResponse):
73
195
 
74
196
 
75
197
  @dataclass(kw_only=True)
76
- class LocalAuth:
198
+ class LocalAuth(BaseModel):
77
199
  """Auth local data."""
78
200
 
79
201
  email: str | None = None
@@ -83,7 +205,7 @@ class LocalAuth:
83
205
 
84
206
 
85
207
  @dataclass(kw_only=True)
86
- class LocalTimestamps:
208
+ class LocalTimestamps(BaseModel):
87
209
  """Timestamps local data."""
88
210
 
89
211
  created: datetime | None = None
@@ -92,7 +214,7 @@ class LocalTimestamps:
92
214
 
93
215
 
94
216
  @dataclass(kw_only=True)
95
- class AuthUser:
217
+ class AuthUser(BaseModel):
96
218
  """User auth data."""
97
219
 
98
220
  local: LocalAuth = field(default_factory=LocalAuth)
@@ -103,7 +225,7 @@ class AuthUser:
103
225
 
104
226
 
105
227
  @dataclass(kw_only=True)
106
- class UltimateGearSetsAchievments:
228
+ class UltimateGearSetsAchievments(BaseModel):
107
229
  """Achievments ultimateGearSets data."""
108
230
 
109
231
  healer: bool | None = None
@@ -113,7 +235,7 @@ class UltimateGearSetsAchievments:
113
235
 
114
236
 
115
237
  @dataclass(kw_only=True)
116
- class QuestsAchievments:
238
+ class QuestsAchievments(BaseModel):
117
239
  """Achievments quests."""
118
240
 
119
241
  bewilder: int | None = None
@@ -134,7 +256,7 @@ class QuestsAchievments:
134
256
 
135
257
 
136
258
  @dataclass(kw_only=True)
137
- class AchievementsUser:
259
+ class AchievementsUser(BaseModel):
138
260
  """User achievments data."""
139
261
 
140
262
  ultimateGearSets: UltimateGearSetsAchievments = field(
@@ -164,7 +286,7 @@ class AchievementsUser:
164
286
 
165
287
 
166
288
  @dataclass(kw_only=True)
167
- class BackerUser:
289
+ class BackerUser(BaseModel):
168
290
  """User backer data."""
169
291
 
170
292
  tier: int | None = None
@@ -173,7 +295,7 @@ class BackerUser:
173
295
 
174
296
 
175
297
  @dataclass(kw_only=True)
176
- class PermissionsUser:
298
+ class PermissionsUser(BaseModel):
177
299
  """User permissions data."""
178
300
 
179
301
  fullAccess: bool | None = None
@@ -185,7 +307,7 @@ class PermissionsUser:
185
307
 
186
308
 
187
309
  @dataclass(kw_only=True)
188
- class ContributorUser:
310
+ class ContributorUser(BaseModel):
189
311
  """User contributer data."""
190
312
 
191
313
  contributions: str | None = None
@@ -194,7 +316,7 @@ class ContributorUser:
194
316
 
195
317
 
196
318
  @dataclass(kw_only=True)
197
- class ConsecutivePlan:
319
+ class ConsecutivePlan(BaseModel):
198
320
  """Plan consecutive data."""
199
321
 
200
322
  trinkets: int | None = None
@@ -204,7 +326,7 @@ class ConsecutivePlan:
204
326
 
205
327
 
206
328
  @dataclass(kw_only=True)
207
- class PlanPurchased:
329
+ class PlanPurchased(BaseModel):
208
330
  """Purchased background data."""
209
331
 
210
332
  consecutive: ConsecutivePlan = field(default_factory=ConsecutivePlan)
@@ -217,7 +339,7 @@ class PlanPurchased:
217
339
 
218
340
 
219
341
  @dataclass(kw_only=True)
220
- class PurchasedUser:
342
+ class PurchasedUser(BaseModel):
221
343
  """User purchased data."""
222
344
 
223
345
  plan: PlanPurchased = field(default_factory=PlanPurchased)
@@ -231,7 +353,7 @@ class PurchasedUser:
231
353
 
232
354
 
233
355
  @dataclass(kw_only=True)
234
- class TourFlags:
356
+ class TourFlags(BaseModel):
235
357
  """Flags tour data."""
236
358
 
237
359
  intro: int | None = None
@@ -250,7 +372,7 @@ class TourFlags:
250
372
 
251
373
 
252
374
  @dataclass(kw_only=True)
253
- class CommonTutorial:
375
+ class CommonTutorial(BaseModel):
254
376
  """Tutorial common data."""
255
377
 
256
378
  habits: bool
@@ -271,7 +393,7 @@ class CommonTutorial:
271
393
 
272
394
 
273
395
  @dataclass(kw_only=True)
274
- class IosTutorial:
396
+ class IosTutorial(BaseModel):
275
397
  """Tutorial ios data."""
276
398
 
277
399
  addTask: bool
@@ -284,7 +406,7 @@ class IosTutorial:
284
406
 
285
407
 
286
408
  @dataclass(kw_only=True)
287
- class TutorialFlags:
409
+ class TutorialFlags(BaseModel):
288
410
  """Flags tutorial data."""
289
411
 
290
412
  common: CommonTutorial | None = None
@@ -292,7 +414,7 @@ class TutorialFlags:
292
414
 
293
415
 
294
416
  @dataclass(kw_only=True)
295
- class FlagsUser:
417
+ class FlagsUser(BaseModel):
296
418
  """User flags data."""
297
419
 
298
420
  customizationsNotification: bool | None = None
@@ -329,7 +451,7 @@ class FlagsUser:
329
451
 
330
452
 
331
453
  @dataclass(kw_only=True)
332
- class EntryHistory:
454
+ class EntryHistory(BaseModel):
333
455
  """History entry data."""
334
456
 
335
457
  date: datetime = field(
@@ -345,7 +467,7 @@ class EntryHistory:
345
467
 
346
468
 
347
469
  @dataclass(kw_only=True)
348
- class HistoryUser:
470
+ class HistoryUser(BaseModel):
349
471
  """User history data."""
350
472
 
351
473
  todos: list[EntryHistory] = field(default_factory=list)
@@ -353,30 +475,14 @@ class HistoryUser:
353
475
 
354
476
 
355
477
  @dataclass(kw_only=True)
356
- class EquippedGear:
357
- """Gear equipped data."""
358
-
359
- weapon: str | None = None
360
- armor: str | None = None
361
- head: str | None = None
362
- shield: str | None = None
363
- back: str | None = None
364
- headAccessory: str | None = None
365
- eyewear: str | None = None
366
- body: str | None = None
367
-
368
-
369
- @dataclass(kw_only=True)
370
- class GearItems:
478
+ class GearItems(GearItemsAvatar, BaseModel):
371
479
  """Items gear data."""
372
480
 
373
- equipped: EquippedGear = field(default_factory=EquippedGear)
374
- costume: EquippedGear = field(default_factory=EquippedGear)
375
481
  owned: dict[str, bool] = field(default_factory=dict)
376
482
 
377
483
 
378
484
  @dataclass(kw_only=True)
379
- class SpecialItems:
485
+ class SpecialItems(BaseModel):
380
486
  """Items special data."""
381
487
 
382
488
  birthdayReceived: list = field(default_factory=list)
@@ -402,7 +508,7 @@ class SpecialItems:
402
508
 
403
509
 
404
510
  @dataclass(kw_only=True)
405
- class LastDropItems:
511
+ class LastDropItems(BaseModel):
406
512
  """LastDrop items data."""
407
513
 
408
514
  count: int | None = None
@@ -410,14 +516,12 @@ class LastDropItems:
410
516
 
411
517
 
412
518
  @dataclass(kw_only=True)
413
- class ItemsUser:
519
+ class ItemsUser(ItemsAvatar, BaseModel):
414
520
  """User items data."""
415
521
 
416
522
  gear: GearItems = field(default_factory=GearItems)
417
523
  special: SpecialItems = field(default_factory=SpecialItems)
418
524
  lastDrop: LastDropItems = field(default_factory=LastDropItems)
419
- currentMount: str | None = None
420
- currentPet: str | None = None
421
525
  quests: dict[str, int] = field(default_factory=dict)
422
526
  mounts: dict[str, bool] = field(default_factory=dict)
423
527
  food: dict[str, int] = field(default_factory=dict)
@@ -427,7 +531,7 @@ class ItemsUser:
427
531
 
428
532
 
429
533
  @dataclass(kw_only=True)
430
- class InvitationsUser:
534
+ class InvitationsUser(BaseModel):
431
535
  """Invitations user data."""
432
536
 
433
537
  party: dict = field(default_factory=dict)
@@ -436,7 +540,7 @@ class InvitationsUser:
436
540
 
437
541
 
438
542
  @dataclass(kw_only=True)
439
- class ProgressQuest:
543
+ class ProgressQuest(BaseModel):
440
544
  """Quest progress data."""
441
545
 
442
546
  up: float | None = None
@@ -446,7 +550,7 @@ class ProgressQuest:
446
550
 
447
551
 
448
552
  @dataclass(kw_only=True)
449
- class QuestParty:
553
+ class QuestParty(BaseModel):
450
554
  """Party quest data."""
451
555
 
452
556
  progress: ProgressQuest = field(default_factory=ProgressQuest)
@@ -456,7 +560,7 @@ class QuestParty:
456
560
 
457
561
 
458
562
  @dataclass(kw_only=True)
459
- class PartyUser:
563
+ class PartyUser(BaseModel):
460
564
  """Party user data."""
461
565
 
462
566
  quest: QuestParty = field(default_factory=QuestParty)
@@ -466,19 +570,7 @@ class PartyUser:
466
570
 
467
571
 
468
572
  @dataclass(kw_only=True)
469
- class HairPreferences:
470
- """Hair preferences data."""
471
-
472
- color: str | None = None
473
- base: int | None = None
474
- bangs: int | None = None
475
- beard: int | None = None
476
- mustache: int | None = None
477
- flower: int | None = None
478
-
479
-
480
- @dataclass(kw_only=True)
481
- class EmailNotificationsPreferences:
573
+ class EmailNotificationsPreferences(BaseModel):
482
574
  """EmailNotifications preferences data."""
483
575
 
484
576
  unsubscribeFromAll: bool | None = None
@@ -500,7 +592,7 @@ class EmailNotificationsPreferences:
500
592
 
501
593
 
502
594
  @dataclass(kw_only=True)
503
- class PushNotificationsPreferences:
595
+ class PushNotificationsPreferences(BaseModel):
504
596
  """PushNotifications preferences data."""
505
597
 
506
598
  unsubscribeFromAll: bool | None = None
@@ -521,7 +613,7 @@ class PushNotificationsPreferences:
521
613
 
522
614
 
523
615
  @dataclass(kw_only=True)
524
- class SuppressModalsPreferences:
616
+ class SuppressModalsPreferences(BaseModel):
525
617
  """SupressModals preferences data."""
526
618
 
527
619
  levelUp: bool | None = None
@@ -531,7 +623,7 @@ class SuppressModalsPreferences:
531
623
 
532
624
 
533
625
  @dataclass(kw_only=True)
534
- class ActiveFilterTask:
626
+ class ActiveFilterTask(BaseModel):
535
627
  """ActiveFilter task data."""
536
628
 
537
629
  habit: str | None = None
@@ -541,7 +633,7 @@ class ActiveFilterTask:
541
633
 
542
634
 
543
635
  @dataclass(kw_only=True)
544
- class TasksPreferences:
636
+ class TasksPreferences(BaseModel):
545
637
  """Tasks preferences data."""
546
638
 
547
639
  activeFilter: ActiveFilterTask = field(default_factory=ActiveFilterTask)
@@ -551,10 +643,9 @@ class TasksPreferences:
551
643
 
552
644
 
553
645
  @dataclass(kw_only=True)
554
- class PreferencesUser:
646
+ class PreferencesUser(PreferencesAvatar, BaseModel):
555
647
  """Preferences user data."""
556
648
 
557
- hair: HairPreferences = field(default_factory=HairPreferences)
558
649
  emailNotifications: EmailNotificationsPreferences = field(
559
650
  default_factory=EmailNotificationsPreferences
560
651
  )
@@ -566,18 +657,12 @@ class PreferencesUser:
566
657
  )
567
658
  tasks: TasksPreferences = field(default_factory=TasksPreferences)
568
659
  dayStart: int | None = None
569
- size: str | None = None
570
660
  hideHeader: bool | None = None
571
- skin: str | None = None
572
- shirt: str | None = None
573
661
  timezoneOffset: int | None = None
574
662
  sound: str | None = None
575
- chair: str | None = None
576
663
  allocationMode: str | None = None
577
664
  autoEquip: bool | None = None
578
- costume: bool | None = None
579
665
  dateFormat: str | None = None
580
- sleep: bool | None = None
581
666
  stickyHeader: bool | None = None
582
667
  disableClasses: bool | None = None
583
668
  newTaskEdit: bool | None = None
@@ -587,7 +672,6 @@ class PreferencesUser:
587
672
  reverseChatOrder: bool | None = None
588
673
  developerMode: bool | None = None
589
674
  displayInviteToPartyWhenPartyIs1: bool | None = None
590
- background: str | None = None
591
675
  automaticAllocation: bool | None = None
592
676
  webhooks: dict = field(default_factory=dict)
593
677
  improvementCategories: list[str] = field(default_factory=list)
@@ -596,7 +680,7 @@ class PreferencesUser:
596
680
 
597
681
 
598
682
  @dataclass(kw_only=True)
599
- class ProfileUser:
683
+ class ProfileUser(BaseModel):
600
684
  """Profile user data."""
601
685
 
602
686
  blurb: str | None = None
@@ -605,10 +689,10 @@ class ProfileUser:
605
689
 
606
690
 
607
691
  @dataclass(kw_only=True)
608
- class BuffsStats:
692
+ class BuffsStats(BuffsStatsavatar, BaseModel):
609
693
  """Buffs stats data."""
610
694
 
611
- Str: int | None = field(default=None, metadata=field_options(alias="str"))
695
+ Str: int | None = None
612
696
  per: int | None = None
613
697
  con: int | None = None
614
698
  stealth: int | None = None
@@ -617,30 +701,21 @@ class BuffsStats:
617
701
  shinySeed: bool | None = None
618
702
  snowball: bool | None = None
619
703
  spookySparkles: bool | None = None
620
- Int: int | None = field(default=None, metadata=field_options(alias="int"))
704
+ Int: int | None = None
621
705
 
622
706
 
623
707
  @dataclass(kw_only=True)
624
- class TrainingStats:
708
+ class TrainingStats(BaseModel):
625
709
  """Training stats data."""
626
710
 
627
- Str: float | None = field(default=None, metadata=field_options(alias="str"))
711
+ Str: float | None = None
628
712
  per: int | None = None
629
713
  con: int | None = None
630
- Int: int | None = field(default=None, metadata=field_options(alias="int"))
631
-
632
-
633
- class HabiticaClass(StrEnum):
634
- """Habitica's player classes."""
635
-
636
- WARRIOR = "warrior"
637
- ROGUE = "rogue"
638
- MAGE = "wizard"
639
- HEALER = "healer"
714
+ Int: int | None = None
640
715
 
641
716
 
642
717
  @dataclass(kw_only=True)
643
- class StatsUser:
718
+ class StatsUser(StatsAvatar, BaseModel):
644
719
  """Stats user data."""
645
720
 
646
721
  buffs: BuffsStats = field(default_factory=BuffsStats)
@@ -650,21 +725,18 @@ class StatsUser:
650
725
  exp: int | None = None
651
726
  gp: float | None = None
652
727
  lvl: int | None = None
653
- Class: HabiticaClass | None = field(
654
- default=None, metadata=field_options(alias="class")
655
- )
656
728
  points: int | None = None
657
- Str: int | None = field(default=None, metadata=field_options(alias="str"))
729
+ Str: int | None = None
658
730
  con: int | None = None
659
731
  per: int | None = None
660
732
  toNextLevel: int | None = None
661
733
  maxHealth: int | None = None
662
734
  maxMP: int | None = None
663
- Int: int | None = field(default=None, metadata=field_options(alias="int"))
735
+ Int: int | None = None
664
736
 
665
737
 
666
738
  @dataclass(kw_only=True)
667
- class TagsUser:
739
+ class TagsUser(BaseModel):
668
740
  """Tags user data."""
669
741
 
670
742
  id: UUID | None = None
@@ -674,7 +746,7 @@ class TagsUser:
674
746
 
675
747
 
676
748
  @dataclass(kw_only=True)
677
- class InboxUser:
749
+ class InboxUser(BaseModel):
678
750
  """Inbox user data."""
679
751
 
680
752
  newMessages: int | None = None
@@ -684,7 +756,7 @@ class InboxUser:
684
756
 
685
757
 
686
758
  @dataclass(kw_only=True)
687
- class TasksOrderUser:
759
+ class TasksOrderUser(BaseModel):
688
760
  """TasksOrder user data."""
689
761
 
690
762
  habits: list[UUID] = field(default_factory=list)
@@ -694,38 +766,67 @@ class TasksOrderUser:
694
766
 
695
767
 
696
768
  @dataclass(kw_only=True)
697
- class PushDevicesUser:
769
+ class PushDevicesUser(BaseModel):
698
770
  """PushDevices user data."""
699
771
 
700
772
  regId: str
701
- Type: str = field(metadata=field_options(alias="type"))
773
+ Type: str
702
774
  createdAt: datetime
703
775
  updatedAt: datetime
704
776
 
705
777
 
778
+ class WebhooksType(StrEnum):
779
+ """Webhook types."""
780
+
781
+ TASK_ACTIVITY = "taskActivity"
782
+ USER_ACTIVITY = "userActivity"
783
+ QUEST_ACTIVITY = "questActivity"
784
+ GROUP_CHAT_RECEIVED = "groupChatReceived"
785
+
786
+
706
787
  @dataclass(kw_only=True)
707
- class WebhooksUser:
788
+ class WebhooksOptions(BaseModel):
789
+ """Webhooks options data."""
790
+
791
+ created: bool | None = None
792
+ updated: bool | None = None
793
+ deleted: bool | None = None
794
+ scored: bool | None = None
795
+ questStarted: bool | None = None
796
+ questFinished: bool | None = None
797
+ questInvited: bool | None = None
798
+ petHatched: bool | None = None
799
+ mountRaised: bool | None = None
800
+ leveledUp: bool | None = None
801
+ groupId: UUID | None = None
802
+
803
+
804
+ @dataclass(kw_only=True)
805
+ class WebhooksUser(BaseModel):
708
806
  """Webhooks user data."""
709
807
 
710
- id: UUID
711
- Type: str = field(metadata=field_options(alias="type"))
712
- label: str
713
- url: str
714
- enabled: bool
715
- failures: int
716
- lastFailureAt: datetime | None
808
+ id: UUID | None = None
809
+ Type: WebhooksType = WebhooksType.TASK_ACTIVITY
810
+ url: str | None = None
811
+ enabled: bool = True
812
+ failures: int = 0
813
+ label: str = ""
814
+ options = WebhooksOptions
815
+ lastFailureAt: datetime | None = None
816
+ createdAt: datetime | None = None
817
+ updatedAt: datetime | None = None
717
818
 
718
819
 
719
820
  @dataclass(kw_only=True)
720
- class PinnedItemsUser:
821
+ class PinnedItemsUser(BaseModel):
721
822
  """PinnedItems user data."""
722
823
 
723
824
  path: str
724
- Type: str = field(metadata=field_options(alias="type"))
825
+ Type: str
725
826
 
726
827
 
727
828
  @dataclass(kw_only=True)
728
- class UserData:
829
+ class UserData(Avatar, BaseModel):
729
830
  """User data."""
730
831
 
731
832
  id: UUID | None = None
@@ -764,7 +865,6 @@ class UserData:
764
865
  newMessages: dict[str, bool] = field(default_factory=dict)
765
866
 
766
867
 
767
- @dataclass(kw_only=True)
768
868
  class HabiticaUserResponse(HabiticaResponse):
769
869
  """Representation of a user data response."""
770
870
 
@@ -779,7 +879,7 @@ class HabiticaGroupMembersResponse(HabiticaResponse):
779
879
 
780
880
 
781
881
  @dataclass(kw_only=True)
782
- class CompletedBy:
882
+ class CompletedBy(BaseModel):
783
883
  """Task group completedby data."""
784
884
 
785
885
  userId: UUID | None = None
@@ -787,7 +887,7 @@ class CompletedBy:
787
887
 
788
888
 
789
889
  @dataclass(kw_only=True)
790
- class GroupTask:
890
+ class GroupTask(BaseModel):
791
891
  """Task group data."""
792
892
 
793
893
  assignedUsers: list[UUID] | None = None
@@ -801,7 +901,7 @@ class GroupTask:
801
901
 
802
902
 
803
903
  @dataclass(kw_only=True)
804
- class Repeat:
904
+ class Repeat(BaseModel):
805
905
  """Task repeat data."""
806
906
 
807
907
  m: bool = True
@@ -824,7 +924,7 @@ class ChallengeAbortedReason(StrEnum):
824
924
 
825
925
 
826
926
  @dataclass(kw_only=True)
827
- class Challenge:
927
+ class Challenge(BaseModel):
828
928
  """Challenge task data."""
829
929
 
830
930
  id: UUID | None = None
@@ -835,7 +935,7 @@ class Challenge:
835
935
 
836
936
 
837
937
  @dataclass(kw_only=True)
838
- class Reminders:
938
+ class Reminders(BaseModel):
839
939
  """Task reminders data."""
840
940
 
841
941
  id: UUID
@@ -844,7 +944,7 @@ class Reminders:
844
944
 
845
945
 
846
946
  @dataclass(kw_only=True)
847
- class Checklist:
947
+ class Checklist(BaseModel):
848
948
  """Task checklist data."""
849
949
 
850
950
  id: UUID
@@ -908,17 +1008,12 @@ class Task(TypedDict("Task", {"type": NotRequired[TaskType]}), total=True):
908
1008
 
909
1009
 
910
1010
  @dataclass(kw_only=True)
911
- class TaskData(DataClassORJSONMixin):
1011
+ class TaskData(BaseModel):
912
1012
  """Task data."""
913
1013
 
914
- class Config(BaseConfig):
915
- """Configuration for TaskData."""
916
-
917
- serialize_by_alias = True
918
-
919
1014
  challenge: Challenge = field(default_factory=Challenge)
920
1015
  group: GroupTask = field(default_factory=GroupTask)
921
- Type: TaskType | None = field(default=None, metadata=field_options(alias="type"))
1016
+ Type: TaskType | None = None
922
1017
  text: str | None = None
923
1018
  notes: str | None = None
924
1019
  tags: list[UUID] = field(default_factory=list)
@@ -971,7 +1066,7 @@ class HabiticaTaskResponse(HabiticaResponse):
971
1066
 
972
1067
 
973
1068
  @dataclass(kw_only=True)
974
- class HabiticaErrorResponse(DataClassORJSONMixin):
1069
+ class HabiticaErrorResponse(BaseModel):
975
1070
  """Base class for Habitica errors."""
976
1071
 
977
1072
  success: bool
@@ -980,7 +1075,7 @@ class HabiticaErrorResponse(DataClassORJSONMixin):
980
1075
 
981
1076
 
982
1077
  @dataclass(kw_only=True)
983
- class TasksUserExport:
1078
+ class TasksUserExport(BaseModel):
984
1079
  """Tasks user export data."""
985
1080
 
986
1081
  todos: list[TaskData] = field(default_factory=list)
@@ -990,68 +1085,7 @@ class TasksUserExport:
990
1085
 
991
1086
 
992
1087
  @dataclass(kw_only=True)
993
- class BuffsUserStyles:
994
- """Buffs UserStyles data."""
995
-
996
- per: int | None = None
997
- con: int | None = None
998
- stealth: int | None = None
999
- seafoam: bool | None = None
1000
- shinySeed: bool | None = None
1001
- snowball: bool | None = None
1002
- spookySparkles: bool | None = None
1003
-
1004
-
1005
- @dataclass(kw_only=True)
1006
- class StatsUserStyles:
1007
- """Stats user styles data."""
1008
-
1009
- buffs: BuffsUserStyles = field(default_factory=BuffsUserStyles)
1010
- Class: HabiticaClass = field(default=HabiticaClass.WARRIOR)
1011
-
1012
-
1013
- @dataclass(kw_only=True)
1014
- class GearItemsUserStyles:
1015
- """Items gear data."""
1016
-
1017
- equipped: EquippedGear = field(default_factory=EquippedGear)
1018
- costume: EquippedGear = field(default_factory=EquippedGear)
1019
-
1020
-
1021
- @dataclass(kw_only=True)
1022
- class ItemsUserStyles:
1023
- """Items user styles data."""
1024
-
1025
- gear: GearItemsUserStyles = field(default_factory=GearItemsUserStyles)
1026
- currentMount: str | None = None
1027
- currentPet: str | None = None
1028
-
1029
-
1030
- @dataclass(kw_only=True)
1031
- class PreferencesUserStyles:
1032
- """Preferences user styles data."""
1033
-
1034
- hair: HairPreferences = field(default_factory=HairPreferences)
1035
- size: str | None = None
1036
- skin: str | None = None
1037
- shirt: str | None = None
1038
- chair: str | None = None
1039
- costume: bool | None = None
1040
- sleep: bool | None = None
1041
- background: str | None = None
1042
-
1043
-
1044
- @dataclass(kw_only=True)
1045
- class UserStyles(DataClassORJSONMixin):
1046
- """Represents minimalistic data only containing user styles."""
1047
-
1048
- items: ItemsUserStyles = field(default_factory=ItemsUserStyles)
1049
- preferences: PreferencesUserStyles = field(default_factory=PreferencesUserStyles)
1050
- stats: StatsUserStyles = field(default_factory=StatsUserStyles)
1051
-
1052
-
1053
- @dataclass(kw_only=True)
1054
- class HabiticaUserExport(UserData, DataClassORJSONMixin):
1088
+ class HabiticaUserExport(UserData, BaseModel):
1055
1089
  """Representation of a user data export."""
1056
1090
 
1057
1091
  tasks: TasksUserExport = field(default_factory=TasksUserExport)
@@ -1066,7 +1100,7 @@ class UserAnonymizedData:
1066
1100
 
1067
1101
 
1068
1102
  @dataclass(kw_only=True)
1069
- class HabiticaUserAnonymizedResponse(DataClassORJSONMixin):
1103
+ class HabiticaUserAnonymizedResponse(BaseModel):
1070
1104
  """Representation of a anonymized user data export."""
1071
1105
 
1072
1106
  data: UserAnonymizedData
@@ -1080,7 +1114,7 @@ class HabiticaStatsResponse(HabiticaResponse):
1080
1114
 
1081
1115
 
1082
1116
  @dataclass(kw_only=True)
1083
- class QuestTmpScore:
1117
+ class QuestTmpScore(BaseModel):
1084
1118
  """Represents the quest progress details."""
1085
1119
 
1086
1120
  progressDelta: float | None = None
@@ -1088,19 +1122,19 @@ class QuestTmpScore:
1088
1122
 
1089
1123
 
1090
1124
  @dataclass(kw_only=True)
1091
- class DropTmpScore:
1125
+ class DropTmpScore(BaseModel):
1092
1126
  """Represents the details of an item drop."""
1093
1127
 
1094
1128
  target: str | None = None
1095
1129
  canDrop: bool | None = None
1096
1130
  value: int | None = None
1097
1131
  key: str | None = None
1098
- Type: str | None = field(default=None, metadata=field_options(alias="type"))
1132
+ Type: str | None = None
1099
1133
  dialog: str | None = None
1100
1134
 
1101
1135
 
1102
1136
  @dataclass(kw_only=True)
1103
- class TmpScore:
1137
+ class TmpScore(BaseModel):
1104
1138
  """Temporary quest and drop data."""
1105
1139
 
1106
1140
  quest: QuestTmpScore = field(default_factory=QuestTmpScore)
@@ -1112,34 +1146,32 @@ class ScoreData(StatsUser):
1112
1146
  """Scora data."""
1113
1147
 
1114
1148
  delta: float | None = None
1115
- tmp: TmpScore = field(
1116
- default_factory=TmpScore, metadata=field_options(alias="_tmp")
1117
- )
1149
+ tmp: TmpScore = field(default_factory=TmpScore)
1118
1150
 
1119
1151
 
1120
1152
  @dataclass(kw_only=True)
1121
- class HabiticaScoreResponse(HabiticaResponse, DataClassORJSONMixin):
1153
+ class HabiticaScoreResponse(HabiticaResponse):
1122
1154
  """Representation of a score response."""
1123
1155
 
1124
1156
  data: ScoreData
1125
1157
 
1126
1158
 
1127
1159
  @dataclass(kw_only=True)
1128
- class HabiticaTagsResponse(HabiticaResponse, DataClassORJSONMixin):
1160
+ class HabiticaTagsResponse(HabiticaResponse):
1129
1161
  """Representation of a score response."""
1130
1162
 
1131
1163
  data: list[TagsUser]
1132
1164
 
1133
1165
 
1134
1166
  @dataclass(kw_only=True)
1135
- class HabiticaTagResponse(HabiticaResponse, DataClassORJSONMixin):
1167
+ class HabiticaTagResponse(HabiticaResponse):
1136
1168
  """Representation of a score response."""
1137
1169
 
1138
1170
  data: TagsUser
1139
1171
 
1140
1172
 
1141
1173
  @dataclass(kw_only=True)
1142
- class QuestData:
1174
+ class QuestData(BaseModel):
1143
1175
  """Quest data."""
1144
1176
 
1145
1177
  progress: ProgressQuest = field(default_factory=ProgressQuest)
@@ -1151,14 +1183,14 @@ class QuestData:
1151
1183
 
1152
1184
 
1153
1185
  @dataclass(kw_only=True)
1154
- class HabiticaQuestResponse(HabiticaResponse, DataClassORJSONMixin):
1186
+ class HabiticaQuestResponse(HabiticaResponse):
1155
1187
  """Representation of a quest response."""
1156
1188
 
1157
1189
  data: QuestData
1158
1190
 
1159
1191
 
1160
1192
  @dataclass
1161
- class ChangeClassData:
1193
+ class ChangeClassData(BaseModel):
1162
1194
  """Change class data."""
1163
1195
 
1164
1196
  preferences: PreferencesUser = field(default_factory=PreferencesUser)
@@ -1168,7 +1200,7 @@ class ChangeClassData:
1168
1200
 
1169
1201
 
1170
1202
  @dataclass(kw_only=True)
1171
- class HabiticaClassSystemResponse(HabiticaResponse, DataClassORJSONMixin):
1203
+ class HabiticaClassSystemResponse(HabiticaResponse):
1172
1204
  """Representation of a change-class response."""
1173
1205
 
1174
1206
  data: ChangeClassData
@@ -1282,7 +1314,7 @@ class TaskPriority(Enum):
1282
1314
 
1283
1315
 
1284
1316
  @dataclass
1285
- class AchievmentContent:
1317
+ class AchievmentContent(BaseModel):
1286
1318
  """Achievment content data."""
1287
1319
 
1288
1320
  icon: str
@@ -1296,7 +1328,7 @@ class AchievmentContent:
1296
1328
 
1297
1329
 
1298
1330
  @dataclass
1299
- class AnimalColorAchievementContent:
1331
+ class AnimalColorAchievementContent(BaseModel):
1300
1332
  """animalColorAchievement content data."""
1301
1333
 
1302
1334
  color: str
@@ -1307,17 +1339,17 @@ class AnimalColorAchievementContent:
1307
1339
 
1308
1340
 
1309
1341
  @dataclass
1310
- class AnimalSetAchievementContent:
1342
+ class AnimalSetAchievementContent(BaseModel):
1311
1343
  """animalSetAchievements content data."""
1312
1344
 
1313
- Type: str = field(metadata=field_options(alias="type"))
1345
+ Type: str
1314
1346
  species: list[str]
1315
1347
  achievementKey: str
1316
1348
  notificationType: str
1317
1349
 
1318
1350
 
1319
1351
  @dataclass
1320
- class StableAchievementContent:
1352
+ class StableAchievementContent(BaseModel):
1321
1353
  """stableAchievements content data."""
1322
1354
 
1323
1355
  masterAchievement: str
@@ -1325,7 +1357,7 @@ class StableAchievementContent:
1325
1357
 
1326
1358
 
1327
1359
  @dataclass
1328
- class PetSetCompleteAchievsContent:
1360
+ class PetSetCompleteAchievsContent(BaseModel):
1329
1361
  """petSetCompleteAchievs content data."""
1330
1362
 
1331
1363
  color: str
@@ -1334,7 +1366,7 @@ class PetSetCompleteAchievsContent:
1334
1366
 
1335
1367
 
1336
1368
  @dataclass
1337
- class QuestBossRage:
1369
+ class QuestBossRage(BaseModel):
1338
1370
  """QuestBossRage content data."""
1339
1371
 
1340
1372
  title: str
@@ -1345,36 +1377,36 @@ class QuestBossRage:
1345
1377
 
1346
1378
 
1347
1379
  @dataclass
1348
- class QuestBoss:
1380
+ class QuestBoss(BaseModel):
1349
1381
  """QuestBoss content data."""
1350
1382
 
1351
1383
  name: str
1352
1384
  hp: float
1353
- Str: float = field(metadata=field_options(alias="str"))
1354
- Def: float = field(metadata=field_options(alias="def"))
1385
+ Str: float
1386
+ Def: float
1355
1387
  rage: QuestBossRage | None = None
1356
1388
 
1357
1389
 
1358
1390
  @dataclass
1359
- class QuestItem:
1391
+ class QuestItem(BaseModel):
1360
1392
  """QuestItem content data."""
1361
1393
 
1362
- Type: str = field(metadata=field_options(alias="type"))
1394
+ Type: str
1363
1395
  key: str
1364
1396
  text: str
1365
1397
 
1366
1398
 
1367
1399
  @dataclass
1368
- class QuestDrop:
1400
+ class QuestDrop(BaseModel):
1369
1401
  """QuestDrop content data."""
1370
1402
 
1371
1403
  gp: float
1372
1404
  exp: float
1373
- items: list[QuestItem] | None = None
1405
+ items: list[QuestItem] = field(default_factory=list)
1374
1406
 
1375
1407
 
1376
1408
  @dataclass
1377
- class QuestCollect:
1409
+ class QuestCollect(BaseModel):
1378
1410
  """QuestCollect content data."""
1379
1411
 
1380
1412
  text: str
@@ -1382,7 +1414,7 @@ class QuestCollect:
1382
1414
 
1383
1415
 
1384
1416
  @dataclass
1385
- class QuestUnlockCondition:
1417
+ class QuestUnlockCondition(BaseModel):
1386
1418
  """QuestUnlockCondition content data."""
1387
1419
 
1388
1420
  condition: str
@@ -1390,7 +1422,7 @@ class QuestUnlockCondition:
1390
1422
 
1391
1423
 
1392
1424
  @dataclass
1393
- class QuestsContent:
1425
+ class QuestsContent(BaseModel):
1394
1426
  """petSetCompleteAchievs content data."""
1395
1427
 
1396
1428
  text: str
@@ -1412,7 +1444,7 @@ class QuestsContent:
1412
1444
 
1413
1445
 
1414
1446
  @dataclass
1415
- class ItemListEntry:
1447
+ class ItemListEntry(BaseModel):
1416
1448
  """ItemListEntry content data."""
1417
1449
 
1418
1450
  localeKey: str
@@ -1420,7 +1452,7 @@ class ItemListEntry:
1420
1452
 
1421
1453
 
1422
1454
  @dataclass
1423
- class ItemListContent:
1455
+ class ItemListContent(BaseModel):
1424
1456
  """ItemListContent content data."""
1425
1457
 
1426
1458
  weapon: ItemListEntry
@@ -1441,25 +1473,25 @@ class ItemListContent:
1441
1473
 
1442
1474
 
1443
1475
  @dataclass
1444
- class GearEntry:
1476
+ class GearEntry(BaseModel):
1445
1477
  """GearEntry content data."""
1446
1478
 
1447
1479
  text: str
1448
1480
  notes: str
1449
- Int: int = field(metadata=field_options(alias="int"))
1481
+ Int: int
1450
1482
  value: int
1451
- Type: str = field(metadata=field_options(alias="type"))
1483
+ Type: str
1452
1484
  key: str
1453
- Set: str = field(metadata=field_options(alias="set"))
1485
+ Set: str
1454
1486
  klass: str
1455
1487
  index: str
1456
- Str: int = field(metadata=field_options(alias="str"))
1488
+ Str: int
1457
1489
  per: int
1458
1490
  con: int
1459
1491
 
1460
1492
 
1461
1493
  @dataclass
1462
- class GearClass:
1494
+ class GearClass(BaseModel):
1463
1495
  """GearClass content data."""
1464
1496
 
1465
1497
  base: dict[str, GearEntry] | None = None
@@ -1473,7 +1505,7 @@ class GearClass:
1473
1505
 
1474
1506
 
1475
1507
  @dataclass
1476
- class GearType:
1508
+ class GearType(BaseModel):
1477
1509
  """GearType content data."""
1478
1510
 
1479
1511
  weapon: GearClass
@@ -1487,7 +1519,7 @@ class GearType:
1487
1519
 
1488
1520
 
1489
1521
  @dataclass
1490
- class GearContent:
1522
+ class GearContent(BaseModel):
1491
1523
  """GearContent content data."""
1492
1524
 
1493
1525
  tree: GearType
@@ -1495,7 +1527,7 @@ class GearContent:
1495
1527
 
1496
1528
 
1497
1529
  @dataclass
1498
- class SpellEntry:
1530
+ class SpellEntry(BaseModel):
1499
1531
  """SpellEntry content data."""
1500
1532
 
1501
1533
  text: str
@@ -1513,7 +1545,7 @@ class SpellEntry:
1513
1545
 
1514
1546
 
1515
1547
  @dataclass
1516
- class SpellsClass:
1548
+ class SpellsClass(BaseModel):
1517
1549
  """SpellsClass content data."""
1518
1550
 
1519
1551
  wizard: dict[str, SpellEntry]
@@ -1524,8 +1556,8 @@ class SpellsClass:
1524
1556
 
1525
1557
 
1526
1558
  @dataclass
1527
- class CarTypes:
1528
- """CarTypes content data."""
1559
+ class CardTypes(BaseModel):
1560
+ """CardTypes content data."""
1529
1561
 
1530
1562
  key: str
1531
1563
  messageOptions: int
@@ -1533,7 +1565,7 @@ class CarTypes:
1533
1565
 
1534
1566
 
1535
1567
  @dataclass
1536
- class SpecialItemEntry:
1568
+ class SpecialItemEntry(BaseModel):
1537
1569
  """Item content data."""
1538
1570
 
1539
1571
  key: str | None = None
@@ -1550,7 +1582,7 @@ class SpecialItemEntry:
1550
1582
 
1551
1583
 
1552
1584
  @dataclass
1553
- class EggEntry:
1585
+ class EggEntry(BaseModel):
1554
1586
  """Egg content data."""
1555
1587
 
1556
1588
  text: str | None = None
@@ -1562,7 +1594,7 @@ class EggEntry:
1562
1594
 
1563
1595
 
1564
1596
  @dataclass
1565
- class HatchingPotionEntry:
1597
+ class HatchingPotionEntry(BaseModel):
1566
1598
  """Hatching potion content data."""
1567
1599
 
1568
1600
  value: int | None = None
@@ -1576,18 +1608,18 @@ class HatchingPotionEntry:
1576
1608
 
1577
1609
 
1578
1610
  @dataclass
1579
- class PetEntry:
1611
+ class PetEntry(BaseModel):
1580
1612
  """Pet content data."""
1581
1613
 
1582
1614
  key: str | None = None
1583
- Type: str | None = field(default=None, metadata=field_options(alias="type"))
1615
+ Type: str | None = None
1584
1616
  potion: str | None = None
1585
1617
  egg: str | None = None
1586
1618
  text: str | None = None
1587
1619
 
1588
1620
 
1589
1621
  @dataclass
1590
- class InventoryItemEntry:
1622
+ class InventoryItemEntry(BaseModel):
1591
1623
  """Inventory item content data."""
1592
1624
 
1593
1625
  text: str | None = None
@@ -1601,7 +1633,7 @@ class InventoryItemEntry:
1601
1633
 
1602
1634
 
1603
1635
  @dataclass
1604
- class ContentData:
1636
+ class ContentData(BaseModel):
1605
1637
  """Content data."""
1606
1638
 
1607
1639
  achievements: dict[str, AchievmentContent]
@@ -1626,7 +1658,7 @@ class ContentData:
1626
1658
  # repeatingEvents
1627
1659
  classes: list[str]
1628
1660
  gearTypes: list[str]
1629
- cardTypes: dict[str, CarTypes]
1661
+ cardTypes: dict[str, CardTypes]
1630
1662
  special: dict[str, SpecialItemEntry]
1631
1663
  dropEggs: dict[str, EggEntry]
1632
1664
  questEggs: dict[str, EggEntry]
@@ -1666,7 +1698,7 @@ class HabiticaContentResponse(HabiticaResponse):
1666
1698
 
1667
1699
 
1668
1700
  @dataclass
1669
- class PartyMember:
1701
+ class PartyMember(BaseModel):
1670
1702
  """Party member data."""
1671
1703
 
1672
1704
  stats: StatsUser
@@ -1676,7 +1708,7 @@ class PartyMember:
1676
1708
 
1677
1709
 
1678
1710
  @dataclass
1679
- class UserTasks:
1711
+ class UserTasks(BaseModel):
1680
1712
  """User and tasks data."""
1681
1713
 
1682
1714
  user: UserData