Added a new project for initialization of the main web ui.

This commit is contained in:
2025-04-07 16:33:58 +03:00
parent 4ab8438a7c
commit c8cf887a09
5 changed files with 131 additions and 95 deletions

View File

@@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\DiscordBotCore\DiscordBotCore.csproj" />
</ItemGroup>
</Project>

View File

@@ -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<ILogger>(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<IConfiguration>(sp =>
{
ILogger logger = sp.GetRequiredService<ILogger>();
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<IPluginRepositoryConfiguration>(sp =>
{
IConfiguration configuration = sp.GetRequiredService<IConfiguration>();
Dictionary<string, string>? remotePluginConnectionConfigurationDetails =
configuration.Get<Dictionary<string, string>>("RemotePluginConnectionConfigurationDetails");
if (remotePluginConnectionConfigurationDetails is null)
{
return PluginRepositoryConfiguration.Default;
}
return new PluginRepositoryConfiguration(
remotePluginConnectionConfigurationDetails["Baseurl"],
remotePluginConnectionConfigurationDetails["PluginsEndpoint"],
remotePluginConnectionConfigurationDetails["DependenciesEndpoint"]
);
});
builder.Services.AddSingleton<IPluginRepository>(sp =>
{
IPluginRepositoryConfiguration pluginRepositoryConfiguration =
sp.GetRequiredService<IPluginRepositoryConfiguration>();
ILogger logger = sp.GetRequiredService<ILogger>();
IPluginRepository pluginRepository = new PluginRepository(pluginRepositoryConfiguration, logger);
return pluginRepository;
});
builder.Services.AddSingleton<IPluginManager>(sp =>
{
IPluginRepository pluginRepository = sp.GetRequiredService<IPluginRepository>();
ILogger logger = sp.GetRequiredService<ILogger>();
IConfiguration configuration = sp.GetRequiredService<IConfiguration>();
string pluginFolder = configuration.Get<string>("PluginFolder", DefaultPluginFolder);
Directory.CreateDirectory(pluginFolder);
string resourcesFolder = configuration.Get<string>("ResourcesFolder", DefaultResourcesFolder);
Directory.CreateDirectory(resourcesFolder);
string pluginDatabaseFile = configuration.Get<string>("PluginDatabase", DefaultPluginDatabaseFile);
Directory.CreateDirectory(new FileInfo(pluginDatabaseFile).DirectoryName);
IPluginManager pluginManager = new PluginManager(pluginRepository, logger, configuration);
return pluginManager;
});
builder.Services.AddSingleton<IPluginLoader>(sp =>
{
IPluginManager pluginManager = sp.GetRequiredService<IPluginManager>();
ILogger logger = sp.GetRequiredService<ILogger>();
IConfiguration configuration = sp.GetRequiredService<IConfiguration>();
return new PluginLoader(pluginManager, logger, configuration);
});
builder.Services.AddSingleton<IDiscordBotApplication>(sp =>
{
ILogger logger = sp.GetRequiredService<ILogger>();
IConfiguration configuration = sp.GetRequiredService<IConfiguration>();
IPluginLoader pluginLoader = sp.GetRequiredService<IPluginLoader>();
return new DiscordBotApplication(logger, configuration, pluginLoader);
});
}
}

View File

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

View File

@@ -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<ILogger>(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<IConfiguration>(sp =>
{
ILogger logger = sp.GetRequiredService<ILogger>();
string configFile = builder.Configuration["ConfigFile"] ?? defaultConfigFile;
Directory.CreateDirectory(new FileInfo(configFile).DirectoryName);
IConfiguration configuration = Configuration.CreateFromFile(logger, configFile, true);
return configuration;
});
builder.Services.AddSingleton<IPluginRepositoryConfiguration>(sp =>
{
IConfiguration configuration = sp.GetRequiredService<IConfiguration>();
Dictionary<string, string>? remotePluginConnectionConfigurationDetails =
configuration.Get<Dictionary<string, string>>("RemotePluginConnectionConfigurationDetails");
if (remotePluginConnectionConfigurationDetails is null)
{
return PluginRepositoryConfiguration.Default;
}
return new PluginRepositoryConfiguration(
remotePluginConnectionConfigurationDetails["Baseurl"], remotePluginConnectionConfigurationDetails["PluginsEndpoint"],
remotePluginConnectionConfigurationDetails["DependenciesEndpoint"]
);
});
builder.Services.AddSingleton<IPluginRepository>(sp =>
{
IPluginRepositoryConfiguration pluginRepositoryConfiguration = sp.GetRequiredService<IPluginRepositoryConfiguration>();
ILogger logger = sp.GetRequiredService<ILogger>();
IPluginRepository pluginRepository = new PluginRepository(pluginRepositoryConfiguration, logger);
return pluginRepository;
});
builder.Services.AddSingleton<IPluginManager>(sp =>
{
IPluginRepository pluginRepository = sp.GetRequiredService<IPluginRepository>();
ILogger logger = sp.GetRequiredService<ILogger>();
IConfiguration configuration = sp.GetRequiredService<IConfiguration>();
string pluginFolder = configuration.Get<string>("PluginFolder", defaultPluginFolder);
Directory.CreateDirectory(pluginFolder);
string resourcesFolder = configuration.Get<string>("ResourcesFolder", defaultResourcesFolder);
Directory.CreateDirectory(resourcesFolder);
string pluginDatabaseFile = configuration.Get<string>("PluginDatabase", defaultPluginDatabaseFile);
Directory.CreateDirectory(new FileInfo(pluginDatabaseFile).DirectoryName);
IPluginManager pluginManager = new PluginManager(pluginRepository, logger, configuration);
return pluginManager;
});
builder.Services.AddSingleton<IPluginLoader>(sp =>
{
IPluginManager pluginManager = sp.GetRequiredService<IPluginManager>();
ILogger logger = sp.GetRequiredService<ILogger>();
IConfiguration configuration = sp.GetRequiredService<IConfiguration>();
return new PluginLoader(pluginManager, logger, configuration);
});
builder.Services.AddSingleton<IDiscordBotApplication>(sp =>
{
ILogger logger = sp.GetRequiredService<ILogger>();
IConfiguration configuration = sp.GetRequiredService<IConfiguration>();
IPluginLoader pluginLoader = sp.GetRequiredService<IPluginLoader>();
return new DiscordBotApplication(logger, configuration, pluginLoader);
});
builder.AddDiscordBotComponents();
var app = builder.Build();

View File

@@ -14,10 +14,8 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\DiscordBotCore.Configuration\DiscordBotCore.Configuration.csproj" />
<ProjectReference Include="..\DiscordBotCore.Logging\DiscordBotCore.Logging.csproj" />
<ProjectReference Include="..\DiscordBotCore.PluginManagement\DiscordBotCore.PluginManagement.csproj" />
<ProjectReference Include="..\DiscordBotCore\DiscordBotCore.csproj" />
<ProjectReference Include="..\DiscordBotCore.Database.Sqlite\DiscordBotCore.Database.Sqlite.csproj" />
<ProjectReference Include="..\DiscordBotCore.WebApplication\DiscordBotCore.WebApplication.csproj" />
</ItemGroup>
</Project>