private async Task Run(bool fastShutdown) { Console.WriteLine($"{(fastShutdown ? "Fast" : "Slow")} shutdown started"); if (!fastShutdown) { // Shutdown the Scheduler await QuartzScheduler.Dispose(); // Shutdown the DiscordBot await DiscordBot.Dispose(); } else { // Create a backup of the current config.json just in case File.Copy(Boot.LOCAL_CONFIGURATION, Boot.LOCAL_CONFIGURATION_AUTOMATIC_BACKUP, true); } // Shutdown Twitter TwitterManager.Dispose(); // Shutdown DigitalOcean DoApi.Dispose(); // Shutdown S3 S3Api.Dispose(); // Shutdown BCAT BcatApi.Dispose(); // Shutdown DAuth DAuthApi.Dispose(); // Shutdown the HandlerMapper HandlerMapper.Dispose(); // Shutdown the KeysetManager KeysetManager.Dispose(); // Shutdown anything app-specific ShutdownAppSpecificItems(); // Save the configuration Configuration.LoadedConfiguration.Write(); if (!fastShutdown) { // Wait a little while await Task.Delay(1000 *ShutdownWaitTime); } Console.WriteLine("Shutdown complete"); }
public async Task Execute(IJobExecutionContext context) { try { // Log that we're about to begin uploading data await DiscordBot.LoggingChannel.SendMessageAsync("**[RomDataUploadJob]** Beginning ROM data upload"); // Create a list of paths whose cache needs to be cleared List <string> clearPaths = new List <string>(); // Create the MSBT S3 path format string string msbtS3BasePath = "/splatoon/blitz_rom/Message/CommonMsg_{0}"; // Loop over every language foreach (Language language in BlitzUtil.SupportedLanguages) { // Log the language await DiscordBot.LoggingChannel.SendMessageAsync($"**[RomDataUploadJob]** Uploading {language.ToString()}'s MSBTs"); // Get the MsbtHolder MsbtHolder msbtHolder = BlitzLocalizer.MsbtHolders[language]; // Loop over every MSBT foreach (KeyValuePair <string, Dictionary <string, string> > pair in msbtHolder.Msbts) { // Construct the path string msbtPath = string.Format(msbtS3BasePath, language.GetSeadCode()); // Construct the file name string fileName = $"{pair.Key}.json"; // Serialize to JSON string json = JsonConvert.SerializeObject(pair.Value); // Upload to S3 S3Api.TransferFile(Encoding.UTF8.GetBytes(json), msbtPath, fileName, "application/json"); // Add to the cache list clearPaths.Add($"{msbtPath}/{fileName}"); } } // Log MSBT upload await DiscordBot.LoggingChannel.SendMessageAsync("**[RomDataUploadJob]** Uploading Mush"); // Create the Mush S3 path string string mushS3Path = "/splatoon/blitz_rom/Mush"; // Get every file in Mush foreach (string path in RomResourceLoader.GetFilesInDirectory("/Mush")) { // Get the BYAML dynamic byaml = ByamlLoader.GetByamlDynamic(path); // Construct the file name string fileName = $"{Path.GetFileNameWithoutExtension(path)}.json"; // Serialize to JSON string json = JsonConvert.SerializeObject(byaml); // Upload to S3 S3Api.TransferFile(Encoding.UTF8.GetBytes(json), mushS3Path, fileName, "application/json"); // Add to the paths to clear clearPaths.Add($"{mushS3Path}/{fileName}"); } // Log CDN cache purge starting await DiscordBot.LoggingChannel.SendMessageAsync($"**[RomDataUploadJob]** Requesting CDN cache purge ({clearPaths.Count} of {clearPaths.Count} files left)"); IEnumerable <string> pathsEnumerable = (IEnumerable <string>)clearPaths; while (pathsEnumerable.Any()) { // Tell DigitalOcean to clear the cache await DoApi.SendRequest(new DoCdnCachePurgeRequest(Configuration.LoadedConfiguration.DoConfig.EndpointId, pathsEnumerable.Take(15).ToList())); // Advance to the next set pathsEnumerable = pathsEnumerable.Skip(15); // Log files left await DiscordBot.LoggingChannel.SendMessageAsync($"**[RomDataUploadJob]** Requesting CDN cache purge ({pathsEnumerable.Count()} of {clearPaths.Count} files left)"); } // Write the app version await DiscordBot.LoggingChannel.SendMessageAsync("**[RomDataUploadJob]** Saving new ROM version to configuration"); (Configuration.LoadedConfiguration as JelonzoBotConfiguration).RomConfig.LastRomVersion = (int)context.JobDetail.JobDataMap["version"]; Configuration.LoadedConfiguration.Write(); // Log that it's complete await DiscordBot.LoggingChannel.SendMessageAsync("**[RomDataUploadJob]** ROM data upload complete"); } catch (Exception e) { await DiscordUtil.HandleException(e, "in ``RomDataUploadJob``"); } }
static async Task Main(string[] args) { // Wait for the debugger to attach if requested if (args.Length > 0 && args[0].ToLower() == "--waitfordebugger") { Console.WriteLine("Waiting for debugger..."); while (!Debugger.IsAttached) { await Task.Delay(1000); } Console.WriteLine("Debugger attached!"); } // Get the type of the Configuration Type configType = TypeUtils.GetSubclassOfType <Configuration>(); // Declare variable to hold the configuration Configuration configuration; // Check if the config file exists if (!File.Exists(LOCAL_CONFIGURATION)) { // Create a new dummy Configuration configuration = (Configuration)Activator.CreateInstance(TypeUtils.GetSubclassOfType <Configuration>()); configuration.SetDefaults(); // Write out the default config configuration.Write(LOCAL_CONFIGURATION); Console.WriteLine("Wrote default configuration to " + LOCAL_CONFIGURATION); return; } // Create the Exception logs directory System.IO.Directory.CreateDirectory(LOCAL_EXCEPTION_LOGS_DIRECTORY); // Load the Configuration Configuration.Load(configType, LOCAL_CONFIGURATION); // Initialize the Localizer Localizer.Initialize(); // Initialize the HandlerMapper HandlerMapper.Initialize(); // Initialize the KeysetManager KeysetManager.Initialize(); // Initialize DAuth DAuthApi.Initialize(); // Initialize BCAT BcatApi.Initialize(); // Initialize S3 S3Api.Initialize(); // Initialize DigitalOcean DoApi.Initialize(); // Initialize Twitter TwitterManager.Initialize(); // Initialize the DiscordBot await DiscordBot.Initialize(); // Initialize the Scheduler await QuartzScheduler.Initialize(); // Wait for the bot to fully initialize while (!DiscordBot.IsReady) { await Task.Delay(1000); } // Print out to the logging channel that we're initialized await DiscordBot.LoggingChannel.SendMessageAsync("\\*\\*\\* **Initialized**"); // Schedule the BootHousekeepingJob await QuartzScheduler.ScheduleJob(TypeUtils.GetSubclassOfType <BootHousekeepingJob>(), "Immediate"); // Register the SIGTERM handler AssemblyLoadContext.Default.Unloading += async x => { // Run Shutdown in fast mode await Shutdown.CreateAndRun(true); }; await Task.Delay(-1); }