diff --git a/src/Commands/CommandOpenMod.cs b/src/Commands/CommandOpenMod.cs index fcd2f70..275a87a 100644 --- a/src/Commands/CommandOpenMod.cs +++ b/src/Commands/CommandOpenMod.cs @@ -80,6 +80,7 @@ private void OnCommandWindowInputted(string text, ref bool shouldExecuteCommand) try { + Logger.Log($"Choice {text}"); s_CurrentStep.OnChoice(text); s_CurrentStep = GetNextStep(); @@ -200,7 +201,11 @@ private CommandStep GetNextStep() public string Name { get; } = "openmod"; public string Help { get; } = "Installs OpenMod"; public string Syntax { get; } = "install"; - public List Aliases { get; } = new List(); + + public List Aliases { get; } = new() + { + "om" + }; public List Permissions { get; } = new List(); } } \ No newline at end of file diff --git a/src/Helpers/NuGetHelper.cs b/src/Helpers/NuGetHelper.cs index 6558728..13621e8 100644 --- a/src/Helpers/NuGetHelper.cs +++ b/src/Helpers/NuGetHelper.cs @@ -1,19 +1,19 @@ -using OpenMod.Installer.RocketMod.Jobs; -using OpenMod.NuGet; -using System; +using System; using System.IO; +using System.Linq; +using OpenMod.Installer.RocketMod.Helpers.Wrapper; namespace OpenMod.Installer.RocketMod.Helpers { public static class NuGetHelper { - private static NuGetPackageManager s_NuGetPackageManager; + private static NuGetPackageManagerWrapper s_NuGetPackageManagerWrapper; - public static NuGetPackageManager GetNuGetPackageManager() + public static NuGetPackageManagerWrapper GetNuGetPackageManager() { - if (s_NuGetPackageManager != null) + if (s_NuGetPackageManagerWrapper != null) { - return s_NuGetPackageManager; + return s_NuGetPackageManagerWrapper; } var workingDirectory = OpenModInstallerPlugin.Instance.OpenModManager.WorkingDirectory; @@ -26,12 +26,14 @@ public static NuGetPackageManager GetNuGetPackageManager() Environment.SetEnvironmentVariable("NUGET_COMMON_APPLICATION_DATA", packagesPath); - s_NuGetPackageManager = new NuGetPackageManager(packagesPath) - { - Logger = new NuGetConsoleLogger() - }; + var nugetAssembly = AppDomain.CurrentDomain.GetAssemblies().First(a => a.GetName().Name.Equals("OpenMod.Nuget", StringComparison.OrdinalIgnoreCase)); + + s_NuGetPackageManagerWrapper = new NuGetPackageManagerWrapper(nugetAssembly, packagesPath); + + var logger = new NuGetConsoleLoggerWrapper(nugetAssembly); + s_NuGetPackageManagerWrapper.SetLogger(logger); - s_NuGetPackageManager.IgnoreDependencies( + s_NuGetPackageManagerWrapper.IgnoreDependencies( "Microsoft.NETCore.Platforms", "Microsoft.Packaging.Tools", "NETStandard.Library", @@ -39,7 +41,7 @@ public static NuGetPackageManager GetNuGetPackageManager() "OpenMod.UnityEngine.Redist",*/ // todo "System.IO.FileSystem.Watcher"); - return s_NuGetPackageManager; + return s_NuGetPackageManagerWrapper; } } } diff --git a/src/Helpers/Wrapper/NuGetConsoleLoggerWrapper.cs b/src/Helpers/Wrapper/NuGetConsoleLoggerWrapper.cs new file mode 100644 index 0000000..70068e9 --- /dev/null +++ b/src/Helpers/Wrapper/NuGetConsoleLoggerWrapper.cs @@ -0,0 +1,10 @@ +using System.Reflection; + +namespace OpenMod.Installer.RocketMod.Helpers.Wrapper +{ + public class NuGetConsoleLoggerWrapper : TypeWrapper + { + public NuGetConsoleLoggerWrapper(Assembly nugetAssembly) : base(nugetAssembly, "NuGetConsoleLogger") + { } + } +} \ No newline at end of file diff --git a/src/Helpers/Wrapper/NuGetPackageManagerWrapper.cs b/src/Helpers/Wrapper/NuGetPackageManagerWrapper.cs new file mode 100644 index 0000000..71284bd --- /dev/null +++ b/src/Helpers/Wrapper/NuGetPackageManagerWrapper.cs @@ -0,0 +1,54 @@ +using System.Reflection; +using System.Threading.Tasks; + +namespace OpenMod.Installer.RocketMod.Helpers.Wrapper +{ + public class NuGetPackageManagerWrapper : TypeWrapper + { + protected static PropertyInfo m_Logger; + protected static MethodInfo m_IgnoreDependencies; + protected static MethodInfo m_GetLatestPackageIdentityAsync; + protected static MethodInfo m_QueryPackageExactAsync; + protected static MethodInfo m_InstallAsync; + + public NuGetPackageManagerWrapper(Assembly nugetAssembly, params object[] args) : base(nugetAssembly, "NuGetPackageManager", args) + { + m_Logger ??= s_Type.GetProperty("Logger"); + m_IgnoreDependencies ??= s_Type.GetMethod("IgnoreDependencies"); + m_GetLatestPackageIdentityAsync ??= s_Type.GetMethod("GetLatestPackageIdentityAsync"); + m_QueryPackageExactAsync ??= s_Type.GetMethod("QueryPackageExactAsync"); + m_InstallAsync ??= s_Type.GetMethod("InstallAsync"); + } + + public void SetLogger(NuGetConsoleLoggerWrapper logger) + { + m_Logger.SetValue(m_Instance, logger.Instance); + } + + public void IgnoreDependencies(params string[] packageIds) + { + m_IgnoreDependencies.Invoke(m_Instance, new object[] { packageIds }); + } + + public async Task GetLatestPackageIdentityAsync(string packageId) + { + var taskObj = m_GetLatestPackageIdentityAsync.Invoke(m_Instance, new object[] { packageId }) as Task; + var taskWrapper = new TaskWrapper(taskObj); + return await taskWrapper.GetResult(); + } + + public async Task QueryPackageExactAsync(string packageId, string version = null, bool includePreRelease = false) + { + var taskObj = m_QueryPackageExactAsync.Invoke(m_Instance, new object[] { packageId, version, includePreRelease }) as Task; + var taskWrapper = new TaskWrapper(taskObj); + return await taskWrapper.GetResult(); + } + + public async Task InstallAsync(PackageIdentityWrapper packageIdentity, bool allowPreReleaseVersions = false) + { + var taskObj = m_InstallAsync.Invoke(m_Instance, new[] { packageIdentity.Instance, allowPreReleaseVersions }) as Task; + var taskWrapper = new TaskWrapper(taskObj); + return await taskWrapper.GetResult(); + } + } +} \ No newline at end of file diff --git a/src/Helpers/Wrapper/NuGetVersionWrapper.cs b/src/Helpers/Wrapper/NuGetVersionWrapper.cs new file mode 100644 index 0000000..6f22e5d --- /dev/null +++ b/src/Helpers/Wrapper/NuGetVersionWrapper.cs @@ -0,0 +1,8 @@ +namespace OpenMod.Installer.RocketMod.Helpers.Wrapper +{ + public class NuGetVersionWrapper : TypeWrapper + { + public NuGetVersionWrapper(object instance) : base(instance) + { } + } +} \ No newline at end of file diff --git a/src/Helpers/Wrapper/NugetWrapper.cs b/src/Helpers/Wrapper/NugetWrapper.cs new file mode 100644 index 0000000..a2951a2 --- /dev/null +++ b/src/Helpers/Wrapper/NugetWrapper.cs @@ -0,0 +1,16 @@ +using System.Reflection; + +namespace OpenMod.Installer.RocketMod.Helpers.Wrapper +{ + public class NuGetInstallResultWrapper : TypeWrapper + { + protected static PropertyInfo m_Code; + + public int Code => (int)m_Code.GetValue(m_Instance); + + public NuGetInstallResultWrapper(object instance) : base(instance) + { + m_Code = s_Type.GetProperty("Code"); + } + } +} diff --git a/src/Helpers/Wrapper/PackageIdentityWrapper.cs b/src/Helpers/Wrapper/PackageIdentityWrapper.cs new file mode 100644 index 0000000..c7d257b --- /dev/null +++ b/src/Helpers/Wrapper/PackageIdentityWrapper.cs @@ -0,0 +1,36 @@ +using System.Reflection; + +namespace OpenMod.Installer.RocketMod.Helpers.Wrapper +{ + public class PackageIdentityWrapper : TypeWrapper + { + protected static FieldInfo m_Id; + protected static FieldInfo m_Version; + + public string Id => m_Id.GetValue(m_Instance) as string; + + public bool HasVersion + { + get + { + var version = m_Version.GetValue(m_Instance); + return version != null; + } + } + + public NuGetVersionWrapper Version + { + get + { + var version = m_Version.GetValue(m_Instance); + return version == null ? null : new NuGetVersionWrapper(version); + } + } + + public PackageIdentityWrapper(object instance) : base(instance) + { + m_Id = s_Type.GetField("_id", BindingFlags.NonPublic | BindingFlags.Instance); + m_Version = s_Type.GetField("_version", BindingFlags.NonPublic | BindingFlags.Instance); + } + } +} \ No newline at end of file diff --git a/src/Helpers/Wrapper/PackageSearchMetadataWrapper.cs b/src/Helpers/Wrapper/PackageSearchMetadataWrapper.cs new file mode 100644 index 0000000..2aaf2c7 --- /dev/null +++ b/src/Helpers/Wrapper/PackageSearchMetadataWrapper.cs @@ -0,0 +1,23 @@ +using System.Reflection; + +namespace OpenMod.Installer.RocketMod.Helpers.Wrapper +{ + public class PackageSearchMetadataWrapper : TypeWrapper + { + protected static PropertyInfo m_Identity; + + public PackageIdentityWrapper Identity + { + get + { + var identity = m_Identity.GetValue(m_Instance); + return new PackageIdentityWrapper(identity); + } + } + + public PackageSearchMetadataWrapper(object instance) : base(instance) + { + m_Identity = s_Type.GetProperty("Identity"); + } + } +} \ No newline at end of file diff --git a/src/Helpers/Wrapper/TaskWrapper.cs b/src/Helpers/Wrapper/TaskWrapper.cs new file mode 100644 index 0000000..68e16aa --- /dev/null +++ b/src/Helpers/Wrapper/TaskWrapper.cs @@ -0,0 +1,33 @@ +using System; +using System.Reflection; +using System.Threading.Tasks; + +namespace OpenMod.Installer.RocketMod.Helpers.Wrapper +{ + public class TaskWrapper + { + protected PropertyInfo m_Result; + protected Task m_Instance; + + public Task Instance => m_Instance; + + public async Task GetResult() + { + await m_Instance; + + var resultObj = m_Result.GetValue(m_Instance); + return resultObj switch + { + null => default, + TResult result => result, + _ => (TResult)Activator.CreateInstance(typeof(TResult), resultObj) + }; + } + + public TaskWrapper(Task instance) + { + m_Instance = instance; + m_Result = instance.GetType().GetProperty("Result"); + } + } +} \ No newline at end of file diff --git a/src/Helpers/Wrapper/TypeWrapper.cs b/src/Helpers/Wrapper/TypeWrapper.cs new file mode 100644 index 0000000..89809e0 --- /dev/null +++ b/src/Helpers/Wrapper/TypeWrapper.cs @@ -0,0 +1,27 @@ +using System; +using System.Linq; +using System.Reflection; + +namespace OpenMod.Installer.RocketMod.Helpers.Wrapper +{ + public abstract class TypeWrapper + { + protected Type s_Type; + + protected object m_Instance; + + public object Instance => m_Instance; + + protected TypeWrapper(object instance) + { + m_Instance = instance; + s_Type = instance.GetType(); + } + + protected TypeWrapper(Assembly nugetAssembly, string typeName, params object[] args) + { + s_Type = nugetAssembly.GetTypes().First(tp => tp.Name.Equals(typeName, StringComparison.OrdinalIgnoreCase)); + m_Instance = Activator.CreateInstance(s_Type, args); + } + } +} \ No newline at end of file diff --git a/src/Jobs/MigrateEconomyJob.cs b/src/Jobs/MigrateEconomyJob.cs index 10b05dc..a5fbae4 100644 --- a/src/Jobs/MigrateEconomyJob.cs +++ b/src/Jobs/MigrateEconomyJob.cs @@ -23,7 +23,7 @@ public void ExecuteMigration(string[] args) { WorkingDirectory = openmodDirectory, LogOnChange = false - }, null, null); + }, null, null, null); if (!AsyncHelper.RunSync(() => dataStore.ExistsAsync("autoexec"))) { diff --git a/src/Jobs/MigratePermissionsJob.cs b/src/Jobs/MigratePermissionsJob.cs index 67609e6..e82c27d 100644 --- a/src/Jobs/MigratePermissionsJob.cs +++ b/src/Jobs/MigratePermissionsJob.cs @@ -87,7 +87,7 @@ public void ExecuteMigration(string[] args) WorkingDirectory = workingDirectory }; - var dataStore = new YamlDataStore(dataStoreParams, null, null); + var dataStore = new YamlDataStore(dataStoreParams, null, null, null); AsyncHelperEx.RunSync(() => dataStore.SaveAsync("roles", openmodRoles)); AsyncHelperEx.RunSync(() => dataStore.SaveAsync("users", openmodUsers)); diff --git a/src/Jobs/NuGetInstallJob.cs b/src/Jobs/NuGetInstallJob.cs index 1b8e196..5fe8b32 100644 --- a/src/Jobs/NuGetInstallJob.cs +++ b/src/Jobs/NuGetInstallJob.cs @@ -1,5 +1,5 @@ -using OpenMod.Installer.RocketMod.Helpers; -using OpenMod.NuGet; +using System; +using OpenMod.Installer.RocketMod.Helpers; using Rocket.Core.Logging; using System.IO; using System.Linq; @@ -37,7 +37,7 @@ private async Task DownloadPackage(bool force, bool usePre) var package = await nuGetPackageManager.QueryPackageExactAsync(m_PackageId, null, usePre); if (package?.Identity == null) { - Logger.LogError($"Downloading has failed for {m_PackageId}: {NuGetInstallCode.PackageOrVersionNotFound}"); + Logger.LogError($"Downloading has failed for {m_PackageId}: PackageOrVersionNotFound"); return; } @@ -50,7 +50,7 @@ private async Task DownloadPackage(bool force, bool usePre) var identity = package.Identity; var installResult = await nuGetPackageManager.InstallAsync(identity, usePre); - var isInstalled = installResult.Code == NuGetInstallCode.Success || installResult.Code == NuGetInstallCode.NoUpdatesFound; + var isInstalled = installResult.Code == 0 || installResult.Code == 1; if (isInstalled) { diff --git a/src/Jobs/OpenModAssemblyLoadJob.cs b/src/Jobs/OpenModAssemblyLoadJob.cs index 31837fe..dc9f308 100644 --- a/src/Jobs/OpenModAssemblyLoadJob.cs +++ b/src/Jobs/OpenModAssemblyLoadJob.cs @@ -45,9 +45,9 @@ public void ExecuteMigration(string[] args) } var moduleDirectory = OpenModInstallerPlugin.Instance.OpenModManager.ModuleDirectory; - foreach (var dllpath in Directory.GetFiles(moduleDirectory, "*.dll", SearchOption.TopDirectoryOnly)) + foreach (var dllPath in Directory.GetFiles(moduleDirectory, "*.dll", SearchOption.TopDirectoryOnly)) { - var asm = Assembly.Load(File.ReadAllBytes(dllpath)); + var asm = Assembly.Load(File.ReadAllBytes(dllPath)); var name = GetVersionIndependentName(asm.FullName); if (s_LoadedAssemblies.ContainsKey(name)) diff --git a/src/OpenMod.Installer.RocketMod.csproj b/src/OpenMod.Installer.RocketMod.csproj index 7d55981..24e2eb1 100644 --- a/src/OpenMod.Installer.RocketMod.csproj +++ b/src/OpenMod.Installer.RocketMod.csproj @@ -7,11 +7,10 @@ - - - - - + + + +