summary refs log tree commit diff
path: root/extra/admin-api/Spacebar.Offload/Controllers/IdentifyController.cs
diff options
context:
space:
mode:
authorRory& <root@rory.gay>2026-03-19 08:38:20 +0100
committerRory& <root@rory.gay>2026-03-19 08:38:20 +0100
commitd0eac0b8e7738c645707b52e386ca1e2079b8da8 (patch)
treec8fc5b135ec94f6351e025ff7df472f83db4c6c5 /extra/admin-api/Spacebar.Offload/Controllers/IdentifyController.cs
parentCDN: use file contents for hashes, the fuck (diff)
downloadserver-ts-d0eac0b8e7738c645707b52e386ca1e2079b8da8.tar.xz
GatewayOffload: rename to Offload
Diffstat (limited to 'extra/admin-api/Spacebar.Offload/Controllers/IdentifyController.cs')
-rw-r--r--extra/admin-api/Spacebar.Offload/Controllers/IdentifyController.cs53
1 files changed, 53 insertions, 0 deletions
diff --git a/extra/admin-api/Spacebar.Offload/Controllers/IdentifyController.cs b/extra/admin-api/Spacebar.Offload/Controllers/IdentifyController.cs
new file mode 100644

index 00000000..02bad394 --- /dev/null +++ b/extra/admin-api/Spacebar.Offload/Controllers/IdentifyController.cs
@@ -0,0 +1,53 @@ +using Microsoft.AspNetCore.Mvc; +using Spacebar.Interop.Authentication; +using Spacebar.Interop.Replication.Abstractions; +using Spacebar.Models.Db.Contexts; +using Spacebar.Models.Gateway; +using Spacebar.Models.Generic; + +namespace Spacebar.GatewayOffload.Controllers; + +[ApiController] +[Route("/_spacebar/offload/gateway/Identify")] +public class IdentifyController(ILogger<IdentifyController> logger, SpacebarAuthenticationService authService, SpacebarDbContext db, IServiceProvider sp) : ControllerBase { + [HttpPost("")] + public async IAsyncEnumerable<ContentlessReplicationMessage> DoIdentify(IdentifyRequest payload) { + var user = await TraceResult.TraceAsync("getAuthUser", () => authService.GetCurrentUserAsync(payload.Token)); + var session = await TraceResult.TraceAsync("getAuthSession", () => authService.GetCurrentSessionAsync(payload.Token)); + + var socketMeta = new SbWebsocketMeta() { + // Auth data + AccessToken = payload.Token, + UserId = user.Result.Id, + SessionId = session.Result.SessionId, + // Client capabilities + Capabilities = payload.Capabilities ??= 0, + LargeThreshold = payload.LargeTreshold ??= user.Result.Bot ? 20 : 250, + Intents = payload.Intents ??= (GatewayIntentFlags)0b_110_11111111_11111111_11111111_11111111, + // Sharding info + ShardId = payload.Shard?[0], + ShardCount = payload.Shard?[1], + }; + + if (socketMeta is { ShardId: not null, ShardCount: not null }) { + if (socketMeta.ShardId < 0 || socketMeta.ShardCount <= 0 || socketMeta.ShardId >= socketMeta.ShardCount) { + logger.LogWarning("Invalid sharding from {userId}: {shardId}/{shardCount}", user.Result.Id, socketMeta.ShardId, socketMeta.ShardCount); + yield return this.Close(CloseCode.InvalidShard); + yield break; + } + } + + yield return new ReplicationMessage<ReadyResponse>() { + Payload = new() { }, + }; + } + + // TODO: type? also, implement this in gateway lol + private ReplicationMessage<object?> Close(CloseCode closeCode) => new() { + Origin = "IdentifyController", + Event = "SB_GW_CLOSE", + Payload = new { + code = closeCode, + } + }; +} \ No newline at end of file