93 lines
3.5 KiB
C#
93 lines
3.5 KiB
C#
using ChatBot.Models.Configuration;
|
|
using ChatBot.Models.Configuration.Validators;
|
|
using ChatBot.Services;
|
|
using ChatBot.Services.Telegram.Commands;
|
|
using ChatBot.Services.Telegram.Interfaces;
|
|
using ChatBot.Services.Telegram.Services;
|
|
using Serilog;
|
|
|
|
var builder = Host.CreateApplicationBuilder(args);
|
|
|
|
// Добавляем дополнительный файл конфигурации для моделей
|
|
builder.Configuration.AddJsonFile("appsettings.Models.json", optional: false, reloadOnChange: true);
|
|
|
|
// Настройка Serilog
|
|
Log.Logger = new LoggerConfiguration().ReadFrom.Configuration(builder.Configuration).CreateLogger();
|
|
|
|
try
|
|
{
|
|
Log.ForContext<Program>().Information("Starting Telegram Bot application...");
|
|
|
|
// Добавляем Serilog в DI контейнер
|
|
builder.Services.AddSerilog();
|
|
|
|
// Конфигурируем настройки
|
|
builder.Services.Configure<AppSettings>(builder.Configuration);
|
|
builder.Services.Configure<TelegramBotSettings>(
|
|
builder.Configuration.GetSection("TelegramBot")
|
|
);
|
|
builder.Services.Configure<OpenRouterSettings>(options =>
|
|
{
|
|
builder.Configuration.GetSection("OpenRouter").Bind(options);
|
|
builder
|
|
.Configuration.GetSection("ModelConfigurations")
|
|
.Bind(options, o => o.BindNonPublicProperties = false);
|
|
});
|
|
builder.Services.Configure<SerilogSettings>(builder.Configuration.GetSection("Serilog"));
|
|
|
|
// Валидируем конфигурацию
|
|
var appSettings = builder.Configuration.Get<AppSettings>();
|
|
if (appSettings == null)
|
|
{
|
|
Log.ForContext<Program>().Fatal("Failed to load configuration");
|
|
return;
|
|
}
|
|
|
|
var validationResult = ConfigurationValidator.ValidateAppSettings(appSettings);
|
|
if (!validationResult.IsValid)
|
|
{
|
|
Log.ForContext<Program>().Fatal("Configuration validation failed:");
|
|
foreach (var error in validationResult.Errors)
|
|
{
|
|
Log.ForContext<Program>().Fatal(" - {Error}", error);
|
|
}
|
|
return;
|
|
}
|
|
|
|
Log.ForContext<Program>().Information("Configuration validation passed");
|
|
|
|
// Регистрируем основные сервисы
|
|
builder.Services.AddSingleton<ModelService>();
|
|
builder.Services.AddSingleton<AIService>();
|
|
builder.Services.AddSingleton<ChatService>();
|
|
|
|
// Регистрируем Telegram сервисы
|
|
builder.Services.AddSingleton<ITelegramMessageSender, TelegramMessageSender>();
|
|
builder.Services.AddSingleton<ITelegramErrorHandler, TelegramErrorHandler>();
|
|
builder.Services.AddSingleton<CommandRegistry>();
|
|
builder.Services.AddSingleton<ITelegramCommandProcessor, TelegramCommandProcessor>();
|
|
builder.Services.AddSingleton<ITelegramMessageHandler, TelegramMessageHandler>();
|
|
builder.Services.AddSingleton<ITelegramBotService, TelegramBotService>();
|
|
builder.Services.AddHostedService<TelegramBotService>();
|
|
|
|
var host = builder.Build();
|
|
|
|
// Инициализируем ModelService
|
|
var modelService = host.Services.GetRequiredService<ModelService>();
|
|
await modelService.InitializeAsync();
|
|
|
|
// Инициализируем команды
|
|
var commandRegistry = host.Services.GetRequiredService<CommandRegistry>();
|
|
commandRegistry.RegisterCommandsFromAssembly(typeof(Program).Assembly, host.Services);
|
|
|
|
await host.RunAsync();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Log.ForContext<Program>().Fatal(ex, "Application terminated unexpectedly");
|
|
}
|
|
finally
|
|
{
|
|
await Log.CloseAndFlushAsync();
|
|
}
|