Compare commits
76 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3c2da0a225 | ||
|
|
528400579a | ||
|
|
521ce1a487 | ||
|
|
34c6c953ac | ||
|
|
40fbbc7c58 | ||
|
|
534c329970 | ||
|
|
328d728257 | ||
|
|
fae6d42758 | ||
|
|
27693f6d23 | ||
|
|
89c4bab5b9 | ||
|
|
9d2ff04838 | ||
|
|
cf00243107 | ||
|
|
e8019ba7a5 | ||
|
|
4f30e3f0e3 | ||
|
|
047d08470f | ||
|
|
9643695389 | ||
|
|
5cabec86e7 | ||
|
|
f2d0e37255 | ||
|
|
9560851a3f | ||
|
|
4aeec1caa1 | ||
|
|
ae45b1ef44 | ||
|
|
aad1b087c9 | ||
|
|
b69c581fa1 | ||
|
|
9eb4d90cd6 | ||
|
|
958567c2c5 | ||
|
|
f1fc4583ed | ||
|
|
f7bfd5f766 | ||
|
|
aadc3c216a | ||
|
|
6fd2499daf | ||
|
|
f0405f1c5d | ||
|
|
1914cb3994 | ||
|
|
ab38fb572d | ||
|
|
46d7128a6e | ||
|
|
0821884ff3 | ||
|
|
62233281ef | ||
|
|
39504502af | ||
|
|
f97530a671 | ||
|
|
0fe7d5e598 | ||
|
|
527362dc9f | ||
|
|
1023426c8d | ||
|
|
4458fd7541 | ||
|
|
f0b03f59ff | ||
|
|
d5b17b3cfb | ||
|
|
9664d1d77f | ||
|
|
d329646a52 | ||
|
|
8eafe72bb0 | ||
|
|
c38a0bde65 | ||
|
|
eef5d3cc16 | ||
|
|
59ada594a5 | ||
|
|
5ec1d18143 | ||
|
|
fd1e1bb6bf | ||
|
|
5d545d8a85 | ||
|
|
e38bc45527 | ||
|
|
1b11425acd | ||
|
|
1e67850a80 | ||
|
|
975f89456f | ||
|
|
e267b4b379 | ||
|
|
2fd21690a5 | ||
|
|
b176ad03aa | ||
|
|
152c4802d0 | ||
|
|
8adbc57f23 | ||
|
|
d263a78db8 | ||
|
|
b94a065c06 | ||
|
|
bc957fea71 | ||
|
|
566f056149 | ||
|
|
abe484b0df | ||
|
|
982c865245 | ||
|
|
07d2a27b5f | ||
|
|
e4c65deda8 | ||
|
|
4930646e05 | ||
|
|
01dd1ff56f | ||
|
|
9433213fe5 | ||
|
|
82dea829f1 | ||
|
|
dafc83aa53 | ||
|
|
7ab1cd6612 | ||
|
|
d0e3b3ffbd |
@@ -2,7 +2,6 @@
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace PacLib;
|
namespace PacLib;
|
||||||
@@ -50,7 +49,7 @@ public class PacHandler
|
|||||||
_tcpListener = TcpListener.Create(_pacPort);
|
_tcpListener = TcpListener.Create(_pacPort);
|
||||||
_isRunning = true;
|
_isRunning = true;
|
||||||
_tcpListener.Start();
|
_tcpListener.Start();
|
||||||
Task.Factory.StartNew(() =>
|
Task.Factory.StartNew(async () =>
|
||||||
{
|
{
|
||||||
while (_isRunning)
|
while (_isRunning)
|
||||||
{
|
{
|
||||||
@@ -58,12 +57,12 @@ public class PacHandler
|
|||||||
{
|
{
|
||||||
if (!_tcpListener.Pending())
|
if (!_tcpListener.Pending())
|
||||||
{
|
{
|
||||||
Thread.Sleep(10);
|
await Task.Delay(10);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
var client = _tcpListener.AcceptTcpClient();
|
var client = _tcpListener.AcceptTcpClient();
|
||||||
Task.Run(() =>
|
await Task.Run(() =>
|
||||||
{
|
{
|
||||||
var stream = client.GetStream();
|
var stream = client.GetStream();
|
||||||
var sb = new StringBuilder();
|
var sb = new StringBuilder();
|
||||||
|
|||||||
@@ -5982,7 +5982,8 @@ var rules = [
|
|||||||
"zyzc9.com",
|
"zyzc9.com",
|
||||||
"zzcartoon.com",
|
"zzcartoon.com",
|
||||||
"zzcloud.me",
|
"zzcloud.me",
|
||||||
"zzux.com"
|
"zzux.com",
|
||||||
|
"chat.openai.com"
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -9,8 +9,8 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Google.Protobuf" Version="3.23.0" />
|
<PackageReference Include="Google.Protobuf" Version="3.23.3" />
|
||||||
<PackageReference Include="Grpc.Net.Client" Version="2.53.0" />
|
<PackageReference Include="Grpc.Net.Client" Version="2.54.0" />
|
||||||
<PackageReference Include="Grpc.Tools" Version="2.54.0">
|
<PackageReference Include="Grpc.Tools" Version="2.54.0">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
<Application
|
<Application
|
||||||
x:Class="v2rayN.App"
|
x:Class="v2rayN.App"
|
||||||
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:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:conv="clr-namespace:v2rayN.Converters"
|
xmlns:conv="clr-namespace:v2rayN.Converters"
|
||||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
|
||||||
ShutdownMode="OnExplicitShutdown"
|
ShutdownMode="OnExplicitShutdown"
|
||||||
StartupUri="Views/MainWindow.xaml">
|
StartupUri="Views/MainWindow.xaml">
|
||||||
<Application.Resources>
|
<Application.Resources>
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
<system:Double x:Key="StdFontSize2">14</system:Double>
|
<system:Double x:Key="StdFontSize2">14</system:Double>
|
||||||
<system:Double x:Key="StdFontSizeMsg">11</system:Double>
|
<system:Double x:Key="StdFontSizeMsg">11</system:Double>
|
||||||
|
|
||||||
<conv:InverseBooleanConverter x:Key="InverseBooleanConverter"/>
|
<conv:InverseBooleanConverter x:Key="InverseBooleanConverter" />
|
||||||
<Thickness
|
<Thickness
|
||||||
x:Key="ServerItemMargin"
|
x:Key="ServerItemMargin"
|
||||||
Bottom="4"
|
Bottom="4"
|
||||||
|
|||||||
@@ -70,5 +70,15 @@ namespace v2rayN.Base
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static string UpperFirstChar(this string value)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(value))
|
||||||
|
{
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
return char.ToUpper(value[0]) + value.Substring(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8,7 +8,7 @@ namespace v2rayN.Converters
|
|||||||
{
|
{
|
||||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||||
{
|
{
|
||||||
if(targetType != typeof(bool))
|
if (targetType != typeof(bool))
|
||||||
{
|
{
|
||||||
throw new InvalidOperationException("The target must be a boolean");
|
throw new InvalidOperationException("The target must be a boolean");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
public const string geoUrl = "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/{0}.dat";
|
public const string geoUrl = "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/{0}.dat";
|
||||||
public const string singboxGeoUrl = "https://github.com/soffchen/sing-{0}/releases/latest/download/{0}.db";
|
public const string singboxGeoUrl = "https://github.com/soffchen/sing-{0}/releases/latest/download/{0}.db";
|
||||||
public const string SpeedPingTestUrl = @"https://www.google.com/generate_204";
|
public const string SpeedPingTestUrl = @"https://www.google.com/generate_204";
|
||||||
|
public const string juicityCoreUrl = "https://github.com/juicity/juicity/releases";
|
||||||
public const string CustomRoutingListUrl = @"https://raw.githubusercontent.com/2dust/v2rayCustomRoutingList/master/";
|
public const string CustomRoutingListUrl = @"https://raw.githubusercontent.com/2dust/v2rayCustomRoutingList/master/";
|
||||||
|
|
||||||
public const string PromotionUrl = @"aHR0cHM6Ly85LjIzNDQ1Ni54eXovYWJjLmh0bWw=";
|
public const string PromotionUrl = @"aHR0cHM6Ly85LjIzNDQ1Ni54eXovYWJjLmh0bWw=";
|
||||||
@@ -149,7 +150,7 @@
|
|||||||
|
|
||||||
public static readonly List<string> allowInsecures = new() { "true", "false", "" };
|
public static readonly List<string> allowInsecures = new() { "true", "false", "" };
|
||||||
public static readonly List<string> domainStrategy4Freedoms = new() { "AsIs", "UseIP", "UseIPv4", "UseIPv6", "" };
|
public static readonly List<string> domainStrategy4Freedoms = new() { "AsIs", "UseIP", "UseIPv4", "UseIPv6", "" };
|
||||||
public static readonly List<string> Languages = new() { "zh-Hans", "en", "fa-Ir", "ru" };
|
public static readonly List<string> Languages = new() { "zh-Hans", "zh-Hant", "en", "fa-Ir", "ru" };
|
||||||
public static readonly List<string> alpns = new() { "h2", "http/1.1", "h2,http/1.1", "" };
|
public static readonly List<string> alpns = new() { "h2", "http/1.1", "h2,http/1.1", "" };
|
||||||
public static readonly List<string> LogLevel = new() { "debug", "info", "warning", "error", "none" };
|
public static readonly List<string> LogLevel = new() { "debug", "info", "warning", "error", "none" };
|
||||||
public static readonly List<string> InboundTags = new() { "socks", "http", "socks2", "http2" };
|
public static readonly List<string> InboundTags = new() { "socks", "http", "socks2", "http2" };
|
||||||
|
|||||||
@@ -140,7 +140,6 @@ namespace v2rayN.Handler
|
|||||||
config.guiItem = new()
|
config.guiItem = new()
|
||||||
{
|
{
|
||||||
enableStatistics = false,
|
enableStatistics = false,
|
||||||
statisticsFreshRate = 1,
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
if (config.uiItem == null)
|
if (config.uiItem == null)
|
||||||
@@ -185,11 +184,6 @@ namespace v2rayN.Handler
|
|||||||
config.speedTestItem.speedPingTestUrl = Global.SpeedPingTestUrl;
|
config.speedTestItem.speedPingTestUrl = Global.SpeedPingTestUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config.guiItem.statisticsFreshRate is > 100 or < 1)
|
|
||||||
{
|
|
||||||
config.guiItem.statisticsFreshRate = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (config.mux4Sbox == null)
|
if (config.mux4Sbox == null)
|
||||||
{
|
{
|
||||||
config.mux4Sbox = new()
|
config.mux4Sbox = new()
|
||||||
@@ -331,7 +325,6 @@ namespace v2rayN.Handler
|
|||||||
config.guiItem = new()
|
config.guiItem = new()
|
||||||
{
|
{
|
||||||
enableStatistics = configOld.enableStatistics,
|
enableStatistics = configOld.enableStatistics,
|
||||||
statisticsFreshRate = configOld.statisticsFreshRate,
|
|
||||||
keepOlderDedupl = configOld.keepOlderDedupl,
|
keepOlderDedupl = configOld.keepOlderDedupl,
|
||||||
ignoreGeoUpdateCore = configOld.ignoreGeoUpdateCore,
|
ignoreGeoUpdateCore = configOld.ignoreGeoUpdateCore,
|
||||||
autoUpdateInterval = configOld.autoUpdateInterval,
|
autoUpdateInterval = configOld.autoUpdateInterval,
|
||||||
@@ -376,6 +369,10 @@ namespace v2rayN.Handler
|
|||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
if (profileItem.id.IsNullOrEmpty())
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
AddServerCommon(ref config, profileItem, toFile);
|
AddServerCommon(ref config, profileItem, toFile);
|
||||||
|
|
||||||
@@ -597,7 +594,7 @@ namespace v2rayN.Handler
|
|||||||
profileItem.configType = EConfigType.Custom;
|
profileItem.configType = EConfigType.Custom;
|
||||||
if (Utils.IsNullOrEmpty(profileItem.remarks))
|
if (Utils.IsNullOrEmpty(profileItem.remarks))
|
||||||
{
|
{
|
||||||
profileItem.remarks = $"import custom@{DateTime.Now.ToShortDateString()}";
|
profileItem.remarks = $"import custom@{DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")}";
|
||||||
}
|
}
|
||||||
|
|
||||||
AddServerCommon(ref config, profileItem, true);
|
AddServerCommon(ref config, profileItem, true);
|
||||||
@@ -643,6 +640,10 @@ namespace v2rayN.Handler
|
|||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
if (profileItem.id.IsNullOrEmpty())
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
AddServerCommon(ref config, profileItem, toFile);
|
AddServerCommon(ref config, profileItem, toFile);
|
||||||
|
|
||||||
@@ -682,6 +683,10 @@ namespace v2rayN.Handler
|
|||||||
{
|
{
|
||||||
profileItem.streamSecurity = Global.StreamSecurity;
|
profileItem.streamSecurity = Global.StreamSecurity;
|
||||||
}
|
}
|
||||||
|
if (profileItem.id.IsNullOrEmpty())
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
AddServerCommon(ref config, profileItem, toFile);
|
AddServerCommon(ref config, profileItem, toFile);
|
||||||
|
|
||||||
@@ -807,6 +812,10 @@ namespace v2rayN.Handler
|
|||||||
{
|
{
|
||||||
profileItem.flow = Global.flows.First();
|
profileItem.flow = Global.flows.First();
|
||||||
}
|
}
|
||||||
|
if (profileItem.id.IsNullOrEmpty())
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
AddServerCommon(ref config, profileItem, toFile);
|
AddServerCommon(ref config, profileItem, toFile);
|
||||||
|
|
||||||
@@ -858,10 +867,18 @@ namespace v2rayN.Handler
|
|||||||
profileItem.network = Global.DefaultNetwork;
|
profileItem.network = Global.DefaultNetwork;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var maxSort = -1;
|
||||||
if (Utils.IsNullOrEmpty(profileItem.indexId))
|
if (Utils.IsNullOrEmpty(profileItem.indexId))
|
||||||
{
|
{
|
||||||
profileItem.indexId = Utils.GetGUID(false);
|
profileItem.indexId = Utils.GetGUID(false);
|
||||||
var maxSort = ProfileExHandler.Instance.GetMaxSort();
|
maxSort = ProfileExHandler.Instance.GetMaxSort();
|
||||||
|
}
|
||||||
|
if (!toFile && maxSort < 0)
|
||||||
|
{
|
||||||
|
maxSort = ProfileExHandler.Instance.GetMaxSort();
|
||||||
|
}
|
||||||
|
if (maxSort > 0)
|
||||||
|
{
|
||||||
ProfileExHandler.Instance.SetSort(profileItem.indexId, maxSort + 1);
|
ProfileExHandler.Instance.SetSort(profileItem.indexId, maxSort + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1026,7 +1043,7 @@ namespace v2rayN.Handler
|
|||||||
addStatus = AddVlessServer(ref config, profileItem, false);
|
addStatus = AddVlessServer(ref config, profileItem, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (addStatus == 0 && profileItem.port > 0)
|
if (addStatus == 0)
|
||||||
{
|
{
|
||||||
countServers++;
|
countServers++;
|
||||||
lstAdd.Add(profileItem);
|
lstAdd.Add(profileItem);
|
||||||
|
|||||||
@@ -106,30 +106,19 @@ namespace v2rayN.Handler
|
|||||||
private int inbound(SingboxConfig singboxConfig)
|
private int inbound(SingboxConfig singboxConfig)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
|
||||||
if (_config.tunModeItem.enableTun)
|
|
||||||
{
|
{
|
||||||
singboxConfig.inbounds.Clear();
|
singboxConfig.inbounds.Clear();
|
||||||
|
|
||||||
if (_config.tunModeItem.mtu <= 0)
|
if (!_config.tunModeItem.enableTun || (_config.tunModeItem.enableTun && _config.tunModeItem.enableExInbound))
|
||||||
{
|
{
|
||||||
_config.tunModeItem.mtu = Convert.ToInt32(Global.TunMtus[0]);
|
var inbound = new Inbound4Sbox()
|
||||||
}
|
|
||||||
if (Utils.IsNullOrEmpty(_config.tunModeItem.stack))
|
|
||||||
{
|
{
|
||||||
_config.tunModeItem.stack = Global.TunStacks[0];
|
type = Global.InboundSocks,
|
||||||
}
|
tag = Global.InboundSocks,
|
||||||
|
listen = Global.Loopback,
|
||||||
|
};
|
||||||
|
singboxConfig.inbounds.Add(inbound);
|
||||||
|
|
||||||
var tunInbound = Utils.FromJson<Inbound4Sbox>(Utils.GetEmbedText(Global.TunSingboxInboundFileName));
|
|
||||||
tunInbound.mtu = _config.tunModeItem.mtu;
|
|
||||||
tunInbound.strict_route = _config.tunModeItem.strictRoute;
|
|
||||||
tunInbound.stack = _config.tunModeItem.stack;
|
|
||||||
|
|
||||||
singboxConfig.inbounds.Add(tunInbound);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var inbound = singboxConfig.inbounds[0];
|
|
||||||
inbound.listen_port = LazyConfig.Instance.GetLocalPort(Global.InboundSocks);
|
inbound.listen_port = LazyConfig.Instance.GetLocalPort(Global.InboundSocks);
|
||||||
inbound.sniff = _config.inbound[0].sniffingEnabled;
|
inbound.sniff = _config.inbound[0].sniffingEnabled;
|
||||||
inbound.sniff_override_destination = _config.inbound[0].routeOnly ? false : _config.inbound[0].sniffingEnabled;
|
inbound.sniff_override_destination = _config.inbound[0].routeOnly ? false : _config.inbound[0].sniffingEnabled;
|
||||||
@@ -174,6 +163,25 @@ namespace v2rayN.Handler
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_config.tunModeItem.enableTun)
|
||||||
|
{
|
||||||
|
if (_config.tunModeItem.mtu <= 0)
|
||||||
|
{
|
||||||
|
_config.tunModeItem.mtu = Convert.ToInt32(Global.TunMtus[0]);
|
||||||
|
}
|
||||||
|
if (Utils.IsNullOrEmpty(_config.tunModeItem.stack))
|
||||||
|
{
|
||||||
|
_config.tunModeItem.stack = Global.TunStacks[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
var tunInbound = Utils.FromJson<Inbound4Sbox>(Utils.GetEmbedText(Global.TunSingboxInboundFileName));
|
||||||
|
tunInbound.mtu = _config.tunModeItem.mtu;
|
||||||
|
tunInbound.strict_route = _config.tunModeItem.strictRoute;
|
||||||
|
tunInbound.stack = _config.tunModeItem.stack;
|
||||||
|
|
||||||
|
singboxConfig.inbounds.Add(tunInbound);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -255,7 +263,6 @@ namespace v2rayN.Handler
|
|||||||
outbound.type = Global.vlessProtocolLite;
|
outbound.type = Global.vlessProtocolLite;
|
||||||
|
|
||||||
outbound.uuid = node.id;
|
outbound.uuid = node.id;
|
||||||
outbound.flow = node.flow;
|
|
||||||
|
|
||||||
outbound.packet_encoding = "xudp";
|
outbound.packet_encoding = "xudp";
|
||||||
|
|
||||||
@@ -263,6 +270,10 @@ namespace v2rayN.Handler
|
|||||||
{
|
{
|
||||||
outboundMux(node, outbound);
|
outboundMux(node, outbound);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
outbound.flow = node.flow;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (node.configType == EConfigType.Trojan)
|
else if (node.configType == EConfigType.Trojan)
|
||||||
{
|
{
|
||||||
@@ -288,19 +299,19 @@ namespace v2rayN.Handler
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (_config.coreBasicItem.muxEnabled)
|
//if (_config.coreBasicItem.muxEnabled)
|
||||||
{
|
//{
|
||||||
var mux = new Multiplex4Sbox()
|
// var mux = new Multiplex4Sbox()
|
||||||
{
|
// {
|
||||||
enabled = true,
|
// enabled = true,
|
||||||
protocol = _config.mux4Sbox.protocol,
|
// protocol = _config.mux4Sbox.protocol,
|
||||||
max_connections = _config.mux4Sbox.max_connections,
|
// max_connections = _config.mux4Sbox.max_connections,
|
||||||
min_streams = _config.mux4Sbox.min_streams,
|
// min_streams = _config.mux4Sbox.min_streams,
|
||||||
max_streams = _config.mux4Sbox.max_streams,
|
// max_streams = _config.mux4Sbox.max_streams,
|
||||||
padding = _config.mux4Sbox.padding
|
// padding = _config.mux4Sbox.padding
|
||||||
};
|
// };
|
||||||
outbound.multiplex = mux;
|
// outbound.multiplex = mux;
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -315,10 +326,19 @@ namespace v2rayN.Handler
|
|||||||
{
|
{
|
||||||
if (node.streamSecurity == Global.StreamSecurityReality || node.streamSecurity == Global.StreamSecurity)
|
if (node.streamSecurity == Global.StreamSecurityReality || node.streamSecurity == Global.StreamSecurity)
|
||||||
{
|
{
|
||||||
|
var server_name = string.Empty;
|
||||||
|
if (!string.IsNullOrWhiteSpace(node.sni))
|
||||||
|
{
|
||||||
|
server_name = node.sni;
|
||||||
|
}
|
||||||
|
else if (!string.IsNullOrWhiteSpace(node.requestHost))
|
||||||
|
{
|
||||||
|
server_name = Utils.String2List(node.requestHost)[0];
|
||||||
|
}
|
||||||
var tls = new Tls4Sbox()
|
var tls = new Tls4Sbox()
|
||||||
{
|
{
|
||||||
enabled = true,
|
enabled = true,
|
||||||
server_name = node.sni,
|
server_name = server_name,
|
||||||
insecure = Utils.ToBool(node.allowInsecure.IsNullOrEmpty() ? _config.coreBasicItem.defAllowInsecure.ToString().ToLower() : node.allowInsecure),
|
insecure = Utils.ToBool(node.allowInsecure.IsNullOrEmpty() ? _config.coreBasicItem.defAllowInsecure.ToString().ToLower() : node.allowInsecure),
|
||||||
alpn = node.GetAlpn(),
|
alpn = node.GetAlpn(),
|
||||||
};
|
};
|
||||||
@@ -666,8 +686,6 @@ namespace v2rayN.Handler
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
//Add the dns of the remote server domain
|
//Add the dns of the remote server domain
|
||||||
if (Utils.IsDomain(node.address))
|
|
||||||
{
|
|
||||||
if (dns4Sbox.rules is null)
|
if (dns4Sbox.rules is null)
|
||||||
{
|
{
|
||||||
dns4Sbox.rules = new();
|
dns4Sbox.rules = new();
|
||||||
@@ -681,9 +699,8 @@ namespace v2rayN.Handler
|
|||||||
dns4Sbox.rules.Add(new()
|
dns4Sbox.rules.Add(new()
|
||||||
{
|
{
|
||||||
server = "local_local",
|
server = "local_local",
|
||||||
domain = new List<string>() { node.address }
|
outbound = "any"
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
singboxConfig.dns = dns4Sbox;
|
singboxConfig.dns = dns4Sbox;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -423,7 +423,6 @@ namespace v2rayN.Handler
|
|||||||
usersItem = vnextItem.users[0];
|
usersItem = vnextItem.users[0];
|
||||||
}
|
}
|
||||||
usersItem.id = node.id;
|
usersItem.id = node.id;
|
||||||
usersItem.flow = string.Empty;
|
|
||||||
usersItem.email = Global.userEMail;
|
usersItem.email = Global.userEMail;
|
||||||
usersItem.encryption = node.security;
|
usersItem.encryption = node.security;
|
||||||
|
|
||||||
@@ -462,7 +461,6 @@ namespace v2rayN.Handler
|
|||||||
serversItem.address = node.address;
|
serversItem.address = node.address;
|
||||||
serversItem.port = node.port;
|
serversItem.port = node.port;
|
||||||
serversItem.password = node.id;
|
serversItem.password = node.id;
|
||||||
serversItem.flow = string.Empty;
|
|
||||||
|
|
||||||
serversItem.ota = false;
|
serversItem.ota = false;
|
||||||
serversItem.level = 1;
|
serversItem.level = 1;
|
||||||
|
|||||||
@@ -152,7 +152,7 @@ namespace v2rayN.Handler
|
|||||||
|
|
||||||
private void CoreStart(ProfileItem node)
|
private void CoreStart(ProfileItem node)
|
||||||
{
|
{
|
||||||
ShowMsg(false, string.Format(ResUI.StartService, DateTime.Now.ToString()));
|
ShowMsg(false, string.Format(ResUI.StartService, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")));
|
||||||
|
|
||||||
ECoreType coreType;
|
ECoreType coreType;
|
||||||
if (node.configType != EConfigType.Custom && _config.tunModeItem.enableTun)
|
if (node.configType != EConfigType.Custom && _config.tunModeItem.enableTun)
|
||||||
@@ -201,7 +201,7 @@ namespace v2rayN.Handler
|
|||||||
|
|
||||||
private int CoreStartViaString(string configStr)
|
private int CoreStartViaString(string configStr)
|
||||||
{
|
{
|
||||||
ShowMsg(false, string.Format(ResUI.StartService, DateTime.Now.ToString()));
|
ShowMsg(false, string.Format(ResUI.StartService, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")));
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -113,9 +113,9 @@ namespace v2rayN.Handler
|
|||||||
|
|
||||||
var mdif = (KeyModifiers)_fsModifiers;
|
var mdif = (KeyModifiers)_fsModifiers;
|
||||||
var key = KeyInterop.KeyFromVirtualKey(_vkey);
|
var key = KeyInterop.KeyFromVirtualKey(_vkey);
|
||||||
if ((mdif | KeyModifiers.Ctrl) == KeyModifiers.Ctrl) _hotkeyStr.Append($"{KeyModifiers.Ctrl}+");
|
if ((mdif & KeyModifiers.Ctrl) == KeyModifiers.Ctrl) _hotkeyStr.Append($"{KeyModifiers.Ctrl}+");
|
||||||
if ((mdif | KeyModifiers.Alt) == KeyModifiers.Alt) _hotkeyStr.Append($"{KeyModifiers.Alt}+");
|
if ((mdif & KeyModifiers.Alt) == KeyModifiers.Alt) _hotkeyStr.Append($"{KeyModifiers.Alt}+");
|
||||||
if ((mdif | KeyModifiers.Shift) == KeyModifiers.Shift) _hotkeyStr.Append($"{KeyModifiers.Shift}+");
|
if ((mdif & KeyModifiers.Shift) == KeyModifiers.Shift) _hotkeyStr.Append($"{KeyModifiers.Shift}+");
|
||||||
_hotkeyStr.Append(key.ToString());
|
_hotkeyStr.Append(key.ToString());
|
||||||
|
|
||||||
foreach (var name in _hotkeyTriggerDic[hotkeycode])
|
foreach (var name in _hotkeyTriggerDic[hotkeycode])
|
||||||
|
|||||||
@@ -353,6 +353,14 @@ namespace v2rayN.Handler
|
|||||||
match = "sing-box",
|
match = "sing-box",
|
||||||
versionArg = "version",
|
versionArg = "version",
|
||||||
});
|
});
|
||||||
|
|
||||||
|
coreInfos.Add(new CoreInfo
|
||||||
|
{
|
||||||
|
coreType = ECoreType.juicity,
|
||||||
|
coreExes = new List<string> { "juicity-client", "juicity" },
|
||||||
|
arguments = "run -c config.json",
|
||||||
|
coreUrl = Global.juicityCoreUrl
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion Core Type
|
#endregion Core Type
|
||||||
|
|||||||
@@ -160,9 +160,9 @@ namespace v2rayN.Handler
|
|||||||
Task.Run(() => UpdateTaskRunGeo(config, update));
|
Task.Run(() => UpdateTaskRunGeo(config, update));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdateTaskRunSubscription(Config config, Action<bool, string> update)
|
private async Task UpdateTaskRunSubscription(Config config, Action<bool, string> update)
|
||||||
{
|
{
|
||||||
Thread.Sleep(60000);
|
await Task.Delay(60000);
|
||||||
Utils.SaveLog("UpdateTaskRunSubscription");
|
Utils.SaveLog("UpdateTaskRunSubscription");
|
||||||
|
|
||||||
var updateHandle = new UpdateHandle();
|
var updateHandle = new UpdateHandle();
|
||||||
@@ -185,17 +185,17 @@ namespace v2rayN.Handler
|
|||||||
item.updateTime = updateTime;
|
item.updateTime = updateTime;
|
||||||
ConfigHandler.AddSubItem(ref config, item);
|
ConfigHandler.AddSubItem(ref config, item);
|
||||||
|
|
||||||
Thread.Sleep(5000);
|
await Task.Delay(5000);
|
||||||
}
|
}
|
||||||
Thread.Sleep(60000);
|
await Task.Delay(60000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdateTaskRunGeo(Config config, Action<bool, string> update)
|
private async Task UpdateTaskRunGeo(Config config, Action<bool, string> update)
|
||||||
{
|
{
|
||||||
var autoUpdateGeoTime = DateTime.Now;
|
var autoUpdateGeoTime = DateTime.Now;
|
||||||
|
|
||||||
Thread.Sleep(1000 * 120);
|
await Task.Delay(1000 * 120);
|
||||||
Utils.SaveLog("UpdateTaskRunGeo");
|
Utils.SaveLog("UpdateTaskRunGeo");
|
||||||
|
|
||||||
var updateHandle = new UpdateHandle();
|
var updateHandle = new UpdateHandle();
|
||||||
@@ -214,7 +214,7 @@ namespace v2rayN.Handler
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Thread.Sleep(1000 * 3600);
|
await Task.Delay(1000 * 3600);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ namespace v2rayN.Handler
|
|||||||
|
|
||||||
public void SendMessage(string msg, bool time)
|
public void SendMessage(string msg, bool time)
|
||||||
{
|
{
|
||||||
msg = $"{DateTime.Now} {msg}";
|
msg = $"{DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")} {msg}";
|
||||||
MessageBus.Current.SendMessage(msg, "MsgView");
|
MessageBus.Current.SendMessage(msg, "MsgView");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ namespace v2rayN.Handler
|
|||||||
|
|
||||||
_lstProfileEx = new(SqliteHelper.Instance.Table<ProfileExItem>());
|
_lstProfileEx = new(SqliteHelper.Instance.Table<ProfileExItem>());
|
||||||
|
|
||||||
Task.Run(() =>
|
Task.Run(async () =>
|
||||||
{
|
{
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
@@ -38,7 +38,7 @@ namespace v2rayN.Handler
|
|||||||
SqliteHelper.Instance.Replace(item);
|
SqliteHelper.Instance.Replace(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Thread.Sleep(1000 * 60);
|
await Task.Delay(1000 * 60);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -629,7 +629,7 @@ namespace v2rayN.Handler
|
|||||||
server.security = details.Groups["method"].Value;
|
server.security = details.Groups["method"].Value;
|
||||||
server.id = details.Groups["password"].Value;
|
server.id = details.Groups["password"].Value;
|
||||||
server.address = details.Groups["hostname"].Value;
|
server.address = details.Groups["hostname"].Value;
|
||||||
server.port = int.Parse(details.Groups["port"].Value);
|
server.port = Utils.ToInt(details.Groups["port"].Value);
|
||||||
return server;
|
return server;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ namespace v2rayN.Handler
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RunPingSub(Action<ServerTestItem> updateFun)
|
private async Task RunPingSubAsync(Action<ServerTestItem> updateFun)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -111,7 +111,7 @@ namespace v2rayN.Handler
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Thread.Sleep(10);
|
await Task.Delay(10);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -119,9 +119,9 @@ namespace v2rayN.Handler
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RunPing()
|
private async void RunPing()
|
||||||
{
|
{
|
||||||
RunPingSub((ServerTestItem it) =>
|
await RunPingSubAsync((ServerTestItem it) =>
|
||||||
{
|
{
|
||||||
long time = Ping(it.address);
|
long time = Ping(it.address);
|
||||||
var output = FormatOut(time, Global.DelayUnit);
|
var output = FormatOut(time, Global.DelayUnit);
|
||||||
@@ -131,9 +131,9 @@ namespace v2rayN.Handler
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RunTcping()
|
private async void RunTcping()
|
||||||
{
|
{
|
||||||
RunPingSub((ServerTestItem it) =>
|
await RunPingSubAsync((ServerTestItem it) =>
|
||||||
{
|
{
|
||||||
int time = GetTcpingTime(it.address, it.port);
|
int time = GetTcpingTime(it.address, it.port);
|
||||||
var output = FormatOut(time, Global.DelayUnit);
|
var output = FormatOut(time, Global.DelayUnit);
|
||||||
@@ -158,7 +158,7 @@ namespace v2rayN.Handler
|
|||||||
}
|
}
|
||||||
|
|
||||||
DownloadHandle downloadHandle = new DownloadHandle();
|
DownloadHandle downloadHandle = new DownloadHandle();
|
||||||
//Thread.Sleep(5000);
|
|
||||||
List<Task> tasks = new();
|
List<Task> tasks = new();
|
||||||
foreach (var it in _selecteds)
|
foreach (var it in _selecteds)
|
||||||
{
|
{
|
||||||
@@ -187,7 +187,6 @@ namespace v2rayN.Handler
|
|||||||
Utils.SaveLog(ex.Message, ex);
|
Utils.SaveLog(ex.Message, ex);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
//Thread.Sleep(100);
|
|
||||||
}
|
}
|
||||||
Task.WaitAll(tasks.ToArray());
|
Task.WaitAll(tasks.ToArray());
|
||||||
}
|
}
|
||||||
@@ -312,10 +311,10 @@ namespace v2rayN.Handler
|
|||||||
}
|
}
|
||||||
UpdateFunc(it.indexId, "", msg);
|
UpdateFunc(it.indexId, "", msg);
|
||||||
});
|
});
|
||||||
Thread.Sleep(2000);
|
await Task.Delay(2000);
|
||||||
}
|
}
|
||||||
|
|
||||||
Thread.Sleep((timeout + 2) * 1000);
|
await Task.Delay((timeout + 2) * 1000);
|
||||||
|
|
||||||
if (pid > 0)
|
if (pid > 0)
|
||||||
{
|
{
|
||||||
@@ -329,7 +328,7 @@ namespace v2rayN.Handler
|
|||||||
{
|
{
|
||||||
await RunRealPing();
|
await RunRealPing();
|
||||||
|
|
||||||
Thread.Sleep(1000);
|
await Task.Delay(1000);
|
||||||
|
|
||||||
await RunSpeedTestMulti();
|
await RunSpeedTestMulti();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ namespace v2rayN.Handler
|
|||||||
|
|
||||||
private async void Init()
|
private async void Init()
|
||||||
{
|
{
|
||||||
Thread.Sleep(5000);
|
await Task.Delay(5000);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -71,6 +71,7 @@ namespace v2rayN.Handler
|
|||||||
webSocket.Abort();
|
webSocket.Abort();
|
||||||
webSocket = null;
|
webSocket = null;
|
||||||
Init();
|
Init();
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (webSocket.State != WebSocketState.Open)
|
if (webSocket.State != WebSocketState.Open)
|
||||||
@@ -102,7 +103,7 @@ namespace v2rayN.Handler
|
|||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
Thread.Sleep(1000);
|
await Task.Delay(1000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,8 +61,7 @@ namespace v2rayN.Handler
|
|||||||
_updateFunc(server);
|
_updateFunc(server);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var sleep = _config.guiItem.statisticsFreshRate < 1 ? 1 : _config.guiItem.statisticsFreshRate;
|
await Task.Delay(1000);
|
||||||
Thread.Sleep(1000 * sleep);
|
|
||||||
await _channel.ConnectAsync();
|
await _channel.ConnectAsync();
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ namespace v2rayN.Handler
|
|||||||
_updateFunc = update;
|
_updateFunc = update;
|
||||||
|
|
||||||
_updateFunc(false, ResUI.MsgUpdateSubscriptionStart);
|
_updateFunc(false, ResUI.MsgUpdateSubscriptionStart);
|
||||||
var subItem = LazyConfig.Instance.SubItems();
|
var subItem = LazyConfig.Instance.SubItems().OrderBy(t => t.sort).ToList();
|
||||||
|
|
||||||
if (subItem == null || subItem.Count <= 0)
|
if (subItem == null || subItem.Count <= 0)
|
||||||
{
|
{
|
||||||
@@ -175,6 +175,10 @@ namespace v2rayN.Handler
|
|||||||
//_updateFunc(false, $"{hashCode}{ResUI.MsgNoValidSubscription}");
|
//_updateFunc(false, $"{hashCode}{ResUI.MsgNoValidSubscription}");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (!url.StartsWith(Global.httpsProtocol) && !url.StartsWith(Global.httpProtocol))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (item.enabled == false)
|
if (item.enabled == false)
|
||||||
{
|
{
|
||||||
_updateFunc(false, $"{hashCode}{ResUI.MsgSkipSubscriptionUpdate}");
|
_updateFunc(false, $"{hashCode}{ResUI.MsgSkipSubscriptionUpdate}");
|
||||||
@@ -462,7 +466,7 @@ namespace v2rayN.Handler
|
|||||||
url = coreInfo.coreDownloadUrl64;
|
url = coreInfo.coreDownloadUrl64;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
url = string.Format(url, version);
|
url = string.Format(url, version.ToVersionString("v"));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ECoreType.sing_box:
|
case ECoreType.sing_box:
|
||||||
@@ -510,7 +514,7 @@ namespace v2rayN.Handler
|
|||||||
throw new ArgumentException("Type");
|
throw new ArgumentException("Type");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (curVersion >= version)
|
if (curVersion >= version && version != new SemanticVersion(0, 0, 0))
|
||||||
{
|
{
|
||||||
AbsoluteCompleted?.Invoke(this, new ResultEventArgs(false, message));
|
AbsoluteCompleted?.Invoke(this, new ResultEventArgs(false, message));
|
||||||
return;
|
return;
|
||||||
@@ -609,6 +613,7 @@ namespace v2rayN.Handler
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (needStop) coreHandler?.CoreStop();
|
if (needStop) coreHandler?.CoreStop();
|
||||||
|
Task.Delay(1000);
|
||||||
string fileName = Utils.GetTempPath(Utils.GetDownloadFileName(url));
|
string fileName = Utils.GetTempPath(Utils.GetDownloadFileName(url));
|
||||||
if (File.Exists(fileName))
|
if (File.Exists(fileName))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -88,8 +88,6 @@ namespace v2rayN.Mode
|
|||||||
|
|
||||||
public bool enableStatistics { get; set; }
|
public bool enableStatistics { get; set; }
|
||||||
|
|
||||||
public int statisticsFreshRate { get; set; }
|
|
||||||
|
|
||||||
public bool keepOlderDedupl { get; set; }
|
public bool keepOlderDedupl { get; set; }
|
||||||
|
|
||||||
public bool ignoreGeoUpdateCore { get; set; } = true;
|
public bool ignoreGeoUpdateCore { get; set; } = true;
|
||||||
@@ -162,9 +160,10 @@ namespace v2rayN.Mode
|
|||||||
public class TunModeItem
|
public class TunModeItem
|
||||||
{
|
{
|
||||||
public bool enableTun { get; set; }
|
public bool enableTun { get; set; }
|
||||||
public bool strictRoute { get; set; }
|
public bool strictRoute { get; set; } = true;
|
||||||
public string stack { get; set; }
|
public string stack { get; set; }
|
||||||
public int mtu { get; set; }
|
public int mtu { get; set; }
|
||||||
|
public bool enableExInbound { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
[Serializable]
|
[Serializable]
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
naiveproxy = 22,
|
naiveproxy = 22,
|
||||||
tuic = 23,
|
tuic = 23,
|
||||||
sing_box = 24,
|
sing_box = 24,
|
||||||
|
juicity = 25,
|
||||||
v2rayN = 99
|
v2rayN = 99
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -22,6 +22,13 @@
|
|||||||
{
|
{
|
||||||
public List<Server4Sbox> servers { get; set; }
|
public List<Server4Sbox> servers { get; set; }
|
||||||
public List<Rule4Sbox> rules { get; set; }
|
public List<Rule4Sbox> rules { get; set; }
|
||||||
|
public string? final { get; set; }
|
||||||
|
public string? strategy { get; set; }
|
||||||
|
public bool? disable_cache { get; set; }
|
||||||
|
public bool? disable_expire { get; set; }
|
||||||
|
public bool? independent_cache { get; set; }
|
||||||
|
public bool? reverse_mapping { get; set; }
|
||||||
|
public Fakeip4Sbox? fakeip { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class Route4Sbox
|
public class Route4Sbox
|
||||||
@@ -195,4 +202,11 @@
|
|||||||
public List<string>? outbounds { get; set; }
|
public List<string>? outbounds { get; set; }
|
||||||
public List<string>? users { get; set; }
|
public List<string>? users { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class Fakeip4Sbox
|
||||||
|
{
|
||||||
|
public bool enabled { get; set; }
|
||||||
|
public string inet4_range { get; set; }
|
||||||
|
public string inet6_range { get; set; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -185,7 +185,7 @@ namespace v2rayN.Mode
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// VLESS
|
/// VLESS
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string flow { get; set; }
|
public string? flow { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class Sniffing4Ray
|
public class Sniffing4Ray
|
||||||
|
|||||||
9
v2rayN/v2rayN/Resx/ResUI.Designer.cs
generated
9
v2rayN/v2rayN/Resx/ResUI.Designer.cs
generated
@@ -2752,15 +2752,6 @@ namespace v2rayN.Resx {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 查找类似 Statistics freshrate (second) 的本地化字符串。
|
|
||||||
/// </summary>
|
|
||||||
public static string TbSettingsStatisticsFreshRate {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("TbSettingsStatisticsFreshRate", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 Subscription conversion Url 的本地化字符串。
|
/// 查找类似 Subscription conversion Url 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -793,9 +793,6 @@
|
|||||||
<data name="TbSettingsStatistics" xml:space="preserve">
|
<data name="TbSettingsStatistics" xml:space="preserve">
|
||||||
<value>فعال کردن آمار (نیاز به راه اندازی مجدد)</value>
|
<value>فعال کردن آمار (نیاز به راه اندازی مجدد)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsStatisticsFreshRate" xml:space="preserve">
|
|
||||||
<value>نرخ تازه سازی آمار (ثانیه)</value>
|
|
||||||
</data>
|
|
||||||
<data name="TbSettingsSubConvert" xml:space="preserve">
|
<data name="TbSettingsSubConvert" xml:space="preserve">
|
||||||
<value>Subscription conversion Url</value>
|
<value>Subscription conversion Url</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -796,9 +796,6 @@
|
|||||||
<data name="TbSettingsStatistics" xml:space="preserve">
|
<data name="TbSettingsStatistics" xml:space="preserve">
|
||||||
<value>Enable Statistics (Require restart)</value>
|
<value>Enable Statistics (Require restart)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsStatisticsFreshRate" xml:space="preserve">
|
|
||||||
<value>Statistics freshrate (second)</value>
|
|
||||||
</data>
|
|
||||||
<data name="TbSettingsSubConvert" xml:space="preserve">
|
<data name="TbSettingsSubConvert" xml:space="preserve">
|
||||||
<value>Subscription conversion Url</value>
|
<value>Subscription conversion Url</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -317,7 +317,7 @@
|
|||||||
<value>Сканирование URL-адреса импорта успешна.</value>
|
<value>Сканирование URL-адреса импорта успешна.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TestMeOutput" xml:space="preserve">
|
<data name="TestMeOutput" xml:space="preserve">
|
||||||
<value>Пинг текущей службы: {0} мс</value>
|
<value>Задержка текущего сервера: {0} мс</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="OperationSuccess" xml:space="preserve">
|
<data name="OperationSuccess" xml:space="preserve">
|
||||||
<value>Операция успешна</value>
|
<value>Операция успешна</value>
|
||||||
@@ -335,7 +335,7 @@
|
|||||||
<value>Примечания</value>
|
<value>Примечания</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LvUrl" xml:space="preserve">
|
<data name="LvUrl" xml:space="preserve">
|
||||||
<value>Url(Необязательно)</value>
|
<value>URL (необязательно)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LvCount" xml:space="preserve">
|
<data name="LvCount" xml:space="preserve">
|
||||||
<value>Количество</value>
|
<value>Количество</value>
|
||||||
@@ -506,7 +506,7 @@
|
|||||||
<value>Тёмный режим</value>
|
<value>Тёмный режим</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsFollowSystemTheme" xml:space="preserve">
|
<data name="TbSettingsFollowSystemTheme" xml:space="preserve">
|
||||||
<value>следить за системной темой</value>
|
<value>Следить за системной темой</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsLanguage" xml:space="preserve">
|
<data name="TbSettingsLanguage" xml:space="preserve">
|
||||||
<value>Язык (требуется перезапуск)</value>
|
<value>Язык (требуется перезапуск)</value>
|
||||||
@@ -533,19 +533,19 @@
|
|||||||
<value>Очистить всю статистику</value>
|
<value>Очистить всю статистику</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="menuPingServer" xml:space="preserve">
|
<data name="menuPingServer" xml:space="preserve">
|
||||||
<value>Проверить пинг серверов (Ctrl+P)</value>
|
<value>Тест на задержку сервера (Ctrl+P)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="menuRealPingServer" xml:space="preserve">
|
<data name="menuRealPingServer" xml:space="preserve">
|
||||||
<value>Тест на реальную задержку серверов (Ctrl+R)</value>
|
<value>Тест на реальную задержку сервера (Ctrl+R)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="menuSortServerResult" xml:space="preserve">
|
<data name="menuSortServerResult" xml:space="preserve">
|
||||||
<value>Сортировать по результату теста</value>
|
<value>Сортировать по результату теста</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="menuSpeedServer" xml:space="preserve">
|
<data name="menuSpeedServer" xml:space="preserve">
|
||||||
<value>Проверить скорость загрузки серверов (Ctrl+T)</value>
|
<value>Тест на скорость загрузки сервера (Ctrl+T)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="menuTcpingServer" xml:space="preserve">
|
<data name="menuTcpingServer" xml:space="preserve">
|
||||||
<value>Тестировать сервера с tcping (Ctrl+O)</value>
|
<value>Тест задержки с tcping (Ctrl+O)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="menuTestMe" xml:space="preserve">
|
<data name="menuTestMe" xml:space="preserve">
|
||||||
<value>Проверить текущий статус службы</value>
|
<value>Проверить текущий статус службы</value>
|
||||||
@@ -644,7 +644,7 @@
|
|||||||
<value>Тип камуфляжа</value>
|
<value>Тип камуфляжа</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbId" xml:space="preserve">
|
<data name="TbId" xml:space="preserve">
|
||||||
<value>UUID(id)</value>
|
<value>UUID (id)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbNetwork" xml:space="preserve">
|
<data name="TbNetwork" xml:space="preserve">
|
||||||
<value>Транспортный протокол сети</value>
|
<value>Транспортный протокол сети</value>
|
||||||
@@ -656,7 +656,7 @@
|
|||||||
<value>Порт</value>
|
<value>Порт</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbRemarks" xml:space="preserve">
|
<data name="TbRemarks" xml:space="preserve">
|
||||||
<value>Псевдоним (примечания)</value>
|
<value>Примечание</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbRequestHost" xml:space="preserve">
|
<data name="TbRequestHost" xml:space="preserve">
|
||||||
<value>Маскирующий домен (хост)</value>
|
<value>Маскирующий домен (хост)</value>
|
||||||
@@ -719,16 +719,22 @@
|
|||||||
<value>Разрешить подключения из локальной сети</value>
|
<value>Разрешить подключения из локальной сети</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsAutoHideStartup" xml:space="preserve">
|
<data name="TbSettingsAutoHideStartup" xml:space="preserve">
|
||||||
<value>Auto hide startup</value>
|
<value>Автоскрытие при автозапуске</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsAutoUpdateInterval" xml:space="preserve">
|
<data name="TbSettingsAutoUpdateInterval" xml:space="preserve">
|
||||||
<value>Интервал автоматического обновления Geo в часах</value>
|
<value>Интервал автоматического обновления Geo в часах</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="LvAutoUpdateInterval" xml:space="preserve">
|
||||||
|
<value>Интервал автоматического обновления в минутах</value>
|
||||||
|
</data>
|
||||||
<data name="TbSettingsCore" xml:space="preserve">
|
<data name="TbSettingsCore" xml:space="preserve">
|
||||||
<value>Ядро: базовые настройки</value>
|
<value>Ядро: базовые настройки</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsCoreDns" xml:space="preserve">
|
<data name="TbSettingsCoreDns" xml:space="preserve">
|
||||||
<value>V2ray DNS settings</value>
|
<value>Настройки DNS V2ray</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsCoreDnsSingbox" xml:space="preserve">
|
||||||
|
<value>Настройки DNS sing-box</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsCoreKcp" xml:space="preserve">
|
<data name="TbSettingsCoreKcp" xml:space="preserve">
|
||||||
<value>Ядро: настройки KCP</value>
|
<value>Ядро: настройки KCP</value>
|
||||||
@@ -796,9 +802,6 @@
|
|||||||
<data name="TbSettingsStatistics" xml:space="preserve">
|
<data name="TbSettingsStatistics" xml:space="preserve">
|
||||||
<value>Включить статистику (требуется перезагрузка)</value>
|
<value>Включить статистику (требуется перезагрузка)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsStatisticsFreshRate" xml:space="preserve">
|
|
||||||
<value>Частота обновления статистики в секундах</value>
|
|
||||||
</data>
|
|
||||||
<data name="TbSettingsSubConvert" xml:space="preserve">
|
<data name="TbSettingsSubConvert" xml:space="preserve">
|
||||||
<value>URL-адрес конверсии подписки</value>
|
<value>URL-адрес конверсии подписки</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -809,7 +812,7 @@
|
|||||||
<value>Включить протокол безопасности TLS v1.3 (обновление подписки)</value>
|
<value>Включить протокол безопасности TLS v1.3 (обновление подписки)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsTrayMenuServersLimit" xml:space="preserve">
|
<data name="TbSettingsTrayMenuServersLimit" xml:space="preserve">
|
||||||
<value>Tray right-click menu servers display limit</value>
|
<value>Лимит серверов в меню трея</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsUdpEnabled" xml:space="preserve">
|
<data name="TbSettingsUdpEnabled" xml:space="preserve">
|
||||||
<value>Включить UDP</value>
|
<value>Включить UDP</value>
|
||||||
@@ -953,7 +956,7 @@
|
|||||||
<value>Поддержка DnsObject</value>
|
<value>Поддержка DnsObject</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SubUrlTips" xml:space="preserve">
|
<data name="SubUrlTips" xml:space="preserve">
|
||||||
<value>Group please leave blank here</value>
|
<value>Необязательное поле</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TipChangeRouting" xml:space="preserve">
|
<data name="TipChangeRouting" xml:space="preserve">
|
||||||
<value>Настройки маршрутизации изменены</value>
|
<value>Настройки маршрутизации изменены</value>
|
||||||
@@ -965,7 +968,7 @@
|
|||||||
<value>Только маршрут</value>
|
<value>Только маршрут</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="menuMixedTestServer" xml:space="preserve">
|
<data name="menuMixedTestServer" xml:space="preserve">
|
||||||
<value>Тест задержки и скорости (Ctrl+E)</value>
|
<value>Тест задержки и скорости всех серверов (Ctrl+E)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LvTestDelay" xml:space="preserve">
|
<data name="LvTestDelay" xml:space="preserve">
|
||||||
<value>Задержка (ms)</value>
|
<value>Задержка (ms)</value>
|
||||||
@@ -986,7 +989,7 @@
|
|||||||
<value>Импортировать старый конфиг guiNConfig</value>
|
<value>Импортировать старый конфиг guiNConfig</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbEnableTunAs" xml:space="preserve">
|
<data name="TbEnableTunAs" xml:space="preserve">
|
||||||
<value>Включить интерфейс</value>
|
<value>Режим VPN</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsNewPort4LAN" xml:space="preserve">
|
<data name="TbSettingsNewPort4LAN" xml:space="preserve">
|
||||||
<value>Новый порт для локальной сети</value>
|
<value>Новый порт для локальной сети</value>
|
||||||
@@ -1054,4 +1057,19 @@
|
|||||||
<data name="TbSettingsEnableHWA" xml:space="preserve">
|
<data name="TbSettingsEnableHWA" xml:space="preserve">
|
||||||
<value>Включить аппаратное ускорение (требуется перезагрузка)</value>
|
<value>Включить аппаратное ускорение (требуется перезагрузка)</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="menuRebootAsAdmin" xml:space="preserve">
|
||||||
|
<value>Перезагрузить как администратор</value>
|
||||||
|
</data>
|
||||||
|
<data name="menuDNSSetting" xml:space="preserve">
|
||||||
|
<value>Настройки DNS</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsLogEnabledToFile" xml:space="preserve">
|
||||||
|
<value>Включить логгирование в файл</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsSpeedTestTimeout" xml:space="preserve">
|
||||||
|
<value>Таймаут одиночного спидтеста</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbSettingsSpeedTestUrl" xml:space="preserve">
|
||||||
|
<value>URL спидтеста</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
@@ -796,9 +796,6 @@
|
|||||||
<data name="TbSettingsStatistics" xml:space="preserve">
|
<data name="TbSettingsStatistics" xml:space="preserve">
|
||||||
<value>启用统计(实时网速显示,需重启)</value>
|
<value>启用统计(实时网速显示,需重启)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbSettingsStatisticsFreshRate" xml:space="preserve">
|
|
||||||
<value>统计刷新频率(单位秒)</value>
|
|
||||||
</data>
|
|
||||||
<data name="TbSettingsSubConvert" xml:space="preserve">
|
<data name="TbSettingsSubConvert" xml:space="preserve">
|
||||||
<value>订阅转换网址(可选)</value>
|
<value>订阅转换网址(可选)</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
1138
v2rayN/v2rayN/Resx/ResUI.zh-Hant.resx
Normal file
1138
v2rayN/v2rayN/Resx/ResUI.zh-Hant.resx
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,11 +1,12 @@
|
|||||||
{
|
{
|
||||||
"type":"tun",
|
"type": "tun",
|
||||||
"tag":"tun-in",
|
"tag": "tun-in",
|
||||||
"interface_name":"singbox_tun",
|
"interface_name": "singbox_tun",
|
||||||
"inet4_address":"172.19.0.1/30",
|
"inet4_address": "172.19.0.1/30",
|
||||||
"mtu":9000,
|
"inet6_address": "fdfe:dcba:9876::1/126",
|
||||||
"auto_route":true,
|
"mtu": 9000,
|
||||||
"strict_route":false,
|
"auto_route": true,
|
||||||
"stack":"system",
|
"strict_route": false,
|
||||||
"sniff":true
|
"stack": "system",
|
||||||
|
"sniff": true
|
||||||
}
|
}
|
||||||
@@ -45,7 +45,7 @@ namespace v2rayN.Tool
|
|||||||
this.major = 0;
|
this.major = 0;
|
||||||
this.minor = 0;
|
this.minor = 0;
|
||||||
this.patch = 0;
|
this.patch = 0;
|
||||||
this.version = "0.0.0";
|
//this.version = "0.0.0";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,12 +87,20 @@ namespace v2rayN.Tool
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool operator ==(SemanticVersion v1, SemanticVersion v2) { return v1.Equals(v2); }
|
public static bool operator ==(SemanticVersion v1, SemanticVersion v2)
|
||||||
public static bool operator !=(SemanticVersion v1, SemanticVersion v2) { return !v1.Equals(v2); }
|
{ return v1.Equals(v2); }
|
||||||
public static bool operator >=(SemanticVersion v1, SemanticVersion v2) { return v1.GreaterEquals(v2); }
|
|
||||||
public static bool operator <=(SemanticVersion v1, SemanticVersion v2) { return v1.LessEquals(v2); }
|
public static bool operator !=(SemanticVersion v1, SemanticVersion v2)
|
||||||
|
{ return !v1.Equals(v2); }
|
||||||
|
|
||||||
|
public static bool operator >=(SemanticVersion v1, SemanticVersion v2)
|
||||||
|
{ return v1.GreaterEquals(v2); }
|
||||||
|
|
||||||
|
public static bool operator <=(SemanticVersion v1, SemanticVersion v2)
|
||||||
|
{ return v1.LessEquals(v2); }
|
||||||
|
|
||||||
#region Private
|
#region Private
|
||||||
|
|
||||||
private bool GreaterEquals(SemanticVersion other)
|
private bool GreaterEquals(SemanticVersion other)
|
||||||
{
|
{
|
||||||
if (this.major < other.major)
|
if (this.major < other.major)
|
||||||
@@ -168,6 +176,7 @@ namespace v2rayN.Tool
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion Private
|
#endregion Private
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -167,8 +167,8 @@ namespace v2rayN.ViewModels
|
|||||||
[Reactive]
|
[Reactive]
|
||||||
public ImageSource AppIcon { get; set; }
|
public ImageSource AppIcon { get; set; }
|
||||||
|
|
||||||
[Reactive]
|
//[Reactive]
|
||||||
public bool BlShowTrayTip { get; set; }
|
//public bool BlShowTrayTip { get; set; }
|
||||||
|
|
||||||
#endregion Menu
|
#endregion Menu
|
||||||
|
|
||||||
@@ -210,8 +210,8 @@ namespace v2rayN.ViewModels
|
|||||||
[Reactive]
|
[Reactive]
|
||||||
public string RunningServerDisplay { get; set; }
|
public string RunningServerDisplay { get; set; }
|
||||||
|
|
||||||
[Reactive]
|
//[Reactive]
|
||||||
public string RunningServerToolTipText { get; set; }
|
//public string RunningServerToolTipText { get; set; }
|
||||||
|
|
||||||
[Reactive]
|
[Reactive]
|
||||||
public string RunningInfoDisplay { get; set; }
|
public string RunningInfoDisplay { get; set; }
|
||||||
@@ -849,12 +849,12 @@ namespace v2rayN.ViewModels
|
|||||||
{
|
{
|
||||||
var runningSummary = running.GetSummary();
|
var runningSummary = running.GetSummary();
|
||||||
RunningServerDisplay = $"{ResUI.menuServers}:{runningSummary}";
|
RunningServerDisplay = $"{ResUI.menuServers}:{runningSummary}";
|
||||||
RunningServerToolTipText = runningSummary;
|
//RunningServerToolTipText = runningSummary;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
RunningServerDisplay =
|
RunningServerDisplay = ResUI.CheckServerSettings;
|
||||||
RunningServerToolTipText = ResUI.CheckServerSettings;
|
//RunningServerToolTipText = ResUI.CheckServerSettings;
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
@@ -1528,8 +1528,8 @@ namespace v2rayN.ViewModels
|
|||||||
|
|
||||||
private void ChangeSystemProxyStatus(ESysProxyType type, bool blChange)
|
private void ChangeSystemProxyStatus(ESysProxyType type, bool blChange)
|
||||||
{
|
{
|
||||||
SysProxyHandle.UpdateSysProxy(_config, false);
|
SysProxyHandle.UpdateSysProxy(_config, _config.tunModeItem.enableTun ? true : false);
|
||||||
_noticeHandler?.SendMessage(ResUI.TipChangeSystemProxy, true);
|
_noticeHandler?.SendMessage(ResUI.TipChangeSystemProxy + _config.sysProxyType.ToString(), true);
|
||||||
|
|
||||||
Application.Current.Dispatcher.Invoke((Action)(() =>
|
Application.Current.Dispatcher.Invoke((Action)(() =>
|
||||||
{
|
{
|
||||||
@@ -1686,7 +1686,7 @@ namespace v2rayN.ViewModels
|
|||||||
}
|
}
|
||||||
CurrentFontSize = _config.uiItem.currentFontSize;
|
CurrentFontSize = _config.uiItem.currentFontSize;
|
||||||
CurrentLanguage = _config.uiItem.currentLanguage;
|
CurrentLanguage = _config.uiItem.currentLanguage;
|
||||||
BlShowTrayTip = _config.uiItem.showTrayTip;
|
//BlShowTrayTip = _config.uiItem.showTrayTip;
|
||||||
|
|
||||||
this.WhenAnyValue(
|
this.WhenAnyValue(
|
||||||
x => x.ColorModeDark,
|
x => x.ColorModeDark,
|
||||||
|
|||||||
@@ -51,7 +51,6 @@ namespace v2rayN.ViewModels
|
|||||||
|
|
||||||
[Reactive] public bool AutoRun { get; set; }
|
[Reactive] public bool AutoRun { get; set; }
|
||||||
[Reactive] public bool EnableStatistics { get; set; }
|
[Reactive] public bool EnableStatistics { get; set; }
|
||||||
[Reactive] public int StatisticsFreshRate { get; set; }
|
|
||||||
[Reactive] public bool KeepOlderDedupl { get; set; }
|
[Reactive] public bool KeepOlderDedupl { get; set; }
|
||||||
[Reactive] public bool IgnoreGeoUpdateCore { get; set; }
|
[Reactive] public bool IgnoreGeoUpdateCore { get; set; }
|
||||||
[Reactive] public bool EnableAutoAdjustMainLvColWidth { get; set; }
|
[Reactive] public bool EnableAutoAdjustMainLvColWidth { get; set; }
|
||||||
@@ -141,7 +140,6 @@ namespace v2rayN.ViewModels
|
|||||||
|
|
||||||
AutoRun = _config.guiItem.autoRun;
|
AutoRun = _config.guiItem.autoRun;
|
||||||
EnableStatistics = _config.guiItem.enableStatistics;
|
EnableStatistics = _config.guiItem.enableStatistics;
|
||||||
StatisticsFreshRate = _config.guiItem.statisticsFreshRate;
|
|
||||||
KeepOlderDedupl = _config.guiItem.keepOlderDedupl;
|
KeepOlderDedupl = _config.guiItem.keepOlderDedupl;
|
||||||
IgnoreGeoUpdateCore = _config.guiItem.ignoreGeoUpdateCore;
|
IgnoreGeoUpdateCore = _config.guiItem.ignoreGeoUpdateCore;
|
||||||
EnableAutoAdjustMainLvColWidth = _config.uiItem.enableAutoAdjustMainLvColWidth;
|
EnableAutoAdjustMainLvColWidth = _config.uiItem.enableAutoAdjustMainLvColWidth;
|
||||||
@@ -291,11 +289,6 @@ namespace v2rayN.ViewModels
|
|||||||
Utils.SetAutoRun(AutoRun);
|
Utils.SetAutoRun(AutoRun);
|
||||||
_config.guiItem.autoRun = AutoRun;
|
_config.guiItem.autoRun = AutoRun;
|
||||||
_config.guiItem.enableStatistics = EnableStatistics;
|
_config.guiItem.enableStatistics = EnableStatistics;
|
||||||
_config.guiItem.statisticsFreshRate = StatisticsFreshRate;
|
|
||||||
if (_config.guiItem.statisticsFreshRate > 100 || _config.guiItem.statisticsFreshRate < 1)
|
|
||||||
{
|
|
||||||
_config.guiItem.statisticsFreshRate = 1;
|
|
||||||
}
|
|
||||||
_config.guiItem.keepOlderDedupl = KeepOlderDedupl;
|
_config.guiItem.keepOlderDedupl = KeepOlderDedupl;
|
||||||
_config.guiItem.ignoreGeoUpdateCore = IgnoreGeoUpdateCore;
|
_config.guiItem.ignoreGeoUpdateCore = IgnoreGeoUpdateCore;
|
||||||
_config.uiItem.enableAutoAdjustMainLvColWidth = EnableAutoAdjustMainLvColWidth;
|
_config.uiItem.enableAutoAdjustMainLvColWidth = EnableAutoAdjustMainLvColWidth;
|
||||||
|
|||||||
@@ -87,18 +87,15 @@ namespace v2rayN.ViewModels
|
|||||||
SelectedSource.protocol = ProtocolItems?.ToList();
|
SelectedSource.protocol = ProtocolItems?.ToList();
|
||||||
SelectedSource.inboundTag = InboundTagItems?.ToList();
|
SelectedSource.inboundTag = InboundTagItems?.ToList();
|
||||||
|
|
||||||
bool hasRule =
|
bool hasRule = SelectedSource.domain?.Count > 0
|
||||||
SelectedSource.domain != null
|
|| SelectedSource.ip?.Count > 0
|
||||||
&& SelectedSource.domain.Count > 0
|
|| SelectedSource.protocol?.Count > 0
|
||||||
|| SelectedSource.ip != null
|
|| SelectedSource.process?.Count > 0
|
||||||
&& SelectedSource.ip.Count > 0
|
|
||||||
|| SelectedSource.protocol != null
|
|
||||||
&& SelectedSource.protocol.Count > 0
|
|
||||||
|| !Utils.IsNullOrEmpty(SelectedSource.port);
|
|| !Utils.IsNullOrEmpty(SelectedSource.port);
|
||||||
|
|
||||||
if (!hasRule)
|
if (!hasRule)
|
||||||
{
|
{
|
||||||
UI.ShowWarning(string.Format(ResUI.RoutingRuleDetailRequiredTips, "Port/Protocol/Domain/IP"));
|
UI.ShowWarning(string.Format(ResUI.RoutingRuleDetailRequiredTips, "Port/Protocol/Domain/IP/Process"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//_noticeHandler?.Enqueue(ResUI.OperationSuccess);
|
//_noticeHandler?.Enqueue(ResUI.OperationSuccess);
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ namespace v2rayN.ViewModels
|
|||||||
private void SaveSub()
|
private void SaveSub()
|
||||||
{
|
{
|
||||||
string remarks = SelectedSource.remarks;
|
string remarks = SelectedSource.remarks;
|
||||||
if (Utils.IsNullOrEmpty(remarks))
|
if (string.IsNullOrEmpty(remarks))
|
||||||
{
|
{
|
||||||
UI.Show(ResUI.PleaseFillRemarks);
|
UI.Show(ResUI.PleaseFillRemarks);
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -11,6 +11,17 @@ namespace v2rayN.Views
|
|||||||
public AddServer2Window(ProfileItem profileItem)
|
public AddServer2Window(ProfileItem profileItem)
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
|
// 设置窗口的尺寸不大于屏幕的尺寸
|
||||||
|
if (this.Width > SystemParameters.WorkArea.Width)
|
||||||
|
{
|
||||||
|
this.Width = SystemParameters.WorkArea.Width;
|
||||||
|
}
|
||||||
|
if (this.Height > SystemParameters.WorkArea.Height)
|
||||||
|
{
|
||||||
|
this.Height = SystemParameters.WorkArea.Height;
|
||||||
|
}
|
||||||
|
|
||||||
this.Owner = Application.Current.MainWindow;
|
this.Owner = Application.Current.MainWindow;
|
||||||
this.Loaded += Window_Loaded;
|
this.Loaded += Window_Loaded;
|
||||||
ViewModel = new AddServer2ViewModel(profileItem, this);
|
ViewModel = new AddServer2ViewModel(profileItem, this);
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
x:TypeArguments="vms:AddServerViewModel"
|
x:TypeArguments="vms:AddServerViewModel"
|
||||||
Background="{DynamicResource MaterialDesignPaper}"
|
Background="{DynamicResource MaterialDesignPaper}"
|
||||||
FontFamily="{x:Static conv:MaterialDesignFonts.MyFont}"
|
FontFamily="{x:Static conv:MaterialDesignFonts.MyFont}"
|
||||||
ResizeMode="NoResize"
|
ResizeMode="CanResize"
|
||||||
ShowInTaskbar="False"
|
ShowInTaskbar="False"
|
||||||
TextElement.FontFamily="{x:Static conv:MaterialDesignFonts.MyFont}"
|
TextElement.FontFamily="{x:Static conv:MaterialDesignFonts.MyFont}"
|
||||||
TextElement.Foreground="{DynamicResource MaterialDesignBody}"
|
TextElement.Foreground="{DynamicResource MaterialDesignBody}"
|
||||||
|
|||||||
@@ -15,6 +15,17 @@ namespace v2rayN.Views
|
|||||||
public AddServerWindow(ProfileItem profileItem)
|
public AddServerWindow(ProfileItem profileItem)
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
|
// 设置窗口的尺寸不大于屏幕的尺寸
|
||||||
|
if (this.Width > SystemParameters.WorkArea.Width)
|
||||||
|
{
|
||||||
|
this.Width = SystemParameters.WorkArea.Width;
|
||||||
|
}
|
||||||
|
if (this.Height > SystemParameters.WorkArea.Height)
|
||||||
|
{
|
||||||
|
this.Height = SystemParameters.WorkArea.Height;
|
||||||
|
}
|
||||||
|
|
||||||
this.Owner = Application.Current.MainWindow;
|
this.Owner = Application.Current.MainWindow;
|
||||||
this.Loaded += Window_Loaded;
|
this.Loaded += Window_Loaded;
|
||||||
cmbNetwork.SelectionChanged += CmbNetwork_SelectionChanged;
|
cmbNetwork.SelectionChanged += CmbNetwork_SelectionChanged;
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:conv="clr-namespace:v2rayN.Converters"
|
xmlns:conv="clr-namespace:v2rayN.Converters"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
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:reactiveui="http://reactiveui.net"
|
||||||
xmlns:resx="clr-namespace:v2rayN.Resx"
|
xmlns:resx="clr-namespace:v2rayN.Resx"
|
||||||
@@ -84,13 +85,15 @@
|
|||||||
Cursor="Hand"
|
Cursor="Hand"
|
||||||
Style="{StaticResource DefButton}" />
|
Style="{StaticResource DefButton}" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
<TextBox
|
<TextBox
|
||||||
x:Name="txtnormalDNS"
|
x:Name="txtnormalDNS"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
VerticalAlignment="Stretch"
|
VerticalAlignment="Stretch"
|
||||||
|
materialDesign:HintAssist.Hint="Http/Socks"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
BorderThickness="1"
|
BorderThickness="1"
|
||||||
Style="{StaticResource DefTextBox}"
|
Style="{StaticResource MaterialDesignOutlinedTextBox}"
|
||||||
TextWrapping="Wrap"
|
TextWrapping="Wrap"
|
||||||
VerticalScrollBarVisibility="Auto" />
|
VerticalScrollBarVisibility="Auto" />
|
||||||
</DockPanel>
|
</DockPanel>
|
||||||
@@ -122,35 +125,29 @@
|
|||||||
<ColumnDefinition Width="1*" />
|
<ColumnDefinition Width="1*" />
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
<GroupBox
|
|
||||||
Grid.Column="0"
|
|
||||||
Header=""
|
|
||||||
Style="{StaticResource MyGroupBox}">
|
|
||||||
<TextBox
|
<TextBox
|
||||||
x:Name="txtnormalDNS2"
|
x:Name="txtnormalDNS2"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Grid.Column="0"
|
||||||
VerticalAlignment="Stretch"
|
VerticalAlignment="Stretch"
|
||||||
|
materialDesign:HintAssist.Hint="Http/Socks"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
BorderThickness="1"
|
BorderThickness="1"
|
||||||
Style="{StaticResource DefTextBox}"
|
Style="{StaticResource MaterialDesignOutlinedTextBox}"
|
||||||
TextWrapping="Wrap"
|
TextWrapping="Wrap"
|
||||||
VerticalScrollBarVisibility="Auto" />
|
VerticalScrollBarVisibility="Auto" />
|
||||||
</GroupBox>
|
|
||||||
<GridSplitter Grid.Column="1" HorizontalAlignment="Stretch" />
|
<GridSplitter Grid.Column="1" HorizontalAlignment="Stretch" />
|
||||||
<GroupBox
|
|
||||||
Grid.Column="2"
|
|
||||||
Header="{x:Static resx:ResUI.TbSettingsTunMode}"
|
|
||||||
Style="{StaticResource MyGroupBox}">
|
|
||||||
<TextBox
|
<TextBox
|
||||||
x:Name="txttunDNS2"
|
x:Name="txttunDNS2"
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
Grid.Column="2"
|
||||||
VerticalAlignment="Stretch"
|
VerticalAlignment="Stretch"
|
||||||
|
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.TbSettingsTunMode}"
|
||||||
AcceptsReturn="True"
|
AcceptsReturn="True"
|
||||||
BorderThickness="1"
|
BorderThickness="1"
|
||||||
Style="{StaticResource DefTextBox}"
|
Style="{StaticResource MaterialDesignOutlinedTextBox}"
|
||||||
TextWrapping="Wrap"
|
TextWrapping="Wrap"
|
||||||
VerticalScrollBarVisibility="Auto" />
|
VerticalScrollBarVisibility="Auto" />
|
||||||
</GroupBox>
|
|
||||||
</Grid>
|
</Grid>
|
||||||
</DockPanel>
|
</DockPanel>
|
||||||
</TabItem>
|
</TabItem>
|
||||||
|
|||||||
@@ -14,6 +14,17 @@ namespace v2rayN.Views
|
|||||||
public DNSSettingWindow()
|
public DNSSettingWindow()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
|
// 设置窗口的尺寸不大于屏幕的尺寸
|
||||||
|
if (this.Width > SystemParameters.WorkArea.Width)
|
||||||
|
{
|
||||||
|
this.Width = SystemParameters.WorkArea.Width;
|
||||||
|
}
|
||||||
|
if (this.Height > SystemParameters.WorkArea.Height)
|
||||||
|
{
|
||||||
|
this.Height = SystemParameters.WorkArea.Height;
|
||||||
|
}
|
||||||
|
|
||||||
this.Owner = Application.Current.MainWindow;
|
this.Owner = Application.Current.MainWindow;
|
||||||
_config = LazyConfig.Instance.GetConfig();
|
_config = LazyConfig.Instance.GetConfig();
|
||||||
|
|
||||||
@@ -44,7 +55,7 @@ namespace v2rayN.Views
|
|||||||
|
|
||||||
private void linkDnsSingboxObjectDoc_Click(object sender, RoutedEventArgs e)
|
private void linkDnsSingboxObjectDoc_Click(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
Utils.ProcessStart("http://sing-box.sagernet.org/zh/configuration/dns/");
|
Utils.ProcessStart("https://sing-box.sagernet.org/zh/configuration/dns/");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnCancel_Click(object sender, RoutedEventArgs e)
|
private void btnCancel_Click(object sender, RoutedEventArgs e)
|
||||||
|
|||||||
@@ -16,6 +16,17 @@ namespace v2rayN.Views
|
|||||||
public GlobalHotkeySettingWindow()
|
public GlobalHotkeySettingWindow()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
|
// 设置窗口的尺寸不大于屏幕的尺寸
|
||||||
|
if (this.Width > SystemParameters.WorkArea.Width)
|
||||||
|
{
|
||||||
|
this.Width = SystemParameters.WorkArea.Width;
|
||||||
|
}
|
||||||
|
if (this.Height > SystemParameters.WorkArea.Height)
|
||||||
|
{
|
||||||
|
this.Height = SystemParameters.WorkArea.Height;
|
||||||
|
}
|
||||||
|
|
||||||
this.Owner = Application.Current.MainWindow;
|
this.Owner = Application.Current.MainWindow;
|
||||||
_config = LazyConfig.Instance.GetConfig();
|
_config = LazyConfig.Instance.GetConfig();
|
||||||
_config.globalHotkeys ??= new List<KeyEventItem>();
|
_config.globalHotkeys ??= new List<KeyEventItem>();
|
||||||
|
|||||||
@@ -15,8 +15,6 @@
|
|||||||
Title="v2rayN"
|
Title="v2rayN"
|
||||||
Width="900"
|
Width="900"
|
||||||
Height="700"
|
Height="700"
|
||||||
MinWidth="900"
|
|
||||||
MinHeight="700"
|
|
||||||
x:TypeArguments="vms:MainWindowViewModel"
|
x:TypeArguments="vms:MainWindowViewModel"
|
||||||
Background="{DynamicResource MaterialDesignPaper}"
|
Background="{DynamicResource MaterialDesignPaper}"
|
||||||
FontFamily="{x:Static conv:MaterialDesignFonts.MyFont}"
|
FontFamily="{x:Static conv:MaterialDesignFonts.MyFont}"
|
||||||
@@ -209,7 +207,7 @@
|
|||||||
<MenuItem
|
<MenuItem
|
||||||
x:Name="menuCheckUpdateN"
|
x:Name="menuCheckUpdateN"
|
||||||
Height="{StaticResource MenuItemHeight}"
|
Height="{StaticResource MenuItemHeight}"
|
||||||
Header="v2rayN" />
|
Header="V2rayN" />
|
||||||
<MenuItem
|
<MenuItem
|
||||||
x:Name="menuCheckUpdateV2flyCore"
|
x:Name="menuCheckUpdateV2flyCore"
|
||||||
Height="{StaticResource MenuItemHeight}"
|
Height="{StaticResource MenuItemHeight}"
|
||||||
@@ -235,7 +233,7 @@
|
|||||||
<MenuItem
|
<MenuItem
|
||||||
x:Name="menuCheckUpdateSingBoxCore"
|
x:Name="menuCheckUpdateSingBoxCore"
|
||||||
Height="{StaticResource MenuItemHeight}"
|
Height="{StaticResource MenuItemHeight}"
|
||||||
Header="sing-box Core" />
|
Header="Sing-box Core" />
|
||||||
<Separator Margin="-40,5" />
|
<Separator Margin="-40,5" />
|
||||||
<MenuItem
|
<MenuItem
|
||||||
x:Name="menuCheckUpdateGeo"
|
x:Name="menuCheckUpdateGeo"
|
||||||
@@ -321,7 +319,7 @@
|
|||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Margin="8"
|
Margin="8"
|
||||||
IsEnabled="{Binding ElementName=followSystemTheme, Path=IsChecked, Converter={StaticResource InverseBooleanConverter}}"/>
|
IsEnabled="{Binding ElementName=followSystemTheme, Path=IsChecked, Converter={StaticResource InverseBooleanConverter}}" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
@@ -388,7 +386,7 @@
|
|||||||
x:Name="lstGroup"
|
x:Name="lstGroup"
|
||||||
FontSize="{DynamicResource StdFontSize}"
|
FontSize="{DynamicResource StdFontSize}"
|
||||||
ItemContainerStyle="{StaticResource MyChipListBoxItem}"
|
ItemContainerStyle="{StaticResource MyChipListBoxItem}"
|
||||||
Style="{StaticResource MaterialDesignChoiceChipPrimaryOutlineListBox}">
|
Style="{StaticResource MaterialDesignChoiceChipPrimaryOutlineListBox}" MaxHeight="120">
|
||||||
<ListBox.ItemTemplate>
|
<ListBox.ItemTemplate>
|
||||||
<DataTemplate>
|
<DataTemplate>
|
||||||
<TextBlock Text="{Binding remarks}" />
|
<TextBlock Text="{Binding remarks}" />
|
||||||
@@ -574,7 +572,7 @@
|
|||||||
<MenuItem
|
<MenuItem
|
||||||
x:Name="menuSpeedServer"
|
x:Name="menuSpeedServer"
|
||||||
Height="{StaticResource MenuItemHeight}"
|
Height="{StaticResource MenuItemHeight}"
|
||||||
Header="{x:Static resx:ResUI.menuSpeedServer}"/>
|
Header="{x:Static resx:ResUI.menuSpeedServer}" />
|
||||||
<MenuItem
|
<MenuItem
|
||||||
x:Name="menuSortServerResult"
|
x:Name="menuSortServerResult"
|
||||||
Height="{StaticResource MenuItemHeight}"
|
Height="{StaticResource MenuItemHeight}"
|
||||||
@@ -856,23 +854,6 @@
|
|||||||
Header="{x:Static resx:ResUI.menuExit}" />
|
Header="{x:Static resx:ResUI.menuExit}" />
|
||||||
</ContextMenu>
|
</ContextMenu>
|
||||||
</tb:TaskbarIcon.ContextMenu>
|
</tb:TaskbarIcon.ContextMenu>
|
||||||
<tb:TaskbarIcon.TrayToolTip>
|
|
||||||
<Border
|
|
||||||
x:Name="borTrayToolTip"
|
|
||||||
Width="Auto"
|
|
||||||
Height="Auto"
|
|
||||||
Background="{DynamicResource MaterialDesignLightBackground}"
|
|
||||||
BorderBrush="{DynamicResource MaterialDesignDarkBackground}"
|
|
||||||
BorderThickness="0"
|
|
||||||
CornerRadius="4">
|
|
||||||
<TextBlock
|
|
||||||
Margin="8"
|
|
||||||
HorizontalAlignment="Center"
|
|
||||||
VerticalAlignment="Center"
|
|
||||||
Foreground="{DynamicResource MaterialDesignDarkBackground}"
|
|
||||||
Text="{Binding Mode=OneWay, Path=ToolTipText}" />
|
|
||||||
</Border>
|
|
||||||
</tb:TaskbarIcon.TrayToolTip>
|
|
||||||
</tb:TaskbarIcon>
|
</tb:TaskbarIcon>
|
||||||
<materialDesign:Snackbar x:Name="MainSnackbar" MessageQueue="{materialDesign:MessageQueue}" />
|
<materialDesign:Snackbar x:Name="MainSnackbar" MessageQueue="{materialDesign:MessageQueue}" />
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|||||||
@@ -25,6 +25,19 @@ namespace v2rayN.Views
|
|||||||
public MainWindow()
|
public MainWindow()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
|
// 设置窗口的尺寸不大于屏幕的尺寸
|
||||||
|
if (this.Width > SystemParameters.WorkArea.Width)
|
||||||
|
{
|
||||||
|
this.Width = SystemParameters.WorkArea.Width;
|
||||||
|
}
|
||||||
|
if (this.Height > SystemParameters.WorkArea.Height)
|
||||||
|
{
|
||||||
|
this.Height = SystemParameters.WorkArea.Height;
|
||||||
|
}
|
||||||
|
|
||||||
|
lstGroup.MaxHeight = Math.Floor(SystemParameters.WorkArea.Height * 0.20 / 40) * 40;
|
||||||
|
|
||||||
_config = LazyConfig.Instance.GetConfig();
|
_config = LazyConfig.Instance.GetConfig();
|
||||||
|
|
||||||
App.Current.SessionEnding += Current_SessionEnding;
|
App.Current.SessionEnding += Current_SessionEnding;
|
||||||
@@ -163,10 +176,10 @@ namespace v2rayN.Views
|
|||||||
this.BindCommand(ViewModel, vm => vm.SubUpdateViaProxyCmd, v => v.menuSubUpdateViaProxy2).DisposeWith(disposables);
|
this.BindCommand(ViewModel, vm => vm.SubUpdateViaProxyCmd, v => v.menuSubUpdateViaProxy2).DisposeWith(disposables);
|
||||||
|
|
||||||
this.OneWayBind(ViewModel, vm => vm.NotifyIcon, v => v.tbNotify.Icon).DisposeWith(disposables);
|
this.OneWayBind(ViewModel, vm => vm.NotifyIcon, v => v.tbNotify.Icon).DisposeWith(disposables);
|
||||||
this.OneWayBind(ViewModel, vm => vm.RunningServerToolTipText, v => v.tbNotify.ToolTipText).DisposeWith(disposables);
|
//this.OneWayBind(ViewModel, vm => vm.RunningServerToolTipText, v => v.tbNotify.ToolTipText).DisposeWith(disposables);
|
||||||
this.OneWayBind(ViewModel, vm => vm.NotifyLeftClickCmd, v => v.tbNotify.LeftClickCommand).DisposeWith(disposables);
|
this.OneWayBind(ViewModel, vm => vm.NotifyLeftClickCmd, v => v.tbNotify.LeftClickCommand).DisposeWith(disposables);
|
||||||
this.OneWayBind(ViewModel, vm => vm.AppIcon, v => v.Icon).DisposeWith(disposables);
|
this.OneWayBind(ViewModel, vm => vm.AppIcon, v => v.Icon).DisposeWith(disposables);
|
||||||
this.OneWayBind(ViewModel, vm => vm.BlShowTrayTip, v => v.borTrayToolTip.Visibility).DisposeWith(disposables);
|
//this.OneWayBind(ViewModel, vm => vm.BlShowTrayTip, v => v.borTrayToolTip.Visibility).DisposeWith(disposables);
|
||||||
|
|
||||||
//status bar
|
//status bar
|
||||||
this.OneWayBind(ViewModel, vm => vm.InboundDisplay, v => v.txtInboundDisplay.Text).DisposeWith(disposables);
|
this.OneWayBind(ViewModel, vm => vm.InboundDisplay, v => v.txtInboundDisplay.Text).DisposeWith(disposables);
|
||||||
@@ -519,10 +532,14 @@ namespace v2rayN.Views
|
|||||||
var coreInfos = LazyConfig.Instance.GetCoreInfos();
|
var coreInfos = LazyConfig.Instance.GetCoreInfos();
|
||||||
foreach (var it in coreInfos)
|
foreach (var it in coreInfos)
|
||||||
{
|
{
|
||||||
|
if (it.coreType == ECoreType.v2fly)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
var item = new MenuItem()
|
var item = new MenuItem()
|
||||||
{
|
{
|
||||||
Tag = it.coreUrl.Replace(@"/releases", ""),
|
Tag = it.coreUrl.Replace(@"/releases", ""),
|
||||||
Header = string.Format(Resx.ResUI.menuWebsiteItem, it.coreType.ToString().Replace("_", " "))
|
Header = string.Format(Resx.ResUI.menuWebsiteItem, it.coreType.ToString().Replace("_", " ")).UpperFirstChar()
|
||||||
};
|
};
|
||||||
item.Click += MenuItem_Click;
|
item.Click += MenuItem_Click;
|
||||||
menuHelp.Items.Add(item);
|
menuHelp.Items.Add(item);
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
<reactiveui:ReactiveWindow
|
<reactiveui:ReactiveWindow
|
||||||
x:Class="v2rayN.Views.OptionSettingWindow"
|
x:Class="v2rayN.Views.OptionSettingWindow"
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
||||||
xmlns:conv="clr-namespace:v2rayN.Converters"
|
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
|
||||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
|
||||||
xmlns:reactiveui="http://reactiveui.net"
|
xmlns:reactiveui="http://reactiveui.net"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:conv="clr-namespace:v2rayN.Converters"
|
||||||
xmlns:resx="clr-namespace:v2rayN.Resx"
|
xmlns:resx="clr-namespace:v2rayN.Resx"
|
||||||
xmlns:vms="clr-namespace:v2rayN.ViewModels"
|
xmlns:vms="clr-namespace:v2rayN.ViewModels"
|
||||||
Title="{x:Static resx:ResUI.menuSetting}"
|
Title="{x:Static resx:ResUI.menuSetting}"
|
||||||
@@ -498,21 +498,6 @@
|
|||||||
Margin="{StaticResource SettingItemMargin}"
|
Margin="{StaticResource SettingItemMargin}"
|
||||||
HorizontalAlignment="Left" />
|
HorizontalAlignment="Left" />
|
||||||
|
|
||||||
<TextBlock
|
|
||||||
Grid.Row="3"
|
|
||||||
Grid.Column="0"
|
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
|
||||||
VerticalAlignment="Center"
|
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
|
||||||
Text="{x:Static resx:ResUI.TbSettingsStatisticsFreshRate}" />
|
|
||||||
<ComboBox
|
|
||||||
x:Name="cmbStatisticsFreshRate"
|
|
||||||
Grid.Row="3"
|
|
||||||
Grid.Column="1"
|
|
||||||
Width="200"
|
|
||||||
Margin="{StaticResource SettingItemMargin}"
|
|
||||||
Style="{StaticResource DefComboBox}" />
|
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="4"
|
Grid.Row="4"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
|
|||||||
@@ -18,6 +18,17 @@ namespace v2rayN.Views
|
|||||||
public OptionSettingWindow()
|
public OptionSettingWindow()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
|
// 设置窗口的尺寸不大于屏幕的尺寸
|
||||||
|
if (this.Width > SystemParameters.WorkArea.Width)
|
||||||
|
{
|
||||||
|
this.Width = SystemParameters.WorkArea.Width;
|
||||||
|
}
|
||||||
|
if (this.Height > SystemParameters.WorkArea.Height)
|
||||||
|
{
|
||||||
|
this.Height = SystemParameters.WorkArea.Height;
|
||||||
|
}
|
||||||
|
|
||||||
this.Owner = Application.Current.MainWindow;
|
this.Owner = Application.Current.MainWindow;
|
||||||
_config = LazyConfig.Instance.GetConfig();
|
_config = LazyConfig.Instance.GetConfig();
|
||||||
|
|
||||||
@@ -44,10 +55,6 @@ namespace v2rayN.Views
|
|||||||
cmbmux4SboxProtocol.Items.Add(it);
|
cmbmux4SboxProtocol.Items.Add(it);
|
||||||
});
|
});
|
||||||
|
|
||||||
for (int i = 1; i <= 10; i++)
|
|
||||||
{
|
|
||||||
cmbStatisticsFreshRate.Items.Add(i);
|
|
||||||
}
|
|
||||||
Global.TunMtus.ForEach(it =>
|
Global.TunMtus.ForEach(it =>
|
||||||
{
|
{
|
||||||
cmbMtu.Items.Add(it);
|
cmbMtu.Items.Add(it);
|
||||||
@@ -150,7 +157,6 @@ namespace v2rayN.Views
|
|||||||
|
|
||||||
this.Bind(ViewModel, vm => vm.AutoRun, v => v.togAutoRun.IsChecked).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.AutoRun, v => v.togAutoRun.IsChecked).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.EnableStatistics, v => v.togEnableStatistics.IsChecked).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.EnableStatistics, v => v.togEnableStatistics.IsChecked).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.StatisticsFreshRate, v => v.cmbStatisticsFreshRate.Text).DisposeWith(disposables);
|
|
||||||
this.Bind(ViewModel, vm => vm.KeepOlderDedupl, v => v.togKeepOlderDedupl.IsChecked).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.KeepOlderDedupl, v => v.togKeepOlderDedupl.IsChecked).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.IgnoreGeoUpdateCore, v => v.togIgnoreGeoUpdateCore.IsChecked).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.IgnoreGeoUpdateCore, v => v.togIgnoreGeoUpdateCore.IsChecked).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.EnableAutoAdjustMainLvColWidth, v => v.togEnableAutoAdjustMainLvColWidth.IsChecked).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.EnableAutoAdjustMainLvColWidth, v => v.togEnableAutoAdjustMainLvColWidth.IsChecked).DisposeWith(disposables);
|
||||||
|
|||||||
@@ -12,6 +12,17 @@ namespace v2rayN.Views
|
|||||||
public RoutingRuleDetailsWindow(RulesItem rulesItem)
|
public RoutingRuleDetailsWindow(RulesItem rulesItem)
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
|
// 设置窗口的尺寸不大于屏幕的尺寸
|
||||||
|
if (this.Width > SystemParameters.WorkArea.Width)
|
||||||
|
{
|
||||||
|
this.Width = SystemParameters.WorkArea.Width;
|
||||||
|
}
|
||||||
|
if (this.Height > SystemParameters.WorkArea.Height)
|
||||||
|
{
|
||||||
|
this.Height = SystemParameters.WorkArea.Height;
|
||||||
|
}
|
||||||
|
|
||||||
this.Owner = Application.Current.MainWindow;
|
this.Owner = Application.Current.MainWindow;
|
||||||
this.Loaded += Window_Loaded;
|
this.Loaded += Window_Loaded;
|
||||||
clbProtocol.SelectionChanged += ClbProtocol_SelectionChanged;
|
clbProtocol.SelectionChanged += ClbProtocol_SelectionChanged;
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
xmlns:resx="clr-namespace:v2rayN.Resx"
|
xmlns:resx="clr-namespace:v2rayN.Resx"
|
||||||
xmlns:vms="clr-namespace:v2rayN.ViewModels"
|
xmlns:vms="clr-namespace:v2rayN.ViewModels"
|
||||||
Title="{x:Static resx:ResUI.menuRoutingRuleSetting}"
|
Title="{x:Static resx:ResUI.menuRoutingRuleSetting}"
|
||||||
Width="900"
|
Width="960"
|
||||||
Height="700"
|
Height="700"
|
||||||
x:TypeArguments="vms:RoutingRuleSettingViewModel"
|
x:TypeArguments="vms:RoutingRuleSettingViewModel"
|
||||||
Background="{DynamicResource MaterialDesignPaper}"
|
Background="{DynamicResource MaterialDesignPaper}"
|
||||||
@@ -280,7 +280,7 @@
|
|||||||
Binding="{Binding outboundTag}"
|
Binding="{Binding outboundTag}"
|
||||||
Header="outboundTag" />
|
Header="outboundTag" />
|
||||||
<DataGridTextColumn
|
<DataGridTextColumn
|
||||||
Width="100"
|
Width="80"
|
||||||
Binding="{Binding port}"
|
Binding="{Binding port}"
|
||||||
Header="port" />
|
Header="port" />
|
||||||
<DataGridTextColumn
|
<DataGridTextColumn
|
||||||
@@ -288,15 +288,15 @@
|
|||||||
Binding="{Binding protocols}"
|
Binding="{Binding protocols}"
|
||||||
Header="protocol" />
|
Header="protocol" />
|
||||||
<DataGridTextColumn
|
<DataGridTextColumn
|
||||||
Width="120"
|
Width="110"
|
||||||
Binding="{Binding inboundTags}"
|
Binding="{Binding inboundTags}"
|
||||||
Header="inboundTag" />
|
Header="inboundTag" />
|
||||||
<DataGridTextColumn
|
<DataGridTextColumn
|
||||||
Width="150"
|
Width="220"
|
||||||
Binding="{Binding domains}"
|
Binding="{Binding domains}"
|
||||||
Header="domain" />
|
Header="domain" />
|
||||||
<DataGridTextColumn
|
<DataGridTextColumn
|
||||||
Width="150"
|
Width="220"
|
||||||
Binding="{Binding ips}"
|
Binding="{Binding ips}"
|
||||||
Header="ip" />
|
Header="ip" />
|
||||||
<DataGridTextColumn
|
<DataGridTextColumn
|
||||||
|
|||||||
@@ -13,6 +13,17 @@ namespace v2rayN.Views
|
|||||||
public RoutingRuleSettingWindow(RoutingItem routingItem)
|
public RoutingRuleSettingWindow(RoutingItem routingItem)
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
|
// 设置窗口的尺寸不大于屏幕的尺寸
|
||||||
|
if (this.Width > SystemParameters.WorkArea.Width)
|
||||||
|
{
|
||||||
|
this.Width = SystemParameters.WorkArea.Width;
|
||||||
|
}
|
||||||
|
if (this.Height > SystemParameters.WorkArea.Height)
|
||||||
|
{
|
||||||
|
this.Height = SystemParameters.WorkArea.Height;
|
||||||
|
}
|
||||||
|
|
||||||
this.Owner = Application.Current.MainWindow;
|
this.Owner = Application.Current.MainWindow;
|
||||||
this.Loaded += Window_Loaded;
|
this.Loaded += Window_Loaded;
|
||||||
this.PreviewKeyDown += RoutingRuleSettingWindow_PreviewKeyDown;
|
this.PreviewKeyDown += RoutingRuleSettingWindow_PreviewKeyDown;
|
||||||
|
|||||||
@@ -12,6 +12,17 @@ namespace v2rayN.Views
|
|||||||
public RoutingSettingWindow()
|
public RoutingSettingWindow()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
|
// 设置窗口的尺寸不大于屏幕的尺寸
|
||||||
|
if (this.Width > SystemParameters.WorkArea.Width)
|
||||||
|
{
|
||||||
|
this.Width = SystemParameters.WorkArea.Width;
|
||||||
|
}
|
||||||
|
if (this.Height > SystemParameters.WorkArea.Height)
|
||||||
|
{
|
||||||
|
this.Height = SystemParameters.WorkArea.Height;
|
||||||
|
}
|
||||||
|
|
||||||
this.Owner = Application.Current.MainWindow;
|
this.Owner = Application.Current.MainWindow;
|
||||||
this.Closing += RoutingSettingWindow_Closing;
|
this.Closing += RoutingSettingWindow_Closing;
|
||||||
this.PreviewKeyDown += RoutingSettingWindow_PreviewKeyDown;
|
this.PreviewKeyDown += RoutingSettingWindow_PreviewKeyDown;
|
||||||
|
|||||||
@@ -11,6 +11,17 @@ namespace v2rayN.Views
|
|||||||
public SubEditWindow(SubItem subItem)
|
public SubEditWindow(SubItem subItem)
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
|
// 设置窗口的尺寸不大于屏幕的尺寸
|
||||||
|
if (this.Width > SystemParameters.WorkArea.Width)
|
||||||
|
{
|
||||||
|
this.Width = SystemParameters.WorkArea.Width;
|
||||||
|
}
|
||||||
|
if (this.Height > SystemParameters.WorkArea.Height)
|
||||||
|
{
|
||||||
|
this.Height = SystemParameters.WorkArea.Height;
|
||||||
|
}
|
||||||
|
|
||||||
this.Owner = Application.Current.MainWindow;
|
this.Owner = Application.Current.MainWindow;
|
||||||
this.Loaded += Window_Loaded;
|
this.Loaded += Window_Loaded;
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,17 @@ namespace v2rayN.Views
|
|||||||
public SubSettingWindow()
|
public SubSettingWindow()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
|
// 设置窗口的尺寸不大于屏幕的尺寸
|
||||||
|
if (this.Width > SystemParameters.WorkArea.Width)
|
||||||
|
{
|
||||||
|
this.Width = SystemParameters.WorkArea.Width;
|
||||||
|
}
|
||||||
|
if (this.Height > SystemParameters.WorkArea.Height)
|
||||||
|
{
|
||||||
|
this.Height = SystemParameters.WorkArea.Height;
|
||||||
|
}
|
||||||
|
|
||||||
this.Owner = Application.Current.MainWindow;
|
this.Owner = Application.Current.MainWindow;
|
||||||
|
|
||||||
ViewModel = new SubSettingViewModel(this);
|
ViewModel = new SubSettingViewModel(this);
|
||||||
|
|||||||
@@ -10,13 +10,13 @@
|
|||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<ApplicationIcon>v2rayN.ico</ApplicationIcon>
|
<ApplicationIcon>v2rayN.ico</ApplicationIcon>
|
||||||
<Copyright>Copyright © 2017-2023 (GPLv3)</Copyright>
|
<Copyright>Copyright © 2017-2023 (GPLv3)</Copyright>
|
||||||
<FileVersion>6.24</FileVersion>
|
<FileVersion>6.29</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Downloader" Version="3.0.4" />
|
<PackageReference Include="Downloader" Version="3.0.6" />
|
||||||
<PackageReference Include="MaterialDesignThemes" Version="4.9.0" />
|
<PackageReference Include="MaterialDesignThemes" Version="4.9.0" />
|
||||||
<PackageReference Include="H.NotifyIcon.Wpf" Version="2.0.108" />
|
<PackageReference Include="H.NotifyIcon.Wpf" Version="2.0.118" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||||
<PackageReference Include="QRCoder.Xaml" Version="1.4.3" />
|
<PackageReference Include="QRCoder.Xaml" Version="1.4.3" />
|
||||||
<PackageReference Include="sqlite-net-pcl" Version="1.8.116" />
|
<PackageReference Include="sqlite-net-pcl" Version="1.8.116" />
|
||||||
@@ -25,8 +25,8 @@
|
|||||||
<PackageReference Include="ReactiveUI.Fody" Version="18.4.1" />
|
<PackageReference Include="ReactiveUI.Fody" Version="18.4.1" />
|
||||||
<PackageReference Include="ReactiveUI.Validation" Version="3.0.22" />
|
<PackageReference Include="ReactiveUI.Validation" Version="3.0.22" />
|
||||||
<PackageReference Include="ReactiveUI.WPF" Version="18.4.1" />
|
<PackageReference Include="ReactiveUI.WPF" Version="18.4.1" />
|
||||||
<PackageReference Include="Splat.NLog" Version="14.6.8" />
|
<PackageReference Include="Splat.NLog" Version="14.7.1" />
|
||||||
<PackageReference Include="System.Reactive" Version="5.0.0" />
|
<PackageReference Include="System.Reactive" Version="6.0.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@@ -108,6 +108,9 @@
|
|||||||
<EmbeddedResource Update="Resx\ResUI.zh-Hans.resx">
|
<EmbeddedResource Update="Resx\ResUI.zh-Hans.resx">
|
||||||
<Generator>PublicResXFileCodeGenerator</Generator>
|
<Generator>PublicResXFileCodeGenerator</Generator>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Update="Resx\ResUI.zh-Hant.resx">
|
||||||
|
<Generator>PublicResXFileCodeGenerator</Generator>
|
||||||
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Update="Resx\ResUI.fa-Ir.resx">
|
<EmbeddedResource Update="Resx\ResUI.fa-Ir.resx">
|
||||||
<Generator>PublicResXFileCodeGenerator</Generator>
|
<Generator>PublicResXFileCodeGenerator</Generator>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
|||||||
@@ -92,9 +92,9 @@ namespace v2rayUpgrade
|
|||||||
File.Move(Application.ExecutablePath, thisAppOldFile);
|
File.Move(Application.ExecutablePath, thisAppOldFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
string entryOuputPath = GetPath(fullName);
|
string entryOutputPath = GetPath(fullName);
|
||||||
Directory.CreateDirectory(Path.GetDirectoryName(entryOuputPath)!);
|
Directory.CreateDirectory(Path.GetDirectoryName(entryOutputPath)!);
|
||||||
entry.ExtractToFile(entryOuputPath, true);
|
entry.ExtractToFile(entryOutputPath, true);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user