public static async Task Main(string[] args) { await AppDbContext.InitAsync(); using (AppDbContext context = new AppDbContext()) { var lastLog = await context.Logs.OrderByDescending(x => x.Id).FirstOrDefaultAsync(); //Ensure there's a single instance being executed. if (lastLog != null && lastLog.State == GeoLogState.Pending && ((DateTime.UtcNow - lastLog.StartDate).TotalMinutes) < 10) // Pending state might be fake, ignore it after 10 minutes { return; } var last_execution_date = lastLog?.EndDate ?? lastLog?.StartDate ?? DateTime.MinValue; var log = new Log { StartDate = DateTime.UtcNow }; context.Logs.Add(log); await context.SaveChangesAsync(); try { IConfigurationRoot configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .Build(); var credentials = configuration.GetSection("Credentials").Get <Credentials>(); var botSettings = configuration.GetSection("BotSettings").Get <BotSettings>(); // credentials = new Credentials { Address = "http://127.0.0.1:8080/mediawiki", Username = "******", Password = "******" }; KabLatinizerBot bot = await BotFactory.CreateInstanceAsync <KabLatinizerBot>(credentials.Address, credentials.Username, credentials.Password); if (botSettings != null) { bot.SaveDelay = botSettings.SaveDelay; bot.MaxLag = botSettings.MaxLag; bot.RetryCountPerRequest = botSettings.RetryCountPerRequest; } log.NumberOfModifiedPages = await bot.DoJobAsync(last_execution_date); } catch (Exception e) { log.Error = e.ToString(); } log.EndDate = DateTime.UtcNow; await context.SaveChangesAsync(); } }