/* eslint-disable jsdoc/check-param-names */ import { makeURLSearchParams, type RequestData, type REST } from '@discordjs/rest'; import { Routes, type RESTGetAPIApplicationCommandPermissionsResult, type RESTGetAPIApplicationCommandResult, type RESTGetAPIApplicationCommandsQuery, type RESTGetAPIApplicationCommandsResult, type RESTGetAPIApplicationGuildCommandResult, type RESTGetAPIApplicationGuildCommandsQuery, type RESTGetAPIApplicationGuildCommandsResult, type RESTGetAPIGuildApplicationCommandsPermissionsResult, type RESTPatchAPIApplicationCommandJSONBody, type RESTPatchAPIApplicationCommandResult, type RESTPatchAPIApplicationGuildCommandJSONBody, type RESTPatchAPIApplicationGuildCommandResult, type RESTPostAPIApplicationCommandsJSONBody, type RESTPostAPIApplicationCommandsResult, type RESTPostAPIApplicationGuildCommandsJSONBody, type RESTPostAPIApplicationGuildCommandsResult, type RESTPutAPIApplicationCommandPermissionsJSONBody, type RESTPutAPIApplicationCommandPermissionsResult, type RESTPutAPIApplicationCommandsJSONBody, type RESTPutAPIApplicationCommandsResult, type RESTPutAPIApplicationGuildCommandsJSONBody, type RESTPutAPIApplicationGuildCommandsResult, type Snowflake, } from 'discord-api-types/v10'; export class ApplicationCommandsAPI { public constructor(private readonly rest: REST) {} /** * Fetches all global commands for a application * * @see {@link https://discord.com/developers/docs/interactions/application-commands#get-global-application-commands} * @param applicationId - The application id to fetch commands for * @param query - The query options for fetching commands * @param options - The options for fetching commands */ public async getGlobalCommands( applicationId: Snowflake, query: RESTGetAPIApplicationCommandsQuery = {}, { signal }: Pick = {}, ) { return this.rest.get(Routes.applicationCommands(applicationId), { query: makeURLSearchParams(query), signal, }) as Promise; } /** * Creates a new global command * * @see {@link https://discord.com/developers/docs/interactions/application-commands#create-global-application-command} * @param applicationId - The application id to create the command for * @param body - The data for creating the command * @param options - The options for creating the command */ public async createGlobalCommand( applicationId: Snowflake, body: RESTPostAPIApplicationCommandsJSONBody, { signal }: Pick = {}, ) { return this.rest.post(Routes.applicationCommands(applicationId), { body, signal, }) as Promise; } /** * Fetches a global command * * @see {@link https://discord.com/developers/docs/interactions/application-commands#get-global-application-command} * @param applicationId - The application id to fetch the command from * @param commandId - The command id to fetch * @param options - The options for fetching the command */ public async getGlobalCommand( applicationId: Snowflake, commandId: Snowflake, { signal }: Pick = {}, ) { return this.rest.get(Routes.applicationCommand(applicationId, commandId), { signal, }) as Promise; } /** * Edits a global command * * @see {@link https://discord.com/developers/docs/interactions/application-commands#edit-global-application-command} * @param applicationId - The application id of the command * @param commandId - The id of the command to edit * @param body - The data for editing the command * @param options - The options for editing the command */ public async editGlobalCommand( applicationId: Snowflake, commandId: Snowflake, body: RESTPatchAPIApplicationCommandJSONBody, { signal }: Pick = {}, ) { return this.rest.patch(Routes.applicationCommand(applicationId, commandId), { body, signal, }) as Promise; } /** * Deletes a global command * * @see {@link https://discord.com/developers/docs/interactions/application-commands#delete-global-application-command} * @param applicationId - The application id of the command * @param commandId - The id of the command to delete * @param options - The options for deleting a command */ public async deleteGlobalCommand( applicationId: Snowflake, commandId: Snowflake, { signal }: Pick = {}, ) { await this.rest.delete(Routes.applicationCommand(applicationId, commandId), { signal }); } /** * Overwrites global commands * * @see {@link https://discord.com/developers/docs/interactions/application-commands#bulk-overwrite-global-application-commands} * @param applicationId - The application id to overwrite commands for * @param body - The data for overwriting commands * @param options - The options for overwriting commands */ public async bulkOverwriteGlobalCommands( applicationId: Snowflake, body: RESTPutAPIApplicationCommandsJSONBody, { signal }: Pick = {}, ) { return this.rest.put(Routes.applicationCommands(applicationId), { body, signal, }) as Promise; } /** * Fetches all commands for a guild * * @see {@link https://discord.com/developers/docs/interactions/application-commands#get-guild-application-commands} * @param applicationId - The application id to fetch commands for * @param guildId - The guild id to fetch commands for * @param query - The data for fetching commands * @param options - The options for fetching commands */ public async getGuildCommands( applicationId: Snowflake, guildId: Snowflake, query: RESTGetAPIApplicationGuildCommandsQuery = {}, { signal }: Pick = {}, ) { return this.rest.get(Routes.applicationGuildCommands(applicationId, guildId), { query: makeURLSearchParams(query), signal, }) as Promise; } /** * Creates a new command for a guild * * @see {@link https://discord.com/developers/docs/interactions/application-commands#create-guild-application-command} * @param applicationId - The application id to create the command for * @param guildId - The guild id to create the command for * @param body - The data for creating the command * @param options - The options for creating the command */ public async createGuildCommand( applicationId: Snowflake, guildId: Snowflake, body: RESTPostAPIApplicationGuildCommandsJSONBody, { signal }: Pick = {}, ) { return this.rest.post(Routes.applicationGuildCommands(applicationId, guildId), { body, signal, }) as Promise; } /** * Fetches a guild command * * @see {@link https://discord.com/developers/docs/interactions/application-commands#get-guild-application-command} * @param applicationId - The application id to fetch the command from * @param guildId - The guild id to fetch the command from * @param commandId - The command id to fetch * @param options - The options for fetching the command */ public async getGuildCommand( applicationId: Snowflake, guildId: Snowflake, commandId: Snowflake, { signal }: Pick = {}, ) { return this.rest.get(Routes.applicationGuildCommand(applicationId, guildId, commandId), { signal, }) as Promise; } /** * Edits a guild command * * @see {@link https://discord.com/developers/docs/interactions/application-commands#edit-guild-application-command} * @param applicationId - The application id of the command * @param guildId - The guild id of the command * @param commandId - The command id to edit * @param body - The data for editing the command * @param options - The options for editing the command */ public async editGuildCommand( applicationId: Snowflake, guildId: Snowflake, commandId: Snowflake, body: RESTPatchAPIApplicationGuildCommandJSONBody, { signal }: Pick = {}, ) { return this.rest.patch(Routes.applicationGuildCommand(applicationId, guildId, commandId), { body, signal, }) as Promise; } /** * Deletes a guild command * * @see {@link https://discord.com/developers/docs/interactions/application-commands#delete-guild-application-command} * @param applicationId - The application id of the command * @param guildId - The guild id of the command * @param commandId - The id of the command to delete * @param options - The options for deleting the command */ public async deleteGuildCommand( applicationId: Snowflake, guildId: Snowflake, commandId: Snowflake, { signal }: Pick = {}, ) { await this.rest.delete(Routes.applicationGuildCommand(applicationId, guildId, commandId), { signal }); } /** * Bulk overwrites guild commands * * @see {@link https://discord.com/developers/docs/interactions/application-commands#bulk-overwrite-guild-application-commands} * @param applicationId - The application id to overwrite commands for * @param guildId - The guild id to overwrite commands for * @param body - The data for overwriting commands * @param options - The options for overwriting the commands */ public async bulkOverwriteGuildCommands( applicationId: Snowflake, guildId: Snowflake, body: RESTPutAPIApplicationGuildCommandsJSONBody, { signal }: Pick = {}, ) { return this.rest.put(Routes.applicationGuildCommands(applicationId, guildId), { body, signal, }) as Promise; } /** * Fetches the permissions for a guild command * * @see {@link https://discord.com/developers/docs/interactions/application-commands#get-guild-application-command-permissions} * @param applicationId - The application id to get the permissions for * @param guildId - The guild id of the command * @param commandId - The command id to get the permissions for * @param options - The option for fetching the command */ public async getGuildCommandPermissions( applicationId: Snowflake, guildId: Snowflake, commandId: Snowflake, { signal }: Pick = {}, ) { return this.rest.get(Routes.applicationCommandPermissions(applicationId, guildId, commandId), { signal, }) as Promise; } /** * Fetches all permissions for all commands in a guild * * @see {@link https://discord.com/developers/docs/interactions/application-commands#get-application-command-permissions} * @param applicationId - The application id to get the permissions for * @param guildId - The guild id to get the permissions for * @param options - The options for fetching permissions */ public async getGuildCommandsPermissions( applicationId: Snowflake, guildId: Snowflake, { signal }: Pick = {}, ) { return this.rest.get(Routes.guildApplicationCommandsPermissions(applicationId, guildId), { signal, }) as Promise; } /** * Edits the permissions for a guild command * * @see {@link https://discord.com/developers/docs/interactions/application-commands#edit-application-command-permissions} * @param userToken - The token of the user to edit permissions on behalf of * @param applicationId - The application id to edit the permissions for * @param guildId - The guild id to edit the permissions for * @param commandId - The id of the command to edit the permissions for * @param body - The data for editing the permissions * @param options - The options for editing the permissions */ public async editGuildCommandPermissions( userToken: string, applicationId: Snowflake, guildId: Snowflake, commandId: Snowflake, body: RESTPutAPIApplicationCommandPermissionsJSONBody, { signal }: Pick = {}, ) { return this.rest.put(Routes.applicationCommandPermissions(applicationId, guildId, commandId), { headers: { Authorization: `Bearer ${userToken.replace('Bearer ', '')}` }, auth: false, body, signal, }) as Promise; } }