Code clean (#9482)

This commit is contained in:
DHR60
2026-06-06 03:20:06 +00:00
committed by GitHub
parent 4dc9c60b85
commit e6d08c2db1
58 changed files with 169 additions and 217 deletions
@@ -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));
} }
} }
+1 -1
View File
@@ -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);
} }
} }
+1 -1
View File
@@ -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)
+11 -11
View File
@@ -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();
} }
+1 -1
View File
@@ -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;
} }
+1 -1
View File
@@ -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()}";
} }
} }
+1 -1
View File
@@ -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();
} }
+8 -13
View File
@@ -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; }
+6 -16
View File
@@ -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 };
+6 -2
View File
@@ -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;
+1 -1
View File
@@ -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);
} }
}); });
+1 -1
View File
@@ -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()
{ {
+2 -2
View File
@@ -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);
}); });
+1 -1
View File
@@ -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()