UNPKG

discord-player-music

Version:

A powerful music module for your Discord bot with lots of features

245 lines (244 loc) 12.6 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.PlaylistsManager = void 0; const PlayerError_1 = require("../PlayerError"); const errors_json_1 = __importDefault(require("../data/errors.json")); const PlayerEnums_1 = require("../PlayerEnums"); /** * Class that controls Player Playlists Manager * * @class * @classdesc Player Playlists Manager Class */ class PlaylistsManager { player; /** * @constructor * * @param {Player} player Player Class */ constructor(player) { if (!player) throw new PlayerError_1.PlayerError(errors_json_1.default.default.requireParam.replace('{param}', 'player').replace('{data}', '<PlaylistsManager>')); /** * Player Class * * @type {Player} * @private */ this.player = player; } /** * Allows you to create new playlists for the server * * @param {string} guildID Discord Guild ID * @param {CreatePlaylistData} data Create playlist data * * @fires Player#createdPlaylist * * @example * const createPlaylistData = await client.player.playlists.create('GuildID', { * title: 'Test Playlist #1', * author: 'UserID', * * track: { * title: 'Xtrullor - Samsara', * url: 'https://youtube.com/watch?v=Vt2TeOptLxE' * } * }) * * if(createPlaylistData?.title) return message.channel.send({ content: `Playlist with title ${createPlaylistData.title} created!` }); * * @returns {Promise<GuildPlaylist>} Created playlist data */ create(guildID, data) { return new Promise(async (res, rej) => { if (!guildID) throw new PlayerError_1.PlayerError(this.player.errors.default.requireParam.replace('{param}', 'guildID').replace('{data}', '<PlaylistsManager>.create')); if (!data) throw new PlayerError_1.PlayerError(this.player.errors.default.requireParam.replace('{param}', 'data').replace('{data}', '<PlaylistsManager>.create')); this.player.database.initGuild(guildID); const storage = this.player.database.get(); const guildPlaylistID = this.player.utils.getUniqueID(); const guildPlaylists = storage[guildID]['playlists']; const playlistConstructor = { id: guildPlaylistID, title: data.title ? data.title : `Playlist #${guildPlaylistID}`, author: data.author, created: Date.now(), updated: null, duration: await this.player.utils.getTrackDuration(data.track.url), lastPlaying: null, tracks: [data.track] }; guildPlaylists.push(playlistConstructor); this.player.database.write(storage); this.player.emit(PlayerEnums_1.Events.PLAYLIST_CREATED, playlistConstructor); return res(playlistConstructor); }); } /** * Allows you to add new tracks to server playlists * * @param {string} guildID Discord Guild ID * @param {AddPlaylistData} data Playlist Data * * @example * const addTrackToPlaylistData = await client.player.playlists.addTrack('GuildID', { * id: 'PlaylistID', * * track: { * title: 'Xtrullor - Samsara', * url: 'https://youtube.com/watch?v=Vt2TeOptLxE' * } * }) * * if(addTrackToPlaylistData?.title) return message.channel.send({ content: `Track Xtrullor - Samsara added to playlist!` }); * * @returns {Promise<GuildPlaylist | ErrorData>} Changed playlist or object with an error */ addTrack(guildID, data) { return new Promise(async (res, rej) => { if (!guildID) throw new PlayerError_1.PlayerError(this.player.errors.default.requireParam.replace('{param}', 'guildID').replace('{data}', '<PlaylistsManager>.addTrack')); if (!data) throw new PlayerError_1.PlayerError(this.player.errors.default.requireParam.replace('{param}', 'data').replace('{data}', '<PlaylistsManager>.addTrack')); this.player.database.initGuild(guildID); const storage = this.player.database.get(); const guildPlaylists = storage[guildID]['playlists']; if (guildPlaylists.length >= 1) { if (data.id && data.id.length > 0) { const guildPlaylist = guildPlaylists.find(playlist => playlist.id === data.id); if (guildPlaylist) { const playlistTrack = guildPlaylist.tracks.find(track => track.url === data.track.url); if (!playlistTrack) { guildPlaylist.updated = Date.now(); guildPlaylist.duration += await this.player.utils.getTrackDuration(data.track.url); guildPlaylist.tracks.push(data.track); this.player.database.write(storage); return res(guildPlaylist); } else return res({ error: { code: 404, message: this.player.errors.playlists.existsTrack.replace('{url}', data.track.url).replace('{id}', data.id) } }); } else return res({ error: { code: 404, message: this.player.errors.playlists.notFound.replace('{id}', data.id).replace('{guildID}', guildID) } }); } else this.create(guildID, { author: this.player.client.user.id, track: data.track }); } else this.create(guildID, { author: this.player.client.user.id, track: data.track }); }); } /** * Allows you to play a server playlist * * @param {string} guildID Discord Guild ID * @param {string} playlistID Guild Playlist ID * @param {GuildMember} member Discord Guild Member * @param {TextChannel} channel Discord Guild Text Channel * * @example * client.player.playlists.play('GuildID', 'PlaylistID', message.member, message.channel); * * @returns {Promise<GuildPlaylist | ErrorData>} Guild playlist data or object with an error */ play(guildID, playlistID, member, channel) { return new Promise(async (res, rej) => { if (!guildID) throw new PlayerError_1.PlayerError(this.player.errors.default.requireParam.replace('{param}', 'guildID').replace('{data}', '<PlaylistsManager>.play')); if (!playlistID) throw new PlayerError_1.PlayerError(this.player.errors.default.requireParam.replace('{param}', 'playlistID').replace('{data}', '<PlaylistsManager>.play')); if (!member) throw new PlayerError_1.PlayerError(this.player.errors.default.requireParam.replace('{param}', 'member').replace('{data}', '<PlaylistsManager>.play')); if (!channel) throw new PlayerError_1.PlayerError(this.player.errors.default.requireParam.replace('{param}', 'channel').replace('{data}', '<PlaylistsManager>.play')); const storage = this.player.database.get(); const guildPlaylists = storage[guildID]['playlists']; if (guildPlaylists.length <= 0) return res({ error: { code: 404, message: this.player.errors.playlists.guildNotFound.replace('{id}', guildID) } }); const guildPlaylist = guildPlaylists.find(playlist => playlist.id === playlistID); if (!guildPlaylist) return res({ error: { code: 404, message: this.player.errors.playlists.notFound.replace('{id}', playlistID).replace('{guildID}', guildID) } }); const playlistTracks = guildPlaylist.tracks; for (let i = 0; i < playlistTracks.length; i++) { this.player.search(playlistTracks[i].url, member, channel, true); } guildPlaylist.lastPlaying = Date.now(); this.player.database.write(storage); return res(guildPlaylist); }); } /** * Allows you to delete tracks by their positions in the playlist * * @param {string} guildID Discord Guild ID * @param {string} playlistID Guild Playlist ID * @param {number} [index=0] Track index in playlist * * @example * // Delete first track from playlist * const removeTrackFromPlaylistData = await client.player.playlists.removeTrack('GuildID', 'PlaylistID', 0); * if(removeTrackFromPlaylistData?.title) return message.channel.send({ content: `Track with index 1 deleted from playlist!` }); * * @returns {Promise<GuildPlaylist | ErrorData>} Changed playlist or object with an error */ removeTrack(guildID, playlistID, index) { return new Promise(async (res, rej) => { if (!guildID) throw new PlayerError_1.PlayerError(this.player.errors.default.requireParam.replace('{param}', 'guildID').replace('{data}', '<PlaylistsManager>.removeTrack')); if (!playlistID) throw new PlayerError_1.PlayerError(this.player.errors.default.requireParam.replace('{param}', 'playlistID').replace('{data}', '<PlaylistsManager>.removeTrack')); const i = index || 0; const storage = this.player.database.get(); const guildPlaylists = storage[guildID]['playlists']; if (guildPlaylists.length <= 0) return res({ error: { code: 404, message: this.player.errors.playlists.guildNotFound.replace('{id}', guildID) } }); const guildPlaylist = guildPlaylists.find(playlist => playlist.id === playlistID); if (!guildPlaylist) return res({ error: { code: 404, message: this.player.errors.playlists.notFound.replace('{id}', playlistID).replace('{guildID}', guildID) } }); const playlistTracks = guildPlaylist.tracks; if (!playlistTracks[i]) return res({ error: { code: 404, message: this.player.errors.playlists.trackNotFound.replace('{index}', index.toString()).replace('{id}', playlistID) } }); guildPlaylist.updated = Date.now(); guildPlaylist.duration = guildPlaylist.duration - await this.player.utils.getTrackDuration(playlistTracks[i]?.url); playlistTracks.splice(i, 1); this.player.database.write(storage); return res(guildPlaylist); }); } /** * Allows you to delete server playlists by ID * * @param {string} guildID Discord Guild ID * @param {string} playlistID Guild Playlist ID * * @fires Player#deletedPlaylist * * @example * const deletedPlaylisData = await client.player.playlists.delete('GuildID', 'PlaylistID'); * if(deletedPlaylisData?.title) return message.channel.send({ content: `Playlist with title ${deletedPlaylisData.title} deleted!` }); * * @returns {Promise<GuildPlaylist | ErrorData>} Deleted playlist or object with an error */ delete(guildID, playlistID) { return new Promise(async (res, rej) => { const storage = this.player.database.get(); const guildPlaylists = storage[guildID]['playlists']; if (guildPlaylists.length <= 0) return res({ error: { code: 404, message: this.player.errors.playlists.guildNotFound.replace('{id}', guildID) } }); const guildPlaylist = guildPlaylists.find(playlist => playlist.id === playlistID); if (!guildPlaylist) return res({ error: { code: 404, message: this.player.errors.playlists.notFound.replace('{id}', playlistID).replace('{guildID}', guildID) } }); guildPlaylists.splice(guildPlaylists.indexOf(guildPlaylist), 1); this.player.database.write(storage); this.player.emit(PlayerEnums_1.Events.PLAYLIST_DELETED, guildPlaylist); return res(guildPlaylist); }); } } exports.PlaylistsManager = PlaylistsManager;