@@ -55,7 +55,7 @@ class Task(Serializable):
5555 command : str = ''
5656
5757 @new_thread ('hooks - execute' )
58- def execute_task (self , server : PluginServerInterface , hook : str , var_dict : dict = None ):
58+ def execute_task (self , server : PluginServerInterface , hook : str , var_dict : dict = None , obj_dict : dict = None ):
5959 server .logger .debug (f'Executing task: { self .name } , task_type: { self .task_type } , command: { self .command } ' )
6060 server .logger .debug (f'objects_dict: { str (var_dict )} ' )
6161
@@ -108,33 +108,11 @@ def execute_task(self, server: PluginServerInterface, hook: str, var_dict: dict
108108 server .execute_command (command )
109109
110110 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- if str (var_value ).__contains__ ('"' ):
126- var_value = "'" + str (var_value ) + "'"
127- else :
128- var_value = '"' + str (var_value ) + '"'
129-
130- command_input .write (str (var_value ))
131- command_input .write (';' )
132- command_input .write ('\n ' )
133-
134- finally_command = finally_command .replace ('# variable injection here' , command_input .getvalue ())
111+ if obj_dict is not None :
112+ exec (self .command , obj_dict , {})
113+ else :
114+ exec (self .command , var_dict , locals ())
135115
136- exec (finally_command )
137-
138116 server .logger .debug (f'Task finished, name: { self .name } , task_type: { self .task_type } , command: { self .command } , '
139117 f'costs { time .time () - start_time } seconds.' )
140118
@@ -204,13 +182,11 @@ def _trigger_hooks(hook: Hooks, server: PluginServerInterface, objects_dict: dic
204182 if (objects_dict is not None ) and (len (objects_dict .keys ()) != 0 ):
205183 # 遍历所有已知对象
206184 for an_object_key in objects_dict .keys ():
207-
208185 # 目前正在遍历对象的值
209186 an_object_value : Any = objects_dict .get (an_object_key )
210-
211187 # 目前正在遍历对象的内部属性字典
212188 var_inner_attr_dict = serializer .serialize (an_object_value )
213-
189+ # 判断var_inner_attr_dict是否为基本类型
214190 if (not hasattr (var_inner_attr_dict , 'keys' )) or (var_inner_attr_dict is None ):
215191 finally_var_dict [an_object_key ] = an_object_value
216192 continue
@@ -219,6 +195,7 @@ def _trigger_hooks(hook: Hooks, server: PluginServerInterface, objects_dict: dic
219195 for var_inner_attr_key in var_inner_attr_dict .keys ():
220196 # 正在遍历的对象的属性字典中的正在遍历的key的value
221197 var_inner_attr_value : Any = var_inner_attr_dict .get (var_inner_attr_key )
198+ # 整合进入finally_var_dict
222199 finally_var_dict [an_object_key + '_' + var_inner_attr_key ] = var_inner_attr_value
223200
224201 # 遍历被挂载到此hook的task的key
@@ -229,7 +206,7 @@ def _trigger_hooks(hook: Hooks, server: PluginServerInterface, objects_dict: dic
229206 return
230207 # 执行任务
231208 try :
232- temp_config .task .get (task ).execute_task (server , hook .value , finally_var_dict )
209+ temp_config .task .get (task ).execute_task (server , hook .value , finally_var_dict , obj_dict = objects_dict )
233210 except Exception as e :
234211 server .logger .exception (
235212 f'Unexpected exception when executing task { task } , hook { hook .value } , '
@@ -350,7 +327,7 @@ def man_run_task(task: str, env_str: str, src: CommandSource, server: PluginServ
350327 return
351328
352329 try :
353- temp_config .task .get (task ).execute_task (server , Hooks .undefined .value , env_dict )
330+ temp_config .task .get (task ).execute_task (server , Hooks .undefined .value , var_dict = env_dict , obj_dict = env_dict )
354331 src .reply (RTextMCDRTranslation ('hooks.man_run.success' , task ))
355332 except Exception as e :
356333 server .logger .exception (
@@ -366,7 +343,8 @@ def parse_and_apply_scripts(script: str, server: PluginServerInterface):
366343 content : dict [str , Union [str , Union [list , dict ]]] = yaml .load (f .read (), Loader = yaml .Loader )
367344
368345 for task in content .get ('tasks' ).values ():
369- if (task .get ('command_file' ) is not None ) and (len (task .get ('command_file' )) > 0 ) and (os .path .isfile (task .get ('command_file' ))):
346+ if (task .get ('command_file' ) is not None ) and (len (task .get ('command_file' )) > 0 ) and \
347+ (os .path .isfile (task .get ('command_file' ))):
370348 with open (task .get ('command_file' ), 'r' ) as command_file :
371349 command_file_content = command_file .read ()
372350 # 创建task
0 commit comments