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);
            }
        }
Esempio n. 2
0
        /// <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());
        }
Esempio n. 3
0
 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));
        }
Esempio n. 5
0
 public void Init(IPA.Logging.Logger logger)
 {
     Logger = logger;
 }
Esempio n. 6
0
 public ModListPlugin(IPALogger logger, Config.Config config)
 {
     Logger.log             = logger;
     ModListConfig.Instance = config.Generated <ModListConfig>();
     menuBtn = new MenuButton(CompileConstants.Manifest.Name, PresentModList);
 }
Esempio n. 7
0
 public Plugin(IPA.Logging.Logger logger)
 {
     Log = logger;
 }
Esempio n. 8
0
        public void Init(IPALogger logger)
        {
            Logger.log = logger;

            IPA.Updating.BeatMods.Updater.ModListPresent = true;
        }