433 lines
11 KiB
Python

"""
Enums for Discord constants.
"""
from enum import IntEnum, Enum
class GatewayOpcode(IntEnum):
"""Represents a Discord Gateway Opcode."""
DISPATCH = 0
HEARTBEAT = 1
IDENTIFY = 2
PRESENCE_UPDATE = 3
VOICE_STATE_UPDATE = 4
RESUME = 6
RECONNECT = 7
REQUEST_GUILD_MEMBERS = 8
INVALID_SESSION = 9
HELLO = 10
HEARTBEAT_ACK = 11
class GatewayIntent(IntEnum):
"""Represents a Discord Gateway Intent bit.
Intents are used to subscribe to specific groups of events from the Gateway.
"""
GUILDS = 1 << 0
GUILD_MEMBERS = 1 << 1 # Privileged
GUILD_MODERATION = 1 << 2 # Formerly GUILD_BANS
GUILD_EMOJIS_AND_STICKERS = 1 << 3
GUILD_INTEGRATIONS = 1 << 4
GUILD_WEBHOOKS = 1 << 5
GUILD_INVITES = 1 << 6
GUILD_VOICE_STATES = 1 << 7
GUILD_PRESENCES = 1 << 8 # Privileged
GUILD_MESSAGES = 1 << 9
GUILD_MESSAGE_REACTIONS = 1 << 10
GUILD_MESSAGE_TYPING = 1 << 11
DIRECT_MESSAGES = 1 << 12
DIRECT_MESSAGE_REACTIONS = 1 << 13
DIRECT_MESSAGE_TYPING = 1 << 14
MESSAGE_CONTENT = 1 << 15 # Privileged (as of Aug 31, 2022)
GUILD_SCHEDULED_EVENTS = 1 << 16
AUTO_MODERATION_CONFIGURATION = 1 << 20
AUTO_MODERATION_EXECUTION = 1 << 21
@classmethod
def none(cls) -> int:
"""Return a bitmask representing no intents."""
return 0
@classmethod
def default(cls) -> int:
"""Returns default intents (excluding privileged ones like members, presences, message content)."""
return (
cls.GUILDS
| cls.GUILD_MODERATION
| cls.GUILD_EMOJIS_AND_STICKERS
| cls.GUILD_INTEGRATIONS
| cls.GUILD_WEBHOOKS
| cls.GUILD_INVITES
| cls.GUILD_VOICE_STATES
| cls.GUILD_MESSAGES
| cls.GUILD_MESSAGE_REACTIONS
| cls.GUILD_MESSAGE_TYPING
| cls.DIRECT_MESSAGES
| cls.DIRECT_MESSAGE_REACTIONS
| cls.DIRECT_MESSAGE_TYPING
| cls.GUILD_SCHEDULED_EVENTS
| cls.AUTO_MODERATION_CONFIGURATION
| cls.AUTO_MODERATION_EXECUTION
)
@classmethod
def all(cls) -> int:
"""Returns all intents, including privileged ones. Use with caution."""
val = 0
for intent in cls:
val |= intent.value
return val
@classmethod
def privileged(cls) -> int:
"""Returns a bitmask of all privileged intents."""
return cls.GUILD_MEMBERS | cls.GUILD_PRESENCES | cls.MESSAGE_CONTENT
# --- Application Command Enums ---
class ApplicationCommandType(IntEnum):
"""Type of application command."""
CHAT_INPUT = 1
USER = 2
MESSAGE = 3
PRIMARY_ENTRY_POINT = 4
class ApplicationCommandOptionType(IntEnum):
"""Type of application command option."""
SUB_COMMAND = 1
SUB_COMMAND_GROUP = 2
STRING = 3
INTEGER = 4 # Any integer between -2^53 and 2^53
BOOLEAN = 5
USER = 6
CHANNEL = 7 # Includes all channel types + categories
ROLE = 8
MENTIONABLE = 9 # Includes users and roles
NUMBER = 10 # Any double between -2^53 and 2^53
ATTACHMENT = 11
class InteractionType(IntEnum):
"""Type of interaction."""
PING = 1
APPLICATION_COMMAND = 2
MESSAGE_COMPONENT = 3
APPLICATION_COMMAND_AUTOCOMPLETE = 4
MODAL_SUBMIT = 5
class InteractionCallbackType(IntEnum):
"""Type of interaction callback."""
PONG = 1
CHANNEL_MESSAGE_WITH_SOURCE = 4
DEFERRED_CHANNEL_MESSAGE_WITH_SOURCE = 5
DEFERRED_UPDATE_MESSAGE = 6
UPDATE_MESSAGE = 7
APPLICATION_COMMAND_AUTOCOMPLETE_RESULT = 8
MODAL = 9 # Response to send a modal
class IntegrationType(IntEnum):
"""
Installation context(s) where the command is available,
only for globally-scoped commands.
"""
GUILD_INSTALL = (
0 # Command is available when the app is installed to a guild (default)
)
USER_INSTALL = 1 # Command is available when the app is installed to a user
class InteractionContextType(IntEnum):
"""
Interaction context(s) where the command can be used,
only for globally-scoped commands.
"""
GUILD = 0 # Command can be used in guilds
BOT_DM = 1 # Command can be used in DMs with the app's bot user
PRIVATE_CHANNEL = 2 # Command can be used in Group DMs and DMs (requires USER_INSTALL integration_type)
class MessageFlags(IntEnum):
"""Represents the flags of a message."""
CROSSPOSTED = 1 << 0
IS_CROSSPOST = 1 << 1
SUPPRESS_EMBEDS = 1 << 2
SOURCE_MESSAGE_DELETED = 1 << 3
URGENT = 1 << 4
HAS_THREAD = 1 << 5
EPHEMERAL = 1 << 6
LOADING = 1 << 7
FAILED_TO_MENTION_SOME_ROLES_IN_THREAD = 1 << 8
SUPPRESS_NOTIFICATIONS = (
1 << 12
) # Discord specific, was previously 1 << 4 (IS_VOICE_MESSAGE)
IS_COMPONENTS_V2 = 1 << 15
# --- Guild Enums ---
class VerificationLevel(IntEnum):
"""Guild verification level."""
NONE = 0
LOW = 1
MEDIUM = 2
HIGH = 3
VERY_HIGH = 4
class MessageNotificationLevel(IntEnum):
"""Default message notification level for a guild."""
ALL_MESSAGES = 0
ONLY_MENTIONS = 1
class ExplicitContentFilterLevel(IntEnum):
"""Explicit content filter level for a guild."""
DISABLED = 0
MEMBERS_WITHOUT_ROLES = 1
ALL_MEMBERS = 2
class MFALevel(IntEnum):
"""Multi-Factor Authentication level for a guild."""
NONE = 0
ELEVATED = 1
class GuildNSFWLevel(IntEnum):
"""NSFW level of a guild."""
DEFAULT = 0
EXPLICIT = 1
SAFE = 2
AGE_RESTRICTED = 3
class PremiumTier(IntEnum):
"""Guild premium tier (boost level)."""
NONE = 0
TIER_1 = 1
TIER_2 = 2
TIER_3 = 3
class GuildFeature(str, Enum): # Changed from IntEnum to Enum
"""Features that a guild can have.
Note: This is not an exhaustive list and Discord may add more.
Using str as a base allows for unknown features to be stored as strings.
"""
ANIMATED_BANNER = "ANIMATED_BANNER"
ANIMATED_ICON = "ANIMATED_ICON"
APPLICATION_COMMAND_PERMISSIONS_V2 = "APPLICATION_COMMAND_PERMISSIONS_V2"
AUTO_MODERATION = "AUTO_MODERATION"
BANNER = "BANNER"
COMMUNITY = "COMMUNITY"
CREATOR_MONETIZABLE_PROVISIONAL = "CREATOR_MONETIZABLE_PROVISIONAL"
CREATOR_STORE_PAGE = "CREATOR_STORE_PAGE"
DEVELOPER_SUPPORT_SERVER = "DEVELOPER_SUPPORT_SERVER"
DISCOVERABLE = "DISCOVERABLE"
FEATURABLE = "FEATURABLE"
INVITES_DISABLED = "INVITES_DISABLED"
INVITE_SPLASH = "INVITE_SPLASH"
MEMBER_VERIFICATION_GATE_ENABLED = "MEMBER_VERIFICATION_GATE_ENABLED"
MORE_STICKERS = "MORE_STICKERS"
NEWS = "NEWS"
PARTNERED = "PARTNERED"
PREVIEW_ENABLED = "PREVIEW_ENABLED"
RAID_ALERTS_DISABLED = "RAID_ALERTS_DISABLED"
ROLE_ICONS = "ROLE_ICONS"
ROLE_SUBSCRIPTIONS_AVAILABLE_FOR_PURCHASE = (
"ROLE_SUBSCRIPTIONS_AVAILABLE_FOR_PURCHASE"
)
ROLE_SUBSCRIPTIONS_ENABLED = "ROLE_SUBSCRIPTIONS_ENABLED"
TICKETED_EVENTS_ENABLED = "TICKETED_EVENTS_ENABLED"
VANITY_URL = "VANITY_URL"
VERIFIED = "VERIFIED"
VIP_REGIONS = "VIP_REGIONS"
WELCOME_SCREEN_ENABLED = "WELCOME_SCREEN_ENABLED"
# Add more as they become known or needed
# This allows GuildFeature("UNKNOWN_FEATURE_STRING") to work
@classmethod
def _missing_(cls, value): # type: ignore
return str(value)
# --- Guild Scheduled Event Enums ---
class GuildScheduledEventPrivacyLevel(IntEnum):
"""Privacy level for a scheduled event."""
GUILD_ONLY = 2
class GuildScheduledEventStatus(IntEnum):
"""Status of a scheduled event."""
SCHEDULED = 1
ACTIVE = 2
COMPLETED = 3
CANCELED = 4
class GuildScheduledEventEntityType(IntEnum):
"""Entity type for a scheduled event."""
STAGE_INSTANCE = 1
VOICE = 2
EXTERNAL = 3
class VoiceRegion(str, Enum):
"""Voice region identifier."""
AMSTERDAM = "amsterdam"
BRAZIL = "brazil"
DUBAI = "dubai"
EU_CENTRAL = "eu-central"
EU_WEST = "eu-west"
EUROPE = "europe"
FRANKFURT = "frankfurt"
HONGKONG = "hongkong"
INDIA = "india"
JAPAN = "japan"
RUSSIA = "russia"
SINGAPORE = "singapore"
SOUTHAFRICA = "southafrica"
SOUTH_KOREA = "south-korea"
SYDNEY = "sydney"
US_CENTRAL = "us-central"
US_EAST = "us-east"
US_SOUTH = "us-south"
US_WEST = "us-west"
VIP_US_EAST = "vip-us-east"
VIP_US_WEST = "vip-us-west"
@classmethod
def _missing_(cls, value): # type: ignore
return str(value)
# --- Channel Enums ---
class ChannelType(IntEnum):
"""Type of channel."""
GUILD_TEXT = 0 # a text channel within a server
DM = 1 # a direct message between users
GUILD_VOICE = 2 # a voice channel within a server
GROUP_DM = 3 # a direct message between multiple users
GUILD_CATEGORY = 4 # an organizational category that contains up to 50 channels
GUILD_ANNOUNCEMENT = 5 # a channel that users can follow and crosspost into their own server (formerly GUILD_NEWS)
ANNOUNCEMENT_THREAD = (
10 # a temporary sub-channel within a GUILD_ANNOUNCEMENT channel
)
PUBLIC_THREAD = (
11 # a temporary sub-channel within a GUILD_TEXT or GUILD_ANNOUNCEMENT channel
)
PRIVATE_THREAD = 12 # a temporary sub-channel within a GUILD_TEXT channel that is only viewable by those invited and those with the MANAGE_THREADS permission
GUILD_STAGE_VOICE = (
13 # a voice channel for hosting events with speakers and audiences
)
GUILD_DIRECTORY = 14 # a channel in a hub containing the listed servers
GUILD_FORUM = 15 # (Still in development) a channel that can only contain threads
GUILD_MEDIA = 16 # (Still in development) a channel that can only contain media
class StageInstancePrivacyLevel(IntEnum):
"""Privacy level of a stage instance."""
PUBLIC = 1
GUILD_ONLY = 2
class OverwriteType(IntEnum):
"""Type of target for a permission overwrite."""
ROLE = 0
MEMBER = 1
class AutoArchiveDuration(IntEnum):
"""Thread auto-archive duration in minutes."""
HOUR = 60
DAY = 1440
THREE_DAYS = 4320
WEEK = 10080
# --- Component Enums ---
class ComponentType(IntEnum):
"""Type of message component."""
ACTION_ROW = 1
BUTTON = 2
STRING_SELECT = 3 # Formerly SELECT_MENU
TEXT_INPUT = 4
USER_SELECT = 5
ROLE_SELECT = 6
MENTIONABLE_SELECT = 7
CHANNEL_SELECT = 8
SECTION = 9
TEXT_DISPLAY = 10
THUMBNAIL = 11
MEDIA_GALLERY = 12
FILE = 13
SEPARATOR = 14
CONTAINER = 17
class ButtonStyle(IntEnum):
"""Style of a button component."""
# Blurple
PRIMARY = 1
# Grey
SECONDARY = 2
# Green
SUCCESS = 3
# Red
DANGER = 4
# Grey, navigates to a URL
LINK = 5
class TextInputStyle(IntEnum):
"""Style of a text input component."""
SHORT = 1
PARAGRAPH = 2
# Example of how you might combine intents:
# intents = GatewayIntent.GUILDS | GatewayIntent.GUILD_MESSAGES | GatewayIntent.MESSAGE_CONTENT
# client = Client(token="YOUR_TOKEN", intents=intents)