diff --git a/Netch/Forms/MainForm.MenuStrip.cs b/Netch/Forms/MainForm.MenuStrip.cs index a3dcb6f4..9cb1660e 100644 --- a/Netch/Forms/MainForm.MenuStrip.cs +++ b/Netch/Forms/MainForm.MenuStrip.cs @@ -100,9 +100,7 @@ namespace Netch.Forms } - private readonly object _serverLock = new object(); - - public async Task UpdateServersFromSubscribe() + private async Task UpdateServersFromSubscribe() { void DisableItems(bool v) { @@ -126,9 +124,11 @@ namespace Netch.Forms StatusText(i18N.Translate("Starting update subscription")); DisableItems(false); + var useProxyToUpdateSubscription = Global.Settings.UseProxyToUpdateSubscription; try { - if (Global.Settings.UseProxyToUpdateSubscription) + string proxyServer = null; + if (useProxyToUpdateSubscription) { var mode = new Models.Mode { @@ -136,50 +136,10 @@ namespace Netch.Forms Type = 5 }; await MainController.Start(ServerComboBox.SelectedItem as Server, mode); + proxyServer = $"http://127.0.0.1:{Global.Settings.HTTPLocalPort}"; } - await Task.WhenAll(Global.Settings.SubscribeLink.Select(async item => await Task.Run(() => - { - try - { - var request = WebUtil.CreateRequest(item.Link); - - if (!string.IsNullOrEmpty(item.UserAgent)) request.UserAgent = item.UserAgent; - if (Global.Settings.UseProxyToUpdateSubscription) - request.Proxy = new WebProxy($"http://127.0.0.1:{Global.Settings.HTTPLocalPort}"); - - List servers; - - var result = WebUtil.DownloadString(request, out var rep); - if (rep.StatusCode == HttpStatusCode.OK) - { - servers = ShareLink.ParseText(result); - } - else - { - throw new Exception($"{item.Remark} Response Status Code: {rep.StatusCode}"); - } - - foreach (var server in servers) - { - server.Group = item.Remark; - } - - lock (_serverLock) - { - Global.Settings.Server.RemoveAll(server => server.Group.Equals(item.Remark)); - Global.Settings.Server.AddRange(servers); - } - - - NotifyTip(i18N.TranslateFormat("Update {1} server(s) from {0}", item.Remark, servers.Count)); - } - catch (Exception e) - { - NotifyTip($"{i18N.TranslateFormat("Update servers error from {0}", item.Remark)}\n{e.Message}", info: false); - Logging.Error(e.ToString()); - } - })).ToArray()); + await Subscription.UpdateServersAsync(proxyServer); InitServer(); Configuration.Save(); @@ -191,9 +151,16 @@ namespace Netch.Forms } finally { - if (Global.Settings.UseProxyToUpdateSubscription) + if (useProxyToUpdateSubscription) { - await MainController.Stop(); + try + { + await MainController.Stop(); + } + catch + { + // ignored + } } DisableItems(true); diff --git a/Netch/Forms/MainForm.cs b/Netch/Forms/MainForm.cs index f6b0e5f8..58ab1f7e 100644 --- a/Netch/Forms/MainForm.cs +++ b/Netch/Forms/MainForm.cs @@ -472,7 +472,7 @@ namespace Netch.Forms Activate(); } - private void NotifyTip(string text, int timeout = 0, bool info = true) + public void NotifyTip(string text, int timeout = 0, bool info = true) { // 会阻塞线程 timeout 秒 NotifyIcon.ShowBalloonTip(timeout, diff --git a/Netch/Utils/Subscription.cs b/Netch/Utils/Subscription.cs new file mode 100644 index 00000000..e0f980a7 --- /dev/null +++ b/Netch/Utils/Subscription.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Threading.Tasks; +using Netch.Models; + +namespace Netch.Utils +{ + public static class Subscription + { + private static readonly object ServerLock = new object(); + + public static async Task UpdateServersAsync(string proxyServer = default) + { + await Task.WhenAll( + Global.Settings.SubscribeLink.Select(item => + Task.Run(() => UpdateServer(item, proxyServer)) + ).ToArray() + ); + } + + public static void UpdateServer(SubscribeLink item, string proxyServer) + { + try + { + var request = WebUtil.CreateRequest(item.Link); + + if (!string.IsNullOrEmpty(item.UserAgent)) request.UserAgent = item.UserAgent; + if (!string.IsNullOrEmpty(proxyServer)) request.Proxy = new WebProxy(proxyServer); + + List servers; + + var result = WebUtil.DownloadString(request, out var rep); + if (rep.StatusCode == HttpStatusCode.OK) + servers = ShareLink.ParseText(result); + else + throw new Exception($"{item.Remark} Response Status Code: {rep.StatusCode}"); + + foreach (var server in servers) server.Group = item.Remark; + + lock (ServerLock) + { + Global.Settings.Server.RemoveAll(server => server.Group.Equals(item.Remark)); + Global.Settings.Server.AddRange(servers); + } + + Global.MainForm.NotifyTip(i18N.TranslateFormat("Update {1} server(s) from {0}", item.Remark, servers.Count)); + } + catch (Exception e) + { + Global.MainForm.NotifyTip($"{i18N.TranslateFormat("Update servers error from {0}", item.Remark)}\n{e.Message}", info: false); + Logging.Error(e.ToString()); + } + } + } +} \ No newline at end of file