serverwatcher 4.7__tar.gz → 4.8__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-4.7/src/serverwatcher.egg-info → serverwatcher-4.8}/PKG-INFO +1 -1
  2. {serverwatcher-4.7 → serverwatcher-4.8}/pyproject.toml +1 -1
  3. {serverwatcher-4.7 → serverwatcher-4.8}/src/serverwatcher/configclasses/messages.py +2 -0
  4. {serverwatcher-4.7 → serverwatcher-4.8}/src/serverwatcher/defaultconfigs/messages.yaml +1 -0
  5. {serverwatcher-4.7 → serverwatcher-4.8}/src/serverwatcher/defaultconfigs/watcher.yaml +1 -1
  6. {serverwatcher-4.7 → serverwatcher-4.8}/src/serverwatcher/watcher.py +28 -47
  7. {serverwatcher-4.7 → serverwatcher-4.8/src/serverwatcher.egg-info}/PKG-INFO +1 -1
  8. {serverwatcher-4.7 → serverwatcher-4.8}/LICENSE +0 -0
  9. {serverwatcher-4.7 → serverwatcher-4.8}/README.md +0 -0
  10. {serverwatcher-4.7 → serverwatcher-4.8}/setup.cfg +0 -0
  11. {serverwatcher-4.7 → serverwatcher-4.8}/src/serverwatcher/__init__.py +0 -0
  12. {serverwatcher-4.7 → serverwatcher-4.8}/src/serverwatcher/configclasses/__init__.py +0 -0
  13. {serverwatcher-4.7 → serverwatcher-4.8}/src/serverwatcher/configclasses/global_config.py +0 -0
  14. {serverwatcher-4.7 → serverwatcher-4.8}/src/serverwatcher/configclasses/watcher.py +0 -0
  15. {serverwatcher-4.7 → serverwatcher-4.8}/src/serverwatcher/defaultconfigs/global.yaml +0 -0
  16. {serverwatcher-4.7 → serverwatcher-4.8}/src/serverwatcher/validator.py +0 -0
  17. {serverwatcher-4.7 → serverwatcher-4.8}/src/serverwatcher.egg-info/SOURCES.txt +0 -0
  18. {serverwatcher-4.7 → serverwatcher-4.8}/src/serverwatcher.egg-info/dependency_links.txt +0 -0
  19. {serverwatcher-4.7 → serverwatcher-4.8}/src/serverwatcher.egg-info/requires.txt +0 -0
  20. {serverwatcher-4.7 → serverwatcher-4.8}/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: 4.7
3
+ Version: 4.8
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 = "4.7"
10
+ version = "4.8"
11
11
  description = "A HungerLib-powered Minecraft server automation engine."
12
12
  readme = "README.md"
13
13
  requires-python = ">=3.10"
@@ -4,7 +4,9 @@ from dataclasses import dataclass, field
4
4
  @dataclass
5
5
  class MessagesConfig:
6
6
  prefix: str
7
+
7
8
  broadcast_restart_at: str
9
+ bullet: str
8
10
 
9
11
  # minute messages
10
12
  minute_120: str
@@ -1,6 +1,7 @@
1
1
  prefix: "<reset><aqua>[Server Watcher]"
2
2
 
3
3
  broadcast_restart_at: "{prefix} The server will restart at {time} CDT."
4
+ bullet: "-"
4
5
 
5
6
  broadcast_minute:
6
7
  minute_120: "{prefix} Restart in 2 hours!"
@@ -22,6 +22,6 @@ gaps:
22
22
  high_gap_minutes: 60
23
23
 
24
24
  restart_intervals:
25
- restart_wait_seconds: 45
25
+ restart_wait_seconds: 30
26
26
  restart_online_timeout: 120
27
27
  restart_online_interval: 2
@@ -25,7 +25,6 @@ validate_all()
25
25
  class ServerWatcher:
26
26
  def __init__(self):
27
27
 
28
- # load configs
29
28
  self.global_cfg = loadConfig(
30
29
  "config/global.yaml",
31
30
  "/defaultconfigs/global.yaml",
@@ -44,7 +43,6 @@ class ServerWatcher:
44
43
  WatcherConfig
45
44
  )
46
45
 
47
- # initialize panels and servers
48
46
  self.panel = Panel(
49
47
  name=self.global_cfg.panel_name,
50
48
  url=self.global_cfg.panel_url,
@@ -81,23 +79,27 @@ class ServerWatcher:
81
79
 
82
80
  self.tz = ZoneInfo(self.global_cfg.timezone)
83
81
 
84
- # utility
85
82
  def fmt(self, template: str, **kwargs):
86
83
  return template.format(prefix=self.messages.prefix, **kwargs)
87
84
 
85
+ def say(self, msg, level="info", **fmt):
86
+ if not msg:
87
+ return
88
+ text = self.fmt(msg, **fmt)
89
+ getattr(self.log, level)(text)
90
+
88
91
  def shutdown(self):
89
- self.log.info(self.messages.log_shutdown)
92
+ self.say(self.messages.log_shutdown)
90
93
  raise SystemExit
91
94
 
92
- # restart logic
93
95
  def restart_and_wait(self):
94
96
  if self.cfg.schedule_control:
95
97
  self.origin.disableSchedule(self.cfg.restart_soon_id)
96
98
  self.server.restart()
97
- self.log.info(self.messages.restart_action_sent)
99
+ self.say(self.messages.restart_action_sent)
98
100
  time.sleep(self.cfg.restart_wait_seconds)
99
101
 
100
- self.log.warn(self.messages.log_status_check)
102
+ self.say(self.messages.log_status_check, level="warn")
101
103
  alive = waitForOnline(
102
104
  self.server,
103
105
  timeout=self.cfg.restart_online_timeout,
@@ -105,12 +107,11 @@ class ServerWatcher:
105
107
  )
106
108
 
107
109
  if alive:
108
- self.log.info(self.messages.server_back_online)
109
- self.log.info(self.fmt(self.messages.server_back_online_broadcast), destination=True, origin=False, logs=False)
110
+ self.say(self.messages.server_back_online)
111
+ self.say(self.messages.server_back_online_broadcast)
110
112
  else:
111
- self.log.error(self.messages.server_failed_restart)
113
+ self.say(self.messages.server_failed_restart, level="error")
112
114
 
113
- # scheduled restart
114
115
  def schedule_restart(self, minutes):
115
116
  info = snapSchedule(minimumMinutes=minutes)
116
117
  scheduled = info["scheduled"]
@@ -118,11 +119,8 @@ class ServerWatcher:
118
119
  local_time = scheduled.astimezone(self.tz)
119
120
  time_str = local_time.strftime("%I:%M %p")
120
121
 
121
- self.server.sendBroadcast(
122
- self.fmt(self.messages.broadcast_restart_at, time=time_str)
123
- )
122
+ self.server.sendBroadcast(self.fmt(self.messages.broadcast_restart_at, time=time_str))
124
123
 
125
- # minute_* callbacks
126
124
  minute_callbacks = {
127
125
  int(k.split("_")[1]): (
128
126
  lambda msg=self.fmt(getattr(self.messages, k)):
@@ -132,7 +130,6 @@ class ServerWatcher:
132
130
  if k.startswith("minute_")
133
131
  }
134
132
 
135
- # second_* callbacks
136
133
  second_callbacks = {
137
134
  int(k.split("_")[1]): (
138
135
  lambda msg=self.fmt(getattr(self.messages, k)):
@@ -148,12 +145,11 @@ class ServerWatcher:
148
145
  second_callbacks=second_callbacks,
149
146
  )
150
147
 
151
- # evaluation logic
152
148
  def evaluate(self):
153
- self.log.info(self.messages.log_start)
149
+ self.say(self.messages.log_start)
154
150
 
155
151
  if not validateAll(self.panel, self.server):
156
- self.log.error(self.messages.log_validation_fail)
152
+ self.say(self.messages.log_validation_fail, level="error")
157
153
  self.shutdown()
158
154
 
159
155
  self.server.refresh()
@@ -164,21 +160,16 @@ class ServerWatcher:
164
160
  restart_reasons = []
165
161
  no_restart_reasons = []
166
162
 
167
- # pro-restart
168
163
  if self.cfg.schedule_control and self.server.getSchedule(self.cfg.restart_soon_id)["is_active"]:
169
164
  restart_reasons.append(self.messages.reason_restart_soon)
170
165
  pro += self.cfg.weight_restart_soon
171
166
 
172
167
  if snap.ram >= self.cfg.ram_threshold:
173
- restart_reasons.append(
174
- self.fmt(self.messages.reason_ram, ram=snap.ram, threshold=self.cfg.ram_threshold)
175
- )
168
+ restart_reasons.append(self.fmt(self.messages.reason_ram, ram=snap.ram, threshold=self.cfg.ram_threshold))
176
169
  pro += int(round(snap.ram, 0) - (self.cfg.ram_threshold - 1))
177
170
 
178
171
  if snap.cpu >= self.cfg.cpu_threshold:
179
- restart_reasons.append(
180
- self.fmt(self.messages.reason_cpu, cpu=snap.cpu, threshold=self.cfg.cpu_threshold)
181
- )
172
+ restart_reasons.append(self.fmt(self.messages.reason_cpu, cpu=snap.cpu, threshold=self.cfg.cpu_threshold))
182
173
  pro += self.cfg.weight_cpu
183
174
 
184
175
  if snap.uptime // 3600 >= self.cfg.uptime_hours_threshold:
@@ -189,37 +180,29 @@ class ServerWatcher:
189
180
  pro += self.cfg.weight_uptime
190
181
 
191
182
  if (snap.tps if snap.tps is not None else 0) <= self.cfg.tps_threshold:
192
- restart_reasons.append(
193
- self.fmt(self.messages.reason_tps, tps=snap.tps, threshold=self.cfg.tps_threshold)
194
- )
183
+ restart_reasons.append(self.fmt(self.messages.reason_tps, tps=snap.tps, threshold=self.cfg.tps_threshold))
195
184
  pro += self.cfg.weight_tps
196
185
 
197
- # anti-restart
198
186
  if snap.uptime // 60 < 30:
199
- no_restart_reasons.append(
200
- self.fmt(self.messages.reason_low_uptime, uptime=snap.uptime_formatted)
201
- )
187
+ no_restart_reasons.append(self.fmt(self.messages.reason_low_uptime, uptime=snap.uptime_formatted))
202
188
  anti += self.cfg.weight_low_uptime
203
189
 
204
190
  if snap.players > 0:
205
191
  verb = "are" if snap.players != 1 else "is"
206
192
  plural = "players" if snap.players != 1 else "player"
207
- no_restart_reasons.append(
208
- self.fmt(self.messages.reason_players, verb=verb, count=snap.players, plural=plural)
209
- )
193
+ no_restart_reasons.append(self.fmt(self.messages.reason_players, verb=verb, count=snap.players, plural=plural))
210
194
  anti += snap.players * self.cfg.weight_per_player
211
195
 
212
- # logging
213
196
  if restart_reasons:
214
- self.log.warn(f"{self.messages.pro_restart_splash}")
197
+ self.say(self.messages.pro_restart_splash, level="warn")
215
198
  for r in restart_reasons:
216
199
  self.log.warn(f"- {r}")
217
200
  self.log.warn("\n")
218
201
 
219
202
  if no_restart_reasons:
220
- self.log.warn(f"{self.messages.anti_restart_splash}")
203
+ self.say(self.messages.anti_restart_splash, level="warn")
221
204
  for r in no_restart_reasons:
222
- self.log.warn(f"- {r}")
205
+ self.log.warn(f"{self.messages.bullet} {r}")
223
206
  self.log.warn("\n")
224
207
 
225
208
  self.log.warn(f"Pro-restart: {pro}")
@@ -227,28 +210,26 @@ class ServerWatcher:
227
210
 
228
211
  gap = abs(pro - anti)
229
212
 
230
- # decision
231
213
  if pro == 0:
232
- self.log.info(self.messages.log_no_restart)
214
+ self.say(self.messages.log_no_restart)
233
215
  return
234
216
 
235
217
  if pro > anti and snap.players == 0:
236
- self.log.info(self.messages.log_immediate_restart)
218
+ self.say(self.messages.log_immediate_restart)
237
219
  self.restart_and_wait()
238
220
  return
239
221
 
240
- self.log.info(self.messages.log_scheduled)
222
+ self.say(self.messages.log_scheduled)
241
223
 
242
224
  if gap <= 2:
243
- self.log.warn(self.fmt(self.messages.log_gap_low, gap=gap))
225
+ self.say(self.messages.log_gap_low, level="warn", gap=gap)
244
226
  self.schedule_restart(self.cfg.low_gap_minutes)
245
227
  else:
246
- self.log.warn(self.fmt(self.messages.log_gap_high, gap=gap))
228
+ self.say(self.messages.log_gap_high, level="warn", gap=gap)
247
229
  self.schedule_restart(self.cfg.high_gap_minutes)
248
230
 
249
231
  self.restart_and_wait()
250
232
 
251
- # main loop
252
233
  def run(self):
253
234
  if self.global_cfg.clear_terminal:
254
235
  clearTerminal()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: serverwatcher
3
- Version: 4.7
3
+ Version: 4.8
4
4
  Summary: A HungerLib-powered Minecraft server automation engine.
5
5
  Author: iFamished
6
6
  License: GPL-3.0
File without changes
File without changes
File without changes