Split configuration management by storage type

Move file-backed settings to ConfigTextManager and database operations to ConfigDbManager. Update desktop, Web API, and test references, and add Web API development launch settings.
This commit is contained in:
2dust
2026-11-14 16:47:48 +08:00
parent 18de5da98a
commit f64c29972d
87 changed files with 622 additions and 531 deletions
+1
View File
@@ -23,6 +23,7 @@ global using ServiceLib.Handler.Fmt;
global using ServiceLib.Handler.SysProxy; global using ServiceLib.Handler.SysProxy;
global using ServiceLib.Helper; global using ServiceLib.Helper;
global using ServiceLib.Manager; global using ServiceLib.Manager;
global using ServiceLib.Manager.Data;
global using ServiceLib.Models.CoreConfigs; global using ServiceLib.Models.CoreConfigs;
global using ServiceLib.Models.Configs; global using ServiceLib.Models.Configs;
global using ServiceLib.Models.Dto; global using ServiceLib.Models.Dto;
@@ -1,3 +1,4 @@
using ServiceLib.Tests.CoreConfig; using ServiceLib.Tests.CoreConfig;
namespace ServiceLib.Tests.Handler; namespace ServiceLib.Tests.Handler;
@@ -31,7 +32,7 @@ public class ConfigHandlerCustomSubscriptionTests
oldProfile.IsSub = true; oldProfile.IsSub = true;
await SQLiteHelper.Instance.InsertAsync(oldProfile); await SQLiteHelper.Instance.InsertAsync(oldProfile);
var count = await ConfigHandler.AddBatchServers(config, FullXrayConfigs, subId, true); var count = await ConfigDbManager.AddBatchServers(config, FullXrayConfigs, subId, true);
var profiles = await AppManager.Instance.ProfileItems(subId) ?? []; var profiles = await AppManager.Instance.ProfileItems(subId) ?? [];
await count.Should().BeEqualTo(2); await count.Should().BeEqualTo(2);
@@ -65,7 +66,7 @@ public class ConfigHandlerCustomSubscriptionTests
await SQLiteHelper.Instance.InsertAsync(existing); await SQLiteHelper.Instance.InsertAsync(existing);
var invalidSubscription = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes("not a valid profile")); var invalidSubscription = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes("not a valid profile"));
var count = await ConfigHandler.AddBatchServers(config, invalidSubscription, subId, true); var count = await ConfigDbManager.AddBatchServers(config, invalidSubscription, subId, true);
var profiles = await AppManager.Instance.ProfileItems(subId) ?? []; var profiles = await AppManager.Instance.ProfileItems(subId) ?? [];
await (count < 1).Should().BeTrue(); await (count < 1).Should().BeTrue();
+1
View File
@@ -33,6 +33,7 @@ global using ServiceLib.Handler.Fmt;
global using ServiceLib.Handler.SysProxy; global using ServiceLib.Handler.SysProxy;
global using ServiceLib.Helper; global using ServiceLib.Helper;
global using ServiceLib.Manager; global using ServiceLib.Manager;
global using ServiceLib.Manager.Data;
global using ServiceLib.Models.Configs; global using ServiceLib.Models.Configs;
global using ServiceLib.Models.CoreConfigs; global using ServiceLib.Models.CoreConfigs;
global using ServiceLib.Models.Dto; global using ServiceLib.Models.Dto;
@@ -46,7 +46,7 @@ public class CoreConfigContextBuilder
SimpleDnsItem = config.SimpleDNSItem, SimpleDnsItem = config.SimpleDNSItem,
ProtectDomainList = [], ProtectDomainList = [],
RawDnsItem = await AppManager.Instance.GetDNSItem(coreType), RawDnsItem = await AppManager.Instance.GetDNSItem(coreType),
RoutingItem = await ConfigHandler.GetDefaultRouting(config), RoutingItem = await ConfigDbManager.GetDefaultRouting(config),
IsWindows = Utils.IsWindows(), IsWindows = Utils.IsWindows(),
IsMacOS = Utils.IsMacOS(), IsMacOS = Utils.IsMacOS(),
IsLinux = Utils.IsLinux(), IsLinux = Utils.IsLinux(),
@@ -204,7 +204,7 @@ public class CoreConfigContextBuilder
var node = nodeContext.Node; var node = nodeContext.Node;
var coreType = AppManager.Instance.GetCoreType(node, node.ConfigType); var coreType = AppManager.Instance.GetCoreType(node, node.ConfigType);
var preSocksItem = ConfigHandler.GetPreSocksItem(config, node, coreType); var preSocksItem = ConfigDbManager.GetPreSocksItem(config, node, coreType);
if (preSocksItem != null) if (preSocksItem != null)
{ {
var preSocksResult = await Build(nodeContext.AppConfig, preSocksItem); var preSocksResult = await Build(nodeContext.AppConfig, preSocksItem);
@@ -79,7 +79,7 @@ public static class ConnectionHandler
public static async Task<int> GetRealPingTime(HttpClient client, CancellationToken cancellationToken = default) public static async Task<int> GetRealPingTime(HttpClient client, CancellationToken cancellationToken = default)
{ {
var url = AppManager.Instance.Config.SpeedTestItem.SpeedPingTestUrl; var url = ConfigTextManager.Instance.Config.SpeedTestItem.SpeedPingTestUrl;
var responseTime = -1; var responseTime = -1;
try try
{ {
@@ -114,7 +114,7 @@ public static class ConnectionHandler
{ {
try try
{ {
var url = AppManager.Instance.Config.SpeedTestItem.IPAPIUrl; var url = ConfigTextManager.Instance.Config.SpeedTestItem.IPAPIUrl;
if (url.IsNullOrEmpty()) if (url.IsNullOrEmpty())
{ {
return null; return null;
@@ -9,7 +9,7 @@ public static class CoreConfigHandler
public static async Task<RetResult> GenerateClientConfig(CoreConfigContext context, string? fileName) public static async Task<RetResult> GenerateClientConfig(CoreConfigContext context, string? fileName)
{ {
var config = AppManager.Instance.Config; var config = ConfigTextManager.Instance.Config;
var result = new RetResult(); var result = new RetResult();
var node = context.Node; var node = context.Node;
@@ -1,3 +1,5 @@
namespace ServiceLib.Handler; namespace ServiceLib.Handler;
public class SubscriptionHandler( public class SubscriptionHandler(
@@ -104,7 +106,7 @@ public class SubscriptionHandler(
await updateFunc?.Invoke(false, $"{hashCode}{ResUI.MsgStartParsingSubscription}"); await updateFunc?.Invoke(false, $"{hashCode}{ResUI.MsgStartParsingSubscription}");
// Add servers to configuration // Add servers to configuration
var ret = await ConfigHandler.AddBatchServers(_config, result, id, true); var ret = await ConfigDbManager.AddBatchServers(_config, result, id, true);
if (ret <= 0) if (ret <= 0)
{ {
Logging.SaveLog("FailedImportSubscription"); Logging.SaveLog("FailedImportSubscription");
@@ -19,7 +19,7 @@ public static class ProxySettingLinux
private static async Task ExecCmd(List<string> args) private static async Task ExecCmd(List<string> args)
{ {
var customSystemProxyScriptPath = AppManager.Instance.Config.SystemProxyItem?.CustomSystemProxyScriptPath; var customSystemProxyScriptPath = ConfigTextManager.Instance.Config.SystemProxyItem?.CustomSystemProxyScriptPath;
var fileName = (customSystemProxyScriptPath.IsNotEmpty() && File.Exists(customSystemProxyScriptPath)) var fileName = (customSystemProxyScriptPath.IsNotEmpty() && File.Exists(customSystemProxyScriptPath))
? customSystemProxyScriptPath ? customSystemProxyScriptPath
: await FileUtils.CreateLinuxShellFile(_proxySetFileName, EmbedUtils.GetEmbedText(Global.ProxySetLinuxShellFileName), false); : await FileUtils.CreateLinuxShellFile(_proxySetFileName, EmbedUtils.GetEmbedText(Global.ProxySetLinuxShellFileName), false);
@@ -24,7 +24,7 @@ public static class ProxySettingOSX
private static async Task ExecCmd(List<string> args) private static async Task ExecCmd(List<string> args)
{ {
var customSystemProxyScriptPath = AppManager.Instance.Config.SystemProxyItem?.CustomSystemProxyScriptPath; var customSystemProxyScriptPath = ConfigTextManager.Instance.Config.SystemProxyItem?.CustomSystemProxyScriptPath;
var fileName = (customSystemProxyScriptPath.IsNotEmpty() && File.Exists(customSystemProxyScriptPath)) var fileName = (customSystemProxyScriptPath.IsNotEmpty() && File.Exists(customSystemProxyScriptPath))
? customSystemProxyScriptPath ? customSystemProxyScriptPath
: await FileUtils.CreateLinuxShellFile(_proxySetFileName, EmbedUtils.GetEmbedText(Global.ProxySetOSXShellFileName), false); : await FileUtils.CreateLinuxShellFile(_proxySetFileName, EmbedUtils.GetEmbedText(Global.ProxySetOSXShellFileName), false);
+2 -3
View File
@@ -9,7 +9,6 @@ public sealed class AppManager
private int? _statePort; private int? _statePort;
private int? _statePort2; private int? _statePort2;
public static AppManager Instance => _instance.Value; public static AppManager Instance => _instance.Value;
public Config Config => _config;
public IWindowDialog WindowDialog { get; set; } = null!; public IWindowDialog WindowDialog { get; set; } = null!;
public int StatePort public int StatePort
@@ -68,7 +67,7 @@ public sealed class AppManager
} }
Logging.Setup(); Logging.Setup();
var config = ConfigHandler.LoadConfig(); var config = ConfigTextManager.Instance.Init();
if (config == null) if (config == null)
{ {
return false; return false;
@@ -129,7 +128,7 @@ public sealed class AppManager
AppEvents.AppExitRequested.Publish(); AppEvents.AppExitRequested.Publish();
await Task.Delay(50); //Wait for AppExitRequested to be processed await Task.Delay(50); //Wait for AppExitRequested to be processed
await ConfigHandler.SaveConfig(_config); await ConfigTextManager.Instance.SaveConfig();
await ProfileExManager.Instance.SaveTo(); await ProfileExManager.Instance.SaveTo();
await StatisticsManager.Instance.SaveTo(); await StatisticsManager.Instance.SaveTo();
await CoreManager.Instance.CoreStop(); await CoreManager.Instance.CoreStop();
+2 -2
View File
@@ -82,7 +82,7 @@ public sealed class ClashApiManager
private async Task<int> TestProxyDelay(string name) private async Task<int> TestProxyDelay(string name)
{ {
var url = $"{ApiUrl}/proxies/{Utils.UrlEncode(name)}/delay?timeout=10000&url=" + var url = $"{ApiUrl}/proxies/{Utils.UrlEncode(name)}/delay?timeout=10000&url=" +
Utils.UrlEncode(AppManager.Instance.Config.SpeedTestItem.SpeedPingTestUrl); Utils.UrlEncode(ConfigTextManager.Instance.Config.SpeedTestItem.SpeedPingTestUrl);
return await SendTestRequest(url); return await SendTestRequest(url);
} }
@@ -90,7 +90,7 @@ public sealed class ClashApiManager
{ {
var url = var url =
$"{ApiUrl}/providers/proxies/{Utils.UrlEncode(providerName)}/{Utils.UrlEncode(name)}/healthcheck?timeout=10000&url=" + $"{ApiUrl}/providers/proxies/{Utils.UrlEncode(providerName)}/{Utils.UrlEncode(name)}/healthcheck?timeout=10000&url=" +
Utils.UrlEncode(AppManager.Instance.Config.SpeedTestItem.SpeedPingTestUrl); Utils.UrlEncode(ConfigTextManager.Instance.Config.SpeedTestItem.SpeedPingTestUrl);
return await SendTestRequest(url); return await SendTestRequest(url);
} }
@@ -1,251 +1,14 @@
namespace ServiceLib.Handler; namespace ServiceLib.Manager.Data;
public static class ConfigHandler public static class ConfigDbManager
{ {
private static readonly string _configRes = Global.ConfigFileName; private static readonly string _tag = "ConfigDbManager";
private static readonly string _tag = "ConfigHandler";
#region ConfigHandler private static async Task<int> SaveConfig()
/// <summary>
/// Load the application configuration file
/// If the file exists, deserialize it from JSON
/// If not found, create a new Config object with default settings
/// Initialize default values for missing configuration sections
/// </summary>
/// <returns>Config object containing application settings or null if there's an error</returns>
public static Config? LoadConfig()
{ {
Config? config = null; return await ConfigTextManager.Instance.SaveConfig();
var result = EmbedUtils.LoadResource(Utils.GetConfigPath(_configRes));
if (result.IsNotEmpty())
{
config = JsonUtils.Deserialize<Config>(result);
}
else
{
if (File.Exists(Utils.GetConfigPath(_configRes)))
{
Logging.SaveLog("LoadConfig Exception");
return null;
}
}
config ??= new Config();
config.CoreBasicItem ??= new()
{
LogEnabled = false,
Loglevel = "warning",
};
if (config.Inbound == null)
{
config.Inbound = [];
InItem inItem = new()
{
Protocol = nameof(EInboundProtocol.socks),
LocalPort = 10808,
UdpEnabled = true,
SniffingEnabled = true,
RouteOnly = false,
};
config.Inbound.Add(inItem);
}
else
{
if (config.Inbound.Count > 0)
{
config.Inbound.First().Protocol = nameof(EInboundProtocol.socks);
}
}
config.RoutingBasicItem ??= new();
if (config.RoutingBasicItem.DomainStrategy.IsNullOrEmpty())
{
config.RoutingBasicItem.DomainStrategy = Global.DomainStrategies.First();
}
config.KcpItem ??= new KcpItem
{
Mtu = 1350,
Tti = 50,
UplinkCapacity = 12,
DownlinkCapacity = 100,
CwndMultiplier = 1,
MaxSendingWindow = 2 * 1024 * 1024,
};
config.KcpItem.CwndMultiplier = config.KcpItem.CwndMultiplier <= 0 ? 1 : config.KcpItem.CwndMultiplier;
config.KcpItem.MaxSendingWindow = config.KcpItem.MaxSendingWindow <= 0 ? (2 * 1024 * 1024) : config.KcpItem.MaxSendingWindow;
config.GrpcItem ??= new GrpcItem
{
IdleTimeout = 60,
HealthCheckTimeout = 20,
PermitWithoutStream = false,
InitialWindowsSize = 0,
};
config.TunModeItem ??= new TunModeItem
{
EnableTun = false,
Mtu = 9000,
IcmpRouting = Global.TunIcmpRoutingPolicies.First(),
EnableLegacyProtect = true,
};
config.GuiItem ??= new();
if (!Global.RootCertProviders.Contains(config.GuiItem.RootCertProvider))
{
config.GuiItem.RootCertProvider = Global.RootCertProviders.First();
}
config.MsgUIItem ??= new();
config.UiItem ??= new();
config.UiItem.MainColumnItem ??= [];
config.UiItem.WindowSizeItem ??= [];
if (config.UiItem.FrozenColumnCount == null)
{
var lvColumnItem = config.UiItem.MainColumnItem.OrderBy(t => t.Index).ToList();
if (lvColumnItem.Count == 0
|| (lvColumnItem.Count >= 2
&& lvColumnItem[0].Name.Equals("ConfigType")
&& lvColumnItem[1].Name.Equals("Remarks")))
{
config.UiItem.FrozenColumnCount = 2;
}
else
{
config.UiItem.FrozenColumnCount = 0;
}
}
if (config.UiItem.CurrentLanguage.IsNullOrEmpty())
{
config.UiItem.CurrentLanguage = Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName.Equals("zh", StringComparison.CurrentCultureIgnoreCase)
? Global.Languages.First()
: Global.Languages[2];
}
config.ConstItem ??= new ConstItem();
config.SimpleDNSItem ??= InitBuiltinSimpleDNS();
config.SimpleDNSItem.BlockAAAAQuery ??= false;
config.SimpleDNSItem.FakeIPRange ??= Global.FakeIPRanges.FirstOrDefault();
config.SimpleDNSItem.FakeIPv6 ??= false;
config.SimpleDNSItem.FakeIPv6Range ??= Global.FakeIPv6Ranges.First();
config.SimpleDNSItem.GlobalFakeIp ??= true;
config.SimpleDNSItem.BootstrapDNS ??= Global.DomainPureIPDNSAddress.FirstOrDefault();
config.SimpleDNSItem.ServeStale ??= false;
config.SimpleDNSItem.ParallelQuery ??= false;
config.SimpleDNSItem.EnableHappyEyeballs ??= false;
config.SpeedTestItem ??= new();
if (config.SpeedTestItem.SpeedTestTimeout < 10)
{
config.SpeedTestItem.SpeedTestTimeout = 10;
}
if (config.SpeedTestItem.SpeedTestUrl.IsNullOrEmpty())
{
config.SpeedTestItem.SpeedTestUrl = Global.SpeedTestUrls.First();
}
if (config.SpeedTestItem.SpeedPingTestUrl.IsNullOrEmpty())
{
config.SpeedTestItem.SpeedPingTestUrl = Global.SpeedPingTestUrls.First();
}
config.SpeedTestItem.MixedConcurrencyCount = Math.Max(config.SpeedTestItem.MixedConcurrencyCount, Global.SpeedTestConcurrencyCountMin);
if (config.SpeedTestItem.UdpTestTarget.IsNullOrEmpty())
{
config.SpeedTestItem.UdpTestTarget = Global.UdpTestTargets.First();
}
config.Mux4RayItem ??= new()
{
Concurrency = 8,
XudpConcurrency = 16,
XudpProxyUDP443 = "reject"
};
config.Mux4SboxItem ??= new()
{
Protocol = Global.SingboxMuxs.First(),
MaxConnections = 8
};
config.HysteriaItem ??= new()
{
UpMbps = 100,
DownMbps = 100
};
config.ClashUIItem ??= new();
config.ClashUIItem.ConnectionsColumnItem ??= [];
config.SystemProxyItem ??= new();
config.WebDavItem ??= new();
config.CheckUpdateItem ??= new();
config.Fragment4RayItem ??= new()
{
Packets = "tlshello",
};
config.Fragment4RayItem.MaxSplit ??= "0";
config.HappyEyeballs4RayItem ??= new()
{
TryDelayMs = 250,
PrioritizeIPv6 = false,
Interleave = 1,
MaxConcurrentTry = 4,
};
if ((config.Fragment4RayItem.Lengths ?? []).Count == 0)
{
config.Fragment4RayItem.Lengths = [config.Fragment4RayItem.Length ?? "50-100"];
}
if ((config.Fragment4RayItem.Delays ?? []).Count == 0)
{
config.Fragment4RayItem.Delays = [config.Fragment4RayItem.Interval ?? "10-20"];
}
config.GlobalHotkeys ??= [];
if (config.SystemProxyItem.SystemProxyExceptions.IsNullOrEmpty())
{
config.SystemProxyItem.SystemProxyExceptions = Utils.IsWindows() ? Global.SystemProxyExceptionsWindows : Global.SystemProxyExceptionsLinux;
}
return config;
} }
/// <summary>
/// Save the configuration to a file
/// First writes to a temporary file, then replaces the original file
/// </summary>
/// <param name="config">Configuration object to be saved</param>
/// <returns>0 if successful, -1 if failed</returns>
public static async Task<int> SaveConfig(Config config)
{
try
{
//save temp file
var resPath = Utils.GetConfigPath(_configRes);
var tempPath = $"{resPath}_temp";
var content = JsonUtils.Serialize(config, true, true);
if (content.IsNullOrEmpty())
{
return -1;
}
await File.WriteAllTextAsync(tempPath, content);
//rename
File.Move(tempPath, resPath, true);
}
catch (Exception ex)
{
Logging.SaveLog(_tag, ex);
return -1;
}
return 0;
}
#endregion ConfigHandler
#region Server #region Server
/// <summary> /// <summary>
@@ -428,7 +191,7 @@ public static class ConfigHandler
config.IndexId = indexId; config.IndexId = indexId;
await SaveConfig(config); await SaveConfig();
return 0; return 0;
} }
@@ -1816,7 +1579,7 @@ public static class ConfigHandler
await SQLiteHelper.Instance.InsertAllAsync(lstAdd); await SQLiteHelper.Instance.InsertAllAsync(lstAdd);
} }
await SaveConfig(config); await SaveConfig();
return countServers; return countServers;
} }
@@ -2056,7 +1819,7 @@ public static class ConfigHandler
counter++; counter++;
} }
} }
await SaveConfig(config); await SaveConfig();
return counter; return counter;
} }
@@ -2087,7 +1850,7 @@ public static class ConfigHandler
counter++; counter++;
} }
} }
await SaveConfig(config); await SaveConfig();
return counter; return counter;
} }
return -1; return -1;
@@ -2137,7 +1900,7 @@ public static class ConfigHandler
{ {
await SQLiteHelper.Instance.InsertAllAsync(lstAdd); await SQLiteHelper.Instance.InsertAllAsync(lstAdd);
} }
await SaveConfig(config); await SaveConfig();
return counter; return counter;
} }
@@ -2236,7 +1999,7 @@ public static class ConfigHandler
var existItem = FindMatchedProfileItem(lstSub, activeProfile); var existItem = FindMatchedProfileItem(lstSub, activeProfile);
if (existItem != null) if (existItem != null)
{ {
await ConfigHandler.SetDefaultServerIndex(config, existItem.IndexId); await ConfigDbManager.SetDefaultServerIndex(config, existItem.IndexId);
} }
} }
@@ -2729,7 +2492,7 @@ public static class ConfigHandler
var lockItem = items?.FirstOrDefault(t => t.Locked == true); var lockItem = items?.FirstOrDefault(t => t.Locked == true);
if (lockItem != null) if (lockItem != null)
{ {
await ConfigHandler.RemoveRoutingItem(lockItem); await ConfigDbManager.RemoveRoutingItem(lockItem);
items = await AppManager.Instance.RoutingItems(); items = await AppManager.Instance.RoutingItems();
} }
@@ -3077,44 +2840,4 @@ public static class ConfigHandler
} }
#endregion Regional Presets #endregion Regional Presets
#region UIItem
public static WindowSizeItem? GetWindowSizeItem(Config config, string typeName)
{
var sizeItem = config?.UiItem?.WindowSizeItem?.FirstOrDefault(t => t.TypeName == typeName);
if (sizeItem == null || sizeItem.Width <= 0 || sizeItem.Height <= 0)
{
return null;
}
return sizeItem;
}
public static int SaveWindowSizeItem(Config config, string typeName, double width, double height)
{
var sizeItem = config?.UiItem?.WindowSizeItem?.FirstOrDefault(t => t.TypeName == typeName);
if (sizeItem == null)
{
sizeItem = new WindowSizeItem { TypeName = typeName };
config.UiItem.WindowSizeItem.Add(sizeItem);
}
sizeItem.Width = (int)width;
sizeItem.Height = (int)height;
return 0;
}
public static int SaveMainGirdHeight(Config config, double height1, double height2)
{
var uiItem = config.UiItem ?? new();
uiItem.MainGirdHeight1 = (int)(height1 + 0.1);
uiItem.MainGirdHeight2 = (int)(height2 + 0.1);
return 0;
}
#endregion UIItem
} }
@@ -0,0 +1,299 @@
namespace ServiceLib.Manager.Data;
public class ConfigTextManager
{
private static readonly Lazy<ConfigTextManager> _instance = new(() => new());
public static ConfigTextManager Instance => _instance.Value;
private static readonly string _configRes = Global.ConfigFileName;
private static readonly string _tag = "ConfigTextManager";
public Config Config { get; private set; }
#region Init
public Config? Init()
{
Config = LoadConfig();
return Config;
}
/// <summary>
/// Load the application configuration file
/// If the file exists, deserialize it from JSON
/// If not found, create a new Config object with default settings
/// Initialize default values for missing configuration sections
/// </summary>
/// <returns>Config object containing application settings or null if there's an error</returns>
private Config? LoadConfig()
{
Config? config = null;
var result = EmbedUtils.LoadResource(Utils.GetConfigPath(_configRes));
if (result.IsNotEmpty())
{
config = JsonUtils.Deserialize<Config>(result);
}
else
{
if (File.Exists(Utils.GetConfigPath(_configRes)))
{
Logging.SaveLog("LoadConfig Exception");
return null;
}
}
config ??= new Config();
config.CoreBasicItem ??= new()
{
LogEnabled = false,
Loglevel = "warning",
};
if (config.Inbound == null)
{
config.Inbound = [];
InItem inItem = new()
{
Protocol = nameof(EInboundProtocol.socks),
LocalPort = 10808,
UdpEnabled = true,
SniffingEnabled = true,
RouteOnly = false,
};
config.Inbound.Add(inItem);
}
else
{
if (config.Inbound.Count > 0)
{
config.Inbound.First().Protocol = nameof(EInboundProtocol.socks);
}
}
config.RoutingBasicItem ??= new();
if (config.RoutingBasicItem.DomainStrategy.IsNullOrEmpty())
{
config.RoutingBasicItem.DomainStrategy = Global.DomainStrategies.First();
}
config.KcpItem ??= new KcpItem
{
Mtu = 1350,
Tti = 50,
UplinkCapacity = 12,
DownlinkCapacity = 100,
CwndMultiplier = 1,
MaxSendingWindow = 2 * 1024 * 1024,
};
config.KcpItem.CwndMultiplier = config.KcpItem.CwndMultiplier <= 0 ? 1 : config.KcpItem.CwndMultiplier;
config.KcpItem.MaxSendingWindow = config.KcpItem.MaxSendingWindow <= 0 ? (2 * 1024 * 1024) : config.KcpItem.MaxSendingWindow;
config.GrpcItem ??= new GrpcItem
{
IdleTimeout = 60,
HealthCheckTimeout = 20,
PermitWithoutStream = false,
InitialWindowsSize = 0,
};
config.TunModeItem ??= new TunModeItem
{
EnableTun = false,
Mtu = 9000,
IcmpRouting = Global.TunIcmpRoutingPolicies.First(),
EnableLegacyProtect = true,
};
config.GuiItem ??= new();
if (!Global.RootCertProviders.Contains(config.GuiItem.RootCertProvider))
{
config.GuiItem.RootCertProvider = Global.RootCertProviders.First();
}
config.MsgUIItem ??= new();
config.UiItem ??= new();
config.UiItem.MainColumnItem ??= [];
config.UiItem.WindowSizeItem ??= [];
if (config.UiItem.FrozenColumnCount == null)
{
var lvColumnItem = config.UiItem.MainColumnItem.OrderBy(t => t.Index).ToList();
if (lvColumnItem.Count == 0
|| (lvColumnItem.Count >= 2
&& lvColumnItem[0].Name.Equals("ConfigType")
&& lvColumnItem[1].Name.Equals("Remarks")))
{
config.UiItem.FrozenColumnCount = 2;
}
else
{
config.UiItem.FrozenColumnCount = 0;
}
}
if (config.UiItem.CurrentLanguage.IsNullOrEmpty())
{
config.UiItem.CurrentLanguage = Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName.Equals("zh", StringComparison.CurrentCultureIgnoreCase)
? Global.Languages.First()
: Global.Languages[2];
}
config.ConstItem ??= new ConstItem();
config.SimpleDNSItem ??= ConfigDbManager.InitBuiltinSimpleDNS();
config.SimpleDNSItem.BlockAAAAQuery ??= false;
config.SimpleDNSItem.FakeIPRange ??= Global.FakeIPRanges.FirstOrDefault();
config.SimpleDNSItem.FakeIPv6 ??= false;
config.SimpleDNSItem.FakeIPv6Range ??= Global.FakeIPv6Ranges.First();
config.SimpleDNSItem.GlobalFakeIp ??= true;
config.SimpleDNSItem.BootstrapDNS ??= Global.DomainPureIPDNSAddress.FirstOrDefault();
config.SimpleDNSItem.ServeStale ??= false;
config.SimpleDNSItem.ParallelQuery ??= false;
config.SimpleDNSItem.EnableHappyEyeballs ??= false;
config.SpeedTestItem ??= new();
if (config.SpeedTestItem.SpeedTestTimeout < 10)
{
config.SpeedTestItem.SpeedTestTimeout = 10;
}
if (config.SpeedTestItem.SpeedTestUrl.IsNullOrEmpty())
{
config.SpeedTestItem.SpeedTestUrl = Global.SpeedTestUrls.First();
}
if (config.SpeedTestItem.SpeedPingTestUrl.IsNullOrEmpty())
{
config.SpeedTestItem.SpeedPingTestUrl = Global.SpeedPingTestUrls.First();
}
config.SpeedTestItem.MixedConcurrencyCount = Math.Max(config.SpeedTestItem.MixedConcurrencyCount, Global.SpeedTestConcurrencyCountMin);
if (config.SpeedTestItem.UdpTestTarget.IsNullOrEmpty())
{
config.SpeedTestItem.UdpTestTarget = Global.UdpTestTargets.First();
}
config.Mux4RayItem ??= new()
{
Concurrency = 8,
XudpConcurrency = 16,
XudpProxyUDP443 = "reject"
};
config.Mux4SboxItem ??= new()
{
Protocol = Global.SingboxMuxs.First(),
MaxConnections = 8
};
config.HysteriaItem ??= new()
{
UpMbps = 100,
DownMbps = 100
};
config.ClashUIItem ??= new();
config.ClashUIItem.ConnectionsColumnItem ??= [];
config.SystemProxyItem ??= new();
config.WebDavItem ??= new();
config.CheckUpdateItem ??= new();
config.Fragment4RayItem ??= new()
{
Packets = "tlshello",
};
config.Fragment4RayItem.MaxSplit ??= "0";
config.HappyEyeballs4RayItem ??= new()
{
TryDelayMs = 250,
PrioritizeIPv6 = false,
Interleave = 1,
MaxConcurrentTry = 4,
};
if ((config.Fragment4RayItem.Lengths ?? []).Count == 0)
{
config.Fragment4RayItem.Lengths = [config.Fragment4RayItem.Length ?? "50-100"];
}
if ((config.Fragment4RayItem.Delays ?? []).Count == 0)
{
config.Fragment4RayItem.Delays = [config.Fragment4RayItem.Interval ?? "10-20"];
}
config.GlobalHotkeys ??= [];
if (config.SystemProxyItem.SystemProxyExceptions.IsNullOrEmpty())
{
config.SystemProxyItem.SystemProxyExceptions = Utils.IsWindows() ? Global.SystemProxyExceptionsWindows : Global.SystemProxyExceptionsLinux;
}
return config;
}
/// <summary>
/// Save the configuration to a file
/// First writes to a temporary file, then replaces the original file
/// </summary>
/// <param name="_config">Configuration object to be saved</param>
/// <returns>0 if successful, -1 if failed</returns>
public async Task<int> SaveConfig()
{
try
{
//save temp file
var resPath = Utils.GetConfigPath(_configRes);
var tempPath = $"{resPath}_temp";
var content = JsonUtils.Serialize(Config, true, true);
if (content.IsNullOrEmpty())
{
return -1;
}
await File.WriteAllTextAsync(tempPath, content);
//rename
File.Move(tempPath, resPath, true);
}
catch (Exception ex)
{
Logging.SaveLog(_tag, ex);
return -1;
}
return 0;
}
#endregion Init
#region UIItem
public static WindowSizeItem? GetWindowSizeItem(Config config, string typeName)
{
var sizeItem = config?.UiItem?.WindowSizeItem?.FirstOrDefault(t => t.TypeName == typeName);
if (sizeItem == null || sizeItem.Width <= 0 || sizeItem.Height <= 0)
{
return null;
}
return sizeItem;
}
public static int SaveWindowSizeItem(Config config, string typeName, double width, double height)
{
var sizeItem = config?.UiItem?.WindowSizeItem?.FirstOrDefault(t => t.TypeName == typeName);
if (sizeItem == null)
{
sizeItem = new WindowSizeItem { TypeName = typeName };
config.UiItem.WindowSizeItem.Add(sizeItem);
}
sizeItem.Width = (int)width;
sizeItem.Height = (int)height;
return 0;
}
public static int SaveMainGirdHeight(Config config, double height1, double height2)
{
var uiItem = config.UiItem ?? new();
uiItem.MainGirdHeight1 = (int)(height1 + 0.1);
uiItem.MainGirdHeight2 = (int)(height2 + 0.1);
return 0;
}
#endregion UIItem
}
@@ -1,4 +1,4 @@
namespace ServiceLib.Manager; namespace ServiceLib.Manager.Data;
public class ProfileExManager public class ProfileExManager
{ {
+1 -1
View File
@@ -31,7 +31,7 @@ public class PacManager
private async Task<byte[]> InitText(int httpPort) private async Task<byte[]> InitText(int httpPort)
{ {
var customSystemProxyPacPath = AppManager.Instance.Config.SystemProxyItem.CustomSystemProxyPacPath; var customSystemProxyPacPath = ConfigTextManager.Instance.Config.SystemProxyItem.CustomSystemProxyPacPath;
var fileName = customSystemProxyPacPath.IsNotEmpty() && File.Exists(customSystemProxyPacPath) var fileName = customSystemProxyPacPath.IsNotEmpty() && File.Exists(customSystemProxyPacPath)
? customSystemProxyPacPath ? customSystemProxyPacPath
: Path.Combine(Utils.GetConfigPath(), "pac.txt"); : Path.Combine(Utils.GetConfigPath(), "pac.txt");
+4 -2
View File
@@ -1,3 +1,5 @@
namespace ServiceLib.Manager; namespace ServiceLib.Manager;
public class TaskManager public class TaskManager
@@ -40,7 +42,7 @@ public class TaskManager
try try
{ {
await ConfigHandler.SaveConfig(_config); await ConfigTextManager.Instance.SaveConfig();
await ProfileExManager.Instance.SaveTo(); await ProfileExManager.Instance.SaveTo();
} }
catch (Exception ex) catch (Exception ex)
@@ -111,7 +113,7 @@ public class TaskManager
}); });
await handler.UpdateProcess(item.Id); await handler.UpdateProcess(item.Id);
item.UpdateTime = updateTime; item.UpdateTime = updateTime;
await ConfigHandler.AddSubItem(_config, item); await ConfigDbManager.AddSubItem(_config, item);
await Task.Delay(1000); await Task.Delay(1000);
} }
} }
+1 -1
View File
@@ -16,7 +16,7 @@ public sealed class WebDavManager
public WebDavManager() public WebDavManager()
{ {
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
} }
private async Task<bool> GetClient() private async Task<bool> GetClient()
@@ -47,7 +47,7 @@ public partial class CoreConfigV2rayService
subjectSelector = [baseTagName], subjectSelector = [baseTagName],
pingConfig = new() pingConfig = new()
{ {
destination = AppManager.Instance.Config.SpeedTestItem.SpeedPingTestUrl, destination = ConfigTextManager.Instance.Config.SpeedTestItem.SpeedPingTestUrl,
interval = "5m", interval = "5m",
timeout = "30s", timeout = "30s",
sampling = 2, sampling = 2,
@@ -68,7 +68,7 @@ public partial class CoreConfigV2rayService
_coreConfig.observatory = new Observatory4Ray _coreConfig.observatory = new Observatory4Ray
{ {
subjectSelector = [baseTagName], subjectSelector = [baseTagName],
probeUrl = AppManager.Instance.Config.SpeedTestItem.SpeedPingTestUrl, probeUrl = ConfigTextManager.Instance.Config.SpeedTestItem.SpeedPingTestUrl,
probeInterval = "3m", probeInterval = "3m",
enableConcurrency = true, enableConcurrency = true,
}; };
@@ -43,7 +43,7 @@ public partial class AddGroupServerViewModel : MyReactiveObject, ICloseable
public AddGroupServerViewModel(ProfileItem profileItem) public AddGroupServerViewModel(ProfileItem profileItem)
{ {
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
var canEditRemove = this.WhenAnyValue( var canEditRemove = this.WhenAnyValue(
x => x.SelectedChild, x => x.SelectedChild,
@@ -245,7 +245,7 @@ public partial class AddGroupServerViewModel : MyReactiveObject, ICloseable
SelectedSource.SetProtocolExtra(protocolExtra); SelectedSource.SetProtocolExtra(protocolExtra);
if (await ConfigHandler.AddServerCommon(_config, SelectedSource) == 0) if (await ConfigDbManager.AddServerCommon(_config, SelectedSource) == 0)
{ {
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess); NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
RequestClose?.Invoke(this, EventArgs.Empty); RequestClose?.Invoke(this, EventArgs.Empty);
@@ -1,3 +1,5 @@
namespace ServiceLib.ViewModels; namespace ServiceLib.ViewModels;
public partial class AddServer2ViewModel : MyReactiveObject, ICloseable public partial class AddServer2ViewModel : MyReactiveObject, ICloseable
@@ -22,7 +24,7 @@ public partial class AddServer2ViewModel : MyReactiveObject, ICloseable
public AddServer2ViewModel(ProfileItem profileItem) public AddServer2ViewModel(ProfileItem profileItem)
{ {
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
BrowseServerCmd = ReactiveCommand.CreateFromTask(async () => BrowseServerCmd = ReactiveCommand.CreateFromTask(async () =>
{ {
@@ -69,7 +71,7 @@ public partial class AddServer2ViewModel : MyReactiveObject, ICloseable
IsSingboxEndpoint = IsSingboxEndpoint ? true : null, IsSingboxEndpoint = IsSingboxEndpoint ? true : null,
}); });
if (await ConfigHandler.EditCustomServer(_config, SelectedSource) == 0) if (await ConfigDbManager.EditCustomServer(_config, SelectedSource) == 0)
{ {
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess); NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
RequestClose?.Invoke(this, EventArgs.Empty); RequestClose?.Invoke(this, EventArgs.Empty);
@@ -90,7 +92,7 @@ public partial class AddServer2ViewModel : MyReactiveObject, ICloseable
var item = await AppManager.Instance.GetProfileItem(SelectedSource.IndexId); var item = await AppManager.Instance.GetProfileItem(SelectedSource.IndexId);
item ??= SelectedSource; item ??= SelectedSource;
item.Address = fileName; item.Address = fileName;
var result = item.ConfigType == EConfigType.Outbound ? await ConfigHandler.AddCustomOutboundServer(_config, item, false) : await ConfigHandler.AddCustomServer(_config, item, false); var result = item.ConfigType == EConfigType.Outbound ? await ConfigDbManager.AddCustomOutboundServer(_config, item, false) : await ConfigDbManager.AddCustomServer(_config, item, false);
if (result == 0) if (result == 0)
{ {
NoticeManager.Instance.Enqueue(ResUI.SuccessfullyImportedCustomServer); NoticeManager.Instance.Enqueue(ResUI.SuccessfullyImportedCustomServer);
@@ -1,3 +1,5 @@
namespace ServiceLib.ViewModels; namespace ServiceLib.ViewModels;
public partial class AddServerViewModel : MyReactiveObject, ICloseable public partial class AddServerViewModel : MyReactiveObject, ICloseable
@@ -317,7 +319,7 @@ public partial class AddServerViewModel : MyReactiveObject, ICloseable
public AddServerViewModel(ProfileItem profileItem) public AddServerViewModel(ProfileItem profileItem)
{ {
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
FetchCertCmd = ReactiveCommand.CreateFromTask(async () => FetchCertCmd = ReactiveCommand.CreateFromTask(async () =>
{ {
@@ -592,7 +594,7 @@ public partial class AddServerViewModel : MyReactiveObject, ICloseable
}); });
SelectedSource.SetTransportExtra(transport); SelectedSource.SetTransportExtra(transport);
if (await ConfigHandler.AddServer(_config, SelectedSource) == 0) if (await ConfigDbManager.AddServer(_config, SelectedSource) == 0)
{ {
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess); NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
RequestClose?.Invoke(this, EventArgs.Empty); RequestClose?.Invoke(this, EventArgs.Empty);
@@ -1,3 +1,5 @@
namespace ServiceLib.ViewModels; namespace ServiceLib.ViewModels;
public partial class BackupAndRestoreViewModel : MyReactiveObject public partial class BackupAndRestoreViewModel : MyReactiveObject
@@ -17,7 +19,7 @@ public partial class BackupAndRestoreViewModel : MyReactiveObject
public BackupAndRestoreViewModel() public BackupAndRestoreViewModel()
{ {
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
WebDavCheckCmd = ReactiveCommand.CreateFromTask(async () => WebDavCheckCmd = ReactiveCommand.CreateFromTask(async () =>
{ {
@@ -44,7 +46,7 @@ public partial class BackupAndRestoreViewModel : MyReactiveObject
{ {
DisplayOperationMsg(); DisplayOperationMsg();
_config.WebDavItem = SelectedSource; _config.WebDavItem = SelectedSource;
_ = await ConfigHandler.SaveConfig(_config); _ = await ConfigTextManager.Instance.SaveConfig();
var result = await WebDavManager.Instance.CheckConnection(); var result = await WebDavManager.Instance.CheckConnection();
if (result) if (result)
@@ -1,3 +1,5 @@
namespace ServiceLib.ViewModels; namespace ServiceLib.ViewModels;
public partial class CheckUpdateViewModel : MyReactiveObject public partial class CheckUpdateViewModel : MyReactiveObject
@@ -17,7 +19,7 @@ public partial class CheckUpdateViewModel : MyReactiveObject
public CheckUpdateViewModel() public CheckUpdateViewModel()
{ {
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
CheckUpdateCmd = ReactiveCommand.CreateFromTask(CheckUpdate); CheckUpdateCmd = ReactiveCommand.CreateFromTask(CheckUpdate);
CheckUpdateCmd.ThrownExceptions.Subscribe(ex => CheckUpdateCmd.ThrownExceptions.Subscribe(ex =>
@@ -124,7 +126,7 @@ public partial class CheckUpdateViewModel : MyReactiveObject
.Select(t => t.CoreTypeForStorage) .Select(t => t.CoreTypeForStorage)
.ToList(); .ToList();
await ConfigHandler.SaveConfig(_config); await ConfigTextManager.Instance.SaveConfig();
} }
private async Task CheckOnly() private async Task CheckOnly()
@@ -4,7 +4,7 @@ public partial class ClashConnectionsViewModel : MyReactiveObject
{ {
public ClashConnectionsViewModel() public ClashConnectionsViewModel()
{ {
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
AutoRefresh = _config.ClashUIItem.ConnectionsAutoRefresh; AutoRefresh = _config.ClashUIItem.ConnectionsAutoRefresh;
var canEditRemove = this.WhenAnyValue( var canEditRemove = this.WhenAnyValue(
@@ -7,7 +7,7 @@ public partial class ClashProxiesViewModel : MyReactiveObject
public ClashProxiesViewModel() public ClashProxiesViewModel()
{ {
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
ProxiesReloadCmd = ReactiveCommand.CreateFromTask(async () => ProxiesReloadCmd = ReactiveCommand.CreateFromTask(async () =>
{ {
@@ -1,3 +1,5 @@
namespace ServiceLib.ViewModels; namespace ServiceLib.ViewModels;
public partial class DNSSettingViewModel : MyReactiveObject, ICloseable public partial class DNSSettingViewModel : MyReactiveObject, ICloseable
@@ -46,7 +48,7 @@ public partial class DNSSettingViewModel : MyReactiveObject, ICloseable
public DNSSettingViewModel() public DNSSettingViewModel()
{ {
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
SaveCmd = ReactiveCommand.CreateFromTask(SaveSettingAsync); SaveCmd = ReactiveCommand.CreateFromTask(SaveSettingAsync);
ImportDefConfig4V2rayCompatibleCmd = ReactiveCommand.CreateFromTask(async () => ImportDefConfig4V2rayCompatibleCmd = ReactiveCommand.CreateFromTask(async () =>
@@ -80,7 +82,7 @@ public partial class DNSSettingViewModel : MyReactiveObject, ICloseable
private async Task Init() private async Task Init()
{ {
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
var item = _config.SimpleDNSItem; var item = _config.SimpleDNSItem;
UseSystemHosts = item.UseSystemHosts ?? false; UseSystemHosts = item.UseSystemHosts ?? false;
AddCommonHosts = item.AddCommonHosts ?? false; AddCommonHosts = item.AddCommonHosts ?? false;
@@ -205,7 +207,7 @@ public partial class DNSSettingViewModel : MyReactiveObject, ICloseable
item1.UseSystemHosts = UseSystemHostsCompatible; item1.UseSystemHosts = UseSystemHostsCompatible;
item1.NormalDNS = NormalDNSCompatible; item1.NormalDNS = NormalDNSCompatible;
item1.TunDNS = TunDNSCompatible; item1.TunDNS = TunDNSCompatible;
await ConfigHandler.SaveDNSItems(_config, item1); await ConfigDbManager.SaveDNSItems(_config, item1);
var item2 = await AppManager.Instance.GetDNSItem(ECoreType.sing_box); var item2 = await AppManager.Instance.GetDNSItem(ECoreType.sing_box);
item2.Enabled = SBCustomDNSEnableCompatible; item2.Enabled = SBCustomDNSEnableCompatible;
@@ -213,9 +215,9 @@ public partial class DNSSettingViewModel : MyReactiveObject, ICloseable
item2.DomainDNSAddress = DomainDNSAddress2Compatible; item2.DomainDNSAddress = DomainDNSAddress2Compatible;
item2.NormalDNS = JsonUtils.Serialize(JsonUtils.Deserialize<Dns4Sbox>(NormalDNS2Compatible)); item2.NormalDNS = JsonUtils.Serialize(JsonUtils.Deserialize<Dns4Sbox>(NormalDNS2Compatible));
item2.TunDNS = JsonUtils.Serialize(JsonUtils.Deserialize<Dns4Sbox>(TunDNS2Compatible)); item2.TunDNS = JsonUtils.Serialize(JsonUtils.Deserialize<Dns4Sbox>(TunDNS2Compatible));
await ConfigHandler.SaveDNSItems(_config, item2); await ConfigDbManager.SaveDNSItems(_config, item2);
await ConfigHandler.SaveConfig(_config); await ConfigTextManager.Instance.SaveConfig();
RequestClose?.Invoke(this, EventArgs.Empty); RequestClose?.Invoke(this, EventArgs.Empty);
} }
} }
@@ -1,3 +1,5 @@
namespace ServiceLib.ViewModels; namespace ServiceLib.ViewModels;
public partial class FullConfigTemplateViewModel : MyReactiveObject, ICloseable public partial class FullConfigTemplateViewModel : MyReactiveObject, ICloseable
@@ -42,7 +44,7 @@ public partial class FullConfigTemplateViewModel : MyReactiveObject, ICloseable
public FullConfigTemplateViewModel() public FullConfigTemplateViewModel()
{ {
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
SaveCmd = ReactiveCommand.CreateFromTask(async () => SaveCmd = ReactiveCommand.CreateFromTask(async () =>
{ {
await SaveSettingAsync(); await SaveSettingAsync();
@@ -102,7 +104,7 @@ public partial class FullConfigTemplateViewModel : MyReactiveObject, ICloseable
item.AddProxyOnly = AddProxyOnly4Ray; item.AddProxyOnly = AddProxyOnly4Ray;
item.ProxyDetour = ProxyDetour4Ray; item.ProxyDetour = ProxyDetour4Ray;
await ConfigHandler.SaveFullConfigTemplate(_config, item); await ConfigDbManager.SaveFullConfigTemplate(_config, item);
return true; return true;
} }
@@ -120,7 +122,7 @@ public partial class FullConfigTemplateViewModel : MyReactiveObject, ICloseable
item.AddProxyOnly = AddProxyOnly4Singbox; item.AddProxyOnly = AddProxyOnly4Singbox;
item.ProxyDetour = ProxyDetour4Singbox; item.ProxyDetour = ProxyDetour4Singbox;
await ConfigHandler.SaveFullConfigTemplate(_config, item); await ConfigDbManager.SaveFullConfigTemplate(_config, item);
return true; return true;
} }
} }
@@ -1,3 +1,5 @@
namespace ServiceLib.ViewModels; namespace ServiceLib.ViewModels;
public class GlobalHotkeySettingViewModel : MyReactiveObject, ICloseable public class GlobalHotkeySettingViewModel : MyReactiveObject, ICloseable
@@ -10,7 +12,7 @@ public class GlobalHotkeySettingViewModel : MyReactiveObject, ICloseable
public GlobalHotkeySettingViewModel() public GlobalHotkeySettingViewModel()
{ {
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
_globalHotkeys = JsonUtils.DeepCopy(_config.GlobalHotkeys); _globalHotkeys = JsonUtils.DeepCopy(_config.GlobalHotkeys);
@@ -50,7 +52,7 @@ public class GlobalHotkeySettingViewModel : MyReactiveObject, ICloseable
{ {
_config.GlobalHotkeys = _globalHotkeys; _config.GlobalHotkeys = _globalHotkeys;
if (await ConfigHandler.SaveConfig(_config) == 0) if (await ConfigTextManager.Instance.SaveConfig() == 0)
{ {
RequestClose?.Invoke(this, EventArgs.Empty); RequestClose?.Invoke(this, EventArgs.Empty);
} }
@@ -90,7 +90,7 @@ public partial class MainWindowViewModel : MyReactiveObject
public MainWindowViewModel() public MainWindowViewModel()
{ {
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
BlIsWindows = Utils.IsWindows(); BlIsWindows = Utils.IsWindows();
MainGirdOrientation = _config.UiItem.MainGirdOrientation; MainGirdOrientation = _config.UiItem.MainGirdOrientation;
@@ -331,8 +331,8 @@ public partial class MainWindowViewModel : MyReactiveObject
} }
//await ConfigHandler.InitBuiltinRouting(_config); //await ConfigHandler.InitBuiltinRouting(_config);
await ConfigHandler.InitBuiltinDNS(_config); await ConfigDbManager.InitBuiltinDNS(_config);
await ConfigHandler.InitBuiltinFullConfigTemplate(_config); await ConfigDbManager.InitBuiltinFullConfigTemplate(_config);
await ProfileExManager.Instance.Init(); await ProfileExManager.Instance.Init();
await CoreManager.Instance.Init(_config, UpdateHandler); await CoreManager.Instance.Init(_config, UpdateHandler);
await CertPemManager.Instance.Init(_config); await CertPemManager.Instance.Init(_config);
@@ -499,7 +499,7 @@ public partial class MainWindowViewModel : MyReactiveObject
} }
stringData = result; stringData = result;
} }
var ret = await ConfigHandler.AddBatchServers(_config, stringData, _config.SubIndexId, false); var ret = await ConfigDbManager.AddBatchServers(_config, stringData, _config.SubIndexId, false);
if (ret > 0) if (ret > 0)
{ {
await RefreshSubscriptions(); await RefreshSubscriptions();
@@ -549,7 +549,7 @@ public partial class MainWindowViewModel : MyReactiveObject
} }
else else
{ {
var ret = await ConfigHandler.AddBatchServers(_config, result, _config.SubIndexId, false); var ret = await ConfigDbManager.AddBatchServers(_config, result, _config.SubIndexId, false);
if (ret > 0) if (ret > 0)
{ {
await RefreshSubscriptions(); await RefreshSubscriptions();
@@ -610,7 +610,7 @@ public partial class MainWindowViewModel : MyReactiveObject
var ret = await AppManager.Instance.WindowDialog.ShowDialogAsync(routingSettingViewModel); var ret = await AppManager.Instance.WindowDialog.ShowDialogAsync(routingSettingViewModel);
if (ret == true) if (ret == true)
{ {
await ConfigHandler.InitBuiltinRouting(_config); await ConfigDbManager.InitBuiltinRouting(_config);
RxSchedulers.MainThreadScheduler.Schedule(async () => RxSchedulers.MainThreadScheduler.Schedule(async () =>
{ {
await StatusBarViewModel.RefreshRoutingsMenu(); await StatusBarViewModel.RefreshRoutingsMenu();
@@ -696,7 +696,7 @@ public partial class MainWindowViewModel : MyReactiveObject
TabMainSelectedIndex = 0; TabMainSelectedIndex = 0;
} }
}); });
var profileItem = await ConfigHandler.GetDefaultServer(_config); var profileItem = await ConfigDbManager.GetDefaultServer(_config);
if (profileItem == null) if (profileItem == null)
{ {
NoticeManager.Instance.Enqueue(ResUI.CheckServerSettings); NoticeManager.Instance.Enqueue(ResUI.CheckServerSettings);
@@ -788,14 +788,14 @@ public partial class MainWindowViewModel : MyReactiveObject
public async Task ApplyRegionalPreset(EPresetType type) public async Task ApplyRegionalPreset(EPresetType type)
{ {
await ConfigHandler.ApplyRegionalPreset(_config, type); await ConfigDbManager.ApplyRegionalPreset(_config, type);
await ConfigHandler.InitRouting(_config); await ConfigDbManager.InitRouting(_config);
RxSchedulers.MainThreadScheduler.Schedule(async () => RxSchedulers.MainThreadScheduler.Schedule(async () =>
{ {
await StatusBarViewModel.RefreshRoutingsMenu(); await StatusBarViewModel.RefreshRoutingsMenu();
}); });
await ConfigHandler.SaveConfig(_config); await ConfigTextManager.Instance.SaveConfig();
using var downloadService = await DownloadService.CreateDownloadServiceWithCheck(); using var downloadService = await DownloadService.CreateDownloadServiceWithCheck();
await new UpdateService(downloadService, _config, UpdateTaskHandler).UpdateGeoFileAll(); await new UpdateService(downloadService, _config, UpdateTaskHandler).UpdateGeoFileAll();
await Reload(); await Reload();
+1 -1
View File
@@ -16,7 +16,7 @@ public partial class MsgViewModel : MyReactiveObject
public MsgViewModel() public MsgViewModel()
{ {
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
MsgFilter = _config.MsgUIItem.MainMsgFilter ?? string.Empty; MsgFilter = _config.MsgUIItem.MainMsgFilter ?? string.Empty;
AutoRefresh = _config.MsgUIItem.AutoRefresh ?? true; AutoRefresh = _config.MsgUIItem.AutoRefresh ?? true;
@@ -1,3 +1,5 @@
namespace ServiceLib.ViewModels; namespace ServiceLib.ViewModels;
public partial class OptionSettingViewModel : MyReactiveObject, ICloseable public partial class OptionSettingViewModel : MyReactiveObject, ICloseable
@@ -122,7 +124,7 @@ public partial class OptionSettingViewModel : MyReactiveObject, ICloseable
public OptionSettingViewModel() public OptionSettingViewModel()
{ {
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
BlIsWindows = Utils.IsWindows(); BlIsWindows = Utils.IsWindows();
BlIsLinux = Utils.IsLinux(); BlIsLinux = Utils.IsLinux();
BlIsIsMacOS = Utils.IsMacOS(); BlIsIsMacOS = Utils.IsMacOS();
@@ -405,7 +407,7 @@ public partial class OptionSettingViewModel : MyReactiveObject, ICloseable
//coreType //coreType
await SaveCoreType(); await SaveCoreType();
if (await ConfigHandler.SaveConfig(_config) == 0) if (await ConfigTextManager.Instance.SaveConfig() == 0)
{ {
await AutoStartupHandler.UpdateTask(_config); await AutoStartupHandler.UpdateTask(_config);
AppManager.Instance.Reset(); AppManager.Instance.Reset();
@@ -51,7 +51,7 @@ public partial class ProfilesSelectViewModel : MyReactiveObject, ICloseable
public ProfilesSelectViewModel() public ProfilesSelectViewModel()
{ {
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
_subIndexId = _config.SubIndexId ?? string.Empty; _subIndexId = _config.SubIndexId ?? string.Empty;
#region WhenAnyValue && ReactiveCommand #region WhenAnyValue && ReactiveCommand
@@ -1,3 +1,5 @@
namespace ServiceLib.ViewModels; namespace ServiceLib.ViewModels;
public partial class ProfilesViewModel : MyReactiveObject public partial class ProfilesViewModel : MyReactiveObject
@@ -94,7 +96,7 @@ public partial class ProfilesViewModel : MyReactiveObject
public ProfilesViewModel() public ProfilesViewModel()
{ {
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
#region WhenAnyValue && ReactiveCommand #region WhenAnyValue && ReactiveCommand
@@ -399,7 +401,7 @@ public partial class ProfilesViewModel : MyReactiveObject
{ {
var lstModel = await AppManager.Instance.ProfileModels(_config.SubIndexId, filter); var lstModel = await AppManager.Instance.ProfileModels(_config.SubIndexId, filter);
await ConfigHandler.SetDefaultServer(_config, lstModel); await ConfigDbManager.SetDefaultServer(_config, lstModel);
var lstServerStat = (_config.GuiItem.EnableStatistics ? StatisticsManager.Instance.ServerStat : null) ?? []; var lstServerStat = (_config.GuiItem.EnableStatistics ? StatisticsManager.Instance.ServerStat : null) ?? [];
var lstProfileExs = await ProfileExManager.Instance.GetProfileExs(); var lstProfileExs = await ProfileExManager.Instance.GetProfileExs();
@@ -514,7 +516,7 @@ public partial class ProfilesViewModel : MyReactiveObject
} }
var exists = lstSelected.Exists(t => t.IndexId == _config.IndexId); var exists = lstSelected.Exists(t => t.IndexId == _config.IndexId);
await ConfigHandler.RemoveServers(_config, lstSelected); await ConfigDbManager.RemoveServers(_config, lstSelected);
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess); NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
if (lstSelected.Count == ProfileItems.Count) if (lstSelected.Count == ProfileItems.Count)
{ {
@@ -534,7 +536,7 @@ public partial class ProfilesViewModel : MyReactiveObject
return; return;
} }
var tuple = await ConfigHandler.DedupServerList(_config, _config.SubIndexId); var tuple = await ConfigDbManager.DedupServerList(_config, _config.SubIndexId);
if (tuple.Item1 > 0 || tuple.Item2 > 0) if (tuple.Item1 > 0 || tuple.Item2 > 0)
{ {
await RefreshServers(); await RefreshServers();
@@ -550,7 +552,7 @@ public partial class ProfilesViewModel : MyReactiveObject
{ {
return; return;
} }
if (await ConfigHandler.CopyServer(_config, lstSelected) == 0) if (await ConfigDbManager.CopyServer(_config, lstSelected) == 0)
{ {
await RefreshServers(); await RefreshServers();
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess); NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
@@ -583,7 +585,7 @@ public partial class ProfilesViewModel : MyReactiveObject
return; return;
} }
if (await ConfigHandler.SetDefaultServerIndex(_config, indexId) == 0) if (await ConfigDbManager.SetDefaultServerIndex(_config, indexId) == 0)
{ {
await RefreshServers(); await RefreshServers();
Reload(); Reload();
@@ -609,7 +611,7 @@ public partial class ProfilesViewModel : MyReactiveObject
private async Task GenGroupAllServer() private async Task GenGroupAllServer()
{ {
var ret = await ConfigHandler.AddGroupAllServer(_config, SelectedSub); var ret = await ConfigDbManager.AddGroupAllServer(_config, SelectedSub);
if (ret.Success != true) if (ret.Success != true)
{ {
NoticeManager.Instance.Enqueue(ResUI.OperationFailed); NoticeManager.Instance.Enqueue(ResUI.OperationFailed);
@@ -621,7 +623,7 @@ public partial class ProfilesViewModel : MyReactiveObject
private async Task GenGroupRegionServer() private async Task GenGroupRegionServer()
{ {
var ret = await ConfigHandler.AddGroupRegionServer(_config, SelectedSub); var ret = await ConfigDbManager.AddGroupRegionServer(_config, SelectedSub);
if (ret.Success != true) if (ret.Success != true)
{ {
NoticeManager.Instance.Enqueue(ResUI.OperationFailed); NoticeManager.Instance.Enqueue(ResUI.OperationFailed);
@@ -641,7 +643,7 @@ public partial class ProfilesViewModel : MyReactiveObject
_dicHeaderSort.TryAdd(colName, true); _dicHeaderSort.TryAdd(colName, true);
_dicHeaderSort.TryGetValue(colName, out var asc); _dicHeaderSort.TryGetValue(colName, out var asc);
if (await ConfigHandler.SortServers(_config, _config.SubIndexId, colName, asc) != 0) if (await ConfigDbManager.SortServers(_config, _config.SubIndexId, colName, asc) != 0)
{ {
return; return;
} }
@@ -651,7 +653,7 @@ public partial class ProfilesViewModel : MyReactiveObject
public async Task RemoveInvalidServerResult() public async Task RemoveInvalidServerResult()
{ {
var count = await ConfigHandler.RemoveInvalidServerResult(_config, _config.SubIndexId); var count = await ConfigDbManager.RemoveInvalidServerResult(_config, _config.SubIndexId);
await RefreshServers(); await RefreshServers();
NoticeManager.Instance.Enqueue(string.Format(ResUI.RemoveInvalidServerResultTip, count)); NoticeManager.Instance.Enqueue(string.Format(ResUI.RemoveInvalidServerResultTip, count));
} }
@@ -665,7 +667,7 @@ public partial class ProfilesViewModel : MyReactiveObject
return; return;
} }
await ConfigHandler.MoveToGroup(_config, lstSelected, SelectedMoveToGroup.Id); await ConfigDbManager.MoveToGroup(_config, lstSelected, SelectedMoveToGroup.Id);
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess); NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
await RefreshServers(); await RefreshServers();
@@ -683,7 +685,7 @@ public partial class ProfilesViewModel : MyReactiveObject
return; return;
} }
if (await ConfigHandler.MoveServer(_config, lstProfile, index, eMove) == 0) if (await ConfigDbManager.MoveServer(_config, lstProfile, index, eMove) == 0)
{ {
await RefreshServers(); await RefreshServers();
} }
@@ -695,7 +697,7 @@ public partial class ProfilesViewModel : MyReactiveObject
if (startIndex >= 0 && targetIndex >= 0 && startIndex != targetIndex) if (startIndex >= 0 && targetIndex >= 0 && startIndex != targetIndex)
{ {
var lstProfile = ProfileItems?.Select(t => t.IndexId).ToList() ?? []; var lstProfile = ProfileItems?.Select(t => t.IndexId).ToList() ?? [];
if (await ConfigHandler.MoveServer(_config, lstProfile, startIndex, EMove.Position, targetIndex) == 0) if (await ConfigDbManager.MoveServer(_config, lstProfile, startIndex, EMove.Position, targetIndex) == 0)
{ {
await RefreshServers(); await RefreshServers();
} }
@@ -717,7 +719,7 @@ public partial class ProfilesViewModel : MyReactiveObject
.Select(item => item.IndexId) .Select(item => item.IndexId)
.ToList(); .ToList();
var result = await ConfigHandler.MoveServersTo( var result = await ConfigDbManager.MoveServersTo(
_config, _config,
orderedProfileIds, orderedProfileIds,
sourceIndices, sourceIndices,
@@ -921,7 +923,7 @@ public partial class ProfilesViewModel : MyReactiveObject
{ {
return; return;
} }
await ConfigHandler.DeleteSubItem(_config, item.Id); await ConfigDbManager.DeleteSubItem(_config, item.Id);
await RefreshSubscriptions(); await RefreshSubscriptions();
await SubSelectedChangedAsync(); await SubSelectedChangedAsync();
@@ -45,7 +45,7 @@ public partial class RoutingRuleDetailsViewModel : MyReactiveObject, ICloseable
public RoutingRuleDetailsViewModel(RulesItem rulesItem) public RoutingRuleDetailsViewModel(RulesItem rulesItem)
{ {
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
SelectProfileCmd = ReactiveCommand.CreateFromTask(async () => SelectProfileCmd = ReactiveCommand.CreateFromTask(async () =>
{ {
@@ -1,3 +1,5 @@
namespace ServiceLib.ViewModels; namespace ServiceLib.ViewModels;
public partial class RoutingRuleSettingViewModel : MyReactiveObject, ICloseable public partial class RoutingRuleSettingViewModel : MyReactiveObject, ICloseable
@@ -36,7 +38,7 @@ public partial class RoutingRuleSettingViewModel : MyReactiveObject, ICloseable
public RoutingRuleSettingViewModel(RoutingItem routingItem) public RoutingRuleSettingViewModel(RoutingItem routingItem)
{ {
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
var canEditRemove = this.WhenAnyValue( var canEditRemove = this.WhenAnyValue(
x => x.SelectedSource, x => x.SelectedSource,
@@ -209,7 +211,7 @@ public partial class RoutingRuleSettingViewModel : MyReactiveObject, ICloseable
return; return;
} }
var index = _rules.IndexOf(item); var index = _rules.IndexOf(item);
if (await ConfigHandler.MoveRoutingRule(_rules, index, eMove) == 0) if (await ConfigDbManager.MoveRoutingRule(_rules, index, eMove) == 0)
{ {
RefreshRulesItems(); RefreshRulesItems();
} }
@@ -231,7 +233,7 @@ public partial class RoutingRuleSettingViewModel : MyReactiveObject, ICloseable
item.RuleNum = _rules.Count; item.RuleNum = _rules.Count;
item.RuleSet = JsonUtils.Serialize(_rules, false); item.RuleSet = JsonUtils.Serialize(_rules, false);
if (await ConfigHandler.SaveRoutingItem(_config, item) == 0) if (await ConfigDbManager.SaveRoutingItem(_config, item) == 0)
{ {
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess); NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
RequestClose?.Invoke(this, EventArgs.Empty); RequestClose?.Invoke(this, EventArgs.Empty);
@@ -1,3 +1,5 @@
namespace ServiceLib.ViewModels; namespace ServiceLib.ViewModels;
public partial class RoutingSettingViewModel : MyReactiveObject public partial class RoutingSettingViewModel : MyReactiveObject
@@ -30,7 +32,7 @@ public partial class RoutingSettingViewModel : MyReactiveObject
public RoutingSettingViewModel() public RoutingSettingViewModel()
{ {
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
var canEditRemove = this.WhenAnyValue( var canEditRemove = this.WhenAnyValue(
x => x.SelectedSource, x => x.SelectedSource,
@@ -75,7 +77,7 @@ public partial class RoutingSettingViewModel : MyReactiveObject
DomainStrategy = _config.RoutingBasicItem.DomainStrategy; DomainStrategy = _config.RoutingBasicItem.DomainStrategy;
DomainStrategy4Singbox = _config.RoutingBasicItem.DomainStrategy4Singbox; DomainStrategy4Singbox = _config.RoutingBasicItem.DomainStrategy4Singbox;
await ConfigHandler.InitBuiltinRouting(_config); await ConfigDbManager.InitBuiltinRouting(_config);
await RefreshRoutingItems(); await RefreshRoutingItems();
} }
@@ -111,7 +113,7 @@ public partial class RoutingSettingViewModel : MyReactiveObject
{ {
_config.RoutingBasicItem.DomainStrategy = DomainStrategy; _config.RoutingBasicItem.DomainStrategy = DomainStrategy;
_config.RoutingBasicItem.DomainStrategy4Singbox = DomainStrategy4Singbox; _config.RoutingBasicItem.DomainStrategy4Singbox = DomainStrategy4Singbox;
await ConfigHandler.SaveConfig(_config); await ConfigTextManager.Instance.SaveConfig();
} }
#endregion Refresh Save #endregion Refresh Save
@@ -155,7 +157,7 @@ public partial class RoutingSettingViewModel : MyReactiveObject
var item = await AppManager.Instance.GetRoutingItem(it?.Id); var item = await AppManager.Instance.GetRoutingItem(it?.Id);
if (item != null) if (item != null)
{ {
await ConfigHandler.RemoveRoutingItem(item); await ConfigDbManager.RemoveRoutingItem(item);
} }
} }
@@ -172,7 +174,7 @@ public partial class RoutingSettingViewModel : MyReactiveObject
return; return;
} }
if (await ConfigHandler.SetDefaultRouting(_config, item) == 0) if (await ConfigDbManager.SetDefaultRouting(_config, item) == 0)
{ {
await RefreshRoutingItems(); await RefreshRoutingItems();
IsModified = true; IsModified = true;
@@ -181,7 +183,7 @@ public partial class RoutingSettingViewModel : MyReactiveObject
private async Task RoutingAdvancedImportRules() private async Task RoutingAdvancedImportRules()
{ {
if (await ConfigHandler.InitRouting(_config, true) == 0) if (await ConfigDbManager.InitRouting(_config, true) == 0)
{ {
await RefreshRoutingItems(); await RefreshRoutingItems();
IsModified = true; IsModified = true;
@@ -1,3 +1,5 @@
namespace ServiceLib.ViewModels; namespace ServiceLib.ViewModels;
public partial class StatusBarViewModel : MyReactiveObject public partial class StatusBarViewModel : MyReactiveObject
@@ -105,7 +107,7 @@ public partial class StatusBarViewModel : MyReactiveObject
public StatusBarViewModel() public StatusBarViewModel()
{ {
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
SelectedRouting = new(); SelectedRouting = new();
SelectedServer = new(); SelectedServer = new();
RunningServerToolTipText = GetRunningServerToolTipText("-"); RunningServerToolTipText = GetRunningServerToolTipText("-");
@@ -216,7 +218,7 @@ public partial class StatusBarViewModel : MyReactiveObject
private async Task Init() private async Task Init()
{ {
await ConfigHandler.InitBuiltinRouting(_config); await ConfigDbManager.InitBuiltinRouting(_config);
await RefreshRoutingsMenu(); await RefreshRoutingsMenu();
await InboundDisplayStatus(); await InboundDisplayStatus();
// The view refreshes its icon on initialization; interaction handlers are not registered yet. // The view refreshes its icon on initialization; interaction handlers are not registered yet.
@@ -265,7 +267,7 @@ public partial class StatusBarViewModel : MyReactiveObject
await RefreshServersMenu(); await RefreshServersMenu();
//display running server //display running server
var running = await ConfigHandler.GetDefaultServer(_config); var running = await ConfigDbManager.GetDefaultServer(_config);
if (running != null) if (running != null)
{ {
RunningServerDisplay = running.GetSummary(); RunningServerDisplay = running.GetSummary();
@@ -317,7 +319,7 @@ public partial class StatusBarViewModel : MyReactiveObject
public async Task<AvailabilityCheckResult?> TestServerAvailability() public async Task<AvailabilityCheckResult?> TestServerAvailability()
{ {
var item = await ConfigHandler.GetDefaultServer(_config); var item = await ConfigDbManager.GetDefaultServer(_config);
if (item == null) if (item == null)
{ {
return null; return null;
@@ -371,7 +373,7 @@ public partial class StatusBarViewModel : MyReactiveObject
NoticeManager.Instance.SendMessageEx($"{ResUI.TipChangeSystemProxy} - {_config.SystemProxyItem.SysProxyType}"); NoticeManager.Instance.SendMessageEx($"{ResUI.TipChangeSystemProxy} - {_config.SystemProxyItem.SysProxyType}");
SystemProxySelected = (int)_config.SystemProxyItem.SysProxyType; SystemProxySelected = (int)_config.SystemProxyItem.SysProxyType;
await ConfigHandler.SaveConfig(_config); await ConfigTextManager.Instance.SaveConfig();
} }
public async Task ChangeSystemProxyAsync(ESysProxyType type, bool blChange) public async Task ChangeSystemProxyAsync(ESysProxyType type, bool blChange)
@@ -411,7 +413,7 @@ public partial class StatusBarViewModel : MyReactiveObject
return; return;
} }
if (await ConfigHandler.SetDefaultRouting(_config, item) == 0) if (await ConfigDbManager.SetDefaultRouting(_config, item) == 0)
{ {
NoticeManager.Instance.SendMessageEx(ResUI.TipChangeRouting); NoticeManager.Instance.SendMessageEx(ResUI.TipChangeRouting);
ReloadRequested.Publish(); ReloadRequested.Publish();
@@ -457,7 +459,7 @@ public partial class StatusBarViewModel : MyReactiveObject
} }
} }
await ConfigHandler.SaveConfig(_config); await ConfigTextManager.Instance.SaveConfig();
ReloadRequested.Publish(); ReloadRequested.Publish();
} }
@@ -1,3 +1,5 @@
namespace ServiceLib.ViewModels; namespace ServiceLib.ViewModels;
public partial class SubEditViewModel : MyReactiveObject, ICloseable public partial class SubEditViewModel : MyReactiveObject, ICloseable
@@ -22,7 +24,7 @@ public partial class SubEditViewModel : MyReactiveObject, ICloseable
public SubEditViewModel(SubItem subItem) public SubEditViewModel(SubItem subItem)
{ {
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
SelectPrevProfileCmd = ReactiveCommand.CreateFromTask(async () => SelectPrevProfileCmd = ReactiveCommand.CreateFromTask(async () =>
{ {
@@ -87,7 +89,7 @@ public partial class SubEditViewModel : MyReactiveObject, ICloseable
SelectedSource.PrevProfile = PrevProfile; SelectedSource.PrevProfile = PrevProfile;
SelectedSource.NextProfile = NextProfile; SelectedSource.NextProfile = NextProfile;
if (await ConfigHandler.AddSubItem(_config, SelectedSource) == 0) if (await ConfigDbManager.AddSubItem(_config, SelectedSource) == 0)
{ {
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess); NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
RequestClose?.Invoke(this, EventArgs.Empty); RequestClose?.Invoke(this, EventArgs.Empty);
@@ -1,3 +1,5 @@
namespace ServiceLib.ViewModels; namespace ServiceLib.ViewModels;
public partial class SubSettingViewModel : MyReactiveObject public partial class SubSettingViewModel : MyReactiveObject
@@ -20,7 +22,7 @@ public partial class SubSettingViewModel : MyReactiveObject
public SubSettingViewModel() public SubSettingViewModel()
{ {
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
var canEditRemove = this.WhenAnyValue( var canEditRemove = this.WhenAnyValue(
x => x.SelectedSource, x => x.SelectedSource,
@@ -90,7 +92,7 @@ public partial class SubSettingViewModel : MyReactiveObject
foreach (var it in SelectedSources ?? [SelectedSource]) foreach (var it in SelectedSources ?? [SelectedSource])
{ {
await ConfigHandler.DeleteSubItem(_config, it.Id); await ConfigDbManager.DeleteSubItem(_config, it.Id);
} }
await RefreshSubItems(); await RefreshSubItems();
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess); NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
+3 -3
View File
@@ -65,7 +65,7 @@ public partial class App : Application
return; return;
} }
if (!AppManager.Instance.Config.UiItem.MacOSShowInDock) if (!ConfigTextManager.Instance.Config.UiItem.MacOSShowInDock)
{ {
MacAppUtils.SetActivationPolicyAccessory(); MacAppUtils.SetActivationPolicyAccessory();
} }
@@ -76,7 +76,7 @@ public partial class App : Application
private static void RestoreMacOSAccessoryPolicyAfterMiniaturize(MainWindow mainWindow) private static void RestoreMacOSAccessoryPolicyAfterMiniaturize(MainWindow mainWindow)
{ {
if (AppManager.Instance.Config.UiItem.MacOSShowInDock) if (ConfigTextManager.Instance.Config.UiItem.MacOSShowInDock)
{ {
return; return;
} }
@@ -98,7 +98,7 @@ public partial class App : Application
private static void RestoreMacOSAccessoryPolicy(MainWindow mainWindow) private static void RestoreMacOSAccessoryPolicy(MainWindow mainWindow)
{ {
if (AppManager.Instance.Config.UiItem.MacOSShowInDock || MacAppUtils.IsWindowMiniaturized(mainWindow)) if (ConfigTextManager.Instance.Config.UiItem.MacOSShowInDock || MacAppUtils.IsWindowMiniaturized(mainWindow))
{ {
return; return;
} }
+2 -2
View File
@@ -23,7 +23,7 @@ public class WindowBase<TViewModel> : ReactiveWindow<TViewModel> where TViewMode
{ {
try try
{ {
var sizeItem = ConfigHandler.GetWindowSizeItem(AppManager.Instance.Config, GetType().Name); var sizeItem = ConfigTextManager.GetWindowSizeItem(ConfigTextManager.Instance.Config, GetType().Name);
if (sizeItem is null) if (sizeItem is null)
{ {
return; return;
@@ -55,7 +55,7 @@ public class WindowBase<TViewModel> : ReactiveWindow<TViewModel> where TViewMode
base.OnClosed(e); base.OnClosed(e);
try try
{ {
ConfigHandler.SaveWindowSizeItem(AppManager.Instance.Config, GetType().Name, Width, Height); ConfigTextManager.SaveWindowSizeItem(ConfigTextManager.Instance.Config, GetType().Name, Width, Height);
} }
catch { } catch { }
} }
+1
View File
@@ -31,6 +31,7 @@ global using ServiceLib.Enums;
global using ServiceLib.Events; global using ServiceLib.Events;
global using ServiceLib.Handler; global using ServiceLib.Handler;
global using ServiceLib.Manager; global using ServiceLib.Manager;
global using ServiceLib.Manager.Data;
global using ServiceLib.Models.CoreConfigs; global using ServiceLib.Models.CoreConfigs;
global using ServiceLib.Models.Configs; global using ServiceLib.Models.Configs;
global using ServiceLib.Models.Dto; global using ServiceLib.Models.Dto;
+1 -1
View File
@@ -69,7 +69,7 @@ internal class Program
if (OperatingSystem.IsMacOS()) if (OperatingSystem.IsMacOS())
{ {
var showInDock = Design.IsDesignMode || AppManager.Instance.Config.UiItem.MacOSShowInDock; var showInDock = Design.IsDesignMode || ConfigTextManager.Instance.Config.UiItem.MacOSShowInDock;
builder = builder.With(new MacOSPlatformOptions { ShowInDock = showInDock }); builder = builder.With(new MacOSPlatformOptions { ShowInDock = showInDock });
} }
@@ -1,5 +1,6 @@
using Semi.Avalonia; using Semi.Avalonia;
namespace v2rayN.Desktop.ViewModels; namespace v2rayN.Desktop.ViewModels;
public partial class ThemeSettingViewModel : MyReactiveObject public partial class ThemeSettingViewModel : MyReactiveObject
@@ -12,7 +13,7 @@ public partial class ThemeSettingViewModel : MyReactiveObject
public ThemeSettingViewModel() public ThemeSettingViewModel()
{ {
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
BindingUI(); BindingUI();
RestoreUI(); RestoreUI();
@@ -42,7 +43,7 @@ public partial class ThemeSettingViewModel : MyReactiveObject
{ {
_config.UiItem.CurrentTheme = CurrentTheme; _config.UiItem.CurrentTheme = CurrentTheme;
ModifyTheme(); ModifyTheme();
await ConfigHandler.SaveConfig(_config); await ConfigTextManager.Instance.SaveConfig();
} }
}); });
@@ -54,7 +55,7 @@ public partial class ThemeSettingViewModel : MyReactiveObject
{ {
_config.UiItem.CurrentFontSize = CurrentFontSize; _config.UiItem.CurrentFontSize = CurrentFontSize;
ModifyFontSize(); ModifyFontSize();
await ConfigHandler.SaveConfig(_config); await ConfigTextManager.Instance.SaveConfig();
} }
}); });
@@ -66,7 +67,7 @@ public partial class ThemeSettingViewModel : MyReactiveObject
{ {
_config.UiItem.CurrentLanguage = CurrentLanguage; _config.UiItem.CurrentLanguage = CurrentLanguage;
Thread.CurrentThread.CurrentUICulture = new(CurrentLanguage); Thread.CurrentThread.CurrentUICulture = new(CurrentLanguage);
await ConfigHandler.SaveConfig(_config); await ConfigTextManager.Instance.SaveConfig();
NoticeManager.Instance.Enqueue(ResUI.NeedRebootTips); NoticeManager.Instance.Enqueue(ResUI.NeedRebootTips);
} }
}); });
@@ -9,7 +9,7 @@ public partial class ClashConnectionsView : ReactiveUserControl<ClashConnections
{ {
InitializeComponent(); InitializeComponent();
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
btnAutofitColumnWidth.Click += BtnAutofitColumnWidth_Click; btnAutofitColumnWidth.Click += BtnAutofitColumnWidth_Click;
@@ -10,7 +10,7 @@ public partial class DNSSettingWindow : WindowBase<DNSSettingViewModel>
{ {
InitializeComponent(); InitializeComponent();
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
Loaded += Window_Loaded; Loaded += Window_Loaded;
btnCancel.Click += (s, e) => Close(); btnCancel.Click += (s, e) => Close();
@@ -10,7 +10,7 @@ public partial class FullConfigTemplateWindow : WindowBase<FullConfigTemplateVie
{ {
InitializeComponent(); InitializeComponent();
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
Loaded += Window_Loaded; Loaded += Window_Loaded;
btnCancel.Click += (_, _) => Close(); btnCancel.Click += (_, _) => Close();
@@ -25,7 +25,7 @@ public partial class MainWindow : WindowBase<MainWindowViewModel>
{ {
InitializeComponent(); InitializeComponent();
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
_manager = new WindowNotificationManager(TopLevel.GetTopLevel(this)) { MaxItems = 3, Position = NotificationPosition.TopRight }; _manager = new WindowNotificationManager(TopLevel.GetTopLevel(this)) { MaxItems = 3, Position = NotificationPosition.TopRight };
KeyDown += MainWindow_KeyDown; KeyDown += MainWindow_KeyDown;
@@ -396,15 +396,15 @@ public partial class MainWindow : WindowBase<MainWindowViewModel>
private void StorageUI() private void StorageUI()
{ {
ConfigHandler.SaveWindowSizeItem(_config, GetType().Name, Width, Height); ConfigTextManager.SaveWindowSizeItem(_config, GetType().Name, Width, Height);
if (_config.UiItem.MainGirdOrientation == EGirdOrientation.Horizontal) if (_config.UiItem.MainGirdOrientation == EGirdOrientation.Horizontal)
{ {
ConfigHandler.SaveMainGirdHeight(_config, gridMain.ColumnDefinitions[0].ActualWidth, gridMain.ColumnDefinitions[2].ActualWidth); ConfigTextManager.SaveMainGirdHeight(_config, gridMain.ColumnDefinitions[0].ActualWidth, gridMain.ColumnDefinitions[2].ActualWidth);
} }
else if (_config.UiItem.MainGirdOrientation == EGirdOrientation.Vertical) else if (_config.UiItem.MainGirdOrientation == EGirdOrientation.Vertical)
{ {
ConfigHandler.SaveMainGirdHeight(_config, gridMain.RowDefinitions[0].ActualHeight, gridMain.RowDefinitions[2].ActualHeight); ConfigTextManager.SaveMainGirdHeight(_config, gridMain.RowDefinitions[0].ActualHeight, gridMain.RowDefinitions[2].ActualHeight);
} }
} }
@@ -13,7 +13,7 @@ public partial class OptionSettingWindow : WindowBase<OptionSettingViewModel>
Loaded += Window_Loaded; Loaded += Window_Loaded;
btnCancel.Click += (s, e) => Close(); btnCancel.Click += (s, e) => Close();
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
clbdestOverride.SelectionChanged += ClbdestOverride_SelectionChanged; clbdestOverride.SelectionChanged += ClbdestOverride_SelectionChanged;
btnBrowseCustomSystemProxyPacPath.Click += BtnBrowseCustomSystemProxyPacPath_Click; btnBrowseCustomSystemProxyPacPath.Click += BtnBrowseCustomSystemProxyPacPath_Click;
@@ -15,7 +15,7 @@ public partial class ProfilesView : ReactiveUserControl<ProfilesViewModel>
{ {
InitializeComponent(); InitializeComponent();
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
menuSelectAll.Click += menuSelectAll_Click; menuSelectAll.Click += menuSelectAll_Click;
btnAutofitColumnWidth.Click += BtnAutofitColumnWidth_Click; btnAutofitColumnWidth.Click += BtnAutofitColumnWidth_Click;
@@ -11,7 +11,7 @@ public partial class StatusBarView : ReactiveUserControl<StatusBarViewModel>
{ {
InitializeComponent(); InitializeComponent();
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
txtRunningServerDisplay.Tapped += TxtRunningServerDisplay_Tapped; txtRunningServerDisplay.Tapped += TxtRunningServerDisplay_Tapped;
txtRunningInfoDisplay.Tapped += TxtRunningServerDisplay_Tapped; txtRunningInfoDisplay.Tapped += TxtRunningServerDisplay_Tapped;
+12
View File
@@ -0,0 +1,12 @@
global using ServiceLib;
global using ServiceLib.Base;
global using ServiceLib.Common;
global using ServiceLib.Enums;
global using ServiceLib.Handler;
global using ServiceLib.Manager;
global using ServiceLib.Manager.Data;
global using ServiceLib.Models.Configs;
global using ServiceLib.Models.CoreConfigs;
global using ServiceLib.Models.Dto;
global using ServiceLib.Models.Entities;
global using ServiceLib.Resx;
@@ -0,0 +1,12 @@
{
"profiles": {
"v2rayN.WebAPI": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "https://localhost:4939;http://localhost:4940"
}
}
}
@@ -2,7 +2,7 @@ using System.Net;
using ServiceLib; using ServiceLib;
using ServiceLib.Common; using ServiceLib.Common;
using ServiceLib.Enums; using ServiceLib.Enums;
using ServiceLib.Handler;
using ServiceLib.Models.Configs; using ServiceLib.Models.Configs;
using ServiceLib.Models.Dto; using ServiceLib.Models.Dto;
using ServiceLib.Models.Entities; using ServiceLib.Models.Entities;
@@ -49,7 +49,7 @@ internal sealed class RegionalPresetStager(
string.Empty, string.Empty,
string.Empty, string.Empty,
string.Empty, string.Empty,
ConfigHandler.InitBuiltinSimpleDNS(), ConfigDbManager.InitBuiltinSimpleDNS(),
[CreateDefaultDns(ECoreType.Xray, "V2ray"), CreateDefaultDns(ECoreType.sing_box, "sing-box")], [CreateDefaultDns(ECoreType.Xray, "V2ray"), CreateDefaultDns(ECoreType.sing_box, "sing-box")],
new(null, [])); new(null, []));
} }
@@ -143,7 +143,7 @@ internal sealed class RegionalPresetStager(
var content = await TryDownloadAsync(url, proxy, cancellationToken); var content = await TryDownloadAsync(url, proxy, cancellationToken);
var template = content is null ? null : JsonUtils.Deserialize<SimpleDNSItem>(content); var template = content is null ? null : JsonUtils.Deserialize<SimpleDNSItem>(content);
return template is null return template is null
? (ConfigHandler.InitBuiltinSimpleDNS(), true) ? (ConfigDbManager.InitBuiltinSimpleDNS(), true)
: (template, false); : (template, false);
} }
@@ -3,13 +3,12 @@ using System.Text.Json;
using SQLite; using SQLite;
using ServiceLib; using ServiceLib;
using ServiceLib.Common; using ServiceLib.Common;
using ServiceLib.Handler;
using ServiceLib.Helper; using ServiceLib.Helper;
using ServiceLib.Manager;
using ServiceLib.Models.Configs; using ServiceLib.Models.Configs;
using v2rayN.WebAPI.Contracts; using v2rayN.WebAPI.Contracts;
using v2rayN.WebAPI.Launcher; using v2rayN.WebAPI.Launcher;
namespace v2rayN.WebAPI.Services; namespace v2rayN.WebAPI.Services;
public sealed partial class V2rayRuntime public sealed partial class V2rayRuntime
@@ -42,7 +41,7 @@ public sealed partial class V2rayRuntime
Config.WebDavItem.Password = input.Password; Config.WebDavItem.Password = input.Password;
} }
Config.WebDavItem.DirName = input.DirName?.Trim(); Config.WebDavItem.DirName = input.DirName?.Trim();
await EnsureConfigSaveSucceededAsync(() => ConfigHandler.SaveConfig(Config)); await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.Instance.SaveConfig());
}); });
return OperationView.Ok(ApiMessageKeys.WebDavSettingsSaved); return OperationView.Ok(ApiMessageKeys.WebDavSettingsSaved);
} }
@@ -63,7 +62,7 @@ public sealed partial class V2rayRuntime
{ {
await _mutations.RunAsync(async () => await _mutations.RunAsync(async () =>
{ {
await EnsureConfigSaveSucceededAsync(() => ConfigHandler.SaveConfig(Config)); await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.Instance.SaveConfig());
await ProfileExManager.Instance.SaveTo(); await ProfileExManager.Instance.SaveTo();
await StatisticsManager.Instance.SaveTo(); await StatisticsManager.Instance.SaveTo();
}); });
@@ -217,7 +216,7 @@ public sealed partial class V2rayRuntime
await ProfileExManager.Instance.SaveTo(); await ProfileExManager.Instance.SaveTo();
await StatisticsManager.Instance.SaveTo(); await StatisticsManager.Instance.SaveTo();
StatisticsManager.Instance.Close(); StatisticsManager.Instance.Close();
await _mutations.RunAsync(() => EnsureConfigSaveSucceededAsync(() => ConfigHandler.SaveConfig(Config)), cancellationToken); await _mutations.RunAsync(() => EnsureConfigSaveSucceededAsync(() => ConfigTextManager.Instance.SaveConfig()), cancellationToken);
await SQLiteHelper.Instance.DisposeDbConnectionAsync(); await SQLiteHelper.Instance.DisposeDbConnectionAsync();
databaseClosed = true; databaseClosed = true;
@@ -4,8 +4,8 @@ using System.Text.RegularExpressions;
using ServiceLib; using ServiceLib;
using ServiceLib.Common; using ServiceLib.Common;
using ServiceLib.Enums; using ServiceLib.Enums;
using ServiceLib.Handler;
using ServiceLib.Manager; using ServiceLib.Manager;
using ServiceLib.Models.CoreConfigs; using ServiceLib.Models.CoreConfigs;
using ServiceLib.Models.Dto; using ServiceLib.Models.Dto;
using ServiceLib.Models.Entities; using ServiceLib.Models.Entities;
@@ -120,7 +120,7 @@ public sealed partial class V2rayRuntime
.Distinct(StringComparer.Ordinal) .Distinct(StringComparer.Ordinal)
.ToList(); .ToList();
Config.CheckUpdateItem.UpdateViaProxy = input.UseProxy; Config.CheckUpdateItem.UpdateViaProxy = input.UseProxy;
await EnsureConfigSaveSucceededAsync(() => ConfigHandler.SaveConfig(Config)); await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.Instance.SaveConfig());
}); });
return OperationView.Ok(ApiMessageKeys.CoreUpdateSettingsSaved); return OperationView.Ok(ApiMessageKeys.CoreUpdateSettingsSaved);
@@ -5,6 +5,7 @@ using ServiceLib.Handler;
using ServiceLib.Handler.Builder; using ServiceLib.Handler.Builder;
using ServiceLib.Handler.Fmt; using ServiceLib.Handler.Fmt;
using ServiceLib.Manager; using ServiceLib.Manager;
using ServiceLib.Models.Dto; using ServiceLib.Models.Dto;
using ServiceLib.Models.Entities; using ServiceLib.Models.Entities;
using ServiceLib.Services; using ServiceLib.Services;
@@ -46,7 +47,7 @@ public sealed partial class V2rayRuntime
await _mutations.RunAsync(async () => await _mutations.RunAsync(async () =>
{ {
Config.SubIndexId = subscriptionId ?? string.Empty; Config.SubIndexId = subscriptionId ?? string.Empty;
await EnsureConfigSaveSucceededAsync(() => ConfigHandler.SaveConfig(Config)); await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.Instance.SaveConfig());
}); });
_events.Publish("profiles-changed", new { subscriptionId = Config.SubIndexId }); _events.Publish("profiles-changed", new { subscriptionId = Config.SubIndexId });
return OperationView.Ok(ApiMessageKeys.CommonCompleted, new { subscriptionId = Config.SubIndexId }); return OperationView.Ok(ApiMessageKeys.CommonCompleted, new { subscriptionId = Config.SubIndexId });
@@ -67,10 +68,10 @@ public sealed partial class V2rayRuntime
var count = await _mutations.RunAsync(async () => var count = await _mutations.RunAsync(async () =>
{ {
var imported = await ConfigHandler.AddBatchServers(Config, request.Content, groupId, request.IsSubscription); var imported = await ConfigDbManager.AddBatchServers(Config, request.Content, groupId, request.IsSubscription);
if (imported > 0) if (imported > 0)
{ {
await EnsureConfigSaveSucceededAsync(() => ConfigHandler.SaveConfig(Config)); await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.Instance.SaveConfig());
} }
return imported; return imported;
}); });
@@ -167,13 +168,13 @@ public sealed partial class V2rayRuntime
try try
{ {
result = await _mutations.RunAsync(() => profile.ConfigType.IsGroupType() result = await _mutations.RunAsync(() => profile.ConfigType.IsGroupType()
? ConfigHandler.AddServerCommon(Config, profile) ? ConfigDbManager.AddServerCommon(Config, profile)
: profile.ConfigType switch : profile.ConfigType switch
{ {
EConfigType.Custom when isNew => ConfigHandler.AddCustomServer(Config, profile, blDelete: false), EConfigType.Custom when isNew => ConfigDbManager.AddCustomServer(Config, profile, blDelete: false),
EConfigType.Outbound when isNew => ConfigHandler.AddCustomOutboundServer(Config, profile, blDelete: false, toFile: true), EConfigType.Outbound when isNew => ConfigDbManager.AddCustomOutboundServer(Config, profile, blDelete: false, toFile: true),
EConfigType.Custom or EConfigType.Outbound => ConfigHandler.EditCustomServer(Config, profile), EConfigType.Custom or EConfigType.Outbound => ConfigDbManager.EditCustomServer(Config, profile),
_ => ConfigHandler.AddServer(Config, profile), _ => ConfigDbManager.AddServer(Config, profile),
}); });
} }
catch (Exception exception) catch (Exception exception)
@@ -270,14 +271,14 @@ public sealed partial class V2rayRuntime
await _mutations.RunAsync(async () => await _mutations.RunAsync(async () =>
{ {
if (await ConfigHandler.RemoveServers(Config, selected) != 0) if (await ConfigDbManager.RemoveServers(Config, selected) != 0)
{ {
throw new IOException("ServiceLib could not remove the selected profiles."); throw new IOException("ServiceLib could not remove the selected profiles.");
} }
if (removesCurrent) if (removesCurrent)
{ {
_ = await ConfigHandler.GetDefaultServer(Config); _ = await ConfigDbManager.GetDefaultServer(Config);
await EnsureConfigSaveSucceededAsync(() => ConfigHandler.SaveConfig(Config)); await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.Instance.SaveConfig());
} }
}); });
@@ -304,7 +305,7 @@ public sealed partial class V2rayRuntime
return OperationView.Fail("profile_not_found", ApiMessageKeys.ProfileNotFound); return OperationView.Fail("profile_not_found", ApiMessageKeys.ProfileNotFound);
} }
if (await _mutations.RunAsync(() => ConfigHandler.CopyServer(Config, items)) != 0) if (await _mutations.RunAsync(() => ConfigDbManager.CopyServer(Config, items)) != 0)
{ {
return OperationView.Fail("profile_copy_failed", ApiMessageKeys.CommonInvalidInput); return OperationView.Fail("profile_copy_failed", ApiMessageKeys.CommonInvalidInput);
} }
@@ -326,7 +327,7 @@ public sealed partial class V2rayRuntime
return OperationView.Fail("profile_not_found", ApiMessageKeys.ProfileNotFound); return OperationView.Fail("profile_not_found", ApiMessageKeys.ProfileNotFound);
} }
if (await _mutations.RunAsync(() => ConfigHandler.MoveToGroup(Config, items, request.SubscriptionId ?? string.Empty)) != 0) if (await _mutations.RunAsync(() => ConfigDbManager.MoveToGroup(Config, items, request.SubscriptionId ?? string.Empty)) != 0)
{ {
return OperationView.Fail("profile_move_failed", ApiMessageKeys.CommonInvalidInput); return OperationView.Fail("profile_move_failed", ApiMessageKeys.CommonInvalidInput);
} }
@@ -345,7 +346,7 @@ public sealed partial class V2rayRuntime
return OperationView.Fail("profile_not_in_group", ApiMessageKeys.ProfileNotInGroup); return OperationView.Fail("profile_not_in_group", ApiMessageKeys.ProfileNotInGroup);
} }
var result = await _mutations.RunAsync(() => ConfigHandler.MoveServer(Config, orderedIds, index, request.Direction, request.Position)); var result = await _mutations.RunAsync(() => ConfigDbManager.MoveServer(Config, orderedIds, index, request.Direction, request.Position));
_events.Publish("profiles-changed", new { subscriptionId = groupId }); _events.Publish("profiles-changed", new { subscriptionId = groupId });
return result == 0 return result == 0
? OperationView.Ok(ApiMessageKeys.ProfileOrderSaved) ? OperationView.Ok(ApiMessageKeys.ProfileOrderSaved)
@@ -360,7 +361,7 @@ public sealed partial class V2rayRuntime
return OperationView.Fail("profile_sort_column_invalid", ApiMessageKeys.CommonInvalidInput); return OperationView.Fail("profile_sort_column_invalid", ApiMessageKeys.CommonInvalidInput);
} }
var result = await _mutations.RunAsync(() => ConfigHandler.SortServers(Config, groupId, request.Column, request.Ascending)); var result = await _mutations.RunAsync(() => ConfigDbManager.SortServers(Config, groupId, request.Column, request.Ascending));
_events.Publish("profiles-changed", new { subscriptionId = groupId }); _events.Publish("profiles-changed", new { subscriptionId = groupId });
return result == 0 return result == 0
? OperationView.Ok(ApiMessageKeys.ProfileOrderSaved) ? OperationView.Ok(ApiMessageKeys.ProfileOrderSaved)
@@ -369,14 +370,14 @@ public sealed partial class V2rayRuntime
public async Task<OperationView> RemoveDuplicateProfilesAsync(string? subscriptionId) public async Task<OperationView> RemoveDuplicateProfilesAsync(string? subscriptionId)
{ {
var result = await _mutations.RunAsync(() => ConfigHandler.DedupServerList(Config, subscriptionId ?? Config.SubIndexId ?? string.Empty)); var result = await _mutations.RunAsync(() => ConfigDbManager.DedupServerList(Config, subscriptionId ?? Config.SubIndexId ?? string.Empty));
_events.Publish("profiles-changed", new { subscriptionId = subscriptionId ?? Config.SubIndexId }); _events.Publish("profiles-changed", new { subscriptionId = subscriptionId ?? Config.SubIndexId });
return OperationView.Ok(ApiMessageKeys.ProfileDeduplicated, new { removed = result.Item1 - result.Item2 }); return OperationView.Ok(ApiMessageKeys.ProfileDeduplicated, new { removed = result.Item1 - result.Item2 });
} }
public async Task<OperationView> RemoveInvalidProfilesAsync(string? subscriptionId) public async Task<OperationView> RemoveInvalidProfilesAsync(string? subscriptionId)
{ {
var count = await _mutations.RunAsync(() => ConfigHandler.RemoveInvalidServerResult(Config, subscriptionId ?? Config.SubIndexId ?? string.Empty)); var count = await _mutations.RunAsync(() => ConfigDbManager.RemoveInvalidServerResult(Config, subscriptionId ?? Config.SubIndexId ?? string.Empty));
_events.Publish("profiles-changed", new { subscriptionId = subscriptionId ?? Config.SubIndexId }); _events.Publish("profiles-changed", new { subscriptionId = subscriptionId ?? Config.SubIndexId });
return count < 0 return count < 0
? OperationView.Ok(ApiMessageKeys.CommonCompleted, new { removed = 0 }) ? OperationView.Ok(ApiMessageKeys.CommonCompleted, new { removed = 0 })
@@ -396,8 +397,8 @@ public sealed partial class V2rayRuntime
} }
var result = await _mutations.RunAsync(() => byRegion var result = await _mutations.RunAsync(() => byRegion
? ConfigHandler.AddGroupRegionServer(Config, subscription) ? ConfigDbManager.AddGroupRegionServer(Config, subscription)
: ConfigHandler.AddGroupAllServer(Config, subscription)); : ConfigDbManager.AddGroupAllServer(Config, subscription));
if (!result.Success) if (!result.Success)
{ {
return OperationView.Fail("profile_group_empty", ApiMessageKeys.ProfileGrouped, result.Data); return OperationView.Fail("profile_group_empty", ApiMessageKeys.ProfileGrouped, result.Data);
@@ -1,6 +1,4 @@
using ServiceLib.Common; using ServiceLib.Common;
using ServiceLib.Handler;
using ServiceLib.Manager;
using ServiceLib.Models.Entities; using ServiceLib.Models.Entities;
using ServiceLib.Services; using ServiceLib.Services;
using v2rayN.WebAPI.Contracts; using v2rayN.WebAPI.Contracts;
@@ -65,7 +63,7 @@ public sealed partial class V2rayRuntime
await using var operation = await _operations.EnterOperationAsync(token); await using var operation = await _operations.EnterOperationAsync(token);
await _mutations.RunAsync(async () => await _mutations.RunAsync(async () =>
{ {
await EnsureConfigSaveSucceededAsync(() => ConfigHandler.SaveConfig(Config)); await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.Instance.SaveConfig());
await ProfileExManager.Instance.SaveTo(); await ProfileExManager.Instance.SaveTo();
}, operation.Token); }, operation.Token);
}, cancellationToken); }, cancellationToken);
@@ -256,7 +256,7 @@ public sealed partial class V2rayRuntime
} }
Config.RoutingBasicItem.DomainStrategy = input.DomainStrategy!; Config.RoutingBasicItem.DomainStrategy = input.DomainStrategy!;
Config.RoutingBasicItem.DomainStrategy4Singbox = input.DomainStrategy4Singbox!; Config.RoutingBasicItem.DomainStrategy4Singbox = input.DomainStrategy4Singbox!;
await EnsureConfigSaveSucceededAsync(() => ConfigHandler.SaveConfig(Config)); await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.Instance.SaveConfig());
}); });
} }
catch (Exception exception) catch (Exception exception)
@@ -264,7 +264,7 @@ public sealed partial class V2rayRuntime
RestoreConfigValues(Config, oldConfig); RestoreConfigValues(Config, oldConfig);
try try
{ {
await _mutations.RunAsync(() => EnsureConfigSaveSucceededAsync(() => ConfigHandler.SaveConfig(Config))); await _mutations.RunAsync(() => EnsureConfigSaveSucceededAsync(() => ConfigTextManager.Instance.SaveConfig()));
} }
catch (Exception rollbackException) catch (Exception rollbackException)
{ {
@@ -314,7 +314,7 @@ public sealed partial class V2rayRuntime
await _mutations.RunAsync(async () => await _mutations.RunAsync(async () =>
{ {
ApplyInboundSettings(Config.Inbound[0], input); ApplyInboundSettings(Config.Inbound[0], input);
await EnsureConfigSaveSucceededAsync(() => ConfigHandler.SaveConfig(Config)); await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.Instance.SaveConfig());
}); });
return await CompleteCoreAffectingChangeAsync("inbound", fingerprint != GetCoreConfigurationFingerprint(), applyContext); return await CompleteCoreAffectingChangeAsync("inbound", fingerprint != GetCoreConfigurationFingerprint(), applyContext);
@@ -371,7 +371,7 @@ public sealed partial class V2rayRuntime
Config.Fragment4RayItem.Lengths = fragmentLengths.ToList(); Config.Fragment4RayItem.Lengths = fragmentLengths.ToList();
Config.Fragment4RayItem.Delays = fragmentDelays.ToList(); Config.Fragment4RayItem.Delays = fragmentDelays.ToList();
Config.Fragment4RayItem.MaxSplit = input.FragmentMaxSplit; Config.Fragment4RayItem.MaxSplit = input.FragmentMaxSplit;
await EnsureConfigSaveSucceededAsync(() => ConfigHandler.SaveConfig(Config)); await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.Instance.SaveConfig());
}); });
return await CompleteCoreAffectingChangeAsync("core", fingerprint != GetCoreConfigurationFingerprint(), applyContext); return await CompleteCoreAffectingChangeAsync("core", fingerprint != GetCoreConfigurationFingerprint(), applyContext);
@@ -398,7 +398,7 @@ public sealed partial class V2rayRuntime
Config.ConstItem.SrsSourceUrl = input.SrsSourceUrl; Config.ConstItem.SrsSourceUrl = input.SrsSourceUrl;
Config.ConstItem.RouteRulesTemplateSourceUrl = input.RouteRulesTemplateSourceUrl; Config.ConstItem.RouteRulesTemplateSourceUrl = input.RouteRulesTemplateSourceUrl;
Config.ConstItem.SubConvertUrl = input.SubConvertUrl; Config.ConstItem.SubConvertUrl = input.SubConvertUrl;
await EnsureConfigSaveSucceededAsync(() => ConfigHandler.SaveConfig(Config)); await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.Instance.SaveConfig());
}); });
if (statisticsChanged) if (statisticsChanged)
@@ -431,7 +431,7 @@ public sealed partial class V2rayRuntime
Config.SpeedTestItem.MixedConcurrencyCount = Math.Max(input.MixedConcurrencyCount, Global.SpeedTestConcurrencyCountMin); Config.SpeedTestItem.MixedConcurrencyCount = Math.Max(input.MixedConcurrencyCount, Global.SpeedTestConcurrencyCountMin);
Config.SpeedTestItem.IPAPIUrl = input.IPAPIUrl; Config.SpeedTestItem.IPAPIUrl = input.IPAPIUrl;
Config.SpeedTestItem.UdpTestTarget = input.UdpTestTarget; Config.SpeedTestItem.UdpTestTarget = input.UdpTestTarget;
await EnsureConfigSaveSucceededAsync(() => ConfigHandler.SaveConfig(Config)); await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.Instance.SaveConfig());
}); });
_events.Publish("settings-changed", new { section = "speedtest", restartRequired = false }); _events.Publish("settings-changed", new { section = "speedtest", restartRequired = false });
return OperationView.Ok(ApiMessageKeys.SpeedTestSettingsSaved); return OperationView.Ok(ApiMessageKeys.SpeedTestSettingsSaved);
@@ -459,7 +459,7 @@ public sealed partial class V2rayRuntime
item.CoreType = mapping.CoreType; item.CoreType = mapping.CoreType;
} }
} }
await EnsureConfigSaveSucceededAsync(() => ConfigHandler.SaveConfig(Config)); await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.Instance.SaveConfig());
}); });
return await CompleteCoreAffectingChangeAsync("core-types", fingerprint != GetCoreConfigurationFingerprint(), applyContext); return await CompleteCoreAffectingChangeAsync("core-types", fingerprint != GetCoreConfigurationFingerprint(), applyContext);
} }
@@ -491,7 +491,7 @@ public sealed partial class V2rayRuntime
{ {
Config.RoutingBasicItem.DomainStrategy = input.DomainStrategy!; Config.RoutingBasicItem.DomainStrategy = input.DomainStrategy!;
Config.RoutingBasicItem.DomainStrategy4Singbox = input.DomainStrategy4Singbox!; Config.RoutingBasicItem.DomainStrategy4Singbox = input.DomainStrategy4Singbox!;
await EnsureConfigSaveSucceededAsync(() => ConfigHandler.SaveConfig(Config)); await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.Instance.SaveConfig());
}); });
return await CompleteCoreAffectingChangeAsync("routing", fingerprint != GetCoreConfigurationFingerprint(), applyContext); return await CompleteCoreAffectingChangeAsync("routing", fingerprint != GetCoreConfigurationFingerprint(), applyContext);
} }
@@ -506,7 +506,7 @@ public sealed partial class V2rayRuntime
await _mutations.RunAsync(async () => await _mutations.RunAsync(async () =>
{ {
Config.SimpleDNSItem = input; Config.SimpleDNSItem = input;
await EnsureConfigSaveSucceededAsync(() => ConfigHandler.SaveConfig(Config)); await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.Instance.SaveConfig());
}); });
return await CompleteCoreAffectingChangeAsync("dns", fingerprint != GetCoreConfigurationFingerprint(), applyContext); return await CompleteCoreAffectingChangeAsync("dns", fingerprint != GetCoreConfigurationFingerprint(), applyContext);
} }
@@ -543,7 +543,7 @@ public sealed partial class V2rayRuntime
|| current.DomainDNSAddress != input.DomainDNSAddress || current.DomainDNSAddress != input.DomainDNSAddress
|| current.Remarks != (input.Remarks ?? current.Remarks); || current.Remarks != (input.Remarks ?? current.Remarks);
var item = ApplyDnsProfileInput(current, coreType, input); var item = ApplyDnsProfileInput(current, coreType, input);
return (Result: await ConfigHandler.SaveDNSItems(Config, item), Changed: changed); return (Result: await ConfigDbManager.SaveDNSItems(Config, item), Changed: changed);
}); });
if (result.Result == -2) if (result.Result == -2)
{ {
@@ -668,8 +668,8 @@ public sealed partial class V2rayRuntime
item.RuleNum = parsedRules.Count; item.RuleNum = parsedRules.Count;
} }
var result = parsedRules.Count == 0 var result = parsedRules.Count == 0
? await ConfigHandler.SaveRoutingItem(Config, item) ? await ConfigDbManager.SaveRoutingItem(Config, item)
: await ConfigHandler.AddBatchRoutingRules(item, JsonUtils.Serialize(parsedRules, false)); : await ConfigDbManager.AddBatchRoutingRules(item, JsonUtils.Serialize(parsedRules, false));
return (Result: result, Item: (RoutingItem?)item, Changed: changed); return (Result: result, Item: (RoutingItem?)item, Changed: changed);
}); });
if (save.Result == -2) if (save.Result == -2)
@@ -696,14 +696,14 @@ public sealed partial class V2rayRuntime
{ {
return (Removed: false, AffectsCore: false); return (Removed: false, AffectsCore: false);
} }
await ConfigHandler.RemoveRoutingItem(item); await ConfigDbManager.RemoveRoutingItem(item);
if (item.IsActive) if (item.IsActive)
{ {
var remaining = await AppManager.Instance.RoutingItems() ?? []; var remaining = await AppManager.Instance.RoutingItems() ?? [];
var fallback = remaining.FirstOrDefault(); var fallback = remaining.FirstOrDefault();
if (fallback is not null) if (fallback is not null)
{ {
if (await ConfigHandler.SetDefaultRouting(Config, fallback) != 0) if (await ConfigDbManager.SetDefaultRouting(Config, fallback) != 0)
{ {
throw new IOException("ServiceLib could not select the fallback routing profile."); throw new IOException("ServiceLib could not select the fallback routing profile.");
} }
@@ -711,7 +711,7 @@ public sealed partial class V2rayRuntime
else else
{ {
Config.RoutingBasicItem.RoutingIndexId = string.Empty; Config.RoutingBasicItem.RoutingIndexId = string.Empty;
await EnsureConfigSaveSucceededAsync(() => ConfigHandler.SaveConfig(Config)); await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.Instance.SaveConfig());
} }
} }
return (Removed: true, AffectsCore: item.IsActive); return (Removed: true, AffectsCore: item.IsActive);
@@ -736,7 +736,7 @@ public sealed partial class V2rayRuntime
return (Result: -2, Changed: false); return (Result: -2, Changed: false);
} }
var changed = !item.IsActive; var changed = !item.IsActive;
return (Result: changed ? await ConfigHandler.SetDefaultRouting(Config, item) : 0, Changed: changed); return (Result: changed ? await ConfigDbManager.SetDefaultRouting(Config, item) : 0, Changed: changed);
}); });
if (result.Result == -2) if (result.Result == -2)
{ {
@@ -783,7 +783,7 @@ public sealed partial class V2rayRuntime
{ {
return -2; return -2;
} }
return await ConfigHandler.AddBatchRoutingRules(item, JsonUtils.Serialize(rules, false)); return await ConfigDbManager.AddBatchRoutingRules(item, JsonUtils.Serialize(rules, false));
} }
private async Task<string> GetActiveRoutingSignatureAsync() private async Task<string> GetActiveRoutingSignatureAsync()
@@ -882,7 +882,7 @@ public sealed partial class V2rayRuntime
{ {
return -3; return -3;
} }
if (await ConfigHandler.MoveRoutingRule(rules, index, direction, position) != 0) if (await ConfigDbManager.MoveRoutingRule(rules, index, direction, position) != 0)
{ {
return -4; return -4;
} }
@@ -937,7 +937,7 @@ public sealed partial class V2rayRuntime
await using var applyContext = await BeginCoreSettingsApplyAsync(); await using var applyContext = await BeginCoreSettingsApplyAsync();
if (applyContext.Failure is { } applyFailure) return applyFailure; if (applyContext.Failure is { } applyFailure) return applyFailure;
var before = await GetActiveRoutingSignatureAsync(); var before = await GetActiveRoutingSignatureAsync();
var result = await _mutations.RunAsync(() => ConfigHandler.InitRouting(Config, true)); var result = await _mutations.RunAsync(() => ConfigDbManager.InitRouting(Config, true));
if (result != 0) if (result != 0)
{ {
return OperationView.Fail("routing_import_failed", ApiMessageKeys.RoutingSaveFailed); return OperationView.Fail("routing_import_failed", ApiMessageKeys.RoutingSaveFailed);
@@ -988,7 +988,7 @@ public sealed partial class V2rayRuntime
return -2; return -2;
} }
var item = ApplyCoreConfigTemplateInput(current, coreType, input); var item = ApplyCoreConfigTemplateInput(current, coreType, input);
return await ConfigHandler.SaveFullConfigTemplate(Config, item); return await ConfigDbManager.SaveFullConfigTemplate(Config, item);
}); });
if (result == -2) if (result == -2)
{ {
@@ -1097,7 +1097,7 @@ public sealed partial class V2rayRuntime
await SQLiteHelper.Instance.DeleteAllAsync<DNSItem>(); await SQLiteHelper.Instance.DeleteAllAsync<DNSItem>();
foreach (var item in stage.DnsItems) foreach (var item in stage.DnsItems)
{ {
if (await ConfigHandler.SaveDNSItems(Config, item) != 0) if (await ConfigDbManager.SaveDNSItems(Config, item) != 0)
{ {
throw new IOException($"The {item.CoreType} DNS profile could not be saved."); throw new IOException($"The {item.CoreType} DNS profile could not be saved.");
} }
@@ -1105,7 +1105,7 @@ public sealed partial class V2rayRuntime
// Default routing uses embedded data only; this call performs no network I/O // Default routing uses embedded data only; this call performs no network I/O
// because the route template source was cleared in the staged plan. // because the route template source was cleared in the staged plan.
if (await ConfigHandler.InitRouting(Config, false) != 0) if (await ConfigDbManager.InitRouting(Config, false) != 0)
{ {
throw new IOException("The built-in routing profiles could not be initialized."); throw new IOException("The built-in routing profiles could not be initialized.");
} }
@@ -1114,7 +1114,7 @@ public sealed partial class V2rayRuntime
{ {
foreach (var item in stage.DnsItems) foreach (var item in stage.DnsItems)
{ {
if (await ConfigHandler.SaveDNSItems(Config, item) != 0) if (await ConfigDbManager.SaveDNSItems(Config, item) != 0)
{ {
throw new IOException($"The {item.CoreType} DNS profile could not be saved."); throw new IOException($"The {item.CoreType} DNS profile could not be saved.");
} }
@@ -1125,7 +1125,7 @@ public sealed partial class V2rayRuntime
var item = await AppManager.Instance.GetRoutingItem(itemId); var item = await AppManager.Instance.GetRoutingItem(itemId);
if (item is not null) if (item is not null)
{ {
await ConfigHandler.RemoveRoutingItem(item); await ConfigDbManager.RemoveRoutingItem(item);
} }
} }
@@ -1144,7 +1144,7 @@ public sealed partial class V2rayRuntime
foreach (var item in stage.Routing.Items) foreach (var item in stage.Routing.Items)
{ {
item.Sort = ++nextSort; item.Sort = ++nextSort;
if (await ConfigHandler.AddBatchRoutingRules(item, item.RuleSet ?? "[]") != 0) if (await ConfigDbManager.AddBatchRoutingRules(item, item.RuleSet ?? "[]") != 0)
{ {
throw new IOException($"The routing profile '{item.Remarks}' could not be saved."); throw new IOException($"The routing profile '{item.Remarks}' could not be saved.");
} }
@@ -1153,7 +1153,7 @@ public sealed partial class V2rayRuntime
var defaultItem = stage.Routing.DefaultRemarks is { } remarks var defaultItem = stage.Routing.DefaultRemarks is { } remarks
? stage.Routing.Items.FirstOrDefault(item => item.Remarks == remarks) ? stage.Routing.Items.FirstOrDefault(item => item.Remarks == remarks)
: null; : null;
if (defaultItem is not null && await ConfigHandler.SetDefaultRouting(Config, defaultItem) != 0) if (defaultItem is not null && await ConfigDbManager.SetDefaultRouting(Config, defaultItem) != 0)
{ {
throw new IOException("The first staged routing profile could not be activated."); throw new IOException("The first staged routing profile could not be activated.");
} }
@@ -1163,7 +1163,7 @@ public sealed partial class V2rayRuntime
{ {
var existingDefault = currentRoutes.FirstOrDefault(item => item.Id == existingDefaultId); var existingDefault = currentRoutes.FirstOrDefault(item => item.Id == existingDefaultId);
if (existingDefault is not null && !existingDefault.IsActive if (existingDefault is not null && !existingDefault.IsActive
&& await ConfigHandler.SetDefaultRouting(Config, existingDefault) != 0) && await ConfigDbManager.SetDefaultRouting(Config, existingDefault) != 0)
{ {
throw new IOException("The migrated default routing profile could not be activated."); throw new IOException("The migrated default routing profile could not be activated.");
} }
@@ -1171,7 +1171,7 @@ public sealed partial class V2rayRuntime
} }
token.ThrowIfCancellationRequested(); token.ThrowIfCancellationRequested();
await EnsureConfigSaveSucceededAsync(() => ConfigHandler.SaveConfig(Config)); await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.Instance.SaveConfig());
token.ThrowIfCancellationRequested(); token.ThrowIfCancellationRequested();
}, token), }, token),
() => RestoreRegionalPresetSnapshotAsync(applyContext)); () => RestoreRegionalPresetSnapshotAsync(applyContext));
@@ -1287,7 +1287,7 @@ public sealed partial class V2rayRuntime
await _mutations.RunAsync(async () => await _mutations.RunAsync(async () =>
{ {
RestoreConfigValues(Config, context.OldConfig); RestoreConfigValues(Config, context.OldConfig);
await EnsureConfigSaveSucceededAsync(() => ConfigHandler.SaveConfig(Config)); await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.Instance.SaveConfig());
await SQLiteHelper.Instance.DeleteAllAsync<RoutingItem>(); await SQLiteHelper.Instance.DeleteAllAsync<RoutingItem>();
if (context.OldRoutingItems.Length > 0 if (context.OldRoutingItems.Length > 0
@@ -1563,7 +1563,7 @@ public sealed partial class V2rayRuntime
try try
{ {
RestoreConfigValues(Config, context.OldConfig); RestoreConfigValues(Config, context.OldConfig);
await _mutations.RunAsync(() => EnsureConfigSaveSucceededAsync(() => ConfigHandler.SaveConfig(Config))); await _mutations.RunAsync(() => EnsureConfigSaveSucceededAsync(() => ConfigTextManager.Instance.SaveConfig()));
configRestored = true; configRestored = true;
await _mutations.RunAsync(async () => await _mutations.RunAsync(async () =>
{ {
+22 -22
View File
@@ -7,7 +7,6 @@ using ServiceLib.Enums;
using ServiceLib.Handler; using ServiceLib.Handler;
using ServiceLib.Handler.Builder; using ServiceLib.Handler.Builder;
using ServiceLib.Helper; using ServiceLib.Helper;
using ServiceLib.Manager;
using ServiceLib.Models.Configs; using ServiceLib.Models.Configs;
using ServiceLib.Models.Dto; using ServiceLib.Models.Dto;
using ServiceLib.Models.Entities; using ServiceLib.Models.Entities;
@@ -18,6 +17,7 @@ using NLog.Targets;
using v2rayN.WebAPI.Adapters; using v2rayN.WebAPI.Adapters;
using v2rayN.WebAPI.Contracts; using v2rayN.WebAPI.Contracts;
namespace v2rayN.WebAPI.Services; namespace v2rayN.WebAPI.Services;
public sealed partial class V2rayRuntime( public sealed partial class V2rayRuntime(
@@ -52,7 +52,7 @@ public sealed partial class V2rayRuntime(
private bool _restoring; private bool _restoring;
private int _restoreAndRestartRequested; private int _restoreAndRestartRequested;
private Config Config => AppManager.Instance.Config; private Config Config => ConfigTextManager.Instance.Config;
private CoreRuntimeSnapshot CurrentCoreRuntime => Volatile.Read(ref _coreRuntime); private CoreRuntimeSnapshot CurrentCoreRuntime => Volatile.Read(ref _coreRuntime);
public bool RestoreAndRestartRequested => Volatile.Read(ref _restoreAndRestartRequested) != 0; public bool RestoreAndRestartRequested => Volatile.Read(ref _restoreAndRestartRequested) != 0;
@@ -248,19 +248,19 @@ public sealed partial class V2rayRuntime(
{ {
Config.Inbound[0].AllowLANConn = allowProxyFromLan; Config.Inbound[0].AllowLANConn = allowProxyFromLan;
} }
await EnsureConfigSaveSucceededAsync(() => ConfigHandler.SaveConfig(Config)); await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.Instance.SaveConfig());
}); });
await ConfigHandler.InitBuiltinDNS(Config); await ConfigDbManager.InitBuiltinDNS(Config);
await BuiltinDnsProfileBootstrap.EnsureAsync( await BuiltinDnsProfileBootstrap.EnsureAsync(
Config, Config,
async () => await AppManager.Instance.DNSItems() ?? [], async () => await AppManager.Instance.DNSItems() ?? [],
ConfigHandler.SaveDNSItems); ConfigDbManager.SaveDNSItems);
await ConfigHandler.InitBuiltinFullConfigTemplate(Config); await ConfigDbManager.InitBuiltinFullConfigTemplate(Config);
// Keep startup aligned with Desktop's StatusBarViewModel. In particular, // Keep startup aligned with Desktop's StatusBarViewModel. In particular,
// InitBuiltinRouting owns the RoutingIndexId -> IsActive migration and must // InitBuiltinRouting owns the RoutingIndexId -> IsActive migration and must
// run even when a restored Desktop database already has routing rows. // run even when a restored Desktop database already has routing rows.
await ConfigHandler.InitBuiltinRouting(Config); await ConfigDbManager.InitBuiltinRouting(Config);
_ = await ConfigHandler.GetDefaultRouting(Config); _ = await ConfigDbManager.GetDefaultRouting(Config);
var restoredSubscriptions = await AppManager.Instance.SubItems() ?? []; var restoredSubscriptions = await AppManager.Instance.SubItems() ?? [];
var normalizedSubIndexId = NormalizeSelectedSubscriptionId( var normalizedSubIndexId = NormalizeSelectedSubscriptionId(
Config.SubIndexId, Config.SubIndexId,
@@ -271,8 +271,8 @@ public sealed partial class V2rayRuntime(
Config.SubIndexId = normalizedSubIndexId; Config.SubIndexId = normalizedSubIndexId;
} }
var selectedProfileId = Config.IndexId; var selectedProfileId = Config.IndexId;
var defaultProfile = await ConfigHandler.GetDefaultServer(Config); var defaultProfile = await ConfigDbManager.GetDefaultServer(Config);
await _mutations.RunAsync(() => EnsureConfigSaveSucceededAsync(() => ConfigHandler.SaveConfig(Config))); await _mutations.RunAsync(() => EnsureConfigSaveSucceededAsync(() => ConfigTextManager.Instance.SaveConfig()));
await ProfileExManager.Instance.Init(); await ProfileExManager.Instance.Init();
await CertPemManager.Instance.Init(Config); await CertPemManager.Instance.Init(Config);
// The Web frontend owns its runtime and rejects generated launch contexts that enable TUN. // The Web frontend owns its runtime and rejects generated launch contexts that enable TUN.
@@ -395,7 +395,7 @@ public sealed partial class V2rayRuntime(
steps.Add(new("configuration save", async deadline => steps.Add(new("configuration save", async deadline =>
{ {
await _mutations.RunAsync( await _mutations.RunAsync(
() => EnsureConfigSaveSucceededAsync(() => ConfigHandler.SaveConfig(Config)), () => EnsureConfigSaveSucceededAsync(() => ConfigTextManager.Instance.SaveConfig()),
deadline.Token); deadline.Token);
return true; return true;
})); }));
@@ -440,7 +440,7 @@ public sealed partial class V2rayRuntime(
} }
var item = ToSubItem(input, null); var item = ToSubItem(input, null);
var result = await _mutations.RunAsync(() => ConfigHandler.AddSubItem(Config, item)); var result = await _mutations.RunAsync(() => ConfigDbManager.AddSubItem(Config, item));
if (result != 0) if (result != 0)
{ {
return new(false, "subscription_save_failed", ApiMessageKeys.SubscriptionSaveFailed, null); return new(false, "subscription_save_failed", ApiMessageKeys.SubscriptionSaveFailed, null);
@@ -469,7 +469,7 @@ public sealed partial class V2rayRuntime(
var item = ToSubItem(input, existing); var item = ToSubItem(input, existing);
item.Id = id; item.Id = id;
var result = await ConfigHandler.AddSubItem(Config, item); var result = await ConfigDbManager.AddSubItem(Config, item);
if (result != 0) if (result != 0)
{ {
return new SubscriptionMutationResult(false, "subscription_save_failed", ApiMessageKeys.SubscriptionSaveFailed, null); return new SubscriptionMutationResult(false, "subscription_save_failed", ApiMessageKeys.SubscriptionSaveFailed, null);
@@ -499,14 +499,14 @@ public sealed partial class V2rayRuntime(
await _mutations.RunAsync(async () => await _mutations.RunAsync(async () =>
{ {
if (await ConfigHandler.DeleteSubItem(Config, id) != 0) if (await ConfigDbManager.DeleteSubItem(Config, id) != 0)
{ {
throw new IOException("ServiceLib could not delete the subscription."); throw new IOException("ServiceLib could not delete the subscription.");
} }
if (removesCurrentProfile) if (removesCurrentProfile)
{ {
_ = await ConfigHandler.GetDefaultServer(Config); _ = await ConfigDbManager.GetDefaultServer(Config);
await EnsureConfigSaveSucceededAsync(() => ConfigHandler.SaveConfig(Config)); await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.Instance.SaveConfig());
} }
}); });
@@ -555,7 +555,7 @@ public sealed partial class V2rayRuntime(
await handler.UpdateProcess(id); await handler.UpdateProcess(id);
operation.Token.ThrowIfCancellationRequested(); operation.Token.ThrowIfCancellationRequested();
await EnsureConfigSaveSucceededAsync(() => ConfigHandler.SaveConfig(Config)); await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.Instance.SaveConfig());
await UpdateSubscriptionTimestampLockedAsync(id); await UpdateSubscriptionTimestampLockedAsync(id);
}, operation.Token); }, operation.Token);
_events.Publish("profiles-changed", new { subscriptionId = id }); _events.Publish("profiles-changed", new { subscriptionId = id });
@@ -784,7 +784,7 @@ public sealed partial class V2rayRuntime(
await _mutations.RunAsync(async () => await _mutations.RunAsync(async () =>
{ {
Config.IndexId = profile.IndexId; Config.IndexId = profile.IndexId;
await EnsureConfigSaveSucceededAsync(() => ConfigHandler.SaveConfig(Config)); await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.Instance.SaveConfig());
}); });
} }
@@ -793,10 +793,10 @@ public sealed partial class V2rayRuntime(
private async Task<ProfileItem?> GetDefaultProfileAsync() => await _mutations.RunAsync(async () => private async Task<ProfileItem?> GetDefaultProfileAsync() => await _mutations.RunAsync(async () =>
{ {
var selected = await ConfigHandler.GetDefaultServer(Config); var selected = await ConfigDbManager.GetDefaultServer(Config);
if (selected is not null) if (selected is not null)
{ {
await EnsureConfigSaveSucceededAsync(() => ConfigHandler.SaveConfig(Config)); await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.Instance.SaveConfig());
} }
return selected; return selected;
}); });
@@ -1182,7 +1182,7 @@ public sealed partial class V2rayRuntime(
if (item is not null) if (item is not null)
{ {
item.UpdateTime = updateTime; item.UpdateTime = updateTime;
if (await ConfigHandler.AddSubItem(Config, item) != 0) if (await ConfigDbManager.AddSubItem(Config, item) != 0)
{ {
throw new IOException("ServiceLib could not save the subscription timestamp."); throw new IOException("ServiceLib could not save the subscription timestamp.");
} }
@@ -1195,7 +1195,7 @@ public sealed partial class V2rayRuntime(
if (item.Enabled) if (item.Enabled)
{ {
item.UpdateTime = updateTime; item.UpdateTime = updateTime;
if (await ConfigHandler.AddSubItem(Config, item) != 0) if (await ConfigDbManager.AddSubItem(Config, item) != 0)
{ {
throw new IOException("ServiceLib could not save the subscription timestamp."); throw new IOException("ServiceLib could not save the subscription timestamp.");
} }
@@ -0,0 +1,9 @@
global using ServiceLib;
global using ServiceLib.Common;
global using ServiceLib.Enums;
global using ServiceLib.Manager;
global using ServiceLib.Manager.Data;
global using ServiceLib.Models.Configs;
global using ServiceLib.Models.CoreConfigs;
global using ServiceLib.Models.Dto;
global using ServiceLib.Models.Entities;
@@ -1,6 +1,6 @@
using ServiceLib; using ServiceLib;
using ServiceLib.Enums; using ServiceLib.Enums;
using ServiceLib.Handler;
using ServiceLib.Models.Configs; using ServiceLib.Models.Configs;
using ServiceLib.Models.Entities; using ServiceLib.Models.Entities;
using v2rayN.WebAPI.Contracts; using v2rayN.WebAPI.Contracts;
@@ -29,7 +29,7 @@ public class ParityValidationTests
await code.Should().BeEqualTo("ok"); await code.Should().BeEqualTo("ok");
await profile.IsValid().Should().BeFalse(); await profile.IsValid().Should().BeFalse();
var result = await ConfigHandler.AddShadowsocksServer(new Config(), profile, toFile: false); var result = await ConfigDbManager.AddShadowsocksServer(new Config(), profile, toFile: false);
await result.Should().BeEqualTo(0); await result.Should().BeEqualTo(0);
await profile.ConfigVersion.Should().BeEqualTo(4); await profile.ConfigVersion.Should().BeEqualTo(4);
@@ -46,7 +46,7 @@ public class ParityValidationTests
await code.Should().BeEqualTo("ok"); await code.Should().BeEqualTo("ok");
await profile.IsValid().Should().BeTrue(); await profile.IsValid().Should().BeTrue();
var result = await ConfigHandler.AddShadowsocksServer(new Config(), profile, toFile: false); var result = await ConfigDbManager.AddShadowsocksServer(new Config(), profile, toFile: false);
await result.Should().BeEqualTo(0); await result.Should().BeEqualTo(0);
} }
@@ -59,7 +59,7 @@ public class ParityValidationTests
var valid = V2rayRuntime.TryValidateProfile(profile, out _, out _); var valid = V2rayRuntime.TryValidateProfile(profile, out _, out _);
await valid.Should().BeTrue(); await valid.Should().BeTrue();
var result = await ConfigHandler.AddShadowsocksServer(new Config(), profile, toFile: false); var result = await ConfigDbManager.AddShadowsocksServer(new Config(), profile, toFile: false);
await result.Should().BeEqualTo(-1); await result.Should().BeEqualTo(-1);
} }
@@ -3,7 +3,7 @@ using System.Net;
using ServiceLib; using ServiceLib;
using ServiceLib.Common; using ServiceLib.Common;
using ServiceLib.Enums; using ServiceLib.Enums;
using ServiceLib.Handler;
using ServiceLib.Models.Configs; using ServiceLib.Models.Configs;
using ServiceLib.Models.Dto; using ServiceLib.Models.Dto;
using ServiceLib.Models.Entities; using ServiceLib.Models.Entities;
@@ -112,7 +112,7 @@ public class RegionalPresetStagingTests
await applyCalled.Should().BeTrue(); await applyCalled.Should().BeTrue();
await capturedStage.Should().NotBeNull(); await capturedStage.Should().NotBeNull();
await capturedStage!.DnsItems[0].NormalDNS.Should().BeEqualTo("existing-xray-data"); await capturedStage!.DnsItems[0].NormalDNS.Should().BeEqualTo("existing-xray-data");
await capturedStage.SimpleDnsItem.RemoteDNS.Should().BeEqualTo(ConfigHandler.InitBuiltinSimpleDNS().RemoteDNS); await capturedStage.SimpleDnsItem.RemoteDNS.Should().BeEqualTo(ConfigDbManager.InitBuiltinSimpleDNS().RemoteDNS);
await capturedStage.Routing.IsBuiltinFallback.Should().BeTrue(); await capturedStage.Routing.IsBuiltinFallback.Should().BeTrue();
await capturedStage.Routing.Items.Count.Should().BeEqualTo(3); await capturedStage.Routing.Items.Count.Should().BeEqualTo(3);
await config.ConstItem.GeoSourceUrl.Should().BeEqualTo("original-geo-source"); await config.ConstItem.GeoSourceUrl.Should().BeEqualTo("original-geo-source");
@@ -566,7 +566,7 @@ public class RegionalPresetStagingTests
var staged = await stager.StageAsync(EPresetType.Russia, CreateDnsRows(), [], null, CancellationToken.None); var staged = await stager.StageAsync(EPresetType.Russia, CreateDnsRows(), [], null, CancellationToken.None);
var builtin = ConfigHandler.InitBuiltinSimpleDNS(); var builtin = ConfigDbManager.InitBuiltinSimpleDNS();
await staged.SimpleDnsItem.RemoteDNS.Should().BeEqualTo(builtin.RemoteDNS); await staged.SimpleDnsItem.RemoteDNS.Should().BeEqualTo(builtin.RemoteDNS);
await staged.SimpleDnsItem.DirectDNS.Should().BeEqualTo(builtin.DirectDNS); await staged.SimpleDnsItem.DirectDNS.Should().BeEqualTo(builtin.DirectDNS);
await staged.DnsItems.All(item => item.Enabled).Should().BeTrue(); await staged.DnsItems.All(item => item.Enabled).Should().BeTrue();
@@ -671,7 +671,7 @@ public class RegionalPresetStagingTests
var staged = await stager.StageAsync(EPresetType.Russia, CreateDnsRows(), [], null, CancellationToken.None); var staged = await stager.StageAsync(EPresetType.Russia, CreateDnsRows(), [], null, CancellationToken.None);
await staged.DnsItems[0].NormalDNS.Should().BeEqualTo("existing-xray-data"); await staged.DnsItems[0].NormalDNS.Should().BeEqualTo("existing-xray-data");
await staged.SimpleDnsItem.RemoteDNS.Should().BeEqualTo(ConfigHandler.InitBuiltinSimpleDNS().RemoteDNS); await staged.SimpleDnsItem.RemoteDNS.Should().BeEqualTo(ConfigDbManager.InitBuiltinSimpleDNS().RemoteDNS);
await staged.Routing.IsBuiltinFallback.Should().BeTrue(); await staged.Routing.IsBuiltinFallback.Should().BeTrue();
await staged.Routing.Items.Count.Should().BeEqualTo(3); await staged.Routing.Items.Count.Should().BeEqualTo(3);
} }
@@ -2,7 +2,6 @@ using System.Reflection;
using System.Text.Json.Nodes; using System.Text.Json.Nodes;
using ServiceLib; using ServiceLib;
using ServiceLib.Enums; using ServiceLib.Enums;
using ServiceLib.Handler;
using ServiceLib.Models; using ServiceLib.Models;
using ServiceLib.Models.Configs; using ServiceLib.Models.Configs;
using ServiceLib.Models.CoreConfigs; using ServiceLib.Models.CoreConfigs;
@@ -229,7 +228,7 @@ public class SniffingSettingsIntegrationTests
], ],
GlobalHotkeys = [], GlobalHotkeys = [],
CoreTypeItem = [new CoreTypeItem { ConfigType = EConfigType.VMess, CoreType = ECoreType.Xray }], CoreTypeItem = [new CoreTypeItem { ConfigType = EConfigType.VMess, CoreType = ECoreType.Xray }],
SimpleDNSItem = ConfigHandler.InitBuiltinSimpleDNS(), SimpleDNSItem = ConfigDbManager.InitBuiltinSimpleDNS(),
HappyEyeballs4RayItem = new HappyEyeballs4RayItem(), HappyEyeballs4RayItem = new HappyEyeballs4RayItem(),
IndexId = string.Empty, IndexId = string.Empty,
SubIndexId = string.Empty, SubIndexId = string.Empty,
+2 -2
View File
@@ -11,7 +11,7 @@ public class WindowBase<TViewModel> : ReactiveWindow<TViewModel> where TViewMode
{ {
try try
{ {
var sizeItem = ConfigHandler.GetWindowSizeItem(AppManager.Instance.Config, GetType().Name); var sizeItem = ConfigTextManager.GetWindowSizeItem(ConfigTextManager.Instance.Config, GetType().Name);
if (sizeItem == null) if (sizeItem == null)
{ {
return; return;
@@ -32,7 +32,7 @@ public class WindowBase<TViewModel> : ReactiveWindow<TViewModel> where TViewMode
try try
{ {
ConfigHandler.SaveWindowSizeItem(AppManager.Instance.Config, GetType().Name, Width, Height); ConfigTextManager.SaveWindowSizeItem(ConfigTextManager.Instance.Config, GetType().Name, Width, Height);
} }
catch { } catch { }
} }
@@ -10,7 +10,7 @@ public class MaterialDesignFonts
{ {
try try
{ {
var fontFamily = AppManager.Instance.Config.UiItem.CurrentFontFamily; var fontFamily = ConfigTextManager.Instance.Config.UiItem.CurrentFontFamily;
if (fontFamily.IsNotEmpty()) if (fontFamily.IsNotEmpty())
{ {
var fontPath = Utils.GetFontsPath(); var fontPath = Utils.GetFontsPath();
+1
View File
@@ -28,6 +28,7 @@ global using ServiceLib.Enums;
global using ServiceLib.Events; global using ServiceLib.Events;
global using ServiceLib.Handler; global using ServiceLib.Handler;
global using ServiceLib.Manager; global using ServiceLib.Manager;
global using ServiceLib.Manager.Data;
global using ServiceLib.Models.CoreConfigs; global using ServiceLib.Models.CoreConfigs;
global using ServiceLib.Models.Configs; global using ServiceLib.Models.Configs;
global using ServiceLib.Models.Dto; global using ServiceLib.Models.Dto;
+1 -1
View File
@@ -22,7 +22,7 @@ public sealed partial class HotkeyManager
private void Init() private void Init()
{ {
_hotkeyTriggerDic.Clear(); _hotkeyTriggerDic.Clear();
foreach (var item in AppManager.Instance.Config.GlobalHotkeys) foreach (var item in ConfigTextManager.Instance.Config.GlobalHotkeys)
{ {
if (item.KeyCode != null && (Key)item.KeyCode != Key.None) if (item.KeyCode != null && (Key)item.KeyCode != Key.None)
{ {
+2 -1
View File
@@ -1,6 +1,7 @@
using System.Drawing; using System.Drawing;
using System.Windows.Media.Imaging; using System.Windows.Media.Imaging;
namespace v2rayN.Manager; namespace v2rayN.Manager;
public sealed class WindowsManager public sealed class WindowsManager
@@ -54,7 +55,7 @@ public sealed class WindowsManager
{ {
try try
{ {
var item = await ConfigHandler.GetDefaultRouting(config); var item = await ConfigDbManager.GetDefaultRouting(config);
if (item == null || item.CustomIcon.IsNullOrEmpty() || !File.Exists(item.CustomIcon)) if (item == null || item.CustomIcon.IsNullOrEmpty() || !File.Exists(item.CustomIcon))
{ {
return null; return null;
@@ -3,6 +3,7 @@ using MaterialDesignColors.ColorManipulation;
using MaterialDesignThemes.Wpf; using MaterialDesignThemes.Wpf;
using Microsoft.Win32; using Microsoft.Win32;
namespace v2rayN.ViewModels; namespace v2rayN.ViewModels;
public partial class ThemeSettingViewModel : MyReactiveObject public partial class ThemeSettingViewModel : MyReactiveObject
@@ -22,7 +23,7 @@ public partial class ThemeSettingViewModel : MyReactiveObject
public ThemeSettingViewModel() public ThemeSettingViewModel()
{ {
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
RegisterSystemColorSet(_config, ModifyTheme); RegisterSystemColorSet(_config, ModifyTheme);
@@ -63,7 +64,7 @@ public partial class ThemeSettingViewModel : MyReactiveObject
{ {
_config.UiItem.CurrentTheme = CurrentTheme; _config.UiItem.CurrentTheme = CurrentTheme;
ModifyTheme(); ModifyTheme();
await ConfigHandler.SaveConfig(_config); await ConfigTextManager.Instance.SaveConfig();
} }
}); });
@@ -82,7 +83,7 @@ public partial class ThemeSettingViewModel : MyReactiveObject
{ {
_config.UiItem.ColorPrimaryName = SelectedSwatch?.Name; _config.UiItem.ColorPrimaryName = SelectedSwatch?.Name;
ChangePrimaryColor(SelectedSwatch.ExemplarHue.Color); ChangePrimaryColor(SelectedSwatch.ExemplarHue.Color);
await ConfigHandler.SaveConfig(_config); await ConfigTextManager.Instance.SaveConfig();
} }
}); });
@@ -94,7 +95,7 @@ public partial class ThemeSettingViewModel : MyReactiveObject
{ {
_config.UiItem.CurrentFontSize = CurrentFontSize; _config.UiItem.CurrentFontSize = CurrentFontSize;
ModifyFontSize(); ModifyFontSize();
await ConfigHandler.SaveConfig(_config); await ConfigTextManager.Instance.SaveConfig();
} }
}); });
@@ -106,7 +107,7 @@ public partial class ThemeSettingViewModel : MyReactiveObject
{ {
_config.UiItem.CurrentLanguage = CurrentLanguage; _config.UiItem.CurrentLanguage = CurrentLanguage;
Thread.CurrentThread.CurrentUICulture = new(CurrentLanguage); Thread.CurrentThread.CurrentUICulture = new(CurrentLanguage);
await ConfigHandler.SaveConfig(_config); await ConfigTextManager.Instance.SaveConfig();
NoticeManager.Instance.Enqueue(ResUI.NeedRebootTips); NoticeManager.Instance.Enqueue(ResUI.NeedRebootTips);
} }
}); });
@@ -51,7 +51,7 @@ public partial class AddGroupServerWindow
this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables);
}); });
WindowsUtils.SetDarkBorder(this, AppManager.Instance.Config.UiItem.CurrentTheme); WindowsUtils.SetDarkBorder(this, ConfigTextManager.Instance.Config.UiItem.CurrentTheme);
} }
private void InitializeData(ProfileItem profileItem) private void InitializeData(ProfileItem profileItem)
+1 -1
View File
@@ -38,7 +38,7 @@ public partial class AddServer2Window
interaction.SetOutput(fileName); interaction.SetOutput(fileName);
}).DisposeWith(disposables); }).DisposeWith(disposables);
}); });
WindowsUtils.SetDarkBorder(this, AppManager.Instance.Config.UiItem.CurrentTheme); WindowsUtils.SetDarkBorder(this, ConfigTextManager.Instance.Config.UiItem.CurrentTheme);
} }
private void InitializeData(ProfileItem profileItem) private void InitializeData(ProfileItem profileItem)
+1 -1
View File
@@ -204,7 +204,7 @@ public partial class AddServerWindow
this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables);
}); });
WindowsUtils.SetDarkBorder(this, AppManager.Instance.Config.UiItem.CurrentTheme); WindowsUtils.SetDarkBorder(this, ConfigTextManager.Instance.Config.UiItem.CurrentTheme);
} }
private void InitializeData(ProfileItem profileItem) private void InitializeData(ProfileItem profileItem)
@@ -14,7 +14,7 @@ public partial class ClashConnectionsView
public ClashConnectionsView() public ClashConnectionsView()
{ {
InitializeComponent(); InitializeComponent();
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
btnAutofitColumnWidth.Click += BtnAutofitColumnWidth_Click; btnAutofitColumnWidth.Click += BtnAutofitColumnWidth_Click;
+2 -2
View File
@@ -8,7 +8,7 @@ public partial class DNSSettingWindow
{ {
InitializeComponent(); InitializeComponent();
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
cmbDirectDNSStrategy.ItemsSource = Global.DomainStrategy; cmbDirectDNSStrategy.ItemsSource = Global.DomainStrategy;
cmbRemoteDNSStrategy.ItemsSource = Global.DomainStrategy; cmbRemoteDNSStrategy.ItemsSource = Global.DomainStrategy;
@@ -72,7 +72,7 @@ public partial class DNSSettingWindow
this.OneWayBind(ViewModel, vm => vm.IsSimpleDNSEnabled, v => v.gridBasicDNSSettings.IsEnabled).DisposeWith(disposables); this.OneWayBind(ViewModel, vm => vm.IsSimpleDNSEnabled, v => v.gridBasicDNSSettings.IsEnabled).DisposeWith(disposables);
this.OneWayBind(ViewModel, vm => vm.IsSimpleDNSEnabled, v => v.gridAdvancedDNSSettings.IsEnabled).DisposeWith(disposables); this.OneWayBind(ViewModel, vm => vm.IsSimpleDNSEnabled, v => v.gridAdvancedDNSSettings.IsEnabled).DisposeWith(disposables);
}); });
WindowsUtils.SetDarkBorder(this, AppManager.Instance.Config.UiItem.CurrentTheme); WindowsUtils.SetDarkBorder(this, ConfigTextManager.Instance.Config.UiItem.CurrentTheme);
} }
private void linkDnsObjectDoc_Click(object sender, RoutedEventArgs e) private void linkDnsObjectDoc_Click(object sender, RoutedEventArgs e)
@@ -8,7 +8,7 @@ public partial class FullConfigTemplateWindow
{ {
InitializeComponent(); InitializeComponent();
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
this.WhenActivated(disposables => this.WhenActivated(disposables =>
{ {
@@ -25,7 +25,7 @@ public partial class FullConfigTemplateWindow
this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables);
}); });
WindowsUtils.SetDarkBorder(this, AppManager.Instance.Config.UiItem.CurrentTheme); WindowsUtils.SetDarkBorder(this, ConfigTextManager.Instance.Config.UiItem.CurrentTheme);
} }
private void linkFullConfigTemplateDoc_Click(object sender, RoutedEventArgs e) private void linkFullConfigTemplateDoc_Click(object sender, RoutedEventArgs e)
@@ -21,7 +21,7 @@ public partial class GlobalHotkeySettingWindow
this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables);
BindingData(); BindingData();
}); });
WindowsUtils.SetDarkBorder(this, AppManager.Instance.Config.UiItem.CurrentTheme); WindowsUtils.SetDarkBorder(this, ConfigTextManager.Instance.Config.UiItem.CurrentTheme);
Init(); Init();
} }
+4 -4
View File
@@ -17,7 +17,7 @@ public partial class MainWindow
{ {
InitializeComponent(); InitializeComponent();
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
ThreadPool.RegisterWaitForSingleObject(App.ProgramStarted, OnProgramStarted, null, -1, false); ThreadPool.RegisterWaitForSingleObject(App.ProgramStarted, OnProgramStarted, null, -1, false);
App.Current.SessionEnding += Current_SessionEnding; App.Current.SessionEnding += Current_SessionEnding;
@@ -345,15 +345,15 @@ public partial class MainWindow
private void StorageUI() private void StorageUI()
{ {
ConfigHandler.SaveWindowSizeItem(_config, GetType().Name, Width, Height); ConfigTextManager.SaveWindowSizeItem(_config, GetType().Name, Width, Height);
if (_config.UiItem.MainGirdOrientation == EGirdOrientation.Horizontal) if (_config.UiItem.MainGirdOrientation == EGirdOrientation.Horizontal)
{ {
ConfigHandler.SaveMainGirdHeight(_config, gridMain.ColumnDefinitions[0].ActualWidth, gridMain.ColumnDefinitions[2].ActualWidth); ConfigTextManager.SaveMainGirdHeight(_config, gridMain.ColumnDefinitions[0].ActualWidth, gridMain.ColumnDefinitions[2].ActualWidth);
} }
else if (_config.UiItem.MainGirdOrientation == EGirdOrientation.Vertical) else if (_config.UiItem.MainGirdOrientation == EGirdOrientation.Vertical)
{ {
ConfigHandler.SaveMainGirdHeight(_config, gridMain1.RowDefinitions[0].ActualHeight, gridMain1.RowDefinitions[2].ActualHeight); ConfigTextManager.SaveMainGirdHeight(_config, gridMain1.RowDefinitions[0].ActualHeight, gridMain1.RowDefinitions[2].ActualHeight);
} }
} }
@@ -10,7 +10,7 @@ public partial class OptionSettingWindow
{ {
InitializeComponent(); InitializeComponent();
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
clbdestOverride.SelectionChanged += ClbdestOverride_SelectionChanged; clbdestOverride.SelectionChanged += ClbdestOverride_SelectionChanged;
btnBrowseCustomSystemProxyPacPath.Click += BtnBrowseCustomSystemProxyPacPath_Click; btnBrowseCustomSystemProxyPacPath.Click += BtnBrowseCustomSystemProxyPacPath_Click;
@@ -149,7 +149,7 @@ public partial class OptionSettingWindow
this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables);
}); });
WindowsUtils.SetDarkBorder(this, AppManager.Instance.Config.UiItem.CurrentTheme); WindowsUtils.SetDarkBorder(this, ConfigTextManager.Instance.Config.UiItem.CurrentTheme);
} }
private async Task InitSettingFont() private async Task InitSettingFont()
@@ -39,7 +39,7 @@ public partial class ProfilesSelectWindow
}).DisposeWith(disposables); }).DisposeWith(disposables);
}); });
WindowsUtils.SetDarkBorder(this, AppManager.Instance.Config.UiItem.CurrentTheme); WindowsUtils.SetDarkBorder(this, ConfigTextManager.Instance.Config.UiItem.CurrentTheme);
} }
private void AllowMultiSelect(bool allow) private void AllowMultiSelect(bool allow)
+1 -1
View File
@@ -17,7 +17,7 @@ public partial class ProfilesView
InitializeComponent(); InitializeComponent();
lstGroup.MaxHeight = Math.Floor(SystemParameters.WorkArea.Height * 0.20 / 40) * 40; lstGroup.MaxHeight = Math.Floor(SystemParameters.WorkArea.Height * 0.20 / 40) * 40;
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
btnAutofitColumnWidth.Click += BtnAutofitColumnWidth_Click; btnAutofitColumnWidth.Click += BtnAutofitColumnWidth_Click;
txtServerFilter.PreviewKeyDown += TxtServerFilter_PreviewKeyDown; txtServerFilter.PreviewKeyDown += TxtServerFilter_PreviewKeyDown;
@@ -37,7 +37,7 @@ public partial class RoutingRuleDetailsWindow
this.BindCommand(ViewModel, vm => vm.SelectProfileCmd, v => v.btnSelectProfile).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.SelectProfileCmd, v => v.btnSelectProfile).DisposeWith(disposables);
this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables);
}); });
WindowsUtils.SetDarkBorder(this, AppManager.Instance.Config.UiItem.CurrentTheme); WindowsUtils.SetDarkBorder(this, ConfigTextManager.Instance.Config.UiItem.CurrentTheme);
} }
private void InitializeData(RulesItem rulesItem) private void InitializeData(RulesItem rulesItem)
@@ -76,7 +76,7 @@ public partial class RoutingRuleSettingWindow
interaction.SetOutput(fileName); interaction.SetOutput(fileName);
}).DisposeWith(disposables); }).DisposeWith(disposables);
}); });
WindowsUtils.SetDarkBorder(this, AppManager.Instance.Config.UiItem.CurrentTheme); WindowsUtils.SetDarkBorder(this, ConfigTextManager.Instance.Config.UiItem.CurrentTheme);
} }
private void Window_Loaded(object sender, RoutedEventArgs e) private void Window_Loaded(object sender, RoutedEventArgs e)
@@ -37,7 +37,7 @@ public partial class RoutingSettingWindow
interaction.SetOutput(result); interaction.SetOutput(result);
}).DisposeWith(disposables); }).DisposeWith(disposables);
}); });
WindowsUtils.SetDarkBorder(this, AppManager.Instance.Config.UiItem.CurrentTheme); WindowsUtils.SetDarkBorder(this, ConfigTextManager.Instance.Config.UiItem.CurrentTheme);
} }
private void RoutingSettingWindow_Closing(object? sender, System.ComponentModel.CancelEventArgs e) private void RoutingSettingWindow_Closing(object? sender, System.ComponentModel.CancelEventArgs e)
+1 -1
View File
@@ -9,7 +9,7 @@ public partial class StatusBarView
public StatusBarView() public StatusBarView()
{ {
InitializeComponent(); InitializeComponent();
_config = AppManager.Instance.Config; _config = ConfigTextManager.Instance.Config;
menuExit.Click += menuExit_Click; menuExit.Click += menuExit_Click;
txtRunningServerDisplay.PreviewMouseDown += txtRunningInfoDisplay_MouseDoubleClick; txtRunningServerDisplay.PreviewMouseDown += txtRunningInfoDisplay_MouseDoubleClick;
+1 -1
View File
@@ -35,7 +35,7 @@ public partial class SubEditWindow
this.BindCommand(ViewModel, vm => vm.SelectNextProfileCmd, v => v.btnSelectNextProfile).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.SelectNextProfileCmd, v => v.btnSelectNextProfile).DisposeWith(disposables);
this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables); this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables);
}); });
WindowsUtils.SetDarkBorder(this, AppManager.Instance.Config.UiItem.CurrentTheme); WindowsUtils.SetDarkBorder(this, ConfigTextManager.Instance.Config.UiItem.CurrentTheme);
} }
private void Window_Loaded(object sender, RoutedEventArgs e) private void Window_Loaded(object sender, RoutedEventArgs e)
+1 -1
View File
@@ -47,7 +47,7 @@ public partial class SubSettingWindow
interaction.SetOutput(RxVoid.Default); interaction.SetOutput(RxVoid.Default);
}).DisposeWith(disposables); }).DisposeWith(disposables);
}); });
WindowsUtils.SetDarkBorder(this, AppManager.Instance.Config.UiItem.CurrentTheme); WindowsUtils.SetDarkBorder(this, ConfigTextManager.Instance.Config.UiItem.CurrentTheme);
} }
private async Task ShareSub(string url) private async Task ShareSub(string url)