2022-09-08 03:13:55 +00:00
|
|
|
using Newtonsoft.Json;
|
|
|
|
using OrangeGuidanceTomestone.Helpers;
|
2022-09-03 12:59:06 +00:00
|
|
|
|
2022-09-03 02:59:45 +00:00
|
|
|
namespace OrangeGuidanceTomestone;
|
|
|
|
|
|
|
|
[Serializable]
|
|
|
|
public class Pack {
|
2022-09-08 03:13:55 +00:00
|
|
|
internal static SemaphoreSlim AllMutex { get; } = new(1, 1);
|
2024-06-12 18:16:53 +00:00
|
|
|
internal static Pack[] All { get; set; } = [];
|
2022-09-03 12:59:06 +00:00
|
|
|
|
2022-09-03 02:59:45 +00:00
|
|
|
public string Name { get; init; }
|
|
|
|
public Guid Id { get; init; }
|
2024-06-15 22:42:22 +00:00
|
|
|
|
|
|
|
[JsonConverter(typeof(TemplateConverter))]
|
|
|
|
public ITemplate[] Templates { get; init; }
|
|
|
|
|
|
|
|
public string[]? Conjunctions { get; init; }
|
|
|
|
public List<WordList>? Words { get; init; }
|
2022-09-08 03:13:55 +00:00
|
|
|
|
|
|
|
internal static void UpdatePacks() {
|
|
|
|
Task.Run(async () => {
|
|
|
|
var resp = await ServerHelper.SendRequest(null, HttpMethod.Get, "/packs");
|
|
|
|
var json = await resp.Content.ReadAsStringAsync();
|
|
|
|
var packs = JsonConvert.DeserializeObject<Pack[]>(json)!;
|
|
|
|
await AllMutex.WaitAsync();
|
2023-01-22 03:42:03 +00:00
|
|
|
try {
|
|
|
|
All = packs;
|
|
|
|
} finally {
|
|
|
|
AllMutex.Release();
|
|
|
|
}
|
2022-09-08 03:13:55 +00:00
|
|
|
});
|
|
|
|
}
|
2022-09-03 02:59:45 +00:00
|
|
|
}
|
|
|
|
|
2024-06-15 22:42:22 +00:00
|
|
|
public interface ITemplate {
|
|
|
|
public string Template { get; }
|
|
|
|
public string[]? Words { get; }
|
|
|
|
}
|
|
|
|
|
|
|
|
public class BasicTemplate : ITemplate {
|
|
|
|
public string Template { get; init; }
|
|
|
|
public string[]? Words => null;
|
|
|
|
}
|
|
|
|
|
|
|
|
[Serializable]
|
|
|
|
public class WordListTemplate : ITemplate {
|
|
|
|
public string Template { get; init; }
|
|
|
|
public string[] Words { get; init; }
|
|
|
|
}
|
|
|
|
|
|
|
|
public class TemplateConverter : JsonConverter<ITemplate>
|
|
|
|
{
|
|
|
|
public override ITemplate? ReadJson(JsonReader reader, Type objectType, ITemplate? existingValue, bool hasExistingValue, JsonSerializer serializer) {
|
|
|
|
if (reader.TokenType == JsonToken.String) {
|
|
|
|
var template = reader.ReadAsString();
|
|
|
|
if (template == null) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
return new BasicTemplate {
|
|
|
|
Template = template,
|
|
|
|
};
|
|
|
|
} else if (reader.TokenType == JsonToken.StartObject) {
|
|
|
|
return serializer.Deserialize<WordListTemplate>(reader);
|
|
|
|
} else {
|
|
|
|
throw new JsonReaderException("unexpected template kind");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public override void WriteJson(JsonWriter writer, ITemplate? value, JsonSerializer serializer) {
|
|
|
|
if (value is BasicTemplate basic) {
|
|
|
|
serializer.Serialize(writer, basic.Template);
|
|
|
|
} else if (value is WordListTemplate wordList) {
|
|
|
|
serializer.Serialize(writer, wordList);
|
|
|
|
} else {
|
|
|
|
throw new JsonWriterException("unexpected template kind");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-09-03 02:59:45 +00:00
|
|
|
[Serializable]
|
|
|
|
public class WordList {
|
|
|
|
public string Name { get; init; }
|
|
|
|
public string[] Words { get; init; }
|
|
|
|
}
|