diff --git a/ShinRyuModManager-CE/Extensions/EnumerableExtensions.cs b/ShinRyuModManager-CE/Extensions/EnumerableExtensions.cs new file mode 100644 index 0000000..b3f24f6 --- /dev/null +++ b/ShinRyuModManager-CE/Extensions/EnumerableExtensions.cs @@ -0,0 +1,7 @@ +namespace ShinRyuModManager.Extensions; + +public static class EnumerableExtensions { + public static bool IsNullOrEmpty(this IEnumerable collection) { + return collection == null || !collection.Any(); + } +} diff --git a/ShinRyuModManager-CE/GameModel.cs b/ShinRyuModManager-CE/GameModel.cs index c521590..774b1ee 100644 --- a/ShinRyuModManager-CE/GameModel.cs +++ b/ShinRyuModManager-CE/GameModel.cs @@ -105,7 +105,7 @@ public static void DoY0DCLegacyModsUpgrade(MLO mlo) { parlessDir.Create(); foreach (var modName in mlo.Mods) { - var modDir = Path.Combine(GamePath.ModsPath, modName); + var modDir = GamePath.GetModDirectory(modName); if (!Directory.Exists(modDir)) continue; @@ -173,7 +173,7 @@ public static void DoYK2RemasterLegacyDBUpgrade(MLO mlo) { parlessDir.Create(); foreach (var modName in mlo.Mods) { - var modDir = Path.Combine(GamePath.ModsPath, modName); + var modDir = GamePath.GetModDirectory(modName); if (!Directory.Exists(modDir)) continue; diff --git a/ShinRyuModManager-CE/LibMeta.cs b/ShinRyuModManager-CE/LibMeta.cs index 9d64493..1d937f7 100644 --- a/ShinRyuModManager-CE/LibMeta.cs +++ b/ShinRyuModManager-CE/LibMeta.cs @@ -1,35 +1,38 @@ using JetBrains.Annotations; using ShinRyuModManager.Helpers; +using Utils; namespace ShinRyuModManager; [UsedImplicitly] public class LibMeta { - public Guid GUID { get; set; } + public Guid GUID { get; private set; } public string Name { get; set; } public string Version { get; set; } public string Author { get; set; } public string Description { get; set; } public bool CanBeDisabled { get; set; } public bool IsDisabled { get; set; } + /// /// A semicolon (;) separated list of game executable names. /// public string TargetGames { get; set; } + public string Source { get; set; } public string Download { get; set; } public string MainBinary { get; set; } - private static string Url { get => $"https://raw.githubusercontent.com/{Settings.LIBRARIES_INFO_REPO_OWNER}/{Settings.LIBRARIES_INFO_REPO}/main/{Settings.LIBRARIES_INFO_REPO_FILE_PATH}"; } + private const string URL = $"https://raw.githubusercontent.com/{Constants.LIBRARIES_INFO_REPO_OWNER}/{Constants.LIBRARIES_INFO_REPO}/main/{Constants.LIBRARIES_INFO_REPO_FILE_PATH}"; public static LibMeta ReadLibMeta(string yamlString) { return YamlHelpers.DeserializeYaml(yamlString); } public static List Fetch() { - var yamlString = Utils.Client.GetStringAsync(Url).GetAwaiter().GetResult(); + var yamlString = Utils.Client.GetStringAsync(URL).GetAwaiter().GetResult(); - var localManifestCopyPath = Program.GetLocalLibraryCopyPath(); + var localManifestCopyPath = GamePath.LocalLibrariesPath; if (!File.Exists(localManifestCopyPath) && !Utils.IsFileLocked(localManifestCopyPath)) { File.WriteAllText(localManifestCopyPath!, yamlString); @@ -39,9 +42,9 @@ public static List Fetch() { } public static async Task> FetchAsync() { - var yamlString = await Utils.Client.GetStringAsync(Url); + var yamlString = await Utils.Client.GetStringAsync(URL); - var localManifestCopyPath = Program.GetLocalLibraryCopyPath(); + var localManifestCopyPath = GamePath.LocalLibrariesPath; if (!File.Exists(localManifestCopyPath) && !Utils.IsFileLocked(localManifestCopyPath)) { await File.WriteAllTextAsync(localManifestCopyPath!, yamlString); @@ -53,13 +56,12 @@ public static async Task> FetchAsync() { public static List ReadLibMetaManifest(string yamlString) { var returnList = new List(); var yamlObject = YamlHelpers.DeserializeYaml>(yamlString); - - foreach (var key in yamlObject.Keys) - { + + foreach (var key in yamlObject.Keys) { var meta = yamlObject[key]; - - meta.GUID = new Guid(key); - + + meta.GUID = Guid.Parse(key); + returnList.Add(meta); } diff --git a/ShinRyuModManager-CE/ModLoadOrder/CpkPatcher.cs b/ShinRyuModManager-CE/ModLoadOrder/CpkPatcher.cs index e516d7b..ae92964 100644 --- a/ShinRyuModManager-CE/ModLoadOrder/CpkPatcher.cs +++ b/ShinRyuModManager-CE/ModLoadOrder/CpkPatcher.cs @@ -1,6 +1,7 @@ using CpkTools.Endian; using CpkTools.Model; using Serilog; +using ShinRyuModManager.Extensions; using Utils; namespace ShinRyuModManager.ModLoadOrder; @@ -8,7 +9,7 @@ namespace ShinRyuModManager.ModLoadOrder; // Intended only for OE bgm/se.cpk internal static class CpkPatcher { public static async Task RepackDictionary(Dictionary> cpkDict) { - if (cpkDict == null || cpkDict.Count <= 0) { + if (cpkDict.IsNullOrEmpty()) { return; } diff --git a/ShinRyuModManager-CE/ModLoadOrder/Generator.cs b/ShinRyuModManager-CE/ModLoadOrder/Generator.cs index ed5b3b7..846b9ac 100644 --- a/ShinRyuModManager-CE/ModLoadOrder/Generator.cs +++ b/ShinRyuModManager-CE/ModLoadOrder/Generator.cs @@ -33,7 +33,6 @@ public static async Task GenerateModeLoadOrder(List mods, bool loos } var modsObjects = new Mod[mods.Count]; - var cpkDictionary = new Dictionary>(); Log.Information("Reading mods...\n"); @@ -43,7 +42,8 @@ public static async Task GenerateModeLoadOrder(List mods, bool loos // Use a reverse loop to be able to remove items from the list when necessary for (var i = mods.Count - 1; i >= 0; i--) { var mod = new Mod(mods[i]); - var modPath = Path.Combine(GamePath.ModsPath, mods[i]); + var modPath = GamePath.GetModDirectory(mods[i]); + mod.AddFiles(modPath, ""); mod.PrintInfo(); diff --git a/ShinRyuModManager-CE/ModLoadOrder/MLO.cs b/ShinRyuModManager-CE/ModLoadOrder/MLO.cs index 075fd0f..0ac1327 100644 --- a/ShinRyuModManager-CE/ModLoadOrder/MLO.cs +++ b/ShinRyuModManager-CE/ModLoadOrder/MLO.cs @@ -48,23 +48,23 @@ public void WriteMLO(string path) { writer.Write(FILESIZE); writer.Write(0x40); // Mods start (size of header) - writer.WriteOfType(typeof(uint), Mods.Count); + writer.WriteOfType((uint)Mods.Count); writer.Write(0); // Files start (to be written later) - writer.WriteOfType(typeof(uint), Files.Count); + writer.WriteOfType((uint)Files.Count); writer.Write(0); // Parless folders start (to be written later) - writer.WriteOfType(typeof(uint), ParlessFolders.Count); + writer.WriteOfType((uint)ParlessFolders.Count); writer.Write(0); // Cpk folders start (to be written later) - writer.WriteOfType(typeof(uint), CpkFolders.Count); + writer.WriteOfType((uint)CpkFolders.Count); writer.WriteTimes(0, 0x10); // Padding // 0x0: Length // 0x2: String foreach (var mod in Mods) { - writer.WriteOfType(typeof(ushort), mod.Length + 1); + writer.WriteOfType((ushort)mod.Length + 1); writer.Write(mod); } @@ -74,8 +74,8 @@ public void WriteMLO(string path) { // 0x2: Length // 0x4: String foreach (var file in Files) { - writer.WriteOfType(typeof(ushort), file.Index); - writer.WriteOfType(typeof(ushort), file.Name.Length + 1); + writer.WriteOfType((ushort)file.Index); + writer.WriteOfType((ushort)file.Name.Length + 1); writer.Write(file.Name); } @@ -85,8 +85,8 @@ public void WriteMLO(string path) { // 0x2: Length // 0x4: String foreach (var folder in ParlessFolders) { - writer.WriteOfType(typeof(ushort), folder.Index); - writer.WriteOfType(typeof(ushort), folder.Name.Length + 1); + writer.WriteOfType((ushort)folder.Index); + writer.WriteOfType((ushort)folder.Name.Length + 1); writer.Write(folder.Name); } @@ -97,29 +97,29 @@ public void WriteMLO(string path) { // 0x4: String // 0x?: Mod Indices foreach (var folder in CpkFolders) { - writer.WriteOfType(typeof(ushort), folder.Indices.Count); - writer.WriteOfType(typeof(ushort), folder.Name.Length + 1); + writer.WriteOfType((ushort)folder.Indices.Count); + writer.WriteOfType((ushort)folder.Name.Length + 1); writer.Write(folder.Name); foreach (var index in folder.Indices) { - writer.WriteOfType(typeof(ushort), index); + writer.WriteOfType(index); } } // Write file size writer.Stream.Seek(0xC); - writer.WriteOfType(typeof(uint), writer.Stream.Length); + writer.WriteOfType((uint)writer.Stream.Length); // Write file start position writer.Stream.Seek(0x18); - writer.WriteOfType(typeof(uint), fileStartPos); + writer.WriteOfType((uint)fileStartPos); // Write parless folders start position writer.Stream.Seek(0x20); - writer.WriteOfType(typeof(uint), parlessStartPos); + writer.WriteOfType((uint)parlessStartPos); // Write cpk folders start position writer.Stream.Seek(0x28); - writer.WriteOfType(typeof(uint), cpkFolderStartPos); + writer.WriteOfType((uint)cpkFolderStartPos); } } \ No newline at end of file diff --git a/ShinRyuModManager-CE/ModLoadOrder/Mods/Mod.cs b/ShinRyuModManager-CE/ModLoadOrder/Mods/Mod.cs index ee16c75..dbf9c82 100644 --- a/ShinRyuModManager-CE/ModLoadOrder/Mods/Mod.cs +++ b/ShinRyuModManager-CE/ModLoadOrder/Mods/Mod.cs @@ -179,8 +179,7 @@ public void AddFiles(string path, string check) { if (path.Contains("talk_")) { if (char.IsDigit(basename[0]) || check == "cmn") { needsRepack = true; - } - else { + } else { var tCmn = Path.Combine(path, "cmn"); var t000 = Path.Combine(path, "000"); diff --git a/ShinRyuModManager-CE/ParRepacker.cs b/ShinRyuModManager-CE/ParRepacker.cs index 7dd2231..d8ac876 100644 --- a/ShinRyuModManager-CE/ParRepacker.cs +++ b/ShinRyuModManager-CE/ParRepacker.cs @@ -1,5 +1,6 @@ using ParLibrary.Converter; using Serilog; +using ShinRyuModManager.Extensions; using Utils; using Yarhl.FileSystem; using Yarhl.IO; @@ -43,7 +44,7 @@ public static void RemoveOldRepackedPars() { public static async Task RepackDictionary(Dictionary> parDictionary) { var parTasks = new List(); - if (parDictionary.Count == 0) { + if (parDictionary.IsNullOrEmpty()) { Log.Information("No pars to repack."); return; @@ -167,7 +168,7 @@ private static void RepackPar(string parPath, List mods) { writerParams.IncludeDots = par.Children[0].Name == "."; writerParams.ResetFileDates = true; - containerNode.MoveChildrenTo(writerParams.IncludeDots ? par.Children[0] : par, true); + containerNode!.MoveChildrenTo(writerParams.IncludeDots ? par.Children[0] : par, true); par.SortChildren((x, y) => string.CompareOrdinal(x.Name.ToLowerInvariant(), y.Name.ToLowerInvariant())); writerParams.IncludeDots = false; @@ -205,13 +206,13 @@ private static List GetModFiles(string path) { List files = []; // Add files in current directory - foreach (var p in Directory.GetFiles(path).Where(f => !f.EndsWith(Constants.VORTEX_MANAGED_FILE)).Select(GamePath.GetDataPathFrom)) { + foreach (var p in Directory.EnumerateFiles(path).Where(f => !f.EndsWith(Constants.VORTEX_MANAGED_FILE)).Select(GamePath.GetDataPathFrom)) { files.Add(p); Log.Verbose("Adding file: {File}", p); } // Get files for all subdirectories - foreach (var folder in Directory.GetDirectories(path)) { + foreach (var folder in Directory.EnumerateDirectories(path)) { files.AddRange(GetModFiles(folder)); } @@ -230,15 +231,13 @@ private static Node ReadDirectory(string dirPath, string nodeName = "") { container.Tags["DirectoryInfo"] = directoryInfo; - var files = directoryInfo.GetFiles(); - foreach (var file in files) { + foreach (var file in directoryInfo.EnumerateFiles()) { var fileNode = NodeFactory.FromFile(file.FullName); container.Add(fileNode); } - var directories = directoryInfo.GetDirectories(); - foreach (var directory in directories) { + foreach (var directory in directoryInfo.EnumerateDirectories()) { var directoryNode = ReadDirectory(directory.FullName); container.Add(directoryNode); diff --git a/ShinRyuModManager-CE/Program.cs b/ShinRyuModManager-CE/Program.cs index a6b805c..6651da1 100644 --- a/ShinRyuModManager-CE/Program.cs +++ b/ShinRyuModManager-CE/Program.cs @@ -10,6 +10,7 @@ using Serilog.Events; using Serilog.Exceptions; using Serilog.Formatting.Json; +using ShinRyuModManager.Extensions; using ShinRyuModManager.Helpers; using ShinRyuModManager.ModLoadOrder; using ShinRyuModManager.ModLoadOrder.Mods; @@ -44,10 +45,10 @@ public static class Program { [STAThread] private static void Main(string[] args) { - Directory.CreateDirectory(Settings.LOGS_BASE_PATH); + Directory.CreateDirectory(Constants.LOGS_BASE_PATH); - var defaultLogsPath = Path.Combine(Settings.LOGS_BASE_PATH, "srmm_logs.log"); - var errorLogsPath = Path.Combine(Settings.LOGS_BASE_PATH, "srmm_errors.log"); + var defaultLogsPath = Path.Combine(Constants.LOGS_BASE_PATH, "srmm_logs.log"); + var errorLogsPath = Path.Combine(Constants.LOGS_BASE_PATH, "srmm_errors.log"); LoadConfig(); @@ -66,7 +67,7 @@ private static void Main(string[] args) { .WriteTo.Async(a => a.File(new JsonFormatter(renderMessage: true), errorLogsPath, rollingInterval: RollingInterval.Day))) .CreateLogger(); - // TODO: Temporary, YakuzaParless.asi currently only supports the Windows binary. Currently disabling RebuildMLO on Linux + // TODO: Maybe temporary, YakuzaParless.asi currently only supports the Windows binary. Currently disabling RebuildMLO on Linux if (!OperatingSystem.IsWindows()) { IsRebuildMloSupported = false; } @@ -306,7 +307,7 @@ internal static async Task RunGeneration(List mods) { return; } - if (mods is { Count: > 0 } || _looseFilesEnabled) { + if (!mods.IsNullOrEmpty() || _looseFilesEnabled) { // Create Parless mod as highest priority mods.Remove("Parless"); mods.Insert(0, "Parless"); @@ -505,13 +506,13 @@ internal static async Task SaveModListAsync(List mods) { } private static async Task WriteModListTextAsync(List mods) { - if (mods == null || mods.Count == 0) + if (mods.IsNullOrEmpty()) return false; var sb = new StringBuilder(); foreach (var mod in mods) { - sb.Append($"{(mod.Enabled ? "<" : ">")}{mod.Name}|"); + sb.Append($"{(mod.Enabled ? '<' : '>')}{mod.Name}|"); } // Remove leftover pipe @@ -522,21 +523,11 @@ private static async Task WriteModListTextAsync(List mods) { return true; } - public static string GetModDirectory(string mod) - { - return Path.Combine(GamePath.ModsPath, mod); - } - - public static string[] GetModDependencies(string mod) - { - string modDir = GetModDirectory(mod); - - if (!Directory.Exists(modDir)) - return []; - - string metaFile = Path.Combine(modDir, "mod-meta.yaml"); + public static string[] GetModDependencies(string mod) { + var modDir = GamePath.GetModDirectory(mod); + var metaFile = Path.Combine(modDir, "mod-meta.yaml"); - if (!File.Exists(metaFile)) + if (!Directory.Exists(modDir) || !File.Exists(metaFile)) return []; var meta = YamlHelpers.DeserializeYamlFromPath(metaFile); @@ -547,20 +538,9 @@ public static string[] GetModDependencies(string mod) return meta.Dependencies.Split(';'); } - public static string GetLibraryPath(string guid) - { - return Path.Combine(GamePath.LibrariesPath, guid); - } - - public static string GetLocalLibraryCopyPath() - { - return Path.Combine(GamePath.LibrariesPath, Settings.LIBRARIES_INFO_REPO_FILE_PATH); - } - //Read cached data at startup if it exists - public static void ReadCachedLocalLibraryData() - { - string path = GetLocalLibraryCopyPath(); + public static void ReadCachedLocalLibraryData() { + var path = GamePath.LocalLibrariesPath; if (!File.Exists(path)) return; @@ -568,47 +548,37 @@ public static void ReadCachedLocalLibraryData() LibMeta.ReadLibMetaManifest(File.ReadAllText(path)); } - public static LibMeta GetLibMeta(string guid) - { + public static LibMeta GetLibMeta(string guid) { return LibraryMetaCache.FirstOrDefault(x => x.GUID.ToString() == guid); } - public static bool DoesLibraryExist(string guid) - { - string libDir = GetLibraryPath(guid); - - if (!Directory.Exists(libDir)) - return false; + public static bool DoesLibraryExist(string guid) { + var libDir = GamePath.GetLibraryPath(guid); - return true; + return Directory.Exists(libDir); } - public static bool IsLibraryEnabled(string guid) - { + public static bool IsLibraryEnabled(string guid) { if (!DoesLibraryExist(guid)) return false; - if (File.Exists(Path.Combine(GetLibraryPath(guid), ".disabled"))) - return false; - - return true; + return !File.Exists(Path.Combine(GamePath.GetLibraryPath(guid), ".disabled")); } - public static string GetLibraryName(string guid) - { + public static string GetLibraryName(string guid) { var metaData = GetLibMeta(guid); if (metaData != null) return metaData.Name; - var path = Path.Combine(GetLibraryPath(guid), Settings.LIBRARIES_LIBMETA_FILE_NAME); + var path = Path.Combine(GamePath.GetLibraryPath(guid), Constants.LIBRARIES_LIBMETA_FILE_NAME); if (!File.Exists(path)) return guid; var yamlString = File.ReadAllText(path); var meta = LibMeta.ReadLibMeta(yamlString); - + return meta.Name; } @@ -626,14 +596,15 @@ public static async Task InstallLibraryAsync(string guid) { Directory.Delete(destDir, true); Directory.CreateDirectory(destDir); + await ZipFile.ExtractToDirectoryAsync(packagePath, destDir, true); } private static async Task DownloadLibraryPackageAsync(string fileName, LibMeta meta) { - Directory.CreateDirectory(Path.Combine(Path.GetTempPath(), Settings.TEMP_DIRECTORY_NAME)); + Directory.CreateDirectory(Path.Combine(Path.GetTempPath(), Constants.TEMP_DIRECTORY_NAME)); try { - var path = Path.Combine(Path.GetTempPath(), Settings.TEMP_DIRECTORY_NAME, fileName); + var path = Path.Combine(Path.GetTempPath(), Constants.TEMP_DIRECTORY_NAME, fileName); await using var stream = await Utils.Client.GetStreamAsync(meta.Download); await using var fs = new FileStream(path, FileMode.Create, FileAccess.Write); @@ -664,14 +635,10 @@ public static async Task InstallAllModDependenciesAsync() { } public static async Task InstallModDependenciesAsync(string mod) { - var modDir = GetModDirectory(mod); - - if (!Directory.Exists(modDir)) - return; - + var modDir = GamePath.GetModDirectory(mod); var metaFile = Path.Combine(modDir, "mod-meta.yaml"); - if (!File.Exists(metaFile)) + if (!Directory.Exists(modDir) || !File.Exists(metaFile)) return; var meta = await YamlHelpers.DeserializeYamlFromPathAsync(metaFile); diff --git a/ShinRyuModManager-CE/Settings.cs b/ShinRyuModManager-CE/Settings.cs deleted file mode 100644 index 710b6a2..0000000 --- a/ShinRyuModManager-CE/Settings.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace ShinRyuModManager; - -public static class Settings { - //TEMP - public const string TEMP_DIRECTORY_NAME = "ShinRyuModManager"; - - //EVENTS - public const string EVENT_FOOLS24_FLAG_FILE_NAME = ".SRMM_FOOLS24_FLAG"; - - //LIBRARIES - public const string LIBRARIES_INFO_REPO_OWNER = "SRMM-Studio"; - public const string LIBRARIES_INFO_REPO = "srmm-lib-info"; - public const string LIBRARIES_INFO_REPO_FILE_PATH = "libraries.yaml"; - public const string LIBRARIES_LIBMETA_FILE_NAME = "lib-meta.yaml"; - - //LOGGING - public const string LOGS_BASE_PATH = "srmm-logs"; -} diff --git a/ShinRyuModManager-CE/UserInterface/CustomFilePickerFileTypes.cs b/ShinRyuModManager-CE/UserInterface/CustomFilePickerFileTypes.cs index 612ce18..b254304 100644 --- a/ShinRyuModManager-CE/UserInterface/CustomFilePickerFileTypes.cs +++ b/ShinRyuModManager-CE/UserInterface/CustomFilePickerFileTypes.cs @@ -3,30 +3,25 @@ namespace ShinRyuModManager.UserInterface; public static class CustomFilePickerFileTypes { - public static FilePickerFileType CompressedZip { get; } = new("Zip Archive") - { + public static FilePickerFileType CompressedZip { get; } = new("Zip Archive") { Patterns = ["*.zip", "*.7z"], AppleUniformTypeIdentifiers = ["public.zip-archive", "org.7-zip.7-zip-archive"], MimeTypes = ["application/zip", "application/x-7z-compressed"] }; - public static FilePickerFileType CompressedRar { get; } = new("Rar Archive") - { + public static FilePickerFileType CompressedRar { get; } = new("Rar Archive") { Patterns = ["*.rar"], AppleUniformTypeIdentifiers = ["com.rarlab.rar-archive"], MimeTypes = ["application/x-rar-compressed", "application/vnd.rar", "application/x-rar"] }; - - public static FilePickerFileType CompressedGzip { get; } = new("Gzip Archive") - { + public static FilePickerFileType CompressedGzip { get; } = new("Gzip Archive") { Patterns = ["*.gz"], AppleUniformTypeIdentifiers = ["org.gnu.gnu-zip-archive"], MimeTypes = ["application/gzip"] }; - public static FilePickerFileType YamlFile { get; } = new("YAML File") - { + public static FilePickerFileType YamlFile { get; } = new("YAML File") { Patterns = ["*.yaml"], AppleUniformTypeIdentifiers = ["public.yaml"], MimeTypes = ["application/yaml"] diff --git a/ShinRyuModManager-CE/UserInterface/UserControls/LibraryDisplayControl.axaml.cs b/ShinRyuModManager-CE/UserInterface/UserControls/LibraryDisplayControl.axaml.cs index 5d3d314..9c4c935 100644 --- a/ShinRyuModManager-CE/UserInterface/UserControls/LibraryDisplayControl.axaml.cs +++ b/ShinRyuModManager-CE/UserInterface/UserControls/LibraryDisplayControl.axaml.cs @@ -36,7 +36,7 @@ private void CompareToLocalInstallation() { if (DataContext is not LibraryDisplayControlViewModel viewModel) return; var dirPath = Path.Combine(GamePath.LIBRARIES, _meta.GUID.ToString()); - var metaPath = Path.Combine(dirPath, Settings.LIBRARIES_LIBMETA_FILE_NAME); + var metaPath = Path.Combine(dirPath, Constants.LIBRARIES_LIBMETA_FILE_NAME); if (Directory.Exists(dirPath)) { _isLibraryInstalled = true; diff --git a/ShinRyuModManager-CE/UserInterface/Views/LibraryManagerWindow.axaml.cs b/ShinRyuModManager-CE/UserInterface/Views/LibraryManagerWindow.axaml.cs index 2b74ddd..e1d232f 100644 --- a/ShinRyuModManager-CE/UserInterface/Views/LibraryManagerWindow.axaml.cs +++ b/ShinRyuModManager-CE/UserInterface/Views/LibraryManagerWindow.axaml.cs @@ -35,7 +35,7 @@ private void PopulateLibraryList() { } } } catch (Exception ex) { - // Fetching library data from github failed. Connection issues or server down? + // Fetching library data from GitHub failed. Connection issues or server down? // Populate the list with data from the already installed libraries in case the user wants to uninstall or disable any Log.Fatal(ex, "Failed to fetch library data!"); @@ -43,7 +43,7 @@ private void PopulateLibraryList() { var metaList = new List(); foreach (var dir in Directory.GetDirectories(GamePath.LibrariesPath)) { - var path = Path.Combine(dir, Settings.LIBRARIES_LIBMETA_FILE_NAME); + var path = Path.Combine(dir, Constants.LIBRARIES_LIBMETA_FILE_NAME); if (!File.Exists(path)) continue; diff --git a/ShinRyuModManager-CE/UserInterface/Views/MainWindow.axaml.cs b/ShinRyuModManager-CE/UserInterface/Views/MainWindow.axaml.cs index 14381ef..82b8791 100644 --- a/ShinRyuModManager-CE/UserInterface/Views/MainWindow.axaml.cs +++ b/ShinRyuModManager-CE/UserInterface/Views/MainWindow.axaml.cs @@ -459,9 +459,7 @@ private async void LaunchGame_OnClick(object sender, RoutedEventArgs e) { private async Task UpdateModMetaAsync(MainWindowViewModel viewModel, ModInfo mod) { const string modImagePattern = "mod-image.*"; - var modPath = Path.Combine(GamePath.ModsPath, mod.Name); - //var libMetaPath = Path.Combine(modPath, "lib-meta.yaml"); - + var modPath = GamePath.GetModDirectory(mod.Name); var matchingModImages = Directory.EnumerateFiles(modPath, modImagePattern); Bitmap modImage = null; @@ -496,7 +494,7 @@ private async Task UpdateModMetaAsync(MainWindowViewModel viewModel, ModInfo mod } private static async Task GetModMetaAsync(string modName) { - var modPath = Path.Combine(GamePath.ModsPath, modName); + var modPath = GamePath.GetModDirectory(modName); var modMetaPath = Path.Combine(modPath, "mod-meta.yaml"); var meta = ModMeta.GetPlaceholder(modName); diff --git a/ShinRyuModManager-CE/Utils.cs b/ShinRyuModManager-CE/Utils.cs index 3442abc..8a2a731 100644 --- a/ShinRyuModManager-CE/Utils.cs +++ b/ShinRyuModManager-CE/Utils.cs @@ -9,7 +9,7 @@ namespace ShinRyuModManager; public static class Utils { // Static to be used through project - public static HttpClient Client { get; } = new HttpClient(); + public static HttpClient Client { get; } = new(); public static string NormalizeNameLower(string path) { return NormalizeSeparator(path.ToLowerInvariant()); @@ -27,13 +27,9 @@ internal static bool IsFileLocked(string path) { using var fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.None); return false; - } - catch (IOException) // File is in use - { + } catch (IOException) { // File is in use return true; - } - catch (UnauthorizedAccessException) // Unable to access - { + } catch (UnauthorizedAccessException) { // Unable to access return true; } } @@ -103,25 +99,11 @@ private static bool Extract7ZFile(Stream stream) { /// Target version. /// Current version to compare against. /// A boolean. - internal static bool CompareVersionIsHigher(string versionTarget, string versionCurrent) - { + internal static bool CompareVersionIsHigher(string versionTarget, string versionCurrent) { var v1 = new Version(versionTarget); var v2 = new Version(versionCurrent); - - switch (v1.CompareTo(v2)) - { - case 0: //same - return false; - case 1: //target is higher - return true; - - case -1: //target is lower - return false; - - default: - return false; - } + return v1.CompareTo(v2) == 1; // 1 mean target is higher } public static void CopyDirectory(string srcDirectory, string destDirectory) { diff --git a/Utils/Constants.cs b/Utils/Constants.cs index 9e74320..52718cc 100644 --- a/Utils/Constants.cs +++ b/Utils/Constants.cs @@ -37,4 +37,19 @@ public static class Constants { public const string UPDATE_INFO_REPO_OWNER = "SRMM-Studio"; public const string UPDATE_INFO_REPO = "srmm-version-info"; public const string UPDATE_INFO_FILE_PATH = "RyuUpdater/config.yaml"; + + //TEMP + public const string TEMP_DIRECTORY_NAME = "ShinRyuModManager"; + + //EVENTS + public const string EVENT_FOOLS24_FLAG_FILE_NAME = ".SRMM_FOOLS24_FLAG"; + + //LIBRARIES + public const string LIBRARIES_INFO_REPO_OWNER = "SRMM-Studio"; + public const string LIBRARIES_INFO_REPO = "srmm-lib-info"; + public const string LIBRARIES_INFO_REPO_FILE_PATH = "libraries.yaml"; + public const string LIBRARIES_LIBMETA_FILE_NAME = "lib-meta.yaml"; + + //LOGGING + public const string LOGS_BASE_PATH = "srmm-logs"; } diff --git a/Utils/Game.cs b/Utils/Game.cs index 05fdb2e..95d5ac5 100644 --- a/Utils/Game.cs +++ b/Utils/Game.cs @@ -1,4 +1,5 @@ namespace Utils { + // ReSharper disable InconsistentNaming public enum Game { Unsupported = -1, diff --git a/Utils/GamePath.cs b/Utils/GamePath.cs index 3e544b1..a4be2cf 100644 --- a/Utils/GamePath.cs +++ b/Utils/GamePath.cs @@ -15,6 +15,7 @@ public static class GamePath { public static string ParlessDir { get; } public static string ExternalModsPath { get; } public static string LibrariesPath { get; } + public static string LocalLibrariesPath { get; } public static string GameExe { get; } static GamePath() { @@ -24,6 +25,7 @@ static GamePath() { ParlessDir = Path.Combine(ModsPath, "Parless"); ExternalModsPath = Path.Combine(ModsPath, Constants.EXTERNAL_MODS); LibrariesPath = Path.Combine(FullGamePath, LIBRARIES); + LocalLibrariesPath = Path.Combine(GamePath.LibrariesPath, Constants.LIBRARIES_INFO_REPO_FILE_PATH); // Try to get game foreach (var file in Directory.GetFiles(FullGamePath, "*.exe")) { @@ -41,10 +43,14 @@ public static string GetBasename(string path) { return Path.GetFileName(path.TrimEnd(Path.DirectorySeparatorChar)); } - /// - /// - /// - /// + public static string GetModDirectory(string mod) { + return Path.Combine(ModsPath, mod); + } + + public static string GetLibraryPath(string guid) { + return Path.Combine(LibrariesPath, guid); + } + /// Given path but starting after /mods/ModName/ public static string RemoveModPath(string path) { var modsPos = path.IndexOf("mods" + Path.DirectorySeparatorChar, StringComparison.Ordinal); @@ -204,8 +210,8 @@ private static bool IsSteamInstalledLinux() { return potentialLocations.Any(Directory.Exists); } - public static string GetGameFriendlyName(Game g) { - return g switch { + public static string GetGameFriendlyName(Game game) { + return game switch { Game.Yakuza0 => "Yakuza 0", Game.Yakuza0_DC => "Yakuza 0: Director's Cut", Game.YakuzaKiwami => "Yakuza Kiwami",