diff --git a/v2rayN/ServiceLib/Handler/SubscriptionHandler.cs b/v2rayN/ServiceLib/Handler/SubscriptionHandler.cs index 03d97f13..4edd6c72 100644 --- a/v2rayN/ServiceLib/Handler/SubscriptionHandler.cs +++ b/v2rayN/ServiceLib/Handler/SubscriptionHandler.cs @@ -2,17 +2,18 @@ namespace ServiceLib.Handler; public static class SubscriptionHandler { - public static async Task UpdateProcess(Config config, string subId, bool blProxy, Action updateFunc) + public static async Task UpdateProcess(Config config, string subId, bool blProxy, Func updateFunc) { - updateFunc?.Invoke(false, ResUI.MsgUpdateSubscriptionStart); + await updateFunc?.Invoke(false, ResUI.MsgUpdateSubscriptionStart); var subItem = await AppManager.Instance.SubItems(); if (subItem is not { Count: > 0 }) { - updateFunc?.Invoke(false, ResUI.MsgNoValidSubscription); + await updateFunc?.Invoke(false, ResUI.MsgNoValidSubscription); return; } + var successCount = 0; foreach (var item in subItem) { try @@ -25,32 +26,35 @@ public static class SubscriptionHandler var hashCode = $"{item.Remarks}->"; if (item.Enabled == false) { - updateFunc?.Invoke(false, $"{hashCode}{ResUI.MsgSkipSubscriptionUpdate}"); + await updateFunc?.Invoke(false, $"{hashCode}{ResUI.MsgSkipSubscriptionUpdate}"); continue; } // Create download handler var downloadHandle = CreateDownloadHandler(hashCode, updateFunc); - updateFunc?.Invoke(false, $"{hashCode}{ResUI.MsgStartGettingSubscriptions}"); + await updateFunc?.Invoke(false, $"{hashCode}{ResUI.MsgStartGettingSubscriptions}"); // Get all subscription content (main subscription + additional subscriptions) var result = await DownloadAllSubscriptions(config, item, blProxy, downloadHandle); // Process download result - await ProcessDownloadResult(config, item.Id, result, hashCode, updateFunc); + if (await ProcessDownloadResult(config, item.Id, result, hashCode, updateFunc)) + { + successCount++; + } - updateFunc?.Invoke(false, "-------------------------------------------------------"); + await updateFunc?.Invoke(false, "-------------------------------------------------------"); } catch (Exception ex) { var hashCode = $"{item.Remarks}->"; Logging.SaveLog("UpdateSubscription", ex); - updateFunc?.Invoke(false, $"{hashCode}{ResUI.MsgFailedImportSubscription}: {ex.Message}"); - updateFunc?.Invoke(false, "-------------------------------------------------------"); + await updateFunc?.Invoke(false, $"{hashCode}{ResUI.MsgFailedImportSubscription}: {ex.Message}"); + await updateFunc?.Invoke(false, "-------------------------------------------------------"); } } - updateFunc?.Invoke(true, $"{ResUI.MsgUpdateSubscriptionEnd}"); + await updateFunc?.Invoke(successCount > 0, $"{ResUI.MsgUpdateSubscriptionEnd}"); } private static bool IsValidSubscription(SubItem item, string subId) @@ -76,7 +80,7 @@ public static class SubscriptionHandler return true; } - private static DownloadService CreateDownloadHandler(string hashCode, Action updateFunc) + private static DownloadService CreateDownloadHandler(string hashCode, Func updateFunc) { var downloadHandle = new DownloadService(); downloadHandle.Error += (sender2, args) => @@ -181,23 +185,23 @@ public static class SubscriptionHandler return result; } - private static async Task ProcessDownloadResult(Config config, string id, string result, string hashCode, Action updateFunc) + private static async Task ProcessDownloadResult(Config config, string id, string result, string hashCode, Func updateFunc) { if (result.IsNullOrEmpty()) { - updateFunc?.Invoke(false, $"{hashCode}{ResUI.MsgSubscriptionDecodingFailed}"); - return; + await updateFunc?.Invoke(false, $"{hashCode}{ResUI.MsgSubscriptionDecodingFailed}"); + return false; } - updateFunc?.Invoke(false, $"{hashCode}{ResUI.MsgGetSubscriptionSuccessfully}"); + await updateFunc?.Invoke(false, $"{hashCode}{ResUI.MsgGetSubscriptionSuccessfully}"); // If result is too short, display content directly if (result.Length < 99) { - updateFunc?.Invoke(false, $"{hashCode}{result}"); + await updateFunc?.Invoke(false, $"{hashCode}{result}"); } - updateFunc?.Invoke(false, $"{hashCode}{ResUI.MsgStartParsingSubscription}"); + await updateFunc?.Invoke(false, $"{hashCode}{ResUI.MsgStartParsingSubscription}"); // Add servers to configuration var ret = await ConfigHandler.AddBatchServers(config, result, id, true); @@ -208,9 +212,10 @@ public static class SubscriptionHandler } // Update completion message - updateFunc?.Invoke(false, - ret > 0 + await updateFunc?.Invoke(false, ret > 0 ? $"{hashCode}{ResUI.MsgUpdateSubscriptionEnd}" : $"{hashCode}{ResUI.MsgFailedImportSubscription}"); + + return ret > 0; } } diff --git a/v2rayN/ServiceLib/Manager/TaskManager.cs b/v2rayN/ServiceLib/Manager/TaskManager.cs index b968dc16..d9e5cd76 100644 --- a/v2rayN/ServiceLib/Manager/TaskManager.cs +++ b/v2rayN/ServiceLib/Manager/TaskManager.cs @@ -4,13 +4,18 @@ public class TaskManager { private static readonly Lazy _instance = new(() => new()); public static TaskManager Instance => _instance.Value; + private Config _config; + private Func? _updateFunc; - public void RegUpdateTask(Config config, Action updateFunc) + public void RegUpdateTask(Config config, Func updateFunc) { - Task.Run(() => ScheduledTasks(config, updateFunc)); + _config = config; + _updateFunc = updateFunc; + + Task.Run(ScheduledTasks); } - private async Task ScheduledTasks(Config config, Action updateFunc) + private async Task ScheduledTasks() { Logging.SaveLog("Setup Scheduled Tasks"); @@ -21,14 +26,14 @@ public class TaskManager await Task.Delay(1000 * 60); //Execute once 1 minute - await UpdateTaskRunSubscription(config, updateFunc); + await UpdateTaskRunSubscription(); //Execute once 20 minute if (numOfExecuted % 20 == 0) { //Logging.SaveLog("Execute save config"); - await ConfigHandler.SaveConfig(config); + await ConfigHandler.SaveConfig(_config); await ProfileExManager.Instance.SaveTo(); } @@ -42,14 +47,14 @@ public class TaskManager FileManager.DeleteExpiredFiles(Utils.GetTempPath(), DateTime.Now.AddMonths(-1)); //Check once 1 hour - await UpdateTaskRunGeo(config, numOfExecuted / 60, updateFunc); + await UpdateTaskRunGeo(numOfExecuted / 60); } numOfExecuted++; } } - private async Task UpdateTaskRunSubscription(Config config, Action updateFunc) + private async Task UpdateTaskRunSubscription() { var updateTime = ((DateTimeOffset)DateTime.Now).ToUnixTimeSeconds(); var lstSubs = (await AppManager.Instance.SubItems())? @@ -66,30 +71,30 @@ public class TaskManager foreach (var item in lstSubs) { - await SubscriptionHandler.UpdateProcess(config, item.Id, true, (success, msg) => + await SubscriptionHandler.UpdateProcess(_config, item.Id, true, async (success, msg) => { - updateFunc?.Invoke(success, msg); + await _updateFunc?.Invoke(success, msg); if (success) { Logging.SaveLog($"Update subscription end. {msg}"); } }); item.UpdateTime = updateTime; - await ConfigHandler.AddSubItem(config, item); + await ConfigHandler.AddSubItem(_config, item); await Task.Delay(1000); } } - private async Task UpdateTaskRunGeo(Config config, int hours, Action updateFunc) + private async Task UpdateTaskRunGeo(int hours) { - if (config.GuiItem.AutoUpdateInterval > 0 && hours > 0 && hours % config.GuiItem.AutoUpdateInterval == 0) + if (_config.GuiItem.AutoUpdateInterval > 0 && hours > 0 && hours % _config.GuiItem.AutoUpdateInterval == 0) { Logging.SaveLog("Execute update geo files"); var updateHandle = new UpdateService(); - await updateHandle.UpdateGeoFileAll(config, (success, msg) => + await updateHandle.UpdateGeoFileAll(_config, (success, msg) => { - updateFunc?.Invoke(false, msg); + _updateFunc?.Invoke(false, msg); }); } } diff --git a/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs b/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs index f272b9f9..281eeda8 100644 --- a/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs @@ -254,7 +254,7 @@ public class MainWindowViewModel : MyReactiveObject } } - private void UpdateTaskHandler(bool success, string msg) + private async Task UpdateTaskHandler(bool success, string msg) { NoticeManager.Instance.SendMessageEx(msg); if (success) @@ -263,7 +263,7 @@ public class MainWindowViewModel : MyReactiveObject RefreshServers(); if (indexIdOld != _config.IndexId) { - _ = Reload(); + await Reload(); } if (_config.UiItem.EnableAutoAdjustMainLvColWidth) { @@ -596,7 +596,9 @@ public class MainWindowViewModel : MyReactiveObject Locator.Current.GetService()?.ProxiesReload(); } else - { TabMainSelectedIndex = 0; } + { + TabMainSelectedIndex = 0; + } } private async Task LoadCore() @@ -631,7 +633,7 @@ public class MainWindowViewModel : MyReactiveObject Locator.Current.GetService()?.RefreshRoutingsMenu(); await ConfigHandler.SaveConfig(_config); - await new UpdateService().UpdateGeoFileAll(_config, UpdateTaskHandler); + //TODO await new UpdateService().UpdateGeoFileAll(_config, UpdateTaskHandler); await Reload(); }