Habiticalib 0.3.2__py3-none-any.whl → 0.3.4__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 CHANGED
@@ -16,6 +16,7 @@ from .types import (
16
16
  ContentData,
17
17
  Direction,
18
18
  Frequency,
19
+ HabiticaCastSkillResponse,
19
20
  HabiticaClass,
20
21
  HabiticaClassSystemResponse,
21
22
  HabiticaContentResponse,
@@ -32,12 +33,13 @@ from .types import (
32
33
  HabiticaTaskOrderResponse,
33
34
  HabiticaTaskResponse,
34
35
  HabiticaTasksResponse,
35
- HabiticaUserAnonymizedrResponse,
36
+ HabiticaUserAnonymizedResponse,
36
37
  HabiticaUserExport,
37
38
  HabiticaUserResponse,
38
39
  Language,
39
40
  LoginData,
40
41
  QuestData,
42
+ Repeat,
41
43
  ScoreData,
42
44
  Skill,
43
45
  StatsUser,
@@ -62,6 +64,7 @@ __all__ = [
62
64
  "Direction",
63
65
  "Frequency",
64
66
  "Habitica",
67
+ "HabiticaCastSkillResponse",
65
68
  "HabiticaClass",
66
69
  "HabiticaClassSystemResponse",
67
70
  "HabiticaContentResponse",
@@ -79,7 +82,7 @@ __all__ = [
79
82
  "HabiticaTaskOrderResponse",
80
83
  "HabiticaTaskResponse",
81
84
  "HabiticaTasksResponse",
82
- "HabiticaUserAnonymizedrResponse",
85
+ "HabiticaUserAnonymizedResponse",
83
86
  "HabiticaUserExport",
84
87
  "HabiticaUserResponse",
85
88
  "Language",
@@ -87,6 +90,7 @@ __all__ = [
87
90
  "NotAuthorizedError",
88
91
  "NotFoundError",
89
92
  "QuestData",
93
+ "Repeat",
90
94
  "ScoreData",
91
95
  "Skill",
92
96
  "StatsUser",
habiticalib/const.py CHANGED
@@ -1,18 +1,48 @@
1
1
  """Constants for Habiticalib."""
2
2
 
3
- __version__ = "0.3.2"
3
+ __version__ = "0.3.4"
4
4
 
5
5
  DEFAULT_URL = "https://habitica.com/"
6
6
  ASSETS_URL = "https://habitica-assets.s3.amazonaws.com/mobileApp/images/"
7
7
 
8
8
  DEVELOPER_ID = "4c4ca53f-c059-4ffa-966e-9d29dd405daf"
9
9
 
10
- BACKER_ONLY_GEAR = {
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 = {
11
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",
12
21
  "eyewear_special_ks2019": "BackerOnly-Equip-MythicGryphonVisor.gif",
22
+ "head_special_0": "BackerOnly-Equip-ShadeHelmet.gif",
23
+ "head_special_1": "ContributorOnly-Equip-CrystalHelmet.gif",
13
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",
14
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",
15
37
  "weapon_special_ks2019": "BackerOnly-Equip-MythicGryphonGlaive.gif",
16
38
  }
17
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
+
18
48
  PAGE_LIMIT = 60
habiticalib/ha.py ADDED
@@ -0,0 +1,11 @@
1
+ """Constants for Home Assistant."""
2
+
3
+ HP = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciICB2aWV3Qm94PSItNiAtNiAzNiAzNiI+CiAgICA8ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwYXRoIGZpbGw9IiNGNzRFNTIiIGQ9Ik0yIDQuNUw2LjE2NyAyIDEyIDUuMTY3IDE3LjgzMyAyIDIyIDQuNVYxMmwtNC4xNjcgNS44MzNMMTIgMjJsLTUuODMzLTQuMTY3TDIgMTJ6Ii8+CiAgICAgICAgPHBhdGggZmlsbD0iI0ZGNjE2NSIgZD0iTTcuMzMzIDE2LjY2N0wzLjY2NyAxMS41VjUuNDE3bDIuNS0xLjVMMTIgNy4wODNsNS44MzMtMy4xNjYgMi41IDEuNVYxMS41bC0zLjY2NiA1LjE2N0wxMiAxOS45MTd6Ii8+CiAgICAgICAgPHBhdGggZmlsbD0iI0ZGRiIgZD0iTTEyIDE0LjA4M2w0LjY2NyAyLjU4NEwxMiAxOS45MTd6IiBvcGFjaXR5PSIuNSIvPgogICAgICAgIDxwYXRoIGZpbGw9IiNCNTI0MjgiIGQ9Ik0xMiAxNC4wODNsLTQuNjY3IDIuNTg0TDEyIDE5LjkxN3oiIG9wYWNpdHk9Ii4zNSIvPgogICAgICAgIDxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik03LjMzMyAxNi42NjdMMy42NjcgMTEuNSAxMiAxNC4wODN6IiBvcGFjaXR5PSIuMjUiLz4KICAgICAgICA8cGF0aCBmaWxsPSIjQjUyNDI4IiBkPSJNMTYuNjY3IDE2LjY2N2wzLjY2Ni01LjE2N0wxMiAxNC4wODN6IiBvcGFjaXR5PSIuNSIvPgogICAgICAgIDxwYXRoIGZpbGw9IiNCNTI0MjgiIGQ9Ik0xMiAxNC4wODNsNS44MzMtMTAuMTY2IDIuNSAxLjVWMTEuNXoiIG9wYWNpdHk9Ii4zNSIvPgogICAgICAgIDxwYXRoIGZpbGw9IiNCNTI0MjgiIGQ9Ik0xMiAxNC4wODNMNi4xNjcgMy45MTdsLTIuNSAxLjVWMTEuNXoiIG9wYWNpdHk9Ii41Ii8+CiAgICAgICAgPHBhdGggZmlsbD0iI0ZGRiIgZD0iTTEyIDE0LjA4M0w2LjE2NyAzLjkxNyAxMiA3LjA4M3oiIG9wYWNpdHk9Ii41Ii8+CiAgICAgICAgPHBhdGggZmlsbD0iI0ZGRiIgZD0iTTEyIDE0LjA4M2w1LjgzMy0xMC4xNjZMMTIgNy4wODN6IiBvcGFjaXR5PSIuMjUiLz4KICAgICAgICA8cGF0aCBmaWxsPSIjRkZGIiBkPSJNOS4xNjcgMTQuODMzbC0zLTQuMTY2VjYuODMzaC4wODNMMTIgOS45MTdsNS43NS0zLjA4NGguMDgzdjMuODM0bC0zIDQuMTY2TDEyIDE2LjkxN3oiIG9wYWNpdHk9Ii41Ii8+CiAgICA8L2c+Cjwvc3ZnPg=="
4
+ XP = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciICB2aWV3Qm94PSItNiAtNiAzNiAzNiI+CiAgICA8ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwYXRoIGZpbGw9IiNGRkE2MjMiIGQ9Ik0xNiAxNmw4LTQtOC00LTQtOC00IDgtOCA0IDggNCA0IDh6Ii8+CiAgICAgICAgPHBhdGggZmlsbD0iI0ZGRiIgZD0iTTQuNSAxMmw1LTIuNUwxMiAxMnpNMTIgMTkuNWwtMi41LTVMMTIgMTJ6TTE5LjUgMTJsLTUgMi41TDEyIDEyek0xMiA0LjVsMi41IDVMMTIgMTJ6IiBvcGFjaXR5PSIuMjUiLz4KICAgICAgICA8cGF0aCBmaWxsPSIjQkY3RDFBIiBkPSJNMTkuNSAxMmwtNS0yLjVMMTIgMTJ6IiBvcGFjaXR5PSIuMjUiLz4KICAgICAgICA8cGF0aCBmaWxsPSIjQkY3RDFBIiBkPSJNMTIgMTkuNWwyLjUtNUwxMiAxMnoiIG9wYWNpdHk9Ii41Ii8+CiAgICAgICAgPHBhdGggZmlsbD0iI0ZGRiIgZD0iTTQuNSAxMmw1IDIuNUwxMiAxMnpNMTIgNC41bC0yLjUgNUwxMiAxMnoiIG9wYWNpdHk9Ii41Ii8+CiAgICAgICAgPHBhdGggZmlsbD0iI0ZGRiIgZD0iTTEwLjggMTMuMkw4LjUgMTJsMi4zLTEuMkwxMiA4LjVsMS4yIDIuMyAyLjMgMS4yLTIuMyAxLjItMS4yIDIuM3oiIG9wYWNpdHk9Ii41Ii8+CiAgICA8L2c+Cjwvc3ZnPg=="
5
+ MP = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciICB2aWV3Qm94PSItNiAtNiAzNiAzNiI+CiAgICA8ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwYXRoIGZpbGw9IiMyOTk1Q0QiIGQ9Ik0yMiAxNWwtMTAgOS0xMC05TDEyIDB6Ii8+CiAgICAgICAgPHBhdGggZmlsbD0iIzUwQjVFOSIgZD0iTTQuNiAxNC43bDcuNC0zdjkuNnoiLz4KICAgICAgICA8cGF0aCBmaWxsPSIjMUY3MDlBIiBkPSJNMTIgMTEuN2w3LjQgMy03LjQgNi42eiIgb3BhY2l0eT0iLjI1Ii8+CiAgICAgICAgPHBhdGggZmlsbD0iI0ZGRiIgZD0iTTEyIDExLjdWMy42bDcuNCAxMS4xeiIgb3BhY2l0eT0iLjI1Ii8+CiAgICAgICAgPHBhdGggZmlsbD0iI0ZGRiIgZD0iTTQuNiAxNC43TDEyIDMuNnY4LjF6IiBvcGFjaXR5PSIuNSIvPgogICAgICAgIDxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik03LjIgMTQuM0wxMiA3LjJsNC44IDcuMS00LjggNC4zeiIgb3BhY2l0eT0iLjUiLz4KICAgIDwvZz4KPC9zdmc+"
6
+ GP = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciICB2aWV3Qm94PSItNiAtNiAzNiAzNiI+CiAgICA8ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEyIiBmaWxsPSIjRkZBNjIzIi8+CiAgICAgICAgPHBhdGggZmlsbD0iI0ZGRiIgZD0iTTYuMyAxNy43Yy0zLjEtMy4xLTMuMS04LjIgMC0xMS4zIDMuMS0zLjEgOC4yLTMuMSAxMS4zIDAiIG9wYWNpdHk9Ii41Ii8+CiAgICAgICAgPHBhdGggZmlsbD0iI0ZGRiIgZD0iTTE3LjcgNi4zYzMuMSAzLjEgMy4xIDguMiAwIDExLjMtMy4xIDMuMS04LjIgMy4xLTExLjMgMCIgb3BhY2l0eT0iLjI1Ii8+CiAgICAgICAgPHBhdGggZmlsbD0iI0JGN0QxQSIgZD0iTTEyIDJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyem0wIDE4Yy00LjQgMC04LTMuNi04LThzMy42LTggOC04IDggMy42IDggOC0zLjYgOC04IDh6IiBvcGFjaXR5PSIuNSIvPgogICAgICAgIDxwYXRoIGZpbGw9IiNCRjdEMUEiIGQ9Ik0xMyA5djJoLTJWOUg5djZoMnYtMmgydjJoMlY5eiIgb3BhY2l0eT0iLjc1Ii8+CiAgICA8L2c+Cjwvc3ZnPg=="
7
+ WARRIOR = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiAgdmlld0JveD0iLTEyIC0xMiA3MiA3MiI+CiAgICA8ZGVmcz4KICAgICAgICA8cGF0aCBpZD0iYSIgZD0iTTMxLjM5MiA5LjExNWwtNi43OTEgNy4xMjR2Ni4zMTRsNi43OTEtNi43OTFWOS4xMTV6Ii8+CiAgICA8L2RlZnM+CiAgICA8ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgMSkiPgogICAgICAgIDxwYXRoIGZpbGw9IiNGMDYxNjYiIGQ9Ik0xOC4zOSAyOC43NjJsNi4zMzQgMi45MmMuNTI2LjI0My44NjguNzMyLjk5OSAxLjI5Ny4yMTkuOTQ4Ljg4MyAzLjE1Ni45MzcgNC4zM2EuODguODggMCAwIDEtMS4yNC44NDRsLTEwLjU4OC01LjA3YTEuNzgxIDEuNzgxIDAgMCAxLS43NjItLjc2M0w5IDIxLjczM2EuODguODggMCAwIDEgLjg0NC0xLjI0YzEuMTczLjA1NCAzLjMzNS42ODMgNC4zMy45MzcuNTYuMTQyIDEuMDU0LjQ3MiAxLjI5Ni45OThsMi45MiA2LjMzNHoiLz4KICAgICAgICA8cGF0aCBmaWxsPSIjQzgyQjJCIiBkPSJNMy4wNzMgNDQuMDg1bDIuNzMyIDIuNzMzIDcuMDg1LS41NTcuMzY0LTQuNjU2IDQuMDY5LTQuMDY3IDcuNDAxIDMuNTIyIDUuNTM2LTEuNDktMi4zMjItOS45OSAxNS41MTQtMTQuNDc3TDQ2LjQyMi43NDFsLS4wMDcuMDAyLjAwMy0uMDAzVi43MzRMMzIuMDU3IDMuNzAyIDE3LjU4IDE5LjIxOGwtOS45OS0yLjMyMkw2LjEgMjIuNDNsMy41MjIgNy40MDNMNS41NTUgMzMuOWwtNC42NTQuMzY3LS41NTkgNy4wODQgMi43MzIgMi43MzN6Ii8+CiAgICAgICAgPHBhdGggZmlsbD0iI0YwNjE2NiIgZD0iTTguOTI3IDQxLjc2OWwtMy41NDQtMy41NDQgOC43NjctOC43NjUgMy41NDIgMy41NDR6Ii8+CiAgICAgICAgPHBhdGggZmlsbD0iI0YwNjE2NiIgZD0iTTMuMzc3IDQwLjIzMWwuMjU1LTMuMjM1IDMuMjM2LS4yNTUgMy41NDQgMy41NDYtLjI1NSAzLjIzMy0zLjIzNC4yNTh6Ii8+CiAgICAgICAgPHBhdGggZmlsbD0iI0ZGQjZCOCIgZD0iTTMzLjkzNSA2LjUyNmwuMyA2LjM5MSA4LjEwOC04LjEwOGMtLjE1LS4xNC02LjI2LjU2NS04LjQwOCAxLjcxNyIvPgogICAgICAgIDxwYXRoIGZpbGw9IiNGMjdCODYiIGQ9Ik0zMy43ODcgNi42MDJMMTYuNjYgMjQuNTY4bDQuMzkgMS41MzggMTMuMTg2LTEzLjE4OS0uMy02LjM5MmMtLjA0OC4wMjctLjE0OC4wNzctLjE0OC4wNzciLz4KICAgICAgICA8cGF0aCBmaWxsPSIjRjI3Qjg2IiBkPSJNMTYuNjYgMjQuNTY3bC0uMTQ4LjE2NCAxLjg2NCA0LjA0NSAyLjY3LTIuNjctNC4zODYtMS41Mzl6TTQwLjYyNCAxMy4yMmwtNi4zOTItLjMgOC4xMDktOC4xMDhjLjE0LjE1LS41NjUgNi4yNTktMS43MTcgOC40MDgiLz4KICAgICAgICA8cGF0aCBmaWxsPSIjRTU0MTREIiBkPSJNNDAuNTQ4IDEzLjM2OEwyMi41ODIgMzAuNDk2bC0xLjUzOC00LjM5TDM0LjIzMyAxMi45Mmw2LjM5MS4zYTUuMDMyIDUuMDMyIDAgMCAwLS4wNzYuMTQ4Ii8+CiAgICAgICAgPHBhdGggZmlsbD0iI0U1NDE0RCIgZD0iTTIyLjU4MiAzMC40OTVsLS4xNjMuMTQ4LTQuMDQ1LTEuODY0IDIuNjctMi42NyAxLjUzOCA0LjM4NnoiLz4KICAgICAgICA8cGF0aCBmaWxsPSIjRkZCNkI4IiBkPSJNNi44NjcgMzYuNzQybC0uNzUgMi43NDItMi40ODYtMi40ODd6TTEwLjQwNiA0MC4yOGwtMi43NDIuNzUgMi40ODYgMi40ODZ6Ii8+CiAgICAgICAgPHBhdGggZmlsbD0iI0ZGQjZCOCIgZD0iTTYuODY3IDM2Ljc0MmwzLjU0NiAzLjU0Ni0yLjc0OC43NDEtMS41NDctMS41NDV6Ii8+CiAgICAgICAgPHBhdGggZmlsbD0iI0YyN0I4NiIgZD0iTTMuMzgyIDQwLjIzN2wyLjc0Mi0uNzUtMi40ODYtMi40ODZ6TTYuOTIxIDQzLjc3NmwuNzUtMi43NDIgMi40ODYgMi40ODZ6Ii8+CiAgICAgICAgPHBhdGggZmlsbD0iI0YyN0I4NiIgZD0iTTMuMzgyIDQwLjIzN2wzLjU0NyAzLjU0Ni43NC0yLjc0OC0xLjU0NS0xLjU0N3oiLz4KICAgICAgICA8cGF0aCBmaWxsPSIjRTU0MTREIiBkPSJNMTQuNzAxIDM2LjAxbC0zLjU1Mi0zLjU1MyAyLjE0My0yLjE0IDMuNTUyIDMuNTV6Ii8+CiAgICAgICAgPHBhdGggZmlsbD0iI0YwNjE2NiIgZD0iTTEyLjU2IDM4LjE1MUw5LjAwOCAzNC42bDIuMTQyLTIuMTQgMy41NTIgMy41NXoiLz4KICAgICAgICA8cGF0aCBmaWxsPSIjRTU0MTREIiBkPSJNMTAuNDE4IDQwLjI5M0w2Ljg2NiAzNi43NGwyLjE0Mi0yLjE0IDMuNTUyIDMuNTV6Ii8+CiAgICAgICAgPHBhdGggZmlsbD0iI0ZGQjZCOCIgZD0iTTE4LjM5NSAyOC43NjRsLTIuOTItNi4zMzRhMS42MjkgMS42MjkgMCAwIDAtLjQ2LS41NzYgMi4xMiAyLjEyIDAgMCAwLS44MzYtLjQyMmMtLjk5NS0uMjU0LTMuMTU3LS44ODMtNC4zMy0uOTM3YS44NzEuODcxIDAgMCAwLS43MjcuMzM2bDQuMjU4IDMuNjM0IDMuMTMgNi4xOTIgMS44OS0xLjg5LS4wMDUtLjAwM3oiLz4KICAgICAgICA8cGF0aCBmaWxsPSIjRjA2MTY2IiBkPSJNMTMuMzggMjQuNDY2TDkuMTIgMjAuODNhLjg3MS44NzEgMCAwIDAtLjExNy45MDRsNS4wNyAxMC41ODdjLjA4NS4xNjUuMTk3LjMxMy4zMjcuNDQ0bDIuMTA5LTIuMTA4LTMuMTMtNi4xOTJ6Ii8+CiAgICAgICAgPHBhdGggZmlsbD0iI0YyN0I4NiIgZD0iTTI2LjY3NCAzNy4zMTJjLS4wNTQtMS4xNzMtLjY4NC0zLjMzNy0uOTM3LTQuMzNhMi4xMiAyLjEyIDAgMCAwLS40MjMtLjgzNiAxLjYyOSAxLjYyOSAwIDAgMC0uNTc2LS40NmwtNi4zMzQtMi45Mi0uMDAyLS4wMDUtMS44OTEgMS44OTEgNi4xOTIgMy4xMyAzLjYzNSA0LjI1OGEuODc0Ljg3NCAwIDAgMCAuMzM2LS43MjgiLz4KICAgICAgICA8cGF0aCBmaWxsPSIjRTU0MTREIiBkPSJNMjIuNzAzIDMzLjc4MWwzLjYzNCA0LjI1OWEuODcxLjg3MSAwIDAgMS0uOTA0LjExN2wtMTAuNTg3LTUuMDdhMS43NjYgMS43NjYgMCAwIDEtLjQ0NC0uMzI3bDIuMTA5LTIuMTA4IDYuMTkyIDMuMTN6Ii8+CiAgICAgICAgPG1hc2sgaWQ9ImIiIGZpbGw9IiNmZmYiPgogICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNhIi8+CiAgICAgICAgPC9tYXNrPgogICAgICAgIDxwYXRoIGZpbGw9IiNGRkI2QjgiIGQ9Ik0yOS40NzIgMjMuMjhoLjk4N1Y1LjgyOGgtLjk4N3pNMjQuNjAxIDI3LjY5MmgyLjkyVjEwLjI0aC0yLjkyeiIgbWFzaz0idXJsKCNiKSIvPgogICAgPC9nPgo8L3N2Zz4="
8
+ ROGUE = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciICB2aWV3Qm94PSItMTIgLTEyIDcyIDcyIj4KICAgIDxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPHBhdGggZmlsbD0iIzRGMkE5MyIgZD0iTTYuNDkyIDM1LjE1NGw3LjM1OC03LjM1OWMxLjA1LTQuMjc0IDIuMTM1LTguNzUyIDIuMjItOS4yMjYuMDcyLS40OTUuMjM1LTEuNTk3IDEuMTMyLTIuNjUzLjQ1My0uNTMgMS4wMDgtLjk2NiAxLjcwNy0xLjM1TDM5LjM1MyAzLjMwMWw2LjY5LTEuNTU3LTEuNDk0IDYuNTk5LTExLjMzNCAyMC41NDJjLS4zNTkuNjU1LS43NjggMS4xODUtMS4yNDggMS42MTVsLS4wODMuMDczYy0xLjA2NS45MDYtMi4xMzMgMS4wNjQtMi43MDcgMS4xNS0uNDQ3LjA4MS01LjAyIDEuMTktOS4xODUgMi4yMTJsLTcuMzYgNy4zNi44NjggNC42ODgtOS44Ny0xLjgyNi0xLjgyOC05Ljg3MSA0LjY5Ljg2OHoiLz4KICAgICAgICA8cGF0aCBmaWxsPSIjNEYyQTkzIiBkPSJNMzYuMDUgNDEuMDc5bC03LjM1OC03LjM1OWMtNC4yNzQtMS4wNS04Ljc1My0yLjEzNS05LjIyNi0yLjIyLS40OTUtLjA3MS0xLjU5Ny0uMjM0LTIuNjUzLTEuMTMtLjUzLS40NTQtLjk2Ni0xLjAxLTEuMzUtMS43MDhMNC4xOTcgOC4yMTggMi42NDEgMS41MjcgOS4yNCAzLjAyMSAyOS43OCAxNC4zNTVjLjY1Ni4zNiAxLjE4Ni43NjggMS42MTYgMS4yNDhsLjA3My4wODRjLjkwNiAxLjA2NCAxLjA2NCAyLjEzMyAxLjE1IDIuNzA3LjA4MS40NDYgMS4xOSA1LjAxOSAyLjIxMiA5LjE4NGw3LjM2IDcuMzYxIDQuNjg4LS44NjgtMS44MjYgOS44Ny05Ljg3MSAxLjgyNy44NjgtNC42ODl6Ii8+CiAgICAgICAgPHBhdGggZmlsbD0iI0M2QjZFNCIgZD0iTTE4LjE0MSAyNy4xOTNjLjIyLjM5OS40MzIuNjY0LjY0Ny44NDhsNy42NDMtMi43MjJMNi40OCA1LjM2OGMtLjE2NC4xODguMDQ4LjcyOC4zOSAxLjM3NyIvPgogICAgICAgIDxwYXRoIGZpbGw9IiM4OTY2QzciIGQ9Ik0xOC43OTIgMjguMDQzYy4zOS4zMzIuNzguMzg2IDEuMTgxLjQ0Ny42MjIuMDkxIDEwLjI3NyAyLjQ2OCAxMC4yNzcgMi40NjhsLjkxLS45MS00LjczLTQuNzI4LTcuNjM4IDIuNzIzeiIvPgogICAgICAgIDxwYXRoIGZpbGw9IiM3QTU0QzAiIGQ9Ik0yOC4zMDYgMTcuMDI5Yy4zOTguMjE5LjY2My40MzIuODQ3LjY0N2wtMi43MjEgNy42NDJMNi40ODIgNS4zN2MuMTg0LS4xNjMuNzE0LjAzNiAxLjM1My4zNjMiLz4KICAgICAgICA8cGF0aCBmaWxsPSIjNjEzM0I0IiBkPSJNMjkuMTU1IDE3LjY4Yy4zMzIuMzkuMzg2Ljc4LjQ0NyAxLjE4MS4wOTIuNjIyIDIuNDY5IDEwLjI3NiAyLjQ2OSAxMC4yNzZsLS45MS45MS00LjczLTQuNzI5IDIuNzI0LTcuNjM4eiIvPgogICAgICAgIDxwYXRoIGZpbGw9IiM4OTY2QzciIGQ9Ik0zNS40MDIgMzYuMTExbC0xLjQ5NC0xLjQ5NC40NjctMy4xNzcgMS40OTQgMS40OTV6TTM4LjM5IDM5LjFsLTEuNDk0LTEuNDk1LjQ2OC0zLjE3NiAxLjQ5NCAxLjQ5NHpNMzIuMDcgMjkuMTM3bC44MS44MS0uNDY3IDMuMTc0LTIuMTY0LTIuMTYyIi8+CiAgICAgICAgPHBhdGggZmlsbD0iIzYxMzNCNCIgZD0iTTMzLjkwOCAzNC42MTdsLTEuNDk1LTEuNDk1LjQ2OC0zLjE3NiAxLjQ5NCAxLjQ5NHpNMzYuODk2IDM3LjYwNWwtMS40OTQtMS40OTQuNDY4LTMuMTc2IDEuNDk0IDEuNDk0ek0zOS44ODUgNDAuNTk0TDM4LjM5IDM5LjFsLjQ2Ny0zLjE3NyAyLjg0OSAyLjg0OXoiLz4KICAgICAgICA8cGF0aCBmaWxsPSIjQzZCNkU0IiBkPSJNMzAuMjUgMzAuOTU5bC4xNjItMS42NTcgMS42Ni0uMTY1LS4xNjUgMS42NTl6TTM5LjYzMiAzOC41MmwtLjYzNyAzLjQzNiAyLjAzNy0yLjAzN3pNNDMuMDY5IDM3Ljg4MmwtMy40MzcuNjM3IDEuNCAxLjR6TTQxLjAzMiAzOS45MmwtMi4wMzcgMi4wMzYgMy40MzctLjYzNnpNNDIuNDMyIDQxLjMybC42MzctMy40MzctMi4wMzcgMi4wMzd6Ii8+CiAgICA8L2c+Cjwvc3ZnPg=="
9
+ WIZARD = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciICB2aWV3Qm94PSItMTIgLTEyIDcyIDcyIj4KICAgIDxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPHBhdGggZmlsbD0iIzFGNkVBMiIgZD0iTTI0LjQ2MiAxLjE1MWMtMy42OTUgMy43MTQtNy4zMjEgMTQuNjItOS4yMzYgMjAuOTEzLS44NC0xLjA2Mi0xLjc5OS0yLjA3Ni0zLjE1OC0zLjMyNi00LjgwNiAzLjUxNC03LjM1NyA3LjI1LTEwLjY0NiAxMS44MTYgOC45MTYgNy45MjYgMTEuMjMzIDkuMjU2IDIyLjk5NSAxNi4wMDVsLjA0NS0uMDI1aC4wMDFsLjA0NS4wMjVjMTEuNzYtNi43NDkgMTQuMDc5LTguMDggMjIuOTk0LTE2LjAwNS0zLjI4Ny00LjU2Ni01Ljg0MS04LjMwMi0xMC42NDUtMTEuODE2LTEuMzYxIDEuMjUtMi4zMTcgMi4yNjQtMy4xNTggMy4zMjYtMS45MTUtNi4yOTQtNS41NDMtMTcuMi05LjIzNi0yMC45MTNoLS4wMDF6Ii8+CiAgICAgICAgPHBhdGggZmlsbD0iIzI3OEFCRiIgZD0iTTI0LjQ2NCAzMi4xMDhsMy41NjEtMS4yNjVjNi4wNzUtLjYwNSA4LjQyNS0yLjI4MSA5LjQyNi0zLjQ5OGw2LjA1MyAyLjcwNy4wMDIuMDEzYS40NS40NSAwIDAgMS0uMTA1LjI4NiA0Ljk3IDQuOTcgMCAwIDEtLjMyLjMzYy0zLjQwNSAzLjMxNS0xOC4yMzcgMTEuOTgxLTE4LjYxNyAxMi4yMDJWMzIuMTA4eiIvPgogICAgICAgIDxwYXRoIGZpbGw9IiM1M0I0RTUiIGQ9Ik0zNi40MDYgMjMuMDQxYy4yMy0uMTg4LjI5Mi0uMzQuNjc0LS4zMzYgMS4xODMuMDY3IDUuMTY5IDUuMTc1IDYuMDY0IDYuNDYxLjE5NC4yNzguMzY2LjYxLjM2Ljg4NWwtNi4wNTMtMi43MDdjLjIzNi0uMzY3LjE5LS45Mi0uMzU1LTEuMjUyLS44MTgtLjUwMS0yLjUyOS45NDktMi45NTkuMjg0LS41OTktLjkyNyAyLjA0LTMuMTQ3IDIuMjctMy4zMzUiLz4KICAgICAgICA8cGF0aCBmaWxsPSIjMkFBMENGIiBkPSJNMjMuNTkxIDcuNDg3Yy01LjM5IDE1LjQxOS04LjIyNyAyMy44MTctOC4yMjcgMjMuODE3bDkuMDk3IDQuNzZWNi44MzljLS4zNiAwLS43MTguMjE2LS44Ny42NDgiLz4KICAgICAgICA8cGF0aCBmaWxsPSIjMjc4QUJGIiBkPSJNMjUuMzMyIDcuNDg3Yy0uMTUyLS40MzItLjUxLS42NDgtLjg3LS42NDh2MjkuMjI1bDkuMDk3LTQuNzZzLTIuODM3LTguMzk4LTguMjI3LTIzLjgxNyIvPgogICAgICAgIDxwYXRoIGZpbGw9IiM0REIyRDYiIGQ9Ik0yNC40NjIgMzIuMTA4TDIwLjkgMzAuODQzYy02LjA3NS0uNjA1LTguMzQyLTIuMzUyLTkuNDI1LTMuNDk4TDUuNDIgMzAuMDUybC0uMDAyLjAxM2EuNDUuNDUgMCAwIDAgLjEwNi4yODZjLjA5LjEwNC4xOTcuMjE1LjMxOC4zMyAzLjQwNiAzLjMxNSAxOC4yMzggMTEuOTgxIDE4LjYxOSAxMi4yMDJWMzIuMTA4eiIvPgogICAgICAgIDxwYXRoIGZpbGw9IiM2QkM0RTkiIGQ9Ik0xMi41MTkgMjMuMDQxYy0uMjMtLjE4OC0uMjkyLS4zNC0uNjc0LS4zMzYtMS4xODMuMDY3LTUuMTY5IDUuMTc1LTYuMDYzIDYuNDYxLS4xOTQuMjc4LS4zNjcuNjEtLjM2MS44ODVsNi4wNTMtMi43MDdjLS4yMzYtLjM2Ny0uMTktLjkyLjM1Ni0xLjI1Mi44MTctLjUwMSAyLjUyOC45NDkgMi45NTguMjg0LjYtLjkyNy0yLjAzOS0zLjE0Ny0yLjI3LTMuMzM1Ii8+CiAgICAgICAgPHBhdGggZmlsbD0iI0E5REJGNiIgZD0iTTI0LjQ2MyAzNC45OTh2LTUuMTAxbC03LjIxLTQuMTMtMS40OCA0LjA0OXoiLz4KICAgICAgICA8cGF0aCBmaWxsPSIjODRDRkYyIiBkPSJNMjQuNDYzIDM0Ljk5OHYtNS4xMDFsNy4yMDctNC4xMyAxLjQ4MyA0LjA0OXoiLz4KICAgIDwvZz4KPC9zdmc+"
10
+ HEALER = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciICB2aWV3Qm94PSItMTIgLTEyIDcyIDcyIj4KICAgIDxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPHBhdGggZmlsbD0iI0NGODIyOSIgZD0iTTI0LjYxIDQ3LjYwNHMtMS43ODktLjczNS0yLjU4NS0xLjEzOGwtLjE4My0uMDljLTUuMTMtMi41OC0xMC41NC01Ljc4Mi0xMy44ODEtMTIuMTA4LTMuNzc3LTcuMTUtMy4wNS0xOC41NjUtMi45NTUtMTkuODQzLjA3NS0xLjAwMy4zNzgtMy40NjQuMzc4LTMuNDY0czEuOTQxLS44NTggMi45MDEtMS4zMTFsMTMuODY0LTcuMDEyYy43NjQtLjM2MyAyLjQ2Mi0xLjExNCAyLjQ2Mi0xLjExNHMxLjY5Ny43NSAyLjQ2MyAxLjExNGwxMy44NiA3LjAxYy45NjYuNDU3IDMuMDUgMS4zMTUgMy4wNSAxLjMxNXMuMTU3IDIuNDY3LjIzMiAzLjQ2NWMuMDk0IDEuMjc1LjgyMiAxMi42OS0yLjk1NSAxOS44NC0zLjM0MyA2LjMzLTguNzU1IDkuNTMtMTMuODc2IDEyLjEwM2wtLjE5LjA5NmMtLjc5NS40MDItMi41ODQgMS4xMzctMi41ODQgMS4xMzciLz4KICAgICAgICA8cGF0aCBmaWxsPSIjRTI5RTQ1IiBkPSJNMTIuNjk0IDE2LjE0N2wxMS4wNTktNS42OTVjLjI3LS4xMjkuNTY0LS4xOTIuODU4LS4xOTJWNS44MjljLS4yOTQgMC0uNTg4LjA2My0uODU4LjE5Mkw5Ljg4OCAxMy4wMzJhMS45ODUgMS45ODUgMCAwIDAtLjcyNy42MDNsMy41MzMgMi41MjN2LS4wMTFNMjQuNjEyIDEwLjI1OVY1LjgyN3oiLz4KICAgICAgICA8cGF0aCBmaWxsPSIjRkRDNjdFIiBkPSJNMjMuNzUyIDYuMDA4TDkuODkgMTMuMDJjLS42NTUuMzEtMS4wOS45NDUtMS4xNDUgMS42NjUtLjAzNC40NjYtLjgxIDExLjQ4NyAyLjUzMSAxNy44MTQgMi43ODIgNS4yNjYgNy4zNiA4LjA0OCAxMi4yNDIgMTAuNTA0bC4xOS4wOTZjLjI4NC4xNDIuNTkzLjIxMy45MDIuMjEzVjUuODE2Yy0uMjkzIDAtLjU4NS4wNjQtLjg1OC4xOTIiLz4KICAgICAgICA8cGF0aCBmaWxsPSIjRkZBNjIzIiBkPSJNMjUuNTEyIDQzLjA5OWwuMTktLjA5NmM0Ljg4NS0yLjQ1NCA5LjQ2Mi01LjIzOCAxMi4yNDQtMTAuNTA1IDMuMzQxLTYuMzI2IDIuNTY1LTE3LjM0NyAyLjUzLTE3LjgxM2EyLjAwOSAyLjAwOSAwIDAgMC0xLjE0My0xLjY2NUwyNS40NjggNi4wMDhhMS45OTkgMS45OTkgMCAwIDAtLjg1OC0uMTkydjM3LjQ5NmMuMzEgMCAuNjE4LS4wNzEuOTAyLS4yMTMiLz4KICAgICAgICA8cGF0aCBmaWxsPSIjRkZEREI1IiBkPSJNMTIuNjk0IDE2LjEzNGwxMS4wNTktNS42OTRjLjI3LS4xMjkuNTY0LS4xOTIuODU4LS4xOTJWNS44MTZjLS4yOTQgMC0uNTg3LjA2NC0uODU4LjE5Mkw5Ljg4OSAxMy4wMmExLjk4NSAxLjk4NSAwIDAgMC0uNzI4LjYwM2wzLjUzMyAyLjUyM3YtLjAxMiIvPgogICAgICAgIDxwYXRoIGZpbGw9IiNGREM2N0UiIGQ9Ik0zOS4zMzMgMTMuMDJMMjUuNDY4IDYuMDA4YTEuOTk5IDEuOTk5IDAgMCAwLS44NTgtLjE5MnY0LjQzMWMuMjk0IDAgLjU4OC4wNjUuODU4LjE5MmwxMS4wNjUgNS43MDIgMy41MjctMi41MTlhMS45NzMgMS45NzMgMCAwIDAtLjcyNy0uNjAyIi8+CiAgICAgICAgPHBhdGggZmlsbD0iI0ZGQTYyMyIgZD0iTTI0LjIxNCAzOC44NThjLTQuMTk3LTIuMTI4LTcuMzgzLTQuNDM4LTkuMzg5LTguMjM1LTIuMjM5LTQuMjM4LTIuMjI5LTExLjYzLTIuMTMxLTE0LjQ3N0w5LjE2IDEzLjYyM2EyIDIgMCAwIDAtLjQxNyAxLjA2MmMtLjAxNS4yMDctLjE3NCAyLjQ5OC0uMDU3IDUuNTMxLjE0OCAzLjc5OC43MzEgOC43NjUgMi41OSAxMi4yODIgMi43ODIgNS4yNjcgNy4zNTcgOC4wNSAxMi4yNDIgMTAuNTA1bC4xOS4wOTZjLjI4NC4xNDIuNTkzLjIxMy45MDIuMjEzdi00LjMzYy0uMDk4IDAtLjE5Ny0uMDQtLjM5Ny0uMTI0Ii8+CiAgICAgICAgPHBhdGggZmlsbD0iI0U1OTAyNSIgZD0iTTM0LjM5NSAzMC42MjNjLTIuMDA4IDMuODA0LTUuMjAzIDYuMTEzLTkuNDA2IDguMjQzLS4xODguMDc4LS4yODIuMTE3LS4zNzguMTE3djQuMzNjLjMxIDAgLjYxOC0uMDcyLjktLjIxNGwuMTktLjA5NmM0Ljg4NS0yLjQ1NSA5LjQ2Mi01LjIzOCAxMi4yNDQtMTAuNTA0IDEuODU3LTMuNTE4IDIuNDQzLTguNDg1IDIuNTktMTIuMjgyLjExOC0zLjAzNC0uMDQ0LTUuMzI1LS4wNi01LjUzMmExLjk5NSAxLjk5NSAwIDAgMC0uNDE0LTEuMDY0bC0zLjUyNyAyLjUyMWMuMTI5IDMuNTMtLjA3IDEwLjU2Ni0yLjEzOSAxNC40ODEiLz4KICAgICAgICA8cGF0aCBmaWxsPSIjRkZFNEM5IiBkPSJNMTYuMDc2IDI0LjU2NGw1LjY5LTIuODQ1IDIuODQ1IDIuODQ1ek0yNC42MSAzMy4wOThsLTIuODQ1LTUuNjg4IDIuODQ2LTIuODQ2eiIvPgogICAgICAgIDxwYXRoIGZpbGw9IiNFNTkwMjUiIGQ9Ik0zMy4xNDUgMjQuNTY0bC01LjY4OSAyLjg0Ni0yLjg0NS0yLjg0NnpNMjQuNjEgMTYuMDNsMi44NDYgNS42ODktMi44NDUgMi44NDV6Ii8+CiAgICAgICAgPHBhdGggZmlsbD0iI0U1OTAyNSIgZD0iTTMzLjE0NSAyNC41NjRsLTUuNjg5LTIuODQ1LTIuODQ1IDIuODQ1ek0yNC42MSAzMy4wOThsMi44NDYtNS42ODgtMi44NDUtMi44NDZ6Ii8+CiAgICAgICAgPHBhdGggZmlsbD0iI0ZGRTRDOSIgZD0iTTE2LjA3NiAyNC41NjRsNS42OSAyLjg0NiAyLjg0NS0yLjg0NnpNMjQuNjEgMTYuMDNsLTIuODQ1IDUuNjg5IDIuODQ2IDIuODQ1eiIvPgogICAgPC9nPgo8L3N2Zz4="
11
+ FOOD = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjAiIGhlaWdodD0iNTgiIHZpZXdCb3g9IjAgMCA2MCA1OCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CjxyZWN0IHg9IjM4IiB5PSI2IiB3aWR0aD0iMjIiIGhlaWdodD0iMjYiIGZpbGw9InVybCgjcGF0dGVybjBfMTMyN18yNTYpIj48L3JlY3Q+CjxyZWN0IHdpZHRoPSIyNiIgaGVpZ2h0PSIyNiIgZmlsbD0idXJsKCNwYXR0ZXJuMV8xMzI3XzI1NikiPjwvcmVjdD4KPHJlY3QgeD0iOCIgeT0iMzYiIHdpZHRoPSIzMCIgaGVpZ2h0PSIyMiIgZmlsbD0idXJsKCNwYXR0ZXJuMl8xMzI3XzI1NikiPjwvcmVjdD4KPGRlZnM+CjxwYXR0ZXJuIGlkPSJwYXR0ZXJuMF8xMzI3XzI1NiIgcGF0dGVybkNvbnRlbnRVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giIHdpZHRoPSIxIiBoZWlnaHQ9IjEiPgo8dXNlIHhsaW5rOmhyZWY9IiNpbWFnZTBfMTMyN18yNTYiIHRyYW5zZm9ybT0ic2NhbGUoMC4wNDU0NTQ1IDAuMDM4NDYxNSkiPjwvdXNlPgo8L3BhdHRlcm4+CjxwYXR0ZXJuIGlkPSJwYXR0ZXJuMV8xMzI3XzI1NiIgcGF0dGVybkNvbnRlbnRVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giIHdpZHRoPSIxIiBoZWlnaHQ9IjEiPgo8dXNlIHhsaW5rOmhyZWY9IiNpbWFnZTFfMTMyN18yNTYiIHRyYW5zZm9ybT0ic2NhbGUoMC4wMzg0NjE1KSI+PC91c2U+CjwvcGF0dGVybj4KPHBhdHRlcm4gaWQ9InBhdHRlcm4yXzEzMjdfMjU2IiBwYXR0ZXJuQ29udGVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgd2lkdGg9IjEiIGhlaWdodD0iMSI+Cjx1c2UgeGxpbms6aHJlZj0iI2ltYWdlMl8xMzI3XzI1NiIgdHJhbnNmb3JtPSJzY2FsZSgwLjAzMzMzMzMgMC4wNDU0NTQ1KSI+PC91c2U+CjwvcGF0dGVybj4KPGltYWdlIGlkPSJpbWFnZTBfMTMyN18yNTYiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyNiIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCWUFBQUFhQ0FZQUFBQ3pkcXhBQUFBQUFYTlNSMElBcnM0YzZRQUFBUWxKUkVGVVNBMjkwazFxd2xBVXhmRnNwK3NvWFlkem9lQWFXcUZiY1N4MTRMVFFTYnVBanJ1TFZnZFBudkFyY3NJalJsT0Z5OG45K3Q5alNOY04vQjd1N3N0cERJeWYzejZGMXVmek4yTXlRZnZmOTFMalo3czZSdlpqdlozbTR0Vmd3TjM2cTlUZ2tLclQ3K2VQVXNOZTA2b0JpNEJVblE2Q0UyaUJBcVhxVTV3LzV3b1dEVkwxVkgySzB3TWJBSGliZlpZYTZpMDFkenN3Nnk3bTUrVWZjTXhoUzNGd080WEp3SUNjNWVmRmFlcWc0NXVCMDVtODVWQ2R3ZDY3OVNxQVVnRmEyZ1FEV1RRb1Q4Mit2T2Q0Y3JBTEx0S3N6eDhYcFVhcmI3Nm5GcWdCK2NWZ29GVGdwK1ZMcVNIUHVkRTUwTCtCMTYrYlVzT2gwUTV6QVdoeXNFTU95Q2ZUc2VBRFNTQzNudTVpRmFjQUFBQUFTVVZPUks1Q1lJST0iPjwvaW1hZ2U+CjxpbWFnZSBpZD0iaW1hZ2UxXzEzMjdfMjU2IiB3aWR0aD0iMjYiIGhlaWdodD0iMjYiIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQm9BQUFBYUNBWUFBQUNwU2t6T0FBQUFBWE5TUjBJQXJzNGM2UUFBQVNsSlJFRlVTQTNGMURGT3cwQVFCVkRUUmhTcDZSSFVhVkxRY0FXT0VDa05SNkhpUHRSY0psMUtxQlp0cEVmeGpiV3J4QTZXUmw4em52bC8vcTdsWVlqbmJuTmIvZ3B0K2U3NWZWMXFxT3Ryb29GRWcxay9XeWdKNzNjM3BRWUIrY1VDL3k2VVRqaDYyMjVMamQwd25NS2kzWmhITlpzUVlvaFl2djk0TERYVU9UbSt2cFFhWHc5UHAxQ2ZkSVFRSXBSZkxJUVFPbnZFTU92Nk9XazZNd0NUY0hZaFJ3UlR3QUtKN3VUNzgxQnFjS2orZTFlY0VJQ3pDeUdtdkZtdFNnMmJFN1JwYnE3UCs4bTd1cG9RSjVBalo1d2IyeHltZzNROCtjZTR1cENOYzhPV0EzT3c2VWpqNGtMdWlDQnNDYWZqcHFQRmhhYSt2bDVoanZYN3VQQ09VSU1CNkFnaDRzejE0eGtKWkVFamRPYUlXbWd1ZVVlNVJyaVlVQ29UN01XYzc4NTdCZlFoL2dGQ2FOUWFobDJ1M2dBQUFBQkpSVTVFcmtKZ2dnPT0iPjwvaW1hZ2U+CjxpbWFnZSBpZD0iaW1hZ2UyXzEzMjdfMjU2IiB3aWR0aD0iMzAiIGhlaWdodD0iMjIiIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQjRBQUFBV0NBWUFBQURYWXl6UEFBQUFBWE5TUjBJQXJzNGM2UUFBQVJSSlJFRlVTQTNGMDhGdEFqRVVCRkNhZ0FZU0tkM1FBc1VnY1VrRHFTTzMxSkJqTHJuU0JsSms1TU9EMVdndDdSbzVJSDJOL2NlZStiUHNiamFEZjY4dmIyVmFnKzN1OGxQVHVyNHpLMWNwWko4eStoK0g3MUxMUHM4dDNoTklUQUY4dHpFQitQbHpLZFA2UGYrVld2akUwLzZyMUZvOVFBcE5UZXQ2dURIRDQvdTV6Qlhlb0ptME96SGhPZFBhd3o5c1RJQmdHbnJFeWV2dnR0dFNpMDVpdm95M3ZZTXBiQUFHeWVzL2JFeklmOFlJdGdZeCtDM0owb1dMdzR3WkpIcFVra2tzb1g0aW5sNHpxQU9KLzJic080TVNHa2d5aWZCUTMvbG1Vb1NERENGQi9IRGpOR1FNRFFDOWZIZ29XQk1kYkNYRlE0YXcyOWhFaEExZ2o0ZjZpZmpWU09ocHhnWllQWG52Qllhd1YyZnB2U3R4R0Z5dUlYV3NXUUFBQUFCSlJVNUVya0pnZ2c9PSI+PC9pbWFnZT4KPC9kZWZzPgo8L3N2Zz4="
habiticalib/lib.py CHANGED
@@ -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 ASSETS_URL, BACKER_ONLY_GEAR, DEFAULT_URL, PAGE_LIMIT
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,
@@ -30,6 +37,7 @@ from .helpers import (
30
37
  from .types import (
31
38
  Attributes,
32
39
  Direction,
40
+ HabiticaCastSkillResponse,
33
41
  HabiticaClass,
34
42
  HabiticaClassSystemResponse,
35
43
  HabiticaContentResponse,
@@ -46,7 +54,7 @@ from .types import (
46
54
  HabiticaTaskOrderResponse,
47
55
  HabiticaTaskResponse,
48
56
  HabiticaTasksResponse,
49
- HabiticaUserAnonymizedrResponse,
57
+ HabiticaUserAnonymizedResponse,
50
58
  HabiticaUserExport,
51
59
  HabiticaUserResponse,
52
60
  Language,
@@ -112,7 +120,7 @@ class Habitica:
112
120
  async def _request(self, method: str, url: URL, **kwargs) -> str:
113
121
  """Handle API request."""
114
122
  async with self._session.request(
115
- method,
123
+ method.upper(),
116
124
  url,
117
125
  headers=self._headers,
118
126
  **kwargs,
@@ -254,7 +262,7 @@ class Habitica:
254
262
 
255
263
  async def get_user_anonymized(
256
264
  self,
257
- ) -> HabiticaUserAnonymizedrResponse:
265
+ ) -> HabiticaUserAnonymizedResponse:
258
266
  """Get the authenticated user's anonymized profile.
259
267
 
260
268
  This method retrieves the user's profile data while excluding sensitive
@@ -291,7 +299,7 @@ class Habitica:
291
299
 
292
300
  url = url / "anonymized"
293
301
 
294
- return HabiticaUserAnonymizedrResponse.from_json(
302
+ return HabiticaUserAnonymizedResponse.from_json(
295
303
  await self._request("get", url=url),
296
304
  )
297
305
 
@@ -851,7 +859,7 @@ class Habitica:
851
859
  self,
852
860
  skill: Skill,
853
861
  target_id: UUID | None = None,
854
- ) -> HabiticaUserResponse:
862
+ ) -> HabiticaCastSkillResponse:
855
863
  """Cast a skill (spell) in Habitica, optionally targeting a specific user, task or party.
856
864
 
857
865
  Parameters
@@ -864,8 +872,9 @@ class Habitica:
864
872
 
865
873
  Returns
866
874
  -------
867
- HabiticaStatResponse
868
- A response object containing the user's updated stats and a success message.
875
+ HabiticaCastSkillResponse
876
+ A response object containing the user's updated data, updated task data if
877
+ a task was targeted, and a success message.
869
878
 
870
879
  Raises
871
880
  ------
@@ -887,7 +896,7 @@ class Habitica:
887
896
 
888
897
  if target_id:
889
898
  params.update({"targetId": str(target_id)})
890
- return HabiticaUserResponse.from_json(
899
+ return HabiticaCastSkillResponse.from_json(
891
900
  await self._request("post", url=url, params=params),
892
901
  )
893
902
 
@@ -1806,9 +1815,9 @@ class Habitica:
1806
1815
  -------
1807
1816
  None
1808
1817
  """
1809
- url = URL(ASSETS_URL) / f"{asset}"
1810
- if not url.suffix:
1811
- url = url.with_suffix(".png")
1818
+
1819
+ url = URL(ASSETS_URL) / SPECIAL_ASSETS.get(asset, f"{asset}.png")
1820
+
1812
1821
  try:
1813
1822
  if not (asset_data := self._assets_cache.get(asset)):
1814
1823
  async with self._session.get(url) as r:
@@ -1817,18 +1826,20 @@ class Habitica:
1817
1826
  self._cache_asset(asset, asset_data)
1818
1827
  except ClientResponseError as e:
1819
1828
  _LOGGER.exception(
1820
- "Failed to load %s.png due to error [%s]: %s",
1829
+ "Failed to load %s due to error [%s]: %s",
1821
1830
  asset,
1822
1831
  e.status,
1823
1832
  e.message,
1824
1833
  )
1825
1834
  except ClientError:
1826
1835
  _LOGGER.exception(
1827
- "Failed to load %s.png due to a request error",
1836
+ "Failed to load %s due to a request error",
1828
1837
  asset,
1829
1838
  )
1830
1839
  else:
1831
1840
  fetched_image = Image.open(asset_data).convert("RGBA")
1841
+ if offset := SPECIAL_ASSETS_OFFSET.get(asset):
1842
+ position = tuple(map(add, position, offset))
1832
1843
  image.paste(fetched_image, position, fetched_image)
1833
1844
 
1834
1845
  async def generate_avatar( # noqa: PLR0912, PLR0915
@@ -1893,11 +1904,8 @@ class Habitica:
1893
1904
  )
1894
1905
  gear = getattr(gear_set, gear_type)
1895
1906
  if gear and gear != f"{gear_type}_base_0":
1896
- # 2019 Kickstarter gear doesn't follow name conventions
1897
- if special_ks2019 := BACKER_ONLY_GEAR.get(gear):
1898
- gear = special_ks2019
1899
1907
  # armor has slim and broad size options
1900
- elif gear_type == "armor":
1908
+ if gear_type == "armor":
1901
1909
  gear = f"{preferences.size}_{gear}"
1902
1910
  await self.paste_image(image, gear, (24, mount_offset_y))
1903
1911
 
@@ -1926,7 +1934,7 @@ class Habitica:
1926
1934
  ):
1927
1935
  if stats.buffs.spookySparkles:
1928
1936
  await self.paste_image(image, "ghost", (24, mount_offset_y))
1929
- if stats.buffs.shinySeed:
1937
+ if stats.buffs.snowball:
1930
1938
  await self.paste_image(
1931
1939
  image,
1932
1940
  f"avatar_snowball_{stats.Class}",
@@ -1959,7 +1967,7 @@ class Habitica:
1959
1967
  await self.paste_image(
1960
1968
  image,
1961
1969
  f"chair_{preferences.chair}",
1962
- (24, 0),
1970
+ (24, mount_offset_y),
1963
1971
  )
1964
1972
 
1965
1973
  # Fetch and paste the back accessory
@@ -1968,7 +1976,7 @@ class Habitica:
1968
1976
  # Fetch and paste the skin
1969
1977
  await self.paste_image(
1970
1978
  image,
1971
- f"skin_{preferences.skin}{"_sleep" if preferences.sleep else ""}",
1979
+ f"skin_{preferences.skin}{'_sleep' if preferences.sleep else ''}",
1972
1980
  (24, mount_offset_y),
1973
1981
  )
1974
1982
 
habiticalib/types.py CHANGED
@@ -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] | None = None
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] | None = None
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 HabiticaUserAnonymizedrResponse(DataClassORJSONMixin):
1063
+ class HabiticaUserAnonymizedResponse(DataClassORJSONMixin):
1063
1064
  """Representation of a anonymized user data export."""
1064
1065
 
1065
1066
  data: UserAnonymizedData
@@ -1656,3 +1657,29 @@ class HabiticaContentResponse(HabiticaResponse):
1656
1657
  """Representation of a content response."""
1657
1658
 
1658
1659
  data: ContentData
1660
+
1661
+
1662
+ @dataclass
1663
+ class PartyMember:
1664
+ """Party member data."""
1665
+
1666
+ stats: StatsUser
1667
+ achievements: AchievementsUser
1668
+ items: ItemsUser
1669
+ profile: ProfileUser
1670
+
1671
+
1672
+ @dataclass
1673
+ class UserTasks:
1674
+ """User and tasks data."""
1675
+
1676
+ user: UserData
1677
+ partyMembers: list[PartyMember] = field(default_factory=list)
1678
+ task: TaskData | None = None
1679
+
1680
+
1681
+ @dataclass
1682
+ class HabiticaCastSkillResponse(HabiticaResponse):
1683
+ """Representation of a cast skill response."""
1684
+
1685
+ data: UserTasks
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Habiticalib
3
- Version: 0.3.2
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
@@ -0,0 +1,12 @@
1
+ habiticalib/__init__.py,sha256=YDYsEGMIxZftYU9YkNC0tyvJrkxn2lXV8WcVQoOXyvA,2415
2
+ habiticalib/const.py,sha256=HP5xKY09-GES72btrXbI0XUFSrCBCqXdn2JPwfOR0vs,2308
3
+ habiticalib/exceptions.py,sha256=oVFCGbHkVn0UpIKIPZPzXfvzs9US4R05ebdEn6cOpqM,1350
4
+ habiticalib/ha.py,sha256=rSzrs7ixLJH3ZtOFlcuKV2t1ZndT0VpuPhDsGqorkOs,20757
5
+ habiticalib/helpers.py,sha256=IRZLYWkDVLI0iVBgBMmvZ6L83KCUl-CnzGhUR_tP6Fg,4576
6
+ habiticalib/lib.py,sha256=YxnlRwCsSlmrdvVu06TKRa6SgnQj2fh2LY8JM7HRqq8,73610
7
+ habiticalib/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
+ habiticalib/types.py,sha256=GS3GOlSY31SrJKcuci__drYewhJpi4jfPmAHapPijrg,43359
9
+ habiticalib-0.3.4.dist-info/METADATA,sha256=9DSGPmVo5IqO1hR1Z47oPP1xMiEsiCZpdMT3AGvs448,4207
10
+ habiticalib-0.3.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
11
+ habiticalib-0.3.4.dist-info/licenses/LICENSE,sha256=oIinIOSJ49l1iVIRI3XGXFWt6SF7a83kEFBAY8ORwNI,1084
12
+ habiticalib-0.3.4.dist-info/RECORD,,
@@ -1,11 +0,0 @@
1
- habiticalib/__init__.py,sha256=4R9cHRWgKBakoUfouQ8x-5Q1psHnFayj88-exKCLYnE,2327
2
- habiticalib/const.py,sha256=oVV6SvHxkvrLWD609IAcplC1Jjq9qho9DsXkv6VUJag,624
3
- habiticalib/exceptions.py,sha256=oVFCGbHkVn0UpIKIPZPzXfvzs9US4R05ebdEn6cOpqM,1350
4
- habiticalib/helpers.py,sha256=IRZLYWkDVLI0iVBgBMmvZ6L83KCUl-CnzGhUR_tP6Fg,4576
5
- habiticalib/lib.py,sha256=sH0L33VspxC6gVcpsYcryCXlViwwIVTc3zuTZ3V9wnU,73527
6
- habiticalib/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- habiticalib/types.py,sha256=YcMdZsB0jXL2_t7eYuD3-84qEl18arK1gRWBCA5quLQ,42818
8
- habiticalib-0.3.2.dist-info/METADATA,sha256=_tuam7yUeLxcpy5QhmXvRfAz1X2bknmKLTAU83S3Hj8,4207
9
- habiticalib-0.3.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
10
- habiticalib-0.3.2.dist-info/licenses/LICENSE,sha256=oIinIOSJ49l1iVIRI3XGXFWt6SF7a83kEFBAY8ORwNI,1084
11
- habiticalib-0.3.2.dist-info/RECORD,,