daily_digest/Program.cs
2025-04-12 00:27:03 +07:00

101 lines
4.8 KiB
C#

using DailyDigestWorker;
using DailyDigestWorker.Configuration; // Äîáàâëÿåì using äëÿ íàøèõ êëàññîâ êîíôèãóðàöèè
using DailyDigestWorker.Services;
using Microsoft.Extensions.Options; // Äëÿ IOptions
using Telegram.Bot; // Äëÿ Telegram.Bot
using WTelegram; // Äëÿ WTelegramClient
using System.Text;
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
// --- Èñïîëüçóåì ñîâðåìåííûé ñòèëü Program.cs áåç ÿâíîãî êëàññà ---
var builder = Host.CreateApplicationBuilder(args); // Èñïîëüçóåì íîâûé ñòèëü ApplicationBuilder
// --- Êîíôèãóðàöèÿ ---
// Êîíôèãóðàöèÿ óæå íàñòðîåíà builder.Configuration (÷èòàåò appsettings.json, env vars, user secrets è ò.ä.)
// Ïðèâÿçûâàåì ñåêöèè êîíôèãóðàöèè ê íàøèì êëàññàì POCO
// Ýòî ïîçâîëèò âíåäðÿòü èõ ÷åðåç IOptions<T>
builder.Services.Configure<BotConfiguration>(builder.Configuration.GetSection("BotConfiguration"));
builder.Services.Configure<TelegramClientSettings>(builder.Configuration.GetSection("TelegramClient"));
builder.Services.Configure<ApiKeys>(builder.Configuration.GetSection("ApiKeys"));
builder.Services.Configure<DataSourceUrls>(builder.Configuration.GetSection("DataSourceUrls"));
builder.Services.Configure<GeminiSettings>(builder.Configuration.GetSection("GeminiSettings"));
// Îñîáàÿ îáðàáîòêà äëÿ âðåìåíè â SchedulingSettings
builder.Services.Configure<SchedulingSettings>(builder.Configuration.GetSection("Scheduling"));
// --- Ðåãèñòðàöèÿ ñåðâèñîâ (Dependency Injection) ---
// 1. Ðåãèñòðèðóåì HttpClientFactory (äëÿ çàïðîñîâ ê API ïîãîäû, âàëþò, êðèïòû, Gemini)
builder.Services.AddHttpClient();
// 2. Ðåãèñòðèðóåì Telegram Bot Client (äëÿ ÎÒÏÐÀÂÊÈ ñîîáùåíèé)
// Ìû ðåãèñòðèðóåì åãî êàê Singleton, òàê êàê êëèåíò ïîòîêîáåçîïàñåí è äîëæåí áûòü îäèí
builder.Services.AddSingleton<ITelegramBotClient>(sp => // sp - Service Provider
{
// Ïîëó÷àåì êîíôèãóðàöèþ áîòà ÷åðåç IOptions
var botConfig = sp.GetRequiredService<IOptions<BotConfiguration>>().Value;
if (string.IsNullOrWhiteSpace(botConfig.BotToken))
{
// Âûáðàñûâàåì èñêëþ÷åíèå ïðè çàïóñêå, åñëè òîêåí íå çàäàí - ïðèëîæåíèå íå ñìîæåò ðàáîòàòü
throw new InvalidOperationException("Bot Token íå ñêîíôèãóðèðîâàí â appsettings.json èëè ýêâèâàëåíòå.");
}
return new TelegramBotClient(botConfig.BotToken);
});
// 3. Ðåãèñòðèðóåì WTelegramClient (äëÿ ×ÒÅÍÈß êàíàëà)
// Òîæå Singleton. WTelegramClient óïðàâëÿåò ñâîèì ñîñòîÿíèåì ïîäêëþ÷åíèÿ.
builder.Services.AddSingleton(sp => // Ðåãèñòðèðóåì êîíêðåòíûé òèï Client
{
var clientSettings = sp.GetRequiredService<IOptions<TelegramClientSettings>>().Value;
var logger = sp.GetRequiredService<ILogger<WTelegram.Client>>(); // Ïîëó÷àåì ëîããåð
// Ôóíêöèÿ äëÿ ïîëó÷åíèÿ êîíôèãóðàöèîííûõ äàííûõ äëÿ WTelegramClient
string? GetConfig(string configKey)
{
switch (configKey)
{
case "api_id": return clientSettings.ApiId.ToString();
case "api_hash": return clientSettings.ApiHash;
case "phone_number": return clientSettings.PhoneNumber;
case "session_pathname": return clientSettings.SessionPath; // <--- ÄÎÁÀÂÈÒÜ ÝÒÎÒ CASE
// Ïðè íåîáõîäèìîñòè ìîæíî äîáàâèòü îáðàáîòêó "password", "verification_code" è äð.
default:
logger.LogWarning("WTelegramClient çàïðîñèë íåèçâåñòíûé êëþ÷ êîíôèãóðàöèè: {ConfigKey}", configKey);
return null; // Âîçâðàùàåì null äëÿ íåèçâåñòíûõ êëþ÷åé
}
}
// WTelegramClient òðåáóåò ôóíêöèþ äëÿ ïîëó÷åíèÿ êîíôèãóðàöèè
var client = new WTelegram.Client(GetConfig);
// Íàñòðàèâàåì óðîâåíü ëîãèðîâàíèÿ äëÿ WTelegramClient (îïöèîíàëüíî, íî ïîëåçíî äëÿ îòëàäêè)
// WTelegram ñàìà èñïîëüçóåò Microsoft.Extensions.Logging, åñëè îí äîñòóïåí
// Ìîæíî óñòàíîâèòü ãëîáàëüíûé óðîâåíü èëè çäåñü, íàïðèìåð:
// WTelegram.Helpers.Log = (level, message) => logger.Log((LogLevel)level, message);
// Íåêîððåêòíóþ ñòðîêó íèæå ìû ÓÄÀËÈËÈ
return client;
});
// 4. Ðåãèñòðèðóåì íàøè ñåðâèñû äëÿ ïîëó÷åíèÿ äàííûõ
builder.Services.AddTransient<ICurrencyService, CbrCurrencyService>();
builder.Services.AddTransient<ICryptoService, CoinGeckoCryptoService>();
builder.Services.AddTransient<IWeatherService, OpenWeatherMapService>();
// 5. Ðåãèñòðèðóåì ñåðâèñû äëÿ îáðàáîòêè è îòïðàâêè
builder.Services.AddTransient<IDigestBuilderService, DigestBuilderService>();
builder.Services.AddTransient<ITelegramBotSender, TelegramBotSender>();
builder.Services.AddTransient<ITelegramChannelReader, TelegramChannelReader>();
builder.Services.AddTransient<ISummarizationService, GoogleGeminiSummarizationService>();// <-- ÄÎÁÀÂÈÒÜ ÝÒÓ ÑÒÐÎÊÓ
// 6. Ðåãèñòðèðóåì íàø îñíîâíîé Worker Service (ýòà ñòðîêà óæå äîëæíà áûòü)
builder.Services.AddHostedService<Worker>();
// --- Ñáîðêà è çàïóñê õîñòà ---
var host = builder.Build();
host.Run();