コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }