using DiscordBotCore.Bot; using DiscordBotCore.Configuration; using DiscordBotCore.Logging; using DiscordBotCore.PluginManagement; using DiscordBotCore.PluginManagement.Helpers; using DiscordBotCore.PluginManagement.Loading; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; namespace DiscordBotCore.WebApplication; public static class Initializer { private static readonly string DefaultLogFormat = "{ThrowTime} {SenderName} {Message}"; private static readonly string DefaultLogFolder = "./Data/Logs"; private static readonly string DefaultResourcesFolder = "./Data/Resources"; private static readonly string DefaultConfigFile = "./Data/Resources/config.json"; private static readonly string DefaultPluginFolder = "./Data/Plugins"; private static readonly string DefaultPluginDatabaseFile = "./Data/Resources/plugins.json"; public static void AddDiscordBotComponents(this IHostApplicationBuilder builder) { builder.Services.AddSingleton(sp => { string logFormat = builder.Configuration["Logger:LogFormat"] ?? DefaultLogFormat; string logFolder = builder.Configuration["Logger:LogFolder"] ?? DefaultLogFolder; Directory.CreateDirectory(logFolder); ILogger logger = new Logger(logFolder, logFormat); logger.SetOutFunction((s, type) => { Console.WriteLine($"[{type}] {s}"); }); return logger; }); builder.Services.AddSingleton(sp => { ILogger logger = sp.GetRequiredService(); string configFile = builder.Configuration["ConfigFile"] ?? DefaultConfigFile; Directory.CreateDirectory(new FileInfo(configFile).DirectoryName); IConfiguration configuration = Configuration.Configuration.CreateFromFile(logger, configFile, true); return configuration; }); builder.Services.AddSingleton(sp => { IConfiguration configuration = sp.GetRequiredService(); Dictionary? remotePluginConnectionConfigurationDetails = configuration.Get>("RemotePluginConnectionConfigurationDetails"); if (remotePluginConnectionConfigurationDetails is null) { return PluginRepositoryConfiguration.Default; } return new PluginRepositoryConfiguration( remotePluginConnectionConfigurationDetails["Baseurl"], remotePluginConnectionConfigurationDetails["PluginsEndpoint"], remotePluginConnectionConfigurationDetails["DependenciesEndpoint"] ); }); builder.Services.AddSingleton(sp => { IPluginRepositoryConfiguration pluginRepositoryConfiguration = sp.GetRequiredService(); ILogger logger = sp.GetRequiredService(); IPluginRepository pluginRepository = new PluginRepository(pluginRepositoryConfiguration, logger); return pluginRepository; }); builder.Services.AddSingleton(sp => { IPluginRepository pluginRepository = sp.GetRequiredService(); ILogger logger = sp.GetRequiredService(); IConfiguration configuration = sp.GetRequiredService(); string pluginFolder = configuration.Get("PluginFolder", DefaultPluginFolder); Directory.CreateDirectory(pluginFolder); string resourcesFolder = configuration.Get("ResourcesFolder", DefaultResourcesFolder); Directory.CreateDirectory(resourcesFolder); string pluginDatabaseFile = configuration.Get("PluginDatabase", DefaultPluginDatabaseFile); Directory.CreateDirectory(new FileInfo(pluginDatabaseFile).DirectoryName); IPluginManager pluginManager = new PluginManager(pluginRepository, logger, configuration); return pluginManager; }); builder.Services.AddSingleton(sp => { IPluginManager pluginManager = sp.GetRequiredService(); ILogger logger = sp.GetRequiredService(); IConfiguration configuration = sp.GetRequiredService(); return new PluginLoader(pluginManager, logger, configuration); }); builder.Services.AddSingleton(sp => { ILogger logger = sp.GetRequiredService(); IConfiguration configuration = sp.GetRequiredService(); IPluginLoader pluginLoader = sp.GetRequiredService(); return new DiscordBotApplication(logger, configuration, pluginLoader); }); } }