From 89a6e043fe84c4f05fb0c6b19da261479d6308cc Mon Sep 17 00:00:00 2001 From: ITOH <72305210+itohatweb@users.noreply.github.com> Date: Tue, 6 Apr 2021 22:08:19 +0200 Subject: [PATCH 1/3] f --- src/structures/guild.ts | 49 ++++++++++--- src/structures/member.ts | 11 ++- src/structures/message.ts | 143 +++++++++++++++++++++++++++++--------- 3 files changed, 159 insertions(+), 44 deletions(-) diff --git a/src/structures/guild.ts b/src/structures/guild.ts index 6d7c1287e..488450f11 100644 --- a/src/structures/guild.ts +++ b/src/structures/guild.ts @@ -13,17 +13,30 @@ import { getInvites } from "../helpers/invites/get_invites.ts"; import { banMember } from "../helpers/members/ban_member.ts"; import { unbanMember } from "../helpers/members/unban_member.ts"; import { GetGuildAuditLog } from "../types/audit_log/get_guild_audit_log.ts"; +import { Emoji } from "../types/emojis/emoji.ts"; import { CreateGuildBan } from "../types/guilds/create_guild_ban.ts"; import { DiscordGuild, Guild } from "../types/guilds/guild.ts"; import { DiscordGuildFeatures } from "../types/guilds/guild_features.ts"; -import { GuildMember } from "../types/guilds/guild_member.ts"; +import { + DiscordGuildMember, + GuildMember, +} from "../types/guilds/guild_member.ts"; import { ModifyGuild } from "../types/guilds/modify_guild.ts"; import { DiscordImageFormat } from "../types/misc/image_format.ts"; import { DiscordImageSize } from "../types/misc/image_size.ts"; import { PresenceUpdate } from "../types/misc/presence_update.ts"; +import { DiscordUser } from "../types/users/user.ts"; +import { VoiceState } from "../types/voice/voice_state.ts"; import { Collection } from "../util/collection.ts"; -import { createNewProp, snakeKeysToCamelCase } from "../util/utils.ts"; -import { RoleStruct, structures } from "./mod.ts"; +import { + camelKeysToSnakeCase, + createNewProp, + snakeKeysToCamelCase, +} from "../util/utils.ts"; +import { ChannelStruct } from "./channel.ts"; +import { MemberStruct } from "./member.ts"; +import { structures } from "./mod.ts"; +import { RoleStruct } from "./role.ts"; export const initialMemberLoadQueue = new Map(); @@ -118,7 +131,9 @@ export async function createGuildStruct( } = snakeKeysToCamelCase(data) as Guild; const roles = await Promise.all( - data.roles.map((role) => structures.createRoleStruct(role)), + data.roles.map((role) => + structures.createRoleStruct({ role, guild_id: rest.id }) + ), ); await Promise.all(channels.map(async (channel) => { @@ -164,7 +179,9 @@ export async function createGuildStruct( await Promise.allSettled( members.map(async (member) => { const memberStruct = await structures.createMemberStruct( - member, + camelKeysToSnakeCase(member) as Omit & { + user: DiscordUser; + }, guild.id, ); @@ -179,14 +196,25 @@ export async function createGuildStruct( export interface GuildStruct extends Omit< Guild, - "roles" | "presences" | "voiceStates" | "members" | "channels" + | "roles" + | "presences" + | "voiceStates" + | "members" + | "channels" + | "memberCount" + | "owner" + | "emojis" > { + /** Total number of members in this guild */ + memberCount?: number; /** The roles in the guild */ roles: Collection; /** The presences of all the users in the guild. */ presences: Collection; /** The Voice State data for each user in a voice channel in this server. */ - voiceStates: Collection; + voiceStates: Collection; + /** Custom guild emojis */ + emojis: Collection; // GETTERS /** Members in this guild. */ @@ -204,9 +232,12 @@ export interface GuildStruct extends /** The bot member in this guild if cached */ bot?: MemberStruct; /** The bot guild member in this guild if cached */ - botMember?: GuildMember; + botMember?: Omit & { + joinedAt: number; + premiumSince?: number; + }; /** The bots voice state if there is one in this guild */ - botVoice?: CleanVoiceState; + botVoice?: VoiceState; /** The owner member of this guild */ owner?: MemberStruct; /** Whether or not this guild is partnered */ diff --git a/src/structures/member.ts b/src/structures/member.ts index 9bf687d06..376250820 100644 --- a/src/structures/member.ts +++ b/src/structures/member.ts @@ -6,13 +6,13 @@ import { kickMember } from "../helpers/members/kick_member.ts"; import { sendDirectMessage } from "../helpers/members/send_direct_message.ts"; import { addRole } from "../helpers/roles/add_role.ts"; import { removeRole } from "../helpers/roles/remove_role.ts"; -import { CreateMessage } from "../types/channels/create_message.ts"; import { CreateGuildBan } from "../types/guilds/create_guild_ban.ts"; import { DiscordGuildMember, GuildMember, } from "../types/guilds/guild_member.ts"; import { ModifyGuildMember } from "../types/guilds/modify_guild_member.ts"; +import { CreateMessage } from "../types/messages/create_message.ts"; import { DiscordImageFormat } from "../types/misc/image_format.ts"; import { DiscordImageSize } from "../types/misc/image_size.ts"; import { DiscordUser, User } from "../types/users/user.ts"; @@ -151,7 +151,14 @@ export interface MemberStruct extends GuildMember, User { /** Get the nickname or the username if no nickname */ name(guildID: string): string; /** Get the guild member object for the specified guild */ - guildMember(guildID: string): GuildMember | undefined; + guildMember( + guildID: string, + ): + | Omit & { + joinedAt: number; + premiumSince?: number; + } + | undefined; /** Send a direct message to the user is possible */ sendDM( content: string | CreateMessage, diff --git a/src/structures/message.ts b/src/structures/message.ts index 577b965c1..99d8eb926 100644 --- a/src/structures/message.ts +++ b/src/structures/message.ts @@ -9,10 +9,18 @@ import { removeAllReactions } from "../helpers/messages/remove_all_reactions.ts" import { removeReaction } from "../helpers/messages/remove_reaction.ts"; import { removeReactionEmoji } from "../helpers/messages/remove_reaction_emoji.ts"; import { sendMessage } from "../helpers/messages/send_message.ts"; +import { DiscordenoCreateMessage } from "../types/discordeno/create_message.ts"; +import { GuildMember } from "../types/guilds/guild_member.ts"; +import { EditMessage } from "../types/messages/edit_message.ts"; +import { DiscordMessage, Message } from "../types/messages/message.ts"; import { CHANNEL_MENTION_REGEX } from "../util/constants.ts"; -import { createNewProp } from "../util/utils.ts"; +import { createNewProp, snakeKeysToCamelCase } from "../util/utils.ts"; +import { ChannelStruct } from "./channel.ts"; +import { GuildStruct } from "./guild.ts"; +import { MemberStruct } from "./member.ts"; +import { RoleStruct } from "./role.ts"; -const baseMessage: Partial = { +const baseMessage: Partial = { get channel() { if (this.guildId) return cache.channels.get(this.channelId!); return cache.channels.get(this.author?.id!); @@ -34,13 +42,13 @@ const baseMessage: Partial = { "@me"}/${this.channelId}/${this.id}`; }, get mentionedRoles() { - return this.mentionRoleIds?.map((id) => this.guild?.roles.get(id)) || []; + return this.mentionedRoleIds?.map((id) => this.guild?.roles.get(id)) || []; }, get mentionedChannels() { - return this.mentionChannelIds?.map((id) => cache.channels.get(id)) || []; + return this.mentionedChannelIds?.map((id) => cache.channels.get(id)) || []; }, get mentionedMembers() { - return this.mentions?.map((id) => cache.members.get(id)) || []; + return this.mentionedUserIds?.map((id) => cache.members.get(id)) || []; }, // METHODS @@ -69,9 +77,10 @@ const baseMessage: Partial = { } : { ...content, - mentions: { ...(content.mentions || {}), repliedUser: true }, + mentions: { ...(content.allowedMentions || {}), repliedUser: true }, replyMessageId: this.id, - failReplyIfNotExists: content.failReplyIfNotExists === true, + failReplyIfNotExists: + content.messageReference?.failIfNotExists === true, }; if (this.guildId) return sendMessage(this.channelId!, contentWithMention); @@ -108,58 +117,126 @@ const baseMessage: Partial = { }, }; -export async function createMessageStruct(data: MessageCreateOptions) { +export async function createMessageStruct(data: DiscordMessage) { const { - guild_id: guildId = "", - channel_id: channelId, - mentions_everyone: mentionsEveryone, - mention_channels: mentionChannelIds = [], - mention_roles: mentionRoleIds, - webhook_id: webhookId, - message_reference: messageReference, + guildId = "", + channelId, + mentionChannels = [], + mentions, + mentionRoles, edited_timestamp: editedTimestamp, - referenced_message: referencedMessageId, - member, ...rest - } = data; + } = snakeKeysToCamelCase(data) as Message; - const restProps: Record> = {}; + const props: Record> = {}; for (const key of Object.keys(rest)) { // @ts-ignore index signature - restProps[key] = createNewProp(rest[key]); + props[key] = createNewProp(rest[key]); } // Discord doesnt give guild id for getMessage() so this will fill it in const guildIdFinal = guildId || (await cacheHandlers.get("channels", channelId))?.guildId || ""; - const message = Object.create(baseMessage, { - ...restProps, + const message: MessageStruct = Object.create(baseMessage, { + ...props, /** The message id of the original message if this message was sent as a reply. If null, the original message was deleted. */ - referencedMessageId: createNewProp(referencedMessageId), channelId: createNewProp(channelId), - guildId: createNewProp(guildId || guildIdFinal), - mentions: createNewProp(data.mentions.map((m) => m.id)), - mentionsEveryone: createNewProp(mentionsEveryone), - mentionRoleIds: createNewProp(mentionRoleIds), - mentionChannelIds: createNewProp( + guildId: createNewProp(guildIdFinal), + mentionedUserIds: createNewProp(mentions.map((m) => m.id)), + mentionedRoleIds: createNewProp(mentionRoles), + mentionedChannelIds: createNewProp( [ // Keep any ids that discord sends - ...mentionChannelIds, + ...mentionChannels.map((m) => m.id), // Add any other ids that can be validated in a channel mention format ...(rest.content.match(CHANNEL_MENTION_REGEX) || []).map((text) => // converts the <#123> into 123 text.substring(2, text.length - 1) ), - ].map((m) => m.id), + ], ), - webhookId: createNewProp(webhookId), - messageReference: createNewProp(messageReference), timestamp: createNewProp(Date.parse(data.timestamp)), editedTimestamp: createNewProp( editedTimestamp ? Date.parse(editedTimestamp) : undefined, ), }); - return message as Message; + return message; +} + +export interface MessageStruct extends Message { + // For better user experience + /** Ids of users specifically mentioned in the message */ + mentionedUserIds: string[]; + /** Ids of roles specifically mentioned in this message */ + mentionedRoleIds: string[]; + /** Channels specifically mentioned in this message */ + mentionedChannelIds?: string[]; + // GETTERS + + /** The channel where this message was sent. Can be undefined if uncached. */ + channel?: ChannelStruct; + /** The guild of this message. Can be undefined if not in cache or in DM */ + guild?: GuildStruct; + /** The member for the user who sent the message. Can be undefined if not in cache or in dm. */ + member?: MemberStruct; + /** The guild member details for this guild and member. Can be undefined if not in cache or in dm. */ + guildMember?: Omit & { + joinedAt: number; + premiumSince?: number; + }; + /** The url link to this message */ + link: string; + /** The role objects for all the roles that were mentioned in this message */ + mentionedRoles: (RoleStruct | undefined)[]; + /** The channel objects for all the channels that were mentioned in this message. */ + mentionedChannels: (ChannelStruct | undefined)[]; + /** The member objects for all the members that were mentioned in this message. */ + mentionedMembers: (MemberStruct | undefined)[]; + + // METHODS + + /** Delete the message */ + delete( + reason?: string, + delayMilliseconds?: number, + ): ReturnType; + /** Edit the message */ + edit(content: string | EditMessage): ReturnType; + /** Pins the message in the channel */ + pin(): ReturnType; + /** Add a reaction to the message */ + addReaction(reaction: string): ReturnType; + /** Add multiple reactions to the message without or without order. */ + addReactions( + reactions: string[], + ordered?: boolean, + ): ReturnType; + /** Send a inline reply to this message */ + reply( + content: string | DiscordenoCreateMessage, + ): ReturnType; + /** Send a message to this channel where this message is */ + send( + content: string | DiscordenoCreateMessage, + ): ReturnType; + /** Send a message to this channel and then delete it after a bit. By default it will delete after 10 seconds with no reason provided. */ + alert( + content: string | DiscordenoCreateMessage, + timeout?: number, + reason?: string, + ): Promise; + /** Send a inline reply to this message but then delete it after a bit. By default it will delete after 10 seconds with no reason provided. */ + alertReply( + content: string | DiscordenoCreateMessage, + timeout?: number, + reason?: string, + ): Promise; + /** Remove all reactions */ + removeAllReactions(): ReturnType; + /** Remove all reactions */ + removeReactionEmoji(reaction: string): ReturnType; + /** Remove all reactions */ + removeReaction(reaction: string): ReturnType; } From 76e60deb2b37f5d41e306a87c2bb06882ffc62a7 Mon Sep 17 00:00:00 2001 From: ITOH <72305210+itohatweb@users.noreply.github.com> Date: Tue, 6 Apr 2021 22:20:23 +0200 Subject: [PATCH 2/3] f --- src/types/discordeno/create_message.ts | 7 +++++++ src/types/discordeno/create_slash_command.ts | 7 +++++++ src/types/discordeno/edit_webhook_message.ts | 6 ++++++ src/types/discordeno/guild_member.ts | 0 src/types/discordeno/guild_update_change.ts | 7 +++++++ src/types/discordeno/interaction_response.ts | 6 ++++++ .../create_guild_integration.ts | 0 .../guild_integrations_update.ts | 0 .../{guilds => integration}/integration.ts | 0 .../integration_account.ts | 0 .../integration_application.ts | 0 .../integration/integration_create_update.ts | 12 ++++++++++++ src/types/integration/integration_delete.ts | 13 +++++++++++++ .../integration_expire_behaviors.ts | 0 .../modify_guild_integration.ts | 0 src/types/interactions/interaction.ts | 1 + src/types/messages/allowed_mentions.ts | 6 +++--- src/types/messages/edit_message.ts | 17 +++++++++++++++++ 18 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 src/types/discordeno/create_message.ts create mode 100644 src/types/discordeno/create_slash_command.ts create mode 100644 src/types/discordeno/edit_webhook_message.ts create mode 100644 src/types/discordeno/guild_member.ts create mode 100644 src/types/discordeno/guild_update_change.ts create mode 100644 src/types/discordeno/interaction_response.ts rename src/types/{guilds => integration}/create_guild_integration.ts (100%) rename src/types/{guilds => integration}/guild_integrations_update.ts (100%) rename src/types/{guilds => integration}/integration.ts (100%) rename src/types/{guilds => integration}/integration_account.ts (100%) rename src/types/{guilds => integration}/integration_application.ts (100%) create mode 100644 src/types/integration/integration_create_update.ts create mode 100644 src/types/integration/integration_delete.ts rename src/types/{guilds => integration}/integration_expire_behaviors.ts (100%) rename src/types/{guilds => integration}/modify_guild_integration.ts (100%) create mode 100644 src/types/messages/edit_message.ts diff --git a/src/types/discordeno/create_message.ts b/src/types/discordeno/create_message.ts new file mode 100644 index 000000000..1df64e503 --- /dev/null +++ b/src/types/discordeno/create_message.ts @@ -0,0 +1,7 @@ +import { CreateMessage } from "../messages/create_message.ts"; +import { FileContent } from "../misc/file_content.ts"; + +export interface DiscordenoCreateMessage extends CreateMessage { + /** The contents of the file being sent */ + file?: FileContent | FileContent[]; +} diff --git a/src/types/discordeno/create_slash_command.ts b/src/types/discordeno/create_slash_command.ts new file mode 100644 index 000000000..969ac33fc --- /dev/null +++ b/src/types/discordeno/create_slash_command.ts @@ -0,0 +1,7 @@ +import { CreateGlobalApplicationCommand } from "../interactions/create_global_application_command.ts"; + +export interface DiscordenoCreateApplicationCommand + extends CreateGlobalApplicationCommand { + /** Id of the guild to create a guild only application command */ + guildId: string; +} diff --git a/src/types/discordeno/edit_webhook_message.ts b/src/types/discordeno/edit_webhook_message.ts new file mode 100644 index 000000000..97ee0af14 --- /dev/null +++ b/src/types/discordeno/edit_webhook_message.ts @@ -0,0 +1,6 @@ +import { EditWebhookMessage } from "../webhooks/edit_webhook_message.ts"; + +export interface DiscordenoEditWebhookMessage extends EditWebhookMessage { + /** Id of the message you want to edit */ + messageId: string; +} diff --git a/src/types/discordeno/guild_member.ts b/src/types/discordeno/guild_member.ts new file mode 100644 index 000000000..e69de29bb diff --git a/src/types/discordeno/guild_update_change.ts b/src/types/discordeno/guild_update_change.ts new file mode 100644 index 000000000..32e9e966e --- /dev/null +++ b/src/types/discordeno/guild_update_change.ts @@ -0,0 +1,7 @@ +import { Guild } from "../guilds/guild.ts"; + +export interface GuildUpdateChange { + key: keyof Guild; + oldValue?: unknown; + value?: unknown; +} diff --git a/src/types/discordeno/interaction_response.ts b/src/types/discordeno/interaction_response.ts new file mode 100644 index 000000000..4e598eebe --- /dev/null +++ b/src/types/discordeno/interaction_response.ts @@ -0,0 +1,6 @@ +import { InteractionResponse } from "../interactions/interaction_response.ts"; + +export interface DiscordenoInteractionResponse extends InteractionResponse { + /** Set to true if the response should be private */ + private?: boolean; +} diff --git a/src/types/guilds/create_guild_integration.ts b/src/types/integration/create_guild_integration.ts similarity index 100% rename from src/types/guilds/create_guild_integration.ts rename to src/types/integration/create_guild_integration.ts diff --git a/src/types/guilds/guild_integrations_update.ts b/src/types/integration/guild_integrations_update.ts similarity index 100% rename from src/types/guilds/guild_integrations_update.ts rename to src/types/integration/guild_integrations_update.ts diff --git a/src/types/guilds/integration.ts b/src/types/integration/integration.ts similarity index 100% rename from src/types/guilds/integration.ts rename to src/types/integration/integration.ts diff --git a/src/types/guilds/integration_account.ts b/src/types/integration/integration_account.ts similarity index 100% rename from src/types/guilds/integration_account.ts rename to src/types/integration/integration_account.ts diff --git a/src/types/guilds/integration_application.ts b/src/types/integration/integration_application.ts similarity index 100% rename from src/types/guilds/integration_application.ts rename to src/types/integration/integration_application.ts diff --git a/src/types/integration/integration_create_update.ts b/src/types/integration/integration_create_update.ts new file mode 100644 index 000000000..022e879f3 --- /dev/null +++ b/src/types/integration/integration_create_update.ts @@ -0,0 +1,12 @@ +import { SnakeCaseProps } from "../util.ts"; +import { Integration } from "./integration.ts"; + +export interface IntegrationCreateUpdate extends Integration { + /** Id of the guild */ + guildId: string; +} + +/** https://github.com/discord/discord-api-docs/blob/master/docs/topics/Gateway.md#integration-create-event-additional-fields */ +export type DiscordIntegrationCreateUpdate = SnakeCaseProps< + IntegrationCreateUpdate +>; diff --git a/src/types/integration/integration_delete.ts b/src/types/integration/integration_delete.ts new file mode 100644 index 000000000..34fca4f61 --- /dev/null +++ b/src/types/integration/integration_delete.ts @@ -0,0 +1,13 @@ +import { SnakeCaseProps } from "../util.ts"; + +export interface IntegrationDelete { + /** Integration id */ + id: string; + /** Id of the guild */ + guildId: string; + /** Id of the bot/OAuth2 application for this discord integration */ + applicationId?: string; +} + +/** https://github.com/discord/discord-api-docs/blob/master/docs/topics/Gateway.md#integration-delete-event-fields */ +export type DiscordIntegrationDelete = SnakeCaseProps; diff --git a/src/types/guilds/integration_expire_behaviors.ts b/src/types/integration/integration_expire_behaviors.ts similarity index 100% rename from src/types/guilds/integration_expire_behaviors.ts rename to src/types/integration/integration_expire_behaviors.ts diff --git a/src/types/guilds/modify_guild_integration.ts b/src/types/integration/modify_guild_integration.ts similarity index 100% rename from src/types/guilds/modify_guild_integration.ts rename to src/types/integration/modify_guild_integration.ts diff --git a/src/types/interactions/interaction.ts b/src/types/interactions/interaction.ts index 927a9bc88..83980f33d 100644 --- a/src/types/interactions/interaction.ts +++ b/src/types/interactions/interaction.ts @@ -1,3 +1,4 @@ +import { GuildMember } from "../guilds/guild_member.ts"; import { User } from "../users/user.ts"; import { SnakeCaseProps } from "../util.ts"; import { InteractionApplicationCommandCallbackData } from "./application_command_callback_data.ts"; diff --git a/src/types/messages/allowed_mentions.ts b/src/types/messages/allowed_mentions.ts index 7fd30d41f..c77d6208f 100644 --- a/src/types/messages/allowed_mentions.ts +++ b/src/types/messages/allowed_mentions.ts @@ -5,11 +5,11 @@ export interface AllowedMentions { /** An array of allowed mention types to parse from the content. */ parse: DiscordAllowedMentionsTypes[]; /** Array of role_ids to mention (Max size of 100) */ - roles: string[]; + roles?: string[]; /** Array of user_ids to mention (Max size of 100) */ - users: string[]; + users?: string[]; /** For replies, whether to mention the author of the message being replied to (default false) */ - repliedUser: boolean; + repliedUser?: boolean; } /** https://discord.com/developers/docs/resources/channel#allowed-mentions-object */ diff --git a/src/types/messages/edit_message.ts b/src/types/messages/edit_message.ts new file mode 100644 index 000000000..d640625da --- /dev/null +++ b/src/types/messages/edit_message.ts @@ -0,0 +1,17 @@ +import { Embed } from "../embeds/embed.ts"; +import { SnakeCaseProps } from "../util.ts"; +import { AllowedMentions } from "./allowed_mentions.ts"; + +export interface EditMessage { + /** The new message contents (up to 2000 characters) */ + content?: string | null; + /** Embedded `rich` content */ + embed?: Embed | null; + /** Edit the flags of the message (only `SUPRESS_EMBEDS` can currently be set/unset) */ + flags?: 4 | null; + /** Allowed mentions for the message */ + allowedMentions?: AllowedMentions | null; +} + +/** https://discord.com/developers/docs/resources/channel#edit-message-json-params */ +export type DiscordEditMessage = SnakeCaseProps; From 0caf594bc4d8338d174763687fff6c59cd84dc4d Mon Sep 17 00:00:00 2001 From: ITOH <72305210+itohatweb@users.noreply.github.com> Date: Wed, 7 Apr 2021 09:41:16 +0200 Subject: [PATCH 3/3] rev --- src/types/discordeno/create_message.ts | 7 ------- src/types/messages/create_message.ts | 5 ++++- 2 files changed, 4 insertions(+), 8 deletions(-) delete mode 100644 src/types/discordeno/create_message.ts diff --git a/src/types/discordeno/create_message.ts b/src/types/discordeno/create_message.ts deleted file mode 100644 index 1df64e503..000000000 --- a/src/types/discordeno/create_message.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { CreateMessage } from "../messages/create_message.ts"; -import { FileContent } from "../misc/file_content.ts"; - -export interface DiscordenoCreateMessage extends CreateMessage { - /** The contents of the file being sent */ - file?: FileContent | FileContent[]; -} diff --git a/src/types/messages/create_message.ts b/src/types/messages/create_message.ts index 4b3e97b87..b66a94ad8 100644 --- a/src/types/messages/create_message.ts +++ b/src/types/messages/create_message.ts @@ -1,6 +1,7 @@ import { Embed } from "../embeds/embed.ts"; import { AllowedMentions } from "../messages/allowed_mentions.ts"; import { MessageReference } from "../messages/message_reference.ts"; +import { FileContent } from "../misc/file_content.ts"; import { SnakeCaseProps } from "../util.ts"; export interface CreateMessage { @@ -16,7 +17,9 @@ export interface CreateMessage { allowedMentions?: AllowedMentions; /** Include to make your message a reply */ messageReference?: MessageReference; + /** The contents of the file being sent */ + file?: FileContent | FileContent[]; } /** https://discord.com/developers/docs/resources/channel#create-message */ -export type DiscordCreateMessage = SnakeCaseProps; +export type DiscordCreateMessage = SnakeCaseProps>;