summary refs log tree commit diff
path: root/extra/admin-api/Models/Spacebar.Models.Config/ServerConfiguration.cs
diff options
context:
space:
mode:
Diffstat (limited to 'extra/admin-api/Models/Spacebar.Models.Config/ServerConfiguration.cs')
-rw-r--r--extra/admin-api/Models/Spacebar.Models.Config/ServerConfiguration.cs371
1 files changed, 371 insertions, 0 deletions
diff --git a/extra/admin-api/Models/Spacebar.Models.Config/ServerConfiguration.cs b/extra/admin-api/Models/Spacebar.Models.Config/ServerConfiguration.cs
new file mode 100644

index 00000000..2ea107b8 --- /dev/null +++ b/extra/admin-api/Models/Spacebar.Models.Config/ServerConfiguration.cs
@@ -0,0 +1,371 @@ +using System.Text.Json.Serialization; + +namespace Spacebar.ConfigModel; + +public class ServerConfiguration { + [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 RegisterConfiguration { + [JsonPropertyName("email")] + public RegistrationEmailConfiguration Email { get; set; } = new RegistrationEmailConfiguration(); + + [JsonPropertyName("dateOfBirth")] + public DateOfBirthConfiguration DateOfBirth { get; set; } = new DateOfBirthConfiguration(); + + [JsonPropertyName("password")] + public PasswordConfiguration Password { get; set; } = new PasswordConfiguration(); + + [JsonPropertyName("disabled")] + public bool Disabled { get; set; } = false; + + [JsonPropertyName("requireCaptcha")] + public bool RequireCaptcha { get; set; } = true; + + [JsonPropertyName("requireInvite")] + public bool RequireInvite { get; set; } = 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<string> 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<string> BlockAsnTypes { get; set; } = [""]; + + [JsonPropertyName("blockAsns")] + public List<string> 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<string> 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<string> BlockedContains { get; set; } = []; + + [JsonPropertyName("blockedEquals")] + public List<string> 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 { + [JsonPropertyName("endpointPrivate")] + public string? EndpointPrivate { get; set; } + + [JsonPropertyName("endpointPublic")] + public string? EndpointPublic { get; set; } +} + +public class ApiConfiguration : EndpointConfiguration { + [JsonPropertyName("activeVersions")] + public List<string> ActiveVersions { get; set; } = null!; + + [JsonPropertyName("defaultVersion")] + public string DefaultVersion { get; set; } = null!; +} + +public class CdnConfiguration : EndpointConfiguration { + [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 { get; set; } = 60 * 60 * 24; + + [JsonPropertyName("maxAttachmentSize")] + public int MaxAttachmentSize { get; set; } = 25 * 1024 * 1024; // 25 MB + + // limits: CdnLimitsConfiguration {get;set;}=new CdnLimitsConfiguration(); +} + +public class CdnLimitsConfiguration { + [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 { get; set; } = 8192; + + [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 { 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<Region> 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<string> 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<string> 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