Rewrote hosts again
This commit is contained in:
@@ -1,53 +0,0 @@
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Options;
|
||||
|
||||
namespace Telegrator
|
||||
{
|
||||
/// <summary>
|
||||
/// Abstract base class for configuring options from configuration sources.
|
||||
/// Provides a proxy pattern for binding configuration to strongly-typed options classes.
|
||||
/// </summary>
|
||||
/// <typeparam name="TOptions">The type of options to configure.</typeparam>
|
||||
public abstract class ConfigureOptionsProxy<TOptions> where TOptions : class
|
||||
{
|
||||
/// <summary>
|
||||
/// Configures the options using the default configuration section.
|
||||
/// </summary>
|
||||
/// <param name="services">The service collection to configure.</param>
|
||||
/// <param name="configuration">The configuration source.</param>
|
||||
public void Configure(IServiceCollection services, IConfiguration configuration)
|
||||
=> Configure(services, Options.DefaultName, configuration, null);
|
||||
|
||||
/// <summary>
|
||||
/// Configures the options using a named configuration section.
|
||||
/// </summary>
|
||||
/// <param name="services">The service collection to configure.</param>
|
||||
/// <param name="name">The name of the configuration section.</param>
|
||||
/// <param name="configuration">The configuration source.</param>
|
||||
public void Configure(IServiceCollection services, string? name, IConfiguration configuration)
|
||||
=> Configure(services, name, configuration, null);
|
||||
|
||||
/// <summary>
|
||||
/// Configures the options using a named configuration section with custom binder options.
|
||||
/// </summary>
|
||||
/// <param name="services">The service collection to configure.</param>
|
||||
/// <param name="name">The name of the configuration section.</param>
|
||||
/// <param name="configuration">The configuration source.</param>
|
||||
/// <param name="configureBinder">Optional action to configure the binder options.</param>
|
||||
public void Configure(IServiceCollection services, string? name, IConfiguration configuration, Action<BinderOptions>? configureBinder)
|
||||
{
|
||||
var namedConfigure = new NamedConfigureFromConfigurationOptions<ConfigureOptionsProxy<TOptions>>(name, configuration, configureBinder);
|
||||
namedConfigure.Configure(name, this);
|
||||
|
||||
services.AddOptions();
|
||||
services.AddSingleton(Options.Create(Realize()));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates the actual options instance from the configuration.
|
||||
/// </summary>
|
||||
/// <returns>The configured options instance.</returns>
|
||||
protected abstract TOptions Realize();
|
||||
}
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
using Telegrator.Providers;
|
||||
|
||||
namespace Telegrator.Core
|
||||
{
|
||||
/// <summary>
|
||||
/// Collection class for managing handler descriptors organized by update type for host apps.
|
||||
/// Provides functionality for collecting, adding, scanning, and organizing handlers.
|
||||
/// </summary>
|
||||
public interface IHostHandlersCollection : IHandlersCollection
|
||||
{
|
||||
/// <summary>
|
||||
/// List of tasks that should be completed right before building the bot
|
||||
/// </summary>
|
||||
public List<PreBuildingRoutine> PreBuilderRoutines { get; }
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
using Telegrator.Hosting;
|
||||
|
||||
namespace Telegrator.Handlers
|
||||
{
|
||||
/// <summary>
|
||||
/// Interface for pre-building routines that can be executed during host construction.
|
||||
/// Allows for custom initialization and configuration steps before the bot host is built.
|
||||
/// </summary>
|
||||
public interface IPreBuildingRoutine
|
||||
{
|
||||
/// <summary>
|
||||
/// Executes the pre-building routine on the specified host builder.
|
||||
/// </summary>
|
||||
/// <param name="hostBuilder">The host builder to configure.</param>
|
||||
public static abstract void PreBuildingRoutine(ITelegramBotHostBuilder hostBuilder);
|
||||
}
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
using Microsoft.Extensions.Hosting;
|
||||
|
||||
namespace Telegrator.Hosting
|
||||
{
|
||||
/// <summary>
|
||||
/// Interface for Telegram bot hosts.
|
||||
/// Combines host application capabilities with reactive Telegram bot functionality.
|
||||
/// </summary>
|
||||
public interface ITelegramBotHost : IHost, ITelegratorBot
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.DependencyInjection.Extensions;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Telegrator.Core;
|
||||
@@ -8,7 +9,7 @@ namespace Telegrator.Hosting
|
||||
/// <summary>
|
||||
/// Represents a hosted telegram bot
|
||||
/// </summary>
|
||||
public class TelegramBotHost : ITelegramBotHost
|
||||
public class TelegramBotHost : IHost, ITelegratorBot
|
||||
{
|
||||
private readonly IHost _innerHost;
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
@@ -33,10 +34,9 @@ namespace Telegrator.Hosting
|
||||
/// </summary>
|
||||
/// <param name="hostApplicationBuilder">The proxied instance of host builder.</param>
|
||||
/// <param name="handlers"></param>
|
||||
public TelegramBotHost(HostApplicationBuilder hostApplicationBuilder, IHandlersCollection handlers)
|
||||
public TelegramBotHost(HostApplicationBuilder hostApplicationBuilder)
|
||||
{
|
||||
// Registering this host in services for easy access
|
||||
hostApplicationBuilder.Services.AddSingleton<ITelegramBotHost>(this);
|
||||
hostApplicationBuilder.Services.AddSingleton<ITelegratorBot>(this);
|
||||
|
||||
// Building proxy hoster
|
||||
@@ -47,9 +47,6 @@ namespace Telegrator.Hosting
|
||||
// Reruesting services for this host
|
||||
_updateRouter = Services.GetRequiredService<IUpdateRouter>();
|
||||
_logger = Services.GetRequiredService<ILogger<TelegramBotHost>>();
|
||||
|
||||
// Logging registering handlers in DEBUG purposes
|
||||
_logger.LogHandlers(handlers);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -60,6 +57,7 @@ namespace Telegrator.Hosting
|
||||
{
|
||||
HostApplicationBuilder innerBuilder = new HostApplicationBuilder(settings: null);
|
||||
TelegramBotHostBuilder builder = new TelegramBotHostBuilder(innerBuilder, null);
|
||||
|
||||
builder.Services.AddTelegramBotHostDefaults();
|
||||
builder.Services.AddTelegramReceiver();
|
||||
return builder;
|
||||
@@ -69,10 +67,11 @@ namespace Telegrator.Hosting
|
||||
/// Creates new <see cref="TelegramBotHostBuilder"/> with default services and long-polling update receiving scheme
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public static TelegramBotHostBuilder CreateBuilder(TelegramBotHostBuilderSettings? settings)
|
||||
public static TelegramBotHostBuilder CreateBuilder(HostApplicationBuilderSettings? settings)
|
||||
{
|
||||
HostApplicationBuilder innerBuilder = new HostApplicationBuilder(settings?.ToApplicationBuilderSettings());
|
||||
HostApplicationBuilder innerBuilder = new HostApplicationBuilder(settings);
|
||||
TelegramBotHostBuilder builder = new TelegramBotHostBuilder(innerBuilder, settings);
|
||||
|
||||
builder.Services.AddTelegramBotHostDefaults();
|
||||
builder.Services.AddTelegramReceiver();
|
||||
return builder;
|
||||
@@ -92,7 +91,7 @@ namespace Telegrator.Hosting
|
||||
/// Creates new EMPTY <see cref="TelegramBotHostBuilder"/> WITHOUT any services or update receiving schemes
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public static TelegramBotHostBuilder CreateEmptyBuilder(TelegramBotHostBuilderSettings? settings)
|
||||
public static TelegramBotHostBuilder CreateEmptyBuilder(HostApplicationBuilderSettings? settings)
|
||||
{
|
||||
HostApplicationBuilder innerBuilder = Host.CreateEmptyApplicationBuilder(null);
|
||||
return new TelegramBotHostBuilder(innerBuilder, settings);
|
||||
|
||||
@@ -11,11 +11,11 @@ namespace Telegrator.Hosting
|
||||
/// <summary>
|
||||
/// Represents a hosted telegram bots and services builder that helps manage configuration, logging, lifetime, and more.
|
||||
/// </summary>
|
||||
public class TelegramBotHostBuilder : ITelegramBotHostBuilder
|
||||
public class TelegramBotHostBuilder : ICollectingProvider
|
||||
{
|
||||
private readonly HostApplicationBuilder _innerBuilder;
|
||||
private readonly TelegramBotHostBuilderSettings _settings;
|
||||
private readonly IHandlersCollection _handlers;
|
||||
private readonly HostApplicationBuilderSettings _settings;
|
||||
internal IHandlersCollection _handlers = null!;
|
||||
|
||||
/// <inheritdoc/>
|
||||
public IHandlersCollection Handlers => _handlers;
|
||||
@@ -37,13 +37,12 @@ namespace Telegrator.Hosting
|
||||
/// </summary>
|
||||
/// <param name="hostApplicationBuilder"></param>
|
||||
/// <param name="settings"></param>
|
||||
public TelegramBotHostBuilder(HostApplicationBuilder hostApplicationBuilder, TelegramBotHostBuilderSettings? settings = null)
|
||||
public TelegramBotHostBuilder(HostApplicationBuilder hostApplicationBuilder, HostApplicationBuilderSettings? settings = null)
|
||||
{
|
||||
_innerBuilder = hostApplicationBuilder ?? throw new ArgumentNullException(nameof(hostApplicationBuilder));
|
||||
_settings = settings ?? new TelegramBotHostBuilderSettings();
|
||||
_handlers = new HostHandlersCollection(Services, _settings);
|
||||
_settings = settings ?? new HostApplicationBuilderSettings();
|
||||
|
||||
_innerBuilder.AddTelegrator(_settings, _handlers);
|
||||
_innerBuilder.AddTelegrator(_settings);
|
||||
_innerBuilder.Logging.ClearProviders();
|
||||
}
|
||||
|
||||
@@ -53,13 +52,12 @@ namespace Telegrator.Hosting
|
||||
/// <param name="hostApplicationBuilder"></param>
|
||||
/// <param name="handlers"></param>
|
||||
/// <param name="settings"></param>
|
||||
public TelegramBotHostBuilder(HostApplicationBuilder hostApplicationBuilder, IHandlersCollection handlers, TelegramBotHostBuilderSettings? settings = null)
|
||||
public TelegramBotHostBuilder(HostApplicationBuilder hostApplicationBuilder, IHandlersCollection handlers, HostApplicationBuilderSettings? settings = null)
|
||||
{
|
||||
_innerBuilder = hostApplicationBuilder ?? throw new ArgumentNullException(nameof(hostApplicationBuilder));
|
||||
_settings = settings ?? new TelegramBotHostBuilderSettings();
|
||||
_handlers = handlers ?? throw new ArgumentNullException(nameof(handlers));
|
||||
_settings = settings ?? new HostApplicationBuilderSettings();
|
||||
|
||||
_innerBuilder.AddTelegrator(_settings, _handlers);
|
||||
_innerBuilder.AddTelegrator(_settings, null, handlers);
|
||||
_innerBuilder.Logging.ClearProviders();
|
||||
}
|
||||
|
||||
@@ -69,7 +67,9 @@ namespace Telegrator.Hosting
|
||||
/// <returns></returns>
|
||||
public TelegramBotHost Build()
|
||||
{
|
||||
return new TelegramBotHost(_innerBuilder, _handlers);
|
||||
TelegramBotHost host = new TelegramBotHost(_innerBuilder);
|
||||
host.UseTelegrator();
|
||||
return host;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Microsoft.Extensions.Options;
|
||||
|
||||
namespace Telegrator.Hosting
|
||||
{
|
||||
/// <summary>
|
||||
/// Settings os hosted Telegram bot
|
||||
/// </summary>
|
||||
public class TelegramBotHostBuilderSettings() : TelegratorOptions
|
||||
{
|
||||
/// <summary>
|
||||
/// Disables automatic configuration for all of required <see cref="IOptions{TOptions}"/> instances
|
||||
/// </summary>
|
||||
public bool DisableAutoConfigure { get; set; }
|
||||
|
||||
/// <inheritdoc cref="HostApplicationBuilderSettings.DisableDefaults"/>
|
||||
public bool DisableDefaults { get; set; }
|
||||
|
||||
/// <inheritdoc cref="HostApplicationBuilderSettings.Args"/>
|
||||
public string[]? Args { get; set; }
|
||||
|
||||
/// <inheritdoc cref="HostApplicationBuilderSettings.Configuration"/>
|
||||
public ConfigurationManager? Configuration { get; set; }
|
||||
|
||||
/// <inheritdoc cref="HostApplicationBuilderSettings.EnvironmentName"/>
|
||||
public string? EnvironmentName { get; set; }
|
||||
|
||||
/// <inheritdoc cref="HostApplicationBuilderSettings.ApplicationName"/>
|
||||
public string? ApplicationName { get; set; }
|
||||
|
||||
/// <inheritdoc cref="HostApplicationBuilderSettings.ContentRootPath"/>
|
||||
public string? ContentRootPath { get; set; }
|
||||
|
||||
internal HostApplicationBuilderSettings ToApplicationBuilderSettings() => new HostApplicationBuilderSettings()
|
||||
{
|
||||
DisableDefaults = DisableDefaults,
|
||||
Args = Args,
|
||||
Configuration = Configuration,
|
||||
EnvironmentName = EnvironmentName,
|
||||
ApplicationName = ApplicationName,
|
||||
ContentRootPath = ContentRootPath
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -4,7 +4,6 @@ using Microsoft.Extensions.Options;
|
||||
using Telegram.Bot;
|
||||
using Telegram.Bot.Polling;
|
||||
using Telegrator.Core;
|
||||
using Telegrator.Hosting;
|
||||
using Telegrator.Mediation;
|
||||
|
||||
namespace Telegrator.Polling
|
||||
@@ -17,7 +16,7 @@ namespace Telegrator.Polling
|
||||
/// <param name="updateRouter"></param>
|
||||
/// <param name="options"></param>
|
||||
/// <param name="logger"></param>
|
||||
public class HostedUpdateReceiver(ITelegramBotHost botHost, ITelegramBotClient botClient, IUpdateRouter updateRouter, IOptions<ReceiverOptions> options, ILogger<HostedUpdateReceiver> logger) : BackgroundService
|
||||
public class HostedUpdateReceiver(ITelegramBotClient botClient, IUpdateRouter updateRouter, IOptions<ReceiverOptions> options, ILogger<HostedUpdateReceiver> logger) : BackgroundService
|
||||
{
|
||||
private readonly ReceiverOptions _receiverOptions = options.Value;
|
||||
private readonly IUpdateRouter _updateRouter = updateRouter;
|
||||
@@ -26,7 +25,7 @@ namespace Telegrator.Polling
|
||||
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
|
||||
{
|
||||
logger.LogInformation("Starting receiving updates via long-polling");
|
||||
_receiverOptions.AllowedUpdates = botHost.UpdateRouter.HandlersProvider.AllowedTypes.ToArray();
|
||||
_receiverOptions.AllowedUpdates = _updateRouter.HandlersProvider.AllowedTypes.ToArray();
|
||||
DefaultUpdateReceiver updateReceiver = new DefaultUpdateReceiver(botClient, _receiverOptions);
|
||||
await updateReceiver.ReceiveAsync(_updateRouter, stoppingToken).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
@@ -1,36 +1,20 @@
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using System.Reflection;
|
||||
using Telegrator.Core;
|
||||
using Telegrator.Core.Descriptors;
|
||||
using Telegrator.Hosting;
|
||||
|
||||
namespace Telegrator.Providers
|
||||
{
|
||||
/// <summary>
|
||||
/// Pre host building task
|
||||
/// </summary>
|
||||
/// <param name="builder"></param>
|
||||
public delegate void PreBuildingRoutine(ITelegramBotHostBuilder builder);
|
||||
|
||||
/// <inheritdoc/>
|
||||
public class HostHandlersCollection(IServiceCollection hostServiceColletion, TelegratorOptions options) : HandlersCollection(options), IHostHandlersCollection
|
||||
public class HostHandlersCollection(IServiceCollection hostServiceColletion, TelegratorOptions options) : HandlersCollection(options)
|
||||
{
|
||||
private readonly IServiceCollection Services = hostServiceColletion;
|
||||
|
||||
/// <inheritdoc/>
|
||||
protected override bool MustHaveParameterlessCtor => false;
|
||||
|
||||
/// <summary>
|
||||
/// List of tasks that should be completed right before building the bot
|
||||
/// </summary>
|
||||
public List<PreBuildingRoutine> PreBuilderRoutines { get; } = [];
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override IHandlersCollection AddDescriptor(HandlerDescriptor descriptor)
|
||||
{
|
||||
if (descriptor.HandlerType.IsPreBuildingRoutine(out MethodInfo? routineMethod))
|
||||
PreBuilderRoutines.Add(routineMethod.CreateDelegate<PreBuildingRoutine>(null));
|
||||
|
||||
switch (descriptor.Type)
|
||||
{
|
||||
case DescriptorType.General:
|
||||
|
||||
@@ -1,46 +0,0 @@
|
||||
using Telegram.Bot;
|
||||
|
||||
namespace Telegrator
|
||||
{
|
||||
/// <summary>
|
||||
/// Internal proxy class for configuring Telegram bot client options from configuration.
|
||||
/// Extends ConfigureOptionsProxy to provide specific configuration for Telegram bot client options.
|
||||
/// </summary>
|
||||
public class TelegramBotClientOptionsProxy : ConfigureOptionsProxy<TelegramBotClientOptions>
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets or sets the bot token.
|
||||
/// </summary>
|
||||
public string Token { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the base URL for the bot API.
|
||||
/// </summary>
|
||||
public string? BaseUrl { get; set; } = null;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets whether to use the test environment.
|
||||
/// </summary>
|
||||
public bool UseTestEnvironment { get; set; } = false;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the retry threshold in seconds.
|
||||
/// </summary>
|
||||
public int RetryThreshold { get; set; } = 60;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the number of retry attempts.
|
||||
/// </summary>
|
||||
public int RetryCount { get; set; } = 3;
|
||||
|
||||
/// <summary>
|
||||
/// Creates a TelegramBotClientOptions instance from the proxy configuration.
|
||||
/// </summary>
|
||||
/// <returns>The configured TelegramBotClientOptions instance.</returns>
|
||||
protected override TelegramBotClientOptions Realize() => new TelegramBotClientOptions(Token, BaseUrl, UseTestEnvironment)
|
||||
{
|
||||
RetryCount = RetryCount,
|
||||
RetryThreshold = RetryThreshold
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -4,18 +4,13 @@ using Microsoft.Extensions.DependencyInjection.Extensions;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Options;
|
||||
using System.Diagnostics;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using Telegram.Bot;
|
||||
using Telegram.Bot.Polling;
|
||||
using Telegram.Bot.Types;
|
||||
using Telegram.Bot.Types.Enums;
|
||||
using Telegrator;
|
||||
using Telegrator.Core;
|
||||
using Telegrator.Core.Descriptors;
|
||||
using Telegrator.Handlers;
|
||||
using Telegrator.Hosting;
|
||||
using Telegrator.Logging;
|
||||
using Telegrator.Polling;
|
||||
@@ -38,13 +33,22 @@ public static class HostBuilderExtensions
|
||||
/// <summary>
|
||||
/// Gets the <see cref="IHandlersCollection"/> from the builder properties.
|
||||
/// </summary>
|
||||
public IHandlersCollection Handlers => (IHandlersCollection)builder.Properties[HandlersCollectionPropertyKey];
|
||||
public IHandlersCollection Handlers
|
||||
{
|
||||
get
|
||||
{
|
||||
if (builder is TelegramBotHostBuilder botHostBuilder)
|
||||
return botHostBuilder.Handlers;
|
||||
|
||||
return (IHandlersCollection)builder.Properties[HandlersCollectionPropertyKey];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Replaces TelegramBotWebHostBuilder. Configures DI, options, and handlers.
|
||||
/// </summary>
|
||||
public static IHostApplicationBuilder AddTelegrator(this IHostApplicationBuilder builder, TelegramBotHostBuilderSettings settings, IHandlersCollection? handlers = null)
|
||||
public static IHostApplicationBuilder AddTelegrator(this IHostApplicationBuilder builder, HostApplicationBuilderSettings settings, TelegratorOptions? options = null, IHandlersCollection? handlers = null)
|
||||
{
|
||||
if (settings is null)
|
||||
throw new ArgumentNullException(nameof(settings));
|
||||
@@ -52,53 +56,52 @@ public static class HostBuilderExtensions
|
||||
IServiceCollection services = builder.Services;
|
||||
IConfigurationManager configuration = builder.Configuration;
|
||||
|
||||
handlers ??= new HostHandlersCollection(services, settings);
|
||||
builder.Properties.Add(HandlersCollectionPropertyKey, handlers);
|
||||
|
||||
if (handlers is IHostHandlersCollection hostHandlers)
|
||||
if (options == null)
|
||||
{
|
||||
foreach (PreBuildingRoutine preBuildRoutine in hostHandlers.PreBuilderRoutines)
|
||||
options = configuration.GetSection(nameof(TelegratorOptions)).Get<TelegratorOptions>();
|
||||
if (options == null)
|
||||
throw new MissingMemberException("Auto configuration disabled, yet no options of type 'TelegratorOptions' wasn't registered. This configuration is runtime required!");
|
||||
}
|
||||
|
||||
services.AddSingleton(Options.Create(options));
|
||||
|
||||
if (handlers != null)
|
||||
{
|
||||
if (handlers is IHandlersManager manager)
|
||||
{
|
||||
try
|
||||
{
|
||||
// TODO: fix
|
||||
//preBuildRoutine.Invoke(builder);
|
||||
Debug.WriteLine("Pre-Building routine was not executed");
|
||||
}
|
||||
catch (NotImplementedException)
|
||||
{
|
||||
_ = 0xBAD + 0xC0DE;
|
||||
}
|
||||
ServiceDescriptor descriptor = new ServiceDescriptor(typeof(IHandlersProvider), manager);
|
||||
services.Replace(descriptor);
|
||||
services.AddSingleton(manager);
|
||||
}
|
||||
}
|
||||
|
||||
if (!settings.DisableAutoConfigure)
|
||||
{
|
||||
services.Configure<ReceiverOptions>(configuration.GetSection(nameof(ReceiverOptions)));
|
||||
services.Configure(configuration.GetSection(nameof(TelegramBotClientOptions)), new TelegramBotClientOptionsProxy());
|
||||
}
|
||||
else
|
||||
{
|
||||
if (null == services.SingleOrDefault(srvc => srvc.ImplementationType == typeof(IOptions<ReceiverOptions>)))
|
||||
throw new MissingMemberException("Auto configuration disabled, yet no options of type 'ReceiverOptions' wasn't registered. This configuration is runtime required!");
|
||||
|
||||
if (null == services.SingleOrDefault(srvc => srvc.ImplementationType == typeof(IOptions<TelegramBotClientOptions>)))
|
||||
throw new MissingMemberException("Auto configuration disabled, yet no options of type 'TelegramBotClientOptions' wasn't registered. This configuration is runtime required!");
|
||||
}
|
||||
|
||||
IOptions<TelegramBotHostBuilderSettings> options = Options.Create(settings);
|
||||
services.AddSingleton((IOptions<TelegratorOptions>)options);
|
||||
services.AddTelegramBotHostDefaults();
|
||||
services.AddSingleton(options);
|
||||
handlers ??= new HostHandlersCollection(services, options);
|
||||
services.AddSingleton(handlers);
|
||||
|
||||
if (handlers is IHandlersManager manager)
|
||||
builder.Properties.Add(HandlersCollectionPropertyKey, handlers);
|
||||
if (builder is TelegramBotHostBuilder botHostBuilder)
|
||||
botHostBuilder._handlers = handlers;
|
||||
|
||||
if (!services.Any(srvc => srvc.ImplementationType == typeof(IOptions<ReceiverOptions>)))
|
||||
{
|
||||
ServiceDescriptor descriptor = new ServiceDescriptor(typeof(IHandlersProvider), manager);
|
||||
services.Replace(descriptor);
|
||||
services.AddSingleton(manager);
|
||||
ReceiverOptions? receiverOptions = configuration.GetSection(nameof(ReceiverOptions)).Get<ReceiverOptions>();
|
||||
if (receiverOptions == null)
|
||||
throw new MissingMemberException("Auto configuration disabled, yet no options of type 'ReceiverOptions' wasn't registered. This configuration is runtime required!");
|
||||
|
||||
services.AddSingleton(Options.Create(receiverOptions));
|
||||
}
|
||||
|
||||
if (!services.Any(srvc => srvc.ImplementationType == typeof(IOptions<TelegramBotClientOptions>)))
|
||||
{
|
||||
services.AddSingleton(Options.Create(new TelegramBotClientOptions(options.Token, options.BaseUrl, options.UseTestEnvironment)
|
||||
{
|
||||
RetryCount = options.RetryCount,
|
||||
RetryThreshold = options.RetryThreshold
|
||||
}));
|
||||
}
|
||||
|
||||
services.AddTelegramReceiver();
|
||||
services.AddTelegramBotHostDefaults();
|
||||
return builder;
|
||||
}
|
||||
}
|
||||
@@ -109,20 +112,6 @@ public static class HostBuilderExtensions
|
||||
/// </summary>
|
||||
public static class ServicesCollectionExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Registers a configuration instance that strongly-typed <typeparamref name="TOptions"/> will bind against using <see cref="ConfigureOptionsProxy{TOptions}"/>.
|
||||
/// </summary>
|
||||
/// <typeparam name="TOptions"></typeparam>
|
||||
/// <param name="services"></param>
|
||||
/// <param name="configuration"></param>
|
||||
/// <param name="optionsProxy"></param>
|
||||
/// <returns></returns>
|
||||
public static IServiceCollection Configure<TOptions>(this IServiceCollection services, IConfiguration configuration, ConfigureOptionsProxy<TOptions> optionsProxy) where TOptions : class
|
||||
{
|
||||
optionsProxy.Configure(services, configuration);
|
||||
return services;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Registers <see cref="TelegramBotHost"/> default services
|
||||
/// </summary>
|
||||
@@ -163,7 +152,7 @@ public static class ServicesCollectionExtensions
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Provides useful methods to adjust <see cref="ITelegramBotHost"/>
|
||||
/// Provides useful methods to adjust Telegram bot Host
|
||||
/// </summary>
|
||||
public static class TelegramBotHostExtensions
|
||||
{
|
||||
@@ -218,28 +207,6 @@ public static class TelegramBotHostExtensions
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Provides extension methods for reflection and type inspection.
|
||||
/// </summary>
|
||||
public static class ReflectionExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Checks if a type implements the <see cref="IPreBuildingRoutine"/> interface.
|
||||
/// </summary>
|
||||
/// <param name="handlerType">The type to check.</param>
|
||||
/// <param name="routineMethod"></param>
|
||||
/// <returns>True if the type implements IPreBuildingRoutine; otherwise, false.</returns>
|
||||
public static bool IsPreBuildingRoutine(this Type handlerType, [NotNullWhen(true)] out MethodInfo? routineMethod)
|
||||
{
|
||||
routineMethod = null;
|
||||
if (handlerType.GetInterface(nameof(IPreBuildingRoutine)) == null)
|
||||
return false;
|
||||
|
||||
routineMethod = handlerType.GetMethod(nameof(IPreBuildingRoutine.PreBuildingRoutine), BindingFlags.Static | BindingFlags.Public);
|
||||
return routineMethod != null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Provides extension methods for logging Telegrator-related information.
|
||||
/// </summary>
|
||||
|
||||
Reference in New Issue
Block a user