You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
matterbridge/vendor/github.com/bwmarrin/discordgo/structs.go

2423 lines
101 KiB
Go

// Discordgo - Discord bindings for Go
// Available at https://github.com/bwmarrin/discordgo
// Copyright 2015-2016 Bruce Marriner <bruce@sqls.net>. 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"
"math"
"net/http"
"regexp"
"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
// TODO: Remove Below, Deprecated, Use Identify struct
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 retry requests when rate limited.
ShouldRetryOnRateLimit bool
// Identify is sent during initial handshake with the discord gateway.
// https://discord.com/developers/docs/topics/gateway#identify
Identify Identify
// TODO: Remove Below, Deprecated, Use Identify struct
// 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 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 current 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
// The dialer used for WebSocket connection
Dialer *websocket.Dialer
// The user agent used for REST APIs
UserAgent string
// Stores the last HeartbeatAck that was received (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
}
// Application stores values for a Discord Application
type Application struct {
ID string `json:"id,omitempty"`
Name string `json:"name"`
Icon string `json:"icon,omitempty"`
Description string `json:"description,omitempty"`
RPCOrigins []string `json:"rpc_origins,omitempty"`
BotPublic bool `json:"bot_public,omitempty"`
BotRequireCodeGrant bool `json:"bot_require_code_grant,omitempty"`
TermsOfServiceURL string `json:"terms_of_service_url"`
PrivacyProxyURL string `json:"privacy_policy_url"`
Owner *User `json:"owner"`
Summary string `json:"summary"`
VerifyKey string `json:"verify_key"`
Team *Team `json:"team"`
GuildID string `json:"guild_id"`
PrimarySKUID string `json:"primary_sku_id"`
Slug string `json:"slug"`
CoverImage string `json:"cover_image"`
Flags int `json:"flags,omitempty"`
}
// ApplicationRoleConnectionMetadataType represents the type of application role connection metadata.
type ApplicationRoleConnectionMetadataType int
// Application role connection metadata types.
const (
ApplicationRoleConnectionMetadataIntegerLessThanOrEqual ApplicationRoleConnectionMetadataType = 1
ApplicationRoleConnectionMetadataIntegerGreaterThanOrEqual ApplicationRoleConnectionMetadataType = 2
ApplicationRoleConnectionMetadataIntegerEqual ApplicationRoleConnectionMetadataType = 3
ApplicationRoleConnectionMetadataIntegerNotEqual ApplicationRoleConnectionMetadataType = 4
ApplicationRoleConnectionMetadataDatetimeLessThanOrEqual ApplicationRoleConnectionMetadataType = 5
ApplicationRoleConnectionMetadataDatetimeGreaterThanOrEqual ApplicationRoleConnectionMetadataType = 6
ApplicationRoleConnectionMetadataBooleanEqual ApplicationRoleConnectionMetadataType = 7
ApplicationRoleConnectionMetadataBooleanNotEqual ApplicationRoleConnectionMetadataType = 8
)
// ApplicationRoleConnectionMetadata stores application role connection metadata.
type ApplicationRoleConnectionMetadata struct {
Type ApplicationRoleConnectionMetadataType `json:"type"`
Key string `json:"key"`
Name string `json:"name"`
NameLocalizations map[Locale]string `json:"name_localizations"`
Description string `json:"description"`
DescriptionLocalizations map[Locale]string `json:"description_localizations"`
}
// ApplicationRoleConnection represents the role connection that an application has attached to a user.
type ApplicationRoleConnection struct {
PlatformName string `json:"platform_name"`
PlatformUsername string `json:"platform_username"`
Metadata map[string]string `json:"metadata"`
}
// 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"`
EnableEmoticons bool `json:"enable_emoticons"`
ExpireBehavior ExpireBehavior `json:"expire_behavior"`
ExpireGracePeriod int `json:"expire_grace_period"`
User *User `json:"user"`
Account IntegrationAccount `json:"account"`
SyncedAt time.Time `json:"synced_at"`
}
// ExpireBehavior of Integration
// https://discord.com/developers/docs/resources/guild#integration-object-integration-expire-behaviors
type ExpireBehavior int
// Block of valid ExpireBehaviors
const (
ExpireBehaviorRemoveRole ExpireBehavior = 0
ExpireBehaviorKick ExpireBehavior = 1
)
// 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"`
}
// InviteTargetType indicates the type of target of an invite
// https://discord.com/developers/docs/resources/invite#invite-object-invite-target-types
type InviteTargetType uint8
// Invite target types
const (
InviteTargetStream InviteTargetType = 1
InviteTargetEmbeddedApplication InviteTargetType = 2
)
// 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 time.Time `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"`
TargetUser *User `json:"target_user"`
TargetType InviteTargetType `json:"target_type"`
TargetApplication *Application `json:"target_application"`
// will only be filled when using InviteWithCounts
ApproximatePresenceCount int `json:"approximate_presence_count"`
ApproximateMemberCount int `json:"approximate_member_count"`
ExpiresAt *time.Time `json:"expires_at"`
}
// ChannelType is the type of a Channel
type ChannelType int
// Block contains known ChannelType values
const (
ChannelTypeGuildText ChannelType = 0
ChannelTypeDM ChannelType = 1
ChannelTypeGuildVoice ChannelType = 2
ChannelTypeGroupDM ChannelType = 3
ChannelTypeGuildCategory ChannelType = 4
ChannelTypeGuildNews ChannelType = 5
ChannelTypeGuildStore ChannelType = 6
ChannelTypeGuildNewsThread ChannelType = 10
ChannelTypeGuildPublicThread ChannelType = 11
ChannelTypeGuildPrivateThread ChannelType = 12
ChannelTypeGuildStageVoice ChannelType = 13
ChannelTypeGuildForum ChannelType = 15
)
// ChannelFlags represent flags of a channel/thread.
type ChannelFlags int
// Block containing known ChannelFlags values.
const (
// ChannelFlagPinned indicates whether the thread is pinned in the forum channel.
// NOTE: forum threads only.
ChannelFlagPinned ChannelFlags = 1 << 1
// ChannelFlagRequireTag indicates whether a tag is required to be specified when creating a thread.
// NOTE: forum channels only.
ChannelFlagRequireTag ChannelFlags = 1 << 4
)
// ForumSortOrderType represents sort order of a forum channel.
type ForumSortOrderType int
const (
// ForumSortOrderLatestActivity sorts posts by activity.
ForumSortOrderLatestActivity ForumSortOrderType = 0
// ForumSortOrderCreationDate sorts posts by creation time (from most recent to oldest).
ForumSortOrderCreationDate ForumSortOrderType = 1
)
// ForumLayout represents layout of a forum channel.
type ForumLayout int
const (
// ForumLayoutNotSet represents no default layout.
ForumLayoutNotSet ForumLayout = 0
// ForumLayoutListView displays forum posts as a list.
ForumLayoutListView ForumLayout = 1
// ForumLayoutGalleryView displays forum posts as a collection of tiles.
ForumLayoutGalleryView ForumLayout = 2
)
// 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"`
// The timestamp of the last pinned message in the channel.
// nil if the channel has no pinned messages.
LastPinTimestamp *time.Time `json:"last_pin_timestamp"`
// An approximate count of messages in a thread, stops counting at 50
MessageCount int `json:"message_count"`
// An approximate count of users in a thread, stops counting at 50
MemberCount int `json:"member_count"`
// 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. For threads - id of the channel thread was created in.
ParentID string `json:"parent_id"`
// Amount of seconds a user has to wait before sending another message or creating another thread (0-21600)
// bots, as well as users with the permission manage_messages or manage_channel, are unaffected
RateLimitPerUser int `json:"rate_limit_per_user"`
// ID of the creator of the group DM or thread
OwnerID string `json:"owner_id"`
// ApplicationID of the DM creator Zeroed if guild channel or not a bot user
ApplicationID string `json:"application_id"`
// Thread-specific fields not needed by other channels
ThreadMetadata *ThreadMetadata `json:"thread_metadata,omitempty"`
// Thread member object for the current user, if they have joined the thread, only included on certain API endpoints
Member *ThreadMember `json:"thread_member"`
// All thread members. State channels only.
Members []*ThreadMember `json:"-"`
// Channel flags.
Flags ChannelFlags `json:"flags"`
// The set of tags that can be used in a forum channel.
AvailableTags []ForumTag `json:"available_tags"`
// The IDs of the set of tags that have been applied to a thread in a forum channel.
AppliedTags []string `json:"applied_tags"`
// Emoji to use as the default reaction to a forum post.
DefaultReactionEmoji ForumDefaultReaction `json:"default_reaction_emoji"`
// The initial RateLimitPerUser to set on newly created threads in a channel.
// This field is copied to the thread at creation time and does not live update.
DefaultThreadRateLimitPerUser int `json:"default_thread_rate_limit_per_user"`
// The default sort order type used to order posts in forum channels.
// Defaults to null, which indicates a preferred sort order hasn't been set by a channel admin.
DefaultSortOrder *ForumSortOrderType `json:"default_sort_order"`
// The default forum layout view used to display posts in forum channels.
// Defaults to ForumLayoutNotSet, which indicates a layout view has not been set by a channel admin.
DefaultForumLayout ForumLayout `json:"default_forum_layout"`
}
// Mention returns a string which mentions the channel
func (c *Channel) Mention() string {
return fmt.Sprintf("<#%s>", c.ID)
}
// IsThread is a helper function to determine if channel is a thread or not
func (c *Channel) IsThread() bool {
return c.Type == ChannelTypeGuildPublicThread || c.Type == ChannelTypeGuildPrivateThread || c.Type == ChannelTypeGuildNewsThread
}
// 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"`
Flags *ChannelFlags `json:"flags,omitempty"`
DefaultThreadRateLimitPerUser *int `json:"default_thread_rate_limit_per_user,omitempty"`
// NOTE: threads only
Archived *bool `json:"archived,omitempty"`
AutoArchiveDuration int `json:"auto_archive_duration,omitempty"`
Locked *bool `json:"locked,omitempty"`
Invitable *bool `json:"invitable,omitempty"`
// NOTE: forum channels only
AvailableTags *[]ForumTag `json:"available_tags,omitempty"`
DefaultReactionEmoji *ForumDefaultReaction `json:"default_reaction_emoji,omitempty"`
DefaultSortOrder *ForumSortOrderType `json:"default_sort_order,omitempty"` // TODO: null
DefaultForumLayout *ForumLayout `json:"default_forum_layout,omitempty"`
// NOTE: forum threads only
AppliedTags *[]string `json:"applied_tags,omitempty"`
}
// A ChannelFollow holds data returned after following a news channel
type ChannelFollow struct {
ChannelID string `json:"channel_id"`
WebhookID string `json:"webhook_id"`
}
// PermissionOverwriteType represents the type of resource on which
// a permission overwrite acts.
type PermissionOverwriteType int
// The possible permission overwrite types.
const (
PermissionOverwriteTypeRole PermissionOverwriteType = 0
PermissionOverwriteTypeMember PermissionOverwriteType = 1
)
// A PermissionOverwrite holds permission overwrite data for a Channel
type PermissionOverwrite struct {
ID string `json:"id"`
Type PermissionOverwriteType `json:"type"`
Deny int64 `json:"deny,string"`
Allow int64 `json:"allow,string"`
}
// ThreadStart stores all parameters you can use with MessageThreadStartComplex or ThreadStartComplex
type ThreadStart struct {
Name string `json:"name"`
AutoArchiveDuration int `json:"auto_archive_duration,omitempty"`
Type ChannelType `json:"type,omitempty"`
Invitable bool `json:"invitable"`
RateLimitPerUser int `json:"rate_limit_per_user,omitempty"`
// NOTE: forum threads only
AppliedTags []string `json:"applied_tags,omitempty"`
}
// ThreadMetadata contains a number of thread-specific channel fields that are not needed by other channel types.
type ThreadMetadata struct {
// Whether the thread is archived
Archived bool `json:"archived"`
// Duration in minutes to automatically archive the thread after recent activity, can be set to: 60, 1440, 4320, 10080
AutoArchiveDuration int `json:"auto_archive_duration"`
// Timestamp when the thread's archive status was last changed, used for calculating recent activity
ArchiveTimestamp time.Time `json:"archive_timestamp"`
// Whether the thread is locked; when a thread is locked, only users with MANAGE_THREADS can unarchive it
Locked bool `json:"locked"`
// Whether non-moderators can add other non-moderators to a thread; only available on private threads
Invitable bool `json:"invitable"`
}
// ThreadMember is used to indicate whether a user has joined a thread or not.
// NOTE: ID and UserID are empty (omitted) on the member sent within each thread in the GUILD_CREATE event.
type ThreadMember struct {
// The id of the thread
ID string `json:"id,omitempty"`
// The id of the user
UserID string `json:"user_id,omitempty"`
// The time the current user last joined the thread
JoinTimestamp time.Time `json:"join_timestamp"`
// Any user-thread settings, currently only used for notifications
Flags int `json:"flags"`
}
// ThreadsList represents a list of threads alongisde with thread member objects for the current user.
type ThreadsList struct {
Threads []*Channel `json:"threads"`
Members []*ThreadMember `json:"members"`
HasMore bool `json:"has_more"`
}
// AddedThreadMember holds information about the user who was added to the thread
type AddedThreadMember struct {
*ThreadMember
Member *Member `json:"member"`
Presence *Presence `json:"presence"`
}
// ForumDefaultReaction specifies emoji to use as the default reaction to a forum post.
// NOTE: Exactly one of EmojiID and EmojiName must be set.
type ForumDefaultReaction struct {
// The id of a guild's custom emoji.
EmojiID string `json:"emoji_id,omitempty"`
// The unicode character of the emoji.
EmojiName string `json:"emoji_name,omitempty"`
}
// ForumTag represents a tag that is able to be applied to a thread in a forum channel.
type ForumTag struct {
ID string `json:"id,omitempty"`
Name string `json:"name"`
Moderated bool `json:"moderated"`
EmojiID string `json:"emoji_id,omitempty"`
EmojiName string `json:"emoji_name,omitempty"`
}
// Emoji struct holds data related to Emoji's
type Emoji struct {
ID string `json:"id"`
Name string `json:"name"`
Roles []string `json:"roles"`
User *User `json:"user"`
RequireColons bool `json:"require_colons"`
Managed bool `json:"managed"`
Animated bool `json:"animated"`
Available bool `json:"available"`
}
// EmojiRegex is the regex used to find and identify emojis in messages
var (
EmojiRegex = regexp.MustCompile(`<(a|):[A-z0-9_~]+:[0-9]{18,20}>`)
)
// 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 "<a:" + e.APIName() + ">"
}
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
}
// EmojiParams represents parameters needed to create or update an Emoji.
type EmojiParams struct {
// Name of the emoji
Name string `json:"name,omitempty"`
// A base64 encoded emoji image, has to be smaller than 256KB.
// NOTE: can be only set on creation.
Image string `json:"image,omitempty"`
// Roles for which this emoji will be available.
Roles []string `json:"roles,omitempty"`
}
// StickerFormat is the file format of the Sticker.
type StickerFormat int
// Defines all known Sticker types.
const (
StickerFormatTypePNG StickerFormat = 1
StickerFormatTypeAPNG StickerFormat = 2
StickerFormatTypeLottie StickerFormat = 3
StickerFormatTypeGIF StickerFormat = 4
)
// StickerType is the type of sticker.
type StickerType int
// Defines Sticker types.
const (
StickerTypeStandard StickerType = 1
StickerTypeGuild StickerType = 2
)
// Sticker represents a sticker object that can be sent in a Message.
type Sticker struct {
ID string `json:"id"`
PackID string `json:"pack_id"`
Name string `json:"name"`
Description string `json:"description"`
Tags string `json:"tags"`
Type StickerType `json:"type"`
FormatType StickerFormat `json:"format_type"`
Available bool `json:"available"`
GuildID string `json:"guild_id"`
User *User `json:"user"`
SortValue int `json:"sort_value"`
}
// StickerPack represents a pack of standard stickers.
type StickerPack struct {
ID string `json:"id"`
Stickers []*Sticker `json:"stickers"`
Name string `json:"name"`
SKUID string `json:"sku_id"`
CoverStickerID string `json:"cover_sticker_id"`
Description string `json:"description"`
BannerAssetID string `json:"banner_asset_id"`
}
// VerificationLevel type definition
type VerificationLevel int
// Constants for VerificationLevel levels from 0 to 4 inclusive
const (
VerificationLevelNone VerificationLevel = 0
VerificationLevelLow VerificationLevel = 1
VerificationLevelMedium VerificationLevel = 2
VerificationLevelHigh VerificationLevel = 3
VerificationLevelVeryHigh VerificationLevel = 4
)
// ExplicitContentFilterLevel type definition
type ExplicitContentFilterLevel int
// Constants for ExplicitContentFilterLevel levels from 0 to 2 inclusive
const (
ExplicitContentFilterDisabled ExplicitContentFilterLevel = 0
ExplicitContentFilterMembersWithoutRoles ExplicitContentFilterLevel = 1
ExplicitContentFilterAllMembers ExplicitContentFilterLevel = 2
)
// GuildNSFWLevel type definition
type GuildNSFWLevel int
// Constants for GuildNSFWLevel levels from 0 to 3 inclusive
const (
GuildNSFWLevelDefault GuildNSFWLevel = 0
GuildNSFWLevelExplicit GuildNSFWLevel = 1
GuildNSFWLevelSafe GuildNSFWLevel = 2
GuildNSFWLevelAgeRestricted GuildNSFWLevel = 3
)
// MfaLevel type definition
type MfaLevel int
// Constants for MfaLevel levels from 0 to 1 inclusive
const (
MfaLevelNone MfaLevel = 0
MfaLevelElevated MfaLevel = 1
)
// PremiumTier type definition
type PremiumTier int
// Constants for PremiumTier levels from 0 to 3 inclusive
const (
PremiumTierNone PremiumTier = 0
PremiumTier1 PremiumTier = 1
PremiumTier2 PremiumTier = 2
PremiumTier3 PremiumTier = 3
)
// 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. (2100 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 user ID of the owner of the guild.
OwnerID string `json:"owner_id"`
// If we are the owner of the guild
Owner bool `json:"owner"`
// 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 time.Time `json:"joined_at"`
// The hash of the guild's discovery splash.
DiscoverySplash string `json:"discovery_splash"`
// 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 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.
DefaultMessageNotifications MessageNotifications `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 custom stickers present in the guild.
Stickers []*Sticker `json:"stickers"`
// 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"`
// The maximum number of presences for the guild (the default value, currently 25000, is in effect when null is returned)
MaxPresences int `json:"max_presences"`
// The maximum number of members for the guild
MaxMembers int `json:"max_members"`
// 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 all active threads in the guild that current user has permission to view
// This field is only present in GUILD_CREATE events and websocket
// update events and thus is only present in state-cached guilds.
Threads []*Channel `json:"threads"`
// 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 NSFW Level of the guild
NSFWLevel GuildNSFWLevel `json:"nsfw_level"`
// The list of enabled guild features
Features []GuildFeature `json:"features"`
// Required MFA level for the guild
MfaLevel MfaLevel `json:"mfa_level"`
// The application id of the guild if bot created.
ApplicationID string `json:"application_id"`
// 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"`
// The System channel flags
SystemChannelFlags SystemChannelFlag `json:"system_channel_flags"`
// The ID of the rules channel ID, used for rules.
RulesChannelID string `json:"rules_channel_id"`
// the vanity url code for the guild
VanityURLCode string `json:"vanity_url_code"`
// the description for the guild
Description string `json:"description"`
// The hash of the guild's banner
Banner string `json:"banner"`
// The premium tier of the guild
PremiumTier PremiumTier `json:"premium_tier"`
// The total number of users currently boosting this server
PremiumSubscriptionCount int `json:"premium_subscription_count"`
// The preferred locale of a guild with the "PUBLIC" feature; used in server discovery and notices from Discord; defaults to "en-US"
PreferredLocale string `json:"preferred_locale"`
// The id of the channel where admins and moderators of guilds with the "PUBLIC" feature receive notices from Discord
PublicUpdatesChannelID string `json:"public_updates_channel_id"`
// The maximum amount of users in a video channel
MaxVideoChannelUsers int `json:"max_video_channel_users"`
// Approximate number of members in this guild, returned from the GET /guild/<id> endpoint when with_counts is true
ApproximateMemberCount int `json:"approximate_member_count"`
// Approximate number of non-offline members in this guild, returned from the GET /guild/<id> endpoint when with_counts is true
ApproximatePresenceCount int `json:"approximate_presence_count"`
// Permissions of our user
Permissions int64 `json:"permissions,string"`
// Stage instances in the guild
StageInstances []*StageInstance `json:"stage_instances"`
}
// A GuildPreview holds data related to a specific public Discord Guild, even if the user is not in the guild.
type GuildPreview struct {
// The ID of the guild.
ID string `json:"id"`
// The name of the guild. (2100 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 hash of the guild's splash.
Splash string `json:"splash"`
// The hash of the guild's discovery splash.
DiscoverySplash string `json:"discovery_splash"`
// A list of the custom emojis present in the guild.
Emojis []*Emoji `json:"emojis"`
// The list of enabled guild features
Features []string `json:"features"`
// Approximate number of members in this guild
// NOTE: this field is only filled when using GuildWithCounts
ApproximateMemberCount int `json:"approximate_member_count"`
// Approximate number of non-offline members in this guild
// NOTE: this field is only filled when using GuildWithCounts
ApproximatePresenceCount int `json:"approximate_presence_count"`
// the description for the guild
Description string `json:"description"`
}
// IconURL returns a URL to the guild's icon.
//
// size: The size of the desired icon image as a power of two
// Image size can be any power of two between 16 and 4096.
func (g *GuildPreview) IconURL(size string) string {
return iconURL(g.Icon, EndpointGuildIcon(g.ID, g.Icon), EndpointGuildIconAnimated(g.ID, g.Icon), size)
}
// GuildScheduledEvent is a representation of a scheduled event in a guild. Only for retrieval of the data.
// https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event
type GuildScheduledEvent struct {
// The ID of the scheduled event
ID string `json:"id"`
// The guild id which the scheduled event belongs to
GuildID string `json:"guild_id"`
// The channel id in which the scheduled event will be hosted, or null if scheduled entity type is EXTERNAL
ChannelID string `json:"channel_id"`
// The id of the user that created the scheduled event
CreatorID string `json:"creator_id"`
// The name of the scheduled event (1-100 characters)
Name string `json:"name"`
// The description of the scheduled event (1-1000 characters)
Description string `json:"description"`
// The time the scheduled event will start
ScheduledStartTime time.Time `json:"scheduled_start_time"`
// The time the scheduled event will end, required only when entity_type is EXTERNAL
ScheduledEndTime *time.Time `json:"scheduled_end_time"`
// The privacy level of the scheduled event
PrivacyLevel GuildScheduledEventPrivacyLevel `json:"privacy_level"`
// The status of the scheduled event
Status GuildScheduledEventStatus `json:"status"`
// Type of the entity where event would be hosted
// See field requirements
// https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-object-field-requirements-by-entity-type
EntityType GuildScheduledEventEntityType `json:"entity_type"`
// The id of an entity associated with a guild scheduled event
EntityID string `json:"entity_id"`
// Additional metadata for the guild scheduled event
EntityMetadata GuildScheduledEventEntityMetadata `json:"entity_metadata"`
// The user that created the scheduled event
Creator *User `json:"creator"`
// The number of users subscribed to the scheduled event
UserCount int `json:"user_count"`
// The cover image hash of the scheduled event
// see https://discord.com/developers/docs/reference#image-formatting for more
// information about image formatting
Image string `json:"image"`
}
// GuildScheduledEventParams are the parameters allowed for creating or updating a scheduled event
// https://discord.com/developers/docs/resources/guild-scheduled-event#create-guild-scheduled-event
type GuildScheduledEventParams struct {
// The channel id in which the scheduled event will be hosted, or null if scheduled entity type is EXTERNAL
ChannelID string `json:"channel_id,omitempty"`
// The name of the scheduled event (1-100 characters)
Name string `json:"name,omitempty"`
// The description of the scheduled event (1-1000 characters)
Description string `json:"description,omitempty"`
// The time the scheduled event will start
ScheduledStartTime *time.Time `json:"scheduled_start_time,omitempty"`
// The time the scheduled event will end, required only when entity_type is EXTERNAL
ScheduledEndTime *time.Time `json:"scheduled_end_time,omitempty"`
// The privacy level of the scheduled event
PrivacyLevel GuildScheduledEventPrivacyLevel `json:"privacy_level,omitempty"`
// The status of the scheduled event
Status GuildScheduledEventStatus `json:"status,omitempty"`
// Type of the entity where event would be hosted
// See field requirements
// https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-object-field-requirements-by-entity-type
EntityType GuildScheduledEventEntityType `json:"entity_type,omitempty"`
// Additional metadata for the guild scheduled event
EntityMetadata *GuildScheduledEventEntityMetadata `json:"entity_metadata,omitempty"`
// The cover image hash of the scheduled event
// see https://discord.com/developers/docs/reference#image-formatting for more
// information about image formatting
Image string `json:"image,omitempty"`
}
// MarshalJSON is a helper function to marshal GuildScheduledEventParams
func (p GuildScheduledEventParams) MarshalJSON() ([]byte, error) {
type guildScheduledEventParams GuildScheduledEventParams
if p.EntityType == GuildScheduledEventEntityTypeExternal && p.ChannelID == "" {
return Marshal(struct {
guildScheduledEventParams
ChannelID json.RawMessage `json:"channel_id"`
}{
guildScheduledEventParams: guildScheduledEventParams(p),
ChannelID: json.RawMessage("null"),
})
}
return Marshal(guildScheduledEventParams(p))
}
// GuildScheduledEventEntityMetadata holds additional metadata for guild scheduled event.
type GuildScheduledEventEntityMetadata struct {
// location of the event (1-100 characters)
// required for events with 'entity_type': EXTERNAL
Location string `json:"location"`
}
// GuildScheduledEventPrivacyLevel is the privacy level of a scheduled event.
// https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-object-guild-scheduled-event-privacy-level
type GuildScheduledEventPrivacyLevel int
const (
// GuildScheduledEventPrivacyLevelGuildOnly makes the scheduled
// event is only accessible to guild members
GuildScheduledEventPrivacyLevelGuildOnly GuildScheduledEventPrivacyLevel = 2
)
// GuildScheduledEventStatus is the status of a scheduled event
// Valid Guild Scheduled Event Status Transitions :
// SCHEDULED --> ACTIVE --> COMPLETED
// SCHEDULED --> CANCELED
// https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-object-guild-scheduled-event-status
type GuildScheduledEventStatus int
const (
// GuildScheduledEventStatusScheduled represents the current event is in scheduled state
GuildScheduledEventStatusScheduled GuildScheduledEventStatus = 1
// GuildScheduledEventStatusActive represents the current event is in active state
GuildScheduledEventStatusActive GuildScheduledEventStatus = 2
// GuildScheduledEventStatusCompleted represents the current event is in completed state
GuildScheduledEventStatusCompleted GuildScheduledEventStatus = 3
// GuildScheduledEventStatusCanceled represents the current event is in canceled state
GuildScheduledEventStatusCanceled GuildScheduledEventStatus = 4
)
// GuildScheduledEventEntityType is the type of entity associated with a guild scheduled event.
// https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-object-guild-scheduled-event-entity-types
type GuildScheduledEventEntityType int
const (
// GuildScheduledEventEntityTypeStageInstance represents a stage channel
GuildScheduledEventEntityTypeStageInstance GuildScheduledEventEntityType = 1
// GuildScheduledEventEntityTypeVoice represents a voice channel
GuildScheduledEventEntityTypeVoice GuildScheduledEventEntityType = 2
// GuildScheduledEventEntityTypeExternal represents an external event
GuildScheduledEventEntityTypeExternal GuildScheduledEventEntityType = 3
)
// GuildScheduledEventUser is a user subscribed to a scheduled event.
// https://discord.com/developers/docs/resources/guild-scheduled-event#guild-scheduled-event-user-object
type GuildScheduledEventUser struct {
GuildScheduledEventID string `json:"guild_scheduled_event_id"`
User *User `json:"user"`
Member *Member `json:"member"`
}
// A GuildTemplate represents a replicable template for guild creation
type GuildTemplate struct {
// The unique code for the guild template
Code string `json:"code"`
// The name of the template
Name string `json:"name,omitempty"`
// The description for the template
Description *string `json:"description,omitempty"`
// The number of times this template has been used
UsageCount int `json:"usage_count"`
// The ID of the user who created the template
CreatorID string `json:"creator_id"`
// The user who created the template
Creator *User `json:"creator"`
// The timestamp of when the template was created
CreatedAt time.Time `json:"created_at"`
// The timestamp of when the template was last synced
UpdatedAt time.Time `json:"updated_at"`
// The ID of the guild the template was based on
SourceGuildID string `json:"source_guild_id"`
// The guild 'snapshot' this template contains
SerializedSourceGuild *Guild `json:"serialized_source_guild"`
// Whether the template has unsynced changes
IsDirty bool `json:"is_dirty"`
}
// GuildTemplateParams stores the data needed to create or update a GuildTemplate.
type GuildTemplateParams struct {
// The name of the template (1-100 characters)
Name string `json:"name,omitempty"`
// The description of the template (0-120 characters)
Description string `json:"description,omitempty"`
}
// MessageNotifications is the notification level for a guild
// https://discord.com/developers/docs/resources/guild#guild-object-default-message-notification-level
type MessageNotifications int
// Block containing known MessageNotifications values
const (
MessageNotificationsAllMessages MessageNotifications = 0
MessageNotificationsOnlyMentions MessageNotifications = 1
)
// SystemChannelFlag is the type of flags in the system channel (see SystemChannelFlag* consts)
// https://discord.com/developers/docs/resources/guild#guild-object-system-channel-flags
type SystemChannelFlag int
// Block containing known SystemChannelFlag values
const (
SystemChannelFlagsSuppressJoinNotifications SystemChannelFlag = 1 << 0
SystemChannelFlagsSuppressPremium SystemChannelFlag = 1 << 1
SystemChannelFlagsSuppressGuildReminderNotifications SystemChannelFlag = 1 << 2
SystemChannelFlagsSuppressJoinNotificationReplies SystemChannelFlag = 1 << 3
)
// IconURL returns a URL to the guild's icon.
//
// size: The size of the desired icon image as a power of two
// Image size can be any power of two between 16 and 4096.
func (g *Guild) IconURL(size string) string {
return iconURL(g.Icon, EndpointGuildIcon(g.ID, g.Icon), EndpointGuildIconAnimated(g.ID, g.Icon), size)
}
// BannerURL returns a URL to the guild's banner.
//
// size: The size of the desired banner image as a power of two
// Image size can be any power of two between 16 and 4096.
func (g *Guild) BannerURL(size string) string {
return bannerURL(g.Banner, EndpointGuildBanner(g.ID, g.Banner), EndpointGuildBannerAnimated(g.ID, g.Banner), size)
}
// 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 int64 `json:"permissions,string"`
Features []GuildFeature `json:"features"`
}
// GuildFeature indicates the presence of a feature in a guild
type GuildFeature string
// Constants for GuildFeature
const (
GuildFeatureAnimatedBanner GuildFeature = "ANIMATED_BANNER"
GuildFeatureAnimatedIcon GuildFeature = "ANIMATED_ICON"
GuildFeatureAutoModeration GuildFeature = "AUTO_MODERATION"
GuildFeatureBanner GuildFeature = "BANNER"
GuildFeatureCommunity GuildFeature = "COMMUNITY"
GuildFeatureDiscoverable GuildFeature = "DISCOVERABLE"
GuildFeatureFeaturable GuildFeature = "FEATURABLE"
GuildFeatureInviteSplash GuildFeature = "INVITE_SPLASH"
GuildFeatureMemberVerificationGateEnabled GuildFeature = "MEMBER_VERIFICATION_GATE_ENABLED"
GuildFeatureMonetizationEnabled GuildFeature = "MONETIZATION_ENABLED"
GuildFeatureMoreStickers GuildFeature = "MORE_STICKERS"
GuildFeatureNews GuildFeature = "NEWS"
GuildFeaturePartnered GuildFeature = "PARTNERED"
GuildFeaturePreviewEnabled GuildFeature = "PREVIEW_ENABLED"
GuildFeaturePrivateThreads GuildFeature = "PRIVATE_THREADS"
GuildFeatureRoleIcons GuildFeature = "ROLE_ICONS"
GuildFeatureTicketedEventsEnabled GuildFeature = "TICKETED_EVENTS_ENABLED"
GuildFeatureVanityURL GuildFeature = "VANITY_URL"
GuildFeatureVerified GuildFeature = "VERIFIED"
GuildFeatureVipRegions GuildFeature = "VIP_REGIONS"
GuildFeatureWelcomeScreenEnabled GuildFeature = "WELCOME_SCREEN_ENABLED"
)
// 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?
ExplicitContentFilter int `json:"explicit_content_filter,omitempty"`
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"`
DiscoverySplash string `json:"discovery_splash,omitempty"`
Banner string `json:"banner,omitempty"`
SystemChannelID string `json:"system_channel_id,omitempty"`
SystemChannelFlags SystemChannelFlag `json:"system_channel_flags,omitempty"`
RulesChannelID string `json:"rules_channel_id,omitempty"`
PublicUpdatesChannelID string `json:"public_updates_channel_id,omitempty"`
PreferredLocale Locale `json:"preferred_locale,omitempty"`
Features []GuildFeature `json:"features,omitempty"`
Description string `json:"description,omitempty"`
PremiumProgressBarEnabled *bool `json:"premium_progress_bar_enabled,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 int64 `json:"permissions,string"`
}
// Mention returns a string which mentions the role
func (r *Role) Mention() string {
return fmt.Sprintf("<@&%s>", r.ID)
}
// RoleParams represents the parameters needed to create or update a Role
type RoleParams struct {
// The role's name
Name string `json:"name,omitempty"`
// The color the role should have (as a decimal, not hex)
Color *int `json:"color,omitempty"`
// Whether to display the role's users separately
Hoist *bool `json:"hoist,omitempty"`
// The overall permissions number of the role
Permissions *int64 `json:"permissions,omitempty,string"`
// Whether this role is mentionable
Mentionable *bool `json:"mentionable,omitempty"`
}
// 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 {
GuildID string `json:"guild_id"`
ChannelID string `json:"channel_id"`
UserID string `json:"user_id"`
Member *Member `json:"member"`
SessionID string `json:"session_id"`
Deaf bool `json:"deaf"`
Mute bool `json:"mute"`
SelfDeaf bool `json:"self_deaf"`
SelfMute bool `json:"self_mute"`
SelfStream bool `json:"self_stream"`
SelfVideo bool `json:"self_video"`
Suppress bool `json:"suppress"`
RequestToSpeakTimestamp *time.Time `json:"request_to_speak_timestamp"`
}
// 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"`
Activities []*Activity `json:"activities"`
Since *int `json:"since"`
ClientStatus ClientStatus `json:"client_status"`
}
// 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 := 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.
JoinedAt time.Time `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 hash of the avatar for the guild member, if any.
Avatar string `json:"avatar"`
// 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"`
// When the user used their Nitro boost on the server
PremiumSince *time.Time `json:"premium_since"`
// Is true while the member hasn't accepted the membership screen.
Pending bool `json:"pending"`
// Total permissions of the member in the channel, including overrides, returned when in the interaction object.
Permissions int64 `json:"permissions,string"`
// The time at which the member's timeout will expire.
// Time in the past or nil if the user is not timed out.
CommunicationDisabledUntil *time.Time `json:"communication_disabled_until"`
}
// Mention creates a member mention
func (m *Member) Mention() string {
return "<@!" + m.User.ID + ">"
}
// AvatarURL returns the URL of the member's avatar
//
// size: The size of the user's avatar as a power of two
// if size is an empty string, no size parameter will
// be added to the URL.
func (m *Member) AvatarURL(size string) string {
if m.Avatar == "" {
return m.User.AvatarURL(size)
}
// The default/empty avatar case should be handled by the above condition
return avatarURL(m.Avatar, "", EndpointGuildMemberAvatar(m.GuildID, m.User.ID, m.Avatar),
EndpointGuildMemberAvatarAnimated(m.GuildID, m.User.ID, m.Avatar), size)
}
// ClientStatus stores the online, offline, idle, or dnd status of each device of a Guild member.
type ClientStatus struct {
Desktop Status `json:"desktop"`
Mobile Status `json:"mobile"`
Web Status `json:"web"`
}
// 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"
)
// 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"`
}
// UnmarshalJSON helps support translation of a milliseconds-based float
// into a time.Duration on TooManyRequests.
func (t *TooManyRequests) UnmarshalJSON(b []byte) error {
u := struct {
Bucket string `json:"bucket"`
Message string `json:"message"`
RetryAfter float64 `json:"retry_after"`
}{}
err := Unmarshal(b, &u)
if err != nil {
return err
}
t.Bucket = u.Bucket
t.Message = u.Message
whole, frac := math.Modf(u.RetryAfter)
t.RetryAfter = time.Duration(whole)*time.Second + time.Duration(frac*1000)*time.Millisecond
return nil
}
// 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"`
}
// 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"`
}
// AutoModerationRule stores data for an auto moderation rule.
type AutoModerationRule struct {
ID string `json:"id,omitempty"`
GuildID string `json:"guild_id,omitempty"`
Name string `json:"name,omitempty"`
CreatorID string `json:"creator_id,omitempty"`
EventType AutoModerationRuleEventType `json:"event_type,omitempty"`
TriggerType AutoModerationRuleTriggerType `json:"trigger_type,omitempty"`
TriggerMetadata *AutoModerationTriggerMetadata `json:"trigger_metadata,omitempty"`
Actions []AutoModerationAction `json:"actions,omitempty"`
Enabled *bool `json:"enabled,omitempty"`
ExemptRoles *[]string `json:"exempt_roles,omitempty"`
ExemptChannels *[]string `json:"exempt_channels,omitempty"`
}
// AutoModerationRuleEventType indicates in what event context a rule should be checked.
type AutoModerationRuleEventType int
// Auto moderation rule event types.
const (
// AutoModerationEventMessageSend is checked when a member sends or edits a message in the guild
AutoModerationEventMessageSend AutoModerationRuleEventType = 1
)
// AutoModerationRuleTriggerType represents the type of content which can trigger the rule.
type AutoModerationRuleTriggerType int
// Auto moderation rule trigger types.
const (
AutoModerationEventTriggerKeyword AutoModerationRuleTriggerType = 1
AutoModerationEventTriggerHarmfulLink AutoModerationRuleTriggerType = 2
AutoModerationEventTriggerSpam AutoModerationRuleTriggerType = 3
AutoModerationEventTriggerKeywordPreset AutoModerationRuleTriggerType = 4
)
// AutoModerationKeywordPreset represents an internally pre-defined wordset.
type AutoModerationKeywordPreset uint
// Auto moderation keyword presets.
const (
AutoModerationKeywordPresetProfanity AutoModerationKeywordPreset = 1
AutoModerationKeywordPresetSexualContent AutoModerationKeywordPreset = 2
AutoModerationKeywordPresetSlurs AutoModerationKeywordPreset = 3
)
// AutoModerationTriggerMetadata represents additional metadata used to determine whether rule should be triggered.
type AutoModerationTriggerMetadata struct {
// Substrings which will be searched for in content.
// NOTE: should be only used with keyword trigger type.
KeywordFilter []string `json:"keyword_filter,omitempty"`
// Regular expression patterns which will be matched against content (maximum of 10).
// NOTE: should be only used with keyword trigger type.
RegexPatterns []string `json:"regex_patterns,omitempty"`
// Internally pre-defined wordsets which will be searched for in content.
// NOTE: should be only used with keyword preset trigger type.
Presets []AutoModerationKeywordPreset `json:"presets,omitempty"`
// Substrings which should not trigger the rule.
// NOTE: should be only used with keyword or keyword preset trigger type.
AllowList *[]string `json:"allow_list,omitempty"`
// Total number of unique role and user mentions allowed per message.
// NOTE: should be only used with mention spam trigger type.
MentionTotalLimit int `json:"mention_total_limit,omitempty"`
}
// AutoModerationActionType represents an action which will execute whenever a rule is triggered.
type AutoModerationActionType int
// Auto moderation actions types.
const (
AutoModerationRuleActionBlockMessage AutoModerationActionType = 1
AutoModerationRuleActionSendAlertMessage AutoModerationActionType = 2
AutoModerationRuleActionTimeout AutoModerationActionType = 3
)
// AutoModerationActionMetadata represents additional metadata needed during execution for a specific action type.
type AutoModerationActionMetadata struct {
// Channel to which user content should be logged.
// NOTE: should be only used with send alert message action type.
ChannelID string `json:"channel_id,omitempty"`
// Timeout duration in seconds (maximum of 2419200 - 4 weeks).
// NOTE: should be only used with timeout action type.
Duration int `json:"duration_seconds,omitempty"`
}
// AutoModerationAction stores data for an auto moderation action.
type AutoModerationAction struct {
Type AutoModerationActionType `json:"type"`
Metadata *AutoModerationActionMetadata `json:"metadata,omitempty"`
}
// A GuildEmbed stores data for a guild embed.
type GuildEmbed struct {
Enabled *bool `json:"enabled,omitempty"`
ChannelID string `json:"channel_id,omitempty"`
}
// A GuildAuditLog stores data for a guild audit log.
// https://discord.com/developers/docs/resources/audit-log#audit-log-object-audit-log-structure
type GuildAuditLog struct {
Webhooks []*Webhook `json:"webhooks,omitempty"`
Users []*User `json:"users,omitempty"`
AuditLogEntries []*AuditLogEntry `json:"audit_log_entries"`
Integrations []*Integration `json:"integrations"`
}
// AuditLogEntry for a GuildAuditLog
// https://discord.com/developers/docs/resources/audit-log#audit-log-entry-object-audit-log-entry-structure
type AuditLogEntry struct {
TargetID string `json:"target_id"`
Changes []*AuditLogChange `json:"changes"`
UserID string `json:"user_id"`
ID string `json:"id"`
ActionType *AuditLogAction `json:"action_type"`
Options *AuditLogOptions `json:"options"`
Reason string `json:"reason"`
}
// AuditLogChange for an AuditLogEntry
type AuditLogChange struct {
NewValue interface{} `json:"new_value"`
OldValue interface{} `json:"old_value"`
Key *AuditLogChangeKey `json:"key"`
}
// AuditLogChangeKey value for AuditLogChange
// https://discord.com/developers/docs/resources/audit-log#audit-log-change-object-audit-log-change-key
type AuditLogChangeKey string
// Block of valid AuditLogChangeKey
const (
// AuditLogChangeKeyAfkChannelID is sent when afk channel changed (snowflake) - guild
AuditLogChangeKeyAfkChannelID AuditLogChangeKey = "afk_channel_id"
// AuditLogChangeKeyAfkTimeout is sent when afk timeout duration changed (int) - guild
AuditLogChangeKeyAfkTimeout AuditLogChangeKey = "afk_timeout"
// AuditLogChangeKeyAllow is sent when a permission on a text or voice channel was allowed for a role (string) - role
AuditLogChangeKeyAllow AuditLogChangeKey = "allow"
// AudirChangeKeyApplicationID is sent when application id of the added or removed webhook or bot (snowflake) - channel
AuditLogChangeKeyApplicationID AuditLogChangeKey = "application_id"
// AuditLogChangeKeyArchived is sent when thread was archived/unarchived (bool) - thread
AuditLogChangeKeyArchived AuditLogChangeKey = "archived"
// AuditLogChangeKeyAsset is sent when asset is changed (string) - sticker
AuditLogChangeKeyAsset AuditLogChangeKey = "asset"
// AuditLogChangeKeyAutoArchiveDuration is sent when auto archive duration changed (int) - thread
AuditLogChangeKeyAutoArchiveDuration AuditLogChangeKey = "auto_archive_duration"
// AuditLogChangeKeyAvailable is sent when availability of sticker changed (bool) - sticker
AuditLogChangeKeyAvailable AuditLogChangeKey = "available"
// AuditLogChangeKeyAvatarHash is sent when user avatar changed (string) - user
AuditLogChangeKeyAvatarHash AuditLogChangeKey = "avatar_hash"
// AuditLogChangeKeyBannerHash is sent when guild banner changed (string) - guild
AuditLogChangeKeyBannerHash AuditLogChangeKey = "banner_hash"
// AuditLogChangeKeyBitrate is sent when voice channel bitrate changed (int) - channel
AuditLogChangeKeyBitrate AuditLogChangeKey = "bitrate"
// AuditLogChangeKeyChannelID is sent when channel for invite code or guild scheduled event changed (snowflake) - invite or guild scheduled event
AuditLogChangeKeyChannelID AuditLogChangeKey = "channel_id"
// AuditLogChangeKeyCode is sent when invite code changed (string) - invite
AuditLogChangeKeyCode AuditLogChangeKey = "code"
// AuditLogChangeKeyColor is sent when role color changed (int) - role
AuditLogChangeKeyColor AuditLogChangeKey = "color"
// AuditLogChangeKeyCommunicationDisabledUntil is sent when member timeout state changed (ISO8601 timestamp) - member
AuditLogChangeKeyCommunicationDisabledUntil AuditLogChangeKey = "communication_disabled_until"
// AuditLogChangeKeyDeaf is sent when user server deafened/undeafened (bool) - member
AuditLogChangeKeyDeaf AuditLogChangeKey = "deaf"
// AuditLogChangeKeyDefaultAutoArchiveDuration is sent when default auto archive duration for newly created threads changed (int) - channel
AuditLogChangeKeyDefaultAutoArchiveDuration AuditLogChangeKey = "default_auto_archive_duration"
// AuditLogChangeKeyDefaultMessageNotification is sent when default message notification level changed (int) - guild
AuditLogChangeKeyDefaultMessageNotification AuditLogChangeKey = "default_message_notifications"
// AuditLogChangeKeyDeny is sent when a permission on a text or voice channel was denied for a role (string) - role
AuditLogChangeKeyDeny AuditLogChangeKey = "deny"
// AuditLogChangeKeyDescription is sent when description changed (string) - guild, sticker, or guild scheduled event
AuditLogChangeKeyDescription AuditLogChangeKey = "description"
// AuditLogChangeKeyDiscoverySplashHash is sent when discovery splash changed (string) - guild
AuditLogChangeKeyDiscoverySplashHash AuditLogChangeKey = "discovery_splash_hash"
// AuditLogChangeKeyEnableEmoticons is sent when integration emoticons enabled/disabled (bool) - integration
AuditLogChangeKeyEnableEmoticons AuditLogChangeKey = "enable_emoticons"
// AuditLogChangeKeyEntityType is sent when entity type of guild scheduled event was changed (int) - guild scheduled event
AuditLogChangeKeyEntityType AuditLogChangeKey = "entity_type"
// AuditLogChangeKeyExpireBehavior is sent when integration expiring subscriber behavior changed (int) - integration
AuditLogChangeKeyExpireBehavior AuditLogChangeKey = "expire_behavior"
// AuditLogChangeKeyExpireGracePeriod is sent when integration expire grace period changed (int) - integration
AuditLogChangeKeyExpireGracePeriod AuditLogChangeKey = "expire_grace_period"
// AuditLogChangeKeyExplicitContentFilter is sent when change in whose messages are scanned and deleted for explicit content in the server is made (int) - guild
AuditLogChangeKeyExplicitContentFilter AuditLogChangeKey = "explicit_content_filter"
// AuditLogChangeKeyFormatType is sent when format type of sticker changed (int - sticker format type) - sticker
AuditLogChangeKeyFormatType AuditLogChangeKey = "format_type"
// AuditLogChangeKeyGuildID is sent when guild sticker is in changed (snowflake) - sticker
AuditLogChangeKeyGuildID AuditLogChangeKey = "guild_id"
// AuditLogChangeKeyHoist is sent when role is now displayed/no longer displayed separate from online users (bool) - role
AuditLogChangeKeyHoist AuditLogChangeKey = "hoist"
// AuditLogChangeKeyIconHash is sent when icon changed (string) - guild or role
AuditLogChangeKeyIconHash AuditLogChangeKey = "icon_hash"
// AuditLogChangeKeyID is sent when the id of the changed entity - sometimes used in conjunction with other keys (snowflake) - any
AuditLogChangeKeyID AuditLogChangeKey = "id"
// AuditLogChangeKeyInvitable is sent when private thread is now invitable/uninvitable (bool) - thread
AuditLogChangeKeyInvitable AuditLogChangeKey = "invitable"
// AuditLogChangeKeyInviterID is sent when person who created invite code changed (snowflake) - invite
AuditLogChangeKeyInviterID AuditLogChangeKey = "inviter_id"
// AuditLogChangeKeyLocation is sent when channel id for guild scheduled event changed (string) - guild scheduled event
AuditLogChangeKeyLocation AuditLogChangeKey = "location"
// AuditLogChangeKeyLocked is sent when thread was locked/unlocked (bool) - thread
AuditLogChangeKeyLocked AuditLogChangeKey = "locked"
// AuditLogChangeKeyMaxAge is sent when invite code expiration time changed (int) - invite
AuditLogChangeKeyMaxAge AuditLogChangeKey = "max_age"
// AuditLogChangeKeyMaxUses is sent when max number of times invite code can be used changed (int) - invite
AuditLogChangeKeyMaxUses AuditLogChangeKey = "max_uses"
// AuditLogChangeKeyMentionable is sent when role is now mentionable/unmentionable (bool) - role
AuditLogChangeKeyMentionable AuditLogChangeKey = "mentionable"
// AuditLogChangeKeyMfaLevel is sent when two-factor auth requirement changed (int - mfa level) - guild
AuditLogChangeKeyMfaLevel AuditLogChangeKey = "mfa_level"
// AuditLogChangeKeyMute is sent when user server muted/unmuted (bool) - member
AuditLogChangeKeyMute AuditLogChangeKey = "mute"
// AuditLogChangeKeyName is sent when name changed (string) - any
AuditLogChangeKeyName AuditLogChangeKey = "name"
// AuditLogChangeKeyNick is sent when user nickname changed (string) - member
AuditLogChangeKeyNick AuditLogChangeKey = "nick"
// AuditLogChangeKeyNSFW is sent when channel nsfw restriction changed (bool) - channel
AuditLogChangeKeyNSFW AuditLogChangeKey = "nsfw"
// AuditLogChangeKeyOwnerID is sent when owner changed (snowflake) - guild
AuditLogChangeKeyOwnerID AuditLogChangeKey = "owner_id"
// AuditLogChangeKeyPermissionOverwrite is sent when permissions on a channel changed (array of channel overwrite objects) - channel
AuditLogChangeKeyPermissionOverwrite AuditLogChangeKey = "permission_overwrites"
// AuditLogChangeKeyPermissions is sent when permissions for a role changed (string) - role
AuditLogChangeKeyPermissions AuditLogChangeKey = "permissions"
// AuditLogChangeKeyPosition is sent when text or voice channel position changed (int) - channel
AuditLogChangeKeyPosition AuditLogChangeKey = "position"
// AuditLogChangeKeyPreferredLocale is sent when preferred locale changed (string) - guild
AuditLogChangeKeyPreferredLocale AuditLogChangeKey = "preferred_locale"
// AuditLogChangeKeyPrivacylevel is sent when privacy level of the stage instance changed (integer - privacy level) - stage instance or guild scheduled event
AuditLogChangeKeyPrivacylevel AuditLogChangeKey = "privacy_level"
// AuditLogChangeKeyPruneDeleteDays is sent when number of days after which inactive and role-unassigned members are kicked changed (int) - guild
AuditLogChangeKeyPruneDeleteDays AuditLogChangeKey = "prune_delete_days"
// AuditLogChangeKeyPulibUpdatesChannelID is sent when id of the public updates channel changed (snowflake) - guild
AuditLogChangeKeyPulibUpdatesChannelID AuditLogChangeKey = "public_updates_channel_id"
// AuditLogChangeKeyRateLimitPerUser is sent when amount of seconds a user has to wait before sending another message changed (int) - channel
AuditLogChangeKeyRateLimitPerUser AuditLogChangeKey = "rate_limit_per_user"
// AuditLogChangeKeyRegion is sent when region changed (string) - guild
AuditLogChangeKeyRegion AuditLogChangeKey = "region"
// AuditLogChangeKeyRulesChannelID is sent when id of the rules channel changed (snowflake) - guild
AuditLogChangeKeyRulesChannelID AuditLogChangeKey = "rules_channel_id"
// AuditLogChangeKeySplashHash is sent when invite splash page artwork changed (string) - guild
AuditLogChangeKeySplashHash AuditLogChangeKey = "splash_hash"
// AuditLogChangeKeyStatus is sent when status of guild scheduled event was changed (int - guild scheduled event status) - guild scheduled event
AuditLogChangeKeyStatus AuditLogChangeKey = "status"
// AuditLogChangeKeySystemChannelID is sent when id of the system channel changed (snowflake) - guild
AuditLogChangeKeySystemChannelID AuditLogChangeKey = "system_channel_id"
// AuditLogChangeKeyTags is sent when related emoji of sticker changed (string) - sticker
AuditLogChangeKeyTags AuditLogChangeKey = "tags"
// AuditLogChangeKeyTemporary is sent when invite code is now temporary or never expires (bool) - invite
AuditLogChangeKeyTemporary AuditLogChangeKey = "temporary"
// TODO: remove when compatibility is not required
AuditLogChangeKeyTempoary = AuditLogChangeKeyTemporary
// AuditLogChangeKeyTopic is sent when text channel topic or stage instance topic changed (string) - channel or stage instance
AuditLogChangeKeyTopic AuditLogChangeKey = "topic"
// AuditLogChangeKeyType is sent when type of entity created (int or string) - any
AuditLogChangeKeyType AuditLogChangeKey = "type"
// AuditLogChangeKeyUnicodeEmoji is sent when role unicode emoji changed (string) - role
AuditLogChangeKeyUnicodeEmoji AuditLogChangeKey = "unicode_emoji"
// AuditLogChangeKeyUserLimit is sent when new user limit in a voice channel set (int) - voice channel
AuditLogChangeKeyUserLimit AuditLogChangeKey = "user_limit"
// AuditLogChangeKeyUses is sent when number of times invite code used changed (int) - invite
AuditLogChangeKeyUses AuditLogChangeKey = "uses"
// AuditLogChangeKeyVanityURLCode is sent when guild invite vanity url changed (string) - guild
AuditLogChangeKeyVanityURLCode AuditLogChangeKey = "vanity_url_code"
// AuditLogChangeKeyVerificationLevel is sent when required verification level changed (int - verification level) - guild
AuditLogChangeKeyVerificationLevel AuditLogChangeKey = "verification_level"
// AuditLogChangeKeyWidgetChannelID is sent when channel id of the server widget changed (snowflake) - guild
AuditLogChangeKeyWidgetChannelID AuditLogChangeKey = "widget_channel_id"
// AuditLogChangeKeyWidgetEnabled is sent when server widget enabled/disabled (bool) - guild
AuditLogChangeKeyWidgetEnabled AuditLogChangeKey = "widget_enabled"
// AuditLogChangeKeyRoleAdd is sent when new role added (array of partial role objects) - guild
AuditLogChangeKeyRoleAdd AuditLogChangeKey = "$add"
// AuditLogChangeKeyRoleRemove is sent when role removed (array of partial role objects) - guild
AuditLogChangeKeyRoleRemove AuditLogChangeKey = "$remove"
)
// AuditLogOptions optional data for the AuditLog
// https://discord.com/developers/docs/resources/audit-log#audit-log-entry-object-optional-audit-entry-info
type AuditLogOptions struct {
DeleteMemberDays string `json:"delete_member_days"`
MembersRemoved string `json:"members_removed"`
ChannelID string `json:"channel_id"`
MessageID string `json:"message_id"`
Count string `json:"count"`
ID string `json:"id"`
Type *AuditLogOptionsType `json:"type"`
RoleName string `json:"role_name"`
}
// AuditLogOptionsType of the AuditLogOption
// https://discord.com/developers/docs/resources/audit-log#audit-log-entry-object-optional-audit-entry-info
type AuditLogOptionsType string
// Valid Types for AuditLogOptionsType
const (
AuditLogOptionsTypeMember AuditLogOptionsType = "member"
AuditLogOptionsTypeRole AuditLogOptionsType = "role"
)
// AuditLogAction is the Action of the AuditLog (see AuditLogAction* consts)
// https://discord.com/developers/docs/resources/audit-log#audit-log-entry-object-audit-log-events
type AuditLogAction int
// Block contains Discord Audit Log Action Types
const (
AuditLogActionGuildUpdate AuditLogAction = 1
AuditLogActionChannelCreate AuditLogAction = 10
AuditLogActionChannelUpdate AuditLogAction = 11
AuditLogActionChannelDelete AuditLogAction = 12
AuditLogActionChannelOverwriteCreate AuditLogAction = 13
AuditLogActionChannelOverwriteUpdate AuditLogAction = 14
AuditLogActionChannelOverwriteDelete AuditLogAction = 15
AuditLogActionMemberKick AuditLogAction = 20
AuditLogActionMemberPrune AuditLogAction = 21
AuditLogActionMemberBanAdd AuditLogAction = 22
AuditLogActionMemberBanRemove AuditLogAction = 23
AuditLogActionMemberUpdate AuditLogAction = 24
AuditLogActionMemberRoleUpdate AuditLogAction = 25
AuditLogActionMemberMove AuditLogAction = 26
AuditLogActionMemberDisconnect AuditLogAction = 27
AuditLogActionBotAdd AuditLogAction = 28
AuditLogActionRoleCreate AuditLogAction = 30
AuditLogActionRoleUpdate AuditLogAction = 31
AuditLogActionRoleDelete AuditLogAction = 32
AuditLogActionInviteCreate AuditLogAction = 40
AuditLogActionInviteUpdate AuditLogAction = 41
AuditLogActionInviteDelete AuditLogAction = 42
AuditLogActionWebhookCreate AuditLogAction = 50
AuditLogActionWebhookUpdate AuditLogAction = 51
AuditLogActionWebhookDelete AuditLogAction = 52
AuditLogActionEmojiCreate AuditLogAction = 60
AuditLogActionEmojiUpdate AuditLogAction = 61
AuditLogActionEmojiDelete AuditLogAction = 62
AuditLogActionMessageDelete AuditLogAction = 72
AuditLogActionMessageBulkDelete AuditLogAction = 73
AuditLogActionMessagePin AuditLogAction = 74
AuditLogActionMessageUnpin AuditLogAction = 75
AuditLogActionIntegrationCreate AuditLogAction = 80
AuditLogActionIntegrationUpdate AuditLogAction = 81
AuditLogActionIntegrationDelete AuditLogAction = 82
AuditLogActionStageInstanceCreate AuditLogAction = 83
AuditLogActionStageInstanceUpdate AuditLogAction = 84
AuditLogActionStageInstanceDelete AuditLogAction = 85
AuditLogActionStickerCreate AuditLogAction = 90
AuditLogActionStickerUpdate AuditLogAction = 91
AuditLogActionStickerDelete AuditLogAction = 92
AuditLogGuildScheduledEventCreate AuditLogAction = 100
AuditLogGuildScheduledEventUpdare AuditLogAction = 101
AuditLogGuildScheduledEventDelete AuditLogAction = 102
AuditLogActionThreadCreate AuditLogAction = 110
AuditLogActionThreadUpdate AuditLogAction = 111
AuditLogActionThreadDelete AuditLogAction = 112
AuditLogActionApplicationCommandPermissionUpdate AuditLogAction = 121
)
// GuildMemberParams stores data needed to update a member
// https://discord.com/developers/docs/resources/guild#modify-guild-member
type GuildMemberParams struct {
// Value to set user's nickname to.
Nick string `json:"nick,omitempty"`
// Array of role ids the member is assigned.
Roles *[]string `json:"roles,omitempty"`
// ID of channel to move user to (if they are connected to voice).
// Set to "" to remove user from a voice channel.
ChannelID *string `json:"channel_id,omitempty"`
// Whether the user is muted in voice channels.
Mute *bool `json:"mute,omitempty"`
// Whether the user is deafened in voice channels.
Deaf *bool `json:"deaf,omitempty"`
// When the user's timeout will expire and the user will be able
// to communicate in the guild again (up to 28 days in the future).
// Set to time.Time{} to remove timeout.
CommunicationDisabledUntil *time.Time `json:"communication_disabled_until,omitempty"`
}
// MarshalJSON is a helper function to marshal GuildMemberParams.
func (p GuildMemberParams) MarshalJSON() (res []byte, err error) {
type guildMemberParams GuildMemberParams
v := struct {
guildMemberParams
ChannelID json.RawMessage `json:"channel_id,omitempty"`
CommunicationDisabledUntil json.RawMessage `json:"communication_disabled_until,omitempty"`
}{guildMemberParams: guildMemberParams(p)}
if p.ChannelID != nil {
if *p.ChannelID == "" {
v.ChannelID = json.RawMessage(`null`)
} else {
res, err = json.Marshal(p.ChannelID)
if err != nil {
return
}
v.ChannelID = res
}
}
if p.CommunicationDisabledUntil != nil {
if p.CommunicationDisabledUntil.IsZero() {
v.CommunicationDisabledUntil = json.RawMessage(`null`)
} else {
res, err = json.Marshal(p.CommunicationDisabledUntil)
if err != nil {
return
}
v.CommunicationDisabledUntil = res
}
}
return json.Marshal(v)
}
// GuildMemberAddParams stores data needed to add a user to a guild.
// NOTE: All fields are optional, except AccessToken.
type GuildMemberAddParams struct {
// Valid access_token for the user.
AccessToken string `json:"access_token"`
// Value to set users nickname to.
Nick string `json:"nick,omitempty"`
// A list of role ID's to set on the member.
Roles []string `json:"roles,omitempty"`
// Whether the user is muted.
Mute bool `json:"mute,omitempty"`
// Whether the user is deafened.
Deaf bool `json:"deaf,omitempty"`
}
// An APIErrorMessage is an api error message returned from discord
type APIErrorMessage struct {
Code int `json:"code"`
Message string `json:"message"`
}
// 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"`
SessionStartLimit SessionInformation `json:"session_start_limit"`
}
// SessionInformation provides the information for max concurrency sharding
type SessionInformation struct {
Total int `json:"total,omitempty"`
Remaining int `json:"remaining,omitempty"`
ResetAfter int `json:"reset_after,omitempty"`
MaxConcurrency int `json:"max_concurrency,omitempty"`
}
// GatewayStatusUpdate is sent by the client to indicate a presence or status update
// https://discord.com/developers/docs/topics/gateway#update-status-gateway-status-update-structure
type GatewayStatusUpdate struct {
Since int `json:"since"`
Game Activity `json:"game"`
Status string `json:"status"`
AFK bool `json:"afk"`
}
// Activity defines the Activity sent with GatewayStatusUpdate
// https://discord.com/developers/docs/topics/gateway#activity-object
type Activity struct {
Name string `json:"name"`
Type ActivityType `json:"type"`
URL string `json:"url,omitempty"`
CreatedAt time.Time `json:"created_at"`
ApplicationID string `json:"application_id,omitempty"`
State string `json:"state,omitempty"`
Details string `json:"details,omitempty"`
Timestamps TimeStamps `json:"timestamps,omitempty"`
Emoji Emoji `json:"emoji,omitempty"`
Party Party `json:"party,omitempty"`
Assets Assets `json:"assets,omitempty"`
Secrets Secrets `json:"secrets,omitempty"`
Instance bool `json:"instance,omitempty"`
Flags int `json:"flags,omitempty"`
}
// UnmarshalJSON is a custom unmarshaljson to make CreatedAt a time.Time instead of an int
func (activity *Activity) UnmarshalJSON(b []byte) error {
temp := struct {
Name string `json:"name"`
Type ActivityType `json:"type"`
URL string `json:"url,omitempty"`
CreatedAt int64 `json:"created_at"`
ApplicationID string `json:"application_id,omitempty"`
State string `json:"state,omitempty"`
Details string `json:"details,omitempty"`
Timestamps TimeStamps `json:"timestamps,omitempty"`
Emoji Emoji `json:"emoji,omitempty"`
Party Party `json:"party,omitempty"`
Assets Assets `json:"assets,omitempty"`
Secrets Secrets `json:"secrets,omitempty"`
Instance bool `json:"instance,omitempty"`
Flags int `json:"flags,omitempty"`
}{}
err := Unmarshal(b, &temp)
if err != nil {
return err
}
activity.CreatedAt = time.Unix(0, temp.CreatedAt*1000000)
activity.ApplicationID = temp.ApplicationID
activity.Assets = temp.Assets
activity.Details = temp.Details
activity.Emoji = temp.Emoji
activity.Flags = temp.Flags
activity.Instance = temp.Instance
activity.Name = temp.Name
activity.Party = temp.Party
activity.Secrets = temp.Secrets
activity.State = temp.State
activity.Timestamps = temp.Timestamps
activity.Type = temp.Type
activity.URL = temp.URL
return nil
}
// Party defines the Party field in the Activity struct
// https://discord.com/developers/docs/topics/gateway#activity-object
type Party struct {
ID string `json:"id,omitempty"`
Size []int `json:"size,omitempty"`
}
// Secrets defines the Secrets field for the Activity struct
// https://discord.com/developers/docs/topics/gateway#activity-object
type Secrets struct {
Join string `json:"join,omitempty"`
Spectate string `json:"spectate,omitempty"`
Match string `json:"match,omitempty"`
}
// ActivityType is the type of Activity (see ActivityType* consts) in the Activity struct
// https://discord.com/developers/docs/topics/gateway#activity-object-activity-types
type ActivityType int
// Valid ActivityType values
const (
ActivityTypeGame ActivityType = 0
ActivityTypeStreaming ActivityType = 1
ActivityTypeListening ActivityType = 2
ActivityTypeWatching ActivityType = 3
ActivityTypeCustom ActivityType = 4
ActivityTypeCompeting ActivityType = 5
)
// Identify is sent during initial handshake with the discord gateway.
// https://discord.com/developers/docs/topics/gateway#identify
type Identify struct {
Token string `json:"token"`
Properties IdentifyProperties `json:"properties"`
Compress bool `json:"compress"`
LargeThreshold int `json:"large_threshold"`
Shard *[2]int `json:"shard,omitempty"`
Presence GatewayStatusUpdate `json:"presence,omitempty"`
Intents Intent `json:"intents"`
}
// IdentifyProperties contains the "properties" portion of an Identify packet
// https://discord.com/developers/docs/topics/gateway#identify-identify-connection-properties
type IdentifyProperties struct {
OS string `json:"$os"`
Browser string `json:"$browser"`
Device string `json:"$device"`
Referer string `json:"$referer"`
ReferringDomain string `json:"$referring_domain"`
}
// StageInstance holds information about a live stage.
// https://discord.com/developers/docs/resources/stage-instance#stage-instance-resource
type StageInstance struct {
// The id of this Stage instance
ID string `json:"id"`
// The guild id of the associated Stage channel
GuildID string `json:"guild_id"`
// The id of the associated Stage channel
ChannelID string `json:"channel_id"`
// The topic of the Stage instance (1-120 characters)
Topic string `json:"topic"`
// The privacy level of the Stage instance
// https://discord.com/developers/docs/resources/stage-instance#stage-instance-object-privacy-level
PrivacyLevel StageInstancePrivacyLevel `json:"privacy_level"`
// Whether or not Stage Discovery is disabled (deprecated)
DiscoverableDisabled bool `json:"discoverable_disabled"`
// The id of the scheduled event for this Stage instance
GuildScheduledEventID string `json:"guild_scheduled_event_id"`
}
// StageInstanceParams represents the parameters needed to create or edit a stage instance
type StageInstanceParams struct {
// ChannelID represents the id of the Stage channel
ChannelID string `json:"channel_id,omitempty"`
// Topic of the Stage instance (1-120 characters)
Topic string `json:"topic,omitempty"`
// PrivacyLevel of the Stage instance (default GUILD_ONLY)
PrivacyLevel StageInstancePrivacyLevel `json:"privacy_level,omitempty"`
// SendStartNotification will notify @everyone that a Stage instance has started
SendStartNotification bool `json:"send_start_notification,omitempty"`
}
// StageInstancePrivacyLevel represents the privacy level of a Stage instance
// https://discord.com/developers/docs/resources/stage-instance#stage-instance-object-privacy-level
type StageInstancePrivacyLevel int
const (
// StageInstancePrivacyLevelPublic The Stage instance is visible publicly. (deprecated)
StageInstancePrivacyLevelPublic StageInstancePrivacyLevel = 1
// StageInstancePrivacyLevelGuildOnly The Stage instance is visible to only guild members.
StageInstancePrivacyLevelGuildOnly StageInstancePrivacyLevel = 2
)
// Constants for the different bit offsets of text channel permissions
const (
// Deprecated: PermissionReadMessages has been replaced with PermissionViewChannel for text and voice channels
PermissionReadMessages = 0x0000000000000400
PermissionSendMessages = 0x0000000000000800
PermissionSendTTSMessages = 0x0000000000001000
PermissionManageMessages = 0x0000000000002000
PermissionEmbedLinks = 0x0000000000004000
PermissionAttachFiles = 0x0000000000008000
PermissionReadMessageHistory = 0x0000000000010000
PermissionMentionEveryone = 0x0000000000020000
PermissionUseExternalEmojis = 0x0000000000040000
PermissionUseSlashCommands = 0x0000000080000000
PermissionManageThreads = 0x0000000400000000
PermissionCreatePublicThreads = 0x0000000800000000
PermissionCreatePrivateThreads = 0x0000001000000000
PermissionUseExternalStickers = 0x0000002000000000
PermissionSendMessagesInThreads = 0x0000004000000000
)
// Constants for the different bit offsets of voice permissions
const (
PermissionVoicePrioritySpeaker = 0x0000000000000100
PermissionVoiceStreamVideo = 0x0000000000000200
PermissionVoiceConnect = 0x0000000000100000
PermissionVoiceSpeak = 0x0000000000200000
PermissionVoiceMuteMembers = 0x0000000000400000
PermissionVoiceDeafenMembers = 0x0000000000800000
PermissionVoiceMoveMembers = 0x0000000001000000
PermissionVoiceUseVAD = 0x0000000002000000
PermissionVoiceRequestToSpeak = 0x0000000100000000
PermissionUseActivities = 0x0000008000000000
)
// Constants for general management.
const (
PermissionChangeNickname = 0x0000000004000000
PermissionManageNicknames = 0x0000000008000000
PermissionManageRoles = 0x0000000010000000
PermissionManageWebhooks = 0x0000000020000000
PermissionManageEmojis = 0x0000000040000000
PermissionManageEvents = 0x0000000200000000
)
// Constants for the different bit offsets of general permissions
const (
PermissionCreateInstantInvite = 0x0000000000000001
PermissionKickMembers = 0x0000000000000002
PermissionBanMembers = 0x0000000000000004
PermissionAdministrator = 0x0000000000000008
PermissionManageChannels = 0x0000000000000010
PermissionManageServer = 0x0000000000000020
PermissionAddReactions = 0x0000000000000040
PermissionViewAuditLogs = 0x0000000000000080
PermissionViewChannel = 0x0000000000000400
PermissionViewGuildInsights = 0x0000000000080000
PermissionModerateMembers = 0x0000010000000000
PermissionAllText = PermissionViewChannel |
PermissionSendMessages |
PermissionSendTTSMessages |
PermissionManageMessages |
PermissionEmbedLinks |
PermissionAttachFiles |
PermissionReadMessageHistory |
PermissionMentionEveryone
PermissionAllVoice = PermissionViewChannel |
PermissionVoiceConnect |
PermissionVoiceSpeak |
PermissionVoiceMuteMembers |
PermissionVoiceDeafenMembers |
PermissionVoiceMoveMembers |
PermissionVoiceUseVAD |
PermissionVoicePrioritySpeaker
PermissionAllChannel = PermissionAllText |
PermissionAllVoice |
PermissionCreateInstantInvite |
PermissionManageRoles |
PermissionManageChannels |
PermissionAddReactions |
PermissionViewAuditLogs
PermissionAll = PermissionAllChannel |
PermissionKickMembers |
PermissionBanMembers |
PermissionManageServer |
PermissionAdministrator |
PermissionManageWebhooks |
PermissionManageEmojis
)
// Block contains Discord JSON Error Response codes
const (
ErrCodeGeneralError = 0
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
ErrCodeUnknownWebhookService = 10016
ErrCodeUnknownSession = 10020
ErrCodeUnknownBan = 10026
ErrCodeUnknownSKU = 10027
ErrCodeUnknownStoreListing = 10028
ErrCodeUnknownEntitlement = 10029
ErrCodeUnknownBuild = 10030
ErrCodeUnknownLobby = 10031
ErrCodeUnknownBranch = 10032
ErrCodeUnknownStoreDirectoryLayout = 10033
ErrCodeUnknownRedistributable = 10036
ErrCodeUnknownGiftCode = 10038
ErrCodeUnknownStream = 10049
ErrCodeUnknownPremiumServerSubscribeCooldown = 10050
ErrCodeUnknownGuildTemplate = 10057
ErrCodeUnknownDiscoveryCategory = 10059
ErrCodeUnknownSticker = 10060
ErrCodeUnknownInteraction = 10062
ErrCodeUnknownApplicationCommand = 10063
ErrCodeUnknownApplicationCommandPermissions = 10066
ErrCodeUnknownStageInstance = 10067
ErrCodeUnknownGuildMemberVerificationForm = 10068
ErrCodeUnknownGuildWelcomeScreen = 10069
ErrCodeUnknownGuildScheduledEvent = 10070
ErrCodeUnknownGuildScheduledEventUser = 10071
ErrUnknownTag = 10087
ErrCodeBotsCannotUseEndpoint = 20001
ErrCodeOnlyBotsCanUseEndpoint = 20002
ErrCodeExplicitContentCannotBeSentToTheDesiredRecipients = 20009
ErrCodeYouAreNotAuthorizedToPerformThisActionOnThisApplication = 20012
ErrCodeThisActionCannotBePerformedDueToSlowmodeRateLimit = 20016
ErrCodeOnlyTheOwnerOfThisAccountCanPerformThisAction = 20018
ErrCodeMessageCannotBeEditedDueToAnnouncementRateLimits = 20022
ErrCodeChannelHasHitWriteRateLimit = 20028
ErrCodeTheWriteActionYouArePerformingOnTheServerHasHitTheWriteRateLimit = 20029
ErrCodeStageTopicContainsNotAllowedWordsForPublicStages = 20031
ErrCodeGuildPremiumSubscriptionLevelTooLow = 20035
ErrCodeMaximumGuildsReached = 30001
ErrCodeMaximumPinsReached = 30003
ErrCodeMaximumNumberOfRecipientsReached = 30004
ErrCodeMaximumGuildRolesReached = 30005
ErrCodeMaximumNumberOfWebhooksReached = 30007
ErrCodeMaximumNumberOfEmojisReached = 30008
ErrCodeTooManyReactions = 30010
ErrCodeMaximumNumberOfGuildChannelsReached = 30013
ErrCodeMaximumNumberOfAttachmentsInAMessageReached = 30015
ErrCodeMaximumNumberOfInvitesReached = 30016
ErrCodeMaximumNumberOfAnimatedEmojisReached = 30018
ErrCodeMaximumNumberOfServerMembersReached = 30019
ErrCodeMaximumNumberOfGuildDiscoverySubcategoriesReached = 30030
ErrCodeGuildAlreadyHasATemplate = 30031
ErrCodeMaximumNumberOfThreadParticipantsReached = 30033
ErrCodeMaximumNumberOfBansForNonGuildMembersHaveBeenExceeded = 30035
ErrCodeMaximumNumberOfBansFetchesHasBeenReached = 30037
ErrCodeMaximumNumberOfUncompletedGuildScheduledEventsReached = 30038
ErrCodeMaximumNumberOfStickersReached = 30039
ErrCodeMaximumNumberOfPruneRequestsHasBeenReached = 30040
ErrCodeMaximumNumberOfGuildWidgetSettingsUpdatesHasBeenReached = 30042
ErrCodeMaximumNumberOfEditsToMessagesOlderThanOneHourReached = 30046
ErrCodeMaximumNumberOfPinnedThreadsInForumChannelHasBeenReached = 30047
ErrCodeMaximumNumberOfTagsInForumChannelHasBeenReached = 30048
ErrCodeUnauthorized = 40001
ErrCodeActionRequiredVerifiedAccount = 40002
ErrCodeOpeningDirectMessagesTooFast = 40003
ErrCodeSendMessagesHasBeenTemporarilyDisabled = 40004
ErrCodeRequestEntityTooLarge = 40005
ErrCodeFeatureTemporarilyDisabledServerSide = 40006
ErrCodeUserIsBannedFromThisGuild = 40007
ErrCodeTargetIsNotConnectedToVoice = 40032
ErrCodeMessageAlreadyCrossposted = 40033
ErrCodeAnApplicationWithThatNameAlreadyExists = 40041
ErrCodeInteractionHasAlreadyBeenAcknowledged = 40060
ErrCodeTagNamesMustBeUnique = 40061
ErrCodeMissingAccess = 50001
ErrCodeInvalidAccountType = 50002
ErrCodeCannotExecuteActionOnDMChannel = 50003
ErrCodeEmbedDisabled = 50004
ErrCodeGuildWidgetDisabled = 50004
ErrCodeCannotEditFromAnotherUser = 50005
ErrCodeCannotSendEmptyMessage = 50006
ErrCodeCannotSendMessagesToThisUser = 50007
ErrCodeCannotSendMessagesInVoiceChannel = 50008
ErrCodeChannelVerificationLevelTooHigh = 50009
ErrCodeOAuth2ApplicationDoesNotHaveBot = 50010
ErrCodeOAuth2ApplicationLimitReached = 50011
ErrCodeInvalidOAuthState = 50012
ErrCodeMissingPermissions = 50013
ErrCodeInvalidAuthenticationToken = 50014
ErrCodeTooFewOrTooManyMessagesToDelete = 50016
ErrCodeCanOnlyPinMessageToOriginatingChannel = 50019
ErrCodeInviteCodeWasEitherInvalidOrTaken = 50020
ErrCodeCannotExecuteActionOnSystemMessage = 50021
ErrCodeCannotExecuteActionOnThisChannelType = 50024
ErrCodeInvalidOAuth2AccessTokenProvided = 50025
ErrCodeMissingRequiredOAuth2Scope = 50026
ErrCodeInvalidWebhookTokenProvided = 50027
ErrCodeInvalidRole = 50028
ErrCodeInvalidRecipients = 50033
ErrCodeMessageProvidedTooOldForBulkDelete = 50034
ErrCodeInvalidFormBody = 50035
ErrCodeInviteAcceptedToGuildApplicationsBotNotIn = 50036
ErrCodeInvalidAPIVersionProvided = 50041
ErrCodeFileUploadedExceedsTheMaximumSize = 50045
ErrCodeInvalidFileUploaded = 50046
ErrCodeInvalidGuild = 50055
ErrCodeInvalidMessageType = 50068
ErrCodeCannotDeleteAChannelRequiredForCommunityGuilds = 50074
ErrCodeInvalidStickerSent = 50081
ErrCodePerformedOperationOnArchivedThread = 50083
ErrCodeBeforeValueIsEarlierThanThreadCreationDate = 50085
ErrCodeCommunityServerChannelsMustBeTextChannels = 50086
ErrCodeThisServerIsNotAvailableInYourLocation = 50095
ErrCodeThisServerNeedsMonetizationEnabledInOrderToPerformThisAction = 50097
ErrCodeThisServerNeedsMoreBoostsToPerformThisAction = 50101
ErrCodeTheRequestBodyContainsInvalidJSON = 50109
ErrCodeNoUsersWithDiscordTagExist = 80004
ErrCodeReactionBlocked = 90001
ErrCodeAPIResourceIsCurrentlyOverloaded = 130000
ErrCodeTheStageIsAlreadyOpen = 150006
ErrCodeCannotReplyWithoutPermissionToReadMessageHistory = 160002
ErrCodeThreadAlreadyCreatedForThisMessage = 160004
ErrCodeThreadIsLocked = 160005
ErrCodeMaximumNumberOfActiveThreadsReached = 160006
ErrCodeMaximumNumberOfActiveAnnouncementThreadsReached = 160007
ErrCodeInvalidJSONForUploadedLottieFile = 170001
ErrCodeUploadedLottiesCannotContainRasterizedImages = 170002
ErrCodeStickerMaximumFramerateExceeded = 170003
ErrCodeStickerFrameCountExceedsMaximumOfOneThousandFrames = 170004
ErrCodeLottieAnimationMaximumDimensionsExceeded = 170005
ErrCodeStickerFrameRateOutOfRange = 170006
ErrCodeStickerAnimationDurationExceedsMaximumOfFiveSeconds = 170007
ErrCodeCannotUpdateAFinishedEvent = 180000
ErrCodeFailedToCreateStageNeededForStageEvent = 180002
)
// Intent is the type of a Gateway Intent
// https://discord.com/developers/docs/topics/gateway#gateway-intents
type Intent int
// Constants for the different bit offsets of intents
const (
IntentGuilds Intent = 1 << 0
IntentGuildMembers Intent = 1 << 1
IntentGuildBans Intent = 1 << 2
IntentGuildEmojis Intent = 1 << 3
IntentGuildIntegrations Intent = 1 << 4
IntentGuildWebhooks Intent = 1 << 5
IntentGuildInvites Intent = 1 << 6
IntentGuildVoiceStates Intent = 1 << 7
IntentGuildPresences Intent = 1 << 8
IntentGuildMessages Intent = 1 << 9
IntentGuildMessageReactions Intent = 1 << 10
IntentGuildMessageTyping Intent = 1 << 11
IntentDirectMessages Intent = 1 << 12
IntentDirectMessageReactions Intent = 1 << 13
IntentDirectMessageTyping Intent = 1 << 14
IntentMessageContent Intent = 1 << 15
IntentGuildScheduledEvents Intent = 1 << 16
IntentAutoModerationConfiguration Intent = 1 << 20
IntentAutoModerationExecution Intent = 1 << 21
// TODO: remove when compatibility is not needed
IntentsGuilds Intent = 1 << 0
IntentsGuildMembers Intent = 1 << 1
IntentsGuildBans Intent = 1 << 2
IntentsGuildEmojis Intent = 1 << 3
IntentsGuildIntegrations Intent = 1 << 4
IntentsGuildWebhooks Intent = 1 << 5
IntentsGuildInvites Intent = 1 << 6
IntentsGuildVoiceStates Intent = 1 << 7
IntentsGuildPresences Intent = 1 << 8
IntentsGuildMessages Intent = 1 << 9
IntentsGuildMessageReactions Intent = 1 << 10
IntentsGuildMessageTyping Intent = 1 << 11
IntentsDirectMessages Intent = 1 << 12
IntentsDirectMessageReactions Intent = 1 << 13
IntentsDirectMessageTyping Intent = 1 << 14
IntentsMessageContent Intent = 1 << 15
IntentsGuildScheduledEvents Intent = 1 << 16
IntentsAllWithoutPrivileged = IntentGuilds |
IntentGuildBans |
IntentGuildEmojis |
IntentGuildIntegrations |
IntentGuildWebhooks |
IntentGuildInvites |
IntentGuildVoiceStates |
IntentGuildMessages |
IntentGuildMessageReactions |
IntentGuildMessageTyping |
IntentDirectMessages |
IntentDirectMessageReactions |
IntentDirectMessageTyping |
IntentGuildScheduledEvents |
IntentAutoModerationConfiguration |
IntentAutoModerationExecution
IntentsAll = IntentsAllWithoutPrivileged |
IntentGuildMembers |
IntentGuildPresences |
IntentMessageContent
IntentsNone Intent = 0
)
// MakeIntent used to help convert a gateway intent value for use in the Identify structure;
// this was useful to help support the use of a pointer type when intents were optional.
// This is now a no-op, and is not necessary to use.
func MakeIntent(intents Intent) Intent {
return intents
}