feat(types): add and detach API types (#510)

* feat: add guidelines

* Camelize

* feat: add DiscordUser

* add Discord prefix

* feat: webhook types

* add integration typings

* add new errors and alphabetize

* Add channel types

* feat: add DiscordOverwrite

* feat: webhook typings

* feat: role typings

* fix name

* feat: integration types

* feat: mod.ts for types

* feat: add auditlog types

* feat: teams typings

* feat: add base user interface

* feat: image typings

* enable more mod.ts

* feat: add emoji typings

* channel typings

* embed types

* cleanup embed

* add emoji types

* add more member types

* feat: add message types

* add more to mod.ts

* fix name

* feat: add codes

* feat: add guild types

* feat: add integration types

* add more to mod.ts

* feat: add interaction types

* feat: add voice types

* add more to mod.ts

* feat: add gateway, events

* feat: add invite types

* add to mod ts

* feat: add template types

* feat: add rate limits types

* apply fixes

* deno fmt

* deno fmt

* fix: oauth snake case

* fix: oauth name

* fix: add back and ignore deno fmt

* fix: discord voice snake case

* fix: util fmt

* fix names and fmt

* fix: auditlog types

* lint: shut up in types

* fix: no longer needed

* test

* fix import

* fix missing error

* fix error
This commit is contained in:
Skillz4Killz
2021-02-10 11:02:12 -05:00
committed by GitHub
parent 93b7e57293
commit 99ed2c2edb
32 changed files with 3113 additions and 43 deletions

View File

@@ -7,6 +7,6 @@ jobs:
- uses: actions/checkout@v2
- uses: denolib/setup-deno@v2
- name: Run fmt check script
run: deno fmt --check --ignore=./src/types/util.ts
run: deno fmt --check
- name: Run lint script
run: deno lint src/** test/** --unstable
run: deno lint src/** test/** --unstable --ignore=./src/types/

166
src/types/README.md Normal file
View File

@@ -0,0 +1,166 @@
# Discordeno Typings Guidelines / Explanations
Discordeno has a certain standard guidelines for our typings. Please follow this
as best as possible when contributing to the library.
1. Discordeno Types
These types will be specifically used by the end user for functions inside
Discordeno.
Example:
```ts
interface EditMemberOptions {
/** Value to set users nickname to. Requires MANAGE_NICKNAMES permission. */
nick?: string;
/** Array of role ids the member will have after this edit. Useful for adding/removing multiple roles in 1 API call. Requires MANAGE_ROLES permission. */
roles?: string[];
/** Whether the user is muted in voice channels. Requires MUTE_MEMBERS permission. */
mute?: boolean;
/** Whether the user is deafened in voice channels. Requires DEAFEN_MEMBERS permission. */
deaf?: boolean;
/** The id of the channel to move user to if they are connected to voice. To kick the user from their current channel, set to null. Requires MOVE_MEMBERS permission. When moving members to channels, must have permissions to both CONNECT to the channel and have the MOVE_MEMBER permission. */
channelID?: string;
}
```
Rules:
- Camel Case
- Do not allow `null`
- Everything should have a comment explaining it
- These typings should be kept in the file with the function.
- Example: EditMemberOptions is at the bottom of the file where editMember()
is declared.
2. Discord Types Incoming
These types are meant for the payloads that we receive from Discord, whether
through gateway or REST.
Example:
```ts
export interface MemberCreatePayload {
/** The user this guild member represents */
user: UserPayload;
/** The user's guild nickname if one is set. */
nick?: string;
/** Array of role ids that the member has */
roles: string[];
/** When the user joined the guild. */
joined_at: string;
/** When the user used their nitro boost on the server. */
premium_since?: string;
/** Whether the user is deafened in voice channels */
deaf: boolean;
/** Whether the user is muted in voice channels */
mute: boolean;
/** Whether the user has passed the guild's Membership Screening requirements */
pending?: boolean;
}
```
Rules:
- Snake case (Or whatever discord uses. Everything here should be letter to
letter in accordance with discord's docs.)
- Everything should have a comment explaining it
- Kept in the src/types/api/incoming folder
3. Discord Types Outgoing
These types are meant **US** as we develop Discordeno. These will help us
prevent bugs when we are sending payloads to Discord whether through gateway or
REST.
Example:
```ts
export interface EditMemberPayload {
/** Value to set users nickname to. Requires MANAGE_NICKNAMES permission. */
nick?: string;
/** Array of role ids the member is assigned. Requires MANAGE_ROLES permission. */
roles?: string[];
/** Whether the user is muted in voice channels. Requires MUTE_MEMBERS permission. */
mute?: boolean;
/** Whether the user is deafened in voice channels. Requires DEAFEN_MEMBERS permission. */
deaf?: boolean;
/** The id of the channel to move user to if they are connected to voice. To kick the user from their current channel, set to null. Requires MOVE_MEMBERS permission. When moving members to channels, must have permissions to both CONNECT to the channel and have the MOVE_MEMBER permission. */
channel_id?: string | null;
}
```
Rules:
- Snake case (Or whatever discord uses. Everything here should be letter to
letter in accordance with discord's docs.)
- Everything should have a comment explaining it
- Kept in the src/types/api/outgoing folder
## Minimalistic
Since Discord uses `snake_case` but we use `camelCase` we will end up with
redundant typings. In order to solve this, we have the `Camelize<T>` type which
helps create a type using the snake case.
If we have the base payload for Discord's `User` as follows:
```ts
export interface DiscordUserPayload {
/** The user's id */
id: string;
/** 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 is a bot */
bot?: boolean;
/** Whether the user is an official discord system user (part of the urgent message system.) */
system?: boolean;
/** Whether the user has two factor enabled on their account */
"mfa_enabled"?: boolean;
/** the user's chosen language option */
locale?: string;
/** Whether the email on this account has been verified */
verified?: boolean;
/** The user's email */
email?: string;
/** The flags on a user's account. */
flags?: number;
/** The type of Nitro subscription on a user's account. */
premium_type?: number;
}
```
To create the Discordeno version for this it would be done as:
```ts
export interface UserPayload extends Camelize<DiscordUserPayload> {}
```
Now we have 2 unique interfaces, without having all the extra work or headaches
of maintaing 2 different interfaces.
Similarily, for any outgoing Discord types, we can also camelize them to have
better user experience for users.
Example:
```ts
export interface DiscordBanOptions {
/** number of days to delete messages for (0-7) */
delete_message_days?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7;
/** The reason for the ban. */
reason?: string;
}
```
To create the Discordeno version for this it would be done as:
```ts
export interface BanOptions extends Camelize<DiscordBanOptions> {}
```

205
src/types/api/auditlog.ts Normal file
View File

@@ -0,0 +1,205 @@
import {
DiscordIntegration,
DiscordOverwrite,
DiscordRole,
DiscordUser,
DiscordWebhook,
} from "./mod.ts";
/** https://discord.com/developers/docs/resources/audit-log#audit-log-object */
export interface DiscordAuditLogPayload {
/** list of webhooks found in the audit log */
webhooks: DiscordWebhook[];
/** list of users found in the audit log */
users: DiscordUser[];
/** list of audit log entries */
audit_log_entries: DiscordAuditLogEntry[];
/** list of partial integration objects */
integrations: Partial<DiscordIntegration>[];
}
/** 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[];
/** the user who made the changes */
user_id: string;
/** id of the entry */
id: string;
/** type of action that occured */
action_type: DiscordAuditLogEvent;
/** additional info for certain action types */
options?: DiscordOptionalAuditEntryInfoParam;
/** the reason for the change (0-512 characters) */
reason?: string;
}
/** https://discord.com/developers/docs/resources/audit-log#audit-log-entry-object-audit-log-events */
export enum DiscordAuditLogEvent {
GUILD_UPDATE = 1,
CHANNEL_CREATE = 10,
CHANNEL_UPDATE,
CHANNEL_DELETE,
CHANNEL_OVERWRITE_CREATE,
CHANNEL_OVERWRITE_UPDATE,
CHANNEL_OVERWRITE_DELETE,
MEMBER_KICK = 20,
MEMBER_PRUNE,
MEMBER_BAN_ADD,
MEMBER_BAN_REMOVE,
MEMBER_UPDATE,
MEMBER_ROLE_UPDATE,
MEMBER_MOVE,
MEMBER_DISCONNECT,
BOT_ADD,
ROLE_CREATE = 30,
ROLE_UPDATE,
ROLE_DELETE,
INVITE_CREATE = 40,
INVITE_UPDATE,
INVITE_DELETE,
WEBHOOK_CREATE = 50,
WEBHOOK_UPDATE,
WEBHOOK_DELETE,
EMOJI_CREATE = 60,
EMOJI_UPDATE,
EMOJI_DELETE,
MESSAGE_DELETE = 72,
MESSAGE_BULK_DELETE,
MESSAGE_PIN,
MESSAGE_UNPIN,
INTEGRATION_CREATE = 80,
INTEGRATION_UPDATE,
INTEGRATION_DELETE,
}
/** https://discord.com/developers/docs/resources/audit-log#audit-log-entry-object-optional-audit-entry-info */
export interface DiscordOptionalAuditEntryInfoParam {
/** number of days after which inactive members were kicked, type: MEMBER_PRUNE */
delete_member_days: string;
/** number of members removed by the prune, type: MEMBER_PRUNE */
members_removed: string;
/** channel in which the entities were targeted, types: MEMBER_MOVE & MESSAGE_PIN & MESSAGE_UNPIN & MESSAGE_DELETE */
channel_id: string;
/** id of the message that was targeted, types: MESSAGE_PIN & MESSAGE_UNPIN */
message_id: string;
/** number of entities that were targeted, types: MESSAGE_DELETE & MESSAGE_BULK_DELETE & MEMBER_DISCONNECT & MEMBER_MOVE */
count: string;
/** id of the overwritten entity, types CHANNEL_OVERWRITE_CREATE & CHANNEL_OVERWRITE_UPDATE & CHANNEL_OVERWRITE_DELETE */
id: string;
/** type of overwritten entity - "0", for "role", or "1" for "member", 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"), types: CHANNEL_OVERWRITE_CREATE & CHANNEL_OVERWRITE_UPDATE & CHANNEL_OVERWRITE_DELETE */
role_name: string;
}
/** https://discord.com/developers/docs/resources/audit-log#audit-log-change-object-audit-log-change-structure */
export interface DiscordAuditLogChange {
/** new value of the key */
new_value?: DiscordAuditLogChangeValue;
/** old value of the key */
old_value?: DiscordAuditLogChangeValue;
/** name of audit log change key */
key: string;
}
/** https://discord.com/developers/docs/resources/audit-log#audit-log-change-object-audit-log-change-structure */
export type DiscordAuditLogChangeValue =
| {
new_value: string;
old_value: string;
key:
| "name"
| "icon_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";
}
| {
new_value: number;
old_value: number;
key:
| "afk_timeout"
| "mfa_level"
| "verification_level"
| "explicit_content_filter"
| "default_messagae_notifications"
| "prune_delete_days"
| "position"
| "bitrate"
| "rate_limit_per_user"
| "color"
| "max_uses"
| "uses"
| "max_age"
| "expire_behavior"
| "expire_grace_period";
}
| {
new_value: Partial<DiscordRole>;
old_value: Partial<DiscordRole>;
key: "$add" | "$remove";
}
| {
new_value: boolean;
old_value: boolean;
key:
| "widget_enabled"
| "nsfw"
| "hoist"
| "mentionable"
| "temporary"
| "deaf"
| "mute"
| "enable_emoticons";
}
| {
new_value: DiscordOverwrite[];
old_value: DiscordOverwrite[];
key: "permission_overwrites";
}
| {
new_value: string | number;
old_value: string | number;
key: "type";
};
/** https://discord.com/developers/docs/resources/audit-log#get-guild-audit-log-query-string-parameters */
export interface DiscordGetGuildAuditLogParams {
/** filter the log for actions made by a user */
user_id: string;
/** the type of audit log event */
action_type: DiscordAuditLogEvent;
/** filter the log before a certain entry id */
before: string;
/** how many entries are returned (default 50, minimum 1, maximum 100) */
limit: number;
}
export interface DiscordGetAuditLogsOptions {
/** Filter the logs for actions made by this user. */
user_id?: string;
/** The type of audit log. */
action_type?: DiscordAuditLogEvent;
/** Filter the logs before a certain log entry. */
before?: string;
/** How many entries are returned. Between 1-100. Default 50. */
limit?: number;
}

107
src/types/api/channel.ts Normal file
View File

@@ -0,0 +1,107 @@
import { DiscordOverwrite, DiscordUser } from "./mod.ts";
/** https://discord.com/developers/docs/resources/channel#channel-object-channel-types */
export enum DiscordChannelTypes {
/** a text channel within a server */
GUILD_TEXT,
/** a direct message between users */
DM,
/** a voice channel within a server */
GUILD_VOICE,
/** a direct message between multiple users */
GROUP_DM,
/** an organizational category that contains up to 50 channels */
GUILD_CATEGORY,
/** a channel that users can follow and crosspost into their own server */
GUILD_NEWS,
/** a channel in which game developers can sell their game on Discord */
GUILD_STORE,
}
/** https://discord.com/developers/docs/resources/channel#channel-object-channel-structure */
export interface DiscordChannel {
/** the id of this channel */
id: string;
/** the type of channel */
type: DiscordChannelTypes;
/** the id of the guild */
guild_id?: string;
/** sorting position of the channel */
position?: number;
/** explicit permission overwrites for members and roles */
permission_overwrites?: DiscordOverwrite[];
/** the name of the channel (2-100 characters) */
name?: string;
/** the channel topic (0-1024 characters) */
topic?: string | null;
/** whether the channel is nsfw */
nsfw?: boolean;
/** the id of the last message sent in this channel (may not point to an existing or valid message) */
last_message_id?: string | null;
/** the bitrate (in bits) of the voice channel */
bitrate?: number;
/** the user limit of the voice channel */
user_limit?: number;
/** amount of seconds a user has to wait before sending another message (0-21600); bots, as well as users with the permission manage_messages or manage_channel, are unaffected */
rate_limit_per_user?: number;
/** the recipients of the DM */
recipients?: DiscordUser[];
/** icon hash */
icon?: string | null;
/** id of the DM creator */
owner_id?: string;
/** application id of the group DM creator if it is bot-created */
application_id?: string;
/** id of the parent category for a channel (each parent category can contain up to 50 channels) */
parent_id?: string | null;
/** when the last pinned message was pinned. This may be null in events such as GUILD_CREATE when a message is not pinned. */
last_pin_timestamp?: string | null;
}
/** https://discord.com/developers/docs/resources/channel#followed-channel-object-followed-channel-structure */
export interface DiscordFollowedChannel {
/** source channel id */
channel_id: string;
/** created target webhook id */
webhook_id: string;
}
/** https://discord.com/developers/docs/resources/channel#modify-channel-json-params */
export interface DiscordModifyChannelParams {
/** 2-100 character channel name */
name?: string;
/** the type of channel; only conversion between text and news is supported and only in guilds with the "NEWS" feature */
type?: DiscordChannelTypes;
/** the position of the channel in the left-hand listing */
position?: number | null;
/** 0-1024 character channel topic */
topic?: string | null;
/** whether the channel is nsfw */
nsfw?: boolean | null;
/** amount of seconds a user has to wait before sending another message (0-21600); bots, as well as users with the permission `MANAGE_MESSAGES` or `MANAGE_CHANNELS`, are unaffected */
rate_limit_per_user?: number | null;
/** the bitrate (in bits) of the voice channel; 8000 to 96000 (128000 for VIP servers) */
bitrate?: number | null;
/** the user limit of the voice channel; 0 refers to no limit, 1 to 99 refers to a user limit */
user_limit?: number | null;
/** channel or category-specific permissions */
permission_overwrites?: DiscordOverwrite[] | null;
/** id of the new parent category for a channel */
parent_id?: string | null;
}
/** https://discord.com/developers/docs/resources/channel#edit-channel-permissions-json-params */
export interface DiscordEditChannelPermissions {
/** the bitwise value of all allowed permissions */
allow: string;
/** the bitwise value of all disallowed permissions */
deny: string;
/** 0 for a role or 1 for a member */
type: number;
}
/** https://discord.com/developers/docs/resources/channel#follow-news-channel-json-params */
export interface DiscordFollowNewsChannelParams {
/** id of target channel */
webhook_channel_id: string;
}

188
src/types/api/code.ts Normal file
View File

@@ -0,0 +1,188 @@
/** https://discord.com/developers/docs/topics/opcodes-and-status-codes#opcodes-and-status-codes */
export enum DiscordGatewayOpcodes {
Dispatch,
Heartbeat,
Identify,
PresenceUpdate,
VoiceStateUpdate,
Resume = 6,
Reconnect,
RequestGuildMembers,
InvalidSession,
Hello,
HeartbeatACK,
}
/** https://discord.com/developers/docs/topics/opcodes-and-status-codes#opcodes-and-status-codes */
export enum DiscordGatewayCloseEventCodes {
UnknownError = 4000,
UnknownOpcode,
DecodeError,
NotAuthenticated,
AuthenticationFailed,
AlreadyAuthenticated,
InvalidSeq = 4007,
RateLimited,
SessionTimedOut,
InvalidShard,
ShardingRequired,
InvalidApiVersion,
InvalidIntents,
DisallowedIntents,
}
/** https://discord.com/developers/docs/topics/opcodes-and-status-codes#voice */
export enum DiscordVoiceOpcodes {
Identify,
SelectProtocol,
Ready,
Heartbeat,
SessionDescription,
Speaking,
HeartbeatACK,
Resume,
Hello,
Resumed,
ClientDisconnect = 13,
}
/** https://discord.com/developers/docs/topics/opcodes-and-status-codes#voice */
export enum DiscordVoiceCloseEventCodes {
UnknownOpcode = 4001,
FailedToDecodePayload,
NotAuthenticated,
AuthenticationFailed,
AlreadyAuthenticated,
SessionNoLongerValid,
SessionTimedOut = 4009,
ServerNotFound = 4011,
UnknownProtocol,
Disconnect = 4014,
VoiceServerCrashed,
UnknownEncryptionMode,
}
/** https://discord.com/developers/docs/topics/opcodes-and-status-codes#http */
export enum DiscordHTTPResponseCodes {
Ok = 200,
Created,
NoContent = 204,
NotModified = 304,
BadRequest = 400,
Unauthorized,
Forbidden = 403,
NotFound,
MethodNotAllowed,
TooManyRequests = 429,
GatewayUnavailable = 502,
}
/** https://discord.com/developers/docs/topics/opcodes-and-status-codes#json */
export enum DiscordJsonErrorCodes {
GeneralError,
UnknownAccount = 10001,
UnknownApplication,
UnknownChannel,
UnknownGuild,
UnknownIntegration,
UnknownInvite,
UnknownMember,
UnknownMessage,
UnknownPermissionOverwrite,
UnknownProvider,
UnknownRole,
UnknownToken,
UnknownUser,
UnknownEmoji,
UnknownWebhook,
UnknownBan = 10026,
UnknownSKU,
UnknownStoreListing,
UnknownEntitlement,
UnknownBuild,
UnknownLobby,
UnknownBranch,
UnknownRedistributable = 10036,
UnknownGuildTemplate = 10057,
UnknownApplicationCommand = 10063,
BotsCannotUseThisEndpoint = 20001,
OnlyBotsCanUseThisEndpoint,
ThisMessageCannotBeEditedDueToAnnouncementRateLimits = 20022,
TheChannelYouAreWritingHasHitTheWriteRateLimit = 20028,
MaximumNumberOfGuildsReached = 30001,
MaximumNumberOfFriendsReached,
MaximumNumberOfPinsReachedForTheChannel,
MaximumNumberOfGuildRolesReached = 30005,
MaximumNumberOfWebhooksReached = 30007,
MaximumNumberOfReactionsReached = 30010,
MaximumNumberOfGuildChannelsReached = 30013,
MaximumNumberOfAttachmentsInAMessageReached = 30015,
MaximumNumberOfInvitesReached,
GuildAlreadyHasTemplate = 30031,
UnauthorizedProvideAValidTokenAndTryAgain = 40001,
YouNeedToVerifyYourAccountInOrderToPerformThisAction,
RequestEntityTooLargeTrySendingSomethingSmallerInSize = 40005,
ThisFeatureHasBeenTemporarilyDisabledServerSide,
ThisUserBannedFromThisGuild,
ThisMessageHasAlreadyBeenCrossposted = 40033,
MissingAccess = 50001,
InvalidAccountType,
CannotExecuteActionOnADMChannel,
GuildWidgetDisabled,
CannotEditMessageAuthoredByAnotherUser,
CannotSendAnEmptyMessage,
CannotSendMessagesToThisUser,
CannotSendMessagesInAVoiceChannel,
ChannelVerificationLevelIsTooHighForYouToGainAccess,
Oauth2ApplicationDoesNotHaveABot,
Oauth2ApplicationLimitReached,
InvalidOauth2State,
YouLackPermissionsToPerformThatAction,
InvalidAuthenticationTokenProvided,
NoteWasTooLong,
ProvidedTooFewOrTooManyMessagesToDeleteMustProvideAtLeast2AndFewerThan100MessagesToDelete,
AMessageCanOnlyBePinnedInTheChannelItWasSentIn = 50019,
InviteCodeWasEitherInvalidOrTaken,
CannotExecuteActionOnASystemMessage,
CannotExecuteActionOnThisChannelType = 50024,
InvalidOauth2AccessTokenProvided,
InvalidRecipients = 50033,
AMessageProvidedWasTooOldToBulkDelete,
InvalidFormBodyOrContentTypeProvided,
AnInviteWasAcceptedToAGuildTheApplicationsBotIsNotIn,
InvalidApiVersionProvided = 50041,
CannotDeleteAChannelRequiredForCommunityGuilds = 50074,
InvalidStickerSent = 50081,
ReqctionWasBlocked = 90001,
ApiResourceIsCurrentlyOverloadedTryAgainALittleLater = 130000,
}
/** https://discord.com/developers/docs/topics/opcodes-and-status-codes#rpc */
export enum DiscordRpcErrorCodes {
UnknownError = 1000,
InvalidPayload = 4000,
InvalidCommand = 4002,
InvalidGuild,
InvalidEvent,
InvalidChannel,
InvalidPermissions,
InvalidClientID,
InvalidOrigin,
InvalidToken,
InvalidUser,
OAuth2Error = 5000,
SelectChannelTimedOut,
GetGuildTimedOut,
SelectVoiceForceRequired,
CaptureShortcutAlreadyListening,
}
/** https://discord.com/developers/docs/topics/opcodes-and-status-codes#rpc */
export enum DiscordRpcCloseEventCodes {
InvalidClientID = 4000,
InvalidOrigin,
RateLimited,
TokenRevoked,
InvalidVersion,
InvalidEncoding,
}

115
src/types/api/embed.ts Normal file
View File

@@ -0,0 +1,115 @@
/** https://discord.com/developers/docs/resources/channel#embed-object-embed-structure */
export interface DiscordEmbed {
/** title of embed */
title?: string;
/** type of embed (always "rich" for webhook embeds) */
type?: string;
/** description of embed */
description?: string;
/** url of embed */
url?: string;
/** timestamp of embed content */
timestamp?: string;
/** color code of the embed */
color?: number;
/** footer information */
footer?: DiscordEmbedFooter;
/** image information */
image?: DiscordEmbedImage;
/** thumbnail information */
thumbnail?: DiscordEmbedThumbnail;
/** video information */
video?: DiscordEmbedVideo;
/** provider information */
provider?: DiscordEmbedProvider;
/** author information */
author?: DiscordEmbedAuthor;
/** fields information */
fields?: DiscordEmbedField[];
}
/**
* https://discord.com/developers/docs/resources/channel#embed-object-embed-types
* @deprecated
*/
export type EmbedTypes =
| "rich"
| "image"
| "video"
| "gifv"
| "article"
| "link";
/** https://discord.com/developers/docs/resources/channel#embed-object-embed-thumbnail-structure */
export interface DiscordEmbedThumbnail {
/** source url of thumbnail (only supports http(s) and attachments) */
url?: string;
/** a proxied url of the thumbnail */
proxy_url?: string;
/** height of thumbnail */
height?: number;
/** width of thumbnail */
width?: number;
}
/** https://discord.com/developers/docs/resources/channel#embed-object-embed-video-structure */
export interface DiscordEmbedVideo {
/** source url of video */
url?: string;
/** height of video */
height?: number;
/** width of video */
width?: number;
}
/** https://discord.com/developers/docs/resources/channel#embed-object-embed-image-structure */
export interface DiscordEmbedImage {
/** source url of image (only supports http(s) and attachments) */
url?: string;
/** a proxied url of the image */
proxy_url?: string;
/** height of image */
height?: number;
/** width of image */
width?: number;
}
/** https://discord.com/developers/docs/resources/channel#embed-object-embed-provider-structure */
export interface DiscordEmbedProvider {
/** name of provider */
name?: string;
/** url of provider */
url?: string;
}
/** https://discord.com/developers/docs/resources/channel#embed-object-embed-author-structure */
export interface DiscordEmbedAuthor {
/** name of author */
name?: string;
/** url of author */
url?: string;
/** url of author icon (only supports http(s) and attachments) */
icon_url?: string;
/** a proxied url of author icon */
proxy_icon_url?: string;
}
/** https://discord.com/developers/docs/resources/channel#embed-object-embed-footer-structure */
export interface DiscordEmbedFooter {
/** footer text */
text: string;
/** url of footer icon (only supports http(s) and attachments) */
icon_url?: string;
/** a proxied url of footer icon */
proxy_icon_url?: string;
}
/** https://discord.com/developers/docs/resources/channel#embed-object-embed-field-structure */
export interface DiscordEmbedField {
/** name of the field */
name: string;
/** value of the field */
value: string;
/** whether or not this field should display inline */
inline?: boolean;
}

39
src/types/api/emoji.ts Normal file
View File

@@ -0,0 +1,39 @@
import { DiscordUser } from "./mod.ts";
/** https://discord.com/developers/docs/resources/emoji#emoji-object-emoji-structure */
export interface DiscordEmoji {
/** emoji id */
id: string | null;
/** emoji name */
name: string | null;
/** roles this emoji is whitelisted to */
roles?: string[];
/** user that created this emoji */
user?: DiscordUser;
/** whether this emoji must be wrapped in colons */
require_colons?: boolean;
/** whether this emoji is managed */
managed?: boolean;
/** whether this emoji is animated */
animated?: boolean;
/** whether this emoji can be used, may be false due to loss of Server Boosts */
available?: boolean;
}
/** https://discord.com/developers/docs/resources/emoji#create-guild-emoji */
export interface DiscordCreateGuildEmojiParams {
/** name of the emoji */
name: string;
/** the 128x128 emoji image (Data URI scheme) */
image: string;
/** roles for which this emoji will be whitelisted */
roles: string[];
}
/** https://discord.com/developers/docs/resources/emoji#modify-guild-emoji */
export interface DiscordModifyGuildEmojiParams {
/** name of the emoji */
name?: string;
/** roles to which this emoji will be whitelisted */
roles?: string[] | null;
}

350
src/types/api/event.ts Normal file
View File

@@ -0,0 +1,350 @@
import {
DiscordActivity,
DiscordApplication,
DiscordClientStatus,
DiscordEmoji,
DiscordIntegration,
DiscordMember,
DiscordRole,
DiscordStatusTypes,
DiscordUnavailableGuild,
DiscordUser,
} from "./mod.ts";
/** https://discord.com/developers/docs/topics/gateway#hello */
export interface DiscordHelloEvent {
/** the interval (in milliseconds) the client should heartbeat with */
heartbeat_interval: number;
}
/** https://discord.com/developers/docs/topics/gateway#ready */
export interface DiscordReadyEvent {
/** gateway version */
v: number;
/** information about the user including email */
user: DiscordUser;
/** empty array */
private_channels: [];
/** the guilds the user is in */
guilds: DiscordUnavailableGuild[];
/** used for resuming connections */
session_id: string;
/** the shard information associated with this session, if sent when identifying */
shard?: [number, number];
/** contains id and flags */
application: Pick<DiscordApplication, "id" | "flags">;
}
/** https://discord.com/developers/docs/topics/gateway#channel-pins-update-channel-pins-update-event-fields */
export interface DiscordChannelPinsUpdateEvent {
/** the id of the guild */
guild_id?: string;
/** the id of the channel */
channel_id: string;
/** the time at which the most recent pinned message was pinned */
last_pin_timestamp?: string | null;
}
/** https://discord.com/developers/docs/topics/gateway#guild-ban-add-guild-ban-add-event-fields */
export interface DiscordGuildBanAddEvent {
/** id of the guild */
guild_id: string;
/** the banned user */
user: DiscordUser;
}
/** https://discord.com/developers/docs/topics/gateway#guild-ban-remove-guild-ban-remove-event-fields */
export interface DiscordGuildBanRemoveEvent {
/** id of the guild */
guild_id: string;
/** the unbanned user */
user: DiscordUser;
}
/** https://discord.com/developers/docs/topics/gateway#guild-emojis-update-guild-emojis-update-event-fields */
export interface DiscordGuildEmojisUpdateEvent {
/** id of the guild */
guild_id: string;
/** array of emojis */
emojis: DiscordEmoji[];
}
/** https://discord.com/developers/docs/topics/gateway#guild-integrations-update-guild-integrations-update-event-fields */
export interface DiscordGuildIntegrationsUpdateEvent {
/** id of the guild whose integrations were updated */
guild_id: string;
}
/** https://discord.com/developers/docs/topics/gateway#guild-member-add-guild-member-add-extra-fields */
export interface DiscordGuildMemberAddExtra extends DiscordMember {
/** id of the guild */
guild_id: string;
}
/** https://discord.com/developers/docs/topics/gateway#guild-member-remove-guild-member-remove-event-fields */
export interface DiscordGuildMemberRemoveEvent {
/** the id of the guild */
guild_id: string;
/** the user who was removed */
user: DiscordUser;
}
/** https://discord.com/developers/docs/topics/gateway#guild-member-update-guild-member-update-event-fields */
export interface DiscordGuildMemberUpdateEvent {
/** the id of the guild */
guild_id: string;
/** user role ids */
roles: string[];
/** the user */
user: DiscordUser;
/** nickname of the user in the guild */
nick?: string | null;
/** when the user joined the guild */
joied_at: string;
/** when the user starting boosting the guild */
premium_since?: string | null;
}
/** https://discord.com/developers/docs/topics/gateway#guild-members-chunk-guild-members-chunk-event-fields */
export interface DiscordGuildMembersChunkEvent {
/** the id of the guild */
guild_id: string;
/** set of guild members */
members: DiscordMember[];
/** the chunk index in the expected chunks for this response (0 <= chunk_index < chunk_count) */
chunk_index: number;
/** the total number of expected chunks for this response */
chunk_count: number;
/** if passing an invalid id to REQUEST_GUILD_MEMBERS, it will be returned here */
not_found?: [];
/** if passing true REQUEST_GUILD_MEMBERS, presences of the returned members will be here */
presences?: DiscordPresenceUpdateEvent[];
/** the nonce used in the Guild Members Request */
nonce?: string;
}
/** https://discord.com/developers/docs/topics/gateway#guild-role-create-guild-role-create-event-fields */
export interface DiscordGuildRoleCreateEvent {
/** the id of the guild */
guild_id: string;
/** the role created */
role: DiscordRole;
}
/** https://discord.com/developers/docs/topics/gateway#guild-role-update-guild-role-update-event-fields */
export interface DiscordGuildRoleUpdateEvent {
/** the id of the guild */
guild_id: string;
/** the role updated */
role: DiscordRole;
}
/** https://discord.com/developers/docs/topics/gateway#guild-role-delete-guild-role-delete-event-fields */
export interface DiscordGuildRoleDeleteEvent {
/** id of the guild */
guild_id: string;
/** id of the role */
role_id: string;
}
// TODO: Add the documentation Link
export interface DiscordIntegrationCreate extends DiscordIntegration {
/** id of the guild */
guild_id: string;
}
export interface DiscordIntegrationUpdate extends DiscordIntegration {
/** id of the guild */
guild_id: string;
}
export interface DiscordIntegrationDelete {
/** integration id */
id: string;
/** id of the guild */
guild_id: string;
/** id of the bot/OAuth2 application for this discordd integration */
application_id?: string;
}
/** https://discord.com/developers/docs/topics/gateway#invite-create-invite-create-event-fields */
export interface DiscordInviteCreateEvent {
/** the channel the invite is for */
channel_id: string;
/** the unique invite code */
code: string;
/** the time at which the invite was created */
created_at: string;
/** the guild of the invite */
guild_id?: string;
/** the user that created the invite */
inviter?: DiscordUser;
/** how long the invite is valid for (in seconds) */
max_age: number;
/** the maximum number of times the invite can be used */
max_uses: number;
/** the target user for this invite */
target_user?: Partial<DiscordUser>;
/** the type of user target for this invite */
target_user_type?: number;
/** whether or not the invite is temporary (invited users will be kicked on disconnect unless they're assigned a role) */
temporary: boolean;
/** how many times the invite has been used (always will be 0) */
uses: number;
}
/** https://discord.com/developers/docs/topics/gateway#invite-delete-invite-delete-event-fields */
export interface DiscordInviteDeleteEvent {
/** the channel of the invite */
channel_id: string;
/** the guild of the invite */
guild_id?: string;
/** the unique invite code */
code: string;
}
/** https://discord.com/developers/docs/topics/gateway#message-delete-message-delete-event-fields */
export interface DiscordMessageDeleteEvent {
/** the id of the message */
id: string;
/** the id of the channel */
channel_id: string;
/** the id of the guild */
guild_id?: string;
}
/** https://discord.com/developers/docs/topics/gateway#message-delete-bulk-message-delete-bulk-event-fields */
export interface DiscordMessageDeleteBulkEvent {
/** the ids of the messages */
ids: string[];
/** the id of the channel */
channel_id: string;
/** the id of the guild */
guild_id?: string;
}
/** https://discord.com/developers/docs/topics/gateway#message-reaction-add-message-reaction-add-event-fields */
export interface DiscordMessageReactionAddEvent {
/** the id of the user */
user_id: string;
/** the id of the channel */
channel_id: string;
/** the id of the message */
message_id: string;
/** the id of the guild */
guild_id?: string;
/** the member who reacted if this happened in a guild */
member?: DiscordMember;
/** the emoji used to react */
emoji: Partial<DiscordEmoji>;
}
/** https://discord.com/developers/docs/topics/gateway#message-reaction-remove-message-reaction-remove-event-fields */
export interface DiscordMessageReactionRemoveEvent {
/** the id of the user */
user_id: string;
/** the id of the channel */
channel_id: string;
/** the id of the message */
message_id: string;
/** the id of the guild */
guild_id?: string;
/** the emoji used to react */
emoji: Partial<DiscordEmoji>;
}
/** https://discord.com/developers/docs/topics/gateway#message-reaction-remove-all-message-reaction-remove-all-event-fields */
export interface DiscordMessageReactionRemoveAllEvent {
/** the id of the channel */
channel_id: string;
/** the id of the message */
message_id: string;
/** the id of the guild */
guild_id?: string;
}
/** https://discord.com/developers/docs/topics/gateway#message-reaction-remove-emoji-message-reaction-remove-emoji */
export interface DiscordMessageReactionRemoveEmoji {
/** the id of the channel */
channel_id: string;
/** the id of the guild */
guild_id?: string;
/** the id of the message */
message_id: string;
/** the emoji that was removed */
emoji: Partial<DiscordEmoji>;
}
/** https://discord.com/developers/docs/topics/gateway#presence-update-presence-update-event-fields */
export interface DiscordPresenceUpdateEvent {
/** the user presence is being updated for */
user: DiscordUser;
/** id of the guild */
guild_id: string;
/** either "idle", "dnd", "online", or "offline" */
status: DiscordStatusTypes;
/** user's current activities */
activities: DiscordActivity[];
/** user's platform-dependent status */
client_status: DiscordClientStatus;
}
/** https://discord.com/developers/docs/topics/gateway#typing-start-typing-start-event-fields */
export interface DiscordTypingStartEvent {
/** id of the channel */
channel_id: string;
/** id of the guild */
guild_id?: string;
/** id of the user */
user_id: string;
/** unix time (in seconds) of when the user started typing */
timestamp: number;
/** the member who started typing if this happened in a guild */
member?: DiscordMember;
}
/** https://discord.com/developers/docs/topics/gateway#voice-server-update-voice-server-update-event-fields */
export interface DiscordVoiceServerUpdateEvent {
/** voice connection token */
token: string;
/** the guildd this voice server update is for */
guild_id: string;
/** the voice server host */
endpoint: string;
}
/** https://discord.com/developers/docs/topics/gateway#webhooks-update-webhook-update-event-fields */
export interface DiscordWebhooksUpdateEvent {
/** id of the guild */
guild_id: string;
/** id of the channel */
channel_id: string;
}
/** https://discord.com/developers/docs/resources/voice#voice-resource */
export interface DiscordVoiceStateUpdateEvent {
/** the guild id this voice state is for */
guild_id?: string;
/** the channel id this user is connected to */
channel_id: string;
/** the user id this voice state is for */
user_id: string;
/** the guild member this voice state is for */
member?: DiscordMember;
/** the session id for this voice state */
session_id: string;
/** whether this user is deafened by the server */
deaf: boolean;
/** whether this user is muted by the server */
mute: boolean;
/** whether this user is locally deafened */
self_deaf: boolean;
/** whether this user is locally muted */
self_mute: boolean;
/** whether this user is streaming using "Go Live" */
self_stream?: boolean;
/** whether this user's camera is enabled */
self_video: boolean;
/** whether this user is muted by the current user */
suppress: boolean;
}

487
src/types/api/gateway.ts Normal file
View File

@@ -0,0 +1,487 @@
import { DiscordInteractionCommand } from "./interaction.ts";
import {
DiscordChannel,
DiscordChannelPinsUpdateEvent,
DiscordGatewayOpcodes,
DiscordGuild,
DiscordGuildBanAddEvent,
DiscordGuildBanRemoveEvent,
DiscordGuildEmojisUpdateEvent,
DiscordGuildIntegrationsUpdateEvent,
DiscordGuildMemberAddExtra,
DiscordGuildMemberRemoveEvent,
DiscordGuildMembersChunkEvent,
DiscordGuildMemberUpdateEvent,
DiscordGuildRoleCreateEvent,
DiscordGuildRoleDeleteEvent,
DiscordGuildRoleUpdateEvent,
DiscordHelloEvent,
DiscordIntegrationCreate,
DiscordIntegrationDelete,
DiscordIntegrationUpdate,
DiscordInviteCreateEvent,
DiscordInviteDeleteEvent,
DiscordMember,
DiscordMessage,
DiscordMessageDeleteBulkEvent,
DiscordMessageDeleteEvent,
DiscordMessageReactionAddEvent,
DiscordMessageReactionRemoveAllEvent,
DiscordMessageReactionRemoveEmoji,
DiscordMessageReactionRemoveEvent,
DiscordPresenceUpdateEvent,
DiscordReadyEvent,
DiscordTypingStartEvent,
DiscordUnavailableGuild,
DiscordUser,
DiscordVoiceServerUpdateEvent,
DiscordVoiceStateUpdateEvent,
DiscordWebhooksUpdateEvent,
} from "./mod.ts";
/** https://discord.com/developers/docs/topics/gateway#payloads */
export interface DiscordGateway {
/** opcode for the payload */
op: DiscordGatewayOpcodes;
/** event data */
d: DiscordGatewayDTypes;
/** sequence number, used for resuming sessions and heartbeats */
s: number | null;
/** the event name for this payload */
t: DiscordGatewayTTypes;
}
/** GatewayPayload event data type list */
export type DiscordGatewayDTypes =
| DiscordHelloEvent
| DiscordReadyEvent
| DiscordResume
| DiscordChannel
| DiscordChannelPinsUpdateEvent
| DiscordGuild
| DiscordUnavailableGuild
| DiscordGuildBanAddEvent
| DiscordGuildBanRemoveEvent
| DiscordGuildEmojisUpdateEvent
| DiscordGuildIntegrationsUpdateEvent
| DiscordMember
| DiscordGuildMemberAddExtra
| DiscordGuildMemberRemoveEvent
| DiscordGuildMemberUpdateEvent
| DiscordGuildMembersChunkEvent
| DiscordGuildRoleCreateEvent
| DiscordGuildRoleUpdateEvent
| DiscordGuildRoleDeleteEvent
| DiscordIntegrationCreate
| DiscordIntegrationUpdate
| DiscordIntegrationDelete
| DiscordInviteCreateEvent
| DiscordInviteDeleteEvent
| DiscordMessage
| DiscordMessageDeleteEvent
| DiscordMessageDeleteBulkEvent
| DiscordMessageReactionAddEvent
| DiscordMessageReactionRemoveEvent
| DiscordMessageReactionRemoveAllEvent
| DiscordMessageReactionRemoveEmoji
| DiscordPresenceUpdateEvent
| DiscordTypingStartEvent
| DiscordUser
| DiscordVoiceStateUpdateEvent
| DiscordVoiceServerUpdateEvent
| DiscordWebhooksUpdateEvent
| DiscordInteractionCommand
| false
| null;
/** GatewayPayload event name list */
export type DiscordGatewayTTypes =
| "HELLO"
| "READY"
| "RESUMED"
| "RECONNECT"
| "INVALID_SESSION"
| "CHANNEL_CREATE"
| "CHANNEL_UPDATE"
| "CHANNEL_DELETE"
| "CHANNEL_PINS_UPDATE"
| "GUILD_CREATE"
| "GUILD_UPDATE"
| "GUILD_DELETE"
| "GUILD_BAN_ADD"
| "GUILD_BAN_REMOVE"
| "GUILD_EMOJIS_UPDATE"
| "GUILD_INTEGRATIONS_UPDATE"
| "GUILD_MEMBER_ADD"
| "GUILD_MEMBER_REMOVE"
| "GUILD_MEMBER_UPDATE"
| "GUILD_MEMBERS_CHUNK"
| "GUILD_ROLE_CREATE"
| "GUILD_ROLE_UPDATE"
| "GUILD_ROLE_DELETE"
| "INTEGRATION_CREATE"
| "INTEGRATION_UPDATE"
| "INTEGRATION_DELETE"
| "INVITE_CREATE"
| "INVITE_DELETE"
| "MESSAGE_CREATE"
| "MESSAGE_UPDATE"
| "MESSAGE_DELETE"
| "MESSAGE_DELETE_BULK"
| "MESSAGE_REACTION_ADD"
| "MESSAGE_REACTION_REMOVE"
| "MESSAGE_REACTION_REMOVE_ALL"
| "MESSAGE_REACTION_REMOVE_EMOJI"
| "PRESENCE_UPDATE"
| "TYPING_START"
| "USER_UPDATE"
| "VOICE_STATE_UPDATE"
| "VOICE_SERVER_UPDATE"
| "WEBHOOKS_UPDATE"
| "INTERACTION_CREATE"
// Not in DC documentation
| "APPLICATION_COMMAND_CREATE"
| null;
/** https://discord.com/developers/docs/topics/gateway#connecting-to-the-gateway */
export interface DiscordGatewayURLParams {
/** gateway Version to use */
v: number;
/** the encoding of recieved gateway packets */
encoding: string;
/** the (optional) compression of gateway packets */
compress?: string;
}
/** https://discord.com/developers/docs/topics/gateway#gateway-intents */
export enum DiscordGatewayIntents {
/** Enables the following events:
* - GUILD_CREATE
* - GUILD_DELETE
* - GUILD_ROLE_CREATE
* - GUILD_ROLE_UPDATE
* - GUILD_ROLE_DELETE
* - CHANNEL_CREATE
* - CHANNEL_UPDATE
* - CHANNEL_DELETE
* - CHANNEL_PINS_UPDATE
*/
GUILDS = 1 << 0,
/** Enables the following events:
* - GUILD_MEMBER_ADD
* - GUILD_MEMBER_UPDATE
* - GUILD_MEMBER_REMOVE
*/
GUILD_MEMBERS = 1 << 1,
/** Enables the following events:
* - GUILD_BAN_ADD
* - GUILD_BAN_REMOVE
*/
GUILD_BANS = 1 << 2,
/** Enables the following events:
* - GUILD_EMOJIS_UPDATE
*/
GUILD_EMOJIS = 1 << 3,
/** Enables the following events:
* - GUILD_INTEGRATIONS_UPDATE
* - INTEGRATION_CREATE
* - INTEGRATION_UPDATE
* - INTEGRATION_DELETE
*/
GUILD_INTEGRATIONS = 1 << 4,
/** Enables the following events:
* - WEBHOOKS_UPDATE
*/
GUILD_WEBHOOKS = 1 << 5,
/** Enables the following events:
* - INVITE_CREATE
* - INVITE_DELETE
*/
GUILD_INVITES = 1 << 6,
/** Enables the following events:
* - VOICE_STATE_UPDATE
*/
GUILD_VOICE_STATES = 1 << 7,
/** Enables the following events:
* - PRESENCE_UPDATE
*/
GUILD_PRESENCES = 1 << 8,
/** Enables the following events:
* - MESSAGE_CREATE
* - MESSAGE_UPDATE
* - MESSAGE_DELETE
*/
GUILD_MESSAGES = 1 << 9,
/** Enables the following events:
* - MESSAGE_REACTION_ADD
* - MESSAGE_REACTION_REMOVE
* - MESSAGE_REACTION_REMOVE_ALL
* - MESSAGE_REACTION_REMOVE_EMOJI
*/
GUILD_MESSAGE_REACTIONS = 1 << 10,
/** Enables the following events:
* - TYPING_START
*/
GUILD_MESSAGE_TYPING = 1 << 11,
/** Enables the following events:
* - CHANNEL_CREATE
* - MESSAGE_CREATE
* - MESSAGE_UPDATE
* - MESSAGE_DELETE
* - CHANNEL_PINS_UPDATE
*/
DIRECT_MESSAGES = 1 << 12,
/** Enables the following events:
* - MESSAGE_REACTION_ADD
* - MESSAGE_REACTION_REMOVE
* - MESSAGE_REACTION_REMOVE_ALL
* - MESSAGE_REACTION_REMOVE_EMOJI
*/
DIRECT_MESSAGE_REACTIONS = 1 << 13,
/** Enables the following events:
* - TYPING_START
*/
DIRECT_MESSAGE_TYPING = 1 << 14,
}
/** https://discord.com/developers/docs/topics/gateway#identify */
export interface DiscordIdentify {
/** authentication token */
token: string;
/** connection properties */
properties: DiscordIdentifyConnectionProps;
/** whether this connection supports compression of packets, default: false */
compress?: boolean;
/** value between 50 and 250, total number of members where the gateway will stop sending offline members in the guild member list, default: 50 */
large_threshold?: number;
/** used for Guild Sharding */
shard: [number, number];
/** presence structure for initial presence information */
presence?: DiscordUpdateStatus;
/** enables dispatching of guild subscription events (presence and typing events), default: true */
guild_subscriptions?: boolean;
/** the Gateway Intents you wish to receive */
intents: number;
}
/** https://discord.com/developers/docs/topics/gateway#identify-identify-connection-properties */
export interface DiscordIdentifyConnectionProps {
/** your operating system */
$os: string;
/** your library name */
$browser: string;
/** your library name */
$device: string;
}
/** https://discord.com/developers/docs/topics/gateway#resume */
export interface DiscordResume {
/** session token */
token: string;
/** session id */
session_id: string;
/** last sequence number received */
seq: number;
}
/** https://discord.com/developers/docs/topics/gateway#request-guild-members */
export interface DiscordRequestGuildMembers {
/** id of the guild to get members for */
guild_id: string;
/** string that username starts with, or an empty string to return all members */
query?: string;
/** maximum number of members to send matching the query; a limit of 0 can be used with an empty string query to return all members */
limit: number;
/** used to specify if we want the presence of the matched members */
presences?: boolean;
/** used to specify which users you wish to fetch */
user_ids?: string | string[];
/** nonce to identify the Guild Members Chunk response */
nonce?: string;
}
/** https://discord.com/developers/docs/topics/gateway#update-voice-state */
export interface DiscordUpdateVoiceState {
/** id of the guild */
guild_id: string;
/** id of the voice channel client wants to join (null if disconnecting) */
channel_id: string | null;
/** is the client muted */
self_mute: boolean;
/** is the client deafened */
self_deaf: boolean;
}
/** https://discord.com/developers/docs/topics/gateway#update-status */
export interface DiscordUpdateStatus {
/** unix time (in milliseconds) of when the client went idle, or null if the client is not idle */
since: number | null;
/** null, or the user's activities */
activities: DiscordActivity[];
/** the user's new status */
status: DiscordStatusTypes;
/** whether or not the client is afk */
afk: boolean;
}
/** https://discord.com/developers/docs/topics/gateway#update-status-status-types */
export enum DiscordStatusTypes {
ONLINE = "online",
DND = "dnd",
IDLE = "idle",
INVISIBLE = "invisible",
OFFLINE = "offline",
}
/** https://discord.com/developers/docs/topics/gateway#client-status-object */
export interface DiscordClientStatus {
/** the user's status set for an active desktop (Windows, Linux, Mac) application session */
desktop?: string;
/** the user's status set for an active mobile (iOS, Android) application session */
mobile?: string;
/** the user's status set for an active web (browser, bot account) application session */
web?: string;
}
/** https://discord.com/developers/docs/topics/gateway#activity-object */
export interface DiscordActivity {
/** the activity's id */
id?: string;
/** the activity's name */
name: string;
/** activity type */
type: DiscordActivityTypes;
/** stream url, is validated when type is 1 */
url?: string | null;
/** unix timestamp of when the activity was added to the user's session */
created_at: number;
/** unix timestamps for start and/or end of the game */
timestamps?: DiscordActivityTimestamps;
/** the id of the song on Spotify */
sync_id?: string;
/** the platform the game is being played on ("desktop", "samsung", or "xbox") */
platform?: string;
/** application id for the game */
application_id?: string;
/** what the player is currently doing */
details?: string | null;
/** the user's current party status */
state?: string | null;
/** the emoji used for a custom status */
emoji?: DiscordActivityEmoji | null;
/** the id of the game or Spotify session */
session_id?: string;
/** information for the current party of the player */
party?: DiscordActivityParty;
/** images for the presence and their hover texts */
assets?: DiscordActivityAssets;
/** secrets for Rich Presence joining and spectating */
secrets?: DiscordActivitySecrets;
/** whether or not the activity is an instanced game session */
instance?: boolean;
/** activity flags OR d together, describes what the payload includes */
flags?: DiscordActivityFlags;
/** the custom buttons shown in the Rich Presence (max 2) */
buttons?: DiscordActivityButton[];
}
export interface DiscordActivityButton {
/** the text shown on the button (1-32 characters) */
label: string;
/** the url opened when clicking the button (1-512 characters) */
url: string;
}
/** https://discord.com/developers/docs/topics/gateway#activity-object-activity-types */
export enum DiscordActivityTypes {
/** Playing {name} */
GAME,
/** Streaming {details} */
STREAMING,
/** Listening to {name} */
LISTENING,
/** {emoji} {name} */
CUSTOM = 4,
/** Competing in {name} */
COMPETING,
}
/** https://discord.com/developers/docs/topics/gateway#activity-object-activity-timestamps */
export interface DiscordActivityTimestamps {
/** unix time (in milliseconds) of when the activity started */
start?: number;
/** unix time (in milliseconds) of when the activity ends */
end?: number;
}
/** https://discord.com/developers/docs/topics/gateway#activity-object-activity-emoji */
export interface DiscordActivityEmoji {
/** the name of the emoji */
name: string;
/** the id of the emoji */
id?: string;
/** whether this emoji is animated */
animated?: boolean;
}
/** https://discord.com/developers/docs/topics/gateway#activity-object-activity-party */
export interface DiscordActivityParty {
/** the id of the party */
id?: string;
/** used to show the party's currrent and maximum size */
size?: [number, number];
}
/** https://discord.com/developers/docs/topics/gateway#activity-object-activity-assets */
export interface DiscordActivityAssets {
/** the id for a large asset of the activity, usually a snowflake */
large_image?: string;
/** text displayed when hovering over the large image of the activity */
large_text?: string;
/** the id for a small asset of the activity, usually a snowflake */
small_image?: string;
/** text displlayed when hovering over the small image of the activity */
small_text?: string;
}
/** https://discord.com/developers/docs/topics/gateway#activity-object-activity-secrets */
export interface DiscordActivitySecrets {
/** the secret for joining a party */
join?: string;
/** the secret for spectating a game */
spectate?: string;
/** the secret for a specific instanced match */
match?: string;
}
/** https://discord.com/developers/docs/topics/gateway#activity-object-activity-flags */
export enum DiscordActivityFlags {
INSTANCE = 1 << 0,
JOIN = 1 << 1,
SPECTATE = 1 << 2,
JOIN_REQUEST = 1 << 3,
SYNC = 1 << 4,
PLAY = 1 << 5,
}
/** https://discord.com/developers/docs/topics/gateway#get-gateway-bot-json-response */
export interface DiscordGetGatewayBot {
/** the WSS URL that can be used for connecting to the gateway */
url: string;
/** the recommended number of shards to use when connecting */
shards: number;
/** information on the current session start limit */
session_start_limit: DiscordSessionStartLimit;
}
/** https://discord.com/developers/docs/topics/gateway#session-start-limit-object-session-start-limit-structure */
export interface DiscordSessionStartLimit {
/** the total number of session starts the current user is allowed */
total: number;
/** the remaining number of session starts the current user is allowed */
remaining: number;
/** the number of milliseconds after which the limit resets */
reset_after: number;
/** the number of identify requests allowed per 5 seconds */
max_concurrency: number;
}

465
src/types/api/guild.ts Normal file
View File

@@ -0,0 +1,465 @@
import {
DiscordChannel,
DiscordChannelTypes,
DiscordEmoji,
DiscordMember,
DiscordOverwrite,
DiscordPresenceUpdateEvent,
DiscordRole,
DiscordUser,
DiscordVoiceStateUpdateEvent,
} from "./mod.ts";
/** https://discord.com/developers/docs/resources/guild#guild-object */
export interface DiscordGuild {
/** guild id */
id: string;
/** guild name (2-100 characaters, excluding trailing and leading whitespace) */
name: string;
/** icon hash */
icon: string | null;
/** icon hash, returned when in the template object */
icon_hash?: string | null;
/** splash hash */
splash: string | null;
/** discovery splash hash; only present for guilds with the "DISCOVERABLE" feature */
discovery_splash: string | null;
/** true if the user is the owner of the guild */
owner?: boolean;
/** id of the owner */
owner_id: string;
/** total permissions for the user in the guild (execludes overrides) */
permissions?: string;
/** voice region id for the guild */
region: string;
/** id of afk channel */
afk_channel_id: string | null;
/** afk timeout in seconds */
afk_timeout: number;
/** true if the server widget is enabled */
widget_enabled?: boolean;
/** the channel id that the widget will generate an invite to, or null if set to no invite */
widget_channel_id?: string | null;
/** verification level required for the guild */
verification_level: DiscordVerificationLevel;
/** default message notifications level */
default_message_notifications: DiscordDefaultMessageNotificationLevel;
/** explicit content filter level */
explicit_content_filter: DiscordExplicitContentFilterLevel;
/** roles in the guild */
roles: DiscordRole[];
/** custom guild emojis */
emojis: DiscordEmoji[];
/** enabled guild features */
features: DiscordGuildFeatures[];
/** required MFA level for the guild */
mfa_level: DiscordMFALevel;
/** application id of the guild creator if it is bot-created */
application_id: string | null;
/** the id of the channel where guild notices such as welcome messages and boost events are posted */
system_channel_id: string | null;
/** system channel flags */
system_channel_flags: DiscordSystemChannelFlags;
/** the id of the channel where community guilds can display rules and/or guidelines */
rules_channel_id: string | null;
/** when this guild was joined at */
joined_at?: string;
/** true if this is considered a large guild */
large?: boolean;
/** true if this guild is unavailable due to an outage */
unavailable?: boolean;
/** total number of members in this guild */
member_count?: number;
/** states of members currently in voice channels; lacks the guild_id key */
voice_states?: Partial<DiscordVoiceStateUpdateEvent>[];
/** users in the guild */
members?: DiscordMember[];
/** channels in the guild */
channels?: DiscordChannel[];
/** presences of the members in the guild, will only include non-offline members if the size is greater than large threshold */
presences?: Partial<DiscordPresenceUpdateEvent>[];
/** the maximum number of presences for the guild (the default value, currently 25000, is in effect when null is returned) */
max_presences?: number | null;
/** the maximum number of members for the guild */
max_members?: number;
/** the vaniy url code for the guild */
vanity_url_code: string | null;
/** the description for the guild, if the guild is discoverable */
description: string | null;
/** banner hash */
banner: string | null;
/** premium tier (Server Boost level) */
premium_tier: DiscordPremiumTier;
/** the number of boosts this guild currently has */
premium_subscription_count?: number;
/** the preferred locale of a Community guild; used in server discovery and notices from Discord; defaults to "en-US" */
preferred_locale: string;
/** the id of the channel where admins and moderators of Community guilds receive notices from Discord */
public_updates_channel_id: string | null;
/** the maximum amount of users in a video channel */
max_video_channel_users?: number;
/** approximate number of members in this guild, returned from the GET /guilds/<id> endpoint when with_counts is true */
approximate_member_count?: number;
/** approximate number of non-offline members in this guild, returned from the GET /guilds/<id> endpoint when with_counts is true */
approximate_presence_count?: number;
}
/** https://discord.com/developers/docs/resources/guild#guild-object-default-message-notification-level */
export enum DiscordDefaultMessageNotificationLevel {
ALL_MESSAGES,
ONLY_MENTIONS,
}
/** https://discord.com/developers/docs/resources/guild#guild-object-explicit-content-filter-level */
export enum DiscordExplicitContentFilterLevel {
DISABLED,
MEMBERS_WITHOUT_ROLES,
ALL_MEMBERS,
}
/** https://discord.com/developers/docs/resources/guild#guild-object-mfa-level */
export enum DiscordMFALevel {
NONE,
ELEVATED,
}
/** https://discord.com/developers/docs/resources/guild#guild-object-verification-level */
export enum DiscordVerificationLevel {
NONE,
LOW,
MEDIUM,
HIGH,
VERY_HIGH,
}
/** https://discord.com/developers/docs/resources/guild#guild-object-premium-tier */
export enum DiscordPremiumTier {
NONE,
TIER_1,
TIER_2,
TIER_3,
}
/** https://discord.com/developers/docs/resources/guild#guild-object-system-channel-flags */
export enum DiscordSystemChannelFlags {
SUPPRESS_JOIN_NOTIFICATIONS = 1 << 0,
SUPPRESS_PREMIUM_SUBSCRIPTIONS = 1 << 1,
}
/** https://discord.com/developers/docs/resources/guild#guild-object-guild-features */
export enum DiscordGuildFeatures {
INVITE_SPLASH,
VIP_REGIONS,
VANITY_URL,
VERIFIED,
PARTNERED,
COMMUNITY,
COMMERCE,
NEWS,
DISCOVERABLE,
FEATURABLE,
ANIMATED_ICON,
BANNER,
WELCOME_SCREEN_ENABLED,
MEMBER_VERIFICATION_GATE_ENABLED,
PREVIEW_ENABLED,
}
/** https://discord.com/developers/docs/resources/guild#unavailable-guild-object */
export type DiscordUnavailableGuild = Pick<DiscordGuild, "id" | "unavailable">;
/** https://discord.com/developers/docs/resources/guild#guild-preview-object */
export interface DiscordGuildPreview {
/** guild id */
id: string;
/** guild name (2-100 characters) */
name: string;
/** icon hash */
icon: string | null;
/** splash hash */
splash: string | null;
/** discovery splash hash */
discovery_splash: string | null;
/** custom guild emojis */
emojis: DiscordEmoji[];
/** enabled guild features */
features: DiscordGuildFeatures[];
/** approximate number of members in this guild */
approximate_member_count: number;
/** approximate number of online members in this guild */
approximate_presence_count: number;
/** the description for the guild */
description: string | null;
}
/** https://discord.com/developers/docs/resources/guild#guild-widget-object-guild-widget-structure */
export interface DiscordGuildWidget {
/** whether the widget is enabled */
enabled: boolean;
/** the widget channel id */
channel_id: string | null;
}
/** https://discord.com/developers/docs/resources/guild#ban-object */
export interface DiscordBan {
/** the reason for the ban */
reason: string | null;
/** the banned user */
user: DiscordUser;
}
export interface DiscordMembershipScreening {
/** when the fields were last updated */
version: string;
/** the steps in the screening form */
form_fields: DiscordMembershipScreeningField[];
/** the server description shown in the screening form */
description: string | null;
}
export interface DiscordMembershipScreeningField {
/** the type of field (currently "TERMS" is the only type) */
field_type: DiscordMembershipScreeningFieldTypes;
/** the title of the field */
label: string;
/** the list of rules */
values?: string[];
/** whether the user has to fill out this field */
required: boolean;
}
export enum DiscordMembershipScreeningFieldTypes {
/** Server Rules */
TERMS = "TERMS",
}
/** https://discord.com/developers/docs/resources/guild#create-guild */
export interface DiscordCreateGuildParams {
/** name of the guild (2-100 characters) */
name: string;
/** voice region id */
region?: string;
/** base64 128x128 image for the guild icon */
icon?: string;
/** verification level */
verification_level?: DiscordVerificationLevel;
/** default message notification level */
default_message_notifications?: DiscordDefaultMessageNotificationLevel;
/** explicit content filter level */
explicit_content_filter?: DiscordExplicitContentFilterLevel;
/** new guild roles (first role is the everyone role) */
roles?: DiscordRole[];
/** new guild's channels */
channels?: Partial<DiscordChannel>[];
/** id for afk channel */
afk_channel_id?: string;
/** afk timeout in seconds */
afk_timeout?: number;
/** the id of the channel where guild notices such as welcome messages and boost events are posted */
system_channel_id?: string;
}
/** https://discord.com/developers/docs/resources/guild#get-guild */
export interface DiscordGetGuildParams {
/** when true, will return approximate member and presence counts for the guild */
with_counts?: boolean;
}
/** https://discord.com/developers/docs/resources/guild#modify-guild */
export interface DiscordModifyGuildParams {
/** guild name */
name?: string;
/** guild voice region id */
region?: string | null;
/** verification level */
verification_level?: DiscordVerificationLevel | null;
/** default message notification filter level */
default_message_notifications?: DiscordDefaultMessageNotificationLevel | null;
/** explicit content filter level */
explicit_content_filter?: DiscordExplicitContentFilterLevel | null;
/** id for afk channel */
afk_channel_id?: string | null;
/** afk timeout in seconds */
afk_timeout?: number;
/** base64 1024x1024 png/jpeg/gif image for the guild icon (can be animated gif when the server has ANIMATED_ICON feature) */
icon?: string | null;
/** user id to transfer guild ownershop to (must be owner) */
owner_id?: string;
/** base64 16:9 png/jpeg image for the guild splash (when the server has INVITE_SPLASH feature) */
splash?: string | null;
/** base64 16:9 png/jpeg image for the guild banner (when the server has BANNER feature) */
banner?: string | null;
/** the id of the channel where guild notices such as welcome messages and boost events are posted */
system_channel_id?: string | null;
/** the id of the channel where Community guilds display rules and/or guidelines */
rules_channel_id?: string | null;
/** the id of the channel where admins and moderators of Community guilds receive notices from Discord */
public_updates_channel_id?: string | null;
/** the preferred locale of a Community guild used in server discovery and notices from Discord; defaults to "en-US" */
preferred_locale?: string | null;
}
/** https://discord.com/developers/docs/resources/guild#create-guild-channel */
export interface DiscordCreateGuildChannelParams {
/** channel name (2-100 characters) */
name: string;
/** the type of channel */
type?: DiscordChannelTypes;
/** channel topic (0-1024 characters) */
topic?: string;
/** the bitrate (in bits) of the voice channel (voice only) */
bitrate?: number;
/** the user limit of the voice channel (voice only) */
user_limit?: number;
/** amount of seconds a user has to wait before sending another message (0-21600); bots, as well as users with the permission manage_messages or manage_channel, are unaffected */
rate_limit_per_user?: number;
/** sorting position of the channel */
position?: number;
/** the channel's permission overwrites */
permission_overwrites?: DiscordOverwrite[];
/** id of the parent category for a channel */
parent_id?: string;
/** whether the channel is nsfw */
nsfw?: boolean;
}
/** https://discord.com/developers/docs/resources/guild#modify-guild-channel-positions */
export interface DiscordModifyGuildChannelPositionsParam {
/** channel id */
id: string;
/** sorting position of the channel */
position: number | null;
}
/** https://discord.com/developers/docs/resources/guild#list-guild-members */
export interface DiscordListGuildMembersParams {
/** max number of members to return (1-1000), default 1 */
limit: number;
/** the highest user id in the previous page, default 0 */
after: string;
}
/** https://discord.com/developers/docs/resources/guild#add-guild-member */
export interface DiscordAddGuildMemberParams {
/** an oauth2 access token granted with the guilds.join to the bot's application for the user you want to add to the guild */
access_token: string;
/** value to set users nickname to. Requires the MANAGE_NICKNAMES permission */
nick?: string;
/** array of role ids the member is assigned. Requires the MANAGE_ROLES permission */
roles?: string[];
/** whether the user is muted in voice channels. Requires the MUTE_MEMBERS permission */
mute?: boolean;
/** whether the user is deafened in voice channels. Requires the DEAFEN_MEMBERS permission */
deaf?: boolean;
}
/** https://discord.com/developers/docs/resources/guild#modify-guild-member */
export interface DiscordModifyGuildMemberParams {
/** value to set users nickname to. Requires the MANAGE_NICKNAMES permission */
nick?: string | null;
/** array of role ids the member is assigned. Requires the MANAGE_ROLES permission */
roles?: string[] | null;
/** whether the user is muted in voice channels. Will throw a 400 if the user is not in a voice channel. Requires the MUTE_MEMBERS permission */
mute?: boolean | null;
/** whether the user is deafened in voice channels. Will throw a 400 if the user is not in a voice channel. Requires the MOVE_MEMBERS permission */
deaf?: boolean | null;
/** id of channel to move user to (if they are connected to voice). Requires the MOVE_MEMBERS permission */
channel_id: string | null;
}
/** https://discord.com/developers/docs/resources/guild#modify-current-user-nick */
export interface DiscordModifyCurrentUserNickParams {
/** value to set users nickname to. Requires the CHANGE_NICKNAME permission */
nick?: string | null;
}
/** https://discord.com/developers/docs/resources/guild#create-guild-ban */
export interface DiscordCreateGuildBan {
/** number of days to delete messages for (0-7) */
delete_message_days?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7;
/** reason for the ban */
reason?: string;
}
/** https://discord.com/developers/docs/resources/guild#create-guild-role */
export interface DiscordCreateGuildRoleParams {
/** name of the role, default: "new role" */
name?: string;
/** bitwise value of the enabled/disabled permissions, default: everyone permissions in guild */
permissions?: string;
/** RGB color value, default: 0 */
color?: number;
/** whether the role should be displayed separately in the sidebar, default: false */
hoist?: boolean;
/** whether the role should be mentionable, default: false */
mentionable?: boolean;
}
/** https://discord.com/developers/docs/resources/guild#modify-guild-role-positions */
export interface DiscordModifyGuildRolePositionsParams {
/** role id */
id: string;
/** sorting position of the role */
position?: number | null;
}
/** https://discord.com/developers/docs/resources/guild#modify-guild-role */
export interface DiscordModifyGuildRoleParams {
/** name of the role */
name?: string | null;
/** bitwise value of the enabled/disabled permissions */
permissions?: string | null;
/** RGB color value */
color?: number | null;
/** whether the role should be displayed seperately in the sidebar */
hoist?: boolean | null;
/** whether the role should be mentionable */
mentionable?: boolean | null;
}
/** https://discord.com/developers/docs/resources/guild#get-guild-prune-count */
export interface DiscordGetGuildPruneCountParams {
/** number of days to count prune for (1 or more), default: 7 */
days?: number;
/** role(s) to include, default: none */
include_roles: string | string[];
}
/** https://discord.com/developers/docs/resources/guild#begin-guild-prune */
export interface DiscordBeginGuildPruneParams {
/** number of days to prune (1 or more), default: 7 */
days?: number;
/** whether 'pruned' is returned, discouraged for large guilds, default: true */
compute_prune_count?: boolean;
/** role(s) ro include, default: none */
include_roles?: string[];
}
/** https://discord.com/developers/docs/resources/guild#modify-guild-integration */
export interface DiscordGetGuildWidgetImageParams {
/** style of the widget returned, default: shield */
style?: DiscordGetGuildWidgetImageStyleOptions;
}
/** https://discord.com/developers/docs/resources/guild#modify-guild-integration */
export enum DiscordGetGuildWidgetImageStyleOptions {
/** shield style widget with Discord icon and guild members online count */
SHIELD = "shield",
/** large image with guild icon, name and online count. "POWERED BY DISCORD" as the footer of the widget */
BANNER_1 = "banner1",
/** smaller widget style with guild icon, name and online count. Split on the right with Discord logo */
BANNER_2 = "banner2",
/** large image with guild icon, name and online count. In the footer, Discord logo on the left and "Chat Now" on the right */
BANNER_3 = "banner3",
/** large Discord logo at the top of the widget. Guild icon, name and online count in the middle portion of the widget and a "JOIN MY SERVER" button at the bottom */
BANNER_4 = "banner4",
}
export interface DiscordModifyGuildMembershipScreeningFormParams {
/** whether Membership Screening is enabled */
enabled: boolean;
/** arrray of field objects serialized in a string */
form_fields: string;
/** the server description to show in the screening form */
description: string;
}

3
src/types/api/image.ts Normal file
View File

@@ -0,0 +1,3 @@
/** https://discord.com/developers/docs/reference#image-formatting */
export type DiscordImageSize = 16 | 32 | 64 | 128 | 256 | 512 | 1024 | 2048;
export type DiscordImageFormat = "jpg" | "jpeg" | "png" | "webp" | "gif";

View File

@@ -0,0 +1,145 @@
import { DiscordUser } from "./mod.ts";
/** https://discord.com/developers/docs/resources/guild#integration-object-integration-structure */
export interface DiscordIntegration {
/** integration id */
id: string;
/** integration name */
name: string;
/** integration type (twitch, youtube, or discord) */
type: string;
/** is this integration enabled */
enabled: boolean;
/** is this integration syncing */
syncing?: boolean;
/** id that this integration uses for "subscribers" */
role_id?: string;
/** whether emoticons should be synced for this integration (twitch only currently) */
enable_emoticons?: boolean;
/** the behavior of expiring subscribers */
expire_behavior?: DiscordIntegrationExpireBehavior;
/** the grace period (in days) before expiring subscribers */
expire_grace_period?: number;
/** user for this integration */
user?: DiscordUser;
/** integration account information */
account: DiscordIntegrationAccount;
/** when this integration was last synced */
synced_at?: string;
/** how many subscribers this integration has */
subscriber_count: number;
/** has this integration been revoked */
revoked?: boolean;
/** the bot/OAuth2 application for discord integrations */
application?: DiscordIntegrationApplication;
}
/** https://discord.com/developers/docs/resources/guild#integration-object-integration-expire-behaviors */
export enum DiscordIntegrationExpireBehavior {
REMOVE_ROLE,
KICK,
}
/** https://discord.com/developers/docs/resources/guild#integration-account-object */
export interface DiscordIntegrationAccount {
/** id of the account */
id: string;
/** name of the account */
name: string;
}
/** https://discord.com/developers/docs/resources/guild#integration-application-object */
export interface DiscordIntegrationApplication {
/** the id of the app */
id: string;
/** the name of the app */
name: string;
/** the icon hash of the app */
icon: string | null;
/** the description of the app */
description: string;
/** the summary of the app */
summary: string;
/** If this application is a game sold on Discord, this field will be the hash of the image on store embeds */
cover_image?: string;
/** the bot associated with this application */
bot?: DiscordUser;
}
/** https://discord.com/developers/docs/resources/guild#integration-object-integration-structure */
export interface DiscordIntegration {
/** integration id */
id: string;
/** integration name */
name: string;
/** integration type (twitch, youtube, or discord) */
type: string;
/** is this integration enabled */
enabled: boolean;
/** is this integration syncing */
syncing?: boolean;
/** id that this integration uses for "subscribers" */
role_id?: string;
/** whether emoticons should be synced for this integration (twitch only currently) */
enable_emoticons?: boolean;
/** the behavior of expiring subscribers */
expire_behavior?: DiscordIntegrationExpireBehavior;
/** the grace period (in days) before expiring subscribers */
expire_grace_period?: number;
/** user for this integration */
user?: DiscordUser;
/** integration account information */
account: DiscordIntegrationAccount;
/** when this integration was last synced */
synced_at?: string;
/** how many subscribers this integration has */
subscriber_count: number;
/** has this integration been revoked */
revoked?: boolean;
/** the bot/OAuth2 application for discord integrations */
application?: DiscordIntegrationApplication;
}
/** https://discord.com/developers/docs/resources/guild#integration-account-object */
export interface DiscordIntegrationAccount {
/** id of the account */
id: string;
/** name of the account */
name: string;
}
/** https://discord.com/developers/docs/resources/guild#integration-application-object */
export interface DiscordIntegrationApplication {
/** the id of the app */
id: string;
/** the name of the app */
name: string;
/** the icon hash of the app */
icon: string | null;
/** the description of the app */
description: string;
/** the summary of the app */
summary: string;
/** If this application is a game sold on Discord, this field will be the hash of the image on store embeds */
cover_image?: string;
/** the bot associated with this application */
bot?: DiscordUser;
}
/** https://discord.com/developers/docs/resources/guild#create-guild-integration */
export interface DiscordCreateGuildIntegrationParams {
/** the integration type */
type: string;
/** the integration id */
id: string;
}
/** https://discord.com/developers/docs/resources/guild#modify-guild-integration */
export interface DiscordModifyGuildIntegration {
/** the behavior when an integration subscription lapses (see the integration expire behaviors documentation) */
expire_behavior?: number | null;
/** perios (in days) where the integration will ignore lapsed subscriptions */
expire_grace_period?: number | null;
/** whether emoticons should be synced for this integration (twitch only currently) */
enable_emoticons?: boolean | null;
}

View File

@@ -0,0 +1,102 @@
import { DiscordMember } from "./mod.ts";
export interface DiscordInteractionCommand {
/** id of the interaction */
id: string;
/** the type of interaction */
type: DiscordInteractionType;
/** the command data payload */
data?: DiscordInteractionData;
/** the guild it was sent from */
guild_id: string;
/** the channel it was sent from */
channel_id: string;
/** guild member data for the invoking user */
member: DiscordMember;
/** a continuation token for responding to the interaction */
token: string;
/** read-only property, always 1 */
version: number;
}
export enum DiscordInteractionType {
/** This type is for ACK on webhook only setup. Discord may send these which require. In a sense its a heartbeat. */
PING = 1,
/** Slash commands */
APPLICATION_COMMAND,
}
export interface DiscordInteractionData {
/** the ID of the invoked command */
id: string;
/** the name of the invoked command */
name: string;
/** the params + values from the user */
options: DiscordInteractionDataOption[];
}
export interface DiscordInteractionDataOption {
/** the name of the parameter */
name: string;
/** the value of the pair. present if there was no more options */
value?: string | number;
/** present if this option is a group or subcommand */
options?: DiscordInteractionDataOption[];
}
/** https://discord.com/developers/docs/interactions/slash-commands#applicationcommand */
export interface DiscordApplicationCommand {
/** unique id of the command */
id: string;
/** unique id of the parent application */
"application_id": string;
/** 3-32 character name matching `^[\w-]{3,32}$` */
name: string;
/** 1-100 character description */
description: string;
/** the parameters for the command */
options?: DiscordApplicationCommandOption[];
}
/** https://discord.com/developers/docs/interactions/slash-commands#applicationcommandoption */
export interface DiscordApplicationCommandOption {
/** the type of the option */
type: DiscordApplicationCommandOptionType;
/** 1-32 character name matching `^[\w-]{1,32}$` */
name: string;
/** 1-100 character description */
description: string;
/** the first `required` option for the user to complete--only one option can be `default` */
default?: boolean;
/** if the parameter is required or optional--default `false` */
required?: boolean;
/** choices for `string` and `int` types for the user to pick from */
choices?: DiscordApplicationCommandOptionChoice[];
/** if the option is a subcommand or subcommand group type, this nested options will be the parameters */
options?: DiscordApplicationCommandOption[];
}
/** https://discord.com/developers/docs/interactions/slash-commands#Discordapplicationcommandoptiontype */
export enum DiscordApplicationCommandOptionType {
SUB_COMMAND = 1,
SUB_COMMAND_GROUP,
STRING,
INTEGER,
BOOLEAN,
USER,
CHANNEL,
ROLE,
}
/** https://discord.com/developers/docs/interactions/slash-commands#applicationcommandoptionchoice */
export interface DiscordApplicationCommandOptionChoice {
/** 1-100 character choice name */
name: string;
/** value of the choice */
value: string | number;
}
export type DiscordApplicationCommandEvent = DiscordApplicationCommand & {
/** id of the guild the command is in */
guild_id?: string;
};

46
src/types/api/invite.ts Normal file
View File

@@ -0,0 +1,46 @@
import { DiscordChannel, DiscordGuild, DiscordUser } from "./mod.ts";
/** https://discord.com/developers/docs/resources/invite#invite-object */
export interface DiscordInvite {
/** the invite code (unique ID) */
code: string;
/** the guild this invite is for */
guild?: Partial<DiscordGuild>;
/** the channel this invite is for */
channel: Partial<DiscordChannel>;
/** the user who created the invite */
inviter?: DiscordUser;
/** the target user for this invite */
target_user?: Partial<DiscordUser>;
/** the type of user target for this invite */
target_user_type?: DiscordInviteTargetUserTypes;
/** approximate count of online members (only present when target_user is set) */
approximate_presence_count?: number;
/** approximate count of total members */
approximate_member_count: number;
}
/** https://discord.com/developers/docs/resources/invite#invite-resource */
export enum DiscordInviteTargetUserTypes {
STREAM = 1,
}
/** https://discord.com/developers/docs/resources/invite#invite-resource */
export interface DiscordInviteMetadata extends DiscordInvite {
/** number of times this invite has been used */
uses: number;
/** max number of times this invite can be used */
max_uses: number;
/** duration (in seconds) after which the invite expires */
max_age: number;
/** whether this invite only grants temporary membership */
temporary: boolean;
/** when this invite was created */
created_at: string;
}
/** https://discord.com/developers/docs/resources/invite#get-invite */
export interface DiscordGetInviteURLParams {
/** whether the invite should contain approximate member counts */
with_counts?: boolean;
}

89
src/types/api/member.ts Normal file
View File

@@ -0,0 +1,89 @@
export interface DiscordBaseUser {
/** the user's id */
id: string;
/** 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;
}
/** https://discord.com/developers/docs/resources/user#users-resource */
export interface DiscordUser extends DiscordBaseUser {
/** the user's id */
id: string;
/** 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;
/** whether the user has two factor enabled on their account */
mfa_enabled?: boolean;
/** the user's chosen language option */
locale?: string;
/** whether the email on this account has been verified */
verified?: boolean;
/** the user's email */
email?: string | null;
/** the flags on a user's account */
flags?: DiscordUserFlags;
/** the type of Nitro subscription on a user's account */
premium_type?: DiscordPremiumTypes;
/** the public flags on a user's account */
public_flags?: DiscordUserFlags;
}
/** https://discord.com/developers/docs/resources/user#users-resource */
export enum DiscordUserFlags {
NONE = 0,
DISCORD_EMPLOYEE = 1 << 0,
PARTNERED_SERVER_OWNER = 1 << 1,
HYPE_SQUAD_EVENTS = 1 << 2,
BUG_HUNTER_LEVEL_1 = 1 << 3,
HOUSE_BRAVERY = 1 << 6,
HOUSE_BRILLIANCE = 1 << 7,
HOUSE_BALANCE = 1 << 8,
EARLY_SUPPORTER = 1 << 9,
TEAM_USER = 1 << 10,
SYSTEM = 1 << 12,
BUG_HUNTER_LEVEL_2 = 1 << 14,
VERIFIED_BOT = 1 << 16,
EARLY_VERIFIED_BOT_DEVELOPER = 1 << 17,
}
/** https://discord.com/developers/docs/resources/user#users-resource */
export enum DiscordPremiumTypes {
NONE = 0,
NITRO_CLASSIC = 1,
NITRO = 2,
}
/** https://discord.com/developers/docs/resources/guild#guild-member-object-guild-member-structure */
export interface DiscordBaseMember {
/** this users guild nickname */
nick: string | null;
/** array of role payload ids */
roles: string[];
/** when the user joined the guild */
joined_at: string;
/** when the user started boosting the guild */
premium_since?: string | null;
/** whether the user is deafened in voice channels */
deaf: boolean;
/** whether the user is muted in voice channels */
mute: boolean;
/** whether the user has not yet passed the guild's Membership Screening requirements */
pending?: boolean;
}
/** https://discord.com/developers/docs/resources/guild#guild-member-object-guild-member-structure */
export interface DiscordMember {
/** the user this guild member represents */
user?: DiscordUser;
}

290
src/types/api/message.ts Normal file
View File

@@ -0,0 +1,290 @@
import { DiscordMember } from "./member.ts";
import {
DiscordBaseMember,
DiscordChannelTypes,
DiscordEmbed,
DiscordEmoji,
DiscordUser,
} from "./mod.ts";
/** https://discord.com/developers/docs/resources/channel#message-object-message-structure */
export interface DiscordMessage {
/** id of the message */
id: string;
/** id of the channel the message was sent in */
channel_id: string;
/** id of the guild the message was sent in */
guild_id?: string;
/** the author of this message (not guaranteed to be a valid user) */
author: DiscordUser;
/** member properties for this message's author */
member?: DiscordBaseMember;
/** contents of the message */
content: string;
/** when this message was sent */
timestamp: string;
/** when this message was edited (or null if never) */
edited_timestamp: string | null;
/** whether this was a TTS message */
tts: boolean;
/** whether this message mentions everyone */
mention_everyone: boolean;
/** users specifically mentioned in the message */
mentions: (DiscordUser & Partial<DiscordMember>)[];
/** roles specifically mentioned in this message */
mention_roles: string[];
/** channels specifically mentioned in this message */
mention_channels?: DiscordChannelMention[];
/** any attached files */
attachments: DiscordAttachment[];
/** any embedded content */
embeds: DiscordEmbed[];
/** reactions to the message */
reactions?: DiscordReaction[];
/** used for validating a message was sent */
nonce?: number | string;
/** whether this message is pinned */
pinned: boolean;
/** if the message is generated by a webhook, this is the webhook's id */
webhook_id?: string;
/** type of message */
type: DiscordMessageTypes;
/** sent with Rich Presence-related chat embeds */
activity?: DiscordMessageActivity;
/** sent with Rich Presence-related chat embeds */
application?: DiscordMessageApplication;
/** reference data sent with crossposted messages and replies */
message_reference?: DiscordMessageReference;
/** message flags combined as a bitfield */
flags?: DiscordMessageFlags;
/** the stickers sent with the message (bots currently can only receive messages with stickers, not send) */
stickers?: DiscordMessageSticker[];
/** the message associated with the `message_reference` */
referenced_message?: DiscordMessage | null;
}
/** https://discord.com/developers/docs/resources/channel#message-object-message-types */
export enum DiscordMessageTypes {
DEFAULT,
RECIPIENT_ADD,
RECIPIENT_REMOVE,
CALL,
CHANNEL_NAME_CHANGE,
CHANNEL_ICON_CHANGE,
CHANNEL_PINNED_MESSAGE,
GUILD_MEMBER_JOIN,
USER_PREMIUM_GUILD_SUBSCRIPTION,
USER_PREMIUM_GUILD_SUBSCRIPTION_TIER_1,
USER_PREMIUM_GUILD_SUBSCRIPTION_TIER_2,
USER_PREMIUM_GUILD_SUBSCRIPTION_TIER_3,
CHANNEL_FOLLOW_ADD,
GUILD_DISCOVERY_DISQUALIFIED = 14,
GUILD_DISCOVERY_REQUALIFIED,
GUILD_DISCOVERY_GRACE_PERIOD_INITIAL_WARNING,
GUILD_DISCOVERY_GRACE_PERIOD_FINAL_WARNING,
REPLY = 19,
APPLICATION_COMMAND,
}
/** https://discord.com/developers/docs/resources/channel#message-object-message-activity-structure */
export interface DiscordMessageActivity {
/** type of message activity */
type: DiscordMessageActivityTypes;
/** party_id from a Rich Presence event */
party_id?: string;
}
/** https://discord.com/developers/docs/resources/channel#message-object-message-application-structure */
export interface DiscordMessageApplication {
/** id of the application */
id: string;
/** id of the embed's image asset */
cover_image?: string;
/** application's description */
description: string;
/** id of the application's icon */
icon: string | null;
/** name of the application */
name: string;
}
/** https://discord.com/developers/docs/resources/channel#message-object-message-reference-structure */
export interface DiscordMessageReference {
/** id of the originating message */
message_id?: string;
/** id of the originating message's channel */
channel_id?: string;
/** id of the originating message's guild */
guild_id?: string;
}
/** https://discord.com/developers/docs/resources/channel#message-object-message-activity-types */
export enum DiscordMessageActivityTypes {
JOIN = 1,
SPECTATE,
LISTEN,
JOIN_REQUEST = 5,
}
/** https://discord.com/developers/docs/resources/channel#message-object-message-flags */
export enum DiscordMessageFlags {
/** this message has been published to subscribed channels (via Channel Following) */
CROSSPOSTED = 1 << 0,
/** this message originated from a message in another channel (via Channel Following) */
IS_CROSSPOST = 1 << 1,
/** do not include any embeds when serializing this message */
SUPPRESS_EMBEDS = 1 << 2,
/** the source message for this crosspost has been deleted (via Channel Following) */
SOURCE_MESSAGE_DELETED = 1 << 3,
/** this message came from the urgent message system */
URGENT = 1 << 4,
}
/** https://discord.com/developers/docs/resources/channel#message-object-message-sticker-structure */
export interface DiscordMessageSticker {
/** id of the sticker */
id: string;
/** id of the pack the sticker is from */
pack_id: string;
/** name of the sticker */
name: string;
/** description of the sticker */
description: string;
/** a comma-separated list of tags for the sticker */
tags?: string;
/** sticker asset hash */
asset: string;
/** sticker preview asset hash */
preview_asset: string | null;
/** type of sticker format */
format_type: DiscordMessageStickerFormatTypes;
}
/** https://discord.com/developers/docs/resources/channel#message-object-message-sticker-format-types */
export enum DiscordMessageStickerFormatTypes {
PNG = 1,
APNG,
LOTTIE,
}
/** https://discord.com/developers/docs/resources/channel#reaction-object-reaction-structure */
export interface DiscordReaction {
/** times this emoji has been used to react */
count: number;
/** whether the current user reacted using this emoji */
me: boolean;
/** emoji information */
emoji: Partial<DiscordEmoji>;
}
/** https://discord.com/developers/docs/resources/channel#attachment-object-attachment-structure */
export interface DiscordAttachment {
/** attachment id */
id: string;
/** name of file attached */
filename: string;
/** size of file in bytes */
size: number;
/** source url of file */
url: string;
/** a proxied url of file */
proxy_url: string;
/** height of file (if image) */
height?: number | null;
/** width of file (if image) */
width?: number | null;
}
/** https://discord.com/developers/docs/resources/channel#channel-mention-object-channel-mention-structure */
export interface DiscordChannelMention {
/** id of the channel */
id: string;
/** id of the guild containing the channel */
guild_id: string;
/** the type of channel */
type: DiscordChannelTypes;
/** the name of the channel */
name: string;
}
/** https://discord.com/developers/docs/resources/channel#allowed-mentions-object-allowed-mention-types */
export enum AllowedMentionTypes {
/** Controls role mentions */
ROLES = "roles",
/** Controls user mentions */
USERS = "users",
/** Controls `@everyone` and `@here` mentions */
EVERYONE = "everyone",
}
/** https://discord.com/developers/docs/resources/channel#allowed-mentions-object-allowed-mentions-structure */
export interface DiscordAllowedMentions {
/** An array of allowed mention types to parse from the content. */
parse: AllowedMentionTypes[];
/** Array of role_ids to mention (Max size of 100) */
roles: string[];
/** Array of user_ids to mention (Max size of 100) */
users: string[];
/** For replies, whether to mention the author of the message being replied to (default false) */
replied_user: boolean;
}
/** https://discord.com/developers/docs/resources/channel#get-channel-messages-query-string-params */
export interface DiscordGetChannelMessagesParams {
/** get messages around this message ID */
around?: string;
/** get messages before this message ID */
before?: string;
/** get messages after this message ID */
after?: string;
/** max number of messages to return (1-100) */
limit?: number;
}
/** https://discord.com/developers/docs/resources/channel#create-message-params */
export interface DiscordCreateMessageParams {
/** the message contents (up to 2000 characters) */
content?: string;
/** a nonce that can be used for optimistic message sending */
nonce?: number | string;
/** `true` if this is a TTS message */
tts: boolean;
/** the contents of the file being sent */
file?: { blob: unknown; name: string };
/** embedded rich content */
embed?: DiscordEmbed;
/** JSON encoded body of any additional request fields. */
payload_json?: string;
/** allowed mentions for a message */
allowed_mentions?: DiscordAllowedMentions;
/** include to make your message a reply */
message_reference?: DiscordMessageReference;
}
/** https://discord.com/developers/docs/resources/channel#get-reactions-query-string-params */
export interface DiscordGetReactionsParams {
/** get users before this user ID */
before?: string;
/** get users after this user ID */
after?: string;
/** max number of users to return (1-100) */
limit?: number;
}
/** https://discord.com/developers/docs/resources/channel#edit-message-json-params */
export interface DiscordEditMessageParams {
/** the new message contents (up to 2000 characters) */
content?: string | null;
/** embedded rich content */
embed?: DiscordEmbed | null;
/** edit the flags of a message (only SUPPRESS_EMBEDS can currently be set/unset) */
flags?: DiscordMessageFlags | null;
/** allowed mentions for the message */
allowed_mentions?: DiscordAllowedMentions | null;
}
/** https://discord.com/developers/docs/resources/channel#bulk-delete-messages-json-params */
export interface DiscordBulkDeleteMessagesParams {
/** an array of message ids to delete (2-100) */
messages: string[];
}

22
src/types/api/mod.ts Normal file
View File

@@ -0,0 +1,22 @@
export * from "./auditlog.ts";
export * from "./channel.ts";
export * from "./code.ts";
export * from "./embed.ts";
export * from "./emoji.ts";
export * from "./event.ts";
export * from "./gateway.ts";
export * from "./guild.ts";
export * from "./image.ts";
export * from "./integration.ts";
export * from "./interaction.ts";
export * from "./invite.ts";
export * from "./member.ts";
export * from "./message.ts";
export * from "./oauth2.ts";
export * from "./permission.ts";
export * from "./ratelimits.ts";
export * from "./role.ts";
export * from "./teams.ts";
export * from "./template.ts";
export * from "./voice.ts";
export * from "./webhook.ts";

37
src/types/api/oauth2.ts Normal file
View File

@@ -0,0 +1,37 @@
import { DiscordTeam, DiscordUser } from "./mod.ts";
/** https://discord.com/developers/docs/topics/oauth2#get-current-application-information */
export interface DiscordApplication {
/** id of the app */
id: string;
/** 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 rpx 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_grand: boolean;
/** partial user object containing info on the owner of the application */
owner: Partial<DiscordUser>;
/** if this application is a game sold on Disccord, this field will be the summary field for the store page of its primary sku */
summary: string;
/** the base64 enccoded key for the GameSDK'S GetTicket */
verify_key: string;
/** if the application belongs to a team, this will be a list of the members of that team */
team: DiscordTeam | null;
/** if this application is a game sold on Discord, this field will be the guild to which it has been linked */
guild_id?: string;
/** 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?: string;
/** if this application is a game sold on Discord, this field will be the URL slug that links to the store page */
slug?: string;
/** if this application is a game sold on Discord, this field wil be the hash of the image on store embeds */
cover_image?: string;
/** the application's public flags */
flags: number;
}

View File

@@ -0,0 +1,10 @@
export interface DiscordOverwrite {
/** role or user id */
id: string;
/** either 0 (role) or 1 (member) */
type: number;
/** permission bit set */
allow: string;
/** permission bit set */
deny: string;
}

View File

@@ -0,0 +1,9 @@
/** https://discord.com/developers/docs/topics/rate-limits#exceeding-a-rate-limit */
export interface DiscordRateLimitResponse {
/** a message saying you are being rate limited */
message: string;
/** the number of seconds to wait before submitting another request. */
retry_after: number;
/** a value indicating if you are being globally limited or not */
global: boolean;
}

31
src/types/api/role.ts Normal file
View File

@@ -0,0 +1,31 @@
/** https://discord.com/developers/docs/topics/permissions#role-object-role-structure */
export interface DiscordRole {
/** role id */
id: string;
/** role name */
name: string;
/** number representation of hexadecimal color code */
color: number;
/** if this role is pinned in the user listing */
hoist: boolean;
/** position of this role */
position: number;
/** permission bit set */
permissions: string;
/** whether this role is managed by an integration */
managed: boolean;
/** whether this role is mentionable */
mentionable: boolean;
/** the tags this role has */
tags?: DiscordRoleTags;
}
/** https://discord.com/developers/docs/topics/permissions#role-object-role-tags-structure */
export interface DiscordRoleTags {
/** the id of the bot this role belongs to */
bot_id?: string;
/** the id of the integration this role belongs to */
integration_id?: string;
/** whether this is the guild's premium subscriber role */
premium_subscriber?: null;
}

31
src/types/api/teams.ts Normal file
View File

@@ -0,0 +1,31 @@
import { DiscordBaseUser } from "./mod.ts";
/** https://discord.com/developers/docs/topics/teams#data-models-team-object */
export interface DiscordTeam {
/** a hash of the image of the team's icon */
icon: string | null;
/** the unique id of the team */
id: string;
/** the members of the team */
members: DiscordTeamMembers[];
/** the user id of the current team owner */
owner_user_id: string;
}
/** https://discord.com/developers/docs/topics/teams#data-models-team-members-object */
export interface DiscordTeamMembers {
/** the user's membership state on the team */
membership_state: keyof typeof DiscordMembershipState;
/** will always be ["*"] */
permissions: string[];
/** the id of the parent team of which they are a member */
team_id: string;
/** the avatar, discriminator, id, and username of the user */
user: DiscordBaseUser;
}
/** https://discord.com/developers/docs/topics/teams#data-models-membership-state-enum */
export enum DiscordMembershipState {
INVITED = 1,
ACCEPTED,
}

51
src/types/api/template.ts Normal file
View File

@@ -0,0 +1,51 @@
import { DiscordGuild, DiscordUser } from "./mod.ts";
/** https://discord.com/developers/docs/resources/template#template-resource */
export interface DiscordTemplate {
/** the template code (unique ID) */
code: string;
/** template name */
name: string;
/** the description for the template */
description: string | null;
/** number of times this template has been used */
usage_count: number;
/** the ID of teh user who created the template */
creator_id: string;
/** the user who created the template */
creator: DiscordUser;
/** when this template was created*/
created_at: string;
/** when this template was last synced to the source guild */
updated_at: string;
/** the ID of the guild this template is based on */
source_guild_id: string;
/** the guild snapshot this template contains */
serialized_source_guild: Partial<DiscordGuild>;
/** whether the template has unsynced changes */
is_dirty: boolean | null;
}
/** https://discord.com/developers/docs/resources/template#create-guild-from-template */
export interface DiscordCreateGuildFromTemplateParams {
/** name of the guild (2-100 characters) */
name: string;
/** base64 128x128 image for the guild icon */
icon?: string;
}
/** https://discord.com/developers/docs/resources/template#create-guild-template */
export interface DiscordCreateGuildTemplateParams {
/** name of the template (1-100 characters) */
name: string;
/** description for the template (0-120 characters) */
description?: string | null;
}
/** https://discord.com/developers/docs/resources/template#modify-guild-template */
export interface DiscordModifyGuildTemplateParams {
/** name of the template (1-100 characters) */
name?: string;
/** description for the template (0-120 characters) */
description?: string | null;
}

14
src/types/api/voice.ts Normal file
View File

@@ -0,0 +1,14 @@
export interface DiscordVoiceRegion {
/** unique ID for the region */
id: string;
/** name of the region */
name: string;
/** true if this is a vip-only server */
vip: boolean;
/** true for a single server that is closet to the current user's client */
optimal: boolean;
/** whether this is a deprecated voice region (avoid switching to these) */
deprecated: boolean;
/** whether this is a custom voice region (used for events/etc) */
custom: boolean;
}

31
src/types/api/webhook.ts Normal file
View File

@@ -0,0 +1,31 @@
import { DiscordUser } from "./mod.ts";
/** https://discord.com/developers/docs/resources/webhook#webhook-resource */
export interface DiscordWebhook {
/** the id of the webhook */
id: string;
/** the type of the webhook */
type: DiscordWebhookTypes;
/** the guild id this webhook is for */
guild_id?: string;
/** the channel id this webhook is for */
channel_id: string;
/** the user this webhook was created by (not returned when getting a webhook with its token) */
user?: DiscordUser;
/** the default name of the webhook */
name: string | null;
/** the default avatar of the webhook */
avatar: string | null;
/** the secure token of the webhook (returned for Incoming Webhooks) */
token?: string;
/** the bot/OAuth2 application that created this webhook */
application_id: string | null;
}
/** https://discord.com/developers/docs/resources/webhook#webhook-resource */
export enum DiscordWebhookTypes {
/** Incoming Webhook can post messages to channels with a generated token */
INCOMING = 1,
/** Channel Follower Webhooks are internal webhooks used with Channel Following to post new messages into channels */
CHANNEL_FOLLOWER,
}

View File

@@ -1,2 +1,6 @@
// TODO: v11 Remove
/** @deprecated Use DiscordImageSize */
export type ImageSize = 16 | 32 | 64 | 128 | 256 | 512 | 1024 | 2048;
// TODO: v11 Remove
/** @deprecated Use DiscordImageFormat */
export type ImageFormats = "jpg" | "jpeg" | "png" | "webp" | "gif";

View File

@@ -1,48 +1,73 @@
export enum Errors {
MISSING_SEND_MESSAGES = "MISSING_SEND_MESSAGES",
MISSING_MANAGE_ROLES = "MISSING_MANAGE_ROLES",
MISSING_KICK_MEMBERS = "MISSING_KICK_MEMBERS",
MISSING_VIEW_CHANNEL = "MISSING_VIEW_CHANNEL",
MISSING_READ_MESSAGE_HISTORY = "MISSING_READ_MESSAGE_HISTORY",
MISSING_MANAGE_NICKNAMES = "MISSING_MANAGE_NICKNAMES",
MISSING_MUTE_MEMBERS = "MISSING_MUTE_MEMBERS",
MISSING_DEAFEN_MEMBERS = "MISSING_DEAFEN_MEMBERS",
MISSING_SEND_TTS_MESSAGE = "MISSING_SEND_TTS_MESSAGE",
MISSING_MANAGE_MESSAGES = "MISSING_MANAGE_MESSAGES",
MISSING_MANAGE_CHANNELS = "MISSING_MANAGE_CHANNELS",
MISSING_CREATE_INSTANT_INVITE = "MISSING_CREATE_INSTANT_INVITE",
MISSING_MANAGE_WEBHOOKS = "MISSING_MANAGE_WEBHOOKS",
MISSING_MANAGE_EMOJIS = "MISSING_MANAGE_EMOJIS",
MISSING_BAN_MEMBERS = "MISSING_BAN_MEMBERS",
MISSING_MANAGE_GUILD = "MISSING_MANAGE_GUILD",
MISSING_VIEW_AUDIT_LOG = "MISSING_VIEW_AUDIT_LOG",
MISSING_EMBED_LINKS = "MISSING_EMBED_LINKS",
MISSING_ADD_REACTIONS = "MISSING_ADD_REACTIONS",
DELETE_MESSAGES_MIN = "DELETE_MESSAGES_MIN",
// Bot Role errors
BOTS_HIGHEST_ROLE_TOO_LOW = "BOTS_HIGHEST_ROLE_TOO_LOW",
// Channel Errors
CHANNEL_NOT_FOUND = "CHANNEL_NOT_FOUND",
CHANNEL_NOT_IN_GUILD = "CHANNEL_NOT_IN_GUILD",
CHANNEL_NOT_TEXT_BASED = "CHANNEL_NOT_TEXT_BASED",
MESSAGE_MAX_LENGTH = "MESSAGE_MAX_LENGTH",
NICKNAMES_MAX_LENGTH = "NICKNAMES_MAX_LENGTH",
RULES_CHANNEL_CANNOT_BE_DELETED = "RULES_CHANNEL_CANNOT_BE_DELETED",
UPDATES_CHANNEL_CANNOT_BE_DELETED = "UPDATES_CHANNEL_CANNOT_BE_DELETED",
// Guild Errors
GUILD_NOT_DISCOVERABLE = "GUILD_NOT_DISCOVERABLE",
GUILD_NOT_FOUND = "GUILD_NOT_FOUND",
MEMBER_NOT_FOUND = "MEMBER_NOT_FOUND",
PRUNE_MAX_DAYS = "PRUNE_MAX_DAYS",
ROLE_NOT_FOUND = "ROLE_NOT_FOUND",
// Message Delete Errors
DELETE_MESSAGES_MIN = "DELETE_MESSAGES_MIN",
PRUNE_MIN_DAYS = "PRUNE_MIN_DAYS",
RATE_LIMIT_RETRY_MAXED = "RATE_LIMIT_RETRY_MAXED",
// Interaction Errors
INVALID_SLASH_DESCRIPTION = "INVALID_SLASH_DESCRIPTION",
INVALID_SLASH_NAME = "INVALID_SLASH_NAME",
// Webhook Errors
INVALID_WEBHOOK_NAME = "INVALID_WEBHOOK_NAME",
INVALID_WEBHOOK_OPTIONS = "INVALID_WEBHOOK_OPTIONS",
// Permission Errors
MISSING_ADD_REACTIONS = "MISSING_ADD_REACTIONS",
MISSING_ADMINISTRATOR = "MISSING_ADMINISTRATOR",
MISSING_ATTACH_FILES = "MISSING_ATTACH_FILES",
MISSING_BAN_MEMBERS = "MISSING_BAN_MEMBERS",
MISSING_CHANGE_NICKNAME = "MISSING_CHANGE_NICKNAME",
MISSING_CONNECT = "MISSING_CONNECT",
MISSING_CREATE_INSTANT_INVITE = "MISSING_CREATE_INSTANT_INVITE",
MISSING_DEAFEN_MEMBERS = "MISSING_DEAFEN_MEMBERS",
MISSING_EMBED_LINKS = "MISSING_EMBED_LINKS",
MISSING_INTENT_GUILD_MEMBERS = "MISSING_INTENT_GUILD_MEMBERS",
MISSING_KICK_MEMBERS = "MISSING_KICK_MEMBERS",
MISSING_MANAGE_CHANNELS = "MISSING_MANAGE_CHANNELS",
MISSING_MANAGE_EMOJIS = "MISSING_MANAGE_EMOJIS",
MISSING_MANAGE_GUILD = "MISSING_MANAGE_GUILD",
MISSING_MANAGE_MESSAGES = "MISSING_MANAGE_MESSAGES",
MISSING_MANAGE_NICKNAMES = "MISSING_MANAGE_NICKNAMES",
MISSING_MANAGE_ROLES = "MISSING_MANAGE_ROLES",
MISSING_MANAGE_WEBHOOKS = "MISSING_MANAGE_WEBHOOKS",
MISSING_MENTION_EVERYONE = "MISSING_MENTION_EVERYONE",
MISSING_MOVE_MEMBERS = "MISSING_MOVE_MEMBERS",
MISSING_MUTE_MEMBERS = "MISSING_MUTE_MEMBERS",
MISSING_PRIORITY_SPEAKER = "MISSING_PRIORITY_SPEAKER",
MISSING_READ_MESSAGE_HISTORY = "MISSING_READ_MESSAGE_HISTORY",
MISSING_SEND_MESSAGES = "MISSING_SEND_MESSAGES",
// TODO: Remove v11
/** @deprecated Use MISSING_SEND_TTS_MESSAGES */
MISSING_SEND_TTS_MESSAGE = "MISSING_SEND_TTS_MESSAGE",
MISSING_SEND_TTS_MESSAGES = "MISSING_SEND_TTS_MESSAGES",
MISSING_SPEAK = "MISSING_SPEAK",
MISSING_STREAM = "MISSING_STREAM",
MISSING_USE_VAD = "MISSING_USE_VAD",
MISSING_USE_EXTERNAL_EMOJIS = "MISSING_USE_EXTERNAL_EMOJIS",
MISSING_VIEW_AUDIT_LOG = "MISSING_VIEW_AUDIT_LOG",
MISSING_VIEW_CHANNEL = "MISSING_VIEW_CHANNEL",
MISSING_VIEW_GUILD_INSIGHTS = "MISSING_VIEW_GUILD_INSIGHTS",
// User Errors
NICKNAMES_MAX_LENGTH = "NICKNAMES_MAX_LENGTH",
USERNAME_INVALID_CHARACTER = "USERNAME_INVALID_CHARACTER",
USERNAME_INVALID_USERNAME = "USERNAME_INVALID_USERNAME",
USERNAME_MAX_LENGTH = "USERNAME_MAX_LENGTH",
USERNAME_MIN_LENGTH = "USERNAME_MIN_LENGTH",
// API Errors
RATE_LIMIT_RETRY_MAXED = "RATE_LIMIT_RETRY_MAXED",
REQUEST_CLIENT_ERROR = "REQUEST_CLIENT_ERROR",
REQUEST_SERVER_ERROR = "REQUEST_SERVER_ERROR",
REQUEST_UNKNOWN_ERROR = "REQUEST_UNKNOWN_ERROR",
BOTS_HIGHEST_ROLE_TOO_LOW = "BOTS_HIGHEST_ROLE_TOO_LOW",
CHANNEL_NOT_IN_GUILD = "CHANNEL_NOT_IN_GUILD",
INVALID_WEBHOOK_NAME = "INVALID_WEBHOOK_NAME",
INVALID_SLASH_NAME = "INVALID_SLASH_NAME",
INVALID_SLASH_DESCRIPTION = "INVALID_SLASH_DESCRIPTION",
INVALID_WEBHOOK_OPTIONS = "INVALID_WEBHOOK_OPTIONS",
CHANNEL_NOT_FOUND = "CHANNEL_NOT_FOUND",
CHANNEL_NOT_TEXT_BASED = "CHANNEL_NOT_TEXT_BASED",
USERNAME_MAX_LENGTH = "USERNAME_MAX_LENGTH",
USERNAME_MIN_LENGTH = "USERNAME_MIN_LENGTH",
USERNAME_INVALID_CHARACTER = "USERNAME_INVALID_CHARACTER",
USERNAME_INVALID_USERNAME = "USERNAME_INVALID_USERNAME",
RULES_CHANNEL_CANNOT_BE_DELETED = "RULES_CHANNEL_CANNOT_BE_DELETED",
UPDATES_CHANNEL_CANNOT_BE_DELETED = "UPDATES_CHANNEL_CANNOT_BE_DELETED",
GUILD_NOT_FOUND = "GUILD_NOT_FOUND",
PRUNE_MAX_DAYS = "PRUNE_MAX_DAYS",
GUILD_NOT_DISCOVERABLE = "GUILD_NOT_DISCOVERABLE",
MISSING_CHANGE_NICKNAME = "MISSING_CHANGE_NICKNAME",
}

View File

@@ -176,6 +176,8 @@ export type GuildFeatures =
| "ANIMATED_ICON"
| "BANNER";
// TODO: v11 Remove
/** @deprecated Use DiscordVoiceRegion */
export interface VoiceRegion {
/** unique ID for the region */
id: string;

View File

@@ -94,6 +94,8 @@ export interface ApplicationCommandOptionChoice {
value: string | number;
}
// TODO: v11 Remove
/** @deprecated Use DiscordApplicationCommandEvent */
export type ApplicationCommandEvent = ApplicationCommand & {
/** id of the guild the command is in */
guild_id?: string;

View File

@@ -141,6 +141,8 @@ export interface Reaction {
emoji: EmojiReaction;
}
// TODO: v11 Remove
/** @deprecated Use DiscordMessageTypes */
export enum MessageTypes {
DEFAULT,
RECIPIENT_ADD,

View File

@@ -14,3 +14,4 @@ export * from "./permission.ts";
export * from "./presence.ts";
export * from "./role.ts";
export * from "./webhook.ts";
export * from "./api/mod.ts";

View File

@@ -6,4 +6,5 @@ export type CamelizeString<T extends PropertyKey> = T extends string
: T
: T;
export type Camelize<T> = { [K in keyof T as CamelizeString<K>]: T[K] }
// deno-fmt-ignore
export type Camelize<T> = { [K in keyof T as CamelizeString<K>]: T[K] };