From a60d39f0cc6206db5e07cd1f568ab0c9ace5dd0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Susa=C3=B1a?= Date: Mon, 26 Sep 2022 23:20:17 -0400 Subject: [PATCH] api-types rewrite (#117) * feat: application commands types * message components * feat: interactions * feat: application * feat: user * fix --- .prettierrc.yml | 1 + packages/api-types/src/common.ts | 80 ----- .../api-types/src/v10/application-command.ts | 149 +++++++++ packages/api-types/src/v10/application.ts | 74 +++++ packages/api-types/src/v10/audit-log.ts | 292 ++++++++++++++++++ packages/api-types/src/v10/auto-moderation.ts | 91 ++++++ packages/api-types/src/v10/channel.ts | 27 ++ packages/api-types/src/v10/common.ts | 109 +++++++ packages/api-types/src/v10/interaction.ts | 216 +++++++++++++ .../api-types/src/v10/message-component.ts | 125 ++++++++ packages/api-types/src/v10/user.ts | 86 ++++++ packages/api-types/tsconfig.json | 2 +- 12 files changed, 1171 insertions(+), 81 deletions(-) create mode 100644 packages/api-types/src/v10/application-command.ts create mode 100644 packages/api-types/src/v10/application.ts create mode 100644 packages/api-types/src/v10/audit-log.ts create mode 100644 packages/api-types/src/v10/auto-moderation.ts create mode 100644 packages/api-types/src/v10/channel.ts create mode 100644 packages/api-types/src/v10/common.ts create mode 100644 packages/api-types/src/v10/interaction.ts create mode 100644 packages/api-types/src/v10/message-component.ts create mode 100644 packages/api-types/src/v10/user.ts diff --git a/.prettierrc.yml b/.prettierrc.yml index 087aee0..6b09b36 100644 --- a/.prettierrc.yml +++ b/.prettierrc.yml @@ -1,2 +1,3 @@ arrowParens: 'avoid' singleQuote: true +printWidth: 120 \ No newline at end of file diff --git a/packages/api-types/src/common.ts b/packages/api-types/src/common.ts index 401b75e..c65cb7d 100644 --- a/packages/api-types/src/common.ts +++ b/packages/api-types/src/common.ts @@ -1,27 +1,3 @@ -/** https://discord.com/developers/docs/resources/user#user-object-premium-types */ -export enum PremiumTypes { - None, - NitroClassic, - Nitro, -} - -/** https://discord.com/developers/docs/resources/user#user-object-user-flags */ -export enum UserFlags { - DiscordEmployee = 1 << 0, - PartneredServerOwner = 1 << 1, - HypeSquadEventsMember = 1 << 2, - BugHunterLevel1 = 1 << 3, - HouseBravery = 1 << 6, - HouseBrilliance = 1 << 7, - HouseBalance = 1 << 8, - EarlySupporter = 1 << 9, - TeamUser = 1 << 10, - BugHunterLevel2 = 1 << 14, - VerifiedBot = 1 << 16, - EarlyVerifiedBotDeveloper = 1 << 17, - DiscordCertifiedModerator = 1 << 18, - BotHttpInteractions = 1 << 19, -} /** https://discord.com/developers/docs/resources/channel#channels-resource */ export enum ChannelFlags { @@ -49,38 +25,6 @@ export enum TeamMembershipStates { Accepted, } -/** https://discord.com/developers/docs/topics/oauth2#application-application-flags */ -export enum ApplicationFlags { - /** Intent required for bots in **100 or more servers** to receive [`presence_update` events](#DOCS_TOPICS_GATEWAY/presence-update) */ - GatewayPresence = 1 << 12, - /** Intent required for bots in under 100 servers to receive [`presence_update` events](#DOCS_TOPICS_GATEWAY/presence-update), found in Bot Settings */ - GatewayPresenceLimited = 1 << 13, - /** Intent required for bots in **100 or more servers** to receive member-related events like `guild_member_add`. See list of member-related events [under `GUILD_MEMBERS`](#DOCS_TOPICS_GATEWAY/list-of-intents) */ - GatewayGuildMembers = 1 << 14, - /** Intent required for bots in under 100 servers to receive member-related events like `guild_member_add`, found in Bot Settings. See list of member-related events [under `GUILD_MEMBERS`](#DOCS_TOPICS_GATEWAY/list-of-intents) */ - GatewayGuildMembersLimited = 1 << 15, - /** Indicates unusual growth of an app that prevents verification */ - VerificationPendingGuildLimit = 1 << 16, - /** Indicates if an app is embedded within the Discord client (currently unavailable publicly) */ - Embedded = 1 << 17, - /** Intent required for bots in **100 or more servers** to receive [message content](https://support-dev.discord.com/hc/en-us/articles/4404772028055) */ - GatewayMessageCount = 1 << 18, - /** Intent required for bots in under 100 servers to receive [message content](https://support-dev.discord.com/hc/en-us/articles/4404772028055), found in Bot Settings */ - GatewayMessageContentLimited = 1 << 19, -} - -/** https://discord.com/developers/docs/interactions/message-components#component-types */ -export enum MessageComponentTypes { - /** A container for other components */ - ActionRow = 1, - /** A button object */ - Button = 2, - /** A select menu for picking from choices */ - SelectMenu = 3, - /** A text input object */ - InputText = 4, -} - export enum TextStyles { /** Intended for short single-line text */ Short = 1, @@ -1050,24 +994,6 @@ export const Intents = GatewayIntents; // eslint-disable-next-line @typescript-eslint/no-redeclare export type Intents = GatewayIntents; -/** https://discord.com/developers/docs/interactions/slash-commands#interaction-response-interactionresponsetype */ -export enum InteractionResponseTypes { - /** ACK a `Ping` */ - Pong = 1, - /** Respond to an interaction with a message */ - ChannelMessageWithSource = 4, - /** ACK an interaction and edit a response later, the user sees a loading state */ - DeferredChannelMessageWithSource = 5, - /** For components, ACK an interaction and edit the original message later; the user does not see a loading state */ - DeferredUpdateMessage = 6, - /** For components, edit the message the component was attached to */ - UpdateMessage = 7, - /** For Application Command Options, send an autocomplete result */ - ApplicationCommandAutocompleteResult = 8, - /** For Command or Component interactions, send a Modal response */ - Modal = 9, -} - export enum Errors { // Bot Role errors BOTS_HIGHEST_ROLE_TOO_LOW = 'BOTS_HIGHEST_ROLE_TOO_LOW', @@ -1276,12 +1202,6 @@ export type Camelize = { : never; }; -export type PickPartial = { - [P in keyof T]?: T[P] | undefined; -} & { [P in K]: T[P] }; - export type OmitFirstFnArg = F extends (x: any, ...args: infer P) => infer R ? (...args: P) => R : never; - -export type Snowflake = string; diff --git a/packages/api-types/src/v10/application-command.ts b/packages/api-types/src/v10/application-command.ts new file mode 100644 index 0000000..5b20f81 --- /dev/null +++ b/packages/api-types/src/v10/application-command.ts @@ -0,0 +1,149 @@ +import type { ChannelTypes } from './channel'; +import type { Snowflake, Localizations, DiscordBase } from './common'; + +/** @link https://discord.com/developers/docs/interactions/application-commands#application-command-object-application-command-structure */ +export interface ApplicationCommand extends ApplicationCommandLocalizations, DiscordBase { + /** Type of command, defaults to 1 */ + type?: ApplicationCommandTypes; + /** ID of the parent application */ + applicationId: Snowflake; + /** Guild id of the command, if not global */ + guild_id?: Snowflake; + /** Name of command, 1-32 characters */ + name: string; + /** + * Description for CHAT_INPUT commands, 1-100 characters. + * Empty string for USER and MESSAGE commands + */ + description: string; + /** Set of permissions represented as a bit set */ + default_member_permissions?: string; + /** + * Indicates whether the command is available in DMs with the app, + * only for globally-scoped commands. By default, commands are visible. + */ + dm_permission?: boolean; + /** Indicates whether the command is enabled by default when the app is added to a guild, defaults to true + * @deprecated + */ + default_permission?: boolean; + /** Autoincrementing version identifier updated during substantial record changes */ + readonly version: number; +} + +export interface ApplicationCommandLocalizations { + /** + * Localization dictionary for name field. + * Values follow the same restrictions as name + */ + name_localizations?: Localizations; + /** + * Localization dictionary for description field. + * Values follow the same restrictions as description + */ + description_localizations?: Localizations; +} + +export interface ApplicationChatInputCommand extends ApplicationCommand { + options?: T[]; +} + +export interface ApplicationUserCommand extends ApplicationCommand {} + +export interface ApplicationMessageCommand extends ApplicationCommand {} + +export type DiscordApplicationCommand = ApplicationMessageCommand | ApplicationUserCommand | ApplicationChatInputCommand; + +/** @link https://discord.com/developers/docs/interactions/application-commands#application-command-object-application-command-option-structure */ +export interface ApplicationCommandOption extends ApplicationCommandLocalizations { + /** Type of option */ + type: ApplicationCommandOptionTypes; + /** 1-32 character name */ + name: string; + /** 1-100 character description */ + description: string; + /** If the parameter is required or optional, by default false */ + required?: boolean; + /** If autocomplete interactions are enabled */ + autocomplete?: boolean; +} + +export interface ApplicationCommandWithOptions + extends Omit { + options: T[]; +} + +export type ApplicationCommandSubCommandOption = ApplicationCommandWithOptions; + +export type ApplicationCommandSubGroupOption = ApplicationCommandWithOptions; + +export interface ApplicationCommandStringOption extends ApplicationCommandOption { + type: ApplicationCommandOptionTypes.String; + /** The minimum allowed length (minimum of 0) */ + min_length?: number; + /** The maximum allowed length (maximum of 6000) */ + max_length?: number; +} + +export interface ApplicationCommandIntegerOrNumberOption extends ApplicationCommandOption { + type: ApplicationCommandOptionTypes.Integer | ApplicationCommandOptionTypes.Number; + /** The minimum value permitted */ + min_value?: number; + /** The maximum value permitted */ + max_value?: number; +} + +export interface ApplicationCommandChannelOption extends ApplicationCommandOption { + type: ApplicationCommandOptionTypes.Channel; + /** If the option is a channel type, the channels shown will be restricted to these types */ + channel_types: ChannelTypes[]; +} + +/** @link https://discord.com/developers/docs/interactions/application-commands#application-command-object-application-command-option-choice-structure */ +export interface ApplicationCommandOptionChoice + extends Omit { + /** 1-100 character choice name */ + name: string; + /** Value for the choice, up to 100 characters if string */ + value: string | number; +} + +export interface ApplicationCommandWithChoices extends Omit { + choices: ApplicationCommandOptionChoice[]; +} + +export type ApplicationCommandOptions = + | ApplicationCommandChannelOption + | ApplicationCommandWithChoices + | ApplicationCommandIntegerOrNumberOption + | ApplicationCommandStringOption; + +/** @link https://discord.com/developers/docs/interactions/application-commands#application-command-object-application-command-types */ +export enum ApplicationCommandTypes { + /** A text-based command that shows up when a user types `/` */ + ChatInput = 1, + /** A UI-based command that shows up when you right click or tap on a user */ + User, + /** A UI-based command that shows up when you right click or tap on a message */ + Message, +} + +/** @link https://discord.com/developers/docs/interactions/slash-commands#applicationcommandoptiontype */ +export enum ApplicationCommandOptionTypes { + SubCommand = 1, + SubCommandGroup, + String, + /** Any integer between -2^53 and 2^53 */ + Integer, + Boolean, + User, + /** Includes all channel types + categories */ + Channel, + Role, + /** Includes users and roles */ + Mentionable, + /** Any double between -2^53 and 2^53 */ + Number, + /** attachment object */ + Attachment, +} diff --git a/packages/api-types/src/v10/application.ts b/packages/api-types/src/v10/application.ts new file mode 100644 index 0000000..f86a93a --- /dev/null +++ b/packages/api-types/src/v10/application.ts @@ -0,0 +1,74 @@ +import type { Snowflake, DiscordBase } from './common'; +import type { DiscordUser } from './user'; + +/** @link https://discord.com/developers/docs/resources/application#application-object-application-structure */ +export interface DiscordApplication extends DiscordBase { + /** the name of the app */ + name: string; + /** the icon hash of the app */ + icon: string | null; + /** the description of the app */ + description: string; + /** an array of rpc origin urls, if rpc is enabled */ + rpc_origins?: string[]; + /** when false only app owner can join the app's bot to guilds */ + bot_public: boolean; + /** when true the app's bot will only join upon completion of the full oauth2 code grant flow */ + bot_require_code_grant: boolean; + /** the url of the app's terms of service */ + terms_of_service_url?: string; + /** the url of the app's privacy policy */ + privacy_police_url?: string; + /** partial user object containing info on the owner of the application */ + owner: Partial; + /** @deprecated and will be removed in v11. An empty string. */ + summary: string; + /** the hex encoded key for verification in interactions and the GameSDK's */ + veify_key: string; + /** if the application belongs to a team, this will be a list of the members of that team */ + team: any | null; + /** if this application is a game sold on Discord, this field will be the guild to which it has been linked */ + guild_id?: Snowflake; + /** if this application is a game sold on Discord, this field will be the id of the "Game SKU" that is created, if exists */ + primary_sku_id?: Snowflake; + /** if this application is a game sold on Discord, this field will be the URL slug that links to the store page */ + slug?: string; + /** the application's default rich presence invite cover image hash */ + cover_image?: string; + /** the application's public flags */ + flags?: DiscordApplicationFlags; + /** up to 5 tags describing the content and functionality of the application */ + tags?: string[]; + /** settings for the application's default in-app authorization link, if enabled */ + install_params?: DiscordApplicationInstallParams; + /** the application's default custom authorization link, if enabled */ + custom_install_url?: string; +} + +/** @link https://discord.com/developers/docs/resources/application#application-object-application-flags */ +export enum DiscordApplicationFlags { + /** Intent required for bots in **100 or more servers** to receive [`presence_update` events](#DOCS_TOPICS_GATEWAY/presence-update) */ + GatewayPresence = 1 << 12, + /** Intent required for bots in under 100 servers to receive [`presence_update` events](#DOCS_TOPICS_GATEWAY/presence-update), found in Bot Settings */ + GatewayPresenceLimited = 1 << 13, + /** Intent required for bots in **100 or more servers** to receive member-related events like `guild_member_add`. See list of member-related events [under `GUILD_MEMBERS`](#DOCS_TOPICS_GATEWAY/list-of-intents) */ + GatewayGuildMembers = 1 << 14, + /** Intent required for bots in under 100 servers to receive member-related events like `guild_member_add`, found in Bot Settings. See list of member-related events [under `GUILD_MEMBERS`](#DOCS_TOPICS_GATEWAY/list-of-intents) */ + GatewayGuildMembersLimited = 1 << 15, + /** Indicates unusual growth of an app that prevents verification */ + VerificationPendingGuildLimit = 1 << 16, + /** Indicates if an app is embedded within the Discord client (currently unavailable publicly) */ + Embedded = 1 << 17, + /** Intent required for bots in **100 or more servers** to receive [message content](https://support-dev.discord.com/hc/en-us/articles/4404772028055) */ + GatewayMessageCount = 1 << 18, + /** Intent required for bots in under 100 servers to receive [message content](https://support-dev.discord.com/hc/en-us/articles/4404772028055), found in Bot Settings */ + GatewayMessageContentLimited = 1 << 19, +} + +/** @link https://discord.com/developers/docs/resources/application#install-params-object-install-params-structure */ +export interface DiscordApplicationInstallParams { + /** the scopes to add the application to the server with */ + scopes: string[]; + /** the permissions to request for the bot role */ + permissions: string; +} diff --git a/packages/api-types/src/v10/audit-log.ts b/packages/api-types/src/v10/audit-log.ts new file mode 100644 index 0000000..272c377 --- /dev/null +++ b/packages/api-types/src/v10/audit-log.ts @@ -0,0 +1,292 @@ +// TODO: WAITING OTHER OBJECTS + +import type { DiscordApplicationCommand } from './application-command'; + + /** @link https://discord.com/developers/docs/resources/audit-log#audit-log-object */ +export interface DiscordAuditLog { + /** List of application commands referenced in the audit log */ + application_commands: DiscordApplicationCommand[]; + /** List of audit log entries, sorted from most to least recent */ + audit_log_entries: DiscordAuditLogEntry[]; + +} + +/** @link https://discord.com/developers/docs/resources/audit-log#audit-log-entry-object-audit-log-entry-structure */ +export interface DiscordAuditLogEntry { + /** ID of the affected entity (webhook, user, role, etc.) */ + target_id: string | null; + /** Changes made to the `target_id` */ + changes?: DiscordAuditLogChange[]; + /** User or app that made the changes */ + user_id: string | null; + /** ID of the entry */ + id: string; + /** Type of action that occurred */ + action_type: AuditLogEvents; + /** Additional info for certain event types */ + options?: DiscordOptionalAuditEntryInfo; + /** Reason for the change (1-512 characters) */ + reason?: string; +} + +/** @link https://discord.com/developers/docs/resources/audit-log#audit-log-change-object-audit-log-change-structure */ +export type DiscordAuditLogChange = + | { + new_value: string; + old_value: string; + key: + | 'name' + | 'description' + | 'discovery_splash_hash' + | 'banner_hash' + | 'preferred_locale' + | 'rules_channel_id' + | 'public_updates_channel_id' + | 'icon_hash' + | 'image_hash' + | 'splash_hash' + | 'owner_id' + | 'region' + | 'afk_channel_id' + | 'vanity_url_code' + | 'widget_channel_id' + | 'system_channel_id' + | 'topic' + | 'application_id' + | 'permissions' + | 'allow' + | 'deny' + | 'code' + | 'channel_id' + | 'inviter_id' + | 'nick' + | 'avatar_hash' + | 'id' + | 'location' + | 'command_id'; + } + | { + new_value: number; + old_value: number; + key: + | 'afk_timeout' + | 'mfa_level' + | 'verification_level' + | 'explicit_content_filter' + | 'default_message_notifications' + | 'prune_delete_days' + | 'position' + | 'bitrate' + | 'rate_limit_per_user' + | 'color' + | 'max_uses' + | 'uses' + | 'max_age' + | 'expire_behavior' + | 'expire_grace_period' + | 'user_limit' + | 'privacy_level' + | 'auto_archive_duration' + | 'default_auto_archive_duration' + | 'entity_type' + | 'status' + | 'communication_disabled_until'; + } + | { + new_value: Partial[]; // Role + old_value?: Partial[]; // Role + key: '$add' | '$remove'; + } + | { + new_value: boolean; + old_value: boolean; + key: + | 'widget_enabled' + | 'nsfw' + | 'hoist' + | 'mentionable' + | 'temporary' + | 'deaf' + | 'mute' + | 'enable_emoticons' + | 'archived' + | 'locked' + | 'invitable'; + } + | { + new_value: any[]; // Overwrite + old_value: any[]; // Overwrite + key: 'permission_overwrites'; + } + | { + new_value: string | number; + old_value: string | number; + key: 'type'; + }; + +/** @link https://discord.com/developers/docs/resources/audit-log#audit-log-entry-object-optional-audit-entry-info */ +export interface DiscordOptionalAuditEntryInfo { + /** + * Number of days after which inactive members were kicked. + * + * Event types: `MEMBER_PRUNE` + */ + delete_member_days: string; + /** + * Number of members removed by the prune. + * + * Event types: `MEMBER_PRUNE` + */ + members_removed: string; + /** + * Channel in which the entities were targeted. + * + * Event types: `MEMBER_MOVE`, `MESSAGE_PIN`, `MESSAGE_UNPIN`, `MESSAGE_DELETE`, `STAGE_INSTANCE_CREATE`, `STAGE_INSTANCE_UPDATE`, `STAGE_INSTANCE_DELETE` + */ + channel_id: string; + /** + * ID of the message that was targeted. + * + * Event types: `MESSAGE_PIN`, `MESSAGE_UNPIN`, `STAGE_INSTANCE_CREATE`, `STAGE_INSTANCE_UPDATE`, `STAGE_INSTANCE_DELETE` + */ + message_id: string; + /** + * Number of entities that were targeted. + * + * Event types: `MESSAGE_DELETE`, `MESSAGE_BULK_DELETE`, `MEMBER_DISCONNECT`, `MEMBER_MOVE` + */ + count: string; + /** + * ID of the overwritten entity. + * + * Event types: `CHANNEL_OVERWRITE_CREATE`, `CHANNEL_OVERWRITE_UPDATE`, `CHANNEL_OVERWRITE_DELETE` + */ + id: string; + /** + * Type of overwritten entity - "0", for "role", or "1" for "member". + * + * Event types: `CHANNEL_OVERWRITE_CREATE`, `CHANNEL_OVERWRITE_UPDATE`, `CHANNEL_OVERWRITE_DELETE` + */ + type: string; + /** + * Name of the role if type is "0" (not present if type is "1"). + * + * Event types: `CHANNEL_OVERWRITE_CREATE`, `CHANNEL_OVERWRITE_UPDATE`, `CHANNEL_OVERWRITE_DELETE` + */ + role_name: string; + /** + * ID of the app whose permissions were targeted. + * + * Event types: `APPLICATION_COMMAND_PERMISSION_UPDATE` + */ + application_id: string; +} + + +/** @link https://discord.com/developers/docs/resources/audit-log#audit-log-entry-object-audit-log-events */ +export enum AuditLogEvents { + /** Server settings were updated */ + GuildUpdate = 1, + /** Channel was created */ + ChannelCreate = 10, + /** Channel settings were updated */ + ChannelUpdate, + /** Channel was deleted */ + ChannelDelete, + /** Permission overwrite was added to a channel */ + ChannelOverwriteCreate, + /** Permission overwrite was updated for a channel */ + ChannelOverwriteUpdate, + /** Permission overwrite was deleted from a channel */ + ChannelOverwriteDelete, + /** Member was removed from server */ + MemberKick = 20, + /** Members were pruned from server */ + MemberPrune, + /** Member was banned from server */ + MemberBanAdd, + /** Server ban was lifted for a member */ + MemberBanRemove, + /** Member was updated in server */ + MemberUpdate, + /** Member was added or removed from a role */ + MemberRoleUpdate, + /** Member was moved to a different voice channel */ + MemberMove, + /** Member was disconnected from a voice channel */ + MemberDisconnect, + /** Bot user was added to server */ + BotAdd, + /** Role was created */ + RoleCreate = 30, + /** Role was edited */ + RoleUpdate, + /** Role was deleted */ + RoleDelete, + /** Server invite was created */ + InviteCreate = 40, + /** Server invite was updated */ + InviteUpdate, + /** Server invite was deleted */ + InviteDelete, + /** Webhook was created */ + WebhookCreate = 50, + /** Webhook properties or channel were updated */ + WebhookUpdate, + /** Webhook was deleted */ + WebhookDelete, + /** Emoji was created */ + EmojiCreate = 60, + /** Emoji name was updated */ + EmojiUpdate, + /** Emoji was deleted */ + EmojiDelete, + /** Single message was deleted */ + MessageDelete = 72, + /** Multiple messages were deleted */ + MessageBulkDelete, + /** Messaged was pinned to a channel */ + MessagePin, + /** Message was unpinned from a channel */ + MessageUnpin, + /** App was added to server */ + IntegrationCreate = 80, + /** App was updated (as an example, its scopes were updated) */ + IntegrationUpdate, + /** App was removed from server */ + IntegrationDelete, + /** Stage instance was created (stage channel becomes live) */ + StageInstanceCreate, + /** Stage instace details were updated */ + StageInstanceUpdate, + /** Stage instance was deleted (stage channel no longer live) */ + StageInstanceDelete, + /** Sticker was created */ + StickerCreate = 90, + /** Sticker details were updated */ + StickerUpdate, + /** Sticker was deleted */ + StickerDelete, + /** Event was created */ + GuildScheduledEventCreate = 100, + /** Event was updated */ + GuildScheduledEventUpdate, + /** Event was cancelled */ + GuildScheduledEventDelete, + /** Thread was created in a channel */ + ThreadCreate = 110, + /** Thread was updated */ + ThreadUpdate, + /** Thread was deleted */ + ThreadDelete, + /** Permissions were updated for a command */ + ApplicationCommandPermissionUpdate = 121, + /** Auto moderation rule was created */ + AutoModerationRuleCreate = 140, + /** Auto moderation rule was updated */ + AutoModerationRuleUpdate, + /** Auto moderation rule was deleted */ + AutoModerationRuleDelete, + /** Message was blocked by AutoMod according to a rule. */ + AutoModerationBlockMessage, +} diff --git a/packages/api-types/src/v10/auto-moderation.ts b/packages/api-types/src/v10/auto-moderation.ts new file mode 100644 index 0000000..d169798 --- /dev/null +++ b/packages/api-types/src/v10/auto-moderation.ts @@ -0,0 +1,91 @@ +import type { Snowflake, DiscordBase } from './common'; + + +/** @link https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-rule-object-auto-moderation-rule-structure */ +export interface DiscordAutoModerationRule extends DiscordBase { + /** the id of the guild which this rule belongs to */ + guild_id: Snowflake; + /** the rule name */ + name: string; + /** the user which first created this rule */ + creator_id: Snowflake; + /** the rule event type */ + event_type: AutoModerationEventTypes; + /** the rule trigger type */ + trigger_type: AutoModerationTriggerTypes; + /** the rule trigger metadata */ + trigger_metadata: AutoModerationTriggerMetadata; + /** the actions which will execute when the rule is triggered */ + actions: AutoModerationAction[]; + /** whether the rule is enabled */ + enabled: boolean; + /** the role ids that should not be affected by the rule (Maximum of 20) */ + exempt_roles: Snowflake[]; + /** the channel ids that should not be affected by the rule (Maximum of 50) */ + exempt_channels: Snowflake[]; +} + +/** @link https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-action-object-auto-moderation-action-structure */ +export interface AutoModerationAction { + /** the type of action */ + type: AutoModerationActionTypes; + /** additional metadata needed during execution for this specific action type */ + metadata?: AutoModerationActionMetadata; +} + +/** @link https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-action-object-action-types */ +export enum AutoModerationActionTypes { + /** blocks the content of a message according to the rule */ + BLOCK_MESSAGE = 1, + /** logs user content to a specified channel */ + SEND_ALERT_MESSAGE, + /** timeout user for a specified duration */ + TIMEOUT, +} + +/** @link https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-action-object-action-metadata */ +export interface AutoModerationActionMetadata { + /** channel to which user content should be logged */ + channel_id: Snowflake; + /** timeout duration in seconds. Maximum of 2419200 seconds (4 weeks) */ + duration_seconds: number; +} + +/** @link https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-rule-object-trigger-metadata */ +export interface AutoModerationTriggerMetadata { + /** substrings which will be searched for in content */ + keyword_filter: string[]; + /** the internally pre-defined wordsets which will be searched for in content */ + presents: AutoModerationKeywordPresetTypes[]; + /** substrings which will be exempt from triggering the preset trigger type */ + allow_list: string[]; + /** total number of mentions (role & user) allowed per message (Maximum of 50) */ + mention_total_spam: number; +} + +/** @link https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-rule-object-keyword-preset-types */ +export enum AutoModerationKeywordPresetTypes { + /** Words that may be considered forms of swearing or cursin */ + PROFANITY = 1, + /** Words that refer to sexually explicit behavior or activity */ + SEXUAL_CONTENT, + /** Personal insults or words that may be considered hate speech */ + SLURS, +} + +/** @link https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-rule-object-trigger-types */ +export enum AutoModerationTriggerTypes { + /** check if content contains words from a user defined list of keywords */ + KEYWORD = 1, + /** check if content represents generic spam */ + SPAM = 3, + /** check if content contains words from internal pre-defined wordsets*/ + KEYWORD_PRESET = 4, + /** check if content contains more mentions than allowed */ + MENTION_SPAM = 5 +} + +/** @link https://discord.com/developers/docs/resources/auto-moderation#auto-moderation-rule-object-event-types */ +export enum AutoModerationEventTypes { + MESSAGE_SEND = 1, +} diff --git a/packages/api-types/src/v10/channel.ts b/packages/api-types/src/v10/channel.ts new file mode 100644 index 0000000..e1a67cd --- /dev/null +++ b/packages/api-types/src/v10/channel.ts @@ -0,0 +1,27 @@ +/** @link https://discord.com/developers/docs/resources/channel#channel-object-channel-types */ +export enum ChannelTypes { + /** A text channel within a server */ + GuildText, + /** A direct message between users */ + DM, + /** A voice channel within a server */ + GuildVoice, + /** A direct message between multiple users */ + GroupDm, + /** An organizational category that contains up to 50 channels */ + GuildCategory, + /** A channel that users can follow and crosspost into their own server */ + GuildNews, + /** A temporary sub-channel within a GUILD_NEWS channel */ + GuildNewsThread = 10, + /** A temporary sub-channel within a GUILD_TEXT channel */ + GuildPublicThread, + /** A temporary sub-channel within a GUILD_TEXT channel that is only viewable by those invited and those with the MANAGE_THREADS permission */ + GuildPrivateThread, + /** A voice channel for hosting events with an audience */ + GuildStageVoice, + /** A channel in a hub containing the listed servers */ + GuildDirectory, + /** A channel which can only contains threads */ + GuildForum, +} diff --git a/packages/api-types/src/v10/common.ts b/packages/api-types/src/v10/common.ts new file mode 100644 index 0000000..3132c69 --- /dev/null +++ b/packages/api-types/src/v10/common.ts @@ -0,0 +1,109 @@ + +/** @link https://discord.com/developers/docs/resources/emoji#emoji-object */ +export interface DiscordEmoji { + name: string | null; + id: Snowflake; + // TODO ROLE + roles?: Record[]; + // TODO USER + user?: Record; + require_colons?: boolean; + managed?: boolean; + animated?: boolean; + available?: boolean; +} + +export type DiscordPartialEmoji = Partial>; + +export type Localizations = Partial>; + +/** @link https://discord.com/developers/docs/interactions/slash-commands#interaction-interactiontype */ +export enum InteractionTypes { + Ping = 1, + ApplicationCommand = 2, + MessageComponent = 3, + ApplicationCommandAutocomplete = 4, + ModalSubmit = 5, +} + +/** @link https://discord.com/developers/docs/resources/user#user-object-premium-types */ +export enum PremiumTypes { + None, + NitroClassic, + Nitro, +} + +/** @link https://discord.com/developers/docs/resources/user#user-object-user-flags */ +export enum UserFlags { + DiscordEmployee = 1 << 0, + PartneredServerOwner = 1 << 1, + HypeSquadEventsMember = 1 << 2, + BugHunterLevel1 = 1 << 3, + HouseBravery = 1 << 6, + HouseBrilliance = 1 << 7, + HouseBalance = 1 << 8, + EarlySupporter = 1 << 9, + TeamUser = 1 << 10, + BugHunterLevel2 = 1 << 14, + VerifiedBot = 1 << 16, + EarlyVerifiedBotDeveloper = 1 << 17, + DiscordCertifiedModerator = 1 << 18, + BotHttpInteractions = 1 << 19, +} + +/** @link https://discord.com/developers/docs/resources/user#connection-object-visibility-types */ +export enum VisibilityTypes { + /** Invisible to everyone except the user themselves */ + None, + /** Visible to everyone */ + Everyone, +} + +export enum Locales { + Danish = 'da', + German = 'de', + EnglishUk = 'en-GB', + EnglishUs = 'en-US', + Spanish = 'es-ES', + French = 'fr', + Croatian = 'hr', + Italian = 'it', + Lithuanian = 'lt', + Hungarian = 'hu', + Dutch = 'nl', + Norwegian = 'no', + Polish = 'pl', + PortugueseBrazilian = 'pt-BR', + RomanianRomania = 'ro', + Finnish = 'fi', + Swedish = 'sv-SE', + Vietnamese = 'vi', + Turkish = 'tr', + Czech = 'cs', + Greek = 'el', + Bulgarian = 'bg', + Russian = 'ru', + Ukrainian = 'uk', + Hindi = 'hi', + Thai = 'th', + ChineseChina = 'zh-CN', + Japanese = 'ja', + ChineseTaiwan = 'zh-TW', + Korean = 'ko', +} + +export interface DiscordBase { + /** Unique ID of the object */ + id: Snowflake; +} + +/** + * Discord utilizes Twitter's snowflake format for uniquely identifiable descriptors (IDs). + * These IDs are guaranteed to be unique across all of Discord, + * except in some unique scenarios in which child objects share their parent's ID. + */ + export type Snowflake = string; + + export type PickPartial = { + [P in keyof T]?: T[P] | undefined; +} & { [P in K]: T[P] }; diff --git a/packages/api-types/src/v10/interaction.ts b/packages/api-types/src/v10/interaction.ts new file mode 100644 index 0000000..057606d --- /dev/null +++ b/packages/api-types/src/v10/interaction.ts @@ -0,0 +1,216 @@ +import type { + ApplicationCommandTypes, + ApplicationCommandOptionTypes, + ApplicationCommandOptionChoice, +} from './application-command'; +import type { DiscordBase, Snowflake, InteractionTypes, Locales } from './common'; +import type { + DiscordSelectMenuOption, + MessageComponentTypes, + DiscordMessageComponents, + DiscordActionRowComponent, + DiscordTextInput, +} from './message-component'; +import type { DiscordUser } from './user'; + +/** @link https://discord.com/developers/docs/interactions/receiving-and-responding#interaction-object-interaction-structure */ +export interface DiscordInteraction extends DiscordBase { + /** ID of the application this interaction is for */ + application_id: Snowflake; + /** Type of interaction */ + type: InteractionTypes; + /** Guild that the interaction was sent from */ + guild_id?: Snowflake; + /** Channel that the interaction was sent from */ + channel_id?: Snowflake; + /** Continuation token for responding to the interaction */ + token: string; + /** Read-only property, always 1 */ + readonly version: number; + /** Bitwise set of permissions the app or bot has within the channel the interaction was sent from */ + app_permissions?: string; + /** Selected language of the invoking user */ + locale?: `${Locales}`; + /** Guild's preferred locale, if invoked in a guild */ + guild_locale?: `${Locales}`; +} + +export interface DiscordInteractionWithMember extends DiscordInteraction { + /** Guild member data for the invoking user, including permissions */ + member: Record; +} + +export interface DiscordInteractionWithUser extends DiscordInteraction { + /** User object for the invoking user, if invoked in a DM */ + user: DiscordUser; +} + +export interface DiscordApplicationCommandInteraction extends DiscordInteraction { + type: InteractionTypes.ApplicationCommand; + /** Interaction data payload */ + data?: DiscordApplicationCommandInteractionData; +} + +export interface DiscordComponentInteraction extends DiscordInteraction { + type: InteractionTypes.MessageComponent; + /** the message they were attached to */ + message: Record; + /** Interaction data payload */ + data?: DiscordMessageComponentInteractionData | DiscordMessageSelectMenuInteractionData; +} + +export type DiscordComponentInteractionWithUser = DiscordComponentInteraction & { user: DiscordUser }; + +export type DiscordComponentInteractionWithMember = DiscordComponentInteraction & { member: any }; + +/** @link https://discord.com/developers/docs/interactions/receiving-and-responding#message-interaction-object-message-interaction-structure */ + +export interface DiscordMessageInteraction extends DiscordBase { + type: InteractionTypes; + name: string; +} + +export type DiscordMessageInteractionWithUser = DiscordComponentInteraction & { user: DiscordUser }; + +export type DiscordMessageInteractionWithMember = DiscordComponentInteraction & { member: any }; + +/** @link https://discord.com/developers/docs/interactions/receiving-and-responding#interaction-object-application-command-data-structure */ +export interface DiscordApplicationCommandInteractionData extends DiscordBase { + /** the name of the invoked command */ + name: string; + /** the type of the invoked command */ + type: ApplicationCommandTypes; + /** converted users + roles + channels + attachments */ + resolved?: DiscordInteractionCommandDataResolved; + /** the params + values from the user */ + options?: DiscordApplicationCommandInteractionDataOption[]; + /** the id of the guild the command is registered to */ + guild_id?: Snowflake; + /** id of the user or message targeted by a user or message command */ + target_id?: Snowflake; +} + +export interface DiscordInteractionCommandAutocompleteData + extends Omit { + options?: Partial[]; +} + +/** @link https://discord.com/developers/docs/interactions/receiving-and-responding#interaction-object-application-command-interaction-data-option-structure */ +export interface DiscordApplicationCommandInteractionDataOption { + /** Name of the parameter */ + name: string; + /** Value of application command option type */ + type: ApplicationCommandOptionTypes; + /** Value of the option resulting from user input */ + value?: string | number; + /** Present if this option is a group or subcommand */ + options?: DiscordApplicationCommandInteractionDataOption[]; + /** true if this option is the currently focused option for autocomplete */ + focused?: boolean; +} + +/** @link https://discord.com/developers/docs/interactions/receiving-and-responding#interaction-object-message-component-data-structure */ +export interface DiscordMessageComponentInteractionData { + /** the custom_id of the component */ + custom_id: string; + /** the type of the component */ + component_type: MessageComponentTypes; +} + +export interface DiscordMessageSelectMenuInteractionData extends DiscordMessageComponentInteractionData { + component_type: MessageComponentTypes.SelectMenu; + /** values the user selected in a select menu component */ + values: DiscordSelectMenuOption[]; +} + +/** @link https://discord.com/developers/docs/interactions/receiving-and-responding#interaction-object-modal-submit-data-structure */ +export interface DIscordModalSubmitData { + custom_id: string; + components: DiscordMessageComponents; +} + +// TODO object types +/** @link https://discord.com/developers/docs/interactions/receiving-and-responding#interaction-object-resolved-data-structure */ +export interface DiscordInteractionCommandDataResolved { + /** the ids and User objects */ + users?: Record; + /** the ids and partial Member objects */ + members?: Record; + /** the ids and Role objects */ + roles?: Record; + /** the ids and partial Channel objects */ + channels?: Record; + /** the ids and partial Message objects */ + messages?: Record; + /** the ids and attachment objects */ + attachments?: Record; +} + +/** @link https://discord.com/developers/docs/interactions/receiving-and-responding#interaction-response-object-interaction-response-structure */ +export interface DiscordInteractionResponse { + /** the type of response */ + type: InteractionResponseTypes; +} + +export interface DiscordInteractionMessageResponse extends DiscordInteractionResponse { + type: InteractionResponseTypes.ChannelMessageWithSource | InteractionResponseTypes.UpdateMessage; + /** an optional response message */ + data: DiscordInteractionMessages; +} + +/** @link https://discord.com/developers/docs/interactions/receiving-and-responding#interaction-response-object-autocomplete */ +export interface DiscordinteractionAutoCompleteResponse extends DiscordInteractionResponse { + type: InteractionResponseTypes.ApplicationCommandAutocompleteResult; + /** autocomplete choices (max of 25 choices) */ + choices: ApplicationCommandOptionChoice[]; +} + +/** @link https://discord.com/developers/docs/interactions/receiving-and-responding#interaction-response-object-modal */ +export interface DiscordInteractionModalResponse extends DiscordInteractionResponse { + type: InteractionResponseTypes.Modal; + /** a developer-defined identifier for the component, max 100 characters */ + custom_id: string; + /** the title of the popup modal, max 45 characters */ + title: string; + /** + * between 1 and 5 (inclusive) components that make up the modal + * Support for components in modals is currently limited to type 4 (Text Input). + */ + components: DiscordTextInput[]; +} + +/** @link https://discord.com/developers/docs/interactions/receiving-and-responding#interaction-response-object-messages */ +export interface DiscordInteractionMessages { + /** is the response TTS */ + tts?: boolean; + /** message content */ + content?: string; + /** supports up to 10 embeds */ + embeds?: any[]; + /** allowed mentions object */ + allowed_mentions: Record; + /** message flags combined as a bitfield */ + flags?: 64 | 4; + /** message components */ + components?: DiscordActionRowComponent[]; + /** attachment objects with filename and description */ + attachments?: Partial[]; +} + +/** @link https://discord.com/developers/docs/interactions/receiving-and-responding#interaction-response-object-interaction-callback-type */ +export enum InteractionResponseTypes { + /** ACK a `Ping` */ + Pong = 1, + /** Respond to an interaction with a message */ + ChannelMessageWithSource = 4, + /** ACK an interaction and edit a response later, the user sees a loading state */ + DeferredChannelMessageWithSource = 5, + /** For components, ACK an interaction and edit the original message later; the user does not see a loading state */ + DeferredUpdateMessage = 6, + /** For components, edit the message the component was attached to */ + UpdateMessage = 7, + /** For Application Command Options, send an autocomplete result */ + ApplicationCommandAutocompleteResult = 8, + /** For Command or Component interactions, send a Modal response */ + Modal = 9, +} diff --git a/packages/api-types/src/v10/message-component.ts b/packages/api-types/src/v10/message-component.ts new file mode 100644 index 0000000..e52787c --- /dev/null +++ b/packages/api-types/src/v10/message-component.ts @@ -0,0 +1,125 @@ +import type { DiscordPartialEmoji } from './common'; + +export interface BaseComponent { + /** type of the component */ + type: MessageComponentTypes; +} + +/** @link https://discord.com/developers/docs/interactions/message-components#action-rows */ +export interface DiscordActionRow extends BaseComponent { + type: MessageComponentTypes.ActionRow; + components: T[]; +} + +/** @link https://discord.com/developers/docs/interactions/message-components#buttons */ +export interface DiscordButton extends BaseComponent { + type: MessageComponentTypes.Button; + /** one of button styles */ + style: ButtonStyles; + /** text that appears on the button, max 80 characters */ + label?: string; + /** name, id, and animated */ + emoji?: DiscordPartialEmoji; + /** a developer-defined identifier for the button, max 100 characters */ + custom_id?: string; + /** whether the button is disabled (default false) */ + disabled?: boolean; +} + +export interface DiscordButtonLink extends Omit { + /** a url for link-style buttons */ + url?: string; +} + +/** @link https://discord.com/developers/docs/interactions/message-components#select-menu-object */ +export interface DiscordSelectMenu extends BaseComponent { + type: MessageComponentTypes.SelectMenu; + /** a developer-defined identifier for the select menu, max 100 characters */ + custom_id: string; + /** the choices in the select, max 25 */ + options: DiscordSelectMenuOption[]; + /** custom placeholder text if nothing is selected, max 150 characters */ + placeholder?: string; + /** the minimum number of items that must be chosen; default 1, min 0*/ + min_values?: number; + /** the maximum number of items that can be chosen; default 1, max 25 */ + max_values?: number; + /** disable the select, default false */ + disabled?: boolean; + +} + +/** @link https://discord.com/developers/docs/interactions/message-components#select-menu-object-select-option-structure */ +export interface DiscordSelectMenuOption { + /** the user-facing name of the option, max 100 characters */ + label: string; + /** the dev-defined value of the option, max 100 characters */ + value: string; + /** an additional description of the option, max 100 characters */ + description?: string; + /** id, name, and animated */ + emoji?: DiscordPartialEmoji; + /** will render this option as selected by default */ + default?: boolean; +} + +/** @link https://discord.com/developers/docs/interactions/message-components#text-inputs-text-input-structure */ +export interface DiscordTextInput extends BaseComponent { + type: MessageComponentTypes.TextInput; + /** a developer-defined identifier for the input, max 100 characters */ + custom_id?: string; + /** the Text Input Style */ + style: TextInputStyles; + /** the label for this component, max 45 characters */ + label: string; + /** the minimum input length for a text input, min 0, max 4000 */ + min_length?: number; + /** the maximum input length for a text input, min 1, max 4000 */ + max_length?: number; + /** whether this component is required to be filled, default true */ + required?: boolean; + /** a pre-filled value for this component, max 4000 characters */ + value?: string; + /** custom placeholder text if the input is empty, max 100 characters */ + placeholder?: string; +} + +export type DiscordMessageComponentsWithoutRow = DiscordButton | DiscordSelectMenu | DiscordTextInput; + +export type DiscordActionRowComponent = DiscordActionRow; + +export type DiscordMessageComponents = DiscordActionRowComponent | DiscordButton | DiscordSelectMenu | DiscordTextInput; + +/** @link https://discord.com/developers/docs/interactions/message-components#component-types */ +export enum MessageComponentTypes { + /** A container for other components */ + ActionRow = 1, + /** A button object */ + Button, + /** A select menu for picking from choices */ + SelectMenu, + /** A text input object */ + TextInput, +} + +/** @link https://discord.com/developers/docs/interactions/message-components#button-object-button-styles */ +export enum ButtonStyles { + /** blurple */ + Primary = 1, + /** grey */ + Secondary, + /** green */ + Success, + /** red */ + Danger, + /** grey, navigates to a URL */ + Link, +} + +/** @link https://discord.com/developers/docs/interactions/message-components#text-inputs-text-input-styles */ +export enum TextInputStyles { + /** A single-line input */ + Short = 1, + /** A multi-line input */ + Paragraph +} diff --git a/packages/api-types/src/v10/user.ts b/packages/api-types/src/v10/user.ts new file mode 100644 index 0000000..4258e4a --- /dev/null +++ b/packages/api-types/src/v10/user.ts @@ -0,0 +1,86 @@ +import type { DiscordBase, Locales, PremiumTypes, VisibilityTypes } from './common'; + +/** @link https://discord.com/developers/docs/resources/user#user-object-user-structure */ +export interface DiscordUser extends DiscordBase { + /** the user's username, not unique across the platform */ + username: string; + /** the user's 4-digit discord-tag */ + discriminator: string; + /** the user's avatar hash */ + avatar: string | null; + /** whether the user belongs to an OAuth2 application */ + bot?: boolean; + /** whether the user is an Official Discord System user (part of the urgent message system) */ + system?: boolean; + /** the user's banner hash */ + banner?: string | null; + /** the user's banner color encoded as an integer representation of hexadecimal color code */ + accent_color?: number | null; + /** the public flags on a user's account */ + public_flags?: number; +} + +export interface DiscordUserOAUTH2 extends DiscordUser { + /** whether the user has two factor enabled on their account */ + mfa_enabled?: boolean; + /** the user's chosen language option */ + locale: `${Locales}`; + /** the flags on a user's account */ + flags?: number; + /** the type of Nitro subscription on a user's account */ + premium_type?: PremiumTypes; +} + +export interface DiscordUserWithOAUTH2Email extends DiscordUserOAUTH2 { + /** whether the email on this account has been verified */ + verified?: boolean; + /** the user's email */ + email?: string | null; +} + +/** @link https://discord.com/developers/docs/resources/user#connection-object-connection-structure */ + +export interface DiscordConnection { + /** id of the connection account */ + id: string; + /** the username of the connection account */ + name: string; + /** the service of this connection */ + type: keyof typeof DiscordServices; + /** whether the connection is revoked */ + revoked?: boolean; + /** an array of partial server integrations */ + integrations?: any[]; // server integrations object + /** whether the connection is verified */ + verified: boolean; + /** whether friend sync is enabled for this connection */ + friend_sync: boolean; + /** whether activities related to this connection will be shown in presence updates */ + show_activity: boolean; + /** whether this connection has a corresponding third party OAuth2 token */ + two_way_link: boolean; + /** visibility of this connection */ + visibility: VisibilityTypes; + +} + +/** @link https://discord.com/developers/docs/resources/user#connection-object-services */ +export enum DiscordServices { + battlenet = 'Battle.net', + ebay = 'eBay', + epicgames = 'Epic Games', + facebook = 'Facebook', + github = 'GitHub', + leagueoflegends = 'League of Legends', + paypal = 'Paypal', + playstation = 'PlayStation Network', + reddit = 'Reddit', + riotgames = 'Riot Games', + spotify = 'Spotify', + skype = 'Skype', + steam = 'Steam', + twitch = 'Twitch', + twitter = 'Twitter', + xbox = 'Xbox', + youtube = 'YouTube' +} diff --git a/packages/api-types/tsconfig.json b/packages/api-types/tsconfig.json index 9b4f197..d71b442 100644 --- a/packages/api-types/tsconfig.json +++ b/packages/api-types/tsconfig.json @@ -3,5 +3,5 @@ "compilerOptions": { "outDir": "./dist" }, - "include": ["src/**/*"] + "include": ["src/**/**/*"] }