diff --git a/src/structures/member.ts b/src/structures/member.ts index fe491d4..ee60bf7 100644 --- a/src/structures/member.ts +++ b/src/structures/member.ts @@ -5,6 +5,7 @@ import { MemberPayload } from '../types/guild.ts' import { Permissions } from '../utils/permissions.ts' import { SnowflakeBase } from './base.ts' import { Guild } from './guild.ts' +import { VoiceChannel } from './guildVoiceChannel.ts' import { Role } from './role.ts' import { User } from './user.ts' @@ -13,6 +14,7 @@ export interface MemberData { roles?: Array deaf?: boolean mute?: boolean + channel?: string | VoiceChannel | null } export class Member extends SnowflakeBase { @@ -84,8 +86,11 @@ export class Member extends SnowflakeBase { nick: data.nick, roles: data.roles?.map((e) => (typeof e === 'string' ? e : e.id)), deaf: data.deaf, - mute: data.mute + mute: data.mute, + channel_id: + typeof data.channel === 'string' ? data.channel : data.channel?.id } + const res = await this.client.rest.patch( GUILD_MEMBER(this.guild.id, this.id), payload, @@ -125,7 +130,7 @@ export class Member extends SnowflakeBase { */ async setMute(mute?: boolean): Promise { return await this.edit({ - mute: mute === undefined ? false : mute + mute: mute ?? false }) } @@ -135,7 +140,28 @@ export class Member extends SnowflakeBase { */ async setDeaf(deaf?: boolean): Promise { return await this.edit({ - deaf: deaf === undefined ? false : deaf + deaf: deaf ?? false + }) + } + + /** + * Moves a Member to another VC + * @param channel Channel to move(null or undefined to disconnect) + */ + async moveVoiceChannel( + channel?: string | VoiceChannel | null + ): Promise { + return await this.edit({ + channel: channel ?? null + }) + } + + /** + * Disconnects a Member from connected VC + */ + async disconnectVoice(): Promise { + return await this.edit({ + channel: null }) } @@ -146,6 +172,13 @@ export class Member extends SnowflakeBase { return await this.setMute(false) } + /** + * Undeafs the Member from VC. + */ + async undeaf(): Promise { + return await this.setDeaf(false) + } + /** * Kicks the member. */ diff --git a/src/structures/voiceState.ts b/src/structures/voiceState.ts index cd3cc7f..45c2a4b 100644 --- a/src/structures/voiceState.ts +++ b/src/structures/voiceState.ts @@ -1,4 +1,5 @@ import { Client } from '../models/client.ts' +import { ChannelTypes } from '../types/channel.ts' import { VoiceStatePayload } from '../types/voice.ts' import { Base } from './base.ts' import { Guild } from './guild.ts' @@ -52,12 +53,81 @@ export class VoiceState extends Base { this.deaf = data.deaf ?? this.deaf this.channelID = data.channel_id ?? this.channelID this.mute = data.mute ?? this.mute - this.deaf = data.self_deaf ?? this.deaf - this.mute = data.self_mute ?? this.mute this.selfDeaf = data.self_deaf ?? this.selfDeaf this.selfMute = data.self_mute ?? this.selfMute this.stream = data.self_stream ?? this.stream this.video = data.self_video ?? this.video this.suppress = data.suppress ?? this.suppress } + + /** + * Disconnects a Member from connected VC + */ + async disconnect(): Promise { + const result = this.member?.disconnectVoice() + if (result !== undefined) { + this.channelID = null + this.channel = null + } + return result + } + + /** + * Moves a Member to another VC + * @param channel Channel to move(null or undefined to disconnect) + */ + async moveChannel( + channel?: string | VoiceChannel | null + ): Promise { + const result = this.member?.moveVoiceChannel(channel) + if (result !== undefined) { + let channelFetched: VoiceChannel | null + let channelID: string | null + if (typeof channel === 'string') { + channelID = channel + const channelCached = await this.guild?.channels.fetch(channel) + if (channelCached?.type === ChannelTypes.GUILD_VOICE) { + channelFetched = channelCached as VoiceChannel + } else { + throw new Error(`Channel ${channel} is not a VoiceChannel.`) + } + } else { + channelID = channel?.id ?? null + channelFetched = channel ?? null + } + this.channelID = channelID + this.channel = channelFetched + } + return result + } + + /** + * Sets a Member mute in VC + * @param mute Value to set + */ + async setMute(mute?: boolean): Promise { + return this.member?.setMute(mute) + } + + /** + * Sets a Member deaf in VC + * @param deaf Value to set + */ + async setDeaf(deaf?: boolean): Promise { + return this.member?.setDeaf(deaf) + } + + /** + * Unmutes the Member from VC. + */ + async unmute(): Promise { + return await this.setMute(false) + } + + /** + * Undeafs the Member from VC. + */ + async undeaf(): Promise { + return await this.setDeaf(false) + } }