diff --git a/DiscordBotCore.PluginManagement.Loading/PluginLoader.cs b/DiscordBotCore.PluginManagement.Loading/PluginLoader.cs index 542b730..76e80d0 100644 --- a/DiscordBotCore.PluginManagement.Loading/PluginLoader.cs +++ b/DiscordBotCore.PluginManagement.Loading/PluginLoader.cs @@ -111,7 +111,7 @@ public class PluginLoader : IPluginLoader var files = installedPlugins.Where(plugin => plugin.IsEnabled).Select(plugin => plugin.FilePath); - PluginLoaderContext = new PluginLoaderContext("PluginLoader"); + PluginLoaderContext = new PluginLoaderContext(_Logger, "PluginLoader"); foreach (var file in files) { diff --git a/DiscordBotCore.PluginManagement.Loading/PluginLoaderContext.cs b/DiscordBotCore.PluginManagement.Loading/PluginLoaderContext.cs index dab6ea2..238921a 100644 --- a/DiscordBotCore.PluginManagement.Loading/PluginLoaderContext.cs +++ b/DiscordBotCore.PluginManagement.Loading/PluginLoaderContext.cs @@ -1,15 +1,21 @@ using System.Reflection; using System.Runtime.Loader; +using DiscordBotCore.Logging; namespace DiscordBotCore.PluginManagement.Loading; public class PluginLoaderContext : AssemblyLoadContext { - public PluginLoaderContext(string name) : base(name: name, isCollectible: true) {} + private readonly ILogger _logger; + + public PluginLoaderContext(ILogger logger, string name) : base(name: name, isCollectible: true) + { + _logger = logger; + } protected override Assembly? Load(AssemblyName assemblyName) { - + _logger.Log("Assembly load requested: " + assemblyName.Name, this); return base.Load(assemblyName); } } \ No newline at end of file diff --git a/DiscordBotCore.PluginManagement/Helpers/PluginRepository.cs b/DiscordBotCore.PluginManagement/Helpers/PluginRepository.cs index 63c97fe..08c2142 100644 --- a/DiscordBotCore.PluginManagement/Helpers/PluginRepository.cs +++ b/DiscordBotCore.PluginManagement/Helpers/PluginRepository.cs @@ -136,7 +136,8 @@ public class PluginRepository : IPluginRepository List dependencies = await JsonManager.ConvertFromJson>(content); return dependencies; - }catch(HttpRequestException exception) + } + catch(HttpRequestException exception) { _logger.LogException(exception, this); return []; diff --git a/DiscordBotCore.PluginManagement/IPluginManager.cs b/DiscordBotCore.PluginManagement/IPluginManager.cs index 05fb7e7..d07a0da 100644 --- a/DiscordBotCore.PluginManagement/IPluginManager.cs +++ b/DiscordBotCore.PluginManagement/IPluginManager.cs @@ -10,11 +10,11 @@ public interface IPluginManager Task AppendPluginToDatabase(LocalPlugin pluginData); Task> GetInstalledPlugins(); Task IsPluginInstalled(string pluginName); - Task MarkPluginToUninstall(string pluginName); - Task UninstallMarkedPlugins(); Task GetDependencyLocation(string dependencyName); Task GetDependencyLocation(string dependencyName, string pluginName); string GenerateDependencyRelativePath(string pluginName, string dependencyPath); Task InstallPlugin(OnlinePlugin plugin, IProgress progress); Task SetEnabledStatus(string pluginName, bool status); + Task UninstallPluginByName(string pluginName); + Task GetLocalPluginByName(string pluginName); } \ No newline at end of file diff --git a/DiscordBotCore.PluginManagement/Models/LocalPlugin.cs b/DiscordBotCore.PluginManagement/Models/LocalPlugin.cs index 6fa03d8..7ec78d2 100644 --- a/DiscordBotCore.PluginManagement/Models/LocalPlugin.cs +++ b/DiscordBotCore.PluginManagement/Models/LocalPlugin.cs @@ -8,17 +8,15 @@ public class LocalPlugin public string PluginVersion { get; private set; } public string FilePath { get; private set; } public Dictionary ListOfExecutableDependencies {get; private set;} - public bool IsMarkedToUninstall {get; internal set;} public bool IsOfflineAdded { get; internal set; } public bool IsEnabled { get; internal set; } [JsonConstructor] - public LocalPlugin(string pluginName, string pluginVersion, string filePath, Dictionary listOfExecutableDependencies, bool isMarkedToUninstall, bool isOfflineAdded, bool isEnabled) + public LocalPlugin(string pluginName, string pluginVersion, string filePath, Dictionary listOfExecutableDependencies, bool isOfflineAdded, bool isEnabled) { PluginName = pluginName; PluginVersion = pluginVersion; ListOfExecutableDependencies = listOfExecutableDependencies; - IsMarkedToUninstall = isMarkedToUninstall; FilePath = filePath; IsOfflineAdded = isOfflineAdded; IsEnabled = isEnabled; @@ -30,7 +28,6 @@ public class LocalPlugin PluginName = pluginName; PluginVersion = pluginVersion; ListOfExecutableDependencies = listOfExecutableDependencies; - IsMarkedToUninstall = false; FilePath = filePath; IsOfflineAdded = false; IsEnabled = true; diff --git a/DiscordBotCore.PluginManagement/PluginManager.cs b/DiscordBotCore.PluginManagement/PluginManager.cs index c818743..b104cfa 100644 --- a/DiscordBotCore.PluginManagement/PluginManager.cs +++ b/DiscordBotCore.PluginManagement/PluginManager.cs @@ -127,48 +127,6 @@ public sealed class PluginManager : IPluginManager return installedPlugins.Any(plugin => plugin.PluginName == pluginName); } - public async Task MarkPluginToUninstall(string pluginName) - { - List installedPlugins = await GetInstalledPlugins(); - List info = installedPlugins.Where(info => info.PluginName == pluginName).ToList(); - - if (!info.Any()) - return false; - - foreach (var item in info) - { - await RemovePluginFromDatabase(item.PluginName); - item.IsMarkedToUninstall = true; - await AppendPluginToDatabase(item); - } - - return true; - } - - public async Task UninstallMarkedPlugins() - { - IEnumerable installedPlugins = (await GetInstalledPlugins()).AsEnumerable(); - IEnumerable pluginsToRemove = installedPlugins.Where(plugin => plugin.IsMarkedToUninstall).AsEnumerable(); - - foreach (var plugin in pluginsToRemove) - { - await UninstallPlugin(plugin); - } - } - - private async Task UninstallPlugin(LocalPlugin LocalPlugin) - { - File.Delete(LocalPlugin.FilePath); - - foreach (var dependency in LocalPlugin.ListOfExecutableDependencies) - File.Delete(dependency.Value); - - await RemovePluginFromDatabase(LocalPlugin.PluginName); - - if (Directory.Exists($"{_LibrariesBaseFolder}/{LocalPlugin.PluginName}")) - Directory.Delete($"{_LibrariesBaseFolder}/{LocalPlugin.PluginName}", true); - } - public async Task GetDependencyLocation(string dependencyName) { List installedPlugins = await GetInstalledPlugins(); @@ -255,6 +213,45 @@ public sealed class PluginManager : IPluginManager } + public async Task UninstallPluginByName(string pluginName) + { + var localPlugin = await GetLocalPluginByName(pluginName); + if (localPlugin == null) + { + return false; + } + + File.Delete(localPlugin.FilePath); + + if (Directory.Exists($"./{_LibrariesBaseFolder}/{pluginName}")) + { + foreach (var file in Directory.EnumerateFiles($"./{_LibrariesBaseFolder}/{pluginName}")) + { + File.Delete(file); + } + } + + await RemovePluginFromDatabase(pluginName); + + _Logger.Log($"Plugin {pluginName} uninstalled successfully", this, LogType.Info); + + return true; + } + + public async Task GetLocalPluginByName(string pluginName) + { + List installedPlugins = await GetInstalledPlugins(); + var plugin = installedPlugins.Find(p => p.PluginName == pluginName); + + if (plugin == null) + { + _Logger.Log($"Plugin {pluginName} not found in the database", this, LogType.Warning); + return null; + } + + return plugin; + } + private async Task CreateEmptyPluginDatabase() { string ? pluginDatabaseFile = _Configuration.Get("PluginDatabase"); diff --git a/WebUI/Components/Pages/Plugins/Local.razor b/WebUI/Components/Pages/Plugins/Local.razor index 7ec63e7..c692f0d 100644 --- a/WebUI/Components/Pages/Plugins/Local.razor +++ b/WebUI/Components/Pages/Plugins/Local.razor @@ -3,6 +3,7 @@ @using DiscordBotCore.Logging @using DiscordBotCore.PluginManagement +@using DiscordBotCore.PluginManagement.Loading @using DiscordBotCore.PluginManagement.Models

Installed Plugins

@@ -60,6 +61,9 @@ [Inject] public ILogger Logger { get; set; } + + [Inject] + public IPluginLoader PluginLoader { get; set; } private readonly List _installedPlugins = new List(); @@ -68,9 +72,14 @@ private async Task DeletePluginButtonClick(string pluginName) { + + //TODO: Unload the plugin + + PluginLoader.UnloadAllPlugins(); + Logger.Log($"Deleting plugin {pluginName}", this); - bool result = await PluginManager.MarkPluginToUninstall(pluginName); + bool result = await PluginManager.UninstallPluginByName(pluginName); if (!result) { @@ -80,6 +89,9 @@ _installedPlugins.RemoveAll(p => p.Name == pluginName); Logger.Log($"Plugin {pluginName} deleted", this); + + await PluginLoader.LoadPlugins(); + StateHasChanged(); }