1919# Contact: DLmaster_361@163.com
2020
2121
22+ import re
2223import uuid
2324import json
25+ import json5
26+ import shutil
2427import asyncio
2528from pathlib import Path
2629from datetime import datetime , timedelta
3437from app .utils import get_logger , LogMonitor , ProcessManager , skland_sign_in
3538from app .utils .constants import UTC4 , UTC8 , MAAEND_KILLPROC_TASK
3639from .tools import login , push_notification , wait_and_focus_window
37- from .ScriptConfig import CONFIG_FILE_NAME , _keep_single_instance , _replace_config_dir
3840
3941logger = get_logger ("MaaEnd 自动代理" )
4042
@@ -135,7 +137,7 @@ async def main_task(self):
135137 logger .info (f"开始代理用户 { self .cur_user_uid } " )
136138 self .cur_user_item .status = "运行"
137139
138- self .task_dict : dict [str , bool ] | None = None
140+ self .task_dict : dict [str , dict [ str , bool ] ] | None = None
139141 self .unique_task : dict [str , str ] = {}
140142
141143 if (
@@ -253,9 +255,7 @@ async def main_task(self):
253255 self .wait_event .clear ()
254256 t = datetime .now ()
255257 await self .maaend_process_manager .open_process (
256- self .maaend_exe_path ,
257- "--log-mode=verbose" ,
258- stdout = asyncio .subprocess .PIPE ,
258+ self .maaend_exe_path , stdout = asyncio .subprocess .PIPE
259259 )
260260
261261 # 静默模式隐藏 MaaEnd 窗口
@@ -363,28 +363,26 @@ async def set_maaend(self, device_info: DeviceInfo | None) -> None:
363363 await self .maaend_process_manager .kill ()
364364 await System .kill_process (self .maaend_exe_path )
365365
366- source_config_path = None
367- if self .cur_user_config .get ("Info" , "Mode" ) == "简洁" :
368- source_config_path = (
369- Path .cwd () / f"data/{ self .script_info .script_id } /Default/ConfigFile"
370- )
371- elif self .cur_user_config .get ("Info" , "Mode" ) == "详细" :
372- source_config_path = (
373- Path .cwd ()
374- / f"data/{ self .script_info .script_id } /{ self .cur_user_uid } /ConfigFile"
375- )
376-
377- if source_config_path is None :
378- raise RuntimeError ("未找到 MaaEnd 配置目录" )
379-
380- source_config_file = source_config_path / CONFIG_FILE_NAME
381- if source_config_file .exists ():
382- _keep_single_instance (source_config_file )
383- _replace_config_dir (source_config_path , self .maaend_set_path )
366+ # 基础配置内容
367+ maaend_config_path = (
368+ Path .cwd ()
369+ / f"data/{ self .script_info .script_id } /{ 'Default' if self .cur_user_config .get ('Info' , 'Mode' ) == '简洁' else self .cur_user_uid } /ConfigFile"
370+ )
371+ shutil .rmtree (self .maaend_set_path , ignore_errors = True )
372+ shutil .copytree (maaend_config_path , self .maaend_set_path )
384373
385- maaend_set , maaend_instance = _keep_single_instance (
386- self .maaend_set_path / CONFIG_FILE_NAME
374+ # 初始化任务实例
375+ maaend_set = json .loads (
376+ (self .maaend_set_path / "mxu-MaaEnd.json" ).read_text (encoding = "utf-8" )
387377 )
378+
379+ # 获取任务项单例
380+ for instance in maaend_set ["instances" ]:
381+ if instance .get ("id" ) == "automas" :
382+ maaend_instance = instance
383+ break
384+ else :
385+ maaend_instance = {"id" : "automas" , "name" : "AUTO-MAS" , "tasks" : []}
388386 maaend_tasks = maaend_instance ["tasks" ]
389387
390388 settings = maaend_set .get ("settings" )
@@ -393,7 +391,7 @@ async def set_maaend(self, device_info: DeviceInfo | None) -> None:
393391 maaend_set ["settings" ] = settings
394392
395393 # 直接运行任务
396- settings ["autoStartInstanceId" ] = maaend_instance [ "id" ]
394+ settings ["autoStartInstanceId" ] = "automas"
397395 settings ["autoRunOnLaunch" ] = True
398396
399397 # 模拟器相关配置
@@ -408,32 +406,47 @@ async def set_maaend(self, device_info: DeviceInfo | None) -> None:
408406 "adbDeviceName" : (await MaaFWManager .convert_adb (device_info )).name
409407 }
410408
409+ # 加载 i18n 配置
410+ if settings ["language" ] == "system" :
411+ settings ["language" ] = "zh-CN"
412+ maaend_i18n_raw = json .loads (
413+ (
414+ self .maaend_root_path
415+ / f"locales/interface/{ settings ['language' ].lower ().replace ('-' , '_' )} .json"
416+ ).read_text (encoding = "utf-8" )
417+ )
418+ maaend_i18n = {}
419+ for task_definition_file in self .maaend_root_path .glob ("tasks/*.json" ):
420+ task_definition = json5 .loads ( # type: ignore
421+ task_definition_file .read_text (encoding = "utf-8" )
422+ )["task" ][0 ]
423+ if task_definition ["label" ].startswith ("$" ):
424+ maaend_i18n [task_definition ["name" ]] = maaend_i18n_raw [
425+ task_definition ["label" ].lstrip ("$" )
426+ ]
427+ else :
428+ maaend_i18n [task_definition ["name" ]] = task_definition ["label" ]
429+
411430 # 配置任务启用状态
412431 if self .task_dict is None :
413432 # 任务列表为空则记录任务
414433 self .task_dict = {}
415434 task = {}
416435 for task in maaend_tasks :
417- self .task_dict [task ["id" ]] = task ["enabled" ]
418- if task .get ("taskName" ) == "__MXU_KILLPROC__" and task .get (
419- "optionValues" , {}
420- ).get ("__MXU_KILLPROC_SELF_OPTION__" , {}).get ("value" , False ):
421- self .task_dict .popitem ()
436+ if task .get ("taskName" ) == "__MXU_KILLPROC__" and task .get (
437+ "optionValues" , {}
438+ ).get ("__MXU_KILLPROC_SELF_OPTION__" , {}).get ("value" , False ):
439+ continue
440+ task_name = maaend_i18n .get (task ["taskName" ], task ["taskName" ])
441+ if task_name not in self .task_dict :
442+ self .task_dict [task_name ] = {}
443+ self .task_dict [task_name ][task ["id" ]] = task ["enabled" ]
422444 else :
423445 # 任务列表不为空则配置任务
424446 for task in maaend_tasks :
425- task ["enabled" ] = self .task_dict [task ["id" ]]
426-
427- # 记录启用的无重复任务项以便简化判定
428- self .unique_task = {}
429- duplicate_task = set ()
430- for task in maaend_tasks :
431- if task ["enabled" ] and task ["id" ] in self .task_dict :
432- if task ["taskName" ] in self .unique_task :
433- self .unique_task .pop (task ["taskName" ])
434- duplicate_task .add (task ["taskName" ])
435- elif task ["taskName" ] not in duplicate_task :
436- self .unique_task [task ["taskName" ]] = task ["id" ]
447+ task_name = maaend_i18n .get (task ["taskName" ], task ["taskName" ])
448+ if task_name in self .task_dict :
449+ task ["enabled" ] = self .task_dict [task_name ][task ["id" ]]
437450
438451 # 配置协议空间
439452 for task in maaend_tasks :
@@ -480,16 +493,34 @@ async def check_log(self, log_content: list[str], latest_time: datetime) -> None
480493 if self .task_dict is None :
481494 self .cur_user_log .status = "MaaEnd 未加载任何任务"
482495 else :
483- for id in self .task_dict .keys ():
484- if f"[{ id } ] 任务完成" in log :
485- self .task_dict [id ] = False
486- for task_name , task_id in self .unique_task .items ():
487- if f"任务完成: { task_name } " in log :
488- self .task_dict [task_id ] = False
489- if any (self .task_dict .values ()):
490- self .cur_user_log .status = "MaaEnd 部分任务执行失败"
491- else :
492- self .cur_user_log .status = "Success!"
496+ try :
497+ task_name = ""
498+ task_index = {
499+ k : {"index" : 0 , "list" : list (v .keys ())}
500+ for k , v in self .task_dict .items ()
501+ }
502+ for log_line in self .cur_user_log .content :
503+ match = re .search (r"任务开始:\s*(.+)" , log_line )
504+ task_name = match .group (1 ) if match else task_name
505+ if (
506+ task_name in self .task_dict
507+ and f"任务完成: { task_name } " in log_line
508+ ):
509+ self .task_dict [task_name ][
510+ task_index [task_name ]["list" ][
511+ task_index [task_name ]["index" ]
512+ ]
513+ ] = False
514+ task_index [task_name ]["index" ] += 1
515+ elif f"任务失败: { task_name } " in log_line :
516+ task_index [task_name ]["index" ] += 1
517+
518+ if any (any (_ .values ()) for _ in self .task_dict .values ()):
519+ self .cur_user_log .status = "MaaEnd 部分任务执行失败"
520+ else :
521+ self .cur_user_log .status = "Success!"
522+ except :
523+ self .cur_user_log .status = "MaaEnd 任务执行情况解析失败"
493524
494525 elif datetime .now () - latest_time > timedelta (
495526 minutes = self .script_config .get ("Run" , "RunTimeLimit" )
0 commit comments