diff --git a/.github/ISSUE_TEMPLATE/---bug-report.md b/.github/ISSUE_TEMPLATE/---bug-report.md index 612aa06b..a249f974 100644 --- a/.github/ISSUE_TEMPLATE/---bug-report.md +++ b/.github/ISSUE_TEMPLATE/---bug-report.md @@ -25,12 +25,12 @@ If applicable, add screenshots to help explain your problem. **馃枼 Desktop (please complete the following information):** - OS: [e.g. Windows 11 Build xxx] - - Version [e.g. KitX v3.0.0] + - Version: [e.g. KitX v3.0.0] **馃摫 Smartphone (please complete the following information):** - Device: [e.g. iPhone6] - OS: [e.g. iOS8.1] - - Version [e.g. KitX Mobile v1.0.0] + - Version: [e.g. KitX Mobile v1.0.0] **馃搸 Additional context** Add any other context about the problem here. diff --git a/KitX Dashboard/App.axaml.cs b/KitX Dashboard/App.axaml.cs index 7178e85b..25b7dacf 100644 --- a/KitX Dashboard/App.axaml.cs +++ b/KitX Dashboard/App.axaml.cs @@ -5,7 +5,6 @@ using Avalonia.Media; using BasicHelper.IO; using BasicHelper.Util; -using FluentAvalonia.UI.Media; using KitX_Dashboard.Data; using KitX_Dashboard.Models; using KitX_Dashboard.ViewModels; @@ -24,7 +23,7 @@ public override void Initialize() { AvaloniaXamlLoader.Load(this); - string lang = Program.GlobalConfig.App.AppLanguage; + string lang = Program.Config.App.AppLanguage; try { Resources.MergedDictionaries.Clear(); @@ -38,7 +37,7 @@ public override void Initialize() { Log.Warning($"Language File {lang}.axaml not found."); - string backup_lang = Program.GlobalConfig.App.SurpportLanguages.Keys.First(); + string backup_lang = Program.Config.App.SurpportLanguages.Keys.First(); Resources.MergedDictionaries.Clear(); Resources.MergedDictionaries.Add( AvaloniaRuntimeXamlLoader.Load( @@ -46,7 +45,7 @@ public override void Initialize() ) as ResourceDictionary ); - Program.GlobalConfig.App.AppLanguage = backup_lang; + Program.Config.App.AppLanguage = backup_lang; } finally { @@ -55,7 +54,7 @@ public override void Initialize() EventHandlers.Invoke("LanguageChanged"); - Color c = Color.Parse(Program.GlobalConfig.App.ThemeColor); + Color c = Color.Parse(Program.Config.App.ThemeColor); if (Current != null) { @@ -84,10 +83,10 @@ public override void OnFrameworkInitializationCompleted() }; } - string color = Program.GlobalConfig.App.ThemeColor; + string color = Program.Config.App.ThemeColor; Resources["ThemePrimaryAccent"] = new SolidColorBrush(Color.Parse(color)); - if (Program.GlobalConfig.App.ShowAnnouncementWhenStart) + if (Program.Config.App.ShowAnnouncementWhenStart) new Thread(async () => { await Services.AnouncementManager.CheckNewAnnouncements(); diff --git a/KitX Dashboard/Data/Config.cs b/KitX Dashboard/Data/AppConfig.cs similarity index 92% rename from KitX Dashboard/Data/Config.cs rename to KitX Dashboard/Data/AppConfig.cs index b39fca1c..5e1fa8af 100644 --- a/KitX Dashboard/Data/Config.cs +++ b/KitX Dashboard/Data/AppConfig.cs @@ -6,7 +6,7 @@ namespace KitX_Dashboard.Data /// /// 閰嶇疆缁撴瀯 /// - public class Config + public class AppConfig { [JsonInclude] public Config_App App { get; set; } = new(); @@ -17,8 +17,14 @@ public class Config [JsonInclude] public Config_Pages Pages { get; set; } = new(); + [JsonInclude] + public Config_Web Web { get; set; } = new(); + + [JsonInclude] + public Config_Log Log { get; set; } = new(); + /// - /// AppConfig + /// Config /// public class Config_App { @@ -49,45 +55,11 @@ public class Config_App [JsonInclude] public bool DeveloperSetting { get; set; } = false; - [JsonInclude] - public int UDPPortSend { get; set; } = 23404; - - [JsonInclude] - public int UDPPortReceive { get; set; } = 24040; - - [JsonInclude] - public string APIServer { get; set; } = "api.catrol.cn"; - - [JsonInclude] - public string APIPath { get; set; } = "/apps/kitx/"; - [JsonInclude] public bool ShowAnnouncementWhenStart { get; set; } = true; [JsonInclude] public ulong RanTime { get; set; } = 0; - - [JsonInclude] - public string IPFilter { get; set; } = "192.168"; - - [JsonInclude] - public long LogFileSingleMaxSize { get; set; } = 1024 * 10000; // 10MB - - [JsonInclude] - public string LogFilePath { get; set; } = "./Log/"; - - [JsonInclude] - public string LogTemplate { get; set; } = "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz}] " + - "[{Level:u3}] {Message:lj}{NewLine}{Exception}"; - - [JsonInclude] - public int LogFileMaxCount { get; set; } = 50; - - [JsonInclude] - public int LogFileFlushInterval { get; set; } = 30; - - [JsonInclude] - public int SocketBufferSize { get; set; } = 1024 * 100; } /// @@ -218,6 +190,60 @@ public class Config_SettingsPage public bool IsNavigationViewPaneOpened { get; set; } = true; } } + + /// + /// WebConfig + /// + public class Config_Web + { + + [JsonInclude] + public string APIServer { get; set; } = "api.catrol.cn"; + + [JsonInclude] + public string APIPath { get; set; } = "/apps/kitx/"; + + [JsonInclude] + public int UDPPortSend { get; set; } = 23404; + + [JsonInclude] + public int UDPPortReceive { get; set; } = 24040; + + [JsonInclude] + public string UDPBroadcastAddress { get; set; } = "224.0.0.0"; + + [JsonInclude] + public string IPFilter { get; set; } = "192.168"; + + [JsonInclude] + public int SocketBufferSize { get; set; } = 1024 * 100; + + [JsonInclude] + public int DeviceInfoStructTTLSeconds { get; set; } = 5; + } + + /// + /// LogConfig + /// + public class Config_Log + { + + [JsonInclude] + public long LogFileSingleMaxSize { get; set; } = 1024 * 10000; // 10MB + + [JsonInclude] + public string LogFilePath { get; set; } = "./Log/"; + + [JsonInclude] + public string LogTemplate { get; set; } = "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz}] " + + "[{Level:u3}] {Message:lj}{NewLine}{Exception}"; + + [JsonInclude] + public int LogFileMaxCount { get; set; } = 50; + + [JsonInclude] + public int LogFileFlushInterval { get; set; } = 30; + } } } diff --git a/KitX Dashboard/Helper.cs b/KitX Dashboard/Helper.cs index 342b2c24..d50baae9 100644 --- a/KitX Dashboard/Helper.cs +++ b/KitX Dashboard/Helper.cs @@ -1,7 +1,4 @@ -锘縰sing Avalonia; -using Avalonia.Media; -using FluentAvalonia.UI.Media; -using KitX_Dashboard.Data; +锘縰sing KitX_Dashboard.Data; using KitX_Dashboard.Models; using Serilog; using System; @@ -32,7 +29,7 @@ public static void StartUpCheck() //InitLiteLogger(Program.LocalLogger); - string logdir = Path.GetFullPath(Program.GlobalConfig.App.LogFilePath); + string logdir = Path.GetFullPath(Program.Config.Log.LogFilePath); if (!Directory.Exists(logdir)) Directory.CreateDirectory(logdir); @@ -41,14 +38,14 @@ public static void StartUpCheck() .MinimumLevel.Information() .WriteTo.File( $"{logdir}Log_.log", - outputTemplate: Program.GlobalConfig.App.LogTemplate, + outputTemplate: Program.Config.Log.LogTemplate, rollingInterval: RollingInterval.Hour, - fileSizeLimitBytes: Program.GlobalConfig.App.LogFileSingleMaxSize, + fileSizeLimitBytes: Program.Config.Log.LogFileSingleMaxSize, buffered: true, - flushToDiskInterval: new(0, 0, Program.GlobalConfig.App.LogFileFlushInterval), + flushToDiskInterval: new(0, 0, Program.Config.Log.LogFileFlushInterval), restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Information, rollOnFileSizeLimit: true, - retainedFileCountLimit: Program.GlobalConfig.App.LogFileMaxCount + retainedFileCountLimit: Program.Config.Log.LogFileMaxCount ) .CreateLogger(); @@ -90,7 +87,7 @@ public static void SaveConfig() new Thread(() => { BasicHelper.IO.FileHelper.WriteIn(Path.GetFullPath(GlobalInfo.ConfigFilePath), - JsonSerializer.Serialize(Program.GlobalConfig, options)); + JsonSerializer.Serialize(Program.Config, options)); }).Start(); } @@ -117,7 +114,7 @@ public static void SavePluginsListConfig() /// public static void LoadConfig() { - Program.GlobalConfig = JsonSerializer.Deserialize( + Program.Config = JsonSerializer.Deserialize( BasicHelper.IO.FileHelper.ReadAll(Path.GetFullPath(GlobalInfo.ConfigFilePath))); } diff --git a/KitX Dashboard/Models/GreetingTextGenerator.cs b/KitX Dashboard/Models/GreetingTextGenerator.cs index c4491625..925fa9da 100644 --- a/KitX Dashboard/Models/GreetingTextGenerator.cs +++ b/KitX Dashboard/Models/GreetingTextGenerator.cs @@ -46,23 +46,23 @@ internal static int GenerateRandomIndex(Step step) switch (step) { case Step.Morning: - result = random.Next(1, Program.GlobalConfig.Windows + result = random.Next(1, Program.Config.Windows .MainWindow.GreetingTextCount_Morning + 1); break; case Step.Noon: - result = random.Next(1, Program.GlobalConfig.Windows + result = random.Next(1, Program.Config.Windows .MainWindow.GreetingTextCount_Noon + 1); break; case Step.AfterNoon: - result = random.Next(1, Program.GlobalConfig.Windows + result = random.Next(1, Program.Config.Windows .MainWindow.GreetingTextCount_AfterNoon + 1); break; case Step.Evening: - result = random.Next(1, Program.GlobalConfig.Windows + result = random.Next(1, Program.Config.Windows .MainWindow.GreetingTextCount_Evening + 1); break; case Step.Night: - result = random.Next(1, Program.GlobalConfig.Windows + result = random.Next(1, Program.Config.Windows .MainWindow.GreetingTextCount_Night + 1); break; } diff --git a/KitX Dashboard/Program.cs b/KitX Dashboard/Program.cs index 92a418b3..10b6217b 100644 --- a/KitX Dashboard/Program.cs +++ b/KitX Dashboard/Program.cs @@ -14,7 +14,7 @@ internal class Program { //internal static LoggerManager LocalLogger = new(); - internal static Config GlobalConfig = new(); + internal static AppConfig Config = new(); internal static WebServer? LocalWebServer; @@ -87,7 +87,7 @@ public static void Main(string[] args) #endregion - GlobalConfig.App.RanTime++; + Config.App.RanTime++; #region 进入应用生命周期循环 diff --git a/KitX Dashboard/Services/AnouncementManager.cs b/KitX Dashboard/Services/AnouncementManager.cs index 9f9fbf3c..086d3922 100644 --- a/KitX Dashboard/Services/AnouncementManager.cs +++ b/KitX Dashboard/Services/AnouncementManager.cs @@ -24,8 +24,8 @@ public static async Task CheckNewAnnouncements() // 閾炬帴澶撮儴 string linkBase = $"http://" + - $"{Program.GlobalConfig.App.APIServer}" + - $"{Program.GlobalConfig.App.APIPath}"; + $"{Program.Config.Web.APIServer}" + + $"{Program.Config.Web.APIPath}"; // 鑾峰彇鍏憡鍒楄〃鐨刟pi閾炬帴 string link = $"{linkBase}{GlobalInfo.Api_Get_Announcements}"; @@ -66,7 +66,7 @@ await FileHelper.ReadAllAsync(confPath) // 鑾峰彇鍗曚釜鍏憡鐨勯摼鎺 string apiLink = $"{linkBase}{GlobalInfo.Api_Get_Announcement}" + $"?" + - $"lang={Program.GlobalConfig.App.AppLanguage}" + + $"lang={Program.Config.App.AppLanguage}" + $"&" + $"date={item:yyyy-MM-dd HH-mm}"; string? md = JsonSerializer.Deserialize(await client.GetStringAsync(apiLink)); diff --git a/KitX Dashboard/Services/DevicesManager.cs b/KitX Dashboard/Services/DevicesManager.cs index cbf5c2d2..920de79f 100644 --- a/KitX Dashboard/Services/DevicesManager.cs +++ b/KitX Dashboard/Services/DevicesManager.cs @@ -56,7 +56,8 @@ internal static void KeepCheckAndRemove() continue; } MacAddressVisited.Add(item.viewModel.DeviceInfo.DeviceMacAddress); - if (DateTime.Now - item.viewModel.DeviceInfo.SendTime > new TimeSpan(0, 0, 5)) + if (DateTime.Now - item.viewModel.DeviceInfo.SendTime + > new TimeSpan(0, 0, Program.Config.Web.DeviceInfoStructTTLSeconds)) DevicesNeed2BeRemoved.Add(item); } foreach (var item in DevicesNeed2BeRemoved) diff --git a/KitX Dashboard/Services/LoadersManager.cs b/KitX Dashboard/Services/LoadersManager.cs index 42868500..5023e522 100644 --- a/KitX Dashboard/Services/LoadersManager.cs +++ b/KitX Dashboard/Services/LoadersManager.cs @@ -2,5 +2,7 @@ { internal class LoadersManager { + + } } diff --git a/KitX Dashboard/Services/PluginsManager.cs b/KitX Dashboard/Services/PluginsManager.cs index 185861bb..206bb899 100644 --- a/KitX Dashboard/Services/PluginsManager.cs +++ b/KitX Dashboard/Services/PluginsManager.cs @@ -163,9 +163,9 @@ internal static void ImportPlugin(string[] kxpfiles, bool inGraphic = false) Directory.Delete(releaseDir, true); LoaderStruct loaderStruct = JsonSerializer.Deserialize(rst.Item1); PluginStruct pluginStruct = JsonSerializer.Deserialize(rst.Item2); - Config? config = null; - if (inGraphic) config = Program.GlobalConfig; - else config = JsonSerializer.Deserialize(File.ReadAllText( + AppConfig? config = null; + if (inGraphic) config = Program.Config; + else config = JsonSerializer.Deserialize(File.ReadAllText( Path.GetFullPath($"{GlobalInfo.ConfigPath}config.json") )); if (config == null) @@ -242,7 +242,7 @@ internal static void KeepCheckAndRemoveOrDelete() Plugin pg = pluginsToDelete.Dequeue(); Program.PluginsList.Plugins.Remove(pg); string pgfiledir = Path.GetFullPath( - $"{Program.GlobalConfig.App.LocalPluginsFileDirectory}/" + + $"{Program.Config.App.LocalPluginsFileDirectory}/" + $"{pg.PluginDetails.PublisherName}_{pg.PluginDetails.AuthorName}/" + $"{pg.PluginDetails.Name}/{pg.PluginDetails.Version}/" ); diff --git a/KitX Dashboard/Services/WebServer.cs b/KitX Dashboard/Services/WebServer.cs index 13cf181f..9a5e998a 100644 --- a/KitX Dashboard/Services/WebServer.cs +++ b/KitX Dashboard/Services/WebServer.cs @@ -30,11 +30,17 @@ public WebServer() DevicesManager.KeepCheckAndRemove(); PluginsManager.KeepCheckAndRemove(); PluginsManager.KeepCheckAndRemoveOrDelete(); + FindSurpportNetworkInterface(new() + { + UdpClient_Send, UdpClient_Receive + }, IPAddress.Parse(Program.Config.Web.UDPBroadcastAddress)); MultiDevicesBroadCastSend(); MultiDevicesBroadCastReceive(); }).Start(); } + #region TCP Socket 鏈嶅姟浜 Loaders 鐨勬湇鍔″櫒 + /// /// 寮濮嬫墽琛 /// @@ -124,7 +130,7 @@ private async void ReciveMessage(object obj) while (keepListen) { - byte[] data = new byte[Program.GlobalConfig.App.SocketBufferSize]; + byte[] data = new byte[Program.Config.Web.SocketBufferSize]; //濡傛灉杩滅▼涓绘満宸插叧闂繛鎺,Read灏嗙珛鍗宠繑鍥為浂瀛楄妭 //int length = await stream.ReadAsync(data, 0, data.Length); int length = await stream.ReadAsync(data); @@ -171,16 +177,77 @@ private async void ReciveMessage(object obj) client.Dispose(); } } + #endregion + + #region UDP Socket 鏈嶅姟浜庤嚜鍙戠幇鑷粍缃 + + private static readonly List SurpportedNetworkInterfaces = new(); + + /// + /// UDP 鍙戝寘瀹㈡埛绔 + /// + private static readonly UdpClient UdpClient_Send + = new(Program.Config.Web.UDPPortSend, AddressFamily.InterNetwork) + { + EnableBroadcast = true, + MulticastLoopback = true + }; + + /// + /// UDP 鏀跺寘瀹㈡埛绔 + /// + private static readonly UdpClient UdpClient_Receive + = new(new IPEndPoint(IPAddress.Any, Program.Config.Web.UDPPortReceive)); + + /// + /// 瀵绘壘鍙楁敮鎸佺殑缃戠粶閫傞厤鍣ㄥ苟鎶奤DP瀹㈡埛绔姞鍏ョ粍鎾 + /// + private static void FindSurpportNetworkInterface(List clients, IPAddress multicastAddress) + { + NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces(); + foreach (NetworkInterface adapter in nics) + { + IPInterfaceProperties ip_properties = adapter.GetIPProperties(); + if (adapter.GetIPProperties().MulticastAddresses.Count == 0 + // most of VPN adapters will be skipped + || !adapter.SupportsMulticast + // multicast is meaningless for this type of connection + || OperationalStatus.Up != adapter.OperationalStatus + // this adapter is off or not connected + || !adapter.Supports(NetworkInterfaceComponent.IPv4) + ) continue; + IPInterfaceProperties adapterProperties = adapter.GetIPProperties(); + UnicastIPAddressInformationCollection unicastIPAddresses + = adapterProperties.UnicastAddresses; + IPv4InterfaceProperties p = adapterProperties.GetIPv4Properties(); + if (p == null) continue; // IPv4 is not configured on this adapter + SurpportedNetworkInterfaces.Add(IPAddress.HostToNetworkOrder(p.Index)); + IPAddress ipAddress = null; + foreach (UnicastIPAddressInformation unicastIPAddress in unicastIPAddresses) + { + if (unicastIPAddress.Address.AddressFamily != AddressFamily.InterNetwork) continue; + ipAddress = unicastIPAddress.Address; + break; + } + if (ipAddress == null) continue; + foreach (var udpClient in clients) + udpClient.JoinMulticastGroup(multicastAddress, ipAddress); + } + } /// /// 澶氳澶囧箍鎾彂閫佹柟娉 /// public static void MultiDevicesBroadCastSend() { - UdpClient udpClient = new(Program.GlobalConfig.App.UDPPortSend); - udpClient.JoinMulticastGroup(IPAddress.Parse("224.0.0.0")); - IPEndPoint multicast = new(IPAddress.Parse("224.0.0.0"), - Program.GlobalConfig.App.UDPPortReceive); + #region 鍒濆鍖 UDP 瀹㈡埛绔 + + UdpClient udpClient = UdpClient_Send; + IPEndPoint multicast = new(IPAddress.Parse(Program.Config.Web.UDPBroadcastAddress), + Program.Config.Web.UDPPortReceive); + + #endregion + System.Timers.Timer timer = new() { Interval = 2000, @@ -192,7 +259,13 @@ public static void MultiDevicesBroadCastSend() { string sendText = JsonSerializer.Serialize(GetDeviceInfo()); byte[] sendBytes = Encoding.UTF8.GetBytes(sendText); - udpClient.Send(sendBytes, sendBytes.Length, multicast); + + foreach (var item in SurpportedNetworkInterfaces) + { + udpClient.Client.SetSocketOption(SocketOptionLevel.IP, + SocketOptionName.MulticastInterface, item); + udpClient.Send(sendBytes, sendBytes.Length, multicast); + } } catch (Exception e) { @@ -214,10 +287,13 @@ public static void MultiDevicesBroadCastSend() /// public static void MultiDevicesBroadCastReceive() { - UdpClient udpClient = new(Program.GlobalConfig.App.UDPPortReceive); - udpClient.JoinMulticastGroup(IPAddress.Parse("224.0.0.0")); - IPEndPoint multicast = new(IPAddress.Parse("224.0.0.0"), - Program.GlobalConfig.App.UDPPortSend); + #region 鍒濆鍖 UDP 瀹㈡埛绔 + + UdpClient udpClient = UdpClient_Receive; + IPEndPoint multicast = new(IPAddress.Any, 0); + + #endregion + new Thread(() => { try @@ -265,7 +341,7 @@ private static string GetInterNetworkIPv4() || (IPv4_2_4Parts(ip.ToString()).Item1 == 172 // 172.16-31.x.x && IPv4_2_4Parts(ip.ToString()).Item2 >= 16 && IPv4_2_4Parts(ip.ToString()).Item2 <= 31)) - && ip.ToString().StartsWith(Program.GlobalConfig.App.IPFilter) // 婊¤冻鑷畾涔夎鍒 + && ip.ToString().StartsWith(Program.Config.Web.IPFilter) // 婊¤冻鑷畾涔夎鍒 select ip).First().ToString(); } @@ -293,6 +369,8 @@ private static string GetInterNetworkIPv4() PluginsCount = Program.PluginCards.Count, }; + #endregion + /// /// 閲婃斁璧勬簮 /// diff --git a/KitX Dashboard/ViewModels/AnouncementsWindowViewModel.cs b/KitX Dashboard/ViewModels/AnouncementsWindowViewModel.cs index 10e4b6d9..a640d564 100644 --- a/KitX Dashboard/ViewModels/AnouncementsWindowViewModel.cs +++ b/KitX Dashboard/ViewModels/AnouncementsWindowViewModel.cs @@ -28,14 +28,14 @@ private void InitCommands() internal static double Window_Width { - get => Program.GlobalConfig.Windows.AnnouncementWindow.Window_Width; - set => Program.GlobalConfig.Windows.AnnouncementWindow.Window_Width = value; + get => Program.Config.Windows.AnnouncementWindow.Window_Width; + set => Program.Config.Windows.AnnouncementWindow.Window_Width = value; } internal static double Window_Height { - get => Program.GlobalConfig.Windows.AnnouncementWindow.Window_Height; - set => Program.GlobalConfig.Windows.AnnouncementWindow.Window_Height = value; + get => Program.Config.Windows.AnnouncementWindow.Window_Height; + set => Program.Config.Windows.AnnouncementWindow.Window_Height = value; } private NavigationViewItem? selectedMenuItem; diff --git a/KitX Dashboard/ViewModels/Pages/Controls/PluginBarViewModel.cs b/KitX Dashboard/ViewModels/Pages/Controls/PluginBarViewModel.cs index ad00ed10..fc3d50fe 100644 --- a/KitX Dashboard/ViewModels/Pages/Controls/PluginBarViewModel.cs +++ b/KitX Dashboard/ViewModels/Pages/Controls/PluginBarViewModel.cs @@ -8,7 +8,6 @@ using System.ComponentModel; using System.Drawing; using System.IO; -using System.Text; namespace KitX_Dashboard.ViewModels.Pages.Controls { @@ -47,8 +46,8 @@ internal string? DisplayName { if (PluginDetail != null) return PluginDetail.PluginDetails.DisplayName - .ContainsKey(Program.GlobalConfig.App.AppLanguage) - ? PluginDetail.PluginDetails.DisplayName[Program.GlobalConfig.App.AppLanguage] + .ContainsKey(Program.Config.App.AppLanguage) + ? PluginDetail.PluginDetails.DisplayName[Program.Config.App.AppLanguage] : PluginDetail.PluginDetails.DisplayName.Values.GetEnumerator().Current; return null; } diff --git a/KitX Dashboard/ViewModels/Pages/Controls/PluginCardViewModel.cs b/KitX Dashboard/ViewModels/Pages/Controls/PluginCardViewModel.cs index e06baf4b..380db85a 100644 --- a/KitX Dashboard/ViewModels/Pages/Controls/PluginCardViewModel.cs +++ b/KitX Dashboard/ViewModels/Pages/Controls/PluginCardViewModel.cs @@ -4,7 +4,6 @@ using Serilog; using System; using System.IO; -using System.Text; namespace KitX_Dashboard.ViewModels.Pages.Controls { @@ -18,15 +17,15 @@ public PluginCardViewModel() } internal string DisplayName => pluginStruct.DisplayName - .ContainsKey(Program.GlobalConfig.App.AppLanguage) - ? pluginStruct.DisplayName[Program.GlobalConfig.App.AppLanguage] + .ContainsKey(Program.Config.App.AppLanguage) + ? pluginStruct.DisplayName[Program.Config.App.AppLanguage] : pluginStruct.DisplayName.Values.GetEnumerator().Current; internal string Version => pluginStruct.Version; internal string SimpleDescription => pluginStruct.SimpleDescription.ContainsKey( - Program.GlobalConfig.App.AppLanguage) - ? pluginStruct.SimpleDescription[Program.GlobalConfig.App.AppLanguage] + Program.Config.App.AppLanguage) + ? pluginStruct.SimpleDescription[Program.Config.App.AppLanguage] : string.Empty; internal string IconInBase64 => pluginStruct.IconInBase64; diff --git a/KitX Dashboard/ViewModels/Pages/Controls/Settings_GeneralViewModel.cs b/KitX Dashboard/ViewModels/Pages/Controls/Settings_GeneralViewModel.cs index dbb7d85a..0c5b168d 100644 --- a/KitX Dashboard/ViewModels/Pages/Controls/Settings_GeneralViewModel.cs +++ b/KitX Dashboard/ViewModels/Pages/Controls/Settings_GeneralViewModel.cs @@ -36,7 +36,7 @@ internal Settings_GeneralViewModel() /// private void InitData() { - foreach (var item in Program.GlobalConfig.App.SurpportLanguages) + foreach (var item in Program.Config.App.SurpportLanguages) { SurpportLanguages.Add(new SurpportLanguages() { @@ -45,7 +45,7 @@ private void InitData() }); } LanguageSelected = SurpportLanguages.FindIndex(0, SurpportLanguages.Count, - new LanguageMatch(Program.GlobalConfig.App.AppLanguage).IsIt); + new LanguageMatch(Program.Config.App.AppLanguage).IsIt); } /// @@ -75,9 +75,9 @@ private void InitCommands() FluentAvaloniaTheme.HighContrastModeString }; - private string _currentAppTheme = Program.GlobalConfig.App.Theme == "Follow" + private string _currentAppTheme = Program.Config.App.Theme == "Follow" ? AvaloniaLocator.Current.GetService().RequestedTheme - : Program.GlobalConfig.App.Theme; + : Program.Config.App.Theme; private Color2 nowColor = new(); @@ -98,7 +98,7 @@ internal string CurrentAppTheme get => _currentAppTheme; set { - Program.GlobalConfig.App.Theme = value; + Program.Config.App.Theme = value; if (RaiseAndSetIfChanged(ref _currentAppTheme, value)) { var faTheme = AvaloniaLocator.Current.GetService(); @@ -115,7 +115,7 @@ internal string CurrentAppTheme /// internal static void LoadLanguage() { - string lang = Program.GlobalConfig.App.AppLanguage; + string lang = Program.Config.App.AppLanguage; try { Application.Current.Resources.MergedDictionaries.Clear(); @@ -160,7 +160,7 @@ internal int LanguageSelected try { languageSelected = value; - Program.GlobalConfig.App.AppLanguage = SurpportLanguages[value].LanguageCode; + Program.Config.App.AppLanguage = SurpportLanguages[value].LanguageCode; LoadLanguage(); SaveChanges(); } @@ -176,10 +176,10 @@ internal int LanguageSelected /// internal static int MicaStatus { - get => Program.GlobalConfig.Windows.MainWindow.EnabledMica ? 0 : 1; + get => Program.Config.Windows.MainWindow.EnabledMica ? 0 : 1; set { - Program.GlobalConfig.Windows.MainWindow.EnabledMica = value != 1; + Program.Config.Windows.MainWindow.EnabledMica = value != 1; SaveChanges(); } } @@ -189,10 +189,10 @@ internal static int MicaStatus /// internal static double MicaOpacity { - get => Program.GlobalConfig.Windows.MainWindow.MicaOpacity; + get => Program.Config.Windows.MainWindow.MicaOpacity; set { - Program.GlobalConfig.Windows.MainWindow.MicaOpacity = value; + Program.Config.Windows.MainWindow.MicaOpacity = value; EventHandlers.Invoke("MicaOpacityChanged"); } } @@ -207,8 +207,8 @@ internal static double MicaOpacity /// internal static string LocalIPFilter { - get => Program.GlobalConfig.App.IPFilter; - set => Program.GlobalConfig.App.IPFilter = value; + get => Program.Config.Web.IPFilter; + set => Program.Config.Web.IPFilter = value; } /// @@ -216,10 +216,10 @@ internal static string LocalIPFilter /// internal static int GreetingTextUpdateInterval { - get => Program.GlobalConfig.Windows.MainWindow.GreetingUpdateInterval; + get => Program.Config.Windows.MainWindow.GreetingUpdateInterval; set { - Program.GlobalConfig.Windows.MainWindow.GreetingUpdateInterval = value; + Program.Config.Windows.MainWindow.GreetingUpdateInterval = value; EventHandlers.Invoke("GreetingTextIntervalUpdated"); SaveChanges(); } @@ -230,10 +230,10 @@ internal static int GreetingTextUpdateInterval /// internal static string LocalPluginsFileDirectory { - get => Program.GlobalConfig.App.LocalPluginsFileDirectory; + get => Program.Config.App.LocalPluginsFileDirectory; set { - Program.GlobalConfig.App.LocalPluginsFileDirectory = value; + Program.Config.App.LocalPluginsFileDirectory = value; SaveChanges(); } } @@ -243,10 +243,10 @@ internal static string LocalPluginsFileDirectory /// internal static string LocalPluginsDataDirectory { - get => Program.GlobalConfig.App.LocalPluginsDataDirectory; + get => Program.Config.App.LocalPluginsDataDirectory; set { - Program.GlobalConfig.App.LocalPluginsDataDirectory = value; + Program.Config.App.LocalPluginsDataDirectory = value; SaveChanges(); } } @@ -256,10 +256,10 @@ internal static string LocalPluginsDataDirectory /// internal static int ShowAnnouncementsStatus { - get => Program.GlobalConfig.App.ShowAnnouncementWhenStart ? 0 : 1; + get => Program.Config.App.ShowAnnouncementWhenStart ? 0 : 1; set { - Program.GlobalConfig.App.ShowAnnouncementWhenStart = value == 0; + Program.Config.App.ShowAnnouncementWhenStart = value == 0; SaveChanges(); } } @@ -269,11 +269,11 @@ internal static int ShowAnnouncementsStatus /// internal int DeveloperSettingStatus { - get => Program.GlobalConfig.App.DeveloperSetting ? 0 : 1; + get => Program.Config.App.DeveloperSetting ? 0 : 1; set { - Program.GlobalConfig.App.DeveloperSetting = value == 0; - MicaOpacityConfirmButtonVisibility = Program.GlobalConfig.App.DeveloperSetting; + Program.Config.App.DeveloperSetting = value == 0; + MicaOpacityConfirmButtonVisibility = Program.Config.App.DeveloperSetting; SaveChanges(); } } @@ -283,10 +283,10 @@ internal int DeveloperSettingStatus /// internal static bool MicaToolTipIsOpen { - get => Program.GlobalConfig.Pages.SettingsPage.MicaToolTipIsOpen; + get => Program.Config.Pages.SettingsPage.MicaToolTipIsOpen; set { - Program.GlobalConfig.Pages.SettingsPage.MicaToolTipIsOpen = value; + Program.Config.Pages.SettingsPage.MicaToolTipIsOpen = value; SaveChanges(); } } @@ -296,7 +296,7 @@ internal static bool MicaToolTipIsOpen /// internal bool MicaOpacityConfirmButtonVisibility { - get => Program.GlobalConfig.App.DeveloperSetting; + get => Program.Config.App.DeveloperSetting; set => PropertyChanged?.Invoke(this, new(nameof(MicaOpacityConfirmButtonVisibility))); } @@ -334,7 +334,7 @@ private void ColorConfirmed(object _) new SolidColorBrush(new Color((byte)(i * 10 + i), c.R, c.G, c.B)); } }); - Program.GlobalConfig.App.ThemeColor = nowColor.ToHexString(); + Program.Config.App.ThemeColor = nowColor.ToHexString(); SaveChanges(); } diff --git a/KitX Dashboard/ViewModels/Pages/HomePageViewModel.cs b/KitX Dashboard/ViewModels/Pages/HomePageViewModel.cs index f8b74d8e..bcdcb245 100644 --- a/KitX Dashboard/ViewModels/Pages/HomePageViewModel.cs +++ b/KitX Dashboard/ViewModels/Pages/HomePageViewModel.cs @@ -9,10 +9,10 @@ public HomePageViewModel() internal static bool IsPaneOpen { - get => Program.GlobalConfig.Pages.HomePage.IsNavigationViewPaneOpened; + get => Program.Config.Pages.HomePage.IsNavigationViewPaneOpened; set { - Program.GlobalConfig.Pages.HomePage.IsNavigationViewPaneOpened = value; + Program.Config.Pages.HomePage.IsNavigationViewPaneOpened = value; Models.EventHandlers.Invoke("ConfigSettingsChanged"); } } diff --git a/KitX Dashboard/ViewModels/Pages/RepoPageViewModel.cs b/KitX Dashboard/ViewModels/Pages/RepoPageViewModel.cs index 30e14653..ed558f90 100644 --- a/KitX Dashboard/ViewModels/Pages/RepoPageViewModel.cs +++ b/KitX Dashboard/ViewModels/Pages/RepoPageViewModel.cs @@ -36,7 +36,7 @@ private void InitEvents() { Models.EventHandlers.ConfigSettingsChanged += () => { - ImportButtonVisibility = Program.GlobalConfig.App.DeveloperSetting; + ImportButtonVisibility = Program.Config.App.DeveloperSetting; }; } @@ -77,10 +77,10 @@ internal double NoPlugins_TipHeight internal bool ImportButtonVisibility { - get => Program.GlobalConfig.App.DeveloperSetting; + get => Program.Config.App.DeveloperSetting; set { - Program.GlobalConfig.App.DeveloperSetting = value; + Program.Config.App.DeveloperSetting = value; PropertyChanged?.Invoke(this, new(nameof(ImportButtonVisibility))); } } diff --git a/KitX Dashboard/ViewModels/Pages/SettingsPageViewModel.cs b/KitX Dashboard/ViewModels/Pages/SettingsPageViewModel.cs index dd38fbdb..3f61915e 100644 --- a/KitX Dashboard/ViewModels/Pages/SettingsPageViewModel.cs +++ b/KitX Dashboard/ViewModels/Pages/SettingsPageViewModel.cs @@ -9,10 +9,10 @@ internal SettingsPageViewModel() internal static bool IsPaneOpen { - get => Program.GlobalConfig.Pages.SettingsPage.IsNavigationViewPaneOpened; + get => Program.Config.Pages.SettingsPage.IsNavigationViewPaneOpened; set { - Program.GlobalConfig.Pages.SettingsPage.IsNavigationViewPaneOpened = value; + Program.Config.Pages.SettingsPage.IsNavigationViewPaneOpened = value; Models.EventHandlers.Invoke("ConfigSettingsChanged"); } } diff --git a/KitX Dashboard/Views/AnouncementsWindow.axaml.cs b/KitX Dashboard/Views/AnouncementsWindow.axaml.cs index 497daecd..8687e33d 100644 --- a/KitX Dashboard/Views/AnouncementsWindow.axaml.cs +++ b/KitX Dashboard/Views/AnouncementsWindow.axaml.cs @@ -24,11 +24,11 @@ public AnouncementsWindow() Position = new( WindowAttributesConverter.PositionCameCenter( - Program.GlobalConfig.Windows.AnnouncementWindow.Window_Left, + Program.Config.Windows.AnnouncementWindow.Window_Left, true, Screens ), WindowAttributesConverter.PositionCameCenter( - Program.GlobalConfig.Windows.AnnouncementWindow.Window_Top, + Program.Config.Windows.AnnouncementWindow.Window_Top, false, Screens ) ); @@ -51,10 +51,10 @@ private void InitializeComponent() private void SaveMetaData() { - Program.GlobalConfig.Windows.AnnouncementWindow.Window_Left = Position.X; - Program.GlobalConfig.Windows.AnnouncementWindow.Window_Top = Position.Y; - Program.GlobalConfig.Windows.AnnouncementWindow.Window_Width = Width; - Program.GlobalConfig.Windows.AnnouncementWindow.Window_Height = Height; + Program.Config.Windows.AnnouncementWindow.Window_Left = Position.X; + Program.Config.Windows.AnnouncementWindow.Window_Top = Position.Y; + Program.Config.Windows.AnnouncementWindow.Window_Width = Width; + Program.Config.Windows.AnnouncementWindow.Window_Height = Height; } protected override void OnClosing(CancelEventArgs e) diff --git a/KitX Dashboard/Views/MainWindow.axaml.cs b/KitX Dashboard/Views/MainWindow.axaml.cs index 857001b9..35d6cedf 100644 --- a/KitX Dashboard/Views/MainWindow.axaml.cs +++ b/KitX Dashboard/Views/MainWindow.axaml.cs @@ -44,11 +44,11 @@ public MainWindow() Position = new( WindowAttributesConverter.PositionCameCenter( - Program.GlobalConfig.Windows.MainWindow.Window_Left, + Program.Config.Windows.MainWindow.Window_Left, true, Screens ), WindowAttributesConverter.PositionCameCenter( - Program.GlobalConfig.Windows.MainWindow.Window_Top, + Program.Config.Windows.MainWindow.Window_Top, false, Screens ) ); @@ -56,15 +56,15 @@ public MainWindow() if (OperatingSystem.IsWindows()) { ClientSize = new( - Program.GlobalConfig.Windows.MainWindow.Window_Width + 16, - Program.GlobalConfig.Windows.MainWindow.Window_Height + 38 + Program.Config.Windows.MainWindow.Window_Width + 16, + Program.Config.Windows.MainWindow.Window_Height + 38 ); } else { ClientSize = new( - Program.GlobalConfig.Windows.MainWindow.Window_Width, - Program.GlobalConfig.Windows.MainWindow.Window_Height + Program.Config.Windows.MainWindow.Window_Width, + Program.Config.Windows.MainWindow.Window_Height ); } @@ -81,18 +81,18 @@ public MainWindow() private void InitMainWindow() { // 瀵艰埅鍒颁笂娆″叧闂椂鐣岄潰 - SelectedPageName = Program.GlobalConfig.Windows.MainWindow.Tags["SelectedPage"]; + SelectedPageName = Program.Config.Windows.MainWindow.Tags["SelectedPage"]; MainNavigationView.SelectedItem = this.FindControl(SelectedPageName); // 濡傛灉涓婚涓嶈缃负 `璺熼殢绯荤粺` 鍒欐墜鍔ㄥ彉鏇翠富棰 - if (!Program.GlobalConfig.App.Theme.Equals("Follow")) + if (!Program.Config.App.Theme.Equals("Follow")) AvaloniaLocator.Current.GetService().RequestedTheme = - Program.GlobalConfig.App.Theme; + Program.Config.App.Theme; // 閫忔槑搴﹀彉鏇翠簨浠, 璁╅忔槑搴﹀彉鏇寸珛鍗崇敓鏁 EventHandlers.MicaOpacityChanged += () => { - if (Program.GlobalConfig.Windows.MainWindow.EnabledMica) + if (Program.Config.Windows.MainWindow.EnabledMica) if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && IsWindows11) { switch (AvaloniaLocator.Current.GetService().RequestedTheme) @@ -102,14 +102,14 @@ private void InitMainWindow() out var value1) ? (Color2)(Color)value1 : new Color2(32, 32, 32); Background = new ImmutableSolidColorBrush(color1, - Program.GlobalConfig.Windows.MainWindow.MicaOpacity); + Program.Config.Windows.MainWindow.MicaOpacity); break; case "Dark": var color2 = this.TryFindResource("SolidBackgroundFillColorBase", out var value2) ? (Color2)(Color)value2 : new Color2(243, 243, 243); Background = new ImmutableSolidColorBrush(color2, - Program.GlobalConfig.Windows.MainWindow.MicaOpacity); + Program.Config.Windows.MainWindow.MicaOpacity); break; } } @@ -122,7 +122,7 @@ private void InitMainWindow() Timer timer = new() { AutoReset = true, - Interval = 1000 * 60 * Program.GlobalConfig.Windows.MainWindow.GreetingUpdateInterval + Interval = 1000 * 60 * Program.Config.Windows.MainWindow.GreetingUpdateInterval }; timer.Elapsed += (_, _) => UpdateGreetingText(); timer.Start(); @@ -194,19 +194,19 @@ private void MainNavigationView_SelectionChanged(object? sender, /// private void SaveMetaData() { - Program.GlobalConfig.Windows.MainWindow.Window_Left = Position.X; - Program.GlobalConfig.Windows.MainWindow.Window_Top = Position.Y; + Program.Config.Windows.MainWindow.Window_Left = Position.X; + Program.Config.Windows.MainWindow.Window_Top = Position.Y; if (OperatingSystem.IsWindows()) { - Program.GlobalConfig.Windows.MainWindow.Window_Width = ClientSize.Width; - Program.GlobalConfig.Windows.MainWindow.Window_Height = ClientSize.Height - 30; + Program.Config.Windows.MainWindow.Window_Width = ClientSize.Width; + Program.Config.Windows.MainWindow.Window_Height = ClientSize.Height - 30; } else { - Program.GlobalConfig.Windows.MainWindow.Window_Width = ClientSize.Width; - Program.GlobalConfig.Windows.MainWindow.Window_Height = ClientSize.Height; + Program.Config.Windows.MainWindow.Window_Width = ClientSize.Width; + Program.Config.Windows.MainWindow.Window_Height = ClientSize.Height; } - Program.GlobalConfig.Windows.MainWindow. + Program.Config.Windows.MainWindow. Tags["SelectedPage"] = SelectedPageName; } @@ -244,7 +244,7 @@ protected override void OnOpened(EventArgs e) // 濡傛灉鏄 Windows 绯荤粺, 涓旀暟鎹簱琛ㄧず鍚敤 Mica 鏁堟灉 //if ((bool)(Helper.local_db_table.Query(1).ReturnResult as List)[5] - if (Program.GlobalConfig.Windows.MainWindow.EnabledMica + if (Program.Config.Windows.MainWindow.EnabledMica && RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { // 濡傛灉鏄 Windows 11 鑰屼笖娌℃湁閫夋嫨 `楂樺姣斿害` 涓婚 @@ -293,7 +293,7 @@ private void TryEnableMicaEffect(FluentAvaloniaTheme thm) color = color.LightenPercent(-0.8f); Background = new ImmutableSolidColorBrush(color, - Program.GlobalConfig.Windows.MainWindow.MicaOpacity); + Program.Config.Windows.MainWindow.MicaOpacity); } else if (thm.RequestedTheme == FluentAvaloniaTheme.LightModeString) { @@ -303,7 +303,7 @@ private void TryEnableMicaEffect(FluentAvaloniaTheme thm) color = color.LightenPercent(0.5f); Background = new ImmutableSolidColorBrush(color, - Program.GlobalConfig.Windows.MainWindow.MicaOpacity); + Program.Config.Windows.MainWindow.MicaOpacity); } } } diff --git a/KitX Dashboard/Views/Pages/Controls/Settings_About.axaml b/KitX Dashboard/Views/Pages/Controls/Settings_About.axaml index 4a968d7a..bdbd3a46 100644 --- a/KitX Dashboard/Views/Pages/Controls/Settings_About.axaml +++ b/KitX Dashboard/Views/Pages/Controls/Settings_About.axaml @@ -184,6 +184,8 @@ + + diff --git a/KitX Dashboard/Views/Pages/Controls/Settings_General.axaml b/KitX Dashboard/Views/Pages/Controls/Settings_General.axaml index f27dafe8..fec82b84 100644 --- a/KitX Dashboard/Views/Pages/Controls/Settings_General.axaml +++ b/KitX Dashboard/Views/Pages/Controls/Settings_General.axaml @@ -293,6 +293,8 @@ + + diff --git a/KitX Dashboard/Views/Pages/HomePage.axaml.cs b/KitX Dashboard/Views/Pages/HomePage.axaml.cs index 7188271a..32facc70 100644 --- a/KitX Dashboard/Views/Pages/HomePage.axaml.cs +++ b/KitX Dashboard/Views/Pages/HomePage.axaml.cs @@ -40,8 +40,8 @@ private void InitHomePage() private static string SelectedViewName { - get => Program.GlobalConfig.Pages.HomePage.SelectedViewName; - set => Program.GlobalConfig.Pages.HomePage.SelectedViewName = value; + get => Program.Config.Pages.HomePage.SelectedViewName; + set => Program.Config.Pages.HomePage.SelectedViewName = value; } /// diff --git a/KitX Dashboard/Views/Pages/SettingsPage.axaml.cs b/KitX Dashboard/Views/Pages/SettingsPage.axaml.cs index afa2ac1d..94c6ec8f 100644 --- a/KitX Dashboard/Views/Pages/SettingsPage.axaml.cs +++ b/KitX Dashboard/Views/Pages/SettingsPage.axaml.cs @@ -61,8 +61,8 @@ private void SettingsNavigationView_SelectionChanged(object? sender, private static string SelectedViewName { - get => Program.GlobalConfig.Pages.SettingsPage.SelectedViewName; - set => Program.GlobalConfig.Pages.SettingsPage.SelectedViewName = value; + get => Program.Config.Pages.SettingsPage.SelectedViewName; + set => Program.Config.Pages.SettingsPage.SelectedViewName = value; } private static Type SelectedViewType() => SelectedViewName switch