diff --git a/Netch/Forms/MainForm.MenuStrip.cs b/Netch/Forms/MainForm.MenuStrip.cs index 22ca6993..b48b3d23 100644 --- a/Netch/Forms/MainForm.MenuStrip.cs +++ b/Netch/Forms/MainForm.MenuStrip.cs @@ -26,19 +26,8 @@ namespace Netch.Forms var texts = Clipboard.GetText(); if (!string.IsNullOrWhiteSpace(texts)) { - var result = ShareLink.ParseText(texts); - - if (result != null) - { - foreach (var server in result) - { - Global.Settings.Server.Add(server); - } - } - else - { - MessageBoxX.Show(i18N.Translate("Import servers error!"), LogLevel.ERROR); - } + Global.Settings.Server.AddRange(ShareLink.ParseText(texts)); + NotifyTip(i18N.TranslateFormat("Import {0} server(s) form Clipboard", ShareLink.ParseText(texts).Count)); InitServer(); Configuration.Save(); @@ -108,6 +97,9 @@ namespace Netch.Forms await UpdateServersFromSubscribe(); } + + private readonly object _serverLock = new object(); + public async Task UpdateServersFromSubscribe() { void DisableItems(bool v) @@ -144,8 +136,6 @@ namespace Netch.Forms await MainController.Start(ServerComboBox.SelectedItem as Server, mode); } - var serverLock = new object(); - await Task.WhenAll(Global.Settings.SubscribeLink.Select(async item => await Task.Run(async () => { try @@ -156,31 +146,25 @@ namespace Netch.Forms if (Global.Settings.UseProxyToUpdateSubscription) request.Proxy = new WebProxy($"http://127.0.0.1:{Global.Settings.HTTPLocalPort}"); - var str = await WebUtil.DownloadStringAsync(request); + var servers = ShareLink.ParseText(await WebUtil.DownloadStringAsync(request)); - lock (serverLock) + foreach (var server in servers) { - Global.Settings.Server.RemoveAll(server => server.Group == item.Remark); - - var result = ShareLink.ParseText(str); - if (result != null) - { - foreach (var server in result) - { - server.Group = item.Remark; - Global.Settings.Server.Add(server); - } - } - - NotifyTip(i18N.TranslateFormat("Update {1} server(s) from {0}", item.Remark, result?.Count ?? 0)); + server.Group = item.Remark; } - } - catch (WebException e) - { - NotifyTip($"{i18N.TranslateFormat("Update servers error from {0}", item.Remark)}\n{e.Message}", info: false); + + 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()); diff --git a/Netch/Utils/ShareLink.cs b/Netch/Utils/ShareLink.cs index 3f942de0..45e9d9c0 100644 --- a/Netch/Utils/ShareLink.cs +++ b/Netch/Utils/ShareLink.cs @@ -120,42 +120,30 @@ namespace Netch.Utils } var list = new List(); + try { - try + list.AddRange(JsonConvert.DeserializeObject>(text).Select(server => new Shadowsocks { - list.AddRange(JsonConvert.DeserializeObject>(text).Select(server => new Shadowsocks - { - Hostname = server.server, - Port = server.server_port, - EncryptMethod = server.method, - Password = server.password, - Remark = server.remarks, - Plugin = server.plugin, - PluginOption = server.plugin_opts - })); - } - catch (JsonReaderException) + Hostname = server.server, + Port = server.server_port, + EncryptMethod = server.method, + Password = server.password, + Remark = server.remarks, + Plugin = server.plugin, + PluginOption = server.plugin_opts + })); + } + catch (JsonReaderException) + { + foreach (var line in text.GetLines()) { - foreach (var line in text.GetLines()) - { - var servers = ParseUri(line); - if (servers != null) - { - list.AddRange(servers); - } - } - } - - if (list.Count == 0) - { - return null; + list.AddRange(ParseUri(line)); } } catch (Exception e) { Logging.Error(e.ToString()); - return null; } return list; @@ -179,19 +167,19 @@ namespace Netch.Utils { var scheme = GetUriScheme(text); var util = ServerHelper.GetUtilByUriScheme(scheme); - if (util == null) + if (util != null) + { + list.AddRange(util.ParseUri(text)); + } + else { Logging.Warning($"无法处理 {scheme} 协议订阅链接"); - return null; } - - list.AddRange(util.ParseUri(text)); } } catch (Exception e) { Logging.Error(e.ToString()); - return null; } foreach (var node in list) @@ -212,26 +200,35 @@ namespace Netch.Utils private static Server ParseNetchUri(string text) { - text = text.Substring(8); - var NetchLink = (JObject) JsonConvert.DeserializeObject(URLSafeBase64Decode(text)); - if (NetchLink == null) + try { + text = text.Substring(8); + + var NetchLink = (JObject) JsonConvert.DeserializeObject(URLSafeBase64Decode(text)); + if (NetchLink == null) + { + return null; + } + + if (string.IsNullOrEmpty((string) NetchLink["Hostname"])) + { + return null; + } + + if (!ushort.TryParse((string) NetchLink["Port"], out _)) + { + return null; + } + + var type = (string) NetchLink["Type"]; + var s = ServerHelper.GetUtilByTypeName(type).ParseJObject(NetchLink); + return ServerHelper.GetUtilByTypeName(s.Type).CheckServer(s) ? s : null; + } + catch (Exception e) + { + Logging.Warning(e.ToString()); return null; } - - if (string.IsNullOrEmpty((string) NetchLink["Hostname"])) - { - return null; - } - - if (!ushort.TryParse((string) NetchLink["Port"], out _)) - { - return null; - } - - var type = (string) NetchLink["Type"]; - var s = ServerHelper.GetUtilByTypeName(type).ParseJObject(NetchLink); - return ServerHelper.GetUtilByTypeName(s.Type).CheckServer(s) ? s : null; } public static string GetNetchLink(Server s)