Skip to content

Commit

Permalink
feat(StageChannel): add createStageInstance method & use better namin…
Browse files Browse the repository at this point in the history
…g convention (#5951)

Co-authored-by: SpaceEEC <spaceeec@yahoo.com>
  • Loading branch information
iShibi and SpaceEEC committed Jul 1, 2021
1 parent 388e05b commit 71fb33a
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 18 deletions.
21 changes: 10 additions & 11 deletions src/managers/StageInstanceManager.js
Expand Up @@ -28,31 +28,30 @@ class StageInstanceManager extends BaseManager {

/**
* Options used to create a stage instance.
* @typedef {Object} CreateStageInstanceOptions
* @property {StageChannel|Snowflake} channel The stage channel whose instance is to be created
* @typedef {Object} StageInstanceCreateOptions
* @property {string} topic The topic of the stage instance
* @property {PrivacyLevel|number} [privacyLevel] The privacy level of the stage instance
*/

/**
* Creates a new stage instance.
* @param {CreateStageInstanceOptions} options The options to create the stage instance
* @param {StageChannel|Snowflake} channel The stage channel to associate the created stage instance to
* @param {StageInstanceCreateOptions} options The options to create the stage instance
* @returns {Promise<StageInstance>}
* @example
* // Create a stage instance
* guild.stageInstances.create({
* channel: '1234567890123456789',
* guild.stageInstances.create('1234567890123456789', {
* topic: 'A very creative topic',
* privacyLevel: 'GUILD_ONLY'
* })
* .then(stageInstance => console.log(stageInstance))
* .catch(console.error);
*/
async create(options) {
if (typeof options !== 'object') throw new TypeError('INVALID_TYPE', 'options', 'object', true);
let { channel, topic, privacyLevel } = options;
async create(channel, options) {
const channelID = this.guild.channels.resolveID(channel);
if (!channelID) throw new Error('STAGE_CHANNEL_RESOLVE');
if (typeof options !== 'object') throw new TypeError('INVALID_TYPE', 'options', 'object', true);
let { topic, privacyLevel } = options;

if (privacyLevel) privacyLevel = typeof privacyLevel === 'number' ? privacyLevel : PrivacyLevels[privacyLevel];

Expand All @@ -69,7 +68,7 @@ class StageInstanceManager extends BaseManager {

/**
* Fetches the stage instance associated with a stage channel, if it exists.
* @param {StageChannel|Snowflake} channel The stage channel whose instance is to be fetched
* @param {StageChannel|Snowflake} channel The stage channel whose associated stage instance is to be fetched
* @param {BaseFetchOptions} [options] Additional options for this fetch
* @returns {Promise<StageInstance>}
* @example
Expand Down Expand Up @@ -100,7 +99,7 @@ class StageInstanceManager extends BaseManager {

/**
* Edits an existing stage instance.
* @param {StageChannel|Snowflake} channel The stage channel whose instance is to be edited
* @param {StageChannel|Snowflake} channel The stage channel whose associated stage instance is to be edited
* @param {StageInstanceEditOptions} options The options to edit the stage instance
* @returns {Promise<StageInstance>}
* @example
Expand Down Expand Up @@ -136,7 +135,7 @@ class StageInstanceManager extends BaseManager {

/**
* Deletes an existing stage instance.
* @param {StageChannel|Snowflake} channel The stage channel whose instance is to be deleted
* @param {StageChannel|Snowflake} channel The stage channel whose associated stage instance is to be deleted
* @returns {Promise<void>}
*/
async delete(channel) {
Expand Down
13 changes: 11 additions & 2 deletions src/structures/StageChannel.js
Expand Up @@ -20,14 +20,23 @@ class StageChannel extends BaseGuildVoiceChannel {
}

/**
* The instance of this stage channel, if it exists
* The stage instance of this stage channel, if it exists
* @type {?StageInstance}
* @readonly
*/
get instance() {
get stageInstance() {
return this.guild.stageInstances.cache.find(stageInstance => stageInstance.channelID === this.id) ?? null;
}

/**
* Creates a stage instance associated to this stage channel.
* @param {StageInstanceCreateOptions} options The options to create the stage instance
* @returns {Promise<StageInstance>}
*/
createStageInstance(options) {
return this.guild.stageInstances.create(this.id, options);
}

/**
* Sets the RTC region of the channel.
* @name StageChannel#setRTCRegion
Expand Down
2 changes: 1 addition & 1 deletion src/structures/StageInstance.js
Expand Up @@ -60,7 +60,7 @@ class StageInstance extends Base {
}

/**
* The stage channel associated with this instance
* The stage channel associated with this stage instance
* @type {?StageChannel}
* @readonly
*/
Expand Down
8 changes: 4 additions & 4 deletions typings/index.d.ts
Expand Up @@ -1882,7 +1882,8 @@ declare module 'discord.js' {
export class StageChannel extends BaseGuildVoiceChannel {
public topic: string | null;
public type: 'stage';
public readonly instance: StageInstance | null;
public readonly stageInstance: StageInstance | null;
public createStageInstance(options: StageInstanceCreateOptions): Promise<StageInstance>;
}

export class StageInstance extends Base {
Expand Down Expand Up @@ -2643,7 +2644,7 @@ declare module 'discord.js' {
export class StageInstanceManager extends BaseManager<Snowflake, StageInstance, StageInstanceResolvable> {
constructor(guild: Guild, iterable?: Iterable<any>);
public guild: Guild;
public create(options: CreateStageInstanceOptions): Promise<StageInstance>;
public create(channel: StageChannel | Snowflake, options: StageInstanceCreateOptions): Promise<StageInstance>;
public fetch(channel: StageChannel | Snowflake, options?: BaseFetchOptions): Promise<StageInstance>;
public edit(channel: StageChannel | Snowflake, options: StageInstanceEditOptions): Promise<StageInstance>;
public delete(channel: StageChannel | Snowflake): Promise<void>;
Expand Down Expand Up @@ -3226,8 +3227,7 @@ declare module 'discord.js' {
reason?: string;
}

interface CreateStageInstanceOptions {
channel: StageChannel | Snowflake;
interface StageInstanceCreateOptions {
topic: string;
privacyLevel?: PrivacyLevel | number;
}
Expand Down

0 comments on commit 71fb33a

Please sign in to comment.