diff --git a/extra/admin-api/Models/Spacebar.Models.Generic/Channel.cs b/extra/admin-api/Models/Spacebar.Models.Generic/Channel.cs
index 857d2e78..01a91c64 100644
--- a/extra/admin-api/Models/Spacebar.Models.Generic/Channel.cs
+++ b/extra/admin-api/Models/Spacebar.Models.Generic/Channel.cs
@@ -2,6 +2,10 @@ using System.Text.Json.Serialization;
namespace Spacebar.Models.Generic;
+public class Channel {
+
+}
+
public class ChannelPermissionOverwrite {
[JsonPropertyName("id")]
public string Id { get; set; }
diff --git a/extra/admin-api/Models/Spacebar.Models.Generic/Emoji.cs b/extra/admin-api/Models/Spacebar.Models.Generic/Emoji.cs
new file mode 100644
index 00000000..c47d2a78
--- /dev/null
+++ b/extra/admin-api/Models/Spacebar.Models.Generic/Emoji.cs
@@ -0,0 +1,35 @@
+using System.Text.Json.Serialization;
+
+namespace Spacebar.Models.Generic;
+
+public class Emoji {
+ [JsonPropertyName("id"), JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)]
+ public required long Id { get; set; }
+
+ [JsonPropertyName("animated")]
+ public bool Animated { get; set; }
+
+ [JsonPropertyName("available")]
+ public bool Available { get; set; }
+
+ [JsonPropertyName("groups")]
+ public object? Groups { get; set; } // TODO: what is this?
+
+ [JsonPropertyName("guild_id"), JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)]
+ public required long GuildId { get; set; }
+
+ [JsonPropertyName("managed")]
+ public bool Managed { get; set; }
+
+ [JsonPropertyName("name")]
+ public required string Name { get; set; }
+
+ [JsonPropertyName("require_colons")]
+ public bool RequireColons { get; set; }
+
+ [JsonPropertyName("roles")]
+ public List<object?> Roles { get; set; } // TODO: what type was this again?
+
+ [JsonPropertyName("user_id"), JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)]
+ public required long UserId { get; set; }
+}
\ No newline at end of file
diff --git a/extra/admin-api/Models/Spacebar.Models.Generic/Guild.cs b/extra/admin-api/Models/Spacebar.Models.Generic/Guild.cs
new file mode 100644
index 00000000..239fee5d
--- /dev/null
+++ b/extra/admin-api/Models/Spacebar.Models.Generic/Guild.cs
@@ -0,0 +1,133 @@
+using System.Diagnostics;
+using System.Text.Json.Serialization;
+
+namespace Spacebar.Models.Generic;
+
+[DebuggerDisplay("{Id} ({Name})")]
+public class Guild {
+ [JsonPropertyName("id"), JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)]
+ public required long Id { get; set; }
+
+ [JsonPropertyName("afk_channel_id"), JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)]
+ public required long? AfkChannelId { get; set; }
+
+ [JsonPropertyName("afk_timeout")]
+ public int AfkTimeout { get; set; }
+
+ [JsonPropertyName("banner")]
+ public string? Banner { get; set; }
+
+ [JsonPropertyName("channels")]
+ public List<Channel> Channels { get; set; }
+
+ [JsonPropertyName("default_message_notifications")]
+ public int DefaultMessageNotifications { get; set; } // TODO enum
+
+ [JsonPropertyName("description")]
+ public string? Description { get; set; }
+
+ [JsonPropertyName("discovery_splash")]
+ public string? DiscoverySplash { get; set; }
+
+ [JsonPropertyName("emojis")]
+ public List<Emoji> Emojis { get; set; }
+
+ [JsonPropertyName("explicit_content_filter")]
+ public int ExplicitContentFilter { get; set; }
+
+ [JsonPropertyName("features")]
+ public List<string> Features { get; set; }
+
+ [JsonPropertyName("guild_scheduled_events")]
+ public List<object> GuildScheduledEvents { get; set; } // TODO: implement
+
+ [JsonPropertyName("icon")]
+ public string? Icon { get; set; }
+
+ [JsonPropertyName("joined_at")]
+ public DateTimeOffset JoinedAt { get; set; }
+
+ [JsonPropertyName("large")]
+ public bool Large { get; set; }
+
+ [JsonPropertyName("max_members")]
+ public int MaxMembers { get; set; }
+
+ [JsonPropertyName("max_presences")]
+ public int MaxPresences { get; set; }
+
+ [JsonPropertyName("max_video_channel_users")]
+ public int MaxVideoChannelUsers { get; set; }
+
+ [JsonPropertyName("member_count")]
+ public int MemberCount { get; set; }
+
+ [JsonPropertyName("mfa_level")]
+ public int MfaLevel { get; set; }
+
+ [JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ [JsonPropertyName("nsfw_level")]
+ public int NsfwLevel { get; set; }
+
+ [JsonPropertyName("owner_id"), JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)]
+ public required long OwnerId { get; set; }
+
+ [JsonPropertyName("preferred_locale")]
+ public string PreferredLocale { get; set; }
+
+ [JsonPropertyName("premium_progress_bar_enabled")]
+ public bool? PremiumProgressBarEnabled { get; set; }
+
+ [JsonPropertyName("premium_subscription_count")]
+ public int PremiumSubscriptionCount { get; set; }
+
+ [JsonPropertyName("premium_tier")]
+ public int PremiumTier { get; set; }
+
+ [JsonPropertyName("presences")]
+ public List<Presence> Presences { get; set; } // TODO: correct type?
+
+ [JsonPropertyName("public_updates_channel_id"), JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)]
+ public long? PublicUpdatesChannelId { get; set; }
+
+ [JsonPropertyName("region")]
+ public string Region { get; set; }
+
+ [JsonPropertyName("roles")]
+ public List<Role> Roles { get; set; }
+
+ [JsonPropertyName("rules_channel_id"), JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)]
+ public long? RulesChannelId { get; set; }
+
+ [JsonPropertyName("splash")]
+ public string? Splash { get; set; }
+
+ [JsonPropertyName("stickers")]
+ public List<Sticker> Stickers { get; set; }
+
+ [JsonPropertyName("system_channel_flags")]
+ public int SystemChannelFlags { get; set; } //TODO enum
+
+ [JsonPropertyName("system_channel_id"), JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)]
+ public long? SystemChannelId { get; set; }
+
+ [JsonPropertyName("threads")]
+ public List<Channel> Threads { get; set; }
+
+ [JsonPropertyName("verification_level")]
+ public int VerificationLevel { get; set; }
+
+ [JsonPropertyName("voice_states")]
+ public List<object> VoiceStates { get; set; } // TODO: models
+
+ [JsonPropertyName("welcome_screen")]
+ public object WelcomeScreen { get; set; } // TODO: models
+
+ [JsonPropertyName("widget_channel_id"), JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)]
+ public long? WidgetChannelId { get; set; }
+
+ [JsonPropertyName("widget_enabled")]
+ public bool WidgetEnabled { get; set; }
+}
\ No newline at end of file
diff --git a/extra/admin-api/Models/Spacebar.Models.Generic/Role.cs b/extra/admin-api/Models/Spacebar.Models.Generic/Role.cs
new file mode 100644
index 00000000..6c49f85e
--- /dev/null
+++ b/extra/admin-api/Models/Spacebar.Models.Generic/Role.cs
@@ -0,0 +1,62 @@
+using System.Text.Json.Serialization;
+using Spacebar.Models.Generic.Constants;
+
+namespace Spacebar.Models.Generic;
+
+public class Role {
+ [JsonPropertyName("id"), JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)]
+ public required long Id { get; set; }
+
+ [JsonPropertyName("color"), Obsolete("See Colors instead")]
+ public int Color { get; set; }
+
+ [JsonPropertyName("colors")]
+ public RoleColors Colors { get; set; }
+
+ [JsonPropertyName("flags")]
+ public int Flags { get; set; }
+
+ [JsonPropertyName("guild_id"), JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)]
+ public required long GuildId { get; set; }
+
+ [JsonPropertyName("hoist")]
+ public bool Hoist { get; set; }
+
+ [JsonPropertyName("icon")]
+ public string Icon { get; set; }
+
+ [JsonPropertyName("managed")]
+ public bool Managed { get; set; }
+
+ [JsonPropertyName("mentionable")]
+ public bool Mentionable { get; set; }
+
+ [JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ [JsonPropertyName("permissions"), JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)]
+ public required ulong RawPermissions { get; set; }
+
+ [JsonIgnore]
+ public Permissions Permissions {
+ get => (Permissions)RawPermissions;
+ set => RawPermissions = (ulong)value;
+ }
+
+ [JsonPropertyName("position")]
+ public int Position { get; set; }
+
+ [JsonPropertyName("unicode_emoji")]
+ public string UnicodeEmoji { get; set; }
+
+ public class RoleColors {
+ [JsonPropertyName("primary_color")]
+ public required int PrimaryColor { get; set; }
+
+ [JsonPropertyName("secondary_color")]
+ public int? SecondaryColor { get; set; }
+
+ [JsonPropertyName("tertiary_color")]
+ public int? TertiaryColor { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/extra/admin-api/Models/Spacebar.Models.Generic/Sticker.cs b/extra/admin-api/Models/Spacebar.Models.Generic/Sticker.cs
new file mode 100644
index 00000000..28bf4feb
--- /dev/null
+++ b/extra/admin-api/Models/Spacebar.Models.Generic/Sticker.cs
@@ -0,0 +1,38 @@
+using System.Text.Json.Serialization;
+
+namespace Spacebar.Models.Generic;
+
+public class Sticker {
+ [JsonPropertyName("id"), JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)]
+ public required long Id { get; set; }
+
+ [JsonPropertyName("name")]
+ public string Name { get; set; }
+
+ [JsonPropertyName("description")]
+ public string Description { get; set; }
+
+ [JsonPropertyName("tags")]
+ public string Tags { get; set; }
+
+ [JsonPropertyName("available")]
+ public bool Available { get; set; }
+
+ [JsonPropertyName("type")]
+ public StickerType Type { get; set; }
+
+ [JsonPropertyName("format_type")]
+ public StickerFormatType FormatType { get; set; }
+}
+
+public enum StickerType {
+ Standard = 1,
+ Guild = 2
+}
+
+public enum StickerFormatType {
+ Png = 1,
+ Apng = 2,
+ Lottie = 3,
+ Gif = 4
+}
\ No newline at end of file
|