/// <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; } }