Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        /// <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);
        }
Beispiel #3
0
 /// <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);
     }
 }
Beispiel #4
0
 /// <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));
 }
Beispiel #5
0
        /// <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);
            }
        }
Beispiel #6
0
        /// <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);
            }
        }
Beispiel #7
0
 /// <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));
 }
Beispiel #8
0
 /// <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);
Beispiel #9
0
 /// <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);