From 2bf6281639789033d21f1563652e8076ac9d494d Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Mon, 28 Mar 2022 09:32:03 +0100 Subject: [PATCH] Unload plugin dependants --- BrackeysBot.API | 2 +- BrackeysBot/Plugins/SimplePluginManager.cs | 20 ++++++++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/BrackeysBot.API b/BrackeysBot.API index 3574b02..7e8821e 160000 --- a/BrackeysBot.API +++ b/BrackeysBot.API @@ -1 +1 @@ -Subproject commit 3574b029511228ffe740ff430e0304ca849fa9f2 +Subproject commit 7e8821ea37789ec74f13ae6374cd10fd0de5fd82 diff --git a/BrackeysBot/Plugins/SimplePluginManager.cs b/BrackeysBot/Plugins/SimplePluginManager.cs index 33d5a86..1a6dd67 100644 --- a/BrackeysBot/Plugins/SimplePluginManager.cs +++ b/BrackeysBot/Plugins/SimplePluginManager.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.IO; @@ -203,17 +203,19 @@ public IPlugin LoadPlugin(string name) var descriptionAttribute = pluginType.GetCustomAttribute(); string? description = descriptionAttribute?.Description; - IEnumerable dependencies = EnumeratePluginDependencies(pluginType); + IPlugin[] dependencies = EnumeratePluginDependencies(pluginType).ToArray(); PluginInfo.PluginAuthorInfo? authorInfo = GetPluginAuthorInfo(pluginType); var pluginInfo = new PluginInfo(name, version, description, authorInfo, dependencies.Select(d => d.PluginInfo).ToArray()); if (Activator.CreateInstance(pluginType) is not MonoPlugin instance) throw new InvalidPluginException(name, ExceptionMessages.NoDerivationOfPluginClass); + instance.Dependencies = dependencies.ToArray(); // defensive copy instance.LoadContext = context; instance.PluginInfo = pluginInfo; instance.PluginManager = this; instance.Logger = LogManager.GetLogger(pluginInfo.Name); + UpdatePluginDependants(instance); SetupPluginDataDirectory(pluginInfo, instance); SetupPluginConfiguration(instance); SetupPluginServices(instance, pluginInfo, pluginType); @@ -302,6 +304,9 @@ public void UnloadPlugin(IPlugin plugin) DisablePlugin(plugin); + foreach (IPlugin dependant in plugin.Dependants) + UnloadPlugin(dependant); + try { monoPlugin.OnUnload().GetAwaiter().GetResult(); @@ -512,4 +517,15 @@ private void SetupPluginServices(MonoPlugin instance, PluginInfo pluginInfo, Typ instance.ConfigureServices(serviceCollection); instance.ServiceProvider = serviceCollection.BuildServiceProvider(); } + + private static void UpdatePluginDependants(IPlugin instance) + { + foreach (MonoPlugin dependency in instance.Dependencies.OfType()) + { + if (dependency.Dependants.Contains(instance)) continue; + + var dependants = new List(dependency.Dependants) {instance}; + dependency.Dependants = dependants.ToArray(); + } + } }