mirror of
https://github.com/2dust/v2rayN.git
synced 2026-11-08 13:35:01 +03:00
92a9da8b6b
* Refactor download * webapi * Fallback * Fix Sub * Life cycle * Yet another way of the life cycle * Shared CookieContainer * Fix
153 lines
4.9 KiB
C#
153 lines
4.9 KiB
C#
namespace ServiceLib.Manager;
|
|
|
|
public class TaskManager
|
|
{
|
|
private static readonly Lazy<TaskManager> _instance = new(() => new());
|
|
public static TaskManager Instance => _instance.Value;
|
|
private Config _config;
|
|
private Func<bool, string, Task>? _updateFunc;
|
|
|
|
public void RegUpdateTask(Config config, Func<bool, string, Task> updateFunc)
|
|
{
|
|
_config = config;
|
|
_updateFunc = updateFunc;
|
|
|
|
Task.Run(ScheduledTasks);
|
|
}
|
|
|
|
private async Task ScheduledTasks()
|
|
{
|
|
Logging.SaveLog("Setup Scheduled Tasks");
|
|
|
|
using var timer = new PeriodicTimer(TimeSpan.FromMinutes(1));
|
|
var numOfExecuted = 1;
|
|
while (await timer.WaitForNextTickAsync().ConfigureAwait(false))
|
|
{
|
|
//Execute once 1 minute
|
|
try
|
|
{
|
|
await UpdateTaskRunSubscription();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logging.SaveLog("ScheduledTasks - UpdateTaskRunSubscription", ex);
|
|
}
|
|
|
|
//Execute once 20 minute
|
|
if (numOfExecuted % 20 == 0)
|
|
{
|
|
//Logging.SaveLog("Execute save config");
|
|
|
|
try
|
|
{
|
|
await ConfigHandler.SaveConfig(_config);
|
|
await ProfileExManager.Instance.SaveTo();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logging.SaveLog("ScheduledTasks - SaveConfig", ex);
|
|
}
|
|
}
|
|
|
|
//Execute once 1 hour
|
|
if (numOfExecuted % 60 == 0)
|
|
{
|
|
//Logging.SaveLog("Execute delete expired files");
|
|
|
|
FileUtils.DeleteExpiredFiles(Utils.GetBinConfigPath(), DateTime.Now.AddHours(-1), "Test");
|
|
FileUtils.DeleteExpiredFiles(Utils.GetLogPath(), DateTime.Now.AddDays(-7));
|
|
FileUtils.DeleteExpiredFiles(Utils.GetTempPath(), DateTime.Now.AddDays(-7));
|
|
|
|
try
|
|
{
|
|
await UpdateTaskRunGeo(numOfExecuted / 60);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logging.SaveLog("ScheduledTasks - UpdateTaskRunGeo", ex);
|
|
}
|
|
}
|
|
|
|
//Execute once 24 hour
|
|
if (numOfExecuted % 1440 == 1)
|
|
{
|
|
try
|
|
{
|
|
await UpdateTaskRunCheckUpdate();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logging.SaveLog("ScheduledTasks - UpdateTaskRunCheckUpdate", ex);
|
|
}
|
|
}
|
|
numOfExecuted++;
|
|
}
|
|
}
|
|
|
|
private async Task UpdateTaskRunSubscription()
|
|
{
|
|
var updateTime = ((DateTimeOffset)DateTime.Now).ToUnixTimeSeconds();
|
|
var lstSubs = (await AppManager.Instance.SubItems())?
|
|
.Where(t => t.AutoUpdateInterval > 0)
|
|
.Where(t => updateTime - t.UpdateTime >= t.AutoUpdateInterval * 60)
|
|
.ToList();
|
|
|
|
if (lstSubs is not { Count: > 0 })
|
|
{
|
|
return;
|
|
}
|
|
|
|
Logging.SaveLog("Execute update subscription");
|
|
|
|
foreach (var item in lstSubs)
|
|
{
|
|
var handler = new SubscriptionHandler(_config, true, async (success, msg) =>
|
|
{
|
|
await _updateFunc?.Invoke(success, msg);
|
|
if (success)
|
|
{
|
|
Logging.SaveLog($"Update subscription end. {msg}");
|
|
}
|
|
});
|
|
await handler.UpdateProcess(item.Id);
|
|
item.UpdateTime = updateTime;
|
|
await ConfigHandler.AddSubItem(_config, item);
|
|
await Task.Delay(1000);
|
|
}
|
|
}
|
|
|
|
private async Task UpdateTaskRunGeo(int hours)
|
|
{
|
|
if (_config.GuiItem.AutoUpdateInterval > 0 && hours > 0 && hours % _config.GuiItem.AutoUpdateInterval == 0)
|
|
{
|
|
Logging.SaveLog("Execute update geo files");
|
|
|
|
using var downloadService = await DownloadService.CreateDownloadServiceWithCheck(_config.CheckUpdateItem.UpdateViaProxy);
|
|
await new UpdateService(downloadService, _config, async (success, msg) =>
|
|
{
|
|
await _updateFunc?.Invoke(false, msg);
|
|
}).UpdateGeoFileAll();
|
|
}
|
|
}
|
|
|
|
private async Task UpdateTaskRunCheckUpdate()
|
|
{
|
|
Logging.SaveLog("Execute check update");
|
|
|
|
using var downloadService = await DownloadService.CreateDownloadServiceWithCheck(_config.CheckUpdateItem.UpdateViaProxy);
|
|
var updateService = new UpdateService(downloadService, _config, async (success, msg) => await Task.CompletedTask);
|
|
|
|
var msgs = await updateService.CheckHasUpdateOnlyAll();
|
|
foreach (var msg in msgs)
|
|
{
|
|
await _updateFunc?.Invoke(false, msg);
|
|
}
|
|
NoticeManager.Instance.Enqueue(string.Join("\n", msgs));
|
|
|
|
if (msgs.Count > 0)
|
|
{
|
|
AppEvents.HasUpdateNotified.Publish(true);
|
|
}
|
|
}
|
|
}
|