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 { public let url: URL public let shards: Int public let session_start_limit: SessionStartLimit } public struct SessionStartLimit: Codable, Sendable { public let total: Int public let remaining: Int public let reset_after: Int public let max_concurrency: Int } public enum GatewayPayload: Decodable, Sendable { case hello(GatewayHello) case messageCreate(MessageCreate) } public struct GatewayMessage: Decodable, Sendable { public let op: Int public let d: GatewayPayload? public let s: Int? public 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(GatewayHello.self, forKey: .d) d = .hello(hello) case 0 where t == "MESSAGE_CREATE": let messageCreate = try container.decode(MessageCreate.self, forKey: .d) d = .messageCreate(messageCreate) 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 GatewayHello: Codable, Sendable { let heartbeat_interval: Int } public struct CreateMessageReq: Codable, Sendable { public init(content: String? = nil, message_reference: MessageRefrence? = nil) { self.content = content self.message_reference = message_reference } public let content: String? public let message_reference: MessageRefrence? } public struct MessageRefrence: Codable, Sendable { public init(type: Int? = nil, message_id: String? = nil, channel_id: String? = nil, guild_id: String? = nil) { self.type = type self.message_id = message_id self.channel_id = channel_id self.guild_id = guild_id } let type: Int? let message_id: String? let channel_id: String? let guild_id: String? } public struct MessageCreate: Codable, Sendable { public let id: String public let channel_id: String public let guild_id: String? public let author: User? public let content: String public let mentions: [User] } public struct User: Codable, Sendable { public let id: String? public let bot: Bool? }