From c8cf887a09f10ebac7a91e8b1c0077a081f0442c Mon Sep 17 00:00:00 2001 From: Andrei Tudor Date: Mon, 7 Apr 2025 16:33:58 +0300 Subject: [PATCH] Added a new project for initialization of the main web ui. --- .../DiscordBotCore.WebApplication.csproj | 13 +++ DiscordBotCore.WebApplication/Initializer.cs | 108 ++++++++++++++++++ SethDiscordBot.sln | 6 + WebUI/Program.cs | 93 +-------------- WebUI/WebUI.csproj | 6 +- 5 files changed, 131 insertions(+), 95 deletions(-) create mode 100644 DiscordBotCore.WebApplication/DiscordBotCore.WebApplication.csproj create mode 100644 DiscordBotCore.WebApplication/Initializer.cs diff --git a/DiscordBotCore.WebApplication/DiscordBotCore.WebApplication.csproj b/DiscordBotCore.WebApplication/DiscordBotCore.WebApplication.csproj new file mode 100644 index 0000000..9162818 --- /dev/null +++ b/DiscordBotCore.WebApplication/DiscordBotCore.WebApplication.csproj @@ -0,0 +1,13 @@ + + + + net8.0 + enable + enable + + + + + + + diff --git a/DiscordBotCore.WebApplication/Initializer.cs b/DiscordBotCore.WebApplication/Initializer.cs new file mode 100644 index 0000000..25a5eb1 --- /dev/null +++ b/DiscordBotCore.WebApplication/Initializer.cs @@ -0,0 +1,108 @@ +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); + }); + } +} \ No newline at end of file diff --git a/SethDiscordBot.sln b/SethDiscordBot.sln index f6bbe35..3d158aa 100644 --- a/SethDiscordBot.sln +++ b/SethDiscordBot.sln @@ -37,6 +37,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebUI", "WebUI\WebUI.csproj EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DiscordBotCore.Database.Sqlite", "DiscordBotCore.Database.Sqlite\DiscordBotCore.Database.Sqlite.csproj", "{6D43E9A7-A295-41AC-8B2A-9A877FABB5DE}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DiscordBotCore.WebApplication", "DiscordBotCore.WebApplication\DiscordBotCore.WebApplication.csproj", "{A65A1D7A-99E9-463F-A205-F96CA54D5C51}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -99,6 +101,10 @@ Global {6D43E9A7-A295-41AC-8B2A-9A877FABB5DE}.Debug|Any CPU.Build.0 = Debug|Any CPU {6D43E9A7-A295-41AC-8B2A-9A877FABB5DE}.Release|Any CPU.ActiveCfg = Release|Any CPU {6D43E9A7-A295-41AC-8B2A-9A877FABB5DE}.Release|Any CPU.Build.0 = Release|Any CPU + {A65A1D7A-99E9-463F-A205-F96CA54D5C51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A65A1D7A-99E9-463F-A205-F96CA54D5C51}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A65A1D7A-99E9-463F-A205-F96CA54D5C51}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A65A1D7A-99E9-463F-A205-F96CA54D5C51}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/WebUI/Program.cs b/WebUI/Program.cs index 21cb11c..9b1ad2a 100644 --- a/WebUI/Program.cs +++ b/WebUI/Program.cs @@ -5,6 +5,7 @@ using DiscordBotCore.Logging; using DiscordBotCore.PluginManagement; using DiscordBotCore.PluginManagement.Helpers; using DiscordBotCore.PluginManagement.Loading; +using DiscordBotCore.WebApplication; using IConfiguration = DiscordBotCore.Configuration.IConfiguration; using ILogger = DiscordBotCore.Logging.ILogger; @@ -71,99 +72,9 @@ static Assembly? LoadFromSameFolder(object? sender, ResolveEventArgs args, strin var builder = WebApplication.CreateBuilder(args); -string defaultLogFormat = "{ThrowTime} {SenderName} {Message}"; -string defaultLogFolder = "./Data/Logs"; -string defaultResourcesFolder = "./Data/Resources"; -string defaultConfigFile = "./Data/Resources/config.json"; -string defaultPluginFolder = "./Data/Plugins"; -string defaultPluginDatabaseFile = "./Data/Resources/plugins.json"; - // Add services to the container. builder.Services.AddControllersWithViews(); -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.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); -}); +builder.AddDiscordBotComponents(); var app = builder.Build(); diff --git a/WebUI/WebUI.csproj b/WebUI/WebUI.csproj index 5f1c331..36c8171 100644 --- a/WebUI/WebUI.csproj +++ b/WebUI/WebUI.csproj @@ -14,10 +14,8 @@ - - - - + +