UNPKG

discord.js-self

Version:

A fork of discord.js with support of user accounts

152 lines (137 loc) 4.13 kB
'use strict'; const GuildChannel = require('./GuildChannel'); const { Error } = require('../errors'); const Collection = require('../util/Collection'); const { browser } = require('../util/Constants'); const Permissions = require('../util/Permissions'); /** * Represents a guild voice channel on Discord. * @extends {GuildChannel} */ class VoiceChannel extends GuildChannel { _patch(data) { super._patch(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 members in this voice channel * @type {Collection<Snowflake, GuildMember>} * @name VoiceChannel#members * @readonly */ get members() { const coll = new Collection(); for (const state of this.guild.voiceStates.cache.values()) { if (state.channelID === this.id && state.member) { coll.set(state.id, state.member); } } return coll; } /** * 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, false); } /** * Whether the channel is editable by the client user * @type {boolean} * @readonly */ get editable() { return this.manageable && this.permissionsFor(this.client.user).has(Permissions.FLAGS.CONNECT, false); } /** * Whether the channel is joinable by the client user * @type {boolean} * @readonly */ get joinable() { if (browser) return false; if (!this.viewable) return false; if (!this.permissionsFor(this.client.user).has(Permissions.FLAGS.CONNECT, false)) return false; if (this.full && !this.permissionsFor(this.client.user).has(Permissions.FLAGS.MOVE_MEMBERS, false)) 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(Permissions.FLAGS.SPEAK, false); } /** * Sets the bitrate of the channel. * @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(48000) * .then(vc => console.log(`Set bitrate to ${vc.bitrate}bps for ${vc.name}`)) * .catch(console.error); */ setBitrate(bitrate, reason) { 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 (browser) return Promise.reject(new Error('VOICE_NO_BROWSER')); return this.client.voice.joinChannel(this); } /** * Leaves this voice channel. * @example * // Leave a voice channel * voiceChannel.leave(); */ leave() { if (browser) return; const connection = this.client.voice.connections.get(this.guild.id); if (connection && connection.channel.id === this.id) connection.disconnect(); } } module.exports = VoiceChannel;