hungerlib 2.19.dev1__tar.gz → 3.0.dev2__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 (31) hide show
  1. {hungerlib-2.19.dev1/src/hungerlib.egg-info → hungerlib-3.0.dev2}/PKG-INFO +1 -1
  2. {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/pyproject.toml +1 -1
  3. {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/__init__.py +2 -2
  4. hungerlib-3.0.dev2/src/hungerlib/messagerouter.py +139 -0
  5. {hungerlib-2.19.dev1 → hungerlib-3.0.dev2/src/hungerlib.egg-info}/PKG-INFO +1 -1
  6. {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib.egg-info/SOURCES.txt +1 -1
  7. hungerlib-2.19.dev1/src/hungerlib/logger.py +0 -124
  8. {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/LICENSE +0 -0
  9. {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/README.md +0 -0
  10. {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/setup.cfg +0 -0
  11. {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/addons/__init__.py +0 -0
  12. {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/addons/colormap.py +0 -0
  13. {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/addons/configloader.py +0 -0
  14. {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/addons/mchelpers.py +0 -0
  15. {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/addons/scheduler.py +0 -0
  16. {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/addons/snapshot.py +0 -0
  17. {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/addons/utils.py +0 -0
  18. {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/api/__init__.py +0 -0
  19. {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/api/backups.py +0 -0
  20. {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/api/command.py +0 -0
  21. {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/api/databases.py +0 -0
  22. {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/api/filemanager.py +0 -0
  23. {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/api/schedule.py +0 -0
  24. {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/api/startup.py +0 -0
  25. {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/panel.py +0 -0
  26. {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/servers/__init__.py +0 -0
  27. {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/servers/generic.py +0 -0
  28. {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/servers/minecraft.py +0 -0
  29. {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib.egg-info/dependency_links.txt +0 -0
  30. {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib.egg-info/requires.txt +0 -0
  31. {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hungerlib
3
- Version: 2.19.dev1
3
+ Version: 3.0.dev2
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 = "2.19.dev1"
10
+ version = "3.0.dev2"
11
11
  description = "Powerful automation library for Pterodactyl."
12
12
  readme = "README.md"
13
13
  requires-python = ">=3.9"
@@ -8,7 +8,7 @@ except PackageNotFoundError:
8
8
 
9
9
  # --- Core modules ---
10
10
  from .panel import Panel
11
- from .logger import HungerLogger
11
+ from .messagerouter import MessageRouter
12
12
 
13
13
  # --- API endpoints ---
14
14
  from .api.schedule import ScheduleAPI
@@ -22,7 +22,7 @@ __all__ = [
22
22
 
23
23
  # core utilities
24
24
  "Panel",
25
- "HungerLogger",
25
+ "MessageRouter",
26
26
 
27
27
  # API endpoints
28
28
  "ScheduleAPI",
@@ -0,0 +1,139 @@
1
+ import logging
2
+ from pathlib import Path
3
+ from datetime import datetime
4
+ from hungerlib.addons import clrz, ASCII_COLOR_MAP, MC_COLOR_MAP
5
+
6
+
7
+ class MessageRouter:
8
+ def __init__(
9
+ self,
10
+ name,
11
+ server,
12
+ log_path,
13
+ formatter=None,
14
+ console_backspaces=0,
15
+
16
+ origin_map=ASCII_COLOR_MAP,
17
+ destination_map=MC_COLOR_MAP,
18
+ broadcast_map=MC_COLOR_MAP,
19
+ log_map=None,
20
+
21
+ info_prefix="<white>[INFO]: ",
22
+ warn_prefix="<yellow>[WARN]: ",
23
+ error_prefix="<red>[ERROR]: "
24
+ ):
25
+ self.name = name
26
+ self.server = server
27
+ self.formatter = formatter
28
+
29
+ self.log_path = Path(log_path)
30
+ self.log_path.mkdir(parents=True, exist_ok=True)
31
+
32
+ self.console_backspaces = "\b" * console_backspaces
33
+
34
+ self._origin_map = origin_map
35
+ self._destination_map = destination_map
36
+ self._broadcast_map = broadcast_map
37
+ self._log_map = log_map
38
+
39
+ self.info_prefix = info_prefix
40
+ self.warn_prefix = warn_prefix
41
+ self.error_prefix = error_prefix
42
+
43
+ self.logger = logging.getLogger(name)
44
+ self.logger.setLevel(logging.DEBUG)
45
+ self._init_file_logger()
46
+
47
+ def _init_file_logger(self):
48
+ log_file = self.log_path / f"{self.name}_{datetime.now().strftime('%Y-%m-%d')}.log"
49
+ if not self.logger.handlers:
50
+ handler = logging.FileHandler(str(log_file))
51
+ formatter = logging.Formatter(
52
+ "[%(asctime)s] [%(levelname)s] %(message)s",
53
+ datefmt="%H:%M:%S"
54
+ )
55
+ handler.setFormatter(formatter)
56
+ self.logger.addHandler(handler)
57
+
58
+ # colormap getters/setters
59
+ def setOriginMap(self, cmap): self._origin_map = cmap
60
+ def getOriginMap(self): return self._origin_map
61
+
62
+ def setDestinationMap(self, cmap): self._destination_map = cmap
63
+ def getDestinationMap(self): return self._destination_map
64
+
65
+ def setBroadcastMap(self, cmap): self._broadcast_map = cmap
66
+ def getBroadcastMap(self): return self._broadcast_map
67
+
68
+ def setLogMap(self, cmap): self._log_map = cmap
69
+ def getLogMap(self): return self._log_map
70
+
71
+ # routing primatives
72
+ def origin(self, msg):
73
+ colored = clrz(msg, cmap=self._origin_map)
74
+ print(colored)
75
+
76
+ def destination(self, msg):
77
+ if not self.server or not hasattr(self.server, "_rcon_send"):
78
+ return
79
+ colored = clrz(msg, cmap=self._destination_map)
80
+ self.server._rcon_send(
81
+ f'logtellraw targetless "{self.console_backspaces}{colored}"'
82
+ )
83
+
84
+ def log(self, msg, level="INFO"):
85
+ clean = msg
86
+ if self._log_map:
87
+ for tag in self._log_map.as_dict().keys():
88
+ clean = clean.replace(tag, "")
89
+ {
90
+ "INFO": self.logger.info,
91
+ "WARN": self.logger.warning,
92
+ "ERROR": self.logger.error
93
+ }[level](clean)
94
+
95
+ def broadcast(self, msg):
96
+ if hasattr(self.server, "sendBroadcast"):
97
+ colored = clrz(msg, cmap=self._broadcast_map)
98
+ self.server.sendBroadcast(colored)
99
+
100
+ # high level router
101
+ def say(
102
+ self,
103
+ template,
104
+ level="info",
105
+ origin=True,
106
+ destination=False,
107
+ log=True,
108
+ broadcast=False,
109
+ **fmt
110
+ ):
111
+ if not template:
112
+ return
113
+
114
+ if self.formatter:
115
+ msg = self.formatter(template, **fmt)
116
+ else:
117
+ msg = template
118
+
119
+ if origin:
120
+ self.origin(msg)
121
+
122
+ if destination:
123
+ self.destination(msg)
124
+
125
+ if log:
126
+ self.log(msg, level=level.upper())
127
+
128
+ if broadcast:
129
+ self.broadcast(msg)
130
+
131
+ # level helpers
132
+ def info(self, template, **fmt):
133
+ self.say(self.info_prefix + template, level="info", **fmt)
134
+
135
+ def warn(self, template, **fmt):
136
+ self.say(self.warn_prefix + template, level="warn", **fmt)
137
+
138
+ def error(self, template, **fmt):
139
+ self.say(self.error_prefix + template, level="error", **fmt)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hungerlib
3
- Version: 2.19.dev1
3
+ Version: 3.0.dev2
4
4
  Summary: Powerful automation library for Pterodactyl.
5
5
  Author: iFamished
6
6
  License: MIT
@@ -2,7 +2,7 @@ LICENSE
2
2
  README.md
3
3
  pyproject.toml
4
4
  src/hungerlib/__init__.py
5
- src/hungerlib/logger.py
5
+ src/hungerlib/messagerouter.py
6
6
  src/hungerlib/panel.py
7
7
  src/hungerlib.egg-info/PKG-INFO
8
8
  src/hungerlib.egg-info/SOURCES.txt
@@ -1,124 +0,0 @@
1
- # Logging system
2
-
3
- import os
4
- os.environ['TZ'] = 'America/Chicago'
5
- import time
6
- time.tzset()
7
-
8
- import logging
9
- from pathlib import Path
10
- from datetime import datetime
11
- from hungerlib.addons import ASCII_COLOR_MAP, MC_COLOR_MAP, clrz
12
-
13
-
14
- class HungerLogger:
15
- def __init__(
16
- self,
17
- name,
18
- server,
19
- log_path,
20
- log_destination_method='rcon',
21
-
22
- # backspaces
23
- console_backspaces=0,
24
-
25
- # color mapping
26
- file_color_map=None,
27
- origin_color_map=ASCII_COLOR_MAP,
28
- destination_color_map=ASCII_COLOR_MAP,
29
-
30
- # prefixes
31
- info_prefix='<white>[INFO]: ',
32
- warn_prefix='<yellow>[WARN]: ',
33
- error_prefix='<red>[ERROR]: '
34
- ):
35
-
36
- self.name = name
37
- self.server = server
38
- self.log_path = Path(f'{log_path}')
39
- self.log_destination_method = log_destination_method
40
-
41
- self.console_backspaces = '\b' * console_backspaces
42
-
43
- self.file_color_map = file_color_map
44
- self.origin_color_map = origin_color_map
45
- self.destination_color_map = destination_color_map
46
-
47
- self.info_prefix = info_prefix
48
- self.warn_prefix = warn_prefix
49
- self.error_prefix = error_prefix
50
-
51
- self.prefixes = {
52
- "INFO": self.info_prefix,
53
- "WARN": self.warn_prefix,
54
- "ERROR": self.error_prefix
55
- }
56
-
57
- self.log_path.mkdir(parents=True, exist_ok=True)
58
- self.logger = logging.getLogger(name)
59
- self.logger.setLevel(logging.DEBUG)
60
- self._initializeLogger()
61
-
62
- def _initializeLogger(self):
63
- logFile = self.log_path / f"{self.name}_{datetime.now().strftime('%Y-%m-%d')}.log"
64
-
65
- if not self.logger.handlers:
66
- handler = logging.FileHandler(str(logFile))
67
- formatter = logging.Formatter(
68
- "[%(asctime)s] [%(levelname)s] %(message)s",
69
- datefmt="%H:%M:%S"
70
- )
71
- handler.setFormatter(formatter)
72
- self.logger.addHandler(handler)
73
-
74
- self.logger.info("Logger initialized.")
75
-
76
- def _strip_colors(self, msg):
77
- if not self.file_color_map:
78
- return msg
79
- for tag in self.file_color_map.as_dict().keys():
80
- msg = msg.replace(tag, "")
81
- return msg
82
-
83
- def _destinationLog(self, msg):
84
- if not self.server:
85
- return
86
- if not hasattr(self.server, "_rcon_send"):
87
- return
88
- colored = clrz(msg, cmap=self.destination_color_map)
89
- if self.log_destination_method == 'rcon':
90
- self.server._rcon_send(f'logtellraw targetless \"{self.console_backspaces}{colored}\"')
91
- if self.log_destination_method == 'api':
92
- self.server.sendConsoleCommand(f'logtellraw targetless \"{self.console_backspaces}{colored}\"')
93
-
94
-
95
- def _log(self, level, msg, destination, origin, logs):
96
- prefix = self.prefixes[level] + f"[{self.name}] "
97
- full = prefix + msg
98
-
99
- if destination:
100
- self._destinationLog(full)
101
-
102
- if origin:
103
- colored = clrz(full + "<reset>", cmap=self.origin_color_map)
104
- print(colored)
105
-
106
- if logs:
107
- clean = self._strip_colors(full)
108
- {
109
- "INFO": self.logger.info,
110
- "WARN": self.logger.warning,
111
- "ERROR": self.logger.error
112
- }[level](clean)
113
-
114
- def info(self, msg, destination=False, origin=True, logs=True):
115
- '''Log to the INFO channel'''
116
- self._log("INFO", msg, destination, origin, logs)
117
-
118
- def warn(self, msg, destination=False, origin=True, logs=True):
119
- '''Log to the WARN channel'''
120
- self._log("WARN", msg, destination, origin, logs)
121
-
122
- def error(self, msg, destination=False, origin=True, logs=True):
123
- '''Log to the ERROR channel'''
124
- self._log("ERROR", msg, destination, origin, logs)
File without changes
File without changes
File without changes