From 339919b0806106040499c00c1b27fe89614804f4 Mon Sep 17 00:00:00 2001 From: DHR60 Date: Fri, 27 Feb 2026 15:32:57 +0800 Subject: [PATCH] Perf Policy Group generate --- v2rayN/ServiceLib/Global.cs | 2 + v2rayN/ServiceLib/Handler/ConfigHandler.cs | 41 +++------- .../ServiceLib/Manager/GroupProfileManager.cs | 2 +- v2rayN/ServiceLib/Resx/ResUI.Designer.cs | 78 +++---------------- v2rayN/ServiceLib/Resx/ResUI.fa-Ir.resx | 30 ++----- v2rayN/ServiceLib/Resx/ResUI.fr.resx | 30 ++----- v2rayN/ServiceLib/Resx/ResUI.hu.resx | 30 ++----- v2rayN/ServiceLib/Resx/ResUI.resx | 30 ++----- v2rayN/ServiceLib/Resx/ResUI.ru.resx | 30 ++----- v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx | 30 ++----- v2rayN/ServiceLib/Resx/ResUI.zh-Hant.resx | 30 ++----- .../ViewModels/ProfilesViewModel.cs | 56 ++----------- .../v2rayN.Desktop/Views/ProfilesView.axaml | 10 +-- .../Views/ProfilesView.axaml.cs | 7 +- v2rayN/v2rayN/Views/ProfilesView.xaml | 27 +------ v2rayN/v2rayN/Views/ProfilesView.xaml.cs | 7 +- 16 files changed, 80 insertions(+), 360 deletions(-) diff --git a/v2rayN/ServiceLib/Global.cs b/v2rayN/ServiceLib/Global.cs index 90721217..c11ec6bf 100644 --- a/v2rayN/ServiceLib/Global.cs +++ b/v2rayN/ServiceLib/Global.cs @@ -90,6 +90,8 @@ public class Global public const int Hysteria2DefaultHopInt = 10; + public const string PolicyGroupDefaultAllFilter = "^(?!.*(剩余|过期|到期|重置)).*$"; + public static readonly List IEProxyProtocols = [ "{ip}:{http_port}", diff --git a/v2rayN/ServiceLib/Handler/ConfigHandler.cs b/v2rayN/ServiceLib/Handler/ConfigHandler.cs index b0bde1df..0cc9e4dd 100644 --- a/v2rayN/ServiceLib/Handler/ConfigHandler.cs +++ b/v2rayN/ServiceLib/Handler/ConfigHandler.cs @@ -1165,46 +1165,23 @@ public static class ConfigHandler /// /// Create a group server that combines multiple servers for load balancing - /// Generates a configuration file that references multiple servers + /// Generates a PolicyGroup profile with references to the sub-items /// /// Current configuration - /// Selected servers to combine - /// Core type to use (Xray or sing_box) - /// Load balancing algorithm + /// Sub-item for grouping /// Result object with success state and data - public static async Task AddGroupServer4Multiple(Config config, List selecteds, ECoreType coreType, EMultipleLoad multipleLoad, string? subId) + public static async Task AddGroupAllServer(Config config, SubItem? subItem) { var result = new RetResult(); var indexId = Utils.GetGuid(false); - var childProfileIndexId = Utils.List2String(selecteds.Select(p => p.IndexId).ToList()); + var subId = subItem?.Id; - var remark = subId.IsNullOrEmpty() ? string.Empty : $"{(await AppManager.Instance.GetSubItem(subId))?.Remarks} "; - if (coreType == ECoreType.Xray) - { - remark += multipleLoad switch - { - EMultipleLoad.LeastPing => ResUI.menuGenGroupMultipleServerXrayLeastPing, - EMultipleLoad.Fallback => ResUI.menuGenGroupMultipleServerXrayFallback, - EMultipleLoad.Random => ResUI.menuGenGroupMultipleServerXrayRandom, - EMultipleLoad.RoundRobin => ResUI.menuGenGroupMultipleServerXrayRoundRobin, - EMultipleLoad.LeastLoad => ResUI.menuGenGroupMultipleServerXrayLeastLoad, - _ => ResUI.menuGenGroupMultipleServerXrayRoundRobin, - }; - } - else if (coreType == ECoreType.sing_box) - { - remark += multipleLoad switch - { - EMultipleLoad.LeastPing => ResUI.menuGenGroupMultipleServerSingBoxLeastPing, - EMultipleLoad.Fallback => ResUI.menuGenGroupMultipleServerSingBoxFallback, - _ => ResUI.menuGenGroupMultipleServerSingBoxLeastPing, - }; - } + var remark = subItem is null ? ResUI.TbConfigTypePolicyGroup : $"{subItem.Remarks} - {ResUI.TbConfigTypePolicyGroup}"; var profile = new ProfileItem { IndexId = indexId, - CoreType = coreType, + CoreType = ECoreType.Xray, ConfigType = EConfigType.PolicyGroup, Remarks = remark, IsSub = false @@ -1215,8 +1192,10 @@ public static class ConfigHandler } var extraItem = new ProtocolExtraItem { - ChildItems = childProfileIndexId, - MultipleLoad = multipleLoad, + MultipleLoad = EMultipleLoad.LeastPing, + GroupType = profile.ConfigType.ToString(), + SubChildItems = subId, + Filter = Global.PolicyGroupDefaultAllFilter, }; profile.SetProtocolExtra(extraItem); var ret = await AddServerCommon(config, profile, true); diff --git a/v2rayN/ServiceLib/Manager/GroupProfileManager.cs b/v2rayN/ServiceLib/Manager/GroupProfileManager.cs index 510667dd..027cf193 100644 --- a/v2rayN/ServiceLib/Manager/GroupProfileManager.cs +++ b/v2rayN/ServiceLib/Manager/GroupProfileManager.cs @@ -128,7 +128,7 @@ public class GroupProfileManager private static async Task> GetSubChildProfileItems(ProtocolExtraItem? extra) { - if (extra == null || extra.SubChildItems.IsNullOrEmpty()) + if (extra == null || extra.Filter.IsNullOrEmpty()) { return []; } diff --git a/v2rayN/ServiceLib/Resx/ResUI.Designer.cs b/v2rayN/ServiceLib/Resx/ResUI.Designer.cs index 5e35d3bb..2dd145a1 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.Designer.cs +++ b/v2rayN/ServiceLib/Resx/ResUI.Designer.cs @@ -834,6 +834,15 @@ namespace ServiceLib.Resx { } } + /// + /// 查找类似 All configurations 的本地化字符串。 + /// + public static string menuAllServers { + get { + return ResourceManager.GetString("menuAllServers", resourceCulture); + } + } + /// /// 查找类似 Backup and Restore 的本地化字符串。 /// @@ -1006,74 +1015,11 @@ namespace ServiceLib.Resx { } /// - /// 查找类似 Generate Policy Group from Multiple Profiles 的本地化字符串。 + /// 查找类似 Generate Policy Group 的本地化字符串。 /// - public static string menuGenGroupMultipleServer { + public static string menuGenGroupServer { get { - return ResourceManager.GetString("menuGenGroupMultipleServer", resourceCulture); - } - } - - /// - /// 查找类似 Fallback by sing-box 的本地化字符串。 - /// - public static string menuGenGroupMultipleServerSingBoxFallback { - get { - return ResourceManager.GetString("menuGenGroupMultipleServerSingBoxFallback", resourceCulture); - } - } - - /// - /// 查找类似 LeastPing by sing-box 的本地化字符串。 - /// - public static string menuGenGroupMultipleServerSingBoxLeastPing { - get { - return ResourceManager.GetString("menuGenGroupMultipleServerSingBoxLeastPing", resourceCulture); - } - } - - /// - /// 查找类似 Fallback by Xray 的本地化字符串。 - /// - public static string menuGenGroupMultipleServerXrayFallback { - get { - return ResourceManager.GetString("menuGenGroupMultipleServerXrayFallback", resourceCulture); - } - } - - /// - /// 查找类似 LeastLoad by Xray 的本地化字符串。 - /// - public static string menuGenGroupMultipleServerXrayLeastLoad { - get { - return ResourceManager.GetString("menuGenGroupMultipleServerXrayLeastLoad", resourceCulture); - } - } - - /// - /// 查找类似 LeastPing by Xray 的本地化字符串。 - /// - public static string menuGenGroupMultipleServerXrayLeastPing { - get { - return ResourceManager.GetString("menuGenGroupMultipleServerXrayLeastPing", resourceCulture); - } - } - - /// - /// 查找类似 Random by Xray 的本地化字符串。 - /// - public static string menuGenGroupMultipleServerXrayRandom { - get { - return ResourceManager.GetString("menuGenGroupMultipleServerXrayRandom", resourceCulture); - } - } - - /// - /// 查找类似 RoundRobin by Xray 的本地化字符串。 - /// - public static string menuGenGroupMultipleServerXrayRoundRobin { - get { - return ResourceManager.GetString("menuGenGroupMultipleServerXrayRoundRobin", resourceCulture); + return ResourceManager.GetString("menuGenGroupServer", resourceCulture); } } diff --git a/v2rayN/ServiceLib/Resx/ResUI.fa-Ir.resx b/v2rayN/ServiceLib/Resx/ResUI.fa-Ir.resx index 0df75d77..957e5de0 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.fa-Ir.resx +++ b/v2rayN/ServiceLib/Resx/ResUI.fa-Ir.resx @@ -1371,24 +1371,6 @@ مخفی و پورت می شود، با کاما (،) جدا می شود - - Generate Policy Group from Multiple Profiles - - - چند سرور تصادفی توسط Xray - - - چند سرور RoundRobin توسط Xray - - - چند سرور LeastPing توسط Xray - - - چند سرور LeastLoad توسط Xray - - - LeastPing چند سرور توسط sing-box - صادر کردن سرور @@ -1533,12 +1515,6 @@ Fallback - - Multi-Configuration Fallback by sing-box - - - Multi-Configuration Fallback by Xray - Core '{0}' does not support network type '{1}' @@ -1686,4 +1662,10 @@ The "Get Certificate" action may fail if a self-signed certificate is used or if Subscription next proxy {0} not found. Skipping. + + Generate Policy Group + + + All configurations + \ No newline at end of file diff --git a/v2rayN/ServiceLib/Resx/ResUI.fr.resx b/v2rayN/ServiceLib/Resx/ResUI.fr.resx index 6c882112..07f59492 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.fr.resx +++ b/v2rayN/ServiceLib/Resx/ResUI.fr.resx @@ -1368,24 +1368,6 @@ Écrase le port ; pour plusieurs groupes, séparer par virgules (,) - - Générer un groupe de stratégie depuis plusieurs profils - - - Xray aléatoire (multi-sélection) - - - Xray équilibrage (tourniquet) multi-sélection - - - Xray latence minimale (multi-sélection) - - - Xray le plus stable (multi-sélection) - - - sing-box latence minimale (multi-sélection) - Exporter @@ -1530,12 +1512,6 @@ Basculement (failover) - - sing-box basculement (multi-sélection) - - - Xray basculement (multi-sélection) - Le cœur « {0} » ne prend pas en charge le type de réseau « {1} » @@ -1683,4 +1659,10 @@ The "Get Certificate" action may fail if a self-signed certificate is used or if Subscription next proxy {0} not found. Skipping. + + Generate Policy Group + + + All configurations + diff --git a/v2rayN/ServiceLib/Resx/ResUI.hu.resx b/v2rayN/ServiceLib/Resx/ResUI.hu.resx index dd7d22f4..2fb4d62c 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.hu.resx +++ b/v2rayN/ServiceLib/Resx/ResUI.hu.resx @@ -1371,24 +1371,6 @@ A portot lefedi, vesszővel (,) elválasztva - - Generate Policy Group from Multiple Profiles - - - Több konfiguráció véletlenszerűen Xray szerint - - - Több konfiguráció RoundRobin Xray szerint - - - Több konfiguráció legkisebb pinggel Xray szerint - - - Több konfiguráció legkisebb terheléssel Xray szerint - - - Több konfiguráció legkisebb pinggel sing-box szerint - Konfiguráció exportálása @@ -1533,12 +1515,6 @@ Fallback - - Multi-Configuration Fallback by sing-box - - - Multi-Configuration Fallback by Xray - Core '{0}' does not support network type '{1}' @@ -1686,4 +1662,10 @@ The "Get Certificate" action may fail if a self-signed certificate is used or if Subscription next proxy {0} not found. Skipping. + + Generate Policy Group + + + All configurations + \ No newline at end of file diff --git a/v2rayN/ServiceLib/Resx/ResUI.resx b/v2rayN/ServiceLib/Resx/ResUI.resx index fa53ccc8..21c65216 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.resx +++ b/v2rayN/ServiceLib/Resx/ResUI.resx @@ -1371,24 +1371,6 @@ Will cover the port, separate with commas (,) - - Generate Policy Group from Multiple Profiles - - - Random by Xray - - - RoundRobin by Xray - - - LeastPing by Xray - - - LeastLoad by Xray - - - LeastPing by sing-box - Export @@ -1533,12 +1515,6 @@ Fallback - - Fallback by sing-box - - - Fallback by Xray - Core '{0}' does not support network type '{1}' @@ -1686,4 +1662,10 @@ The "Get Certificate" action may fail if a self-signed certificate is used or if Subscription next proxy {0} not found. Skipping. + + Generate Policy Group + + + All configurations + \ No newline at end of file diff --git a/v2rayN/ServiceLib/Resx/ResUI.ru.resx b/v2rayN/ServiceLib/Resx/ResUI.ru.resx index b33a10e3..91095963 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.ru.resx +++ b/v2rayN/ServiceLib/Resx/ResUI.ru.resx @@ -1371,24 +1371,6 @@ Заменит указанный порт, перечисляйте через запятую (,) - - Generate Policy Group from Multiple Profiles - - - Случайный (Xray) - - - Круговой (Xray) - - - Минимальное RTT (минимальное время туда-обратно) (Xray) - - - Минимальная нагрузка (Xray) - - - Минимальное RTT (минимальное время туда-обратно) (sing-box) - Экспортировать конфигурацию @@ -1533,12 +1515,6 @@ Fallback - - Multi-Configuration Fallback by sing-box - - - Multi-Configuration Fallback by Xray - Core '{0}' does not support network type '{1}' @@ -1686,4 +1662,10 @@ The "Get Certificate" action may fail if a self-signed certificate is used or if Subscription next proxy {0} not found. Skipping. + + Generate Policy Group + + + All configurations + \ No newline at end of file diff --git a/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx b/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx index be76525e..b02e7877 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx @@ -1368,24 +1368,6 @@ 会覆盖端口,多组时用逗号 (,) 隔开 - - 多选生成策略组 - - - 多选随机 Xray - - - 多选负载均衡 Xray - - - 多选最低延迟 Xray - - - 多选最稳定 Xray - - - 多选最低延迟 sing-box - 导出 @@ -1530,12 +1512,6 @@ 故障转移 - - 多选故障转移 sing-box - - - 多选故障转移 Xray - 核心 '{0}' 不支持网络类型 '{1}' @@ -1683,4 +1659,10 @@ 订阅后置节点 {0} 未找到,已跳过。 + + 一键生成策略组 + + + 全部配置项 + \ No newline at end of file diff --git a/v2rayN/ServiceLib/Resx/ResUI.zh-Hant.resx b/v2rayN/ServiceLib/Resx/ResUI.zh-Hant.resx index 4132a27b..7323f2ef 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.zh-Hant.resx +++ b/v2rayN/ServiceLib/Resx/ResUI.zh-Hant.resx @@ -1368,24 +1368,6 @@ 會覆蓋埠,多組時用逗號 (,) 隔開 - - 多選生成策略組 - - - 多選隨機 Xray - - - 多選負載平衡 Xray - - - 多選最低延遲 Xray - - - 多選最穩定 Xray - - - 多選最低延遲 sing-box - 匯出 @@ -1530,12 +1512,6 @@ 容錯移轉 - - 多選容錯移轉 sing-box - - - 多選容錯移轉 Xray - 核心 '{0}' 不支援網路類型 '{1}' @@ -1683,4 +1659,10 @@ Subscription next proxy {0} not found. Skipping. + + Generate Policy Group + + + All configurations + \ No newline at end of file diff --git a/v2rayN/ServiceLib/ViewModels/ProfilesViewModel.cs b/v2rayN/ServiceLib/ViewModels/ProfilesViewModel.cs index 1cc6f46e..42545a08 100644 --- a/v2rayN/ServiceLib/ViewModels/ProfilesViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/ProfilesViewModel.cs @@ -43,13 +43,7 @@ public class ProfilesViewModel : MyReactiveObject public ReactiveCommand CopyServerCmd { get; } public ReactiveCommand SetDefaultServerCmd { get; } public ReactiveCommand ShareServerCmd { get; } - public ReactiveCommand GenGroupMultipleServerXrayRandomCmd { get; } - public ReactiveCommand GenGroupMultipleServerXrayRoundRobinCmd { get; } - public ReactiveCommand GenGroupMultipleServerXrayLeastPingCmd { get; } - public ReactiveCommand GenGroupMultipleServerXrayLeastLoadCmd { get; } - public ReactiveCommand GenGroupMultipleServerXrayFallbackCmd { get; } - public ReactiveCommand GenGroupMultipleServerSingBoxLeastPingCmd { get; } - public ReactiveCommand GenGroupMultipleServerSingBoxFallbackCmd { get; } + public ReactiveCommand GenGroupAllServerCmd { get; } //servers move public ReactiveCommand MoveTopCmd { get; } @@ -134,33 +128,9 @@ public class ProfilesViewModel : MyReactiveObject { await ShareServerAsync(); }, canEditRemove); - GenGroupMultipleServerXrayRandomCmd = ReactiveCommand.CreateFromTask(async () => + GenGroupAllServerCmd = ReactiveCommand.CreateFromTask(async () => { - await GenGroupMultipleServer(ECoreType.Xray, EMultipleLoad.Random); - }, canEditRemove); - GenGroupMultipleServerXrayRoundRobinCmd = ReactiveCommand.CreateFromTask(async () => - { - await GenGroupMultipleServer(ECoreType.Xray, EMultipleLoad.RoundRobin); - }, canEditRemove); - GenGroupMultipleServerXrayLeastPingCmd = ReactiveCommand.CreateFromTask(async () => - { - await GenGroupMultipleServer(ECoreType.Xray, EMultipleLoad.LeastPing); - }, canEditRemove); - GenGroupMultipleServerXrayLeastLoadCmd = ReactiveCommand.CreateFromTask(async () => - { - await GenGroupMultipleServer(ECoreType.Xray, EMultipleLoad.LeastLoad); - }, canEditRemove); - GenGroupMultipleServerXrayFallbackCmd = ReactiveCommand.CreateFromTask(async () => - { - await GenGroupMultipleServer(ECoreType.Xray, EMultipleLoad.Fallback); - }, canEditRemove); - GenGroupMultipleServerSingBoxLeastPingCmd = ReactiveCommand.CreateFromTask(async () => - { - await GenGroupMultipleServer(ECoreType.sing_box, EMultipleLoad.LeastPing); - }, canEditRemove); - GenGroupMultipleServerSingBoxFallbackCmd = ReactiveCommand.CreateFromTask(async () => - { - await GenGroupMultipleServer(ECoreType.sing_box, EMultipleLoad.Fallback); + await GenGroupAllServer(); }, canEditRemove); //servers move @@ -641,29 +611,15 @@ public class ProfilesViewModel : MyReactiveObject await _updateView?.Invoke(EViewAction.ShareServer, url); } - private async Task GenGroupMultipleServer(ECoreType coreType, EMultipleLoad multipleLoad) + private async Task GenGroupAllServer() { - var lstSelected = await GetProfileItems(true); - if (lstSelected == null) - { - return; - } - - var ret = await ConfigHandler.AddGroupServer4Multiple(_config, lstSelected, coreType, multipleLoad, SelectedSub?.Id); + var ret = await ConfigHandler.AddGroupAllServer(_config, SelectedSub); if (ret.Success != true) { NoticeManager.Instance.Enqueue(ResUI.OperationFailed); return; } - if (ret?.Data?.ToString() == _config.IndexId) - { - await RefreshServers(); - Reload(); - } - else - { - await SetDefaultServer(ret?.Data?.ToString()); - } + await RefreshServers(); } public async Task SortServer(string colName) diff --git a/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml b/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml index 116f35fa..71569feb 100644 --- a/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml +++ b/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml @@ -193,14 +193,8 @@ - - - - - - - - + + diff --git a/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs b/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs index aaebb518..3ce58944 100644 --- a/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs +++ b/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs @@ -60,12 +60,7 @@ public partial class ProfilesView : ReactiveUserControl this.BindCommand(ViewModel, vm => vm.CopyServerCmd, v => v.menuCopyServer).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.SetDefaultServerCmd, v => v.menuSetDefaultServer).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.ShareServerCmd, v => v.menuShareServer).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.GenGroupMultipleServerXrayRandomCmd, v => v.menuGenGroupMultipleServerXrayRandom).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.GenGroupMultipleServerXrayRoundRobinCmd, v => v.menuGenGroupMultipleServerXrayRoundRobin).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.GenGroupMultipleServerXrayLeastPingCmd, v => v.menuGenGroupMultipleServerXrayLeastPing).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.GenGroupMultipleServerXrayLeastLoadCmd, v => v.menuGenGroupMultipleServerXrayLeastLoad).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.GenGroupMultipleServerSingBoxLeastPingCmd, v => v.menuGenGroupMultipleServerSingBoxLeastPing).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.GenGroupMultipleServerSingBoxFallbackCmd, v => v.menuGenGroupMultipleServerSingBoxFallback).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.GenGroupAllServerCmd, v => v.menuGenGroupAllServer).DisposeWith(disposables); //servers move //this.OneWayBind(ViewModel, vm => vm.SubItems, v => v.cmbMoveToGroup.ItemsSource).DisposeWith(disposables); diff --git a/v2rayN/v2rayN/Views/ProfilesView.xaml b/v2rayN/v2rayN/Views/ProfilesView.xaml index 6cf0d159..3cfd59a7 100644 --- a/v2rayN/v2rayN/Views/ProfilesView.xaml +++ b/v2rayN/v2rayN/Views/ProfilesView.xaml @@ -240,32 +240,11 @@ Header="{x:Static resx:ResUI.menuExport2ShareUrlBase64}" /> - + - - - - - - + Header="{x:Static resx:ResUI.menuAllServers}" /> diff --git a/v2rayN/v2rayN/Views/ProfilesView.xaml.cs b/v2rayN/v2rayN/Views/ProfilesView.xaml.cs index 58b468a4..aeeaaa64 100644 --- a/v2rayN/v2rayN/Views/ProfilesView.xaml.cs +++ b/v2rayN/v2rayN/Views/ProfilesView.xaml.cs @@ -54,12 +54,7 @@ public partial class ProfilesView this.BindCommand(ViewModel, vm => vm.CopyServerCmd, v => v.menuCopyServer).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.SetDefaultServerCmd, v => v.menuSetDefaultServer).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.ShareServerCmd, v => v.menuShareServer).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.GenGroupMultipleServerXrayRandomCmd, v => v.menuGenGroupMultipleServerXrayRandom).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.GenGroupMultipleServerXrayRoundRobinCmd, v => v.menuGenGroupMultipleServerXrayRoundRobin).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.GenGroupMultipleServerXrayLeastPingCmd, v => v.menuGenGroupMultipleServerXrayLeastPing).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.GenGroupMultipleServerXrayLeastLoadCmd, v => v.menuGenGroupMultipleServerXrayLeastLoad).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.GenGroupMultipleServerSingBoxLeastPingCmd, v => v.menuGenGroupMultipleServerSingBoxLeastPing).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.GenGroupMultipleServerSingBoxFallbackCmd, v => v.menuGenGroupMultipleServerSingBoxFallback).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.GenGroupAllServerCmd, v => v.menuGenGroupAllServer).DisposeWith(disposables); //servers move this.OneWayBind(ViewModel, vm => vm.SubItems, v => v.cmbMoveToGroup.ItemsSource).DisposeWith(disposables);