From 3d07e05fd0ddd19a22a2883d3dc3446b2cfbe27d Mon Sep 17 00:00:00 2001 From: Rory& Date: Sun, 21 Jun 2026 20:41:01 +0200 Subject: Get basic member list working in offload --- .../GuildMemberListUpdate.cs | 65 +++++++++++++++++----- 1 file changed, 52 insertions(+), 13 deletions(-) (limited to 'extra/admin-api/Models/Spacebar.Models.Gateway/GuildMemberListUpdate.cs') 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 Operations { get; set; } = null!; + public List Operations { get; set; } = null!; [JsonPropertyName("groups")] - public List Groups { get; set; } = null!; + public List 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 Items { get; set; } = null!; + [JsonPropertyName("items")] + public List 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 { + public override GuildMemberListSyncItem? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { + var n = JsonSerializer.Deserialize(ref reader, options); + if (n.ContainsKey("id") && n.ContainsKey("count")) return n.Deserialize(); + if (n.ContainsKey("member")) return n.Deserialize(); + 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 { + public override GuildMemberListUpdateOperation? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { + var n = JsonSerializer.Deserialize(ref reader, options); + return n!["op"]!.GetValue() switch { + "sync" => n.Deserialize(), + _ => throw new InvalidCastException("Unknown operation: " + n["op"]!.GetValue()) + }; + } + + public override void Write(Utf8JsonWriter writer, GuildMemberListUpdateOperation value, JsonSerializerOptions options) => + JsonSerializer.Serialize(writer, value, value.GetType(), options); +} + #endregion // TODO: diff algo -- cgit 1.5.1