using System.Text.Json; using System.Text.Json.Serialization; using OrangeGuidanceTomestone.Helpers; namespace OrangeGuidanceTomestone; [Serializable] public class Pack { internal static SemaphoreSlim AllMutex { get; } = new(1, 1); internal static Pack[] All { get; set; } = []; private static readonly JsonSerializerOptions Options = new() { Converters = { new TemplateConverter(), }, PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower, }; public string Name { get; init; } public Guid Id { get; init; } public Template[] Templates { get; init; } public string[]? Conjunctions { get; init; } public List? Words { get; init; } internal static void UpdatePacks() { Task.Run(async () => { var resp = await ServerHelper.SendRequest(null, HttpMethod.Get, "/packs"); var json = await resp.Content.ReadAsStringAsync(); var packs = JsonSerializer.Deserialize(json, Pack.Options)!; await AllMutex.WaitAsync(); try { All = packs; } finally { AllMutex.Release(); } }); } } public class Template { [JsonPropertyName("template")] public string Text { get; init; } public string[]? Words { get; init; } } public class TemplateConverter : JsonConverter