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) + } + } } }