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.
- {hungerlib-2.19.dev1/src/hungerlib.egg-info → hungerlib-3.0.dev2}/PKG-INFO +1 -1
- {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/pyproject.toml +1 -1
- {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/__init__.py +2 -2
- hungerlib-3.0.dev2/src/hungerlib/messagerouter.py +139 -0
- {hungerlib-2.19.dev1 → hungerlib-3.0.dev2/src/hungerlib.egg-info}/PKG-INFO +1 -1
- {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib.egg-info/SOURCES.txt +1 -1
- hungerlib-2.19.dev1/src/hungerlib/logger.py +0 -124
- {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/LICENSE +0 -0
- {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/README.md +0 -0
- {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/setup.cfg +0 -0
- {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/addons/__init__.py +0 -0
- {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/addons/colormap.py +0 -0
- {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/addons/configloader.py +0 -0
- {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/addons/mchelpers.py +0 -0
- {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/addons/scheduler.py +0 -0
- {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/addons/snapshot.py +0 -0
- {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/addons/utils.py +0 -0
- {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/api/__init__.py +0 -0
- {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/api/backups.py +0 -0
- {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/api/command.py +0 -0
- {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/api/databases.py +0 -0
- {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/api/filemanager.py +0 -0
- {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/api/schedule.py +0 -0
- {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/api/startup.py +0 -0
- {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/panel.py +0 -0
- {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/servers/__init__.py +0 -0
- {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/servers/generic.py +0 -0
- {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib/servers/minecraft.py +0 -0
- {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib.egg-info/dependency_links.txt +0 -0
- {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib.egg-info/requires.txt +0 -0
- {hungerlib-2.19.dev1 → hungerlib-3.0.dev2}/src/hungerlib.egg-info/top_level.txt +0 -0
|
@@ -8,7 +8,7 @@ except PackageNotFoundError:
|
|
|
8
8
|
|
|
9
9
|
# --- Core modules ---
|
|
10
10
|
from .panel import Panel
|
|
11
|
-
from .
|
|
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
|
-
"
|
|
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,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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|