Exemple #1
0
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            using (GlobalKeyboardHook ghk = new GlobalKeyboardHook())
            {
                JsonConfigProvider optionsProvider = new JsonConfigProvider(GetConfigFileName());
                configData = optionsProvider.Load();

                //TODO: Load this from configData
                var kps = new KeyPressState()
                {
                    IsCtrl = true,
                    Key    = Keys.Oemtilde
                };

                Instance             = new TrayBasedContext(Resources.AppIcon, kps, optionsProvider);
                ghk.KeyboardPressed += Instance.HandleKey;

                Application.Run(Instance);
            }
        }
        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));
        }
Exemple #3
0
        /// <summary>
        /// Register all of the dependencies to the container.
        /// </summary>
        private void Register()
        {
            IConfigProvider configProvider = new JsonConfigProvider();

            configProvider.Load(StaticState.RemoteConfigUrl);

            this.AddSingleton(provider => configProvider);

            this.AddSingleton <LogFactory>();
            this.AddTransient(provider => provider.GetService <LogFactory>().GetLogger());

            this.AddSingleton <IDatabaseProvider, DatabaseProvider>(provider => new DatabaseProvider(
                                                                        configProvider.GetValueByKey("database.name"),
                                                                        configProvider.GetValueByKey("database.password"),
                                                                        uint.Parse(configProvider.GetValueByKey("database.port")),
                                                                        configProvider.GetValueByKey("database.host"),
                                                                        configProvider.GetValueByKey("database.username")));

            var chromeOptions = new ChromeOptions();

            chromeOptions.AddUserProfilePreference("profile.managed_default_content_settings.images", 2);
            chromeOptions.AddUserProfilePreference("profile.managed_default_content_settings.stylesheets", 2);

            chromeOptions.AddArgument("--disable-notifications");
            chromeOptions.AddArgument("--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36");

            if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
            {
                chromeOptions.AddArgument("headless");
            }

            if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
            {
                chromeOptions.AddArgument("--no-sandbox");
            }

            this.AddSingleton <IWebDriver>(provider => new ChromeDriver(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), chromeOptions, TimeSpan.FromSeconds(120)));

            this.AddSingleton <ScraperQueueDao>();
            this.AddSingleton <ScraperAccountDao>();

            this.AddSingleton <InstagramProfileDao>();

            var maleNames     = Utilities.GetListFromLineOfStrings("https://cdn.cascade.io/lists/blacklisted-male-first-name-phrases.txt?v=10");
            var maleUsernames = Utilities.GetListFromLineOfStrings("https://cdn.cascade.io/lists/blacklisted-male-username-phrases.txt?v=8");
            var femaleNames   = Utilities.GetListFromLineOfStrings("https://cdn.cascade.io/lists/female-first-name-phrases.txt?v=7");

            this.AddSingleton <IScraperValidator>(provider => new InstagramValidator(
                                                      maleNames,
                                                      maleUsernames,
                                                      femaleNames
                                                      ));

            this.AddSingleton <ScraperSettingsDao>();
            this.AddSingleton <ScraperSettings>();

            this.AddSingleton(provider => new NotificationSender(
                                  "*********************",
                                  "***********************************************"));

            this.AddSingleton <InstagramEventHandler>();

            this.AddSingleton(provider => new Dictionary <string, ISocialEventHandler>
            {
                { "instagram.com", provider.GetService <InstagramEventHandler>() },
            });

            this.AddSingleton(provider =>
            {
                var bugSnagClient = new Client(new Configuration(StaticState.BugSnagApiKey));

                bugSnagClient.BeforeNotify(report =>
                {
                    report.Event.User = new User
                    {
                        Id = "Worker " + StaticState.WorkerId,
                    };
                });

                return(bugSnagClient);
            });

            this.AddSingleton <ScraperWorker>();
            this.AddSingleton <ScraperWorkerDao>();
        }