@jadestudios/discord-music-player
Version:
Complete framework to facilitate music commands using discord.js v13
129 lines (128 loc) • 4.09 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Player = void 0;
const discord_js_1 = require("discord.js");
const events_1 = __importDefault(require("events"));
const _1 = require(".");
const Queue_1 = require("./managers/Queue");
const types_1 = require("./types/types");
class Player extends events_1.default {
/**
* Player constructor
* @param {Client} client
* @param {PlayerOptions} [options={}]
*/
constructor(client, options = {}) {
super();
this.queues = new discord_js_1.Collection();
this.options = types_1.DefaultPlayerOptions;
/**
* Client object (discord.js)
* @type {object}
* @readonly
*/
this.client = client;
/**
* Player options
* @type {PlayerOptions}
*/
this.options = Object.assign({}, this.options, options);
/**
* Player queues
* @type {Collection<Snowflake, Queue>}
*/
this.queues = new discord_js_1.Collection();
this.client.on('voiceStateUpdate', (oldState, newState) => this._voiceUpdate(oldState, newState));
}
/**
* Creates the guild queue.
* @param {Snowflake} guildId
* @param {PlayerOptions} [options=this.options]
* @returns {Queue}
*/
createQueue(guildId, options = this.options) {
options = Object.assign({}, this.options, options);
let guild = this.client.guilds.resolve(guildId);
if (!guild)
throw new _1.DMPError(_1.DMPErrors.INVALID_GUILD);
if (this.hasQueue(guildId) && !this.getQueue(guildId)?.destroyed)
return this.getQueue(guildId);
let { data } = options;
delete options.data;
const queue = new Queue_1.Queue(this, guild, options);
queue.data = data;
this.setQueue(guildId, queue);
return queue;
}
/**
* Check if the guild has a queue.
* @param {Snowflake} guildId
* @returns {boolean}
*/
hasQueue(guildId) {
return !!this.queues.get(guildId);
}
/**
* Gets the guild queue.
* @param {Snowflake} guildId
* @returns {?Queue}
*/
getQueue(guildId) {
return this.queues.get(guildId);
}
/**
* Deletes the guild queue.
* @param {Snowflake} guildId
* @param {Queue} queue
* @returns {void}
*/
setQueue(guildId, queue) {
this.queues.set(guildId, queue);
}
/**
* Deletes the guild queue.
* @param {Snowflake} guildId
* @returns {void}
*/
deleteQueue(guildId) {
this.queues.delete(guildId);
}
/**
* Handle a Voice State Update
* @private
* @param {VoiceState} oldState
* @param {VoiceState} newState
* @returns {void}
*/
_voiceUpdate(oldState, newState) {
let queue = this.queues.get(oldState.guild.id);
if (!queue || !queue.connection)
return;
let { deafenOnJoin, leaveOnEmpty, timeout } = queue.options;
if (!newState.channelId && this.client.user?.id === oldState.member?.id) {
queue.leave();
return void this.emit('clientDisconnect', queue);
}
else if (deafenOnJoin && oldState.serverDeaf && !newState.serverDeaf) {
this.emit('clientUndeafen', queue);
}
if (oldState.channelId === newState.channelId)
return;
if (!leaveOnEmpty || queue.connection.channel.members.size > 1)
return;
setTimeout(() => {
if (!queue || !queue.connection)
return;
if (queue.connection.channel.members.size > 1)
return;
if (queue.connection.channel.members.has(this.client.user.id)) {
queue.leave();
this.emit('channelEmpty', queue);
}
}, timeout);
}
}
exports.Player = Player;