From ba1d1ea423091dbaa28ed9e5c03eab0ca04438f5 Mon Sep 17 00:00:00 2001 From: almeidx Date: Mon, 4 Jul 2022 16:30:39 +0100 Subject: [PATCH] fix(applicationcommandmanager): allow passing builders to methods --- src/managers/ApplicationCommandManager.js | 28 +++++++++++++++++++---- typings/index.d.ts | 15 ++++++++---- typings/index.test-d.ts | 14 ++++++++++++ 3 files changed, 48 insertions(+), 9 deletions(-) diff --git a/src/managers/ApplicationCommandManager.js b/src/managers/ApplicationCommandManager.js index 77008f5b8e9d..e6758ad13d57 100644 --- a/src/managers/ApplicationCommandManager.js +++ b/src/managers/ApplicationCommandManager.js @@ -1,5 +1,6 @@ 'use strict'; +const { isJSONEncodable } = require('@discordjs/builders'); const { Collection } = require('@discordjs/collection'); const ApplicationCommandPermissionsManager = require('./ApplicationCommandPermissionsManager'); const CachedManager = require('./CachedManager'); @@ -54,6 +55,13 @@ class ApplicationCommandManager extends CachedManager { * @typedef {ApplicationCommand|Snowflake} ApplicationCommandResolvable */ + /* eslint-disable max-len */ + /** + * Data that resolves to the data of an ApplicationCommand + * @typedef {ApplicationCommandData|APIApplicationCommand|SlashCommandBuilder|ContextMenuCommandBuilder} ApplicationCommandDataResolvable + */ + /* eslint-enable max-len */ + /** * Options used to fetch data from Discord * @typedef {Object} BaseFetchOptions @@ -108,7 +116,7 @@ class ApplicationCommandManager extends CachedManager { /** * Creates an application command. - * @param {ApplicationCommandData|APIApplicationCommand} command The command + * @param {ApplicationCommandDataResolvable} command The command * @param {Snowflake} [guildId] The guild's id to create this command in, * ignored when using a {@link GuildApplicationCommandManager} * @returns {Promise} @@ -130,7 +138,7 @@ class ApplicationCommandManager extends CachedManager { /** * Sets all the commands for this application or guild. - * @param {ApplicationCommandData[]|APIApplicationCommand[]} commands The commands + * @param {ApplicationCommandDataResolvable[]} commands The commands * @param {Snowflake} [guildId] The guild's id to create the commands in, * ignored when using a {@link GuildApplicationCommandManager} * @returns {Promise>} @@ -160,7 +168,7 @@ class ApplicationCommandManager extends CachedManager { /** * Edits an application command. * @param {ApplicationCommandResolvable} command The command to edit - * @param {Partial} data The data to update the command with + * @param {Partial} data The data to update the command with * @param {Snowflake} [guildId] The guild's id where the command registered, * ignored when using a {@link GuildApplicationCommandManager} * @returns {Promise} @@ -207,11 +215,13 @@ class ApplicationCommandManager extends CachedManager { /** * Transforms an {@link ApplicationCommandData} object into something that can be used with the API. - * @param {ApplicationCommandData|APIApplicationCommand} command The command to transform + * @param {ApplicationCommandDataResolvable} command The command to transform * @returns {APIApplicationCommand} * @private */ static transformCommand(command) { + if (isJSONEncodable(command)) return command.toJSON(); + let default_member_permissions; if ('default_member_permissions' in command) { @@ -241,3 +251,13 @@ class ApplicationCommandManager extends CachedManager { } module.exports = ApplicationCommandManager; + +/** + * @external SlashCommandBuilder + * @see {@link https://discord.js.org/#/docs/builders/main/class/SlashCommandBuilder} + */ + +/** + * @external ContextMenuCommandBuilder + * @see {@link https://discord.js.org/#/docs/builders/main/class/ContextMenuCommandBuilder} + */ diff --git a/typings/index.d.ts b/typings/index.d.ts index bdcc7ac9f986..e5e9293930cf 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -3,13 +3,16 @@ import { bold, channelMention, codeBlock, + ContextMenuCommandBuilder, formatEmoji, hideLinkEmbed, hyperlink, inlineCode, italic, + JSONEncodable, quote, roleMention, + SlashCommandBuilder, spoiler, strikethrough, time, @@ -3065,7 +3068,11 @@ export abstract class CachedManager extends DataManager, @@ -3107,9 +3114,7 @@ export class ApplicationCommandManager< commands: ApplicationCommandDataResolvable[], guildId: Snowflake, ): Promise>; - private static transformCommand( - command: ApplicationCommandData, - ): Omit; + private static transformCommand(command: ApplicationCommandDataResolvable): RESTPostAPIApplicationCommandsJSONBody; } export class ApplicationCommandPermissionsManager< @@ -3178,7 +3183,7 @@ export class GuildApplicationCommandManager extends ApplicationCommandManager; public edit( command: ApplicationCommandResolvable, - data: ApplicationCommandDataResolvable, + data: Partial, ): Promise; public fetch(id: Snowflake, options?: FetchGuildApplicationCommandFetchOptions): Promise; public fetch(options: FetchGuildApplicationCommandFetchOptions): Promise>; diff --git a/typings/index.test-d.ts b/typings/index.test-d.ts index 322513b35006..425d09e75f63 100644 --- a/typings/index.test-d.ts +++ b/typings/index.test-d.ts @@ -100,6 +100,7 @@ import { } from '.'; import type { ApplicationCommandOptionTypes } from './enums'; import { expectAssignable, expectDeprecated, expectNotAssignable, expectNotType, expectType } from 'tsd'; +import type { ContextMenuCommandBuilder, SlashCommandBuilder } from '@discordjs/builders'; // Test type transformation: declare const serialize: (value: T) => Serialized; @@ -128,6 +129,9 @@ const testUserId = '987654321098765432'; // example id const globalCommandId = '123456789012345678'; // example id const guildCommandId = '234567890123456789'; // example id +declare const slashCommandBuilder: SlashCommandBuilder; +declare const contextMenuCommandBuilder: ContextMenuCommandBuilder; + client.on('ready', async () => { console.log(`Client is logged in as ${client.user!.tag} and ready!`); @@ -144,6 +148,16 @@ client.on('ready', async () => { const guildCommandFromGlobal = await client.application?.commands.fetch(guildCommandId, { guildId: testGuildId }); const guildCommandFromGuild = await client.guilds.cache.get(testGuildId)?.commands.fetch(guildCommandId); + await client.application?.commands.create(slashCommandBuilder); + await client.application?.commands.create(contextMenuCommandBuilder); + await guild.commands.create(slashCommandBuilder); + await guild.commands.create(contextMenuCommandBuilder); + + await client.application?.commands.edit(globalCommandId, slashCommandBuilder); + await client.application?.commands.edit(globalCommandId, contextMenuCommandBuilder); + await guild.commands.edit(guildCommandId, slashCommandBuilder); + await guild.commands.edit(guildCommandId, contextMenuCommandBuilder); + await client.application?.commands.edit(globalCommandId, { defaultMemberPermissions: null }); await globalCommand?.edit({ defaultMemberPermissions: null }); await globalCommand?.setDefaultMemberPermissions(null);