public PluginImporter(ILogger logger, ApplicationConfiguration appConfig, IMasterApi masterApi, IRemoteAssemblyHandler remoteAssemblyHandler) { _logger = logger; _masterApi = masterApi; _remoteAssemblyHandler = remoteAssemblyHandler; _appConfig = appConfig; }
public MasterCommunication(ILogger logger, ApplicationConfiguration appConfig, ITranslationLookup translationLookup, IMasterApi apiInstance, IManager manager) { _logger = logger; _transLookup = translationLookup; _apiInstance = apiInstance; _appConfig = appConfig; _manager = manager; }
public static ITranslationLookup Initialize(bool useLocalTranslation, IMasterApi apiInstance, string customLocale = null) { string currentLocale = string.IsNullOrEmpty(customLocale) ? CultureInfo.CurrentCulture.Name : customLocale; string[] localizationFiles = Directory.GetFiles(Path.Join(Utilities.OperatingDirectory, "Localization"), $"*.{currentLocale}.json"); if (!useLocalTranslation) { try { var localization = apiInstance.GetLocalization(currentLocale).Result; Utilities.CurrentLocalization = localization; return(localization.LocalizationIndex); } catch (Exception) { // the online localization failed so will default to local files } } // culture doesn't exist so we just want language if (localizationFiles.Length == 0) { localizationFiles = Directory.GetFiles(Path.Join(Utilities.OperatingDirectory, "Localization"), $"*.{currentLocale.Substring(0, 2)}*.json"); } // language doesn't exist either so defaulting to english if (localizationFiles.Length == 0) { localizationFiles = Directory.GetFiles(Path.Join(Utilities.OperatingDirectory, "Localization"), "*.en-US.json"); } // this should never happen unless the localization folder is empty if (localizationFiles.Length == 0) { throw new Exception("No localization files were found"); } var localizationDict = new Dictionary <string, string>(); foreach (string filePath in localizationFiles) { var localizationContents = File.ReadAllText(filePath, Encoding.UTF8); var eachLocalizationFile = Newtonsoft.Json.JsonConvert.DeserializeObject <SharedLibraryCore.Localization.Layout>(localizationContents); foreach (var item in eachLocalizationFile.LocalizationIndex.Set) { if (!localizationDict.TryAdd(item.Key, item.Value)) { Program.ServerManager.GetLogger(0).WriteError($"Could not add locale string {item.Key} to localization"); } } } string localizationFile = $"{Path.Join(Utilities.OperatingDirectory, "Localization")}{Path.DirectorySeparatorChar}IW4MAdmin.{currentLocale}-{currentLocale.ToUpper()}.json"; Utilities.CurrentLocalization = new SharedLibraryCore.Localization.Layout(localizationDict) { LocalizationName = currentLocale, }; return(Utilities.CurrentLocalization.LocalizationIndex); }
public static ITranslationLookup Initialize(ILogger logger, IMasterApi apiInstance, ApplicationConfiguration applicationConfiguration) { var useLocalTranslation = applicationConfiguration?.UseLocalTranslations ?? true; var customLocale = applicationConfiguration?.EnableCustomLocale ?? false ? (applicationConfiguration.CustomLocale ?? "en-US") : "en-US"; var currentLocale = string.IsNullOrEmpty(customLocale) ? CultureInfo.CurrentCulture.Name : customLocale; var localizationFiles = Directory.GetFiles(Path.Join(Utilities.OperatingDirectory, "Localization"), $"*.{currentLocale}.json"); if (!useLocalTranslation) { try { var localization = apiInstance.GetLocalization(currentLocale).Result; Utilities.CurrentLocalization = localization; return(localization.LocalizationIndex); } catch (Exception ex) { // the online localization failed so will default to local files logger.LogWarning(ex, "Could not download latest translations"); } } // culture doesn't exist so we just want language if (localizationFiles.Length == 0) { localizationFiles = Directory.GetFiles(Path.Join(Utilities.OperatingDirectory, "Localization"), $"*.{currentLocale.Substring(0, 2)}*.json"); } // language doesn't exist either so defaulting to english if (localizationFiles.Length == 0) { localizationFiles = Directory.GetFiles(Path.Join(Utilities.OperatingDirectory, "Localization"), "*.en-US.json"); } // this should never happen unless the localization folder is empty if (localizationFiles.Length == 0) { throw new Exception("No localization files were found"); } var localizationDict = new Dictionary <string, string>(); foreach (string filePath in localizationFiles) { var localizationContents = File.ReadAllText(filePath, Encoding.UTF8); var eachLocalizationFile = Newtonsoft.Json.JsonConvert.DeserializeObject <SharedLibraryCore.Localization.Layout>(localizationContents); if (eachLocalizationFile == null) { continue; } foreach (var item in eachLocalizationFile.LocalizationIndex.Set) { if (!localizationDict.TryAdd(item.Key, item.Value)) { logger.LogError("Could not add locale string {key} to localization", item.Key); } } } Utilities.CurrentLocalization = new SharedLibraryCore.Localization.Layout(localizationDict) { LocalizationName = currentLocale, }; return(Utilities.CurrentLocalization.LocalizationIndex); }
private static IServiceCollection HandlePluginRegistration(ApplicationConfiguration appConfig, IServiceCollection serviceCollection, IMasterApi masterApi) { var defaultLogger = BuildDefaultLogger <Program>(appConfig); var pluginServiceProvider = new ServiceCollection() .AddBaseLogger(appConfig) .AddSingleton(appConfig) .AddSingleton(masterApi) .AddSingleton <IRemoteAssemblyHandler, RemoteAssemblyHandler>() .AddSingleton <IPluginImporter, PluginImporter>() .BuildServiceProvider(); var pluginImporter = pluginServiceProvider.GetRequiredService <IPluginImporter>(); // we need to register the rest client with regular collection serviceCollection.AddSingleton(masterApi); // register the native commands foreach (var commandType in typeof(SharedLibraryCore.Commands.QuitCommand).Assembly.GetTypes() .Concat(typeof(Program).Assembly.GetTypes().Where(type => type.Namespace == "IW4MAdmin.Application.Commands")) .Where(_command => _command.BaseType == typeof(Command))) { defaultLogger.LogDebug("Registered native command type {name}", commandType.Name); serviceCollection.AddSingleton(typeof(IManagerCommand), commandType); } // register the plugin implementations var(plugins, commands, configurations) = pluginImporter.DiscoverAssemblyPluginImplementations(); foreach (var pluginType in plugins) { defaultLogger.LogDebug("Registered plugin type {name}", pluginType.FullName); serviceCollection.AddSingleton(typeof(IPlugin), pluginType); } // register the plugin commands foreach (var commandType in commands) { defaultLogger.LogDebug("Registered plugin command type {name}", commandType.FullName); serviceCollection.AddSingleton(typeof(IManagerCommand), commandType); } foreach (var configurationType in configurations) { defaultLogger.LogDebug("Registered plugin config type {name}", configurationType.Name); var configInstance = (IBaseConfiguration)Activator.CreateInstance(configurationType); var handlerType = typeof(BaseConfigurationHandler <>).MakeGenericType(configurationType); var handlerInstance = Activator.CreateInstance(handlerType, new[] { configInstance.Name() }); var genericInterfaceType = typeof(IConfigurationHandler <>).MakeGenericType(configurationType); serviceCollection.AddSingleton(genericInterfaceType, handlerInstance); } // register any script plugins foreach (var scriptPlugin in pluginImporter.DiscoverScriptPlugins()) { serviceCollection.AddSingleton(scriptPlugin); } // register any eventable types foreach (var assemblyType in typeof(Program).Assembly.GetTypes() .Where(_asmType => typeof(IRegisterEvent).IsAssignableFrom(_asmType)) .Union(plugins.SelectMany(_asm => _asm.Assembly.GetTypes()) .Distinct() .Where(_asmType => typeof(IRegisterEvent).IsAssignableFrom(_asmType)))) { var instance = Activator.CreateInstance(assemblyType) as IRegisterEvent; serviceCollection.AddSingleton(instance); } return(serviceCollection); }