diff --git a/.idea/.idea.Nebula/.idea/.name b/.idea/.idea.Nebula/.idea/.name
deleted file mode 100644
index c622c56..0000000
--- a/.idea/.idea.Nebula/.idea/.name
+++ /dev/null
@@ -1 +0,0 @@
-Nebula
\ No newline at end of file
diff --git a/Nebula.Launcher/Assets/Style.axaml b/Nebula.Launcher/Assets/Style.axaml
index cafaaa9..af8a340 100644
--- a/Nebula.Launcher/Assets/Style.axaml
+++ b/Nebula.Launcher/Assets/Style.axaml
@@ -57,4 +57,16 @@
+
+
+
+
diff --git a/Nebula.Launcher/CurrentConVar.cs b/Nebula.Launcher/CurrentConVar.cs
index 4dde8f3..dff0042 100644
--- a/Nebula.Launcher/CurrentConVar.cs
+++ b/Nebula.Launcher/CurrentConVar.cs
@@ -17,6 +17,6 @@ public static class CurrentConVar
"https://hub.spacestation14.com/api/servers"
]);
public static readonly ConVar AuthServers = ConVar.Build("launcher.authServers", [
- "https://auth.spacestation14.com/api/auth/authenticate"
+ "https://auth.spacestation14.com/api/auth"
]);
}
\ No newline at end of file
diff --git a/Nebula.Launcher/FileApis/HashApi.cs b/Nebula.Launcher/FileApis/HashApi.cs
index 4a049f9..e5ae500 100644
--- a/Nebula.Launcher/FileApis/HashApi.cs
+++ b/Nebula.Launcher/FileApis/HashApi.cs
@@ -1,5 +1,6 @@
using System.Collections.Generic;
using System.IO;
+using Nebula.Launcher.Models;
using Nebula.Launcher.Utils;
using Robust.LoaderApi;
diff --git a/Nebula.Launcher/Models/Auth/AuthenticateRequest.cs b/Nebula.Launcher/Models/Auth/AuthenticateRequest.cs
new file mode 100644
index 0000000..565663e
--- /dev/null
+++ b/Nebula.Launcher/Models/Auth/AuthenticateRequest.cs
@@ -0,0 +1,10 @@
+using System;
+
+namespace Nebula.Launcher.Models.Auth;
+
+public sealed record AuthenticateRequest(string? Username, Guid? UserId, string Password, string? TfaCode = null)
+{
+ public AuthenticateRequest(string username, string password) : this(username, null, password)
+ {
+ }
+}
\ No newline at end of file
diff --git a/Nebula.Launcher/Models/Auth/AuthenticateResponse.cs b/Nebula.Launcher/Models/Auth/AuthenticateResponse.cs
new file mode 100644
index 0000000..9894b57
--- /dev/null
+++ b/Nebula.Launcher/Models/Auth/AuthenticateResponse.cs
@@ -0,0 +1,5 @@
+using System;
+
+namespace Nebula.Launcher.Models.Auth;
+
+public sealed record AuthenticateResponse(string Token, string Username, Guid UserId, DateTimeOffset ExpireTime);
\ No newline at end of file
diff --git a/Nebula.Launcher/Models/Auth/LoginInfo.cs b/Nebula.Launcher/Models/Auth/LoginInfo.cs
new file mode 100644
index 0000000..d861086
--- /dev/null
+++ b/Nebula.Launcher/Models/Auth/LoginInfo.cs
@@ -0,0 +1,15 @@
+using System;
+
+namespace Nebula.Launcher.Models.Auth;
+
+public class LoginInfo
+{
+ public Guid UserId { get; set; }
+ public string Username { get; set; } = default!;
+ public LoginToken Token { get; set; }
+
+ public override string ToString()
+ {
+ return $"{Username}/{UserId}";
+ }
+}
\ No newline at end of file
diff --git a/Nebula.Launcher/Models/Auth/LoginToken.cs b/Nebula.Launcher/Models/Auth/LoginToken.cs
new file mode 100644
index 0000000..4d4c3b6
--- /dev/null
+++ b/Nebula.Launcher/Models/Auth/LoginToken.cs
@@ -0,0 +1,15 @@
+using System;
+
+namespace Nebula.Launcher.Models.Auth;
+
+public readonly struct LoginToken
+{
+ public readonly string Token;
+ public readonly DateTimeOffset ExpireTime;
+
+ public LoginToken(string token, DateTimeOffset expireTime)
+ {
+ Token = token;
+ ExpireTime = expireTime;
+ }
+}
\ No newline at end of file
diff --git a/Nebula.Launcher/Models/ContentCompressionScheme.cs b/Nebula.Launcher/Models/ContentCompressionScheme.cs
new file mode 100644
index 0000000..22fd911
--- /dev/null
+++ b/Nebula.Launcher/Models/ContentCompressionScheme.cs
@@ -0,0 +1,12 @@
+namespace Nebula.Launcher.Models;
+
+public enum ContentCompressionScheme
+{
+ None = 0,
+ Deflate = 1,
+
+ ///
+ /// ZStandard compression. In the future may use SS14 specific dictionary IDs in the frame header.
+ ///
+ ZStd = 2
+}
\ No newline at end of file
diff --git a/Nebula.Launcher/Models/MainArgs.cs b/Nebula.Launcher/Models/MainArgs.cs
new file mode 100644
index 0000000..845f283
--- /dev/null
+++ b/Nebula.Launcher/Models/MainArgs.cs
@@ -0,0 +1,20 @@
+using System.Collections.Generic;
+using Robust.LoaderApi;
+
+namespace Nebula.Launcher.Models;
+
+public sealed class MainArgs : IMainArgs
+{
+ public MainArgs(string[] args, IFileApi fileApi, IRedialApi? redialApi, IEnumerable? apiMounts)
+ {
+ Args = args;
+ FileApi = fileApi;
+ RedialApi = redialApi;
+ ApiMounts = apiMounts;
+ }
+
+ public string[] Args { get; }
+ public IFileApi FileApi { get; }
+ public IRedialApi? RedialApi { get; }
+ public IEnumerable? ApiMounts { get; }
+}
\ No newline at end of file
diff --git a/Nebula.Launcher/Models/RobustManifestInfo.cs b/Nebula.Launcher/Models/RobustManifestInfo.cs
index dd97d17..1cb7b12 100644
--- a/Nebula.Launcher/Models/RobustManifestInfo.cs
+++ b/Nebula.Launcher/Models/RobustManifestInfo.cs
@@ -1,5 +1,5 @@
using System;
-namespace Nebula.Launcher.Utils;
+namespace Nebula.Launcher.Models;
public record struct RobustManifestInfo(Uri ManifestUri, Uri DownloadUri, string Hash);
\ No newline at end of file
diff --git a/Nebula.Launcher/Models/RobustManifestItem.cs b/Nebula.Launcher/Models/RobustManifestItem.cs
index 0cf9dda..bcde69f 100644
--- a/Nebula.Launcher/Models/RobustManifestItem.cs
+++ b/Nebula.Launcher/Models/RobustManifestItem.cs
@@ -1,3 +1,3 @@
-namespace Nebula.Launcher.Utils;
+namespace Nebula.Launcher.Models;
public record struct RobustManifestItem(string Hash, string Path, int Id);
\ No newline at end of file
diff --git a/Nebula.Launcher/Models/RobustServerEntry.cs b/Nebula.Launcher/Models/RobustServerEntry.cs
index 0c2254b..ccad506 100644
--- a/Nebula.Launcher/Models/RobustServerEntry.cs
+++ b/Nebula.Launcher/Models/RobustServerEntry.cs
@@ -4,9 +4,9 @@ using System.Text.Json.Serialization;
namespace Nebula.Launcher.Models;
-public sealed record Auth(string Mode, string PublicKey);
+public sealed record AuthInfo(string Mode, string PublicKey);
-public sealed record Build(
+public sealed record BuildInfo(
string EngineVersion,
string ForkId,
string Version,
@@ -16,38 +16,16 @@ public sealed record Build(
string Hash,
string ManifestHash);
-public sealed record Link(string Name, string Icon, string Url);
-public sealed record Info(string ConnectAddress, Auth Auth, Build Build, string Desc, List Links);
+public sealed record ServerLink(string Name, string Icon, string Url);
+public sealed record ServerInfo(string ConnectAddress, AuthInfo Auth, BuildInfo Build, string Desc, List Links);
-public sealed record Status(
- string Name,
- int Players,
- List