mirror of
https://github.com/2dust/v2rayN.git
synced 2026-11-14 16:35:00 +03:00
Move configuration data classes to handlers
Rename the database and text configuration managers as handlers, move configuration data classes into Handler.Data, and relocate ProfileExManager. Update references across applications and tests.
This commit is contained in:
@@ -21,9 +21,9 @@ global using ServiceLib.Handler;
|
|||||||
global using ServiceLib.Handler.Builder;
|
global using ServiceLib.Handler.Builder;
|
||||||
global using ServiceLib.Handler.Fmt;
|
global using ServiceLib.Handler.Fmt;
|
||||||
global using ServiceLib.Handler.SysProxy;
|
global using ServiceLib.Handler.SysProxy;
|
||||||
|
global using ServiceLib.Handler.Data;
|
||||||
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;
|
||||||
|
|||||||
@@ -32,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 ConfigDbManager.AddBatchServers(config, FullXrayConfigs, subId, true);
|
var count = await ConfigDbHandler.AddBatchServers(config, FullXrayConfigs, subId, true);
|
||||||
var profiles = await ConfigDbQuery.ProfileItems(subId) ?? [];
|
var profiles = await ConfigDbQuery.ProfileItems(subId) ?? [];
|
||||||
|
|
||||||
await count.Should().BeEqualTo(2);
|
await count.Should().BeEqualTo(2);
|
||||||
@@ -66,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 ConfigDbManager.AddBatchServers(config, invalidSubscription, subId, true);
|
var count = await ConfigDbHandler.AddBatchServers(config, invalidSubscription, subId, true);
|
||||||
var profiles = await ConfigDbQuery.ProfileItems(subId) ?? [];
|
var profiles = await ConfigDbQuery.ProfileItems(subId) ?? [];
|
||||||
|
|
||||||
await (count < 1).Should().BeTrue();
|
await (count < 1).Should().BeTrue();
|
||||||
|
|||||||
@@ -31,9 +31,9 @@ global using ServiceLib.Handler;
|
|||||||
global using ServiceLib.Handler.Builder;
|
global using ServiceLib.Handler.Builder;
|
||||||
global using ServiceLib.Handler.Fmt;
|
global using ServiceLib.Handler.Fmt;
|
||||||
global using ServiceLib.Handler.SysProxy;
|
global using ServiceLib.Handler.SysProxy;
|
||||||
|
global using ServiceLib.Handler.Data;
|
||||||
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 ConfigDbQuery.GetDNSItem(coreType),
|
RawDnsItem = await ConfigDbQuery.GetDNSItem(coreType),
|
||||||
RoutingItem = await ConfigDbManager.GetDefaultRouting(config),
|
RoutingItem = await ConfigDbHandler.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 = ConfigDbManager.GetPreSocksItem(config, node, coreType);
|
var preSocksItem = ConfigDbHandler.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 = ConfigTextManager.Config.SpeedTestItem.SpeedPingTestUrl;
|
var url = ConfigTextHandler.Config.SpeedTestItem.SpeedPingTestUrl;
|
||||||
var responseTime = -1;
|
var responseTime = -1;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -114,7 +114,7 @@ public static class ConnectionHandler
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var url = ConfigTextManager.Config.SpeedTestItem.IPAPIUrl;
|
var url = ConfigTextHandler.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 = ConfigTextManager.Config;
|
var config = ConfigTextHandler.Config;
|
||||||
var result = new RetResult();
|
var result = new RetResult();
|
||||||
var node = context.Node;
|
var node = context.Node;
|
||||||
|
|
||||||
|
|||||||
+7
-7
@@ -1,14 +1,14 @@
|
|||||||
namespace ServiceLib.Manager.Data;
|
namespace ServiceLib.Handler.Data;
|
||||||
|
|
||||||
public static class ConfigDbManager
|
public static class ConfigDbHandler
|
||||||
{
|
{
|
||||||
private static readonly string _tag = "ConfigDbManager";
|
private static readonly string _tag = "ConfigDbHandler";
|
||||||
|
|
||||||
private static Config CurrentConfig => ConfigState.Instance.Current;
|
private static Config CurrentConfig => ConfigState.Instance.Current;
|
||||||
|
|
||||||
private static async Task<int> SaveConfig()
|
private static async Task<int> SaveConfig()
|
||||||
{
|
{
|
||||||
return await ConfigTextManager.SaveConfig();
|
return await ConfigTextHandler.SaveConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Server
|
#region Server
|
||||||
@@ -2011,7 +2011,7 @@ public static class ConfigDbManager
|
|||||||
var existItem = FindMatchedProfileItem(lstSub, activeProfile);
|
var existItem = FindMatchedProfileItem(lstSub, activeProfile);
|
||||||
if (existItem != null)
|
if (existItem != null)
|
||||||
{
|
{
|
||||||
await ConfigDbManager.SetDefaultServerIndex(config, existItem.IndexId);
|
await ConfigDbHandler.SetDefaultServerIndex(config, existItem.IndexId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2504,7 +2504,7 @@ public static class ConfigDbManager
|
|||||||
var lockItem = items?.FirstOrDefault(t => t.Locked == true);
|
var lockItem = items?.FirstOrDefault(t => t.Locked == true);
|
||||||
if (lockItem != null)
|
if (lockItem != null)
|
||||||
{
|
{
|
||||||
await ConfigDbManager.RemoveRoutingItem(lockItem);
|
await ConfigDbHandler.RemoveRoutingItem(lockItem);
|
||||||
items = await ConfigDbQuery.RoutingItems();
|
items = await ConfigDbQuery.RoutingItems();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3009,7 +3009,7 @@ public static class ConfigDbManager
|
|||||||
private static async Task<int> MigrateProfileExtraV2ToV3Sub(List<ProfileItem> batch)
|
private static async Task<int> MigrateProfileExtraV2ToV3Sub(List<ProfileItem> batch)
|
||||||
{
|
{
|
||||||
var updateProfileItems = new List<ProfileItem>();
|
var updateProfileItems = new List<ProfileItem>();
|
||||||
var config = ConfigTextManager.Config;
|
var config = ConfigTextHandler.Config;
|
||||||
|
|
||||||
foreach (var item in batch)
|
foreach (var item in batch)
|
||||||
{
|
{
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
namespace ServiceLib.Manager.Data;
|
namespace ServiceLib.Handler.Data;
|
||||||
|
|
||||||
public class ConfigDbQuery
|
public class ConfigDbQuery
|
||||||
{
|
{
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
namespace ServiceLib.Manager.Data;
|
namespace ServiceLib.Handler.Data;
|
||||||
|
|
||||||
public sealed class ConfigState
|
public sealed class ConfigState
|
||||||
{
|
{
|
||||||
+4
-4
@@ -1,9 +1,9 @@
|
|||||||
namespace ServiceLib.Manager.Data;
|
namespace ServiceLib.Handler.Data;
|
||||||
|
|
||||||
public static class ConfigTextManager
|
public static class ConfigTextHandler
|
||||||
{
|
{
|
||||||
private static readonly string _configRes = Global.ConfigFileName;
|
private static readonly string _configRes = Global.ConfigFileName;
|
||||||
private static readonly string _tag = "ConfigTextManager";
|
private static readonly string _tag = "ConfigTextHandler";
|
||||||
|
|
||||||
public static Config Config
|
public static Config Config
|
||||||
{
|
{
|
||||||
@@ -145,7 +145,7 @@ public static class ConfigTextManager
|
|||||||
|
|
||||||
config.ConstItem ??= new ConstItem();
|
config.ConstItem ??= new ConstItem();
|
||||||
|
|
||||||
config.SimpleDNSItem ??= ConfigDbManager.InitBuiltinSimpleDNS();
|
config.SimpleDNSItem ??= ConfigDbHandler.InitBuiltinSimpleDNS();
|
||||||
config.SimpleDNSItem.BlockAAAAQuery ??= false;
|
config.SimpleDNSItem.BlockAAAAQuery ??= false;
|
||||||
config.SimpleDNSItem.FakeIPRange ??= Global.FakeIPRanges.FirstOrDefault();
|
config.SimpleDNSItem.FakeIPRange ??= Global.FakeIPRanges.FirstOrDefault();
|
||||||
config.SimpleDNSItem.FakeIPv6 ??= false;
|
config.SimpleDNSItem.FakeIPv6 ??= false;
|
||||||
@@ -106,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 ConfigDbManager.AddBatchServers(_config, result, id, true);
|
var ret = await ConfigDbHandler.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 = ConfigTextManager.Config.SystemProxyItem?.CustomSystemProxyScriptPath;
|
var customSystemProxyScriptPath = ConfigTextHandler.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 = ConfigTextManager.Config.SystemProxyItem?.CustomSystemProxyScriptPath;
|
var customSystemProxyScriptPath = ConfigTextHandler.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);
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ public sealed class AppManager
|
|||||||
}
|
}
|
||||||
|
|
||||||
Logging.Setup();
|
Logging.Setup();
|
||||||
_config = ConfigTextManager.Init();
|
_config = ConfigTextHandler.Init();
|
||||||
if (_config == null)
|
if (_config == null)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
@@ -104,7 +104,7 @@ public sealed class AppManager
|
|||||||
|
|
||||||
Task.Run(async () =>
|
Task.Run(async () =>
|
||||||
{
|
{
|
||||||
await ConfigDbManager.MigrateProfileExtra();
|
await ConfigDbHandler.MigrateProfileExtra();
|
||||||
}).Wait();
|
}).Wait();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -127,7 +127,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 ConfigTextManager.SaveConfig();
|
await ConfigTextHandler.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();
|
||||||
|
|||||||
@@ -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(ConfigTextManager.Config.SpeedTestItem.SpeedPingTestUrl);
|
Utils.UrlEncode(ConfigTextHandler.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(ConfigTextManager.Config.SpeedTestItem.SpeedPingTestUrl);
|
Utils.UrlEncode(ConfigTextHandler.Config.SpeedTestItem.SpeedPingTestUrl);
|
||||||
return await SendTestRequest(url);
|
return await SendTestRequest(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ public class PacManager
|
|||||||
|
|
||||||
private async Task<byte[]> InitText(int httpPort)
|
private async Task<byte[]> InitText(int httpPort)
|
||||||
{
|
{
|
||||||
var customSystemProxyPacPath = ConfigTextManager.Config.SystemProxyItem.CustomSystemProxyPacPath;
|
var customSystemProxyPacPath = ConfigTextHandler.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");
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
namespace ServiceLib.Manager.Data;
|
namespace ServiceLib.Manager;
|
||||||
|
|
||||||
public class ProfileExManager
|
public class ProfileExManager
|
||||||
{
|
{
|
||||||
@@ -42,7 +42,7 @@ public class TaskManager
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await ConfigTextManager.SaveConfig();
|
await ConfigTextHandler.SaveConfig();
|
||||||
await ProfileExManager.Instance.SaveTo();
|
await ProfileExManager.Instance.SaveTo();
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@@ -113,7 +113,7 @@ public class TaskManager
|
|||||||
});
|
});
|
||||||
await handler.UpdateProcess(item.Id);
|
await handler.UpdateProcess(item.Id);
|
||||||
item.UpdateTime = updateTime;
|
item.UpdateTime = updateTime;
|
||||||
await ConfigDbManager.AddSubItem(_config, item);
|
await ConfigDbHandler.AddSubItem(_config, item);
|
||||||
await Task.Delay(1000);
|
await Task.Delay(1000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ public sealed class WebDavManager
|
|||||||
|
|
||||||
public WebDavManager()
|
public WebDavManager()
|
||||||
{
|
{
|
||||||
_config = ConfigTextManager.Config;
|
_config = ConfigTextHandler.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 = ConfigTextManager.Config.SpeedTestItem.SpeedPingTestUrl,
|
destination = ConfigTextHandler.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 = ConfigTextManager.Config.SpeedTestItem.SpeedPingTestUrl,
|
probeUrl = ConfigTextHandler.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 = ConfigTextManager.Config;
|
_config = ConfigTextHandler.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 ConfigDbManager.AddServerCommon(_config, SelectedSource) == 0)
|
if (await ConfigDbHandler.AddServerCommon(_config, SelectedSource) == 0)
|
||||||
{
|
{
|
||||||
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
|
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
|
||||||
RequestClose?.Invoke(this, EventArgs.Empty);
|
RequestClose?.Invoke(this, EventArgs.Empty);
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ public partial class AddServer2ViewModel : MyReactiveObject, ICloseable
|
|||||||
|
|
||||||
public AddServer2ViewModel(ProfileItem profileItem)
|
public AddServer2ViewModel(ProfileItem profileItem)
|
||||||
{
|
{
|
||||||
_config = ConfigTextManager.Config;
|
_config = ConfigTextHandler.Config;
|
||||||
|
|
||||||
BrowseServerCmd = ReactiveCommand.CreateFromTask(async () =>
|
BrowseServerCmd = ReactiveCommand.CreateFromTask(async () =>
|
||||||
{
|
{
|
||||||
@@ -71,7 +71,7 @@ public partial class AddServer2ViewModel : MyReactiveObject, ICloseable
|
|||||||
IsSingboxEndpoint = IsSingboxEndpoint ? true : null,
|
IsSingboxEndpoint = IsSingboxEndpoint ? true : null,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (await ConfigDbManager.EditCustomServer(_config, SelectedSource) == 0)
|
if (await ConfigDbHandler.EditCustomServer(_config, SelectedSource) == 0)
|
||||||
{
|
{
|
||||||
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
|
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
|
||||||
RequestClose?.Invoke(this, EventArgs.Empty);
|
RequestClose?.Invoke(this, EventArgs.Empty);
|
||||||
@@ -92,7 +92,7 @@ public partial class AddServer2ViewModel : MyReactiveObject, ICloseable
|
|||||||
var item = await ConfigDbQuery.GetProfileItem(SelectedSource.IndexId);
|
var item = await ConfigDbQuery.GetProfileItem(SelectedSource.IndexId);
|
||||||
item ??= SelectedSource;
|
item ??= SelectedSource;
|
||||||
item.Address = fileName;
|
item.Address = fileName;
|
||||||
var result = item.ConfigType == EConfigType.Outbound ? await ConfigDbManager.AddCustomOutboundServer(_config, item, false) : await ConfigDbManager.AddCustomServer(_config, item, false);
|
var result = item.ConfigType == EConfigType.Outbound ? await ConfigDbHandler.AddCustomOutboundServer(_config, item, false) : await ConfigDbHandler.AddCustomServer(_config, item, false);
|
||||||
if (result == 0)
|
if (result == 0)
|
||||||
{
|
{
|
||||||
NoticeManager.Instance.Enqueue(ResUI.SuccessfullyImportedCustomServer);
|
NoticeManager.Instance.Enqueue(ResUI.SuccessfullyImportedCustomServer);
|
||||||
|
|||||||
@@ -319,7 +319,7 @@ public partial class AddServerViewModel : MyReactiveObject, ICloseable
|
|||||||
|
|
||||||
public AddServerViewModel(ProfileItem profileItem)
|
public AddServerViewModel(ProfileItem profileItem)
|
||||||
{
|
{
|
||||||
_config = ConfigTextManager.Config;
|
_config = ConfigTextHandler.Config;
|
||||||
|
|
||||||
FetchCertCmd = ReactiveCommand.CreateFromTask(async () =>
|
FetchCertCmd = ReactiveCommand.CreateFromTask(async () =>
|
||||||
{
|
{
|
||||||
@@ -594,7 +594,7 @@ public partial class AddServerViewModel : MyReactiveObject, ICloseable
|
|||||||
});
|
});
|
||||||
SelectedSource.SetTransportExtra(transport);
|
SelectedSource.SetTransportExtra(transport);
|
||||||
|
|
||||||
if (await ConfigDbManager.AddServer(_config, SelectedSource) == 0)
|
if (await ConfigDbHandler.AddServer(_config, SelectedSource) == 0)
|
||||||
{
|
{
|
||||||
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
|
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
|
||||||
RequestClose?.Invoke(this, EventArgs.Empty);
|
RequestClose?.Invoke(this, EventArgs.Empty);
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ public partial class BackupAndRestoreViewModel : MyReactiveObject
|
|||||||
|
|
||||||
public BackupAndRestoreViewModel()
|
public BackupAndRestoreViewModel()
|
||||||
{
|
{
|
||||||
_config = ConfigTextManager.Config;
|
_config = ConfigTextHandler.Config;
|
||||||
|
|
||||||
WebDavCheckCmd = ReactiveCommand.CreateFromTask(async () =>
|
WebDavCheckCmd = ReactiveCommand.CreateFromTask(async () =>
|
||||||
{
|
{
|
||||||
@@ -46,7 +46,7 @@ public partial class BackupAndRestoreViewModel : MyReactiveObject
|
|||||||
{
|
{
|
||||||
DisplayOperationMsg();
|
DisplayOperationMsg();
|
||||||
_config.WebDavItem = SelectedSource;
|
_config.WebDavItem = SelectedSource;
|
||||||
_ = await ConfigTextManager.SaveConfig();
|
_ = await ConfigTextHandler.SaveConfig();
|
||||||
|
|
||||||
var result = await WebDavManager.Instance.CheckConnection();
|
var result = await WebDavManager.Instance.CheckConnection();
|
||||||
if (result)
|
if (result)
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ public partial class CheckUpdateViewModel : MyReactiveObject
|
|||||||
|
|
||||||
public CheckUpdateViewModel()
|
public CheckUpdateViewModel()
|
||||||
{
|
{
|
||||||
_config = ConfigTextManager.Config;
|
_config = ConfigTextHandler.Config;
|
||||||
|
|
||||||
CheckUpdateCmd = ReactiveCommand.CreateFromTask(CheckUpdate);
|
CheckUpdateCmd = ReactiveCommand.CreateFromTask(CheckUpdate);
|
||||||
CheckUpdateCmd.ThrownExceptions.Subscribe(ex =>
|
CheckUpdateCmd.ThrownExceptions.Subscribe(ex =>
|
||||||
@@ -126,7 +126,7 @@ public partial class CheckUpdateViewModel : MyReactiveObject
|
|||||||
.Select(t => t.CoreTypeForStorage)
|
.Select(t => t.CoreTypeForStorage)
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
await ConfigTextManager.SaveConfig();
|
await ConfigTextHandler.SaveConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task CheckOnly()
|
private async Task CheckOnly()
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ public partial class ClashConnectionsViewModel : MyReactiveObject
|
|||||||
{
|
{
|
||||||
public ClashConnectionsViewModel()
|
public ClashConnectionsViewModel()
|
||||||
{
|
{
|
||||||
_config = ConfigTextManager.Config;
|
_config = ConfigTextHandler.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 = ConfigTextManager.Config;
|
_config = ConfigTextHandler.Config;
|
||||||
|
|
||||||
ProxiesReloadCmd = ReactiveCommand.CreateFromTask(async () =>
|
ProxiesReloadCmd = ReactiveCommand.CreateFromTask(async () =>
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ public partial class DNSSettingViewModel : MyReactiveObject, ICloseable
|
|||||||
|
|
||||||
public DNSSettingViewModel()
|
public DNSSettingViewModel()
|
||||||
{
|
{
|
||||||
_config = ConfigTextManager.Config;
|
_config = ConfigTextHandler.Config;
|
||||||
SaveCmd = ReactiveCommand.CreateFromTask(SaveSettingAsync);
|
SaveCmd = ReactiveCommand.CreateFromTask(SaveSettingAsync);
|
||||||
|
|
||||||
ImportDefConfig4V2rayCompatibleCmd = ReactiveCommand.CreateFromTask(async () =>
|
ImportDefConfig4V2rayCompatibleCmd = ReactiveCommand.CreateFromTask(async () =>
|
||||||
@@ -82,7 +82,7 @@ public partial class DNSSettingViewModel : MyReactiveObject, ICloseable
|
|||||||
|
|
||||||
private async Task Init()
|
private async Task Init()
|
||||||
{
|
{
|
||||||
_config = ConfigTextManager.Config;
|
_config = ConfigTextHandler.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;
|
||||||
@@ -207,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 ConfigDbManager.SaveDNSItems(_config, item1);
|
await ConfigDbHandler.SaveDNSItems(_config, item1);
|
||||||
|
|
||||||
var item2 = await ConfigDbQuery.GetDNSItem(ECoreType.sing_box);
|
var item2 = await ConfigDbQuery.GetDNSItem(ECoreType.sing_box);
|
||||||
item2.Enabled = SBCustomDNSEnableCompatible;
|
item2.Enabled = SBCustomDNSEnableCompatible;
|
||||||
@@ -215,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 ConfigDbManager.SaveDNSItems(_config, item2);
|
await ConfigDbHandler.SaveDNSItems(_config, item2);
|
||||||
|
|
||||||
await ConfigTextManager.SaveConfig();
|
await ConfigTextHandler.SaveConfig();
|
||||||
RequestClose?.Invoke(this, EventArgs.Empty);
|
RequestClose?.Invoke(this, EventArgs.Empty);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ public partial class FullConfigTemplateViewModel : MyReactiveObject, ICloseable
|
|||||||
|
|
||||||
public FullConfigTemplateViewModel()
|
public FullConfigTemplateViewModel()
|
||||||
{
|
{
|
||||||
_config = ConfigTextManager.Config;
|
_config = ConfigTextHandler.Config;
|
||||||
SaveCmd = ReactiveCommand.CreateFromTask(async () =>
|
SaveCmd = ReactiveCommand.CreateFromTask(async () =>
|
||||||
{
|
{
|
||||||
await SaveSettingAsync();
|
await SaveSettingAsync();
|
||||||
@@ -104,7 +104,7 @@ public partial class FullConfigTemplateViewModel : MyReactiveObject, ICloseable
|
|||||||
item.AddProxyOnly = AddProxyOnly4Ray;
|
item.AddProxyOnly = AddProxyOnly4Ray;
|
||||||
item.ProxyDetour = ProxyDetour4Ray;
|
item.ProxyDetour = ProxyDetour4Ray;
|
||||||
|
|
||||||
await ConfigDbManager.SaveFullConfigTemplate(_config, item);
|
await ConfigDbHandler.SaveFullConfigTemplate(_config, item);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -122,7 +122,7 @@ public partial class FullConfigTemplateViewModel : MyReactiveObject, ICloseable
|
|||||||
item.AddProxyOnly = AddProxyOnly4Singbox;
|
item.AddProxyOnly = AddProxyOnly4Singbox;
|
||||||
item.ProxyDetour = ProxyDetour4Singbox;
|
item.ProxyDetour = ProxyDetour4Singbox;
|
||||||
|
|
||||||
await ConfigDbManager.SaveFullConfigTemplate(_config, item);
|
await ConfigDbHandler.SaveFullConfigTemplate(_config, item);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ public class GlobalHotkeySettingViewModel : MyReactiveObject, ICloseable
|
|||||||
|
|
||||||
public GlobalHotkeySettingViewModel()
|
public GlobalHotkeySettingViewModel()
|
||||||
{
|
{
|
||||||
_config = ConfigTextManager.Config;
|
_config = ConfigTextHandler.Config;
|
||||||
|
|
||||||
_globalHotkeys = JsonUtils.DeepCopy(_config.GlobalHotkeys);
|
_globalHotkeys = JsonUtils.DeepCopy(_config.GlobalHotkeys);
|
||||||
|
|
||||||
@@ -52,7 +52,7 @@ public class GlobalHotkeySettingViewModel : MyReactiveObject, ICloseable
|
|||||||
{
|
{
|
||||||
_config.GlobalHotkeys = _globalHotkeys;
|
_config.GlobalHotkeys = _globalHotkeys;
|
||||||
|
|
||||||
if (await ConfigTextManager.SaveConfig() == 0)
|
if (await ConfigTextHandler.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 = ConfigTextManager.Config;
|
_config = ConfigTextHandler.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 ConfigDbManager.InitBuiltinDNS(_config);
|
await ConfigDbHandler.InitBuiltinDNS(_config);
|
||||||
await ConfigDbManager.InitBuiltinFullConfigTemplate(_config);
|
await ConfigDbHandler.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 ConfigDbManager.AddBatchServers(_config, stringData, _config.SubIndexId, false);
|
var ret = await ConfigDbHandler.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 ConfigDbManager.AddBatchServers(_config, result, _config.SubIndexId, false);
|
var ret = await ConfigDbHandler.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 ConfigDbManager.InitBuiltinRouting(_config);
|
await ConfigDbHandler.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 ConfigDbManager.GetDefaultServer(_config);
|
var profileItem = await ConfigDbHandler.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 ConfigDbManager.ApplyRegionalPreset(_config, type);
|
await ConfigDbHandler.ApplyRegionalPreset(_config, type);
|
||||||
await ConfigDbManager.InitRouting(_config);
|
await ConfigDbHandler.InitRouting(_config);
|
||||||
RxSchedulers.MainThreadScheduler.Schedule(async () =>
|
RxSchedulers.MainThreadScheduler.Schedule(async () =>
|
||||||
{
|
{
|
||||||
await StatusBarViewModel.RefreshRoutingsMenu();
|
await StatusBarViewModel.RefreshRoutingsMenu();
|
||||||
});
|
});
|
||||||
|
|
||||||
await ConfigTextManager.SaveConfig();
|
await ConfigTextHandler.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();
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ public partial class MsgViewModel : MyReactiveObject
|
|||||||
|
|
||||||
public MsgViewModel()
|
public MsgViewModel()
|
||||||
{
|
{
|
||||||
_config = ConfigTextManager.Config;
|
_config = ConfigTextHandler.Config;
|
||||||
MsgFilter = _config.MsgUIItem.MainMsgFilter ?? string.Empty;
|
MsgFilter = _config.MsgUIItem.MainMsgFilter ?? string.Empty;
|
||||||
AutoRefresh = _config.MsgUIItem.AutoRefresh ?? true;
|
AutoRefresh = _config.MsgUIItem.AutoRefresh ?? true;
|
||||||
|
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ public partial class OptionSettingViewModel : MyReactiveObject, ICloseable
|
|||||||
|
|
||||||
public OptionSettingViewModel()
|
public OptionSettingViewModel()
|
||||||
{
|
{
|
||||||
_config = ConfigTextManager.Config;
|
_config = ConfigTextHandler.Config;
|
||||||
BlIsWindows = Utils.IsWindows();
|
BlIsWindows = Utils.IsWindows();
|
||||||
BlIsLinux = Utils.IsLinux();
|
BlIsLinux = Utils.IsLinux();
|
||||||
BlIsIsMacOS = Utils.IsMacOS();
|
BlIsIsMacOS = Utils.IsMacOS();
|
||||||
@@ -407,7 +407,7 @@ public partial class OptionSettingViewModel : MyReactiveObject, ICloseable
|
|||||||
//coreType
|
//coreType
|
||||||
await SaveCoreType();
|
await SaveCoreType();
|
||||||
|
|
||||||
if (await ConfigTextManager.SaveConfig() == 0)
|
if (await ConfigTextHandler.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 = ConfigTextManager.Config;
|
_config = ConfigTextHandler.Config;
|
||||||
_subIndexId = _config.SubIndexId ?? string.Empty;
|
_subIndexId = _config.SubIndexId ?? string.Empty;
|
||||||
|
|
||||||
#region WhenAnyValue && ReactiveCommand
|
#region WhenAnyValue && ReactiveCommand
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ public partial class ProfilesViewModel : MyReactiveObject
|
|||||||
|
|
||||||
public ProfilesViewModel()
|
public ProfilesViewModel()
|
||||||
{
|
{
|
||||||
_config = ConfigTextManager.Config;
|
_config = ConfigTextHandler.Config;
|
||||||
|
|
||||||
#region WhenAnyValue && ReactiveCommand
|
#region WhenAnyValue && ReactiveCommand
|
||||||
|
|
||||||
@@ -401,7 +401,7 @@ public partial class ProfilesViewModel : MyReactiveObject
|
|||||||
{
|
{
|
||||||
var lstModel = await ConfigDbQuery.ProfileModels(_config.SubIndexId, filter);
|
var lstModel = await ConfigDbQuery.ProfileModels(_config.SubIndexId, filter);
|
||||||
|
|
||||||
await ConfigDbManager.SetDefaultServer(_config, lstModel);
|
await ConfigDbHandler.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();
|
||||||
@@ -516,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 ConfigDbManager.RemoveServers(_config, lstSelected);
|
await ConfigDbHandler.RemoveServers(_config, lstSelected);
|
||||||
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
|
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
|
||||||
if (lstSelected.Count == ProfileItems.Count)
|
if (lstSelected.Count == ProfileItems.Count)
|
||||||
{
|
{
|
||||||
@@ -536,7 +536,7 @@ public partial class ProfilesViewModel : MyReactiveObject
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var tuple = await ConfigDbManager.DedupServerList(_config, _config.SubIndexId);
|
var tuple = await ConfigDbHandler.DedupServerList(_config, _config.SubIndexId);
|
||||||
if (tuple.Item1 > 0 || tuple.Item2 > 0)
|
if (tuple.Item1 > 0 || tuple.Item2 > 0)
|
||||||
{
|
{
|
||||||
await RefreshServers();
|
await RefreshServers();
|
||||||
@@ -552,7 +552,7 @@ public partial class ProfilesViewModel : MyReactiveObject
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (await ConfigDbManager.CopyServer(_config, lstSelected) == 0)
|
if (await ConfigDbHandler.CopyServer(_config, lstSelected) == 0)
|
||||||
{
|
{
|
||||||
await RefreshServers();
|
await RefreshServers();
|
||||||
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
|
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
|
||||||
@@ -585,7 +585,7 @@ public partial class ProfilesViewModel : MyReactiveObject
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (await ConfigDbManager.SetDefaultServerIndex(_config, indexId) == 0)
|
if (await ConfigDbHandler.SetDefaultServerIndex(_config, indexId) == 0)
|
||||||
{
|
{
|
||||||
await RefreshServers();
|
await RefreshServers();
|
||||||
Reload();
|
Reload();
|
||||||
@@ -611,7 +611,7 @@ public partial class ProfilesViewModel : MyReactiveObject
|
|||||||
|
|
||||||
private async Task GenGroupAllServer()
|
private async Task GenGroupAllServer()
|
||||||
{
|
{
|
||||||
var ret = await ConfigDbManager.AddGroupAllServer(_config, SelectedSub);
|
var ret = await ConfigDbHandler.AddGroupAllServer(_config, SelectedSub);
|
||||||
if (ret.Success != true)
|
if (ret.Success != true)
|
||||||
{
|
{
|
||||||
NoticeManager.Instance.Enqueue(ResUI.OperationFailed);
|
NoticeManager.Instance.Enqueue(ResUI.OperationFailed);
|
||||||
@@ -623,7 +623,7 @@ public partial class ProfilesViewModel : MyReactiveObject
|
|||||||
|
|
||||||
private async Task GenGroupRegionServer()
|
private async Task GenGroupRegionServer()
|
||||||
{
|
{
|
||||||
var ret = await ConfigDbManager.AddGroupRegionServer(_config, SelectedSub);
|
var ret = await ConfigDbHandler.AddGroupRegionServer(_config, SelectedSub);
|
||||||
if (ret.Success != true)
|
if (ret.Success != true)
|
||||||
{
|
{
|
||||||
NoticeManager.Instance.Enqueue(ResUI.OperationFailed);
|
NoticeManager.Instance.Enqueue(ResUI.OperationFailed);
|
||||||
@@ -643,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 ConfigDbManager.SortServers(_config, _config.SubIndexId, colName, asc) != 0)
|
if (await ConfigDbHandler.SortServers(_config, _config.SubIndexId, colName, asc) != 0)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -653,7 +653,7 @@ public partial class ProfilesViewModel : MyReactiveObject
|
|||||||
|
|
||||||
public async Task RemoveInvalidServerResult()
|
public async Task RemoveInvalidServerResult()
|
||||||
{
|
{
|
||||||
var count = await ConfigDbManager.RemoveInvalidServerResult(_config, _config.SubIndexId);
|
var count = await ConfigDbHandler.RemoveInvalidServerResult(_config, _config.SubIndexId);
|
||||||
await RefreshServers();
|
await RefreshServers();
|
||||||
NoticeManager.Instance.Enqueue(string.Format(ResUI.RemoveInvalidServerResultTip, count));
|
NoticeManager.Instance.Enqueue(string.Format(ResUI.RemoveInvalidServerResultTip, count));
|
||||||
}
|
}
|
||||||
@@ -667,7 +667,7 @@ public partial class ProfilesViewModel : MyReactiveObject
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
await ConfigDbManager.MoveToGroup(_config, lstSelected, SelectedMoveToGroup.Id);
|
await ConfigDbHandler.MoveToGroup(_config, lstSelected, SelectedMoveToGroup.Id);
|
||||||
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
|
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
|
||||||
|
|
||||||
await RefreshServers();
|
await RefreshServers();
|
||||||
@@ -685,7 +685,7 @@ public partial class ProfilesViewModel : MyReactiveObject
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (await ConfigDbManager.MoveServer(_config, lstProfile, index, eMove) == 0)
|
if (await ConfigDbHandler.MoveServer(_config, lstProfile, index, eMove) == 0)
|
||||||
{
|
{
|
||||||
await RefreshServers();
|
await RefreshServers();
|
||||||
}
|
}
|
||||||
@@ -697,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 ConfigDbManager.MoveServer(_config, lstProfile, startIndex, EMove.Position, targetIndex) == 0)
|
if (await ConfigDbHandler.MoveServer(_config, lstProfile, startIndex, EMove.Position, targetIndex) == 0)
|
||||||
{
|
{
|
||||||
await RefreshServers();
|
await RefreshServers();
|
||||||
}
|
}
|
||||||
@@ -719,7 +719,7 @@ public partial class ProfilesViewModel : MyReactiveObject
|
|||||||
.Select(item => item.IndexId)
|
.Select(item => item.IndexId)
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
var result = await ConfigDbManager.MoveServersTo(
|
var result = await ConfigDbHandler.MoveServersTo(
|
||||||
_config,
|
_config,
|
||||||
orderedProfileIds,
|
orderedProfileIds,
|
||||||
sourceIndices,
|
sourceIndices,
|
||||||
@@ -923,7 +923,7 @@ public partial class ProfilesViewModel : MyReactiveObject
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
await ConfigDbManager.DeleteSubItem(_config, item.Id);
|
await ConfigDbHandler.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 = ConfigTextManager.Config;
|
_config = ConfigTextHandler.Config;
|
||||||
|
|
||||||
SelectProfileCmd = ReactiveCommand.CreateFromTask(async () =>
|
SelectProfileCmd = ReactiveCommand.CreateFromTask(async () =>
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ public partial class RoutingRuleSettingViewModel : MyReactiveObject, ICloseable
|
|||||||
|
|
||||||
public RoutingRuleSettingViewModel(RoutingItem routingItem)
|
public RoutingRuleSettingViewModel(RoutingItem routingItem)
|
||||||
{
|
{
|
||||||
_config = ConfigTextManager.Config;
|
_config = ConfigTextHandler.Config;
|
||||||
|
|
||||||
var canEditRemove = this.WhenAnyValue(
|
var canEditRemove = this.WhenAnyValue(
|
||||||
x => x.SelectedSource,
|
x => x.SelectedSource,
|
||||||
@@ -211,7 +211,7 @@ public partial class RoutingRuleSettingViewModel : MyReactiveObject, ICloseable
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var index = _rules.IndexOf(item);
|
var index = _rules.IndexOf(item);
|
||||||
if (await ConfigDbManager.MoveRoutingRule(_rules, index, eMove) == 0)
|
if (await ConfigDbHandler.MoveRoutingRule(_rules, index, eMove) == 0)
|
||||||
{
|
{
|
||||||
RefreshRulesItems();
|
RefreshRulesItems();
|
||||||
}
|
}
|
||||||
@@ -233,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 ConfigDbManager.SaveRoutingItem(_config, item) == 0)
|
if (await ConfigDbHandler.SaveRoutingItem(_config, item) == 0)
|
||||||
{
|
{
|
||||||
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
|
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
|
||||||
RequestClose?.Invoke(this, EventArgs.Empty);
|
RequestClose?.Invoke(this, EventArgs.Empty);
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ public partial class RoutingSettingViewModel : MyReactiveObject
|
|||||||
|
|
||||||
public RoutingSettingViewModel()
|
public RoutingSettingViewModel()
|
||||||
{
|
{
|
||||||
_config = ConfigTextManager.Config;
|
_config = ConfigTextHandler.Config;
|
||||||
|
|
||||||
var canEditRemove = this.WhenAnyValue(
|
var canEditRemove = this.WhenAnyValue(
|
||||||
x => x.SelectedSource,
|
x => x.SelectedSource,
|
||||||
@@ -77,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 ConfigDbManager.InitBuiltinRouting(_config);
|
await ConfigDbHandler.InitBuiltinRouting(_config);
|
||||||
await RefreshRoutingItems();
|
await RefreshRoutingItems();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -113,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 ConfigTextManager.SaveConfig();
|
await ConfigTextHandler.SaveConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion Refresh Save
|
#endregion Refresh Save
|
||||||
@@ -157,7 +157,7 @@ public partial class RoutingSettingViewModel : MyReactiveObject
|
|||||||
var item = await ConfigDbQuery.GetRoutingItem(it?.Id);
|
var item = await ConfigDbQuery.GetRoutingItem(it?.Id);
|
||||||
if (item != null)
|
if (item != null)
|
||||||
{
|
{
|
||||||
await ConfigDbManager.RemoveRoutingItem(item);
|
await ConfigDbHandler.RemoveRoutingItem(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -174,7 +174,7 @@ public partial class RoutingSettingViewModel : MyReactiveObject
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (await ConfigDbManager.SetDefaultRouting(_config, item) == 0)
|
if (await ConfigDbHandler.SetDefaultRouting(_config, item) == 0)
|
||||||
{
|
{
|
||||||
await RefreshRoutingItems();
|
await RefreshRoutingItems();
|
||||||
IsModified = true;
|
IsModified = true;
|
||||||
@@ -183,7 +183,7 @@ public partial class RoutingSettingViewModel : MyReactiveObject
|
|||||||
|
|
||||||
private async Task RoutingAdvancedImportRules()
|
private async Task RoutingAdvancedImportRules()
|
||||||
{
|
{
|
||||||
if (await ConfigDbManager.InitRouting(_config, true) == 0)
|
if (await ConfigDbHandler.InitRouting(_config, true) == 0)
|
||||||
{
|
{
|
||||||
await RefreshRoutingItems();
|
await RefreshRoutingItems();
|
||||||
IsModified = true;
|
IsModified = true;
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ public partial class StatusBarViewModel : MyReactiveObject
|
|||||||
|
|
||||||
public StatusBarViewModel()
|
public StatusBarViewModel()
|
||||||
{
|
{
|
||||||
_config = ConfigTextManager.Config;
|
_config = ConfigTextHandler.Config;
|
||||||
SelectedRouting = new();
|
SelectedRouting = new();
|
||||||
SelectedServer = new();
|
SelectedServer = new();
|
||||||
RunningServerToolTipText = GetRunningServerToolTipText("-");
|
RunningServerToolTipText = GetRunningServerToolTipText("-");
|
||||||
@@ -218,7 +218,7 @@ public partial class StatusBarViewModel : MyReactiveObject
|
|||||||
|
|
||||||
private async Task Init()
|
private async Task Init()
|
||||||
{
|
{
|
||||||
await ConfigDbManager.InitBuiltinRouting(_config);
|
await ConfigDbHandler.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.
|
||||||
@@ -267,7 +267,7 @@ public partial class StatusBarViewModel : MyReactiveObject
|
|||||||
await RefreshServersMenu();
|
await RefreshServersMenu();
|
||||||
|
|
||||||
//display running server
|
//display running server
|
||||||
var running = await ConfigDbManager.GetDefaultServer(_config);
|
var running = await ConfigDbHandler.GetDefaultServer(_config);
|
||||||
if (running != null)
|
if (running != null)
|
||||||
{
|
{
|
||||||
RunningServerDisplay = running.GetSummary();
|
RunningServerDisplay = running.GetSummary();
|
||||||
@@ -319,7 +319,7 @@ public partial class StatusBarViewModel : MyReactiveObject
|
|||||||
|
|
||||||
public async Task<AvailabilityCheckResult?> TestServerAvailability()
|
public async Task<AvailabilityCheckResult?> TestServerAvailability()
|
||||||
{
|
{
|
||||||
var item = await ConfigDbManager.GetDefaultServer(_config);
|
var item = await ConfigDbHandler.GetDefaultServer(_config);
|
||||||
if (item == null)
|
if (item == null)
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
@@ -373,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 ConfigTextManager.SaveConfig();
|
await ConfigTextHandler.SaveConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task ChangeSystemProxyAsync(ESysProxyType type, bool blChange)
|
public async Task ChangeSystemProxyAsync(ESysProxyType type, bool blChange)
|
||||||
@@ -413,7 +413,7 @@ public partial class StatusBarViewModel : MyReactiveObject
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (await ConfigDbManager.SetDefaultRouting(_config, item) == 0)
|
if (await ConfigDbHandler.SetDefaultRouting(_config, item) == 0)
|
||||||
{
|
{
|
||||||
NoticeManager.Instance.SendMessageEx(ResUI.TipChangeRouting);
|
NoticeManager.Instance.SendMessageEx(ResUI.TipChangeRouting);
|
||||||
ReloadRequested.Publish();
|
ReloadRequested.Publish();
|
||||||
@@ -459,7 +459,7 @@ public partial class StatusBarViewModel : MyReactiveObject
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
await ConfigTextManager.SaveConfig();
|
await ConfigTextHandler.SaveConfig();
|
||||||
ReloadRequested.Publish();
|
ReloadRequested.Publish();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ public partial class SubEditViewModel : MyReactiveObject, ICloseable
|
|||||||
|
|
||||||
public SubEditViewModel(SubItem subItem)
|
public SubEditViewModel(SubItem subItem)
|
||||||
{
|
{
|
||||||
_config = ConfigTextManager.Config;
|
_config = ConfigTextHandler.Config;
|
||||||
|
|
||||||
SelectPrevProfileCmd = ReactiveCommand.CreateFromTask(async () =>
|
SelectPrevProfileCmd = ReactiveCommand.CreateFromTask(async () =>
|
||||||
{
|
{
|
||||||
@@ -89,7 +89,7 @@ public partial class SubEditViewModel : MyReactiveObject, ICloseable
|
|||||||
SelectedSource.PrevProfile = PrevProfile;
|
SelectedSource.PrevProfile = PrevProfile;
|
||||||
SelectedSource.NextProfile = NextProfile;
|
SelectedSource.NextProfile = NextProfile;
|
||||||
|
|
||||||
if (await ConfigDbManager.AddSubItem(_config, SelectedSource) == 0)
|
if (await ConfigDbHandler.AddSubItem(_config, SelectedSource) == 0)
|
||||||
{
|
{
|
||||||
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
|
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
|
||||||
RequestClose?.Invoke(this, EventArgs.Empty);
|
RequestClose?.Invoke(this, EventArgs.Empty);
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ public partial class SubSettingViewModel : MyReactiveObject
|
|||||||
|
|
||||||
public SubSettingViewModel()
|
public SubSettingViewModel()
|
||||||
{
|
{
|
||||||
_config = ConfigTextManager.Config;
|
_config = ConfigTextHandler.Config;
|
||||||
|
|
||||||
var canEditRemove = this.WhenAnyValue(
|
var canEditRemove = this.WhenAnyValue(
|
||||||
x => x.SelectedSource,
|
x => x.SelectedSource,
|
||||||
@@ -92,7 +92,7 @@ public partial class SubSettingViewModel : MyReactiveObject
|
|||||||
|
|
||||||
foreach (var it in SelectedSources ?? [SelectedSource])
|
foreach (var it in SelectedSources ?? [SelectedSource])
|
||||||
{
|
{
|
||||||
await ConfigDbManager.DeleteSubItem(_config, it.Id);
|
await ConfigDbHandler.DeleteSubItem(_config, it.Id);
|
||||||
}
|
}
|
||||||
await RefreshSubItems();
|
await RefreshSubItems();
|
||||||
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
|
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ public partial class App : Application
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ConfigTextManager.Config.UiItem.MacOSShowInDock)
|
if (!ConfigTextHandler.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 (ConfigTextManager.Config.UiItem.MacOSShowInDock)
|
if (ConfigTextHandler.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 (ConfigTextManager.Config.UiItem.MacOSShowInDock || MacAppUtils.IsWindowMiniaturized(mainWindow))
|
if (ConfigTextHandler.Config.UiItem.MacOSShowInDock || MacAppUtils.IsWindowMiniaturized(mainWindow))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ public class WindowBase<TViewModel> : ReactiveWindow<TViewModel> where TViewMode
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var sizeItem = ConfigTextManager.GetWindowSizeItem(GetType().Name);
|
var sizeItem = ConfigTextHandler.GetWindowSizeItem(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
|
||||||
{
|
{
|
||||||
ConfigTextManager.SaveWindowSizeItem(GetType().Name, Width, Height);
|
ConfigTextHandler.SaveWindowSizeItem(GetType().Name, Width, Height);
|
||||||
}
|
}
|
||||||
catch { }
|
catch { }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,8 +30,8 @@ global using ServiceLib.Common;
|
|||||||
global using ServiceLib.Enums;
|
global using ServiceLib.Enums;
|
||||||
global using ServiceLib.Events;
|
global using ServiceLib.Events;
|
||||||
global using ServiceLib.Handler;
|
global using ServiceLib.Handler;
|
||||||
|
global using ServiceLib.Handler.Data;
|
||||||
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;
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ internal class Program
|
|||||||
|
|
||||||
if (OperatingSystem.IsMacOS())
|
if (OperatingSystem.IsMacOS())
|
||||||
{
|
{
|
||||||
var showInDock = Design.IsDesignMode || ConfigTextManager.Config.UiItem.MacOSShowInDock;
|
var showInDock = Design.IsDesignMode || ConfigTextHandler.Config.UiItem.MacOSShowInDock;
|
||||||
builder = builder.With(new MacOSPlatformOptions { ShowInDock = showInDock });
|
builder = builder.With(new MacOSPlatformOptions { ShowInDock = showInDock });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ public partial class ThemeSettingViewModel : MyReactiveObject
|
|||||||
|
|
||||||
public ThemeSettingViewModel()
|
public ThemeSettingViewModel()
|
||||||
{
|
{
|
||||||
_config = ConfigTextManager.Config;
|
_config = ConfigTextHandler.Config;
|
||||||
|
|
||||||
BindingUI();
|
BindingUI();
|
||||||
RestoreUI();
|
RestoreUI();
|
||||||
@@ -43,7 +43,7 @@ public partial class ThemeSettingViewModel : MyReactiveObject
|
|||||||
{
|
{
|
||||||
_config.UiItem.CurrentTheme = CurrentTheme;
|
_config.UiItem.CurrentTheme = CurrentTheme;
|
||||||
ModifyTheme();
|
ModifyTheme();
|
||||||
await ConfigTextManager.SaveConfig();
|
await ConfigTextHandler.SaveConfig();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -55,7 +55,7 @@ public partial class ThemeSettingViewModel : MyReactiveObject
|
|||||||
{
|
{
|
||||||
_config.UiItem.CurrentFontSize = CurrentFontSize;
|
_config.UiItem.CurrentFontSize = CurrentFontSize;
|
||||||
ModifyFontSize();
|
ModifyFontSize();
|
||||||
await ConfigTextManager.SaveConfig();
|
await ConfigTextHandler.SaveConfig();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -67,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 ConfigTextManager.SaveConfig();
|
await ConfigTextHandler.SaveConfig();
|
||||||
NoticeManager.Instance.Enqueue(ResUI.NeedRebootTips);
|
NoticeManager.Instance.Enqueue(ResUI.NeedRebootTips);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ public partial class ClashConnectionsView : ReactiveUserControl<ClashConnections
|
|||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
_config = ConfigTextManager.Config;
|
_config = ConfigTextHandler.Config;
|
||||||
|
|
||||||
btnAutofitColumnWidth.Click += BtnAutofitColumnWidth_Click;
|
btnAutofitColumnWidth.Click += BtnAutofitColumnWidth_Click;
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ public partial class DNSSettingWindow : WindowBase<DNSSettingViewModel>
|
|||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
_config = ConfigTextManager.Config;
|
_config = ConfigTextHandler.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 = ConfigTextManager.Config;
|
_config = ConfigTextHandler.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 = ConfigTextManager.Config;
|
_config = ConfigTextHandler.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()
|
||||||
{
|
{
|
||||||
ConfigTextManager.SaveWindowSizeItem(GetType().Name, Width, Height);
|
ConfigTextHandler.SaveWindowSizeItem(GetType().Name, Width, Height);
|
||||||
|
|
||||||
if (_config.UiItem.MainGirdOrientation == EGirdOrientation.Horizontal)
|
if (_config.UiItem.MainGirdOrientation == EGirdOrientation.Horizontal)
|
||||||
{
|
{
|
||||||
ConfigTextManager.SaveMainGirdHeight(gridMain.ColumnDefinitions[0].ActualWidth, gridMain.ColumnDefinitions[2].ActualWidth);
|
ConfigTextHandler.SaveMainGirdHeight(gridMain.ColumnDefinitions[0].ActualWidth, gridMain.ColumnDefinitions[2].ActualWidth);
|
||||||
}
|
}
|
||||||
else if (_config.UiItem.MainGirdOrientation == EGirdOrientation.Vertical)
|
else if (_config.UiItem.MainGirdOrientation == EGirdOrientation.Vertical)
|
||||||
{
|
{
|
||||||
ConfigTextManager.SaveMainGirdHeight(gridMain.RowDefinitions[0].ActualHeight, gridMain.RowDefinitions[2].ActualHeight);
|
ConfigTextHandler.SaveMainGirdHeight(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 = ConfigTextManager.Config;
|
_config = ConfigTextHandler.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 = ConfigTextManager.Config;
|
_config = ConfigTextHandler.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 = ConfigTextManager.Config;
|
_config = ConfigTextHandler.Config;
|
||||||
|
|
||||||
txtRunningServerDisplay.Tapped += TxtRunningServerDisplay_Tapped;
|
txtRunningServerDisplay.Tapped += TxtRunningServerDisplay_Tapped;
|
||||||
txtRunningInfoDisplay.Tapped += TxtRunningServerDisplay_Tapped;
|
txtRunningInfoDisplay.Tapped += TxtRunningServerDisplay_Tapped;
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ global using ServiceLib.Base;
|
|||||||
global using ServiceLib.Common;
|
global using ServiceLib.Common;
|
||||||
global using ServiceLib.Enums;
|
global using ServiceLib.Enums;
|
||||||
global using ServiceLib.Handler;
|
global using ServiceLib.Handler;
|
||||||
|
global using ServiceLib.Handler.Data;
|
||||||
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;
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ internal sealed class RegionalPresetStager(
|
|||||||
string.Empty,
|
string.Empty,
|
||||||
string.Empty,
|
string.Empty,
|
||||||
string.Empty,
|
string.Empty,
|
||||||
ConfigDbManager.InitBuiltinSimpleDNS(),
|
ConfigDbHandler.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, []));
|
||||||
}
|
}
|
||||||
@@ -136,7 +136,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
|
||||||
? (ConfigDbManager.InitBuiltinSimpleDNS(), true)
|
? (ConfigDbHandler.InitBuiltinSimpleDNS(), true)
|
||||||
: (template, false);
|
: (template, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,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(() => ConfigTextManager.SaveConfig());
|
await EnsureConfigSaveSucceededAsync(() => ConfigTextHandler.SaveConfig());
|
||||||
});
|
});
|
||||||
return OperationView.Ok(ApiMessageKeys.WebDavSettingsSaved);
|
return OperationView.Ok(ApiMessageKeys.WebDavSettingsSaved);
|
||||||
}
|
}
|
||||||
@@ -57,7 +57,7 @@ public sealed partial class V2rayRuntime
|
|||||||
{
|
{
|
||||||
await _mutations.RunAsync(async () =>
|
await _mutations.RunAsync(async () =>
|
||||||
{
|
{
|
||||||
await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.SaveConfig());
|
await EnsureConfigSaveSucceededAsync(() => ConfigTextHandler.SaveConfig());
|
||||||
await ProfileExManager.Instance.SaveTo();
|
await ProfileExManager.Instance.SaveTo();
|
||||||
await StatisticsManager.Instance.SaveTo();
|
await StatisticsManager.Instance.SaveTo();
|
||||||
});
|
});
|
||||||
@@ -211,7 +211,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(() => ConfigTextManager.SaveConfig()), cancellationToken);
|
await _mutations.RunAsync(() => EnsureConfigSaveSucceededAsync(() => ConfigTextHandler.SaveConfig()), cancellationToken);
|
||||||
await SQLiteHelper.Instance.DisposeDbConnectionAsync();
|
await SQLiteHelper.Instance.DisposeDbConnectionAsync();
|
||||||
databaseClosed = true;
|
databaseClosed = true;
|
||||||
|
|
||||||
|
|||||||
@@ -113,7 +113,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(() => ConfigTextManager.SaveConfig());
|
await EnsureConfigSaveSucceededAsync(() => ConfigTextHandler.SaveConfig());
|
||||||
});
|
});
|
||||||
|
|
||||||
return OperationView.Ok(ApiMessageKeys.CoreUpdateSettingsSaved);
|
return OperationView.Ok(ApiMessageKeys.CoreUpdateSettingsSaved);
|
||||||
|
|||||||
@@ -39,7 +39,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(() => ConfigTextManager.SaveConfig());
|
await EnsureConfigSaveSucceededAsync(() => ConfigTextHandler.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 });
|
||||||
@@ -60,10 +60,10 @@ public sealed partial class V2rayRuntime
|
|||||||
|
|
||||||
var count = await _mutations.RunAsync(async () =>
|
var count = await _mutations.RunAsync(async () =>
|
||||||
{
|
{
|
||||||
var imported = await ConfigDbManager.AddBatchServers(Config, request.Content, groupId, request.IsSubscription);
|
var imported = await ConfigDbHandler.AddBatchServers(Config, request.Content, groupId, request.IsSubscription);
|
||||||
if (imported > 0)
|
if (imported > 0)
|
||||||
{
|
{
|
||||||
await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.SaveConfig());
|
await EnsureConfigSaveSucceededAsync(() => ConfigTextHandler.SaveConfig());
|
||||||
}
|
}
|
||||||
return imported;
|
return imported;
|
||||||
});
|
});
|
||||||
@@ -160,13 +160,13 @@ public sealed partial class V2rayRuntime
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
result = await _mutations.RunAsync(() => profile.ConfigType.IsGroupType()
|
result = await _mutations.RunAsync(() => profile.ConfigType.IsGroupType()
|
||||||
? ConfigDbManager.AddServerCommon(Config, profile)
|
? ConfigDbHandler.AddServerCommon(Config, profile)
|
||||||
: profile.ConfigType switch
|
: profile.ConfigType switch
|
||||||
{
|
{
|
||||||
EConfigType.Custom when isNew => ConfigDbManager.AddCustomServer(Config, profile, blDelete: false),
|
EConfigType.Custom when isNew => ConfigDbHandler.AddCustomServer(Config, profile, blDelete: false),
|
||||||
EConfigType.Outbound when isNew => ConfigDbManager.AddCustomOutboundServer(Config, profile, blDelete: false, toFile: true),
|
EConfigType.Outbound when isNew => ConfigDbHandler.AddCustomOutboundServer(Config, profile, blDelete: false, toFile: true),
|
||||||
EConfigType.Custom or EConfigType.Outbound => ConfigDbManager.EditCustomServer(Config, profile),
|
EConfigType.Custom or EConfigType.Outbound => ConfigDbHandler.EditCustomServer(Config, profile),
|
||||||
_ => ConfigDbManager.AddServer(Config, profile),
|
_ => ConfigDbHandler.AddServer(Config, profile),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
catch (Exception exception)
|
catch (Exception exception)
|
||||||
@@ -263,14 +263,14 @@ public sealed partial class V2rayRuntime
|
|||||||
|
|
||||||
await _mutations.RunAsync(async () =>
|
await _mutations.RunAsync(async () =>
|
||||||
{
|
{
|
||||||
if (await ConfigDbManager.RemoveServers(Config, selected) != 0)
|
if (await ConfigDbHandler.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 ConfigDbManager.GetDefaultServer(Config);
|
_ = await ConfigDbHandler.GetDefaultServer(Config);
|
||||||
await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.SaveConfig());
|
await EnsureConfigSaveSucceededAsync(() => ConfigTextHandler.SaveConfig());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -297,7 +297,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(() => ConfigDbManager.CopyServer(Config, items)) != 0)
|
if (await _mutations.RunAsync(() => ConfigDbHandler.CopyServer(Config, items)) != 0)
|
||||||
{
|
{
|
||||||
return OperationView.Fail("profile_copy_failed", ApiMessageKeys.CommonInvalidInput);
|
return OperationView.Fail("profile_copy_failed", ApiMessageKeys.CommonInvalidInput);
|
||||||
}
|
}
|
||||||
@@ -319,7 +319,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(() => ConfigDbManager.MoveToGroup(Config, items, request.SubscriptionId ?? string.Empty)) != 0)
|
if (await _mutations.RunAsync(() => ConfigDbHandler.MoveToGroup(Config, items, request.SubscriptionId ?? string.Empty)) != 0)
|
||||||
{
|
{
|
||||||
return OperationView.Fail("profile_move_failed", ApiMessageKeys.CommonInvalidInput);
|
return OperationView.Fail("profile_move_failed", ApiMessageKeys.CommonInvalidInput);
|
||||||
}
|
}
|
||||||
@@ -338,7 +338,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(() => ConfigDbManager.MoveServer(Config, orderedIds, index, request.Direction, request.Position));
|
var result = await _mutations.RunAsync(() => ConfigDbHandler.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)
|
||||||
@@ -353,7 +353,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(() => ConfigDbManager.SortServers(Config, groupId, request.Column, request.Ascending));
|
var result = await _mutations.RunAsync(() => ConfigDbHandler.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)
|
||||||
@@ -362,14 +362,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(() => ConfigDbManager.DedupServerList(Config, subscriptionId ?? Config.SubIndexId ?? string.Empty));
|
var result = await _mutations.RunAsync(() => ConfigDbHandler.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(() => ConfigDbManager.RemoveInvalidServerResult(Config, subscriptionId ?? Config.SubIndexId ?? string.Empty));
|
var count = await _mutations.RunAsync(() => ConfigDbHandler.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 })
|
||||||
@@ -389,8 +389,8 @@ public sealed partial class V2rayRuntime
|
|||||||
}
|
}
|
||||||
|
|
||||||
var result = await _mutations.RunAsync(() => byRegion
|
var result = await _mutations.RunAsync(() => byRegion
|
||||||
? ConfigDbManager.AddGroupRegionServer(Config, subscription)
|
? ConfigDbHandler.AddGroupRegionServer(Config, subscription)
|
||||||
: ConfigDbManager.AddGroupAllServer(Config, subscription));
|
: ConfigDbHandler.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);
|
||||||
|
|||||||
@@ -61,7 +61,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(() => ConfigTextManager.SaveConfig());
|
await EnsureConfigSaveSucceededAsync(() => ConfigTextHandler.SaveConfig());
|
||||||
await ProfileExManager.Instance.SaveTo();
|
await ProfileExManager.Instance.SaveTo();
|
||||||
}, operation.Token);
|
}, operation.Token);
|
||||||
}, cancellationToken);
|
}, cancellationToken);
|
||||||
|
|||||||
@@ -252,7 +252,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(() => ConfigTextManager.SaveConfig());
|
await EnsureConfigSaveSucceededAsync(() => ConfigTextHandler.SaveConfig());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
catch (Exception exception)
|
catch (Exception exception)
|
||||||
@@ -260,7 +260,7 @@ public sealed partial class V2rayRuntime
|
|||||||
RestoreConfigValues(Config, oldConfig);
|
RestoreConfigValues(Config, oldConfig);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await _mutations.RunAsync(() => EnsureConfigSaveSucceededAsync(() => ConfigTextManager.SaveConfig()));
|
await _mutations.RunAsync(() => EnsureConfigSaveSucceededAsync(() => ConfigTextHandler.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(() => ConfigTextManager.SaveConfig());
|
await EnsureConfigSaveSucceededAsync(() => ConfigTextHandler.SaveConfig());
|
||||||
});
|
});
|
||||||
|
|
||||||
return await CompleteCoreAffectingChangeAsync("inbound", fingerprint != GetCoreConfigurationFingerprint(), applyContext);
|
return await CompleteCoreAffectingChangeAsync("inbound", fingerprint != GetCoreConfigurationFingerprint(), applyContext);
|
||||||
@@ -375,7 +375,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(() => ConfigTextManager.SaveConfig());
|
await EnsureConfigSaveSucceededAsync(() => ConfigTextHandler.SaveConfig());
|
||||||
});
|
});
|
||||||
|
|
||||||
return await CompleteCoreAffectingChangeAsync("core", fingerprint != GetCoreConfigurationFingerprint(), applyContext);
|
return await CompleteCoreAffectingChangeAsync("core", fingerprint != GetCoreConfigurationFingerprint(), applyContext);
|
||||||
@@ -402,7 +402,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(() => ConfigTextManager.SaveConfig());
|
await EnsureConfigSaveSucceededAsync(() => ConfigTextHandler.SaveConfig());
|
||||||
});
|
});
|
||||||
|
|
||||||
if (statisticsChanged)
|
if (statisticsChanged)
|
||||||
@@ -435,7 +435,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(() => ConfigTextManager.SaveConfig());
|
await EnsureConfigSaveSucceededAsync(() => ConfigTextHandler.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);
|
||||||
@@ -467,7 +467,7 @@ public sealed partial class V2rayRuntime
|
|||||||
item.CoreType = mapping.CoreType;
|
item.CoreType = mapping.CoreType;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.SaveConfig());
|
await EnsureConfigSaveSucceededAsync(() => ConfigTextHandler.SaveConfig());
|
||||||
});
|
});
|
||||||
return await CompleteCoreAffectingChangeAsync("core-types", fingerprint != GetCoreConfigurationFingerprint(), applyContext);
|
return await CompleteCoreAffectingChangeAsync("core-types", fingerprint != GetCoreConfigurationFingerprint(), applyContext);
|
||||||
}
|
}
|
||||||
@@ -503,7 +503,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(() => ConfigTextManager.SaveConfig());
|
await EnsureConfigSaveSucceededAsync(() => ConfigTextHandler.SaveConfig());
|
||||||
});
|
});
|
||||||
return await CompleteCoreAffectingChangeAsync("routing", fingerprint != GetCoreConfigurationFingerprint(), applyContext);
|
return await CompleteCoreAffectingChangeAsync("routing", fingerprint != GetCoreConfigurationFingerprint(), applyContext);
|
||||||
}
|
}
|
||||||
@@ -522,7 +522,7 @@ public sealed partial class V2rayRuntime
|
|||||||
await _mutations.RunAsync(async () =>
|
await _mutations.RunAsync(async () =>
|
||||||
{
|
{
|
||||||
Config.SimpleDNSItem = input;
|
Config.SimpleDNSItem = input;
|
||||||
await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.SaveConfig());
|
await EnsureConfigSaveSucceededAsync(() => ConfigTextHandler.SaveConfig());
|
||||||
});
|
});
|
||||||
return await CompleteCoreAffectingChangeAsync("dns", fingerprint != GetCoreConfigurationFingerprint(), applyContext);
|
return await CompleteCoreAffectingChangeAsync("dns", fingerprint != GetCoreConfigurationFingerprint(), applyContext);
|
||||||
}
|
}
|
||||||
@@ -563,7 +563,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 ConfigDbManager.SaveDNSItems(Config, item), Changed: changed);
|
return (Result: await ConfigDbHandler.SaveDNSItems(Config, item), Changed: changed);
|
||||||
});
|
});
|
||||||
if (result.Result == -2)
|
if (result.Result == -2)
|
||||||
{
|
{
|
||||||
@@ -696,8 +696,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 ConfigDbManager.SaveRoutingItem(Config, item)
|
? await ConfigDbHandler.SaveRoutingItem(Config, item)
|
||||||
: await ConfigDbManager.AddBatchRoutingRules(item, JsonUtils.Serialize(parsedRules, false));
|
: await ConfigDbHandler.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)
|
||||||
@@ -728,14 +728,14 @@ public sealed partial class V2rayRuntime
|
|||||||
{
|
{
|
||||||
return (Removed: false, AffectsCore: false);
|
return (Removed: false, AffectsCore: false);
|
||||||
}
|
}
|
||||||
await ConfigDbManager.RemoveRoutingItem(item);
|
await ConfigDbHandler.RemoveRoutingItem(item);
|
||||||
if (item.IsActive)
|
if (item.IsActive)
|
||||||
{
|
{
|
||||||
var remaining = await ConfigDbQuery.RoutingItems() ?? [];
|
var remaining = await ConfigDbQuery.RoutingItems() ?? [];
|
||||||
var fallback = remaining.FirstOrDefault();
|
var fallback = remaining.FirstOrDefault();
|
||||||
if (fallback is not null)
|
if (fallback is not null)
|
||||||
{
|
{
|
||||||
if (await ConfigDbManager.SetDefaultRouting(Config, fallback) != 0)
|
if (await ConfigDbHandler.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.");
|
||||||
}
|
}
|
||||||
@@ -743,7 +743,7 @@ public sealed partial class V2rayRuntime
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
Config.RoutingBasicItem.RoutingIndexId = string.Empty;
|
Config.RoutingBasicItem.RoutingIndexId = string.Empty;
|
||||||
await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.SaveConfig());
|
await EnsureConfigSaveSucceededAsync(() => ConfigTextHandler.SaveConfig());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (Removed: true, AffectsCore: item.IsActive);
|
return (Removed: true, AffectsCore: item.IsActive);
|
||||||
@@ -772,7 +772,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 ConfigDbManager.SetDefaultRouting(Config, item) : 0, Changed: changed);
|
return (Result: changed ? await ConfigDbHandler.SetDefaultRouting(Config, item) : 0, Changed: changed);
|
||||||
});
|
});
|
||||||
if (result.Result == -2)
|
if (result.Result == -2)
|
||||||
{
|
{
|
||||||
@@ -823,7 +823,7 @@ public sealed partial class V2rayRuntime
|
|||||||
{
|
{
|
||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
return await ConfigDbManager.AddBatchRoutingRules(item, JsonUtils.Serialize(rules, false));
|
return await ConfigDbHandler.AddBatchRoutingRules(item, JsonUtils.Serialize(rules, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<string> GetActiveRoutingSignatureAsync()
|
private async Task<string> GetActiveRoutingSignatureAsync()
|
||||||
@@ -930,7 +930,7 @@ public sealed partial class V2rayRuntime
|
|||||||
{
|
{
|
||||||
return -3;
|
return -3;
|
||||||
}
|
}
|
||||||
if (await ConfigDbManager.MoveRoutingRule(rules, index, direction, position) != 0)
|
if (await ConfigDbHandler.MoveRoutingRule(rules, index, direction, position) != 0)
|
||||||
{
|
{
|
||||||
return -4;
|
return -4;
|
||||||
}
|
}
|
||||||
@@ -993,7 +993,7 @@ public sealed partial class V2rayRuntime
|
|||||||
}
|
}
|
||||||
|
|
||||||
var before = await GetActiveRoutingSignatureAsync();
|
var before = await GetActiveRoutingSignatureAsync();
|
||||||
var result = await _mutations.RunAsync(() => ConfigDbManager.InitRouting(Config, true));
|
var result = await _mutations.RunAsync(() => ConfigDbHandler.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);
|
||||||
@@ -1048,7 +1048,7 @@ public sealed partial class V2rayRuntime
|
|||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
var item = ApplyCoreConfigTemplateInput(current, coreType, input);
|
var item = ApplyCoreConfigTemplateInput(current, coreType, input);
|
||||||
return await ConfigDbManager.SaveFullConfigTemplate(Config, item);
|
return await ConfigDbHandler.SaveFullConfigTemplate(Config, item);
|
||||||
});
|
});
|
||||||
if (result == -2)
|
if (result == -2)
|
||||||
{
|
{
|
||||||
@@ -1160,7 +1160,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 ConfigDbManager.SaveDNSItems(Config, item) != 0)
|
if (await ConfigDbHandler.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.");
|
||||||
}
|
}
|
||||||
@@ -1168,7 +1168,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 ConfigDbManager.InitRouting(Config, false) != 0)
|
if (await ConfigDbHandler.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.");
|
||||||
}
|
}
|
||||||
@@ -1177,7 +1177,7 @@ public sealed partial class V2rayRuntime
|
|||||||
{
|
{
|
||||||
foreach (var item in stage.DnsItems)
|
foreach (var item in stage.DnsItems)
|
||||||
{
|
{
|
||||||
if (await ConfigDbManager.SaveDNSItems(Config, item) != 0)
|
if (await ConfigDbHandler.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.");
|
||||||
}
|
}
|
||||||
@@ -1188,7 +1188,7 @@ public sealed partial class V2rayRuntime
|
|||||||
var item = await ConfigDbQuery.GetRoutingItem(itemId);
|
var item = await ConfigDbQuery.GetRoutingItem(itemId);
|
||||||
if (item is not null)
|
if (item is not null)
|
||||||
{
|
{
|
||||||
await ConfigDbManager.RemoveRoutingItem(item);
|
await ConfigDbHandler.RemoveRoutingItem(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1207,7 +1207,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 ConfigDbManager.AddBatchRoutingRules(item, item.RuleSet ?? "[]") != 0)
|
if (await ConfigDbHandler.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.");
|
||||||
}
|
}
|
||||||
@@ -1216,7 +1216,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 ConfigDbManager.SetDefaultRouting(Config, defaultItem) != 0)
|
if (defaultItem is not null && await ConfigDbHandler.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.");
|
||||||
}
|
}
|
||||||
@@ -1226,7 +1226,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 ConfigDbManager.SetDefaultRouting(Config, existingDefault) != 0)
|
&& await ConfigDbHandler.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.");
|
||||||
}
|
}
|
||||||
@@ -1234,7 +1234,7 @@ public sealed partial class V2rayRuntime
|
|||||||
}
|
}
|
||||||
|
|
||||||
token.ThrowIfCancellationRequested();
|
token.ThrowIfCancellationRequested();
|
||||||
await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.SaveConfig());
|
await EnsureConfigSaveSucceededAsync(() => ConfigTextHandler.SaveConfig());
|
||||||
token.ThrowIfCancellationRequested();
|
token.ThrowIfCancellationRequested();
|
||||||
}, token),
|
}, token),
|
||||||
() => RestoreRegionalPresetSnapshotAsync(applyContext));
|
() => RestoreRegionalPresetSnapshotAsync(applyContext));
|
||||||
@@ -1349,7 +1349,7 @@ public sealed partial class V2rayRuntime
|
|||||||
await _mutations.RunAsync(async () =>
|
await _mutations.RunAsync(async () =>
|
||||||
{
|
{
|
||||||
RestoreConfigValues(Config, context.OldConfig);
|
RestoreConfigValues(Config, context.OldConfig);
|
||||||
await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.SaveConfig());
|
await EnsureConfigSaveSucceededAsync(() => ConfigTextHandler.SaveConfig());
|
||||||
|
|
||||||
await SQLiteHelper.Instance.DeleteAllAsync<RoutingItem>();
|
await SQLiteHelper.Instance.DeleteAllAsync<RoutingItem>();
|
||||||
if (context.OldRoutingItems.Length > 0
|
if (context.OldRoutingItems.Length > 0
|
||||||
@@ -1625,7 +1625,7 @@ public sealed partial class V2rayRuntime
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
RestoreConfigValues(Config, context.OldConfig);
|
RestoreConfigValues(Config, context.OldConfig);
|
||||||
await _mutations.RunAsync(() => EnsureConfigSaveSucceededAsync(() => ConfigTextManager.SaveConfig()));
|
await _mutations.RunAsync(() => EnsureConfigSaveSucceededAsync(() => ConfigTextHandler.SaveConfig()));
|
||||||
configRestored = true;
|
configRestored = true;
|
||||||
await _mutations.RunAsync(async () =>
|
await _mutations.RunAsync(async () =>
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ public sealed partial class V2rayRuntime(
|
|||||||
private bool _restoring;
|
private bool _restoring;
|
||||||
private int _restoreAndRestartRequested;
|
private int _restoreAndRestartRequested;
|
||||||
|
|
||||||
private Config Config => ConfigTextManager.Config;
|
private Config Config => ConfigTextHandler.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;
|
||||||
|
|
||||||
@@ -245,19 +245,19 @@ public sealed partial class V2rayRuntime(
|
|||||||
{
|
{
|
||||||
Config.Inbound[0].AllowLANConn = allowProxyFromLan;
|
Config.Inbound[0].AllowLANConn = allowProxyFromLan;
|
||||||
}
|
}
|
||||||
await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.SaveConfig());
|
await EnsureConfigSaveSucceededAsync(() => ConfigTextHandler.SaveConfig());
|
||||||
});
|
});
|
||||||
await ConfigDbManager.InitBuiltinDNS(Config);
|
await ConfigDbHandler.InitBuiltinDNS(Config);
|
||||||
await BuiltinDnsProfileBootstrap.EnsureAsync(
|
await BuiltinDnsProfileBootstrap.EnsureAsync(
|
||||||
Config,
|
Config,
|
||||||
async () => await ConfigDbQuery.DNSItems() ?? [],
|
async () => await ConfigDbQuery.DNSItems() ?? [],
|
||||||
ConfigDbManager.SaveDNSItems);
|
ConfigDbHandler.SaveDNSItems);
|
||||||
await ConfigDbManager.InitBuiltinFullConfigTemplate(Config);
|
await ConfigDbHandler.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 ConfigDbManager.InitBuiltinRouting(Config);
|
await ConfigDbHandler.InitBuiltinRouting(Config);
|
||||||
_ = await ConfigDbManager.GetDefaultRouting(Config);
|
_ = await ConfigDbHandler.GetDefaultRouting(Config);
|
||||||
var restoredSubscriptions = await ConfigDbQuery.SubItems() ?? [];
|
var restoredSubscriptions = await ConfigDbQuery.SubItems() ?? [];
|
||||||
var normalizedSubIndexId = NormalizeSelectedSubscriptionId(
|
var normalizedSubIndexId = NormalizeSelectedSubscriptionId(
|
||||||
Config.SubIndexId,
|
Config.SubIndexId,
|
||||||
@@ -268,8 +268,8 @@ public sealed partial class V2rayRuntime(
|
|||||||
Config.SubIndexId = normalizedSubIndexId;
|
Config.SubIndexId = normalizedSubIndexId;
|
||||||
}
|
}
|
||||||
var selectedProfileId = Config.IndexId;
|
var selectedProfileId = Config.IndexId;
|
||||||
var defaultProfile = await ConfigDbManager.GetDefaultServer(Config);
|
var defaultProfile = await ConfigDbHandler.GetDefaultServer(Config);
|
||||||
await _mutations.RunAsync(() => EnsureConfigSaveSucceededAsync(() => ConfigTextManager.SaveConfig()));
|
await _mutations.RunAsync(() => EnsureConfigSaveSucceededAsync(() => ConfigTextHandler.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.
|
||||||
@@ -392,7 +392,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(() => ConfigTextManager.SaveConfig()),
|
() => EnsureConfigSaveSucceededAsync(() => ConfigTextHandler.SaveConfig()),
|
||||||
deadline.Token);
|
deadline.Token);
|
||||||
return true;
|
return true;
|
||||||
}));
|
}));
|
||||||
@@ -437,7 +437,7 @@ public sealed partial class V2rayRuntime(
|
|||||||
}
|
}
|
||||||
|
|
||||||
var item = ToSubItem(input, null);
|
var item = ToSubItem(input, null);
|
||||||
var result = await _mutations.RunAsync(() => ConfigDbManager.AddSubItem(Config, item));
|
var result = await _mutations.RunAsync(() => ConfigDbHandler.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);
|
||||||
@@ -466,7 +466,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 ConfigDbManager.AddSubItem(Config, item);
|
var result = await ConfigDbHandler.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);
|
||||||
@@ -496,14 +496,14 @@ public sealed partial class V2rayRuntime(
|
|||||||
|
|
||||||
await _mutations.RunAsync(async () =>
|
await _mutations.RunAsync(async () =>
|
||||||
{
|
{
|
||||||
if (await ConfigDbManager.DeleteSubItem(Config, id) != 0)
|
if (await ConfigDbHandler.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 ConfigDbManager.GetDefaultServer(Config);
|
_ = await ConfigDbHandler.GetDefaultServer(Config);
|
||||||
await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.SaveConfig());
|
await EnsureConfigSaveSucceededAsync(() => ConfigTextHandler.SaveConfig());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -552,7 +552,7 @@ public sealed partial class V2rayRuntime(
|
|||||||
await handler.UpdateProcess(id);
|
await handler.UpdateProcess(id);
|
||||||
|
|
||||||
operation.Token.ThrowIfCancellationRequested();
|
operation.Token.ThrowIfCancellationRequested();
|
||||||
await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.SaveConfig());
|
await EnsureConfigSaveSucceededAsync(() => ConfigTextHandler.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 });
|
||||||
@@ -780,7 +780,7 @@ public sealed partial class V2rayRuntime(
|
|||||||
await _mutations.RunAsync(async () =>
|
await _mutations.RunAsync(async () =>
|
||||||
{
|
{
|
||||||
Config.IndexId = profile.IndexId;
|
Config.IndexId = profile.IndexId;
|
||||||
await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.SaveConfig());
|
await EnsureConfigSaveSucceededAsync(() => ConfigTextHandler.SaveConfig());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -789,10 +789,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 ConfigDbManager.GetDefaultServer(Config);
|
var selected = await ConfigDbHandler.GetDefaultServer(Config);
|
||||||
if (selected is not null)
|
if (selected is not null)
|
||||||
{
|
{
|
||||||
await EnsureConfigSaveSucceededAsync(() => ConfigTextManager.SaveConfig());
|
await EnsureConfigSaveSucceededAsync(() => ConfigTextHandler.SaveConfig());
|
||||||
}
|
}
|
||||||
return selected;
|
return selected;
|
||||||
});
|
});
|
||||||
@@ -1178,7 +1178,7 @@ public sealed partial class V2rayRuntime(
|
|||||||
if (item is not null)
|
if (item is not null)
|
||||||
{
|
{
|
||||||
item.UpdateTime = updateTime;
|
item.UpdateTime = updateTime;
|
||||||
if (await ConfigDbManager.AddSubItem(Config, item) != 0)
|
if (await ConfigDbHandler.AddSubItem(Config, item) != 0)
|
||||||
{
|
{
|
||||||
throw new IOException("ServiceLib could not save the subscription timestamp.");
|
throw new IOException("ServiceLib could not save the subscription timestamp.");
|
||||||
}
|
}
|
||||||
@@ -1191,7 +1191,7 @@ public sealed partial class V2rayRuntime(
|
|||||||
if (item.Enabled)
|
if (item.Enabled)
|
||||||
{
|
{
|
||||||
item.UpdateTime = updateTime;
|
item.UpdateTime = updateTime;
|
||||||
if (await ConfigDbManager.AddSubItem(Config, item) != 0)
|
if (await ConfigDbHandler.AddSubItem(Config, item) != 0)
|
||||||
{
|
{
|
||||||
throw new IOException("ServiceLib could not save the subscription timestamp.");
|
throw new IOException("ServiceLib could not save the subscription timestamp.");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
global using ServiceLib;
|
global using ServiceLib;
|
||||||
global using ServiceLib.Common;
|
global using ServiceLib.Common;
|
||||||
global using ServiceLib.Enums;
|
global using ServiceLib.Enums;
|
||||||
|
global using ServiceLib.Handler.Data;
|
||||||
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;
|
||||||
|
|||||||
@@ -24,7 +24,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 ConfigDbManager.AddShadowsocksServer(new Config(), profile, toFile: false);
|
var result = await ConfigDbHandler.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);
|
||||||
@@ -41,7 +41,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 ConfigDbManager.AddShadowsocksServer(new Config(), profile, toFile: false);
|
var result = await ConfigDbHandler.AddShadowsocksServer(new Config(), profile, toFile: false);
|
||||||
|
|
||||||
await result.Should().BeEqualTo(0);
|
await result.Should().BeEqualTo(0);
|
||||||
}
|
}
|
||||||
@@ -54,7 +54,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 ConfigDbManager.AddShadowsocksServer(new Config(), profile, toFile: false);
|
var result = await ConfigDbHandler.AddShadowsocksServer(new Config(), profile, toFile: false);
|
||||||
|
|
||||||
await result.Should().BeEqualTo(-1);
|
await result.Should().BeEqualTo(-1);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -104,7 +104,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(ConfigDbManager.InitBuiltinSimpleDNS().RemoteDNS);
|
await capturedStage.SimpleDnsItem.RemoteDNS.Should().BeEqualTo(ConfigDbHandler.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");
|
||||||
@@ -562,7 +562,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 = ConfigDbManager.InitBuiltinSimpleDNS();
|
var builtin = ConfigDbHandler.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();
|
||||||
@@ -667,7 +667,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(ConfigDbManager.InitBuiltinSimpleDNS().RemoteDNS);
|
await staged.SimpleDnsItem.RemoteDNS.Should().BeEqualTo(ConfigDbHandler.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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -221,7 +221,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 = ConfigDbManager.InitBuiltinSimpleDNS(),
|
SimpleDNSItem = ConfigDbHandler.InitBuiltinSimpleDNS(),
|
||||||
HappyEyeballs4RayItem = new HappyEyeballs4RayItem(),
|
HappyEyeballs4RayItem = new HappyEyeballs4RayItem(),
|
||||||
IndexId = string.Empty,
|
IndexId = string.Empty,
|
||||||
SubIndexId = string.Empty,
|
SubIndexId = string.Empty,
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ public class WindowBase<TViewModel> : ReactiveWindow<TViewModel> where TViewMode
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var sizeItem = ConfigTextManager.GetWindowSizeItem(GetType().Name);
|
var sizeItem = ConfigTextHandler.GetWindowSizeItem(GetType().Name);
|
||||||
if (sizeItem == null)
|
if (sizeItem == null)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
@@ -32,7 +32,7 @@ public class WindowBase<TViewModel> : ReactiveWindow<TViewModel> where TViewMode
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
ConfigTextManager.SaveWindowSizeItem(GetType().Name, Width, Height);
|
ConfigTextHandler.SaveWindowSizeItem(GetType().Name, Width, Height);
|
||||||
}
|
}
|
||||||
catch { }
|
catch { }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ public class MaterialDesignFonts
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var fontFamily = ConfigTextManager.Config.UiItem.CurrentFontFamily;
|
var fontFamily = ConfigTextHandler.Config.UiItem.CurrentFontFamily;
|
||||||
if (fontFamily.IsNotEmpty())
|
if (fontFamily.IsNotEmpty())
|
||||||
{
|
{
|
||||||
var fontPath = Utils.GetFontsPath();
|
var fontPath = Utils.GetFontsPath();
|
||||||
|
|||||||
@@ -27,8 +27,8 @@ global using ServiceLib.Common;
|
|||||||
global using ServiceLib.Enums;
|
global using ServiceLib.Enums;
|
||||||
global using ServiceLib.Events;
|
global using ServiceLib.Events;
|
||||||
global using ServiceLib.Handler;
|
global using ServiceLib.Handler;
|
||||||
|
global using ServiceLib.Handler.Data;
|
||||||
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;
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ public sealed partial class HotkeyManager
|
|||||||
private void Init()
|
private void Init()
|
||||||
{
|
{
|
||||||
_hotkeyTriggerDic.Clear();
|
_hotkeyTriggerDic.Clear();
|
||||||
foreach (var item in ConfigTextManager.Config.GlobalHotkeys)
|
foreach (var item in ConfigTextHandler.Config.GlobalHotkeys)
|
||||||
{
|
{
|
||||||
if (item.KeyCode != null && (Key)item.KeyCode != Key.None)
|
if (item.KeyCode != null && (Key)item.KeyCode != Key.None)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ public sealed class WindowsManager
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var item = await ConfigDbManager.GetDefaultRouting(config);
|
var item = await ConfigDbHandler.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;
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ public partial class ThemeSettingViewModel : MyReactiveObject
|
|||||||
|
|
||||||
public ThemeSettingViewModel()
|
public ThemeSettingViewModel()
|
||||||
{
|
{
|
||||||
_config = ConfigTextManager.Config;
|
_config = ConfigTextHandler.Config;
|
||||||
|
|
||||||
RegisterSystemColorSet(_config, ModifyTheme);
|
RegisterSystemColorSet(_config, ModifyTheme);
|
||||||
|
|
||||||
@@ -64,7 +64,7 @@ public partial class ThemeSettingViewModel : MyReactiveObject
|
|||||||
{
|
{
|
||||||
_config.UiItem.CurrentTheme = CurrentTheme;
|
_config.UiItem.CurrentTheme = CurrentTheme;
|
||||||
ModifyTheme();
|
ModifyTheme();
|
||||||
await ConfigTextManager.SaveConfig();
|
await ConfigTextHandler.SaveConfig();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -83,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 ConfigTextManager.SaveConfig();
|
await ConfigTextHandler.SaveConfig();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -95,7 +95,7 @@ public partial class ThemeSettingViewModel : MyReactiveObject
|
|||||||
{
|
{
|
||||||
_config.UiItem.CurrentFontSize = CurrentFontSize;
|
_config.UiItem.CurrentFontSize = CurrentFontSize;
|
||||||
ModifyFontSize();
|
ModifyFontSize();
|
||||||
await ConfigTextManager.SaveConfig();
|
await ConfigTextHandler.SaveConfig();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -107,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 ConfigTextManager.SaveConfig();
|
await ConfigTextHandler.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, ConfigTextManager.Config.UiItem.CurrentTheme);
|
WindowsUtils.SetDarkBorder(this, ConfigTextHandler.Config.UiItem.CurrentTheme);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeData(ProfileItem profileItem)
|
private void InitializeData(ProfileItem profileItem)
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ public partial class AddServer2Window
|
|||||||
interaction.SetOutput(fileName);
|
interaction.SetOutput(fileName);
|
||||||
}).DisposeWith(disposables);
|
}).DisposeWith(disposables);
|
||||||
});
|
});
|
||||||
WindowsUtils.SetDarkBorder(this, ConfigTextManager.Config.UiItem.CurrentTheme);
|
WindowsUtils.SetDarkBorder(this, ConfigTextHandler.Config.UiItem.CurrentTheme);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeData(ProfileItem profileItem)
|
private void InitializeData(ProfileItem profileItem)
|
||||||
|
|||||||
@@ -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, ConfigTextManager.Config.UiItem.CurrentTheme);
|
WindowsUtils.SetDarkBorder(this, ConfigTextHandler.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 = ConfigTextManager.Config;
|
_config = ConfigTextHandler.Config;
|
||||||
|
|
||||||
btnAutofitColumnWidth.Click += BtnAutofitColumnWidth_Click;
|
btnAutofitColumnWidth.Click += BtnAutofitColumnWidth_Click;
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ public partial class DNSSettingWindow
|
|||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
_config = ConfigTextManager.Config;
|
_config = ConfigTextHandler.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, ConfigTextManager.Config.UiItem.CurrentTheme);
|
WindowsUtils.SetDarkBorder(this, ConfigTextHandler.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 = ConfigTextManager.Config;
|
_config = ConfigTextHandler.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, ConfigTextManager.Config.UiItem.CurrentTheme);
|
WindowsUtils.SetDarkBorder(this, ConfigTextHandler.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, ConfigTextManager.Config.UiItem.CurrentTheme);
|
WindowsUtils.SetDarkBorder(this, ConfigTextHandler.Config.UiItem.CurrentTheme);
|
||||||
|
|
||||||
Init();
|
Init();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ public partial class MainWindow
|
|||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
_config = ConfigTextManager.Config;
|
_config = ConfigTextHandler.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()
|
||||||
{
|
{
|
||||||
ConfigTextManager.SaveWindowSizeItem(GetType().Name, Width, Height);
|
ConfigTextHandler.SaveWindowSizeItem(GetType().Name, Width, Height);
|
||||||
|
|
||||||
if (_config.UiItem.MainGirdOrientation == EGirdOrientation.Horizontal)
|
if (_config.UiItem.MainGirdOrientation == EGirdOrientation.Horizontal)
|
||||||
{
|
{
|
||||||
ConfigTextManager.SaveMainGirdHeight(gridMain.ColumnDefinitions[0].ActualWidth, gridMain.ColumnDefinitions[2].ActualWidth);
|
ConfigTextHandler.SaveMainGirdHeight(gridMain.ColumnDefinitions[0].ActualWidth, gridMain.ColumnDefinitions[2].ActualWidth);
|
||||||
}
|
}
|
||||||
else if (_config.UiItem.MainGirdOrientation == EGirdOrientation.Vertical)
|
else if (_config.UiItem.MainGirdOrientation == EGirdOrientation.Vertical)
|
||||||
{
|
{
|
||||||
ConfigTextManager.SaveMainGirdHeight(gridMain1.RowDefinitions[0].ActualHeight, gridMain1.RowDefinitions[2].ActualHeight);
|
ConfigTextHandler.SaveMainGirdHeight(gridMain1.RowDefinitions[0].ActualHeight, gridMain1.RowDefinitions[2].ActualHeight);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ public partial class OptionSettingWindow
|
|||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
_config = ConfigTextManager.Config;
|
_config = ConfigTextHandler.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, ConfigTextManager.Config.UiItem.CurrentTheme);
|
WindowsUtils.SetDarkBorder(this, ConfigTextHandler.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, ConfigTextManager.Config.UiItem.CurrentTheme);
|
WindowsUtils.SetDarkBorder(this, ConfigTextHandler.Config.UiItem.CurrentTheme);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AllowMultiSelect(bool allow)
|
private void AllowMultiSelect(bool allow)
|
||||||
|
|||||||
@@ -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 = ConfigTextManager.Config;
|
_config = ConfigTextHandler.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, ConfigTextManager.Config.UiItem.CurrentTheme);
|
WindowsUtils.SetDarkBorder(this, ConfigTextHandler.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, ConfigTextManager.Config.UiItem.CurrentTheme);
|
WindowsUtils.SetDarkBorder(this, ConfigTextHandler.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, ConfigTextManager.Config.UiItem.CurrentTheme);
|
WindowsUtils.SetDarkBorder(this, ConfigTextHandler.Config.UiItem.CurrentTheme);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RoutingSettingWindow_Closing(object? sender, System.ComponentModel.CancelEventArgs e)
|
private void RoutingSettingWindow_Closing(object? sender, System.ComponentModel.CancelEventArgs e)
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ public partial class StatusBarView
|
|||||||
public StatusBarView()
|
public StatusBarView()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
_config = ConfigTextManager.Config;
|
_config = ConfigTextHandler.Config;
|
||||||
|
|
||||||
menuExit.Click += menuExit_Click;
|
menuExit.Click += menuExit_Click;
|
||||||
txtRunningServerDisplay.PreviewMouseDown += txtRunningInfoDisplay_MouseDoubleClick;
|
txtRunningServerDisplay.PreviewMouseDown += txtRunningInfoDisplay_MouseDoubleClick;
|
||||||
|
|||||||
@@ -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, ConfigTextManager.Config.UiItem.CurrentTheme);
|
WindowsUtils.SetDarkBorder(this, ConfigTextHandler.Config.UiItem.CurrentTheme);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Window_Loaded(object sender, RoutedEventArgs e)
|
private void Window_Loaded(object sender, RoutedEventArgs e)
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ public partial class SubSettingWindow
|
|||||||
interaction.SetOutput(RxVoid.Default);
|
interaction.SetOutput(RxVoid.Default);
|
||||||
}).DisposeWith(disposables);
|
}).DisposeWith(disposables);
|
||||||
});
|
});
|
||||||
WindowsUtils.SetDarkBorder(this, ConfigTextManager.Config.UiItem.CurrentTheme);
|
WindowsUtils.SetDarkBorder(this, ConfigTextHandler.Config.UiItem.CurrentTheme);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task ShareSub(string url)
|
private async Task ShareSub(string url)
|
||||||
|
|||||||
Reference in New Issue
Block a user