From bc3e80dc803bd7ffd3fbbf3e0680c3b0ef19ecbd Mon Sep 17 00:00:00 2001 From: ITOH Date: Thu, 10 Jun 2021 12:47:03 +0200 Subject: [PATCH 01/28] add: JSON Error Code Maximum Number Of Animated Emojis Reached --- src/types/codes/json_error_codes.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/types/codes/json_error_codes.ts b/src/types/codes/json_error_codes.ts index e02487510..6d3623d8a 100644 --- a/src/types/codes/json_error_codes.ts +++ b/src/types/codes/json_error_codes.ts @@ -53,6 +53,7 @@ export enum DiscordJsonErrorCodes { MaximumNumberOfGuildChannelsReached = 30013, MaximumNumberOfAttachmentsInAMessageReached = 30015, MaximumNumberOfInvitesReached, + MaximumNumberOfAnimatedEmojisReached = 30018, MaximumNumberOfGuildDiscoverySubcategoriesHasBeenReached = 30030, GuildAlreadyHasTemplate = 30031, MaximumNumberOfBansForNonGuildMembersHaveBeenExceeded = 30035, From d0a7be15ed13d79d46e3c1048b38bd18934bd838 Mon Sep 17 00:00:00 2001 From: ITOH Date: Thu, 10 Jun 2021 12:47:18 +0200 Subject: [PATCH 02/28] add: JSON Error Code Maximum Number Of Server Members Reached --- src/types/codes/json_error_codes.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/types/codes/json_error_codes.ts b/src/types/codes/json_error_codes.ts index 6d3623d8a..ecd22efbf 100644 --- a/src/types/codes/json_error_codes.ts +++ b/src/types/codes/json_error_codes.ts @@ -54,6 +54,7 @@ export enum DiscordJsonErrorCodes { MaximumNumberOfAttachmentsInAMessageReached = 30015, MaximumNumberOfInvitesReached, MaximumNumberOfAnimatedEmojisReached = 30018, + MaximumNumberOfServerMembersReached, MaximumNumberOfGuildDiscoverySubcategoriesHasBeenReached = 30030, GuildAlreadyHasTemplate = 30031, MaximumNumberOfBansForNonGuildMembersHaveBeenExceeded = 30035, From 524b1dba22e42a5c9ad9474d680d19855f0630d7 Mon Sep 17 00:00:00 2001 From: ITOH Date: Thu, 10 Jun 2021 12:54:35 +0200 Subject: [PATCH 03/28] add: new Message#embeds property --- src/types/messages/create_message.ts | 2 ++ src/types/messages/edit_message.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/types/messages/create_message.ts b/src/types/messages/create_message.ts index 80a586952..e62b5253a 100644 --- a/src/types/messages/create_message.ts +++ b/src/types/messages/create_message.ts @@ -12,6 +12,8 @@ export interface CreateMessage { tts?: boolean; /** Embedded `rich` content */ embed?: Embed; + /** Embedded `rich` content (up to 6000 characters) */ + embeds?: Embed[]; /** Allowed mentions for the message */ allowedMentions?: AllowedMentions; /** Include to make your message a reply */ diff --git a/src/types/messages/edit_message.ts b/src/types/messages/edit_message.ts index f7919d905..c8073c5db 100644 --- a/src/types/messages/edit_message.ts +++ b/src/types/messages/edit_message.ts @@ -10,6 +10,8 @@ export interface EditMessage { content?: string | null; /** Embedded `rich` content */ embed?: Embed | null; + /** Embedded `rich` content (up to 6000 characters) */ + embeds?: Embed[] | null; /** Edit the flags of the message (only `SUPRESS_EMBEDS` can currently be set/unset) */ flags?: 4 | null; /** The contents of the file being sent/edited */ From a3a0037371c5d137faaeea5010d429897164f87c Mon Sep 17 00:00:00 2001 From: ITOH Date: Thu, 10 Jun 2021 12:54:49 +0200 Subject: [PATCH 04/28] deprecate: Message#embed property --- src/types/messages/create_message.ts | 4 +++- src/types/messages/edit_message.ts | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/types/messages/create_message.ts b/src/types/messages/create_message.ts index e62b5253a..17f13c81d 100644 --- a/src/types/messages/create_message.ts +++ b/src/types/messages/create_message.ts @@ -10,7 +10,9 @@ export interface CreateMessage { content?: string; /** true if this is a TTS message */ tts?: boolean; - /** Embedded `rich` content */ + /** Embedded `rich` content + * @deprecated will be removed in Discordeno v12 use embeds + */ embed?: Embed; /** Embedded `rich` content (up to 6000 characters) */ embeds?: Embed[]; diff --git a/src/types/messages/edit_message.ts b/src/types/messages/edit_message.ts index c8073c5db..cd66e7251 100644 --- a/src/types/messages/edit_message.ts +++ b/src/types/messages/edit_message.ts @@ -8,7 +8,9 @@ import { MessageComponents } from "./components/message_components.ts"; export interface EditMessage { /** The new message contents (up to 2000 characters) */ content?: string | null; - /** Embedded `rich` content */ + /** Embedded `rich` content + * @deprecated will be removed in Discordeno v12 use embeds + */ embed?: Embed | null; /** Embedded `rich` content (up to 6000 characters) */ embeds?: Embed[] | null; From 6bbbd0c0617e779e0815c77b84197ec247ab0346 Mon Sep 17 00:00:00 2001 From: ITOH Date: Thu, 10 Jun 2021 13:45:48 +0200 Subject: [PATCH 05/28] add: new CreateMessage#embeds --- src/helpers/messages/send_message.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/helpers/messages/send_message.ts b/src/helpers/messages/send_message.ts index 590573b51..915d44431 100644 --- a/src/helpers/messages/send_message.ts +++ b/src/helpers/messages/send_message.ts @@ -34,7 +34,13 @@ export async function sendMessage(channelId: bigint, content: string | CreateMes const requiredPerms: Set = new Set(["SEND_MESSAGES", "VIEW_CHANNEL"]); if (content.tts) requiredPerms.add("SEND_TTS_MESSAGES"); - if (content.embed) requiredPerms.add("EMBED_LINKS"); + // TODO: v12 remove + if (content.embed) content.embeds = [content.embed, ...(content.embeds || [])]; + if (content.embeds?.length) requiredPerms.add("EMBED_LINKS"); + if (content.embeds && content.embeds.length > 10) { + content.embeds.splice(10); + } + if (content.messageReference?.messageId || content.allowedMentions?.repliedUser) { requiredPerms.add("READ_MESSAGE_HISTORY"); } From 125496a36b725b2bcf45922301576a8db1a4336e Mon Sep 17 00:00:00 2001 From: ITOH Date: Thu, 10 Jun 2021 13:45:57 +0200 Subject: [PATCH 06/28] add: new EditMessage#embeds --- src/helpers/messages/edit_message.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/helpers/messages/edit_message.ts b/src/helpers/messages/edit_message.ts index cfd764247..338df5cad 100644 --- a/src/helpers/messages/edit_message.ts +++ b/src/helpers/messages/edit_message.ts @@ -29,6 +29,12 @@ export async function editMessage(channelId: bigint, messageId: bigint, content: validateComponents(content.components); } + // TODO: v12 remove + if (content.embed) content.embeds = [content.embed, ...(content.embeds || [])]; + if (content.embeds && content.embeds.length > 10) { + content.embeds.splice(10); + } + if (content.content && content.content.length > 2000) { throw new Error(Errors.MESSAGE_MAX_LENGTH); } From 29c815712e1d0268ba20d4a7c35e7fd9535aede7 Mon Sep 17 00:00:00 2001 From: ITOH Date: Thu, 10 Jun 2021 13:46:10 +0200 Subject: [PATCH 07/28] add a remove comment --- src/types/messages/create_message.ts | 1 + src/types/messages/edit_message.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/src/types/messages/create_message.ts b/src/types/messages/create_message.ts index 17f13c81d..9cddc7a85 100644 --- a/src/types/messages/create_message.ts +++ b/src/types/messages/create_message.ts @@ -10,6 +10,7 @@ export interface CreateMessage { content?: string; /** true if this is a TTS message */ tts?: boolean; + // TODO: v12 remove /** Embedded `rich` content * @deprecated will be removed in Discordeno v12 use embeds */ diff --git a/src/types/messages/edit_message.ts b/src/types/messages/edit_message.ts index cd66e7251..2d47780e6 100644 --- a/src/types/messages/edit_message.ts +++ b/src/types/messages/edit_message.ts @@ -8,6 +8,7 @@ import { MessageComponents } from "./components/message_components.ts"; export interface EditMessage { /** The new message contents (up to 2000 characters) */ content?: string | null; + // TODO: v12 remove /** Embedded `rich` content * @deprecated will be removed in Discordeno v12 use embeds */ From cccc0a33596fd6f8532cca9052e78bd9059c54da Mon Sep 17 00:00:00 2001 From: ITOH Date: Thu, 10 Jun 2021 16:09:31 +0200 Subject: [PATCH 08/28] requested changes --- src/helpers/messages/edit_message.ts | 7 ++++--- src/helpers/messages/send_message.ts | 11 +++++++---- src/helpers/webhooks/send_webhook.ts | 4 +--- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/helpers/messages/edit_message.ts b/src/helpers/messages/edit_message.ts index 338df5cad..192cbe665 100644 --- a/src/helpers/messages/edit_message.ts +++ b/src/helpers/messages/edit_message.ts @@ -30,10 +30,11 @@ export async function editMessage(channelId: bigint, messageId: bigint, content: } // TODO: v12 remove - if (content.embed) content.embeds = [content.embed, ...(content.embeds || [])]; - if (content.embeds && content.embeds.length > 10) { - content.embeds.splice(10); + if (content.embed) { + content.embeds = [content.embed, ...(content.embeds || [])]; + content.embed = undefined; } + content.embeds?.splice(10); if (content.content && content.content.length > 2000) { throw new Error(Errors.MESSAGE_MAX_LENGTH); diff --git a/src/helpers/messages/send_message.ts b/src/helpers/messages/send_message.ts index 915d44431..1023aabcc 100644 --- a/src/helpers/messages/send_message.ts +++ b/src/helpers/messages/send_message.ts @@ -35,10 +35,13 @@ export async function sendMessage(channelId: bigint, content: string | CreateMes if (content.tts) requiredPerms.add("SEND_TTS_MESSAGES"); // TODO: v12 remove - if (content.embed) content.embeds = [content.embed, ...(content.embeds || [])]; - if (content.embeds?.length) requiredPerms.add("EMBED_LINKS"); - if (content.embeds && content.embeds.length > 10) { - content.embeds.splice(10); + if (content.embed) { + content.embeds = [content.embed, ...(content.embeds || [])]; + content.embed = undefined; + } + if (content.embeds?.length) { + requiredPerms.add("EMBED_LINKS"); + content.embeds?.splice(10); } if (content.messageReference?.messageId || content.allowedMentions?.repliedUser) { diff --git a/src/helpers/webhooks/send_webhook.ts b/src/helpers/webhooks/send_webhook.ts index 1403dfd36..6d208d725 100644 --- a/src/helpers/webhooks/send_webhook.ts +++ b/src/helpers/webhooks/send_webhook.ts @@ -17,9 +17,7 @@ export async function sendWebhook(webhookId: bigint, webhookToken: string, optio throw Error(Errors.MESSAGE_MAX_LENGTH); } - if (options.embeds && options.embeds.length > 10) { - options.embeds.splice(10); - } + options.embeds?.splice(10); if (options.allowedMentions) { if (options.allowedMentions.users?.length) { From 98aa6c07fae909a7838b6a606ecef3d156644933 Mon Sep 17 00:00:00 2001 From: ITOH Date: Thu, 10 Jun 2021 22:37:33 +0200 Subject: [PATCH 09/28] fix: use bigint id for key and not string id for cache.emojis getter --- src/cache.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cache.ts b/src/cache.ts index 0b9399b3c..121b470ff 100644 --- a/src/cache.ts +++ b/src/cache.ts @@ -29,7 +29,7 @@ export const cache = { executedSlashCommands: new Set(), get emojis() { return new Collection( - this.guilds.reduce((a, b) => [...a, ...b.emojis.map((e) => [e.id, e])], [] as any[]) + this.guilds.reduce((a, b) => [...a, ...b.emojis.map((e, id) => [id, e])], [] as any[]) ); }, activeGuildIds: new Set(), From aef94af9b34b0ad148ad3327eb59119cac72d56c Mon Sep 17 00:00:00 2001 From: ITOH Date: Thu, 10 Jun 2021 22:54:56 +0200 Subject: [PATCH 10/28] change: bump minor version --- src/util/constants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/constants.ts b/src/util/constants.ts index 3c54978db..2e59aef06 100644 --- a/src/util/constants.ts +++ b/src/util/constants.ts @@ -9,7 +9,7 @@ export const GATEWAY_VERSION = 9; // TODO: update this version /** https://github.com/discordeno/discordeno/releases */ -export const DISCORDENO_VERSION = "11.0.3"; +export const DISCORDENO_VERSION = "11.1.0"; /** https://discord.com/developers/docs/reference#user-agent */ export const USER_AGENT = `DiscordBot (https://github.com/discordeno/discordeno, v${DISCORDENO_VERSION})`; From 1d19d79160c1e2fef19a208161e1f957c37d75ed Mon Sep 17 00:00:00 2001 From: ITOH Date: Fri, 11 Jun 2021 19:22:54 +0200 Subject: [PATCH 11/28] fix: member#tag discriminator formatting --- src/structures/member.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/structures/member.ts b/src/structures/member.ts index db38d6734..906c7536a 100644 --- a/src/structures/member.ts +++ b/src/structures/member.ts @@ -46,7 +46,7 @@ const baseMember: Partial = { return `<@!${this.id!}>`; }, get tag() { - return `${this.username!}#${this.discriminator!}`; + return `${this.username!}#${this.discriminator!.toString().padStart(4, "0")}`; }, // METHODS @@ -232,7 +232,9 @@ export interface DiscordenoMember extends Omit & { joinedAt?: number; premiumSince?: number; From 8f70ce52ca2df1188d012931250d8fbf0d7074e2 Mon Sep 17 00:00:00 2001 From: ITOH Date: Fri, 11 Jun 2021 19:23:02 +0200 Subject: [PATCH 12/28] fix: message#tag discriminator formatting --- src/structures/message.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/structures/message.ts b/src/structures/message.ts index 74d807936..d005ddf4f 100644 --- a/src/structures/message.ts +++ b/src/structures/message.ts @@ -228,7 +228,7 @@ export async function createDiscordenoMessage(data: Message) { props.authorId = createNewProp(snowflakeToBigint(author.id)); props.isBot = createNewProp(author.bot || false); - props.tag = createNewProp(`${author.username}#${author.discriminator}`); + props.tag = createNewProp(`${author.username}#${author.discriminator.toString().padStart(4, "0")}`); // Discord doesnt give guild id for getMessage() so this will fill it in const guildIdFinal = From 86375fe54bb1b2ad08d681dc5d09e3a0d9576d26 Mon Sep 17 00:00:00 2001 From: ITOH Date: Fri, 11 Jun 2021 21:16:10 +0200 Subject: [PATCH 13/28] support string as id --- .../interactions/send_interaction_response.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/helpers/interactions/send_interaction_response.ts b/src/helpers/interactions/send_interaction_response.ts index 04b8099a2..ebf995ee6 100644 --- a/src/helpers/interactions/send_interaction_response.ts +++ b/src/helpers/interactions/send_interaction_response.ts @@ -5,13 +5,18 @@ import type { DiscordenoInteractionResponse } from "../../types/discordeno/inter import { endpoints } from "../../util/constants.ts"; import { snakelize, validateComponents } from "../../util/utils.ts"; +// TODO: v12 remove | string /** * Send a response to a users slash command. The command data will have the id and token necessary to respond. * Interaction `tokens` are valid for **15 minutes** and can be used to send followup messages. * * NOTE: By default we will suppress mentions. To enable mentions, just pass any mentions object. */ -export async function sendInteractionResponse(id: bigint, token: string, options: DiscordenoInteractionResponse) { +export async function sendInteractionResponse( + id: bigint | string, + token: string, + options: DiscordenoInteractionResponse +) { // TODO: add more options validations if (options.data?.components) validateComponents(options.data?.components); @@ -37,5 +42,9 @@ export async function sendInteractionResponse(id: bigint, token: string, options cache.executedSlashCommands.delete(token); }, 900000); - return await rest.runMethod("post", endpoints.INTERACTION_ID_TOKEN(id, token), snakelize(options)); + return await rest.runMethod( + "post", + endpoints.INTERACTION_ID_TOKEN(typeof id === "bigint" ? id : BigInt(id), token), + snakelize(options) + ); } From 188ffdc1f804e0bd9966154befa8c94cf6389bdd Mon Sep 17 00:00:00 2001 From: ITOH Date: Sun, 13 Jun 2021 21:45:36 +0200 Subject: [PATCH 14/28] add: isSlashCommand typeGuard --- src/types/channels/threads/is_slash_command.ts | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/types/channels/threads/is_slash_command.ts diff --git a/src/types/channels/threads/is_slash_command.ts b/src/types/channels/threads/is_slash_command.ts new file mode 100644 index 000000000..9fedf32c1 --- /dev/null +++ b/src/types/channels/threads/is_slash_command.ts @@ -0,0 +1,7 @@ +import { Interaction, SlashCommandInteraction } from "../../interactions/interaction.ts"; +import { DiscordInteractionTypes } from "../../interactions/interaction_types.ts"; + +/** A type guard function to tell if it is a slash command interaction */ +export function isSlashCommand(interaction: Interaction): interaction is SlashCommandInteraction { + return interaction.type === DiscordInteractionTypes.ApplicationCommand; +} From 6792c6b97d2f97981deeb4070033de9b25d667d1 Mon Sep 17 00:00:00 2001 From: ITOH Date: Sun, 13 Jun 2021 21:50:19 +0200 Subject: [PATCH 15/28] fix this --- src/helpers/mod.ts | 2 ++ .../threads => helpers/type_guards}/is_slash_command.ts | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) rename src/{types/channels/threads => helpers/type_guards}/is_slash_command.ts (57%) diff --git a/src/helpers/mod.ts b/src/helpers/mod.ts index 639177c4e..fae6ca9c9 100644 --- a/src/helpers/mod.ts +++ b/src/helpers/mod.ts @@ -133,6 +133,7 @@ import { createStageInstance } from "./channels/create_stage_instance.ts"; import { updateStageInstance } from "./channels/update_stage_instance.ts"; import { getStageInstance } from "./channels/get_stage_instance.ts"; import { deleteStageInstance } from "./channels/delete_stage_instance.ts"; +import { isSlashCommand } from "./type_guards/is_slash_command.ts"; export { addDiscoverySubcategory, @@ -242,6 +243,7 @@ export { guildSplashURL, isButton, isSelectMenu, + isSlashCommand, isChannelSynced, kick, kickMember, diff --git a/src/types/channels/threads/is_slash_command.ts b/src/helpers/type_guards/is_slash_command.ts similarity index 57% rename from src/types/channels/threads/is_slash_command.ts rename to src/helpers/type_guards/is_slash_command.ts index 9fedf32c1..bba72dbeb 100644 --- a/src/types/channels/threads/is_slash_command.ts +++ b/src/helpers/type_guards/is_slash_command.ts @@ -1,5 +1,5 @@ -import { Interaction, SlashCommandInteraction } from "../../interactions/interaction.ts"; -import { DiscordInteractionTypes } from "../../interactions/interaction_types.ts"; +import { Interaction, SlashCommandInteraction } from "../../types/interactions/interaction.ts"; +import { DiscordInteractionTypes } from "../../types/interactions/interaction_types.ts"; /** A type guard function to tell if it is a slash command interaction */ export function isSlashCommand(interaction: Interaction): interaction is SlashCommandInteraction { From b018313298541bb18bbecacb4feb2f6a8c313689 Mon Sep 17 00:00:00 2001 From: ITOH Date: Sun, 13 Jun 2021 21:51:41 +0200 Subject: [PATCH 16/28] change: bump minor version --- src/util/constants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/constants.ts b/src/util/constants.ts index 2e59aef06..c9ee65268 100644 --- a/src/util/constants.ts +++ b/src/util/constants.ts @@ -9,7 +9,7 @@ export const GATEWAY_VERSION = 9; // TODO: update this version /** https://github.com/discordeno/discordeno/releases */ -export const DISCORDENO_VERSION = "11.1.0"; +export const DISCORDENO_VERSION = "11.2.0"; /** https://discord.com/developers/docs/reference#user-agent */ export const USER_AGENT = `DiscordBot (https://github.com/discordeno/discordeno, v${DISCORDENO_VERSION})`; From aad3f038d8e1f9395308f5de4a5eb67191785325 Mon Sep 17 00:00:00 2001 From: rigormorrtiss Date: Tue, 15 Jun 2021 12:45:02 +0400 Subject: [PATCH 17/28] feat(types): add 16000{4,5,6,7} to DiscordJsonErrorCodes (#1033) --- src/types/codes/json_error_codes.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/types/codes/json_error_codes.ts b/src/types/codes/json_error_codes.ts index ecd22efbf..56959f3ca 100644 --- a/src/types/codes/json_error_codes.ts +++ b/src/types/codes/json_error_codes.ts @@ -108,6 +108,10 @@ export enum DiscordJsonErrorCodes { NoUsersWithDiscordTagExist = 80004, ReqctionWasBlocked = 90001, ApiResourceIsCurrentlyOverloadedTryAgainALittleLater = 130000, + AThreadHasAlreadyBeenCreatedForThisMessage = 160004, + ThreadIsLocked = 160005, + MaximumNumberOfActiveThreadsReached = 160006, + MaximumNumberOfActiveAnnouncementThreadsReached = 160007, } export type JsonErrrorCodes = DiscordJsonErrorCodes; From 7e1e815ee044f39b35a87ef3c17b32b54316e068 Mon Sep 17 00:00:00 2001 From: rigormorrtiss Date: Tue, 15 Jun 2021 12:48:06 +0400 Subject: [PATCH 18/28] feat(types): add stageInstance field to Invite (#1041) * feat(types): add stageInstance field to Invite * feat(types): add stageInstance field to Invite * . * Convert members field to an array --- src/types/invites/invite.ts | 3 +++ src/types/invites/invite_stage_instance.ts | 12 ++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 src/types/invites/invite_stage_instance.ts diff --git a/src/types/invites/invite.ts b/src/types/invites/invite.ts index 422da5f74..3808de739 100644 --- a/src/types/invites/invite.ts +++ b/src/types/invites/invite.ts @@ -3,6 +3,7 @@ import { Guild } from "../guilds/guild.ts"; import { Application } from "../applications/application.ts"; import { User } from "../users/user.ts"; import { DiscordTargetTypes } from "./target_types.ts"; +import { InviteStageInstance } from "./invite_stage_instance.ts"; /** https://discord.com/developers/docs/resources/invite#invite-object */ export interface Invite { @@ -26,4 +27,6 @@ export interface Invite { approximateMemberCount?: number; /** The expiration date of this invite, returned from the `GET /invites/` endpoint when `with_expiration` is `true` */ expiresAt?: string | null; + /** Stage instance data if there is a public Stage instance in the Stage channel this invite is for */ + stageInstance?: InviteStageInstance; } diff --git a/src/types/invites/invite_stage_instance.ts b/src/types/invites/invite_stage_instance.ts new file mode 100644 index 000000000..8ad8da371 --- /dev/null +++ b/src/types/invites/invite_stage_instance.ts @@ -0,0 +1,12 @@ +import { GuildMember } from "../members/guild_member.ts"; + +export interface InviteStageInstance { + /** The members speaking in the Stage */ + members: Partial[]; + /** The number of users in the Stage */ + participantCount: number; + /** The number of users speaking in the Stage */ + speakerCount: number; + /** The topic of the Stage instance (1-120 characters) */ + topic: string; +} From c1ffa6b5f5819a8361e3df653944ef735ece9bcf Mon Sep 17 00:00:00 2001 From: rigormorrtiss Date: Tue, 15 Jun 2021 12:55:58 +0400 Subject: [PATCH 19/28] feat(types): add defaultAutoArchiveDuration field to Channel (#1043) --- src/types/channels/channel.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/types/channels/channel.ts b/src/types/channels/channel.ts index ceda62144..e672ac298 100644 --- a/src/types/channels/channel.ts +++ b/src/types/channels/channel.ts @@ -56,4 +56,6 @@ export interface Channel { threadMetadata?: ThreadMetadata; /** Thread member object for the current user, if they have joined the thread, only included on certain API endpoints */ member?: ThreadMember; + /** Default duration for newly created threads, in minutes, to automatically archive the thread after recent activity, can be set to: 60, 1440, 4320, 10080 */ + defaultAutoArchiveDuration?: number; } From 83fd5d997c2996bf52bd570d96f7d17d936a9005 Mon Sep 17 00:00:00 2001 From: rigormorrtiss Date: Tue, 15 Jun 2021 13:17:11 +0400 Subject: [PATCH 20/28] fix(types): mark id, userId as optional in ThreadMember (#1044) --- src/types/channels/threads/thread_member.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/types/channels/threads/thread_member.ts b/src/types/channels/threads/thread_member.ts index 2b3d1b54a..e86cd7030 100644 --- a/src/types/channels/threads/thread_member.ts +++ b/src/types/channels/threads/thread_member.ts @@ -1,8 +1,8 @@ export interface ThreadMember { /** The id of the thread */ - id: string; + id?: string; /** The id of the user */ - userId: string; + userId?: string; /** The time the current user last joined the thread */ joinTimestamp: string; /** Any user-thread settings, currently only used for notifications */ From e7414337f369145ba14d0a125be956ef7d8f1204 Mon Sep 17 00:00:00 2001 From: rigormorrtiss Date: Wed, 16 Jun 2021 10:00:20 +0400 Subject: [PATCH 21/28] fix(handlers): non-null-assert payload.id in THREAD_MEMBER_UPDATE (#1045) --- src/handlers/channels/THREAD_MEMBER_UPDATE.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/handlers/channels/THREAD_MEMBER_UPDATE.ts b/src/handlers/channels/THREAD_MEMBER_UPDATE.ts index 70c5f1c75..7cbfeb05c 100644 --- a/src/handlers/channels/THREAD_MEMBER_UPDATE.ts +++ b/src/handlers/channels/THREAD_MEMBER_UPDATE.ts @@ -6,7 +6,8 @@ import { snowflakeToBigint } from "../../util/bigint.ts"; export async function handleThreadMemberUpdate(data: DiscordGatewayPayload) { const payload = data.d as ThreadMember; - const thread = await cacheHandlers.get("channels", snowflakeToBigint(payload.id)); + // The id field is omitted from the thread member dispoatched within the GUILD_CREATE gateway event. + const thread = await cacheHandlers.get("channels", snowflakeToBigint(payload.id!)); if (!thread) return; thread.member = payload; From d5ea8904b9299b5e7133cc86b2ac14fb0b79b9fe Mon Sep 17 00:00:00 2001 From: ayntee <83537790+ayntee@users.noreply.github.com> Date: Wed, 16 Jun 2021 10:23:34 +0400 Subject: [PATCH 22/28] docs(handlers): fix typo (#1046) Thanks @itohatweb --- src/handlers/channels/THREAD_MEMBER_UPDATE.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/handlers/channels/THREAD_MEMBER_UPDATE.ts b/src/handlers/channels/THREAD_MEMBER_UPDATE.ts index 7cbfeb05c..814abf602 100644 --- a/src/handlers/channels/THREAD_MEMBER_UPDATE.ts +++ b/src/handlers/channels/THREAD_MEMBER_UPDATE.ts @@ -6,7 +6,7 @@ import { snowflakeToBigint } from "../../util/bigint.ts"; export async function handleThreadMemberUpdate(data: DiscordGatewayPayload) { const payload = data.d as ThreadMember; - // The id field is omitted from the thread member dispoatched within the GUILD_CREATE gateway event. + // The id field is omitted from the thread member dispatched within the GUILD_CREATE gateway event. const thread = await cacheHandlers.get("channels", snowflakeToBigint(payload.id!)); if (!thread) return; From ddf5d9f490245c9d6aff517eb8464be5d3cbd41b Mon Sep 17 00:00:00 2001 From: rigormorrtiss Date: Wed, 16 Jun 2021 23:02:21 +0400 Subject: [PATCH 23/28] add(helpers): connectToVoiceChannel() (#1048) * feat(helpers): add joinVoiceChannel() helper * Remove if-statement validating if channelId is present or not * refactor(helpers): use snakelize() * Rename to connectToVoiceChannel() Co-authored-by: ITOH * Require VIEW_CHANNEL permission including CONNECT Co-authored-by: ITOH * Change default value of third argument to {} * Remove usage of Partial and mark options as optional * Default selfDeaf to true by default * . * Add connectToVoiceChannel() to helpers module * docs(helpers): add jsdoc block to connectToVoiceChannel() * Use AtLeastOne type for options * Default value for selfMute option * Update src/helpers/voice/connect_to_voice_channel.ts Co-authored-by: ITOH Co-authored-by: ITOH --- src/helpers/mod.ts | 4 ++++ src/helpers/voice/connect_to_voice_channel.ts | 21 +++++++++++++++++++ src/types/util.ts | 2 ++ src/util/calculate_shard_id.ts | 7 +++++++ 4 files changed, 34 insertions(+) create mode 100644 src/helpers/voice/connect_to_voice_channel.ts create mode 100644 src/util/calculate_shard_id.ts diff --git a/src/helpers/mod.ts b/src/helpers/mod.ts index fae6ca9c9..047c5d480 100644 --- a/src/helpers/mod.ts +++ b/src/helpers/mod.ts @@ -134,6 +134,7 @@ import { updateStageInstance } from "./channels/update_stage_instance.ts"; import { getStageInstance } from "./channels/get_stage_instance.ts"; import { deleteStageInstance } from "./channels/delete_stage_instance.ts"; import { isSlashCommand } from "./type_guards/is_slash_command.ts"; +import { connectToVoiceChannel } from "./voice/connect_to_voice_channel.ts"; export { addDiscoverySubcategory, @@ -146,6 +147,7 @@ export { batchEditSlashCommandPermissions, categoryChildren, channelOverwriteHasPermission, + connectToVoiceChannel, createChannel, createEmoji, createGuild, @@ -407,6 +409,8 @@ export let helpers = { getGuildTemplates, getTemplate, syncGuildTemplate, + // voice + connectToVoiceChannel, // webhooks createWebhook, deleteWebhookMessage, diff --git a/src/helpers/voice/connect_to_voice_channel.ts b/src/helpers/voice/connect_to_voice_channel.ts new file mode 100644 index 000000000..dc3257387 --- /dev/null +++ b/src/helpers/voice/connect_to_voice_channel.ts @@ -0,0 +1,21 @@ +import { DiscordGatewayOpcodes } from "../../types/codes/gateway_opcodes.ts"; +import type { UpdateVoiceState } from "../../types/voice/update_voice_state.ts"; +import { requireBotChannelPermissions } from "../../util/permissions.ts"; +import { calculateShardId } from "../../util/calculate_shard_id.ts"; +import { snakelize } from "../../util/utils.ts"; +import { ws } from "../../ws/ws.ts"; +import type { AtLeastOne } from "../../types/util.ts"; + +/** Connect or join a voice channel inside a guild. By default, the "selfDeaf" option is true. Requires `CONNECT` and `VIEW_CHANNEL` permissions. */ +export async function connectToVoiceChannel( + guildId: bigint, + channelId: bigint, + options?: AtLeastOne> +) { + await requireBotChannelPermissions(channelId, ["CONNECT", "VIEW_CHANNEL"]); + + ws.sendShardMessage(calculateShardId(guildId), { + op: DiscordGatewayOpcodes.VoiceStateUpdate, + d: snakelize({guildId, channelId, selfMute: Boolean(options?.selfMute), selfDeaf: options.selfDeaf ?? true }), + }); +} diff --git a/src/types/util.ts b/src/types/util.ts index 551cce9b6..c25e6f7fd 100644 --- a/src/types/util.ts +++ b/src/types/util.ts @@ -149,3 +149,5 @@ export type CamelCasedPropertiesDeep = Value extends Function : { [K in keyof Value as CamelCase]: CamelCasedPropertiesDeep; }; + +export type AtLeastOne }> = Partial & U[keyof U]; diff --git a/src/util/calculate_shard_id.ts b/src/util/calculate_shard_id.ts new file mode 100644 index 000000000..12012f09f --- /dev/null +++ b/src/util/calculate_shard_id.ts @@ -0,0 +1,7 @@ +import { ws } from "../ws/ws.ts"; + +export function calculateShardId(guildId: bigint) { + if (ws.maxShards === 1) return 0; + + return Number((guildId >> 22n) % BigInt(ws.maxShards - 1)); +} From dc4937f4f6fa5fe566e7d1972191ca2309f6606f Mon Sep 17 00:00:00 2001 From: ITOH Date: Thu, 17 Jun 2021 15:34:18 +0200 Subject: [PATCH 24/28] fix: botAvatarURL is nullable null shall be passed to reset the bots avatar --- src/helpers/misc/edit_bot_profile.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/helpers/misc/edit_bot_profile.ts b/src/helpers/misc/edit_bot_profile.ts index 36404ddfe..886de902f 100644 --- a/src/helpers/misc/edit_bot_profile.ts +++ b/src/helpers/misc/edit_bot_profile.ts @@ -7,9 +7,9 @@ import { urlToBase64 } from "../../util/utils.ts"; /** Modifies the bot's username or avatar. * NOTE: username: if changed may cause the bot's discriminator to be randomized. */ -export async function editBotProfile(options: { username?: string; botAvatarURL?: string }) { +export async function editBotProfile(options: { username?: string; botAvatarURL?: string | null }) { // Nothing was edited - if (!options.username && !options.botAvatarURL) return; + if (!options.username && options.botAvatarURL === undefined) return; // Check username requirements if username was provided if (options.username) { if (options.username.length > 32) { @@ -26,7 +26,7 @@ export async function editBotProfile(options: { username?: string; botAvatarURL? } } - const avatar = options?.botAvatarURL ? await urlToBase64(options?.botAvatarURL) : undefined; + const avatar = options?.botAvatarURL ? await urlToBase64(options?.botAvatarURL) : options?.botAvatarURL; return await rest.runMethod("patch", endpoints.USER_BOT, { username: options.username?.trim(), From 6008243b6a5e4fa2a4c19ed1b40cad6e8d41a5da Mon Sep 17 00:00:00 2001 From: rigormorrtiss Date: Thu, 17 Jun 2021 21:01:45 +0400 Subject: [PATCH 25/28] docs(types): add clarification for guild stickers for MessageSticker#tags (#1051) --- src/types/messages/message_sticker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/types/messages/message_sticker.ts b/src/types/messages/message_sticker.ts index 1de5e69d4..7bb7f37f7 100644 --- a/src/types/messages/message_sticker.ts +++ b/src/types/messages/message_sticker.ts @@ -10,7 +10,7 @@ export interface MessageSticker { name: string; /** Description of the sticker */ description: string; - /** A comma-separated list of tags for the sticker */ + /** For guild stickers, a unicode emoji representing the sticker's expression. For Nitro stickers, a comma-separated list of related expressions */ tags?: string; /** * Sticker asset hash From dff38063973276c13dc67a4af7bc44fbcfcfd36d Mon Sep 17 00:00:00 2001 From: rigormorrtiss Date: Thu, 17 Jun 2021 21:03:53 +0400 Subject: [PATCH 26/28] feat(types): add available, guildId, user, sortValue to MessageSticker (#1052) --- src/types/messages/message_sticker.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/types/messages/message_sticker.ts b/src/types/messages/message_sticker.ts index 7bb7f37f7..db42fa3a0 100644 --- a/src/types/messages/message_sticker.ts +++ b/src/types/messages/message_sticker.ts @@ -1,4 +1,5 @@ import { DiscordMessageStickerFormatTypes } from "./message_sticker_format_types.ts"; +import type { User } from "../users/user.ts"; /** https://discord.com/developers/docs/resources/channel#message-object-message-sticker-structure */ export interface MessageSticker { @@ -19,4 +20,12 @@ export interface MessageSticker { asset: string; /** Type of sticker format */ formatType: DiscordMessageStickerFormatTypes; + /** Whether or not the sticker is available */ + available?: boolean; + /** Id of the guild that owns this sticker */ + guildId?: string; + /** The user that uploaded the sticker */ + user?: User; + /** A sticker's sort order within a pack */ + sortValue?: number; } From 50fff43007d8878a63fa74a2bcb6df9ae122b734 Mon Sep 17 00:00:00 2001 From: rigormorrtiss Date: Thu, 17 Jun 2021 21:12:20 +0400 Subject: [PATCH 27/28] docs(types): deprecate stickers field in Message --- src/types/messages/message.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/types/messages/message.ts b/src/types/messages/message.ts index 8478757a4..2edc2be1c 100644 --- a/src/types/messages/message.ts +++ b/src/types/messages/message.ts @@ -78,7 +78,10 @@ export interface Message { messageReference?: Omit; /** Message flags combined as a bitfield */ flags?: number; - /** The stickers sent with the message (bots currently can only receive messages with stickers, not send) */ + /** + * The stickers sent with the message (bots currently can only receive messages with stickers, not send) + * @deprecated + */ stickers?: MessageSticker[]; /** * The message associated with the `message_reference` From 6ea15a6485299142f92d9b69fa918181f465cc49 Mon Sep 17 00:00:00 2001 From: rigormorrtiss Date: Thu, 17 Jun 2021 21:12:52 +0400 Subject: [PATCH 28/28] fix(types): update MessageSticker fields --- src/types/messages/message_sticker.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/types/messages/message_sticker.ts b/src/types/messages/message_sticker.ts index db42fa3a0..92d477daf 100644 --- a/src/types/messages/message_sticker.ts +++ b/src/types/messages/message_sticker.ts @@ -3,19 +3,20 @@ import type { User } from "../users/user.ts"; /** https://discord.com/developers/docs/resources/channel#message-object-message-sticker-structure */ export interface MessageSticker { - /** id of the sticker */ + /** Id of the sticker */ id: string; - /** id of the pack the sticker is from */ - packId: string; + /** Id of the pack the sticker is from */ + packId?: string; /** Name of the sticker */ name: string; /** Description of the sticker */ description: string; /** For guild stickers, a unicode emoji representing the sticker's expression. For Nitro stickers, a comma-separated list of related expressions */ - tags?: string; + tags: string; /** * Sticker asset hash * Note: The URL for fetching sticker assets is currently private. + * @deprecated the value of the asset field will an empty string. */ asset: string; /** Type of sticker format */