101 lines
4.8 KiB
C#
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(); |