#pragma once #include #include #include #include #include "snowflake.hpp" #include "user.hpp" #include "role.hpp" #include "member.hpp" #include "channel.hpp" #include "guild.hpp" #include "usersettings.hpp" #include "message.hpp" #include "invite.hpp" #include "permissions.hpp" #include "emoji.hpp" #include "activity.hpp" #include "sticker.hpp" #include "ban.hpp" #include "auditlog.hpp" #include "relationship.hpp" // most stuff below should just be objects that get processed and thrown away immediately enum class GatewayOp : int { Event = 0, Heartbeat = 1, Identify = 2, UpdateStatus = 3, Resume = 6, Reconnect = 7, InvalidSession = 9, Hello = 10, HeartbeatAck = 11, LazyLoadRequest = 14, }; enum class GatewayEvent : int { READY, MESSAGE_CREATE, MESSAGE_DELETE, MESSAGE_UPDATE, GUILD_MEMBER_LIST_UPDATE, GUILD_CREATE, GUILD_DELETE, MESSAGE_DELETE_BULK, GUILD_MEMBER_UPDATE, PRESENCE_UPDATE, CHANNEL_DELETE, CHANNEL_UPDATE, CHANNEL_CREATE, GUILD_UPDATE, GUILD_ROLE_UPDATE, GUILD_ROLE_CREATE, GUILD_ROLE_DELETE, MESSAGE_REACTION_ADD, MESSAGE_REACTION_REMOVE, CHANNEL_RECIPIENT_ADD, CHANNEL_RECIPIENT_REMOVE, TYPING_START, GUILD_BAN_REMOVE, GUILD_BAN_ADD, INVITE_CREATE, INVITE_DELETE, USER_NOTE_UPDATE, READY_SUPPLEMENTAL, }; enum class GatewayCloseCode : uint16_t { // discord UnknownError = 4000, UnknownOpcode = 4001, DecodeError = 4002, NotAuthenticated = 4003, AuthenticationFailed = 4004, AlreadyAuthenticated = 4005, InvalidSequence = 4007, RateLimited = 4008, SessionTimedOut = 4009, InvalidShard = 4010, ShardingRequired = 4011, InvalidAPIVersion = 4012, InvalidIntents = 4013, DisallowedIntents = 4014, // internal UserDisconnect = 4091, Reconnecting = 4092, }; struct GatewayMessage { GatewayOp Opcode; nlohmann::json Data; std::string Type; int Sequence = -1; friend void from_json(const nlohmann::json &j, GatewayMessage &m); }; struct HelloMessageData { int HeartbeatInterval; friend void from_json(const nlohmann::json &j, HelloMessageData &m); }; struct MessageDeleteData { Snowflake ID; // Snowflake ChannelID; // Snowflake GuildID; // opt friend void from_json(const nlohmann::json &j, MessageDeleteData &m); }; struct MessageDeleteBulkData { std::vector IDs; // Snowflake ChannelID; // Snowflake GuildID; // opt friend void from_json(const nlohmann::json &j, MessageDeleteBulkData &m); }; struct GuildMemberListUpdateMessage { struct Item { virtual ~Item() = default; std::string Type; }; struct GroupItem : Item { std::string ID; int Count; friend void from_json(const nlohmann::json &j, GroupItem &m); }; struct MemberItem : Item { UserData User; std::vector Roles; std::optional Presence; std::string PremiumSince; // opt std::string Nickname; // opt bool IsMuted; std::string JoinedAt; std::string HoistedRole; // null bool IsDefeaned; GuildMember GetAsMemberData() const; friend void from_json(const nlohmann::json &j, MemberItem &m); private: GuildMember m_member_data; }; struct OpObject { std::string Op; std::optional Index; std::optional>> Items; // SYNC std::optional> Range; // SYNC std::optional> OpItem; // UPDATE friend void from_json(const nlohmann::json &j, OpObject &m); }; int OnlineCount; int MemberCount; std::string ListIDHash; std::string GuildID; std::vector Groups; std::vector Ops; friend void from_json(const nlohmann::json &j, GuildMemberListUpdateMessage &m); }; struct LazyLoadRequestMessage { Snowflake GuildID; bool ShouldGetTyping = false; bool ShouldGetActivities = false; std::optional> Members; // snowflake? std::optional>>> Channels; // channel ID -> range of sidebar friend void to_json(nlohmann::json &j, const LazyLoadRequestMessage &m); }; struct UpdateStatusMessage { int Since = 0; std::vector Activities; PresenceStatus Status; bool IsAFK = false; friend void to_json(nlohmann::json &j, const UpdateStatusMessage &m); }; struct ReadyEventData { int GatewayVersion; UserData SelfUser; std::vector Guilds; std::string SessionID; std::vector PrivateChannels; // undocumented std::optional> Users; std::optional AnalyticsToken; std::optional FriendSuggestionCount; UserSettings Settings; std::optional>> MergedMembers; std::optional> Relationships; // std::vector ConnectedAccounts; // opt // std::map Consents; // opt // std::vector Experiments; // opt // std::vector GuildExperiments; // opt // std::map Notes; // opt // std::vector Presences; // opt // std::vector ReadStates; // opt // Unknown Tutorial; // opt, null // std::vector UserGuildSettings; // opt friend void from_json(const nlohmann::json &j, ReadyEventData &m); }; struct MergedPresence { Snowflake UserID; std::optional LastModified; PresenceData Presence; friend void from_json(const nlohmann::json &j, MergedPresence &m); }; struct SupplementalMergedPresencesData { std::vector> Guilds; std::vector Friends; friend void from_json(const nlohmann::json &j, SupplementalMergedPresencesData &m); }; struct ReadySupplementalData { SupplementalMergedPresencesData MergedPresences; friend void from_json(const nlohmann::json &j, ReadySupplementalData &m); }; struct IdentifyProperties { std::string OS; std::string Browser; std::string Device; std::string BrowserUserAgent; std::string BrowserVersion; std::string OSVersion; std::string Referrer; std::string ReferringDomain; std::string ReferrerCurrent; std::string ReferringDomainCurrent; std::string ReleaseChannel; int ClientBuildNumber; std::string ClientEventSource; // empty -> null friend void to_json(nlohmann::json &j, const IdentifyProperties &m); }; struct ClientStateProperties { std::map GuildHashes; std::string HighestLastMessageID = "0"; int ReadStateVersion = 0; int UserGuildSettingsVersion = -1; friend void to_json(nlohmann::json &j, const ClientStateProperties &m); }; struct IdentifyMessage : GatewayMessage { std::string Token; IdentifyProperties Properties; PresenceData Presence; ClientStateProperties ClientState; bool DoesSupportCompression = false; int Capabilities; friend void to_json(nlohmann::json &j, const IdentifyMessage &m); }; struct HeartbeatMessage : GatewayMessage { int Sequence; friend void to_json(nlohmann::json &j, const HeartbeatMessage &m); }; struct CreateMessageObject { std::string Content; friend void to_json(nlohmann::json &j, const CreateMessageObject &m); }; struct MessageEditObject { std::string Content; // opt, null std::vector Embeds; // opt, null int Flags = -1; // opt, null friend void to_json(nlohmann::json &j, const MessageEditObject &m); }; struct GuildMemberUpdateMessage { Snowflake GuildID; // std::vector Roles; // UserData User; // std::string Nick; // opt, null std::string JoinedAt; std::string PremiumSince; // opt, null friend void from_json(const nlohmann::json &j, GuildMemberUpdateMessage &m); }; struct ClientStatusData { std::optional Desktop; std::optional Mobile; std::optional Web; friend void from_json(const nlohmann::json &j, ClientStatusData &m); }; struct PresenceUpdateMessage { nlohmann::json User; // the client updates an existing object from this data std::optional GuildID; std::string StatusMessage; std::vector Activities; ClientStatusData ClientStatus; friend void from_json(const nlohmann::json &j, PresenceUpdateMessage &m); }; struct CreateDMObject { std::vector Recipients; friend void to_json(nlohmann::json &j, const CreateDMObject &m); }; struct ResumeMessage : GatewayMessage { std::string Token; std::string SessionID; int Sequence; friend void to_json(nlohmann::json &j, const ResumeMessage &m); }; struct GuildRoleUpdateObject { Snowflake GuildID; RoleData Role; friend void from_json(const nlohmann::json &j, GuildRoleUpdateObject &m); }; struct GuildRoleCreateObject { Snowflake GuildID; RoleData Role; friend void from_json(const nlohmann::json &j, GuildRoleCreateObject &m); }; struct GuildRoleDeleteObject { Snowflake GuildID; Snowflake RoleID; friend void from_json(const nlohmann::json &j, GuildRoleDeleteObject &m); }; struct MessageReactionAddObject { Snowflake UserID; Snowflake ChannelID; Snowflake MessageID; std::optional GuildID; std::optional Member; EmojiData Emoji; friend void from_json(const nlohmann::json &j, MessageReactionAddObject &m); }; struct MessageReactionRemoveObject { Snowflake UserID; Snowflake ChannelID; Snowflake MessageID; std::optional GuildID; EmojiData Emoji; friend void from_json(const nlohmann::json &j, MessageReactionRemoveObject &m); }; struct ChannelRecipientAdd { UserData User; Snowflake ChannelID; friend void from_json(const nlohmann::json &j, ChannelRecipientAdd &m); }; struct ChannelRecipientRemove { UserData User; Snowflake ChannelID; friend void from_json(const nlohmann::json &j, ChannelRecipientRemove &m); }; struct TypingStartObject { Snowflake ChannelID; std::optional GuildID; Snowflake UserID; uint64_t Timestamp; std::optional Member; friend void from_json(const nlohmann::json &j, TypingStartObject &m); }; // implement rest as needed struct ModifyGuildObject { std::optional Name; std::optional IconData; friend void to_json(nlohmann::json &j, const ModifyGuildObject &m); }; struct GuildBanRemoveObject { Snowflake GuildID; UserData User; friend void from_json(const nlohmann::json &j, GuildBanRemoveObject &m); }; struct GuildBanAddObject { Snowflake GuildID; UserData User; friend void from_json(const nlohmann::json &j, GuildBanAddObject &m); }; struct InviteCreateObject { Snowflake ChannelID; std::string Code; std::string CreatedAt; std::optional GuildID; std::optional Inviter; int MaxAge; int MaxUses; UserData TargetUser; std::optional TargetUserType; bool IsTemporary; int Uses; friend void from_json(const nlohmann::json &j, InviteCreateObject &m); }; struct InviteDeleteObject { Snowflake ChannelID; std::optional GuildID; std::string Code; friend void from_json(const nlohmann::json &j, InviteDeleteObject &m); }; struct ConnectionData { std::string ID; std::string Type; std::string Name; bool IsVerified; friend void from_json(const nlohmann::json &j, ConnectionData &m); }; struct MutualGuildData { Snowflake ID; std::optional Nick; // null friend void from_json(const nlohmann::json &j, MutualGuildData &m); }; struct UserProfileData { std::vector ConnectedAccounts; std::vector MutualGuilds; std::optional PremiumGuildSince; // null std::optional PremiumSince; // null UserData User; friend void from_json(const nlohmann::json &j, UserProfileData &m); }; struct UserNoteObject { // idk if these can be null or missing but i play it safe std::optional Note; std::optional NoteUserID; std::optional UserID; friend void from_json(const nlohmann::json &j, UserNoteObject &m); }; struct UserSetNoteObject { std::string Note; friend void to_json(nlohmann::json &j, const UserSetNoteObject &m); }; struct UserNoteUpdateMessage { std::string Note; Snowflake ID; friend void from_json(const nlohmann::json &j, UserNoteUpdateMessage &m); }; struct RelationshipsData { std::vector Users; friend void from_json(const nlohmann::json &j, RelationshipsData &m); }; struct ModifyGuildMemberObject { // std::optional Nick; // std::optional IsMuted; // std::optional IsDeaf; // std::optional ChannelID; std::optional> Roles; friend void to_json(nlohmann::json &j, const ModifyGuildMemberObject &m); }; struct ModifyGuildRoleObject { std::optional Name; std::optional Permissions; std::optional Color; std::optional IsHoisted; std::optional Mentionable; friend void to_json(nlohmann::json &j, const ModifyGuildRoleObject &m); };