summary refs log tree commit diff
path: root/extra/admin-api/Models
diff options
context:
space:
mode:
Diffstat (limited to 'extra/admin-api/Models')
-rw-r--r--extra/admin-api/Models/Spacebar.Models.Gateway/GuildMemberListUpdate.cs65
1 files changed, 52 insertions, 13 deletions
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