Files
better-genshin-impact/BetterGenshinImpact/GameTask/TaskProgress/TaskProgressManager.cs
mfkvfhpdx 468a54e037 执行调度器任务增加继续执行功能 (#1658)
* 完全跳过的配置组,不发送通知。给周期配置增加说明。

* 启动参数增加 --no-single ,允许多开,实现特殊需求(重启需要)。增加了一个重启bgi的方法。增加了任务进度的功能,执行调度器任务时,会记录当前任务执行位置,当关闭后(比如F11),下次可以通过继续菜单,选择记录,从上次关闭任务处执行。

* 调整继续执行,最后一次成功的下一个任务执行

* 设置,其他设置,增加了调度器任务,遇到异常时,连续累计一定次数时,重启BGI,和可配置的重启游戏。

* 连续任务支持循环,右键支持从连续的某一个任务开始执行。修改了一些配置变量的写法,使之不会保存到json文件中。
2025-06-02 00:03:26 +08:00

184 lines
5.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using BetterGenshinImpact.Core.Config;
using BetterGenshinImpact.Core.Script.Group;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
namespace BetterGenshinImpact.GameTask.TaskProgress;
public class TaskProgressManager
{
private static readonly string _configDir = Global.Absolute(@"log\task_progress");
public static ILogger Logger { get; } = App.GetLogger<TaskProgressManager>();
public static void SaveTaskProgress(TaskProgress taskProgress)
{
// 如果目录不存在,则创建
if (!Directory.Exists(_configDir))
{
Directory.CreateDirectory(_configDir);
}
var file = Path.Combine(_configDir, $"{taskProgress.Name}.json");
File.WriteAllText(file, taskProgress.ToJson());
}
public static List<TaskProgress> LoadAllTaskProgress()
{
// 确保目录存在
if (!Directory.Exists(_configDir))
{
Directory.CreateDirectory(_configDir);
}
var result = new List<TaskProgress>();
var now = DateTime.Now;
// 匹配全数字文件名形如20250531081114.json
var regex = new Regex(@"^\d{14}\.json$");
var fileList = Directory.GetFiles(_configDir, "*.json")
.Where(file => regex.IsMatch(Path.GetFileName(file))) // 筛选纯数字 JSON
.Select(file => new FileInfo(file))
.OrderByDescending(fi => fi.LastWriteTime) // 最后修改时间倒序
.ToList();
foreach (var file in fileList.ToArray())
{
var fileName = file.Name;
// 跳过非纯数字文件名
// if (!regex.IsMatch(fileName)) continue;
var lastWrite = file.LastWriteTime;
// 删除3天前未修改的文件
if ((now - lastWrite).TotalDays > 3)
{
try
{
file.Delete();
}
catch (Exception ex)
{
Logger.LogInformation($"删除文件失败:{file} - {ex.Message}");
}
continue;
}
try
{
var json = File.ReadAllText(file.FullName);
var progress = JsonConvert.DeserializeObject<TaskProgress>(json);
if (progress != null && progress.EndTime == null)
result.Add(progress);
}
catch (Exception ex)
{
Logger.LogInformation($"读取文件失败:{file} - {ex.Message}");
}
}
return result;
}
public static void GenerNextProjectInfo(
TaskProgress taskProgress,
List<ScriptGroup> scriptGroups)
{
var currentGroupIndex = 0;
var currentProjectIndex = -1;
/*if (taskProgress.LastSuccessScriptGroupProjectInfo == null)
return ;*/
if (taskProgress.LastScriptGroupName!=null)
{
currentGroupIndex = scriptGroups.FindIndex(g => g.Name == taskProgress.LastScriptGroupName);
if (currentGroupIndex == -1)
return ;
}
var currentGroup = scriptGroups[currentGroupIndex];
var isLastInGroup = false;
if (taskProgress.LastSuccessScriptGroupProjectInfo!=null)
{
var currentProjectInfo = taskProgress.LastSuccessScriptGroupProjectInfo;
currentProjectIndex = currentGroup.Projects.ToList().FindIndex(p =>
p.Name == currentProjectInfo.Name &&
p.FolderName == currentProjectInfo.FolderName);
if (currentProjectIndex == -1)
return ;
isLastInGroup = currentProjectIndex == currentGroup.Projects.Count - 1;
}
//bool isIncomplete = currentProjectInfo.EndTime == null;
if (isLastInGroup)
{
// 向后查找下一个非空组
for (int i = currentGroupIndex + 1; i < scriptGroups.Count; i++)
{
var group = scriptGroups[i];
if (group.Projects != null && group.Projects.Any())
{
var project = group.Projects.First();
taskProgress.Next=new TaskProgress.Progress
{
GroupName = group.Name,
Index = 0,
ProjectName = project.Name,
FolderName = project.FolderName
};
return;
}
}
// 循环从开头查找直到当前组之前
if (taskProgress.Loop)
{
for (int i = 0; i < currentGroupIndex; i++)
{
var group = scriptGroups[i];
if (group.Projects != null && group.Projects.Any())
{
var project = group.Projects.First();
taskProgress.Next = new TaskProgress.Progress
{
GroupName = group.Name,
Index = 0,
ProjectName = project.Name,
FolderName = project.FolderName
};
return;
}
}
}
return ;
}
else
{
//取成功执行的下一个任务
currentProjectIndex++;
}
// 返回当前项目
var currentProject = currentGroup.Projects[currentProjectIndex];
taskProgress.Next = new TaskProgress.Progress
{
GroupName = currentGroup.Name,
Index = currentProjectIndex,
ProjectName = currentProject.Name,
FolderName = currentProject.FolderName
};
}
}