hungerlib 1.2.2b0__tar.gz → 1.3.1.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.
- {hungerlib-1.2.2b0/src/hungerlib.egg-info → hungerlib-1.3.1.dev0}/PKG-INFO +1 -1
- {hungerlib-1.2.2b0 → hungerlib-1.3.1.dev0}/pyproject.toml +1 -1
- {hungerlib-1.2.2b0 → hungerlib-1.3.1.dev0}/src/hungerlib/__init__.py +14 -12
- hungerlib-1.3.1.dev0/src/hungerlib/addons/_generic.py +102 -0
- hungerlib-1.3.1.dev0/src/hungerlib/addons/minecraft.py +25 -0
- {hungerlib-1.2.2b0 → hungerlib-1.3.1.dev0/src/hungerlib.egg-info}/PKG-INFO +1 -1
- {hungerlib-1.2.2b0 → hungerlib-1.3.1.dev0}/src/hungerlib.egg-info/SOURCES.txt +3 -2
- hungerlib-1.2.2b0/src/hungerlib/utils.py +0 -72
- {hungerlib-1.2.2b0 → hungerlib-1.3.1.dev0}/LICENSE +0 -0
- {hungerlib-1.2.2b0 → hungerlib-1.3.1.dev0}/README.md +0 -0
- {hungerlib-1.2.2b0 → hungerlib-1.3.1.dev0}/setup.cfg +0 -0
- {hungerlib-1.2.2b0/src/hungerlib → hungerlib-1.3.1.dev0/src/hungerlib/addons}/colormap.py +0 -0
- {hungerlib-1.2.2b0 → hungerlib-1.3.1.dev0}/src/hungerlib/config.py +0 -0
- {hungerlib-1.2.2b0 → hungerlib-1.3.1.dev0}/src/hungerlib/logger.py +0 -0
- {hungerlib-1.2.2b0 → hungerlib-1.3.1.dev0}/src/hungerlib/mchelpers.py +0 -0
- {hungerlib-1.2.2b0 → hungerlib-1.3.1.dev0}/src/hungerlib/panel.py +0 -0
- {hungerlib-1.2.2b0 → hungerlib-1.3.1.dev0}/src/hungerlib/scheduler.py +0 -0
- {hungerlib-1.2.2b0 → hungerlib-1.3.1.dev0}/src/hungerlib/servers/_generic.py +0 -0
- {hungerlib-1.2.2b0 → hungerlib-1.3.1.dev0}/src/hungerlib/servers/minecraft.py +0 -0
- {hungerlib-1.2.2b0 → hungerlib-1.3.1.dev0}/src/hungerlib.egg-info/dependency_links.txt +0 -0
- {hungerlib-1.2.2b0 → hungerlib-1.3.1.dev0}/src/hungerlib.egg-info/requires.txt +0 -0
- {hungerlib-1.2.2b0 → hungerlib-1.3.1.dev0}/src/hungerlib.egg-info/top_level.txt +0 -0
- {hungerlib-1.2.2b0 → hungerlib-1.3.1.dev0}/src/tests/test_imports.py +0 -0
|
@@ -10,14 +10,17 @@ except PackageNotFoundError:
|
|
|
10
10
|
# api map
|
|
11
11
|
# name > (module_path, attribute_name or None)
|
|
12
12
|
_EXPORTS = {
|
|
13
|
-
# modules
|
|
14
|
-
"colormap": ("colormap", None),
|
|
13
|
+
# modules
|
|
15
14
|
"config": ("config", None),
|
|
16
15
|
"logger": ("logger", None),
|
|
17
16
|
"mchelpers": ("mchelpers", None),
|
|
18
17
|
"panel": ("panel", None),
|
|
19
18
|
"scheduler": ("scheduler", None),
|
|
20
|
-
|
|
19
|
+
|
|
20
|
+
# addon modules
|
|
21
|
+
"genericAddons": ('addons._generic', None),
|
|
22
|
+
'minecraftAddons': ('addons.minecraft', None),
|
|
23
|
+
"colormap": ("addons.colormap", None),
|
|
21
24
|
|
|
22
25
|
# classes / functions
|
|
23
26
|
"Panel": ("panel", "Panel"),
|
|
@@ -32,15 +35,14 @@ _EXPORTS = {
|
|
|
32
35
|
"secsUntil": ("scheduler", "secsUntil"),
|
|
33
36
|
"minsUntil": ("scheduler", "minsUntil"),
|
|
34
37
|
|
|
35
|
-
#
|
|
36
|
-
"
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
-
"waitForOffline": ("utils", 'waitForOffline')
|
|
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")
|
|
44
46
|
|
|
45
47
|
}
|
|
46
48
|
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import time
|
|
2
|
+
from datetime import datetime
|
|
3
|
+
|
|
4
|
+
# Special use case helper functions that operate on server objects
|
|
5
|
+
def runCountdownEvents(
|
|
6
|
+
target_time,
|
|
7
|
+
minute_callbacks=None,
|
|
8
|
+
second_callbacks=None,
|
|
9
|
+
tick_interval=1
|
|
10
|
+
):
|
|
11
|
+
"""
|
|
12
|
+
A simple, readable countdown engine.
|
|
13
|
+
|
|
14
|
+
- Counts down until `target_time`
|
|
15
|
+
- When the countdown hits a configured minute mark, it runs that callback
|
|
16
|
+
- When the countdown hits a configured second mark, it runs that callback
|
|
17
|
+
|
|
18
|
+
Parameters:
|
|
19
|
+
target_time (datetime):
|
|
20
|
+
The time we are counting down to.
|
|
21
|
+
|
|
22
|
+
minute_callbacks (dict[int, callable]):
|
|
23
|
+
Example: {5: func, 1: func}
|
|
24
|
+
|
|
25
|
+
second_callbacks (dict[int, callable]):
|
|
26
|
+
Example: {10: func, 5: func, 1: func}
|
|
27
|
+
|
|
28
|
+
tick_interval (int):
|
|
29
|
+
How often to check the countdown (in seconds).
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
# Default to empty dicts if none provided
|
|
33
|
+
minute_callbacks = minute_callbacks or {}
|
|
34
|
+
second_callbacks = second_callbacks or {}
|
|
35
|
+
|
|
36
|
+
# Track which events we've already fired
|
|
37
|
+
fired_minutes = set()
|
|
38
|
+
fired_seconds = set()
|
|
39
|
+
|
|
40
|
+
while True:
|
|
41
|
+
now = datetime.now()
|
|
42
|
+
seconds_left = int((target_time - now).total_seconds())
|
|
43
|
+
minutes_left = seconds_left // 60
|
|
44
|
+
|
|
45
|
+
# Countdown finished
|
|
46
|
+
if seconds_left <= 0:
|
|
47
|
+
return
|
|
48
|
+
|
|
49
|
+
# Fire minute-based events
|
|
50
|
+
if minutes_left in minute_callbacks and minutes_left not in fired_minutes:
|
|
51
|
+
fired_minutes.add(minutes_left)
|
|
52
|
+
minute_callbacks[minutes_left]()
|
|
53
|
+
|
|
54
|
+
# Fire second-based events
|
|
55
|
+
if seconds_left in second_callbacks and seconds_left not in fired_seconds:
|
|
56
|
+
fired_seconds.add(seconds_left)
|
|
57
|
+
second_callbacks[seconds_left]()
|
|
58
|
+
|
|
59
|
+
time.sleep(tick_interval)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def validateAll(panel, server):
|
|
63
|
+
"""
|
|
64
|
+
Validate panel connectivity, API access, and server running state.
|
|
65
|
+
"""
|
|
66
|
+
return (
|
|
67
|
+
panel.ping() is True and
|
|
68
|
+
panel.validateAPI() is True and
|
|
69
|
+
server.getStatus() == "running"
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
# ============================================================
|
|
74
|
+
# SERVER STATE HELPERS
|
|
75
|
+
# ============================================================
|
|
76
|
+
|
|
77
|
+
def waitForOnline(server, timeout=60, interval=2):
|
|
78
|
+
"""
|
|
79
|
+
Wait until the server reports status 'running'.
|
|
80
|
+
Returns True if online before timeout.
|
|
81
|
+
"""
|
|
82
|
+
elapsed = 0
|
|
83
|
+
while elapsed < timeout:
|
|
84
|
+
if server.isOnline():
|
|
85
|
+
return True
|
|
86
|
+
time.sleep(interval)
|
|
87
|
+
elapsed += interval
|
|
88
|
+
return False
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def waitForOffline(server, timeout=60, interval=2):
|
|
92
|
+
"""
|
|
93
|
+
Wait until the server reports status 'offline'.
|
|
94
|
+
Returns True if offline before timeout.
|
|
95
|
+
"""
|
|
96
|
+
elapsed = 0
|
|
97
|
+
while elapsed < timeout:
|
|
98
|
+
if server.isOffline():
|
|
99
|
+
return True
|
|
100
|
+
time.sleep(interval)
|
|
101
|
+
elapsed += interval
|
|
102
|
+
return False
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
def checkLag(server, ram, cpu, nwi, nwo, tps):
|
|
2
|
+
"""
|
|
3
|
+
Pure lag check.
|
|
4
|
+
Returns a tuple: (lag_detected: bool, reasons: list[str])
|
|
5
|
+
"""
|
|
6
|
+
reasons = []
|
|
7
|
+
|
|
8
|
+
currentRAM = server.getRAM(gb=True)
|
|
9
|
+
currentCPU = server.getCPU()
|
|
10
|
+
currentNWI = server.getNetworkIn(gb=True)
|
|
11
|
+
currentNWO = server.getNetworkOut(gb=True)
|
|
12
|
+
currentTPS = server.getTPS() if hasattr(server, "getTPS") else None
|
|
13
|
+
|
|
14
|
+
if currentRAM is not None and currentRAM >= ram:
|
|
15
|
+
reasons.append(f"RAM: {currentRAM}GB")
|
|
16
|
+
if currentCPU is not None and currentCPU >= cpu:
|
|
17
|
+
reasons.append(f"CPU: {currentCPU}%")
|
|
18
|
+
if currentNWI is not None and currentNWI >= nwi:
|
|
19
|
+
reasons.append(f"Network Inbound: {currentNWI}GB")
|
|
20
|
+
if currentNWO is not None and currentNWO >= nwo:
|
|
21
|
+
reasons.append(f"Network Outbound: {currentNWO}GB")
|
|
22
|
+
if currentTPS is not None and currentTPS <= tps:
|
|
23
|
+
reasons.append(f"TPS: {currentTPS}")
|
|
24
|
+
|
|
25
|
+
return (len(reasons) > 0, reasons)
|
|
@@ -2,18 +2,19 @@ LICENSE
|
|
|
2
2
|
README.md
|
|
3
3
|
pyproject.toml
|
|
4
4
|
src/hungerlib/__init__.py
|
|
5
|
-
src/hungerlib/colormap.py
|
|
6
5
|
src/hungerlib/config.py
|
|
7
6
|
src/hungerlib/logger.py
|
|
8
7
|
src/hungerlib/mchelpers.py
|
|
9
8
|
src/hungerlib/panel.py
|
|
10
9
|
src/hungerlib/scheduler.py
|
|
11
|
-
src/hungerlib/utils.py
|
|
12
10
|
src/hungerlib.egg-info/PKG-INFO
|
|
13
11
|
src/hungerlib.egg-info/SOURCES.txt
|
|
14
12
|
src/hungerlib.egg-info/dependency_links.txt
|
|
15
13
|
src/hungerlib.egg-info/requires.txt
|
|
16
14
|
src/hungerlib.egg-info/top_level.txt
|
|
15
|
+
src/hungerlib/addons/_generic.py
|
|
16
|
+
src/hungerlib/addons/colormap.py
|
|
17
|
+
src/hungerlib/addons/minecraft.py
|
|
17
18
|
src/hungerlib/servers/_generic.py
|
|
18
19
|
src/hungerlib/servers/minecraft.py
|
|
19
20
|
src/tests/test_imports.py
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import time
|
|
2
|
-
|
|
3
|
-
# Special use case helper functions that operate on server objects
|
|
4
|
-
|
|
5
|
-
def checkLag(server, ram, cpu, nwi, nwo, tps):
|
|
6
|
-
"""
|
|
7
|
-
Pure lag check.
|
|
8
|
-
Returns a tuple: (lag_detected: bool, reasons: list[str])
|
|
9
|
-
"""
|
|
10
|
-
reasons = []
|
|
11
|
-
|
|
12
|
-
currentRAM = server.getRAM(gb=True)
|
|
13
|
-
currentCPU = server.getCPU()
|
|
14
|
-
currentNWI = server.getNetworkIn(gb=True)
|
|
15
|
-
currentNWO = server.getNetworkOut(gb=True)
|
|
16
|
-
currentTPS = server.getTPS() if hasattr(server, "getTPS") else None
|
|
17
|
-
|
|
18
|
-
if currentRAM is not None and currentRAM >= ram:
|
|
19
|
-
reasons.append(f"RAM: {currentRAM}GB")
|
|
20
|
-
if currentCPU is not None and currentCPU >= cpu:
|
|
21
|
-
reasons.append(f"CPU: {currentCPU}%")
|
|
22
|
-
if currentNWI is not None and currentNWI >= nwi:
|
|
23
|
-
reasons.append(f"Network Inbound: {currentNWI}GB")
|
|
24
|
-
if currentNWO is not None and currentNWO >= nwo:
|
|
25
|
-
reasons.append(f"Network Outbound: {currentNWO}GB")
|
|
26
|
-
if currentTPS is not None and currentTPS <= tps:
|
|
27
|
-
reasons.append(f"TPS: {currentTPS}")
|
|
28
|
-
|
|
29
|
-
return (len(reasons) > 0, reasons)
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
def validateAll(panel, server):
|
|
33
|
-
"""
|
|
34
|
-
Validate panel connectivity, API access, and server running state.
|
|
35
|
-
"""
|
|
36
|
-
return (
|
|
37
|
-
panel.ping() is True and
|
|
38
|
-
panel.validateAPI() is True and
|
|
39
|
-
server.getStatus() == "running"
|
|
40
|
-
)
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
# ============================================================
|
|
44
|
-
# SERVER STATE HELPERS
|
|
45
|
-
# ============================================================
|
|
46
|
-
|
|
47
|
-
def waitForOnline(server, timeout=60, interval=2):
|
|
48
|
-
"""
|
|
49
|
-
Wait until the server reports status 'running'.
|
|
50
|
-
Returns True if online before timeout.
|
|
51
|
-
"""
|
|
52
|
-
elapsed = 0
|
|
53
|
-
while elapsed < timeout:
|
|
54
|
-
if server.isOnline():
|
|
55
|
-
return True
|
|
56
|
-
time.sleep(interval)
|
|
57
|
-
elapsed += interval
|
|
58
|
-
return False
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
def waitForOffline(server, timeout=60, interval=2):
|
|
62
|
-
"""
|
|
63
|
-
Wait until the server reports status 'offline'.
|
|
64
|
-
Returns True if offline before timeout.
|
|
65
|
-
"""
|
|
66
|
-
elapsed = 0
|
|
67
|
-
while elapsed < timeout:
|
|
68
|
-
if server.isOffline():
|
|
69
|
-
return True
|
|
70
|
-
time.sleep(interval)
|
|
71
|
-
elapsed += interval
|
|
72
|
-
return False
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|