Files
zunda-bot/Sources/DiscordKit/GatewayClient.swift

39 lines
1.1 KiB
Swift

import Foundation
#if canImport(FoundationNetworking)
import FoundationNetworking
#endif
class GatewayClient {
let ws: URLSessionWebSocketTask
var sequenceNum: Int? = nil
init(gatewayURL: URL) {
ws = URLSession.shared.webSocketTask(with: gatewayURL.appending(component: "?v=10&encoding=json"))
}
func openConnection() async throws {
ws.resume()
guard case .hello(let helloMessage) = try await getMessage().d else { throw GatewayError.mismatchedOpcode }
dump(helloMessage)
Timer.scheduledTimer(withTimeInterval: (helloMessage.heartbeat_interval / 1000.0), repeats: true) {
}
}
func getMessage() async throws -> GatewayMessage {
let wsMessage = try await ws.receive()
guard case .string(let str) = wsMessage else { throw GatewayError.invalidMessage }
let json = JSONDecoder()
let gwMessage = try json.decode(GatewayMessage.self, from: Data(str.utf8))
sequenceNum = gwMessage.s ?? sequenceNum
return gwMessage
}
}
public enum GatewayError: Error {
case invalidMessage
case invalidOpcode
case mismatchedOpcode
}