using System; using System.IO; using System.Collections.Generic; using System.Reflection; using SharedLibraryCore.Interfaces; using System.Linq; namespace SharedLibraryCore.Plugins { public class PluginImporter { public static List ActiveCommands = new List(); public static List ActivePlugins = new List(); public static List PluginAssemblies = new List(); public static bool Load(IManager Manager) { string pluginDir = $"{Utilities.OperatingDirectory}Plugins{Path.DirectorySeparatorChar}"; string[] dllFileNames = null; string[] scriptFileNames = null; if (Directory.Exists(pluginDir)) { dllFileNames = Directory.GetFiles($"{Utilities.OperatingDirectory}Plugins{Path.DirectorySeparatorChar}", "*.dll"); scriptFileNames = Directory.GetFiles($"{Utilities.OperatingDirectory}Plugins{Path.DirectorySeparatorChar}", "*.js"); } else { dllFileNames = new string[0]; scriptFileNames = new string[0]; } if (dllFileNames.Length == 0 && scriptFileNames.Length == 0) { Manager.GetLogger().WriteDebug(Utilities.CurrentLocalization.LocalizationIndex["PLUGIN_IMPORTER_NOTFOUND"]); return true; } // load up the script plugins foreach (string fileName in scriptFileNames) { var plugin = new ScriptPlugin(fileName); plugin.Initialize(Manager).Wait(); Manager.GetLogger().WriteDebug($"Loaded script plugin \"{ plugin.Name }\" [{plugin.Version}]"); ActivePlugins.Add(plugin); } ICollection assemblies = new List(dllFileNames.Length); foreach (string dllFile in dllFileNames) { assemblies.Add(Assembly.LoadFrom(dllFile)); } int LoadedCommands = 0; foreach (Assembly Plugin in assemblies) { if (Plugin != null) { Type[] types = Plugin.GetTypes(); foreach (Type assemblyType in types) { if (assemblyType.IsClass && assemblyType.BaseType.Name == "Command") { Object commandObject = Activator.CreateInstance(assemblyType); Command newCommand = (Command)commandObject; ActiveCommands.Add(newCommand); Manager.GetLogger().WriteDebug($"{Utilities.CurrentLocalization.LocalizationIndex["PLUGIN_IMPORTER_REGISTERCMD"]} \"{newCommand.Name}\""); LoadedCommands++; continue; } try { if (assemblyType.GetInterface("IPlugin", false) == null) continue; Object notifyObject = Activator.CreateInstance(assemblyType); IPlugin newNotify = (IPlugin)notifyObject; if (ActivePlugins.Find(x => x.Name == newNotify.Name) == null) { ActivePlugins.Add(newNotify); PluginAssemblies.Add(Plugin); Manager.GetLogger().WriteDebug($"Loaded plugin \"{ newNotify.Name }\" [{newNotify.Version}]"); } } catch (Exception E) { Manager.GetLogger().WriteWarning($"{Utilities.CurrentLocalization.LocalizationIndex["PLUGIN_IMPORTER_ERROR"]} {Plugin.Location} - {E.Message}"); } } } } Manager.GetLogger().WriteInfo($"Loaded {ActivePlugins.Count} plugins and registered {LoadedCommands} commands."); return true; } } }