Working state, refactored Rory&::LibMatrix
1 files changed, 36 insertions, 0 deletions
diff --git a/MatrixRoomUtils.Core/Extensions/IEnumerableExtensions.cs b/MatrixRoomUtils.Core/Extensions/IEnumerableExtensions.cs
new file mode 100644
index 0000000..98b0aab
--- /dev/null
+++ b/MatrixRoomUtils.Core/Extensions/IEnumerableExtensions.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Text.Json;
+using MatrixRoomUtils.Core.Interfaces;
+using MatrixRoomUtils.Core.Responses;
+
+namespace MatrixRoomUtils.Core.Extensions;
+
+public static class IEnumerableExtensions {
+ public static List<StateEventResponse> DeserializeMatrixTypes(this List<JsonElement> stateEvents) {
+ return stateEvents.Select(DeserializeMatrixType).ToList();
+ }
+
+ public static StateEventResponse DeserializeMatrixType(this JsonElement stateEvent) {
+ var type = stateEvent.GetProperty("type").GetString();
+ var knownType = StateEvent.KnownStateEventTypes.FirstOrDefault(x => x.GetCustomAttribute<MatrixEventAttribute>()?.EventName == type);
+ if (knownType == null) {
+ Console.WriteLine($"Warning: unknown event type '{type}'!");
+ return new StateEventResponse();
+ }
+
+ var eventInstance = Activator.CreateInstance(typeof(StateEventResponse).MakeGenericType(knownType))!;
+ stateEvent.Deserialize(eventInstance.GetType());
+
+ return (StateEventResponse) eventInstance;
+ }
+
+ public static void Replace(this List<StateEvent> stateEvents, StateEvent old, StateEvent @new) {
+ var index = stateEvents.IndexOf(old);
+ if (index == -1) return;
+ stateEvents[index] = @new;
+ }
+}
+
+public class MatrixEventAttribute : Attribute {
+ public string EventName { get; set; }
+}
\ No newline at end of file
|