From 734df5def54c1c4de232b07b99d984bf7289d6aa Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri, 25 Feb 2022 19:05:54 +0800 Subject: [PATCH] Update subscription is to keep the same item --- v2rayN/v2rayN/Handler/ConfigHandler.cs | 77 ++++++++++++++++-------- v2rayN/v2rayN/Handler/MainFormHandler.cs | 14 +---- v2rayN/v2rayN/Handler/UpdateHandle.cs | 4 +- 3 files changed, 58 insertions(+), 37 deletions(-) diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index ef587c0a..01df629f 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -176,7 +176,7 @@ namespace v2rayN.Handler VmessItem vmessItem = config.vmess[i]; UpgradeServerVersion(ref vmessItem); - if (string.IsNullOrEmpty(vmessItem.indexId)) + if (Utils.IsNullOrEmpty(vmessItem.indexId)) { vmessItem.indexId = Utils.GetGUID(false); } @@ -724,6 +724,14 @@ namespace v2rayN.Handler { return -1; } + + //copy sub items + List lstOriSub = null; + if (!Utils.IsNullOrEmpty(subid)) + { + lstOriSub = config.vmess.Where(it => it.subid == subid).ToList(); + RemoveServerViaSubid(ref config, subid); + } //if (clipboardData.IndexOf("vmess") >= 0 && clipboardData.IndexOf("vmess") == clipboardData.LastIndexOf("vmess")) //{ // clipboardData = clipboardData.Replace("\r\n", "").Replace("\n", ""); @@ -735,7 +743,7 @@ namespace v2rayN.Handler foreach (string str in arrData) { //maybe sub - if (string.IsNullOrEmpty(subid) && (str.StartsWith(Global.httpsProtocol) || str.StartsWith(Global.httpProtocol))) + if (Utils.IsNullOrEmpty(subid) && (str.StartsWith(Global.httpsProtocol) || str.StartsWith(Global.httpProtocol))) { if (AddSubItem(ref config, str) == 0) { @@ -748,7 +756,18 @@ namespace v2rayN.Handler { continue; } - vmessItem.subid = subid; + + //exist sub items + if (!Utils.IsNullOrEmpty(subid)) + { + var existItem = lstOriSub?.FirstOrDefault(t => CompareVmessItem(t, vmessItem, true)); + if (existItem != null) + { + vmessItem = existItem; + } + vmessItem.subid = subid; + } + if (vmessItem.configType == (int)EConfigType.Vmess) { if (AddServer(ref config, vmessItem, -1, false) == 0) @@ -955,31 +974,15 @@ namespace v2rayN.Handler { var indexId = config.indexId(); - List source = config.vmess; + List source = config.vmess; bool keepOlder = config.keepOlderDedupl; - List list = new List(); + List list = new List(); if (!keepOlder) source.Reverse(); // Remove the early items first - bool _isAdded(Mode.VmessItem o, Mode.VmessItem n) + foreach (VmessItem item in source) { - return o.configVersion == n.configVersion && - o.configType == n.configType && - o.address == n.address && - o.port == n.port && - o.id == n.id && - o.alterId == n.alterId && - o.security == n.security && - o.network == n.network && - o.headerType == n.headerType && - o.requestHost == n.requestHost && - o.path == n.path && - o.streamSecurity == n.streamSecurity; - // skip (will remove) different remarks - } - foreach (Mode.VmessItem item in source) - { - if (!list.Exists(i => _isAdded(i, item))) + if (!list.Exists(i => CompareVmessItem(i, item, false))) { list.Add(item); } @@ -994,7 +997,10 @@ namespace v2rayN.Handler public static int AddServerCommon(ref Config config, VmessItem vmessItem) { - vmessItem.indexId = Utils.GetGUID(false); + if (Utils.IsNullOrEmpty(vmessItem.indexId)) + { + vmessItem.indexId = Utils.GetGUID(false); + } vmessItem.configVersion = 2; if (Utils.IsNullOrEmpty(vmessItem.allowInsecure)) { @@ -1041,6 +1047,29 @@ namespace v2rayN.Handler return 0; } + private static bool CompareVmessItem(VmessItem o, VmessItem n, bool remarks) + { + if (o == null || n == null) + { + return false; + } + + return o.configVersion == n.configVersion + && o.configType == n.configType + && o.address == n.address + && o.port == n.port + && o.id == n.id + && o.alterId == n.alterId + && o.security == n.security + && o.network == n.network + && o.headerType == n.headerType + && o.requestHost == n.requestHost + && o.path == n.path + && o.streamSecurity == n.streamSecurity + && o.flow == n.flow + && (remarks ? o.remarks == n.remarks : true); + } + #endregion #region UI diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index 7e57c7cc..499d1ec8 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -9,9 +9,9 @@ using v2rayN.Mode; namespace v2rayN.Handler { - class MainFormHandler + public sealed class MainFormHandler { - private static MainFormHandler instance; + private static readonly Lazy instance = new Lazy(() => new MainFormHandler()); Action _updateUI; //private DownloadHandle downloadHandle2; @@ -22,16 +22,8 @@ namespace v2rayN.Handler //Action _updateFunc; public static MainFormHandler Instance { - get - { - if (instance == null) - { - instance = new MainFormHandler(); - } - return instance; - } + get { return instance.Value; } } - public Icon GetNotifyIcon(Config config, Icon def) { try diff --git a/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayN/v2rayN/Handler/UpdateHandle.cs index 6f503b89..509bfc0e 100644 --- a/v2rayN/v2rayN/Handler/UpdateHandle.cs +++ b/v2rayN/v2rayN/Handler/UpdateHandle.cs @@ -204,8 +204,8 @@ namespace v2rayN.Handler return; } - ConfigHandler.RemoveServerViaSubid(ref config, id); - _updateFunc(false, $"{hashCode}{UIRes.I18N("MsgClearSubscription")}"); + //ConfigHandler.RemoveServerViaSubid(ref config, id); + //_updateFunc(false, $"{hashCode}{UIRes.I18N("MsgClearSubscription")}"); // RefreshServers(); int ret = MainFormHandler.Instance.AddBatchServers(config, result, id); if (ret > 0)