public async Task Execute(IJobExecutionContext context) { try { // Run app-specific boot tasks await RunAppSpecificBootTasks(); // Run one-time tasks await DiscordBot.LoggingChannel.SendMessageAsync($"**[BootHousekeepingJob]** Running one-time tasks"); foreach (Type type in Assembly.GetExecutingAssembly().GetTypes().Where(x => x.IsSubclassOf(typeof(OneTimeTask)) && !x.IsAbstract)) { // Create a new instance and run it await((OneTimeTask)Activator.CreateInstance(type)).RunImpl(); } await DiscordBot.LoggingChannel.SendMessageAsync($"**[BootHousekeepingJob]** Processing joined/left guilds"); // Get a list of guilds IReadOnlyCollection <SocketGuild> socketGuilds = DiscordBot.GetGuilds(); // Get all guild IDs that we have settings for List <ulong> configurationGuilds = new List <ulong>(); foreach (GuildSettings guildSettings in Configuration.LoadedConfiguration.DiscordConfig.GuildSettings) { configurationGuilds.Add(guildSettings.GuildId); } // Get all IDs for guilds that we are in List <ulong> currentGuilds = new List <ulong>(); foreach (SocketGuild socketGuild in DiscordBot.GetGuilds()) { currentGuilds.Add(socketGuild.Id); } // Get all the guilds we have joined IEnumerable <ulong> joinedGuilds = currentGuilds.Except(configurationGuilds); foreach (ulong id in joinedGuilds) { // TODO: find a better solution instead of spamming the Welcome message //await DiscordUtil.ProcessJoinedGuild(socketGuilds.Where(guild => guild.Id == id).FirstOrDefault()); } // Get all the guilds we have been removed from IEnumerable <ulong> removedGuilds = configurationGuilds.Except(currentGuilds); foreach (ulong id in removedGuilds) { await DiscordUtil.ProcessLeftGuild(id, null); } await DiscordBot.LoggingChannel.SendMessageAsync($"**[BootHousekeepingJob]** Saving configuration"); // Save the configuration Configuration.LoadedConfiguration.Write(); // Schedule the RecurringHousekeepingJob await QuartzScheduler.ScheduleJob(TypeUtils.GetSubclassOfType <RecurringHousekeepingJob>(), "Normal", Configuration.LoadedConfiguration.JobSchedules["Recurring"]); // Schedule jobs await SchedulePostBootJobs(); } catch (Exception e) { await DiscordUtil.HandleException(e, "in ``BootHousekeepingJob``"); } }