diff --git a/v2rayN/v2rayN/Handler/CoreConfigSingbox.cs b/v2rayN/v2rayN/Handler/CoreConfigSingbox.cs index d1e73c4e..c3607e87 100644 --- a/v2rayN/v2rayN/Handler/CoreConfigSingbox.cs +++ b/v2rayN/v2rayN/Handler/CoreConfigSingbox.cs @@ -45,7 +45,7 @@ namespace v2rayN.Handler GenInbounds(singboxConfig); - GenOutbounds(node, singboxConfig); + GenOutbound(node, singboxConfig); GenRouting(singboxConfig); @@ -202,7 +202,7 @@ namespace v2rayN.Handler #region outbound private - private int GenOutbounds(ProfileItem node, SingboxConfig singboxConfig) + private int GenOutbound(ProfileItem node, SingboxConfig singboxConfig) { try { diff --git a/v2rayN/v2rayN/Handler/CoreConfigV2ray.cs b/v2rayN/v2rayN/Handler/CoreConfigV2ray.cs index b592239a..1123cdcc 100644 --- a/v2rayN/v2rayN/Handler/CoreConfigV2ray.cs +++ b/v2rayN/v2rayN/Handler/CoreConfigV2ray.cs @@ -53,6 +53,8 @@ namespace v2rayN.Handler GenOutbound(node, v2rayConfig.outbounds[0]); + GenMoreOutbounds(node, v2rayConfig); + GenDns(v2rayConfig); GenStatistic(v2rayConfig); @@ -820,6 +822,64 @@ namespace v2rayN.Handler return 0; } + private int GenMoreOutbounds(ProfileItem node, V2rayConfig v2rayConfig) + { + if (node.subid.IsNullOrEmpty()) + { + return 0; + } + try + { + var subItem = LazyConfig.Instance.GetSubItem(node.subid); + if (subItem is null) + { + return 0; + } + + //current proxy + var outbound = v2rayConfig.outbounds[0]; + + //Previous proxy + var prevNode = LazyConfig.Instance.GetProfileItemViaRemarks(subItem.prevProfile!); + if (prevNode is not null) + { + var txtOutbound = Utils.GetEmbedText(Global.V2raySampleOutbound); + var prevOutbound = Utils.FromJson(txtOutbound); + GenOutbound(prevNode, prevOutbound); + prevOutbound.tag = $"{Global.ProxyTag}2"; + v2rayConfig.outbounds.Add(prevOutbound); + + outbound.streamSettings.sockopt = new() + { + dialerProxy = prevOutbound.tag + }; + } + + //Next proxy + var nextNode = LazyConfig.Instance.GetProfileItemViaRemarks(subItem.nextProfile!); + if (nextNode is not null) + { + var txtOutbound = Utils.GetEmbedText(Global.V2raySampleOutbound); + var nextOutbound = Utils.FromJson(txtOutbound); + GenOutbound(nextNode, nextOutbound); + nextOutbound.tag = Global.ProxyTag; + v2rayConfig.outbounds.Insert(0, nextOutbound); + + outbound.tag = $"{Global.ProxyTag}1"; + nextOutbound.streamSettings.sockopt = new() + { + dialerProxy = outbound.tag + }; + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + + return 0; + } + #region Gen speedtest config public string GenerateClientSpeedtestConfigString(List selecteds, out string msg) @@ -833,7 +893,7 @@ namespace v2rayN.Handler } msg = ResUI.InitialConfiguration; - + string result = Utils.GetEmbedText(Global.V2raySampleClient); string txtOutbound = Utils.GetEmbedText(Global.V2raySampleOutbound); if (Utils.IsNullOrEmpty(result) || txtOutbound.IsNullOrEmpty()) diff --git a/v2rayN/v2rayN/Handler/LazyConfig.cs b/v2rayN/v2rayN/Handler/LazyConfig.cs index b9f259de..6a98f916 100644 --- a/v2rayN/v2rayN/Handler/LazyConfig.cs +++ b/v2rayN/v2rayN/Handler/LazyConfig.cs @@ -130,6 +130,15 @@ namespace v2rayN.Handler return SqliteHelper.Instance.Table().FirstOrDefault(it => it.indexId == indexId); } + public ProfileItem? GetProfileItemViaRemarks(string remarks) + { + if (Utils.IsNullOrEmpty(remarks)) + { + return null; + } + return SqliteHelper.Instance.Table().FirstOrDefault(it => it.remarks == remarks); + } + public List RoutingItems() { return SqliteHelper.Instance.Table().Where(it => it.locked == false).OrderBy(t => t.sort).ToList(); diff --git a/v2rayN/v2rayN/Mode/SubItem.cs b/v2rayN/v2rayN/Mode/SubItem.cs index 3221e914..c3fe2c21 100644 --- a/v2rayN/v2rayN/Mode/SubItem.cs +++ b/v2rayN/v2rayN/Mode/SubItem.cs @@ -27,5 +27,9 @@ namespace v2rayN.Mode public long updateTime { get; set; } public string? convertTarget { get; set; } + + public string? prevProfile { get; set; } + + public string? nextProfile { get; set; } } } \ No newline at end of file