From c6b92d968aacbc2940a071fddacf98c08c17268d Mon Sep 17 00:00:00 2001 From: Candygoblen123 Date: Fri, 13 Mar 2026 10:20:27 -0400 Subject: [PATCH] DiscordKit: wip gateway events handler --- Sources/DiscordKit/GatewayClient.swift | 40 +++++++++++++++++++------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/Sources/DiscordKit/GatewayClient.swift b/Sources/DiscordKit/GatewayClient.swift index 3ec5593..b7dc276 100644 --- a/Sources/DiscordKit/GatewayClient.swift +++ b/Sources/DiscordKit/GatewayClient.swift @@ -5,18 +5,38 @@ import FoundationNetworking struct GatewayClient { let gatewayURL: URL + let ws: URLSessionWebSocketTask - func openConnection() async throws { - let ws = URLSession.shared.webSocketTask(with: gatewayURL.appending(component: "?v=10&encoding=json")) + init(gatewayURL: URL) { + self.gatewayURL = gatewayURL + ws = URLSession.shared.webSocketTask(with: gatewayURL.appending(component: "?v=10&encoding=json")) + } + + func openConnection() { + listen() ws.resume() - let message = try await ws.receive() - guard case .string(let str) = message else { throw GatewayError.invalidMessage } - print(str) - let json = JSONDecoder() - let gwMessage = try json.decode(GatewayMessage.self, from: Data(str.utf8)) - dump(gwMessage) - guard case .hello(let hello) = gwMessage.d else { print("whoops"); return } - dump(hello) + RunLoop.current.run() + } + + func listen() { + ws.receive { result in + defer { listen() } + do { + if case .failure(let err) = result { throw err } + guard case .success(let message) = result else { return } + guard case .string(let str) = message else { throw GatewayError.invalidMessage } + let json = JSONDecoder() + let gwMessage = try json.decode(GatewayMessage.self, from: Data(str.utf8)) + switch gwMessage.d { + case .hello(let hello): + dump(hello) + case .none: + return + } + } catch { + print(error) + } + } } }