Ejemplo n.º 1
0
        /// <summary>
        /// Triggers when a shard is ready
        /// </summary>
        /// <param name="socketClient">
        /// The socketClient.
        /// </param>
        /// <returns>
        /// The <see cref="Task"/>.
        /// </returns>
        internal async Task ShardReadyAsync(DiscordSocketClient socketClient)
        {
            await socketClient.SetActivityAsync(new Game($"Shard: {socketClient.ShardId}", ActivityType.Watching));

            if (guildCheck)
            {
                if (Client.Shards.All(x => x.Guilds.Any()))
                {
                    if (prefixOverride)
                    {
                        LogHandler.LogMessage($"Bot is in Prefix Override Mode! Current Prefix is: {DatabaseHandler.Settings.PrefixOverride}", LogSeverity.Warning);
                    }


                    if (await DBLApi.InitializeAsync())
                    {
                        LogHandler.LogMessage("Discord Bots List API Initialized.");
                    }
                    else
                    {
                        LogHandler.LogMessage("Discord Bots List API Not Initialized.", LogSeverity.Warning);
                    }

                    Provider.GetRequiredService <TimerService>().Restart();

                    _ = Task.Run(
                        () =>
                    {
                        Limits.Initialize();
                        Waits.Initialize();

                        var handler = Provider.GetRequiredService <DatabaseHandler>();

                        if (!DatabaseHandler.Settings.DenyConfigDeletion)
                        {
                            // Returns all stored guild models
                            var guildIds    = Client.Guilds.Select(g => g.Id).ToList();
                            var missingList = handler.Query <GuildModel>().Where(g => !g.Settings.Config.SaveGuildModel && g.ID != 0).Select(x => x.ID).Where(x => !guildIds.Contains(x)).ToList();

                            foreach (var id in missingList)
                            {
                                handler.Execute <GuildModel>(DatabaseHandler.Operation.DELETE, id: id.ToString());
                                handler.Execute <GuildModel>(DatabaseHandler.Operation.DELETE, id: $"{id}-Tags");
                                handler.Execute <GuildModel>(DatabaseHandler.Operation.DELETE, id: $"{id}-Channels");
                                handler.Execute <GuildModel>(DatabaseHandler.Operation.DELETE, id: $"{id}-Levels");
                            }

                            /*
                             * // Only to be used if migrating from older database where all items were stored in the same guildModel
                             * var convert = Provider.GetRequiredService<GuildModelToServices>();
                             * foreach (var guildId in guildIds)
                             * {
                             *  var model = handler.Execute<GuildModel>(DatabaseHandler.Operation.LOAD, null, guildId);
                             *  if (model != null)
                             *  {
                             *      convert.SplitModelAsync(model);
                             *  }
                             * }
                             */
                        }
                        else
                        {
                            LogHandler.LogMessage("Server configs for servers which do not contain the bot will be preserved!", LogSeverity.Warning);
                        }
                    });

                    // Ensure that this is only run once as the bot initially connects.
                    guildCheck = false;
                }
                else
                {
                    // This will check to ensure that all our servers are initialized, whilst also allowing the bot to continue starting
                    _ = Task.Run(
                        () =>
                    {
                        var handler = Provider.GetRequiredService <DatabaseHandler>();

                        // This will load all guild models and retrieve their IDs
                        var Servers = handler.Query <GuildModel>();
                        var ids     = Servers.Select(s => s.ID).ToList();

                        // Now if the bots server list contains a guild but 'Servers' does not, we create a new object for the guild
                        foreach (var Guild in socketClient.Guilds.Select(x => x.Id))
                        {
                            if (!ids.Contains(Guild))
                            {
                                handler.Execute <GuildModel>(DatabaseHandler.Operation.CREATE, new GuildModel(Guild), Guild);
                            }
                        }
                    });
                }
            }

            LogHandler.LogMessage($"Shard: {socketClient.ShardId} Ready");
            if (!hideInvite)
            {
                LogHandler.LogMessage($"Invite: https://discordapp.com/oauth2/authorize?client_id={Client.CurrentUser.Id}&scope=bot&permissions=2146958591");
                hideInvite = true;
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        ///     Initialization of our service provider and bot
        /// </summary>
        /// <returns>
        ///     The <see cref="Task" />.
        /// </returns>
        public static async Task StartAsync()
        {
            // This ensures that our bots setup directory is initialized and will be were the database config is stored.
            if (!Directory.Exists(Path.Combine(AppContext.BaseDirectory, "setup/")))
            {
                Directory.CreateDirectory(Path.Combine(AppContext.BaseDirectory, "setup/"));
            }

            LogHandler.LogMessage("Loading initial provider", LogSeverity.Verbose);
            var services = new ServiceCollection()
                           .AddSingleton <DatabaseHandler>()
                           .AddSingleton(x => x.GetRequiredService <DatabaseHandler>().Execute <ConfigModel>(DatabaseHandler.Operation.LOAD, id: "Config"))
                           .AddSingleton(new CommandService(new CommandServiceConfig
            {
                ThrowOnError    = false,
                IgnoreExtraArgs = false,
                DefaultRunMode  = RunMode.Async
            }))
                           .AddSingleton(
                x =>
            {
                if (File.Exists(Path.Combine(AppContext.BaseDirectory, "setup/DBConfig.json")))
                {
                    var Settings = JsonConvert.DeserializeObject <DatabaseObject>(File.ReadAllText("setup/DBConfig.json"));
                    return(Settings);
                }

                return(new DatabaseObject());
            })
                           .AddSingleton(x =>
            {
                if (File.Exists(Path.Combine(AppContext.BaseDirectory, "setup/DBConfig.json")))
                {
                    var Settings = JsonConvert.DeserializeObject <DatabaseObject>(File.ReadAllText("setup/DBConfig.json"));
                    if (!string.IsNullOrEmpty(Settings.ProxyUrl))
                    {
                        return(new HttpClientHandler {
                            Proxy = new WebProxy(Settings.ProxyUrl), UseProxy = true
                        });
                    }
                }

                return(new HttpClientHandler());
            })
                           .AddSingleton(x => new HttpClient(x.GetRequiredService <HttpClientHandler>()))
                           .AddSingleton <BotHandler>()
                           .AddSingleton <EventHandler>()
                           .AddSingleton <Events>()
                           .AddSingleton(x => x.GetRequiredService <DatabaseHandler>().InitializeAsync().Result)
                           .AddSingleton(new Random(Guid.NewGuid().GetHashCode()))
                           .AddSingleton(x =>
                                         new DiscordShardedClient(
                                             new DiscordSocketConfig
            {
                MessageCacheSize    = 0,
                AlwaysDownloadUsers = false,
                LogLevel            = LogSeverity.Info,
                TotalShards         = x.GetRequiredService <ConfigModel>().Shards
            }))
                           .AddSingleton(
                x =>
            {
                var config = x.GetRequiredService <ConfigModel>().Prefix;
                var store  = x.GetRequiredService <IDocumentStore>();
                return(new PrefixService(config, store));
            })
                           .AddSingleton <TagService>()
                           .AddSingleton <PartnerService>()
                           .AddSingleton <LevelService>()
                           .AddSingleton <ChannelService>()
                           .AddSingleton <HomeService>()
                           .AddSingleton <ChannelHelper>()
                           .AddSingleton <PartnerHelper>()
                           .AddSingleton <Interactive>()
                           .AddSingleton(
                x =>
            {
                var limits = new TranslateLimitsNew(x.GetRequiredService <IDocumentStore>());
                limits.Initialize();
                return(limits);
            })
                           .AddSingleton(x => new TranslateMethodsNew(x.GetRequiredService <DatabaseObject>(), x.GetRequiredService <TranslateLimitsNew>(), x.GetRequiredService <ConfigModel>()))
                           .AddSingleton <LevelHelper>()
                           .AddSingleton <TranslationService>()
                           .AddSingleton(
                x =>
            {
                var birthdayService = new BirthdayService(x.GetRequiredService <DiscordShardedClient>(), x.GetRequiredService <IDocumentStore>());
                birthdayService.Initialize();
                return(birthdayService);
            })
                           .AddSingleton(
                x =>
            {
                var gameService = new GameService(x.GetRequiredService <IDocumentStore>(), x.GetRequiredService <DatabaseObject>());
                gameService.Initialize();
                return(gameService);
            })
                           .AddSingleton <TimerService>()
                           .AddSingleton <DBLApiService>()
                           .AddSingleton <WaitService>();

            var provider = services.BuildServiceProvider();

            LogHandler.LogMessage("Initializing HomeService", LogSeverity.Verbose);
            provider.GetRequiredService <HomeService>().Update();
            LogHandler.LogMessage("Initializing PrefixService", LogSeverity.Verbose);
            await provider.GetRequiredService <PrefixService>().InitializeAsync();

            LogHandler.LogMessage("Initializing BotHandler", LogSeverity.Verbose);
            await provider.GetRequiredService <BotHandler>().InitializeAsync();

            LogHandler.LogMessage("Initializing EventHandler", LogSeverity.Verbose);
            await provider.GetRequiredService <EventHandler>().InitializeAsync();


            // Indefinitely delay the method from finishing so that the program stays running until stopped.
            await Task.Delay(-1);
        }