mirror of
https://github.com/2dust/v2rayN.git
synced 2026-10-29 16:44:59 +03:00
Code clean (#9482)
This commit is contained in:
@@ -554,7 +554,7 @@ public class CoreConfigSingboxServiceTests
|
|||||||
|
|
||||||
cfg.dns.servers.Should().Contain(s => s.tag == "remote" && s.type == "udp" && s.server == "8.8.8.8");
|
cfg.dns.servers.Should().Contain(s => s.tag == "remote" && s.type == "udp" && s.server == "8.8.8.8");
|
||||||
cfg.dns.servers.Should().Contain(s => s.tag == Global.SingboxLocalDNSTag);
|
cfg.dns.servers.Should().Contain(s => s.tag == Global.SingboxLocalDNSTag);
|
||||||
cfg.dns.rules.Should().Contain(r => r.clash_mode == ERuleMode.Global.ToString());
|
cfg.dns.rules.Should().Contain(r => r.clash_mode == nameof(ERuleMode.Global));
|
||||||
cfg.dns.rules.Should().Contain(r => r.clash_mode == ERuleMode.Direct.ToString());
|
cfg.dns.rules.Should().Contain(r => r.clash_mode == nameof(ERuleMode.Direct));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -87,6 +87,6 @@ public static class CountryExtension
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return CountryEmojiMap.TryGetValue(countryCode, out var emoji) ? emoji : null;
|
return CountryEmojiMap.GetValueOrDefault(countryCode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ public static class Extension
|
|||||||
|
|
||||||
public static string TrimEx(this string? value)
|
public static string TrimEx(this string? value)
|
||||||
{
|
{
|
||||||
return value == null ? string.Empty : value.Trim();
|
return value?.Trim() ?? string.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string RemovePrefix(this string value, char prefix)
|
public static string RemovePrefix(this string value, char prefix)
|
||||||
|
|||||||
@@ -43,10 +43,10 @@ public static class ConfigHandler
|
|||||||
|
|
||||||
if (config.Inbound == null)
|
if (config.Inbound == null)
|
||||||
{
|
{
|
||||||
config.Inbound = new List<InItem>();
|
config.Inbound = [];
|
||||||
InItem inItem = new()
|
InItem inItem = new()
|
||||||
{
|
{
|
||||||
Protocol = EInboundProtocol.socks.ToString(),
|
Protocol = nameof(EInboundProtocol.socks),
|
||||||
LocalPort = 10808,
|
LocalPort = 10808,
|
||||||
UdpEnabled = true,
|
UdpEnabled = true,
|
||||||
SniffingEnabled = true,
|
SniffingEnabled = true,
|
||||||
@@ -59,7 +59,7 @@ public static class ConfigHandler
|
|||||||
{
|
{
|
||||||
if (config.Inbound.Count > 0)
|
if (config.Inbound.Count > 0)
|
||||||
{
|
{
|
||||||
config.Inbound.First().Protocol = EInboundProtocol.socks.ToString();
|
config.Inbound.First().Protocol = nameof(EInboundProtocol.socks);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,8 +98,8 @@ public static class ConfigHandler
|
|||||||
config.MsgUIItem ??= new();
|
config.MsgUIItem ??= new();
|
||||||
|
|
||||||
config.UiItem ??= new();
|
config.UiItem ??= new();
|
||||||
config.UiItem.MainColumnItem ??= new();
|
config.UiItem.MainColumnItem ??= [];
|
||||||
config.UiItem.WindowSizeItem ??= new();
|
config.UiItem.WindowSizeItem ??= [];
|
||||||
|
|
||||||
if (config.UiItem.CurrentLanguage.IsNullOrEmpty())
|
if (config.UiItem.CurrentLanguage.IsNullOrEmpty())
|
||||||
{
|
{
|
||||||
@@ -157,7 +157,7 @@ public static class ConfigHandler
|
|||||||
DownMbps = 100
|
DownMbps = 100
|
||||||
};
|
};
|
||||||
config.ClashUIItem ??= new();
|
config.ClashUIItem ??= new();
|
||||||
config.ClashUIItem.ConnectionsColumnItem ??= new();
|
config.ClashUIItem.ConnectionsColumnItem ??= [];
|
||||||
config.SystemProxyItem ??= new();
|
config.SystemProxyItem ??= new();
|
||||||
config.WebDavItem ??= new();
|
config.WebDavItem ??= new();
|
||||||
config.CheckUpdateItem ??= new();
|
config.CheckUpdateItem ??= new();
|
||||||
@@ -167,7 +167,7 @@ public static class ConfigHandler
|
|||||||
Length = "50-100",
|
Length = "50-100",
|
||||||
Interval = "10-20"
|
Interval = "10-20"
|
||||||
};
|
};
|
||||||
config.GlobalHotkeys ??= new();
|
config.GlobalHotkeys ??= [];
|
||||||
|
|
||||||
if (config.SystemProxyItem.SystemProxyExceptions.IsNullOrEmpty())
|
if (config.SystemProxyItem.SystemProxyExceptions.IsNullOrEmpty())
|
||||||
{
|
{
|
||||||
@@ -1056,8 +1056,8 @@ public static class ConfigHandler
|
|||||||
return new Tuple<int, int>(0, 0);
|
return new Tuple<int, int>(0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<ProfileItem> lstKeep = new();
|
List<ProfileItem> lstKeep = [];
|
||||||
List<ProfileItem> lstRemove = new();
|
List<ProfileItem> lstRemove = [];
|
||||||
if (!config.GuiItem.KeepOlderDedupl)
|
if (!config.GuiItem.KeepOlderDedupl)
|
||||||
{
|
{
|
||||||
lstProfile.Reverse();
|
lstProfile.Reverse();
|
||||||
@@ -1533,7 +1533,7 @@ public static class ConfigHandler
|
|||||||
}
|
}
|
||||||
|
|
||||||
var countServers = 0;
|
var countServers = 0;
|
||||||
List<ProfileItem> lstAdd = new();
|
List<ProfileItem> lstAdd = [];
|
||||||
var arrData = strData.Split(Environment.NewLine.ToCharArray()).Where(t => !t.IsNullOrEmpty());
|
var arrData = strData.Split(Environment.NewLine.ToCharArray()).Where(t => !t.IsNullOrEmpty());
|
||||||
if (isSub)
|
if (isSub)
|
||||||
{
|
{
|
||||||
@@ -1629,7 +1629,7 @@ public static class ConfigHandler
|
|||||||
{
|
{
|
||||||
lstProfiles = V2rayFmt.ResolveFullArray(strData, subRemarks);
|
lstProfiles = V2rayFmt.ResolveFullArray(strData, subRemarks);
|
||||||
}
|
}
|
||||||
if (lstProfiles != null && lstProfiles.Count > 0)
|
if (lstProfiles is { Count: > 0 })
|
||||||
{
|
{
|
||||||
var count = 0;
|
var count = 0;
|
||||||
foreach (var it in lstProfiles)
|
foreach (var it in lstProfiles)
|
||||||
|
|||||||
@@ -80,14 +80,14 @@ public static class ConnectionHandler
|
|||||||
UseProxy = webProxy != null
|
UseProxy = webProxy != null
|
||||||
});
|
});
|
||||||
|
|
||||||
List<int> oneTime = new();
|
List<int> oneTime = [];
|
||||||
for (var i = 0; i < 2; i++)
|
for (var i = 0; i < 2; i++)
|
||||||
{
|
{
|
||||||
var timer = Stopwatch.StartNew();
|
var timer = Stopwatch.StartNew();
|
||||||
await client.GetAsync(url, cts.Token).ConfigureAwait(false);
|
await client.GetAsync(url, cts.Token).ConfigureAwait(false);
|
||||||
timer.Stop();
|
timer.Stop();
|
||||||
oneTime.Add((int)timer.Elapsed.TotalMilliseconds);
|
oneTime.Add((int)timer.Elapsed.TotalMilliseconds);
|
||||||
await Task.Delay(100);
|
await Task.Delay(100, cts.Token);
|
||||||
}
|
}
|
||||||
responseTime = oneTime.Where(x => x > 0).OrderBy(x => x).FirstOrDefault();
|
responseTime = oneTime.Where(x => x > 0).OrderBy(x => x).FirstOrDefault();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -185,7 +185,7 @@ public class InnerFmt
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
// Check Enum.IsDefined
|
// Check Enum.IsDefined
|
||||||
if (!Enum.IsDefined(typeof(EConfigType), profileItem.ConfigType))
|
if (!Enum.IsDefined(profileItem.ConfigType))
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ public class SocksFmt : BaseFmt
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
var arr21 = arr1.First().Split(':');
|
var arr21 = arr1.First().Split(':');
|
||||||
var indexPort = arr1.Last().LastIndexOf(":");
|
var indexPort = arr1.Last().LastIndexOf(':');
|
||||||
if (arr21.Length != 2 || indexPort < 0)
|
if (arr21.Length != 2 || indexPort < 0)
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -133,12 +133,12 @@ public static class SubscriptionHandler
|
|||||||
|
|
||||||
if (!url.Contains("target="))
|
if (!url.Contains("target="))
|
||||||
{
|
{
|
||||||
url += string.Format("&target={0}", item.ConvertTarget);
|
url += $"&target={item.ConvertTarget}";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!url.Contains("config="))
|
if (!url.Contains("config="))
|
||||||
{
|
{
|
||||||
url += string.Format("&config={0}", Global.SubConvertConfig.FirstOrDefault());
|
url += $"&config={Global.SubConvertConfig.FirstOrDefault()}";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -268,7 +268,7 @@ public sealed class AppManager
|
|||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
var itemMap = items.ToDictionary(it => it.IndexId);
|
var itemMap = items.ToDictionary(it => it.IndexId);
|
||||||
|
|
||||||
return idList.Select(id => itemMap.GetValueOrDefault(id))
|
return idList.Select(itemMap.GetValueOrDefault)
|
||||||
.Where(item => item != null)
|
.Where(item => item != null)
|
||||||
.ToList();
|
.ToList();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,19 +45,14 @@ public sealed class ClashApiManager
|
|||||||
{
|
{
|
||||||
await GetClashProxiesAsync();
|
await GetClashProxiesAsync();
|
||||||
}
|
}
|
||||||
lstProxy = new List<ClashProxyModel>();
|
lstProxy = [];
|
||||||
foreach (var kv in _proxies ?? [])
|
lstProxy.AddRange(from kv in _proxies ?? []
|
||||||
{
|
where !Global.notAllowTestType.Contains(kv.Value.type?.ToLower())
|
||||||
if (Global.notAllowTestType.Contains(kv.Value.type?.ToLower()))
|
select new ClashProxyModel()
|
||||||
{
|
{
|
||||||
continue;
|
Name = kv.Value.name,
|
||||||
}
|
Type = kv.Value.type?.ToLower(),
|
||||||
lstProxy.Add(new ClashProxyModel()
|
});
|
||||||
{
|
|
||||||
Name = kv.Value.name,
|
|
||||||
Type = kv.Value.type?.ToLower(),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lstProxy is not { Count: > 0 })
|
if (lstProxy is not { Count: > 0 })
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ public class GroupProfileManager
|
|||||||
|
|
||||||
public static async Task<bool> HasCycle(string? indexId, ProtocolExtraItem? extraInfo)
|
public static async Task<bool> HasCycle(string? indexId, ProtocolExtraItem? extraInfo)
|
||||||
{
|
{
|
||||||
return await HasCycle(indexId, extraInfo, new HashSet<string>(), new HashSet<string>());
|
return await HasCycle(indexId, extraInfo, [], []);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async Task<bool> HasCycle(string? indexId, ProtocolExtraItem? extraInfo, HashSet<string> visited, HashSet<string> stack)
|
private static async Task<bool> HasCycle(string? indexId, ProtocolExtraItem? extraInfo, HashSet<string> visited, HashSet<string> stack)
|
||||||
@@ -55,7 +55,7 @@ public class GroupProfileManager
|
|||||||
var childItems = await AppManager.Instance.GetProfileItemsByIndexIds(childIds);
|
var childItems = await AppManager.Instance.GetProfileItemsByIndexIds(childIds);
|
||||||
foreach (var childItem in childItems)
|
foreach (var childItem in childItems)
|
||||||
{
|
{
|
||||||
if (await HasCycle(childItem.IndexId, childItem?.GetProtocolExtra(), visited, stack))
|
if (await HasCycle(childItem.IndexId, childItem.GetProtocolExtra(), visited, stack))
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -71,7 +71,7 @@ public class GroupProfileManager
|
|||||||
|
|
||||||
public static async Task<(List<ProfileItem> Items, ProtocolExtraItem? Extra)> GetChildProfileItems(ProfileItem profileItem)
|
public static async Task<(List<ProfileItem> Items, ProtocolExtraItem? Extra)> GetChildProfileItems(ProfileItem profileItem)
|
||||||
{
|
{
|
||||||
var protocolExtra = profileItem?.GetProtocolExtra();
|
var protocolExtra = profileItem.GetProtocolExtra();
|
||||||
return (await GetChildProfileItemsByProtocolExtra(protocolExtra), protocolExtra);
|
return (await GetChildProfileItemsByProtocolExtra(protocolExtra), protocolExtra);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ public class ProfileExManager
|
|||||||
public async Task ClearAll()
|
public async Task ClearAll()
|
||||||
{
|
{
|
||||||
await SQLiteHelper.Instance.ExecuteAsync($"delete from ProfileExItem ");
|
await SQLiteHelper.Instance.ExecuteAsync($"delete from ProfileExItem ");
|
||||||
_lstProfileEx = new();
|
_lstProfileEx = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task SaveTo()
|
public async Task SaveTo()
|
||||||
@@ -182,6 +182,6 @@ public class ProfileExManager
|
|||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return _lstProfileEx.Max(t => t == null ? 0 : t.Sort);
|
return _lstProfileEx.Max(t => t?.Sort ?? 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ public class StatisticsManager
|
|||||||
{
|
{
|
||||||
await SQLiteHelper.Instance.ExecuteAsync($"delete from ServerStatItem ");
|
await SQLiteHelper.Instance.ExecuteAsync($"delete from ServerStatItem ");
|
||||||
_serverStatItem = null;
|
_serverStatItem = null;
|
||||||
_lstServerStat = new();
|
_lstServerStat = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task SaveTo()
|
public async Task SaveTo()
|
||||||
|
|||||||
@@ -136,7 +136,7 @@ public class Outboundsettings4Ray
|
|||||||
|
|
||||||
public Response4Ray? response { get; set; }
|
public Response4Ray? response { get; set; }
|
||||||
|
|
||||||
public string domainStrategy { get; set; }
|
public string? domainStrategy { get; set; }
|
||||||
|
|
||||||
public int? userLevel { get; set; }
|
public int? userLevel { get; set; }
|
||||||
|
|
||||||
|
|||||||
@@ -1,26 +1,16 @@
|
|||||||
namespace ServiceLib.Models.Dto;
|
namespace ServiceLib.Models.Dto;
|
||||||
|
|
||||||
public class RetResult
|
public class RetResult(bool success, string? msg, object? data)
|
||||||
{
|
{
|
||||||
public bool Success { get; set; }
|
public RetResult(bool success = false) : this(success, null, null)
|
||||||
public string? Msg { get; set; }
|
|
||||||
public object? Data { get; set; }
|
|
||||||
|
|
||||||
public RetResult(bool success = false)
|
|
||||||
{
|
{
|
||||||
Success = success;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public RetResult(bool success, string? msg)
|
public RetResult(bool success, string? msg) : this(success, msg, null)
|
||||||
{
|
{
|
||||||
Success = success;
|
|
||||||
Msg = msg;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public RetResult(bool success, string? msg, object? data)
|
public bool Success { get; set; } = success;
|
||||||
{
|
public string? Msg { get; set; } = msg;
|
||||||
Success = success;
|
public object? Data { get; set; } = data;
|
||||||
Msg = msg;
|
|
||||||
Data = data;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,16 +3,10 @@ namespace ServiceLib.Services.CoreConfig;
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Core configuration file processing class
|
/// Core configuration file processing class
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class CoreConfigClashService
|
public class CoreConfigClashService(Config config)
|
||||||
{
|
{
|
||||||
private Config _config;
|
|
||||||
private static readonly string _tag = "CoreConfigClashService";
|
private static readonly string _tag = "CoreConfigClashService";
|
||||||
|
|
||||||
public CoreConfigClashService(Config config)
|
|
||||||
{
|
|
||||||
_config = config;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<RetResult> GenerateClientCustomConfig(ProfileItem node, string? fileName)
|
public async Task<RetResult> GenerateClientCustomConfig(ProfileItem node, string? fileName)
|
||||||
{
|
{
|
||||||
var ret = new RetResult();
|
var ret = new RetResult();
|
||||||
@@ -56,7 +50,7 @@ public class CoreConfigClashService
|
|||||||
var tagYamlStr1 = "!<str>";
|
var tagYamlStr1 = "!<str>";
|
||||||
var tagYamlStr2 = "__strn__";
|
var tagYamlStr2 = "__strn__";
|
||||||
var tagYamlStr3 = "!!str";
|
var tagYamlStr3 = "!!str";
|
||||||
var txtFile = File.ReadAllText(addressFileName);
|
var txtFile = await File.ReadAllTextAsync(addressFileName);
|
||||||
txtFile = txtFile.Replace(tagYamlStr1, tagYamlStr2);
|
txtFile = txtFile.Replace(tagYamlStr1, tagYamlStr2);
|
||||||
|
|
||||||
//YAML anchors
|
//YAML anchors
|
||||||
@@ -75,13 +69,13 @@ public class CoreConfigClashService
|
|||||||
//mixed-port
|
//mixed-port
|
||||||
fileContent["mixed-port"] = AppManager.Instance.GetLocalPort(EInboundProtocol.socks);
|
fileContent["mixed-port"] = AppManager.Instance.GetLocalPort(EInboundProtocol.socks);
|
||||||
//log-level
|
//log-level
|
||||||
fileContent["log-level"] = GetLogLevel(_config.CoreBasicItem.Loglevel);
|
fileContent["log-level"] = GetLogLevel(config.CoreBasicItem.Loglevel);
|
||||||
|
|
||||||
//external-controller
|
//external-controller
|
||||||
fileContent["external-controller"] = $"{Global.Loopback}:{AppManager.Instance.StatePort2}";
|
fileContent["external-controller"] = $"{Global.Loopback}:{AppManager.Instance.StatePort2}";
|
||||||
fileContent.Remove("secret");
|
fileContent.Remove("secret");
|
||||||
//allow-lan
|
//allow-lan
|
||||||
if (_config.Inbound.First().AllowLANConn)
|
if (config.Inbound.First().AllowLANConn)
|
||||||
{
|
{
|
||||||
fileContent["allow-lan"] = "true";
|
fileContent["allow-lan"] = "true";
|
||||||
fileContent["bind-address"] = "*";
|
fileContent["bind-address"] = "*";
|
||||||
@@ -92,23 +86,23 @@ public class CoreConfigClashService
|
|||||||
}
|
}
|
||||||
|
|
||||||
//ipv6
|
//ipv6
|
||||||
fileContent["ipv6"] = _config.ClashUIItem.EnableIPv6;
|
fileContent["ipv6"] = config.ClashUIItem.EnableIPv6;
|
||||||
|
|
||||||
//mode
|
//mode
|
||||||
if (!fileContent.ContainsKey("mode"))
|
if (!fileContent.ContainsKey("mode"))
|
||||||
{
|
{
|
||||||
fileContent["mode"] = ERuleMode.Rule.ToString().ToLower();
|
fileContent["mode"] = nameof(ERuleMode.Rule).ToLower();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (_config.ClashUIItem.RuleMode != ERuleMode.Unchanged)
|
if (config.ClashUIItem.RuleMode != ERuleMode.Unchanged)
|
||||||
{
|
{
|
||||||
fileContent["mode"] = _config.ClashUIItem.RuleMode.ToString().ToLower();
|
fileContent["mode"] = config.ClashUIItem.RuleMode.ToString().ToLower();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//enable tun mode
|
//enable tun mode
|
||||||
if (_config.TunModeItem.EnableTun)
|
if (config.TunModeItem.EnableTun)
|
||||||
{
|
{
|
||||||
var tun = EmbedUtils.GetEmbedText(Global.ClashTunYaml);
|
var tun = EmbedUtils.GetEmbedText(Global.ClashTunYaml);
|
||||||
if (tun.IsNotEmpty())
|
if (tun.IsNotEmpty())
|
||||||
@@ -156,7 +150,7 @@ public class CoreConfigClashService
|
|||||||
|
|
||||||
private async Task MixinContent(Dictionary<string, object> fileContent, ProfileItem node)
|
private async Task MixinContent(Dictionary<string, object> fileContent, ProfileItem node)
|
||||||
{
|
{
|
||||||
if (!_config.ClashUIItem.EnableMixinContent)
|
if (!config.ClashUIItem.EnableMixinContent)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -177,7 +171,7 @@ public class CoreConfigClashService
|
|||||||
}
|
}
|
||||||
foreach (var item in mixinContent)
|
foreach (var item in mixinContent)
|
||||||
{
|
{
|
||||||
if (!_config.TunModeItem.EnableTun && item.Key == "tun")
|
if (!config.TunModeItem.EnableTun && item.Key == "tun")
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -220,9 +214,8 @@ public class CoreConfigClashService
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!blRemoved && !fileContent.ContainsKey(key))
|
if (!blRemoved && fileContent.TryAdd(key, value))
|
||||||
{
|
{
|
||||||
fileContent.Add(key, value);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var lstOri = (List<object>)fileContent[key];
|
var lstOri = (List<object>)fileContent[key];
|
||||||
@@ -244,7 +237,7 @@ public class CoreConfigClashService
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
lstValue.ForEach(item => lstOri.Add(item));
|
lstValue.ForEach(lstOri.Add);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -153,7 +153,7 @@ public partial class CoreConfigSingboxService(CoreConfigContext context)
|
|||||||
{
|
{
|
||||||
listen = Global.Loopback,
|
listen = Global.Loopback,
|
||||||
listen_port = port,
|
listen_port = port,
|
||||||
type = EInboundProtocol.mixed.ToString(),
|
type = nameof(EInboundProtocol.mixed),
|
||||||
};
|
};
|
||||||
inbound.tag = inbound.type + inbound.listen_port.ToString();
|
inbound.tag = inbound.type + inbound.listen_port.ToString();
|
||||||
_coreConfig.inbounds.Add(inbound);
|
_coreConfig.inbounds.Add(inbound);
|
||||||
@@ -229,7 +229,7 @@ public partial class CoreConfigSingboxService(CoreConfigContext context)
|
|||||||
tag = $"{EInboundProtocol.mixed}{port}",
|
tag = $"{EInboundProtocol.mixed}{port}",
|
||||||
listen = Global.Loopback,
|
listen = Global.Loopback,
|
||||||
listen_port = port,
|
listen_port = port,
|
||||||
type = EInboundProtocol.mixed.ToString(),
|
type = nameof(EInboundProtocol.mixed),
|
||||||
});
|
});
|
||||||
ApplyOutboundBindInterface();
|
ApplyOutboundBindInterface();
|
||||||
ApplyOutboundSendThrough();
|
ApplyOutboundSendThrough();
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ public partial class CoreConfigSingboxService
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Process outbounds
|
// Process outbounds
|
||||||
var customOutboundsNode = fullConfigTemplateNode["outbounds"] is JsonArray outbounds ? outbounds : [];
|
var customOutboundsNode = fullConfigTemplateNode["outbounds"] as JsonArray ?? [];
|
||||||
foreach (var outbound in _coreConfig.outbounds)
|
foreach (var outbound in _coreConfig.outbounds)
|
||||||
{
|
{
|
||||||
if (outbound.type.ToLower() is "direct" or "block")
|
if (outbound.type.ToLower() is "direct" or "block")
|
||||||
@@ -42,9 +42,9 @@ public partial class CoreConfigSingboxService
|
|||||||
fullConfigTemplateNode["outbounds"] = customOutboundsNode;
|
fullConfigTemplateNode["outbounds"] = customOutboundsNode;
|
||||||
|
|
||||||
// Process endpoints
|
// Process endpoints
|
||||||
if (_coreConfig.endpoints != null && _coreConfig.endpoints.Count > 0)
|
if (_coreConfig.endpoints is { Count: > 0 })
|
||||||
{
|
{
|
||||||
var customEndpointsNode = fullConfigTemplateNode["endpoints"] is JsonArray endpoints ? endpoints : [];
|
var customEndpointsNode = fullConfigTemplateNode["endpoints"] as JsonArray ?? [];
|
||||||
foreach (var endpoint in _coreConfig.endpoints)
|
foreach (var endpoint in _coreConfig.endpoints)
|
||||||
{
|
{
|
||||||
if (endpoint.detour.IsNullOrEmpty() && !fullConfigTemplate.ProxyDetour.IsNullOrEmpty())
|
if (endpoint.detour.IsNullOrEmpty() && !fullConfigTemplate.ProxyDetour.IsNullOrEmpty())
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ public partial class CoreConfigSingboxService
|
|||||||
{
|
{
|
||||||
var rules = JsonUtils.Deserialize<List<RulesItem>>(routing.RuleSet) ?? [];
|
var rules = JsonUtils.Deserialize<List<RulesItem>>(routing.RuleSet) ?? [];
|
||||||
|
|
||||||
if (rules?.LastOrDefault() is { } lastRule && lastRule.OutboundTag == Global.DirectTag)
|
if (rules?.LastOrDefault() is { OutboundTag: Global.DirectTag } lastRule)
|
||||||
{
|
{
|
||||||
var noDomain = lastRule.Domain == null || lastRule.Domain.Count == 0;
|
var noDomain = lastRule.Domain == null || lastRule.Domain.Count == 0;
|
||||||
var noProcess = lastRule.Process == null || lastRule.Process.Count == 0;
|
var noProcess = lastRule.Process == null || lastRule.Process.Count == 0;
|
||||||
@@ -82,7 +82,7 @@ public partial class CoreConfigSingboxService
|
|||||||
if (simpleDnsItem.UseSystemHosts == true)
|
if (simpleDnsItem.UseSystemHosts == true)
|
||||||
{
|
{
|
||||||
var systemHosts = Utils.GetSystemHosts();
|
var systemHosts = Utils.GetSystemHosts();
|
||||||
if (systemHosts != null && systemHosts.Count > 0)
|
if (systemHosts is { Count: > 0 })
|
||||||
{
|
{
|
||||||
foreach (var host in systemHosts)
|
foreach (var host in systemHosts)
|
||||||
{
|
{
|
||||||
@@ -182,13 +182,13 @@ public partial class CoreConfigSingboxService
|
|||||||
{
|
{
|
||||||
server = Global.SingboxRemoteDNSTag,
|
server = Global.SingboxRemoteDNSTag,
|
||||||
strategy = Utils.DomainStrategy4Sbox(simpleDnsItem.Strategy4Proxy),
|
strategy = Utils.DomainStrategy4Sbox(simpleDnsItem.Strategy4Proxy),
|
||||||
clash_mode = ERuleMode.Global.ToString()
|
clash_mode = nameof(ERuleMode.Global)
|
||||||
},
|
},
|
||||||
new Rule4Sbox
|
new Rule4Sbox
|
||||||
{
|
{
|
||||||
server = Global.SingboxDirectDNSTag,
|
server = Global.SingboxDirectDNSTag,
|
||||||
strategy = Utils.DomainStrategy4Sbox(simpleDnsItem.Strategy4Freedom),
|
strategy = Utils.DomainStrategy4Sbox(simpleDnsItem.Strategy4Freedom),
|
||||||
clash_mode = ERuleMode.Direct.ToString()
|
clash_mode = nameof(ERuleMode.Direct)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -454,12 +454,12 @@ public partial class CoreConfigSingboxService
|
|||||||
dns4Sbox.rules.Insert(0, new()
|
dns4Sbox.rules.Insert(0, new()
|
||||||
{
|
{
|
||||||
server = tag,
|
server = tag,
|
||||||
clash_mode = ERuleMode.Direct.ToString()
|
clash_mode = nameof(ERuleMode.Direct)
|
||||||
});
|
});
|
||||||
dns4Sbox.rules.Insert(0, new()
|
dns4Sbox.rules.Insert(0, new()
|
||||||
{
|
{
|
||||||
server = dns4Sbox.servers.Where(t => t.detour == Global.ProxyTag).Select(t => t.tag).FirstOrDefault() ?? "remote",
|
server = dns4Sbox.servers.Where(t => t.detour == Global.ProxyTag).Select(t => t.tag).FirstOrDefault() ?? "remote",
|
||||||
clash_mode = ERuleMode.Global.ToString()
|
clash_mode = nameof(ERuleMode.Global)
|
||||||
});
|
});
|
||||||
|
|
||||||
var finalDnsAddress = string.IsNullOrEmpty(dnsItem?.DomainDNSAddress) ? Global.DomainPureIPDNSAddress.FirstOrDefault() : dnsItem?.DomainDNSAddress;
|
var finalDnsAddress = string.IsNullOrEmpty(dnsItem?.DomainDNSAddress) ? Global.DomainPureIPDNSAddress.FirstOrDefault() : dnsItem?.DomainDNSAddress;
|
||||||
|
|||||||
@@ -15,8 +15,8 @@ public partial class CoreConfigSingboxService
|
|||||||
{
|
{
|
||||||
var inbound = new Inbound4Sbox()
|
var inbound = new Inbound4Sbox()
|
||||||
{
|
{
|
||||||
type = EInboundProtocol.mixed.ToString(),
|
type = nameof(EInboundProtocol.mixed),
|
||||||
tag = EInboundProtocol.socks.ToString(),
|
tag = nameof(EInboundProtocol.socks),
|
||||||
listen = Global.Loopback,
|
listen = Global.Loopback,
|
||||||
};
|
};
|
||||||
_coreConfig.inbounds.Add(inbound);
|
_coreConfig.inbounds.Add(inbound);
|
||||||
@@ -87,7 +87,7 @@ public partial class CoreConfigSingboxService
|
|||||||
var inbound = JsonUtils.DeepCopy(inItem);
|
var inbound = JsonUtils.DeepCopy(inItem);
|
||||||
inbound.tag = protocol.ToString();
|
inbound.tag = protocol.ToString();
|
||||||
inbound.listen_port = inItem.listen_port + (int)protocol;
|
inbound.listen_port = inItem.listen_port + (int)protocol;
|
||||||
inbound.type = EInboundProtocol.mixed.ToString();
|
inbound.type = nameof(EInboundProtocol.mixed);
|
||||||
return inbound;
|
return inbound;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -730,8 +730,8 @@ public partial class CoreConfigSingboxService
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var outbounds = servers.Where(s => s is Outbound4Sbox).Cast<Outbound4Sbox>().ToList();
|
var outbounds = servers.OfType<Outbound4Sbox>().ToList();
|
||||||
var endpoints = servers.Where(s => s is Endpoints4Sbox).Cast<Endpoints4Sbox>().ToList();
|
var endpoints = servers.OfType<Endpoints4Sbox>().ToList();
|
||||||
singboxConfig.endpoints ??= [];
|
singboxConfig.endpoints ??= [];
|
||||||
if (prepend)
|
if (prepend)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -193,12 +193,12 @@ public partial class CoreConfigSingboxService
|
|||||||
_coreConfig.route.rules.Add(new()
|
_coreConfig.route.rules.Add(new()
|
||||||
{
|
{
|
||||||
outbound = Global.DirectTag,
|
outbound = Global.DirectTag,
|
||||||
clash_mode = ERuleMode.Direct.ToString()
|
clash_mode = nameof(ERuleMode.Direct)
|
||||||
});
|
});
|
||||||
_coreConfig.route.rules.Add(new()
|
_coreConfig.route.rules.Add(new()
|
||||||
{
|
{
|
||||||
outbound = Global.ProxyTag,
|
outbound = Global.ProxyTag,
|
||||||
clash_mode = ERuleMode.Global.ToString()
|
clash_mode = nameof(ERuleMode.Global)
|
||||||
});
|
});
|
||||||
|
|
||||||
var domainStrategy = _config.RoutingBasicItem.DomainStrategy4Singbox.NullIfEmpty();
|
var domainStrategy = _config.RoutingBasicItem.DomainStrategy4Singbox.NullIfEmpty();
|
||||||
|
|||||||
@@ -18,15 +18,15 @@ public partial class CoreConfigSingboxService
|
|||||||
//convert route geosite & geoip to ruleset
|
//convert route geosite & geoip to ruleset
|
||||||
foreach (var rule in _coreConfig.route.rules.Where(t => t.geosite?.Count > 0).ToList() ?? [])
|
foreach (var rule in _coreConfig.route.rules.Where(t => t.geosite?.Count > 0).ToList() ?? [])
|
||||||
{
|
{
|
||||||
rule.rule_set ??= new List<string>();
|
rule.rule_set ??= [];
|
||||||
rule.rule_set.AddRange(rule?.geosite?.Select(t => $"{geosite}-{t}").ToList());
|
rule.rule_set.AddRange(rule?.geosite?.Select(t => $"{geosite}-{t}").ToList() ?? []);
|
||||||
rule.geosite = null;
|
rule.geosite = null;
|
||||||
AddRuleSets(ruleSets, rule.rule_set);
|
AddRuleSets(ruleSets, rule.rule_set);
|
||||||
}
|
}
|
||||||
foreach (var rule in _coreConfig.route.rules.Where(t => t.geoip?.Count > 0).ToList() ?? [])
|
foreach (var rule in _coreConfig.route.rules.Where(t => t.geoip?.Count > 0).ToList() ?? [])
|
||||||
{
|
{
|
||||||
rule.rule_set ??= new List<string>();
|
rule.rule_set ??= [];
|
||||||
rule.rule_set.AddRange(rule?.geoip?.Select(t => $"{geoip}-{t}").ToList());
|
rule.rule_set.AddRange(rule?.geoip?.Select(t => $"{geoip}-{t}").ToList() ?? []);
|
||||||
rule.geoip = null;
|
rule.geoip = null;
|
||||||
AddRuleSets(ruleSets, rule.rule_set);
|
AddRuleSets(ruleSets, rule.rule_set);
|
||||||
}
|
}
|
||||||
@@ -34,14 +34,14 @@ public partial class CoreConfigSingboxService
|
|||||||
//convert dns geosite & geoip to ruleset
|
//convert dns geosite & geoip to ruleset
|
||||||
foreach (var rule in _coreConfig.dns?.rules.Where(t => t.geosite?.Count > 0).ToList() ?? [])
|
foreach (var rule in _coreConfig.dns?.rules.Where(t => t.geosite?.Count > 0).ToList() ?? [])
|
||||||
{
|
{
|
||||||
rule.rule_set ??= new List<string>();
|
rule.rule_set ??= [];
|
||||||
rule.rule_set.AddRange(rule?.geosite?.Select(t => $"{geosite}-{t}").ToList());
|
rule.rule_set.AddRange(rule?.geosite?.Select(t => $"{geosite}-{t}").ToList() ?? []);
|
||||||
rule.geosite = null;
|
rule.geosite = null;
|
||||||
}
|
}
|
||||||
foreach (var rule in _coreConfig.dns?.rules.Where(t => t.geoip?.Count > 0).ToList() ?? [])
|
foreach (var rule in _coreConfig.dns?.rules.Where(t => t.geoip?.Count > 0).ToList() ?? [])
|
||||||
{
|
{
|
||||||
rule.rule_set ??= new List<string>();
|
rule.rule_set ??= [];
|
||||||
rule.rule_set.AddRange(rule?.geoip?.Select(t => $"{geoip}-{t}").ToList());
|
rule.rule_set.AddRange(rule?.geoip?.Select(t => $"{geoip}-{t}").ToList() ?? []);
|
||||||
rule.geoip = null;
|
rule.geoip = null;
|
||||||
}
|
}
|
||||||
foreach (var dnsRule in _coreConfig.dns?.rules.Where(t => t.rule_set?.Count > 0).ToList() ?? [])
|
foreach (var dnsRule in _coreConfig.dns?.rules.Where(t => t.rule_set?.Count > 0).ToList() ?? [])
|
||||||
|
|||||||
@@ -165,7 +165,7 @@ public partial class CoreConfigV2rayService(CoreConfigContext context)
|
|||||||
{
|
{
|
||||||
listen = Global.Loopback,
|
listen = Global.Loopback,
|
||||||
port = port,
|
port = port,
|
||||||
protocol = EInboundProtocol.mixed.ToString(),
|
protocol = nameof(EInboundProtocol.mixed),
|
||||||
settings = new Inboundsettings4Ray()
|
settings = new Inboundsettings4Ray()
|
||||||
{
|
{
|
||||||
udp = true,
|
udp = true,
|
||||||
@@ -270,7 +270,7 @@ public partial class CoreConfigV2rayService(CoreConfigContext context)
|
|||||||
tag = $"{EInboundProtocol.socks}{port}",
|
tag = $"{EInboundProtocol.socks}{port}",
|
||||||
listen = Global.Loopback,
|
listen = Global.Loopback,
|
||||||
port = port,
|
port = port,
|
||||||
protocol = EInboundProtocol.mixed.ToString(),
|
protocol = nameof(EInboundProtocol.mixed),
|
||||||
settings = new Inboundsettings4Ray()
|
settings = new Inboundsettings4Ray()
|
||||||
{
|
{
|
||||||
udp = true,
|
udp = true,
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ public partial class CoreConfigV2rayService
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_coreConfig.burstObservatory.subjectSelector ??= new();
|
_coreConfig.burstObservatory.subjectSelector ??= [];
|
||||||
_coreConfig.burstObservatory.subjectSelector.Add(baseTagName);
|
_coreConfig.burstObservatory.subjectSelector.Add(baseTagName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -75,7 +75,7 @@ public partial class CoreConfigV2rayService
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_coreConfig.observatory.subjectSelector ??= new();
|
_coreConfig.observatory.subjectSelector ??= [];
|
||||||
_coreConfig.observatory.subjectSelector.Add(baseTagName);
|
_coreConfig.observatory.subjectSelector.Add(baseTagName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -106,7 +106,7 @@ public partial class CoreConfigV2rayService
|
|||||||
tag = balancerTag,
|
tag = balancerTag,
|
||||||
fallbackTag = multipleLoad == EMultipleLoad.Fallback ? Global.DirectTag : null,
|
fallbackTag = multipleLoad == EMultipleLoad.Fallback ? Global.DirectTag : null,
|
||||||
};
|
};
|
||||||
_coreConfig.routing.balancers ??= new();
|
_coreConfig.routing.balancers ??= [];
|
||||||
_coreConfig.routing.balancers.Add(balancer);
|
_coreConfig.routing.balancers.Add(balancer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,10 +46,7 @@ public partial class CoreConfigV2rayService
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Ensure routing node exists
|
// Ensure routing node exists
|
||||||
if (fullConfigTemplateNode["routing"] == null)
|
fullConfigTemplateNode["routing"] ??= new JsonObject();
|
||||||
{
|
|
||||||
fullConfigTemplateNode["routing"] = new JsonObject();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle balancers - append instead of override
|
// Handle balancers - append instead of override
|
||||||
if (fullConfigTemplateNode["routing"]["balancers"] is JsonArray customBalancersNode)
|
if (fullConfigTemplateNode["routing"]["balancers"] is JsonArray customBalancersNode)
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ public partial class CoreConfigV2rayService
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var simpleDnsItem = context.SimpleDnsItem;
|
var simpleDnsItem = context.SimpleDnsItem;
|
||||||
var dnsItem = _coreConfig.dns is Dns4Ray dns4Ray ? dns4Ray : new Dns4Ray();
|
var dnsItem = _coreConfig.dns as Dns4Ray ?? new Dns4Ray();
|
||||||
|
|
||||||
var strategy4Freedom = simpleDnsItem?.Strategy4Freedom ?? Global.AsIs;
|
var strategy4Freedom = simpleDnsItem?.Strategy4Freedom ?? Global.AsIs;
|
||||||
//Outbound Freedom domainStrategy
|
//Outbound Freedom domainStrategy
|
||||||
@@ -246,7 +246,7 @@ public partial class CoreConfigV2rayService
|
|||||||
|
|
||||||
var useDirectDns = false;
|
var useDirectDns = false;
|
||||||
|
|
||||||
if (rules?.LastOrDefault() is { } lastRule && lastRule.OutboundTag == Global.DirectTag)
|
if (rules?.LastOrDefault() is { OutboundTag: Global.DirectTag } lastRule)
|
||||||
{
|
{
|
||||||
var noDomain = lastRule.Domain == null || lastRule.Domain.Count == 0;
|
var noDomain = lastRule.Domain == null || lastRule.Domain.Count == 0;
|
||||||
var noProcess = lastRule.Process == null || lastRule.Process.Count == 0;
|
var noProcess = lastRule.Process == null || lastRule.Process.Count == 0;
|
||||||
@@ -384,9 +384,11 @@ public partial class CoreConfigV2rayService
|
|||||||
var outbound = _coreConfig.outbounds.FirstOrDefault(t => t is { protocol: "freedom", tag: Global.DirectTag });
|
var outbound = _coreConfig.outbounds.FirstOrDefault(t => t is { protocol: "freedom", tag: Global.DirectTag });
|
||||||
if (outbound != null)
|
if (outbound != null)
|
||||||
{
|
{
|
||||||
outbound.settings = new();
|
outbound.settings = new()
|
||||||
outbound.settings.domainStrategy = domainStrategy4Freedom;
|
{
|
||||||
outbound.settings.userLevel = 0;
|
domainStrategy = domainStrategy4Freedom,
|
||||||
|
userLevel = 0,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -145,7 +145,7 @@ public partial class CoreConfigV2rayService
|
|||||||
}
|
}
|
||||||
inbound.tag = protocol.ToString();
|
inbound.tag = protocol.ToString();
|
||||||
inbound.port = inItem.LocalPort + (int)protocol;
|
inbound.port = inItem.LocalPort + (int)protocol;
|
||||||
inbound.protocol = EInboundProtocol.mixed.ToString();
|
inbound.protocol = nameof(EInboundProtocol.mixed);
|
||||||
inbound.settings.udp = inItem.UdpEnabled;
|
inbound.settings.udp = inItem.UdpEnabled;
|
||||||
inbound.sniffing.enabled = inItem.SniffingEnabled;
|
inbound.sniffing.enabled = inItem.SniffingEnabled;
|
||||||
inbound.sniffing.destOverride = inItem.DestOverride;
|
inbound.sniffing.destOverride = inItem.DestOverride;
|
||||||
|
|||||||
@@ -243,9 +243,9 @@ public partial class CoreConfigV2rayService
|
|||||||
version = 2,
|
version = 2,
|
||||||
address = _node.Address,
|
address = _node.Address,
|
||||||
port = _node.Port,
|
port = _node.Port,
|
||||||
|
vnext = null,
|
||||||
|
servers = null,
|
||||||
};
|
};
|
||||||
outbound.settings.vnext = null;
|
|
||||||
outbound.settings.servers = null;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case EConfigType.WireGuard:
|
case EConfigType.WireGuard:
|
||||||
@@ -450,14 +450,13 @@ public partial class CoreConfigV2rayService
|
|||||||
KcpSettings4Ray kcpSettings = new()
|
KcpSettings4Ray kcpSettings = new()
|
||||||
{
|
{
|
||||||
mtu = kcpMtu,
|
mtu = kcpMtu,
|
||||||
tti = _config.KcpItem.Tti
|
tti = _config.KcpItem.Tti,
|
||||||
|
uplinkCapacity = _config.KcpItem.UplinkCapacity,
|
||||||
|
downlinkCapacity = _config.KcpItem.DownlinkCapacity,
|
||||||
|
cwndMultiplier = _config.KcpItem.CwndMultiplier,
|
||||||
|
maxSendingWindow = _config.KcpItem.MaxSendingWindow,
|
||||||
};
|
};
|
||||||
|
|
||||||
kcpSettings.uplinkCapacity = _config.KcpItem.UplinkCapacity;
|
|
||||||
kcpSettings.downlinkCapacity = _config.KcpItem.DownlinkCapacity;
|
|
||||||
|
|
||||||
kcpSettings.cwndMultiplier = _config.KcpItem.CwndMultiplier;
|
|
||||||
kcpSettings.maxSendingWindow = _config.KcpItem.MaxSendingWindow;
|
|
||||||
var kcpFinalmask = new Finalmask4Ray();
|
var kcpFinalmask = new Finalmask4Ray();
|
||||||
if (Global.KcpHeaderMaskMap.TryGetValue(headerType, out var header))
|
if (Global.KcpHeaderMaskMap.TryGetValue(headerType, out var header))
|
||||||
{
|
{
|
||||||
@@ -531,7 +530,7 @@ public partial class CoreConfigV2rayService
|
|||||||
break;
|
break;
|
||||||
//xhttp
|
//xhttp
|
||||||
case nameof(ETransport.xhttp):
|
case nameof(ETransport.xhttp):
|
||||||
streamSettings.network = ETransport.xhttp.ToString();
|
streamSettings.network = nameof(ETransport.xhttp);
|
||||||
XhttpSettings4Ray xhttpSettings = new();
|
XhttpSettings4Ray xhttpSettings = new();
|
||||||
|
|
||||||
if (path.IsNotEmpty())
|
if (path.IsNotEmpty())
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ public partial class CoreConfigV2rayService
|
|||||||
{
|
{
|
||||||
if (_config.GuiItem.EnableStatistics || _config.GuiItem.DisplayRealTimeSpeed)
|
if (_config.GuiItem.EnableStatistics || _config.GuiItem.DisplayRealTimeSpeed)
|
||||||
{
|
{
|
||||||
var tag = EInboundProtocol.api.ToString();
|
const string tag = nameof(EInboundProtocol.api);
|
||||||
Metrics4Ray apiObj = new();
|
Metrics4Ray apiObj = new();
|
||||||
Policy4Ray policyObj = new();
|
Policy4Ray policyObj = new();
|
||||||
SystemPolicy4Ray policySystemSetting = new();
|
SystemPolicy4Ray policySystemSetting = new();
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ public class SpeedtestService(Config config, Func<SpeedTestResult, Task> updateF
|
|||||||
private static readonly string _tag = "SpeedtestService";
|
private static readonly string _tag = "SpeedtestService";
|
||||||
private readonly Config? _config = config;
|
private readonly Config? _config = config;
|
||||||
private readonly Func<SpeedTestResult, Task>? _updateFunc = updateFunc;
|
private readonly Func<SpeedTestResult, Task>? _updateFunc = updateFunc;
|
||||||
private static readonly ConcurrentBag<string> _lstExitLoop = new();
|
private static readonly ConcurrentBag<string> _lstExitLoop = [];
|
||||||
private readonly int _speedTestPageSize = config.SpeedTestItem.SpeedTestPageSize ?? Global.SpeedTestPageSize;
|
private readonly int _speedTestPageSize = config.SpeedTestItem.SpeedTestPageSize ?? Global.SpeedTestPageSize;
|
||||||
private readonly TimeSpan _delayInterval = TimeSpan.FromSeconds(config.SpeedTestItem.SpeedTestDelayInterval ?? 1);
|
private readonly TimeSpan _delayInterval = TimeSpan.FromSeconds(config.SpeedTestItem.SpeedTestDelayInterval ?? 1);
|
||||||
|
|
||||||
@@ -33,7 +33,7 @@ public class SpeedtestService(Config config, Func<SpeedTestResult, Task> updateF
|
|||||||
|
|
||||||
private static bool ShouldStopTest(string exitLoopKey)
|
private static bool ShouldStopTest(string exitLoopKey)
|
||||||
{
|
{
|
||||||
return !_lstExitLoop.Any(p => p == exitLoopKey);
|
return _lstExitLoop.All(p => p != exitLoopKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task RunAsync(ESpeedActionType actionType, List<ProfileItem> selecteds)
|
private async Task RunAsync(ESpeedActionType actionType, List<ProfileItem> selecteds)
|
||||||
@@ -173,7 +173,7 @@ public class SpeedtestService(Config config, Func<SpeedTestResult, Task> updateF
|
|||||||
}
|
}
|
||||||
var lstTest = GetTestBatchItem(lstSelected, pageSize);
|
var lstTest = GetTestBatchItem(lstSelected, pageSize);
|
||||||
|
|
||||||
List<ServerTestItem> lstFailed = new();
|
List<ServerTestItem> lstFailed = [];
|
||||||
foreach (var lst in lstTest)
|
foreach (var lst in lstTest)
|
||||||
{
|
{
|
||||||
var ret = await RunRealPingAsync(lst, exitLoopKey);
|
var ret = await RunRealPingAsync(lst, exitLoopKey);
|
||||||
@@ -219,7 +219,7 @@ public class SpeedtestService(Config config, Func<SpeedTestResult, Task> updateF
|
|||||||
}
|
}
|
||||||
await Task.Delay(1000);
|
await Task.Delay(1000);
|
||||||
|
|
||||||
List<Task> tasks = new();
|
List<Task> tasks = [];
|
||||||
foreach (var it in selecteds)
|
foreach (var it in selecteds)
|
||||||
{
|
{
|
||||||
if (!it.AllowTest)
|
if (!it.AllowTest)
|
||||||
@@ -262,7 +262,7 @@ public class SpeedtestService(Config config, Func<SpeedTestResult, Task> updateF
|
|||||||
}
|
}
|
||||||
var lstTest = GetTestBatchItem(lstSelected, pageSize);
|
var lstTest = GetTestBatchItem(lstSelected, pageSize);
|
||||||
|
|
||||||
List<ServerTestItem> lstFailed = new();
|
List<ServerTestItem> lstFailed = [];
|
||||||
foreach (var lst in lstTest)
|
foreach (var lst in lstTest)
|
||||||
{
|
{
|
||||||
var ret = await RunUdpTestAsync(lst, exitLoopKey);
|
var ret = await RunUdpTestAsync(lst, exitLoopKey);
|
||||||
@@ -300,7 +300,7 @@ public class SpeedtestService(Config config, Func<SpeedTestResult, Task> updateF
|
|||||||
}
|
}
|
||||||
await Task.Delay(1000);
|
await Task.Delay(1000);
|
||||||
|
|
||||||
List<Task> tasks = new();
|
List<Task> tasks = [];
|
||||||
foreach (var it in selecteds)
|
foreach (var it in selecteds)
|
||||||
{
|
{
|
||||||
if (!it.AllowTest)
|
if (!it.AllowTest)
|
||||||
@@ -338,7 +338,7 @@ public class SpeedtestService(Config config, Func<SpeedTestResult, Task> updateF
|
|||||||
{
|
{
|
||||||
using var concurrencySemaphore = new SemaphoreSlim(concurrencyCount);
|
using var concurrencySemaphore = new SemaphoreSlim(concurrencyCount);
|
||||||
var downloadHandle = new DownloadService();
|
var downloadHandle = new DownloadService();
|
||||||
List<Task> tasks = new();
|
List<Task> tasks = [];
|
||||||
foreach (var it in selecteds)
|
foreach (var it in selecteds)
|
||||||
{
|
{
|
||||||
if (ShouldStopTest(exitLoopKey))
|
if (ShouldStopTest(exitLoopKey))
|
||||||
@@ -489,7 +489,7 @@ public class SpeedtestService(Config config, Func<SpeedTestResult, Task> updateF
|
|||||||
|
|
||||||
private List<List<ServerTestItem>> GetTestBatchItem(List<ServerTestItem> lstSelected, int pageSize)
|
private List<List<ServerTestItem>> GetTestBatchItem(List<ServerTestItem> lstSelected, int pageSize)
|
||||||
{
|
{
|
||||||
List<List<ServerTestItem>> lstTest = new();
|
List<List<ServerTestItem>> lstTest = [];
|
||||||
var lst1 = lstSelected.Where(t => t.CoreType == ECoreType.Xray).ToList();
|
var lst1 = lstSelected.Where(t => t.CoreType == ECoreType.Xray).ToList();
|
||||||
var lst2 = lstSelected.Where(t => t.CoreType == ECoreType.sing_box).ToList();
|
var lst2 = lstSelected.Where(t => t.CoreType == ECoreType.sing_box).ToList();
|
||||||
|
|
||||||
|
|||||||
@@ -31,8 +31,7 @@ public sealed class WindowsJobService : IDisposable
|
|||||||
if (!SetInformationJobObject(handle, JobObjectInfoType.ExtendedLimitInformation, extendedInfoPtr,
|
if (!SetInformationJobObject(handle, JobObjectInfoType.ExtendedLimitInformation, extendedInfoPtr,
|
||||||
(uint)length))
|
(uint)length))
|
||||||
{
|
{
|
||||||
throw new Exception(string.Format("Unable to set information. Error: {0}",
|
throw new Exception($"Unable to set information. Error: {Marshal.GetLastWin32Error()}");
|
||||||
Marshal.GetLastWin32Error()));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
|
|||||||
@@ -216,7 +216,7 @@ public class AddGroupServerViewModel : MyReactiveObject
|
|||||||
NoticeManager.Instance.Enqueue(ResUI.PleaseAddAtLeastOneServer);
|
NoticeManager.Instance.Enqueue(ResUI.PleaseAddAtLeastOneServer);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
SelectedSource.CoreType = CoreType.IsNullOrEmpty() ? ECoreType.Xray : (ECoreType)Enum.Parse(typeof(ECoreType), CoreType);
|
SelectedSource.CoreType = CoreType.IsNullOrEmpty() ? ECoreType.Xray : Enum.Parse<ECoreType>(CoreType);
|
||||||
if (SelectedSource.CoreType is not (ECoreType.Xray or ECoreType.sing_box) ||
|
if (SelectedSource.CoreType is not (ECoreType.Xray or ECoreType.sing_box) ||
|
||||||
SelectedSource.ConfigType is not (EConfigType.ProxyChain or EConfigType.PolicyGroup))
|
SelectedSource.ConfigType is not (EConfigType.ProxyChain or EConfigType.PolicyGroup))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ public class AddServer2ViewModel : MyReactiveObject
|
|||||||
NoticeManager.Instance.Enqueue(ResUI.FillServerAddressCustom);
|
NoticeManager.Instance.Enqueue(ResUI.FillServerAddressCustom);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
SelectedSource.CoreType = CoreType.IsNullOrEmpty() ? null : (ECoreType)Enum.Parse(typeof(ECoreType), CoreType);
|
SelectedSource.CoreType = CoreType.IsNullOrEmpty() ? null : Enum.Parse<ECoreType>(CoreType);
|
||||||
|
|
||||||
if (await ConfigHandler.EditCustomServer(_config, SelectedSource) == 0)
|
if (await ConfigHandler.EditCustomServer(_config, SelectedSource) == 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ public class ClashConnectionsViewModel : MyReactiveObject
|
|||||||
|
|
||||||
var dtNow = DateTime.Now;
|
var dtNow = DateTime.Now;
|
||||||
var lstModel = new List<ClashConnectionModel>();
|
var lstModel = new List<ClashConnectionModel>();
|
||||||
foreach (var item in connections ?? new())
|
foreach (var item in connections ?? [])
|
||||||
{
|
{
|
||||||
var host = $"{(item.metadata.host.IsNullOrEmpty() ? item.metadata.destinationIP : item.metadata.host)}:{item.metadata.destinationPort}";
|
var host = $"{(item.metadata.host.IsNullOrEmpty() ? item.metadata.destinationIP : item.metadata.host)}:{item.metadata.destinationPort}";
|
||||||
if (HostFilter.IsNotEmpty() && !host.Contains(HostFilter))
|
if (HostFilter.IsNotEmpty() && !host.Contains(HostFilter))
|
||||||
@@ -85,7 +85,7 @@ public class ClashConnectionsViewModel : MyReactiveObject
|
|||||||
Host = host,
|
Host = host,
|
||||||
Time = (dtNow - item.start).TotalSeconds < 0 ? 1 : (dtNow - item.start).TotalSeconds,
|
Time = (dtNow - item.start).TotalSeconds < 0 ? 1 : (dtNow - item.start).TotalSeconds,
|
||||||
Elapsed = (dtNow - item.start).ToString(@"hh\:mm\:ss"),
|
Elapsed = (dtNow - item.start).ToString(@"hh\:mm\:ss"),
|
||||||
Chain = $"{item.rule} , {string.Join("->", item.chains ?? new())}"
|
Chain = $"{item.rule} , {string.Join("->", item.chains ?? [])}"
|
||||||
};
|
};
|
||||||
|
|
||||||
lstModel.Add(model);
|
lstModel.Add(model);
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ public class ClashProxiesViewModel : MyReactiveObject
|
|||||||
this.WhenAnyValue(
|
this.WhenAnyValue(
|
||||||
x => x.SelectedGroup,
|
x => x.SelectedGroup,
|
||||||
y => y != null && y.Name.IsNotEmpty())
|
y => y != null && y.Name.IsNotEmpty())
|
||||||
.Subscribe(c => RefreshProxyDetails(c));
|
.Subscribe(RefreshProxyDetails);
|
||||||
|
|
||||||
this.WhenAnyValue(
|
this.WhenAnyValue(
|
||||||
x => x.RuleModeSelected,
|
x => x.RuleModeSelected,
|
||||||
@@ -77,7 +77,7 @@ public class ClashProxiesViewModel : MyReactiveObject
|
|||||||
this.WhenAnyValue(
|
this.WhenAnyValue(
|
||||||
x => x.SortingSelected,
|
x => x.SortingSelected,
|
||||||
y => y >= 0)
|
y => y >= 0)
|
||||||
.Subscribe(c => DoSortingSelected(c));
|
.Subscribe(DoSortingSelected);
|
||||||
|
|
||||||
this.WhenAnyValue(
|
this.WhenAnyValue(
|
||||||
x => x.AutoRefresh,
|
x => x.AutoRefresh,
|
||||||
@@ -188,15 +188,14 @@ public class ClashProxiesViewModel : MyReactiveObject
|
|||||||
ProxyGroups.Clear();
|
ProxyGroups.Clear();
|
||||||
|
|
||||||
var proxyGroups = ClashApiManager.Instance.GetClashProxyGroups();
|
var proxyGroups = ClashApiManager.Instance.GetClashProxyGroups();
|
||||||
if (proxyGroups != null && proxyGroups.Count > 0)
|
if (proxyGroups is { Count: > 0 })
|
||||||
{
|
{
|
||||||
foreach (var it in proxyGroups)
|
foreach (var it in proxyGroups)
|
||||||
{
|
{
|
||||||
if (it.name.IsNullOrEmpty() || !_proxies.ContainsKey(it.name))
|
if (it.name.IsNullOrEmpty() || !_proxies.TryGetValue(it.name, out var item))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
var item = _proxies[it.name];
|
|
||||||
if (!Global.allowSelectType.Contains(item.type.ToLower()))
|
if (!Global.allowSelectType.Contains(item.type.ToLower()))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
@@ -230,7 +229,7 @@ public class ClashProxiesViewModel : MyReactiveObject
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ProxyGroups != null && ProxyGroups.Count > 0)
|
if (ProxyGroups is { Count: > 0 })
|
||||||
{
|
{
|
||||||
if (selectedName != null && ProxyGroups.Any(t => t.Name == selectedName))
|
if (selectedName != null && ProxyGroups.Any(t => t.Name == selectedName))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ public class DNSSettingViewModel : MyReactiveObject
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.WhenAnyValue(x => x.RayCustomDNSEnableCompatible, x => x.SBCustomDNSEnableCompatible)
|
this.WhenAnyValue(x => x.RayCustomDNSEnableCompatible, x => x.SBCustomDNSEnableCompatible)
|
||||||
.Select(x => !(x.Item1 && x.Item2))
|
.Select(x => x is not { Item1: true, Item2: true })
|
||||||
.ToPropertyEx(this, x => x.IsSimpleDNSEnabled);
|
.ToPropertyEx(this, x => x.IsSimpleDNSEnabled);
|
||||||
|
|
||||||
_ = Init();
|
_ = Init();
|
||||||
|
|||||||
@@ -236,12 +236,9 @@ public class OptionSettingViewModel : MyReactiveObject
|
|||||||
|
|
||||||
private async Task InitCoreType()
|
private async Task InitCoreType()
|
||||||
{
|
{
|
||||||
if (_config.CoreTypeItem == null)
|
_config.CoreTypeItem ??= [];
|
||||||
{
|
|
||||||
_config.CoreTypeItem = new List<CoreTypeItem>();
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (EConfigType it in Enum.GetValues(typeof(EConfigType)))
|
foreach (var it in Enum.GetValues<EConfigType>())
|
||||||
{
|
{
|
||||||
if (_config.CoreTypeItem.FindIndex(t => t.ConfigType == it) >= 0)
|
if (_config.CoreTypeItem.FindIndex(t => t.ConfigType == it) >= 0)
|
||||||
{
|
{
|
||||||
@@ -458,7 +455,7 @@ public class OptionSettingViewModel : MyReactiveObject
|
|||||||
default:
|
default:
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
item.CoreType = (ECoreType)Enum.Parse(typeof(ECoreType), type);
|
item.CoreType = Enum.Parse<ECoreType>(type);
|
||||||
}
|
}
|
||||||
await Task.CompletedTask;
|
await Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,13 +5,10 @@ public class ProfilesSelectViewModel : MyReactiveObject
|
|||||||
#region private prop
|
#region private prop
|
||||||
|
|
||||||
private string _serverFilter = string.Empty;
|
private string _serverFilter = string.Empty;
|
||||||
private Dictionary<string, bool> _dicHeaderSort = new();
|
private readonly Dictionary<string, bool> _dicHeaderSort = new();
|
||||||
private string _subIndexId = string.Empty;
|
private string _subIndexId = string.Empty;
|
||||||
|
|
||||||
// ConfigType filter state: default include-mode with all types selected
|
// ConfigType filter state: default include-mode with all types selected
|
||||||
private List<EConfigType> _filterConfigTypes = new();
|
|
||||||
|
|
||||||
private bool _filterExclude = false;
|
|
||||||
|
|
||||||
#endregion private prop
|
#endregion private prop
|
||||||
|
|
||||||
@@ -33,18 +30,11 @@ public class ProfilesSelectViewModel : MyReactiveObject
|
|||||||
public string ServerFilter { get; set; }
|
public string ServerFilter { get; set; }
|
||||||
|
|
||||||
// Include/Exclude filter for ConfigType
|
// Include/Exclude filter for ConfigType
|
||||||
public List<EConfigType> FilterConfigTypes
|
[Reactive]
|
||||||
{
|
public List<EConfigType> FilterConfigTypes { get; set; }
|
||||||
get => _filterConfigTypes;
|
|
||||||
set => this.RaiseAndSetIfChanged(ref _filterConfigTypes, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Reactive]
|
[Reactive]
|
||||||
public bool FilterExclude
|
public bool FilterExclude { get; set; }
|
||||||
{
|
|
||||||
get => _filterExclude;
|
|
||||||
set => this.RaiseAndSetIfChanged(ref _filterExclude, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion ObservableCollection
|
#endregion ObservableCollection
|
||||||
|
|
||||||
@@ -91,11 +81,11 @@ public class ProfilesSelectViewModel : MyReactiveObject
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
FilterExclude = false;
|
FilterExclude = false;
|
||||||
FilterConfigTypes = Enum.GetValues(typeof(EConfigType)).Cast<EConfigType>().ToList();
|
FilterConfigTypes = Enum.GetValues<EConfigType>().ToList();
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
FilterConfigTypes = new();
|
FilterConfigTypes = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
await RefreshSubscriptions();
|
await RefreshSubscriptions();
|
||||||
@@ -165,14 +155,7 @@ public class ProfilesSelectViewModel : MyReactiveObject
|
|||||||
if (lstModel.Count > 0)
|
if (lstModel.Count > 0)
|
||||||
{
|
{
|
||||||
var selected = lstModel.FirstOrDefault(t => t.IndexId == _config.IndexId);
|
var selected = lstModel.FirstOrDefault(t => t.IndexId == _config.IndexId);
|
||||||
if (selected != null)
|
SelectedProfile = selected ?? lstModel.First();
|
||||||
{
|
|
||||||
SelectedProfile = selected;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SelectedProfile = lstModel.First();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
await _updateView?.Invoke(EViewAction.DispatcherRefreshServersBiz, null);
|
await _updateView?.Invoke(EViewAction.DispatcherRefreshServersBiz, null);
|
||||||
@@ -213,7 +196,7 @@ public class ProfilesSelectViewModel : MyReactiveObject
|
|||||||
}).OrderBy(t => t.Sort).ToList();
|
}).OrderBy(t => t.Sort).ToList();
|
||||||
|
|
||||||
// Apply ConfigType filter (include or exclude)
|
// Apply ConfigType filter (include or exclude)
|
||||||
if (FilterConfigTypes != null && FilterConfigTypes.Count > 0)
|
if (FilterConfigTypes is { Count: > 0 })
|
||||||
{
|
{
|
||||||
if (FilterExclude)
|
if (FilterExclude)
|
||||||
{
|
{
|
||||||
@@ -321,7 +304,7 @@ public class ProfilesSelectViewModel : MyReactiveObject
|
|||||||
// External setter for ConfigType filter
|
// External setter for ConfigType filter
|
||||||
public void SetConfigTypeFilter(IEnumerable<EConfigType> types, bool exclude = false)
|
public void SetConfigTypeFilter(IEnumerable<EConfigType> types, bool exclude = false)
|
||||||
{
|
{
|
||||||
FilterConfigTypes = types?.Distinct().ToList() ?? new List<EConfigType>();
|
FilterConfigTypes = types?.Distinct().ToList() ?? [];
|
||||||
FilterExclude = exclude;
|
FilterExclude = exclude;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ public class ProfilesViewModel : MyReactiveObject
|
|||||||
|
|
||||||
private List<ProfileItem> _lstProfile;
|
private List<ProfileItem> _lstProfile;
|
||||||
private string _serverFilter = string.Empty;
|
private string _serverFilter = string.Empty;
|
||||||
private Dictionary<string, bool> _dicHeaderSort = new();
|
private readonly Dictionary<string, bool> _dicHeaderSort = new();
|
||||||
private SpeedtestService? _speedtestService;
|
private SpeedtestService? _speedtestService;
|
||||||
private string? _pendingSelectIndexId;
|
private string? _pendingSelectIndexId;
|
||||||
|
|
||||||
@@ -190,7 +190,7 @@ public class ProfilesViewModel : MyReactiveObject
|
|||||||
}, canEditRemove);
|
}, canEditRemove);
|
||||||
SortServerResultCmd = ReactiveCommand.CreateFromTask(async () =>
|
SortServerResultCmd = ReactiveCommand.CreateFromTask(async () =>
|
||||||
{
|
{
|
||||||
await SortServer(EServerColName.DelayVal.ToString());
|
await SortServer(nameof(EServerColName.DelayVal));
|
||||||
});
|
});
|
||||||
RemoveInvalidServerResultCmd = ReactiveCommand.CreateFromTask(async () =>
|
RemoveInvalidServerResultCmd = ReactiveCommand.CreateFromTask(async () =>
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ public class RoutingRuleDetailsViewModel : MyReactiveObject
|
|||||||
}
|
}
|
||||||
SelectedSource.Protocol = ProtocolItems?.ToList();
|
SelectedSource.Protocol = ProtocolItems?.ToList();
|
||||||
SelectedSource.InboundTag = InboundTagItems?.ToList();
|
SelectedSource.InboundTag = InboundTagItems?.ToList();
|
||||||
SelectedSource.RuleType = RuleType.IsNullOrEmpty() ? null : (ERuleType)Enum.Parse(typeof(ERuleType), RuleType);
|
SelectedSource.RuleType = RuleType.IsNullOrEmpty() ? null : Enum.Parse<ERuleType>(RuleType);
|
||||||
|
|
||||||
var hasRule = SelectedSource.Domain?.Count > 0
|
var hasRule = SelectedSource.Domain?.Count > 0
|
||||||
|| SelectedSource.Ip?.Count > 0
|
|| SelectedSource.Ip?.Count > 0
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ public class RoutingRuleSettingViewModel : MyReactiveObject
|
|||||||
|
|
||||||
SelectedSource = new();
|
SelectedSource = new();
|
||||||
SelectedRouting = routingItem;
|
SelectedRouting = routingItem;
|
||||||
_rules = routingItem.Id.IsNullOrEmpty() ? new() : JsonUtils.Deserialize<List<RulesItem>>(SelectedRouting.RuleSet);
|
_rules = routingItem.Id.IsNullOrEmpty() ? [] : JsonUtils.Deserialize<List<RulesItem>>(SelectedRouting.RuleSet);
|
||||||
|
|
||||||
RefreshRulesItems();
|
RefreshRulesItems();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -313,9 +313,8 @@ public class StatusBarViewModel : MyReactiveObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
BlServers = true;
|
BlServers = true;
|
||||||
for (var k = 0; k < lstModel.Count; k++)
|
foreach (var it in lstModel)
|
||||||
{
|
{
|
||||||
var it = lstModel[k];
|
|
||||||
var name = it.GetSummary();
|
var name = it.GetSummary();
|
||||||
|
|
||||||
var item = new ComboItem() { ID = it.IndexId, Text = name };
|
var item = new ComboItem() { ID = it.IndexId, Text = name };
|
||||||
|
|||||||
@@ -72,14 +72,18 @@ public partial class App : Application
|
|||||||
|
|
||||||
private async void MenuAddServerViaClipboardClick(object? sender, EventArgs e)
|
private async void MenuAddServerViaClipboardClick(object? sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
|
try
|
||||||
{
|
{
|
||||||
if (desktop.MainWindow != null)
|
if (Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime { MainWindow: not null })
|
||||||
{
|
{
|
||||||
AppEvents.AddServerViaClipboardRequested.Publish();
|
AppEvents.AddServerViaClipboardRequested.Publish();
|
||||||
await Task.Delay(1000);
|
await Task.Delay(1000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Logging.SaveLog("MenuAddServerViaClipboardClick", ex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void MenuExit_Click(object? sender, EventArgs e)
|
private async void MenuExit_Click(object? sender, EventArgs e)
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ public class ThemeSettingViewModel : MyReactiveObject
|
|||||||
{
|
{
|
||||||
_config.UiItem.CurrentTheme = CurrentTheme;
|
_config.UiItem.CurrentTheme = CurrentTheme;
|
||||||
ModifyTheme();
|
ModifyTheme();
|
||||||
ConfigHandler.SaveConfig(_config);
|
_ = ConfigHandler.SaveConfig(_config);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -54,7 +54,7 @@ public class ThemeSettingViewModel : MyReactiveObject
|
|||||||
{
|
{
|
||||||
_config.UiItem.CurrentFontSize = CurrentFontSize;
|
_config.UiItem.CurrentFontSize = CurrentFontSize;
|
||||||
ModifyFontSize();
|
ModifyFontSize();
|
||||||
ConfigHandler.SaveConfig(_config);
|
_ = ConfigHandler.SaveConfig(_config);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -67,7 +67,7 @@ public class ThemeSettingViewModel : MyReactiveObject
|
|||||||
{
|
{
|
||||||
_config.UiItem.CurrentLanguage = CurrentLanguage;
|
_config.UiItem.CurrentLanguage = CurrentLanguage;
|
||||||
Thread.CurrentThread.CurrentUICulture = new(CurrentLanguage);
|
Thread.CurrentThread.CurrentUICulture = new(CurrentLanguage);
|
||||||
ConfigHandler.SaveConfig(_config);
|
_ = ConfigHandler.SaveConfig(_config);
|
||||||
NoticeManager.Instance.Enqueue(ResUI.NeedRebootTips);
|
NoticeManager.Instance.Enqueue(ResUI.NeedRebootTips);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ public partial class AddServer2Window : WindowBase<AddServer2ViewModel>
|
|||||||
btnCancel.Click += (s, e) => Close();
|
btnCancel.Click += (s, e) => Close();
|
||||||
ViewModel = new AddServer2ViewModel(profileItem, UpdateViewHandler);
|
ViewModel = new AddServer2ViewModel(profileItem, UpdateViewHandler);
|
||||||
|
|
||||||
cmbCoreType.ItemsSource = Utils.GetEnumNames<ECoreType>().Where(t => t != ECoreType.v2rayN.ToString()).ToList().AppendEmpty();
|
cmbCoreType.ItemsSource = Utils.GetEnumNames<ECoreType>().Where(t => t != nameof(ECoreType.v2rayN)).ToList().AppendEmpty();
|
||||||
|
|
||||||
this.WhenActivated(disposables =>
|
this.WhenActivated(disposables =>
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ public partial class ClashConnectionsView : ReactiveUserControl<ClashConnections
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
List<ColumnItem> lvColumnItem = new();
|
List<ColumnItem> lvColumnItem = [];
|
||||||
foreach (var item2 in lstConnections.Columns)
|
foreach (var item2 in lstConnections.Columns)
|
||||||
{
|
{
|
||||||
if (item2.Tag == null)
|
if (item2.Tag == null)
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ namespace v2rayN.Desktop.Views;
|
|||||||
|
|
||||||
public partial class GlobalHotkeySettingWindow : WindowBase<GlobalHotkeySettingViewModel>
|
public partial class GlobalHotkeySettingWindow : WindowBase<GlobalHotkeySettingViewModel>
|
||||||
{
|
{
|
||||||
private readonly List<object> _textBoxKeyEventItem = new();
|
private readonly List<object> _textBoxKeyEventItem = [];
|
||||||
|
|
||||||
public GlobalHotkeySettingWindow()
|
public GlobalHotkeySettingWindow()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -144,13 +144,13 @@ public partial class MainWindow : WindowBase<MainWindowViewModel>
|
|||||||
AppEvents.ShutdownRequested
|
AppEvents.ShutdownRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(content => Shutdown(content))
|
.Subscribe(Shutdown)
|
||||||
.DisposeWith(disposables);
|
.DisposeWith(disposables);
|
||||||
|
|
||||||
AppEvents.ShowHideWindowRequested
|
AppEvents.ShowHideWindowRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(blShow => ShowHideWindow(blShow))
|
.Subscribe(ShowHideWindow)
|
||||||
.DisposeWith(disposables);
|
.DisposeWith(disposables);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -447,7 +447,7 @@ public partial class ProfilesView : ReactiveUserControl<ProfilesViewModel>
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
List<ColumnItem> lvColumnItem = new();
|
List<ColumnItem> lvColumnItem = [];
|
||||||
foreach (var item2 in lstProfiles.Columns)
|
foreach (var item2 in lstProfiles.Columns)
|
||||||
{
|
{
|
||||||
if (item2.Tag == null)
|
if (item2.Tag == null)
|
||||||
|
|||||||
@@ -47,10 +47,7 @@ public partial class StatusBarView : ReactiveUserControl<StatusBarViewModel>
|
|||||||
switch (action)
|
switch (action)
|
||||||
{
|
{
|
||||||
case EViewAction.DispatcherRefreshIcon:
|
case EViewAction.DispatcherRefreshIcon:
|
||||||
Dispatcher.UIThread.Post(() =>
|
Dispatcher.UIThread.Post(RefreshIcon,
|
||||||
{
|
|
||||||
RefreshIcon();
|
|
||||||
},
|
|
||||||
DispatcherPriority.Default);
|
DispatcherPriority.Default);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ public partial class App : Application
|
|||||||
{
|
{
|
||||||
var exePathKey = Utils.GetMd5(Utils.GetExePath());
|
var exePathKey = Utils.GetMd5(Utils.GetExePath());
|
||||||
|
|
||||||
var rebootas = (e.Args ?? Array.Empty<string>()).Any(t => t == Global.RebootAs);
|
var rebootas = e.Args.Any(t => t == Global.RebootAs);
|
||||||
ProgramStarted = new EventWaitHandle(false, EventResetMode.AutoReset, exePathKey, out var bCreatedNew);
|
ProgramStarted = new EventWaitHandle(false, EventResetMode.AutoReset, exePathKey, out var bCreatedNew);
|
||||||
if (!rebootas && !bCreatedNew)
|
if (!rebootas && !bCreatedNew)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -38,9 +38,7 @@ public class ThemeSettingViewModel : MyReactiveObject
|
|||||||
if (!_config.UiItem.ColorPrimaryName.IsNullOrEmpty())
|
if (!_config.UiItem.ColorPrimaryName.IsNullOrEmpty())
|
||||||
{
|
{
|
||||||
var swatch = new SwatchesProvider().Swatches.FirstOrDefault(t => t.Name == _config.UiItem.ColorPrimaryName);
|
var swatch = new SwatchesProvider().Swatches.FirstOrDefault(t => t.Name == _config.UiItem.ColorPrimaryName);
|
||||||
if (swatch != null
|
if (swatch?.ExemplarHue?.Color is not null)
|
||||||
&& swatch.ExemplarHue != null
|
|
||||||
&& swatch.ExemplarHue?.Color != null)
|
|
||||||
{
|
{
|
||||||
ChangePrimaryColor(swatch.ExemplarHue.Color);
|
ChangePrimaryColor(swatch.ExemplarHue.Color);
|
||||||
}
|
}
|
||||||
@@ -67,7 +65,7 @@ public class ThemeSettingViewModel : MyReactiveObject
|
|||||||
{
|
{
|
||||||
_config.UiItem.CurrentTheme = CurrentTheme;
|
_config.UiItem.CurrentTheme = CurrentTheme;
|
||||||
ModifyTheme();
|
ModifyTheme();
|
||||||
ConfigHandler.SaveConfig(_config);
|
_ = ConfigHandler.SaveConfig(_config);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -87,7 +85,7 @@ public class ThemeSettingViewModel : MyReactiveObject
|
|||||||
{
|
{
|
||||||
_config.UiItem.ColorPrimaryName = SelectedSwatch?.Name;
|
_config.UiItem.ColorPrimaryName = SelectedSwatch?.Name;
|
||||||
ChangePrimaryColor(SelectedSwatch.ExemplarHue.Color);
|
ChangePrimaryColor(SelectedSwatch.ExemplarHue.Color);
|
||||||
ConfigHandler.SaveConfig(_config);
|
_ = ConfigHandler.SaveConfig(_config);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -100,7 +98,7 @@ public class ThemeSettingViewModel : MyReactiveObject
|
|||||||
{
|
{
|
||||||
_config.UiItem.CurrentFontSize = CurrentFontSize;
|
_config.UiItem.CurrentFontSize = CurrentFontSize;
|
||||||
ModifyFontSize();
|
ModifyFontSize();
|
||||||
ConfigHandler.SaveConfig(_config);
|
_ = ConfigHandler.SaveConfig(_config);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -113,7 +111,7 @@ public class ThemeSettingViewModel : MyReactiveObject
|
|||||||
{
|
{
|
||||||
_config.UiItem.CurrentLanguage = CurrentLanguage;
|
_config.UiItem.CurrentLanguage = CurrentLanguage;
|
||||||
Thread.CurrentThread.CurrentUICulture = new(CurrentLanguage);
|
Thread.CurrentThread.CurrentUICulture = new(CurrentLanguage);
|
||||||
ConfigHandler.SaveConfig(_config);
|
_ = ConfigHandler.SaveConfig(_config);
|
||||||
NoticeManager.Instance.Enqueue(ResUI.NeedRebootTips);
|
NoticeManager.Instance.Enqueue(ResUI.NeedRebootTips);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ public partial class AddServer2Window
|
|||||||
Loaded += Window_Loaded;
|
Loaded += Window_Loaded;
|
||||||
ViewModel = new AddServer2ViewModel(profileItem, UpdateViewHandler);
|
ViewModel = new AddServer2ViewModel(profileItem, UpdateViewHandler);
|
||||||
|
|
||||||
cmbCoreType.ItemsSource = Utils.GetEnumNames<ECoreType>().Where(t => t != ECoreType.v2rayN.ToString()).ToList().AppendEmpty();
|
cmbCoreType.ItemsSource = Utils.GetEnumNames<ECoreType>().Where(t => t != nameof(ECoreType.v2rayN)).ToList().AppendEmpty();
|
||||||
|
|
||||||
this.WhenActivated(disposables =>
|
this.WhenActivated(disposables =>
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ public partial class ClashConnectionsView
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
List<ColumnItem> lvColumnItem = new();
|
List<ColumnItem> lvColumnItem = [];
|
||||||
foreach (var col in lstConnections.Columns.Cast<MyDGTextColumn>())
|
foreach (var col in lstConnections.Columns.Cast<MyDGTextColumn>())
|
||||||
{
|
{
|
||||||
var name = col.ExName;
|
var name = col.ExName;
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ namespace v2rayN.Views;
|
|||||||
|
|
||||||
public partial class GlobalHotkeySettingWindow
|
public partial class GlobalHotkeySettingWindow
|
||||||
{
|
{
|
||||||
private readonly List<object> _textBoxKeyEventItem = new();
|
private readonly List<object> _textBoxKeyEventItem = [];
|
||||||
|
|
||||||
public GlobalHotkeySettingWindow()
|
public GlobalHotkeySettingWindow()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -144,13 +144,13 @@ public partial class MainWindow
|
|||||||
AppEvents.ShutdownRequested
|
AppEvents.ShutdownRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(content => Shutdown(content))
|
.Subscribe(Shutdown)
|
||||||
.DisposeWith(disposables);
|
.DisposeWith(disposables);
|
||||||
|
|
||||||
AppEvents.ShowHideWindowRequested
|
AppEvents.ShowHideWindowRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(blShow => ShowHideWindow(blShow))
|
.Subscribe(ShowHideWindow)
|
||||||
.DisposeWith(disposables);
|
.DisposeWith(disposables);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -400,7 +400,7 @@ public partial class ProfilesView
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
List<ColumnItem> lvColumnItem = new();
|
List<ColumnItem> lvColumnItem = [];
|
||||||
foreach (var item2 in lstProfiles.Columns.Cast<MyDGTextColumn>())
|
foreach (var item2 in lstProfiles.Columns.Cast<MyDGTextColumn>())
|
||||||
{
|
{
|
||||||
lvColumnItem.Add(new()
|
lvColumnItem.Add(new()
|
||||||
|
|||||||
Reference in New Issue
Block a user