using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text.Json; using System.Text.Json.Nodes; using System.Text.Json.Serialization; using ArcaneLibs; using ArcaneLibs.Extensions; using LibMatrix.Extensions; using LibMatrix.Helpers; using LibMatrix.Interfaces; namespace LibMatrix; public class StateEvent { public static List KnownStateEventTypes = new ClassCollector().ResolveFromAllAccessibleAssemblies(); public static Type GetStateEventType(string type) { if (type == "m.receipt") { return typeof(Dictionary); } var eventType = KnownStateEventTypes.FirstOrDefault(x => x.GetCustomAttributes()?.Any(y => y.EventName == type) ?? false); return eventType ?? typeof(object); } public object TypedContent { get { try { return RawContent.Deserialize(GetType)!; } catch (JsonException e) { Console.WriteLine(e); Console.WriteLine("Content:\n" + (RawContent?.ToJson() ?? "null")); } return null; } set => RawContent = JsonSerializer.Deserialize(JsonSerializer.Serialize(value)); } [JsonPropertyName("state_key")] public string StateKey { get; set; } = ""; private string _type; [JsonPropertyName("type")] public string Type { get => _type; set { _type = value; // if (RawContent is not null && this is StateEventResponse stateEventResponse) { // if (File.Exists($"unknown_state_events/{Type}/{stateEventResponse.EventId}.json")) return; // var x = GetType.Name; // } } } [JsonPropertyName("replaces_state")] public string? ReplacesState { get; set; } private JsonObject? _rawContent; [JsonPropertyName("content")] public JsonObject? RawContent { get => _rawContent; set { _rawContent = value; // if (Type is not null && this is StateEventResponse stateEventResponse) { // if (File.Exists($"unknown_state_events/{Type}/{stateEventResponse.EventId}.json")) return; // var x = GetType.Name; // } } } [JsonIgnore] public new Type GetType { get { var type = GetStateEventType(Type); //special handling for some types // if (type == typeof(RoomEmotesEventData)) { // RawContent["emote"] = RawContent["emote"]?.AsObject() ?? new JsonObject(); // } // // if (this is StateEventResponse stateEventResponse) { // if (type == null || type == typeof(object)) { // Console.WriteLine($"Warning: unknown event type '{Type}'!"); // Console.WriteLine(RawContent.ToJson()); // Directory.CreateDirectory($"unknown_state_events/{Type}"); // File.WriteAllText($"unknown_state_events/{Type}/{stateEventResponse.EventId}.json", // RawContent.ToJson()); // Console.WriteLine($"Saved to unknown_state_events/{Type}/{stateEventResponse.EventId}.json"); // } // else if (RawContent is not null && RawContent.FindExtraJsonObjectFields(type)) { // Directory.CreateDirectory($"unknown_state_events/{Type}"); // File.WriteAllText($"unknown_state_events/{Type}/{stateEventResponse.EventId}.json", // RawContent.ToJson()); // Console.WriteLine($"Saved to unknown_state_events/{Type}/{stateEventResponse.EventId}.json"); // } // } return type; } } //debug [JsonIgnore] public string dtype { get { var res = GetType().Name switch { "StateEvent`1" => "StateEvent", _ => GetType().Name }; return res; } } [JsonIgnore] public string cdtype => TypedContent.GetType().Name; }