diff --git a/extra/admin-api/Models/Spacebar.Models.Gateway/GuildMemberListUpdate.cs b/extra/admin-api/Models/Spacebar.Models.Gateway/GuildMemberListUpdate.cs
index 3d81c360..45d28467 100644
--- a/extra/admin-api/Models/Spacebar.Models.Gateway/GuildMemberListUpdate.cs
+++ b/extra/admin-api/Models/Spacebar.Models.Gateway/GuildMemberListUpdate.cs
@@ -1,12 +1,16 @@
+using System.Text.Json;
+using System.Text.Json.Nodes;
using System.Text.Json.Serialization;
using Spacebar.Models.Generic;
public class GuildMemberListUpdate {
+ public const string EventId = "GUILD_MEMBER_LIST_UPDATE";
+
[JsonPropertyName("id")]
public string ListId { get; set; } = null!;
- [JsonPropertyName("guild_id")]
- public string GuildId { get; set; } = null!;
+ [JsonPropertyName("guild_id"), JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)]
+ public long GuildId { get; set; }
[JsonPropertyName("online_count")]
public int OnlineCount { get; set; }
@@ -15,10 +19,10 @@ public class GuildMemberListUpdate {
public int MemberCount { get; set; }
[JsonPropertyName("ops")]
- public List<BaseGuildMemberListUpdateOperation> Operations { get; set; } = null!;
+ public List<GuildMemberListUpdateOperation> Operations { get; set; } = null!;
[JsonPropertyName("groups")]
- public List<GuildMemberListGroupCount> Groups { get; set; } = null!;
+ public List<GuildMemberListSyncItem.RoleEntry> Groups { get; set; } = null!;
}
// i cba to write a dictionary converter for this...
@@ -48,26 +52,61 @@ public enum GuildMemberListUpdateOperationType {
#region Operations
-public class BaseGuildMemberListUpdateOperation {
+[JsonConverter(typeof(GuildMemberListUpdateOperationJsonConverter))]
+public class GuildMemberListUpdateOperation {
[JsonPropertyName("op")]
public GuildMemberListUpdateOperationType Operation { get; set; }
-}
+
+ public class SyncOperation : GuildMemberListUpdateOperation {
+ [JsonPropertyName("range")]
+ public int[] Range { get; set; } = null!;
-public class GuildMemberListSyncOperation : BaseGuildMemberListUpdateOperation {
- [JsonPropertyName("range")]
- public int[] Range { get; set; } = null!;
-
- [JsonPropertyName("items")]
- public List<GuildMemberListSyncItem> Items { get; set; } = null!;
+ [JsonPropertyName("items")]
+ public List<GuildMemberListSyncItem> Items { get; set; } = null!;
+ }
}
+[JsonConverter(typeof(GuildMemberListSyncItemJsonConverter))]
public class GuildMemberListSyncItem {
- public class GuildMemberListMemberSyncItem : GuildMemberListSyncItem {
+ public class RoleEntry : GuildMemberListSyncItem {
+ [JsonPropertyName("id")]
+ public string Id { get; set; }
+
+ [JsonPropertyName("count")]
+ public long Count { get; set; }
+ }
+
+ public class MemberEntry : GuildMemberListSyncItem {
[JsonPropertyName("member")]
public Member Member { get; set; } = null!;
}
}
+public class GuildMemberListSyncItemJsonConverter : JsonConverter<GuildMemberListSyncItem> {
+ public override GuildMemberListSyncItem? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {
+ var n = JsonSerializer.Deserialize<JsonObject>(ref reader, options);
+ if (n.ContainsKey("id") && n.ContainsKey("count")) return n.Deserialize<GuildMemberListSyncItem.RoleEntry>();
+ if (n.ContainsKey("member")) return n.Deserialize<GuildMemberListSyncItem>();
+ throw new InvalidOperationException("Could not determine sync item type for keys " + string.Join(", ", n.Select(x => x.Key)));
+ }
+
+ public override void Write(Utf8JsonWriter writer, GuildMemberListSyncItem value, JsonSerializerOptions options) =>
+ JsonSerializer.Serialize(writer, value, value.GetType(), options);
+}
+
+public class GuildMemberListUpdateOperationJsonConverter : JsonConverter<GuildMemberListUpdateOperation> {
+ public override GuildMemberListUpdateOperation? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {
+ var n = JsonSerializer.Deserialize<JsonObject>(ref reader, options);
+ return n!["op"]!.GetValue<string>() switch {
+ "sync" => n.Deserialize<GuildMemberListUpdateOperation.SyncOperation>(),
+ _ => throw new InvalidCastException("Unknown operation: " + n["op"]!.GetValue<string>())
+ };
+ }
+
+ public override void Write(Utf8JsonWriter writer, GuildMemberListUpdateOperation value, JsonSerializerOptions options) =>
+ JsonSerializer.Serialize(writer, value, value.GetType(), options);
+}
+
#endregion
// TODO: diff algo
|