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);
});