feat: add soundboard (#10536)

* feat: add soundboard

* chore: disable `jsdoc/check-param-names` rule

* fix: export `SoundboardSoundsAPI`
This commit is contained in:
Danial Raza
2024-11-04 11:03:13 +01:00
committed by Jiralite
parent 2deea25e97
commit d25ef434ae
5 changed files with 149 additions and 0 deletions

View File

@@ -34,6 +34,8 @@ import {
type RESTPutAPIChannelPermissionJSONBody, type RESTPutAPIChannelPermissionJSONBody,
type RESTPutAPIChannelRecipientJSONBody, type RESTPutAPIChannelRecipientJSONBody,
type Snowflake, type Snowflake,
type RESTPostAPISoundboardSendSoundJSONBody,
type RESTPostAPISendSoundboardSoundResult,
} from 'discord-api-types/v10'; } from 'discord-api-types/v10';
export interface StartForumThreadOptions extends RESTPostAPIGuildForumThreadsJSONBody { export interface StartForumThreadOptions extends RESTPostAPIGuildForumThreadsJSONBody {
@@ -595,6 +597,25 @@ export class ChannelsAPI {
}); });
} }
/**
* Sends a soundboard sound in a channel
*
* @see {@link https://discord.com/developers/docs/resources/soundboard#send-soundboard-sound}
* @param channelId - The id of the channel to send the soundboard sound in
* @param body - The data for sending the soundboard sound
* @param options - The options for sending the soundboard sound
*/
public async sendSoundboardSound(
channelId: Snowflake,
body: RESTPostAPISoundboardSendSoundJSONBody,
{ signal }: Pick<RequestData, 'signal'> = {},
) {
return this.rest.post(Routes.sendSoundboardSound(channelId), {
body,
signal,
}) as Promise<RESTPostAPISendSoundboardSoundResult>;
}
/** /**
* Adds a recipient to a group DM channel * Adds a recipient to a group DM channel
* *

View File

@@ -102,6 +102,12 @@ import {
type RESTPutAPIGuildOnboardingJSONBody, type RESTPutAPIGuildOnboardingJSONBody,
type RESTPutAPIGuildOnboardingResult, type RESTPutAPIGuildOnboardingResult,
type RESTPutAPIGuildTemplateSyncResult, type RESTPutAPIGuildTemplateSyncResult,
type RESTGetAPIGuildSoundboardSoundResult,
type RESTGetAPIGuildSoundboardSoundsResult,
type RESTPatchAPIGuildSoundboardSoundJSONBody,
type RESTPatchAPIGuildSoundboardSoundResult,
type RESTPostAPIGuildSoundboardSoundJSONBody,
type RESTPostAPIGuildSoundboardSoundResult,
type Snowflake, type Snowflake,
} from 'discord-api-types/v10'; } from 'discord-api-types/v10';
import { VoiceAPI } from './voice'; import { VoiceAPI } from './voice';
@@ -1362,6 +1368,95 @@ export class GuildsAPI {
}) as Promise<RESTPutAPIGuildOnboardingResult>; }) as Promise<RESTPutAPIGuildOnboardingResult>;
} }
/**
* Fetches all the soundboard sounds for a guild
*
* @see {@link https://discord.com/developers/docs/resources/soundboard#list-guild-soundboard-sounds}
* @param guildId - The id of the guild to fetch the soundboard sounds for
* @param options - The options for fetching the soundboard sounds
*/
public async getSoundboardSounds(guildId: Snowflake, { signal }: Pick<RequestData, 'signal'> = {}) {
return this.rest.get(Routes.guildSoundboardSounds(guildId), {
signal,
}) as Promise<RESTGetAPIGuildSoundboardSoundsResult>;
}
/**
* Fetches a soundboard sound for a guild
*
* @see {@link https://discord.com/developers/docs/resources/soundboard#get-guild-soundboard-sound}
* @param guildId - The id of the guild to fetch the soundboard sound for
* @param soundId - The id of the soundboard sound to fetch
* @param options - The options for fetching the soundboard sound
*/
public async getSoundboardSound(
guildId: Snowflake,
soundId: Snowflake,
{ signal }: Pick<RequestData, 'signal'> = {},
) {
return this.rest.get(Routes.guildSoundboardSound(guildId, soundId), {
signal,
}) as Promise<RESTGetAPIGuildSoundboardSoundResult>;
}
/**
* Creates a new soundboard sound for a guild
*
* @see {@link https://discord.com/developers/docs/resources/soundboard#create-guild-soundboard-sound}
* @param guildId - The id of the guild to create the soundboard sound for
* @param body - The data for creating the soundboard sound
* @param options - The options for creating the soundboard sound
*/
public async createSoundboardSound(
guildId: Snowflake,
body: RESTPostAPIGuildSoundboardSoundJSONBody,
{ reason, signal }: Pick<RequestData, 'reason' | 'signal'> = {},
) {
return this.rest.post(Routes.guildSoundboardSounds(guildId), {
body,
reason,
signal,
}) as Promise<RESTPostAPIGuildSoundboardSoundResult>;
}
/**
* Edits a soundboard sound for a guild
*
* @see {@link https://discord.com/developers/docs/resources/soundboard#modify-guild-soundboard-sound}
* @param guildId - The id of the guild to edit the soundboard sound for
* @param soundId - The id of the soundboard sound to edit
* @param body - The data for editing the soundboard sound
* @param options - The options for editing the soundboard sound
*/
public async editSoundboardSound(
guildId: Snowflake,
soundId: Snowflake,
body: RESTPatchAPIGuildSoundboardSoundJSONBody,
{ reason, signal }: Pick<RequestData, 'reason' | 'signal'> = {},
) {
return this.rest.patch(Routes.guildSoundboardSound(guildId, soundId), {
body,
reason,
signal,
}) as Promise<RESTPatchAPIGuildSoundboardSoundResult>;
}
/**
* Deletes a soundboard sound for a guild
*
* @see {@link https://discord.com/developers/docs/resources/soundboard#delete-guild-soundboard-sound}
* @param guildId - The id of the guild to delete the soundboard sound for
* @param soundId - The id of the soundboard sound to delete
* @param options - The options for deleting the soundboard sound
*/
public async deleteSoundboardSound(
guildId: Snowflake,
soundId: Snowflake,
{ reason, signal }: Pick<RequestData, 'reason' | 'signal'> = {},
) {
await this.rest.delete(Routes.guildSoundboardSound(guildId, soundId), { reason, signal });
}
/** /**
* Modifies incident actions for a guild. * Modifies incident actions for a guild.
* *

View File

@@ -10,6 +10,7 @@ import { MonetizationAPI } from './monetization.js';
import { OAuth2API } from './oauth2.js'; import { OAuth2API } from './oauth2.js';
import { PollAPI } from './poll.js'; import { PollAPI } from './poll.js';
import { RoleConnectionsAPI } from './roleConnections.js'; import { RoleConnectionsAPI } from './roleConnections.js';
import { SoundboardSoundsAPI } from './soundboardSounds.js';
import { StageInstancesAPI } from './stageInstances.js'; import { StageInstancesAPI } from './stageInstances.js';
import { StickersAPI } from './sticker.js'; import { StickersAPI } from './sticker.js';
import { ThreadsAPI } from './thread.js'; import { ThreadsAPI } from './thread.js';
@@ -28,6 +29,7 @@ export * from './monetization.js';
export * from './oauth2.js'; export * from './oauth2.js';
export * from './poll.js'; export * from './poll.js';
export * from './roleConnections.js'; export * from './roleConnections.js';
export * from './soundboardSounds.js';
export * from './stageInstances.js'; export * from './stageInstances.js';
export * from './sticker.js'; export * from './sticker.js';
export * from './thread.js'; export * from './thread.js';
@@ -58,6 +60,8 @@ export class API {
public readonly roleConnections: RoleConnectionsAPI; public readonly roleConnections: RoleConnectionsAPI;
public readonly soundboardSounds: SoundboardSoundsAPI;
public readonly stageInstances: StageInstancesAPI; public readonly stageInstances: StageInstancesAPI;
public readonly stickers: StickersAPI; public readonly stickers: StickersAPI;
@@ -81,6 +85,7 @@ export class API {
this.oauth2 = new OAuth2API(rest); this.oauth2 = new OAuth2API(rest);
this.poll = new PollAPI(rest); this.poll = new PollAPI(rest);
this.roleConnections = new RoleConnectionsAPI(rest); this.roleConnections = new RoleConnectionsAPI(rest);
this.soundboardSounds = new SoundboardSoundsAPI(rest);
this.stageInstances = new StageInstancesAPI(rest); this.stageInstances = new StageInstancesAPI(rest);
this.stickers = new StickersAPI(rest); this.stickers = new StickersAPI(rest);
this.threads = new ThreadsAPI(rest); this.threads = new ThreadsAPI(rest);

View File

@@ -0,0 +1,20 @@
/* eslint-disable jsdoc/check-param-names */
import type { RequestData, REST } from '@discordjs/rest';
import { Routes, type RESTGetAPISoundboardDefaultSoundsResult } from 'discord-api-types/v10';
export class SoundboardSoundsAPI {
public constructor(private readonly rest: REST) {}
/**
* Fetches all the soundboard default sounds.
*
* @see {@link https://discord.com/developers/docs/resources/soundboard#list-default-soundboard-sounds}
* @param options - The options for fetching the soundboard default sounds.
*/
public async getSoundboardDefaultSounds({ signal }: Pick<RequestData, 'signal'> = {}) {
return this.rest.get(Routes.soundboardDefaultSounds(), {
signal,
}) as Promise<RESTGetAPISoundboardDefaultSoundsResult>;
}
}

View File

@@ -38,6 +38,10 @@ import {
type GatewayGuildScheduledEventUpdateDispatchData, type GatewayGuildScheduledEventUpdateDispatchData,
type GatewayGuildScheduledEventUserAddDispatchData, type GatewayGuildScheduledEventUserAddDispatchData,
type GatewayGuildScheduledEventUserRemoveDispatchData, type GatewayGuildScheduledEventUserRemoveDispatchData,
type GatewayGuildSoundboardSoundCreateDispatch,
type GatewayGuildSoundboardSoundDeleteDispatch,
type GatewayGuildSoundboardSoundUpdateDispatch,
type GatewayGuildSoundboardSoundsUpdateDispatch,
type GatewayGuildStickersUpdateDispatchData, type GatewayGuildStickersUpdateDispatchData,
type GatewayGuildUpdateDispatchData, type GatewayGuildUpdateDispatchData,
type GatewayIntegrationCreateDispatchData, type GatewayIntegrationCreateDispatchData,
@@ -135,6 +139,10 @@ export interface MappedEvents {
[GatewayDispatchEvents.GuildScheduledEventUserRemove]: [ [GatewayDispatchEvents.GuildScheduledEventUserRemove]: [
ToEventProps<GatewayGuildScheduledEventUserRemoveDispatchData>, ToEventProps<GatewayGuildScheduledEventUserRemoveDispatchData>,
]; ];
[GatewayDispatchEvents.GuildSoundboardSoundCreate]: [ToEventProps<GatewayGuildSoundboardSoundCreateDispatch>];
[GatewayDispatchEvents.GuildSoundboardSoundDelete]: [ToEventProps<GatewayGuildSoundboardSoundDeleteDispatch>];
[GatewayDispatchEvents.GuildSoundboardSoundUpdate]: [ToEventProps<GatewayGuildSoundboardSoundUpdateDispatch>];
[GatewayDispatchEvents.GuildSoundboardSoundsUpdate]: [ToEventProps<GatewayGuildSoundboardSoundsUpdateDispatch>];
[GatewayDispatchEvents.GuildStickersUpdate]: [ToEventProps<GatewayGuildStickersUpdateDispatchData>]; [GatewayDispatchEvents.GuildStickersUpdate]: [ToEventProps<GatewayGuildStickersUpdateDispatchData>];
[GatewayDispatchEvents.GuildUpdate]: [ToEventProps<GatewayGuildUpdateDispatchData>]; [GatewayDispatchEvents.GuildUpdate]: [ToEventProps<GatewayGuildUpdateDispatchData>];
[GatewayDispatchEvents.IntegrationCreate]: [ToEventProps<GatewayIntegrationCreateDispatchData>]; [GatewayDispatchEvents.IntegrationCreate]: [ToEventProps<GatewayIntegrationCreateDispatchData>];