UNPKG

selfbot-discord

Version:
159 lines (140 loc) • 4.26 kB
const GuildChannel = require('./GuildChannel'); const Collection = require('../util/Collection'); const Permissions = require('../util/Permissions'); /** * Represents a guild voice channel on Discord. * @extends {GuildChannel} */ class VoiceChannel extends GuildChannel { constructor(guild, data) { super(guild, data); /** * The members in this voice channel * @type {Collection<Snowflake, GuildMember>} */ this.members = new Collection(); this.type = 'voice'; } setup(data) { super.setup(data); /** * The bitrate of this voice channel * @type {number} */ this.bitrate = data.bitrate; /** * The maximum amount of users allowed in this channel - 0 means unlimited. * @type {number} */ this.userLimit = data.user_limit; /** * The RTC region for this voice-based channel. This region is automatically selected if `null`. * @type {?string} */ this.rtcRegion = data.rtc_region; /** * The camera video quality mode of the voice channel, 1 when not present. * @type {number} */ this.videoQualityMode = data.video_quality_mode; } /** * The voice connection for this voice channel, if the client is connected * @type {?VoiceConnection} * @readonly */ get connection() { const connection = this.guild.voiceConnection; if (connection && connection.channel.id === this.id) return connection; return null; } /** * Checks if the voice channel is full * @type {boolean} * @readonly */ get full() { return this.userLimit > 0 && this.members.size >= this.userLimit; } /** * Whether the channel is deletable by the client user * @type {boolean} * @readonly */ get deletable() { return super.deletable && this.permissionsFor(this.client.user).has(Permissions.FLAGS.CONNECT); } /** * Checks if the client has permission join the voice channel * @type {boolean} * @readonly */ get joinable() { if (this.client.browser) return false; if (!this.permissionsFor(this.client.user).has('CONNECT')) return false; if (this.full && !this.permissionsFor(this.client.user).has('MOVE_MEMBERS')) return false; return true; } /** * Checks if the client has permission to send audio to the voice channel * @type {boolean} * @readonly */ get speakable() { return this.permissionsFor(this.client.user).has('SPEAK'); } /** * Sets the bitrate of the channel (in kbps). * @param {number} bitrate The new bitrate * @param {string} [reason] Reason for changing the channel's bitrate * @returns {Promise<VoiceChannel>} * @example * // Set the bitrate of a voice channel * voiceChannel.setBitrate(48) * .then(vc => console.log(`Set bitrate to ${vc.bitrate}kbps for ${vc.name}`)) * .catch(console.error); */ setBitrate(bitrate, reason) { bitrate *= 1000; return this.edit({ bitrate }, reason); } /** * Sets the user limit of the channel. * @param {number} userLimit The new user limit * @param {string} [reason] Reason for changing the user limit * @returns {Promise<VoiceChannel>} * @example * // Set the user limit of a voice channel * voiceChannel.setUserLimit(42) * .then(vc => console.log(`Set user limit to ${vc.userLimit} for ${vc.name}`)) * .catch(console.error); */ setUserLimit(userLimit, reason) { return this.edit({ userLimit }, reason); } /** * Attempts to join this voice channel. * @returns {Promise<VoiceConnection>} * @example * // Join a voice channel * voiceChannel.join() * .then(connection => console.log('Connected!')) * .catch(console.error); */ join() { if (this.client.browser) return Promise.reject(new Error('Voice connections are not available in browsers.')); return this.client.voice.joinChannel(this); } /** * Leaves this voice channel. * @example * // Leave a voice channel * voiceChannel.leave(); */ leave() { if (this.client.browser) return; const connection = this.client.voice.connections.get(this.guild.id); if (connection && connection.channel.id === this.id) connection.disconnect(); } } module.exports = VoiceChannel;