Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add soundboard #10536

Merged
merged 3 commits into from
Nov 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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