mirror of
https://github.com/2dust/v2rayN.git
synced 2025-10-13 20:09:12 +00:00
Add PolicyGroup include other Group support
This commit is contained in:
parent
2ab044b4fc
commit
af62d9e0f4
6 changed files with 102 additions and 18 deletions
|
@ -408,6 +408,11 @@ public partial class CoreConfigSingboxService(Config config)
|
||||||
var proxyProfiles = new List<ProfileItem>();
|
var proxyProfiles = new List<ProfileItem>();
|
||||||
foreach (var it in selecteds)
|
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))
|
if (!Global.SingboxSupportConfigType.Contains(it.ConfigType))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -410,7 +410,7 @@ public partial class CoreConfigSingboxService
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<int> GenOutboundsList(List<ProfileItem> nodes, SingboxConfig singboxConfig, EMultipleLoad multipleLoad)
|
private async Task<int> GenOutboundsList(List<ProfileItem> nodes, SingboxConfig singboxConfig, EMultipleLoad multipleLoad, string baseTagName = Global.ProxyTag)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -438,6 +438,38 @@ public partial class CoreConfigSingboxService
|
||||||
{
|
{
|
||||||
index++;
|
index++;
|
||||||
|
|
||||||
|
if (node.ConfigType is EConfigType.PolicyGroup or EConfigType.ProxyChain)
|
||||||
|
{
|
||||||
|
ProfileGroupItemManager.Instance.TryGet(node.IndexId, out var profileGroupItem);
|
||||||
|
if (profileGroupItem == null || profileGroupItem.ChildItems.IsNullOrEmpty())
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
var childBaseTagName = $"{baseTagName}-{index}";
|
||||||
|
var ret = node.ConfigType switch
|
||||||
|
{
|
||||||
|
EConfigType.PolicyGroup =>
|
||||||
|
await GenOutboundsList(childProfiles, singboxConfig, profileGroupItem.MultipleLoad, childBaseTagName),
|
||||||
|
EConfigType.ProxyChain =>
|
||||||
|
await GenChainOutboundsList(childProfiles, singboxConfig, childBaseTagName),
|
||||||
|
_ => throw new NotImplementedException()
|
||||||
|
};
|
||||||
|
if (ret == 0)
|
||||||
|
{
|
||||||
|
proxyTags.Add(childBaseTagName);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Handle proxy chain
|
// Handle proxy chain
|
||||||
string? prevTag = null;
|
string? prevTag = null;
|
||||||
var currentServer = await GenServer(node);
|
var currentServer = await GenServer(node);
|
||||||
|
@ -450,7 +482,7 @@ public partial class CoreConfigSingboxService
|
||||||
var subItem = await AppManager.Instance.GetSubItem(node.Subid);
|
var subItem = await AppManager.Instance.GetSubItem(node.Subid);
|
||||||
|
|
||||||
// current proxy
|
// current proxy
|
||||||
currentServer.tag = $"{Global.ProxyTag}-{index}";
|
currentServer.tag = $"{baseTagName}-{index}";
|
||||||
proxyTags.Add(currentServer.tag);
|
proxyTags.Add(currentServer.tag);
|
||||||
|
|
||||||
if (!node.Subid.IsNullOrEmpty())
|
if (!node.Subid.IsNullOrEmpty())
|
||||||
|
@ -467,7 +499,7 @@ public partial class CoreConfigSingboxService
|
||||||
{
|
{
|
||||||
var prevOutbound = JsonUtils.Deserialize<Outbound4Sbox>(txtOutbound);
|
var prevOutbound = JsonUtils.Deserialize<Outbound4Sbox>(txtOutbound);
|
||||||
await GenOutbound(prevNode, prevOutbound);
|
await GenOutbound(prevNode, prevOutbound);
|
||||||
prevTag = $"prev-{Global.ProxyTag}-{++prevIndex}";
|
prevTag = $"prev-{baseTagName}-{++prevIndex}";
|
||||||
prevOutbound.tag = prevTag;
|
prevOutbound.tag = prevTag;
|
||||||
prevOutbounds.Add(prevOutbound);
|
prevOutbounds.Add(prevOutbound);
|
||||||
}
|
}
|
||||||
|
@ -508,7 +540,7 @@ public partial class CoreConfigSingboxService
|
||||||
var outUrltest = new Outbound4Sbox
|
var outUrltest = new Outbound4Sbox
|
||||||
{
|
{
|
||||||
type = "urltest",
|
type = "urltest",
|
||||||
tag = $"{Global.ProxyTag}-auto",
|
tag = $"{baseTagName}-auto",
|
||||||
outbounds = proxyTags,
|
outbounds = proxyTags,
|
||||||
interrupt_exist_connections = false,
|
interrupt_exist_connections = false,
|
||||||
};
|
};
|
||||||
|
@ -522,7 +554,7 @@ public partial class CoreConfigSingboxService
|
||||||
var outSelector = new Outbound4Sbox
|
var outSelector = new Outbound4Sbox
|
||||||
{
|
{
|
||||||
type = "selector",
|
type = "selector",
|
||||||
tag = Global.ProxyTag,
|
tag = baseTagName,
|
||||||
outbounds = JsonUtils.DeepCopy(proxyTags),
|
outbounds = JsonUtils.DeepCopy(proxyTags),
|
||||||
interrupt_exist_connections = false,
|
interrupt_exist_connections = false,
|
||||||
};
|
};
|
||||||
|
@ -580,7 +612,7 @@ public partial class CoreConfigSingboxService
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<int> GenChainOutboundsList(List<ProfileItem> nodes, SingboxConfig singboxConfig)
|
private async Task<int> GenChainOutboundsList(List<ProfileItem> nodes, SingboxConfig singboxConfig, string baseTagName = Global.ProxyTag)
|
||||||
{
|
{
|
||||||
var resultOutbounds = new List<Outbound4Sbox>();
|
var resultOutbounds = new List<Outbound4Sbox>();
|
||||||
var resultEndpoints = new List<Endpoints4Sbox>(); // For endpoints
|
var resultEndpoints = new List<Endpoints4Sbox>(); // For endpoints
|
||||||
|
@ -596,16 +628,16 @@ public partial class CoreConfigSingboxService
|
||||||
|
|
||||||
if (i == 0)
|
if (i == 0)
|
||||||
{
|
{
|
||||||
server.tag = Global.ProxyTag;
|
server.tag = baseTagName;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
server.tag = Global.ProxyTag + i.ToString();
|
server.tag = baseTagName + i.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i != nodes.Count - 1)
|
if (i != nodes.Count - 1)
|
||||||
{
|
{
|
||||||
server.detour = Global.ProxyTag + (i + 1).ToString();
|
server.detour = baseTagName + (i + 1).ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (server is Endpoints4Sbox endpoint)
|
if (server is Endpoints4Sbox endpoint)
|
||||||
|
|
|
@ -137,6 +137,11 @@ public partial class CoreConfigV2rayService(Config config)
|
||||||
var proxyProfiles = new List<ProfileItem>();
|
var proxyProfiles = new List<ProfileItem>();
|
||||||
foreach (var it in selecteds)
|
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))
|
if (!Global.XraySupportConfigType.Contains(it.ConfigType))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -552,7 +552,7 @@ public partial class CoreConfigV2rayService
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<int> GenOutboundsList(List<ProfileItem> nodes, V2rayConfig v2rayConfig)
|
private async Task<int> GenOutboundsList(List<ProfileItem> nodes, V2rayConfig v2rayConfig, string baseTagName = Global.ProxyTag)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -577,6 +577,34 @@ public partial class CoreConfigV2rayService
|
||||||
{
|
{
|
||||||
index++;
|
index++;
|
||||||
|
|
||||||
|
if (node.ConfigType is EConfigType.PolicyGroup or EConfigType.ProxyChain)
|
||||||
|
{
|
||||||
|
ProfileGroupItemManager.Instance.TryGet(node.IndexId, out var profileGroupItem);
|
||||||
|
if (profileGroupItem == null || profileGroupItem.ChildItems.IsNullOrEmpty())
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
var childBaseTagName = $"{baseTagName}-{index}";
|
||||||
|
var ret = node.ConfigType switch
|
||||||
|
{
|
||||||
|
EConfigType.PolicyGroup =>
|
||||||
|
await GenOutboundsList(childProfiles, v2rayConfig, childBaseTagName),
|
||||||
|
EConfigType.ProxyChain =>
|
||||||
|
await GenChainOutboundsList(childProfiles, v2rayConfig, childBaseTagName),
|
||||||
|
_ => throw new NotImplementedException()
|
||||||
|
};
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Handle proxy chain
|
// Handle proxy chain
|
||||||
string? prevTag = null;
|
string? prevTag = null;
|
||||||
var currentOutbound = JsonUtils.Deserialize<Outbounds4Ray>(txtOutbound);
|
var currentOutbound = JsonUtils.Deserialize<Outbounds4Ray>(txtOutbound);
|
||||||
|
@ -590,7 +618,7 @@ public partial class CoreConfigV2rayService
|
||||||
|
|
||||||
// current proxy
|
// current proxy
|
||||||
await GenOutbound(node, currentOutbound);
|
await GenOutbound(node, currentOutbound);
|
||||||
currentOutbound.tag = $"{Global.ProxyTag}-{index}";
|
currentOutbound.tag = $"{baseTagName}-{index}";
|
||||||
|
|
||||||
if (!node.Subid.IsNullOrEmpty())
|
if (!node.Subid.IsNullOrEmpty())
|
||||||
{
|
{
|
||||||
|
@ -606,7 +634,7 @@ public partial class CoreConfigV2rayService
|
||||||
{
|
{
|
||||||
var prevOutbound = JsonUtils.Deserialize<Outbounds4Ray>(txtOutbound);
|
var prevOutbound = JsonUtils.Deserialize<Outbounds4Ray>(txtOutbound);
|
||||||
await GenOutbound(prevNode, prevOutbound);
|
await GenOutbound(prevNode, prevOutbound);
|
||||||
prevTag = $"prev-{Global.ProxyTag}-{++prevIndex}";
|
prevTag = $"prev-{baseTagName}-{++prevIndex}";
|
||||||
prevOutbound.tag = prevTag;
|
prevOutbound.tag = prevTag;
|
||||||
prevOutbounds.Add(prevOutbound);
|
prevOutbounds.Add(prevOutbound);
|
||||||
}
|
}
|
||||||
|
@ -693,7 +721,7 @@ public partial class CoreConfigV2rayService
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<int> GenChainOutboundsList(List<ProfileItem> nodes, V2rayConfig v2RayConfig)
|
private async Task<int> GenChainOutboundsList(List<ProfileItem> nodes, V2rayConfig v2RayConfig, string baseTagName = Global.ProxyTag)
|
||||||
{
|
{
|
||||||
var resultOutbounds = new List<Outbounds4Ray>();
|
var resultOutbounds = new List<Outbounds4Ray>();
|
||||||
for (var i = 0; i < nodes.Count; i++)
|
for (var i = 0; i < nodes.Count; i++)
|
||||||
|
@ -714,18 +742,18 @@ public partial class CoreConfigV2rayService
|
||||||
|
|
||||||
if (i == 0)
|
if (i == 0)
|
||||||
{
|
{
|
||||||
outbound.tag = Global.ProxyTag;
|
outbound.tag = baseTagName;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
outbound.tag = Global.ProxyTag + i.ToString();
|
outbound.tag = baseTagName + i.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i != nodes.Count - 1)
|
if (i != nodes.Count - 1)
|
||||||
{
|
{
|
||||||
outbound.streamSettings.sockopt = new()
|
outbound.streamSettings.sockopt = new()
|
||||||
{
|
{
|
||||||
dialerProxy = Global.ProxyTag + (i + 1).ToString()
|
dialerProxy = baseTagName + (i + 1).ToString()
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -138,7 +138,14 @@ public partial class AddGroupServerWindow : WindowBase<AddGroupServerViewModel>
|
||||||
private async void MenuAddChild_Click(object? sender, RoutedEventArgs e)
|
private async void MenuAddChild_Click(object? sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
var selectWindow = new ProfilesSelectWindow();
|
var selectWindow = new ProfilesSelectWindow();
|
||||||
selectWindow.SetConfigTypeFilter(new[] { EConfigType.Custom, EConfigType.PolicyGroup, EConfigType.ProxyChain }, exclude: true);
|
if (ViewModel?.SelectedSource?.ConfigType == EConfigType.PolicyGroup)
|
||||||
|
{
|
||||||
|
selectWindow.SetConfigTypeFilter(new[] { EConfigType.Custom }, exclude: true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
selectWindow.SetConfigTypeFilter(new[] { EConfigType.Custom, EConfigType.PolicyGroup, EConfigType.ProxyChain }, exclude: true);
|
||||||
|
}
|
||||||
selectWindow.AllowMultiSelect(true);
|
selectWindow.AllowMultiSelect(true);
|
||||||
var result = await selectWindow.ShowDialog<bool?>(this);
|
var result = await selectWindow.ShowDialog<bool?>(this);
|
||||||
if (result == true)
|
if (result == true)
|
||||||
|
|
|
@ -116,7 +116,14 @@ public partial class AddGroupServerWindow
|
||||||
private async void MenuAddChild_Click(object sender, RoutedEventArgs e)
|
private async void MenuAddChild_Click(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
var selectWindow = new ProfilesSelectWindow();
|
var selectWindow = new ProfilesSelectWindow();
|
||||||
selectWindow.SetConfigTypeFilter(new[] { EConfigType.Custom, EConfigType.PolicyGroup, EConfigType.ProxyChain }, exclude: true);
|
if (ViewModel?.SelectedSource?.ConfigType == EConfigType.PolicyGroup)
|
||||||
|
{
|
||||||
|
selectWindow.SetConfigTypeFilter(new[] { EConfigType.Custom }, exclude: true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
selectWindow.SetConfigTypeFilter(new[] { EConfigType.Custom, EConfigType.PolicyGroup, EConfigType.ProxyChain }, exclude: true);
|
||||||
|
}
|
||||||
selectWindow.AllowMultiSelect(true);
|
selectWindow.AllowMultiSelect(true);
|
||||||
if (selectWindow.ShowDialog() == true)
|
if (selectWindow.ShowDialog() == true)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue