示例#1
0
 public PluginImporter(ILogger logger, ApplicationConfiguration appConfig, IMasterApi masterApi, IRemoteAssemblyHandler remoteAssemblyHandler)
 {
     _logger                = logger;
     _masterApi             = masterApi;
     _remoteAssemblyHandler = remoteAssemblyHandler;
     _appConfig             = appConfig;
 }
示例#2
0
 public MasterCommunication(ILogger logger, ApplicationConfiguration appConfig, ITranslationLookup translationLookup, IMasterApi apiInstance, IManager manager)
 {
     _logger      = logger;
     _transLookup = translationLookup;
     _apiInstance = apiInstance;
     _appConfig   = appConfig;
     _manager     = manager;
 }
示例#3
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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);
        }