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 @@
-
-
-
-
+
+