public Task Execute(IJobExecutionContext context) { _sc = context.Scheduler.Context; _name = context.JobDetail.Key.Name; _tagGroup = (TagGroup)_sc.Get(_name); return _tagGroup.OnSchedulerTriggerRead(); }
public static T GetSchedulerContextData <T>(this SchedulerContext context) { return((T)context.Get(typeof(T).FullName)); }
public static IExecutionHistoryStore GetExecutionHistoryStore(this SchedulerContext context) { return((IExecutionHistoryStore)context.Get(typeof(IExecutionHistoryStore).FullName)); }
public static ExecutionHistoryPlugin GetExecutionHistoryPlugin(this SchedulerContext context) { return((ExecutionHistoryPlugin)context.Get(typeof(ExecutionHistoryPlugin).FullName)); }
public static QuartzminPlugin GetQuartzminPlugin(this SchedulerContext context) { return((QuartzminPlugin)context.Get(typeof(QuartzminPlugin).FullName)); }
public async Task Execute(IJobExecutionContext context) { Log.Information("Starting Challenge Release Job"); SchedulerContext schedulerContext = context.Scheduler.Context; DiscordSocketClient client = (DiscordSocketClient)schedulerContext.Get("client"); IServiceScopeFactory scopeFactory = (IServiceScopeFactory)schedulerContext.Get("scopeFactory"); using var scope = scopeFactory.CreateScope(); var dbContext = scope.ServiceProvider.GetService <DatabaseContext>(); var config = dbContext.Configuration.FirstOrDefault(); if (config == null || config.ChallengeReleaseChannelId == 0) { Log.Information("Aborting Challenge Release Job because some configuration values are not defined"); return; } var channel = client.GetGuild(config.GuildId).GetTextChannel(config.ChallengeReleaseChannelId); var lastChall = await dbContext.Challenges.AsAsyncEnumerable().Where(x => x.State == 2).OrderByDescending(x => x.ReleaseDate).FirstOrDefaultAsync(); var chall = ChallengesManager.GetChallengeToBeReleased(dbContext, release: true).GetAwaiter().GetResult(); if (chall == null) { Log.Information("Aborting Challenge Release Job because no challenge is ready to be released"); return; } if (config.TodaysChannelId != 0 && config.TodaysRoleId != 0) { Log.Information("Deleting and re-creating Today's Channel role"); var oldRole = client.GetGuild(config.GuildId).GetRole(config.TodaysRoleId); var newRole = await client.GetGuild(config.GuildId).CreateRoleAsync(oldRole.Name, oldRole.Permissions, oldRole.Color, oldRole.IsHoisted, oldRole.IsMentionable); await client.GetGuild(config.GuildId).GetTextChannel(config.TodaysChannelId).AddPermissionOverwriteAsync(newRole, new OverwritePermissions(viewChannel: PermValue.Allow)); await oldRole.DeleteAsync(); config.TodaysRoleId = newRole.Id; await dbContext.SaveChangesAsync(); Log.Information("Purging Today's Channel"); var todaysChannel = client.GetGuild(config.GuildId).GetTextChannel(config.TodaysChannelId); var messages = await todaysChannel.GetMessagesAsync(int.MaxValue).FlattenAsync(); messages = messages.Where(x => (DateTimeOffset.UtcNow - x.Timestamp).TotalDays <= 14); if (messages.Any()) { await todaysChannel.DeleteMessagesAsync(messages); } Log.Information("Posting the challenge writeup on today's channel"); if (!string.IsNullOrEmpty(chall.Writeup)) { var writeupEmbed = new CustomEmbedBuilder(); writeupEmbed.WithTitle("Intended Solution"); writeupEmbed.WithDescription(chall.Writeup); var message = await todaysChannel.SendMessageAsync(embed : writeupEmbed.Build()); await message.PinAsync(); } } if (!string.IsNullOrEmpty(chall.Writeup) && config.BoardWriteupsChannelId != 0) { Log.Information("Posting the challenge writeup on the board writeups channel"); var writeupEmbed = new CustomEmbedBuilder(); writeupEmbed.WithTitle($"Writeup for {chall.Title}"); writeupEmbed.WithDescription($"{chall.Writeup}\n**Flag:** {chall.Flag}"); var writeupsChannel = client.GetGuild(config.GuildId).GetTextChannel(config.BoardWriteupsChannelId); await writeupsChannel.SendMessageAsync(embed : writeupEmbed.Build()); } Log.Information("Posting the challenge on Discord"); var embed = ChallengesManager.GetChallengeEmbed(chall); RestUserMessage challengeMessage; if (config.ChallengePingRoleId != 0) { challengeMessage = await channel.SendMessageAsync($"<@&{config.ChallengePingRoleId}>", embed : embed); } else { challengeMessage = await channel.SendMessageAsync(embed : embed); } if (channel is INewsChannel) { await challengeMessage.CrosspostAsync(); } Log.Information("Ending Challenge Release Job"); }