namespace ALttPRandomizer.Service { using ALttPRandomizer.Azure; using ALttPRandomizer.Model; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; using System.Threading.Tasks; public class SeedService { public SeedService(AzureStorage azureStorage, ILogger logger) { this.AzureStorage = azureStorage; this.Logger = logger; } private AzureStorage AzureStorage { get; } private ILogger Logger { get; } public async Task> GetSeed(string seedId) { var files = await this.AzureStorage.GetFiles(seedId); this.Logger.LogDebug("Found files: {@files}", files.Keys); var result = new Dictionary(); if (!files.TryGetValue("settings.json", out var settingsData)) { result["status"] = 404; result["error"] = "seed not found"; return result; } var settingsJson = JsonDocument.Parse(settingsData.ToString()); result["settings"] = settingsJson; var settings = settingsJson.Deserialize(JsonOptions.Default) ?? new SeedSettings(); if (!files.TryGetValue("patch.bps", out var patchData)) { if (files.ContainsKey("generating")) { result["status"] = 409; result["error"] = "generation still in progress"; return result; } else { result["status"] = 404; result["error"] = "generation failed"; result["retry"] = true; return result; } } result["patch"] = Convert.ToBase64String(patchData.ToArray()); if (files.TryGetValue("meta.json", out var metaData)) { var json = JsonDocument.Parse(metaData.ToString()); result["meta"] = json; } if (files.TryGetValue("parent", out var parent)) { result["parent"] = parent.ToString(); } if (settings.Race != RaceMode.Race && files.TryGetValue("spoiler.json", out var spoilerData)) { var json = JsonDocument.Parse(spoilerData.ToString()); result["spoiler"] = json; } result["status"] = 200; return result; } public async Task> GetMulti(string multiId) { var files = await this.AzureStorage.GetFiles(multiId); this.Logger.LogDebug("Found files: {@files}", files.Keys); var result = new Dictionary(); if (!files.TryGetValue("settings.json", out var settingsData)) { result["status"] = 404; result["error"] = "multi not found"; return result; } var settingsJson = JsonDocument.Parse(settingsData.ToString()); result["settings"] = settingsJson; var settings = settingsJson.Deserialize>(JsonOptions.Default) ?? new List(); if (!files.TryGetValue("multidata", out var multidata)) { if (files.ContainsKey("generating")) { result["status"] = 409; result["error"] = "generation still in progress"; return result; } else { result["status"] = 404; result["error"] = "generation failed"; return result; } } result["multidata"] = Convert.ToBase64String(multidata.ToArray()); if (files.TryGetValue("meta.json", out var metaData)) { var json = JsonDocument.Parse(metaData.ToString()); result["meta"] = json; } if (files.TryGetValue("worlds.json", out var worlds)) { var json = JsonDocument.Parse(worlds.ToString()); result["worlds"] = json; } if (!settings.Any(s => s.Race == RaceMode.Race) && files.TryGetValue("spoiler.json", out var spoilerData)) { var json = JsonDocument.Parse(spoilerData.ToString()); result["spoiler"] = json; } result["status"] = 200; return result; } } }