Skip to content

Commit 1553035

Browse files
committed
add task_type python_code & fix bug: mcdr_command task can't be able to process vars successfully
1 parent c9d0690 commit 1553035

4 files changed

Lines changed: 180 additions & 19 deletions

File tree

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
.idea/
2-
debug.sh
2+
debug.sh
3+
4+
test/.pytest_cache/

hooks/__init__.py

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
from mcdreforged.api.utils import serializer
1111
from ruamel import yaml
1212

13+
from hooks import utils
14+
from hooks.utils import process_arg_server
15+
1316
scripts_folder: str = ''
1417

1518

@@ -40,6 +43,8 @@ class TaskType(Enum):
4043
shell_command = 'shell_command'
4144
server_command = 'server_command'
4245
mcdr_command = 'mcdr_command'
46+
47+
python_code = 'python_code'
4348

4449

4550
class Task(Serializable):
@@ -56,6 +61,12 @@ def execute_task(self, server: PluginServerInterface, hook: str, var_dict: dict
5661

5762
start_time = time.time()
5863

64+
if self.command is None:
65+
server.logger.error(
66+
f'Task state is not correct! Task: {self.name} Hooks: {hook} TaskType: {self.task_type} '
67+
f'command: {self.command}')
68+
return
69+
5970
if self.task_type == TaskType.undefined:
6071
server.logger.error(
6172
f'Task state is not correct! Task: {self.name} Hooks: {hook} TaskType: {self.task_type} '
@@ -94,7 +105,32 @@ def execute_task(self, server: PluginServerInterface, hook: str, var_dict: dict
94105
for key in var_dict.keys():
95106
command = command.replace('{$' + key + '}', str(var_dict.get(key)))
96107

97-
server.execute_command(self.command)
108+
server.execute_command(command)
109+
110+
elif self.task_type == TaskType.python_code:
111+
# 注入变量
112+
finally_command = self.command
113+
114+
# 要被注入的赋值语句
115+
command_input = StringIO()
116+
117+
if var_dict is not None:
118+
for key in var_dict.keys():
119+
command_input.write(key)
120+
command_input.write('=')
121+
122+
var_value = var_dict.get(key)
123+
124+
if (not utils.is_int_var(var_value)) and (not utils.is_list_var(var_value)) and (not utils.is_dict_var(var_value)):
125+
var_value = '"' + str(var_value) + '"'
126+
127+
command_input.write(str(var_value))
128+
command_input.write(';')
129+
command_input.write('\n')
130+
131+
finally_command = finally_command.replace('# variable injection here', command_input.getvalue())
132+
133+
exec(finally_command)
98134

99135
server.logger.debug(f'Task finished, name: {self.name}, task_type: {self.task_type}, command: {self.command}, '
100136
f'costs {time.time() - start_time} seconds.')
@@ -370,23 +406,6 @@ def list_all_files(root_dir) -> list[str]:
370406
parse_and_apply_scripts(script, server)
371407

372408

373-
def process_arg_server(server: PluginServerInterface) -> PluginServerInterface:
374-
server.func_is_server_running = server.is_server_running()
375-
server.func_is_server_startup = server.is_server_startup()
376-
server.func_is_rcon_running = server.is_rcon_running()
377-
server.func_get_server_pid = server.get_server_pid()
378-
server.func_get_server_pid_all = server.get_server_pid_all()
379-
server.func_get_server_information = str(serialize(server.get_server_information()))
380-
server.func_get_data_folder = server.get_data_folder()
381-
server.func_get_plugin_file_path = server.get_plugin_file_path('hooks')
382-
server.func_get_plugin_list = str(server.get_plugin_list())
383-
server.func_get_unloaded_plugin_list = str(server.get_unloaded_plugin_list())
384-
server.func_get_disabled_plugin_list = str(server.get_disabled_plugin_list())
385-
server.func_get_mcdr_language = server.get_mcdr_language()
386-
server.func_get_mcdr_config = str(server.get_mcdr_config())
387-
return server
388-
389-
390409
def on_load(server: PluginServerInterface, old_module):
391410
global config, scripts_folder, temp_config
392411

hooks/utils.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
from typing import Any
2+
3+
from mcdreforged.plugin.server_interface import PluginServerInterface
4+
from mcdreforged.utils.serializer import serialize
5+
6+
7+
def is_int_var(obj: Any) -> bool:
8+
if type(obj) == int:
9+
return True
10+
else:
11+
try:
12+
int(str(obj))
13+
except ValueError:
14+
return False
15+
return True
16+
17+
18+
def is_dict_var(obj: Any) -> bool:
19+
if type(obj) == dict:
20+
return True
21+
else:
22+
try:
23+
return isinstance(eval(str(obj)), dict)
24+
except:
25+
return False
26+
27+
28+
def is_list_var(obj: Any) -> bool:
29+
if type(obj) == list:
30+
return True
31+
else:
32+
try:
33+
return isinstance(eval(str(obj)), list)
34+
except:
35+
return False
36+
37+
38+
def process_arg_server(server: PluginServerInterface) -> PluginServerInterface:
39+
server.func_is_server_running = server.is_server_running()
40+
server.func_is_server_startup = server.is_server_startup()
41+
server.func_is_rcon_running = server.is_rcon_running()
42+
server.func_get_server_pid = server.get_server_pid()
43+
server.func_get_server_pid_all = server.get_server_pid_all()
44+
server.func_get_server_information = str(serialize(server.get_server_information()))
45+
server.func_get_data_folder = server.get_data_folder()
46+
server.func_get_plugin_file_path = server.get_plugin_file_path('hooks')
47+
server.func_get_plugin_list = str(server.get_plugin_list())
48+
server.func_get_unloaded_plugin_list = str(server.get_unloaded_plugin_list())
49+
server.func_get_disabled_plugin_list = str(server.get_disabled_plugin_list())
50+
server.func_get_mcdr_language = server.get_mcdr_language()
51+
server.func_get_mcdr_config = str(server.get_mcdr_config())
52+
return server

test/test.py

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import pytest as pytest
2+
3+
from hooks import utils
4+
5+
6+
def test_type_list_detect():
7+
input_list = [1, 2, 3]
8+
assert utils.is_list_var(input_list) is True
9+
10+
input_str_list = '[1, 2, 3]'
11+
assert utils.is_list_var(input_str_list) is True
12+
13+
input_str_list_invalid = '["a]'
14+
assert utils.is_list_var(input_str_list_invalid) is False
15+
16+
input_dict = {"key": "value"}
17+
assert utils.is_list_var(input_dict) is False
18+
19+
input_str_dict = '{"key": "value"}'
20+
assert utils.is_list_var(input_str_dict) is False
21+
22+
input_str_dict_invalid = '{"a}'
23+
assert utils.is_list_var(input_str_dict_invalid) is False
24+
25+
input_int = 1
26+
assert utils.is_list_var(input_int) is False
27+
28+
input_bool = True
29+
assert utils.is_list_var(input_bool) is False
30+
31+
32+
def test_type_dict_detect():
33+
input_list = [1, 2, 3]
34+
assert utils.is_dict_var(input_list) is False
35+
36+
input_str_list = '[1, 2, 3]'
37+
assert utils.is_dict_var(input_str_list) is False
38+
39+
input_str_list_invalid = '["a]'
40+
assert utils.is_dict_var(input_str_list_invalid) is False
41+
42+
input_dict = {"key": "value"}
43+
assert utils.is_dict_var(input_dict) is True
44+
45+
input_str_dict = '{"key": "value"}'
46+
assert utils.is_dict_var(input_str_dict) is True
47+
48+
input_str_dict_invalid = '{"a}'
49+
assert utils.is_dict_var(input_str_dict_invalid) is False
50+
51+
input_int = 1
52+
assert utils.is_dict_var(input_int) is False
53+
54+
input_bool = True
55+
assert utils.is_dict_var(input_bool) is False
56+
57+
58+
def test_type_int_detect():
59+
input_list = [1, 2, 3]
60+
assert utils.is_int_var(input_list) is False
61+
62+
input_str_list = '[1, 2, 3]'
63+
assert utils.is_dict_var(input_str_list) is False
64+
65+
input_str_list_invalid = '["a]'
66+
assert utils.is_int_var(input_str_list_invalid) is False
67+
68+
input_dict = {"key": "value"}
69+
assert utils.is_int_var(input_dict) is False
70+
71+
input_str_dict = '{"key": "value"}'
72+
assert utils.is_int_var(input_str_dict) is False
73+
74+
input_str_dict_invalid = '{"a}'
75+
assert utils.is_int_var(input_str_dict_invalid) is False
76+
77+
input_int = 1
78+
assert utils.is_int_var(input_int) is True
79+
80+
input_str_int = '1'
81+
assert utils.is_int_var(input_str_int) is True
82+
83+
input_bool = True
84+
assert utils.is_int_var(input_bool) is False
85+
86+
87+
if __name__ == "__main__":
88+
pytest.main()

0 commit comments

Comments
 (0)