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)); }
/// <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>(); }