diff --git a/pupdate.csproj.DotSettings b/pupdate.csproj.DotSettings new file mode 100644 index 00000000..932a944b --- /dev/null +++ b/pupdate.csproj.DotSettings @@ -0,0 +1,7 @@ + + True + diff --git a/src/Program.cs b/src/Program.cs index f58e6542..7cccb8e3 100644 --- a/src/Program.cs +++ b/src/Program.cs @@ -168,17 +168,9 @@ private static async Task Main(string[] args) backupSaves_Path = o.BackupPath; backupSaves_SaveConfig = o.Save; }) - .WithNotParsed(o => + .WithNotParsed(_ => { - if (o.IsHelp()) - { - Environment.Exit(1); - } - - if (o.IsVersion()) - { - Environment.Exit(1); - } + Environment.Exit(1); }); #endregion @@ -257,7 +249,8 @@ private static async Task Main(string[] args) coreUpdater.StatusUpdated += coreUpdater_StatusUpdated; coreUpdater.UpdateProcessComplete += coreUpdater_UpdateProcessComplete; coreUpdater.DownloadAssets(GlobalHelper.SettingsManager.GetConfig().download_assets); - coreUpdater.BackupSaves(GlobalHelper.SettingsManager.GetConfig().backup_saves, GlobalHelper.SettingsManager.GetConfig().backup_saves_location); + coreUpdater.BackupSaves(GlobalHelper.SettingsManager.GetConfig().backup_saves, + GlobalHelper.SettingsManager.GetConfig().backup_saves_location); // If we have any missing cores, handle them. if (GlobalHelper.SettingsManager.GetMissingCores().Any()) @@ -381,22 +374,22 @@ private static async Task Main(string[] args) while (flag) { - int choice = DisplayMenuNew(); + MainMenuItems choice = DisplayMenuNew(); switch (choice) { - case 1: + case MainMenuItems.UpdateFirmware: await coreUpdater.UpdateFirmware(); Pause(); break; - case 2: + case MainMenuItems.DownloadRequiredAssets: Console.WriteLine("Checking for required files..."); await coreUpdater.RunAssetDownloader(); Pause(); break; - case 3: + case MainMenuItems.SelectCores: List cores = await CoresService.GetCores(); AskAboutNewCores(true); RunCoreSelector(cores); @@ -404,43 +397,76 @@ private static async Task Main(string[] args) GlobalHelper.ReloadSettings(); break; - case 4: + case MainMenuItems.DownloadPlatformImagePacks: await ImagePackSelector(path); break; - case 5: + case MainMenuItems.GenerateInstanceJsonFiles: RunInstanceGenerator(coreUpdater); Pause(); break; - case 6: + case MainMenuItems.GenerateGameAndWatchRoms: await BuildGameAndWatchRoms(path); Pause(); break; - case 7: + case MainMenuItems.EnableAllDisplayModes: coreUpdater.ForceDisplayModes(); Pause(); break; - case 8: + case MainMenuItems.BackupSavesDirectory: AssetsService.BackupSaves(path, GlobalHelper.SettingsManager.GetConfig().backup_saves_location); Pause(); break; - case 9: + case MainMenuItems.ReinstallCores: + { + var results = ShowCoresMenu( + GlobalHelper.InstalledCores, + "Which cores would you like to reinstall?", + false); + + foreach (var item in results.Where(x => x.Value)) + { + await coreUpdater.RunUpdates(item.Key, true); + } + + break; + } + + case MainMenuItems.UninstallCores: + { + var results = ShowCoresMenu( + GlobalHelper.InstalledCores, + "Which cores would you like to uninstall?", + false); + + nuke = AskAboutCoreSpecificAssets(); + + foreach (var item in results.Where(x => x.Value)) + { + coreUpdater.DeleteCore(GlobalHelper.GetCore(item.Key), true, nuke); + } + + break; + } + + case MainMenuItems.Settings: SettingsMenu(); coreUpdater.DeleteSkippedCores(GlobalHelper.SettingsManager.GetConfig().delete_skipped_cores); coreUpdater.DownloadFirmware(GlobalHelper.SettingsManager.GetConfig().download_firmware); coreUpdater.DownloadAssets(GlobalHelper.SettingsManager.GetConfig().download_assets); coreUpdater.RenameJotegoCores(GlobalHelper.SettingsManager.GetConfig().fix_jt_names); - coreUpdater.BackupSaves(GlobalHelper.SettingsManager.GetConfig().backup_saves, GlobalHelper.SettingsManager.GetConfig().backup_saves_location); + coreUpdater.BackupSaves(GlobalHelper.SettingsManager.GetConfig().backup_saves, + GlobalHelper.SettingsManager.GetConfig().backup_saves_location); // Is reloading the settings file necessary? GlobalHelper.ReloadSettings(); break; - case 10: + case MainMenuItems.Exit: flag = false; break; @@ -466,7 +492,7 @@ private static void coreUpdater_StatusUpdated(object sender, StatusUpdatedEventA Console.WriteLine(e.Message); } - static void coreUpdater_UpdateProcessComplete(object sender, UpdateProcessCompleteEventArgs e) + private static void coreUpdater_UpdateProcessComplete(object sender, UpdateProcessCompleteEventArgs e) { Console.WriteLine("-------------"); Console.WriteLine(e.Message); @@ -477,10 +503,10 @@ static void coreUpdater_UpdateProcessComplete(object sender, UpdateProcessComple foreach (Dictionary core in e.InstalledCores) { - Console.WriteLine(core["core"] + " " + core["version"]); + Console.WriteLine($"{core["core"]} {core["version"]}"); } - Console.WriteLine(""); + Console.WriteLine(); } if (e.InstalledAssets.Count > 0) @@ -503,14 +529,14 @@ static void coreUpdater_UpdateProcessComplete(object sender, UpdateProcessComple Console.WriteLine(asset); } - Console.WriteLine(""); + Console.WriteLine(); } - if (e.FirmwareUpdated != "") + if (e.FirmwareUpdated != string.Empty) { Console.WriteLine("New Firmware was downloaded. Restart your Pocket to install"); Console.WriteLine(e.FirmwareUpdated); - Console.WriteLine(""); + Console.WriteLine(); } if (e.MissingBetaKeys.Count > 0) @@ -521,7 +547,7 @@ static void coreUpdater_UpdateProcessComplete(object sender, UpdateProcessComple Console.WriteLine(core); } - Console.WriteLine(""); + Console.WriteLine(); } Console.WriteLine(GetRandomSponsorLinks()); diff --git a/src/partials/Program.Menus.cs b/src/partials/Program.Menus.cs index 12d3b07c..4f292480 100644 --- a/src/partials/Program.Menus.cs +++ b/src/partials/Program.Menus.cs @@ -1,3 +1,6 @@ +using System.ComponentModel; +using System.Reflection; +using System.Security.Cryptography; using ConsoleTools; using Pannella.Helpers; using Pannella.Models; @@ -7,48 +10,69 @@ namespace Pannella; internal partial class Program { - private static int DisplayMenuNew() + private enum MainMenuItems { - Console.Clear(); + None = 0, + [Description("Update All")] + UpdateAll = 1, + [Description("Update Firmware")] + UpdateFirmware, + [Description("Download Required Assets")] + DownloadRequiredAssets, + [Description("Select Cores")] + SelectCores, + [Description("Reinstall Cores")] + ReinstallCores, + [Description("Uninstall Cores")] + UninstallCores, + [Description("Download Platform Image Packs")] + DownloadPlatformImagePacks, + [Description("Generate Instance JSON Files")] + GenerateInstanceJsonFiles, + [Description("Generate Game and Watch ROMS")] + GenerateGameAndWatchRoms, + [Description("Enable All Display Modes")] + EnableAllDisplayModes, + [Description("Backup Saves Directory")] + BackupSavesDirectory, + [Description("Settings")] + Settings, + [Description("Exit")] + Exit + } - string[] menuItems = - { - "Update All", - "Update Firmware", - "Download Required Assets", - "Select Cores", - "Download Platform Image Packs", - "Generate Instance JSON Files", - "Generate Game and Watch ROMS", - "Enable All Display Modes", - "Backup Saves Directory", - "Settings", - "Exit" - }; + private static MainMenuItems DisplayMenuNew() + { + Console.Clear(); Random random = new Random(); int i = random.Next(0, WELCOME_MESSAGES.Length); string welcome = WELCOME_MESSAGES[i]; - int choice = 0; + MainMenuItems choice = MainMenuItems.None; var menu = new ConsoleMenu() .Configure(config => { config.Selector = "=>"; - //config.EnableFilter = true; config.Title = $"{welcome}\r\n{GetRandomSponsorLinks()}\r\n"; config.EnableWriteTitle = true; - //config.EnableBreadcrumb = true; config.WriteHeaderAction = () => Console.WriteLine("Choose your destiny:"); config.SelectedItemBackgroundColor = Console.ForegroundColor; config.SelectedItemForegroundColor = Console.BackgroundColor; }); - foreach (var item in menuItems) + foreach (var item in Enum.GetValues()) { - menu.Add(item, thisMenu => + if (item == MainMenuItems.None) + continue; + + FieldInfo fi = item.GetType().GetField(item.ToString()); + DescriptionAttribute[] attributes = (DescriptionAttribute[])fi!.GetCustomAttributes(typeof(DescriptionAttribute), false); + var itemDescription = attributes.Length > 0 ? attributes[0].Description : item.ToString(); + + menu.Add(itemDescription, thisMenu => { - choice = thisMenu.CurrentItem.Index; + choice = item; thisMenu.CloseMenu(); }); } @@ -58,7 +82,7 @@ private static int DisplayMenuNew() return choice; } - private static void AskAboutNewCores(bool force = false) + private static void AskAboutNewCores(bool force = false) { while (GlobalHelper.SettingsManager.GetConfig().download_new_cores == null || force) { @@ -66,7 +90,7 @@ private static void AskAboutNewCores(bool force = false) Console.WriteLine("Would you like to, by default, install new cores? [Y]es, [N]o, [A]sk for each:"); - ConsoleKey response = Console.ReadKey(false).Key; + ConsoleKey response = Console.ReadKey(true).Key; GlobalHelper.SettingsManager.GetConfig().download_new_cores = response switch { @@ -78,96 +102,130 @@ private static void AskAboutNewCores(bool force = false) } } - private static void RunCoreSelector(List cores, string message = "Select your cores.") + private static bool AskAboutCoreSpecificAssets() { - if (GlobalHelper.SettingsManager.GetConfig().download_new_cores?.ToLowerInvariant() == "yes") + Console.WriteLine("Would you like to remove the core specific assets for the selected cores? [Y]es, [N]o"); + + bool? result = null; + + while (result == null) { - foreach (Core core in cores) + result = Console.ReadKey(true).Key switch { - GlobalHelper.SettingsManager.EnableCore(core.identifier); - } + ConsoleKey.Y => true, + ConsoleKey.N => false, + _ => null + }; } - else + + return result.Value; + } + + private static Dictionary ShowCoresMenu(List cores, string message, bool isCoreSelection) + { + const int pageSize = 15; + var offset = 0; + bool more = true; + var results = new Dictionary(); + + while (more) { - const int pageSize = 15; - var offset = 0; - bool more = true; + var menu = new ConsoleMenu() + .Configure(config => + { + config.Selector = "=>"; + config.EnableWriteTitle = false; + config.WriteHeaderAction = () => Console.WriteLine($"{message} Use enter to check/uncheck your choices."); + config.SelectedItemBackgroundColor = Console.ForegroundColor; + config.SelectedItemForegroundColor = Console.BackgroundColor; + config.WriteItemAction = item => Console.Write("{0}", item.Name); + }); + var current = -1; - while (more) + if ((offset + pageSize) <= cores.Count) { - var menu = new ConsoleMenu() - .Configure(config => - { - config.Selector = "=>"; - config.EnableWriteTitle = false; - config.WriteHeaderAction = () => Console.WriteLine($"{message} Use enter to check/uncheck your choices."); - config.SelectedItemBackgroundColor = Console.ForegroundColor; - config.SelectedItemForegroundColor = Console.BackgroundColor; - //config.WriteItemAction = item => Console.Write("{1}", item.Index, item.Name); - config.WriteItemAction = item => Console.Write("{0}", item.Name); - }); - var current = -1; + menu.Add("Next Page", thisMenu => + { + offset += pageSize; + thisMenu.CloseMenu(); + }); + } - if ((offset + pageSize) <= cores.Count) + foreach (Core core in cores) + { + current++; + + if ((current <= (offset + pageSize)) && (current >= offset)) { - menu.Add("Next Page", thisMenu => + var coreSettings = GlobalHelper.SettingsManager.GetCoreSettings(core.identifier); + var selected = isCoreSelection && !coreSettings.skip; + var name = core.identifier; + + if (isCoreSelection && core.requires_license) { - offset += pageSize; - thisMenu.CloseMenu(); - }); - } + name += " (Requires beta access)"; + } - foreach (Core core in cores) - { - current++; + var title = MenuItemName(name, selected); - if ((current <= (offset + pageSize)) && (current >= offset)) + menu.Add(title, thisMenu => { - var coreSettings = GlobalHelper.SettingsManager.GetCoreSettings(core.identifier); - var selected = !coreSettings.skip; - var name = core.identifier; + selected = !selected; - if (core.requires_license) + if (results.ContainsKey(core.identifier)) { - name += " (Requires beta access)"; + results[core.identifier] = selected; } - - var title = MenuItemName(name, selected); - - menu.Add(title, thisMenu => + else { - selected = !selected; - - if (!selected) - { - GlobalHelper.SettingsManager.DisableCore(core.identifier); - } - else - { - GlobalHelper.SettingsManager.EnableCore(core.identifier); - } - - thisMenu.CurrentItem.Name = MenuItemName(core.identifier, selected); - }); - } - } + results.Add(core.identifier, selected); + } - if ((offset + pageSize) <= cores.Count) - { - menu.Add("Next Page", thisMenu => - { - offset += pageSize; - thisMenu.CloseMenu(); + thisMenu.CurrentItem.Name = MenuItemName(core.identifier, selected); }); } + } - menu.Add("Save Choices", thisMenu => + if ((offset + pageSize) <= cores.Count) + { + menu.Add("Next Page", thisMenu => { + offset += pageSize; thisMenu.CloseMenu(); - more = false; }); + } + + menu.Add("Save Choices", thisMenu => + { + thisMenu.CloseMenu(); + more = false; + }); - menu.Show(); + menu.Show(); + } + + return results; + } + + private static void RunCoreSelector(List cores, string message = "Select your cores.") + { + if (GlobalHelper.SettingsManager.GetConfig().download_new_cores?.ToLowerInvariant() == "yes") + { + foreach (Core core in cores) + { + GlobalHelper.SettingsManager.EnableCore(core.identifier); + } + } + else + { + var results = ShowCoresMenu(cores, message, true); + + foreach (var item in results) + { + if (item.Value) + GlobalHelper.SettingsManager.EnableCore(item.Key); + else + GlobalHelper.SettingsManager.DisableCore(item.Key); } } @@ -185,7 +243,7 @@ private static void SettingsMenu() { "download_assets", "Download Missing Assets (ROMs and BIOS Files) during 'Update All'" }, { "build_instance_jsons", "Build game JSON files for supported cores during 'Update All'" }, { "delete_skipped_cores", "Delete untracked cores during 'Update All'" }, - { "fix_jt_names", "Automatically rename Jotego cores during 'Update All" }, + { "fix_jt_names", "Automatically rename Jotego cores during 'Update All'" }, { "crc_check", "Use CRC check when checking ROMs and BIOS files" }, { "preserve_platforms_folder", "Preserve 'Platforms' folder during 'Update All'" }, { "skip_alternative_assets", "Skip alternative roms when downloading assets" }, @@ -202,7 +260,6 @@ private static void SettingsMenu() config.WriteHeaderAction = () => Console.WriteLine("Settings. Use enter to check/uncheck your choices."); config.SelectedItemBackgroundColor = Console.ForegroundColor; config.SelectedItemForegroundColor = Console.BackgroundColor; - //config.WriteItemAction = item => Console.Write("{1}", item.Index, item.Name); config.WriteItemAction = item => Console.Write("{0}", item.Name); });