mirror of
https://github.com/spacebarchat/server.git
synced 2026-08-14 15:30:26 +00:00
Get basic member list working in offload
This commit is contained in:
@@ -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!;
|
||||
|
||||
[JsonPropertyName("items")]
|
||||
public List<GuildMemberListSyncItem> Items { get; set; } = null!;
|
||||
}
|
||||
}
|
||||
|
||||
public class GuildMemberListSyncOperation : BaseGuildMemberListUpdateOperation {
|
||||
[JsonPropertyName("range")]
|
||||
public int[] Range { 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
|
||||
|
||||
Reference in New Issue
Block a user