// Discordgo - Discord bindings for Go // Available at https://github.com/bwmarrin/discordgo // Copyright 2015-2016 Bruce Marriner . All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // This file contains all structures for the discordgo package. These // may be moved about later into separate files but I find it easier to have // them all located together. package discordgo import ( "encoding/json" "fmt" "net/http" "sync" "time" "github.com/gorilla/websocket" ) // A Session represents a connection to the Discord API. type Session struct { sync.RWMutex // General configurable settings. // Authentication token for this session Token string MFA bool // Debug for printing JSON request/responses Debug bool // Deprecated, will be removed. LogLevel int // Should the session reconnect the websocket on errors. ShouldReconnectOnError bool // Should the session request compressed websocket data. Compress bool // Sharding ShardID int ShardCount int // Should state tracking be enabled. // State tracking is the best way for getting the the users // active guilds and the members of the guilds. StateEnabled bool // Whether or not to call event handlers synchronously. // e.g false = launch event handlers in their own goroutines. SyncEvents bool // Exposed but should not be modified by User. // Whether the Data Websocket is ready DataReady bool // NOTE: Maye be deprecated soon // Max number of REST API retries MaxRestRetries int // Status stores the currect status of the websocket connection // this is being tested, may stay, may go away. status int32 // Whether the Voice Websocket is ready VoiceReady bool // NOTE: Deprecated. // Whether the UDP Connection is ready UDPReady bool // NOTE: Deprecated // Stores a mapping of guild id's to VoiceConnections VoiceConnections map[string]*VoiceConnection // Managed state object, updated internally with events when // StateEnabled is true. State *State // The http client used for REST requests Client *http.Client // Stores the last HeartbeatAck that was recieved (in UTC) LastHeartbeatAck time.Time // Stores the last Heartbeat sent (in UTC) LastHeartbeatSent time.Time // used to deal with rate limits Ratelimiter *RateLimiter // Event handlers handlersMu sync.RWMutex handlers map[string][]*eventHandlerInstance onceHandlers map[string][]*eventHandlerInstance // The websocket connection. wsConn *websocket.Conn // When nil, the session is not listening. listening chan interface{} // sequence tracks the current gateway api websocket sequence number sequence *int64 // stores sessions current Discord Gateway gateway string // stores session ID of current Gateway connection sessionID string // used to make sure gateway websocket writes do not happen concurrently wsMutex sync.Mutex } // UserConnection is a Connection returned from the UserConnections endpoint type UserConnection struct { ID string `json:"id"` Name string `json:"name"` Type string `json:"type"` Revoked bool `json:"revoked"` Integrations []*Integration `json:"integrations"` } // Integration stores integration information type Integration struct { ID string `json:"id"` Name string `json:"name"` Type string `json:"type"` Enabled bool `json:"enabled"` Syncing bool `json:"syncing"` RoleID string `json:"role_id"` ExpireBehavior int `json:"expire_behavior"` ExpireGracePeriod int `json:"expire_grace_period"` User *User `json:"user"` Account IntegrationAccount `json:"account"` SyncedAt Timestamp `json:"synced_at"` } // IntegrationAccount is integration account information // sent by the UserConnections endpoint type IntegrationAccount struct { ID string `json:"id"` Name string `json:"name"` } // A VoiceRegion stores data for a specific voice region server. type VoiceRegion struct { ID string `json:"id"` Name string `json:"name"` Hostname string `json:"sample_hostname"` Port int `json:"sample_port"` } // A VoiceICE stores data for voice ICE servers. type VoiceICE struct { TTL string `json:"ttl"` Servers []*ICEServer `json:"servers"` } // A ICEServer stores data for a specific voice ICE server. type ICEServer struct { URL string `json:"url"` Username string `json:"username"` Credential string `json:"credential"` } // A Invite stores all data related to a specific Discord Guild or Channel invite. type Invite struct { Guild *Guild `json:"guild"` Channel *Channel `json:"channel"` Inviter *User `json:"inviter"` Code string `json:"code"` CreatedAt Timestamp `json:"created_at"` MaxAge int `json:"max_age"` Uses int `json:"uses"` MaxUses int `json:"max_uses"` Revoked bool `json:"revoked"` Temporary bool `json:"temporary"` Unique bool `json:"unique"` // will only be filled when using InviteWithCounts ApproximatePresenceCount int `json:"approximate_presence_count"` ApproximateMemberCount int `json:"approximate_member_count"` } // ChannelType is the type of a Channel type ChannelType int // Block contains known ChannelType values const ( ChannelTypeGuildText ChannelType = iota ChannelTypeDM ChannelTypeGuildVoice ChannelTypeGroupDM ChannelTypeGuildCategory ) // A Channel holds all data related to an individual Discord channel. type Channel struct { // The ID of the channel. ID string `json:"id"` // The ID of the guild to which the channel belongs, if it is in a guild. // Else, this ID is empty (e.g. DM channels). GuildID string `json:"guild_id"` // The name of the channel. Name string `json:"name"` // The topic of the channel. Topic string `json:"topic"` // The type of the channel. Type ChannelType `json:"type"` // The ID of the last message sent in the channel. This is not // guaranteed to be an ID of a valid message. LastMessageID string `json:"last_message_id"` // Whether the channel is marked as NSFW. NSFW bool `json:"nsfw"` // Icon of the group DM channel. Icon string `json:"icon"` // The position of the channel, used for sorting in client. Position int `json:"position"` // The bitrate of the channel, if it is a voice channel. Bitrate int `json:"bitrate"` // The recipients of the channel. This is only populated in DM channels. Recipients []*User `json:"recipients"` // The messages in the channel. This is only present in state-cached channels, // and State.MaxMessageCount must be non-zero. Messages []*Message `json:"-"` // A list of permission overwrites present for the channel. PermissionOverwrites []*PermissionOverwrite `json:"permission_overwrites"` // The user limit of the voice channel. UserLimit int `json:"user_limit"` // The ID of the parent channel, if the channel is under a category ParentID string `json:"parent_id"` } // Mention returns a string which mentions the channel func (c *Channel) Mention() string { return fmt.Sprintf("<#%s>", c.ID) } // A ChannelEdit holds Channel Field data for a channel edit. type ChannelEdit struct { Name string `json:"name,omitempty"` Topic string `json:"topic,omitempty"` NSFW bool `json:"nsfw,omitempty"` Position int `json:"position"` Bitrate int `json:"bitrate,omitempty"` UserLimit int `json:"user_limit,omitempty"` PermissionOverwrites []*PermissionOverwrite `json:"permission_overwrites,omitempty"` ParentID string `json:"parent_id,omitempty"` RateLimitPerUser int `json:"rate_limit_per_user,omitempty"` } // A PermissionOverwrite holds permission overwrite data for a Channel type PermissionOverwrite struct { ID string `json:"id"` Type string `json:"type"` Deny int `json:"deny"` Allow int `json:"allow"` } // Emoji struct holds data related to Emoji's type Emoji struct { ID string `json:"id"` Name string `json:"name"` Roles []string `json:"roles"` Managed bool `json:"managed"` RequireColons bool `json:"require_colons"` Animated bool `json:"animated"` } // MessageFormat returns a correctly formatted Emoji for use in Message content and embeds func (e *Emoji) MessageFormat() string { if e.ID != "" && e.Name != "" { if e.Animated { return "" } return "<:" + e.APIName() + ">" } return e.APIName() } // APIName returns an correctly formatted API name for use in the MessageReactions endpoints. func (e *Emoji) APIName() string { if e.ID != "" && e.Name != "" { return e.Name + ":" + e.ID } if e.Name != "" { return e.Name } return e.ID } // VerificationLevel type definition type VerificationLevel int // Constants for VerificationLevel levels from 0 to 3 inclusive const ( VerificationLevelNone VerificationLevel = iota VerificationLevelLow VerificationLevelMedium VerificationLevelHigh ) // ExplicitContentFilterLevel type definition type ExplicitContentFilterLevel int // Constants for ExplicitContentFilterLevel levels from 0 to 2 inclusive const ( ExplicitContentFilterDisabled ExplicitContentFilterLevel = iota ExplicitContentFilterMembersWithoutRoles ExplicitContentFilterAllMembers ) // MfaLevel type definition type MfaLevel int // Constants for MfaLevel levels from 0 to 1 inclusive const ( MfaLevelNone MfaLevel = iota MfaLevelElevated ) // A Guild holds all data related to a specific Discord Guild. Guilds are also // sometimes referred to as Servers in the Discord client. type Guild struct { // The ID of the guild. ID string `json:"id"` // The name of the guild. (2–100 characters) Name string `json:"name"` // The hash of the guild's icon. Use Session.GuildIcon // to retrieve the icon itself. Icon string `json:"icon"` // The voice region of the guild. Region string `json:"region"` // The ID of the AFK voice channel. AfkChannelID string `json:"afk_channel_id"` // The ID of the embed channel ID, used for embed widgets. EmbedChannelID string `json:"embed_channel_id"` // The user ID of the owner of the guild. OwnerID string `json:"owner_id"` // The time at which the current user joined the guild. // This field is only present in GUILD_CREATE events and websocket // update events, and thus is only present in state-cached guilds. JoinedAt Timestamp `json:"joined_at"` // The hash of the guild's splash. Splash string `json:"splash"` // The timeout, in seconds, before a user is considered AFK in voice. AfkTimeout int `json:"afk_timeout"` // The number of members in the guild. // This field is only present in GUILD_CREATE events and websocket // update events, and thus is only present in state-cached guilds. MemberCount int `json:"member_count"` // The verification level required for the guild. VerificationLevel VerificationLevel `json:"verification_level"` // Whether the guild has embedding enabled. EmbedEnabled bool `json:"embed_enabled"` // Whether the guild is considered large. This is // determined by a member threshold in the identify packet, // and is currently hard-coded at 250 members in the library. Large bool `json:"large"` // The default message notification setting for the guild. // 0 == all messages, 1 == mentions only. DefaultMessageNotifications int `json:"default_message_notifications"` // A list of roles in the guild. Roles []*Role `json:"roles"` // A list of the custom emojis present in the guild. Emojis []*Emoji `json:"emojis"` // A list of the members in the guild. // This field is only present in GUILD_CREATE events and websocket // update events, and thus is only present in state-cached guilds. Members []*Member `json:"members"` // A list of partial presence objects for members in the guild. // This field is only present in GUILD_CREATE events and websocket // update events, and thus is only present in state-cached guilds. Presences []*Presence `json:"presences"` // A list of channels in the guild. // This field is only present in GUILD_CREATE events and websocket // update events, and thus is only present in state-cached guilds. Channels []*Channel `json:"channels"` // A list of voice states for the guild. // This field is only present in GUILD_CREATE events and websocket // update events, and thus is only present in state-cached guilds. VoiceStates []*VoiceState `json:"voice_states"` // Whether this guild is currently unavailable (most likely due to outage). // This field is only present in GUILD_CREATE events and websocket // update events, and thus is only present in state-cached guilds. Unavailable bool `json:"unavailable"` // The explicit content filter level ExplicitContentFilter ExplicitContentFilterLevel `json:"explicit_content_filter"` // The list of enabled guild features Features []string `json:"features"` // Required MFA level for the guild MfaLevel MfaLevel `json:"mfa_level"` // Whether or not the Server Widget is enabled WidgetEnabled bool `json:"widget_enabled"` // The Channel ID for the Server Widget WidgetChannelID string `json:"widget_channel_id"` // The Channel ID to which system messages are sent (eg join and leave messages) SystemChannelID string `json:"system_channel_id"` } // A UserGuild holds a brief version of a Guild type UserGuild struct { ID string `json:"id"` Name string `json:"name"` Icon string `json:"icon"` Owner bool `json:"owner"` Permissions int `json:"permissions"` } // A GuildParams stores all the data needed to update discord guild settings type GuildParams struct { Name string `json:"name,omitempty"` Region string `json:"region,omitempty"` VerificationLevel *VerificationLevel `json:"verification_level,omitempty"` DefaultMessageNotifications int `json:"default_message_notifications,omitempty"` // TODO: Separate type? AfkChannelID string `json:"afk_channel_id,omitempty"` AfkTimeout int `json:"afk_timeout,omitempty"` Icon string `json:"icon,omitempty"` OwnerID string `json:"owner_id,omitempty"` Splash string `json:"splash,omitempty"` } // A Role stores information about Discord guild member roles. type Role struct { // The ID of the role. ID string `json:"id"` // The name of the role. Name string `json:"name"` // Whether this role is managed by an integration, and // thus cannot be manually added to, or taken from, members. Managed bool `json:"managed"` // Whether this role is mentionable. Mentionable bool `json:"mentionable"` // Whether this role is hoisted (shows up separately in member list). Hoist bool `json:"hoist"` // The hex color of this role. Color int `json:"color"` // The position of this role in the guild's role hierarchy. Position int `json:"position"` // The permissions of the role on the guild (doesn't include channel overrides). // This is a combination of bit masks; the presence of a certain permission can // be checked by performing a bitwise AND between this int and the permission. Permissions int `json:"permissions"` } // Mention returns a string which mentions the role func (r *Role) Mention() string { return fmt.Sprintf("<@&%s>", r.ID) } // Roles are a collection of Role type Roles []*Role func (r Roles) Len() int { return len(r) } func (r Roles) Less(i, j int) bool { return r[i].Position > r[j].Position } func (r Roles) Swap(i, j int) { r[i], r[j] = r[j], r[i] } // A VoiceState stores the voice states of Guilds type VoiceState struct { UserID string `json:"user_id"` SessionID string `json:"session_id"` ChannelID string `json:"channel_id"` GuildID string `json:"guild_id"` Suppress bool `json:"suppress"` SelfMute bool `json:"self_mute"` SelfDeaf bool `json:"self_deaf"` Mute bool `json:"mute"` Deaf bool `json:"deaf"` } // A Presence stores the online, offline, or idle and game status of Guild members. type Presence struct { User *User `json:"user"` Status Status `json:"status"` Game *Game `json:"game"` Nick string `json:"nick"` Roles []string `json:"roles"` Since *int `json:"since"` } // GameType is the type of "game" (see GameType* consts) in the Game struct type GameType int // Valid GameType values const ( GameTypeGame GameType = iota GameTypeStreaming GameTypeListening GameTypeWatching ) // A Game struct holds the name of the "playing .." game for a user type Game struct { Name string `json:"name"` Type GameType `json:"type"` URL string `json:"url,omitempty"` Details string `json:"details,omitempty"` State string `json:"state,omitempty"` TimeStamps TimeStamps `json:"timestamps,omitempty"` Assets Assets `json:"assets,omitempty"` ApplicationID string `json:"application_id,omitempty"` Instance int8 `json:"instance,omitempty"` // TODO: Party and Secrets (unknown structure) } // A TimeStamps struct contains start and end times used in the rich presence "playing .." Game type TimeStamps struct { EndTimestamp int64 `json:"end,omitempty"` StartTimestamp int64 `json:"start,omitempty"` } // UnmarshalJSON unmarshals JSON into TimeStamps struct func (t *TimeStamps) UnmarshalJSON(b []byte) error { temp := struct { End float64 `json:"end,omitempty"` Start float64 `json:"start,omitempty"` }{} err := json.Unmarshal(b, &temp) if err != nil { return err } t.EndTimestamp = int64(temp.End) t.StartTimestamp = int64(temp.Start) return nil } // An Assets struct contains assets and labels used in the rich presence "playing .." Game type Assets struct { LargeImageID string `json:"large_image,omitempty"` SmallImageID string `json:"small_image,omitempty"` LargeText string `json:"large_text,omitempty"` SmallText string `json:"small_text,omitempty"` } // A Member stores user information for Guild members. A guild // member represents a certain user's presence in a guild. type Member struct { // The guild ID on which the member exists. GuildID string `json:"guild_id"` // The time at which the member joined the guild, in ISO8601. JoinedAt Timestamp `json:"joined_at"` // The nickname of the member, if they have one. Nick string `json:"nick"` // Whether the member is deafened at a guild level. Deaf bool `json:"deaf"` // Whether the member is muted at a guild level. Mute bool `json:"mute"` // The underlying user on which the member is based. User *User `json:"user"` // A list of IDs of the roles which are possessed by the member. Roles []string `json:"roles"` } // Mention creates a member mention func (m *Member) Mention() string { return "<@!" + m.User.ID + ">" } // A Settings stores data for a specific users Discord client settings. type Settings struct { RenderEmbeds bool `json:"render_embeds"` InlineEmbedMedia bool `json:"inline_embed_media"` InlineAttachmentMedia bool `json:"inline_attachment_media"` EnableTtsCommand bool `json:"enable_tts_command"` MessageDisplayCompact bool `json:"message_display_compact"` ShowCurrentGame bool `json:"show_current_game"` ConvertEmoticons bool `json:"convert_emoticons"` Locale string `json:"locale"` Theme string `json:"theme"` GuildPositions []string `json:"guild_positions"` RestrictedGuilds []string `json:"restricted_guilds"` FriendSourceFlags *FriendSourceFlags `json:"friend_source_flags"` Status Status `json:"status"` DetectPlatformAccounts bool `json:"detect_platform_accounts"` DeveloperMode bool `json:"developer_mode"` } // Status type definition type Status string // Constants for Status with the different current available status const ( StatusOnline Status = "online" StatusIdle Status = "idle" StatusDoNotDisturb Status = "dnd" StatusInvisible Status = "invisible" StatusOffline Status = "offline" ) // FriendSourceFlags stores ... TODO :) type FriendSourceFlags struct { All bool `json:"all"` MutualGuilds bool `json:"mutual_guilds"` MutualFriends bool `json:"mutual_friends"` } // A Relationship between the logged in user and Relationship.User type Relationship struct { User *User `json:"user"` Type int `json:"type"` // 1 = friend, 2 = blocked, 3 = incoming friend req, 4 = sent friend req ID string `json:"id"` } // A TooManyRequests struct holds information received from Discord // when receiving a HTTP 429 response. type TooManyRequests struct { Bucket string `json:"bucket"` Message string `json:"message"` RetryAfter time.Duration `json:"retry_after"` } // A ReadState stores data on the read state of channels. type ReadState struct { MentionCount int `json:"mention_count"` LastMessageID string `json:"last_message_id"` ID string `json:"id"` } // An Ack is used to ack messages type Ack struct { Token string `json:"token"` } // A GuildRole stores data for guild roles. type GuildRole struct { Role *Role `json:"role"` GuildID string `json:"guild_id"` } // A GuildBan stores data for a guild ban. type GuildBan struct { Reason string `json:"reason"` User *User `json:"user"` } // A GuildEmbed stores data for a guild embed. type GuildEmbed struct { Enabled bool `json:"enabled"` ChannelID string `json:"channel_id"` } // A GuildAuditLog stores data for a guild audit log. type GuildAuditLog struct { Webhooks []struct { ChannelID string `json:"channel_id"` GuildID string `json:"guild_id"` ID string `json:"id"` Avatar string `json:"avatar"` Name string `json:"name"` } `json:"webhooks,omitempty"` Users []struct { Username string `json:"username"` Discriminator string `json:"discriminator"` Bot bool `json:"bot"` ID string `json:"id"` Avatar string `json:"avatar"` } `json:"users,omitempty"` AuditLogEntries []struct { TargetID string `json:"target_id"` Changes []struct { NewValue interface{} `json:"new_value"` OldValue interface{} `json:"old_value"` Key string `json:"key"` } `json:"changes,omitempty"` UserID string `json:"user_id"` ID string `json:"id"` ActionType int `json:"action_type"` Options struct { DeleteMembersDay string `json:"delete_member_days"` MembersRemoved string `json:"members_removed"` ChannelID string `json:"channel_id"` Count string `json:"count"` ID string `json:"id"` Type string `json:"type"` RoleName string `json:"role_name"` } `json:"options,omitempty"` Reason string `json:"reason"` } `json:"audit_log_entries"` } // Block contains Discord Audit Log Action Types const ( AuditLogActionGuildUpdate = 1 AuditLogActionChannelCreate = 10 AuditLogActionChannelUpdate = 11 AuditLogActionChannelDelete = 12 AuditLogActionChannelOverwriteCreate = 13 AuditLogActionChannelOverwriteUpdate = 14 AuditLogActionChannelOverwriteDelete = 15 AuditLogActionMemberKick = 20 AuditLogActionMemberPrune = 21 AuditLogActionMemberBanAdd = 22 AuditLogActionMemberBanRemove = 23 AuditLogActionMemberUpdate = 24 AuditLogActionMemberRoleUpdate = 25 AuditLogActionRoleCreate = 30 AuditLogActionRoleUpdate = 31 AuditLogActionRoleDelete = 32 AuditLogActionInviteCreate = 40 AuditLogActionInviteUpdate = 41 AuditLogActionInviteDelete = 42 AuditLogActionWebhookCreate = 50 AuditLogActionWebhookUpdate = 51 AuditLogActionWebhookDelete = 52 AuditLogActionEmojiCreate = 60 AuditLogActionEmojiUpdate = 61 AuditLogActionEmojiDelete = 62 AuditLogActionMessageDelete = 72 ) // A UserGuildSettingsChannelOverride stores data for a channel override for a users guild settings. type UserGuildSettingsChannelOverride struct { Muted bool `json:"muted"` MessageNotifications int `json:"message_notifications"` ChannelID string `json:"channel_id"` } // A UserGuildSettings stores data for a users guild settings. type UserGuildSettings struct { SupressEveryone bool `json:"suppress_everyone"` Muted bool `json:"muted"` MobilePush bool `json:"mobile_push"` MessageNotifications int `json:"message_notifications"` GuildID string `json:"guild_id"` ChannelOverrides []*UserGuildSettingsChannelOverride `json:"channel_overrides"` } // A UserGuildSettingsEdit stores data for editing UserGuildSettings type UserGuildSettingsEdit struct { SupressEveryone bool `json:"suppress_everyone"` Muted bool `json:"muted"` MobilePush bool `json:"mobile_push"` MessageNotifications int `json:"message_notifications"` ChannelOverrides map[string]*UserGuildSettingsChannelOverride `json:"channel_overrides"` } // An APIErrorMessage is an api error message returned from discord type APIErrorMessage struct { Code int `json:"code"` Message string `json:"message"` } // Webhook stores the data for a webhook. type Webhook struct { ID string `json:"id"` GuildID string `json:"guild_id"` ChannelID string `json:"channel_id"` User *User `json:"user"` Name string `json:"name"` Avatar string `json:"avatar"` Token string `json:"token"` } // WebhookParams is a struct for webhook params, used in the WebhookExecute command. type WebhookParams struct { Content string `json:"content,omitempty"` Username string `json:"username,omitempty"` AvatarURL string `json:"avatar_url,omitempty"` TTS bool `json:"tts,omitempty"` File *File `json:"-"` Embeds []*MessageEmbed `json:"embeds,omitempty"` } // MessageReaction stores the data for a message reaction. type MessageReaction struct { UserID string `json:"user_id"` MessageID string `json:"message_id"` Emoji Emoji `json:"emoji"` ChannelID string `json:"channel_id"` GuildID string `json:"guild_id,omitempty"` } // GatewayBotResponse stores the data for the gateway/bot response type GatewayBotResponse struct { URL string `json:"url"` Shards int `json:"shards"` } // Constants for the different bit offsets of text channel permissions const ( PermissionReadMessages = 1 << (iota + 10) PermissionSendMessages PermissionSendTTSMessages PermissionManageMessages PermissionEmbedLinks PermissionAttachFiles PermissionReadMessageHistory PermissionMentionEveryone PermissionUseExternalEmojis ) // Constants for the different bit offsets of voice permissions const ( PermissionVoiceConnect = 1 << (iota + 20) PermissionVoiceSpeak PermissionVoiceMuteMembers PermissionVoiceDeafenMembers PermissionVoiceMoveMembers PermissionVoiceUseVAD ) // Constants for general management. const ( PermissionChangeNickname = 1 << (iota + 26) PermissionManageNicknames PermissionManageRoles PermissionManageWebhooks PermissionManageEmojis ) // Constants for the different bit offsets of general permissions const ( PermissionCreateInstantInvite = 1 << iota PermissionKickMembers PermissionBanMembers PermissionAdministrator PermissionManageChannels PermissionManageServer PermissionAddReactions PermissionViewAuditLogs PermissionAllText = PermissionReadMessages | PermissionSendMessages | PermissionSendTTSMessages | PermissionManageMessages | PermissionEmbedLinks | PermissionAttachFiles | PermissionReadMessageHistory | PermissionMentionEveryone PermissionAllVoice = PermissionVoiceConnect | PermissionVoiceSpeak | PermissionVoiceMuteMembers | PermissionVoiceDeafenMembers | PermissionVoiceMoveMembers | PermissionVoiceUseVAD PermissionAllChannel = PermissionAllText | PermissionAllVoice | PermissionCreateInstantInvite | PermissionManageRoles | PermissionManageChannels | PermissionAddReactions | PermissionViewAuditLogs PermissionAll = PermissionAllChannel | PermissionKickMembers | PermissionBanMembers | PermissionManageServer | PermissionAdministrator | PermissionManageWebhooks | PermissionManageEmojis ) // Block contains Discord JSON Error Response codes const ( ErrCodeUnknownAccount = 10001 ErrCodeUnknownApplication = 10002 ErrCodeUnknownChannel = 10003 ErrCodeUnknownGuild = 10004 ErrCodeUnknownIntegration = 10005 ErrCodeUnknownInvite = 10006 ErrCodeUnknownMember = 10007 ErrCodeUnknownMessage = 10008 ErrCodeUnknownOverwrite = 10009 ErrCodeUnknownProvider = 10010 ErrCodeUnknownRole = 10011 ErrCodeUnknownToken = 10012 ErrCodeUnknownUser = 10013 ErrCodeUnknownEmoji = 10014 ErrCodeUnknownWebhook = 10015 ErrCodeBotsCannotUseEndpoint = 20001 ErrCodeOnlyBotsCanUseEndpoint = 20002 ErrCodeMaximumGuildsReached = 30001 ErrCodeMaximumFriendsReached = 30002 ErrCodeMaximumPinsReached = 30003 ErrCodeMaximumGuildRolesReached = 30005 ErrCodeTooManyReactions = 30010 ErrCodeUnauthorized = 40001 ErrCodeMissingAccess = 50001 ErrCodeInvalidAccountType = 50002 ErrCodeCannotExecuteActionOnDMChannel = 50003 ErrCodeEmbedCisabled = 50004 ErrCodeCannotEditFromAnotherUser = 50005 ErrCodeCannotSendEmptyMessage = 50006 ErrCodeCannotSendMessagesToThisUser = 50007 ErrCodeCannotSendMessagesInVoiceChannel = 50008 ErrCodeChannelVerificationLevelTooHigh = 50009 ErrCodeOAuth2ApplicationDoesNotHaveBot = 50010 ErrCodeOAuth2ApplicationLimitReached = 50011 ErrCodeInvalidOAuthState = 50012 ErrCodeMissingPermissions = 50013 ErrCodeInvalidAuthenticationToken = 50014 ErrCodeNoteTooLong = 50015 ErrCodeTooFewOrTooManyMessagesToDelete = 50016 ErrCodeCanOnlyPinMessageToOriginatingChannel = 50019 ErrCodeCannotExecuteActionOnSystemMessage = 50021 ErrCodeMessageProvidedTooOldForBulkDelete = 50034 ErrCodeInvalidFormBody = 50035 ErrCodeInviteAcceptedToGuildApplicationsBotNotIn = 50036 ErrCodeReactionBlocked = 90001 )