diff --git a/Nebula.Launcher/Controls/ServerListView.axaml.cs b/Nebula.Launcher/Controls/ServerListView.axaml.cs index 085e514..28b1c54 100644 --- a/Nebula.Launcher/Controls/ServerListView.axaml.cs +++ b/Nebula.Launcher/Controls/ServerListView.axaml.cs @@ -1,4 +1,5 @@ using Avalonia.Controls; +using Nebula.Launcher.Models; using Nebula.Launcher.ServerListProviders; using Nebula.Launcher.ViewModels; using Nebula.Launcher.ViewModels.Pages; diff --git a/Nebula.Launcher/GlobalUsing.cs b/Nebula.Launcher/GlobalUsing.cs index 2fcd408..73ae7eb 100644 --- a/Nebula.Launcher/GlobalUsing.cs +++ b/Nebula.Launcher/GlobalUsing.cs @@ -1,2 +1 @@ -global using Nebula.Shared.Attributes; -global using Nebula.Launcher.ViewHelper; \ No newline at end of file +global using Nebula.Shared.Attributes; \ No newline at end of file diff --git a/Nebula.Launcher/LauncherConVar.cs b/Nebula.Launcher/LauncherConVar.cs index 2dc5bf5..aae9892 100644 --- a/Nebula.Launcher/LauncherConVar.cs +++ b/Nebula.Launcher/LauncherConVar.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Globalization; using Nebula.Launcher.Models; +using Nebula.Launcher.Models.Auth; using Nebula.Launcher.ViewModels.Pages; using Nebula.Shared.Services; diff --git a/Nebula.Launcher/Models/Auth/AuthServerCredentials.cs b/Nebula.Launcher/Models/Auth/AuthServerCredentials.cs new file mode 100644 index 0000000..50dee0f --- /dev/null +++ b/Nebula.Launcher/Models/Auth/AuthServerCredentials.cs @@ -0,0 +1,6 @@ +namespace Nebula.Launcher.Models.Auth; + +public sealed record AuthServerCredentials( + string Name, + string[] Servers +); \ No newline at end of file diff --git a/Nebula.Launcher/Models/Auth/ProfileAuthCredentials.cs b/Nebula.Launcher/Models/Auth/ProfileAuthCredentials.cs new file mode 100644 index 0000000..dac49e8 --- /dev/null +++ b/Nebula.Launcher/Models/Auth/ProfileAuthCredentials.cs @@ -0,0 +1,11 @@ +using System.Text.Json.Serialization; +using System.Windows.Input; + +namespace Nebula.Launcher.Models.Auth; + +public sealed record ProfileAuthCredentials( + string Login, + string Password, + string AuthServer, + [property: JsonIgnore] ICommand OnSelect = default!, + [property: JsonIgnore] ICommand OnDelete = default!); \ No newline at end of file diff --git a/Nebula.Launcher/Models/ContentLogConsumer.cs b/Nebula.Launcher/Models/ContentLogConsumer.cs new file mode 100644 index 0000000..881ebf4 --- /dev/null +++ b/Nebula.Launcher/Models/ContentLogConsumer.cs @@ -0,0 +1,32 @@ +using Nebula.Launcher.ProcessHelper; +using Nebula.Launcher.ViewModels.Popup; +using Nebula.Shared.Services; + +namespace Nebula.Launcher.Models; + +public sealed class ContentLogConsumer : IProcessLogConsumer +{ + private readonly LogPopupModelView _currLog; + private readonly PopupMessageService _popupMessageService; + + public ContentLogConsumer(LogPopupModelView currLog, PopupMessageService popupMessageService) + { + _currLog = currLog; + _popupMessageService = popupMessageService; + } + + public void Out(string text) + { + _currLog.Append(text); + } + + public void Error(string text) + { + _currLog.Append(text); + } + + public void Fatal(string text) + { + _popupMessageService.Popup("Fatal error while stop instance:" + text); + } +} \ No newline at end of file diff --git a/Nebula.Launcher/Models/IFilterConsumer.cs b/Nebula.Launcher/Models/IFilterConsumer.cs new file mode 100644 index 0000000..45db389 --- /dev/null +++ b/Nebula.Launcher/Models/IFilterConsumer.cs @@ -0,0 +1,8 @@ +using Nebula.Launcher.ViewModels.Pages; + +namespace Nebula.Launcher.Models; + +public interface IFilterConsumer +{ + public void ProcessFilter(ServerFilter? serverFilter); +} \ No newline at end of file diff --git a/Nebula.Launcher/Models/LogInfo.cs b/Nebula.Launcher/Models/LogInfo.cs new file mode 100644 index 0000000..b107c9d --- /dev/null +++ b/Nebula.Launcher/Models/LogInfo.cs @@ -0,0 +1,40 @@ +using System.Text.RegularExpressions; +using Avalonia.Media; + +namespace Nebula.Launcher.Models; + +public sealed class LogInfo +{ + public string Category { get; set; } = "LOG"; + public IBrush CategoryColor { get; set; } = Brush.Parse("#424242"); + public string Message { get; set; } = ""; + + public static LogInfo FromString(string input) + { + var matches = Regex.Matches(input, @"(\[(?.*)\] (?.*))|(?.*)"); + var category = "All"; + + if (matches[0].Groups.TryGetValue("c", out var c)) category = c.Value; + + var color = Brush.Parse("#444444"); + + switch (category) + { + case "DEBG": + color = Brush.Parse("#2436d4"); + break; + case "ERRO": + color = Brush.Parse("#d42436"); + break; + case "INFO": + color = Brush.Parse("#0ab3c9"); + break; + } + + var message = matches[0].Groups["m"].Value; + return new LogInfo + { + Category = category, Message = message, CategoryColor = color + }; + } +} \ No newline at end of file diff --git a/Nebula.Launcher/ServiceCollectionExtensions.cs b/Nebula.Launcher/ServiceCollectionExtensions.cs index b5e0daf..b1f36e0 100644 --- a/Nebula.Launcher/ServiceCollectionExtensions.cs +++ b/Nebula.Launcher/ServiceCollectionExtensions.cs @@ -7,6 +7,7 @@ using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Threading; using Microsoft.Extensions.DependencyInjection; using Nebula.Launcher.Views; +using Nebula.Shared.ViewHelper; namespace Nebula.Launcher; diff --git a/Nebula.Launcher/ViewHelper/ViewModelRegisterAttribute.cs b/Nebula.Launcher/ViewHelper/ViewModelRegisterAttribute.cs deleted file mode 100644 index 7757113..0000000 --- a/Nebula.Launcher/ViewHelper/ViewModelRegisterAttribute.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; - -namespace Nebula.Launcher.ViewHelper; - -[AttributeUsage(AttributeTargets.Class)] -public class ViewModelRegisterAttribute : Attribute -{ - public ViewModelRegisterAttribute(Type? type = null, bool isSingleton = true) - { - Type = type; - IsSingleton = isSingleton; - } - - public Type? Type { get; } - public bool IsSingleton { get; } -} \ No newline at end of file diff --git a/Nebula.Launcher/ViewLocator.cs b/Nebula.Launcher/ViewLocator.cs index 3ffb8de..51f5e18 100644 --- a/Nebula.Launcher/ViewLocator.cs +++ b/Nebula.Launcher/ViewLocator.cs @@ -4,6 +4,7 @@ using Avalonia.Controls; using Avalonia.Controls.Templates; using Nebula.Launcher.ViewModels; using Nebula.Launcher.Views; +using Nebula.Shared.ViewHelper; namespace Nebula.Launcher; diff --git a/Nebula.Launcher/ViewModels/MainViewModel.cs b/Nebula.Launcher/ViewModels/MainViewModel.cs index ddea190..3edc130 100644 --- a/Nebula.Launcher/ViewModels/MainViewModel.cs +++ b/Nebula.Launcher/ViewModels/MainViewModel.cs @@ -10,10 +10,10 @@ using Nebula.Launcher.Services; using Nebula.Launcher.ViewModels.Pages; using Nebula.Launcher.ViewModels.Popup; using Nebula.Launcher.Views; -using Nebula.Shared.Models; using Nebula.Shared.Services; using Nebula.Shared.Services.Logging; using Nebula.Shared.Utils; +using Nebula.Shared.ViewHelper; namespace Nebula.Launcher.ViewModels; diff --git a/Nebula.Launcher/ViewModels/Pages/AccountInfoViewModel.cs b/Nebula.Launcher/ViewModels/Pages/AccountInfoViewModel.cs index 0e51f21..8d183c8 100644 --- a/Nebula.Launcher/ViewModels/Pages/AccountInfoViewModel.cs +++ b/Nebula.Launcher/ViewModels/Pages/AccountInfoViewModel.cs @@ -3,17 +3,17 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Net.Http; -using System.Text.Json.Serialization; using System.Threading.Tasks; -using System.Windows.Input; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; +using Nebula.Launcher.Models.Auth; using Nebula.Launcher.Services; using Nebula.Launcher.ViewModels.Popup; using Nebula.Launcher.Views.Pages; using Nebula.Shared.Services; using Nebula.Shared.Services.Logging; using Nebula.Shared.Utils; +using Nebula.Shared.ViewHelper; namespace Nebula.Launcher.ViewModels.Pages; @@ -322,16 +322,4 @@ public partial class AccountInfoViewModel : ViewModelBase ConfigurationService.SetConfigValue(LauncherConVar.AuthProfiles, Accounts.ToArray()); } -} - -public sealed record ProfileAuthCredentials( - string Login, - string Password, - string AuthServer, - [property: JsonIgnore] ICommand OnSelect = default!, - [property: JsonIgnore] ICommand OnDelete = default!); - -public sealed record AuthServerCredentials( - string Name, - string[] Servers -); \ No newline at end of file +} \ No newline at end of file diff --git a/Nebula.Launcher/ViewModels/Pages/ConfigurationViewModel.cs b/Nebula.Launcher/ViewModels/Pages/ConfigurationViewModel.cs index b4fef62..b9172cc 100644 --- a/Nebula.Launcher/ViewModels/Pages/ConfigurationViewModel.cs +++ b/Nebula.Launcher/ViewModels/Pages/ConfigurationViewModel.cs @@ -7,13 +7,17 @@ using System.IO; using System.IO.Compression; using System.Linq; using System.Reflection; +using System.Threading; +using System.Threading.Tasks; using Avalonia; using Avalonia.Controls; using Avalonia.Layout; using Nebula.Launcher.Services; +using Nebula.Launcher.ViewModels.Popup; using Nebula.Launcher.Views.Pages; using Nebula.Shared; using Nebula.Shared.Services; +using Nebula.Shared.ViewHelper; namespace Nebula.Launcher.ViewModels.Pages; @@ -26,13 +30,17 @@ public partial class ConfigurationViewModel : ViewModelBase [GenerateProperty] private ConfigurationService ConfigurationService { get; } = default!; [GenerateProperty] private PopupMessageService PopupService { get; } = default!; [GenerateProperty] private FileService FileService { get; set; } = default!; + [GenerateProperty] private ContentService ContentService { get; set; } = default!; + [GenerateProperty] private CancellationService CancellationService { get; set; } = default!; + + [GenerateProperty] private ViewHelperService ViewHelperService { get; set; } = default!; public List<(object, Type)> ConVarList = new(); public void AddCvarConf(ConVar cvar) { ConfigurationVerbose.Add( - ConfigControlHelper.GetConfigControl(cvar.Name, ConfigurationService.GetConfigValue(cvar))); + ConfigControlHelper.GetConfigControl(cvar.Name, ConfigurationService.GetConfigValue(cvar)!)); ConVarList.Add((cvar, cvar.Type)); } @@ -80,7 +88,18 @@ public partial class ConfigurationViewModel : ViewModelBase ZipFile.CreateFromDirectory(logPath, Path.Join(path, DateTime.Now.ToString("yyyy-MM-dd") + ".zip")); ExplorerHelper.OpenFolder(path); } - + + public void RemoveAllContent() + { + Task.Run(() => + { + using var loader = ViewHelperService.GetViewModel(); + loader.LoadingName = "Removing content"; + PopupService.Popup(loader); + ContentService.RemoveAllContent(loader, CancellationService.Token); + }); + } + private void InitConfiguration() { AddCvarConf(LauncherConVar.ILSpyUrl); diff --git a/Nebula.Launcher/ViewModels/Pages/ContentBrowserViewModel.cs b/Nebula.Launcher/ViewModels/Pages/ContentBrowserViewModel.cs index 2204f6d..8967985 100644 --- a/Nebula.Launcher/ViewModels/Pages/ContentBrowserViewModel.cs +++ b/Nebula.Launcher/ViewModels/Pages/ContentBrowserViewModel.cs @@ -18,6 +18,7 @@ using Nebula.Shared.FileApis; using Nebula.Shared.Models; using Nebula.Shared.Services; using Nebula.Shared.Utils; +using Nebula.Shared.ViewHelper; namespace Nebula.Launcher.ViewModels.Pages; diff --git a/Nebula.Launcher/ViewModels/Pages/ServerOverviewModel.cs b/Nebula.Launcher/ViewModels/Pages/ServerOverviewModel.cs index 9828516..d1fe23c 100644 --- a/Nebula.Launcher/ViewModels/Pages/ServerOverviewModel.cs +++ b/Nebula.Launcher/ViewModels/Pages/ServerOverviewModel.cs @@ -14,6 +14,7 @@ using Nebula.Launcher.Views.Pages; using Nebula.Shared; using Nebula.Shared.Models; using Nebula.Shared.Services; +using Nebula.Shared.ViewHelper; namespace Nebula.Launcher.ViewModels.Pages; @@ -315,6 +316,4 @@ public sealed class ServerFilter { return IsMatchByName(name) && IsMatchByTags(itemTags); } -} - -public sealed record ServerCustomNameEntry(string Url, string Name); \ No newline at end of file +} \ No newline at end of file diff --git a/Nebula.Launcher/ViewModels/Popup/AddFavoriteViewModel.cs b/Nebula.Launcher/ViewModels/Popup/AddFavoriteViewModel.cs index 2cd4bb5..f7b1fc2 100644 --- a/Nebula.Launcher/ViewModels/Popup/AddFavoriteViewModel.cs +++ b/Nebula.Launcher/ViewModels/Popup/AddFavoriteViewModel.cs @@ -7,6 +7,7 @@ using Nebula.Launcher.Views.Pages; using Nebula.Shared.Services; using Nebula.Shared.Services.Logging; using Nebula.Shared.Utils; +using Nebula.Shared.ViewHelper; using AddFavoriteView = Nebula.Launcher.Views.Popup.AddFavoriteView; namespace Nebula.Launcher.ViewModels.Popup; diff --git a/Nebula.Launcher/ViewModels/Popup/EditServerNameViewModel.cs b/Nebula.Launcher/ViewModels/Popup/EditServerNameViewModel.cs index 3fe7c1f..311d4de 100644 --- a/Nebula.Launcher/ViewModels/Popup/EditServerNameViewModel.cs +++ b/Nebula.Launcher/ViewModels/Popup/EditServerNameViewModel.cs @@ -2,6 +2,7 @@ using CommunityToolkit.Mvvm.ComponentModel; using Nebula.Launcher.Services; using Nebula.Launcher.Views.Popup; using Nebula.Shared.Services; +using Nebula.Shared.ViewHelper; namespace Nebula.Launcher.ViewModels.Popup; diff --git a/Nebula.Launcher/ViewModels/Popup/ExceptionListViewModel.cs b/Nebula.Launcher/ViewModels/Popup/ExceptionListViewModel.cs index 7fe5332..64d4f58 100644 --- a/Nebula.Launcher/ViewModels/Popup/ExceptionListViewModel.cs +++ b/Nebula.Launcher/ViewModels/Popup/ExceptionListViewModel.cs @@ -3,6 +3,7 @@ using System.Collections.ObjectModel; using Nebula.Launcher.Services; using Nebula.Launcher.Views.Popup; using Nebula.Shared.Services; +using Nebula.Shared.ViewHelper; namespace Nebula.Launcher.ViewModels.Popup; diff --git a/Nebula.Launcher/ViewModels/Popup/InfoPopupViewModel.cs b/Nebula.Launcher/ViewModels/Popup/InfoPopupViewModel.cs index 4dbcb16..99d1af7 100644 --- a/Nebula.Launcher/ViewModels/Popup/InfoPopupViewModel.cs +++ b/Nebula.Launcher/ViewModels/Popup/InfoPopupViewModel.cs @@ -2,6 +2,7 @@ using CommunityToolkit.Mvvm.ComponentModel; using Nebula.Launcher.Services; using Nebula.Launcher.Views.Popup; using Nebula.Shared.Services; +using Nebula.Shared.ViewHelper; namespace Nebula.Launcher.ViewModels.Popup; diff --git a/Nebula.Launcher/ViewModels/Popup/LoadingContextViewModel.cs b/Nebula.Launcher/ViewModels/Popup/LoadingContextViewModel.cs index 822f1cd..0faed64 100644 --- a/Nebula.Launcher/ViewModels/Popup/LoadingContextViewModel.cs +++ b/Nebula.Launcher/ViewModels/Popup/LoadingContextViewModel.cs @@ -3,6 +3,7 @@ using Nebula.Launcher.Services; using Nebula.Launcher.Views.Popup; using Nebula.Shared.Models; using Nebula.Shared.Services; +using Nebula.Shared.ViewHelper; namespace Nebula.Launcher.ViewModels.Popup; diff --git a/Nebula.Launcher/ViewModels/Popup/LogPopupModelView.cs b/Nebula.Launcher/ViewModels/Popup/LogPopupModelView.cs index c397f77..bb997bd 100644 --- a/Nebula.Launcher/ViewModels/Popup/LogPopupModelView.cs +++ b/Nebula.Launcher/ViewModels/Popup/LogPopupModelView.cs @@ -1,8 +1,8 @@ using System.Collections.ObjectModel; -using System.Text.RegularExpressions; -using Avalonia.Media; +using Nebula.Launcher.Models; using Nebula.Launcher.Views.Popup; using Nebula.Shared.Services; +using Nebula.Shared.ViewHelper; namespace Nebula.Launcher.ViewModels.Popup; @@ -42,40 +42,4 @@ public sealed partial class LogPopupModelView : PopupViewModelBase { Logs.Clear(); } -} - -public sealed class LogInfo -{ - public string Category { get; set; } = "LOG"; - public IBrush CategoryColor { get; set; } = Brush.Parse("#424242"); - public string Message { get; set; } = ""; - - public static LogInfo FromString(string input) - { - var matches = Regex.Matches(input, @"(\[(?.*)\] (?.*))|(?.*)"); - var category = "All"; - - if (matches[0].Groups.TryGetValue("c", out var c)) category = c.Value; - - var color = Brush.Parse("#444444"); - - switch (category) - { - case "DEBG": - color = Brush.Parse("#2436d4"); - break; - case "ERRO": - color = Brush.Parse("#d42436"); - break; - case "INFO": - color = Brush.Parse("#0ab3c9"); - break; - } - - var message = matches[0].Groups["m"].Value; - return new LogInfo - { - Category = category, Message = message, CategoryColor = color - }; - } } \ No newline at end of file diff --git a/Nebula.Launcher/ViewModels/Popup/TfaViewModel.cs b/Nebula.Launcher/ViewModels/Popup/TfaViewModel.cs index 6b440d7..58d5162 100644 --- a/Nebula.Launcher/ViewModels/Popup/TfaViewModel.cs +++ b/Nebula.Launcher/ViewModels/Popup/TfaViewModel.cs @@ -2,6 +2,7 @@ using System; using Nebula.Launcher.Services; using Nebula.Launcher.Views.Popup; using Nebula.Shared.Services; +using Nebula.Shared.ViewHelper; namespace Nebula.Launcher.ViewModels.Popup; diff --git a/Nebula.Launcher/ViewModels/ServerCompoundEntryModelView.cs b/Nebula.Launcher/ViewModels/ServerCompoundEntryModelView.cs index 73aeb8f..7e32636 100644 --- a/Nebula.Launcher/ViewModels/ServerCompoundEntryModelView.cs +++ b/Nebula.Launcher/ViewModels/ServerCompoundEntryModelView.cs @@ -6,11 +6,13 @@ using Avalonia.Media; using Avalonia.Threading; using CommunityToolkit.Mvvm.ComponentModel; using Microsoft.Extensions.DependencyInjection; +using Nebula.Launcher.Models; using Nebula.Launcher.ServerListProviders; using Nebula.Launcher.ViewModels.Pages; using Nebula.Launcher.Views; using Nebula.Shared.Models; using Nebula.Shared.Services; +using Nebula.Shared.ViewHelper; using BindingFlags = System.Reflection.BindingFlags; namespace Nebula.Launcher.ViewModels; diff --git a/Nebula.Launcher/ViewModels/ServerEntryModelView.cs b/Nebula.Launcher/ViewModels/ServerEntryModelView.cs index 2d59854..724d490 100644 --- a/Nebula.Launcher/ViewModels/ServerEntryModelView.cs +++ b/Nebula.Launcher/ViewModels/ServerEntryModelView.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using System.Windows.Input; using Avalonia.Controls; using CommunityToolkit.Mvvm.ComponentModel; +using Nebula.Launcher.Models; using Nebula.Launcher.ProcessHelper; using Nebula.Launcher.ServerListProviders; using Nebula.Launcher.Services; @@ -16,6 +17,7 @@ using Nebula.Shared.Models; using Nebula.Shared.Services; using Nebula.Shared.Services.Logging; using Nebula.Shared.Utils; +using Nebula.Shared.ViewHelper; namespace Nebula.Launcher.ViewModels; @@ -217,35 +219,6 @@ public partial class ServerEntryModelView : ViewModelBase, IFilterConsumer, ILis } } -public sealed class ContentLogConsumer : IProcessLogConsumer -{ - private readonly LogPopupModelView _currLog; - private readonly PopupMessageService _popupMessageService; - - public ContentLogConsumer(LogPopupModelView currLog, PopupMessageService popupMessageService) - { - _currLog = currLog; - _popupMessageService = popupMessageService; - } - - public void Out(string text) - { - _currLog.Append(text); - } - - public void Error(string text) - { - _currLog.Append(text); - } - - public void Fatal(string text) - { - _popupMessageService.Popup("Fatal error while stop instance:" + text); - } -} - - - public class LinkGoCommand : ICommand { public LinkGoCommand() @@ -265,9 +238,4 @@ public class LinkGoCommand : ICommand } public event EventHandler? CanExecuteChanged; -} - -public interface IFilterConsumer -{ - public void ProcessFilter(ServerFilter? serverFilter); } \ No newline at end of file diff --git a/Nebula.Launcher/Views/FileContentEntryView.axaml.cs b/Nebula.Launcher/Views/FileContentEntryView.axaml.cs index aeace0a..0ea5a0c 100644 --- a/Nebula.Launcher/Views/FileContentEntryView.axaml.cs +++ b/Nebula.Launcher/Views/FileContentEntryView.axaml.cs @@ -1,22 +1,11 @@ -using Avalonia; using Avalonia.Controls; -using Avalonia.Markup.Xaml; -using Nebula.Launcher.ViewModels.Pages; namespace Nebula.Launcher.Views; public partial class FileContentEntryView : UserControl { - // This constructor is used when the view is created by the XAML Previewer public FileContentEntryView() { InitializeComponent(); } - - // This constructor is used when the view is created via dependency injection - public FileContentEntryView(FolderContentEntry viewModel) - : this() - { - DataContext = viewModel; - } } \ No newline at end of file diff --git a/Nebula.Launcher/Views/MainView.axaml b/Nebula.Launcher/Views/MainView.axaml index bbe49a1..ce1c21f 100644 --- a/Nebula.Launcher/Views/MainView.axaml +++ b/Nebula.Launcher/Views/MainView.axaml @@ -8,7 +8,6 @@ xmlns:converters="clr-namespace:Nebula.Launcher.Converters" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - xmlns:models="clr-namespace:Nebula.Shared.Models;assembly=Nebula.Shared" xmlns:viewModels="clr-namespace:Nebula.Launcher.ViewModels" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:models1="clr-namespace:Nebula.Launcher.Models"> diff --git a/Nebula.Launcher/Views/MainView.axaml.cs b/Nebula.Launcher/Views/MainView.axaml.cs index 52e7f47..d6319ce 100644 --- a/Nebula.Launcher/Views/MainView.axaml.cs +++ b/Nebula.Launcher/Views/MainView.axaml.cs @@ -1,20 +1,11 @@ using Avalonia.Controls; -using Nebula.Launcher.ViewModels; namespace Nebula.Launcher.Views; public partial class MainView : UserControl { - // This constructor is used when the view is created by the XAML Previewer public MainView() { InitializeComponent(); } - - // This constructor is used when the view is created via dependency injection - public MainView(MainViewModel viewModel) - : this() - { - DataContext = viewModel; - } } \ No newline at end of file diff --git a/Nebula.Launcher/Views/Pages/AccountInfoView.axaml b/Nebula.Launcher/Views/Pages/AccountInfoView.axaml index 89f1c03..3a3e4cb 100644 --- a/Nebula.Launcher/Views/Pages/AccountInfoView.axaml +++ b/Nebula.Launcher/Views/Pages/AccountInfoView.axaml @@ -9,7 +9,8 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:pages="clr-namespace:Nebula.Launcher.ViewModels.Pages" - xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:auth="clr-namespace:Nebula.Launcher.Models.Auth"> @@ -37,7 +38,7 @@ ItemsSource="{Binding Accounts}" Padding="0"> - + - + + - + + + diff --git a/Nebula.Launcher/Views/Pages/ConfigurationView.axaml.cs b/Nebula.Launcher/Views/Pages/ConfigurationView.axaml.cs index bba8734..549739a 100644 --- a/Nebula.Launcher/Views/Pages/ConfigurationView.axaml.cs +++ b/Nebula.Launcher/Views/Pages/ConfigurationView.axaml.cs @@ -1,7 +1,4 @@ -using Avalonia; using Avalonia.Controls; -using Avalonia.Markup.Xaml; -using Nebula.Launcher.ViewModels.Pages; namespace Nebula.Launcher.Views.Pages; @@ -11,10 +8,4 @@ public partial class ConfigurationView : UserControl { InitializeComponent(); } - - public ConfigurationView(ConfigurationViewModel viewModel) - : this() - { - DataContext = viewModel; - } } \ No newline at end of file diff --git a/Nebula.Launcher/Views/Pages/ContentBrowserView.axaml.cs b/Nebula.Launcher/Views/Pages/ContentBrowserView.axaml.cs index 7bdb7b4..d5f01ea 100644 --- a/Nebula.Launcher/Views/Pages/ContentBrowserView.axaml.cs +++ b/Nebula.Launcher/Views/Pages/ContentBrowserView.axaml.cs @@ -1,5 +1,4 @@ using Avalonia.Controls; -using ContentBrowserViewModel = Nebula.Launcher.ViewModels.Pages.ContentBrowserViewModel; namespace Nebula.Launcher.Views.Pages; @@ -9,10 +8,4 @@ public partial class ContentBrowserView : UserControl { InitializeComponent(); } - - public ContentBrowserView(ContentBrowserViewModel viewModel) - : this() - { - DataContext = viewModel; - } } \ No newline at end of file diff --git a/Nebula.Launcher/Views/Pages/ServerOverviewView.axaml.cs b/Nebula.Launcher/Views/Pages/ServerOverviewView.axaml.cs index 010159a..7c2b480 100644 --- a/Nebula.Launcher/Views/Pages/ServerOverviewView.axaml.cs +++ b/Nebula.Launcher/Views/Pages/ServerOverviewView.axaml.cs @@ -1,11 +1,9 @@ using Avalonia.Controls; -using Nebula.Launcher.ViewModels.Pages; namespace Nebula.Launcher.Views.Pages; public partial class ServerOverviewView : UserControl { - // This constructor is used when the view is created by the XAML Previewer public ServerOverviewView() { InitializeComponent(); @@ -19,11 +17,4 @@ public partial class ServerOverviewView : UserControl LanguageFilters.AddFilter("RU","lang:ru"); LanguageFilters.AddFilter("EN","lang:en"); } - - // This constructor is used when the view is created via dependency injection - public ServerOverviewView(ServerOverviewModel viewModel) - : this() - { - DataContext = viewModel; - } } \ No newline at end of file diff --git a/Nebula.Launcher/Views/Popup/AddFavoriteView.axaml.cs b/Nebula.Launcher/Views/Popup/AddFavoriteView.axaml.cs index b6e51f1..f2fa652 100644 --- a/Nebula.Launcher/Views/Popup/AddFavoriteView.axaml.cs +++ b/Nebula.Launcher/Views/Popup/AddFavoriteView.axaml.cs @@ -1,5 +1,4 @@ using Avalonia.Controls; -using Nebula.Launcher.ViewModels.Popup; namespace Nebula.Launcher.Views.Popup; @@ -9,10 +8,4 @@ public partial class AddFavoriteView : UserControl { InitializeComponent(); } - - public AddFavoriteView(AddFavoriteViewModel viewModel) - : this() - { - DataContext = viewModel; - } } \ No newline at end of file diff --git a/Nebula.Launcher/Views/Popup/EditServerNameView.axaml.cs b/Nebula.Launcher/Views/Popup/EditServerNameView.axaml.cs index a95b06a..44abb51 100644 --- a/Nebula.Launcher/Views/Popup/EditServerNameView.axaml.cs +++ b/Nebula.Launcher/Views/Popup/EditServerNameView.axaml.cs @@ -1,7 +1,4 @@ -using Avalonia; using Avalonia.Controls; -using Avalonia.Markup.Xaml; -using Nebula.Launcher.ViewModels.Popup; namespace Nebula.Launcher.Views.Popup; @@ -11,10 +8,4 @@ public partial class EditServerNameView : UserControl { InitializeComponent(); } - - public EditServerNameView(EditServerNameViewModel viewModel) - : this() - { - DataContext = viewModel; - } } \ No newline at end of file diff --git a/Nebula.Launcher/Views/Popup/ExceptionListView.axaml.cs b/Nebula.Launcher/Views/Popup/ExceptionListView.axaml.cs index 0ae6290..85acec5 100644 --- a/Nebula.Launcher/Views/Popup/ExceptionListView.axaml.cs +++ b/Nebula.Launcher/Views/Popup/ExceptionListView.axaml.cs @@ -1,5 +1,4 @@ using Avalonia.Controls; -using Nebula.Launcher.ViewModels.Popup; namespace Nebula.Launcher.Views.Popup; @@ -9,9 +8,4 @@ public partial class ExceptionListView : UserControl { InitializeComponent(); } - - public ExceptionListView(ExceptionListViewModel listViewModel) : this() - { - DataContext = listViewModel; - } } \ No newline at end of file diff --git a/Nebula.Launcher/Views/Popup/InfoPopupView.axaml.cs b/Nebula.Launcher/Views/Popup/InfoPopupView.axaml.cs index b456f21..17597b2 100644 --- a/Nebula.Launcher/Views/Popup/InfoPopupView.axaml.cs +++ b/Nebula.Launcher/Views/Popup/InfoPopupView.axaml.cs @@ -1,5 +1,4 @@ using Avalonia.Controls; -using InfoPopupViewModel = Nebula.Launcher.ViewModels.Popup.InfoPopupViewModel; namespace Nebula.Launcher.Views.Popup; @@ -9,9 +8,4 @@ public partial class InfoPopupView : UserControl { InitializeComponent(); } - - public InfoPopupView(InfoPopupViewModel viewModel) : this() - { - DataContext = viewModel; - } } \ No newline at end of file diff --git a/Nebula.Launcher/Views/Popup/LoadingContextView.axaml.cs b/Nebula.Launcher/Views/Popup/LoadingContextView.axaml.cs index 4b294c3..46a1404 100644 --- a/Nebula.Launcher/Views/Popup/LoadingContextView.axaml.cs +++ b/Nebula.Launcher/Views/Popup/LoadingContextView.axaml.cs @@ -1,5 +1,4 @@ using Avalonia.Controls; -using LoadingContextViewModel = Nebula.Launcher.ViewModels.Popup.LoadingContextViewModel; namespace Nebula.Launcher.Views.Popup; @@ -9,9 +8,4 @@ public partial class LoadingContextView : UserControl { InitializeComponent(); } - - public LoadingContextView(LoadingContextViewModel viewModel) : this() - { - DataContext = viewModel; - } } \ No newline at end of file diff --git a/Nebula.Launcher/Views/Popup/LogPopupView.axaml b/Nebula.Launcher/Views/Popup/LogPopupView.axaml index b8ec6f0..3b5600e 100644 --- a/Nebula.Launcher/Views/Popup/LogPopupView.axaml +++ b/Nebula.Launcher/Views/Popup/LogPopupView.axaml @@ -4,6 +4,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:viewModels="clr-namespace:Nebula.Launcher.ViewModels" xmlns:popup="clr-namespace:Nebula.Launcher.ViewModels.Popup" + xmlns:models="clr-namespace:Nebula.Launcher.Models" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="Nebula.Launcher.Views.Popup.LogPopupView" x:DataType="popup:LogPopupModelView"> @@ -17,7 +18,7 @@ ItemsSource="{Binding Logs}" Padding="0"> - + >("engine.manifest.backup"); public static readonly ConVar ModuleManifestBackup = ConVarBuilder.Build("module.manifest.backup"); + public static readonly ConVar> ServerManifestHash = + ConVarBuilder.Build>("server.manifest.hash",[]); public static readonly ConVar> DotnetUrl = ConVarBuilder.Build>("dotnet.url", new(){ diff --git a/Nebula.Shared/FileApis/HashApi.cs b/Nebula.Shared/FileApis/HashApi.cs index 60f1c21..66d0579 100644 --- a/Nebula.Shared/FileApis/HashApi.cs +++ b/Nebula.Shared/FileApis/HashApi.cs @@ -55,6 +55,11 @@ public class HashApi : IFileApi return _fileApi.Has(GetManifestPath(item)); } + public bool Remove(RobustManifestItem item) + { + return _fileApi.Remove(GetManifestPath(item)); + } + private string GetManifestPath(RobustManifestItem item){ return GetManifestPath(item.Hash); } diff --git a/Nebula.Shared/Models/RobustServerEntry.cs b/Nebula.Shared/Models/RobustServerEntry.cs index 03258c7..4a307f1 100644 --- a/Nebula.Shared/Models/RobustServerEntry.cs +++ b/Nebula.Shared/Models/RobustServerEntry.cs @@ -36,7 +36,7 @@ public sealed record ServerInfo( [property: JsonPropertyName("auth")] AuthInfo Auth, [property: JsonPropertyName("build")] BuildInfo Build, [property: JsonPropertyName("desc")] string Desc, - [property: JsonPropertyName("links")] List Links); + [property: JsonPropertyName("links")] List? Links); public sealed record EngineVersionInfo( [property: JsonPropertyName("insecure")] diff --git a/Nebula.Shared/Services/ContentService.Download.cs b/Nebula.Shared/Services/ContentService.Download.cs index 0ec7a7f..84f89db 100644 --- a/Nebula.Shared/Services/ContentService.Download.cs +++ b/Nebula.Shared/Services/ContentService.Download.cs @@ -13,10 +13,24 @@ public partial class ContentService { public readonly IReadWriteFileApi ContentFileApi = fileService.CreateFileApi("content"); public readonly IReadWriteFileApi ManifestFileApi = fileService.CreateFileApi("manifest"); - - public bool CheckManifestExist(RobustManifestItem item) + + public void SetServerHash(string address, string hash) { - return ContentFileApi.Has(item.Hash); + var dict = varService.GetConfigValue(CurrentConVar.ServerManifestHash)!; + if (dict.TryGetValue(address, out var oldHash)) + { + if(oldHash == hash) return; + + ManifestFileApi.Remove(oldHash); + } + + dict[address] = hash; + varService.SetConfigValue(CurrentConVar.ServerManifestHash, dict); + } + + public HashApi CreateHashApi(List manifestItems) + { + return new HashApi(manifestItems, ContentFileApi); } public async Task EnsureItems(ManifestReader manifestReader, Uri downloadUri, @@ -34,7 +48,7 @@ public partial class ContentService allItems.Add(item.Value); } - var hashApi = new HashApi(allItems, ContentFileApi); + var hashApi = CreateHashApi(allItems); items = allItems.Where(a=> !hashApi.Has(a)).ToList(); @@ -54,6 +68,8 @@ public partial class ContentService _logger.Log("Loading manifest from: " + info.Hash); return await EnsureItems(new ManifestReader(stream), info.DownloadUri, loadingHandler, cancellationToken); } + + SetServerHash(info.ManifestUri.ToString(), info.Hash); _logger.Log("Fetching manifest from: " + info.ManifestUri); diff --git a/Nebula.Shared/Services/ContentService.Migration.cs b/Nebula.Shared/Services/ContentService.Migration.cs index b62013c..e9ca2fb 100644 --- a/Nebula.Shared/Services/ContentService.Migration.cs +++ b/Nebula.Shared/Services/ContentService.Migration.cs @@ -9,7 +9,7 @@ public partial class ContentService { _logger.Log("Checking migration..."); - var migrationList = ContentFileApi.AllFiles.Where(f => !f.Contains("\\")).ToList(); + var migrationList = ContentFileApi.AllFiles.Where(f => !f.Contains('\\')).ToList(); if(migrationList.Count == 0) return false; _logger.Log($"Found {migrationList.Count} migration files. Starting migration..."); diff --git a/Nebula.Shared/Services/ContentService.cs b/Nebula.Shared/Services/ContentService.cs index b4a6447..6f3332a 100644 --- a/Nebula.Shared/Services/ContentService.cs +++ b/Nebula.Shared/Services/ContentService.cs @@ -1,5 +1,4 @@ -using System.Data; -using Nebula.Shared.Models; +using Nebula.Shared.Models; using Nebula.Shared.Services.Logging; namespace Nebula.Shared.Services; @@ -28,4 +27,10 @@ public partial class ContentService( return info; } + + public void RemoveAllContent(ILoadingHandler loadingHandler, CancellationToken cancellationToken) + { + fileService.RemoveAllFiles("content", loadingHandler, cancellationToken); + fileService.RemoveAllFiles("manifest", loadingHandler, cancellationToken); + } } \ No newline at end of file diff --git a/Nebula.Shared/Services/FileService.cs b/Nebula.Shared/Services/FileService.cs index 334aab0..f0e862a 100644 --- a/Nebula.Shared/Services/FileService.cs +++ b/Nebula.Shared/Services/FileService.cs @@ -3,6 +3,7 @@ using System.Runtime.InteropServices; using Nebula.Shared.FileApis; using Nebula.Shared.FileApis.Interfaces; using Nebula.Shared.Models; +using Nebula.Shared.Services.Logging; using Robust.LoaderApi; namespace Nebula.Shared.Services; @@ -13,11 +14,11 @@ public class FileService public static readonly string RootPath = Path.Join(Environment.GetFolderPath( Environment.SpecialFolder.ApplicationData), "Datum"); - private readonly DebugService _debugService; + private readonly ILogger _logger; public FileService(DebugService debugService) { - _debugService = debugService; + _logger = debugService.GetLogger(this); if(!Directory.Exists(RootPath)) Directory.CreateDirectory(RootPath); @@ -25,6 +26,7 @@ public class FileService public IReadWriteFileApi CreateFileApi(string path) { + _logger.Debug($"Creating file api for {path}"); return new FileApi(Path.Join(RootPath, path)); } @@ -32,6 +34,7 @@ public class FileService { path = Path.Combine(Path.GetTempPath(), "tempThink"+Path.GetRandomFileName()); Directory.CreateDirectory(path); + _logger.Debug($"Ensuring temp directory for {path}"); return new FileApi(path); } @@ -53,6 +56,38 @@ public class FileService throw; } } + + public void RemoveAllFiles(string fileApiName,ILoadingHandler loadingHandler, CancellationToken cancellationToken) + { + _logger.Debug($"Deleting files from {fileApiName}"); + var path = Path.Combine(RootPath, fileApiName); + + var di = new DirectoryInfo(path); + + var files = di.GetFiles(); + var dirs = di.GetDirectories(); + + loadingHandler.AppendJob(files.Length); + loadingHandler.AppendJob(dirs.Length); + + if(cancellationToken.IsCancellationRequested) + return; + + foreach (var file in files) + { + if(cancellationToken.IsCancellationRequested) + return; + file.Delete(); + loadingHandler.AppendResolvedJob(); + } + foreach (var dir in dirs) + { + if(cancellationToken.IsCancellationRequested) + return; + dir.Delete(true); + loadingHandler.AppendResolvedJob(); + } + } } public sealed class ConsoleLoadingHandler : ILoadingHandler diff --git a/Nebula.Shared/Utils/Manifest.cs b/Nebula.Shared/Utils/Manifest.cs index 72c35e2..a04168f 100644 --- a/Nebula.Shared/Utils/Manifest.cs +++ b/Nebula.Shared/Utils/Manifest.cs @@ -94,8 +94,16 @@ public class ManifestReader : StreamReader { var line = ReadLine(); if (line == null) return null; - var splited = line.Split(" "); - return new RobustManifestItem(splited[0], line.Substring(splited[0].Length + 1), CurrentId++); + + var firstSpaceIndex = line.IndexOf(' '); + if (firstSpaceIndex == -1) + return new RobustManifestItem(line, string.Empty, CurrentId++); + + var span = line.AsSpan(); + var firstPart = span.Slice(0, firstSpaceIndex); + var secondPart = span.Slice(firstSpaceIndex + 1); + + return new RobustManifestItem(firstPart.ToString(), secondPart.ToString(), CurrentId++); } public bool TryReadItem([NotNullWhen(true)] out RobustManifestItem? item) diff --git a/Nebula.Shared/ViewHelper/ViewModelRegisterAttribute.cs b/Nebula.Shared/ViewHelper/ViewModelRegisterAttribute.cs new file mode 100644 index 0000000..ed2a13f --- /dev/null +++ b/Nebula.Shared/ViewHelper/ViewModelRegisterAttribute.cs @@ -0,0 +1,8 @@ +namespace Nebula.Shared.ViewHelper; + +[AttributeUsage(AttributeTargets.Class)] +public class ViewModelRegisterAttribute(Type? type = null, bool isSingleton = true) : Attribute +{ + public Type? Type { get; } = type; + public bool IsSingleton { get; } = isSingleton; +} \ No newline at end of file diff --git a/Nebula.SourceGenerators/DependencyAutoGenerator.cs b/Nebula.SourceGenerators/DependencyAutoGenerator.cs index d2e512f..d3a1808 100644 --- a/Nebula.SourceGenerators/DependencyAutoGenerator.cs +++ b/Nebula.SourceGenerators/DependencyAutoGenerator.cs @@ -71,7 +71,7 @@ partial class {className} "; // Add the source code to the compilation. - context.AddSource($"{className}.g.cs", SourceText.From(code, Encoding.UTF8)); + context.AddSource($"{className}_dependencyAuto.g.cs", SourceText.From(code, Encoding.UTF8)); } } diff --git a/Nebula.SourceGenerators/SourceHelper.cs b/Nebula.SourceGenerators/SourceHelper.cs index dc880a7..1f72cfa 100644 --- a/Nebula.SourceGenerators/SourceHelper.cs +++ b/Nebula.SourceGenerators/SourceHelper.cs @@ -7,24 +7,6 @@ namespace Nebula.SourceGenerators; public static class SourceHelper { - public static void GenerateAttribute(string attributeName, string usage, - IncrementalGeneratorInitializationContext context) - { - var attributeSourceCode = $@"// - -namespace SourceGen -{{ - [System.AttributeUsage(System.AttributeTargets.{usage})] - public class {attributeName} : System.Attribute - {{ - }} -}}"; - - context.RegisterPostInitializationOutput(ctx => ctx.AddSource( - $"{attributeName}.g.cs", - SourceText.From(attributeSourceCode, Encoding.UTF8))); - } - public static bool HasAttribute(ISymbol type, string attributeName) { foreach (var attribute in type.GetAttributes()) diff --git a/Nebula.SourceGenerators/ViewConstructGenerator.cs b/Nebula.SourceGenerators/ViewConstructGenerator.cs index 3e34aea..9fb160e 100644 --- a/Nebula.SourceGenerators/ViewConstructGenerator.cs +++ b/Nebula.SourceGenerators/ViewConstructGenerator.cs @@ -1,4 +1,6 @@ +using System; using System.Collections.Immutable; +using System.Linq; using System.Text; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp.Syntax; @@ -6,53 +8,82 @@ using Microsoft.CodeAnalysis.Text; namespace Nebula.SourceGenerators; -//[Generator] -public class ViewConstructGenerator : IIncrementalGenerator + +[Generator] +public class ViewConstructorGenerator : IIncrementalGenerator { - public static string ViewForModelAttributeName = "ViewForModelAttribute"; - + private static readonly string ViewModelAttribute = "Nebula.Shared.ViewHelper.ViewModelRegisterAttribute"; public void Initialize(IncrementalGeneratorInitializationContext context) { var provider = context.SyntaxProvider .CreateSyntaxProvider( - (s, _) => s is ClassDeclarationSyntax, (ctx, _) => - SourceHelper.GetClassDeclarationForSourceGen(ctx,ViewForModelAttributeName) - ) + (s, _) => s is ClassDeclarationSyntax, + (ctx, _) => SourceHelper.GetClassDeclarationForSourceGen(ctx,ViewModelAttribute)) .Where(t => t.reportAttributeFound) - .Select((t,_) => t.Item1); - - context.RegisterSourceOutput(context.CompilationProvider.Combine(provider.Collect()), (ctx,t)=> GenerateCode(ctx, t.Left, t.Right)); + .Select((t, _) => t.Item1); + + context.RegisterSourceOutput(context.CompilationProvider.Combine(provider.Collect()), + (ctx, t) => GenerateCode(ctx, t.Left, t.Right)); } - private void GenerateCode(SourceProductionContext context, Compilation compilation, ImmutableArray syntaxes) + private void GenerateCode(SourceProductionContext context, Compilation compilation, + ImmutableArray classDeclarations) { - foreach (var classDeclarationSyntax in syntaxes) + foreach (var classDeclarationSyntax in classDeclarations) { var semanticModel = compilation.GetSemanticModel(classDeclarationSyntax.SyntaxTree); - if(semanticModel.GetDeclaredSymbol(classDeclarationSyntax) is not INamedTypeSymbol classSymbol) + if (semanticModel.GetDeclaredSymbol(classDeclarationSyntax) is not INamedTypeSymbol classSymbol) continue; - var namespaceName = classSymbol.ContainingNamespace.ToDisplayString(); - var className = classDeclarationSyntax.Identifier.Text; + var viewModelName = classSymbol.Name; + var viewModelNamespace = classSymbol.ContainingNamespace.ToDisplayString(); - var code = $@"// + var viewModelRegisterAttr = classSymbol.GetAttributes() + .FirstOrDefault(attr => attr.AttributeClass?.ToDisplayString() == ViewModelAttribute); -using System; -using System.Collections.Generic; + var viewTypeArg = viewModelRegisterAttr?.ConstructorArguments.FirstOrDefault(); + if (viewTypeArg?.Value is not INamedTypeSymbol viewTypeSymbol) + continue; -namespace {namespaceName}; - -partial class {className} + try + { + var viewName = viewTypeSymbol.Name; + var viewNamespace = viewTypeSymbol.ContainingNamespace.ToDisplayString(); + + var code = $@" +namespace {viewNamespace} {{ - public {className}() : base(){{ - - + public partial class {viewName} + {{ + public {viewName}({viewModelNamespace}.{viewModelName} viewModel) + : this() + {{ + DataContext = viewModel; + }} }} -}} - "; +}}"; + + // Add the source code to the compilation. + context.AddSource($"{viewName}_viewConstructAuto.g.cs", SourceText.From(code, Encoding.UTF8)); + } + catch (Exception e) + { + var coder1 = $@" +// +// Error! +namespace {viewModelNamespace} +{{ + public partial class {viewModelName} + {{ + // {e.Message} + }} +}}"; - // Add the source code to the compilation. - context.AddSource($"{className}.g.cs", SourceText.From(code, Encoding.UTF8)); + // Add the source code to the compilation. + context.AddSource($"{viewModelName}_viewError.g.cs", SourceText.From(coder1, Encoding.UTF8)); + } } } + + } \ No newline at end of file diff --git a/Nebula.sln.DotSettings.user b/Nebula.sln.DotSettings.user index d5dc88b..f6713a1 100644 --- a/Nebula.sln.DotSettings.user +++ b/Nebula.sln.DotSettings.user @@ -39,6 +39,7 @@ ForceIncluded ForceIncluded ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded @@ -48,11 +49,13 @@ ForceIncluded ForceIncluded ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded ForceIncluded ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded @@ -62,4 +65,5 @@ <Assembly Path="C:\Program Files\dotnet\shared\Microsoft.NETCore.App\9.0.2\System.Net.Http.dll" /> <Assembly Path="C:\Users\Cinka\.nuget\packages\prometheus-net\0.0.2\lib\net40\prometheus-net.dll" /> <Assembly Path="C:\Users\Cinka\.nuget\packages\microsoft.extensions.objectpool\7.0.0\lib\net7.0\Microsoft.Extensions.ObjectPool.dll" /> + <Assembly Path="C:\Users\Cinka\.nuget\packages\netstandard.library\2.0.3\build\netstandard2.0\ref\netstandard.dll" /> </AssemblyExplorer> \ No newline at end of file