hungerlib 1.3.1.dev0__tar.gz → 2.dev0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. {hungerlib-1.3.1.dev0/src/hungerlib.egg-info → hungerlib-2.dev0}/PKG-INFO +1 -1
  2. {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/pyproject.toml +1 -1
  3. hungerlib-2.dev0/src/hungerlib/__init__.py +64 -0
  4. hungerlib-2.dev0/src/hungerlib/api/__init__.py +13 -0
  5. hungerlib-2.dev0/src/hungerlib/api/backups.py +26 -0
  6. hungerlib-2.dev0/src/hungerlib/api/databases.py +29 -0
  7. hungerlib-2.dev0/src/hungerlib/api/filemanager.py +65 -0
  8. hungerlib-2.dev0/src/hungerlib/api/schedule.py +29 -0
  9. hungerlib-2.dev0/src/hungerlib/api/startup.py +16 -0
  10. {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/src/hungerlib/config.py +1 -1
  11. hungerlib-2.dev0/src/hungerlib/panel.py +78 -0
  12. {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/src/hungerlib/servers/_generic.py +26 -26
  13. {hungerlib-1.3.1.dev0 → hungerlib-2.dev0/src/hungerlib.egg-info}/PKG-INFO +1 -1
  14. {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/src/hungerlib.egg-info/SOURCES.txt +6 -0
  15. hungerlib-1.3.1.dev0/src/hungerlib/__init__.py +0 -69
  16. hungerlib-1.3.1.dev0/src/hungerlib/panel.py +0 -168
  17. {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/LICENSE +0 -0
  18. {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/README.md +0 -0
  19. {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/setup.cfg +0 -0
  20. {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/src/hungerlib/addons/_generic.py +0 -0
  21. {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/src/hungerlib/addons/colormap.py +0 -0
  22. {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/src/hungerlib/addons/minecraft.py +0 -0
  23. {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/src/hungerlib/logger.py +0 -0
  24. {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/src/hungerlib/mchelpers.py +0 -0
  25. {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/src/hungerlib/scheduler.py +0 -0
  26. {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/src/hungerlib/servers/minecraft.py +0 -0
  27. {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/src/hungerlib.egg-info/dependency_links.txt +0 -0
  28. {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/src/hungerlib.egg-info/requires.txt +0 -0
  29. {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/src/hungerlib.egg-info/top_level.txt +0 -0
  30. {hungerlib-1.3.1.dev0 → hungerlib-2.dev0}/src/tests/test_imports.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hungerlib
3
- Version: 1.3.1.dev0
3
+ Version: 2.dev0
4
4
  Summary: Powerful automation library for Pterodactyl.
5
5
  Author: iFamished
6
6
  License: MIT
@@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"
7
7
 
8
8
  [project]
9
9
  name = "hungerlib"
10
- version = "1.3.1-dev"
10
+ version = "2-dev"
11
11
  description = "Powerful automation library for Pterodactyl."
12
12
  readme = "README.md"
13
13
  requires-python = ">=3.10"
@@ -0,0 +1,64 @@
1
+ from importlib.metadata import version as _pkg_version, PackageNotFoundError
2
+ import importlib
3
+
4
+ try:
5
+ __version__ = _pkg_version("hungerlib")
6
+ except PackageNotFoundError:
7
+ __version__ = "0.0.0"
8
+
9
+
10
+ # Public API map
11
+ # name -> (module_path, attribute_name or None)
12
+ _EXPORTS = {
13
+ # core modules
14
+ "panel": ("panel", None),
15
+ "config": ("config", None),
16
+ "logger": ("logger", None),
17
+
18
+ # servers
19
+ "GenericServer": ("servers._generic", "GenericServer"),
20
+ "MinecraftServer": ("servers.minecraft", "MinecraftServer"),
21
+
22
+ # addons
23
+ "genericAddons": ("addons._generic", None),
24
+ "minecraftAddons": ("addons.minecraft", None),
25
+ "colormap": ("addons.colormap", None),
26
+
27
+ # addon functions
28
+ "runCountdownEvents": ("addons._generic", "runCountdownEvents"),
29
+ "validateAll": ("addons._generic", "validateAll"),
30
+ "waitForOnline": ("addons._generic", "waitForOnline"),
31
+ "waitForOffline": ("addons._generic", "waitForOffline"),
32
+ "checkLag": ("addons.minecraft", "checkLag"),
33
+ "MC_COLOR_MAP": ("addons.colormap", "MC_COLOR_MAP"),
34
+ "ASCI_COLOR_MAP": ("addons.colormap", "ASCI_COLOR_MAP"),
35
+
36
+ # api endpoints
37
+ "ScheduleAPI": ("api.schedule", "ScheduleAPI"),
38
+ "FileManagerAPI": ("api.filemanager", "FileManagerAPI"),
39
+ "BackupsAPI": ("api.backups", "BackupsAPI"),
40
+ "DatabasesAPI": ("api.databases", "DatabasesAPI"),
41
+ "StartupAPI": ("api.startup", "StartupAPI"),
42
+ }
43
+
44
+
45
+ __all__ = list(_EXPORTS.keys()) + ["__version__"]
46
+
47
+
48
+ # Lazy loader
49
+ def __getattr__(name):
50
+ if name not in _EXPORTS:
51
+ raise AttributeError(f"module 'hungerlib' has no attribute '{name}'")
52
+
53
+ module_name, attr = _EXPORTS[name]
54
+ module = importlib.import_module(f"hungerlib.{module_name}")
55
+
56
+ # Export module itself
57
+ if attr is None:
58
+ globals()[name] = module
59
+ return module
60
+
61
+ # Export attribute from module
62
+ value = getattr(module, attr)
63
+ globals()[name] = value
64
+ return value
@@ -0,0 +1,13 @@
1
+ from .schedule import ScheduleAPI
2
+ from .filemanager import FileManagerAPI
3
+ from .backups import BackupsAPI
4
+ from .databases import DatabasesAPI
5
+ from .startup import StartupAPI
6
+
7
+ __all__ = [
8
+ "ScheduleAPI",
9
+ "FileManagerAPI",
10
+ "BackupsAPI",
11
+ "DatabasesAPI",
12
+ "StartupAPI",
13
+ ]
@@ -0,0 +1,26 @@
1
+ class BackupsAPI:
2
+ """
3
+ Raw backups endpoints.
4
+ """
5
+
6
+ def __init__(self, panel):
7
+ self.panel = panel
8
+
9
+ def list(self, server_id):
10
+ return self.panel.get(f"/api/client/servers/{server_id}/backups")
11
+
12
+ def create(self, server_id, name="Auto Backup"):
13
+ return self.panel.post(
14
+ f"/api/client/servers/{server_id}/backups",
15
+ json={"name": name}
16
+ )
17
+
18
+ def delete(self, server_id, backup_id):
19
+ return self.panel.delete(
20
+ f"/api/client/servers/{server_id}/backups/{backup_id}"
21
+ )
22
+
23
+ def download(self, server_id, backup_id):
24
+ return self.panel.get(
25
+ f"/api/client/servers/{server_id}/backups/{backup_id}/download"
26
+ )
@@ -0,0 +1,29 @@
1
+ class DatabasesAPI:
2
+ """
3
+ Raw database endpoints.
4
+ """
5
+
6
+ def __init__(self, panel):
7
+ self.panel = panel
8
+
9
+ def list(self, server_id):
10
+ return self.panel.get(f"/api/client/servers/{server_id}/databases")
11
+
12
+ def create(self, server_id, name, remote="%", host=None):
13
+ payload = {"database": name, "remote": remote}
14
+ if host:
15
+ payload["host"] = host
16
+ return self.panel.post(
17
+ f"/api/client/servers/{server_id}/databases",
18
+ json=payload
19
+ )
20
+
21
+ def rotate_password(self, server_id, db_id):
22
+ return self.panel.post(
23
+ f"/api/client/servers/{server_id}/databases/{db_id}/rotate-password"
24
+ )
25
+
26
+ def delete(self, server_id, db_id):
27
+ return self.panel.delete(
28
+ f"/api/client/servers/{server_id}/databases/{db_id}"
29
+ )
@@ -0,0 +1,65 @@
1
+ class FileManagerAPI:
2
+ """
3
+ Raw file manager endpoints.
4
+ """
5
+
6
+ def __init__(self, panel):
7
+ self.panel = panel
8
+
9
+ def list(self, server_id, directory="/"):
10
+ return self.panel.get(
11
+ f"/api/client/servers/{server_id}/files/list?directory={directory}"
12
+ )
13
+
14
+ def download(self, server_id, file_path):
15
+ return self.panel.get(
16
+ f"/api/client/servers/{server_id}/files/download?file={file_path}"
17
+ )
18
+
19
+ def upload(self, server_id, directory, file_data):
20
+ return self.panel._raw_upload(
21
+ f"/api/client/servers/{server_id}/files/upload",
22
+ file_data
23
+ )
24
+
25
+ def delete(self, server_id, root, files):
26
+ return self.panel.post(
27
+ f"/api/client/servers/{server_id}/files/delete",
28
+ json={"root": root, "files": files}
29
+ )
30
+
31
+ def rename(self, server_id, root, files):
32
+ return self.panel.post(
33
+ f"/api/client/servers/{server_id}/files/rename",
34
+ json={"root": root, "files": files}
35
+ )
36
+
37
+ def copy(self, server_id, root, files):
38
+ return self.panel.post(
39
+ f"/api/client/servers/{server_id}/files/copy",
40
+ json={"root": root, "files": files}
41
+ )
42
+
43
+ def move(self, server_id, root, files):
44
+ return self.panel.post(
45
+ f"/api/client/servers/{server_id}/files/move",
46
+ json={"root": root, "files": files}
47
+ )
48
+
49
+ def create_folder(self, server_id, directory, name):
50
+ return self.panel.post(
51
+ f"/api/client/servers/{server_id}/files/create-folder",
52
+ json={"root": directory, "name": name}
53
+ )
54
+
55
+ def compress(self, server_id, root, files):
56
+ return self.panel.post(
57
+ f"/api/client/servers/{server_id}/files/compress",
58
+ json={"root": root, "files": files}
59
+ )
60
+
61
+ def decompress(self, server_id, file_path):
62
+ return self.panel.post(
63
+ f"/api/client/servers/{server_id}/files/decompress",
64
+ json={"file": file_path}
65
+ )
@@ -0,0 +1,29 @@
1
+ class ScheduleAPI:
2
+ """
3
+ Raw schedule endpoints.
4
+ No logic. No models. No convenience.
5
+ """
6
+
7
+ def __init__(self, panel):
8
+ self.panel = panel
9
+
10
+ def list(self, server_id):
11
+ return self.panel.get(f"/api/client/servers/{server_id}/schedules")
12
+
13
+ def create(self, server_id, payload):
14
+ return self.panel.post(f"/api/client/servers/{server_id}/schedules", json=payload)
15
+
16
+ def update(self, server_id, schedule_id, payload):
17
+ # Your panel uses POST for full updates
18
+ return self.panel.post(
19
+ f"/api/client/servers/{server_id}/schedules/{schedule_id}",
20
+ json=payload
21
+ )
22
+
23
+ def delete(self, server_id, schedule_id):
24
+ return self.panel.delete(f"/api/client/servers/{server_id}/schedules/{schedule_id}")
25
+
26
+ def run(self, server_id, schedule_id):
27
+ return self.panel.post(
28
+ f"/api/client/servers/{server_id}/schedules/{schedule_id}/execute"
29
+ )
@@ -0,0 +1,16 @@
1
+ class StartupAPI:
2
+ """
3
+ Raw startup variable endpoints.
4
+ """
5
+
6
+ def __init__(self, panel):
7
+ self.panel = panel
8
+
9
+ def list(self, server_id):
10
+ return self.panel.get(f"/api/client/servers/{server_id}/startup")
11
+
12
+ def update(self, server_id, key, value):
13
+ return self.panel.post(
14
+ f"/api/client/servers/{server_id}/startup/variable",
15
+ json={"key": key, "value": value}
16
+ )
@@ -2,7 +2,7 @@
2
2
 
3
3
  from dataclasses import dataclass, field
4
4
  from pathlib import Path
5
- from hungerlib.colormap import *
5
+ from hungerlib.addons.colormap import *
6
6
 
7
7
  @dataclass
8
8
  class Config:
@@ -0,0 +1,78 @@
1
+ import requests
2
+
3
+ from hungerlib.api.schedule import ScheduleAPI
4
+ from hungerlib.api.filemanager import FileManagerAPI
5
+ from hungerlib.api.backups import BackupsAPI
6
+ from hungerlib.api.databases import DatabasesAPI
7
+ from hungerlib.api.startup import StartupAPI
8
+
9
+
10
+ class Panel:
11
+ """
12
+ High-level panel object.
13
+ Contains only:
14
+ - HTTP helpers
15
+ - authentication
16
+ - panel-wide utilities
17
+ - API module accessors
18
+ """
19
+
20
+ def __init__(self, name, url, api_key):
21
+ self.name = name
22
+ self.url = url.rstrip("/")
23
+ self.api_key = api_key
24
+
25
+ # API modules
26
+ self.schedules = ScheduleAPI(self)
27
+ self.files = FileManagerAPI(self)
28
+ self.backups = BackupsAPI(self)
29
+ self.databases = DatabasesAPI(self)
30
+ self.startup = StartupAPI(self)
31
+
32
+ def __str__(self):
33
+ return f"Panel name: {self.name}\nURL: {self.url}\nAPI key: {self.api_key}"
34
+
35
+ # ------------------------------------------------------------
36
+ # HTTP CORE
37
+ # ------------------------------------------------------------
38
+ @property
39
+ def headers(self):
40
+ return {
41
+ "Authorization": f"Bearer {self.api_key}",
42
+ "Accept": "application/json",
43
+ "Content-Type": "application/json",
44
+ }
45
+
46
+ def get(self, path, timeout=5):
47
+ return requests.get(f"{self.url}{path}", headers=self.headers, timeout=timeout)
48
+
49
+ def post(self, path, json=None, timeout=5):
50
+ return requests.post(f"{self.url}{path}", headers=self.headers, json=json, timeout=timeout)
51
+
52
+ def delete(self, path, timeout=5):
53
+ return requests.delete(f"{self.url}{path}", headers=self.headers, timeout=timeout)
54
+
55
+ def patch(self, path, json=None, timeout=5):
56
+ return requests.patch(f"{self.url}{path}", headers=self.headers, json=json, timeout=timeout)
57
+
58
+ # Special-case raw upload (multipart)
59
+ def _raw_upload(self, url, file_data):
60
+ return requests.post(
61
+ f"{self.url}{url}",
62
+ headers={"Authorization": f"Bearer {self.api_key}"},
63
+ files=file_data
64
+ )
65
+
66
+ # ------------------------------------------------------------
67
+ # PANEL HEALTH
68
+ # ------------------------------------------------------------
69
+ def ping(self):
70
+ try:
71
+ r = self.get("/api/client")
72
+ return r.status_code == 200
73
+ except:
74
+ return False
75
+
76
+ def validateAPI(self):
77
+ r = self.get("/api/client/account")
78
+ return r.status_code == 200
@@ -135,95 +135,95 @@ class GenericServer:
135
135
  # ============================================================
136
136
 
137
137
  def listFiles(self, directory="/"):
138
- return self.panel.fm_list(self.server_id, directory)
138
+ return self.panel.files.list(self.server_id, directory)
139
139
 
140
140
  def downloadFile(self, path):
141
- return self.panel.fm_download(self.server_id, path)
141
+ return self.panel.files.download(self.server_id, path)
142
142
 
143
143
  def uploadFile(self, directory, file_data):
144
- return self.panel.fm_upload(self.server_id, directory, file_data)
144
+ return self.panel.files.upload(self.server_id, directory, file_data)
145
145
 
146
146
  def deleteFiles(self, root, files):
147
- return self.panel.fm_delete(self.server_id, root, files)
147
+ return self.panel.files.delete(self.server_id, root, files)
148
148
 
149
149
  def renameFiles(self, root, files):
150
- return self.panel.fm_rename(self.server_id, root, files)
150
+ return self.panel.files.rename(self.server_id, root, files)
151
151
 
152
152
  def copyFiles(self, root, files):
153
- return self.panel.fm_copy(self.server_id, root, files)
153
+ return self.panel.files.copy(self.server_id, root, files)
154
154
 
155
155
  def moveFiles(self, root, files):
156
- return self.panel.fm_move(self.server_id, root, files)
156
+ return self.panel.files.move(self.server_id, root, files)
157
157
 
158
158
  def createFolder(self, directory, name):
159
- return self.panel.fm_create_folder(self.server_id, directory, name)
159
+ return self.panel.files.create_folder(self.server_id, directory, name)
160
160
 
161
161
  def compress(self, root, files):
162
- return self.panel.fm_compress(self.server_id, root, files)
162
+ return self.panel.files.compress(self.server_id, root, files)
163
163
 
164
164
  def decompress(self, file_path):
165
- return self.panel.fm_decompress(self.server_id, file_path)
165
+ return self.panel.files.decompress(self.server_id, file_path)
166
166
 
167
167
  # ============================================================
168
168
  # BACKUPS
169
169
  # ============================================================
170
170
 
171
171
  def listBackups(self):
172
- return self.panel.backups_list(self.server_id)
172
+ return self.panel.backups.list(self.server_id)
173
173
 
174
174
  def createBackup(self, name="Auto Backup"):
175
- return self.panel.backups_create(self.server_id, name)
175
+ return self.panel.backups.create(self.server_id, name)
176
176
 
177
177
  def deleteBackup(self, backup_id):
178
- return self.panel.backups_delete(self.server_id, backup_id)
178
+ return self.panel.backups.delete(self.server_id, backup_id)
179
179
 
180
180
  def downloadBackup(self, backup_id):
181
- return self.panel.backups_download(self.server_id, backup_id)
181
+ return self.panel.backups.download(self.server_id, backup_id)
182
182
 
183
183
  # ============================================================
184
184
  # DATABASES
185
185
  # ============================================================
186
186
 
187
187
  def listDatabases(self):
188
- return self.panel.db_list(self.server_id)
188
+ return self.panel.databases.list(self.server_id)
189
189
 
190
190
  def createDatabase(self, name, remote="%", host=None):
191
- return self.panel.db_create(self.server_id, name, remote, host)
191
+ return self.panel.databases.create(self.server_id, name, remote, host)
192
192
 
193
193
  def rotateDatabasePassword(self, db_id):
194
- return self.panel.db_rotate_password(self.server_id, db_id)
194
+ return self.panel.databases.rotate_password(self.server_id, db_id)
195
195
 
196
196
  def deleteDatabase(self, db_id):
197
- return self.panel.db_delete(self.server_id, db_id)
197
+ return self.panel.databases.delete(self.server_id, db_id)
198
198
 
199
199
  # ============================================================
200
200
  # STARTUP VARIABLES
201
201
  # ============================================================
202
202
 
203
203
  def getStartupVariables(self):
204
- return self.panel.startup_list(self.server_id)
204
+ return self.panel.startup.list(self.server_id)
205
205
 
206
206
  def updateStartupVariable(self, key, value):
207
- return self.panel.startup_update(self.server_id, key, value)
207
+ return self.panel.startup.update(self.server_id, key, value)
208
208
 
209
209
  # ============================================================
210
210
  # SCHEDULES
211
211
  # ============================================================
212
212
 
213
213
  def listSchedules(self):
214
- return self.panel.schedules_list(self.server_id)
214
+ return self.panel.schedules.list(self.server_id)
215
215
 
216
216
  def createSchedule(self, payload):
217
- return self.panel.schedules_create(self.server_id, payload)
217
+ return self.panel.schedules.create(self.server_id, payload)
218
218
 
219
219
  def updateSchedule(self, schedule_id, payload):
220
- return self.panel.schedules_update(self.server_id, schedule_id, payload)
220
+ return self.panel.schedules.update(self.server_id, schedule_id, payload)
221
221
 
222
222
  def deleteSchedule(self, schedule_id):
223
- return self.panel.schedules_delete(self.server_id, schedule_id)
223
+ return self.panel.schedules.delete(self.server_id, schedule_id)
224
224
 
225
225
  def runSchedule(self, schedule_id):
226
- return self.panel.schedules_run(self.server_id, schedule_id)
226
+ return self.panel.schedules.run(self.server_id, schedule_id)
227
227
 
228
228
  # ============================================================
229
229
  # HEALTH SNAPSHOT
@@ -238,4 +238,4 @@ class GenericServer:
238
238
  "network_out": self.getNetworkOut(),
239
239
  "uptime": self.getUptime(),
240
240
  "status": self.getStatus()
241
- }
241
+ }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hungerlib
3
- Version: 1.3.1.dev0
3
+ Version: 2.dev0
4
4
  Summary: Powerful automation library for Pterodactyl.
5
5
  Author: iFamished
6
6
  License: MIT
@@ -15,6 +15,12 @@ src/hungerlib.egg-info/top_level.txt
15
15
  src/hungerlib/addons/_generic.py
16
16
  src/hungerlib/addons/colormap.py
17
17
  src/hungerlib/addons/minecraft.py
18
+ src/hungerlib/api/__init__.py
19
+ src/hungerlib/api/backups.py
20
+ src/hungerlib/api/databases.py
21
+ src/hungerlib/api/filemanager.py
22
+ src/hungerlib/api/schedule.py
23
+ src/hungerlib/api/startup.py
18
24
  src/hungerlib/servers/_generic.py
19
25
  src/hungerlib/servers/minecraft.py
20
26
  src/tests/test_imports.py
@@ -1,69 +0,0 @@
1
- from importlib.metadata import version as _pkg_version, PackageNotFoundError
2
- import importlib
3
-
4
- try:
5
- __version__ = _pkg_version("hungerlib")
6
- except PackageNotFoundError:
7
- __version__ = "0.0.0"
8
-
9
-
10
- # api map
11
- # name > (module_path, attribute_name or None)
12
- _EXPORTS = {
13
- # modules
14
- "config": ("config", None),
15
- "logger": ("logger", None),
16
- "mchelpers": ("mchelpers", None),
17
- "panel": ("panel", None),
18
- "scheduler": ("scheduler", None),
19
-
20
- # addon modules
21
- "genericAddons": ('addons._generic', None),
22
- 'minecraftAddons': ('addons.minecraft', None),
23
- "colormap": ("addons.colormap", None),
24
-
25
- # classes / functions
26
- "Panel": ("panel", "Panel"),
27
- "GenericServer": ("servers._generic", "GenericServer"),
28
- "MinecraftServer": ("servers.minecraft", "MinecraftServer"),
29
- "DefaultConfig": ("config", "DefaultConfig"),
30
- "HungerLogger": ("logger", "HungerLogger"),
31
- "MCHelpers": ("mchelpers", "MCHelpers"),
32
-
33
- # schedulers
34
- "snapSchedule": ("scheduler", "snapSchedule"),
35
- "secsUntil": ("scheduler", "secsUntil"),
36
- "minsUntil": ("scheduler", "minsUntil"),
37
-
38
- # addons
39
- "runCountdownEvents": ('addons._generic', 'runCountdownEvents'),
40
- 'validateAll': ('addons._generic', 'validateAll'),
41
- "waitForOnline": ("addons._generic", 'waitForOnline'),
42
- "waitForOffline": ("addons._generic", 'waitForOffline'),
43
- 'checkLag': ('addons.minecraft', 'checkLag'),
44
- "MC_COLOR_MAP": ("addons.colormap", "MC_COLOR_MAP"),
45
- "ASCI_COLOR_MAP": ("addons.colormap", "ASCI_COLOR_MAP")
46
-
47
- }
48
-
49
-
50
- __all__ = list(_EXPORTS.keys()) + ["__version__"]
51
-
52
-
53
- # lazy loader
54
- def __getattr__(name):
55
- if name not in _EXPORTS:
56
- raise AttributeError(f"module 'hungerlib' has no attribute '{name}'")
57
-
58
- module_name, attr = _EXPORTS[name]
59
- module = importlib.import_module(f"hungerlib.{module_name}")
60
-
61
- # If exporting the module itself
62
- if attr is None:
63
- globals()[name] = module
64
- return module
65
-
66
- # If exporting a specific attribute
67
- value = getattr(module, attr)
68
- globals()[name] = value
69
- return value
@@ -1,168 +0,0 @@
1
- # The Panel class and it's methods
2
- import requests
3
-
4
- class Panel:
5
- def __init__(self, name, url, api_key):
6
- self.name = name
7
- self.url = url.rstrip("/")
8
- self.api_key = api_key
9
- '''The class that initiates the Panel'''
10
-
11
- def __str__(self):
12
- return f'Panel name: {self.name}\nURL: {self.url}\nAPI key: {self.api_key}'
13
-
14
- @property
15
- def headers(self):
16
- return {
17
- "Authorization": f"Bearer {self.api_key}",
18
- "Accept": "application/json",
19
- "Content-Type": "application/json"
20
- }
21
-
22
- # -----------------------------
23
- # BASIC HTTP
24
- # -----------------------------
25
- def get(self, path, timeout=5):
26
- return requests.get(f"{self.url}{path}", headers=self.headers, timeout=timeout)
27
-
28
- def post(self, path, json=None, timeout=5):
29
- return requests.post(f"{self.url}{path}", headers=self.headers, json=json, timeout=timeout)
30
-
31
- def delete(self, path, timeout=5):
32
- return requests.delete(f"{self.url}{path}", headers=self.headers, timeout=timeout)
33
-
34
- def patch(self, path, json=None, timeout=5):
35
- return requests.patch(f"{self.url}{path}", headers=self.headers, json=json, timeout=timeout)
36
-
37
- def ping(self):
38
- '''Attempts to ping the panel'''
39
- try:
40
- r = self.get("/api/client")
41
- return r.status_code == 200
42
- except:
43
- return False
44
-
45
- def validateAPI(self):
46
- '''Ensures the provided API token is valid'''
47
- r = self.get("/api/client/account")
48
- return r.status_code == 200
49
-
50
- # ============================================================
51
- # FILE MANAGER API (RAW ENDPOINTS)
52
- # ============================================================
53
-
54
- def fm_list(self, server_id, directory="/"):
55
- return self.get(f"/api/client/servers/{server_id}/files/list?directory={directory}")
56
-
57
- def fm_download(self, server_id, file_path):
58
- return self.get(f"/api/client/servers/{server_id}/files/download?file={file_path}")
59
-
60
- def fm_upload(self, server_id, directory, file_data):
61
- # file_data must be multipart/form-data
62
- return requests.post(
63
- f"{self.url}/api/client/servers/{server_id}/files/upload",
64
- headers={"Authorization": f"Bearer {self.api_key}"},
65
- files=file_data
66
- )
67
-
68
- def fm_delete(self, server_id, root, files):
69
- payload = {"root": root, "files": files}
70
- return self.post(f"/api/client/servers/{server_id}/files/delete", json=payload)
71
-
72
- def fm_rename(self, server_id, root, files):
73
- payload = {"root": root, "files": files}
74
- return self.post(f"/api/client/servers/{server_id}/files/rename", json=payload)
75
-
76
- def fm_copy(self, server_id, root, files):
77
- payload = {"root": root, "files": files}
78
- return self.post(f"/api/client/servers/{server_id}/files/copy", json=payload)
79
-
80
- def fm_move(self, server_id, root, files):
81
- payload = {"root": root, "files": files}
82
- return self.post(f"/api/client/servers/{server_id}/files/move", json=payload)
83
-
84
- def fm_create_folder(self, server_id, directory, name):
85
- payload = {"root": directory, "name": name}
86
- return self.post(f"/api/client/servers/{server_id}/files/create-folder", json=payload)
87
-
88
- def fm_compress(self, server_id, root, files):
89
- payload = {"root": root, "files": files}
90
- return self.post(f"/api/client/servers/{server_id}/files/compress", json=payload)
91
-
92
- def fm_decompress(self, server_id, file_path):
93
- payload = {"file": file_path}
94
- return self.post(f"/api/client/servers/{server_id}/files/decompress", json=payload)
95
-
96
- # ============================================================
97
- # BACKUPS API
98
- # ============================================================
99
-
100
- def backups_list(self, server_id):
101
- return self.get(f"/api/client/servers/{server_id}/backups")
102
-
103
- def backups_create(self, server_id, name="Auto Backup"):
104
- payload = {"name": name}
105
- return self.post(f"/api/client/servers/{server_id}/backups", json=payload)
106
-
107
- def backups_delete(self, server_id, backup_id):
108
- return self.delete(f"/api/client/servers/{server_id}/backups/{backup_id}")
109
-
110
- def backups_download(self, server_id, backup_id):
111
- return self.get(f"/api/client/servers/{server_id}/backups/{backup_id}/download")
112
-
113
- # ============================================================
114
- # DATABASES API
115
- # ============================================================
116
-
117
- def db_list(self, server_id):
118
- return self.get(f"/api/client/servers/{server_id}/databases")
119
-
120
- def db_create(self, server_id, name, remote="%", host=None):
121
- payload = {"database": name, "remote": remote}
122
- if host:
123
- payload["host"] = host
124
- return self.post(f"/api/client/servers/{server_id}/databases", json=payload)
125
-
126
- def db_rotate_password(self, server_id, db_id):
127
- return self.post(f"/api/client/servers/{server_id}/databases/{db_id}/rotate-password")
128
-
129
- def db_delete(self, server_id, db_id):
130
- return self.delete(f"/api/client/servers/{server_id}/databases/{db_id}")
131
-
132
- # ============================================================
133
- # STARTUP VARIABLES API
134
- # ============================================================
135
-
136
- def startup_list(self, server_id):
137
- return self.get(f"/api/client/servers/{server_id}/startup")
138
-
139
- def startup_update(self, server_id, key, value):
140
- payload = {"key": key, "value": value}
141
- return self.post(f"/api/client/servers/{server_id}/startup/variable", json=payload)
142
-
143
- # ============================================================
144
- # SCHEDULES API
145
- # ============================================================
146
-
147
- def schedules_list(self, server_id):
148
- return self.get(f"/api/client/servers/{server_id}/schedules")
149
-
150
- def schedules_create(self, server_id, payload):
151
- return self.post(f"/api/client/servers/{server_id}/schedules", json=payload)
152
-
153
- def schedules_update(self, server_id, schedule_id, payload):
154
- return self.patch(f"/api/client/servers/{server_id}/schedules/{schedule_id}", json=payload)
155
-
156
- def schedules_delete(self, server_id, schedule_id):
157
- return self.delete(f"/api/client/servers/{server_id}/schedules/{schedule_id}")
158
-
159
- def schedules_run(self, server_id, schedule_id):
160
- return self.post(f"/api/client/servers/{server_id}/schedules/{schedule_id}/execute")
161
-
162
- # ============================================================
163
- # COMMAND API
164
- # ============================================================
165
-
166
- def sendCommand(self, server_id, command):
167
- payload = {"command": command}
168
- return self.post(f"/api/client/servers/{server_id}/command", json=payload)
File without changes
File without changes
File without changes