Skip to content

Commit

Permalink
feat: add soundboard (#10536)
Browse files Browse the repository at this point in the history
* feat: add soundboard

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

* fix: export `SoundboardSoundsAPI`
  • Loading branch information
sdanialraza authored Nov 4, 2024
1 parent ed78e45 commit a9f629b
Show file tree
Hide file tree
Showing 5 changed files with 149 additions and 0 deletions.
21 changes: 21 additions & 0 deletions packages/core/src/api/channel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ import {
type RESTPostAPIChannelThreadsResult,
type APIThreadChannel,
type RESTPostAPIGuildForumThreadsJSONBody,
type RESTPostAPISoundboardSendSoundJSONBody,
type RESTPostAPISendSoundboardSoundResult,
} from 'discord-api-types/v10';

export interface StartForumThreadOptions extends RESTPostAPIGuildForumThreadsJSONBody {
Expand Down Expand Up @@ -583,4 +585,23 @@ export class ChannelsAPI {
signal,
});
}

/**
* 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>;
}
}
95 changes: 95 additions & 0 deletions packages/core/src/api/guild.ts
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,12 @@ import {
type RESTPutAPIGuildOnboardingJSONBody,
type RESTPutAPIGuildOnboardingResult,
type RESTPutAPIGuildTemplateSyncResult,
type RESTGetAPIGuildSoundboardSoundResult,
type RESTGetAPIGuildSoundboardSoundsResult,
type RESTPatchAPIGuildSoundboardSoundJSONBody,
type RESTPatchAPIGuildSoundboardSoundResult,
type RESTPostAPIGuildSoundboardSoundJSONBody,
type RESTPostAPIGuildSoundboardSoundResult,
type Snowflake,
} from 'discord-api-types/v10';
import { VoiceAPI } from './voice';
Expand Down Expand Up @@ -1356,4 +1362,93 @@ export class GuildsAPI {
signal,
}) 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 });
}
}
5 changes: 5 additions & 0 deletions packages/core/src/api/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { MonetizationAPI } from './monetization.js';
import { OAuth2API } from './oauth2.js';
import { PollAPI } from './poll.js';
import { RoleConnectionsAPI } from './roleConnections.js';
import { SoundboardSoundsAPI } from './soundboardSounds.js';
import { StageInstancesAPI } from './stageInstances.js';
import { StickersAPI } from './sticker.js';
import { ThreadsAPI } from './thread.js';
Expand All @@ -26,6 +27,7 @@ export * from './monetization.js';
export * from './oauth2.js';
export * from './poll.js';
export * from './roleConnections.js';
export * from './soundboardSounds.js';
export * from './stageInstances.js';
export * from './sticker.js';
export * from './thread.js';
Expand Down Expand Up @@ -54,6 +56,8 @@ export class API {

public readonly roleConnections: RoleConnectionsAPI;

public readonly soundboardSounds: SoundboardSoundsAPI;

public readonly stageInstances: StageInstancesAPI;

public readonly stickers: StickersAPI;
Expand All @@ -76,6 +80,7 @@ export class API {
this.oauth2 = new OAuth2API(rest);
this.poll = new PollAPI(rest);
this.roleConnections = new RoleConnectionsAPI(rest);
this.soundboardSounds = new SoundboardSoundsAPI(rest);
this.stageInstances = new StageInstancesAPI(rest);
this.stickers = new StickersAPI(rest);
this.threads = new ThreadsAPI(rest);
Expand Down
20 changes: 20 additions & 0 deletions packages/core/src/api/soundboardSounds.ts
Original file line number Diff line number Diff line change
@@ -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>;
}
}
8 changes: 8 additions & 0 deletions packages/core/src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@ import {
type GatewayGuildScheduledEventUpdateDispatchData,
type GatewayGuildScheduledEventUserAddDispatchData,
type GatewayGuildScheduledEventUserRemoveDispatchData,
type GatewayGuildSoundboardSoundCreateDispatch,
type GatewayGuildSoundboardSoundDeleteDispatch,
type GatewayGuildSoundboardSoundUpdateDispatch,
type GatewayGuildSoundboardSoundsUpdateDispatch,
type GatewayGuildStickersUpdateDispatchData,
type GatewayGuildUpdateDispatchData,
type GatewayIntegrationCreateDispatchData,
Expand Down Expand Up @@ -131,6 +135,10 @@ export interface MappedEvents {
[GatewayDispatchEvents.GuildScheduledEventUserRemove]: [
ToEventProps<GatewayGuildScheduledEventUserRemoveDispatchData>,
];
[GatewayDispatchEvents.GuildSoundboardSoundCreate]: [ToEventProps<GatewayGuildSoundboardSoundCreateDispatch>];
[GatewayDispatchEvents.GuildSoundboardSoundDelete]: [ToEventProps<GatewayGuildSoundboardSoundDeleteDispatch>];
[GatewayDispatchEvents.GuildSoundboardSoundUpdate]: [ToEventProps<GatewayGuildSoundboardSoundUpdateDispatch>];
[GatewayDispatchEvents.GuildSoundboardSoundsUpdate]: [ToEventProps<GatewayGuildSoundboardSoundsUpdateDispatch>];
[GatewayDispatchEvents.GuildStickersUpdate]: [ToEventProps<GatewayGuildStickersUpdateDispatchData>];
[GatewayDispatchEvents.GuildUpdate]: [ToEventProps<GatewayGuildUpdateDispatchData>];
[GatewayDispatchEvents.IntegrationCreate]: [ToEventProps<GatewayIntegrationCreateDispatchData>];
Expand Down

0 comments on commit a9f629b

Please sign in to comment.