Add PolicyGroup include other Group support

This commit is contained in:
DHR60 2025-09-11 16:11:34 +08:00
parent 2ab044b4fc
commit af62d9e0f4
6 changed files with 102 additions and 18 deletions

View file

@ -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;

View file

@ -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)

View file

@ -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;

View file

@ -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()
}; };
} }

View file

@ -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)

View file

@ -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)
{ {