diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..57940fd
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,79 @@
+# ---> JetBrains
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/**/usage.statistics.xml
+.idea/**/dictionaries
+.idea/**/shelf
+
+# AWS User-specific
+.idea/**/aws.xml
+
+# Generated files
+.idea/**/contentModel.xml
+
+# Sensitive or high-churn files
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+.idea/**/dbnavigator.xml
+
+# Gradle
+.idea/**/gradle.xml
+.idea/**/libraries
+
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn. Uncomment if using
+# auto-import.
+# .idea/artifacts
+# .idea/compiler.xml
+# .idea/jarRepositories.xml
+# .idea/modules.xml
+# .idea/*.iml
+# .idea/modules
+# *.iml
+# *.ipr
+
+# CMake
+cmake-build-*/
+
+# Mongo Explorer plugin
+.idea/**/mongoSettings.xml
+
+# File-based project format
+*.iws
+
+# IntelliJ
+out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Cursive Clojure plugin
+.idea/replstate.xml
+
+# SonarLint plugin
+.idea/sonarlint/
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+
+# Editor-based Rest Client
+.idea/httpRequests
+
+# Android studio 3.1+ serialized cache file
+.idea/caches/build_file_checksums.ser
+
diff --git a/Luski.Shared.sln b/Luski.Shared.sln
new file mode 100644
index 0000000..ed2add1
--- /dev/null
+++ b/Luski.Shared.sln
@@ -0,0 +1,16 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Luski.Shared", "Luski.Shared\Luski.Shared.csproj", "{9B23658F-7986-4F90-BC9A-BAC04433797B}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {9B23658F-7986-4F90-BC9A-BAC04433797B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9B23658F-7986-4F90-BC9A-BAC04433797B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9B23658F-7986-4F90-BC9A-BAC04433797B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9B23658F-7986-4F90-BC9A-BAC04433797B}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+EndGlobal
diff --git a/Luski.Shared/Luski.Shared.csproj b/Luski.Shared/Luski.Shared.csproj
new file mode 100644
index 0000000..8fd6f70
--- /dev/null
+++ b/Luski.Shared/Luski.Shared.csproj
@@ -0,0 +1,24 @@
+
+
+
+ net8.0
+ enable
+ enable
+ Luski.Shared
+ 1.1.0-alpha19
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Luski.Shared/PublicServers/V1/ClientToServer/HTTP/CTS.cs b/Luski.Shared/PublicServers/V1/ClientToServer/HTTP/CTS.cs
new file mode 100644
index 0000000..5d28616
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/ClientToServer/HTTP/CTS.cs
@@ -0,0 +1,12 @@
+using System.Text.Json.Serialization;
+
+namespace Luski.Shared.PublicServers.V1.ClientToServer.HTTP;
+
+public class CTS;
+
+[JsonSerializable(typeof(CTS))]
+[JsonSourceGenerationOptions(
+ GenerationMode = JsonSourceGenerationMode.Default,
+ PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase,
+ WriteIndented = false)]
+public partial class CTSContext : JsonSerializerContext;
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/ClientToServer/HTTP/CategoryPostCTS.cs b/Luski.Shared/PublicServers/V1/ClientToServer/HTTP/CategoryPostCTS.cs
new file mode 100644
index 0000000..bea6409
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/ClientToServer/HTTP/CategoryPostCTS.cs
@@ -0,0 +1,48 @@
+using System.Text.Json.Serialization;
+using JacobTechEncryption.Enums;
+
+namespace Luski.Shared.PublicServers.V1.ClientToServer.HTTP;
+
+public class CategoryPostCTS : CTS
+{
+ [JsonInclude]
+ [JsonPropertyName("parent")]
+ public long Parent { get; set; }
+
+ [JsonInclude]
+ [JsonPropertyName("color")]
+ public string Color { get; set; } = string.Empty;
+
+ [JsonInclude]
+ [JsonPropertyName("name")]
+ public string Name { get; set; } = string.Empty;
+
+ [JsonInclude]
+ [JsonPropertyName("description")]
+ public string Description { get; set; } = string.Empty;
+ [JsonInclude]
+ [JsonPropertyName("role_overrides")]
+ public UserRoleOverrideCTS[] RoleOverrides { get; set; } = Array.Empty();
+ [JsonInclude]
+ [JsonPropertyName("member_overrides")]
+ public UserOverrideCTS[] UserOverrides { get; set; } = Array.Empty();
+ [JsonInclude]
+ [JsonPropertyName("title_encryption_key")]
+ public long TitleEncryptionKey { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("description_encryption_key")]
+ public long DescriptionEncryptionKey { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("title_encoder_type")]
+ public EncoderType TitleEncoderType { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("description_encoder_type")]
+ public EncoderType DescriptionEncoderType { get; set; }
+}
+
+[JsonSerializable(typeof(CategoryPostCTS))]
+[JsonSourceGenerationOptions(
+ GenerationMode = JsonSourceGenerationMode.Default,
+ PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase,
+ WriteIndented = false)]
+public partial class CategoryPostCTSContext : JsonSerializerContext;
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/ClientToServer/HTTP/ChannelPostCTS.cs b/Luski.Shared/PublicServers/V1/ClientToServer/HTTP/ChannelPostCTS.cs
new file mode 100644
index 0000000..18e2038
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/ClientToServer/HTTP/ChannelPostCTS.cs
@@ -0,0 +1,58 @@
+using System.Text.Json.Serialization;
+using JacobTechEncryption.Enums;
+using Luski.Shared.PublicServers.V1.Enums;
+
+namespace Luski.Shared.PublicServers.V1.ClientToServer.HTTP;
+
+public class ChannelPostCTS : CTS
+{
+ [JsonInclude]
+ [JsonPropertyName("parent")]
+ public long Parent { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("color")]
+ public string Color { get; set; } = string.Empty;
+ [JsonInclude]
+ [JsonPropertyName("type")]
+ public ChannelType Type { get; set; } = ChannelType.TextAndVoice;
+ [JsonInclude]
+ [JsonPropertyName("name")]
+ public string Name { get; set; } = string.Empty;
+ [JsonInclude]
+ [JsonPropertyName("description")]
+ public string Description { get; set; } = string.Empty;
+ [JsonInclude]
+ [JsonPropertyName("role_overrides")]
+ public UserRoleOverrideCTS[] RoleOverrides { get; set; } = Array.Empty();
+ [JsonInclude]
+ [JsonPropertyName("member_overrides")]
+ public UserOverrideCTS[] UserOverrides { get; set; } = Array.Empty();
+ [JsonInclude]
+ [JsonPropertyName("title_encryption_key")]
+ public long TitleEncryptionKey { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("description_encryption_key")]
+ public long DescriptionEncryptionKey { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("encryption_keys")]
+ public long[] EncryptionKeys { get; set; } = Array.Empty();
+ [JsonInclude]
+ [JsonPropertyName("title_encoder_type")]
+ public EncoderType TitleEncoderType { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("description_encoder_type")]
+ public EncoderType DescriptionEncoderType { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("encoder_types")]
+ public EncoderType[] EncoderTypes { get; set; } = Array.Empty();
+ [JsonInclude]
+ [JsonPropertyName("picture_type")]
+ public PictureType PictureType { get; set; }
+}
+
+[JsonSerializable(typeof(ChannelPostCTS))]
+[JsonSourceGenerationOptions(
+ GenerationMode = JsonSourceGenerationMode.Default,
+ PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase,
+ WriteIndented = false)]
+public partial class ChannelPostCTSContext : JsonSerializerContext;
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/ClientToServer/HTTP/KeyPostCTS.cs b/Luski.Shared/PublicServers/V1/ClientToServer/HTTP/KeyPostCTS.cs
new file mode 100644
index 0000000..56a60e5
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/ClientToServer/HTTP/KeyPostCTS.cs
@@ -0,0 +1,22 @@
+using System.Text.Json.Serialization;
+using JacobTechEncryption.Enums;
+
+namespace Luski.Shared.PublicServers.V1.ClientToServer.HTTP;
+
+public class KeyPostCTS : CTS
+{
+ [JsonInclude]
+ [JsonPropertyName("encryption_type")]
+ public EncryptionType EncryptionType { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("key_data")]
+ public string Data { get; set; } = string.Empty;
+}
+
+[JsonSerializable(typeof(KeyPostCTS))]
+[JsonSourceGenerationOptions(
+ GenerationMode = JsonSourceGenerationMode.Default,
+ PropertyNamingPolicy = JsonKnownNamingPolicy.Unspecified,
+ WriteIndented = false,
+ DefaultIgnoreCondition = JsonIgnoreCondition.Never)]
+public partial class KeyPostCTSContext : JsonSerializerContext;
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/ClientToServer/HTTP/MessageCTS.cs b/Luski.Shared/PublicServers/V1/ClientToServer/HTTP/MessageCTS.cs
new file mode 100644
index 0000000..4399549
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/ClientToServer/HTTP/MessageCTS.cs
@@ -0,0 +1,34 @@
+using System.Text.Json.Serialization;
+using JacobTechEncryption.Enums;
+
+namespace Luski.Shared.PublicServers.V1.ClientToServer.HTTP;
+
+public class MessageCTS : CTS
+{
+ [JsonInclude]
+ [JsonPropertyName("author_id")]
+ public long? Profile { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("channel_id")]
+ public long ChannelID { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("context")]
+ public string Base64Context { get; set; } = string.Empty;
+ [JsonInclude]
+ [JsonPropertyName("files")]
+ public long[] Files { get; set; } = Array.Empty();
+ [JsonInclude]
+ [JsonPropertyName("encryption_key")]
+ public long EncryptionKey { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("encoding")]
+ public EncoderType Encoding { get; set; }
+}
+
+[JsonSerializable(typeof(MessageCTS))]
+[JsonSourceGenerationOptions(
+ GenerationMode = JsonSourceGenerationMode.Default,
+ PropertyNamingPolicy = JsonKnownNamingPolicy.Unspecified,
+ WriteIndented = false,
+ DefaultIgnoreCondition = JsonIgnoreCondition.Never)]
+public partial class MessageCTSContext : JsonSerializerContext;
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/ClientToServer/HTTP/StatusUpdateCTS.cs b/Luski.Shared/PublicServers/V1/ClientToServer/HTTP/StatusUpdateCTS.cs
new file mode 100644
index 0000000..39c8d18
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/ClientToServer/HTTP/StatusUpdateCTS.cs
@@ -0,0 +1,18 @@
+using System.Text.Json.Serialization;
+using Luski.Shared.PublicServers.V1.Enums;
+
+namespace Luski.Shared.PublicServers.V1.ClientToServer.HTTP;
+
+public class StatusUpdateCTS : CTS
+{
+ [JsonInclude]
+ [JsonPropertyName("status")]
+ public UserStatus Status { get; set; }
+}
+
+[JsonSerializable(typeof(StatusUpdateCTS))]
+[JsonSourceGenerationOptions(
+ GenerationMode = JsonSourceGenerationMode.Default,
+ PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase,
+ WriteIndented = false)]
+public partial class StatusUpdateCTSContext : JsonSerializerContext;
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/ClientToServer/HTTP/StorageInfoCTS.cs b/Luski.Shared/PublicServers/V1/ClientToServer/HTTP/StorageInfoCTS.cs
new file mode 100644
index 0000000..7388bea
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/ClientToServer/HTTP/StorageInfoCTS.cs
@@ -0,0 +1,17 @@
+using System.Text.Json.Serialization;
+
+namespace Luski.Shared.PublicServers.V1.ClientToServer.HTTP;
+
+public class StorageInfoCTS : CTS
+{
+ [JsonInclude]
+ [JsonPropertyName("password")]
+ public string Password { get; set; } = string.Empty;
+}
+
+[JsonSerializable(typeof(StorageInfoCTS))]
+[JsonSourceGenerationOptions(
+ GenerationMode = JsonSourceGenerationMode.Default,
+ PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase,
+ WriteIndented = false)]
+public partial class StorageInfoCTSContext : JsonSerializerContext;
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/ClientToServer/HTTP/UserOverrideCTS.cs b/Luski.Shared/PublicServers/V1/ClientToServer/HTTP/UserOverrideCTS.cs
new file mode 100644
index 0000000..e60c2e9
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/ClientToServer/HTTP/UserOverrideCTS.cs
@@ -0,0 +1,26 @@
+using System.Text.Json.Serialization;
+using Luski.Shared.PublicServers.V1.Enums;
+using Luski.Shared.PublicServers.V1.Shared;
+
+namespace Luski.Shared.PublicServers.V1.ClientToServer.HTTP;
+
+public class UserOverrideCTS : CTS
+{
+ [JsonInclude]
+ [JsonPropertyName("user_id")]
+ public long UserID { get; set; }
+
+ [JsonInclude]
+ [JsonPropertyName("good_permissions")]
+ public ServerPermission GoodPermissions { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("bad_permissions")]
+ public ServerPermission BadPermissions { get; set; }
+}
+
+[JsonSerializable(typeof(UserOverrideCTS))]
+[JsonSourceGenerationOptions(
+ GenerationMode = JsonSourceGenerationMode.Default,
+ PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase,
+ WriteIndented = false)]
+public partial class UserOverrideCTSContext : JsonSerializerContext;
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/ClientToServer/HTTP/UserRoleOverrideCTS.cs b/Luski.Shared/PublicServers/V1/ClientToServer/HTTP/UserRoleOverrideCTS.cs
new file mode 100644
index 0000000..189e969
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/ClientToServer/HTTP/UserRoleOverrideCTS.cs
@@ -0,0 +1,25 @@
+using System.Text.Json.Serialization;
+using Luski.Shared.PublicServers.V1.Enums;
+using Luski.Shared.PublicServers.V1.Shared;
+
+namespace Luski.Shared.PublicServers.V1.ClientToServer.HTTP;
+
+public class UserRoleOverrideCTS : CTS
+{
+ [JsonInclude]
+ [JsonPropertyName("role_id")]
+ public long RoleID { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("good_permissions")]
+ public ServerPermission GoodPermissions { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("bad_permissions")]
+ public ServerPermission BadPermissions { get; set; }
+}
+
+[JsonSerializable(typeof(UserRoleOverrideCTS))]
+[JsonSourceGenerationOptions(
+ GenerationMode = JsonSourceGenerationMode.Default,
+ PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase,
+ WriteIndented = false)]
+public partial class UserRoleOverrideCTSContext : JsonSerializerContext;
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/ClientToServer/WSS/ICTWEvent.cs b/Luski.Shared/PublicServers/V1/ClientToServer/WSS/ICTWEvent.cs
new file mode 100644
index 0000000..b9992ec
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/ClientToServer/WSS/ICTWEvent.cs
@@ -0,0 +1,6 @@
+namespace Luski.Shared.PublicServers.V1.ClientToServer.WSS;
+
+public interface ICTWEvent
+{
+
+}
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/ClientToServer/WSS/LoginCTW.cs b/Luski.Shared/PublicServers/V1/ClientToServer/WSS/LoginCTW.cs
new file mode 100644
index 0000000..634ef47
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/ClientToServer/WSS/LoginCTW.cs
@@ -0,0 +1,10 @@
+using System.Text.Json.Serialization;
+
+namespace Luski.Shared.PublicServers.V1.ClientToServer.WSS;
+
+public class LoginCTW : ICTWEvent
+{
+ [JsonPropertyName("token")]
+ [JsonInclude]
+ public string Token { get; set; } = default!;
+}
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/Enums/ChannelType.cs b/Luski.Shared/PublicServers/V1/Enums/ChannelType.cs
new file mode 100644
index 0000000..e3c3d7b
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/Enums/ChannelType.cs
@@ -0,0 +1,6 @@
+namespace Luski.Shared.PublicServers.V1.Enums;
+
+public enum ChannelType : short
+{
+ TextAndVoice = 0
+}
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/Enums/DataType.cs b/Luski.Shared/PublicServers/V1/Enums/DataType.cs
new file mode 100644
index 0000000..e943488
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/Enums/DataType.cs
@@ -0,0 +1,7 @@
+namespace Luski.Shared.PublicServers.V1.Enums;
+
+public enum DataType
+{
+ Token,
+ MessageCreate
+}
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/Enums/ErrorCode.cs b/Luski.Shared/PublicServers/V1/Enums/ErrorCode.cs
new file mode 100644
index 0000000..c5df858
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/Enums/ErrorCode.cs
@@ -0,0 +1,14 @@
+namespace Luski.Shared.PublicServers.V1.Enums;
+
+public enum ErrorCode
+{
+ MissingToken,
+ InvalidToken,
+ MissingPostData,
+ InvalidPostData,
+ Forbidden,
+ ServerError,
+ MissingHeader,
+ InvalidHeader,
+ InvalidURL
+}
diff --git a/Luski.Shared/PublicServers/V1/Enums/PictureType.cs b/Luski.Shared/PublicServers/V1/Enums/PictureType.cs
new file mode 100644
index 0000000..5a3c733
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/Enums/PictureType.cs
@@ -0,0 +1,14 @@
+namespace Luski.Shared.PublicServers.V1.Enums;
+
+public enum PictureType : short
+{
+ none,
+ png,
+ jpeg,
+ bmp,
+ gif,
+ ico,
+ svg,
+ tif,
+ webp
+}
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/Enums/ServerPermission.cs b/Luski.Shared/PublicServers/V1/Enums/ServerPermission.cs
new file mode 100644
index 0000000..532e8d7
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/Enums/ServerPermission.cs
@@ -0,0 +1,48 @@
+namespace Luski.Shared.PublicServers.V1.Enums;
+
+[Flags]
+public enum ServerPermission : long
+{
+ ///
+ /// Internal permission for quick permission lookup
+ ///
+ None = 0b_0000000000000000000000000000000000000000000000000000000000000000,
+ ViewThis = 0b_0000000000000000000000000000000000000000000000000000000000000001,
+ ViewChannels = 0b_0000000000000000000000000000000000000000000000000000000000000010,
+ MoveChannels = 0b_0000000000000000000000000000000000000000000000000000000000000100,
+ EditChannels = 0b_0000000000000000000000000000000000000000000000000000000000001000,
+ EditChannelPermissions = 0b_0000000000000000000000000000000000000000000000000000000000010000,
+ CreateChannels = 0b_0000000000000000000000000000000000000000000000000000000000100000,
+ DeleteChannels = 0b_0000000000000000000000000000000000000000000000000000000001000000,
+ ViewCategories = 0b_0000000000000000000000000000000000000000000000000000000010000000,
+ MoveCategories = 0b_0000000000000000000000000000000000000000000000000000000100000000,
+ EditCategories = 0b_0000000000000000000000000000000000000000000000000000001000000000,
+ EditCategoryPermissions = 0b_0000000000000000000000000000000000000000000000000000010000000000,
+ CreateCategories = 0b_0000000000000000000000000000000000000000000000000000100000000000,
+ DeleteCategories = 0b_0000000000000000000000000000000000000000000000000001000000000000,
+ DeleteKeys = 0b_0000000000000000000000000000000000000000000000000010000000000000,
+ ManageRoles = 0b_0000000000000000000000000000000000000000000000000100000000000000,
+ ViewLogs = 0b_0000000000000000000000000000000000000000000000001000000000000000,
+ ManageServer = 0b_0000000000000000000000000000000000000000000000010000000000000000,
+ AddServers = 0b_0000000000000000000000000000000000000000000000100000000000000000,
+ RemoveServers = 0b_0000000000000000000000000000000000000000000001000000000000000000,
+ Invite = 0b_0000000000000000000000000000000000000000000010000000000000000000,
+ Nickname = 0b_0000000000000000000000000000000000000000000100000000000000000000,
+ ManageNicknames = 0b_0000000000000000000000000000000000000000001000000000000000000000,
+ Kick = 0b_0000000000000000000000000000000000000000010000000000000000000000,
+ Ban = 0b_0000000000000000000000000000000000000000100000000000000000000000,
+ SendMessages = 0b_0000000000000000000000000000000000000001000000000000000000000000,
+ SendFiles = 0b_0000000000000000000000000000000000000010000000000000000000000000,
+ ChannelPings = 0b_0000000000000000000000000000000000000100000000000000000000000000,
+ ServerPings = 0b_0000000000000000000000000000000000001000000000000000000000000000,
+ PingSomeone = 0b_0000000000000000000000000000000000010000000000000000000000000000,
+ ManageMessages = 0b_0000000000000000000000000000000000100000000000000000000000000000,
+ ReadMessageHistory = 0b_0000000000000000000000000000000001000000000000000000000000000000,
+ UseServerCommands = 0b_0000000000000000000000000000000010000000000000000000000000000000,
+ JoinVoice = 0b_0000000000000000000000000000000100000000000000000000000000000000,
+ SpeakInVoice = 0b_0000000000000000000000000000001000000000000000000000000000000000,
+ MuteMembers = 0b_0000000000000000000000000000010000000000000000000000000000000000,
+ DeafenMembers = 0b_0000000000000000000000000000100000000000000000000000000000000000,
+ MoveMembers = 0b_0000000000000000000000000001000000000000000000000000000000000000,
+ ManageChannelProfiles = 0b_0000000000000000000000000010000000000000000000000000000000000000,
+}
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/Enums/UserStatus.cs b/Luski.Shared/PublicServers/V1/Enums/UserStatus.cs
new file mode 100644
index 0000000..a50ba8c
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/Enums/UserStatus.cs
@@ -0,0 +1,11 @@
+namespace Luski.Shared.PublicServers.V1.Enums;
+
+public enum UserStatus : short
+{
+ Offline,
+ Online,
+ Idle,
+ DoNotDisturb,
+ Invisible,
+ MAX
+}
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/CategorySTC.cs b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/CategorySTC.cs
new file mode 100644
index 0000000..f9cf5c3
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/CategorySTC.cs
@@ -0,0 +1,59 @@
+using System.Text.Json.Serialization;
+using JacobTechEncryption.Enums;
+using Luski.Shared.PublicServers.V1.Enums;
+
+namespace Luski.Shared.PublicServers.V1.ServerToClient.HTTP;
+
+public class CategorySTC : STC
+{
+ [JsonInclude]
+ [JsonPropertyName("id")]
+ public long ID { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("picture_type")]
+ public PictureType PictureType { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("color")]
+ public string Color { get; set; } = string.Empty;
+ [JsonInclude]
+ [JsonPropertyName("name")]
+ public string Name { get; set; } = string.Empty;
+ [JsonInclude]
+ [JsonPropertyName("description")]
+ public string Description { get; set; } = string.Empty;
+ [JsonInclude]
+ [JsonPropertyName("parent")]
+ public long Parent { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("inner_categories")]
+ public long[] InnerCategories { get; set; } = Array.Empty();
+ [JsonInclude]
+ [JsonPropertyName("channels")]
+ public long[] Channels { get; set; } = Array.Empty();
+ [JsonInclude]
+ [JsonPropertyName("role_overrides")]
+ public long[] RoleOverrides { get; set; } = Array.Empty();
+ [JsonInclude]
+ [JsonPropertyName("member_overrides")]
+ public long[] UserOverrides { get; set; } = Array.Empty();
+ [JsonInclude]
+ [JsonPropertyName("title_encryption_key")]
+ public long TitleEncryptionKey { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("description_encryption_key")]
+ public long DescriptionEncryptionKey { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("title_encoder_type")]
+ public EncoderType TitleEncoderType { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("description_encoder_type")]
+ public EncoderType DescriptionEncoderType { get; set; }
+}
+
+[JsonSerializable(typeof(CategorySTC))]
+[JsonSourceGenerationOptions(
+ GenerationMode = JsonSourceGenerationMode.Default,
+ PropertyNamingPolicy = JsonKnownNamingPolicy.Unspecified,
+ WriteIndented = false,
+ DefaultIgnoreCondition = JsonIgnoreCondition.Never)]
+public partial class CategorySTCContext : JsonSerializerContext;
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/ChannelProfileSTC.cs b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/ChannelProfileSTC.cs
new file mode 100644
index 0000000..232246e
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/ChannelProfileSTC.cs
@@ -0,0 +1,31 @@
+using System.Text.Json.Serialization;
+using Luski.Shared.PublicServers.V1.Enums;
+
+namespace Luski.Shared.PublicServers.V1.ServerToClient.HTTP;
+
+public class ChannelProfileSTC : STC
+{
+ [JsonInclude]
+ [JsonPropertyName("id")]
+ public long ID { get; set; } = default!;
+ [JsonInclude]
+ [JsonPropertyName("displayname")]
+ public string DisplayName { get; set; } = default!;
+ [JsonInclude]
+ [JsonPropertyName("picture_type")]
+ public PictureType PictureType { get; set; } = default!;
+ [JsonInclude]
+ [JsonPropertyName("controllers")]
+ public long[] Controllers { get; set; } = default!;
+ [JsonInclude]
+ [JsonPropertyName("color")]
+ public string Color { get; set; } = string.Empty;
+}
+
+[JsonSerializable(typeof(ChannelProfileSTC))]
+[JsonSourceGenerationOptions(
+ GenerationMode = JsonSourceGenerationMode.Default,
+ PropertyNamingPolicy = JsonKnownNamingPolicy.Unspecified,
+ WriteIndented = false,
+ DefaultIgnoreCondition = JsonIgnoreCondition.Never)]
+public partial class ChannelProfileSTCContext : JsonSerializerContext;
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/ChannelSTC.cs b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/ChannelSTC.cs
new file mode 100644
index 0000000..4dbf260
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/ChannelSTC.cs
@@ -0,0 +1,74 @@
+using System.Text.Json.Serialization;
+using JacobTechEncryption.Enums;
+using Luski.Shared.PublicServers.V1.Enums;
+
+namespace Luski.Shared.PublicServers.V1.ServerToClient.HTTP;
+
+public class ChannelSTC : STC
+{
+ [JsonInclude]
+ [JsonPropertyName("id")]
+ public long ID { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("parent")]
+ public long Parent { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("color")]
+ public string Color { get; set; } = string.Empty;
+ [JsonInclude]
+ [JsonPropertyName("type")]
+ public ChannelType Type { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("epoch")]
+ public DateTime Epoch { get; set; }
+
+ [JsonInclude]
+ [JsonPropertyName("name")]
+ public string Name { get; set; } = string.Empty;
+
+ [JsonInclude]
+ [JsonPropertyName("description")]
+ public string Description { get; set; } = string.Empty;
+
+ [JsonInclude]
+ [JsonPropertyName("role_overrides")]
+ public long[] RoleOverrides { get; set; } = Array.Empty();
+ [JsonInclude]
+ [JsonPropertyName("member_overrides")]
+ public long[] UserOverrides { get; set; } = Array.Empty();
+ [JsonInclude]
+ [JsonPropertyName("title_encryption_key")]
+ public long TitleEncryptionKey { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("description_encryption_key")]
+ public long DescriptionEncryptionKey { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("encryption_keys")]
+ public long[] EncryptionKeys { get; set; } = Array.Empty();
+ [JsonInclude]
+ [JsonPropertyName("title_encoder_type")]
+ public EncoderType TitleEncoderType { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("description_encoder_type")]
+ public EncoderType DescriptionEncoderType { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("encoder_types")]
+ public EncoderType[] EncoderTypes { get; set; } = Array.Empty();
+ [JsonInclude]
+ [JsonPropertyName("picture_type")]
+ public PictureType PictureType { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("encoder_blacklist")]
+ public bool IsEncoderBlacklist { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("encryption_blacklist")]
+ public bool IsEncryptionBlacklist { get; set; }
+}
+
+[JsonSerializable(typeof(ChannelSTC))]
+[JsonSourceGenerationOptions(
+ GenerationMode = JsonSourceGenerationMode.Default,
+ PropertyNamingPolicy = JsonKnownNamingPolicy.Unspecified,
+ WriteIndented = false,
+ DefaultIgnoreCondition = JsonIgnoreCondition.Never)]
+public partial class ChannelSTCContext : JsonSerializerContext;
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/KeyGetSTC.cs b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/KeyGetSTC.cs
new file mode 100644
index 0000000..9ea29aa
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/KeyGetSTC.cs
@@ -0,0 +1,29 @@
+using System.Text.Json.Serialization;
+using JacobTechEncryption.Enums;
+
+namespace Luski.Shared.PublicServers.V1.ServerToClient.HTTP;
+
+public class KeyGetSTC : STC
+{
+
+ [JsonInclude]
+ [JsonPropertyName("id")]
+ public long ID { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("owner")]
+ public long Owner { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("encryption_type")]
+ public EncryptionType EncryptionType { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("key_data")]
+ public string Data { get; set; } = string.Empty;
+}
+
+[JsonSerializable(typeof(KeyGetSTC))]
+[JsonSourceGenerationOptions(
+ GenerationMode = JsonSourceGenerationMode.Default,
+ PropertyNamingPolicy = JsonKnownNamingPolicy.Unspecified,
+ WriteIndented = false,
+ DefaultIgnoreCondition = JsonIgnoreCondition.Never)]
+public partial class KeyGetSTCContext : JsonSerializerContext;
diff --git a/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/KeysGetSTC.cs b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/KeysGetSTC.cs
new file mode 100644
index 0000000..0c80af5
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/KeysGetSTC.cs
@@ -0,0 +1,18 @@
+using System.Text.Json.Serialization;
+
+namespace Luski.Shared.PublicServers.V1.ServerToClient.HTTP;
+
+public class KeysGetSTC : STC
+{
+ [JsonInclude]
+ [JsonPropertyName("keys")]
+ public KeyGetSTC[] Keys { get; set; } = Array.Empty();
+}
+
+[JsonSerializable(typeof(KeysGetSTC))]
+[JsonSourceGenerationOptions(
+ GenerationMode = JsonSourceGenerationMode.Default,
+ PropertyNamingPolicy = JsonKnownNamingPolicy.Unspecified,
+ WriteIndented = false,
+ DefaultIgnoreCondition = JsonIgnoreCondition.Never)]
+public partial class KeysGetSTCContext : JsonSerializerContext;
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/LoginSTC.cs b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/LoginSTC.cs
new file mode 100644
index 0000000..9706a20
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/LoginSTC.cs
@@ -0,0 +1,18 @@
+using System.Text.Json.Serialization;
+
+namespace Luski.Shared.PublicServers.V1.ServerToClient.HTTP;
+
+public class LoginSTC : STC
+{
+ [JsonInclude]
+ [JsonPropertyName("login_token")]
+ public string Token { get; set; } = default!;
+}
+
+[JsonSerializable(typeof(LoginSTC))]
+[JsonSourceGenerationOptions(
+ GenerationMode = JsonSourceGenerationMode.Default,
+ PropertyNamingPolicy = JsonKnownNamingPolicy.Unspecified,
+ WriteIndented = false,
+ DefaultIgnoreCondition = JsonIgnoreCondition.Never)]
+public partial class LoginSTCContext : JsonSerializerContext;
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/MessageSTC.cs b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/MessageSTC.cs
new file mode 100644
index 0000000..c3e71f8
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/MessageSTC.cs
@@ -0,0 +1,40 @@
+using System.Text.Json.Serialization;
+using JacobTechEncryption.Enums;
+
+namespace Luski.Shared.PublicServers.V1.ServerToClient.HTTP;
+
+public class MessageSTC : STC
+{
+ [JsonInclude]
+ [JsonPropertyName("id")]
+ public long ID { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("channel_id")]
+ public long ChannelID { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("author_id")]
+ public long AuthorID { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("context")]
+ public string Context { get; set; } = string.Empty;
+ [JsonInclude]
+ [JsonPropertyName("encryption_key")]
+ public long EncryptionKey { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("files")]
+ public ServerFileInfoSTC[] Files { get; set; } = Array.Empty();
+ [JsonInclude]
+ [JsonPropertyName("encoder_type")]
+ public EncoderType EncoderType { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("is_channel_profile")]
+ public bool IsProfile { get; set; }
+}
+
+[JsonSerializable(typeof(MessageSTC))]
+[JsonSourceGenerationOptions(
+ GenerationMode = JsonSourceGenerationMode.Default,
+ PropertyNamingPolicy = JsonKnownNamingPolicy.Unspecified,
+ WriteIndented = false,
+ DefaultIgnoreCondition = JsonIgnoreCondition.Never)]
+public partial class MessageSTCContext : JsonSerializerContext;
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/OfflineDataBlobSTC.cs b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/OfflineDataBlobSTC.cs
new file mode 100644
index 0000000..1157aef
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/OfflineDataBlobSTC.cs
@@ -0,0 +1,18 @@
+using System.Text.Json.Serialization;
+
+namespace Luski.Shared.PublicServers.V1.ServerToClient.HTTP;
+
+public class OfflineDataBlobSTC : STC
+{
+ [JsonInclude]
+ [JsonPropertyName("data")]
+ public string[] Data { get; set; } = Array.Empty();
+}
+
+[JsonSerializable(typeof(OfflineDataBlobSTC))]
+[JsonSourceGenerationOptions(
+ GenerationMode = JsonSourceGenerationMode.Default,
+ PropertyNamingPolicy = JsonKnownNamingPolicy.Unspecified,
+ WriteIndented = false,
+ DefaultIgnoreCondition = JsonIgnoreCondition.Never)]
+public partial class OfflineDataBlobSTCContext : JsonSerializerContext;
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/RoleSTC.cs b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/RoleSTC.cs
new file mode 100644
index 0000000..5c381fa
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/RoleSTC.cs
@@ -0,0 +1,40 @@
+using System.Text.Json.Serialization;
+using Luski.Shared.PublicServers.V1.Enums;
+
+namespace Luski.Shared.PublicServers.V1.ServerToClient.HTTP;
+
+public class RoleSTC : STC
+{
+ [JsonInclude]
+ [JsonPropertyName("id")]
+ public long ID { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("name")]
+ public string Name { get; set; } = string.Empty;
+ [JsonInclude]
+ [JsonPropertyName("display_name")]
+ public string DisplayName { get; set; } = string.Empty;
+ [JsonInclude]
+ [JsonPropertyName("index")]
+ public int Index { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("color")]
+ public string Color { get; set; } = string.Empty;
+ [JsonInclude]
+ [JsonPropertyName("description")]
+ public string Description { get; set; } = string.Empty;
+ [JsonInclude]
+ [JsonPropertyName("server_permissions")]
+ public ServerPermission ServerPermissions { get; set; } = ServerPermission.None;
+ [JsonInclude]
+ [JsonPropertyName("members_list")]
+ public long[] Members { get; set; } = Array.Empty();
+}
+
+[JsonSerializable(typeof(RoleSTC))]
+[JsonSourceGenerationOptions(
+ GenerationMode = JsonSourceGenerationMode.Default,
+ PropertyNamingPolicy = JsonKnownNamingPolicy.Unspecified,
+ WriteIndented = false,
+ DefaultIgnoreCondition = JsonIgnoreCondition.Never)]
+public partial class RoleSTCContext : JsonSerializerContext;
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/STC.cs b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/STC.cs
new file mode 100644
index 0000000..1e536fa
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/STC.cs
@@ -0,0 +1,27 @@
+using System.ComponentModel;
+using System.Net;
+using System.Text.Json.Serialization;
+using Luski.Shared.PublicServers.V1.Enums;
+
+namespace Luski.Shared.PublicServers.V1.ServerToClient.HTTP;
+
+[Browsable(false)]
+[EditorBrowsable(EditorBrowsableState.Never)]
+public class STC
+{
+ [JsonPropertyName("error")]
+ [JsonInclude]
+ public ErrorCode? Error { get; set; }
+ [JsonIgnore]
+ public HttpStatusCode StatusCode { get; init; } = HttpStatusCode.OK;
+ [JsonPropertyName("error_message")]
+ [JsonInclude]
+ public string? ErrorMessage { get; set; }
+}
+
+[JsonSerializable(typeof(STC))]
+[JsonSourceGenerationOptions(
+ GenerationMode = JsonSourceGenerationMode.Default,
+ PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase,
+ WriteIndented = false)]
+public partial class STCContext : JsonSerializerContext;
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/ServerFileInfoSTC.cs b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/ServerFileInfoSTC.cs
new file mode 100644
index 0000000..d2f427e
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/ServerFileInfoSTC.cs
@@ -0,0 +1,37 @@
+using System.Text.Json.Serialization;
+using JacobTechEncryption.Enums;
+
+namespace Luski.Shared.PublicServers.V1.ServerToClient.HTTP;
+
+public class ServerFileInfoSTC : STC
+{
+ [JsonInclude]
+ [JsonPropertyName("id")]
+ public long ID { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("name")]
+ public string Name { get; set; } = string.Empty;
+ [JsonInclude]
+ [JsonPropertyName("encoder_type")]
+ public EncoderType Encoder { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("name_encoder_type")]
+ public EncoderType NameEncoder { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("encryption_key")]
+ public long Key { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("name_encryption_key")]
+ public long NameKey { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("size")]
+ public long Size { get; set; }
+}
+
+[JsonSerializable(typeof(ServerFileInfoSTC))]
+[JsonSourceGenerationOptions(
+ GenerationMode = JsonSourceGenerationMode.Default,
+ PropertyNamingPolicy = JsonKnownNamingPolicy.Unspecified,
+ WriteIndented = false,
+ DefaultIgnoreCondition = JsonIgnoreCondition.Never)]
+public partial class ServerFileInfoSTCContext : JsonSerializerContext;
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/ServerInfoSTC.cs b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/ServerInfoSTC.cs
new file mode 100644
index 0000000..9cc7245
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/ServerInfoSTC.cs
@@ -0,0 +1,31 @@
+using System.Text.Json.Serialization;
+using Luski.Shared.PublicServers.V1.Shared;
+
+namespace Luski.Shared.PublicServers.V1.ServerToClient.HTTP;
+
+public class ServerInfoSTC : STC
+{
+ [JsonInclude]
+ [JsonPropertyName("name")]
+ public string Name { get; set; } = string.Empty;
+ [JsonInclude]
+ [JsonPropertyName("wssv4")]
+ public string WSSv4Address { get; set; } = string.Empty;
+ [JsonInclude]
+ [JsonPropertyName("description")]
+ public string Description { get; set; } = string.Empty;
+ [JsonInclude]
+ [JsonPropertyName("owner")]
+ public long Owner { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("alternate_servers")]
+ public ServerData[] AlternateServers { get; set; } =Array.Empty();
+}
+
+[JsonSerializable(typeof(ServerInfoSTC))]
+[JsonSourceGenerationOptions(
+ GenerationMode = JsonSourceGenerationMode.Default,
+ PropertyNamingPolicy = JsonKnownNamingPolicy.Unspecified,
+ WriteIndented = false,
+ DefaultIgnoreCondition = JsonIgnoreCondition.Never)]
+public partial class ServerInfoSTCContext : JsonSerializerContext;
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/SocketBulkMessageSTC.cs b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/SocketBulkMessageSTC.cs
new file mode 100644
index 0000000..00409ce
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/SocketBulkMessageSTC.cs
@@ -0,0 +1,18 @@
+using System.Text.Json.Serialization;
+
+namespace Luski.Shared.PublicServers.V1.ServerToClient.HTTP;
+
+public class SocketBulkMessageSTC : STC
+{
+ [JsonInclude]
+ [JsonPropertyName("messages")]
+ public MessageSTC[]? Messages { get; set; } = default!;
+}
+
+[JsonSerializable(typeof(SocketBulkMessageSTC))]
+[JsonSourceGenerationOptions(
+ GenerationMode = JsonSourceGenerationMode.Default,
+ PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase,
+ WriteIndented = false,
+ DefaultIgnoreCondition = JsonIgnoreCondition.Never)]
+public partial class SocketBulkMessageSTCContext : JsonSerializerContext;
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/SocketUserSTC.cs b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/SocketUserSTC.cs
new file mode 100644
index 0000000..da0842a
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/SocketUserSTC.cs
@@ -0,0 +1,34 @@
+using System.Text.Json.Serialization;
+using Luski.Shared.PublicServers.V1.Enums;
+
+namespace Luski.Shared.PublicServers.V1.ServerToClient.HTTP;
+
+public class SocketUserSTC : STC
+{
+ [JsonInclude]
+ [JsonPropertyName("id")]
+ public long ID { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("displayname")]
+ public string DisplayName { get; set; } = default!;
+ [JsonInclude]
+ [JsonPropertyName("selected_channel")]
+ public long SelectedChannel { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("status")]
+ public UserStatus Status { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("picture_type")]
+ public PictureType PictureType { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("roles")]
+ public long[] RoleIds { get; set; } = default!;
+}
+
+[JsonSerializable(typeof(SocketUserSTC))]
+[JsonSourceGenerationOptions(
+ GenerationMode = JsonSourceGenerationMode.Default,
+ PropertyNamingPolicy = JsonKnownNamingPolicy.Unspecified,
+ WriteIndented = false,
+ DefaultIgnoreCondition = JsonIgnoreCondition.Never)]
+public partial class SocketUserSTCContext : JsonSerializerContext;
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/StorageInfoSTC.cs b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/StorageInfoSTC.cs
new file mode 100644
index 0000000..1010a39
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/StorageInfoSTC.cs
@@ -0,0 +1,24 @@
+using System.Text.Json.Serialization;
+
+namespace Luski.Shared.PublicServers.V1.ServerToClient.HTTP;
+
+public class StorageInfoSTC : STC
+{
+ [JsonInclude]
+ [JsonPropertyName("id")]
+ public long ID { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("update")]
+ public bool Update { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("password")]
+ public string Password { get; set; } = string.Empty;
+}
+
+[JsonSerializable(typeof(StorageInfoSTC))]
+[JsonSourceGenerationOptions(
+ GenerationMode = JsonSourceGenerationMode.Default,
+ PropertyNamingPolicy = JsonKnownNamingPolicy.Unspecified,
+ WriteIndented = false,
+ DefaultIgnoreCondition = JsonIgnoreCondition.Never)]
+public partial class StorageInfoSTCContext : JsonSerializerContext;
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/UserOverrideSTC.cs b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/UserOverrideSTC.cs
new file mode 100644
index 0000000..70263c9
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/UserOverrideSTC.cs
@@ -0,0 +1,28 @@
+using System.Text.Json.Serialization;
+using Luski.Shared.PublicServers.V1.Enums;
+using Luski.Shared.PublicServers.V1.Shared;
+
+namespace Luski.Shared.PublicServers.V1.ServerToClient.HTTP;
+
+public class UserOverrideSTC : STC
+{
+ [JsonInclude]
+ [JsonPropertyName("id")]
+ public long Id { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("user_id")]
+ public long UserID { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("good_permissions")]
+ public ServerPermission GoodPermissions { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("bad_permissions")]
+ public ServerPermission BadPermissions { get; set; }
+}
+
+[JsonSerializable(typeof(UserOverrideSTC))]
+[JsonSourceGenerationOptions(
+ GenerationMode = JsonSourceGenerationMode.Default,
+ PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase,
+ WriteIndented = false)]
+public partial class UserOverrideSTCContext : JsonSerializerContext;
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/UserRoleOverrideSTC.cs b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/UserRoleOverrideSTC.cs
new file mode 100644
index 0000000..3a2525c
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/ServerToClient/HTTP/UserRoleOverrideSTC.cs
@@ -0,0 +1,28 @@
+using System.Text.Json.Serialization;
+using Luski.Shared.PublicServers.V1.Enums;
+using Luski.Shared.PublicServers.V1.Shared;
+
+namespace Luski.Shared.PublicServers.V1.ServerToClient.HTTP;
+
+public class UserRoleOverrideSTC : STC
+{
+ [JsonInclude]
+ [JsonPropertyName("id")]
+ public long Id { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("role_id")]
+ public long RoleID { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("good_permissions")]
+ public ServerPermission GoodPermissions { get; set; }
+ [JsonInclude]
+ [JsonPropertyName("bad_permissions")]
+ public ServerPermission BadPermissions { get; set; }
+}
+
+[JsonSerializable(typeof(UserRoleOverrideSTC))]
+[JsonSourceGenerationOptions(
+ GenerationMode = JsonSourceGenerationMode.Default,
+ PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase,
+ WriteIndented = false)]
+public partial class UserRoleOverrideSTCContext : JsonSerializerContext;
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/Shared/Ext.cs b/Luski.Shared/PublicServers/V1/Shared/Ext.cs
new file mode 100644
index 0000000..2a22103
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/Shared/Ext.cs
@@ -0,0 +1,12 @@
+using System.Data;
+using Luski.Shared.PublicServers.V1.Enums;
+
+namespace Luski.Shared.PublicServers.V1.Shared;
+
+public static class Ext
+{
+ public static bool HasPermission(this ServerPermission Full, ServerPermission Permission)
+ {
+ return ((long) Full & (long) Permission) == (long) Permission;
+ }
+}
\ No newline at end of file
diff --git a/Luski.Shared/PublicServers/V1/Shared/ServerData.cs b/Luski.Shared/PublicServers/V1/Shared/ServerData.cs
new file mode 100644
index 0000000..bd3b3e7
--- /dev/null
+++ b/Luski.Shared/PublicServers/V1/Shared/ServerData.cs
@@ -0,0 +1,20 @@
+using System.Text.Json.Serialization;
+
+namespace Luski.Shared.PublicServers.V1.Shared;
+
+public class ServerData
+{
+ [JsonInclude]
+ [JsonPropertyName("address")]
+ public string DomainAndPort = default!;
+ [JsonInclude]
+ [JsonPropertyName("secure")]
+ public bool Secure;
+}
+
+[JsonSerializable(typeof(ServerData))]
+[JsonSourceGenerationOptions(
+ GenerationMode = JsonSourceGenerationMode.Default,
+ PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase,
+ WriteIndented = false)]
+public partial class ServerDataContext : JsonSerializerContext;
\ No newline at end of file