serverwatcher 3.2__tar.gz → 3.4__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 (20) hide show
  1. {serverwatcher-3.2/src/serverwatcher.egg-info → serverwatcher-3.4}/PKG-INFO +1 -1
  2. {serverwatcher-3.2 → serverwatcher-3.4}/pyproject.toml +1 -1
  3. serverwatcher-3.4/src/serverwatcher/config/__init__.py +9 -0
  4. {serverwatcher-3.2 → serverwatcher-3.4}/src/serverwatcher/config/messages.py +5 -0
  5. {serverwatcher-3.2 → serverwatcher-3.4}/src/serverwatcher/config/watcher.py +4 -0
  6. {serverwatcher-3.2 → serverwatcher-3.4}/src/serverwatcher/defaultconfigs/global.yaml +1 -1
  7. {serverwatcher-3.2 → serverwatcher-3.4}/src/serverwatcher/defaultconfigs/messages.yaml +6 -0
  8. {serverwatcher-3.2 → serverwatcher-3.4}/src/serverwatcher/defaultconfigs/watcher.yaml +4 -0
  9. {serverwatcher-3.2 → serverwatcher-3.4}/src/serverwatcher/watcher.py +28 -44
  10. {serverwatcher-3.2 → serverwatcher-3.4/src/serverwatcher.egg-info}/PKG-INFO +1 -1
  11. {serverwatcher-3.2 → serverwatcher-3.4}/src/serverwatcher.egg-info/SOURCES.txt +1 -0
  12. {serverwatcher-3.2 → serverwatcher-3.4}/LICENSE +0 -0
  13. {serverwatcher-3.2 → serverwatcher-3.4}/README.md +0 -0
  14. {serverwatcher-3.2 → serverwatcher-3.4}/setup.cfg +0 -0
  15. {serverwatcher-3.2 → serverwatcher-3.4}/src/serverwatcher/__init__.py +0 -0
  16. {serverwatcher-3.2 → serverwatcher-3.4}/src/serverwatcher/config/global_config.py +0 -0
  17. {serverwatcher-3.2 → serverwatcher-3.4}/src/serverwatcher/schema.py +0 -0
  18. {serverwatcher-3.2 → serverwatcher-3.4}/src/serverwatcher.egg-info/dependency_links.txt +0 -0
  19. {serverwatcher-3.2 → serverwatcher-3.4}/src/serverwatcher.egg-info/requires.txt +0 -0
  20. {serverwatcher-3.2 → serverwatcher-3.4}/src/serverwatcher.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: serverwatcher
3
- Version: 3.2
3
+ Version: 3.4
4
4
  Summary: A HungerLib-powered Minecraft server automation engine.
5
5
  Author: iFamished
6
6
  License: GPL-3.0
@@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"
7
7
 
8
8
  [project]
9
9
  name = "serverwatcher"
10
- version = "3.2"
10
+ version = "3.4"
11
11
  description = "A HungerLib-powered Minecraft server automation engine."
12
12
  readme = "README.md"
13
13
  requires-python = ">=3.10"
@@ -0,0 +1,9 @@
1
+ from .global_config import GlobalConfig
2
+ from .messages import MessagesConfig
3
+ from .watcher import WatcherConfig
4
+
5
+ __all__ = [
6
+ 'GlobalConfig',
7
+ 'MessagesConfig',
8
+ 'WatcherConfig',
9
+ ]
@@ -23,3 +23,8 @@ class MessagesConfig:
23
23
  reason_tps: str = ""
24
24
  reason_low_uptime: str = ""
25
25
  reason_players: str = ""
26
+
27
+ restart_action_sent: str = ""
28
+ server_back_online: str = ""
29
+ server_back_online_broadcast: str = ""
30
+ server_failed_restart: str = ""
@@ -30,3 +30,7 @@ class WatcherConfig:
30
30
  log_path: str
31
31
  console_backspaces: int
32
32
  timezone: str
33
+
34
+ # New values (will reorder later)
35
+ watch_interval: int
36
+ clear_terminal: bool
@@ -9,7 +9,7 @@ origin:
9
9
  server:
10
10
  name: My SMP
11
11
  server_id: CHANGE_ME
12
- domain: mc.hungersmp.com
12
+ domain: mc.example.com
13
13
  port: 25565
14
14
  rcon_port: 25575
15
15
  rcon_password: password
@@ -39,3 +39,9 @@ reason_uptime: "Uptime {uptime} exceeds {threshold}h"
39
39
  reason_tps: "TPS {tps} is lower than {threshold}"
40
40
  reason_low_uptime: "Uptime {uptime} is shorter than 30m"
41
41
  reason_players: "There {verb} {count} {plural} online"
42
+
43
+ # New values, will reorder later
44
+ restart_action_sent: "Restart action sent. Waiting..."
45
+ server_back_online: "Server is back online!"
46
+ server_back_online_broadcast: "{prefix} <green>Restart successful!"
47
+ server_failed_restart: "Server failed to restart!"
@@ -26,3 +26,7 @@ logger_name_template: "Server Watcher"
26
26
  log_path: "/home/container/logs/"
27
27
  console_backspaces: 8
28
28
  timezone: "America/Chicago"
29
+
30
+ # New values (will reorder later)
31
+ watch_interval: 60
32
+ clear_terminal: True
@@ -15,19 +15,13 @@ from hungerlib.addons import (
15
15
  map_to_dataclass,
16
16
  )
17
17
 
18
- # NEW CONFIG DATACLASSES
19
- from serverwatcher.config.global_config import GlobalConfig
20
- from serverwatcher.config.messages import MessagesConfig
21
- from serverwatcher.config.watcher import WatcherConfig
22
-
23
- # BASE DIRECTORY OF THIS PACKAGE
24
- # BASE_DIR = os.path.dirname(__file__) # OLD VERSION, may use later
25
- BASE_DIR = os.getcwd() # NEW VERSION
18
+ from serverwatcher.config import GlobalConfig, MessagesConfig, WatcherConfig
19
+
20
+ # Set directory
21
+ BASE_DIR = os.getcwd()
26
22
  PACKAGE_DIR = os.path.dirname(__file__)
27
23
 
28
- # ---------------------------------------------------------
29
- # Utility: load config or copy default from defaultconfigs/
30
- # ---------------------------------------------------------
24
+ # Load configs
31
25
  def load_or_default(path: str, default_path: str, schema):
32
26
  """
33
27
  Loads YAML from path. If missing, copies default_path → path.
@@ -46,12 +40,9 @@ def load_or_default(path: str, default_path: str, schema):
46
40
  return map_to_dataclass(raw, schema)
47
41
 
48
42
 
49
- # ---------------------------------------------------------
50
- # Main Watcher
51
- # ---------------------------------------------------------
43
+ # Main watcher
52
44
  class ServerWatcher:
53
45
  def __init__(self):
54
- # Load all 3 configs
55
46
  self.global_cfg: GlobalConfig = load_or_default(
56
47
  "config/global.yaml",
57
48
  "defaultconfigs/global.yaml",
@@ -70,7 +61,7 @@ class ServerWatcher:
70
61
  WatcherConfig
71
62
  )
72
63
 
73
- # PANEL
64
+ # panel
74
65
  p = self.global_cfg.panel
75
66
  self.panel = Panel(
76
67
  name=p["name"],
@@ -78,7 +69,7 @@ class ServerWatcher:
78
69
  api_key=p["api_key"],
79
70
  )
80
71
 
81
- # ORIGIN
72
+ # origin
82
73
  o = self.global_cfg.origin
83
74
  self.origin = GenericServer(
84
75
  name="Origin",
@@ -86,7 +77,7 @@ class ServerWatcher:
86
77
  server_id=o["server_id"],
87
78
  )
88
79
 
89
- # SERVER
80
+ # server
90
81
  s = self.global_cfg.server
91
82
  self.server = MinecraftServer(
92
83
  name=s["name"],
@@ -99,7 +90,7 @@ class ServerWatcher:
99
90
  tpsCommand=s["tps_command"],
100
91
  )
101
92
 
102
- # LOGGER (fully configurable)
93
+ # logger
103
94
  logger_name = self.cfg.logger_name_template.format(
104
95
  server_name=s["name"]
105
96
  )
@@ -111,29 +102,23 @@ class ServerWatcher:
111
102
  console_backspaces=self.cfg.console_backspaces,
112
103
  )
113
104
 
114
- # TIMEZONE
105
+ # timezone
115
106
  self.tz = ZoneInfo(self.cfg.timezone)
116
107
 
117
- # -----------------------------------------------------
118
- # Utility: format messages with prefix
119
- # -----------------------------------------------------
108
+ # format messages with prefix
120
109
  def fmt(self, template: str, **kwargs):
121
110
  return template.format(prefix=self.messages.prefix, **kwargs)
122
111
 
123
- # -----------------------------------------------------
124
- # Shutdown
125
- # -----------------------------------------------------
112
+ # simple shutdown
126
113
  def shutdown(self):
127
114
  self.log.info("Shutting down ServerWatcher.")
128
115
  raise SystemExit
129
116
 
130
- # -----------------------------------------------------
131
- # Restart logic
132
- # -----------------------------------------------------
117
+ # restart logic
133
118
  def restart_and_wait(self):
134
119
  self.origin.disableSchedule(self.cfg.restart_soon_schedule_id)
135
120
  self.server.restart()
136
- self.log.info("Restart action sent. Waiting...")
121
+ self.log.info(f"{self.messages.restart_action_sent}")
137
122
  time.sleep(self.cfg.restart_wait_seconds)
138
123
 
139
124
  self.log.warn("Checking server status...")
@@ -144,17 +129,15 @@ class ServerWatcher:
144
129
  )
145
130
 
146
131
  if alive:
147
- self.log.info("Server is back online!")
132
+ self.log.info(f"{self.messages.server_back_online}")
148
133
  self.server.sendBroadcast(
149
- f"{self.messages.prefix}<green>Restart successful!"
134
+ f"{self.messages.server_back_online_broadcast}"
150
135
  )
151
136
  self.origin.enableSchedule(self.cfg.origin_disable_schedule_id)
152
137
  else:
153
- self.log.error("Server failed to restart!")
138
+ self.log.error(f"{self.messages.server_failed_restart}")
154
139
 
155
- # -----------------------------------------------------
156
- # Schedule restart
157
- # -----------------------------------------------------
140
+ # schedule restart
158
141
  def schedule_restart(self, minutes):
159
142
  info = snapSchedule(minimumMinutes=minutes)
160
143
  scheduled = info["scheduled"]
@@ -184,9 +167,7 @@ class ServerWatcher:
184
167
  second_callbacks=second_callbacks,
185
168
  )
186
169
 
187
- # -----------------------------------------------------
188
- # Main evaluation logic
189
- # -----------------------------------------------------
170
+ # main evaluation logic
190
171
  def evaluate(self):
191
172
  self.log.info(self.messages.log_start)
192
173
 
@@ -202,7 +183,7 @@ class ServerWatcher:
202
183
  restart_reasons = []
203
184
  no_restart_reasons = []
204
185
 
205
- # PRO-RESTART
186
+ # pro-restart
206
187
  if self.server.getSchedule(self.cfg.restart_soon_schedule_id)["is_active"]:
207
188
  restart_reasons.append(self.messages.reason_restart_soon)
208
189
  pro += self.cfg.weight_restart_soon
@@ -232,7 +213,7 @@ class ServerWatcher:
232
213
  )
233
214
  pro += self.cfg.weight_tps
234
215
 
235
- # ANTI-RESTART
216
+ # anti-restart
236
217
  if snap.uptime // 60 < 30:
237
218
  no_restart_reasons.append(
238
219
  self.fmt(self.messages.reason_low_uptime, uptime=snap.uptime_formatted)
@@ -247,7 +228,7 @@ class ServerWatcher:
247
228
  )
248
229
  anti += snap.players * self.cfg.weight_per_player
249
230
 
250
- # LOGGING
231
+ # logging
251
232
  for r in restart_reasons:
252
233
  self.log.warn(f"- {r}")
253
234
  for r in no_restart_reasons:
@@ -282,7 +263,10 @@ class ServerWatcher:
282
263
  # Main loop
283
264
  # -----------------------------------------------------
284
265
  def run(self):
285
- clearTerminal()
266
+ if self.cfg.clear_terminal:
267
+ clearTerminal()
286
268
  while True:
269
+ if self.cfg.clear_terminal:
270
+ clearTerminal()
287
271
  self.evaluate()
288
- time.sleep(60)
272
+ time.sleep(self.cfg.watch_interval)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: serverwatcher
3
- Version: 3.2
3
+ Version: 3.4
4
4
  Summary: A HungerLib-powered Minecraft server automation engine.
5
5
  Author: iFamished
6
6
  License: GPL-3.0
@@ -9,6 +9,7 @@ src/serverwatcher.egg-info/SOURCES.txt
9
9
  src/serverwatcher.egg-info/dependency_links.txt
10
10
  src/serverwatcher.egg-info/requires.txt
11
11
  src/serverwatcher.egg-info/top_level.txt
12
+ src/serverwatcher/config/__init__.py
12
13
  src/serverwatcher/config/global_config.py
13
14
  src/serverwatcher/config/messages.py
14
15
  src/serverwatcher/config/watcher.py
File without changes
File without changes
File without changes