Skip to content

Commit dba520c

Browse files
committed
kill_server-v0.1.0
1 parent 18bbf2b commit dba520c

3 files changed

Lines changed: 50 additions & 1 deletion

File tree

pyproject.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ name = "mcdr-plugins"
33
version = "0.1.0"
44
description = "My MCDR Plugins"
55
readme = "README.md"
6-
requires-python = ">=3.10"
6+
requires-python = ">=3.12"
77
dependencies = [
88
"mcdreforged>=2.15.6",
99
]
@@ -13,6 +13,9 @@ license = { file = "LICENSE" }
1313
minecraft-data-api = [
1414
"hjson>=3.1.0",
1515
]
16+
kill-server = [
17+
"dowhen>=0.1.0",
18+
]
1619

1720
[[tool.uv.index]]
1821
url = "https://mirrors.aliyun.com/pypi/simple"
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import time
2+
from typing import Any
3+
4+
from dowhen import when
5+
from dowhen.handler import EventHandler
6+
from mcdreforged import PluginServerInterface, Serializable, new_thread
7+
8+
9+
class Config(Serializable):
10+
waiting_time: float = 60
11+
"""等待时间, 超时之后才强制关闭服务器, 单位为秒"""
12+
13+
def validate_attribute(self, attr_name: str, attr_value: Any, **kwargs):
14+
if attr_value <= 0:
15+
raise ValueError(f"配置项 waiting_time 必须是正值, 实际配置: {attr_value}")
16+
if attr_value <= 3:
17+
server_interface.logger.warning(f"配置项 waiting_time 单位为秒, 实际配置 {attr_value} 可能过小")
18+
19+
20+
server_interface: PluginServerInterface
21+
config: Config
22+
23+
handler: EventHandler
24+
25+
@new_thread("KillServer")
26+
def force_kill_server():
27+
"""强制关闭服务器"""
28+
server_interface.logger.info("检测到服务器关闭命令执行, 等待服务器自动关闭")
29+
30+
time.sleep(config.waiting_time)
31+
if server_interface.is_server_running():
32+
server_interface.logger.info("等待服务器关闭超时, 正在强制关闭服务器")
33+
server_interface.kill()
34+
35+
36+
def on_load(server: PluginServerInterface, prev_module):
37+
global server_interface, config, handler
38+
server_interface = server
39+
config = server.load_config_simple(target_class=Config)
40+
41+
if prev_module is not None:
42+
prev_module.handler.remove()
43+
44+
handler = when(server.stop, "return").do(force_kill_server)

src/KillServer/requirements.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
dowhen
2+
mcdreforged

0 commit comments

Comments
 (0)