From a75c38ff2a4bc87adcdd668b0f17daf645c68252 Mon Sep 17 00:00:00 2001 From: Rory& Date: Thu, 25 Dec 2025 23:01:27 +0100 Subject: [PATCH] C#: db config model --- .../{Class1.cs => Config.cs} | 0 .../DefaultsConfiguration.cs | 4 +- .../LimitsConfiguration.cs | 189 ++++++++- .../SecurityConfiguration.cs | 99 ++++- .../ServerConfiguration.cs | 383 +++++++++++++++--- 5 files changed, 587 insertions(+), 88 deletions(-) rename extra/admin-api/Spacebar.ConfigModel/{Class1.cs => Config.cs} (100%) diff --git a/extra/admin-api/Spacebar.ConfigModel/Class1.cs b/extra/admin-api/Spacebar.ConfigModel/Config.cs similarity index 100% rename from extra/admin-api/Spacebar.ConfigModel/Class1.cs rename to extra/admin-api/Spacebar.ConfigModel/Config.cs diff --git a/extra/admin-api/Spacebar.ConfigModel/DefaultsConfiguration.cs b/extra/admin-api/Spacebar.ConfigModel/DefaultsConfiguration.cs index 884f3d540..3cac4cbe7 100644 --- a/extra/admin-api/Spacebar.ConfigModel/DefaultsConfiguration.cs +++ b/extra/admin-api/Spacebar.ConfigModel/DefaultsConfiguration.cs @@ -4,8 +4,8 @@ namespace Spacebar.ConfigModel; public class DefaultsConfiguration { - [JsonPropertyName("guild")] public GuildDefaults Guild = new GuildDefaults(); - [JsonPropertyName("user")] public ChannelDefaults Channel = new ChannelDefaults(); + [JsonPropertyName("guild")] public GuildDefaults Guild = new(); + [JsonPropertyName("user")] public ChannelDefaults Channel = new(); } public class GuildDefaults diff --git a/extra/admin-api/Spacebar.ConfigModel/LimitsConfiguration.cs b/extra/admin-api/Spacebar.ConfigModel/LimitsConfiguration.cs index 8a7737441..56648bd33 100644 --- a/extra/admin-api/Spacebar.ConfigModel/LimitsConfiguration.cs +++ b/extra/admin-api/Spacebar.ConfigModel/LimitsConfiguration.cs @@ -3,10 +3,187 @@ using System.Text.Json.Serialization; namespace Spacebar.ConfigModel; public class LimitsConfiguration { - [JsonPropertyName("user")] public UserLimits User = new UserLimits(); - [JsonPropertyName("guild")] public GuildLimits Guild = new GuildLimits(); - [JsonPropertyName("message")] public MessageLimits Message = new MessageLimits(); - [JsonPropertyName("channel")] public ChannelLimits Channel = new ChannelLimits(); - [JsonPropertyName("rate")] public RateLimits Rate = new RateLimits(); - [JsonPropertyName("absoluteRate")] public GlobalRateLimits AbsoluteRate = new GlobalRateLimits(); + [JsonPropertyName("user")] + public UserLimits User { get; set; } = new UserLimits(); + + [JsonPropertyName("guild")] + public GuildLimits Guild { get; set; } = new GuildLimits(); + + [JsonPropertyName("message")] + public MessageLimits Message { get; set; } = new MessageLimits(); + + [JsonPropertyName("channel")] + public ChannelLimits Channel { get; set; } = new ChannelLimits(); + + [JsonPropertyName("rate")] + public RateLimits Rate { get; set; } = new RateLimits(); + + [JsonPropertyName("absoluteRate")] + public GlobalRateLimits AbsoluteRate { get; set; } = new GlobalRateLimits(); +} + +public class GlobalRateLimits { + [JsonPropertyName("register")] + public GlobalRateLimit Register { get; set; } = new() { + Enabled = true, + Count = 25, + Window = 60 * 60 * 1000 + }; + + [JsonPropertyName("sendMessage")] + public GlobalRateLimit SendMessage { get; set; } = new() { + Enabled = true, + Count = 200, + Window = 60 * 1000 + }; + + public class GlobalRateLimit : RateLimits.RateLimitOptions { + [JsonPropertyName("enabled")] + public bool Enabled { get; set; } = true; + } +} + +public class RateLimits { + [JsonPropertyName("enabled")] + public bool Enabled { get; set; } = true; + + [JsonPropertyName("ip")] + public RateLimitOptions Ip { get; set; } = new RateLimitOptions() { + Count = 500, + Window = 5 + }; + + [JsonPropertyName("global")] + public RateLimitOptions Global { get; set; } = new RateLimitOptions() { + Count = 250, + Window = 5 + }; + + [JsonPropertyName("error")] + public RateLimitOptions Error { get; set; } = new RateLimitOptions() { + Count = 50, + Window = 5 + }; + + [JsonPropertyName("routes")] + public RouteRateLimits Routes { get; set; } = new RouteRateLimits(); + + public class RouteRateLimits { + [JsonPropertyName("guild")] + public RateLimitOptions Guild { get; set; } = new RateLimitOptions() { + Count = 5, + Window = 5 + }; + + [JsonPropertyName("webhook")] + public RateLimitOptions Webhook { get; set; } = new RateLimitOptions() { + Count = 10, + Window = 5 + }; + + [JsonPropertyName("channel")] + public RateLimitOptions Channel { get; set; } = new RateLimitOptions() { + Count = 10, + Window = 5 + }; + + [JsonPropertyName("auth")] + public AuthRateLimits Auth { get; set; } = new AuthRateLimits(); + + public class AuthRateLimits { + [JsonPropertyName("login")] + public RateLimitOptions Login { get; set; } = new RateLimitOptions() { + Count = 5, + Window = 60 + }; + + [JsonPropertyName("register")] + public RateLimitOptions Register { get; set; } = new RateLimitOptions() { + Count = 2, + Window = 60 * 60 * 12 + }; + } + } + + public class RateLimitOptions { + [JsonPropertyName("count")] + public int Count { get; set; } + + [JsonPropertyName("window")] + public int Window { get; set; } + + [JsonIgnore] + public TimeSpan WindowTimeSpan => TimeSpan.FromSeconds(Window); + } +} + +public class ChannelLimits { + [JsonPropertyName("maxPins")] + public int MaxPins { get; set; } = 500; + + [JsonPropertyName("maxTopic")] + public int MaxTopic { get; set; } = 1024; + + [JsonPropertyName("maxWebhooks")] + public int MaxWebhooks { get; set; } = 100; +} + +public class MessageLimits { + [JsonPropertyName("maxCharacters")] + public int MaxCharacters { get; set; } = 1048576; + + [JsonPropertyName("maxTTSCharacters")] + public int MaxTTSCharacters { get; set; } = 160; + + [JsonPropertyName("maxReactions")] + public int MaxReactions { get; set; } = 2048; + + [JsonPropertyName("maxAttachmentSize")] + public int MaxAttachmentSize { get; set; } = 1024 * 1024 * 1024; + + [JsonPropertyName("maxBulkDelete")] + public int MaxBulkDelete { get; set; } = 1000; + + [JsonPropertyName("maxEmbedDownloadSize")] + public int MaxEmbedDownloadSize { get; set; } = 1024 * 1024 * 1024; + + [JsonPropertyName("maxPreloadCount")] + public int MaxPreloadCount { get; set; } = 100; +} + +public class GuildLimits { + [JsonPropertyName("maxRoles")] + public int MaxRoles { get; set; } = 1000; + + [JsonPropertyName("maxEmojis")] + public int MaxEmojis { get; set; } = 2000; + + [JsonPropertyName("maxStickers")] + public int MaxStickers { get; set; } = 500; + + [JsonPropertyName("maxMembers")] + public int MaxMembers { get; set; } = 25000000; + + [JsonPropertyName("maxChannels")] + public int MaxChannels { get; set; } = 65535; + + [JsonPropertyName("maxBulkBanUsers")] + public int MaxBulkBanUsers { get; set; } = 200; + + [JsonPropertyName("maxChannelsInCategory")] + public int MaxChannelsInCategory { get; set; } = 65536; +} + +public class UserLimits { + [JsonPropertyName("maxGuilds")] + public int MaxGuilds { get; set; } = 1048576; + + [JsonPropertyName("maxUsername")] + public int MaxUsername { get; set; } = 32; + + [JsonPropertyName("maxFriends")] + public int MaxFriends { get; set; } = 5000; + + [JsonPropertyName("maxBio")] + public int MaxBio { get; set; } = 190; } \ No newline at end of file diff --git a/extra/admin-api/Spacebar.ConfigModel/SecurityConfiguration.cs b/extra/admin-api/Spacebar.ConfigModel/SecurityConfiguration.cs index 017e89ba9..e1592c8d4 100644 --- a/extra/admin-api/Spacebar.ConfigModel/SecurityConfiguration.cs +++ b/extra/admin-api/Spacebar.ConfigModel/SecurityConfiguration.cs @@ -2,25 +2,82 @@ using System.Text.Json.Serialization; namespace Spacebar.ConfigModel; -public class SecurityConfiguration -{ - [JsonPropertyName("captcha")] public CaptchaConfiguration Captcha = new CaptchaConfiguration(); - [JsonPropertyName("twoFactor")] public TwoFactorConfiguration TwoFactor = new TwoFactorConfiguration(); - [JsonPropertyName("autoUpdate")] public bool AutoUpdate = true; - [JsonPropertyName("requestSignature")] public string RequestSignature; // = crypto.randomBytes(32).toString("base64"); - [JsonPropertyName("jwtSecret")] public string? JwtSecret = null; - [JsonPropertyName("forwardedFor")] public string? ForwardedFor = null; - [JsonPropertyName("trustedProxies")] public string TrustedProxies = null; - [JsonPropertyName("abuseIpDbApiKey")] public string? AbuseIpDbApiKey = null; - [JsonPropertyName("abuseipdbBlacklistRatelimit")] public int AbuseipdbBlacklistRatelimit = 5; - [JsonPropertyName("abuseipdbConfidenceScoreTreshold")] public int AbuseipdbConfidenceScoreTreshold = 50; - [JsonPropertyName("ipdataApiKey")] public string? IpdataApiKey = null; - [JsonPropertyName("mfaBackupCodeCount")] public int MfaBackupCodeCount = 10; - [JsonPropertyName("statsWorldReadable")] public bool StatsWorldReadable = true; - [JsonPropertyName("defaultRegistrationTokenExpiration")] public int DefaultRegistrationTokenExpiration = 1000 * 60 * 60 * 24 * 7; - [JsonPropertyName("cdnSignUrls")] public bool CdnSignUrls = false; - [JsonPropertyName("cdnSignatureKey")] public string CdnSignatureKey = crypto.randomBytes(32).toString("base64"); - [JsonPropertyName("cdnSignatureDuration")] public string CdnSignatureDuration = "24h"; - [JsonPropertyName("cdnSignatureIncludeIp")] public bool CdnSignatureIncludeIp = true; - [JsonPropertyName("cdnSignatureIncludeUserAgent")] public bool CdnSignatureIncludeUserAgent = true; +public class SecurityConfiguration { + [JsonPropertyName("captcha")] + public CaptchaConfiguration Captcha { get; set; } = new(); + + [JsonPropertyName("twoFactor")] + public TwoFactorConfiguration TwoFactor { get; set; } = new(); + + [JsonPropertyName("autoUpdate")] + public bool AutoUpdate { get; set; } = true; + + [JsonPropertyName("requestSignature")] public string RequestSignature; // {get;set;}=crypto.randomBytes(32).toString("base64"); + + [JsonPropertyName("jwtSecret")] + public string? JwtSecret { get; set; } = null; + + [JsonPropertyName("forwardedFor")] + public string? ForwardedFor { get; set; } = null; + + [JsonPropertyName("trustedProxies")] + public string TrustedProxies { get; set; } = null; + + [JsonPropertyName("abuseIpDbApiKey")] + public string? AbuseIpDbApiKey { get; set; } = null; + + [JsonPropertyName("abuseipdbBlacklistRatelimit")] + public int AbuseipdbBlacklistRatelimit { get; set; } = 5; + + [JsonPropertyName("abuseipdbConfidenceScoreTreshold")] + public int AbuseipdbConfidenceScoreTreshold { get; set; } = 50; + + [JsonPropertyName("ipdataApiKey")] + public string? IpdataApiKey { get; set; } = null; + + [JsonPropertyName("mfaBackupCodeCount")] + public int MfaBackupCodeCount { get; set; } = 10; + + [JsonPropertyName("statsWorldReadable")] + public bool StatsWorldReadable { get; set; } = true; + + [JsonPropertyName("defaultRegistrationTokenExpiration")] + public int DefaultRegistrationTokenExpiration { get; set; } = 1000 * 60 * 60 * 24 * 7; + + [JsonPropertyName("cdnSignUrls")] + public bool CdnSignUrls { get; set; } = false; + + [JsonPropertyName("cdnSignatureKey")] + public string CdnSignatureKey { get; set; } = null!; // crypto.randomBytes(32).toString("base64"); + + [JsonPropertyName("cdnSignatureDuration")] + public string CdnSignatureDuration { get; set; } = "24h"; + + [JsonPropertyName("cdnSignatureIncludeIp")] + public bool CdnSignatureIncludeIp { get; set; } = true; + + [JsonPropertyName("cdnSignatureIncludeUserAgent")] + public bool CdnSignatureIncludeUserAgent { get; set; } = true; +} + +public class CaptchaConfiguration { + [JsonPropertyName("enabled")] + public bool Enabled { get; set; } = false; + + /// + /// One of: null, recaptcha, hcaptcha + /// + [JsonPropertyName("service")] + public string Service { get; set; } = "none"; + + [JsonPropertyName("sitekey")] + public string? SiteKey { get; set; } = null; + + [JsonPropertyName("secret")] + public string? Secret { get; set; } = null; +} + +public class TwoFactorConfiguration { + [JsonPropertyName("generateBackupCodes")] + public bool GenerateBackupCodes { get; set; } = true; } \ No newline at end of file diff --git a/extra/admin-api/Spacebar.ConfigModel/ServerConfiguration.cs b/extra/admin-api/Spacebar.ConfigModel/ServerConfiguration.cs index 49309ab1a..2ea107b8b 100644 --- a/extra/admin-api/Spacebar.ConfigModel/ServerConfiguration.cs +++ b/extra/admin-api/Spacebar.ConfigModel/ServerConfiguration.cs @@ -3,49 +3,197 @@ namespace Spacebar.ConfigModel; public class ServerConfiguration { - [JsonPropertyName("admin")] public EndpointConfiguration Admin = new EndpointConfiguration(); - [JsonPropertyName("gateway")] public EndpointConfiguration Gateway = new EndpointConfiguration(); - [JsonPropertyName("cdn")] public CdnConfiguration Cdn = new CdnConfiguration(); - [JsonPropertyName("api")] public ApiConfiguration Api = new ApiConfiguration(); - [JsonPropertyName("general")] public GeneralConfiguration General = new GeneralConfiguration(); - [JsonPropertyName("limits")] public LimitsConfiguration Limits = new LimitsConfiguration(); - [JsonPropertyName("security")] public SecurityConfiguration Security = new SecurityConfiguration(); - [JsonPropertyName("login")] public LoginConfiguration Login = new LoginConfiguration(); - [JsonPropertyName("register")] public RegisterConfiguration Register = new RegisterConfiguration(); - [JsonPropertyName("regions")] public RegionConfiguration Regions = new RegionConfiguration(); - [JsonPropertyName("guild")] public GuildConfiguration Guild = new GuildConfiguration(); - [JsonPropertyName("gif")] public GifConfiguration Gif = new GifConfiguration(); - [JsonPropertyName("rabbitmq")] public RabbitMQConfiguration Rabbitmq = new RabbitMQConfiguration(); - [JsonPropertyName("kafka")] public KafkaConfiguration Kafka = new KafkaConfiguration(); - [JsonPropertyName("templates")] public TemplateConfiguration Templates = new TemplateConfiguration(); - [JsonPropertyName("metrics")] public MetricsConfiguration Metrics = new MetricsConfiguration(); - [JsonPropertyName("defaults")] public DefaultsConfiguration Defaults = new DefaultsConfiguration(); - [JsonPropertyName("external")] public ExternalTokensConfiguration External = new ExternalTokensConfiguration(); - [JsonPropertyName("email")] public EmailConfiguration Email = new EmailConfiguration(); - [JsonPropertyName("passwordReset")] public PasswordResetConfiguration PasswordReset = new PasswordResetConfiguration(); - [JsonPropertyName("user")] public UserConfiguration User = new UserConfiguration(); + [JsonPropertyName("admin")] + public EndpointConfiguration Admin { get; set; } = new(); + + [JsonPropertyName("gateway")] + public EndpointConfiguration Gateway { get; set; } = new(); + + [JsonPropertyName("cdn")] + public CdnConfiguration Cdn { get; set; } = new(); + + [JsonPropertyName("api")] + public ApiConfiguration Api { get; set; } = new(); + + [JsonPropertyName("general")] + public GeneralConfiguration General { get; set; } = new(); + + [JsonPropertyName("limits")] + public LimitsConfiguration Limits { get; set; } = new(); + + [JsonPropertyName("security")] + public SecurityConfiguration Security { get; set; } = new(); + + [JsonPropertyName("login")] + public LoginConfiguration Login { get; set; } = new(); + + [JsonPropertyName("register")] + public RegisterConfiguration Register { get; set; } = new RegisterConfiguration(); + + [JsonPropertyName("regions")] + public RegionConfiguration Regions { get; set; } = new(); + + [JsonPropertyName("guild")] + public GuildConfiguration Guild { get; set; } = new(); + + [JsonPropertyName("gif")] + public GifConfiguration Gif { get; set; } = new GifConfiguration(); + + [JsonPropertyName("rabbitmq")] + public RabbitMQConfiguration Rabbitmq { get; set; } = new RabbitMQConfiguration(); + + [JsonPropertyName("templates")] + public TemplateConfiguration Templates { get; set; } = new TemplateConfiguration(); + + [JsonPropertyName("defaults")] + public DefaultsConfiguration Defaults { get; set; } = new(); + + [JsonPropertyName("external")] + public ExternalTokensConfiguration External { get; set; } = new(); + + // TODO: lazy + // [JsonPropertyName("email")] + // public EmailConfiguration Email { get; set; } = new EmailConfiguration(); + + [JsonPropertyName("passwordReset")] + public PasswordResetConfiguration PasswordReset { get; set; } = new PasswordResetConfiguration(); + + [JsonPropertyName("user")] + public UserConfiguration User { get; set; } = new UserConfiguration(); } -public class GeneralConfiguration { - [JsonPropertyName("instanceName")] public string InstanceName = "Spacebar Instance"; +public class RegisterConfiguration { + [JsonPropertyName("email")] + public RegistrationEmailConfiguration Email { get; set; } = new RegistrationEmailConfiguration(); - [JsonPropertyName("instanceDescription")] - public string? InstanceDescription = "This is a Spacebar instance made in the pre-release days"; + [JsonPropertyName("dateOfBirth")] + public DateOfBirthConfiguration DateOfBirth { get; set; } = new DateOfBirthConfiguration(); - [JsonPropertyName("frontPage")] public string? FrontPage = null; - [JsonPropertyName("tosPage")] public string? TosPage = null; + [JsonPropertyName("password")] + public PasswordConfiguration Password { get; set; } = new PasswordConfiguration(); - [JsonPropertyName("correspondenceEmail")] - public string? CorrespondenceEmail = null; + [JsonPropertyName("disabled")] + public bool Disabled { get; set; } = false; - [JsonPropertyName("correspondenceUserID")] - public string? CorrespondenceUserId = null; + [JsonPropertyName("requireCaptcha")] + public bool RequireCaptcha { get; set; } = true; - [JsonPropertyName("image")] public string? Image = null; - [JsonPropertyName("instanceId")] public string InstanceId = Snowflake.generate(); + [JsonPropertyName("requireInvite")] + public bool RequireInvite { get; set; } = false; - [JsonPropertyName("autoCreateBotUsers")] - public bool AutoCreateBotUsers = false; + [JsonPropertyName("guestsRequireInvite")] + public bool GuestsRequireInvite { get; set; } = true; + + [JsonPropertyName("allowNewRegistration")] + public bool AllowNewRegistration { get; set; } = true; + + [JsonPropertyName("allowMultipleAccounts")] + public bool AllowMultipleAccounts { get; set; } = true; + + [JsonPropertyName("blockIpDataCoThreatTypes")] + public List BlockIpDataCoThreatTypes { get; set; } = [ + "tor", "icloud_relay", "proxy", "datacenter", "anonymous", "known_attacker", "known_abuser", "threat" + ]; // matching ipdata's threat.is_* fields as of 2025/11/30, minus bogon + + [JsonPropertyName("blockAsnTypes")] + public List BlockAsnTypes { get; set; } = [""]; + + [JsonPropertyName("blockAsns")] + public List BlockAsns { get; set; } = [""]; + + [JsonPropertyName("blockAbuseIpDbAboveScore")] + public int BlockAbuseIpDbAboveScore { get; set; } = 75; // 0 to disable + + [JsonPropertyName("incrementingDiscriminators")] + public bool IncrementingDiscriminators { get; set; } = false; // random otherwise + + [JsonPropertyName("defaultRights")] + public string DefaultRights { get; set; } = "875069521787904"; // See `npm run generate:rights` + + [JsonPropertyName("checkIp")] + public bool CheckIp { get; set; } = true; +} + +public class PasswordConfiguration { + [JsonPropertyName("required")] + public bool Required { get; set; } = true; + + [JsonPropertyName("minLength")] + public int MinLength { get; set; } = 8; + + [JsonPropertyName("minNumbers")] + public int MinNumbers { get; set; } = 2; + + [JsonPropertyName("minUpperCase")] + public int MinUpperCase { get; set; } = 2; + + [JsonPropertyName("minSymbols")] + public int MinSymbols { get; set; } = 0; +} + +public class DateOfBirthConfiguration { + [JsonPropertyName("required")] + public bool Required { get; set; } = true; + + [JsonPropertyName("minimum")] + public int Minimum { get; set; } = 13; +} + +public class RegistrationEmailConfiguration { + [JsonPropertyName("required")] + public bool Required { get; set; } = false; + + [JsonPropertyName("allowlist")] + public bool Allowlist { get; set; } = false; + + [JsonPropertyName("blocklist")] + public bool Blocklist { get; set; } = false; + + [JsonPropertyName("domains")] + public List Domains { get; set; } = []; +} + +public class TemplateConfiguration { + [JsonPropertyName("enabled")] + public bool Enabled { get; set; } = true; + + [JsonPropertyName("allowTemplateCreation")] + public bool AllowTemplateCreation { get; set; } = true; + + [JsonPropertyName("allowDiscordTemplates")] + public bool AllowDiscordTemplates { get; set; } = true; + + [JsonPropertyName("allowRaws")] + public bool AllowRaws { get; set; } = true; +} + +public class PasswordResetConfiguration { + [JsonPropertyName("requireCaptcha")] + public bool RequireCaptcha { get; set; } = false; +} + +public class UserConfiguration { + [JsonPropertyName("blockedContains")] + public List BlockedContains { get; set; } = []; + + [JsonPropertyName("blockedEquals")] + public List BlockedEquals { get; set; } = []; +} + +public class RabbitMQConfiguration { + [JsonPropertyName("host")] + public string? Host { get; set; } = null; +} + +public class GifConfiguration { + [JsonPropertyName("enabled")] + public bool Enabled { get; set; } = true; + + [JsonPropertyName("provider")] + public string Provider { get; set; } = "tenor"; + + [JsonPropertyName("apiKey")] + public string? ApiKey { get; set; } = "LIVDSRZULELA"; } public class EndpointConfiguration { @@ -65,42 +213,159 @@ public class ApiConfiguration : EndpointConfiguration { } public class CdnConfiguration : EndpointConfiguration { - [JsonPropertyName("resizeHeightMax")] public int ResizeHeightMax = 1000; - [JsonPropertyName("resizeWidthMax")] public int ResizeWidthMax = 1000; - [JsonPropertyName("imagorServerUrl")] public string? ImagorServerUrl = null; + [JsonPropertyName("resizeHeightMax")] + public int ResizeHeightMax { get; set; } = 1000; + + [JsonPropertyName("resizeWidthMax")] + public int ResizeWidthMax { get; set; } = 1000; + + [JsonPropertyName("imagorServerUrl")] + public string? ImagorServerUrl { get; set; } = null; [JsonPropertyName("proxyCacheHeaderSeconds")] - public int ProxyCacheHeaderSeconds = 60 * 60 * 24; + public int ProxyCacheHeaderSeconds { get; set; } = 60 * 60 * 24; [JsonPropertyName("maxAttachmentSize")] - public int MaxAttachmentSize = 25 * 1024 * 1024; // 25 MB + public int MaxAttachmentSize { get; set; } = 25 * 1024 * 1024; // 25 MB - // limits: CdnLimitsConfiguration = new CdnLimitsConfiguration(); + // limits: CdnLimitsConfiguration {get;set;}=new CdnLimitsConfiguration(); } public class CdnLimitsConfiguration { - // ordered by route register order in CDN... - [JsonPropertyName("icon")] public CdnImageLimitsConfiguration Icon = new CdnImageLimitsConfiguration(); - [JsonPropertyName("roleIcon")] public CdnImageLimitsConfiguration RoleIcon = new CdnImageLimitsConfiguration(); - [JsonPropertyName("emoji")] public CdnImageLimitsConfiguration Emoji = new CdnImageLimitsConfiguration(); - [JsonPropertyName("sticker")] public CdnImageLimitsConfiguration Sticker = new CdnImageLimitsConfiguration(); - [JsonPropertyName("banner")] public CdnImageLimitsConfiguration Banner = new CdnImageLimitsConfiguration(); - [JsonPropertyName("splash")] public CdnImageLimitsConfiguration Splash = new CdnImageLimitsConfiguration(); - [JsonPropertyName("avatar")] public CdnImageLimitsConfiguration Avatar = new CdnImageLimitsConfiguration(); - [JsonPropertyName("discoverySplash")] public CdnImageLimitsConfiguration DiscoverySplash = new CdnImageLimitsConfiguration(); - [JsonPropertyName("appIcon")] public CdnImageLimitsConfiguration AppIcon = new CdnImageLimitsConfiguration(); - [JsonPropertyName("discoverSplash")] public CdnImageLimitsConfiguration DiscoverSplash = new CdnImageLimitsConfiguration(); //what even is this? - [JsonPropertyName("teamIcon")] public CdnImageLimitsConfiguration TeamIcon = new CdnImageLimitsConfiguration(); - [JsonPropertyName("channelIcon")] public CdnImageLimitsConfiguration ChannelIcon = new CdnImageLimitsConfiguration(); // is this even used? - [JsonPropertyName("guildAvatar")] public CdnImageLimitsConfiguration GuildAvatar = new CdnImageLimitsConfiguration(); + [JsonPropertyName("icon")] + public CdnImageLimitsConfiguration Icon { get; set; } = new(); + + [JsonPropertyName("roleIcon")] + public CdnImageLimitsConfiguration RoleIcon { get; set; } = new(); + + [JsonPropertyName("emoji")] + public CdnImageLimitsConfiguration Emoji { get; set; } = new(); + + [JsonPropertyName("sticker")] + public CdnImageLimitsConfiguration Sticker { get; set; } = new(); + + [JsonPropertyName("banner")] + public CdnImageLimitsConfiguration Banner { get; set; } = new(); + + [JsonPropertyName("splash")] + public CdnImageLimitsConfiguration Splash { get; set; } = new(); + + [JsonPropertyName("avatar")] + public CdnImageLimitsConfiguration Avatar { get; set; } = new(); + + [JsonPropertyName("discoverySplash")] + public CdnImageLimitsConfiguration DiscoverySplash { get; set; } = new(); + + [JsonPropertyName("appIcon")] + public CdnImageLimitsConfiguration AppIcon { get; set; } = new(); + + [JsonPropertyName("discoverSplash")] + public CdnImageLimitsConfiguration DiscoverSplash { get; set; } = new(); //what even is this? + + [JsonPropertyName("teamIcon")] + public CdnImageLimitsConfiguration TeamIcon { get; set; } = new(); + + [JsonPropertyName("channelIcon")] + public CdnImageLimitsConfiguration ChannelIcon { get; set; } = new(); // is this even used? + + [JsonPropertyName("guildAvatar")] + public CdnImageLimitsConfiguration GuildAvatar { get; set; } = new(); } public class CdnImageLimitsConfiguration { - [JsonPropertyName("maxHeight")] public int MaxHeight = 8192; - [JsonPropertyName("maxWidth")] public int MaxWidth = 8192; + [JsonPropertyName("maxHeight")] + public int MaxHeight { get; set; } = 8192; - [JsonPropertyName("maxSize")] public int MaxSize = 10 * 1024 * 1024; // 10 MB + [JsonPropertyName("maxWidth")] + public int MaxWidth { get; set; } = 8192; + + [JsonPropertyName("maxSize")] + public int MaxSize { get; set; } = 10 * 1024 * 1024; // 10 MB // "always" | "never" | "premium" - [JsonPropertyName("allowAnimated")] public string AllowAnimated = "always"; + [JsonPropertyName("allowAnimated")] + public string AllowAnimated { get; set; } = "always"; +} + +public class LoginConfiguration { + [JsonPropertyName("requireCaptcha")] + public bool RequireCaptcha { get; set; } = false; + + [JsonPropertyName("requireVerification")] + public bool RequireVerification { get; set; } = false; +} + +public class RegionConfiguration { + [JsonPropertyName("default")] + public string Default { get; set; } = "spacebar-central"; + + [JsonPropertyName("useDefaultAsOptimal")] + public bool UseDefaultAsOptimal { get; set; } = true; + + [JsonPropertyName("available")] + public List Available { get; set; } = []; + + public class Region { + [JsonPropertyName("id")] + public string Id { get; set; } = null!; + + [JsonPropertyName("name")] + public string Name { get; set; } = null!; + + [JsonPropertyName("endpoint")] + public string Endpoint { get; set; } = null!; + + [JsonPropertyName("vip")] + public bool Vip { get; set; } = false; + + [JsonPropertyName("custom")] + public bool Custom { get; set; } = false; + + [JsonPropertyName("deprecated")] + public bool Deprecated { get; set; } = false; + } +} + +public class ExternalTokensConfiguration { + [JsonPropertyName("twitter")] + public string? Twitter { get; set; } = null; +} + +public class GuildConfiguration { + [JsonPropertyName("defaultFeatures")] + public List DefaultFeatures { get; set; } = []; + + [JsonPropertyName("autoJoin")] + public GuildAutoJoinConfiguration AutoJoin { get; set; } = new(); + + [JsonPropertyName("discovery")] + public GuildDiscoveryConfiguration Discovery { get; set; } = new(); + + public class GuildDiscoveryConfiguration { + [JsonPropertyName("showAllGuilds")] + public bool ShowAllGuilds { get; set; } = false; + + [JsonPropertyName("useRecommendation")] + public bool UseRecommendation { get; set; } = false; + + [JsonPropertyName("offset")] + public int Offset { get; set; } = 0; + + [JsonPropertyName("limit")] + public int Limit { get; set; } = 24; + } + + public class GuildAutoJoinConfiguration { + [JsonPropertyName("enabled")] + public bool Enabled { get; set; } = false; + + [JsonPropertyName("guilds")] + public List Guilds { get; set; } = []; + + [JsonPropertyName("canLeave")] + public bool CanLeave { get; set; } = true; + + [JsonPropertyName("bots")] + public bool Bots { get; set; } = false; + } } \ No newline at end of file