private static bool InitializeAspNetCore(IServiceProvider provider, Type startupType, BotApplicationBuilder builder) { var startupInterfaceType = Type.GetType("Microsoft.AspNetCore.Hosting.IStartup, Microsoft.AspNetCore.Hosting.Abstractions"); object startup; if (startupInterfaceType != null) { startup = provider.GetService(startupInterfaceType); if (startup != null) { startupType = startup.GetType(); } } else { startup = null; } if (startup == null) { if (startupType != null) { startup = ActivatorUtilities.CreateInstance(provider, startupType); } else { return(false); } } var configureMethod = startupType.GetMethod("ConfigureBot"); if (configureMethod == null) { return(false); } var parameterInfos = configureMethod.GetParameters(); var parameters = new object[parameterInfos.Length]; for (var i = 0; i < parameterInfos.Length; i++) { var parameterType = parameterInfos[i].ParameterType; if (parameterType == typeof(IBotApplicationBuilder)) { parameters[i] = builder; } else { parameters[i] = provider.GetRequiredService(parameterType); } } configureMethod.Invoke(startup, parameters); return(true); }
internal static IHostBuilder ConfigureDiscordBot( this IHostBuilder hostBuilder, bool throwOnError, Action <IBotApplicationBuilder> configure = null) { hostBuilder.Properties[DiscordBotProperty] = true; hostBuilder.ConfigureServices((ctx, services) => { AddDefaultServices(services); AddOptions(services, ctx.Configuration); services.AddHostedService <DiscordBotHostedService>(); services.AddBotApplicationBuilderFactory(provider => { var builder = new BotApplicationBuilder { ApplicationServices = provider }; if (!hostBuilder.Properties.TryGetValue("UseStartup.StartupType", out var value) || !(value is Type startupType)) { startupType = null; } if (configure != null) { configure.Invoke(builder); } else if (!InitializeAspNetCore(provider, startupType, builder)) { if (throwOnError) { throw new InvalidOperationException("Could not find the ASP.Net Core startup"); } } return(builder); }); services.PostConfigure <DiscordOptions>(options => { options.Intents = GetIntents(services); }); }); return(hostBuilder); }
public static IServiceCollection AddApplicationBuilder(this IServiceCollection services, Action <IBotApplicationBuilder> factory) { services.AddBotApplicationBuilderFactory(provider => { var builder = new BotApplicationBuilder { ApplicationServices = provider }; factory(builder); return(builder); }); return(services); }