From 882548b1108612d6b3e85e0a52eb2c0cb74fd69c Mon Sep 17 00:00:00 2001 From: Max Nullov Date: Sat, 22 Feb 2025 12:19:42 +0300 Subject: [PATCH] Project structure changes --- .gitignore | 1 + {src/Launcher => Launcher-Core}/.gitignore | 0 .../Launcher-Core.csproj | 0 Launcher-Core/Launcher.cs | 72 +++++++++ Launcher-Core/Program.cs | 9 ++ Launcher-Core/Utils.cs | 32 ++++ {src/LauncherGUI => Launcher-UI}/.gitignore | 0 Launcher-UI/App.axaml | 24 +++ {src/LauncherGUI => Launcher-UI}/App.axaml.cs | 0 .../Assets/Fonts/Quicksand-SemiBold.ttf | Bin .../Assets/background.jpg | Bin .../Assets/cog.png | Bin .../Assets/gitlab-logo.png | Bin .../Assets/icon.png | Bin .../Assets/title.png | Bin .../Assets/toml-paper.png | Bin .../ConfigManager.cs | 12 +- .../Launcher-UI.csproj | 3 +- .../LauncherUtils.cs | 8 +- Launcher-UI/PlombirLinux-v1-1-0.tar.gz | Bin 0 -> 20 bytes Launcher-UI/PlombirWindows-v1-1-0.tar.gz | Bin 0 -> 20 bytes {src/LauncherGUI => Launcher-UI}/Program.cs | 4 +- .../ViewLocator.cs | 0 .../ViewModels/LoadingWindowViewModel.cs | 0 Launcher-UI/ViewModels/MainWindowViewModel.cs | 18 +++ .../ViewModels/SettingsWindowViewModel.cs | 0 .../VersionSelectorWindowViewModel.cs | 4 +- .../ViewModels/ViewModelBase.cs | 0 .../Views/LoadingWindow.axaml | 0 .../Views/LoadingWindow.axaml.cs | 24 +-- .../Views/MainWindow.axaml | 0 .../Views/MainWindow.axaml.cs | 8 +- .../Views/SettingsWindow.axaml | 0 .../Views/SettingsWindow.axaml.cs | 4 +- .../Views/VersionSelectorWindow.axaml | 0 .../Views/VersionSelectorWindow.axaml.cs | 14 +- {src/LauncherGUI => Launcher-UI}/app.manifest | 0 Launcher-UI/tweaks.toml | 6 + package/build-targz-linux-ui.sh | 11 ++ package/build-targz-osx-ui.sh | 11 ++ package/build-targz-win-ui.sh | 11 ++ src/Launcher/Launcher.cs | 139 ------------------ src/Launcher/Program.cs | 10 -- src/Launcher/Utils.cs | 74 ---------- src/LauncherGUI/App.axaml | 20 --- src/LauncherGUI/Assets/Fonts/Quicksand.ttf | Bin 124196 -> 0 bytes .../ViewModels/MainWindowViewModel.cs | 18 --- src/LauncherGUI/tweaks.toml | 4 - tweaks.toml | 6 + 49 files changed, 245 insertions(+), 302 deletions(-) create mode 100644 .gitignore rename {src/Launcher => Launcher-Core}/.gitignore (100%) rename src/Launcher/cmllibLauncher.csproj => Launcher-Core/Launcher-Core.csproj (100%) create mode 100644 Launcher-Core/Launcher.cs create mode 100644 Launcher-Core/Program.cs create mode 100644 Launcher-Core/Utils.cs rename {src/LauncherGUI => Launcher-UI}/.gitignore (100%) create mode 100644 Launcher-UI/App.axaml rename {src/LauncherGUI => Launcher-UI}/App.axaml.cs (100%) rename {src/LauncherGUI => Launcher-UI}/Assets/Fonts/Quicksand-SemiBold.ttf (100%) rename {src/LauncherGUI => Launcher-UI}/Assets/background.jpg (100%) rename {src/LauncherGUI => Launcher-UI}/Assets/cog.png (100%) rename {src/LauncherGUI => Launcher-UI}/Assets/gitlab-logo.png (100%) rename {src/LauncherGUI => Launcher-UI}/Assets/icon.png (100%) rename {src/LauncherGUI => Launcher-UI}/Assets/title.png (100%) rename {src/LauncherGUI => Launcher-UI}/Assets/toml-paper.png (100%) rename {src/LauncherGUI => Launcher-UI}/ConfigManager.cs (83%) rename src/LauncherGUI/LauncherGUI.csproj => Launcher-UI/Launcher-UI.csproj (93%) rename {src/LauncherGUI => Launcher-UI}/LauncherUtils.cs (71%) create mode 100644 Launcher-UI/PlombirLinux-v1-1-0.tar.gz create mode 100644 Launcher-UI/PlombirWindows-v1-1-0.tar.gz rename {src/LauncherGUI => Launcher-UI}/Program.cs (91%) rename {src/LauncherGUI => Launcher-UI}/ViewLocator.cs (100%) rename {src/LauncherGUI => Launcher-UI}/ViewModels/LoadingWindowViewModel.cs (100%) create mode 100644 Launcher-UI/ViewModels/MainWindowViewModel.cs rename {src/LauncherGUI => Launcher-UI}/ViewModels/SettingsWindowViewModel.cs (100%) rename {src/LauncherGUI => Launcher-UI}/ViewModels/VersionSelectorWindowViewModel.cs (90%) rename {src/LauncherGUI => Launcher-UI}/ViewModels/ViewModelBase.cs (100%) rename {src/LauncherGUI => Launcher-UI}/Views/LoadingWindow.axaml (100%) rename {src/LauncherGUI => Launcher-UI}/Views/LoadingWindow.axaml.cs (80%) rename {src/LauncherGUI => Launcher-UI}/Views/MainWindow.axaml (100%) rename {src/LauncherGUI => Launcher-UI}/Views/MainWindow.axaml.cs (95%) rename {src/LauncherGUI => Launcher-UI}/Views/SettingsWindow.axaml (100%) rename {src/LauncherGUI => Launcher-UI}/Views/SettingsWindow.axaml.cs (92%) rename {src/LauncherGUI => Launcher-UI}/Views/VersionSelectorWindow.axaml (100%) rename {src/LauncherGUI => Launcher-UI}/Views/VersionSelectorWindow.axaml.cs (82%) rename {src/LauncherGUI => Launcher-UI}/app.manifest (100%) create mode 100644 Launcher-UI/tweaks.toml create mode 100755 package/build-targz-linux-ui.sh create mode 100755 package/build-targz-osx-ui.sh create mode 100755 package/build-targz-win-ui.sh delete mode 100644 src/Launcher/Launcher.cs delete mode 100644 src/Launcher/Program.cs delete mode 100644 src/Launcher/Utils.cs delete mode 100644 src/LauncherGUI/App.axaml delete mode 100644 src/LauncherGUI/Assets/Fonts/Quicksand.ttf delete mode 100644 src/LauncherGUI/ViewModels/MainWindowViewModel.cs delete mode 100644 src/LauncherGUI/tweaks.toml create mode 100644 tweaks.toml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2f74277 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/package/out diff --git a/src/Launcher/.gitignore b/Launcher-Core/.gitignore similarity index 100% rename from src/Launcher/.gitignore rename to Launcher-Core/.gitignore diff --git a/src/Launcher/cmllibLauncher.csproj b/Launcher-Core/Launcher-Core.csproj similarity index 100% rename from src/Launcher/cmllibLauncher.csproj rename to Launcher-Core/Launcher-Core.csproj diff --git a/Launcher-Core/Launcher.cs b/Launcher-Core/Launcher.cs new file mode 100644 index 0000000..511dcc3 --- /dev/null +++ b/Launcher-Core/Launcher.cs @@ -0,0 +1,72 @@ +using System.Formats.Tar; +using System.Net; +using System.Runtime.InteropServices; +using System.Security.AccessControl; +using CmlLib.Core; +using CmlLib.Core.Auth; +using CmlLib.Core.ProcessBuilder; + +namespace Plombir; + +/* + Basically a class to manage everything launcher related. + TODO - minecraft downloading from webserver +*/ +public class Launcher +{ + private readonly string _version; + private readonly string _nickname; + static private MinecraftPath? _mcPath; + static private MinecraftLauncher? _mcLauncher; + + public int DownloadProgress; + public string? DownloadStatus; + + public Launcher(string userName, string version, string? location = null) + { + _version = version; + _nickname = userName; + _mcPath = new($"{location}/{version}/minecraft"); + _mcLauncher = new(_mcPath); + } + + async public Task BuildLauncher(CancellationToken token) + { + if (_mcLauncher is null) + throw new NullReferenceException("Failed to build! Launcher is null!"); + + _mcLauncher.ByteProgressChanged += (_, args) => + { + Console.WriteLine($"{(int)(args.ProgressedBytes * 0.000001)} MBytes / {(int)(args.TotalBytes * 0.000001)} MBytes"); + DownloadProgress = (int)(args.ProgressedBytes * 100 / args.TotalBytes); + }; + + DownloadStatus = "Installing minecraft..."; + Console.WriteLine(DownloadStatus); + await _mcLauncher.InstallAsync(_version); + DownloadStatus = "Finished!"; + Console.WriteLine(DownloadStatus); + return; + } + + async public Task RunLauncher() + { + if (_mcLauncher is null) + throw new NullReferenceException("Failed to run launcher! Launcher is null!"); + + var process = await _mcLauncher.BuildProcessAsync(_version, new MLaunchOption + { + + Session = MSession.CreateOfflineSession(_nickname), + MaximumRamMb = 4096, + + }) ?? throw new Exception("Failed to start minecraft process!"); + + var processUtil = new ProcessWrapper(process); + processUtil.OutputReceived += (s, e) => Console.WriteLine(e); + processUtil.StartWithEvents(); + + await processUtil.WaitForExitTaskAsync(); + } + +} diff --git a/Launcher-Core/Program.cs b/Launcher-Core/Program.cs new file mode 100644 index 0000000..7a3ff86 --- /dev/null +++ b/Launcher-Core/Program.cs @@ -0,0 +1,9 @@ +namespace Plombir; + +sealed class Program +{ + public static void Main() + { + Console.WriteLine("init: launcher"); + } +} diff --git a/Launcher-Core/Utils.cs b/Launcher-Core/Utils.cs new file mode 100644 index 0000000..86cf813 --- /dev/null +++ b/Launcher-Core/Utils.cs @@ -0,0 +1,32 @@ +using System.IO.Compression; +using System; +using System.IO; +using SharpCompress.Archives; +using SharpCompress.Common; +using SharpCompress.Readers; +using System.Diagnostics; +using CmlLib.Core; + +namespace Plombir; + +static public class Utils +{ + + public static async Task> GetAllMcVersions() + { + return await Task.Run(async () => + { + var ln = new MinecraftLauncher(); + var result = new List(); + foreach (var x in await ln.GetAllVersionsAsync()) + { + result.Add(x.Name); + } + return result; + }); + + } + + + +} diff --git a/src/LauncherGUI/.gitignore b/Launcher-UI/.gitignore similarity index 100% rename from src/LauncherGUI/.gitignore rename to Launcher-UI/.gitignore diff --git a/Launcher-UI/App.axaml b/Launcher-UI/App.axaml new file mode 100644 index 0000000..fa69988 --- /dev/null +++ b/Launcher-UI/App.axaml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + avares://Launcher-UI/Assets/Fonts/Quicksand-SemiBold.ttf#Quicksand + + + diff --git a/src/LauncherGUI/App.axaml.cs b/Launcher-UI/App.axaml.cs similarity index 100% rename from src/LauncherGUI/App.axaml.cs rename to Launcher-UI/App.axaml.cs diff --git a/src/LauncherGUI/Assets/Fonts/Quicksand-SemiBold.ttf b/Launcher-UI/Assets/Fonts/Quicksand-SemiBold.ttf similarity index 100% rename from src/LauncherGUI/Assets/Fonts/Quicksand-SemiBold.ttf rename to Launcher-UI/Assets/Fonts/Quicksand-SemiBold.ttf diff --git a/src/LauncherGUI/Assets/background.jpg b/Launcher-UI/Assets/background.jpg similarity index 100% rename from src/LauncherGUI/Assets/background.jpg rename to Launcher-UI/Assets/background.jpg diff --git a/src/LauncherGUI/Assets/cog.png b/Launcher-UI/Assets/cog.png similarity index 100% rename from src/LauncherGUI/Assets/cog.png rename to Launcher-UI/Assets/cog.png diff --git a/src/LauncherGUI/Assets/gitlab-logo.png b/Launcher-UI/Assets/gitlab-logo.png similarity index 100% rename from src/LauncherGUI/Assets/gitlab-logo.png rename to Launcher-UI/Assets/gitlab-logo.png diff --git a/src/LauncherGUI/Assets/icon.png b/Launcher-UI/Assets/icon.png similarity index 100% rename from src/LauncherGUI/Assets/icon.png rename to Launcher-UI/Assets/icon.png diff --git a/src/LauncherGUI/Assets/title.png b/Launcher-UI/Assets/title.png similarity index 100% rename from src/LauncherGUI/Assets/title.png rename to Launcher-UI/Assets/title.png diff --git a/src/LauncherGUI/Assets/toml-paper.png b/Launcher-UI/Assets/toml-paper.png similarity index 100% rename from src/LauncherGUI/Assets/toml-paper.png rename to Launcher-UI/Assets/toml-paper.png diff --git a/src/LauncherGUI/ConfigManager.cs b/Launcher-UI/ConfigManager.cs similarity index 83% rename from src/LauncherGUI/ConfigManager.cs rename to Launcher-UI/ConfigManager.cs index 2d6124e..5a3e796 100644 --- a/src/LauncherGUI/ConfigManager.cs +++ b/Launcher-UI/ConfigManager.cs @@ -2,7 +2,7 @@ using System; using System.IO; using Tommy; -namespace PlombirLauncher; +namespace Plombir; public class ConfigManager { @@ -27,7 +27,7 @@ public class ConfigManager ["nickname"] = "slugcat" }; - using(StreamWriter writer = File.CreateText("tweaks.toml")) + using (StreamWriter writer = File.CreateText("tweaks.toml")) { toml.WriteTo(writer); // Remember to flush the data if needed! @@ -41,7 +41,7 @@ public class ConfigManager { BuildDefault(); } - using(StreamReader reader = File.OpenText("tweaks.toml")) + using (StreamReader reader = File.OpenText("tweaks.toml")) { TomlTable table = TOML.Parse(reader); @@ -58,18 +58,18 @@ public class ConfigManager TomlTable table; - using(StreamReader reader = File.OpenText("tweaks.toml")) + using (StreamReader reader = File.OpenText("tweaks.toml")) { table = TOML.Parse(reader); table[key] = value; } - using(StreamWriter writer = File.CreateText("tweaks.toml")) + using (StreamWriter writer = File.CreateText("tweaks.toml")) { table.WriteTo(writer); // Remember to flush the data if needed! writer.Flush(); } } -} \ No newline at end of file +} diff --git a/src/LauncherGUI/LauncherGUI.csproj b/Launcher-UI/Launcher-UI.csproj similarity index 93% rename from src/LauncherGUI/LauncherGUI.csproj rename to Launcher-UI/Launcher-UI.csproj index ffb860d..e73fc7c 100644 --- a/src/LauncherGUI/LauncherGUI.csproj +++ b/Launcher-UI/Launcher-UI.csproj @@ -32,6 +32,7 @@ - + + diff --git a/src/LauncherGUI/LauncherUtils.cs b/Launcher-UI/LauncherUtils.cs similarity index 71% rename from src/LauncherGUI/LauncherUtils.cs rename to Launcher-UI/LauncherUtils.cs index 4d66092..dc0dd1f 100644 --- a/src/LauncherGUI/LauncherUtils.cs +++ b/Launcher-UI/LauncherUtils.cs @@ -1,14 +1,18 @@ +using System; using System.Threading.Tasks; using Avalonia.Controls; using LauncherGUI.ViewModels; using LauncherGUI.Views; -namespace PlombirLauncher; +namespace Plombir; public class LauncherUtils { public async static Task CreateMinecraftInstance(MainWindowViewModel vm, Window windowCaller) { + if (vm.Usernick is null) throw new NullReferenceException("Failed to create minecraft instance! Nickname is null!"); + if (vm.SelectedVersion is null) throw new NullReferenceException("Failed to create minecraft instance! Selected version is null!"); + System.Console.WriteLine($"Creating minecraft instance for {vm.Usernick}, {vm.SelectedVersion} in {vm.RuntimeLocation}"); LoadingWindow loading = new(vm.Usernick, vm.SelectedVersion, vm.RuntimeLocation); ConfigManager.WriteInConfig("last-version-launched", vm.SelectedVersion); @@ -20,4 +24,4 @@ public class LauncherUtils await loading.RunMinecraft(); return; } -} \ No newline at end of file +} diff --git a/Launcher-UI/PlombirLinux-v1-1-0.tar.gz b/Launcher-UI/PlombirLinux-v1-1-0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..229151a5a27ab0cc4661f529cc0eda27e3c03e10 GIT binary patch literal 20 Rcmb2|=3oE=W@ZQtBmoVe0J#7F literal 0 HcmV?d00001 diff --git a/Launcher-UI/PlombirWindows-v1-1-0.tar.gz b/Launcher-UI/PlombirWindows-v1-1-0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..229151a5a27ab0cc4661f529cc0eda27e3c03e10 GIT binary patch literal 20 Rcmb2|=3oE=W@ZQtBmoVe0J#7F literal 0 HcmV?d00001 diff --git a/src/LauncherGUI/Program.cs b/Launcher-UI/Program.cs similarity index 91% rename from src/LauncherGUI/Program.cs rename to Launcher-UI/Program.cs index 860be03..b9c7da5 100644 --- a/src/LauncherGUI/Program.cs +++ b/Launcher-UI/Program.cs @@ -1,5 +1,5 @@ -using Avalonia; -using PlombirLauncher; +using Avalonia; +using Plombir; using System; namespace LauncherGUI; diff --git a/src/LauncherGUI/ViewLocator.cs b/Launcher-UI/ViewLocator.cs similarity index 100% rename from src/LauncherGUI/ViewLocator.cs rename to Launcher-UI/ViewLocator.cs diff --git a/src/LauncherGUI/ViewModels/LoadingWindowViewModel.cs b/Launcher-UI/ViewModels/LoadingWindowViewModel.cs similarity index 100% rename from src/LauncherGUI/ViewModels/LoadingWindowViewModel.cs rename to Launcher-UI/ViewModels/LoadingWindowViewModel.cs diff --git a/Launcher-UI/ViewModels/MainWindowViewModel.cs b/Launcher-UI/ViewModels/MainWindowViewModel.cs new file mode 100644 index 0000000..f334bfd --- /dev/null +++ b/Launcher-UI/ViewModels/MainWindowViewModel.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using Plombir; + +namespace LauncherGUI.ViewModels; + +public partial class MainWindowViewModel : ViewModelBase +{ + public string Greeting { get; } = "Plombir launcher"; + + private string? _userNick = ConfigManager.ReadConfig("nickname"); + public string? Usernick { get => _userNick; set { _userNick = value; OnPropertyChanged(nameof(Usernick)); } } + + private string? _selectedVersion = ConfigManager.ReadConfig("last-version-launched"); + public string? SelectedVersion { get => _selectedVersion; set { _selectedVersion = value; OnPropertyChanged(nameof(SelectedVersion)); } } + + private string? _runtimeLocation = ConfigManager.ReadConfig("runtime-path"); + public string? RuntimeLocation { get => _runtimeLocation; set { _runtimeLocation = value; OnPropertyChanged(nameof(RuntimeLocation)); } } +} diff --git a/src/LauncherGUI/ViewModels/SettingsWindowViewModel.cs b/Launcher-UI/ViewModels/SettingsWindowViewModel.cs similarity index 100% rename from src/LauncherGUI/ViewModels/SettingsWindowViewModel.cs rename to Launcher-UI/ViewModels/SettingsWindowViewModel.cs diff --git a/src/LauncherGUI/ViewModels/VersionSelectorWindowViewModel.cs b/Launcher-UI/ViewModels/VersionSelectorWindowViewModel.cs similarity index 90% rename from src/LauncherGUI/ViewModels/VersionSelectorWindowViewModel.cs rename to Launcher-UI/ViewModels/VersionSelectorWindowViewModel.cs index f9c2fdf..5c26947 100644 --- a/src/LauncherGUI/ViewModels/VersionSelectorWindowViewModel.cs +++ b/Launcher-UI/ViewModels/VersionSelectorWindowViewModel.cs @@ -1,5 +1,5 @@ using System.Collections.Generic; -using PlombirLauncher; +using Plombir; using LauncherGUI.ViewModels; namespace LauncherGUI.ViewModels; @@ -7,4 +7,4 @@ namespace LauncherGUI.ViewModels; public partial class VersionSelectorWindowViewModel : ViewModelBase { // I save launcher data mostly in MainWindowViewModel. -} \ No newline at end of file +} diff --git a/src/LauncherGUI/ViewModels/ViewModelBase.cs b/Launcher-UI/ViewModels/ViewModelBase.cs similarity index 100% rename from src/LauncherGUI/ViewModels/ViewModelBase.cs rename to Launcher-UI/ViewModels/ViewModelBase.cs diff --git a/src/LauncherGUI/Views/LoadingWindow.axaml b/Launcher-UI/Views/LoadingWindow.axaml similarity index 100% rename from src/LauncherGUI/Views/LoadingWindow.axaml rename to Launcher-UI/Views/LoadingWindow.axaml diff --git a/src/LauncherGUI/Views/LoadingWindow.axaml.cs b/Launcher-UI/Views/LoadingWindow.axaml.cs similarity index 80% rename from src/LauncherGUI/Views/LoadingWindow.axaml.cs rename to Launcher-UI/Views/LoadingWindow.axaml.cs index 879574c..1f9aeac 100644 --- a/src/LauncherGUI/Views/LoadingWindow.axaml.cs +++ b/Launcher-UI/Views/LoadingWindow.axaml.cs @@ -3,7 +3,7 @@ using System.Threading.Tasks; using Avalonia.Controls; using Avalonia.Interactivity; using Avalonia.VisualTree; -using PlombirLauncher; +using Plombir; using LauncherGUI.ViewModels; using System.Threading; @@ -12,9 +12,9 @@ namespace LauncherGUI.Views; public partial class LoadingWindow : Window { private Launcher ln; - private Task _buildingTask; + private Task? _buildingTask; - // Tokens for controlling download task. + // Tokens for controlling download task. CancellationTokenSource tokenSource = new CancellationTokenSource(); public LoadingWindow(string nickname, string? version = null, string? location = null) { @@ -23,7 +23,7 @@ public partial class LoadingWindow : Window DataContext = new LoadingWindowViewModel(); } - public async Task InitLoading() + public async Task InitLoading() { var viewModel = DataContext as LoadingWindowViewModel; if (viewModel == null) @@ -31,10 +31,12 @@ public partial class LoadingWindow : Window throw new InvalidOperationException("No DataContext set"); } - Task updateGui = new Task(async () => { - while (ln.DownloadStatus != "Finished!"){ + Task updateGui = new Task(async () => + { + while (ln.DownloadStatus != "Finished!") + { viewModel.Progress = ln.DownloadProgress; - viewModel.LoadingStatus = ln.DownloadStatus; + viewModel.LoadingStatus = ln.DownloadStatus ?? "Looking at qubits..."; await Task.Delay(1000); } viewModel.Progress = 100; @@ -42,12 +44,12 @@ public partial class LoadingWindow : Window updateGui.Start(); - + _buildingTask = ln.BuildLauncher(tokenSource.Token); await _buildingTask; - - + + } public async Task RunMinecraft() @@ -62,4 +64,4 @@ public partial class LoadingWindow : Window System.Console.WriteLine("Loading disabled gracefully."); Close(); } -} \ No newline at end of file +} diff --git a/src/LauncherGUI/Views/MainWindow.axaml b/Launcher-UI/Views/MainWindow.axaml similarity index 100% rename from src/LauncherGUI/Views/MainWindow.axaml rename to Launcher-UI/Views/MainWindow.axaml diff --git a/src/LauncherGUI/Views/MainWindow.axaml.cs b/Launcher-UI/Views/MainWindow.axaml.cs similarity index 95% rename from src/LauncherGUI/Views/MainWindow.axaml.cs rename to Launcher-UI/Views/MainWindow.axaml.cs index 5dc7429..3e22395 100644 --- a/src/LauncherGUI/Views/MainWindow.axaml.cs +++ b/Launcher-UI/Views/MainWindow.axaml.cs @@ -4,7 +4,7 @@ using System.Linq; using Avalonia.Controls; using Avalonia.Interactivity; using Avalonia.VisualTree; -using PlombirLauncher; +using Plombir; using CmlLib.Core.VersionMetadata; using LauncherGUI.ViewModels; using System.Diagnostics; @@ -29,11 +29,11 @@ public partial class MainWindow : Window var root = button.GetVisualRoot() as MainWindow; if (root == null) return; - + var vm = DataContext as MainWindowViewModel; await LauncherUtils.CreateMinecraftInstance(vm, root); button.Content = "Minecraft launched"; - + } private void OnChooseVersionClick(object sender, RoutedEventArgs e) @@ -86,4 +86,4 @@ public partial class MainWindow : Window } } -} \ No newline at end of file +} diff --git a/src/LauncherGUI/Views/SettingsWindow.axaml b/Launcher-UI/Views/SettingsWindow.axaml similarity index 100% rename from src/LauncherGUI/Views/SettingsWindow.axaml rename to Launcher-UI/Views/SettingsWindow.axaml diff --git a/src/LauncherGUI/Views/SettingsWindow.axaml.cs b/Launcher-UI/Views/SettingsWindow.axaml.cs similarity index 92% rename from src/LauncherGUI/Views/SettingsWindow.axaml.cs rename to Launcher-UI/Views/SettingsWindow.axaml.cs index 5379973..572dbe5 100644 --- a/src/LauncherGUI/Views/SettingsWindow.axaml.cs +++ b/Launcher-UI/Views/SettingsWindow.axaml.cs @@ -3,7 +3,7 @@ using Avalonia.Controls; using Avalonia.Interactivity; using Avalonia.Platform.Storage; using LauncherGUI.ViewModels; -using PlombirLauncher; +using Plombir; namespace LauncherGUI.Views; @@ -21,6 +21,7 @@ public partial class SettingsWindow : Window // Get top level from the current control. Alternatively, you can use Window reference instead. var topLevel = TopLevel.GetTopLevel(this); + if (topLevel is null) throw new NullReferenceException("Failed to start file picker!"); // Start async operation to open the dialog. var files = await topLevel.StorageProvider.OpenFolderPickerAsync(new FolderPickerOpenOptions { @@ -38,4 +39,3 @@ public partial class SettingsWindow : Window } } } - diff --git a/src/LauncherGUI/Views/VersionSelectorWindow.axaml b/Launcher-UI/Views/VersionSelectorWindow.axaml similarity index 100% rename from src/LauncherGUI/Views/VersionSelectorWindow.axaml rename to Launcher-UI/Views/VersionSelectorWindow.axaml diff --git a/src/LauncherGUI/Views/VersionSelectorWindow.axaml.cs b/Launcher-UI/Views/VersionSelectorWindow.axaml.cs similarity index 82% rename from src/LauncherGUI/Views/VersionSelectorWindow.axaml.cs rename to Launcher-UI/Views/VersionSelectorWindow.axaml.cs index 96d8f0b..29f546d 100644 --- a/src/LauncherGUI/Views/VersionSelectorWindow.axaml.cs +++ b/Launcher-UI/Views/VersionSelectorWindow.axaml.cs @@ -4,7 +4,7 @@ using System.Threading.Tasks; using Avalonia.Controls; using Avalonia.Threading; using LauncherGUI.ViewModels; -using PlombirLauncher; +using Plombir; namespace LauncherGUI.Views; @@ -13,14 +13,14 @@ public partial class VersionSelectorWindow : Window private MainWindowViewModel _mainViewModel; public VersionSelectorWindow(MainWindowViewModel mainViewModel) { - InitializeComponent(); + InitializeComponent(); _mainViewModel = mainViewModel; //Load versions asynchronously - var versionsList = Task.Run(() => PlombirLauncher.Utils.GetAllMcVersions().GetAwaiter().GetResult()); - + var versionsList = Task.Run(() => Plombir.Utils.GetAllMcVersions().GetAwaiter().GetResult()); + versions.ItemsSource = versionsList.Result; - + } private async void OnSelectionChanged(object sender, SelectionChangedEventArgs e) @@ -30,10 +30,10 @@ public partial class VersionSelectorWindow : Window _mainViewModel.SelectedVersion = selectedVersion; System.Console.WriteLine($"Selected version: {selectedVersion}"); - + LauncherUtils.CreateMinecraftInstance(_mainViewModel, this); Close(); } -} \ No newline at end of file +} diff --git a/src/LauncherGUI/app.manifest b/Launcher-UI/app.manifest similarity index 100% rename from src/LauncherGUI/app.manifest rename to Launcher-UI/app.manifest diff --git a/Launcher-UI/tweaks.toml b/Launcher-UI/tweaks.toml new file mode 100644 index 0000000..3c7e373 --- /dev/null +++ b/Launcher-UI/tweaks.toml @@ -0,0 +1,6 @@ +title = "Launcher tweaks file!" +# Path to folder that will hold all minecraft versions +runtime-path = "./runtime" +# Saving last launched version to use it after launch +last-version-launched = "1.20.1" +nickname = "slugcat" diff --git a/package/build-targz-linux-ui.sh b/package/build-targz-linux-ui.sh new file mode 100755 index 0000000..dcac85e --- /dev/null +++ b/package/build-targz-linux-ui.sh @@ -0,0 +1,11 @@ +cd ../Launcher-UI + +out_dir=../package/out/build +archieve_name=PlombirLinux-v1-1-0.tar.gz + +rm -r $out_dir + +dotnet publish -r linux-x64 -o $out_dir -p:PublishReadyToRun=true -p:PublishSingleFile=true --self-contained true -p:IncludeNativeLibrariesForSelfExtract=true + +cd ../package/out +tar -czvf $archieve_name -C build/ . diff --git a/package/build-targz-osx-ui.sh b/package/build-targz-osx-ui.sh new file mode 100755 index 0000000..48b6b50 --- /dev/null +++ b/package/build-targz-osx-ui.sh @@ -0,0 +1,11 @@ +cd ../Launcher-UI + +out_dir=../package/out/build +archieve_name=PlombirOSX-v1-1-0.tar.gz + +rm -r $out_dir + +dotnet publish -r osx-x64 -o $out_dir -p:PublishReadyToRun=true -p:PublishSingleFile=true --self-contained true -p:IncludeNativeLibrariesForSelfExtract=true + +cd ../package/out +tar -czvf $archieve_name -C build/ . diff --git a/package/build-targz-win-ui.sh b/package/build-targz-win-ui.sh new file mode 100755 index 0000000..ccbcd6e --- /dev/null +++ b/package/build-targz-win-ui.sh @@ -0,0 +1,11 @@ +cd ../Launcher-UI + +out_dir=../package/out/build +archieve_name=PlombirWindows-v1-1-0.tar.gz + +rm -r $out_dir + +dotnet publish -r win-x64 -o $out_dir -p:PublishReadyToRun=true -p:PublishSingleFile=true --self-contained true -p:IncludeNativeLibrariesForSelfExtract=true + +cd ../package/out +tar -czvf $archieve_name -C build/ . diff --git a/src/Launcher/Launcher.cs b/src/Launcher/Launcher.cs deleted file mode 100644 index aeaa9f6..0000000 --- a/src/Launcher/Launcher.cs +++ /dev/null @@ -1,139 +0,0 @@ -using System.Formats.Tar; -using System.Net; -using System.Runtime.InteropServices; -using System.Security.AccessControl; -using CmlLib.Core; -using CmlLib.Core.Auth; -using CmlLib.Core.ProcessBuilder; - -namespace PlombirLauncher -{ - /* - Basically a class to manage everything launcher related. - TODO - minecraft downloading from webserver - */ - public class Launcher - { - private readonly string _version; - private readonly string _nickname; - static private MinecraftPath _mcPath; - static private MinecraftLauncher _mcLauncher; - - public int DownloadProgress; - public string DownloadStatus; - - public Launcher(string userName, string version, string? location = null) - { - _version = version; - _nickname = userName; - _mcPath = new($"{location}/{version}/minecraft"); - _mcLauncher = new(_mcPath); - } - - // Using it for forge loading because i don't know event-based async. - //static TaskCompletionSource tcs = new(); - - - // Not used. Because launcher supports only VANILLA. - // public async Task FetchMinecraft() - // { - - // string archieve = "mc-archieve.tar.xz"; - // string runtimePath = "runtime"; - - // System.Uri download_uri = new("https://dixxe.top/static/distro/cmllibcore-minecraft-forge-1201.tar.xz"); - // WebClient client = new(); - - // if ((!File.Exists(archieve)) && (!Directory.Exists(runtimePath))) - // { - // DownloadStatus = "Fetching deploy-minecraft from host..."; - // Console.WriteLine(DownloadStatus); - - // // Implement async download - // client.DownloadFileAsync(download_uri, archieve); - // client.DownloadDataCompleted += (o, e) => - // { - // DownloadStatus = "Download completed"; - // Console.WriteLine(DownloadStatus); - // }; - // client.DownloadProgressChanged += (o, e) => - // { - // // Curentlly this scope doing nothing - // Console.WriteLine($"{e.ProgressPercentage}% downloaded"); - // DownloadProgress = e.ProgressPercentage; - // DownloadStatus = "Fetching modpack..."; - - // if (DownloadProgress == 100) - // { - // tcs.SetResult(true); - // } - - // }; - // // Waiting for archieve to download. - // await tcs.Task; - // } - - // DownloadStatus = "Unarchiving modpack..."; - // unarchiveMinecraft(archieve, runtimePath); - - // } - - // Not used. Because launcher supports only VANILLA. - // private void unarchiveMinecraft(string archieveName, string path) - // { - // if (Directory.Exists(path)) { return; } - // Console.WriteLine(DownloadStatus); - // Directory.CreateDirectory(path); - // Utils.UnzipTarGzFile(archieveName, path); - - // if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) - // { - // Utils.LinuxExec($"chmod -R +x {path}/"); - // Console.WriteLine("Execute permissions added successfully."); - // } - - // File.Delete(archieveName); - // } - - async public Task BuildLauncher(CancellationToken token) - { - _mcLauncher.ByteProgressChanged += (_, args) => - { - Console.WriteLine($"{(int)(args.ProgressedBytes * 0.000001)} MBytes / {(int)(args.TotalBytes * 0.000001)} MBytes"); - DownloadProgress = (int)(args.ProgressedBytes * 100 / args.TotalBytes); - }; - - // Before installAsync I should fetch lightweight minecraft instance from webserver - // Then installAsync will download any runtime needed stuff. - // This method is FetchMinecraft() - // Currently this is only one viable option for forge installations. - // But it requires server, so forge (and all mod loaders) is disabled. - //await FetchMinecraft(); - - DownloadStatus = "Installing minecraft..."; - Console.WriteLine(DownloadStatus); - await _mcLauncher.InstallAsync(_version); - DownloadStatus = "Finished!"; - Console.WriteLine(DownloadStatus); - return; - } - - async public Task RunLauncher() - { - var process = await _mcLauncher.BuildProcessAsync(_version, new MLaunchOption - { - - Session = MSession.CreateOfflineSession(_nickname), - MaximumRamMb = 4096, - - }) ?? throw new Exception("Failed to start minecraft process!"); - - var processUtil = new ProcessWrapper(process); - processUtil.OutputReceived += (s, e) => Console.WriteLine(e); - processUtil.StartWithEvents(); - - await processUtil.WaitForExitTaskAsync(); - } - - } -} diff --git a/src/Launcher/Program.cs b/src/Launcher/Program.cs deleted file mode 100644 index 052e051..0000000 --- a/src/Launcher/Program.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace PlombirLauncher -{ - sealed class Program - { - public static void Main() - { - Console.WriteLine("init: launcher"); - } - } -} \ No newline at end of file diff --git a/src/Launcher/Utils.cs b/src/Launcher/Utils.cs deleted file mode 100644 index 86fe32c..0000000 --- a/src/Launcher/Utils.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System.IO.Compression; -using System; -using System.IO; -using SharpCompress.Archives; -using SharpCompress.Common; -using SharpCompress.Readers; -using System.Diagnostics; -using CmlLib.Core; - -namespace PlombirLauncher -{ - static public class Utils - { - public static void UnzipTarGzFile(string filePath, string destinationPath) - { - using (Stream stream = File.OpenRead(filePath)) - { - using (var reader = ReaderFactory.Open(stream)) - { - while (reader.MoveToNextEntry()) - { - if (!reader.Entry.IsDirectory) - { - reader.WriteEntryToDirectory(destinationPath, new ExtractionOptions() - { - ExtractFullPath = true, - Overwrite = true - }); - } - } - } - } - } - - public static void LinuxExec(string cmd) - { - var escapedArgs = cmd.Replace("\"", "\\\""); - - using var process = new Process - { - StartInfo = new ProcessStartInfo - { - RedirectStandardOutput = true, - UseShellExecute = false, - CreateNoWindow = true, - WindowStyle = ProcessWindowStyle.Hidden, - FileName = "/bin/bash", - Arguments = $"-c \"{escapedArgs}\"" - } - }; - - process.Start(); - process.WaitForExit(); - } - - public static async Task> GetAllMcVersions() - { - return await Task.Run(async() => { - var ln = new MinecraftLauncher(); - var result = new List(); - foreach (var x in await ln.GetAllVersionsAsync()) - { - result.Add(x.Name); - } - return result; - }); - - } - - - - } - -} \ No newline at end of file diff --git a/src/LauncherGUI/App.axaml b/src/LauncherGUI/App.axaml deleted file mode 100644 index 7f394db..0000000 --- a/src/LauncherGUI/App.axaml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - avares://LauncherGUI/Assets/Fonts/Quicksand-SemiBold.ttf#Quicksand - - - \ No newline at end of file diff --git a/src/LauncherGUI/Assets/Fonts/Quicksand.ttf b/src/LauncherGUI/Assets/Fonts/Quicksand.ttf deleted file mode 100644 index bd332b679b95ecd887ed5dba3dca8a27d7bae4ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 124196 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 _userNick; set {_userNick = value; OnPropertyChanged(nameof(Usernick)); }} - - private string _selectedVersion = ConfigManager.ReadConfig("last-version-launched"); - public string SelectedVersion {get => _selectedVersion; set {_selectedVersion = value; OnPropertyChanged(nameof(SelectedVersion)); }} - - private string _runtimeLocation = ConfigManager.ReadConfig("runtime-path"); - public string RuntimeLocation {get => _runtimeLocation; set {_runtimeLocation = value; OnPropertyChanged(nameof(RuntimeLocation)); }} -} diff --git a/src/LauncherGUI/tweaks.toml b/src/LauncherGUI/tweaks.toml deleted file mode 100644 index 3eafe99..0000000 --- a/src/LauncherGUI/tweaks.toml +++ /dev/null @@ -1,4 +0,0 @@ -title = "Launcher tweaks file!" -runtime-path = "/home/nullmax17/test_folder" -last-version-launched = "1.15" -nickname = "nullmax17" diff --git a/tweaks.toml b/tweaks.toml new file mode 100644 index 0000000..3c7e373 --- /dev/null +++ b/tweaks.toml @@ -0,0 +1,6 @@ +title = "Launcher tweaks file!" +# Path to folder that will hold all minecraft versions +runtime-path = "./runtime" +# Saving last launched version to use it after launch +last-version-launched = "1.20.1" +nickname = "slugcat"