using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using System.Text; using Telegram.Bot.Types.Enums; using Telegrator.Hosting.Components; using Telegrator.Hosting.Providers; using Telegrator.MadiatorCore; using Telegrator.MadiatorCore.Descriptors; namespace Telegrator.Hosting { /// /// Represents a hosted telegram bot /// public class TelegramBotHost : ITelegramBotHost { private readonly IHost _innerHost; private readonly IUpdateRouter _updateRouter; private readonly ILogger _logger; private bool _disposed; /// public IServiceProvider Services => _innerHost.Services; /// public IUpdateRouter UpdateRouter => _updateRouter; /// /// This application's logger /// public ILogger Logger => _logger; /// /// Initializes a new instance of the class. /// /// The service provider. /// internal TelegramBotHost(HostApplicationBuilder hostApplicationBuilder, HostHandlersCollection handlers) { RegisterHostServices(hostApplicationBuilder, handlers); _innerHost = hostApplicationBuilder.Build(); _updateRouter = Services.GetRequiredService(); _logger = Services.GetRequiredService>(); LogHandlers(handlers); } /// /// Creates new with default configuration, services and long-polling update receiving scheme /// /// public static TelegramBotHostBuilder CreateBuilder() { HostApplicationBuilder innerBuilder = new HostApplicationBuilder(settings: null); TelegramBotHostBuilder builder = new TelegramBotHostBuilder(innerBuilder, null); builder.Services.AddTelegramBotHostDefaults(); builder.Services.AddTelegramReceiver(); return builder; } /// /// Creates new with default services and long-polling update receiving scheme /// /// public static TelegramBotHostBuilder CreateBuilder(TelegramBotHostBuilderSettings? settings) { HostApplicationBuilder innerBuilder = new HostApplicationBuilder(settings?.ToApplicationBuilderSettings()); TelegramBotHostBuilder builder = new TelegramBotHostBuilder(innerBuilder, settings); builder.Services.AddTelegramBotHostDefaults(); builder.Services.AddTelegramReceiver(); return builder; } /// /// Creates new EMPTY WITHOUT any services or update receiving schemes /// /// public static TelegramBotHostBuilder CreateEmptyBuilder() { HostApplicationBuilder innerBuilder = Host.CreateEmptyApplicationBuilder(null); return new TelegramBotHostBuilder(innerBuilder, null); } /// /// Creates new EMPTY WITHOUT any services or update receiving schemes /// /// public static TelegramBotHostBuilder CreateEmptyBuilder(TelegramBotHostBuilderSettings? settings) { HostApplicationBuilder innerBuilder = Host.CreateEmptyApplicationBuilder(null); return new TelegramBotHostBuilder(innerBuilder, settings); } /// public async Task StartAsync(CancellationToken cancellationToken = default) { await _innerHost.StartAsync(cancellationToken); } /// public async Task StopAsync(CancellationToken cancellationToken = default) { await _innerHost.StopAsync(cancellationToken); } /// /// Disposes the host. /// public void Dispose() { if (_disposed) return; GC.SuppressFinalize(this); _disposed = true; } private void LogHandlers(HostHandlersCollection handlers) { StringBuilder logBuilder = new StringBuilder("Registered handlers : "); if (!handlers.Keys.Any()) throw new Exception(); foreach (UpdateType updateType in handlers.Keys) { HandlerDescriptorList descriptors = handlers[updateType]; logBuilder.AppendLine("\n\tUpdateType." + updateType + " :"); foreach (HandlerDescriptor descriptor in descriptors.Reverse()) { string indexerString = descriptor.Indexer.ToString(); logBuilder.AppendLine("* " + indexerString + " " + (descriptor.DisplayString ?? descriptor.HandlerType.Name)); } } Logger.LogInformation(logBuilder.ToString()); } private void RegisterHostServices(HostApplicationBuilder hostApplicationBuilder, HostHandlersCollection handlers) { //hostApplicationBuilder.Services.RemoveAll(); //hostApplicationBuilder.Services.AddSingleton(this); hostApplicationBuilder.Services.AddSingleton(this); hostApplicationBuilder.Services.AddSingleton(this); hostApplicationBuilder.Services.AddSingleton(handlers); } } }