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 +6 -2
- habiticalib/const.py +32 -2
- habiticalib/ha.py +11 -0
- habiticalib/lib.py +29 -21
- habiticalib/types.py +30 -3
- {habiticalib-0.3.2.dist-info → habiticalib-0.3.4.dist-info}/METADATA +1 -1
- habiticalib-0.3.4.dist-info/RECORD +12 -0
- habiticalib-0.3.2.dist-info/RECORD +0 -11
- {habiticalib-0.3.2.dist-info → habiticalib-0.3.4.dist-info}/WHEEL +0 -0
- {habiticalib-0.3.2.dist-info → habiticalib-0.3.4.dist-info}/licenses/LICENSE +0 -0
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
|
-
|
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
|
-
"
|
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.
|
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
|
-
|
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
|
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
|
-
|
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
|
-
) ->
|
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
|
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
|
-
) ->
|
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
|
-
|
868
|
-
A response object containing the user's updated
|
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
|
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
|
-
|
1810
|
-
|
1811
|
-
|
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
|
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
|
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
|
-
|
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.
|
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,
|
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}{
|
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]
|
918
|
+
tags: list[UUID] = field(default_factory=list)
|
918
919
|
value: float | None = None
|
919
920
|
priority: TaskPriority | None = None
|
920
921
|
attribute: Attributes | None = None
|
@@ -929,7 +930,7 @@ class TaskData:
|
|
929
930
|
counterUp: int | None = None
|
930
931
|
counterDown: int | None = None
|
931
932
|
frequency: Frequency | None = None
|
932
|
-
history: list[EntryHistory]
|
933
|
+
history: list[EntryHistory] = field(default_factory=list)
|
933
934
|
alias: str | None = None
|
934
935
|
everyX: int | None = None
|
935
936
|
startDate: datetime | None = None
|
@@ -1059,7 +1060,7 @@ class UserAnonymizedData:
|
|
1059
1060
|
|
1060
1061
|
|
1061
1062
|
@dataclass(kw_only=True)
|
1062
|
-
class
|
1063
|
+
class HabiticaUserAnonymizedResponse(DataClassORJSONMixin):
|
1063
1064
|
"""Representation of a anonymized user data export."""
|
1064
1065
|
|
1065
1066
|
data: UserAnonymizedData
|
@@ -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.
|
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,,
|
File without changes
|
File without changes
|