public bool PluginLoaded(Plugin plugin) { plugin.OnError += plugin_OnError; // Log plugin loaded LogInfo("Loaded plugin {0} v{1} by {2}", plugin.Title, plugin.Version, plugin.Author); try { plugin.Loader?.PluginErrors.Remove(plugin.Name); RootPluginManager.AddPlugin(plugin); if (plugin.Loader != null) { if (plugin.Loader.PluginErrors.ContainsKey(plugin.Name)) { UnloadPlugin(plugin.Name); return(false); } } plugin.IsLoaded = true; CallHook("OnPluginLoaded", plugin); return(true); } catch (Exception ex) { if (plugin.Loader != null) { plugin.Loader.PluginErrors[plugin.Name] = ex.Message; } LogException($"Failed to initialize plugin '{plugin.Name} v{plugin.Version}'", ex); return(false); } }
/// <summary> /// Unloads the plugin by the given name /// </summary> /// <param name="name"></param> public bool UnloadPlugin(string name) { // Get the plugin var plugin = RootPluginManager.GetPlugin(name); if (plugin == null) { return(false); } // Let the plugin loader know that this plugin is being unloaded var loader = extensionManager.GetPluginLoaders().SingleOrDefault(l => l.LoadedPlugins.ContainsKey(name)); loader?.Unloading(plugin); // Unload it RootPluginManager.RemovePlugin(plugin); // Let other plugins know that this plugin has been unloaded if (plugin.IsLoaded) { CallHook("OnPluginUnloaded", plugin); } plugin.IsLoaded = false; LogInfo("Unloaded plugin {0} v{1} by {2}", plugin.Title, plugin.Version, plugin.Author); return(true); }
/// <summary> /// Reloads all plugins /// </summary> public void ReloadAllPlugins(IList <string> skip = null) { foreach (var plugin in RootPluginManager.GetPlugins().Where(p => !p.IsCorePlugin && (skip == null || !skip.Contains(p.Name))).ToArray()) { ReloadPlugin(plugin.Name); } }
/// <summary> /// Calls a deprecated hook and print a warning /// </summary> /// <param name="hookname"></param> /// <param name="args"></param> /// <returns></returns> public object CallDeprecatedHook(string hookname, params object[] args) { if (RootPluginManager == null) { return(null); } return(RootPluginManager.CallDeprecatedHook(hookname, args)); }
/// <summary> /// Loads a plugin by the given name /// </summary> /// <param name="name"></param> public bool LoadPlugin(string name) { // Check if the plugin is already loaded if (RootPluginManager.GetPlugin(name) != null) { return(false); } // Find all plugin loaders that lay claim to the name HashSet <PluginLoader> loaders = new HashSet <PluginLoader>(extensionManager.GetPluginLoaders().Where(l => l.ScanDirectory(PluginDirectory).Contains(name))); if (loaders.Count == 0) { // TODO: Fix symlinked plugins unloaded still triggering this LogError("Could not load plugin '{0}' (no plugin found with that file name)", name); return(false); } if (loaders.Count > 1) { LogError("Could not load plugin '{0}' (multiple plugin with that name)", name); return(false); } // Load it and watch for errors PluginLoader loader = loaders.First(); try { Plugin plugin = loader.Load(PluginDirectory, name); if (plugin == null) { return(true); // Async load } plugin.Loader = loader; PluginLoaded(plugin); return(true); } catch (Exception ex) { LogException($"Could not load plugin {name}", ex); return(false); } }
/// <summary> /// Loads a plugin by the given name /// </summary> /// <param name="name"></param> public bool LoadPlugin(string name) { // Check if the plugin is already loaded if (RootPluginManager.GetPlugin(name) != null) { return(false); } // Find all plugin loaders that lay claim to the name var loaders = new HashSet <PluginLoader>(extensionManager.GetPluginLoaders().Where(l => l.ScanDirectory(PluginDirectory).Contains(name))); if (loaders.Count == 0) { LogError("Failed to load plugin '{0}' (no source found)", name); return(false); } if (loaders.Count > 1) { LogError("Failed to load plugin '{0}' (multiple sources found)", name); return(false); } // Load it and watch for errors var loader = loaders.First(); try { var plugin = loader.Load(PluginDirectory, name); if (plugin == null) { return(true); // Async load } plugin.Loader = loader; PluginLoaded(plugin); return(true); } catch (Exception ex) { LogException($"Failed to load plugin {name}", ex); return(false); } }
/// <summary> /// Calls a deprecated hook and prints a warning /// </summary> /// <param name="oldHook"></param> /// <param name="newHook"></param> /// <param name="expireDate"></param> /// <param name="args"></param> /// <returns></returns> public object CallDeprecatedHook(string oldHook, string newHook, DateTime expireDate, params object[] args) { return(RootPluginManager?.CallDeprecatedHook(oldHook, newHook, expireDate, args)); }
/// <summary> /// Calls a hook /// </summary> /// <param name="hookname"></param> /// <param name="args"></param> /// <returns></returns> public object CallHook(string hookname, params object[] args) => RootPluginManager?.CallHook(hookname, args);
/// <summary> /// Calls a deprecated hook and prints a warning /// </summary> /// <param name="hookname"></param> /// <param name="newname"></param> /// <param name="expireDate"></param> /// <param name="args"></param> /// <returns></returns> public object CallDeprecatedHook(string hookname, string newname, DateTime expireDate, params object[] args) => RootPluginManager?.CallDeprecatedHook(hookname, newname, expireDate, args);