diff --git a/extra/admin-api/Models/Spacebar.Models.Gateway/GuildMemberListUpdate.cs b/extra/admin-api/Models/Spacebar.Models.Gateway/GuildMemberListUpdate.cs
index 45d28467..d1692cc7 100644
--- a/extra/admin-api/Models/Spacebar.Models.Gateway/GuildMemberListUpdate.cs
+++ b/extra/admin-api/Models/Spacebar.Models.Gateway/GuildMemberListUpdate.cs
@@ -3,7 +3,8 @@ using System.Text.Json.Nodes;
using System.Text.Json.Serialization;
using Spacebar.Models.Generic;
-public class GuildMemberListUpdate {
+public class GuildMemberListUpdate
+{
public const string EventId = "GUILD_MEMBER_LIST_UPDATE";
[JsonPropertyName("id")]
@@ -22,11 +23,12 @@ public class GuildMemberListUpdate {
public List<GuildMemberListUpdateOperation> Operations { get; set; } = null!;
[JsonPropertyName("groups")]
- public List<GuildMemberListSyncItem.RoleEntry> Groups { get; set; } = null!;
+ public List<GuildMemberListSyncItem.RoleEntry.Content> Groups { get; set; } = null!;
}
// i cba to write a dictionary converter for this...
-public class GuildMemberListGroupCount {
+public class GuildMemberListGroupCount
+{
/// <summary>
/// Role ID, "online" or "offline"
/// </summary>
@@ -40,24 +42,28 @@ public class GuildMemberListGroupCount {
public static implicit operator GuildMemberListGroupCount(KeyValuePair<string, int> kvp) => new() { Id = kvp.Key, Count = kvp.Value };
}
-public enum GuildMemberListUpdateOperationType {
- [JsonStringEnumMemberName("sync")] Sync = 0,
- [JsonStringEnumMemberName("insert")] Insert = 1,
- [JsonStringEnumMemberName("update")] Update = 2,
- [JsonStringEnumMemberName("delete")] Delete = 3,
+[JsonConverter(typeof(JsonStringEnumConverter<GuildMemberListUpdateOperationType>))]
+public enum GuildMemberListUpdateOperationType
+{
+ [JsonStringEnumMemberName("SYNC")] Sync = 0,
+ [JsonStringEnumMemberName("INSERT")] Insert = 1,
+ [JsonStringEnumMemberName("UPDATE")] Update = 2,
+ [JsonStringEnumMemberName("DELETE")] Delete = 3,
- [JsonStringEnumMemberName("invalidate")]
+ [JsonStringEnumMemberName("INVALIDATE")]
Invalidate = 4
}
#region Operations
[JsonConverter(typeof(GuildMemberListUpdateOperationJsonConverter))]
-public class GuildMemberListUpdateOperation {
+public class GuildMemberListUpdateOperation
+{
[JsonPropertyName("op")]
public GuildMemberListUpdateOperationType Operation { get; set; }
-
- public class SyncOperation : GuildMemberListUpdateOperation {
+
+ public class SyncOperation : GuildMemberListUpdateOperation
+ {
[JsonPropertyName("range")]
public int[] Range { get; set; } = null!;
@@ -67,25 +73,36 @@ public class GuildMemberListUpdateOperation {
}
[JsonConverter(typeof(GuildMemberListSyncItemJsonConverter))]
-public class GuildMemberListSyncItem {
- public class RoleEntry : GuildMemberListSyncItem {
- [JsonPropertyName("id")]
- public string Id { get; set; }
+public class GuildMemberListSyncItem
+{
+ public class RoleEntry : GuildMemberListSyncItem
+ {
+ [JsonPropertyName("group")]
+ public Content Group { get; set; }
+
+ public class Content
+ {
+ [JsonPropertyName("id")]
+ public string Id { get; set; }
- [JsonPropertyName("count")]
- public long Count { get; set; }
+ [JsonPropertyName("count")]
+ public long Count { get; set; }
+ }
}
- public class MemberEntry : GuildMemberListSyncItem {
+ 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) {
+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("group")) 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)));
}
@@ -94,11 +111,14 @@ public class GuildMemberListSyncItemJsonConverter : JsonConverter<GuildMemberLis
JsonSerializer.Serialize(writer, value, value.GetType(), options);
}
-public class GuildMemberListUpdateOperationJsonConverter : JsonConverter<GuildMemberListUpdateOperation> {
- public override GuildMemberListUpdateOperation? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions 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>(),
+ return n!["op"]!.GetValue<string>() switch
+ {
+ "SYNC" => n.Deserialize<GuildMemberListUpdateOperation.SyncOperation>(),
_ => throw new InvalidCastException("Unknown operation: " + n["op"]!.GetValue<string>())
};
}
diff --git a/extra/admin-api/Models/Spacebar.Models.Gateway/LazyRequest.cs b/extra/admin-api/Models/Spacebar.Models.Gateway/LazyRequest.cs
index c144eb72..ee7895af 100644
--- a/extra/admin-api/Models/Spacebar.Models.Gateway/LazyRequest.cs
+++ b/extra/admin-api/Models/Spacebar.Models.Gateway/LazyRequest.cs
@@ -12,8 +12,8 @@ public class LazyRequest
[JsonPropertyName("channels")]
public Dictionary<string, List<List<int>>> Channels { get; set; }
- [JsonPropertyName("members")]
- public bool Members { get; set; }
+ [JsonPropertyName("members"), JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)]
+ public List<long>? Members { get; set; }
[JsonPropertyName("threads")]
public bool Threads { get; set; }
diff --git a/extra/admin-api/Models/Spacebar.Models.Generic/Member.cs b/extra/admin-api/Models/Spacebar.Models.Generic/Member.cs
index fa217a37..b11a041b 100644
--- a/extra/admin-api/Models/Spacebar.Models.Generic/Member.cs
+++ b/extra/admin-api/Models/Spacebar.Models.Generic/Member.cs
@@ -23,8 +23,8 @@ public class Member {
[JsonPropertyName("collectibles")]
public object? Collectibles { get; set; }
- [JsonPropertyName("display_name_styles")]
- public object? DisplayNameStyles { get; set; }
+ [JsonPropertyName("display_name_styles"), JsonIgnore(Condition = JsonIgnoreCondition.Never)]
+ public DisplayNameStyle? DisplayNameStyles { get; set; }
[JsonPropertyName("banner")]
public string? Banner { get; set; }
diff --git a/extra/admin-api/Models/Spacebar.Models.Generic/User.cs b/extra/admin-api/Models/Spacebar.Models.Generic/User.cs
index 428794af..ad0028d8 100644
--- a/extra/admin-api/Models/Spacebar.Models.Generic/User.cs
+++ b/extra/admin-api/Models/Spacebar.Models.Generic/User.cs
@@ -1,10 +1,12 @@
+using System.ComponentModel.DataAnnotations;
using System.Diagnostics;
using System.Text.Json.Serialization;
namespace Spacebar.Models.Generic;
[DebuggerDisplay("{Id} ({Username}#{Discriminator})")]
-public class PartialUser {
+public class PartialUser
+{
[JsonPropertyName("id"), JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)]
public required long Id { get; set; }
@@ -26,8 +28,8 @@ public class PartialUser {
[JsonPropertyName("collectibles")]
public object? Collectibles { get; set; }
- [JsonPropertyName("display_name_styles")]
- public object? DisplayNameStyles { get; set; }
+ [JsonPropertyName("display_name_styles"), JsonIgnore(Condition = JsonIgnoreCondition.Never)]
+ public DisplayNameStyle? DisplayNameStyles { get; set; }
[JsonPropertyName("primary_guild")]
public object? PrimaryGuild { get; set; }
@@ -46,4 +48,43 @@ public class PartialUser {
[JsonPropertyName("public_flags")]
public ulong? PublicFlags { get; set; }
+}
+
+public class DisplayNameStyle
+{
+ [JsonPropertyName("font_id")]
+ public Font FontId { get; set; } = Font.Default;
+
+ [JsonPropertyName("effect_id")]
+ public Effect EffectId { get; set; } = Effect.Solid;
+
+ [JsonPropertyName("colors"), MaxLength(2)]
+ public List<int> Colors { get; set; } = [];
+
+ // https://docs.discord.food/resources/user#display-name-font - unsure if these are just really close or directly used by discord while being renamed...
+ public enum Font
+ {
+ Bangers = 1,
+ BioRhyme = 2,
+ CherryBomb = 3,
+ Chicle = 4,
+ Compagnon = 5,
+ MuseoModerno = 6,
+ NeoCastel = 7,
+ Pixelify = 8,
+ Ribes = 9,
+ Sinistre = 10,
+ Default = 11,
+ ZillaSlab = 12
+ }
+
+ public enum Effect
+ {
+ Solid = 1,
+ Gradient = 2,
+ Neon = 3,
+ Toon = 4,
+ Pop = 5,
+ Glow = 6
+ }
}
\ No newline at end of file
|