From a25e3194db4937459d675408ca59942973a5ff82 Mon Sep 17 00:00:00 2001 From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com> Date: Tue, 13 May 2025 09:54:38 -0500 Subject: [PATCH] feat: begin working on client --- .../Discord/DiscordGatewayClient.cs | 48 +++++++++++++++++++ .../Discord/IDiscordGatewayClient.cs | 5 ++ src/StevesBot.Worker/Usings.cs | 5 ++ src/StevesBot.Worker/appsettings.Example.json | 2 +- 4 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 src/StevesBot.Worker/Discord/DiscordGatewayClient.cs create mode 100644 src/StevesBot.Worker/Discord/IDiscordGatewayClient.cs diff --git a/src/StevesBot.Worker/Discord/DiscordGatewayClient.cs b/src/StevesBot.Worker/Discord/DiscordGatewayClient.cs new file mode 100644 index 0000000..fd4a9e0 --- /dev/null +++ b/src/StevesBot.Worker/Discord/DiscordGatewayClient.cs @@ -0,0 +1,48 @@ +namespace StevesBot.Worker.Discord; + +internal class DiscordGatewayClient : IDiscordGatewayClient +{ + private readonly DiscordGatewayClientOptions _options; + private readonly IWebSocketFactory _webSocketFactory; + private readonly ILogger _logger; + private readonly JsonSerializerOptions _jsonSerializerOptions = new() + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + ReferenceHandler = ReferenceHandler.IgnoreCycles, + Converters = + { + new DiscordEventConverter(), + }, + }; + private readonly AsyncLock _lock = new(); + + private string _gatewayUrl = string.Empty; + private IWebSocket? _webSocket; + private Task? _receiveTask; + private DateTime _timeLastHeartbeatSent = DateTime.MinValue; + private DateTime _timeLastHeartbeatAcknowledged = DateTime.MinValue; + private CancellationTokenSource? _heartbeatCts; + private Task? _heartbeatTask; + private string _sessionId = string.Empty; + private string _resumeGatewayUrl = string.Empty; + + public DiscordGatewayClient( + DiscordGatewayClientOptions options, + IWebSocketFactory webSocketFactory, + ILogger logger + ) + { + _options = options ?? throw new ArgumentNullException(nameof(options)); + _webSocketFactory = webSocketFactory ?? throw new ArgumentNullException(nameof(webSocketFactory)); + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + } + + public void Dispose() + { + _heartbeatCts?.Cancel(); + _heartbeatCts?.Dispose(); + _heartbeatTask?.Dispose(); + _receiveTask?.Dispose(); + _webSocket?.Dispose(); + } +} \ No newline at end of file diff --git a/src/StevesBot.Worker/Discord/IDiscordGatewayClient.cs b/src/StevesBot.Worker/Discord/IDiscordGatewayClient.cs new file mode 100644 index 0000000..e541355 --- /dev/null +++ b/src/StevesBot.Worker/Discord/IDiscordGatewayClient.cs @@ -0,0 +1,5 @@ +namespace StevesBot.Worker.Discord; + +internal interface IDiscordGatewayClient : IDisposable +{ +} \ No newline at end of file diff --git a/src/StevesBot.Worker/Usings.cs b/src/StevesBot.Worker/Usings.cs index 58cd73a..0c147cc 100644 --- a/src/StevesBot.Worker/Usings.cs +++ b/src/StevesBot.Worker/Usings.cs @@ -1,3 +1,8 @@ global using System.Net.WebSockets; global using System.Text.Json; global using System.Text.Json.Serialization; + + +global using StevesBot.Worker.Discord.Events; +global using StevesBot.Worker.Threading; +global using StevesBot.Worker.WebSockets; \ No newline at end of file diff --git a/src/StevesBot.Worker/appsettings.Example.json b/src/StevesBot.Worker/appsettings.Example.json index db47611..98c991d 100644 --- a/src/StevesBot.Worker/appsettings.Example.json +++ b/src/StevesBot.Worker/appsettings.Example.json @@ -5,7 +5,7 @@ "Microsoft.Hosting.Lifetime": "Information" } }, - "DiscordClientOptions": { + "DiscordGatewayClientOptions": { "ApiUrl": "ApiUrl", "AppToken": "AppToken", "Intents": 0