using System; using System.Threading.Tasks; using BetterGenshinImpact.Model.Gear; using BetterGenshinImpact.Model.Gear.Tasks; using BetterGenshinImpact.Model.Gear.Parameter; using BetterGenshinImpact.Core.Config; using Microsoft.Extensions.Logging; using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; using System.IO; namespace BetterGenshinImpact.Service; /// /// 齿轮任务工厂,根据任务类型和参数创建对应的任务实例 /// public class GearTaskFactory { private readonly ILogger _logger; private readonly IServiceProvider _serviceProvider; public GearTaskFactory(ILogger logger, IServiceProvider serviceProvider) { _logger = logger; _serviceProvider = serviceProvider; } /// /// 根据 GearTaskData 创建对应的任务实例 /// /// 任务数据 /// 创建的任务实例 public async Task CreateTaskAsync(GearTaskData taskData) { if (string.IsNullOrWhiteSpace(taskData.TaskType)) { throw new ArgumentException($"任务类型不能为空: {taskData.Name}"); } try { var task = taskData.TaskType.ToLowerInvariant() switch { "javascript" => await CreateJavascriptTaskAsync(taskData), "pathing" => await CreatePathingTaskAsync(taskData), "csharp" or "csharpreflection" => await CreateCSharpReflectionTaskAsync(taskData), "keymouse" => await CreateKeyMouseTaskAsync(taskData), "shell" => await CreateShellTaskAsync(taskData), _ => throw new NotSupportedException($"不支持的任务类型: {taskData.TaskType}") }; // 设置基本属性 task.Name = taskData.Name; task.Type = taskData.TaskType; task.Enabled = taskData.IsEnabled; _logger.LogDebug("成功创建任务实例: {TaskName} ({TaskType})", taskData.Name, taskData.TaskType); return task; } catch (Exception ex) { _logger.LogError(ex, "创建任务实例失败: {TaskName} ({TaskType})", taskData.Name, taskData.TaskType); throw; } } /// /// 创建 JavaScript 任务 /// private async Task CreateJavascriptTaskAsync(GearTaskData taskData) { var parameters = DeserializeParameters(taskData.Parameters); if (string.IsNullOrWhiteSpace(parameters.FolderName)) { throw new ArgumentException($"JavaScript 任务缺少 FolderName 参数: {taskData.Name}"); } return new JavascriptGearTask(parameters); } /// /// 创建路径任务 /// private async Task CreatePathingTaskAsync(GearTaskData taskData) { var parameters = DeserializeParameters(taskData.Parameters); if (string.IsNullOrWhiteSpace(parameters.Path)) { throw new ArgumentException($"Pathing 任务缺少 Path 参数: {taskData.Name}"); } return new PathingGearTask(parameters); } /// /// 创建 C# 反射任务 /// private async Task CreateCSharpReflectionTaskAsync(GearTaskData taskData) { var parameters = DeserializeParameters(taskData.Parameters); if (string.IsNullOrWhiteSpace(parameters.MethodPath)) { throw new ArgumentException($"C# 反射任务缺少 MethodPath 参数: {taskData.Name}"); } return new CSharpReflectionGearTask(parameters); } /// /// 创建键鼠任务 /// private async Task CreateKeyMouseTaskAsync(GearTaskData taskData) { // KeyMouse 任务需要文件路径 string filePath = string.Empty; if (taskData.Parameters != null) { // 尝试从参数中获取路径 if (taskData.Parameters is string pathStr) { filePath = pathStr; } else if (taskData.Parameters.ToString() is string paramStr) { // 尝试解析 JSON 对象中的路径 try { var paramObj = JsonConvert.DeserializeObject(paramStr); filePath = paramObj?.Path?.ToString() ?? paramObj?.FilePath?.ToString() ?? string.Empty; } catch { filePath = paramStr; // 如果解析失败,直接使用字符串 } } } if (string.IsNullOrWhiteSpace(filePath)) { throw new ArgumentException($"KeyMouse 任务缺少文件路径参数: {taskData.Name}"); } if (!File.Exists(filePath)) { throw new FileNotFoundException($"KeyMouse 任务文件不存在: {filePath}"); } return new KeyMouseGearTask(filePath); } /// /// 创建 Shell 任务 /// private async Task CreateShellTaskAsync(GearTaskData taskData) { ShellConfig? shellConfig = null; if (taskData.Parameters != null) { try { shellConfig = DeserializeParameters(taskData.Parameters); } catch (Exception ex) { _logger.LogWarning(ex, "解析 Shell 配置失败,使用默认配置: {TaskName}", taskData.Name); shellConfig = new ShellConfig(); } } return new ShellGearTask(shellConfig); } /// /// 反序列化参数对象 /// /// 参数类型 /// 参数对象 /// 反序列化后的参数 private T DeserializeParameters(object? parameters) where T : class, new() { if (parameters == null) { return new T(); } try { // 如果已经是目标类型,直接返回 if (parameters is T directCast) { return directCast; } // 尝试 JSON 反序列化 string json; if (parameters is string jsonStr) { json = jsonStr; } else { json = JsonConvert.SerializeObject(parameters); } var result = JsonConvert.DeserializeObject(json); return result ?? new T(); } catch (Exception ex) { _logger.LogWarning(ex, "反序列化参数失败,使用默认参数: {ParameterType}", typeof(T).Name); return new T(); } } /// /// 获取支持的任务类型列表 /// /// 支持的任务类型 public static string[] GetSupportedTaskTypes() { return new[] { "javascript", "pathing", "csharp", "csharpreflection", "keymouse", "shell" }; } /// /// 检查任务类型是否受支持 /// /// 任务类型 /// 是否支持 public static bool IsTaskTypeSupported(string taskType) { if (string.IsNullOrWhiteSpace(taskType)) return false; var supportedTypes = GetSupportedTaskTypes(); return Array.Exists(supportedTypes, t => string.Equals(t, taskType, StringComparison.OrdinalIgnoreCase)); } }