mirror of
https://github.com/2dust/v2rayN.git
synced 2025-07-11 06:07:46 +00:00
Add Connections Host Filter
https://github.com/2dust/v2rayN/issues/5683
This commit is contained in:
parent
aa829a66ea
commit
4c0a59a715
8 changed files with 47 additions and 5 deletions
|
@ -14,6 +14,11 @@ namespace ServiceLib.Common
|
||||||
return string.IsNullOrWhiteSpace(value);
|
return string.IsNullOrWhiteSpace(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static bool IsNotEmpty([NotNullWhen(false)] this string? value)
|
||||||
|
{
|
||||||
|
return !string.IsNullOrEmpty(value);
|
||||||
|
}
|
||||||
|
|
||||||
public static bool BeginWithAny(this string s, IEnumerable<char> chars)
|
public static bool BeginWithAny(this string s, IEnumerable<char> chars)
|
||||||
{
|
{
|
||||||
if (s.IsNullOrEmpty()) return false;
|
if (s.IsNullOrEmpty()) return false;
|
||||||
|
|
9
v2rayN/ServiceLib/Resx/ResUI.Designer.cs
generated
9
v2rayN/ServiceLib/Resx/ResUI.Designer.cs
generated
|
@ -105,6 +105,15 @@ namespace ServiceLib.Resx {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 Host filter 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string ConnectionsHostFilterTitle {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("ConnectionsHostFilterTitle", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 Note that custom configuration relies entirely on your own configuration and does not work with all settings. If you want to use the system proxy, please modify the listening port manually. 的本地化字符串。
|
/// 查找类似 Note that custom configuration relies entirely on your own configuration and does not work with all settings. If you want to use the system proxy, please modify the listening port manually. 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -1318,4 +1318,7 @@
|
||||||
<data name="LocalRestoreInvalidZipTips" xml:space="preserve">
|
<data name="LocalRestoreInvalidZipTips" xml:space="preserve">
|
||||||
<value>Invalid backup file</value>
|
<value>Invalid backup file</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="ConnectionsHostFilterTitle" xml:space="preserve">
|
||||||
|
<value>Host filter</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
|
@ -1315,4 +1315,7 @@
|
||||||
<data name="LocalRestoreInvalidZipTips" xml:space="preserve">
|
<data name="LocalRestoreInvalidZipTips" xml:space="preserve">
|
||||||
<value>无效备份文件</value>
|
<value>无效备份文件</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="ConnectionsHostFilterTitle" xml:space="preserve">
|
||||||
|
<value>主机过滤器</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
|
@ -1195,4 +1195,7 @@
|
||||||
<data name="LocalRestoreInvalidZipTips" xml:space="preserve">
|
<data name="LocalRestoreInvalidZipTips" xml:space="preserve">
|
||||||
<value>無效備份文件</value>
|
<value>無效備份文件</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="ConnectionsHostFilterTitle" xml:space="preserve">
|
||||||
|
<value>主機過濾器</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
|
@ -19,6 +19,9 @@ namespace ServiceLib.ViewModels
|
||||||
public ReactiveCommand<Unit, Unit> ConnectionCloseCmd { get; }
|
public ReactiveCommand<Unit, Unit> ConnectionCloseCmd { get; }
|
||||||
public ReactiveCommand<Unit, Unit> ConnectionCloseAllCmd { get; }
|
public ReactiveCommand<Unit, Unit> ConnectionCloseAllCmd { get; }
|
||||||
|
|
||||||
|
[Reactive]
|
||||||
|
public string HostFilter { get; set; }
|
||||||
|
|
||||||
[Reactive]
|
[Reactive]
|
||||||
public int SortingSelected { get; set; }
|
public int SortingSelected { get; set; }
|
||||||
|
|
||||||
|
@ -77,7 +80,7 @@ namespace ServiceLib.ViewModels
|
||||||
{
|
{
|
||||||
var lastTime = DateTime.Now;
|
var lastTime = DateTime.Now;
|
||||||
|
|
||||||
Observable.Interval(TimeSpan.FromSeconds(10))
|
Observable.Interval(TimeSpan.FromSeconds(5))
|
||||||
.Subscribe(x =>
|
.Subscribe(x =>
|
||||||
{
|
{
|
||||||
if (!(AutoRefresh && _config.uiItem.showInTaskbar && _config.IsRunningCore(ECoreType.clash)))
|
if (!(AutoRefresh && _config.uiItem.showInTaskbar && _config.IsRunningCore(ECoreType.clash)))
|
||||||
|
@ -118,12 +121,18 @@ namespace ServiceLib.ViewModels
|
||||||
var lstModel = new List<ClashConnectionModel>();
|
var lstModel = new List<ClashConnectionModel>();
|
||||||
foreach (var item in connections ?? [])
|
foreach (var item in connections ?? [])
|
||||||
{
|
{
|
||||||
|
var host = $"{(string.IsNullOrEmpty(item.metadata.host) ? item.metadata.destinationIP : item.metadata.host)}:{item.metadata.destinationPort}";
|
||||||
|
if (HostFilter.IsNotEmpty() && !host.Contains(HostFilter))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
ClashConnectionModel model = new();
|
ClashConnectionModel model = new();
|
||||||
|
|
||||||
model.id = item.id;
|
model.id = item.id;
|
||||||
model.network = item.metadata.network;
|
model.network = item.metadata.network;
|
||||||
model.type = item.metadata.type;
|
model.type = item.metadata.type;
|
||||||
model.host = $"{(string.IsNullOrEmpty(item.metadata.host) ? item.metadata.destinationIP : item.metadata.host)}:{item.metadata.destinationPort}";
|
model.host = host;
|
||||||
var sp = (dtNow - item.start);
|
var sp = (dtNow - item.start);
|
||||||
model.time = sp.TotalSeconds < 0 ? 1 : sp.TotalSeconds;
|
model.time = sp.TotalSeconds < 0 ? 1 : sp.TotalSeconds;
|
||||||
model.upload = item.upload;
|
model.upload = item.upload;
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
<reactiveui:ReactiveUserControl
|
<reactiveui:ReactiveUserControl
|
||||||
x:Class="v2rayN.Views.ClashConnectionsView"
|
x:Class="v2rayN.Views.ClashConnectionsView"
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
|
||||||
xmlns:reactiveui="http://reactiveui.net"
|
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:reactiveui="http://reactiveui.net"
|
||||||
xmlns:resx="clr-namespace:ServiceLib.Resx;assembly=ServiceLib"
|
xmlns:resx="clr-namespace:ServiceLib.Resx;assembly=ServiceLib"
|
||||||
xmlns:vms="clr-namespace:ServiceLib.ViewModels;assembly=ServiceLib"
|
xmlns:vms="clr-namespace:ServiceLib.ViewModels;assembly=ServiceLib"
|
||||||
d:DesignHeight="450"
|
d:DesignHeight="450"
|
||||||
|
@ -20,6 +20,15 @@
|
||||||
DockPanel.Dock="Top"
|
DockPanel.Dock="Top"
|
||||||
Orientation="Horizontal">
|
Orientation="Horizontal">
|
||||||
|
|
||||||
|
<TextBox
|
||||||
|
x:Name="txtHostFilter"
|
||||||
|
Width="200"
|
||||||
|
Margin="8,0"
|
||||||
|
VerticalContentAlignment="Center"
|
||||||
|
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.ConnectionsHostFilterTitle}"
|
||||||
|
materialDesign:TextFieldAssist.HasClearButton="True"
|
||||||
|
Style="{StaticResource DefTextBox}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Margin="8,0"
|
Margin="8,0"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
|
|
|
@ -23,6 +23,7 @@ namespace v2rayN.Views
|
||||||
this.BindCommand(ViewModel, vm => vm.ConnectionCloseCmd, v => v.menuConnectionClose).DisposeWith(disposables);
|
this.BindCommand(ViewModel, vm => vm.ConnectionCloseCmd, v => v.menuConnectionClose).DisposeWith(disposables);
|
||||||
this.BindCommand(ViewModel, vm => vm.ConnectionCloseAllCmd, v => v.menuConnectionCloseAll).DisposeWith(disposables);
|
this.BindCommand(ViewModel, vm => vm.ConnectionCloseAllCmd, v => v.menuConnectionCloseAll).DisposeWith(disposables);
|
||||||
|
|
||||||
|
this.Bind(ViewModel, vm => vm.HostFilter, v => v.txtHostFilter.Text).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.SortingSelected, v => v.cmbSorting.SelectedIndex).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.SortingSelected, v => v.cmbSorting.SelectedIndex).DisposeWith(disposables);
|
||||||
this.BindCommand(ViewModel, vm => vm.ConnectionCloseAllCmd, v => v.btnConnectionCloseAll).DisposeWith(disposables);
|
this.BindCommand(ViewModel, vm => vm.ConnectionCloseAllCmd, v => v.btnConnectionCloseAll).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.AutoRefresh, v => v.togAutoRefresh.IsChecked).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.AutoRefresh, v => v.togAutoRefresh.IsChecked).DisposeWith(disposables);
|
||||||
|
|
Loading…
Reference in a new issue