public void Init(Logger logger, IModPrefs prefs) { Log = logger; Prefs = prefs; hueManager = new HueManager(Log, Prefs); if (hueManager.Ready) { Log.Info("Found existing Hue connection..."); Task.Run(() => hueManager.Run(hueCts.Token), hueCts.Token); } }
private static Tuple <IEnumerable <BSPluginMeta>, IEnumerable <IPlugin> > LoadPluginsFromFile(string file, string exeName) { List <BSPluginMeta> bsPlugins = new List <BSPluginMeta>(); List <IPlugin> ipaPlugins = new List <IPlugin>(); if (!File.Exists(file) || !file.EndsWith(".dll", true, null)) { return(new Tuple <IEnumerable <BSPluginMeta>, IEnumerable <IPlugin> >(bsPlugins, ipaPlugins)); } T OptionalGetPlugin <T>(Type t) where T : class { // use typeof() to allow for easier renaming (in an ideal world this compiles to a string, but ¯\_(ツ)_/¯) if (t.GetInterface(typeof(T).Name) != null) { try { T pluginInstance = Activator.CreateInstance(t) as T; string[] filter = null; if (pluginInstance is IGenericEnhancedPlugin) { filter = ((IGenericEnhancedPlugin)pluginInstance).Filter; } if (filter == null || filter.Contains(exeName, StringComparer.OrdinalIgnoreCase)) { return(pluginInstance); } } catch (Exception e) { Logger.log.Error($"Could not load plugin {t.FullName} in {Path.GetFileName(file)}! {e}"); } } return(null); } try { Assembly assembly = Assembly.LoadFrom(file); foreach (Type t in assembly.GetTypes()) { IBeatSaberPlugin bsPlugin = OptionalGetPlugin <IBeatSaberPlugin>(t); if (bsPlugin != null) { try { var init = t.GetMethod("Init", BindingFlags.Instance | BindingFlags.Public); if (init != null) { var initArgs = new List <object>(); var initParams = init.GetParameters(); LoggerBase modLogger = null; IModPrefs modPrefs = null; foreach (var param in initParams) { var ptype = param.ParameterType; if (ptype.IsAssignableFrom(typeof(LoggerBase))) { if (modLogger == null) { modLogger = new StandardLogger(bsPlugin.Name); } initArgs.Add(modLogger); } else if (ptype.IsAssignableFrom(typeof(IModPrefs))) { if (modPrefs == null) { modPrefs = new ModPrefs(bsPlugin); } initArgs.Add(modPrefs); } else { initArgs.Add(ptype.GetDefault()); } } init.Invoke(bsPlugin, initArgs.ToArray()); } bsPlugins.Add(new BSPluginMeta { Plugin = bsPlugin, Filename = file.Replace("\\.cache", ""), // quick and dirty fix ModsaberInfo = bsPlugin.ModInfo }); } catch (AmbiguousMatchException) { Logger.log.Error($"Only one Init allowed per plugin"); } } else { IPlugin ipaPlugin = OptionalGetPlugin <IPlugin>(t); if (ipaPlugin != null) { ipaPlugins.Add(ipaPlugin); } } } } catch (Exception e) { Logger.log.Error($"Could not load {Path.GetFileName(file)}! {e}"); } return(new Tuple <IEnumerable <BSPluginMeta>, IEnumerable <IPlugin> >(bsPlugins, ipaPlugins)); }
public HueManager(Logger log, IModPrefs prefs) { this.log = log; this.prefs = prefs; }