From 587686ffce5b35c062f5ed57aee1e57a2627bdd2 Mon Sep 17 00:00:00 2001 From: DHR60 Date: Tue, 23 Sep 2025 10:27:23 +0800 Subject: [PATCH] Refactor --- v2rayN/ServiceLib/Models/ProfileItem.cs | 16 +- .../Singbox/CoreConfigSingboxService.cs | 160 +++-------------- .../Singbox/SingboxOutboundService.cs | 16 +- .../Singbox/SingboxRoutingService.cs | 23 +-- .../V2ray/CoreConfigV2rayService.cs | 166 +++--------------- .../CoreConfig/V2ray/V2rayOutboundService.cs | 56 ++++++ .../CoreConfig/V2ray/V2rayRoutingService.cs | 27 +-- 7 files changed, 124 insertions(+), 340 deletions(-) diff --git a/v2rayN/ServiceLib/Models/ProfileItem.cs b/v2rayN/ServiceLib/Models/ProfileItem.cs index 848c7a65..da34600b 100644 --- a/v2rayN/ServiceLib/Models/ProfileItem.cs +++ b/v2rayN/ServiceLib/Models/ProfileItem.cs @@ -32,19 +32,19 @@ public class ProfileItem : ReactiveObject public string GetSummary() { var summary = $"[{(ConfigType).ToString()}] "; - var arrAddr = Address.Contains(':') ? Address.Split(':') : Address.Split('.'); - var addr = arrAddr.Length switch - { - > 2 => $"{arrAddr.First()}***{arrAddr.Last()}", - > 1 => $"***{arrAddr.Last()}", - _ => Address - }; - if (ConfigType is EConfigType.Custom or > EConfigType.Group) + if (IsComplex()) { summary += $"[{CoreType.ToString()}]{Remarks}"; } else { + var arrAddr = Address.Contains(':') ? Address.Split(':') : Address.Split('.'); + var addr = arrAddr.Length switch + { + > 2 => $"{arrAddr.First()}***{arrAddr.Last()}", + > 1 => $"***{arrAddr.Last()}", + _ => Address + }; summary += $"{Remarks}({addr}:{Port})"; } return summary; diff --git a/v2rayN/ServiceLib/Services/CoreConfig/Singbox/CoreConfigSingboxService.cs b/v2rayN/ServiceLib/Services/CoreConfig/Singbox/CoreConfigSingboxService.cs index b1432372..757ad3a3 100644 --- a/v2rayN/ServiceLib/Services/CoreConfig/Singbox/CoreConfigSingboxService.cs +++ b/v2rayN/ServiceLib/Services/CoreConfig/Singbox/CoreConfigSingboxService.cs @@ -15,35 +15,8 @@ public partial class CoreConfigSingboxService(Config config) var ret = new RetResult(); try { - if (node?.ConfigType is EConfigType.PolicyGroup or EConfigType.ProxyChain) - { - ProfileGroupItemManager.Instance.TryGet(node.IndexId, out var profileGroupItem); - if (profileGroupItem == null || profileGroupItem.ChildItems.IsNullOrEmpty()) - { - ret.Msg = ResUI.CheckServerSettings; - return ret; - } - var childProfiles = (await Task.WhenAll( - Utils.String2List(profileGroupItem.ChildItems) - .Where(p => !p.IsNullOrEmpty()) - .Select(AppManager.Instance.GetProfileItem) - )).Where(p => p != null).ToList(); - if (childProfiles.Count <= 0) - { - ret.Msg = ResUI.CheckServerSettings; - return ret; - } - switch (node.ConfigType) - { - case EConfigType.PolicyGroup: - return await GenerateClientMultipleLoadConfig(childProfiles, profileGroupItem.MultipleLoad); - case EConfigType.ProxyChain: - return await GenerateClientChainConfig(childProfiles); - } - } - if (node == null - || node.Port <= 0) + || !node.IsValid()) { ret.Msg = ResUI.CheckServerSettings; return ret; @@ -55,6 +28,17 @@ public partial class CoreConfigSingboxService(Config config) } ret.Msg = ResUI.InitialConfiguration; + + if (node?.ConfigType is EConfigType.PolicyGroup or EConfigType.ProxyChain) + { + switch (node.ConfigType) + { + case EConfigType.PolicyGroup: + return await GenerateClientMultipleLoadConfig(node); + case EConfigType.ProxyChain: + return await GenerateClientChainConfig(node); + } + } var result = EmbedUtils.GetEmbedText(Global.SingboxSampleClient); if (result.IsNullOrEmpty()) @@ -169,12 +153,9 @@ public partial class CoreConfigSingboxService(Config config) continue; } var item = await AppManager.Instance.GetProfileItem(it.IndexId); - if (it.ConfigType is EConfigType.VMess or EConfigType.VLESS) + if (item is null || item.IsComplex() || !item.IsValid()) { - if (item is null || item.Id.IsNullOrEmpty() || !Utils.IsGuidByParse(item.Id)) - { - continue; - } + continue; } //find unused port @@ -214,27 +195,6 @@ public partial class CoreConfigSingboxService(Config config) singboxConfig.inbounds.Add(inbound); //outbound - if (item is null) - { - continue; - } - if (item.ConfigType == EConfigType.Shadowsocks - && !Global.SsSecuritiesInSingbox.Contains(item.Security)) - { - continue; - } - if (item.ConfigType == EConfigType.VLESS - && !Global.Flows.Contains(item.Flow)) - { - continue; - } - if (it.ConfigType is EConfigType.VLESS or EConfigType.Trojan - && item.StreamSecurity == Global.StreamSecurityReality - && item.PublicKey.IsNullOrEmpty()) - { - continue; - } - var server = await GenServer(item); if (server is null) { @@ -293,7 +253,8 @@ public partial class CoreConfigSingboxService(Config config) var ret = new RetResult(); try { - if (node is not { Port: > 0 }) + if (node == null + || !node.IsValid()) { ret.Msg = ResUI.CheckServerSettings; return ret; @@ -371,7 +332,7 @@ public partial class CoreConfigSingboxService(Config config) } } - public async Task GenerateClientMultipleLoadConfig(List selecteds, EMultipleLoad multipleLoad) + public async Task GenerateClientMultipleLoadConfig(ProfileItem parentNode) { var ret = new RetResult(); try @@ -405,53 +366,12 @@ public partial class CoreConfigSingboxService(Config config) await GenRouting(singboxConfig); await GenExperimental(singboxConfig); - var proxyProfiles = new List(); - foreach (var it in selecteds) - { - if (it.ConfigType is EConfigType.PolicyGroup or EConfigType.ProxyChain) - { - var itemGroup = await AppManager.Instance.GetProfileItem(it.IndexId); - proxyProfiles.Add(itemGroup); - } - if (!Global.SingboxSupportConfigType.Contains(it.ConfigType)) - { - continue; - } - if (it.Port <= 0) - { - continue; - } - var item = await AppManager.Instance.GetProfileItem(it.IndexId); - if (item is null) - { - continue; - } - if (it.ConfigType is EConfigType.VMess or EConfigType.VLESS) - { - if (item.Id.IsNullOrEmpty() || !Utils.IsGuidByParse(item.Id)) - { - continue; - } - } - if (item.ConfigType == EConfigType.Shadowsocks - && !Global.SsSecuritiesInSingbox.Contains(item.Security)) - { - continue; - } - if (item.ConfigType == EConfigType.VLESS && !Global.Flows.Contains(item.Flow)) - { - continue; - } - - //outbound - proxyProfiles.Add(item); - } - if (proxyProfiles.Count <= 0) + var groupRet = await GenGroupOutbound(parentNode, singboxConfig); + if (groupRet != 0) { ret.Msg = ResUI.FailedGenDefaultConfiguration; return ret; } - await GenOutboundsListWithChain(proxyProfiles, singboxConfig, multipleLoad); await GenDns(null, singboxConfig); await ConvertGeo2Ruleset(singboxConfig); @@ -469,7 +389,7 @@ public partial class CoreConfigSingboxService(Config config) } } - public async Task GenerateClientChainConfig(List selecteds) + public async Task GenerateClientChainConfig(ProfileItem parentNode) { var ret = new RetResult(); try @@ -503,48 +423,12 @@ public partial class CoreConfigSingboxService(Config config) await GenExperimental(singboxConfig); singboxConfig.outbounds.RemoveAt(0); - var proxyProfiles = new List(); - foreach (var it in selecteds) - { - if (!Global.SingboxSupportConfigType.Contains(it.ConfigType)) - { - continue; - } - if (it.Port <= 0) - { - continue; - } - var item = await AppManager.Instance.GetProfileItem(it.IndexId); - if (item is null) - { - continue; - } - if (it.ConfigType is EConfigType.VMess or EConfigType.VLESS) - { - if (item.Id.IsNullOrEmpty() || !Utils.IsGuidByParse(item.Id)) - { - continue; - } - } - if (item.ConfigType == EConfigType.Shadowsocks - && !Global.SsSecuritiesInSingbox.Contains(item.Security)) - { - continue; - } - if (item.ConfigType == EConfigType.VLESS && !Global.Flows.Contains(item.Flow)) - { - continue; - } - - //outbound - proxyProfiles.Add(item); - } - if (proxyProfiles.Count <= 0) + var groupRet = await GenGroupOutbound(parentNode, singboxConfig); + if (groupRet != 0) { ret.Msg = ResUI.FailedGenDefaultConfiguration; return ret; } - await GenChainOutboundsList(proxyProfiles, singboxConfig); await GenDns(null, singboxConfig); await ConvertGeo2Ruleset(singboxConfig); diff --git a/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxOutboundService.cs b/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxOutboundService.cs index b8c58e75..435b7372 100644 --- a/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxOutboundService.cs +++ b/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxOutboundService.cs @@ -217,11 +217,21 @@ public partial class CoreConfigSingboxService { return -1; } + // remove custom nodes + // remove group nodes for proxy chain var childProfiles = (await Task.WhenAll( Utils.String2List(profileGroupItem.ChildItems) - .Where(p => !p.IsNullOrEmpty()) - .Select(AppManager.Instance.GetProfileItem) - )).Where(p => p != null && p.IsValid()).ToList(); + .Where(p => !p.IsNullOrEmpty()) + .Select(AppManager.Instance.GetProfileItem) + )) + .Where(p => + p != null && + p.IsValid() && + p.ConfigType != EConfigType.Custom && + (node.ConfigType == EConfigType.PolicyGroup || p.ConfigType < EConfigType.Group) + ) + .ToList(); + if (childProfiles.Count <= 0) { return -1; diff --git a/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxRoutingService.cs b/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxRoutingService.cs index b1a4b44f..d9b271ff 100644 --- a/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxRoutingService.cs +++ b/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxRoutingService.cs @@ -385,29 +385,8 @@ public partial class CoreConfigSingboxService if (node.ConfigType is EConfigType.PolicyGroup or EConfigType.ProxyChain) { - ProfileGroupItemManager.Instance.TryGet(node.IndexId, out var profileGroupItem); - if (profileGroupItem == null || profileGroupItem.ChildItems.IsNullOrEmpty()) - { - return Global.ProxyTag; - } - var childProfiles = (await Task.WhenAll( - Utils.String2List(profileGroupItem.ChildItems) - .Where(p => !p.IsNullOrEmpty()) - .Select(AppManager.Instance.GetProfileItem) - )).Where(p => p != null).ToList(); - if (childProfiles.Count <= 0) - { - return Global.ProxyTag; - } var childBaseTagName = $"{Global.ProxyTag}-{node.IndexId}"; - var ret = node.ConfigType switch - { - EConfigType.PolicyGroup => - await GenOutboundsListWithChain(childProfiles, singboxConfig, profileGroupItem.MultipleLoad, childBaseTagName), - EConfigType.ProxyChain => - await GenChainOutboundsList(childProfiles, singboxConfig, childBaseTagName), - _ => throw new NotImplementedException() - }; + var ret = await GenGroupOutbound(node, singboxConfig, childBaseTagName); if (ret == 0) { return childBaseTagName; diff --git a/v2rayN/ServiceLib/Services/CoreConfig/V2ray/CoreConfigV2rayService.cs b/v2rayN/ServiceLib/Services/CoreConfig/V2ray/CoreConfigV2rayService.cs index 5d1a4d10..1dd1c0ef 100644 --- a/v2rayN/ServiceLib/Services/CoreConfig/V2ray/CoreConfigV2rayService.cs +++ b/v2rayN/ServiceLib/Services/CoreConfig/V2ray/CoreConfigV2rayService.cs @@ -15,35 +15,8 @@ public partial class CoreConfigV2rayService(Config config) var ret = new RetResult(); try { - if (node?.ConfigType is EConfigType.PolicyGroup or EConfigType.ProxyChain) - { - ProfileGroupItemManager.Instance.TryGet(node.IndexId, out var profileGroupItem); - if (profileGroupItem == null || profileGroupItem.ChildItems.IsNullOrEmpty()) - { - ret.Msg = ResUI.CheckServerSettings; - return ret; - } - var childProfiles = (await Task.WhenAll( - Utils.String2List(profileGroupItem.ChildItems) - .Where(p => !p.IsNullOrEmpty()) - .Select(AppManager.Instance.GetProfileItem) - )).Where(p => p != null).ToList(); - if (childProfiles.Count <= 0) - { - ret.Msg = ResUI.CheckServerSettings; - return ret; - } - switch (node.ConfigType) - { - case EConfigType.PolicyGroup: - return await GenerateClientMultipleLoadConfig(childProfiles, profileGroupItem.MultipleLoad); - case EConfigType.ProxyChain: - return await GenerateClientChainConfig(childProfiles); - } - } - if (node == null - || node.Port <= 0) + || !node.IsValid()) { ret.Msg = ResUI.CheckServerSettings; return ret; @@ -57,6 +30,17 @@ public partial class CoreConfigV2rayService(Config config) ret.Msg = ResUI.InitialConfiguration; + if (node?.ConfigType is EConfigType.PolicyGroup or EConfigType.ProxyChain) + { + switch (node.ConfigType) + { + case EConfigType.PolicyGroup: + return await GenerateClientMultipleLoadConfig(node); + case EConfigType.ProxyChain: + return await GenerateClientChainConfig(node); + } + } + var result = EmbedUtils.GetEmbedText(Global.V2raySampleClient); if (result.IsNullOrEmpty()) { @@ -98,7 +82,7 @@ public partial class CoreConfigV2rayService(Config config) } } - public async Task GenerateClientMultipleLoadConfig(List selecteds, EMultipleLoad multipleLoad) + public async Task GenerateClientMultipleLoadConfig(ProfileItem parentNode) { var ret = new RetResult(); @@ -134,57 +118,12 @@ public partial class CoreConfigV2rayService(Config config) await GenDns(null, v2rayConfig); await GenStatistic(v2rayConfig); - var proxyProfiles = new List(); - foreach (var it in selecteds) - { - if (it.ConfigType is EConfigType.PolicyGroup or EConfigType.ProxyChain) - { - var itemGroup = await AppManager.Instance.GetProfileItem(it.IndexId); - proxyProfiles.Add(itemGroup); - } - if (!Global.XraySupportConfigType.Contains(it.ConfigType)) - { - continue; - } - if (it.Port <= 0) - { - continue; - } - var item = await AppManager.Instance.GetProfileItem(it.IndexId); - if (item is null) - { - continue; - } - if (it.ConfigType is EConfigType.VMess or EConfigType.VLESS) - { - if (item.Id.IsNullOrEmpty() || !Utils.IsGuidByParse(item.Id)) - { - continue; - } - } - if (item.ConfigType == EConfigType.Shadowsocks - && !Global.SsSecuritiesInSingbox.Contains(item.Security)) - { - continue; - } - if (item.ConfigType == EConfigType.VLESS && !Global.Flows.Contains(item.Flow)) - { - continue; - } - - //outbound - proxyProfiles.Add(item); - } - if (proxyProfiles.Count <= 0) + var groupRet = await GenGroupOutbound(parentNode, v2rayConfig); + if (groupRet != 0) { ret.Msg = ResUI.FailedGenDefaultConfiguration; return ret; } - await GenOutboundsListWithChain(proxyProfiles, v2rayConfig); - - //add balancers - await GenObservatory(v2rayConfig, multipleLoad); - await GenBalancer(v2rayConfig, multipleLoad); var defaultBalancerTag = $"{Global.ProxyTag}{Global.BalancerTagSuffix}"; @@ -248,7 +187,7 @@ public partial class CoreConfigV2rayService(Config config) } } - public async Task GenerateClientChainConfig(List selecteds) + public async Task GenerateClientChainConfig(ProfileItem parentNode) { var ret = new RetResult(); @@ -284,48 +223,12 @@ public partial class CoreConfigV2rayService(Config config) await GenStatistic(v2rayConfig); v2rayConfig.outbounds.RemoveAt(0); - var proxyProfiles = new List(); - foreach (var it in selecteds) - { - if (!Global.XraySupportConfigType.Contains(it.ConfigType)) - { - continue; - } - if (it.Port <= 0) - { - continue; - } - var item = await AppManager.Instance.GetProfileItem(it.IndexId); - if (item is null) - { - continue; - } - if (it.ConfigType is EConfigType.VMess or EConfigType.VLESS) - { - if (item.Id.IsNullOrEmpty() || !Utils.IsGuidByParse(item.Id)) - { - continue; - } - } - if (item.ConfigType == EConfigType.Shadowsocks - && !Global.SsSecuritiesInSingbox.Contains(item.Security)) - { - continue; - } - if (item.ConfigType == EConfigType.VLESS && !Global.Flows.Contains(item.Flow)) - { - continue; - } - - //outbound - proxyProfiles.Add(item); - } - if (proxyProfiles.Count <= 0) + var groupRet = await GenGroupOutbound(parentNode, v2rayConfig); + if (groupRet != 0) { ret.Msg = ResUI.FailedGenDefaultConfiguration; return ret; } - await GenChainOutboundsList(proxyProfiles, v2rayConfig); ret.Success = true; @@ -398,12 +301,9 @@ public partial class CoreConfigV2rayService(Config config) continue; } var item = await AppManager.Instance.GetProfileItem(it.IndexId); - if (it.ConfigType is EConfigType.VMess or EConfigType.VLESS) + if (item is null || item.IsComplex() || !item.IsValid()) { - if (item is null || item.Id.IsNullOrEmpty() || !Utils.IsGuidByParse(item.Id)) - { - continue; - } + continue; } //find unused port @@ -432,28 +332,6 @@ public partial class CoreConfigV2rayService(Config config) it.Port = port; it.AllowTest = true; - //outbound - if (item is null) - { - continue; - } - if (item.ConfigType == EConfigType.Shadowsocks - && !Global.SsSecuritiesInXray.Contains(item.Security)) - { - continue; - } - if (item.ConfigType == EConfigType.VLESS - && !Global.Flows.Contains(item.Flow)) - { - continue; - } - if (it.ConfigType is EConfigType.VLESS or EConfigType.Trojan - && item.StreamSecurity == Global.StreamSecurityReality - && item.PublicKey.IsNullOrEmpty()) - { - continue; - } - //inbound Inbounds4Ray inbound = new() { @@ -464,6 +342,7 @@ public partial class CoreConfigV2rayService(Config config) inbound.tag = inbound.protocol + inbound.port.ToString(); v2rayConfig.inbounds.Add(inbound); + //outbound var outbound = JsonUtils.Deserialize(txtOutbound); await GenOutbound(item, outbound); outbound.tag = Global.ProxyTag + inbound.port.ToString(); @@ -497,7 +376,8 @@ public partial class CoreConfigV2rayService(Config config) var ret = new RetResult(); try { - if (node is not { Port: > 0 }) + if (node == null + || !node.IsValid()) { ret.Msg = ResUI.CheckServerSettings; return ret; diff --git a/v2rayN/ServiceLib/Services/CoreConfig/V2ray/V2rayOutboundService.cs b/v2rayN/ServiceLib/Services/CoreConfig/V2ray/V2rayOutboundService.cs index b25ec9b2..90a85f17 100644 --- a/v2rayN/ServiceLib/Services/CoreConfig/V2ray/V2rayOutboundService.cs +++ b/v2rayN/ServiceLib/Services/CoreConfig/V2ray/V2rayOutboundService.cs @@ -480,6 +480,62 @@ public partial class CoreConfigV2rayService return 0; } + private async Task GenGroupOutbound(ProfileItem node, V2rayConfig v2rayConfig, string baseTagName = Global.ProxyTag) + { + try + { + if (node.ConfigType is not (EConfigType.PolicyGroup or EConfigType.ProxyChain)) + { + return -1; + } + ProfileGroupItemManager.Instance.TryGet(node.IndexId, out var profileGroupItem); + if (profileGroupItem is null || profileGroupItem.ChildItems.IsNullOrEmpty()) + { + return -1; + } + // remove custom nodes + // remove group nodes for proxy chain + var childProfiles = (await Task.WhenAll( + Utils.String2List(profileGroupItem.ChildItems) + .Where(p => !p.IsNullOrEmpty()) + .Select(AppManager.Instance.GetProfileItem) + )) + .Where(p => + p != null && + p.IsValid() && + p.ConfigType != EConfigType.Custom && + (node.ConfigType == EConfigType.PolicyGroup || p.ConfigType < EConfigType.Group) + ) + .ToList(); + + if (childProfiles.Count <= 0) + { + return -1; + } + switch (node.ConfigType) + { + case EConfigType.PolicyGroup: + await GenOutboundsListWithChain(childProfiles, v2rayConfig, baseTagName); + break; + case EConfigType.ProxyChain: + await GenChainOutboundsList(childProfiles, v2rayConfig, baseTagName); + break; + default: + break; + } + + //add balancers + await GenObservatory(v2rayConfig, profileGroupItem.MultipleLoad, baseTagName); + await GenBalancer(v2rayConfig, profileGroupItem.MultipleLoad, baseTagName); + + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + return await Task.FromResult(0); + } + private async Task GenMoreOutbounds(ProfileItem node, V2rayConfig v2rayConfig) { //fragment proxy diff --git a/v2rayN/ServiceLib/Services/CoreConfig/V2ray/V2rayRoutingService.cs b/v2rayN/ServiceLib/Services/CoreConfig/V2ray/V2rayRoutingService.cs index fe939f9a..a82c5974 100644 --- a/v2rayN/ServiceLib/Services/CoreConfig/V2ray/V2rayRoutingService.cs +++ b/v2rayN/ServiceLib/Services/CoreConfig/V2ray/V2rayRoutingService.cs @@ -141,33 +141,8 @@ public partial class CoreConfigV2rayService if (node.ConfigType is EConfigType.PolicyGroup or EConfigType.ProxyChain) { - ProfileGroupItemManager.Instance.TryGet(node.IndexId, out var profileGroupItem); - if (profileGroupItem == null || profileGroupItem.ChildItems.IsNullOrEmpty()) - { - return Global.ProxyTag; - } - var childProfiles = (await Task.WhenAll( - Utils.String2List(profileGroupItem.ChildItems) - .Where(p => !p.IsNullOrEmpty()) - .Select(AppManager.Instance.GetProfileItem) - )).Where(p => p != null).ToList(); - if (childProfiles.Count <= 0) - { - return Global.ProxyTag; - } var childBaseTagName = $"{Global.ProxyTag}-{node.IndexId}"; - var ret = node.ConfigType switch - { - EConfigType.PolicyGroup => - await GenOutboundsListWithChain(childProfiles, v2rayConfig, childBaseTagName), - EConfigType.ProxyChain => - await GenChainOutboundsList(childProfiles, v2rayConfig, childBaseTagName), - _ => throw new NotImplementedException() - }; - if (node.ConfigType == EConfigType.PolicyGroup) - { - await GenBalancer(v2rayConfig, profileGroupItem.MultipleLoad, childBaseTagName); - } + var ret = await GenGroupOutbound(node, v2rayConfig, childBaseTagName); if (ret == 0) { return childBaseTagName;