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