public void Init(IPA.Logging.Logger log) { if (_init) { return; } _init = true; logger = log; harmonyInstance = HarmonyInstance.Create("slaynash.discordpresence"); gameObject = Resources.FindObjectsOfTypeAll <MonoBehaviour>().First(c => c.GetType().Name == "PluginComponent"); try { logger.Info("Initializing"); logger.Info("Starting Discord RichPresence"); var handlers = new DiscordRpc.EventHandlers(); DiscordRpc.Initialize(DiscordAppID, ref handlers, false, string.Empty); logger.Info("Fetching nonpublic fields"); _gameplayCoreSceneSetupDataField = typeof(SceneSetup <GameplayCoreSceneSetupData>).GetField("_sceneSetupData", BindingFlags.NonPublic | BindingFlags.Instance); _oneColorBeatmapCharacteristic = typeof(GameplayCoreSceneSetup).GetField("_oneColorBeatmapCharacteristic", BindingFlags.NonPublic | BindingFlags.Instance); #if DEBUG logger.Debug("Discord Presence - Field SceneSetup<GameplayCoreSceneSetupData>._sceneSetupData: " + _gameplayCoreSceneSetupDataField); #endif if (_gameplayCoreSceneSetupDataField == null) { logger.Error("Unable to fetch SceneSetup<GameplayCoreSceneSetupData>._sceneSetupData"); return; } logger.Info("Init done !"); } catch (Exception e) { logger.Error("Unable to initialize plugin:\n" + e); } }
/// <summary> /// Initializes the plugin with certain parameters. Is only called once. /// /// This is called by the plugin loader in BSIPA, and thus must be <see langword="public"/>. /// </summary> /// <param name="logger">a logger to initialize the plugin with</param> public void Init(IPALogger logger, IConfigProvider provider) { Logger.log = logger; Plugin.provider = provider; config = provider.MakeLink <SelfConfig>((p, r) => { if (r.Value.Regenerate) { p.Store(r.Value = new SelfConfig { Regenerate = false }); } OnConfigChaned?.Invoke(r.Value); }); IPA.Updating.BeatMods.Updater.ModListPresent = true; // Load resources ahead of time MarkdownView.StartLoadResourcesAsync(); SharedCoroutineStarter.instance.StartCoroutine(LoadPluginIcons()); }
public HueManager(Logger log, IModPrefs prefs) { this.log = log; this.prefs = prefs; }
private static Tuple <IEnumerable <PluginInfo>, IEnumerable <IPlugin> > LoadPluginsFromFile(string file, string exeName) { List <PluginInfo> bsPlugins = new List <PluginInfo>(); List <IPlugin> ipaPlugins = new List <IPlugin>(); if (!File.Exists(file) || !file.EndsWith(".dll", true, null)) { return(new Tuple <IEnumerable <PluginInfo>, 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.loader.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(); Logger modLogger = null; IModPrefs modPrefs = null; IConfigProvider cfgProvider = null; foreach (var param in initParams) { var ptype = param.ParameterType; if (ptype.IsAssignableFrom(typeof(Logger))) { 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 if (ptype.IsAssignableFrom(typeof(IConfigProvider))) { if (cfgProvider == null) { cfgProvider = new JsonConfigProvider { Filename = Path.Combine("UserData", $"{bsPlugin.Name}") }; configProviders.Add(new KeyValuePair <IConfigProvider, Ref <DateTime> >(cfgProvider, new Ref <DateTime>(cfgProvider.LastModified))); cfgProvider.Load(); } initArgs.Add(cfgProvider); } else { initArgs.Add(ptype.GetDefault()); } } init.Invoke(bsPlugin, initArgs.ToArray()); } bsPlugins.Add(new PluginInfo { Plugin = bsPlugin, Filename = file.Replace("\\.cache", ""), // quick and dirty fix ModSaberInfo = bsPlugin.ModInfo }); } catch (AmbiguousMatchException) { Logger.loader.Error("Only one Init allowed per plugin"); } } else { IPlugin ipaPlugin = OptionalGetPlugin <IPlugin>(t); if (ipaPlugin != null) { ipaPlugins.Add(ipaPlugin); } } } } catch (Exception e) { Logger.loader.Error($"Could not load {Path.GetFileName(file)}! {e}"); } return(new Tuple <IEnumerable <PluginInfo>, IEnumerable <IPlugin> >(bsPlugins, ipaPlugins)); }
public void Init(IPA.Logging.Logger logger) { Logger = logger; }
public ModListPlugin(IPALogger logger, Config.Config config) { Logger.log = logger; ModListConfig.Instance = config.Generated <ModListConfig>(); menuBtn = new MenuButton(CompileConstants.Manifest.Name, PresentModList); }
public Plugin(IPA.Logging.Logger logger) { Log = logger; }
public void Init(IPALogger logger) { Logger.log = logger; IPA.Updating.BeatMods.Updater.ModListPresent = true; }