import Foundation #if canImport(FoundationNetworking) import FoundationNetworking #endif /// https://discord.com/developers/docs/topics/gateway#gateway-intents public struct Intents: OptionSet, Sendable { public var rawValue: UInt32 public static let guilds = Intents(rawValue: 1 << 0) public static let guildMembers = Intents(rawValue: 1 << 1) public static let guildModeration = Intents(rawValue: 1 << 2) public static let guildEmojisAndStickers = Intents(rawValue: 1 << 3) public static let guildIntegrations = Intents(rawValue: 1 << 4) public static let guildWebhooks = Intents(rawValue: 1 << 5) public static let guildInvites = Intents(rawValue: 1 << 6) public static let guildVoiceStates = Intents(rawValue: 1 << 7) public static let guildPresences = Intents(rawValue: 1 << 8) public static let guildMessages = Intents(rawValue: 1 << 9) public static let guildMessageReactions = Intents(rawValue: 1 << 10) public static let guildMessageTyping = Intents(rawValue: 1 << 11) public static let directMessages = Intents(rawValue: 1 << 12) public static let directMessageReactions = Intents(rawValue: 1 << 13) public static let directMessageTyping = Intents(rawValue: 1 << 14) public static let messageContent = Intents(rawValue: 1 << 15) public static let guildScheduledEvents = Intents(rawValue: 1 << 16) public static let autoModerationConfiguration = Intents(rawValue: 1 << 20) public static let autoModerationExecution = Intents(rawValue: 1 << 21) public static let guildMessagePolls = Intents(rawValue: 1 << 24) public static let directMessagePolls = Intents(rawValue: 1 << 25) public init(rawValue: UInt32) { self.rawValue = rawValue } } public struct GetGatewayResponse: Codable, Sendable { let url: URL let shards: Int let session_start_limit: SessionStartLimit } public struct SessionStartLimit: Codable, Sendable { let total: Int let remaining: Int let reset_after: Int let max_concurrency: Int } public enum GatewayPayload: Decodable, Sendable { case hello(HelloPayload) } public struct GatewayMessage: Decodable, Sendable { let op: Int let d: GatewayPayload? let s: Int? let t: String? enum CodingKeys: String, CodingKey { case t case s case op case d } public init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) op = try container.decode(Int.self, forKey: .op) s = try container.decode(Int?.self, forKey: .s) t = try container.decode(String?.self, forKey: .t) switch op { case 10: let hello = try container.decode(HelloPayload.self, forKey: .d) d = .hello(hello) default: d = nil break } } public init(op: Int, d: GatewayPayload?, s: Int?, t: String?) { self.op = op self.d = d self.s = s self.t = t } } public struct HelloPayload: Codable, Sendable { let heartbeat_interval: Int }