From cc2f11f4e7d6de8a17fea37427d88c841c20cd7e Mon Sep 17 00:00:00 2001 From: Thorsten Sommer Date: Sun, 23 Mar 2025 10:55:33 +0100 Subject: [PATCH] Refactor PluginFactory to separate internal plugin management into a new file --- .../PluginSystem/PluginFactory.Internal.cs | 80 +++++++++++++++++++ .../Tools/PluginSystem/PluginFactory.cs | 78 +----------------- 2 files changed, 81 insertions(+), 77 deletions(-) create mode 100644 app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.Internal.cs diff --git a/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.Internal.cs b/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.Internal.cs new file mode 100644 index 00000000..22b4f5e7 --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.Internal.cs @@ -0,0 +1,80 @@ +using System.Reflection; + +using Microsoft.Extensions.FileProviders; + +namespace AIStudio.Tools.PluginSystem; + +public static partial class PluginFactory +{ + public static async Task EnsureInternalPlugins() + { + LOG.LogInformation("Start ensuring internal plugins."); + foreach (var plugin in Enum.GetValues()) + { + LOG.LogInformation($"Ensure plugin: {plugin}"); + await EnsurePlugin(plugin); + } + } + + private static async Task EnsurePlugin(InternalPlugin plugin) + { + try + { + #if DEBUG + var basePath = Path.Join(Environment.CurrentDirectory, "Plugins"); + var resourceFileProvider = new PhysicalFileProvider(basePath); + #else + var resourceFileProvider = new ManifestEmbeddedFileProvider(Assembly.GetAssembly(type: typeof(Program))!, "Plugins"); + #endif + + var metaData = plugin.MetaData(); + var mainResourcePath = $"{metaData.ResourcePath}/plugin.lua"; + var resourceInfo = resourceFileProvider.GetFileInfo(mainResourcePath); + + if(!resourceInfo.Exists) + { + LOG.LogError($"The plugin {plugin} does not exist. This should not happen, since the plugin is an integral part of AI Studio."); + return; + } + + // Ensure that the additional resources exist: + foreach (var content in resourceFileProvider.GetDirectoryContents(metaData.ResourcePath)) + { + if(content.IsDirectory) + { + LOG.LogError("The plugin contains a directory. This is not allowed."); + continue; + } + + await CopyPluginFile(content, metaData); + } + } + catch + { + LOG.LogError($"Was not able to ensure the plugin: {plugin}"); + } + } + + private static async Task CopyPluginFile(IFileInfo resourceInfo, InternalPluginData metaData) + { + await using var inputStream = resourceInfo.CreateReadStream(); + + var pluginsRoot = Path.Join(DATA_DIR, "plugins"); + var pluginTypeBasePath = Path.Join(pluginsRoot, metaData.Type.GetDirectory()); + + if (!Directory.Exists(pluginsRoot)) + Directory.CreateDirectory(pluginsRoot); + + if (!Directory.Exists(pluginTypeBasePath)) + Directory.CreateDirectory(pluginTypeBasePath); + + var pluginPath = Path.Join(pluginTypeBasePath, metaData.ResourceName); + if (!Directory.Exists(pluginPath)) + Directory.CreateDirectory(pluginPath); + + var pluginFilePath = Path.Join(pluginPath, resourceInfo.Name); + + await using var outputStream = File.Create(pluginFilePath); + await inputStream.CopyToAsync(outputStream); + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.cs b/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.cs index e20d80f4..24b83744 100644 --- a/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.cs +++ b/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.cs @@ -1,90 +1,14 @@ -using System.Reflection; - using AIStudio.Settings; using Lua; -using Microsoft.Extensions.FileProviders; - namespace AIStudio.Tools.PluginSystem; -public static class PluginFactory +public static partial class PluginFactory { private static readonly ILogger LOG = Program.LOGGER_FACTORY.CreateLogger("PluginFactory"); private static readonly string DATA_DIR = SettingsManager.DataDirectory!; - public static async Task EnsureInternalPlugins() - { - LOG.LogInformation("Start ensuring internal plugins."); - foreach (var plugin in Enum.GetValues()) - { - LOG.LogInformation($"Ensure plugin: {plugin}"); - await EnsurePlugin(plugin); - } - } - - private static async Task EnsurePlugin(InternalPlugin plugin) - { - try - { - #if DEBUG - var basePath = Path.Join(Environment.CurrentDirectory, "Plugins"); - var resourceFileProvider = new PhysicalFileProvider(basePath); - #else - var resourceFileProvider = new ManifestEmbeddedFileProvider(Assembly.GetAssembly(type: typeof(Program))!, "Plugins"); - #endif - - var metaData = plugin.MetaData(); - var mainResourcePath = $"{metaData.ResourcePath}/plugin.lua"; - var resourceInfo = resourceFileProvider.GetFileInfo(mainResourcePath); - - if(!resourceInfo.Exists) - { - LOG.LogError($"The plugin {plugin} does not exist. This should not happen, since the plugin is an integral part of AI Studio."); - return; - } - - // Ensure that the additional resources exist: - foreach (var content in resourceFileProvider.GetDirectoryContents(metaData.ResourcePath)) - { - if(content.IsDirectory) - { - LOG.LogError("The plugin contains a directory. This is not allowed."); - continue; - } - - await CopyPluginFile(content, metaData); - } - } - catch - { - LOG.LogError($"Was not able to ensure the plugin: {plugin}"); - } - } - - private static async Task CopyPluginFile(IFileInfo resourceInfo, InternalPluginData metaData) - { - await using var inputStream = resourceInfo.CreateReadStream(); - - var pluginsRoot = Path.Join(DATA_DIR, "plugins"); - var pluginTypeBasePath = Path.Join(pluginsRoot, metaData.Type.GetDirectory()); - - if (!Directory.Exists(pluginsRoot)) - Directory.CreateDirectory(pluginsRoot); - - if (!Directory.Exists(pluginTypeBasePath)) - Directory.CreateDirectory(pluginTypeBasePath); - - var pluginPath = Path.Join(pluginTypeBasePath, metaData.ResourceName); - if (!Directory.Exists(pluginPath)) - Directory.CreateDirectory(pluginPath); - - var pluginFilePath = Path.Join(pluginPath, resourceInfo.Name); - - await using var outputStream = File.Create(pluginFilePath); - await inputStream.CopyToAsync(outputStream); - } - public static async Task LoadAll() {