From 1180c63200812f15ffee78d446833ba34ab5a005 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sat, 1 May 2021 13:35:14 +0545 Subject: [PATCH 001/215] v5 dev init --- README.md | 2 ++ package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7357eb1..7929f14 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,8 @@ Complete framework to facilitate music commands using **[discord.js](https://dis [![versionBadge](https://img.shields.io/npm/v/discord-player?style=for-the-badge)](https://npmjs.com/discord-player) [![discordBadge](https://img.shields.io/discord/558328638911545423?style=for-the-badge&color=7289da)](https://androz2091.fr/discord) +> V5 WIP + ## Installation ### Install **[discord-player](https://npmjs.com/package/discord-player)** diff --git a/package.json b/package.json index 7e94075..6fd2029 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "discord-player", - "version": "4.0.5", + "version": "5.0.0-dev", "description": "Complete framework to facilitate music commands using discord.js", "main": "lib/index.js", "types": "lib/index.d.ts", From e94caca167ffdb609a327c00300823ac7a5b2aa7 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sat, 1 May 2021 13:44:42 +0545 Subject: [PATCH 002/215] some update --- src/Player.ts | 1183 +----------------------------- src/Structures/ExtractorModel.ts | 2 + src/Structures/Queue.ts | 3 + src/Structures/Track.ts | 3 + src/utils/AudioFilters.ts | 2 + src/utils/Constants.ts | 2 + src/utils/PlayerError.ts | 2 + src/utils/Util.ts | 2 + 8 files changed, 18 insertions(+), 1181 deletions(-) diff --git a/src/Player.ts b/src/Player.ts index a48b96a..ea22e94 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -1,29 +1,12 @@ import { EventEmitter } from 'events'; -import { Client, Collection, Snowflake, Collector, Message, VoiceChannel, VoiceState } from 'discord.js'; +import { Client, Collection, Snowflake, Collector, Message } from 'discord.js'; import { - LyricsData, PlayerOptions as PlayerOptionsType, - PlayerProgressbarOptions, - PlayerStats, - QueueFilters } from './types/types'; import Util from './utils/Util'; import AudioFilters from './utils/AudioFilters'; import { Queue } from './Structures/Queue'; -import { Track } from './Structures/Track'; -import { PlayerErrorEventCodes, PlayerEvents, PlayerOptions } from './utils/Constants'; -import PlayerError from './utils/PlayerError'; -import ytdl from 'discord-ytdl-core'; import { ExtractorModel } from './Structures/ExtractorModel'; -import os from 'os'; - -// @ts-ignore -import spotify from 'spotify-url-info'; -// @ts-ignore -import { Client as SoundCloudClient } from 'soundcloud-scraper'; -import YouTube from 'youtube-sr'; - -const SoundCloud = new SoundCloudClient(); /** * The Player class @@ -39,8 +22,6 @@ export class Player extends EventEmitter { * @type {DiscordCollection} */ public queues = new Collection(); - private _resultsCollectors = new Collection>(); - private _cooldownsTimeout = new Collection(); /** * The extractor model collection @@ -67,1171 +48,11 @@ export class Player extends EventEmitter { enumerable: false }); - /** - * The player options - * @type {PlayerOptions} - */ - this.options = Object.assign({}, PlayerOptions, options ?? {}); - // check FFmpeg void Util.alertFFmpeg(); - - /** - * Audio filters - * @type {Object} - */ - this.filters = AudioFilters; - - this.client.on('voiceStateUpdate', (o, n) => void this._handleVoiceStateUpdate(o, n)); - - // auto detect @discord-player/extractor - if (!this.options.disableAutoRegister) { - let nv: any; - if ((nv = Util.require('@discord-player/extractor'))) { - ['Attachment', 'Facebook', 'Reverbnation', 'Vimeo'].forEach((ext) => void this.use(ext, nv[ext])); - } - } } - static get AudioFilters(): typeof AudioFilters { - return AudioFilters; - } - - /** - * Define custom extractor in this player - * @param {String} extractorName The extractor name - * @param {any} extractor The extractor itself - * @returns {Player} - */ - use(extractorName: string, extractor: any): Player { - if (!extractorName) throw new PlayerError('Missing extractor name!', 'PlayerExtractorError'); - - const methods = ['validate', 'getInfo']; - - for (const method of methods) { - if (typeof extractor[method] !== 'function') - throw new PlayerError('Invalid extractor supplied!', 'PlayerExtractorError'); - } - - this.Extractors.set(extractorName, new ExtractorModel(extractorName, extractor)); - - return this; - } - - /** - * Remove existing extractor from this player - * @param {String} extractorName The extractor name - * @returns {Boolean} - */ - unuse(extractorName: string): boolean { - if (!extractorName) throw new PlayerError('Missing extractor name!', 'PlayerExtractorError'); - - return this.Extractors.delete(extractorName); - } - - private _searchTracks(message: Message, query: string, firstResult?: boolean): Promise { - return new Promise(async (resolve) => { - let tracks: Track[] = []; - const queryType = Util.getQueryType(query); - - switch (queryType) { - case 'soundcloud_track': - { - const data = await SoundCloud.getSongInfo(query).catch(() => {}); - if (data) { - const track = new Track(this, { - title: data.title, - url: data.url, - duration: Util.buildTimeCode(Util.parseMS(data.duration / 1000)), - description: data.description, - thumbnail: data.thumbnail, - views: data.playCount, - author: data.author.name, - requestedBy: message.author, - fromPlaylist: false, - source: 'soundcloud', - engine: data - }); - - tracks.push(track); - } - } - break; - case 'spotify_song': - { - const matchSpotifyURL = query.match( - /https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(?:track\/|\?uri=spotify:track:)((\w|-){22})/ - ); - if (matchSpotifyURL) { - const spotifyData = await spotify.getPreview(query).catch(() => {}); - if (spotifyData) { - tracks = await Util.ytSearch(`${spotifyData.artist} - ${spotifyData.title}`, { - user: message.author, - player: this, - limit: 1 - }); - } - } - } - break; - - // todo: make spotify playlist/album load faster - case 'spotify_album': - case 'spotify_playlist': { - this.emit(PlayerEvents.PLAYLIST_PARSE_START, null, message); - const playlist = await spotify.getData(query); - if (!playlist) return void this.emit(PlayerEvents.NO_RESULTS, message, query); - - // tslint:disable:no-shadowed-variable - const tracks = []; - - for (const item of playlist.tracks.items) { - const sq = - queryType === 'spotify_album' - ? `${item.artists[0].name} - ${item.name}` - : `${item.track.artists[0].name} - ${item.name}`; - const data = await Util.ytSearch(sq, { - limit: 1, - player: this, - user: message.author, - pl: true - }); - - if (data[0]) tracks.push(data[0]); - } - - if (!tracks.length) return void this.emit(PlayerEvents.NO_RESULTS, message, query); - - const pl = { - ...playlist, - tracks, - duration: tracks.reduce((a, c) => a + c.durationMS, 0), - thumbnail: playlist.images[0]?.url ?? tracks[0].thumbnail - }; - - this.emit(PlayerEvents.PLAYLIST_PARSE_END, pl, message); - - if (this.isPlaying(message)) { - const queue = this._addTracksToQueue(message, tracks); - this.emit(PlayerEvents.PLAYLIST_ADD, message, queue, pl); - } else { - const track = tracks.shift(); - const queue = (await this._createQueue(message, track).catch( - (e) => void this.emit(PlayerEvents.ERROR, e, message) - )) as Queue; - this.emit(PlayerEvents.TRACK_START, message, queue.tracks[0], queue); - this._addTracksToQueue(message, tracks); - } - - return; - } - case 'youtube_playlist': { - this.emit(PlayerEvents.PLAYLIST_PARSE_START, null, message); - const playlist = await YouTube.getPlaylist(query); - if (!playlist) return void this.emit(PlayerEvents.NO_RESULTS, message, query); - - // @ts-ignore - playlist.videos = playlist.videos.map( - (data) => - new Track(this, { - title: data.title, - url: data.url, - duration: Util.buildTimeCode(Util.parseMS(data.duration)), - description: data.description, - thumbnail: data.thumbnail?.displayThumbnailURL(), - views: data.views, - author: data.channel.name, - requestedBy: message.author, - fromPlaylist: true, - source: 'youtube' - }) - ); - - // @ts-ignore - playlist.duration = playlist.videos.reduce((a, c) => a + c.durationMS, 0); - - // @ts-ignore - playlist.thumbnail = playlist.thumbnail?.url ?? playlist.videos[0].thumbnail; - - // @ts-ignore - playlist.requestedBy = message.author; - - this.emit(PlayerEvents.PLAYLIST_PARSE_END, playlist, message); - - // @ts-ignore - const tracks = playlist.videos as Track[]; - - if (this.isPlaying(message)) { - const queue = this._addTracksToQueue(message, tracks); - this.emit(PlayerEvents.PLAYLIST_ADD, message, queue, playlist); - } else { - const track = tracks.shift(); - const queue = (await this._createQueue(message, track).catch( - (e) => void this.emit(PlayerEvents.ERROR, e, message) - )) as Queue; - this.emit(PlayerEvents.PLAYLIST_ADD, message, queue, playlist); - this.emit(PlayerEvents.TRACK_START, message, queue.tracks[0], queue); - this._addTracksToQueue(message, tracks); - } - - return; - } - case 'soundcloud_playlist': { - this.emit(PlayerEvents.PLAYLIST_PARSE_START, null, message); - - const data = await SoundCloud.getPlaylist(query).catch(() => {}); - if (!data) return void this.emit(PlayerEvents.NO_RESULTS, message, query); - - const res = { - id: data.id, - title: data.title, - tracks: [] as Track[], - author: data.author, - duration: 0, - thumbnail: data.thumbnail, - requestedBy: message.author - }; - - for (const song of data.tracks) { - const r = new Track(this, { - title: song.title, - url: song.url, - duration: Util.buildTimeCode(Util.parseMS(song.duration / 1000)), - description: song.description, - thumbnail: song.thumbnail ?? 'https://soundcloud.com/pwa-icon-192.png', - views: song.playCount ?? 0, - author: song.author ?? data.author, - requestedBy: message.author, - fromPlaylist: true, - source: 'soundcloud', - engine: song - }); - - res.tracks.push(r); - } - - if (!res.tracks.length) - return this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.PARSE_ERROR, message); - res.duration = res.tracks.reduce((a, c) => a + c.durationMS, 0); - - this.emit(PlayerEvents.PLAYLIST_PARSE_END, res, message); - - if (this.isPlaying(message)) { - const queue = this._addTracksToQueue(message, res.tracks); - this.emit(PlayerEvents.PLAYLIST_ADD, message, queue, res); - } else { - const track = res.tracks.shift(); - const queue = (await this._createQueue(message, track).catch( - (e) => void this.emit(PlayerEvents.ERROR, e, message) - )) as Queue; - this.emit(PlayerEvents.PLAYLIST_ADD, message, queue, res); - this.emit(PlayerEvents.TRACK_START, message, queue.tracks[0], queue); - this._addTracksToQueue(message, res.tracks); - } - - return; - } - default: - tracks = await Util.ytSearch(query, { user: message.author, player: this }); - } - - if (tracks.length < 1) return void this.emit(PlayerEvents.NO_RESULTS, message, query); - if (firstResult || tracks.length === 1) return resolve(tracks[0]); - - const collectorString = `${message.author.id}-${message.channel.id}`; - const currentCollector = this._resultsCollectors.get(collectorString); - if (currentCollector) currentCollector.stop(); - - const collector = message.channel.createMessageCollector((m) => m.author.id === message.author.id, { - time: 60000 - }); - - this._resultsCollectors.set(collectorString, collector); - - this.emit(PlayerEvents.SEARCH_RESULTS, message, query, tracks, collector); - - collector.on('collect', ({ content }) => { - if (content === 'cancel') { - collector.stop(); - return this.emit(PlayerEvents.SEARCH_CANCEL, message, query, tracks); - } - - if (!isNaN(content) && parseInt(content) >= 1 && parseInt(content) <= tracks.length) { - const index = parseInt(content, 10); - const track = tracks[index - 1]; - collector.stop(); - resolve(track); - } else { - this.emit(PlayerEvents.SEARCH_INVALID_RESPONSE, message, query, tracks, content, collector); - } - }); - - collector.on('end', (_, reason) => { - if (reason === 'time') { - this.emit(PlayerEvents.SEARCH_CANCEL, message, query, tracks); - } - }); - }); - } - - /** - * Play a song - * @param {DiscordMessage} message The discord.js message object - * @param {string|Track} query Search query, can be `Player.Track` instance - * @param {Boolean} [firstResult] If it should play the first result - * @example await player.play(message, "never gonna give you up", true) - * @returns {Promise} - */ - async play(message: Message, query: string | Track, firstResult?: boolean): Promise { - if (!message) throw new PlayerError('Play function needs message'); - if (!query) throw new PlayerError('Play function needs search query as a string or Player.Track object'); - - if (this._cooldownsTimeout.has(`end_${message.guild.id}`)) { - clearTimeout(this._cooldownsTimeout.get(`end_${message.guild.id}`)); - this._cooldownsTimeout.delete(`end_${message.guild.id}`); - } - - if (typeof query === 'string') query = query.replace(/<(.+)>/g, '$1'); - let track; - - if (query instanceof Track) track = query; - else { - if (ytdl.validateURL(query)) { - const info = await ytdl.getBasicInfo(query).catch(() => {}); - if (!info) return void this.emit(PlayerEvents.NO_RESULTS, message, query); - if (info.videoDetails.isLiveContent && !this.options.enableLive) - return void this.emit( - PlayerEvents.ERROR, - PlayerErrorEventCodes.LIVE_VIDEO, - message, - new PlayerError('Live video is not enabled!') - ); - const lastThumbnail = info.videoDetails.thumbnails[info.videoDetails.thumbnails.length - 1]; - - track = new Track(this, { - title: info.videoDetails.title, - description: info.videoDetails.description, - author: info.videoDetails.author.name, - url: info.videoDetails.video_url, - thumbnail: lastThumbnail.url, - duration: Util.buildTimeCode(Util.parseMS(parseInt(info.videoDetails.lengthSeconds) * 1000)), - views: parseInt(info.videoDetails.viewCount), - requestedBy: message.author, - fromPlaylist: false, - source: 'youtube', - live: Boolean(info.videoDetails.isLiveContent) - }); - } else { - for (const [_, extractor] of this.Extractors) { - if (extractor.validate(query)) { - const data = await extractor.handle(query); - if (data) { - track = new Track(this, { - title: data.title, - description: data.description, - duration: Util.buildTimeCode(Util.parseMS(data.duration)), - thumbnail: data.thumbnail, - author: data.author, - views: data.views, - engine: data.engine, - source: 'arbitrary', - fromPlaylist: false, - requestedBy: message.author, - url: data.url - }); - - if (extractor.important) break; - } - } - } - - if (!track) track = await this._searchTracks(message, query, firstResult); - } - } - - if (track) { - if (this.isPlaying(message)) { - const queue = this._addTrackToQueue(message, track); - this.emit(PlayerEvents.TRACK_ADD, message, queue, queue.tracks[queue.tracks.length - 1]); - } else { - const queue = await this._createQueue(message, track); - if (queue) this.emit(PlayerEvents.TRACK_START, message, queue.tracks[0], queue); - } - } - } - - /** - * Checks if this player is playing in a server - * @param {DiscordMessage} message The message object - * @returns {Boolean} - */ - isPlaying(message: Message): boolean { - return this.queues.some((g) => g.guildID === message.guild.id); - } - - /** - * Returns guild queue object - * @param {DiscordMessage} message The message object - * @returns {Queue} - */ - getQueue(message: Message): Queue { - return this.queues.find((g) => g.guildID === message.guild.id); - } - - /** - * Sets audio filters in this player - * @param {DiscordMessage} message The message object - * @param {QueueFilters} newFilters Audio filters object - * @returns {Promise} - */ - setFilters(message: Message, newFilters: QueueFilters): Promise { - return new Promise((resolve) => { - const queue = this.queues.find((g) => g.guildID === message.guild.id); - if (!queue) - this.emit( - PlayerEvents.ERROR, - PlayerErrorEventCodes.NOT_PLAYING, - message, - new PlayerError('Not playing') - ); - - if (queue.playing.raw.live) - return void this.emit( - PlayerEvents.ERROR, - PlayerErrorEventCodes.LIVE_VIDEO, - message, - new PlayerError('Cannot use setFilters on livestream') - ); - - Object.keys(newFilters).forEach((filterName) => { - // @ts-ignore - queue.filters[filterName] = newFilters[filterName]; - }); - - this._playStream(queue, true).then(() => { - resolve(); - }); - }); - } - - /** - * Sets track position - * @param {DiscordMessage} message The message object - * @param {Number} time Time in ms to set - * @returns {Promise} - */ - setPosition(message: Message, time: number): Promise { - return new Promise((resolve) => { - const queue = this.queues.find((g) => g.guildID === message.guild.id); - if (!queue) return this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.NOT_PLAYING, message); - - if (typeof time !== 'number' && !isNaN(time)) time = parseInt(time); - if (queue.playing.durationMS <= time) return this.skip(message); - if ( - queue.voiceConnection.dispatcher.streamTime === time || - queue.voiceConnection.dispatcher.streamTime + queue.additionalStreamTime === time - ) - return resolve(); - if (time < 0) this._playStream(queue, false).then(() => resolve()); - - this._playStream(queue, false, time).then(() => resolve()); - }); - } - - /** - * Sets track position - * @param {DiscordMessage} message The message object - * @param {Number} time Time in ms to set - * @returns {Promise} - */ - seek(message: Message, time: number): Promise { - return this.setPosition(message, time); - } - - /** - * Skips current track - * @param {DiscordMessage} message The message object - * @returns {Boolean} - */ - skip(message: Message): boolean { - const queue = this.getQueue(message); - if (!queue) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.NOT_PLAYING, message); - return false; - } - if (!queue.voiceConnection || !queue.voiceConnection.dispatcher) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.MUSIC_STARTING, message); - return false; - } - - queue.voiceConnection.dispatcher.end(); - queue.lastSkipped = true; - - return true; - } - - /** - * Moves to a new voice channel - * @param {DiscordMessage} message The message object - * @param {DiscordVoiceChannel} channel New voice channel to move to - * @returns {Boolean} - */ - moveTo(message: Message, channel?: VoiceChannel): boolean { - if (!channel || channel.type !== 'voice') return; - const queue = this.queues.find((g) => g.guildID === message.guild.id); - if (!queue) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.NOT_PLAYING, message); - return false; - } - if (!queue.voiceConnection || !queue.voiceConnection.dispatcher) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.MUSIC_STARTING, message); - return false; - } - if (queue.voiceConnection.channel.id === channel.id) return; - - queue.voiceConnection.dispatcher.pause(); - channel - .join() - .then(() => queue.voiceConnection.dispatcher.resume()) - .catch(() => this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.UNABLE_TO_JOIN, message)); - - return true; - } - - /** - * Pause the playback - * @param {DiscordMessage} message The message object - * @returns {Boolean} - */ - pause(message: Message): boolean { - const queue = this.getQueue(message); - if (!queue) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.NOT_PLAYING, message); - return false; - } - if (!queue.voiceConnection || !queue.voiceConnection.dispatcher) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.MUSIC_STARTING, message); - return false; - } - - queue.voiceConnection.dispatcher.pause(); - queue.paused = true; - return true; - } - - /** - * Resume the playback - * @param {DiscordMessage} message The message object - * @returns {Boolean} - */ - resume(message: Message): boolean { - const queue = this.getQueue(message); - if (!queue) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.NOT_PLAYING, message); - return false; - } - if (!queue.voiceConnection || !queue.voiceConnection.dispatcher) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.MUSIC_STARTING, message); - return false; - } - - queue.voiceConnection.dispatcher.resume(); - queue.paused = false; - return true; - } - - /** - * Stops the player - * @param {DiscordMessage} message The message object - * @returns {Boolean} - */ - stop(message: Message): boolean { - const queue = this.getQueue(message); - if (!queue) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.NOT_PLAYING, message); - return false; - } - if (!queue.voiceConnection || !queue.voiceConnection.dispatcher) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.MUSIC_STARTING, message); - return false; - } - - queue.stopped = true; - queue.tracks = []; - if (queue.stream) queue.stream.destroy(); - queue.voiceConnection.dispatcher.end(); - if (this.options.leaveOnStop) queue.voiceConnection.channel.leave(); - this.queues.delete(message.guild.id); - return true; - } - - /** - * Sets music volume - * @param {DiscordMessage} message The message object - * @param {Number} percent The volume percentage/amount to set - * @returns {Boolean} - */ - setVolume(message: Message, percent: number): boolean { - const queue = this.getQueue(message); - if (!queue) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.NOT_PLAYING, message); - return false; - } - if (!queue.voiceConnection || !queue.voiceConnection.dispatcher) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.MUSIC_STARTING, message); - return false; - } - - queue.volume = percent; - queue.voiceConnection.dispatcher.setVolumeLogarithmic(queue.calculatedVolume / 200); - - return true; - } - - /** - * Clears the queue - * @param {DiscordMessage} message The message object - * @returns {Boolean} - */ - clearQueue(message: Message): boolean { - const queue = this.getQueue(message); - if (!queue) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.NOT_PLAYING, message); - return false; - } - - queue.tracks = queue.playing ? [queue.playing] : []; - - return true; - } - - /** - * Plays previous track - * @param {DiscordMessage} message The message object - * @returns {Boolean} - */ - back(message: Message): boolean { - const queue = this.getQueue(message); - if (!queue) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.NOT_PLAYING, message); - return false; - } - if (!queue.voiceConnection || !queue.voiceConnection.dispatcher) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.MUSIC_STARTING, message); - return false; - } - - queue.tracks.splice(1, 0, queue.previousTracks.shift()); - queue.voiceConnection.dispatcher.end(); - queue.lastSkipped = true; - - return true; - } - - /** - * Sets repeat mode - * @param {DiscordMessage} message The message object - * @param {Boolean} enabled If it should enable the repeat mode - */ - setRepeatMode(message: Message, enabled: boolean): boolean { - const queue = this.getQueue(message); - if (!queue) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.NOT_PLAYING, message); - return; - } - - queue.repeatMode = Boolean(enabled); - - return queue.repeatMode; - } - - /** - * Sets loop mode - * @param {DiscordMessage} message The message object - * @param {Boolean} enabled If it should enable the loop mode - * @returns {Boolean} - */ - setLoopMode(message: Message, enabled: boolean): boolean { - const queue = this.getQueue(message); - if (!queue) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.NOT_PLAYING, message); - return; - } - - queue.loopMode = Boolean(enabled); - - return queue.loopMode; - } - - /** - * Returns currently playing track - * @param {DiscordMessage} message The message object - * @returns {Track} - */ - nowPlaying(message: Message): Track { - const queue = this.getQueue(message); - if (!queue) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.NOT_PLAYING, message); - return; - } - - return queue.tracks[0]; - } - - /** - * Shuffles the queue - * @param {DiscordMessage} message The message object - * @returns {Queue} - */ - shuffle(message: Message): Queue { - const queue = this.getQueue(message); - if (!queue) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.NOT_PLAYING, message); - return; - } - - const currentTrack = queue.tracks.shift(); - - for (let i = queue.tracks.length - 1; i > 0; i--) { - const j = Math.floor(Math.random() * (i + 1)); - [queue.tracks[i], queue.tracks[j]] = [queue.tracks[j], queue.tracks[i]]; - } - - queue.tracks.unshift(currentTrack); - - return queue; - } - - /** - * Removes specified track - * @param {DiscordMessage} message The message object - * @param {Track|number} track The track object/id to remove - * @returns {Track} - */ - remove(message: Message, track: Track | number): Track { - const queue = this.getQueue(message); - if (!queue) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.NOT_PLAYING, message); - return; - } - - let trackFound: Track = null; - if (typeof track === 'number') { - trackFound = queue.tracks[track]; - if (trackFound) { - queue.tracks = queue.tracks.filter((t) => t !== trackFound); - } - } else { - trackFound = queue.tracks.find((s) => s === track); - if (trackFound) { - queue.tracks = queue.tracks.filter((s) => s !== trackFound); - } - } - - return trackFound; - } - - /** - * Returns time code of currently playing song - * @param {DiscordMessage} message The message object - * @param {Boolean} [queueTime] If it should make the time code of the whole queue - * @returns {Object} - */ - getTimeCode(message: Message, queueTime?: boolean): { current: string; end: string } { - const queue = this.getQueue(message); - if (!queue) return; - - const previousTracksTime = - queue.previousTracks.length > 0 ? queue.previousTracks.reduce((p, c) => p + c.durationMS, 0) : 0; - const currentStreamTime = queueTime ? previousTracksTime + queue.currentStreamTime : queue.currentStreamTime; - const totalTracksTime = queue.totalTime; - const totalTime = queueTime ? previousTracksTime + totalTracksTime : queue.playing.durationMS; - - const currentTimecode = Util.buildTimeCode(Util.parseMS(currentStreamTime)); - const endTimecode = Util.buildTimeCode(Util.parseMS(totalTime)); - - return { - current: currentTimecode, - end: endTimecode - }; - } - - /** - * Creates progressbar - * @param {DiscordMessage} message The message object - * @param {PlayerProgressbarOptions} [options] Progressbar options - * @returns {String} - */ - createProgressBar(message: Message, options?: PlayerProgressbarOptions): string { - const queue = this.getQueue(message); - if (!queue) return; - - const previousTracksTime = - queue.previousTracks.length > 0 ? queue.previousTracks.reduce((p, c) => p + c.durationMS, 0) : 0; - const currentStreamTime = options?.queue - ? previousTracksTime + queue.currentStreamTime - : queue.currentStreamTime; - const totalTracksTime = queue.totalTime; - const totalTime = options?.queue ? previousTracksTime + totalTracksTime : queue.playing.durationMS; - const length = - typeof options?.length === 'number' - ? options?.length <= 0 || options?.length === Infinity - ? 15 - : options?.length - : 15; - - const index = Math.round((currentStreamTime / totalTime) * length); - const indicator = - typeof options?.indicator === 'string' && options?.indicator.length > 0 ? options?.indicator : '🔘'; - const line = typeof options?.line === 'string' && options?.line.length > 0 ? options?.line : '▬'; - - if (index >= 1 && index <= length) { - const bar = line.repeat(length - 1).split(''); - bar.splice(index, 0, indicator); - if (Boolean(options?.timecodes)) { - const currentTimecode = Util.buildTimeCode(Util.parseMS(currentStreamTime)); - const endTimecode = Util.buildTimeCode(Util.parseMS(totalTime)); - return `${currentTimecode} ┃ ${bar.join('')} ┃ ${endTimecode}`; - } else { - return `${bar.join('')}`; - } - } else { - if (Boolean(options?.timecodes)) { - const currentTimecode = Util.buildTimeCode(Util.parseMS(currentStreamTime)); - const endTimecode = Util.buildTimeCode(Util.parseMS(totalTime)); - return `${currentTimecode} ┃ ${indicator}${line.repeat(length - 1)} ┃ ${endTimecode}`; - } else { - return `${indicator}${line.repeat(length - 1)}`; - } - } - } - - /** - * Gets lyrics of a song - * You need to have `@discord-player/extractor` installed in order to use this method! - * @param {String} query Search query - * @example const lyrics = await player.lyrics("alan walker faded") - * message.channel.send(lyrics.lyrics); - * @returns {Promise} - */ - async lyrics(query: string): Promise { - const extractor = Util.require('@discord-player/extractor'); - if (!extractor) throw new PlayerError("Cannot call 'Player.lyrics()' without '@discord-player/extractor'"); - - const data = await extractor.Lyrics(query); - if (Array.isArray(data)) return null; - - return data; - } - - /** - * Toggle autoplay for youtube streams - * @param {DiscordMessage} message The message object - * @param {Boolean} enable Enable/Disable autoplay - * @returns {boolean} - */ - setAutoPlay(message: Message, enable: boolean): boolean { - const queue = this.getQueue(message); - if (!queue) return void this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.NOT_PLAYING, message); - - queue.autoPlay = Boolean(enable); - - return queue.autoPlay; - } - - /** - * Player stats - * @returns {PlayerStats} - */ - getStats(): PlayerStats { - return { - uptime: this.client.uptime, - connections: this.client.voice.connections.size, - users: this.client.voice.connections.reduce( - (a, c) => a + c.channel.members.filter((a) => a.user.id !== this.client.user.id).size, - 0 - ), - queues: this.queues.size, - extractors: this.Extractors.size, - versions: { - ffmpeg: Util.getFFmpegVersion(), - node: process.version, - v8: process.versions.v8 - }, - system: { - arch: process.arch, - platform: process.platform, - cpu: os.cpus().length, - memory: { - total: (process.memoryUsage().heapTotal / 1024 / 1024).toFixed(2), - usage: (process.memoryUsage().heapUsed / 1024 / 1024).toFixed(2), - rss: (process.memoryUsage().rss / 1024 / 1024).toFixed(2), - arrayBuffers: (process.memoryUsage().arrayBuffers / 1024 / 1024).toFixed(2) - }, - uptime: process.uptime() - } - }; - } - - /** - * Jumps to particular track - * @param {DiscordMessage} message The message - * @param {Track|number} track The track to jump to - * @returns {boolean} - */ - jump(message: Message, track: Track | number): boolean { - const toJUMP = this.remove(message, track); - const queue = this.getQueue(message); - if (!toJUMP || !queue) throw new PlayerError('Specified Track not found'); - - queue.tracks.splice(1, 0, toJUMP); - - return this.skip(message); - } - - private _handleVoiceStateUpdate(oldState: VoiceState, newState: VoiceState): void { - const queue = this.queues.find((g) => g.guildID === oldState.guild.id); - if (!queue) return; - - if (newState.member.id === this.client.user.id && !newState.channelID) { - queue.stream.destroy(); - this.queues.delete(newState.guild.id); - this.emit(PlayerEvents.BOT_DISCONNECT, queue.firstMessage); - } - - if (!queue.voiceConnection || !queue.voiceConnection.channel) return; - if (!this.options.leaveOnEmpty) return; - - if (!oldState.channelID || newState.channelID) { - const emptyTimeout = this._cooldownsTimeout.get(`empty_${oldState.guild.id}`); - const channelEmpty = Util.isVoiceEmpty(queue.voiceConnection.channel); - if (!channelEmpty && emptyTimeout) { - clearTimeout(emptyTimeout); - this._cooldownsTimeout.delete(`empty_${oldState.guild.id}`); - } - } else { - if (!Util.isVoiceEmpty(queue.voiceConnection.channel)) return; - const timeout = setTimeout(() => { - if (!Util.isVoiceEmpty(queue.voiceConnection.channel)) return; - if (!this.queues.has(queue.guildID)) return; - queue.voiceConnection.channel.leave(); - this.queues.delete(queue.guildID); - this.emit(PlayerEvents.CHANNEL_EMPTY, queue.firstMessage, queue); - }, this.options.leaveOnEmptyCooldown || 0); - this._cooldownsTimeout.set(`empty_${oldState.guild.id}`, timeout); - } - } - - private _addTrackToQueue(message: Message, track: Track): Queue { - const queue = this.getQueue(message); - if (!queue) - this.emit( - PlayerEvents.ERROR, - PlayerErrorEventCodes.NOT_PLAYING, - message, - new PlayerError('Player is not available in this server') - ); - if (!track || !(track instanceof Track)) throw new PlayerError('No track specified to add to the queue'); - queue.tracks.push(track); - return queue; - } - - private _addTracksToQueue(message: Message, tracks: Track[]): Queue { - const queue = this.getQueue(message); - if (!queue) - throw new PlayerError( - 'Cannot add tracks to queue because no song is currently being played on the server.' - ); - queue.tracks.push(...tracks); - return queue; - } - - private _createQueue(message: Message, track: Track): Promise { - return new Promise((resolve) => { - const channel = message.member.voice ? message.member.voice.channel : null; - if (!channel) - return void this.emit( - PlayerEvents.ERROR, - PlayerErrorEventCodes.NOT_CONNECTED, - message, - new PlayerError('Voice connection is not available in this server!') - ); - - const queue = new Queue(this, message); - this.queues.set(message.guild.id, queue); - - channel - .join() - .then((connection) => { - this.emit(PlayerEvents.CONNECTION_CREATE, message, connection); - - queue.voiceConnection = connection; - if (this.options.autoSelfDeaf) connection.voice.setSelfDeaf(true); - queue.tracks.push(track); - this.emit(PlayerEvents.QUEUE_CREATE, message, queue); - resolve(queue); - this._playTrack(queue, true); - }) - .catch((err) => { - this.queues.delete(message.guild.id); - this.emit( - PlayerEvents.ERROR, - PlayerErrorEventCodes.UNABLE_TO_JOIN, - message, - new PlayerError(err.message ?? err) - ); - }); - }); - } - - private async _playTrack(queue: Queue, firstPlay: boolean): Promise { - if (queue.stopped) return; - - if (!queue.autoPlay && queue.tracks.length === 1 && !queue.loopMode && !queue.repeatMode && !firstPlay) { - if (this.options.leaveOnEnd && !queue.stopped) { - this.queues.delete(queue.guildID); - const timeout = setTimeout(() => { - queue.voiceConnection.channel.leave(); - }, this.options.leaveOnEndCooldown || 0); - this._cooldownsTimeout.set(`end_${queue.guildID}`, timeout); - } - - this.queues.delete(queue.guildID); - - if (queue.stopped) { - return void this.emit(PlayerEvents.MUSIC_STOP, queue.firstMessage); - } - - return void this.emit(PlayerEvents.QUEUE_END, queue.firstMessage, queue); - } - - if (queue.autoPlay && !queue.repeatMode && !firstPlay) { - const oldTrack = queue.tracks.shift(); - - const info = oldTrack.raw.source === 'youtube' ? await ytdl.getInfo(oldTrack.url).catch((e) => {}) : null; - if (info) { - const res = await Util.ytSearch(info.related_videos[0].title, { - player: this, - limit: 1, - user: oldTrack.requestedBy - }) - .then((v) => v[0]) - .catch((e) => {}); - - if (res) { - queue.tracks.push(res); - if (queue.loopMode) queue.tracks.push(oldTrack); - queue.previousTracks.push(oldTrack); - } - } - } else if (!queue.autoPlay && !queue.repeatMode && !firstPlay) { - const oldTrack = queue.tracks.shift(); - if (queue.loopMode) queue.tracks.push(oldTrack); - queue.previousTracks.push(oldTrack); - } - - const track = queue.playing; - - queue.lastSkipped = false; - this._playStream(queue, false).then(() => { - if (!firstPlay) this.emit(PlayerEvents.TRACK_START, queue.firstMessage, track, queue); - }); - } - - private _playStream(queue: Queue, updateFilter: boolean, seek?: number): Promise { - return new Promise(async (resolve) => { - const ffmpeg = Util.checkFFmpeg(); - if (!ffmpeg) return; - - const seekTime = - typeof seek === 'number' - ? seek - : updateFilter - ? queue.voiceConnection.dispatcher.streamTime + queue.additionalStreamTime - : undefined; - const encoderArgsFilters: string[] = []; - - Object.keys(queue.filters).forEach((filterName) => { - // @ts-ignore - if (queue.filters[filterName]) { - // @ts-ignore - encoderArgsFilters.push(this.filters[filterName]); - } - }); - - let encoderArgs: string[] = []; - if (encoderArgsFilters.length < 1) { - encoderArgs = []; - } else { - encoderArgs = ['-af', encoderArgsFilters.join(',')]; - } - - let newStream: any; - if (queue.playing.raw.source === 'youtube') { - newStream = ytdl(queue.playing.url, { - opusEncoded: true, - encoderArgs: queue.playing.raw.live ? [] : encoderArgs, - seek: seekTime / 1000, - // tslint:disable-next-line:no-bitwise - highWaterMark: 1 << 25, - ...this.options.ytdlDownloadOptions - }); - } else { - newStream = ytdl.arbitraryStream( - queue.playing.raw.source === 'soundcloud' - ? await queue.playing.raw.engine.downloadProgressive() - : queue.playing.raw.engine, - { - opusEncoded: true, - encoderArgs, - seek: seekTime / 1000 - } - ); - } - - setTimeout(() => { - if (queue.stream) queue.stream.destroy(); - queue.stream = newStream; - queue.voiceConnection.play(newStream, { - type: 'opus', - bitrate: 'auto', - volume: Util.isRepl() ? false : undefined - }); - - if (seekTime) { - queue.additionalStreamTime = seekTime; - } - queue.voiceConnection.dispatcher.setVolumeLogarithmic(queue.calculatedVolume / 200); - queue.voiceConnection.dispatcher.on('start', () => { - resolve(); - }); - - queue.voiceConnection.dispatcher.on('finish', () => { - queue.additionalStreamTime = 0; - return this._playTrack(queue, false); - }); - - newStream.on('error', (error: Error) => { - if (error.message.toLowerCase().includes('video unavailable')) { - this.emit( - PlayerEvents.ERROR, - PlayerErrorEventCodes.VIDEO_UNAVAILABLE, - queue.firstMessage, - queue.playing, - error - ); - this._playTrack(queue, false); - } else { - this.emit(PlayerEvents.ERROR, error, queue.firstMessage, error); - } - }); - }, 1000); - }); - } - - toString() { - return ``; - } + } export default Player; diff --git a/src/Structures/ExtractorModel.ts b/src/Structures/ExtractorModel.ts index 578470a..7bce372 100644 --- a/src/Structures/ExtractorModel.ts +++ b/src/Structures/ExtractorModel.ts @@ -1,3 +1,5 @@ +// @ts-nocheck + import { ExtractorModelData } from '../types/types'; class ExtractorModel { diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 1cee68b..bd67662 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -1,3 +1,5 @@ +// @ts-nocheck + import { Message, Snowflake, VoiceConnection } from 'discord.js'; import AudioFilters from '../utils/AudioFilters'; import { Player } from '../Player'; @@ -130,6 +132,7 @@ export class Queue extends EventEmitter { /** * Currently playing track * @type {Track} + * @readonly */ get playing(): Track { return this.tracks[0]; diff --git a/src/Structures/Track.ts b/src/Structures/Track.ts index b2759f1..2e3ff2d 100644 --- a/src/Structures/Track.ts +++ b/src/Structures/Track.ts @@ -1,3 +1,5 @@ +// @ts-nocheck + import { Player } from '../Player'; import { User } from 'discord.js'; import { TrackData } from '../types/types'; @@ -111,6 +113,7 @@ export class Track { /** * The queue in which this track is located * @type {Queue} + * @readonly */ get queue(): Queue { return this.player.queues.find((q) => q.tracks.includes(this)); diff --git a/src/utils/AudioFilters.ts b/src/utils/AudioFilters.ts index 52b600a..5f73102 100644 --- a/src/utils/AudioFilters.ts +++ b/src/utils/AudioFilters.ts @@ -1,3 +1,5 @@ +// @ts-nocheck + import { FiltersName } from '../types/types'; /** diff --git a/src/utils/Constants.ts b/src/utils/Constants.ts index ef5eb1b..06cdd02 100644 --- a/src/utils/Constants.ts +++ b/src/utils/Constants.ts @@ -1,3 +1,5 @@ +// @ts-nocheck + import { PlayerOptions as DP_OPTIONS } from '../types/types'; export const PlayerEvents = { diff --git a/src/utils/PlayerError.ts b/src/utils/PlayerError.ts index c87e1f6..16e84be 100644 --- a/src/utils/PlayerError.ts +++ b/src/utils/PlayerError.ts @@ -1,3 +1,5 @@ +// @ts-nocheck + export default class PlayerError extends Error { constructor(msg: string, name?: string) { super(); diff --git a/src/utils/Util.ts b/src/utils/Util.ts index 7826f5d..b2eac38 100644 --- a/src/utils/Util.ts +++ b/src/utils/Util.ts @@ -1,3 +1,5 @@ +// @ts-nocheck + import { QueryType, TimeData } from '../types/types'; import { FFmpeg } from 'prism-media'; import YouTube from 'youtube-sr'; From 6bba82864c7f5b98fab5a92452efe9b64b2b1e17 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sat, 1 May 2021 13:50:12 +0545 Subject: [PATCH 003/215] remove comments and stuff --- src/Player.ts | 273 +------------------------------------- src/Structures/Queue.ts | 103 +------------- src/Structures/Track.ts | 85 +----------- src/utils/AudioFilters.ts | 35 ----- src/utils/Constants.ts | 2 - src/utils/PlayerError.ts | 2 - src/utils/Util.ts | 2 - 7 files changed, 6 insertions(+), 496 deletions(-) diff --git a/src/Player.ts b/src/Player.ts index ea22e94..7742838 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -1,48 +1,13 @@ import { EventEmitter } from 'events'; -import { Client, Collection, Snowflake, Collector, Message } from 'discord.js'; -import { - PlayerOptions as PlayerOptionsType, -} from './types/types'; +import { Client } from 'discord.js'; import Util from './utils/Util'; -import AudioFilters from './utils/AudioFilters'; -import { Queue } from './Structures/Queue'; -import { ExtractorModel } from './Structures/ExtractorModel'; -/** - * The Player class - * @extends {EventEmitter} - */ export class Player extends EventEmitter { public client: Client; - public options: PlayerOptionsType; - public filters: typeof AudioFilters; - /** - * The collection of queues in this player - * @type {DiscordCollection} - */ - public queues = new Collection(); - - /** - * The extractor model collection - * @type {DiscordCollection} - */ - public Extractors = new Collection(); - - /** - * Creates new Player instance - * @param {DiscordClient} client The discord.js client - * @param {PlayerOptions} options Player options - */ - constructor(client: Client, options?: PlayerOptionsType) { + constructor(client: Client) { super(); - /** - * The discord client that instantiated this player - * @name Player#client - * @type {DiscordClient} - * @readonly - */ Object.defineProperty(this, 'client', { value: client, enumerable: false @@ -55,236 +20,4 @@ export class Player extends EventEmitter { } -export default Player; - -/** - * Emitted when a track starts - * @event Player#trackStart - * @param {DiscordMessage} message The message - * @param {Track} track The track - * @param {Queue} queue The queue - */ - -/** - * Emitted when a playlist is started - * @event Player#queueCreate - * @param {DiscordMessage} message The message - * @param {Queue} queue The queue - */ - -/** - * Emitted when the bot is awaiting search results - * @event Player#searchResults - * @param {DiscordMessage} message The message - * @param {String} query The query - * @param {Track[]} tracks The tracks - * @param {DiscordCollector} collector The collector - */ - -/** - * Emitted when the user has sent an invalid response for search results - * @event Player#searchInvalidResponse - * @param {DiscordMessage} message The message - * @param {String} query The query - * @param {Track[]} tracks The tracks - * @param {String} invalidResponse The `invalidResponse` string - * @param {DiscordCollector} collector The collector - */ - -/** - * Emitted when the bot has stopped awaiting search results (timeout) - * @event Player#searchCancel - * @param {DiscordMessage} message The message - * @param {String} query The query - * @param {Track[]} tracks The tracks - */ - -/** - * Emitted when the bot can't find related results to the query - * @event Player#noResults - * @param {DiscordMessage} message The message - * @param {String} query The query - */ - -/** - * Emitted when the bot is disconnected from the channel - * @event Player#botDisconnect - * @param {DiscordMessage} message The message - */ - -/** - * Emitted when the channel of the bot is empty - * @event Player#channelEmpty - * @param {DiscordMessage} message The message - * @param {Queue} queue The queue - */ - -/** - * Emitted when the queue of the server is ended - * @event Player#queueEnd - * @param {DiscordMessage} message The message - * @param {Queue} queue The queue - */ - -/** - * Emitted when a track is added to the queue - * @event Player#trackAdd - * @param {DiscordMessage} message The message - * @param {Queue} queue The queue - * @param {Track} track The track - */ - -/** - * Emitted when a playlist is added to the queue - * @event Player#playlistAdd - * @param {DiscordMessage} message The message - * @param {Queue} queue The queue - * @param {Object} playlist The playlist - */ - -/** - * Emitted when an error is triggered - * @event Player#error - * @param {String} error It can be `NotConnected`, `UnableToJoin`, `NotPlaying`, `ParseError`, `LiveVideo` or `VideoUnavailable`. - * @param {DiscordMessage} message The message - */ - -/** - * Emitted when discord-player attempts to parse playlist contents (mostly soundcloud playlists) - * @event Player#playlistParseStart - * @param {Object} playlist Raw playlist (unparsed) - * @param {DiscordMessage} message The message - */ - -/** - * Emitted when discord-player finishes parsing playlist contents (mostly soundcloud playlists) - * @event Player#playlistParseEnd - * @param {Object} playlist The playlist data (parsed) - * @param {DiscordMessage} message The message - */ - -/** - * @typedef {Object} PlayerOptions - * @property {Boolean} [leaveOnEnd=false] If it should leave on queue end - * @property {Number} [leaveOnEndCooldown=0] Time in ms to wait before executing `leaveOnEnd` - * @property {Boolean} [leaveOnStop=false] If it should leave on stop command - * @property {Boolean} [leaveOnEmpty=false] If it should leave on empty voice channel - * @property {Number} [leaveOnEmptyCooldown=0] Time in ms to wait before executing `leaveOnEmpty` - * @property {Boolean} [autoSelfDeaf=false] If it should set the client to `self deaf` mode on joining - * @property {Boolean} [enableLive=false] If it should enable live videos support - * @property {YTDLDownloadOptions} [ytdlDownloadOptions={}] The download options passed to `ytdl-core` - * @property {Boolean} [useSafeSearch=false] If it should use `safe search` method for youtube searches - * @property {Boolean} [disableAutoRegister=false] If it should disable auto-registeration of `@discord-player/extractor` - */ - -/** - * The type of Track source, either: - * * `soundcloud` - a stream from SoundCloud - * * `youtube` - a stream from YouTube - * * `arbitrary` - arbitrary stream - * @typedef {String} TrackSource - */ - -/** - * @typedef {Object} TrackData - * @property {String} title The title - * @property {String} description The description - * @property {String} author The author - * @property {String} url The url - * @property {String} duration The duration - * @property {Number} views The view count - * @property {DiscordUser} requestedBy The user who requested this track - * @property {Boolean} fromPlaylist If this track came from a playlist - * @property {TrackSource} [source] The track source - * @property {string|Readable} [engine] The stream engine - * @property {Boolean} [live=false] If this track is livestream instance - */ - -/** - * @typedef {Object} QueueFilters - * The FFmpeg Filters - */ - -/** - * The query type, either: - * * `soundcloud_track` - a SoundCloud Track - * * `soundcloud_playlist` - a SoundCloud Playlist - * * `spotify_song` - a Spotify Song - * * `spotify_album` - a Spotify album - * * `spotify_playlist` - a Spotify playlist - * * `youtube_video` - a YouTube video - * * `youtube_playlist` - a YouTube playlist - * * `vimeo` - a Vimeo link - * * `facebook` - a Facebook link - * * `reverbnation` - a Reverbnation link - * * `attachment` - an attachment link - * * `youtube_search` - a YouTube search keyword - * @typedef {String} QueryType The query type - */ - -/** - * @typedef {Object} ExtractorModelData - * @property {String} title The title - * @property {Number} duration The duration in ms - * @property {String} thumbnail The thumbnail url - * @property {string|Readable} engine The audio engine - * @property {Number} views The views count of this stream - * @property {String} author The author - * @property {String} description The description - * @property {String} url The url - * @property {String} [version='0.0.0'] The extractor version - * @property {Boolean} [important=false] Mark as important - */ - -/** - * @typedef {Object} PlayerProgressbarOptions - * @property {Boolean} [timecodes] If it should return progres bar with time codes - * @property {Boolean} [queue] if it should return the progress bar of the whole queue - * @property {Number} [length] The length of progress bar to build - */ - -/** - * @typedef {Object} LyricsData - * @property {String} title The title of the lyrics - * @property {Number} id The song id - * @property {String} thumbnail The thumbnail - * @property {String} image The image - * @property {String} url The url - * @property {Object} artist The artust info - * @property {String} [artist.name] The name of the artist - * @property {Number} [artist.id] The ID of the artist - * @property {String} [artist.url] The profile link of the artist - * @property {String} [artist.image] The artist image url - * @property {String?} lyrics The lyrics - */ - -/** - * @typedef {Object} PlayerStats - * @property {Number} uptime The uptime in ms - * @property {Number} connections The number of connections - * @property {Number} users The number of users - * @property {Number} queues The number of queues - * @property {Number} extractors The number of custom extractors registered - * @property {Object} versions The versions metadata - * @property {String} [versions.ffmpeg] The ffmpeg version - * @property {String} [versions.node] The node version - * @property {String} [versions.v8] The v8 JavaScript engine version - * @property {Object} system The system data - * @property {String} [system.arch] The system arch - * @property {String} [system.platform] The system platform - * @property {Number} [system.cpu] The cpu count - * @property {Object} [system.memory] The memory info - * @property {String} [system.memory.total] The total memory - * @property {String} [system.memory.usage] The memory usage - * @property {String} [system.memory.rss] The memory usage in RSS - * @property {String} [system.memory.arrayBuffers] The memory usage in ArrayBuffers - * @property {Number} [system.uptime] The system uptime - */ - -/** - * @typedef {Object} TimeData - * @property {Number} days The time in days - * @property {Number} hours The time in hours - * @property {Number} minutes The time in minutes - * @property {Number} seconds The time in seconds - */ +export default Player; \ No newline at end of file diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index bd67662..bfc1748 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -24,104 +24,37 @@ export class Queue extends EventEmitter { public additionalStreamTime: number; public firstMessage: Message; - /** - * If autoplay is enabled in this queue - * @type {boolean} - */ public autoPlay = false; - /** - * Queue constructor - * @param {Player} player The player that instantiated this Queue - * @param {DiscordMessage} message The message object - */ constructor(player: Player, message: Message) { super(); - /** - * The player that instantiated this Queue - * @name Queue#player - * @type {Player} - * @readonly - */ Object.defineProperty(this, 'player', { value: player, enumerable: false }); - /** - * ID of the guild assigned to this queue - * @type {DiscordSnowflake} - */ this.guildID = message.guild.id; - /** - * The voice connection of this queue - * @type {DiscordVoiceConnection} - */ this.voiceConnection = null; - /** - * Tracks of this queue - * @type {Track[]} - */ this.tracks = []; - /** - * Previous tracks of this queue - * @type {Track[]} - */ this.previousTracks = []; - /** - * If the player of this queue is stopped - * @type {boolean} - */ this.stopped = false; - /** - * If last track was skipped - * @type {boolean} - */ this.lastSkipped = false; - /** - * Queue volume - * @type {Number} - */ this.volume = 100; - /** - * If the player of this queue is paused - * @type {boolean} - */ this.paused = Boolean(this.voiceConnection?.dispatcher?.paused); - /** - * If repeat mode is enabled in this queue - * @type {boolean} - */ this.repeatMode = false; - /** - * If loop mode is enabled in this queue - * @type {boolean} - */ this.loopMode = false; - /** - * The additional calculated stream time - * @type {Number} - */ this.additionalStreamTime = 0; - /** - * The initial message object - * @type {DiscordMessage} - */ this.firstMessage = message; - /** - * The audio filters in this queue - * @type {QueueFilters} - */ this.filters = {}; Object.keys(AudioFilters).forEach((fn) => { @@ -129,52 +62,28 @@ export class Queue extends EventEmitter { }); } - /** - * Currently playing track - * @type {Track} - * @readonly - */ + get playing(): Track { return this.tracks[0]; } - /** - * Calculated volume of this queue - * @type {Number} - */ + get calculatedVolume(): number { return this.filters.normalizer ? this.volume + 70 : this.volume; } - /** - * Total duration - * @type {Number} - */ get totalTime(): number { return this.tracks.length > 0 ? this.tracks.map((t) => t.durationMS).reduce((p, c) => p + c) : 0; } - /** - * Current stream time - * @type {Number} - */ get currentStreamTime(): number { return this.voiceConnection?.dispatcher?.streamTime + this.additionalStreamTime || 0; } - /** - * Sets audio filters in this player - * @param {QueueFilters} filters Audio filters to set - * @type {Promise} - */ setFilters(filters: QueueFilters): Promise { return this.player.setFilters(this.firstMessage, filters); } - /** - * Returns array of all enabled filters - * @type {String[]} - */ getFiltersEnabled(): string[] { const filters: string[] = []; @@ -185,20 +94,12 @@ export class Queue extends EventEmitter { return filters; } - /** - * Returns all disabled filters - * @type {String[]} - */ getFiltersDisabled(): string[] { const enabled = this.getFiltersEnabled(); return Object.keys(this.filters).filter((f) => !enabled.includes(f)); } - /** - * String representation of this Queue - * @returns {String} - */ toString(): string { return ``; } diff --git a/src/Structures/Track.ts b/src/Structures/Track.ts index 2e3ff2d..6f77e9d 100644 --- a/src/Structures/Track.ts +++ b/src/Structures/Track.ts @@ -18,80 +18,10 @@ export class Track { public fromPlaylist!: boolean; public raw!: TrackData; - /** - * Track constructor - * @param {Player} player The player that instantiated this Track - * @param {TrackData} data Track data - */ constructor(player: Player, data: TrackData) { - /** - * The player that instantiated this Track - * @name Track#player - * @type {Player} - * @readonly - */ + Object.defineProperty(this, 'player', { value: player, enumerable: false }); - /** - * Title of this track - * @name Track#title - * @type {String} - */ - - /** - * Description of this track - * @name Track#description - * @type {String} - */ - - /** - * Author of this track - * @name Track#author - * @type {String} - */ - - /** - * URL of this track - * @name Track#url - * @type {String} - */ - - /** - * Thumbnail of this track - * @name Track#thumbnail - * @type {String} - */ - - /** - * Duration of this track - * @name Track#duration - * @type {String} - */ - - /** - * Views count of this track - * @name Track#views - * @type {Number} - */ - - /** - * Person who requested this track - * @name Track#requestedBy - * @type {DiscordUser} - */ - - /** - * If this track belongs to playlist - * @name Track#fromPlaylist - * @type {Boolean} - */ - - /** - * Raw track data - * @name Track#raw - * @type {TrackData} - */ - void this._patch(data); } @@ -110,19 +40,10 @@ export class Track { Object.defineProperty(this, 'raw', { get: () => data, enumerable: false }); } - /** - * The queue in which this track is located - * @type {Queue} - * @readonly - */ get queue(): Queue { return this.player.queues.find((q) => q.tracks.includes(this)); } - /** - * The track duration in millisecond - * @type {Number} - */ get durationMS(): number { const times = (n: number, t: number) => { let tn = 1; @@ -137,10 +58,6 @@ export class Track { .reduce((a, c) => a + c, 0); } - /** - * String representation of this track - * @returns {String} - */ toString(): string { return `${this.title} by ${this.author}`; } diff --git a/src/utils/AudioFilters.ts b/src/utils/AudioFilters.ts index 5f73102..4c98fb3 100644 --- a/src/utils/AudioFilters.ts +++ b/src/utils/AudioFilters.ts @@ -1,40 +1,5 @@ -// @ts-nocheck - import { FiltersName } from '../types/types'; -/** - * The available audio filters - * @typedef {Object} AudioFilters - * @property {String} bassboost The bassboost filter - * @property {String} 8D The 8D filter - * @property {String} vaporwave The vaporwave filter - * @property {String} nightcore The nightcore filter - * @property {String} phaser The phaser filter - * @property {String} tremolo The tremolo filter - * @property {String} vibrato The vibrato filter - * @property {String} reverse The reverse filter - * @property {String} treble The treble filter - * @property {String} normalizer The normalizer filter - * @property {String} surrounding The surrounding filter - * @property {String} pulsator The pulsator filter - * @property {String} subboost The subboost filter - * @property {String} kakaoke The kakaoke filter - * @property {String} flanger The flanger filter - * @property {String} gate The gate filter - * @property {String} haas The haas filter - * @property {String} mcompand The mcompand filter - * @property {String} mono The mono filter - * @property {String} mstlr The mstlr filter - * @property {String} mstrr The mstrr filter - * @property {String} compressor The compressor filter - * @property {String} expander The expander filter - * @property {String} softlimiter The softlimiter filter - * @property {String} chorus The chorus filter - * @property {String} chorus2d The chorus2d filter - * @property {String} chorus3d The chorus3d filter - * @property {String} fadein The fadein filter - */ - const FilterList = { bassboost: 'bass=g=20', '8D': 'apulsator=hz=0.09', diff --git a/src/utils/Constants.ts b/src/utils/Constants.ts index 06cdd02..ef5eb1b 100644 --- a/src/utils/Constants.ts +++ b/src/utils/Constants.ts @@ -1,5 +1,3 @@ -// @ts-nocheck - import { PlayerOptions as DP_OPTIONS } from '../types/types'; export const PlayerEvents = { diff --git a/src/utils/PlayerError.ts b/src/utils/PlayerError.ts index 16e84be..c87e1f6 100644 --- a/src/utils/PlayerError.ts +++ b/src/utils/PlayerError.ts @@ -1,5 +1,3 @@ -// @ts-nocheck - export default class PlayerError extends Error { constructor(msg: string, name?: string) { super(); diff --git a/src/utils/Util.ts b/src/utils/Util.ts index b2eac38..7826f5d 100644 --- a/src/utils/Util.ts +++ b/src/utils/Util.ts @@ -1,5 +1,3 @@ -// @ts-nocheck - import { QueryType, TimeData } from '../types/types'; import { FFmpeg } from 'prism-media'; import YouTube from 'youtube-sr'; From 7a4c573ce4821751c8638ae63b00cb7c937e8c41 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sat, 1 May 2021 14:13:24 +0545 Subject: [PATCH 004/215] rough structure --- src/Player.ts | 21 ++++++- src/Structures/ExtractorModel.ts | 2 - src/Structures/Queue.ts | 103 +------------------------------ src/Structures/Track.ts | 59 +----------------- 4 files changed, 23 insertions(+), 162 deletions(-) diff --git a/src/Player.ts b/src/Player.ts index 7742838..b732e1c 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -1,9 +1,13 @@ import { EventEmitter } from 'events'; -import { Client } from 'discord.js'; +import { Client, Collection, Snowflake, Message } from 'discord.js'; import Util from './utils/Util'; +import Queue from './Structures/Queue'; +import { ExtractorModel } from './Structures/ExtractorModel'; export class Player extends EventEmitter { public client: Client; + public queues = new Collection(); + public Extractors = new Collection(); constructor(client: Client) { super(); @@ -13,8 +17,19 @@ export class Player extends EventEmitter { enumerable: false }); - // check FFmpeg - void Util.alertFFmpeg(); + Util.alertFFmpeg(); + } + + public createQueue(message: Message) { + if (this.queues.has(message.guild.id)) return this.queues.get(message.guild.id); + + const queue = new Queue(this, message); + void this.queues.set(message.guild.id, queue); + return queue; + } + + public getQueue(message: Message) { + return this.queues.get(message.guild.id) ?? null; } diff --git a/src/Structures/ExtractorModel.ts b/src/Structures/ExtractorModel.ts index 7bce372..578470a 100644 --- a/src/Structures/ExtractorModel.ts +++ b/src/Structures/ExtractorModel.ts @@ -1,5 +1,3 @@ -// @ts-nocheck - import { ExtractorModelData } from '../types/types'; class ExtractorModel { diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index bfc1748..d83a369 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -1,107 +1,10 @@ -// @ts-nocheck - -import { Message, Snowflake, VoiceConnection } from 'discord.js'; -import AudioFilters from '../utils/AudioFilters'; import { Player } from '../Player'; -import { EventEmitter } from 'events'; -import { Track } from './Track'; -import { QueueFilters } from '../types/types'; -export class Queue extends EventEmitter { - public player!: Player; - public guildID: Snowflake; - public voiceConnection?: VoiceConnection; - public stream?: any; - public tracks: Track[]; - public previousTracks: Track[]; - public stopped: boolean; - public lastSkipped: boolean; - public volume: number; - public paused: boolean; - public repeatMode: boolean; - public loopMode: boolean; - public filters: QueueFilters; - public additionalStreamTime: number; - public firstMessage: Message; - - public autoPlay = false; - - constructor(player: Player, message: Message) { - super(); +export class Queue { + public readonly player: Player; + constructor(player: Player, data: any) { Object.defineProperty(this, 'player', { value: player, enumerable: false }); - - this.guildID = message.guild.id; - - this.voiceConnection = null; - - this.tracks = []; - - this.previousTracks = []; - - this.stopped = false; - - this.lastSkipped = false; - - this.volume = 100; - - this.paused = Boolean(this.voiceConnection?.dispatcher?.paused); - - this.repeatMode = false; - - this.loopMode = false; - - this.additionalStreamTime = 0; - - this.firstMessage = message; - - this.filters = {}; - - Object.keys(AudioFilters).forEach((fn) => { - this.filters[fn as keyof QueueFilters] = false; - }); - } - - - get playing(): Track { - return this.tracks[0]; - } - - - get calculatedVolume(): number { - return this.filters.normalizer ? this.volume + 70 : this.volume; - } - - get totalTime(): number { - return this.tracks.length > 0 ? this.tracks.map((t) => t.durationMS).reduce((p, c) => p + c) : 0; - } - - get currentStreamTime(): number { - return this.voiceConnection?.dispatcher?.streamTime + this.additionalStreamTime || 0; - } - - setFilters(filters: QueueFilters): Promise { - return this.player.setFilters(this.firstMessage, filters); - } - - getFiltersEnabled(): string[] { - const filters: string[] = []; - - for (const filter in this.filters) { - if (this.filters[filter as keyof QueueFilters] !== false) filters.push(filter); - } - - return filters; - } - - getFiltersDisabled(): string[] { - const enabled = this.getFiltersEnabled(); - - return Object.keys(this.filters).filter((f) => !enabled.includes(f)); - } - - toString(): string { - return ``; } } diff --git a/src/Structures/Track.ts b/src/Structures/Track.ts index 6f77e9d..253dffa 100644 --- a/src/Structures/Track.ts +++ b/src/Structures/Track.ts @@ -1,65 +1,10 @@ -// @ts-nocheck - import { Player } from '../Player'; -import { User } from 'discord.js'; -import { TrackData } from '../types/types'; -import Queue from './Queue'; export class Track { - public player!: Player; - public title!: string; - public description!: string; - public author!: string; - public url!: string; - public thumbnail!: string; - public duration!: string; - public views!: number; - public requestedBy!: User; - public fromPlaylist!: boolean; - public raw!: TrackData; + public readonly player: Player; - constructor(player: Player, data: TrackData) { - + constructor(player: Player, data: any) { Object.defineProperty(this, 'player', { value: player, enumerable: false }); - - void this._patch(data); - } - - private _patch(data: TrackData) { - this.title = data.title ?? ''; - this.description = data.description ?? ''; - this.author = data.author ?? ''; - this.url = data.url ?? ''; - this.thumbnail = data.thumbnail ?? ''; - this.duration = data.duration ?? ''; - this.views = data.views ?? 0; - this.requestedBy = data.requestedBy; - this.fromPlaylist = Boolean(data.fromPlaylist); - - // raw - Object.defineProperty(this, 'raw', { get: () => data, enumerable: false }); - } - - get queue(): Queue { - return this.player.queues.find((q) => q.tracks.includes(this)); - } - - get durationMS(): number { - const times = (n: number, t: number) => { - let tn = 1; - for (let i = 0; i < t; i++) tn *= n; - return t <= 0 ? 1000 : tn * 1000; - }; - - return this.duration - .split(':') - .reverse() - .map((m, i) => parseInt(m) * times(60, i)) - .reduce((a, c) => a + c, 0); - } - - toString(): string { - return `${this.title} by ${this.author}`; } } From 6605cc9f6fb38e27f153e5f314a8670db965ab6a Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 9 May 2021 22:11:41 +0545 Subject: [PATCH 005/215] playlist structure --- src/Structures/Playlist.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/Structures/Playlist.ts diff --git a/src/Structures/Playlist.ts b/src/Structures/Playlist.ts new file mode 100644 index 0000000..a30f92f --- /dev/null +++ b/src/Structures/Playlist.ts @@ -0,0 +1,12 @@ +import Player from "../Player"; + +class Playlist { + player: Player; + + constructor(player: Player, data: any) { + Object.defineProperty(this, "player", { value: player }); + } + +} + +export default Playlist; \ No newline at end of file From 0a173d73c9d32f5d98e403b8e96e36a24444687d Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 9 May 2021 22:13:18 +0545 Subject: [PATCH 006/215] exports --- src/Structures/Playlist.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Structures/Playlist.ts b/src/Structures/Playlist.ts index a30f92f..9ddadf3 100644 --- a/src/Structures/Playlist.ts +++ b/src/Structures/Playlist.ts @@ -1,8 +1,8 @@ import Player from "../Player"; -class Playlist { +export class Playlist { player: Player; - + constructor(player: Player, data: any) { Object.defineProperty(this, "player", { value: player }); } From 1437698572f8b574e5b271b502c7287479bff5c1 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 9 May 2021 22:14:02 +0545 Subject: [PATCH 007/215] change autoSelfDeaf to setSelfDeaf --- src/types/types.ts | 2 +- src/utils/Constants.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/types/types.ts b/src/types/types.ts index 9e57e90..546be00 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -8,7 +8,7 @@ export interface PlayerOptions { leaveOnStop?: boolean; leaveOnEmpty?: boolean; leaveOnEmptyCooldown?: number; - autoSelfDeaf?: boolean; + setSelfDeaf?: boolean; enableLive?: boolean; ytdlDownloadOptions?: downloadOptions; useSafeSearch?: boolean; diff --git a/src/utils/Constants.ts b/src/utils/Constants.ts index ef5eb1b..4e5d287 100644 --- a/src/utils/Constants.ts +++ b/src/utils/Constants.ts @@ -34,7 +34,7 @@ export const PlayerOptions: DP_OPTIONS = { leaveOnStop: true, leaveOnEmpty: true, leaveOnEmptyCooldown: 0, - autoSelfDeaf: true, + setSelfDeaf: true, enableLive: false, ytdlDownloadOptions: {} }; From c1dacb78432ad164dffb2c57244877b12ecb4ffa Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 9 May 2021 22:15:00 +0545 Subject: [PATCH 008/215] enums --- src/utils/Constants.ts | 50 +++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/utils/Constants.ts b/src/utils/Constants.ts index 4e5d287..1c4bf3d 100644 --- a/src/utils/Constants.ts +++ b/src/utils/Constants.ts @@ -1,32 +1,32 @@ import { PlayerOptions as DP_OPTIONS } from '../types/types'; -export const PlayerEvents = { - BOT_DISCONNECT: 'botDisconnect', - CHANNEL_EMPTY: 'channelEmpty', - CONNECTION_CREATE: 'connectionCreate', - ERROR: 'error', - MUSIC_STOP: 'musicStop', - NO_RESULTS: 'noResults', - PLAYLIST_ADD: 'playlistAdd', - PLAYLIST_PARSE_END: 'playlistParseEnd', - PLAYLIST_PARSE_START: 'playlistParseStart', - QUEUE_CREATE: 'queueCreate', - QUEUE_END: 'queueEnd', - SEARCH_CANCEL: 'searchCancel', - SEARCH_INVALID_RESPONSE: 'searchInvalidResponse', - SEARCH_RESULTS: 'searchResults', - TRACK_ADD: 'trackAdd', - TRACK_START: 'trackStart' +export enum PlayerEvents { + BOT_DISCONNECT = 'botDisconnect', + CHANNEL_EMPTY = 'channelEmpty', + CONNECTION_CREATE = 'connectionCreate', + ERROR = 'error', + MUSIC_STOP = 'musicStop', + NO_RESULTS = 'noResults', + PLAYLIST_ADD = 'playlistAdd', + PLAYLIST_PARSE_END = 'playlistParseEnd', + PLAYLIST_PARSE_START = 'playlistParseStart', + QUEUE_CREATE = 'queueCreate', + QUEUE_END = 'queueEnd', + SEARCH_CANCEL = 'searchCancel', + SEARCH_INVALID_RESPONSE = 'searchInvalidResponse', + SEARCH_RESULTS = 'searchResults', + TRACK_ADD = 'trackAdd', + TRACK_START = 'trackStart' }; -export const PlayerErrorEventCodes = { - LIVE_VIDEO: 'LiveVideo', - NOT_CONNECTED: 'NotConnected', - UNABLE_TO_JOIN: 'UnableToJoin', - NOT_PLAYING: 'NotPlaying', - PARSE_ERROR: 'ParseError', - VIDEO_UNAVAILABLE: 'VideoUnavailable', - MUSIC_STARTING: 'MusicStarting' +export enum PlayerErrorEventCodes { + LIVE_VIDEO = 'LiveVideo', + NOT_CONNECTED = 'NotConnected', + UNABLE_TO_JOIN = 'UnableToJoin', + NOT_PLAYING = 'NotPlaying', + PARSE_ERROR = 'ParseError', + VIDEO_UNAVAILABLE = 'VideoUnavailable', + MUSIC_STARTING = 'MusicStarting' }; export const PlayerOptions: DP_OPTIONS = { From b8eec6dbd48f2bc608c91c26dc7fc68aaf075155 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Mon, 10 May 2021 10:43:37 +0545 Subject: [PATCH 009/215] rough --- package.json | 2 +- src/Player.ts | 173 +++++++++++++++++++++++++++++++++++++-- src/Structures/Queue.ts | 35 +++++++- src/Structures/Track.ts | 6 +- src/utils/Constants.ts | 1 + src/utils/PlayerError.ts | 11 ++- yarn.lock | 24 +++--- 7 files changed, 226 insertions(+), 26 deletions(-) diff --git a/package.json b/package.json index 6fd2029..9726515 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "@discordjs/opus": "^0.5.0", "@types/node": "^14.14.41", "@types/ws": "^7.4.1", - "discord.js": "^12.5.3", + "discord.js": "discordjs/discord.js", "discord.js-docgen": "discordjs/docgen#ts-patch", "jsdoc-babel": "^0.5.0", "prettier": "^2.2.1", diff --git a/src/Player.ts b/src/Player.ts index b732e1c..9601b2e 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -1,13 +1,19 @@ import { EventEmitter } from 'events'; -import { Client, Collection, Snowflake, Message } from 'discord.js'; +import { Client, Collection, Snowflake, Message, Collector } from 'discord.js'; import Util from './utils/Util'; import Queue from './Structures/Queue'; +import Track from './Structures/Track'; +import PlayerError from './utils/PlayerError'; import { ExtractorModel } from './Structures/ExtractorModel'; +import ytdl from 'discord-ytdl-core'; +import { PlayerEvents, PlayerErrorEventCodes } from './utils/Constants'; export class Player extends EventEmitter { public client: Client; public queues = new Collection(); public Extractors = new Collection(); + private _cooldownsTimeout = new Collection(); + private _resultsCollectors = new Collection>(); constructor(client: Client) { super(); @@ -21,18 +27,171 @@ export class Player extends EventEmitter { } public createQueue(message: Message) { - if (this.queues.has(message.guild.id)) return this.queues.get(message.guild.id); - - const queue = new Queue(this, message); - void this.queues.set(message.guild.id, queue); - return queue; + return new Promise((resolve) => { + if (this.queues.has(message.guild.id)) return this.queues.get(message.guild.id); + const channel = message.member.voice?.channel; + if (!channel) return void this.emit( + PlayerEvents.ERROR, + new PlayerError('Voice connection is not available in this server!', PlayerErrorEventCodes.NOT_CONNECTED, message) + ); + + const queue = new Queue(this, message.guild); + void this.queues.set(message.guild.id, queue); + + channel + .join() + .then((connection) => { + this.emit(PlayerEvents.CONNECTION_CREATE, message, connection); + + queue.voiceConnection = connection; + if (queue.options.setSelfDeaf) connection.voice.setSelfDeaf(true); + this.emit(PlayerEvents.QUEUE_CREATE, message, queue); + resolve(queue); + }) + .catch((err) => { + this.queues.delete(message.guild.id); + this.emit( + PlayerEvents.ERROR, + new PlayerError(err.message ?? err, PlayerErrorEventCodes.UNABLE_TO_JOIN, message) + ); + }); + + return queue; + }) } public getQueue(message: Message) { return this.queues.get(message.guild.id) ?? null; } - + async play(message: Message, query: string | Track, firstResult?: boolean): Promise { + if (!message) throw new PlayerError('Play function needs message'); + if (!query) throw new PlayerError('Play function needs search query as a string or Player.Track object'); + + if (this._cooldownsTimeout.has(`end_${message.guild.id}`)) { + clearTimeout(this._cooldownsTimeout.get(`end_${message.guild.id}`)); + this._cooldownsTimeout.delete(`end_${message.guild.id}`); + } + + if (typeof query === 'string') query = query.replace(/<(.+)>/g, '$1'); + let track; + + const queue = this.getQueue(message); + + if (query instanceof Track) track = query; + else { + if (ytdl.validateURL(query)) { + const info = await ytdl.getBasicInfo(query).catch(() => { }); + if (!info) return void this.emit(PlayerEvents.NO_RESULTS, message, query); + if (info.videoDetails.isLiveContent && !queue.options.enableLive) + return void this.emit( + PlayerEvents.ERROR, + new PlayerError('Live video is not enabled!', PlayerErrorEventCodes.LIVE_VIDEO, message) + ); + const lastThumbnail = info.videoDetails.thumbnails[info.videoDetails.thumbnails.length - 1]; + + track = new Track(this, { + title: info.videoDetails.title, + description: info.videoDetails.description, + author: info.videoDetails.author.name, + url: info.videoDetails.video_url, + thumbnail: lastThumbnail.url, + duration: Util.buildTimeCode(Util.parseMS(parseInt(info.videoDetails.lengthSeconds) * 1000)), + views: parseInt(info.videoDetails.viewCount), + requestedBy: message.author, + fromPlaylist: false, + source: 'youtube', + live: Boolean(info.videoDetails.isLiveContent) + }); + } else { + for (const [_, extractor] of this.Extractors) { + if (extractor.validate(query)) { + const data = await extractor.handle(query); + if (data) { + track = new Track(this, { + title: data.title, + description: data.description, + duration: Util.buildTimeCode(Util.parseMS(data.duration)), + thumbnail: data.thumbnail, + author: data.author, + views: data.views, + engine: data.engine, + source: 'arbitrary', + fromPlaylist: false, + requestedBy: message.author, + url: data.url + }); + + if (extractor.important) break; + } + } + } + + if (!track) track = await this.searchTracks(message, query, firstResult); + } + } + + if (track) { + if (queue) { + const q = queue.addTrack(track); + this.emit(PlayerEvents.TRACK_ADD, message, q, q.tracks[q.tracks.length - 1]); + } else { + const q = queue.addTrack(track); + if (q) this.emit(PlayerEvents.TRACK_START, message, q.tracks[0], q); + + // todo: start playing + } + } + } + + private searchTracks(message: Message, query: string, firstResult?: boolean): Promise { + return new Promise(async (resolve) => { + let tracks: Track[] = []; + const queryType = Util.getQueryType(query); + + switch (queryType) { + default: + tracks = await Util.ytSearch(query, { user: message.author, player: this }); + } + + if (tracks.length < 1) return void this.emit(PlayerEvents.NO_RESULTS, message, query); + if (firstResult || tracks.length === 1) return resolve(tracks[0]); + + const collectorString = `${message.author.id}-${message.channel.id}`; + const currentCollector = this._resultsCollectors.get(collectorString); + if (currentCollector) currentCollector.stop(); + + const collector = message.channel.createMessageCollector((m) => m.author.id === message.author.id, { + time: 60000 + }); + + this._resultsCollectors.set(collectorString, collector); + + this.emit(PlayerEvents.SEARCH_RESULTS, message, query, tracks, collector); + + collector.on('collect', ({ content }) => { + if (content === 'cancel') { + collector.stop(); + return this.emit(PlayerEvents.SEARCH_CANCEL, message, query, tracks); + } + + if (!isNaN(content) && parseInt(content) >= 1 && parseInt(content) <= tracks.length) { + const index = parseInt(content, 10); + const track = tracks[index - 1]; + collector.stop(); + resolve(track); + } else { + this.emit(PlayerEvents.SEARCH_INVALID_RESPONSE, message, query, tracks, content, collector); + } + }); + + collector.on('end', (_, reason) => { + if (reason === 'time') { + this.emit(PlayerEvents.SEARCH_CANCEL, message, query, tracks); + } + }); + }); + } } export default Player; \ No newline at end of file diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index d83a369..6ed849d 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -1,10 +1,41 @@ +import { Guild, Message, VoiceConnection } from 'discord.js'; import { Player } from '../Player'; +import { PlayerOptions } from '../types/types'; +import Track from './Track'; +import { PlayerError } from '../utils/PlayerError'; export class Queue { - public readonly player: Player; + player: Player; + guild: Guild; + firstMessage: Message; + options: PlayerOptions = {}; + tracks: Track[] = []; + voiceConnection: VoiceConnection = null; - constructor(player: Player, data: any) { + constructor(player: Player, guild: Guild) { Object.defineProperty(this, 'player', { value: player, enumerable: false }); + + this.guild = guild; + } + + get playing() { + return this.tracks[0]; + } + + async play(message: Message, query: string | Track, firstResult?: boolean) { + return await this.player.play(message, query, firstResult); + } + + addTrack(track: Track) { + if (!track || !(track instanceof Track)) throw new PlayerError('No track specified to add to the queue'); + this.tracks.push(track); + return this; + } + + addTracks(tracks: Track[]) { + this.tracks.push(...tracks); + + return this; } } diff --git a/src/Structures/Track.ts b/src/Structures/Track.ts index 253dffa..4142061 100644 --- a/src/Structures/Track.ts +++ b/src/Structures/Track.ts @@ -1,8 +1,10 @@ +import { Message } from 'discord.js'; import { Player } from '../Player'; export class Track { - public readonly player: Player; - + readonly player: Player; + readonly message: Message; + constructor(player: Player, data: any) { Object.defineProperty(this, 'player', { value: player, enumerable: false }); } diff --git a/src/utils/Constants.ts b/src/utils/Constants.ts index 1c4bf3d..dd36a0f 100644 --- a/src/utils/Constants.ts +++ b/src/utils/Constants.ts @@ -20,6 +20,7 @@ export enum PlayerEvents { }; export enum PlayerErrorEventCodes { + DEFAULT = 'PlayerError', LIVE_VIDEO = 'LiveVideo', NOT_CONNECTED = 'NotConnected', UNABLE_TO_JOIN = 'UnableToJoin', diff --git a/src/utils/PlayerError.ts b/src/utils/PlayerError.ts index c87e1f6..5185fb1 100644 --- a/src/utils/PlayerError.ts +++ b/src/utils/PlayerError.ts @@ -1,10 +1,19 @@ +import { Message } from "discord.js"; + export default class PlayerError extends Error { - constructor(msg: string, name?: string) { + discordMessage: Message; + + constructor(msg: string, name?: string, message?: Message) { super(); this.name = name ?? 'PlayerError'; this.message = msg; + this.discordMessage = message; Error.captureStackTrace(this); } + + get code() { + return this.name; + } } export { PlayerError }; diff --git a/yarn.lock b/yarn.lock index 8b2d9c3..2ddb0ed 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1802,19 +1802,17 @@ discord.js-docgen@discordjs/docgen#ts-patch: tsubaki "^1.3.2" yargs "^14.0.0" -discord.js@^12.5.3: - version "12.5.3" - resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-12.5.3.tgz#56820d473c24320871df9ea0bbc6b462f21cf85c" - integrity sha512-D3nkOa/pCkNyn6jLZnAiJApw2N9XrIsXUAdThf01i7yrEuqUmDGc7/CexVWwEcgbQR97XQ+mcnqJpmJ/92B4Aw== +discord.js@discordjs/discord.js: + version "12.5.0" + resolved "https://codeload.github.com/discordjs/discord.js/tar.gz/0e40f9b86826ba50aa3840807fb86e1bce6b1c3d" dependencies: "@discordjs/collection" "^0.1.6" "@discordjs/form-data" "^3.0.1" abort-controller "^3.0.0" node-fetch "^2.6.1" - prism-media "^1.2.9" - setimmediate "^1.0.5" + prism-media "^1.2.2" tweetnacl "^1.0.3" - ws "^7.4.4" + ws "^7.3.1" dmd@^4.0.5: version "4.0.6" @@ -3476,7 +3474,7 @@ prettier@^2.2.1: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== -prism-media@^1.2.7, prism-media@^1.2.9: +prism-media@^1.2.2, prism-media@^1.2.7: version "1.2.9" resolved "https://registry.yarnpkg.com/prism-media/-/prism-media-1.2.9.tgz#8d4f97b36efdfc82483eb8d3db64020767866f36" integrity sha512-UHCYuqHipbTR1ZsXr5eg4JUmHER8Ss4YEb9Azn+9zzJ7/jlTtD1h0lc4g6tNx3eMlB8Mp6bfll0LPMAV4R6r3Q== @@ -3834,11 +3832,6 @@ set-value@^2.0.0, set-value@^2.0.1: is-plain-object "^2.0.3" split-string "^3.0.1" -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= - shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -4572,6 +4565,11 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" +ws@^7.3.1: + version "7.4.5" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.5.tgz#a484dd851e9beb6fdb420027e3885e8ce48986c1" + integrity sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g== + ws@^7.4.4: version "7.4.4" resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.4.tgz#383bc9742cb202292c9077ceab6f6047b17f2d59" From 713ad111dd034a922c02267648f17c76ce07d940 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Wed, 9 Jun 2021 19:26:42 +0545 Subject: [PATCH 010/215] chore(deps) --- package.json | 17 +- yarn.lock | 1277 +++++++++++++++++++++----------------------------- 2 files changed, 556 insertions(+), 738 deletions(-) diff --git a/package.json b/package.json index 9726515..875afb6 100644 --- a/package.json +++ b/package.json @@ -50,11 +50,12 @@ }, "homepage": "https://github.com/Androz2091/discord-player#readme", "dependencies": { - "discord-ytdl-core": "^5.0.2", - "soundcloud-scraper": "^4.0.3", - "spotify-url-info": "^2.2.0", - "youtube-sr": "^4.0.4", - "ytdl-core": "^4.5.0" + "@discordjs/voice": "^0.3.0", + "discord-ytdl-core": "^5.0.3", + "soundcloud-scraper": "^5.0.0", + "spotify-url-info": "^2.2.3", + "youtube-sr": "^4.1.4", + "ytdl-core": "^4.8.2" }, "devDependencies": { "@babel/cli": "^7.13.16", @@ -65,12 +66,16 @@ "@discordjs/opus": "^0.5.0", "@types/node": "^14.14.41", "@types/ws": "^7.4.1", - "discord.js": "discordjs/discord.js", + "discord.js": "^13.0.0-dev.dda5ee2e9f0839d3e42d25114ae1b47355cdfd27", "discord.js-docgen": "discordjs/docgen#ts-patch", "jsdoc-babel": "^0.5.0", "prettier": "^2.2.1", "tslint": "^6.1.3", "tslint-config-prettier": "^1.18.0", + "typescipt": "^1.0.0", "typescript": "^4.2.3" + }, + "optionalDependencies": { + "sodium": "^3.0.2" } } diff --git a/yarn.lock b/yarn.lock index 2ddb0ed..c927e0b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,9 +3,9 @@ "@babel/cli@^7.13.16": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.13.16.tgz#9d372e943ced0cc291f068204a9b010fd9cfadbc" - integrity sha512-cL9tllhqvsQ6r1+d9Invf7nNXg/3BlfL1vvvL/AdH9fZ2l5j0CeBcoq6UjsqHpvyN1v5nXSZgqJZoGeK+ZOAbw== + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.14.3.tgz#9f6c8aee12e8660df879610f19a8010958b26a6f" + integrity sha512-zU4JLvwk32ay1lhhyGfqiRUSPoltVDjhYkA3aQq8+Yby9z30s/EsFw1EPOHxWG9YZo2pAGfgdRNeHZQAYU5m9A== dependencies: commander "^4.0.1" convert-source-map "^1.1.0" @@ -25,25 +25,25 @@ dependencies: "@babel/highlight" "^7.12.13" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.13.15", "@babel/compat-data@^7.13.8": - version "7.13.15" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.15.tgz#7e8eea42d0b64fda2b375b22d06c605222e848f4" - integrity sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA== +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.4.tgz#45720fe0cecf3fd42019e1d12cc3d27fadc98d58" + integrity sha512-i2wXrWQNkH6JplJQGn3Rd2I4Pij8GdHkXwHMxm+zV5YG/Jci+bCNrWZEWC4o+umiDkRrRs4dVzH3X4GP7vyjQQ== "@babel/core@^7.13.16": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.13.16.tgz#7756ab24396cc9675f1c3fcd5b79fcce192ea96a" - integrity sha512-sXHpixBiWWFti0AV2Zq7avpTasr6sIAu7Y396c608541qAU2ui4a193m0KSQmfPSKFZLnQ3cvlKDOm3XkuXm3Q== + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.3.tgz#5395e30405f0776067fbd9cf0884f15bfb770a38" + integrity sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg== dependencies: "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.13.16" + "@babel/generator" "^7.14.3" "@babel/helper-compilation-targets" "^7.13.16" - "@babel/helper-module-transforms" "^7.13.14" - "@babel/helpers" "^7.13.16" - "@babel/parser" "^7.13.16" + "@babel/helper-module-transforms" "^7.14.2" + "@babel/helpers" "^7.14.0" + "@babel/parser" "^7.14.3" "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.15" - "@babel/types" "^7.13.16" + "@babel/traverse" "^7.14.2" + "@babel/types" "^7.14.2" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -51,12 +51,12 @@ semver "^6.3.0" source-map "^0.5.0" -"@babel/generator@^7.13.16": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.16.tgz#0befc287031a201d84cdfc173b46b320ae472d14" - integrity sha512-grBBR75UnKOcUWMp8WoDxNsWCFl//XCK6HWTrBQKTr5SV9f5g0pNOjdyzi/DTBv12S9GnYPInIXQBTky7OXEMg== +"@babel/generator@^7.14.2", "@babel/generator@^7.14.3": + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.3.tgz#0c2652d91f7bddab7cccc6ba8157e4f40dcedb91" + integrity sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA== dependencies: - "@babel/types" "^7.13.16" + "@babel/types" "^7.14.2" jsesc "^2.5.1" source-map "^0.5.0" @@ -75,39 +75,40 @@ "@babel/helper-explode-assignable-expression" "^7.12.13" "@babel/types" "^7.12.13" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.13", "@babel/helper-compilation-targets@^7.13.16", "@babel/helper-compilation-targets@^7.13.8": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz#6e91dccf15e3f43e5556dffe32d860109887563c" - integrity sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA== +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.16", "@babel/helper-compilation-targets@^7.14.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.4.tgz#33ebd0ffc34248051ee2089350a929ab02f2a516" + integrity sha512-JgdzOYZ/qGaKTVkn5qEDV/SXAh8KcyUVkCoSWGN8T3bwrgd6m+/dJa2kVGi6RJYJgEYPBdZ84BZp9dUjNWkBaA== dependencies: - "@babel/compat-data" "^7.13.15" + "@babel/compat-data" "^7.14.4" "@babel/helper-validator-option" "^7.12.17" - browserslist "^4.14.5" + browserslist "^4.16.6" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.13.0": - version "7.13.11" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz#30d30a005bca2c953f5653fc25091a492177f4f6" - integrity sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw== +"@babel/helper-create-class-features-plugin@^7.13.0", "@babel/helper-create-class-features-plugin@^7.14.0", "@babel/helper-create-class-features-plugin@^7.14.3", "@babel/helper-create-class-features-plugin@^7.14.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.4.tgz#abf888d836a441abee783c75229279748705dc42" + integrity sha512-idr3pthFlDCpV+p/rMgGLGYIVtazeatrSOQk8YzO2pAepIjQhCN3myeihVg58ax2bbbGK9PUE1reFi7axOYIOw== dependencies: - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-member-expression-to-functions" "^7.13.0" + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-function-name" "^7.14.2" + "@babel/helper-member-expression-to-functions" "^7.13.12" "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/helper-replace-supers" "^7.13.0" + "@babel/helper-replace-supers" "^7.14.4" "@babel/helper-split-export-declaration" "^7.12.13" "@babel/helper-create-regexp-features-plugin@^7.12.13": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz#a2ac87e9e319269ac655b8d4415e94d38d663cb7" - integrity sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg== + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.3.tgz#149aa6d78c016e318c43e2409a0ae9c136a86688" + integrity sha512-JIB2+XJrb7v3zceV2XzDhGIB902CmKGSpSl4q2C6agU9SNLG/2V1RtFRGPG1Ajh9STj3+q6zJMOC+N/pp2P9DA== dependencies: "@babel/helper-annotate-as-pure" "^7.12.13" regexpu-core "^4.7.1" -"@babel/helper-define-polyfill-provider@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz#a640051772045fedaaecc6f0c6c69f02bdd34bf1" - integrity sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw== +"@babel/helper-define-polyfill-provider@^0.2.2": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz#0525edec5094653a282688d34d846e4c75e9c0b6" + integrity sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew== dependencies: "@babel/helper-compilation-targets" "^7.13.0" "@babel/helper-module-imports" "^7.12.13" @@ -125,14 +126,14 @@ dependencies: "@babel/types" "^7.13.0" -"@babel/helper-function-name@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a" - integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA== +"@babel/helper-function-name@^7.12.13", "@babel/helper-function-name@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz#397688b590760b6ef7725b5f0860c82427ebaac2" + integrity sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ== dependencies: "@babel/helper-get-function-arity" "^7.12.13" "@babel/template" "^7.12.13" - "@babel/types" "^7.12.13" + "@babel/types" "^7.14.2" "@babel/helper-get-function-arity@^7.12.13": version "7.12.13" @@ -149,7 +150,7 @@ "@babel/traverse" "^7.13.15" "@babel/types" "^7.13.16" -"@babel/helper-member-expression-to-functions@^7.13.0", "@babel/helper-member-expression-to-functions@^7.13.12": +"@babel/helper-member-expression-to-functions@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72" integrity sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw== @@ -163,19 +164,19 @@ dependencies: "@babel/types" "^7.13.12" -"@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.13.14": - version "7.13.14" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz#e600652ba48ccb1641775413cb32cfa4e8b495ef" - integrity sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g== +"@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.14.0", "@babel/helper-module-transforms@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz#ac1cc30ee47b945e3e0c4db12fa0c5389509dfe5" + integrity sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA== dependencies: "@babel/helper-module-imports" "^7.13.12" "@babel/helper-replace-supers" "^7.13.12" "@babel/helper-simple-access" "^7.13.12" "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/helper-validator-identifier" "^7.12.11" + "@babel/helper-validator-identifier" "^7.14.0" "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.13" - "@babel/types" "^7.13.14" + "@babel/traverse" "^7.14.2" + "@babel/types" "^7.14.2" "@babel/helper-optimise-call-expression@^7.12.13": version "7.12.13" @@ -198,17 +199,17 @@ "@babel/helper-wrap-function" "^7.13.0" "@babel/types" "^7.13.0" -"@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.0", "@babel/helper-replace-supers@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz#6442f4c1ad912502481a564a7386de0c77ff3804" - integrity sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw== +"@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.12", "@babel/helper-replace-supers@^7.14.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.4.tgz#b2ab16875deecfff3ddfcd539bc315f72998d836" + integrity sha512-zZ7uHCWlxfEAAOVDYQpEf/uyi1dmeC7fX4nCf2iz9drnCwi1zvwXL3HwWWNXUQEJ1k23yVn3VbddiI9iJEXaTQ== dependencies: "@babel/helper-member-expression-to-functions" "^7.13.12" "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.12" + "@babel/traverse" "^7.14.2" + "@babel/types" "^7.14.4" -"@babel/helper-simple-access@^7.12.13", "@babel/helper-simple-access@^7.13.12": +"@babel/helper-simple-access@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6" integrity sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA== @@ -229,10 +230,10 @@ dependencies: "@babel/types" "^7.12.13" -"@babel/helper-validator-identifier@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" - integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== +"@babel/helper-validator-identifier@^7.12.11", "@babel/helper-validator-identifier@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" + integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== "@babel/helper-validator-option@^7.12.17": version "7.12.17" @@ -249,28 +250,28 @@ "@babel/traverse" "^7.13.0" "@babel/types" "^7.13.0" -"@babel/helpers@^7.13.16": - version "7.13.17" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.13.17.tgz#b497c7a00e9719d5b613b8982bda6ed3ee94caf6" - integrity sha512-Eal4Gce4kGijo1/TGJdqp3WuhllaMLSrW6XcL0ulyUAQOuxHcCafZE8KHg9857gcTehsm/v7RcOx2+jp0Ryjsg== +"@babel/helpers@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.0.tgz#ea9b6be9478a13d6f961dbb5f36bf75e2f3b8f62" + integrity sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg== dependencies: "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.17" - "@babel/types" "^7.13.17" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.14.0" "@babel/highlight@^7.12.13": - version "7.13.10" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1" - integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg== + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" + integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg== dependencies: - "@babel/helper-validator-identifier" "^7.12.11" + "@babel/helper-validator-identifier" "^7.14.0" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.12.13", "@babel/parser@^7.13.16", "@babel/parser@^7.9.4": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.16.tgz#0f18179b0448e6939b1f3f5c4c355a3a9bcdfd37" - integrity sha512-6bAg36mCwuqLO0hbR+z7PHuqWiCeP7Dzg73OpQwsAB1Eb8HnGEz5xYBzCfbu+YjoaJsJs+qheDxVAuqbt3ILEw== +"@babel/parser@^7.12.13", "@babel/parser@^7.14.2", "@babel/parser@^7.14.3", "@babel/parser@^7.9.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.4.tgz#a5c560d6db6cd8e6ed342368dea8039232cbab18" + integrity sha512-ArliyUsWDUqEGfWcmzpGUzNfLxTdTp6WU4IuP6QFSp9gGfWS6boxFCkJSJ/L4+RG8z/FnIU3WxCk6hPL9SSWeA== "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.13.12": version "7.13.12" @@ -281,10 +282,10 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" "@babel/plugin-proposal-optional-chaining" "^7.13.12" -"@babel/plugin-proposal-async-generator-functions@^7.13.15": - version "7.13.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz#80e549df273a3b3050431b148c892491df1bcc5b" - integrity sha512-VapibkWzFeoa6ubXy/NgV5U2U4MVnUlvnx6wo1XhlsaTrLYWE0UFpDQsVrmn22q5CzeloqJ8gEMHSKxuee6ZdA== +"@babel/plugin-proposal-async-generator-functions@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.2.tgz#3a2085abbf5d5f962d480dbc81347385ed62eb1e" + integrity sha512-b1AM4F6fwck4N8ItZ/AtC4FP/cqZqmKRQ4FaTDutwSYyjuhtvsGEMLK4N/ztV/ImP40BjIDyMgBQAeAMsQYVFQ== dependencies: "@babel/helper-plugin-utils" "^7.13.0" "@babel/helper-remap-async-to-generator" "^7.13.0" @@ -298,77 +299,86 @@ "@babel/helper-create-class-features-plugin" "^7.13.0" "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-proposal-dynamic-import@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz#876a1f6966e1dec332e8c9451afda3bebcdf2e1d" - integrity sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ== +"@babel/plugin-proposal-class-static-block@^7.14.3": + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.3.tgz#5a527e2cae4a4753119c3a3e7f64ecae8ccf1360" + integrity sha512-HEjzp5q+lWSjAgJtSluFDrGGosmwTgKwCXdDQZvhKsRlwv3YdkUEqxNrrjesJd+B9E9zvr1PVPVBvhYZ9msjvQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.14.3" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-class-static-block" "^7.12.13" + +"@babel/plugin-proposal-dynamic-import@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.2.tgz#01ebabd7c381cff231fa43e302939a9de5be9d9f" + integrity sha512-oxVQZIWFh91vuNEMKltqNsKLFWkOIyJc95k2Gv9lWVyDfPUQGSSlbDEgWuJUU1afGE9WwlzpucMZ3yDRHIItkA== dependencies: "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-proposal-export-namespace-from@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d" - integrity sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw== +"@babel/plugin-proposal-export-namespace-from@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.2.tgz#62542f94aa9ce8f6dba79eec698af22112253791" + integrity sha512-sRxW3z3Zp3pFfLAgVEvzTFutTXax837oOatUIvSG9o5gRj9mKwm3br1Se5f4QalTQs9x4AzlA/HrCWbQIHASUQ== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz#bf1fb362547075afda3634ed31571c5901afef7b" - integrity sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q== +"@babel/plugin-proposal-json-strings@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.2.tgz#830b4e2426a782e8b2878fbfe2cba85b70cbf98c" + integrity sha512-w2DtsfXBBJddJacXMBhElGEYqCZQqN99Se1qeYn8DVLB33owlrlLftIbMzn5nz1OITfDVknXF433tBrLEAOEjA== dependencies: "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz#93fa78d63857c40ce3c8c3315220fd00bfbb4e1a" - integrity sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A== +"@babel/plugin-proposal-logical-assignment-operators@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.2.tgz#222348c080a1678e0e74ea63fe76f275882d1fd7" + integrity sha512-1JAZtUrqYyGsS7IDmFeaem+/LJqujfLZ2weLR9ugB0ufUPjzf8cguyVT1g5im7f7RXxuLq1xUxEzvm68uYRtGg== dependencies: "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz#3730a31dafd3c10d8ccd10648ed80a2ac5472ef3" - integrity sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.2.tgz#425b11dc62fc26939a2ab42cbba680bdf5734546" + integrity sha512-ebR0zU9OvI2N4qiAC38KIAK75KItpIPTpAtd2r4OZmMFeKbKJpUFLYP2EuDut82+BmYi8sz42B+TfTptJ9iG5Q== dependencies: "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db" - integrity sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w== +"@babel/plugin-proposal-numeric-separator@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.2.tgz#82b4cc06571143faf50626104b335dd71baa4f9e" + integrity sha512-DcTQY9syxu9BpU3Uo94fjCB3LN9/hgPS8oUL7KrSW3bA2ePrKZZPJcc5y0hoJAM9dft3pGfErtEUvxXQcfLxUg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz#5d210a4d727d6ce3b18f9de82cc99a3964eed60a" - integrity sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g== +"@babel/plugin-proposal-object-rest-spread@^7.14.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.4.tgz#0e2b4de419915dc0b409378e829412e2031777c4" + integrity sha512-AYosOWBlyyXEagrPRfLJ1enStufsr7D1+ddpj8OLi9k7B6+NdZ0t/9V7Fh+wJ4g2Jol8z2JkgczYqtWrZd4vbA== dependencies: - "@babel/compat-data" "^7.13.8" - "@babel/helper-compilation-targets" "^7.13.8" + "@babel/compat-data" "^7.14.4" + "@babel/helper-compilation-targets" "^7.14.4" "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.13.0" + "@babel/plugin-transform-parameters" "^7.14.2" -"@babel/plugin-proposal-optional-catch-binding@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz#3ad6bd5901506ea996fc31bdcf3ccfa2bed71107" - integrity sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA== +"@babel/plugin-proposal-optional-catch-binding@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.2.tgz#150d4e58e525b16a9a1431bd5326c4eed870d717" + integrity sha512-XtkJsmJtBaUbOxZsNk0Fvrv8eiqgneug0A6aqLFZ4TSkar2L5dSXWcnUKHgmjJt49pyB/6ZHvkr3dPgl9MOWRQ== dependencies: "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz#ba9feb601d422e0adea6760c2bd6bbb7bfec4866" - integrity sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ== +"@babel/plugin-proposal-optional-chaining@^7.13.12", "@babel/plugin-proposal-optional-chaining@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.2.tgz#df8171a8b9c43ebf4c1dabe6311b432d83e1b34e" + integrity sha512-qQByMRPwMZJainfig10BoaDldx/+VDtNcrA7qdNaEOAj6VXud+gfrkA8j4CRAU5HjnWREXqIpSpH30qZX1xivA== dependencies: "@babel/helper-plugin-utils" "^7.13.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" @@ -382,6 +392,16 @@ "@babel/helper-create-class-features-plugin" "^7.13.0" "@babel/helper-plugin-utils" "^7.13.0" +"@babel/plugin-proposal-private-property-in-object@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.0.tgz#b1a1f2030586b9d3489cc26179d2eb5883277636" + integrity sha512-59ANdmEwwRUkLjB7CRtwJxxwtjESw+X2IePItA+RGQh+oy5RmpCh/EvVVvh5XQc3yxsm5gtv0+i9oBZhaDNVTg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-create-class-features-plugin" "^7.14.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-private-property-in-object" "^7.14.0" + "@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba" @@ -404,6 +424,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-syntax-class-static-block@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.12.13.tgz#8e3d674b0613e67975ceac2776c97b60cafc5c9c" + integrity sha512-ZmKQ0ZXR0nYpHZIIuj9zE7oIqCx2hw9TKi+lIo73NNrMPAZGHfS92/VRV0ZmPj6H2ffBgyFHXvJ5NYsNeEaP2A== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" @@ -467,6 +494,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-private-property-in-object@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.0.tgz#762a4babec61176fec6c88480dec40372b140c0b" + integrity sha512-bda3xF8wGl5/5btF794utNOL0Jw+9jE5C1sLZcoK7c4uonE/y3iQiyG+KbkF3WBV/paX58VCpjhxLPkdj5Fe4w== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-top-level-await@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178" @@ -504,23 +538,23 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-block-scoping@^7.12.13": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.13.16.tgz#a9c0f10794855c63b1d629914c7dcfeddd185892" - integrity sha512-ad3PHUxGnfWF4Efd3qFuznEtZKoBp0spS+DgqzVzRPV7urEBvPLue3y2j80w4Jf2YLzZHj8TOv/Lmvdmh3b2xg== +"@babel/plugin-transform-block-scoping@^7.14.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.4.tgz#caf140b0b2e2462c509553d140e6d0abefb61ed8" + integrity sha512-5KdpkGxsZlTk+fPleDtGKsA+pon28+ptYmMO8GBSa5fHERCJWAzj50uAfCKBqq42HO+Zot6JF1x37CRprwmN4g== dependencies: "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-classes@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz#0265155075c42918bf4d3a4053134176ad9b533b" - integrity sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g== +"@babel/plugin-transform-classes@^7.14.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.4.tgz#a83c15503fc71a0f99e876fdce7dadbc6575ec3a" + integrity sha512-p73t31SIj6y94RDVX57rafVjttNr8MvKEgs5YFatNB/xC68zM3pyosuOEcQmYsYlyQaGY9R7rAULVRcat5FKJQ== dependencies: "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-function-name" "^7.12.13" + "@babel/helper-function-name" "^7.14.2" "@babel/helper-optimise-call-expression" "^7.12.13" "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-replace-supers" "^7.13.0" + "@babel/helper-replace-supers" "^7.14.4" "@babel/helper-split-export-declaration" "^7.12.13" globals "^11.1.0" @@ -531,10 +565,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-destructuring@^7.13.0": - version "7.13.17" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.17.tgz#678d96576638c19d5b36b332504d3fd6e06dea27" - integrity sha512-UAUqiLv+uRLO+xuBKKMEpC+t7YRNVRqBsWWq1yKXbBZBje/t3IXCiSinZhjn/DC3qzBfICeYd2EFGEbHsh5RLA== +"@babel/plugin-transform-destructuring@^7.14.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.4.tgz#acbec502e9951f30f4441eaca1d2f29efade59ed" + integrity sha512-JyywKreTCGTUsL1OKu1A3ms/R1sTP0WxbpXlALeGzF53eB3bxtNkYdMj9SDgK7g6ImPy76J5oYYKoTtQImlhQA== dependencies: "@babel/helper-plugin-utils" "^7.13.0" @@ -590,23 +624,23 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-modules-amd@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz#19f511d60e3d8753cc5a6d4e775d3a5184866cc3" - integrity sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ== +"@babel/plugin-transform-modules-amd@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.2.tgz#6622806fe1a7c07a1388444222ef9535f2ca17b0" + integrity sha512-hPC6XBswt8P3G2D1tSV2HzdKvkqOpmbyoy+g73JG0qlF/qx2y3KaMmXb1fLrpmWGLZYA0ojCvaHdzFWjlmV+Pw== dependencies: - "@babel/helper-module-transforms" "^7.13.0" + "@babel/helper-module-transforms" "^7.14.2" "@babel/helper-plugin-utils" "^7.13.0" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz#7b01ad7c2dcf2275b06fa1781e00d13d420b3e1b" - integrity sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw== +"@babel/plugin-transform-modules-commonjs@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.0.tgz#52bc199cb581e0992edba0f0f80356467587f161" + integrity sha512-EX4QePlsTaRZQmw9BsoPeyh5OCtRGIhwfLquhxGp5e32w+dyL8htOcDwamlitmNFK6xBZYlygjdye9dbd9rUlQ== dependencies: - "@babel/helper-module-transforms" "^7.13.0" + "@babel/helper-module-transforms" "^7.14.0" "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-simple-access" "^7.12.13" + "@babel/helper-simple-access" "^7.13.12" babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-systemjs@^7.13.8": @@ -620,12 +654,12 @@ "@babel/helper-validator-identifier" "^7.12.11" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz#8a3d96a97d199705b9fd021580082af81c06e70b" - integrity sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw== +"@babel/plugin-transform-modules-umd@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.0.tgz#2f8179d1bbc9263665ce4a65f305526b2ea8ac34" + integrity sha512-nPZdnWtXXeY7I87UZr9VlsWme3Y0cfFFE41Wbxz4bbaexAjNMInXPFUpRRUJ8NoMm0Cw+zxbqjdPmLhcjfazMw== dependencies: - "@babel/helper-module-transforms" "^7.13.0" + "@babel/helper-module-transforms" "^7.14.0" "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-transform-named-capturing-groups-regex@^7.12.13": @@ -650,10 +684,10 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/helper-replace-supers" "^7.12.13" -"@babel/plugin-transform-parameters@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz#8fa7603e3097f9c0b7ca1a4821bc2fb52e9e5007" - integrity sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw== +"@babel/plugin-transform-parameters@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.2.tgz#e4290f72e0e9e831000d066427c4667098decc31" + integrity sha512-NxoVmA3APNCC1JdMXkdYXuQS+EMdqy0vIwyDHeKHiJKRxmp1qGSdb0JLEIoPRhkx6H/8Qi3RJ3uqOCYw8giy9A== dependencies: "@babel/helper-plugin-utils" "^7.13.0" @@ -715,11 +749,11 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-transform-typescript@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz#4a498e1f3600342d2a9e61f60131018f55774853" - integrity sha512-elQEwluzaU8R8dbVuW2Q2Y8Nznf7hnjM7+DSCd14Lo5fF63C9qNLbwZYbmZrtV9/ySpSUpkRpQXvJb6xyu4hCQ== + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.4.tgz#1c48829fa6d5f2de646060cd08abb6cda4b521a7" + integrity sha512-WYdcGNEO7mCCZ2XzRlxwGj3PgeAr50ifkofOUC/+IN/GzKLB+biDPVBUAQN2C/dVZTvEXCp80kfQ1FFZPrwykQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.13.0" + "@babel/helper-create-class-features-plugin" "^7.14.4" "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-typescript" "^7.12.13" @@ -739,30 +773,33 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/preset-env@^7.13.15": - version "7.13.15" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.13.15.tgz#c8a6eb584f96ecba183d3d414a83553a599f478f" - integrity sha512-D4JAPMXcxk69PKe81jRJ21/fP/uYdcTZ3hJDF5QX2HSI9bBxxYw/dumdR6dGumhjxlprHPE4XWoPaqzZUVy2MA== + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.4.tgz#73fc3228c59727e5e974319156f304f0d6685a2d" + integrity sha512-GwMMsuAnDtULyOtuxHhzzuSRxFeP0aR/LNzrHRzP8y6AgDNgqnrfCCBm/1cRdTU75tRs28Eh76poHLcg9VF0LA== dependencies: - "@babel/compat-data" "^7.13.15" - "@babel/helper-compilation-targets" "^7.13.13" + "@babel/compat-data" "^7.14.4" + "@babel/helper-compilation-targets" "^7.14.4" "@babel/helper-plugin-utils" "^7.13.0" "@babel/helper-validator-option" "^7.12.17" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.13.12" - "@babel/plugin-proposal-async-generator-functions" "^7.13.15" + "@babel/plugin-proposal-async-generator-functions" "^7.14.2" "@babel/plugin-proposal-class-properties" "^7.13.0" - "@babel/plugin-proposal-dynamic-import" "^7.13.8" - "@babel/plugin-proposal-export-namespace-from" "^7.12.13" - "@babel/plugin-proposal-json-strings" "^7.13.8" - "@babel/plugin-proposal-logical-assignment-operators" "^7.13.8" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8" - "@babel/plugin-proposal-numeric-separator" "^7.12.13" - "@babel/plugin-proposal-object-rest-spread" "^7.13.8" - "@babel/plugin-proposal-optional-catch-binding" "^7.13.8" - "@babel/plugin-proposal-optional-chaining" "^7.13.12" + "@babel/plugin-proposal-class-static-block" "^7.14.3" + "@babel/plugin-proposal-dynamic-import" "^7.14.2" + "@babel/plugin-proposal-export-namespace-from" "^7.14.2" + "@babel/plugin-proposal-json-strings" "^7.14.2" + "@babel/plugin-proposal-logical-assignment-operators" "^7.14.2" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.2" + "@babel/plugin-proposal-numeric-separator" "^7.14.2" + "@babel/plugin-proposal-object-rest-spread" "^7.14.4" + "@babel/plugin-proposal-optional-catch-binding" "^7.14.2" + "@babel/plugin-proposal-optional-chaining" "^7.14.2" "@babel/plugin-proposal-private-methods" "^7.13.0" + "@babel/plugin-proposal-private-property-in-object" "^7.14.0" "@babel/plugin-proposal-unicode-property-regex" "^7.12.13" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.12.13" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-syntax-json-strings" "^7.8.3" @@ -772,14 +809,15 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.0" "@babel/plugin-syntax-top-level-await" "^7.12.13" "@babel/plugin-transform-arrow-functions" "^7.13.0" "@babel/plugin-transform-async-to-generator" "^7.13.0" "@babel/plugin-transform-block-scoped-functions" "^7.12.13" - "@babel/plugin-transform-block-scoping" "^7.12.13" - "@babel/plugin-transform-classes" "^7.13.0" + "@babel/plugin-transform-block-scoping" "^7.14.4" + "@babel/plugin-transform-classes" "^7.14.4" "@babel/plugin-transform-computed-properties" "^7.13.0" - "@babel/plugin-transform-destructuring" "^7.13.0" + "@babel/plugin-transform-destructuring" "^7.14.4" "@babel/plugin-transform-dotall-regex" "^7.12.13" "@babel/plugin-transform-duplicate-keys" "^7.12.13" "@babel/plugin-transform-exponentiation-operator" "^7.12.13" @@ -787,14 +825,14 @@ "@babel/plugin-transform-function-name" "^7.12.13" "@babel/plugin-transform-literals" "^7.12.13" "@babel/plugin-transform-member-expression-literals" "^7.12.13" - "@babel/plugin-transform-modules-amd" "^7.13.0" - "@babel/plugin-transform-modules-commonjs" "^7.13.8" + "@babel/plugin-transform-modules-amd" "^7.14.2" + "@babel/plugin-transform-modules-commonjs" "^7.14.0" "@babel/plugin-transform-modules-systemjs" "^7.13.8" - "@babel/plugin-transform-modules-umd" "^7.13.0" + "@babel/plugin-transform-modules-umd" "^7.14.0" "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13" "@babel/plugin-transform-new-target" "^7.12.13" "@babel/plugin-transform-object-super" "^7.12.13" - "@babel/plugin-transform-parameters" "^7.13.0" + "@babel/plugin-transform-parameters" "^7.14.2" "@babel/plugin-transform-property-literals" "^7.12.13" "@babel/plugin-transform-regenerator" "^7.13.15" "@babel/plugin-transform-reserved-words" "^7.12.13" @@ -806,7 +844,7 @@ "@babel/plugin-transform-unicode-escapes" "^7.12.13" "@babel/plugin-transform-unicode-regex" "^7.12.13" "@babel/preset-modules" "^0.1.4" - "@babel/types" "^7.13.14" + "@babel/types" "^7.14.4" babel-plugin-polyfill-corejs2 "^0.2.0" babel-plugin-polyfill-corejs3 "^0.2.0" babel-plugin-polyfill-regenerator "^0.2.0" @@ -834,9 +872,9 @@ "@babel/plugin-transform-typescript" "^7.13.0" "@babel/runtime@^7.8.4": - version "7.13.17" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.17.tgz#8966d1fc9593bf848602f0662d6b4d0069e3a7ec" - integrity sha512-NCdgJEelPTSh+FEFylhnP1ylq848l1z9t9N0j1Lfbcw0+KXGjsTvUmkxy+voLLXB5SOKMbLLx4jxYliGrYQseA== + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.0.tgz#46794bc20b612c5f75e62dd071e24dfd95f1cbe6" + integrity sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA== dependencies: regenerator-runtime "^0.13.4" @@ -849,32 +887,32 @@ "@babel/parser" "^7.12.13" "@babel/types" "^7.12.13" -"@babel/traverse@^7.13.0", "@babel/traverse@^7.13.13", "@babel/traverse@^7.13.15", "@babel/traverse@^7.13.17": - version "7.13.17" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.17.tgz#c85415e0c7d50ac053d758baec98b28b2ecfeea3" - integrity sha512-BMnZn0R+X6ayqm3C3To7o1j7Q020gWdqdyP50KEoVqaCO2c/Im7sYZSmVgvefp8TTMQ+9CtwuBp0Z1CZ8V3Pvg== +"@babel/traverse@^7.13.0", "@babel/traverse@^7.13.15", "@babel/traverse@^7.14.0", "@babel/traverse@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.2.tgz#9201a8d912723a831c2679c7ebbf2fe1416d765b" + integrity sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA== dependencies: "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.13.16" - "@babel/helper-function-name" "^7.12.13" + "@babel/generator" "^7.14.2" + "@babel/helper-function-name" "^7.14.2" "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/parser" "^7.13.16" - "@babel/types" "^7.13.17" + "@babel/parser" "^7.14.2" + "@babel/types" "^7.14.2" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.14", "@babel/types@^7.13.16", "@babel/types@^7.13.17", "@babel/types@^7.4.4": - version "7.13.17" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.17.tgz#48010a115c9fba7588b4437dd68c9469012b38b4" - integrity sha512-RawydLgxbOPDlTLJNtoIypwdmAy//uQIzlKt2+iBiJaRlVuI6QLUxVAyWGNfOzp8Yu4L4lLIacoCyTNtpb4wiA== +"@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.16", "@babel/types@^7.14.0", "@babel/types@^7.14.2", "@babel/types@^7.14.4", "@babel/types@^7.4.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.4.tgz#bfd6980108168593b38b3eb48a24aa026b919bc0" + integrity sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw== dependencies: - "@babel/helper-validator-identifier" "^7.12.11" + "@babel/helper-validator-identifier" "^7.14.0" to-fast-properties "^2.0.0" "@discord-player/extractor@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@discord-player/extractor/-/extractor-2.0.0.tgz#3879e51d64b72d4dcee9338bdece5251d006c746" - integrity sha512-qNyF0dkLNRYvtVtLLO022RV8DzToCPJqbuAOqSWCSdkXiKSGoqTdKcZI9I/Lb87mchYuuakOXyPRvRwkAruX6w== + version "2.0.2" + resolved "https://registry.yarnpkg.com/@discord-player/extractor/-/extractor-2.0.2.tgz#deb505bf66ed8749ea6eb674e8d53d2feeac0b41" + integrity sha512-Vexx0Fj+x3x5g0ZX7AnFu4SrkFHh4xyg+YGJTAcgF1L7b6CRi10/dH7ejnDTvhMLUG/u+a+TClh4as9PnACNDQ== dependencies: genius-lyrics "^4.2.7" jsdom "^16.5.2" @@ -918,6 +956,17 @@ "@discordjs/node-pre-gyp" "^0.3.2" node-addon-api "^3.1.0" +"@discordjs/voice@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@discordjs/voice/-/voice-0.3.0.tgz#1ec84c49e8d69ff4c64ffdf05c39e6599ada7907" + integrity sha512-jPtzfjCmHe1JmWbwsQ7YYfSHBaglVy5ewDROL4BQpyA60Dpo54ksB0Hv1T2L/B7tRM5nCMo5PDuElaZOBqaTmA== + dependencies: + "@types/ws" "^7.4.4" + discord-api-types "^0.18.1" + prism-media "^1.2.9" + tiny-typed-emitter "^2.0.3" + ws "^7.4.4" + "@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents": version "2.1.8-no-fsevents" resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.tgz#da7c3996b8e6e19ebd14d82eaced2313e7769f9b" @@ -935,20 +984,30 @@ readdirp "^2.2.1" upath "^1.1.1" +"@sapphire/async-queue@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.1.3.tgz#fbc70f2687a2473bd824a4723e962dfce933eba7" + integrity sha512-pyV+0njfBq6rHKEOpux5xy2cEM5u9KFjVzpmKsgk/8mdslLCuNXX4QvxWsSerLq/EtLhkvvl998cdFbGtpHa9Q== + "@tootallnate/once@1": version "1.1.2" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== -"@types/node@*", "@types/node@^14.14.41": - version "14.14.41" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.41.tgz#d0b939d94c1d7bd53d04824af45f1139b8c45615" - integrity sha512-dueRKfaJL4RTtSa7bWeTK1M+VH+Gns73oCgzvYfHZywRCoPSd8EkXBL0mZ9unPTveBn+D9phZBaxuzpwjWkW0g== +"@types/node@*": + version "15.12.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.12.2.tgz#1f2b42c4be7156ff4a6f914b2fb03d05fa84e38d" + integrity sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww== -"@types/ws@^7.4.1": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.1.tgz#49eacb15a0534663d53a36fbf5b4d98f5ae9a73a" - integrity sha512-ISCK1iFnR+jYv7+jLNX0wDqesZ/5RAeY3wUx6QaphmocphU61h+b+PHjS18TF4WIPTu/MMzxIq2PHr32o2TS5Q== +"@types/node@^14.14.41": + version "14.17.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.3.tgz#6d327abaa4be34a74e421ed6409a0ae2f47f4c3d" + integrity sha512-e6ZowgGJmTuXa3GyaPbTGxX17tnThl2aSSizrFthQ7m9uLGZBXiGhgE55cjRZTF5kjZvYn9EOPOMljdjwbflxw== + +"@types/ws@^7.4.1", "@types/ws@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.4.tgz#93e1e00824c1de2608c30e6de4303ab3b4c0c9bc" + integrity sha512-d/7W23JAXPodQNbOZNXvl2K+bqAQrCMwlh/nuQsPSQk6Fq0opHoPrUw43aHsvSbIiQPr8Of2hkFbnz1XBFVyZQ== dependencies: "@types/node" "*" @@ -992,10 +1051,10 @@ acorn@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.1.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.1.1.tgz#fb0026885b9ac9f48bac1e185e4af472971149ff" - integrity sha512-xYiIVjNuqtKXMxlRMDc6mZUhXehod4a3gbZ1qRlM7icK4EbxUFNLhWoPblCvFtB2Y9CIqHP3CF/rdxLItaQv8g== +acorn@^8.2.4: + version "8.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.3.0.tgz#1193f9b96c4e8232f00b11a9edff81b2c8b98b88" + integrity sha512-tqPKHZ5CaBJw0Xmy0ZZvLs1qTV+BNFSyvn77ASXkpBNfIRk8ev26fKrD9iLGwGA9zedPao52GSHzq8lyZG0NUw== agent-base@6: version "6.0.2" @@ -1004,7 +1063,7 @@ agent-base@6: dependencies: debug "4" -ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3: +ajv@^6.10.0, ajv@^6.10.2: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1133,27 +1192,15 @@ array-back@^3.0.1: integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== array-back@^4.0.0, array-back@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.1.tgz#9b80312935a52062e1a233a9c7abeb5481b30e90" - integrity sha512-Z/JnaVEXv+A9xabHzN43FiiiWEE7gPCRXMrVmRm00tWbjZRul1iHm7ECzlyNq1p4a4ATXz+G9FJ3GqGOkOV3fg== + version "4.0.2" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" + integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" @@ -1179,16 +1226,6 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== - axios@^0.21.1: version "0.21.1" resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" @@ -1204,33 +1241,33 @@ babel-plugin-dynamic-import-node@^2.3.3: object.assign "^4.1.0" babel-plugin-polyfill-corejs2@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.0.tgz#686775bf9a5aa757e10520903675e3889caeedc4" - integrity sha512-9bNwiR0dS881c5SHnzCmmGlMkJLl0OUZvxrxHo9w/iNoRuqaPjqlvBf4HrovXtQs/au5yKkpcdgfT1cC5PAZwg== + version "0.2.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327" + integrity sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ== dependencies: "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.2.0" + "@babel/helper-define-polyfill-provider" "^0.2.2" semver "^6.1.1" babel-plugin-polyfill-corejs3@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz#f4b4bb7b19329827df36ff56f6e6d367026cb7a2" - integrity sha512-zZyi7p3BCUyzNxLx8KV61zTINkkV65zVkDAFNZmrTCRVhjo1jAS+YLvDJ9Jgd/w2tsAviCwFHReYfxO3Iql8Yg== + version "0.2.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.2.tgz#7424a1682ee44baec817327710b1b094e5f8f7f5" + integrity sha512-l1Cf8PKk12eEk5QP/NQ6TH8A1pee6wWDJ96WjxrMXFLHLOBFzYM4moG80HFgduVhTqAFez4alnZKEhP/bYHg0A== dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.0" + "@babel/helper-define-polyfill-provider" "^0.2.2" core-js-compat "^3.9.1" babel-plugin-polyfill-regenerator@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz#853f5f5716f4691d98c84f8069c7636ea8da7ab8" - integrity sha512-J7vKbCuD2Xi/eEHxquHN14bXAW9CXtecwuLrOIDJtcZzTaPzV1VdEfoUf9AzcRBMolKUQKM9/GVojeh0hFiqMg== + version "0.2.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz#b310c8d642acada348c1fa3b3e6ce0e851bee077" + integrity sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.0" + "@babel/helper-define-polyfill-provider" "^0.2.2" balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base@^0.11.1: version "0.11.2" @@ -1245,13 +1282,6 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - binary-extensions@^1.0.0: version "1.13.1" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" @@ -1308,14 +1338,14 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserslist@^4.14.5, browserslist@^4.16.4: - version "4.16.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.4.tgz#7ebf913487f40caf4637b892b268069951c35d58" - integrity sha512-d7rCxYV8I9kj41RH8UKYnvDYCRENUlHRgyXy/Rhr/1BaeLGfiCptEdFE8MIrvGfWbBFNjVYx76SQWvNX1j+/cQ== +browserslist@^4.16.6: + version "4.16.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== dependencies: - caniuse-lite "^1.0.30001208" + caniuse-lite "^1.0.30001219" colorette "^1.2.2" - electron-to-chromium "^1.3.712" + electron-to-chromium "^1.3.723" escalade "^3.1.1" node-releases "^1.1.71" @@ -1366,22 +1396,17 @@ camelcase@^5.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@^1.0.30001208: - version "1.0.30001214" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001214.tgz#70f153c78223515c6d37a9fde6cd69250da9d872" - integrity sha512-O2/SCpuaU3eASWVaesQirZv1MSjUNOvmugaD8zNSJqw6Vv5SGwoOpA9LJs3pNPfM745nxqPvfZY3MQKY4AKHYg== +caniuse-lite@^1.0.30001219: + version "1.0.30001236" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001236.tgz#0a80de4cdf62e1770bb46a30d884fc8d633e3958" + integrity sha512-o0PRQSrSCGJKCPZcgMzl5fUaj5xHe8qA2m4QRvnyY4e1lITqoNkr7q/Oh1NcpGSy0Th97UZ35yoKcINPoq7YOQ== -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - -catharsis@^0.8.11: - version "0.8.11" - resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.8.11.tgz#d0eb3d2b82b7da7a3ce2efb1a7b00becc6643468" - integrity sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g== +catharsis@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.9.0.tgz#40382a168be0e6da308c277d3a2b3eb40c7d2121" + integrity sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A== dependencies: - lodash "^4.17.14" + lodash "^4.17.15" chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0: version "2.4.2" @@ -1393,9 +1418,9 @@ chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0: supports-color "^5.3.0" chalk@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + version "4.1.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" + integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" @@ -1405,29 +1430,29 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -cheerio-select-tmp@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/cheerio-select-tmp/-/cheerio-select-tmp-0.1.1.tgz#55bbef02a4771710195ad736d5e346763ca4e646" - integrity sha512-YYs5JvbpU19VYJyj+F7oYrIE2BOll1/hRU7rEy/5+v9BzkSo3bK81iAeeQEMI92vRIxz677m72UmJUiVwwgjfQ== +cheerio-select@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-1.5.0.tgz#faf3daeb31b17c5e1a9dabcee288aaf8aafa5823" + integrity sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg== dependencies: - css-select "^3.1.2" - css-what "^4.0.0" - domelementtype "^2.1.0" - domhandler "^4.0.0" - domutils "^2.4.4" + css-select "^4.1.3" + css-what "^5.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + domutils "^2.7.0" -cheerio@^1.0.0-rc.3: - version "1.0.0-rc.5" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.5.tgz#88907e1828674e8f9fee375188b27dadd4f0fa2f" - integrity sha512-yoqps/VCaZgN4pfXtenwHROTp8NG6/Hlt4Jpz2FEP0ZJQ+ZUkVDd0hAPDNKhj3nakpfPt/CNs57yEtxD1bXQiw== +cheerio@^1.0.0-rc.9: + version "1.0.0-rc.10" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.10.tgz#2ba3dcdfcc26e7956fc1f440e61d51c643379f3e" + integrity sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw== dependencies: - cheerio-select-tmp "^0.1.0" - dom-serializer "~1.2.0" - domhandler "^4.0.0" - entities "~2.1.0" - htmlparser2 "^6.0.0" - parse5 "^6.0.0" - parse5-htmlparser2-tree-adapter "^6.0.0" + cheerio-select "^1.5.0" + dom-serializer "^1.3.2" + domhandler "^4.2.0" + htmlparser2 "^6.1.0" + parse5 "^6.0.1" + parse5-htmlparser2-tree-adapter "^6.0.1" + tslib "^2.2.0" chokidar@^3.4.0: version "3.5.1" @@ -1530,7 +1555,7 @@ colorette@^1.2.2: resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== -combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: +combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -1618,19 +1643,19 @@ copy-descriptor@^0.1.0: integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= core-js-compat@^3.9.0, core-js-compat@^3.9.1: - version "3.10.2" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.10.2.tgz#0a675b4e1cde599616322a72c8886bcf696f3ec3" - integrity sha512-IGHnpuaM1N++gLSPI1F1wu3WXICPxSyj/Q++clcwsIOnUVp5uKUIPl/+6h0TQ112KU3fMiSxqJuM+OrCyKj5+A== + version "3.14.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.14.0.tgz#b574dabf29184681d5b16357bd33d104df3d29a5" + integrity sha512-R4NS2eupxtiJU+VwgkF9WTpnSfZW4pogwKHd8bclWU2sp93Pr5S1uYJI84cMOubJRou7bcfL0vmwtLslWN5p3A== dependencies: - browserslist "^4.16.4" + browserslist "^4.16.6" semver "7.0.0" -core-util-is@1.0.2, core-util-is@~1.0.0: +core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cross-fetch@^3.0.5: +cross-fetch@~3.1.4: version "3.1.4" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.4.tgz#9723f3a3a247bf8b89039f3a380a9244e8fa2f39" integrity sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ== @@ -1648,21 +1673,21 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -css-select@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-3.1.2.tgz#d52cbdc6fee379fba97fb0d3925abbd18af2d9d8" - integrity sha512-qmss1EihSuBNWNNhHjxzxSfJoFBM/lERB/Q4EnsJQQC62R2evJDW481091oAdOr9uh46/0n4nrg0It5cAnj1RA== +css-select@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.1.3.tgz#a70440f70317f2669118ad74ff105e65849c7067" + integrity sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA== dependencies: boolbase "^1.0.0" - css-what "^4.0.0" - domhandler "^4.0.0" - domutils "^2.4.3" + css-what "^5.0.0" + domhandler "^4.2.0" + domutils "^2.6.0" nth-check "^2.0.0" -css-what@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-4.0.0.tgz#35e73761cab2eeb3d3661126b23d7aa0e8432233" - integrity sha512-teijzG7kwYfNVsUh2H/YN62xW3KK9YhXEgSlbxMlcyjPNvdKJqFx5lrwlJgoFP1ZHlB89iGDlo/JyshKeRhv5A== +css-what@^5.0.0, css-what@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.0.1.tgz#3efa820131f4669a8ac2408f9c32e7c7de9f4cad" + integrity sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg== cssom@^0.4.4: version "0.4.4" @@ -1681,13 +1706,6 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" - data-urls@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" @@ -1785,12 +1803,17 @@ diff@^4.0.1: resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -discord-ytdl-core@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/discord-ytdl-core/-/discord-ytdl-core-5.0.2.tgz#28fb8712af8b5fda34f20800d2226b556e700422" - integrity sha512-tuu+skr0cA89Li7sCH+L1p3TwdfSOunmC9BFzSa0Jj567B1F2leVVbjKQ5ZKpsW1cXKv0fh0PdQA2/Fnu6WcQA== +discord-api-types@^0.18.1: + version "0.18.1" + resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.18.1.tgz#5d08ed1263236be9c21a22065d0e6b51f790f492" + integrity sha512-hNC38R9ZF4uaujaZQtQfm5CdQO58uhdkoHQAVvMfIL0LgOSZeW575W8H6upngQOuoxWd8tiRII3LLJm9zuQKYg== + +discord-ytdl-core@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/discord-ytdl-core/-/discord-ytdl-core-5.0.3.tgz#a31560f0bede41d6fc969377083ae958deac2b72" + integrity sha512-q4GOEFiV19l0OcPezXnkDWualf+n96LcbTEWReceiDHdx4xxn5CXZX9PR4iDTXQR3Kv2VUkwB8RO8dI50d88vQ== dependencies: - prism-media "^1.2.7" + prism-media "^1.2.9" discord.js-docgen@discordjs/docgen#ts-patch: version "0.9.0" @@ -1802,17 +1825,21 @@ discord.js-docgen@discordjs/docgen#ts-patch: tsubaki "^1.3.2" yargs "^14.0.0" -discord.js@discordjs/discord.js: - version "12.5.0" - resolved "https://codeload.github.com/discordjs/discord.js/tar.gz/0e40f9b86826ba50aa3840807fb86e1bce6b1c3d" +discord.js@^13.0.0-dev.dda5ee2e9f0839d3e42d25114ae1b47355cdfd27: + version "13.0.0-dev.dda5ee2e9f0839d3e42d25114ae1b47355cdfd27" + resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0-dev.dda5ee2e9f0839d3e42d25114ae1b47355cdfd27.tgz#aa3d76500ec2d27a5ba87bac10e3ff1979fdb6ec" + integrity sha512-2NU/APbSBQAVuFk246S8a+Z/9gH0SkWlLRql1IpBONTArJVlvkJ8hkC+69TE59CUlHJhOMo44M8r7gmRZheE0g== dependencies: "@discordjs/collection" "^0.1.6" "@discordjs/form-data" "^3.0.1" + "@sapphire/async-queue" "^1.1.2" + "@types/ws" "^7.4.4" abort-controller "^3.0.0" + discord-api-types "^0.18.1" node-fetch "^2.6.1" - prism-media "^1.2.2" + prism-media "^1.2.9" tweetnacl "^1.0.3" - ws "^7.3.1" + ws "^7.4.6" dmd@^4.0.5: version "4.0.6" @@ -1839,16 +1866,16 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-serializer@^1.0.1, dom-serializer@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.2.0.tgz#3433d9136aeb3c627981daa385fc7f32d27c48f1" - integrity sha512-n6kZFH/KlCrqs/1GHMOd5i2fd/beQHuehKdWvNNffbGHTr/almdhuVvTVFb3V7fglz+nC50fFusu3lY33h12pA== +dom-serializer@^1.0.1, dom-serializer@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" + integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== dependencies: domelementtype "^2.0.1" - domhandler "^4.0.0" + domhandler "^4.2.0" entities "^2.0.0" -domelementtype@^2.0.1, domelementtype@^2.1.0, domelementtype@^2.2.0: +domelementtype@^2.0.1, domelementtype@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== @@ -1860,34 +1887,26 @@ domexception@^2.0.1: dependencies: webidl-conversions "^5.0.0" -domhandler@^4.0.0, domhandler@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.1.0.tgz#c1d8d494d5ec6db22de99e46a149c2a4d23ddd43" - integrity sha512-/6/kmsGlMY4Tup/nGVutdrK9yQi4YjWVcVeoQmixpzjOUK1U7pQkvAPHBJeUxOgxF0J8f8lwCJSlCfD0V4CMGQ== +domhandler@^4.0.0, domhandler@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.0.tgz#f9768a5f034be60a89a27c2e4d0f74eba0d8b059" + integrity sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA== dependencies: domelementtype "^2.2.0" -domutils@^2.4.3, domutils@^2.4.4: - version "2.5.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.5.1.tgz#9b8e84b5d9f788499ae77506ea832e9b4f9aa1c0" - integrity sha512-hO1XwHMGAthA/1KL7c83oip/6UWo3FlUNIuWiWKltoiQ5oCOiqths8KknvY2jpOohUoUgnwa/+Rm7UpwpSbY/Q== +domutils@^2.5.2, domutils@^2.6.0, domutils@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.7.0.tgz#8ebaf0c41ebafcf55b0b72ec31c56323712c5442" + integrity sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg== dependencies: dom-serializer "^1.0.1" domelementtype "^2.2.0" - domhandler "^4.1.0" + domhandler "^4.2.0" -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -electron-to-chromium@^1.3.712: - version "1.3.718" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.718.tgz#a192981ced608978410ebc011e24ecab1bb4beb3" - integrity sha512-CikzdUSShGXwjq1pcW740wK8j+KbazgHZiwzlHICejDaczM6OVsPcrZmBHPwzj9i2rj5twg20MBwp+cYZwldYA== +electron-to-chromium@^1.3.723: + version "1.3.750" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.750.tgz#7e5ef6f478316b0bd656af5942fe502610e97eaf" + integrity sha512-Eqy9eHNepZxJXT+Pc5++zvEi5nQ6AGikwFYDCYwXUFBr+ynJ6pDG7MzZmwGYCIuXShLJM0n4bq+aoKDmvSGJ8A== emoji-regex@^7.0.1: version "7.0.3" @@ -1909,11 +1928,6 @@ entities@~2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== -entities@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" - integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== - escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -2080,11 +2094,6 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - external-editor@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" @@ -2108,16 +2117,6 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= - fast-deep-equal@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -2209,27 +2208,22 @@ flatted@^2.0.0: integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== follow-redirects@^1.10.0: - version "1.13.3" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.3.tgz#e5598ad50174c1bc4e872301e82ac2cd97f90267" - integrity sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA== + version "1.14.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43" + integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg== for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== dependencies: asynckit "^0.4.0" - combined-stream "^1.0.6" + combined-stream "^1.0.8" mime-types "^2.1.12" fragment-cache@^0.2.1: @@ -2291,12 +2285,12 @@ gauge@~2.7.3: wide-align "^1.1.0" genius-lyrics@^4.2.7: - version "4.2.7" - resolved "https://registry.yarnpkg.com/genius-lyrics/-/genius-lyrics-4.2.7.tgz#e85f65eb2de4ea2c0af1e11b13dda11e0c9744a9" - integrity sha512-laoeF2/P+Ed4uewuG6OeqymKTNdfGuymkCohMHIgr3g2DwziW49USXcEGCog1vnEDCpf2LhznNi3WOeLeSmAww== + version "4.2.9" + resolved "https://registry.yarnpkg.com/genius-lyrics/-/genius-lyrics-4.2.9.tgz#87d12946589d3e96df4e100c51805aa5046de2c7" + integrity sha512-BQm/gmaXEckLAc/Z9ZsGNWxh4CHudx0G1Key8Rnv0xFcqmrxIvssJIDBgDPJLqB6dpVas3uj6LQng1yMFtxfNA== dependencies: axios "^0.21.1" - node-html-parser "^3.0.4" + cheerio "^1.0.0-rc.9" gensync@^1.0.0-beta.2: version "1.0.0-beta.2" @@ -2322,13 +2316,6 @@ get-value@^2.0.3, get-value@^2.0.6: resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" - glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -2345,9 +2332,9 @@ glob-parent@^5.0.0, glob-parent@~5.1.0: is-glob "^4.0.1" glob@^7.0.0, glob@^7.1.1, glob@^7.1.3, glob@^7.1.5: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -2385,19 +2372,6 @@ handlebars@^4.5.3: optionalDependencies: uglify-js "^3.1.4" -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -2456,12 +2430,7 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -he@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -himalaya@^1.1.0: +himalaya@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/himalaya/-/himalaya-1.1.0.tgz#31724ae9d35714cd7c6f4be94888953f3604606a" integrity sha512-LLase1dHCRMel68/HZTFft0N0wti0epHr3nNY7ynpLbyZpmrKMQ8YIpiOV77TM97cNpC8Wb2n6f66IRggwdWPw== @@ -2473,14 +2442,14 @@ html-encoding-sniffer@^2.0.1: dependencies: whatwg-encoding "^1.0.5" -htmlparser2@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.0.1.tgz#422521231ef6d42e56bd411da8ba40aa36e91446" - integrity sha512-GDKPd+vk4jvSuvCbyuzx/unmXkk090Azec7LovXP8as1Hn8q9p3hbjmDGbUqqhknw0ajwit6LiiWqfiTUPMK7w== +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== dependencies: domelementtype "^2.0.1" domhandler "^4.0.0" - domutils "^2.4.4" + domutils "^2.5.2" entities "^2.0.0" http-proxy-agent@^4.0.1: @@ -2492,14 +2461,13 @@ http-proxy-agent@^4.0.1: agent-base "6" debug "4" -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" + agent-base "6" + debug "4" iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" @@ -2592,9 +2560,9 @@ is-buffer@^1.1.5: integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-core-module@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" - integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== + version "2.4.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" + integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== dependencies: has "^1.0.3" @@ -2697,16 +2665,11 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-potential-custom-element-name@^1.0.0: +is-potential-custom-element-name@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -2722,11 +2685,6 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -iso8601-duration@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/iso8601-duration/-/iso8601-duration-1.3.0.tgz#29d7b69e0574e4acdee50c5e5e09adab4137ba5a" - integrity sha512-K4CiUBzo3YeWk76FuET/dQPH03WE04R94feo5TSKQCXpoXQt9E4yx2CnY737QZnSAI3PI4WlKo/zfqizGx52QQ== - isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" @@ -2739,11 +2697,6 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -2764,11 +2717,6 @@ js2xmlparser@^4.0.1: dependencies: xmlcreate "^2.0.3" -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - jsdoc-api@^5.0.4: version "5.0.4" resolved "https://registry.yarnpkg.com/jsdoc-api/-/jsdoc-api-5.0.4.tgz#6b60cddaa4e7ff9a2e139acfc19ecaa9c48f8575" @@ -2823,32 +2771,32 @@ jsdoc-to-markdown@^5.0.1: walk-back "^4.0.0" jsdoc@^3.6.3: - version "3.6.6" - resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-3.6.6.tgz#9fe162bbdb13ee7988bf74352b5147565bcfd8e1" - integrity sha512-znR99e1BHeyEkSvgDDpX0sTiTu+8aQyDl9DawrkOGZTTW8hv0deIFXx87114zJ7gRaDZKVQD/4tr1ifmJp9xhQ== + version "3.6.7" + resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-3.6.7.tgz#00431e376bed7f9de4716c6f15caa80e64492b89" + integrity sha512-sxKt7h0vzCd+3Y81Ey2qinupL6DpRSZJclS04ugHDNmRUXGzqicMJ6iwayhSA0S0DwwX30c5ozyUthr1QKF6uw== dependencies: "@babel/parser" "^7.9.4" bluebird "^3.7.2" - catharsis "^0.8.11" + catharsis "^0.9.0" escape-string-regexp "^2.0.0" js2xmlparser "^4.0.1" klaw "^3.0.0" markdown-it "^10.0.0" markdown-it-anchor "^5.2.7" - marked "^0.8.2" + marked "^2.0.3" mkdirp "^1.0.4" requizzle "^0.2.3" strip-json-comments "^3.1.0" taffydb "2.6.2" - underscore "~1.10.2" + underscore "~1.13.1" jsdom@^16.5.2: - version "16.5.3" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.5.3.tgz#13a755b3950eb938b4482c407238ddf16f0d2136" - integrity sha512-Qj1H+PEvUsOtdPJ056ewXM4UJPCi4hhLA8wpiz9F2YvsRBhuFsXxtrIFAgGBDynQA9isAMGE91PfUYbdMPXuTA== + version "16.6.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.6.0.tgz#f79b3786682065492a3da6a60a4695da983805ac" + integrity sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg== dependencies: abab "^2.0.5" - acorn "^8.1.0" + acorn "^8.2.4" acorn-globals "^6.0.0" cssom "^0.4.4" cssstyle "^2.3.0" @@ -2856,12 +2804,13 @@ jsdom@^16.5.2: decimal.js "^10.2.1" domexception "^2.0.1" escodegen "^2.0.0" + form-data "^3.0.0" html-encoding-sniffer "^2.0.1" - is-potential-custom-element-name "^1.0.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" nwsapi "^2.2.0" parse5 "6.0.1" - request "^2.88.2" - request-promise-native "^1.0.9" saxes "^5.0.1" symbol-tree "^3.2.4" tough-cookie "^4.0.0" @@ -2871,7 +2820,7 @@ jsdom@^16.5.2: whatwg-encoding "^1.0.5" whatwg-mimetype "^2.3.0" whatwg-url "^8.5.0" - ws "^7.4.4" + ws "^7.4.5" xml-name-validator "^3.0.0" jsesc@^2.5.1: @@ -2889,21 +2838,11 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= - json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - json5@^2.1.2: version "2.2.0" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" @@ -2911,16 +2850,6 @@ json5@^2.1.2: dependencies: minimist "^1.2.5" -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -3000,7 +2929,7 @@ lodash.pick@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= -lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.7.0: +lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -3012,10 +2941,10 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -m3u8stream@^0.8.0, m3u8stream@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/m3u8stream/-/m3u8stream-0.8.3.tgz#c4624e92b4240eb356d040c4a5e155586cf58108" - integrity sha512-0nAcdrF8YJKUkb6PzWdvGftTPyCVWgoiot1AkNVbPKTeIGsWs6DrOjifrJ0Zi8WQfQmD2SuVCjkYIOip12igng== +m3u8stream@^0.8.3: + version "0.8.4" + resolved "https://registry.yarnpkg.com/m3u8stream/-/m3u8stream-0.8.4.tgz#15b49d0c2b510755ea43c1e53f85d7aaa4dc65c2" + integrity sha512-sco80Db+30RvcaIOndenX6E6oQNgTiBKeJbFPc+yDXwPQIkryfboEbCvXPlBRq3mQTCVPQO93TDVlfRwqpD35w== dependencies: miniget "^4.0.0" sax "^1.2.4" @@ -3068,10 +2997,10 @@ marked@^0.7.0: resolved "https://registry.yarnpkg.com/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e" integrity sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg== -marked@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/marked/-/marked-0.8.2.tgz#4faad28d26ede351a7a1aaa5fec67915c869e355" - integrity sha512-EGwzEeCcLniFX51DhTpmTom+dSA/MG/OBUDjnWtHbEnjAH180VzUeAw+oE4+Zv+CoYBWyRlYOTR0N8SO9R1PVw== +marked@^2.0.3: + version "2.0.7" + resolved "https://registry.yarnpkg.com/marked/-/marked-2.0.7.tgz#bc5b857a09071b48ce82a1f7304913a993d4b7d1" + integrity sha512-BJXxkuIfJchcXOJWTT2DOL+yFWifFv2yGYOUzvXg8Qz610QKw+sHCvTMYwA+qWGhlA2uivBezChZ/pBy1tWdkQ== mdurl@^1.0.1: version "1.0.1" @@ -3097,17 +3026,17 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" -mime-db@1.47.0: - version "1.47.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" - integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== +mime-db@1.48.0: + version "1.48.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d" + integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== -mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.30" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" - integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg== +mime-types@^2.1.12: + version "2.1.31" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b" + integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg== dependencies: - mime-db "1.47.0" + mime-db "1.48.0" mimic-fn@^2.1.0: version "2.1.0" @@ -3115,9 +3044,9 @@ mimic-fn@^2.1.0: integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== miniget@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/miniget/-/miniget-4.2.0.tgz#0004e95536b192d95a7d09f4435d67b9285481d0" - integrity sha512-IzTOaNgBw/qEpzkPTE7X2cUVXQfSKbG8w52Emi93zb+Zya2ZFrbmavpixzebuDJD9Ku4ecbaFlC7Y1cEESzQtQ== + version "4.2.1" + resolved "https://registry.yarnpkg.com/miniget/-/miniget-4.2.1.tgz#11a1c24817a059e292378eb9cff4328d9240c665" + integrity sha512-O/DduzDR6f+oDtVype9S/Qu5hhnx73EDYGyZKwU/qN82lehFZdfhoa4DT51SpsO+8epYrB3gcRmws56ROfTIoQ== minimatch@^3.0.4: version "3.0.4" @@ -3218,28 +3147,20 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -node-addon-api@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.1.0.tgz#98b21931557466c6729e51cb77cd39c965f42239" - integrity sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw== +node-addon-api@*, node-addon-api@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" + integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== node-fetch@2.6.1, node-fetch@^2.6.0, node-fetch@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== -node-html-parser@^3.0.4: - version "3.1.5" - resolved "https://registry.yarnpkg.com/node-html-parser/-/node-html-parser-3.1.5.tgz#ffb62f2a336b6b634f41f3315487fe446fb9d7b5" - integrity sha512-/XKKdWbSUymlXTjtNBcDlmM7Jp8S/BqGMzLx7r2bd2NMjTXz+ofuLcz0Bl3VT0vTvVzF+N511FNLrZt4HVitXA== - dependencies: - css-select "^3.1.2" - he "1.2.0" - node-releases@^1.1.71: - version "1.1.71" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" - integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== + version "1.1.73" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.73.tgz#dd4e81ddd5277ff846b80b52bb40c49edf7a7b20" + integrity sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg== nopt@^5.0.0: version "5.0.0" @@ -3287,11 +3208,6 @@ nwsapi@^2.2.0: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -3402,14 +3318,14 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse5-htmlparser2-tree-adapter@^6.0.0: +parse5-htmlparser2-tree-adapter@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== dependencies: parse5 "^6.0.1" -parse5@6.0.1, parse5@^6.0.0, parse5@^6.0.1: +parse5@6.0.1, parse5@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== @@ -3440,19 +3356,14 @@ path-key@^2.0.1: integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== picomatch@^2.0.4, picomatch@^2.2.1: - version "2.2.3" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.3.tgz#465547f359ccc206d3c48e46a1bcb89bf7ee619d" - integrity sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg== + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== pify@^4.0.1: version "4.0.1" @@ -3470,11 +3381,11 @@ prelude-ls@~1.1.2: integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= prettier@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" - integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== + version "2.3.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.1.tgz#76903c3f8c4449bc9ac597acefa24dc5ad4cbea6" + integrity sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA== -prism-media@^1.2.2, prism-media@^1.2.7: +prism-media@^1.2.9: version "1.2.9" resolved "https://registry.yarnpkg.com/prism-media/-/prism-media-1.2.9.tgz#8d4f97b36efdfc82483eb8d3db64020767866f36" integrity sha512-UHCYuqHipbTR1ZsXr5eg4JUmHER8Ss4YEb9Azn+9zzJ7/jlTtD1h0lc4g6tNx3eMlB8Mp6bfll0LPMAV4R6r3Q== @@ -3489,7 +3400,7 @@ progress@^2.0.0: resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== -psl@^1.1.28, psl@^1.1.33: +psl@^1.1.33: version "1.8.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== @@ -3499,11 +3410,6 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== - readable-stream@^2.0.2, readable-stream@^2.0.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" @@ -3546,9 +3452,9 @@ reduce-flatten@^1.0.1: integrity sha1-JYx479FT3fk8tWEjf2EYTzaW4yc= reduce-flatten@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-3.0.0.tgz#da477d68453fd9510f9a5fbef86e0fa04b4fd315" - integrity sha512-eczl8wAYBxJ6Egl6I1ECIF+8z6sHu+KE7BzaEDZTpPXKXfy9SUDQlVYwkRcNTjJLC3Iakxbhss50KuT/R6SYfg== + version "3.0.1" + resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-3.0.1.tgz#3db6b48ced1f4dbe4f4f5e31e422aa9ff0cd21ba" + integrity sha512-bYo+97BmUUOzg09XwfkwALt4PQH1M5L0wzKerBt6WLm3Fhdd43mMS89HiT1B9pJIqko/6lWx3OnV4J9f2Kqp5Q== reduce-unique@^2.0.1: version "2.0.1" @@ -3638,48 +3544,6 @@ repeat-string@^1.6.1: resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= -request-promise-core@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" - integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== - dependencies: - lodash "^4.17.19" - -request-promise-native@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" - integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== - dependencies: - request-promise-core "1.1.4" - stealthy-require "^1.1.1" - tough-cookie "^2.3.3" - -request@^2.88.2: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -3761,11 +3625,6 @@ rxjs@^6.6.0: dependencies: tslib "^1.9.0" -safe-buffer@^5.0.1, safe-buffer@^5.1.2: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -3778,7 +3637,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -3849,14 +3708,6 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== -simple-youtube-api@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/simple-youtube-api/-/simple-youtube-api-5.2.1.tgz#d1f6efb941ce404f50ce56e0c5e6bff249fcac6a" - integrity sha512-vmndP9Bkh35tifn2OwY+th2imSsfYtmDqczgdOW5yEARFzvSoR8VSQFsivJnctfV5QHQUL6VrOpNdbmDRLh9Bg== - dependencies: - iso8601-duration "^1.2.0" - node-fetch "^2.6.0" - slash@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" @@ -3901,6 +3752,13 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" +sodium@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/sodium/-/sodium-3.0.2.tgz#4dbd7eb4a21c92ca7e7f684756cd733fee78112e" + integrity sha512-IsTwTJeoNBU97km3XkrbCGC/n/9aUQejgD3QPr2YY2gtbSPru3TI6nhCqgoez9Mv88frF9oVZS/jrXFbd6WXyA== + dependencies: + node-addon-api "*" + sort-array@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/sort-array/-/sort-array-2.0.0.tgz#38a9c6da27fd7d147b42e60554f281187b4df472" @@ -3910,13 +3768,13 @@ sort-array@^2.0.0: object-get "^2.1.0" typical "^2.6.0" -soundcloud-scraper@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/soundcloud-scraper/-/soundcloud-scraper-4.0.3.tgz#cd7ed1d7b6ed1d7729fd7580c011281f652b920f" - integrity sha512-A0a6sVJ2wkkWIX8Ft3L63sfHBlFDRAaPFif+SWi07KCNLh8YTcylw45pts76pndxlupKwV2NgOTIYeF/F9tg8w== +soundcloud-scraper@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/soundcloud-scraper/-/soundcloud-scraper-5.0.0.tgz#3f4e9d9fc9ee79cbaf6cdd64f462ad6803e25ac1" + integrity sha512-8Rt7WbW85AqiFoKkemF5BKsGAThLGnhOi13ztctAI0Y/wso/iuR97yiVXK1eYRc2YqaD8gkpKUAjEY7bOxLxnw== dependencies: - cheerio "^1.0.0-rc.3" - m3u8stream "^0.8.0" + cheerio "^1.0.0-rc.9" + m3u8stream "^0.8.3" node-fetch "^2.6.1" source-map-resolve@^0.5.0: @@ -3952,40 +3810,25 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" -spotify-uri@^2.1.0: +spotify-uri@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/spotify-uri/-/spotify-uri-2.2.0.tgz#8db641615cf6e122284874287fe39e89595922df" integrity sha512-uUybj02bfyfCoZ0MJ80MkqbKxtIVRJfbRGk05KJFq1li3zb7yNfN1f+TAw4wcXgp7jLWExeiw2wyPQXZ8PHtfg== -spotify-url-info@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/spotify-url-info/-/spotify-url-info-2.2.0.tgz#7d14adbae65b54b918c46e2dcfdf02b1146f85c8" - integrity sha512-GEMoMf2RF+CSPsSGstY/9c7dgViKOKJ09bFZTwrU4KzQ+JpLq+0Ho4eMCeeGmES94yjBz+GHMtBfTcp+4DxEbA== +spotify-url-info@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/spotify-url-info/-/spotify-url-info-2.2.3.tgz#2f08400479f00472fb488eff4bd3c485db99361a" + integrity sha512-cZTE5nOnaAjIiaHG9psVYqKXWOlNUIgSU2e+bNInRaYZNgmVgOcKH0D7V1nSER3gv3h5BXvOo0EJTtrMQQo1bA== dependencies: - cross-fetch "^3.0.5" - himalaya "^1.1.0" - spotify-uri "^2.1.0" + cross-fetch "~3.1.4" + himalaya "~1.1.0" + spotify-uri "~2.2.0" sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -3994,11 +3837,6 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -stealthy-require@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= - stream-connect@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/stream-connect/-/stream-connect-1.0.2.tgz#18bc81f2edb35b8b5d9a8009200a985314428a97" @@ -4182,6 +4020,11 @@ through@^2.3.6: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= +tiny-typed-emitter@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/tiny-typed-emitter/-/tiny-typed-emitter-2.0.3.tgz#4335e3a75127ae7faba91b02e91615d97dc8db7d" + integrity sha512-MaCqhHlp6EAWN25yqBlajgd4scxxI2eJr7+EgoUAOV9UkMU3us/yp2bEnc2yOvyeDF8TUWuaz3zZCPGTKFJIpA== + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -4226,14 +4069,6 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" -tough-cookie@^2.3.3, tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - tough-cookie@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" @@ -4243,10 +4078,10 @@ tough-cookie@^4.0.0: punycode "^2.1.1" universalify "^0.1.2" -tr46@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" - integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== +tr46@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== dependencies: punycode "^2.1.1" @@ -4255,6 +4090,11 @@ tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tslib@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" + integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== + tslint-config-prettier@^1.18.0: version "1.18.0" resolved "https://registry.yarnpkg.com/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz#75f140bde947d35d8f0d238e0ebf809d64592c37" @@ -4291,18 +4131,6 @@ tsutils@^2.29.0: dependencies: tslib "^1.8.1" -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - tweetnacl@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" @@ -4325,10 +4153,15 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +typescipt@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typescipt/-/typescipt-1.0.0.tgz#bbe7ca742d5e6fc2e3e44ad10d461fe59211f6a5" + integrity sha512-Rgg7DtWh0c0oJPz2p48B0hlINIkE5zxU5i+dGctkoiKjIu6twl0HXWzoy+mvp9bQfLJGx70zYuN6GK0S/x5Kxw== + typescript@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.3.tgz#39062d8019912d43726298f09493d598048c1ce3" - integrity sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw== + version "4.3.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.2.tgz#399ab18aac45802d6f2498de5054fcbbe716a805" + integrity sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw== typical@^2.4.2, typical@^2.6.0, typical@^2.6.1: version "2.6.1" @@ -4346,14 +4179,14 @@ uc.micro@^1.0.1, uc.micro@^1.0.5: integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== uglify-js@^3.1.4: - version "3.13.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.4.tgz#592588bb9f47ae03b24916e2471218d914955574" - integrity sha512-kv7fCkIXyQIilD5/yQy8O+uagsYIOt5cZvs890W40/e/rvjMSzJw81o9Bg0tkURxzZBROtDQhW2LFjOGoK3RZw== + version "3.13.9" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.9.tgz#4d8d21dcd497f29cfd8e9378b9df123ad025999b" + integrity sha512-wZbyTQ1w6Y7fHdt8sJnHfSIuWeDgk6B5rCb4E/AM6QNNPbOMIZph21PW5dRB3h7Df0GszN+t7RuUH6sWK5bF0g== -underscore@~1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.10.2.tgz#73d6aa3668f3188e4adb0f1943bd12cfd7efaaaf" - integrity sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg== +underscore@~1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.1.tgz#0c1c6bd2df54b6b69f2314066d65b6cde6fcf9d1" + integrity sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g== unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" @@ -4428,25 +4261,11 @@ util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - v8-compile-cache@^2.0.3: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" @@ -4499,12 +4318,12 @@ whatwg-mimetype@^2.3.0: integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.5.0.tgz#7752b8464fc0903fec89aa9846fc9efe07351fd3" - integrity sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg== + version "8.6.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.6.0.tgz#27c0205a4902084b872aecb97cf0f2a7a3011f4c" + integrity sha512-os0KkeeqUOl7ccdDT1qqUcS4KH4tcBTSKK5Nl5WKb2lyxInIZ/CpjkqKa1Ss12mjfdcRX9mHmPPs7/SxG1Hbdw== dependencies: lodash "^4.7.0" - tr46 "^2.0.2" + tr46 "^2.1.0" webidl-conversions "^6.1.0" which-module@^2.0.0: @@ -4565,15 +4384,10 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -ws@^7.3.1: - version "7.4.5" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.5.tgz#a484dd851e9beb6fdb420027e3885e8ce48986c1" - integrity sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g== - -ws@^7.4.4: - version "7.4.4" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.4.tgz#383bc9742cb202292c9077ceab6f6047b17f2d59" - integrity sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw== +ws@^7.4.4, ws@^7.4.5, ws@^7.4.6: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== xml-name-validator@^3.0.0: version "3.0.0" @@ -4625,18 +4439,17 @@ yargs@^14.0.0: y18n "^4.0.0" yargs-parser "^15.0.1" -youtube-sr@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/youtube-sr/-/youtube-sr-4.0.4.tgz#48369b0cb1c53bd84c366a5420bb8f35b1db2329" - integrity sha512-Wf6YlANcCjAweY2MQuqJqusmMcGzaSDWE6ZTD8vifb9i9oFyKQpWuV58fnebJCFJE8G8pTLidmj5aRV7x384EQ== +youtube-sr@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/youtube-sr/-/youtube-sr-4.1.4.tgz#5ea646812264a951df7b1f6094f9f7406001dde6" + integrity sha512-0KSPNTmrxDOKCMsZlLB4NYKwuDXZFGR/wu7BD4mVA0huiw22jRQYc8oj2BQADmS8uGadzkFy3Z4DKRtDWuNN+A== dependencies: node-fetch "^2.6.1" - simple-youtube-api "^5.2.1" -ytdl-core@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/ytdl-core/-/ytdl-core-4.5.0.tgz#f07733387c548e5c3a5614c93ef55bde666eeaf4" - integrity sha512-e8r6skrakWNixsVlNPBMoRM1HrdW1swE97If9nenDUjF65uogYk4DvxIuqlmqRfBWKe+6aIZwqedNxUU9XLYJA== +ytdl-core@^4.8.2: + version "4.8.2" + resolved "https://registry.yarnpkg.com/ytdl-core/-/ytdl-core-4.8.2.tgz#f034ad942c5d958f5987fc8ff0b0639664ae2fb7" + integrity sha512-O3n++YcgZawaXJwbPmnRDgfN6b4kU0DpNdkI9Na5yM3JAdfJmoq5UHc8v9Xjgjr1RilQUUh7mhDnRRPDtKr0Kg== dependencies: m3u8stream "^0.8.3" miniget "^4.0.0" From 311df79adc4c5dcede4282bc01cb12e3543152ce Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Wed, 9 Jun 2021 19:27:28 +0545 Subject: [PATCH 011/215] fix: collector handler should return void --- src/Player.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Player.ts b/src/Player.ts index 9601b2e..76e6820 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -172,7 +172,7 @@ export class Player extends EventEmitter { collector.on('collect', ({ content }) => { if (content === 'cancel') { collector.stop(); - return this.emit(PlayerEvents.SEARCH_CANCEL, message, query, tracks); + return void this.emit(PlayerEvents.SEARCH_CANCEL, message, query, tracks); } if (!isNaN(content) && parseInt(content) >= 1 && parseInt(content) <= tracks.length) { From fac26620252156e60ac03dd64fd4f98b65132d65 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Thu, 10 Jun 2021 01:12:29 +0545 Subject: [PATCH 012/215] feat: base --- package.json | 1 + src/Player.ts | 19 +++-- src/Structures/Playlist.ts | 7 +- src/Structures/Track.ts | 2 +- src/VoiceNative/VoiceAdapter.ts | 89 +++++++++++++++++++++ src/VoiceNative/VoiceSubscriptionManager.ts | 1 + src/utils/Constants.ts | 4 +- src/utils/PlayerError.ts | 2 +- src/utils/Util.ts | 9 ++- 9 files changed, 116 insertions(+), 18 deletions(-) create mode 100644 src/VoiceNative/VoiceAdapter.ts create mode 100644 src/VoiceNative/VoiceSubscriptionManager.ts diff --git a/package.json b/package.json index 875afb6..fffec43 100644 --- a/package.json +++ b/package.json @@ -66,6 +66,7 @@ "@discordjs/opus": "^0.5.0", "@types/node": "^14.14.41", "@types/ws": "^7.4.1", + "discord-api-types": "^0.18.1", "discord.js": "^13.0.0-dev.dda5ee2e9f0839d3e42d25114ae1b47355cdfd27", "discord.js-docgen": "discordjs/docgen#ts-patch", "jsdoc-babel": "^0.5.0", diff --git a/src/Player.ts b/src/Player.ts index 76e6820..d10a9f7 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -30,10 +30,15 @@ export class Player extends EventEmitter { return new Promise((resolve) => { if (this.queues.has(message.guild.id)) return this.queues.get(message.guild.id); const channel = message.member.voice?.channel; - if (!channel) return void this.emit( - PlayerEvents.ERROR, - new PlayerError('Voice connection is not available in this server!', PlayerErrorEventCodes.NOT_CONNECTED, message) - ); + if (!channel) + return void this.emit( + PlayerEvents.ERROR, + new PlayerError( + 'Voice connection is not available in this server!', + PlayerErrorEventCodes.NOT_CONNECTED, + message + ) + ); const queue = new Queue(this, message.guild); void this.queues.set(message.guild.id, queue); @@ -57,7 +62,7 @@ export class Player extends EventEmitter { }); return queue; - }) + }); } public getQueue(message: Message) { @@ -81,7 +86,7 @@ export class Player extends EventEmitter { if (query instanceof Track) track = query; else { if (ytdl.validateURL(query)) { - const info = await ytdl.getBasicInfo(query).catch(() => { }); + const info = await ytdl.getBasicInfo(query).catch(() => {}); if (!info) return void this.emit(PlayerEvents.NO_RESULTS, message, query); if (info.videoDetails.isLiveContent && !queue.options.enableLive) return void this.emit( @@ -194,4 +199,4 @@ export class Player extends EventEmitter { } } -export default Player; \ No newline at end of file +export default Player; diff --git a/src/Structures/Playlist.ts b/src/Structures/Playlist.ts index 9ddadf3..804776c 100644 --- a/src/Structures/Playlist.ts +++ b/src/Structures/Playlist.ts @@ -1,12 +1,11 @@ -import Player from "../Player"; +import Player from '../Player'; export class Playlist { player: Player; constructor(player: Player, data: any) { - Object.defineProperty(this, "player", { value: player }); + Object.defineProperty(this, 'player', { value: player }); } - } -export default Playlist; \ No newline at end of file +export default Playlist; diff --git a/src/Structures/Track.ts b/src/Structures/Track.ts index 4142061..ed146b5 100644 --- a/src/Structures/Track.ts +++ b/src/Structures/Track.ts @@ -4,7 +4,7 @@ import { Player } from '../Player'; export class Track { readonly player: Player; readonly message: Message; - + constructor(player: Player, data: any) { Object.defineProperty(this, 'player', { value: player, enumerable: false }); } diff --git a/src/VoiceNative/VoiceAdapter.ts b/src/VoiceNative/VoiceAdapter.ts new file mode 100644 index 0000000..7bab0a6 --- /dev/null +++ b/src/VoiceNative/VoiceAdapter.ts @@ -0,0 +1,89 @@ +import { DiscordGatewayAdapterCreator, DiscordGatewayAdapterLibraryMethods } from '@discordjs/voice'; +import { + VoiceChannel, + Snowflake, + Client, + Constants, + WebSocketShard, + Guild, + StageChannel, + Collection +} from 'discord.js'; +import { GatewayVoiceServerUpdateDispatchData, GatewayVoiceStateUpdateDispatchData } from 'discord-api-types/v8'; + +class VoiceAdapter { + public client: Client; + public adapters = new Collection(); + public clients = new Set(); + public guilds = new Collection>(); + + constructor(client: Client) { + this.client = client; + + Object.defineProperty(this, 'client', { + enumerable: false, + writable: true, + configurable: true + }); + } + + trackVoiceState() { + if (this.clients.has(this.client)) return; + this.clients.add(this.client); + + this.client.ws.on('VOICE_STATE_UPDATE', (data: GatewayVoiceServerUpdateDispatchData) => { + this.adapters.get(data.guild_id)?.onVoiceServerUpdate(data); + }); + + this.client.ws.on(Constants.WSEvents.VOICE_STATE_UPDATE, (payload: GatewayVoiceStateUpdateDispatchData) => { + if (payload.guild_id && payload.session_id && payload.user_id === this.client.user?.id) { + this.adapters.get(payload.guild_id)?.onVoiceStateUpdate(payload); + } + }); + } + + cleanupGuilds(shard: WebSocketShard) { + const guilds = this.guilds.get(shard); + if (guilds) { + for (const guildID of guilds.values()) { + this.adapters.get(guildID)?.destroy(); + } + } + } + + trackGuild(guild: Guild) { + let guilds = this.guilds.get(guild.shard); + if (!guilds) { + const cleanup = () => this.cleanupGuilds(guild.shard); + guild.shard.on('close', cleanup); + guild.shard.on('destroyed', cleanup); + guilds = new Set(); + this.guilds.set(guild.shard, guilds); + } + + guilds.add(guild.id); + } +} + +export default function createAdapter(channel: VoiceChannel | StageChannel): DiscordGatewayAdapterCreator { + return (methods) => { + const adapter = new VoiceAdapter(channel.client); + adapter.adapters.set(channel.guild.id, methods); + adapter.trackVoiceState(); + adapter.trackGuild(channel.guild); + + return { + sendPayload(data) { + if (channel.guild.shard.status === Constants.Status.READY) { + channel.guild.shard.send(data); + return true; + } + + return false; + }, + destroy() { + return adapter.adapters.delete(channel.guild.id); + } + }; + }; +} diff --git a/src/VoiceNative/VoiceSubscriptionManager.ts b/src/VoiceNative/VoiceSubscriptionManager.ts new file mode 100644 index 0000000..d1e61ea --- /dev/null +++ b/src/VoiceNative/VoiceSubscriptionManager.ts @@ -0,0 +1 @@ +class VoiceSubscriptionManager {} diff --git a/src/utils/Constants.ts b/src/utils/Constants.ts index dd36a0f..26f2ce5 100644 --- a/src/utils/Constants.ts +++ b/src/utils/Constants.ts @@ -17,7 +17,7 @@ export enum PlayerEvents { SEARCH_RESULTS = 'searchResults', TRACK_ADD = 'trackAdd', TRACK_START = 'trackStart' -}; +} export enum PlayerErrorEventCodes { DEFAULT = 'PlayerError', @@ -28,7 +28,7 @@ export enum PlayerErrorEventCodes { PARSE_ERROR = 'ParseError', VIDEO_UNAVAILABLE = 'VideoUnavailable', MUSIC_STARTING = 'MusicStarting' -}; +} export const PlayerOptions: DP_OPTIONS = { leaveOnEnd: true, diff --git a/src/utils/PlayerError.ts b/src/utils/PlayerError.ts index 5185fb1..e541396 100644 --- a/src/utils/PlayerError.ts +++ b/src/utils/PlayerError.ts @@ -1,4 +1,4 @@ -import { Message } from "discord.js"; +import { Message } from 'discord.js'; export default class PlayerError extends Error { discordMessage: Message; diff --git a/src/utils/Util.ts b/src/utils/Util.ts index 7826f5d..6da2765 100644 --- a/src/utils/Util.ts +++ b/src/utils/Util.ts @@ -7,12 +7,15 @@ import { validateURL as SoundcloudValidateURL } from 'soundcloud-scraper'; import { VoiceChannel } from 'discord.js'; const spotifySongRegex = /https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(?:track\/|\?uri=spotify:track:)((\w|-){22})/; -const spotifyPlaylistRegex = /https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(?:playlist\/|\?uri=spotify:playlist:)((\w|-){22})/; +const spotifyPlaylistRegex = + /https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(?:playlist\/|\?uri=spotify:playlist:)((\w|-){22})/; const spotifyAlbumRegex = /https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(?:album\/|\?uri=spotify:album:)((\w|-){22})/; -const vimeoRegex = /(http|https)?:\/\/(www\.|player\.)?vimeo\.com\/(?:channels\/(?:\w+\/)?|groups\/([^/]*)\/videos\/|video\/|)(\d+)(?:|\/\?)/; +const vimeoRegex = + /(http|https)?:\/\/(www\.|player\.)?vimeo\.com\/(?:channels\/(?:\w+\/)?|groups\/([^/]*)\/videos\/|video\/|)(\d+)(?:|\/\?)/; const facebookRegex = /(https?:\/\/)(www\.|m\.)?(facebook|fb).com\/.*\/videos\/.*/; const reverbnationRegex = /https:\/\/(www.)?reverbnation.com\/(.+)\/song\/(.+)/; -const attachmentRegex = /^(?:(?:https?|ftp):\/\/)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/\S*)?$/; +const attachmentRegex = + /^(?:(?:https?|ftp):\/\/)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/\S*)?$/; export class Util { /** From e7031a29f91fdc97fe75432ca621664787ccc26c Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Thu, 10 Jun 2021 13:20:49 +0545 Subject: [PATCH 013/215] cleanup base --- package.json | 3 +- src/Player.ts | 203 +------------------- src/Structures/ExtractorModel.ts | 71 +------ src/Structures/Playlist.ts | 12 +- src/Structures/Queue.ts | 43 +---- src/Structures/Track.ts | 14 +- src/VoiceNative/VoiceAdapter.ts | 89 --------- src/VoiceNative/VoiceSubscriptionManager.ts | 1 - src/index.ts | 10 +- src/types/types.ts | 159 +-------------- yarn.lock | 71 ++++++- 11 files changed, 79 insertions(+), 597 deletions(-) delete mode 100644 src/VoiceNative/VoiceAdapter.ts delete mode 100644 src/VoiceNative/VoiceSubscriptionManager.ts diff --git a/package.json b/package.json index fffec43..160c880 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "lib/" ], "scripts": { - "test": "yarn build && cd test && node index.js", + "test": "cd test && ts-node index.ts", "build": "tsc", "format": "prettier --write \"src/**/*.ts\"", "lint": "tslint -p tsconfig.json", @@ -71,6 +71,7 @@ "discord.js-docgen": "discordjs/docgen#ts-patch", "jsdoc-babel": "^0.5.0", "prettier": "^2.2.1", + "ts-node": "^10.0.0", "tslint": "^6.1.3", "tslint-config-prettier": "^1.18.0", "typescipt": "^1.0.0", diff --git a/src/Player.ts b/src/Player.ts index d10a9f7..cb0ff5c 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -1,202 +1 @@ -import { EventEmitter } from 'events'; -import { Client, Collection, Snowflake, Message, Collector } from 'discord.js'; -import Util from './utils/Util'; -import Queue from './Structures/Queue'; -import Track from './Structures/Track'; -import PlayerError from './utils/PlayerError'; -import { ExtractorModel } from './Structures/ExtractorModel'; -import ytdl from 'discord-ytdl-core'; -import { PlayerEvents, PlayerErrorEventCodes } from './utils/Constants'; - -export class Player extends EventEmitter { - public client: Client; - public queues = new Collection(); - public Extractors = new Collection(); - private _cooldownsTimeout = new Collection(); - private _resultsCollectors = new Collection>(); - - constructor(client: Client) { - super(); - - Object.defineProperty(this, 'client', { - value: client, - enumerable: false - }); - - Util.alertFFmpeg(); - } - - public createQueue(message: Message) { - return new Promise((resolve) => { - if (this.queues.has(message.guild.id)) return this.queues.get(message.guild.id); - const channel = message.member.voice?.channel; - if (!channel) - return void this.emit( - PlayerEvents.ERROR, - new PlayerError( - 'Voice connection is not available in this server!', - PlayerErrorEventCodes.NOT_CONNECTED, - message - ) - ); - - const queue = new Queue(this, message.guild); - void this.queues.set(message.guild.id, queue); - - channel - .join() - .then((connection) => { - this.emit(PlayerEvents.CONNECTION_CREATE, message, connection); - - queue.voiceConnection = connection; - if (queue.options.setSelfDeaf) connection.voice.setSelfDeaf(true); - this.emit(PlayerEvents.QUEUE_CREATE, message, queue); - resolve(queue); - }) - .catch((err) => { - this.queues.delete(message.guild.id); - this.emit( - PlayerEvents.ERROR, - new PlayerError(err.message ?? err, PlayerErrorEventCodes.UNABLE_TO_JOIN, message) - ); - }); - - return queue; - }); - } - - public getQueue(message: Message) { - return this.queues.get(message.guild.id) ?? null; - } - - async play(message: Message, query: string | Track, firstResult?: boolean): Promise { - if (!message) throw new PlayerError('Play function needs message'); - if (!query) throw new PlayerError('Play function needs search query as a string or Player.Track object'); - - if (this._cooldownsTimeout.has(`end_${message.guild.id}`)) { - clearTimeout(this._cooldownsTimeout.get(`end_${message.guild.id}`)); - this._cooldownsTimeout.delete(`end_${message.guild.id}`); - } - - if (typeof query === 'string') query = query.replace(/<(.+)>/g, '$1'); - let track; - - const queue = this.getQueue(message); - - if (query instanceof Track) track = query; - else { - if (ytdl.validateURL(query)) { - const info = await ytdl.getBasicInfo(query).catch(() => {}); - if (!info) return void this.emit(PlayerEvents.NO_RESULTS, message, query); - if (info.videoDetails.isLiveContent && !queue.options.enableLive) - return void this.emit( - PlayerEvents.ERROR, - new PlayerError('Live video is not enabled!', PlayerErrorEventCodes.LIVE_VIDEO, message) - ); - const lastThumbnail = info.videoDetails.thumbnails[info.videoDetails.thumbnails.length - 1]; - - track = new Track(this, { - title: info.videoDetails.title, - description: info.videoDetails.description, - author: info.videoDetails.author.name, - url: info.videoDetails.video_url, - thumbnail: lastThumbnail.url, - duration: Util.buildTimeCode(Util.parseMS(parseInt(info.videoDetails.lengthSeconds) * 1000)), - views: parseInt(info.videoDetails.viewCount), - requestedBy: message.author, - fromPlaylist: false, - source: 'youtube', - live: Boolean(info.videoDetails.isLiveContent) - }); - } else { - for (const [_, extractor] of this.Extractors) { - if (extractor.validate(query)) { - const data = await extractor.handle(query); - if (data) { - track = new Track(this, { - title: data.title, - description: data.description, - duration: Util.buildTimeCode(Util.parseMS(data.duration)), - thumbnail: data.thumbnail, - author: data.author, - views: data.views, - engine: data.engine, - source: 'arbitrary', - fromPlaylist: false, - requestedBy: message.author, - url: data.url - }); - - if (extractor.important) break; - } - } - } - - if (!track) track = await this.searchTracks(message, query, firstResult); - } - } - - if (track) { - if (queue) { - const q = queue.addTrack(track); - this.emit(PlayerEvents.TRACK_ADD, message, q, q.tracks[q.tracks.length - 1]); - } else { - const q = queue.addTrack(track); - if (q) this.emit(PlayerEvents.TRACK_START, message, q.tracks[0], q); - - // todo: start playing - } - } - } - - private searchTracks(message: Message, query: string, firstResult?: boolean): Promise { - return new Promise(async (resolve) => { - let tracks: Track[] = []; - const queryType = Util.getQueryType(query); - - switch (queryType) { - default: - tracks = await Util.ytSearch(query, { user: message.author, player: this }); - } - - if (tracks.length < 1) return void this.emit(PlayerEvents.NO_RESULTS, message, query); - if (firstResult || tracks.length === 1) return resolve(tracks[0]); - - const collectorString = `${message.author.id}-${message.channel.id}`; - const currentCollector = this._resultsCollectors.get(collectorString); - if (currentCollector) currentCollector.stop(); - - const collector = message.channel.createMessageCollector((m) => m.author.id === message.author.id, { - time: 60000 - }); - - this._resultsCollectors.set(collectorString, collector); - - this.emit(PlayerEvents.SEARCH_RESULTS, message, query, tracks, collector); - - collector.on('collect', ({ content }) => { - if (content === 'cancel') { - collector.stop(); - return void this.emit(PlayerEvents.SEARCH_CANCEL, message, query, tracks); - } - - if (!isNaN(content) && parseInt(content) >= 1 && parseInt(content) <= tracks.length) { - const index = parseInt(content, 10); - const track = tracks[index - 1]; - collector.stop(); - resolve(track); - } else { - this.emit(PlayerEvents.SEARCH_INVALID_RESPONSE, message, query, tracks, content, collector); - } - }); - - collector.on('end', (_, reason) => { - if (reason === 'time') { - this.emit(PlayerEvents.SEARCH_CANCEL, message, query, tracks); - } - }); - }); - } -} - -export default Player; +export {}; diff --git a/src/Structures/ExtractorModel.ts b/src/Structures/ExtractorModel.ts index 578470a..cb0ff5c 100644 --- a/src/Structures/ExtractorModel.ts +++ b/src/Structures/ExtractorModel.ts @@ -1,70 +1 @@ -import { ExtractorModelData } from '../types/types'; - -class ExtractorModel { - name: string; - private _raw: any; - - /** - * Model for raw Discord Player extractors - * @param {String} extractorName Name of the extractor - * @param {Object} data Extractor object - */ - constructor(extractorName: string, data: any) { - /** - * The extractor name - * @type {String} - */ - this.name = extractorName; - - Object.defineProperty(this, '_raw', { value: data, configurable: false, writable: false, enumerable: false }); - } - - /** - * Method to handle requests from `Player.play()` - * @param {String} query Query to handle - * @returns {Promise} - */ - async handle(query: string): Promise { - const data = await this._raw.getInfo(query); - if (!data) return null; - - return { - title: data.title, - duration: data.duration, - thumbnail: data.thumbnail, - engine: data.engine, - views: data.views, - author: data.author, - description: data.description, - url: data.url - }; - } - - /** - * Method used by Discord Player to validate query with this extractor - * @param {String} query The query to validate - * @returns {Boolean} - */ - validate(query: string): boolean { - return Boolean(this._raw.validate(query)); - } - - /** - * The extractor version - * @type {String} - */ - get version(): string { - return this._raw.version ?? '0.0.0'; - } - - /** - * If player should mark this extractor as important - * @type {Boolean} - */ - get important(): boolean { - return Boolean(this._raw.important); - } -} - -export default ExtractorModel; -export { ExtractorModel }; +export {}; diff --git a/src/Structures/Playlist.ts b/src/Structures/Playlist.ts index 804776c..cb0ff5c 100644 --- a/src/Structures/Playlist.ts +++ b/src/Structures/Playlist.ts @@ -1,11 +1 @@ -import Player from '../Player'; - -export class Playlist { - player: Player; - - constructor(player: Player, data: any) { - Object.defineProperty(this, 'player', { value: player }); - } -} - -export default Playlist; +export {}; diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 6ed849d..cb0ff5c 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -1,42 +1 @@ -import { Guild, Message, VoiceConnection } from 'discord.js'; -import { Player } from '../Player'; -import { PlayerOptions } from '../types/types'; -import Track from './Track'; -import { PlayerError } from '../utils/PlayerError'; - -export class Queue { - player: Player; - guild: Guild; - firstMessage: Message; - options: PlayerOptions = {}; - tracks: Track[] = []; - voiceConnection: VoiceConnection = null; - - constructor(player: Player, guild: Guild) { - Object.defineProperty(this, 'player', { value: player, enumerable: false }); - - this.guild = guild; - } - - get playing() { - return this.tracks[0]; - } - - async play(message: Message, query: string | Track, firstResult?: boolean) { - return await this.player.play(message, query, firstResult); - } - - addTrack(track: Track) { - if (!track || !(track instanceof Track)) throw new PlayerError('No track specified to add to the queue'); - this.tracks.push(track); - return this; - } - - addTracks(tracks: Track[]) { - this.tracks.push(...tracks); - - return this; - } -} - -export default Queue; +export {}; diff --git a/src/Structures/Track.ts b/src/Structures/Track.ts index ed146b5..cb0ff5c 100644 --- a/src/Structures/Track.ts +++ b/src/Structures/Track.ts @@ -1,13 +1 @@ -import { Message } from 'discord.js'; -import { Player } from '../Player'; - -export class Track { - readonly player: Player; - readonly message: Message; - - constructor(player: Player, data: any) { - Object.defineProperty(this, 'player', { value: player, enumerable: false }); - } -} - -export default Track; +export {}; diff --git a/src/VoiceNative/VoiceAdapter.ts b/src/VoiceNative/VoiceAdapter.ts deleted file mode 100644 index 7bab0a6..0000000 --- a/src/VoiceNative/VoiceAdapter.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { DiscordGatewayAdapterCreator, DiscordGatewayAdapterLibraryMethods } from '@discordjs/voice'; -import { - VoiceChannel, - Snowflake, - Client, - Constants, - WebSocketShard, - Guild, - StageChannel, - Collection -} from 'discord.js'; -import { GatewayVoiceServerUpdateDispatchData, GatewayVoiceStateUpdateDispatchData } from 'discord-api-types/v8'; - -class VoiceAdapter { - public client: Client; - public adapters = new Collection(); - public clients = new Set(); - public guilds = new Collection>(); - - constructor(client: Client) { - this.client = client; - - Object.defineProperty(this, 'client', { - enumerable: false, - writable: true, - configurable: true - }); - } - - trackVoiceState() { - if (this.clients.has(this.client)) return; - this.clients.add(this.client); - - this.client.ws.on('VOICE_STATE_UPDATE', (data: GatewayVoiceServerUpdateDispatchData) => { - this.adapters.get(data.guild_id)?.onVoiceServerUpdate(data); - }); - - this.client.ws.on(Constants.WSEvents.VOICE_STATE_UPDATE, (payload: GatewayVoiceStateUpdateDispatchData) => { - if (payload.guild_id && payload.session_id && payload.user_id === this.client.user?.id) { - this.adapters.get(payload.guild_id)?.onVoiceStateUpdate(payload); - } - }); - } - - cleanupGuilds(shard: WebSocketShard) { - const guilds = this.guilds.get(shard); - if (guilds) { - for (const guildID of guilds.values()) { - this.adapters.get(guildID)?.destroy(); - } - } - } - - trackGuild(guild: Guild) { - let guilds = this.guilds.get(guild.shard); - if (!guilds) { - const cleanup = () => this.cleanupGuilds(guild.shard); - guild.shard.on('close', cleanup); - guild.shard.on('destroyed', cleanup); - guilds = new Set(); - this.guilds.set(guild.shard, guilds); - } - - guilds.add(guild.id); - } -} - -export default function createAdapter(channel: VoiceChannel | StageChannel): DiscordGatewayAdapterCreator { - return (methods) => { - const adapter = new VoiceAdapter(channel.client); - adapter.adapters.set(channel.guild.id, methods); - adapter.trackVoiceState(); - adapter.trackGuild(channel.guild); - - return { - sendPayload(data) { - if (channel.guild.shard.status === Constants.Status.READY) { - channel.guild.shard.send(data); - return true; - } - - return false; - }, - destroy() { - return adapter.adapters.delete(channel.guild.id); - } - }; - }; -} diff --git a/src/VoiceNative/VoiceSubscriptionManager.ts b/src/VoiceNative/VoiceSubscriptionManager.ts deleted file mode 100644 index d1e61ea..0000000 --- a/src/VoiceNative/VoiceSubscriptionManager.ts +++ /dev/null @@ -1 +0,0 @@ -class VoiceSubscriptionManager {} diff --git a/src/index.ts b/src/index.ts index 4dd3a82..cb0ff5c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,9 +1 @@ -export { AudioFilters } from './utils/AudioFilters'; -export * as Constants from './utils/Constants'; -export { ExtractorModel } from './Structures/ExtractorModel'; -export { Player } from './Player'; -export { Util } from './utils/Util'; -export { Track } from './Structures/Track'; -export { Queue } from './Structures/Queue'; -export * from './types/types'; -export { PlayerError } from './utils/PlayerError'; +export {}; diff --git a/src/types/types.ts b/src/types/types.ts index 546be00..cb0ff5c 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -1,158 +1 @@ -import { downloadOptions } from 'ytdl-core'; -import { User } from 'discord.js'; -import { Readable, Duplex } from 'stream'; - -export interface PlayerOptions { - leaveOnEnd?: boolean; - leaveOnEndCooldown?: number; - leaveOnStop?: boolean; - leaveOnEmpty?: boolean; - leaveOnEmptyCooldown?: number; - setSelfDeaf?: boolean; - enableLive?: boolean; - ytdlDownloadOptions?: downloadOptions; - useSafeSearch?: boolean; - disableAutoRegister?: boolean; -} - -export type FiltersName = keyof QueueFilters; - -export type TrackSource = 'soundcloud' | 'youtube' | 'arbitrary'; - -export interface TrackData { - title: string; - description: string; - author: string; - url: string; - thumbnail: string; - duration: string; - views: number; - requestedBy: User; - fromPlaylist: boolean; - source?: TrackSource; - engine?: any; - live?: boolean; -} - -export type QueueFilters = { - bassboost?: boolean; - '8D'?: boolean; - vaporwave?: boolean; - nightcore?: boolean; - phaser?: boolean; - tremolo?: boolean; - vibrato?: boolean; - reverse?: boolean; - treble?: boolean; - normalizer?: boolean; - surrounding?: boolean; - pulsator?: boolean; - subboost?: boolean; - karaoke?: boolean; - flanger?: boolean; - gate?: boolean; - haas?: boolean; - mcompand?: boolean; - mono?: boolean; - mstlr?: boolean; - mstrr?: boolean; - compressor?: boolean; - expander?: boolean; - softlimiter?: boolean; - chorus?: boolean; - chorus2d?: boolean; - chorus3d?: boolean; - fadein?: boolean; -}; - -export type QueryType = - | 'soundcloud_track' - | 'soundcloud_playlist' - | 'spotify_song' - | 'spotify_album' - | 'spotify_playlist' - | 'youtube_video' - | 'youtube_playlist' - | 'vimeo' - | 'facebook' - | 'reverbnation' - | 'attachment' - | 'youtube_search'; - -export interface ExtractorModelData { - title: string; - duration: number; - thumbnail: string; - engine: string | Readable | Duplex; - views: number; - author: string; - description: string; - url: string; - version?: string; - important?: boolean; -} - -export interface PlayerProgressbarOptions { - timecodes?: boolean; - queue?: boolean; - length?: number; - line?: string; - indicator?: string; -} - -export interface LyricsData { - title: string; - id: number; - thumbnail: string; - image: string; - url: string; - artist: { - name: string; - id: number; - url: string; - image: string; - }; - lyrics?: string; -} - -export interface PlayerStats { - uptime: number; - connections: number; - users: number; - queues: number; - extractors: number; - versions: { - ffmpeg: string; - node: string; - v8: string; - }; - system: { - arch: string; - platform: - | 'aix' - | 'android' - | 'darwin' - | 'freebsd' - | 'linux' - | 'openbsd' - | 'sunos' - | 'win32' - | 'cygwin' - | 'netbsd'; - cpu: number; - memory: { - total: string; - usage: string; - rss: string; - arrayBuffers: string; - }; - uptime: number; - }; -} - -export interface TimeData { - days: number; - hours: number; - minutes: number; - seconds: number; -} +export {}; diff --git a/yarn.lock b/yarn.lock index c927e0b..d81ad6f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -994,6 +994,26 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@tsconfig/node10@^1.0.7": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" + integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== + +"@tsconfig/node12@^1.0.7": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.8.tgz#a883d62f049a64fea1e56a6bbe66828d11c6241b" + integrity sha512-LM6XwBhjZRls1qJGpiM/It09SntEwe9M0riXRfQ9s6XlJQG0JPGl92ET18LtGeYh/GuOtafIXqwZeqLOd0FNFQ== + +"@tsconfig/node14@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" + integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== + +"@tsconfig/node16@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.1.tgz#a6ca6a9a0ff366af433f42f5f0e124794ff6b8f1" + integrity sha512-FTgBI767POY/lKNDNbIzgAX6miIDBs6NTCbdlDb8TrWovHsSvaVIZDlTqym29C6UqhzwcJx4CYr+AlrMywA0cA== + "@types/node@*": version "15.12.2" resolved "https://registry.yarnpkg.com/@types/node/-/node-15.12.2.tgz#1f2b42c4be7156ff4a6f914b2fb03d05fa84e38d" @@ -1150,6 +1170,11 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -1349,6 +1374,11 @@ browserslist@^4.16.6: escalade "^3.1.1" node-releases "^1.1.71" +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -1655,6 +1685,11 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + cross-fetch@~3.1.4: version "3.1.4" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.4.tgz#9723f3a3a247bf8b89039f3a380a9244e8fa2f39" @@ -2964,6 +2999,11 @@ make-dir@^3.1.0: dependencies: semver "^6.0.0" +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -3788,6 +3828,14 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" +source-map-support@^0.5.17: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-url@^0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" @@ -3798,7 +3846,7 @@ source-map@^0.5.0, source-map@^0.5.6: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.6.1, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -4085,6 +4133,22 @@ tr46@^2.1.0: dependencies: punycode "^2.1.1" +ts-node@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.0.0.tgz#05f10b9a716b0b624129ad44f0ea05dac84ba3be" + integrity sha512-ROWeOIUvfFbPZkoDis0L/55Fk+6gFQNZwwKPLinacRl6tsxstTF1DbAcLKkovwnpKMVvOMHP1TIbnwXwtLg1gg== + dependencies: + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.17" + yn "3.1.1" + tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" @@ -4439,6 +4503,11 @@ yargs@^14.0.0: y18n "^4.0.0" yargs-parser "^15.0.1" +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + youtube-sr@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/youtube-sr/-/youtube-sr-4.1.4.tgz#5ea646812264a951df7b1f6094f9f7406001dde6" From 1e18875752d4570fd2c9bdbe0eb67a6b440963f4 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Thu, 10 Jun 2021 13:22:03 +0545 Subject: [PATCH 014/215] cleanup base --- src/utils/AudioFilters.ts | 76 +----------- src/utils/Constants.ts | 42 +------ src/utils/PlayerError.ts | 20 +--- src/utils/Util.ts | 235 +------------------------------------- 4 files changed, 4 insertions(+), 369 deletions(-) diff --git a/src/utils/AudioFilters.ts b/src/utils/AudioFilters.ts index 4c98fb3..3deda80 100644 --- a/src/utils/AudioFilters.ts +++ b/src/utils/AudioFilters.ts @@ -1,75 +1 @@ -import { FiltersName } from '../types/types'; - -const FilterList = { - bassboost: 'bass=g=20', - '8D': 'apulsator=hz=0.09', - vaporwave: 'aresample=48000,asetrate=48000*0.8', - nightcore: 'aresample=48000,asetrate=48000*1.25', - phaser: 'aphaser=in_gain=0.4', - tremolo: 'tremolo', - vibrato: 'vibrato=f=6.5', - reverse: 'areverse', - treble: 'treble=g=5', - normalizer: 'dynaudnorm=g=101', - surrounding: 'surround', - pulsator: 'apulsator=hz=1', - subboost: 'asubboost', - karaoke: 'stereotools=mlev=0.03', - flanger: 'flanger', - gate: 'agate', - haas: 'haas', - mcompand: 'mcompand', - mono: 'pan=mono|c0=.5*c0+.5*c1', - mstlr: 'stereotools=mode=ms>lr', - mstrr: 'stereotools=mode=ms>rr', - compressor: 'compand=points=-80/-105|-62/-80|-15.4/-15.4|0/-12|20/-7.6', - expander: 'compand=attacks=0:points=-80/-169|-54/-80|-49.5/-64.6|-41.1/-41.1|-25.8/-15|-10.8/-4.5|0/0|20/8.3', - softlimiter: 'compand=attacks=0:points=-80/-80|-12.4/-12.4|-6/-8|0/-6.8|20/-2.8', - chorus: 'chorus=0.7:0.9:55:0.4:0.25:2', - chorus2d: 'chorus=0.6:0.9:50|60:0.4|0.32:0.25|0.4:2|1.3', - chorus3d: 'chorus=0.5:0.9:50|60|40:0.4|0.32|0.3:0.25|0.4|0.3:2|2.3|1.3', - fadein: 'afade=t=in:ss=0:d=10', - - *[Symbol.iterator](): IterableIterator<{ name: FiltersName; value: string }> { - for (const [k, v] of Object.entries(this)) { - if (typeof this[k as FiltersName] === 'string') yield { name: k as FiltersName, value: v as string }; - } - }, - - get names() { - return Object.keys(this).filter( - (p) => !['names', 'length'].includes(p) && typeof this[p as FiltersName] !== 'function' - ); - }, - - get length() { - return Object.keys(this).filter( - (p) => !['names', 'length'].includes(p) && typeof this[p as FiltersName] !== 'function' - ).length; - }, - - toString() { - return `${Object.values(this).join(',')}`; - }, - - create(filter?: FiltersName[]): string { - if (!filter || !Array.isArray(filter)) return this.toString(); - return filter - .filter((predicate) => typeof predicate === 'string') - .map((m) => this[m]) - .join(','); - }, - - define(filterName: string, value: string): void { - if (typeof this[filterName as FiltersName] && typeof this[filterName as FiltersName] === 'function') return; - - this[filterName as FiltersName] = value; - }, - - defineBulk(filterArray: { name: string; value: string }[]): void { - filterArray.forEach((arr) => this.define(arr.name, arr.value)); - } -}; - -export default FilterList; -export { FilterList as AudioFilters }; +export { } \ No newline at end of file diff --git a/src/utils/Constants.ts b/src/utils/Constants.ts index 26f2ce5..3deda80 100644 --- a/src/utils/Constants.ts +++ b/src/utils/Constants.ts @@ -1,41 +1 @@ -import { PlayerOptions as DP_OPTIONS } from '../types/types'; - -export enum PlayerEvents { - BOT_DISCONNECT = 'botDisconnect', - CHANNEL_EMPTY = 'channelEmpty', - CONNECTION_CREATE = 'connectionCreate', - ERROR = 'error', - MUSIC_STOP = 'musicStop', - NO_RESULTS = 'noResults', - PLAYLIST_ADD = 'playlistAdd', - PLAYLIST_PARSE_END = 'playlistParseEnd', - PLAYLIST_PARSE_START = 'playlistParseStart', - QUEUE_CREATE = 'queueCreate', - QUEUE_END = 'queueEnd', - SEARCH_CANCEL = 'searchCancel', - SEARCH_INVALID_RESPONSE = 'searchInvalidResponse', - SEARCH_RESULTS = 'searchResults', - TRACK_ADD = 'trackAdd', - TRACK_START = 'trackStart' -} - -export enum PlayerErrorEventCodes { - DEFAULT = 'PlayerError', - LIVE_VIDEO = 'LiveVideo', - NOT_CONNECTED = 'NotConnected', - UNABLE_TO_JOIN = 'UnableToJoin', - NOT_PLAYING = 'NotPlaying', - PARSE_ERROR = 'ParseError', - VIDEO_UNAVAILABLE = 'VideoUnavailable', - MUSIC_STARTING = 'MusicStarting' -} - -export const PlayerOptions: DP_OPTIONS = { - leaveOnEnd: true, - leaveOnStop: true, - leaveOnEmpty: true, - leaveOnEmptyCooldown: 0, - setSelfDeaf: true, - enableLive: false, - ytdlDownloadOptions: {} -}; +export { } \ No newline at end of file diff --git a/src/utils/PlayerError.ts b/src/utils/PlayerError.ts index e541396..3deda80 100644 --- a/src/utils/PlayerError.ts +++ b/src/utils/PlayerError.ts @@ -1,19 +1 @@ -import { Message } from 'discord.js'; - -export default class PlayerError extends Error { - discordMessage: Message; - - constructor(msg: string, name?: string, message?: Message) { - super(); - this.name = name ?? 'PlayerError'; - this.message = msg; - this.discordMessage = message; - Error.captureStackTrace(this); - } - - get code() { - return this.name; - } -} - -export { PlayerError }; +export { } \ No newline at end of file diff --git a/src/utils/Util.ts b/src/utils/Util.ts index 6da2765..3deda80 100644 --- a/src/utils/Util.ts +++ b/src/utils/Util.ts @@ -1,234 +1 @@ -import { QueryType, TimeData } from '../types/types'; -import { FFmpeg } from 'prism-media'; -import YouTube from 'youtube-sr'; -import { Track } from '../Structures/Track'; -// @ts-ignore -import { validateURL as SoundcloudValidateURL } from 'soundcloud-scraper'; -import { VoiceChannel } from 'discord.js'; - -const spotifySongRegex = /https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(?:track\/|\?uri=spotify:track:)((\w|-){22})/; -const spotifyPlaylistRegex = - /https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(?:playlist\/|\?uri=spotify:playlist:)((\w|-){22})/; -const spotifyAlbumRegex = /https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(?:album\/|\?uri=spotify:album:)((\w|-){22})/; -const vimeoRegex = - /(http|https)?:\/\/(www\.|player\.)?vimeo\.com\/(?:channels\/(?:\w+\/)?|groups\/([^/]*)\/videos\/|video\/|)(\d+)(?:|\/\?)/; -const facebookRegex = /(https?:\/\/)(www\.|m\.)?(facebook|fb).com\/.*\/videos\/.*/; -const reverbnationRegex = /https:\/\/(www.)?reverbnation.com\/(.+)\/song\/(.+)/; -const attachmentRegex = - /^(?:(?:https?|ftp):\/\/)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/\S*)?$/; - -export class Util { - /** - * Static Player Util class - */ - constructor() { - throw new Error(`The ${this.constructor.name} class is static and cannot be instantiated!`); - } - - /** - * Checks FFmpeg Version - * @param {Boolean} [force] If it should forcefully get the version - * @returns {String} - */ - static getFFmpegVersion(force?: boolean): string { - try { - const info = FFmpeg.getInfo(Boolean(force)); - - return info.version; - } catch { - return null; - } - } - - /** - * Checks FFmpeg - * @param {Boolean} [force] If it should forcefully get the version - * @returns {Boolean} - */ - static checkFFmpeg(force?: boolean): boolean { - const version = Util.getFFmpegVersion(force); - return version === null ? false : true; - } - - /** - * Alerts if FFmpeg is not available - */ - static alertFFmpeg(): void { - const hasFFmpeg = Util.checkFFmpeg(); - - if (!hasFFmpeg) - console.warn( - '[Discord Player] FFmpeg/Avconv not found! Install via "npm install ffmpeg-static" or download from https://ffmpeg.org/download.html' - ); - } - - /** - * Resolves query type - * @param {String} query The query - * @returns {QueryType} - */ - static getQueryType(query: string): QueryType { - if (SoundcloudValidateURL(query) && !query.includes('/sets/')) return 'soundcloud_track'; - if (SoundcloudValidateURL(query) && query.includes('/sets/')) return 'soundcloud_playlist'; - if (spotifySongRegex.test(query)) return 'spotify_song'; - if (spotifyAlbumRegex.test(query)) return 'spotify_album'; - if (spotifyPlaylistRegex.test(query)) return 'spotify_playlist'; - if (YouTube.validate(query, 'PLAYLIST')) return 'youtube_playlist'; - if (YouTube.validate(query, 'VIDEO')) return 'youtube_video'; - if (vimeoRegex.test(query)) return 'vimeo'; - if (facebookRegex.test(query)) return 'facebook'; - if (reverbnationRegex.test(query)) return 'reverbnation'; - if (Util.isURL(query)) return 'attachment'; - - return 'youtube_search'; - } - - /** - * Checks if the given string is url - * @param {String} str URL to check - * @returns {Boolean} - */ - static isURL(str: string): boolean { - return str.length < 2083 && attachmentRegex.test(str); - } - - /** - * Returns Vimeo ID - * @param {String} query Vimeo link - * @returns {String} - */ - static getVimeoID(query: string): string { - return Util.getQueryType(query) === 'vimeo' - ? query - .split('/') - .filter((x) => !!x) - .pop() - : null; - } - - /** - * Parses ms time - * @param {Number} milliseconds Time to parse - * @returns {TimeData} - */ - static parseMS(milliseconds: number): TimeData { - const roundTowardsZero = milliseconds > 0 ? Math.floor : Math.ceil; - - return { - days: roundTowardsZero(milliseconds / 86400000), - hours: roundTowardsZero(milliseconds / 3600000) % 24, - minutes: roundTowardsZero(milliseconds / 60000) % 60, - seconds: roundTowardsZero(milliseconds / 1000) % 60 - }; - } - - /** - * Creates simple duration string - * @param {object} durObj Duration object - * @returns {String} - */ - static durationString(durObj: object): string { - return Object.values(durObj) - .map((m) => (isNaN(m) ? 0 : m)) - .join(':'); - } - - /** - * Makes youtube searches - * @param {String} query The query - * @param {any} options Options - * @returns {Promise} - */ - static ytSearch(query: string, options?: any): Promise { - return new Promise(async (resolve) => { - await YouTube.search(query, { - type: 'video', - safeSearch: Boolean(options?.player.options.useSafeSearch), - limit: options.limit ?? 10 - }) - .then((results) => { - resolve( - results.map( - (r) => - new Track(options?.player, { - title: r.title, - description: r.description, - author: r.channel.name, - url: r.url, - thumbnail: r.thumbnail.displayThumbnailURL(), - duration: Util.buildTimeCode(Util.parseMS(r.duration)), - views: r.views, - requestedBy: options?.user, - fromPlaylist: Boolean(options?.pl), - source: 'youtube' - }) - ) - ); - }) - .catch(() => resolve([])); - }); - } - - /** - * Checks if this system is running in replit.com - * @returns {Boolean} - */ - static isRepl(): boolean { - if ('DP_REPL_NOCHECK' in process.env) return false; - - const REPL_IT_PROPS = [ - 'REPL_SLUG', - 'REPL_OWNER', - 'REPL_IMAGE', - 'REPL_PUBKEYS', - 'REPL_ID', - 'REPL_LANGUAGE', - 'REPLIT_DB_URL' - ]; - - for (const prop of REPL_IT_PROPS) if (prop in process.env) return true; - - return false; - } - - /** - * Checks if the given voice channel is empty - * @param {DiscordVoiceChannel} channel The voice channel - * @returns {Boolean} - */ - static isVoiceEmpty(channel: VoiceChannel): boolean { - return channel.members.filter((member) => !member.user.bot).size === 0; - } - - /** - * Builds time code - * @param {object} data The data to build time code from - * @returns {String} - */ - static buildTimeCode(data: any): string { - const items = Object.keys(data); - const required = ['days', 'hours', 'minutes', 'seconds']; - - const parsed = items.filter((x) => required.includes(x)).map((m) => (data[m] > 0 ? data[m] : '')); - const final = parsed - .filter((x) => !!x) - .map((x) => x.toString().padStart(2, '0')) - .join(':'); - return final.length <= 3 ? `0:${final.padStart(2, '0') || 0}` : final; - } - - /** - * Manage CJS require - * @param {String} id id to require - * @returns {any} - */ - static require(id: string): any { - try { - return require(id); - } catch { - return null; - } - } -} - -export default Util; +export { } \ No newline at end of file From 8aa932d04df0200f54b402af4fbd609439a27027 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Fri, 11 Jun 2021 14:09:17 +0545 Subject: [PATCH 015/215] chore(deps): bump discord.js@dev --- package.json | 2 +- yarn.lock | 15 ++++----------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 160c880..3bad156 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "@types/node": "^14.14.41", "@types/ws": "^7.4.1", "discord-api-types": "^0.18.1", - "discord.js": "^13.0.0-dev.dda5ee2e9f0839d3e42d25114ae1b47355cdfd27", + "discord.js": "^13.0.0-dev.f5f3f772865ee98bbb44df938e0e71f9f8865c10", "discord.js-docgen": "discordjs/docgen#ts-patch", "jsdoc-babel": "^0.5.0", "prettier": "^2.2.1", diff --git a/yarn.lock b/yarn.lock index d81ad6f..c7150d8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1860,10 +1860,10 @@ discord.js-docgen@discordjs/docgen#ts-patch: tsubaki "^1.3.2" yargs "^14.0.0" -discord.js@^13.0.0-dev.dda5ee2e9f0839d3e42d25114ae1b47355cdfd27: - version "13.0.0-dev.dda5ee2e9f0839d3e42d25114ae1b47355cdfd27" - resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0-dev.dda5ee2e9f0839d3e42d25114ae1b47355cdfd27.tgz#aa3d76500ec2d27a5ba87bac10e3ff1979fdb6ec" - integrity sha512-2NU/APbSBQAVuFk246S8a+Z/9gH0SkWlLRql1IpBONTArJVlvkJ8hkC+69TE59CUlHJhOMo44M8r7gmRZheE0g== +discord.js@^13.0.0-dev.f5f3f772865ee98bbb44df938e0e71f9f8865c10: + version "13.0.0-dev.f5f3f772865ee98bbb44df938e0e71f9f8865c10" + resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0-dev.f5f3f772865ee98bbb44df938e0e71f9f8865c10.tgz#0fe3389e4befffd429ba37fc669b9153e87f33e5" + integrity sha512-VuGJMzXStqeeHmB3DDEShGHXGey215573kkbFxQinzrFYt1UNnQZ5d1ZmB7Y0oY3JSivpv3Whc5M/YtH41NMXQ== dependencies: "@discordjs/collection" "^0.1.6" "@discordjs/form-data" "^3.0.1" @@ -1872,8 +1872,6 @@ discord.js@^13.0.0-dev.dda5ee2e9f0839d3e42d25114ae1b47355cdfd27: abort-controller "^3.0.0" discord-api-types "^0.18.1" node-fetch "^2.6.1" - prism-media "^1.2.9" - tweetnacl "^1.0.3" ws "^7.4.6" dmd@^4.0.5: @@ -4195,11 +4193,6 @@ tsutils@^2.29.0: dependencies: tslib "^1.8.1" -tweetnacl@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" - integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== - type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" From 3bcbfd59d98a02f9b541c57a8c41b92bc82e520c Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Fri, 11 Jun 2021 14:51:51 +0545 Subject: [PATCH 016/215] basic voice interface --- .prettierrc | 5 +- src/VoiceNative/VoiceSubscription.ts | 90 ++++++++++++++++++++++++++++ src/VoiceNative/VoiceUtils.ts | 49 +++++++++++++++ 3 files changed, 142 insertions(+), 2 deletions(-) create mode 100644 src/VoiceNative/VoiceSubscription.ts create mode 100644 src/VoiceNative/VoiceUtils.ts diff --git a/.prettierrc b/.prettierrc index ab07ced..a8cf444 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,6 +1,7 @@ { "printWidth": 120, "trailingComma": "none", - "singleQuote": true, - "tabWidth": 4 + "singleQuote": false, + "tabWidth": 4, + "semi": true } \ No newline at end of file diff --git a/src/VoiceNative/VoiceSubscription.ts b/src/VoiceNative/VoiceSubscription.ts new file mode 100644 index 0000000..4b9b394 --- /dev/null +++ b/src/VoiceNative/VoiceSubscription.ts @@ -0,0 +1,90 @@ +import { + AudioPlayer, + AudioResource, + createAudioPlayer, + createAudioResource, + entersState, + StreamType, + VoiceConnection, + VoiceConnectionStatus +} from "@discordjs/voice"; +import { Duplex, Readable } from "stream"; + +class VoiceSubscription { + public readonly voiceConnection: VoiceConnection; + public readonly audioPlayer: AudioPlayer; + public connectPromise?: Promise; + + constructor(connection: VoiceConnection) { + this.voiceConnection = connection; + this.audioPlayer = createAudioPlayer(); + + connection.subscribe(this.audioPlayer); + + this.voiceConnection.on("stateChange", (_, newState) => { + if (newState.status === VoiceConnectionStatus.Disconnected) { + if (this.voiceConnection.reconnectAttempts < 5) { + setTimeout(() => { + if (this.voiceConnection.state.status === VoiceConnectionStatus.Disconnected) { + this.voiceConnection.reconnect(); + } + }, (this.voiceConnection.reconnectAttempts + 1) * 5000).unref(); + } else { + this.voiceConnection.destroy(); + } + } else if (newState.status === VoiceConnectionStatus.Destroyed) { + this.stop(); + } else if ( + !this.connectPromise && + (newState.status === VoiceConnectionStatus.Connecting || + newState.status === VoiceConnectionStatus.Signalling) + ) { + this.connectPromise = entersState(this.voiceConnection, VoiceConnectionStatus.Ready, 20000) + .then(() => undefined) + .catch(() => { + if (this.voiceConnection.state.status !== VoiceConnectionStatus.Destroyed) + this.voiceConnection.destroy(); + }) + .finally(() => (this.connectPromise = undefined)); + } + }); + } + + /** + * Creates stream + * @param {Readable|Duplex|string} src The stream source + * @param {({type?:StreamType;data?:any;inlineVolume?:boolean})} [ops] Options + * @returns {AudioResource} + */ + createStream(src: Readable | Duplex | string, ops?: { type?: StreamType, data?: any, inlineVolume?: boolean }) { + return createAudioResource(src, { + inputType: ops?.type ?? StreamType.Arbitrary, + metadata: ops?.data, + inlineVolume: Boolean(ops?.inlineVolume) + }); + } + + /** + * The player status + */ + get status() { + return this.audioPlayer.state.status; + } + + /** + * Stops the player + */ + stop() { + this.audioPlayer.stop(); + } + + /** + * Play stream + * @param {AudioResource} resource The audio resource to play + */ + playStream(resource: AudioResource) { + this.audioPlayer.play(resource); + } +} + +export { VoiceSubscription }; diff --git a/src/VoiceNative/VoiceUtils.ts b/src/VoiceNative/VoiceUtils.ts new file mode 100644 index 0000000..a694c90 --- /dev/null +++ b/src/VoiceNative/VoiceUtils.ts @@ -0,0 +1,49 @@ +import { VoiceChannel, StageChannel } from "discord.js"; +import { entersState, joinVoiceChannel, VoiceConnection, VoiceConnectionStatus } from "@discordjs/voice"; +import { VoiceSubscription } from "./VoiceSubscription"; + +class VoiceUtils { + + constructor() { + throw new Error("Cannot instantiate static class!"); + } + + /** + * Joins a voice channel + * @param {StageChannel|VoiceChannel} channel The voice channel + * @param {({deaf?: boolean;maxTime?: number;})} [options] Join options + * @returns {Promise} + */ + public static async connect( + channel: VoiceChannel | StageChannel, + options?: { + deaf?: boolean, + maxTime?: number + }): Promise { + let conn = joinVoiceChannel({ + guildId: channel.guild.id, + channelId: channel.id, + adapterCreator: channel.guild.voiceAdapterCreator, + selfDeaf: Boolean(options?.deaf) + }); + + try { + conn = await entersState(conn, VoiceConnectionStatus.Ready, options?.maxTime ?? 20000); + return new VoiceSubscription(conn); + } catch(err) { + conn.destroy(); + throw err; + } + } + + /** + * Disconnects voice connection + * @param {VoiceConnection} connection The voice connection + */ + public static disconnect(connection: VoiceConnection) { + connection.destroy(); + } + +} + +export { VoiceUtils } \ No newline at end of file From 875a554b633eda7ef626347266f7556019d7c7cc Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Fri, 11 Jun 2021 14:52:19 +0545 Subject: [PATCH 017/215] rename VoiceNative to VoiceInterface --- src/{VoiceNative => VoiceInterface}/VoiceSubscription.ts | 0 src/{VoiceNative => VoiceInterface}/VoiceUtils.ts | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/{VoiceNative => VoiceInterface}/VoiceSubscription.ts (100%) rename src/{VoiceNative => VoiceInterface}/VoiceUtils.ts (100%) diff --git a/src/VoiceNative/VoiceSubscription.ts b/src/VoiceInterface/VoiceSubscription.ts similarity index 100% rename from src/VoiceNative/VoiceSubscription.ts rename to src/VoiceInterface/VoiceSubscription.ts diff --git a/src/VoiceNative/VoiceUtils.ts b/src/VoiceInterface/VoiceUtils.ts similarity index 100% rename from src/VoiceNative/VoiceUtils.ts rename to src/VoiceInterface/VoiceUtils.ts From a0d3859230814e13e346a7734908a49e73674b30 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Fri, 11 Jun 2021 15:02:42 +0545 Subject: [PATCH 018/215] voice events --- package.json | 1 + src/VoiceInterface/VoiceSubscription.ts | 30 +++++++++++++++++++++---- src/VoiceInterface/VoiceUtils.ts | 13 +++++------ src/utils/AudioFilters.ts | 2 +- src/utils/Constants.ts | 2 +- src/utils/PlayerError.ts | 2 +- src/utils/Util.ts | 2 +- 7 files changed, 37 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index 3bad156..1a5d080 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ "discord-ytdl-core": "^5.0.3", "soundcloud-scraper": "^5.0.0", "spotify-url-info": "^2.2.3", + "tiny-typed-emitter": "^2.0.3", "youtube-sr": "^4.1.4", "ytdl-core": "^4.8.2" }, diff --git a/src/VoiceInterface/VoiceSubscription.ts b/src/VoiceInterface/VoiceSubscription.ts index 4b9b394..5e5ff23 100644 --- a/src/VoiceInterface/VoiceSubscription.ts +++ b/src/VoiceInterface/VoiceSubscription.ts @@ -1,5 +1,7 @@ import { AudioPlayer, + AudioPlayerError, + AudioPlayerStatus, AudioResource, createAudioPlayer, createAudioResource, @@ -9,18 +11,26 @@ import { VoiceConnectionStatus } from "@discordjs/voice"; import { Duplex, Readable } from "stream"; +import { TypedEmitter as EventEmitter } from "tiny-typed-emitter"; -class VoiceSubscription { +export interface VoiceEvents { + error: (error: AudioPlayerError) => any; + debug: (message: string) => any; + start: () => any; + finish: () => any; +} + +class VoiceSubscription extends EventEmitter { public readonly voiceConnection: VoiceConnection; public readonly audioPlayer: AudioPlayer; public connectPromise?: Promise; constructor(connection: VoiceConnection) { + super(); + this.voiceConnection = connection; this.audioPlayer = createAudioPlayer(); - connection.subscribe(this.audioPlayer); - this.voiceConnection.on("stateChange", (_, newState) => { if (newState.status === VoiceConnectionStatus.Disconnected) { if (this.voiceConnection.reconnectAttempts < 5) { @@ -48,6 +58,18 @@ class VoiceSubscription { .finally(() => (this.connectPromise = undefined)); } }); + + this.audioPlayer.on("stateChange", (oldState, newState) => { + if (newState.status === AudioPlayerStatus.Idle && oldState.status !== AudioPlayerStatus.Idle) { + void this.emit("finish"); + } else if (newState.status === AudioPlayerStatus.Playing) { + void this.emit("start"); + } + }); + + this.audioPlayer.on("debug", (m) => void this.emit("debug", m)); + this.audioPlayer.on("error", (error) => void this.emit("error", error)); + this.voiceConnection.subscribe(this.audioPlayer); } /** @@ -56,7 +78,7 @@ class VoiceSubscription { * @param {({type?:StreamType;data?:any;inlineVolume?:boolean})} [ops] Options * @returns {AudioResource} */ - createStream(src: Readable | Duplex | string, ops?: { type?: StreamType, data?: any, inlineVolume?: boolean }) { + createStream(src: Readable | Duplex | string, ops?: { type?: StreamType; data?: any; inlineVolume?: boolean }) { return createAudioResource(src, { inputType: ops?.type ?? StreamType.Arbitrary, metadata: ops?.data, diff --git a/src/VoiceInterface/VoiceUtils.ts b/src/VoiceInterface/VoiceUtils.ts index a694c90..f69d87c 100644 --- a/src/VoiceInterface/VoiceUtils.ts +++ b/src/VoiceInterface/VoiceUtils.ts @@ -3,7 +3,6 @@ import { entersState, joinVoiceChannel, VoiceConnection, VoiceConnectionStatus } import { VoiceSubscription } from "./VoiceSubscription"; class VoiceUtils { - constructor() { throw new Error("Cannot instantiate static class!"); } @@ -17,9 +16,10 @@ class VoiceUtils { public static async connect( channel: VoiceChannel | StageChannel, options?: { - deaf?: boolean, - maxTime?: number - }): Promise { + deaf?: boolean; + maxTime?: number; + } + ): Promise { let conn = joinVoiceChannel({ guildId: channel.guild.id, channelId: channel.id, @@ -30,7 +30,7 @@ class VoiceUtils { try { conn = await entersState(conn, VoiceConnectionStatus.Ready, options?.maxTime ?? 20000); return new VoiceSubscription(conn); - } catch(err) { + } catch (err) { conn.destroy(); throw err; } @@ -43,7 +43,6 @@ class VoiceUtils { public static disconnect(connection: VoiceConnection) { connection.destroy(); } - } -export { VoiceUtils } \ No newline at end of file +export { VoiceUtils }; diff --git a/src/utils/AudioFilters.ts b/src/utils/AudioFilters.ts index 3deda80..cb0ff5c 100644 --- a/src/utils/AudioFilters.ts +++ b/src/utils/AudioFilters.ts @@ -1 +1 @@ -export { } \ No newline at end of file +export {}; diff --git a/src/utils/Constants.ts b/src/utils/Constants.ts index 3deda80..cb0ff5c 100644 --- a/src/utils/Constants.ts +++ b/src/utils/Constants.ts @@ -1 +1 @@ -export { } \ No newline at end of file +export {}; diff --git a/src/utils/PlayerError.ts b/src/utils/PlayerError.ts index 3deda80..cb0ff5c 100644 --- a/src/utils/PlayerError.ts +++ b/src/utils/PlayerError.ts @@ -1 +1 @@ -export { } \ No newline at end of file +export {}; diff --git a/src/utils/Util.ts b/src/utils/Util.ts index 3deda80..cb0ff5c 100644 --- a/src/utils/Util.ts +++ b/src/utils/Util.ts @@ -1 +1 @@ -export { } \ No newline at end of file +export {}; From 3378d5cfd7da26611efefbeb429df80f17dcd789 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Fri, 11 Jun 2021 15:13:21 +0545 Subject: [PATCH 019/215] feat: @discordjs/voice --- src/VoiceInterface/VoiceSubscription.ts | 7 +++++++ src/VoiceInterface/VoiceUtils.ts | 5 +++-- src/index.ts | 3 ++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/VoiceInterface/VoiceSubscription.ts b/src/VoiceInterface/VoiceSubscription.ts index 5e5ff23..e41edc2 100644 --- a/src/VoiceInterface/VoiceSubscription.ts +++ b/src/VoiceInterface/VoiceSubscription.ts @@ -93,6 +93,13 @@ class VoiceSubscription extends EventEmitter { return this.audioPlayer.state.status; } + /** + * Disconnects from voice + */ + disconnect() { + this.voiceConnection.destroy(); + } + /** * Stops the player */ diff --git a/src/VoiceInterface/VoiceUtils.ts b/src/VoiceInterface/VoiceUtils.ts index f69d87c..3992152 100644 --- a/src/VoiceInterface/VoiceUtils.ts +++ b/src/VoiceInterface/VoiceUtils.ts @@ -40,8 +40,9 @@ class VoiceUtils { * Disconnects voice connection * @param {VoiceConnection} connection The voice connection */ - public static disconnect(connection: VoiceConnection) { - connection.destroy(); + public static disconnect(connection: VoiceConnection | VoiceSubscription) { + if (connection instanceof VoiceSubscription) return connection.voiceConnection.destroy(); + else connection.destroy(); } } diff --git a/src/index.ts b/src/index.ts index cb0ff5c..f4043fb 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1 +1,2 @@ -export {}; +export { VoiceUtils } from "./VoiceInterface/VoiceUtils"; +export { VoiceEvents, VoiceSubscription } from "./VoiceInterface/VoiceSubscription"; From e0abd1f7b8417e548a35fd6f4768b7e5b9c0f881 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Fri, 11 Jun 2021 15:23:47 +0545 Subject: [PATCH 020/215] VoiceSubscription#playStream: return self --- src/VoiceInterface/VoiceSubscription.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/VoiceInterface/VoiceSubscription.ts b/src/VoiceInterface/VoiceSubscription.ts index e41edc2..4ae9829 100644 --- a/src/VoiceInterface/VoiceSubscription.ts +++ b/src/VoiceInterface/VoiceSubscription.ts @@ -113,6 +113,8 @@ class VoiceSubscription extends EventEmitter { */ playStream(resource: AudioResource) { this.audioPlayer.play(resource); + + return this; } } From f8e8f2d8a9f224e91561a5551574d7f1b510ed97 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Fri, 11 Jun 2021 15:26:48 +0545 Subject: [PATCH 021/215] feat(VoiceSubscription): mirror basic methods --- src/VoiceInterface/VoiceSubscription.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/VoiceInterface/VoiceSubscription.ts b/src/VoiceInterface/VoiceSubscription.ts index 4ae9829..db782d3 100644 --- a/src/VoiceInterface/VoiceSubscription.ts +++ b/src/VoiceInterface/VoiceSubscription.ts @@ -107,6 +107,14 @@ class VoiceSubscription extends EventEmitter { this.audioPlayer.stop(); } + pause(interpolateSilence?: boolean) { + return this.audioPlayer.pause(interpolateSilence); + } + + resume() { + return this.audioPlayer.unpause(); + } + /** * Play stream * @param {AudioResource} resource The audio resource to play From d5fda6cf1e0329ac56e3bea15d94b05b6026bc0f Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Fri, 11 Jun 2021 15:30:27 +0545 Subject: [PATCH 022/215] feat: import basic stuff from v4 --- src/VoiceInterface/VoiceUtils.ts | 2 +- src/index.ts | 2 + src/types/types.ts | 33 +++++++++- src/utils/AudioFilters.ts | 109 ++++++++++++++++++++++++++++++- src/utils/PlayerError.ts | 11 +++- 5 files changed, 153 insertions(+), 4 deletions(-) diff --git a/src/VoiceInterface/VoiceUtils.ts b/src/VoiceInterface/VoiceUtils.ts index 3992152..3d3189e 100644 --- a/src/VoiceInterface/VoiceUtils.ts +++ b/src/VoiceInterface/VoiceUtils.ts @@ -42,7 +42,7 @@ class VoiceUtils { */ public static disconnect(connection: VoiceConnection | VoiceSubscription) { if (connection instanceof VoiceSubscription) return connection.voiceConnection.destroy(); - else connection.destroy(); + return connection.destroy(); } } diff --git a/src/index.ts b/src/index.ts index f4043fb..5061c5a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,2 +1,4 @@ +export { AudioFilters } from "./utils/AudioFilters"; +export { PlayerError } from "./utils/PlayerError"; export { VoiceUtils } from "./VoiceInterface/VoiceUtils"; export { VoiceEvents, VoiceSubscription } from "./VoiceInterface/VoiceSubscription"; diff --git a/src/types/types.ts b/src/types/types.ts index cb0ff5c..fc657f8 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -1 +1,32 @@ -export {}; +export type FiltersName = keyof QueueFilters; + +export type QueueFilters = { + bassboost?: boolean; + "8D"?: boolean; + vaporwave?: boolean; + nightcore?: boolean; + phaser?: boolean; + tremolo?: boolean; + vibrato?: boolean; + reverse?: boolean; + treble?: boolean; + normalizer?: boolean; + surrounding?: boolean; + pulsator?: boolean; + subboost?: boolean; + karaoke?: boolean; + flanger?: boolean; + gate?: boolean; + haas?: boolean; + mcompand?: boolean; + mono?: boolean; + mstlr?: boolean; + mstrr?: boolean; + compressor?: boolean; + expander?: boolean; + softlimiter?: boolean; + chorus?: boolean; + chorus2d?: boolean; + chorus3d?: boolean; + fadein?: boolean; +}; diff --git a/src/utils/AudioFilters.ts b/src/utils/AudioFilters.ts index cb0ff5c..7ebf8e6 100644 --- a/src/utils/AudioFilters.ts +++ b/src/utils/AudioFilters.ts @@ -1 +1,108 @@ -export {}; +import { FiltersName } from "../types/types"; + +/** + * The available audio filters + * @typedef {Object} AudioFilters + * @property {String} bassboost The bassboost filter + * @property {String} 8D The 8D filter + * @property {String} vaporwave The vaporwave filter + * @property {String} nightcore The nightcore filter + * @property {String} phaser The phaser filter + * @property {String} tremolo The tremolo filter + * @property {String} vibrato The vibrato filter + * @property {String} reverse The reverse filter + * @property {String} treble The treble filter + * @property {String} normalizer The normalizer filter + * @property {String} surrounding The surrounding filter + * @property {String} pulsator The pulsator filter + * @property {String} subboost The subboost filter + * @property {String} kakaoke The kakaoke filter + * @property {String} flanger The flanger filter + * @property {String} gate The gate filter + * @property {String} haas The haas filter + * @property {String} mcompand The mcompand filter + * @property {String} mono The mono filter + * @property {String} mstlr The mstlr filter + * @property {String} mstrr The mstrr filter + * @property {String} compressor The compressor filter + * @property {String} expander The expander filter + * @property {String} softlimiter The softlimiter filter + * @property {String} chorus The chorus filter + * @property {String} chorus2d The chorus2d filter + * @property {String} chorus3d The chorus3d filter + * @property {String} fadein The fadein filter + */ + +const FilterList = { + bassboost: "bass=g=20", + "8D": "apulsator=hz=0.09", + vaporwave: "aresample=48000,asetrate=48000*0.8", + nightcore: "aresample=48000,asetrate=48000*1.25", + phaser: "aphaser=in_gain=0.4", + tremolo: "tremolo", + vibrato: "vibrato=f=6.5", + reverse: "areverse", + treble: "treble=g=5", + normalizer: "dynaudnorm=g=101", + surrounding: "surround", + pulsator: "apulsator=hz=1", + subboost: "asubboost", + karaoke: "stereotools=mlev=0.03", + flanger: "flanger", + gate: "agate", + haas: "haas", + mcompand: "mcompand", + mono: "pan=mono|c0=.5*c0+.5*c1", + mstlr: "stereotools=mode=ms>lr", + mstrr: "stereotools=mode=ms>rr", + compressor: "compand=points=-80/-105|-62/-80|-15.4/-15.4|0/-12|20/-7.6", + expander: "compand=attacks=0:points=-80/-169|-54/-80|-49.5/-64.6|-41.1/-41.1|-25.8/-15|-10.8/-4.5|0/0|20/8.3", + softlimiter: "compand=attacks=0:points=-80/-80|-12.4/-12.4|-6/-8|0/-6.8|20/-2.8", + chorus: "chorus=0.7:0.9:55:0.4:0.25:2", + chorus2d: "chorus=0.6:0.9:50|60:0.4|0.32:0.25|0.4:2|1.3", + chorus3d: "chorus=0.5:0.9:50|60|40:0.4|0.32|0.3:0.25|0.4|0.3:2|2.3|1.3", + fadein: "afade=t=in:ss=0:d=10", + + *[Symbol.iterator](): IterableIterator<{ name: FiltersName; value: string }> { + for (const [k, v] of Object.entries(this)) { + if (typeof this[k as FiltersName] === "string") yield { name: k as FiltersName, value: v as string }; + } + }, + + get names() { + return Object.keys(this).filter( + (p) => !["names", "length"].includes(p) && typeof this[p as FiltersName] !== "function" + ); + }, + + get length() { + return Object.keys(this).filter( + (p) => !["names", "length"].includes(p) && typeof this[p as FiltersName] !== "function" + ).length; + }, + + toString() { + return `${Object.values(this).join(",")}`; + }, + + create(filter?: FiltersName[]): string { + if (!filter || !Array.isArray(filter)) return this.toString(); + return filter + .filter((predicate) => typeof predicate === "string") + .map((m) => this[m]) + .join(","); + }, + + define(filterName: string, value: string): void { + if (typeof this[filterName as FiltersName] && typeof this[filterName as FiltersName] === "function") return; + + this[filterName as FiltersName] = value; + }, + + defineBulk(filterArray: { name: string; value: string }[]): void { + filterArray.forEach((arr) => this.define(arr.name, arr.value)); + } +}; + +export default FilterList; +export { FilterList as AudioFilters }; diff --git a/src/utils/PlayerError.ts b/src/utils/PlayerError.ts index cb0ff5c..af8110d 100644 --- a/src/utils/PlayerError.ts +++ b/src/utils/PlayerError.ts @@ -1 +1,10 @@ -export {}; +export default class PlayerError extends Error { + constructor(msg: string, name?: string) { + super(); + this.name = name ?? "PlayerError"; + this.message = msg; + Error.captureStackTrace(this); + } +} + +export { PlayerError }; From 1e45ebc54ca920a045482f1e45b3e2a65d8b65e5 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Fri, 11 Jun 2021 16:17:22 +0545 Subject: [PATCH 023/215] feat(Structures): basic setup --- src/Player.ts | 29 +++++- src/Structures/ExtractorModel.ts | 70 +++++++++++++- src/Structures/Queue.ts | 56 ++++++++++- src/Structures/Track.ts | 156 ++++++++++++++++++++++++++++++- src/types/types.ts | 64 +++++++++++++ 5 files changed, 371 insertions(+), 4 deletions(-) diff --git a/src/Player.ts b/src/Player.ts index cb0ff5c..917bcbf 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -1 +1,28 @@ -export {}; +import { Client, Collection, Guild, Snowflake } from "discord.js"; +import { TypedEmitter as EventEmitter } from "tiny-typed-emitter"; +import { Queue } from "./Structures/Queue"; +import { PlayerOptions } from "./types/types"; + +class DiscordPlayer extends EventEmitter { + public readonly client: Client; + public readonly queues = new Collection(); + + constructor(client: Client) { + super(); + this.client = client; + } + + createQueue(guild: Guild, queueInitOptions?: PlayerOptions) { + if (this.queues.has(guild.id)) return this.queues.get(guild.id); + const queue = new Queue(this, guild, queueInitOptions); + this.queues.set(guild.id, queue); + + return queue; + } + + getQueue(guild: Snowflake) { + return this.queues.get(guild); + } +} + +export { DiscordPlayer as Player }; diff --git a/src/Structures/ExtractorModel.ts b/src/Structures/ExtractorModel.ts index cb0ff5c..dbbdae7 100644 --- a/src/Structures/ExtractorModel.ts +++ b/src/Structures/ExtractorModel.ts @@ -1 +1,69 @@ -export {}; +import { ExtractorModelData } from "../types/types"; + +class ExtractorModel { + name: string; + private _raw: any; + + /** + * Model for raw Discord Player extractors + * @param {String} extractorName Name of the extractor + * @param {Object} data Extractor object + */ + constructor(extractorName: string, data: any) { + /** + * The extractor name + * @type {String} + */ + this.name = extractorName; + + Object.defineProperty(this, "_raw", { value: data, configurable: false, writable: false, enumerable: false }); + } + + /** + * Method to handle requests from `Player.play()` + * @param {String} query Query to handle + * @returns {Promise} + */ + async handle(query: string): Promise { + const data = await this._raw.getInfo(query); + if (!data) return null; + + return { + title: data.title, + duration: data.duration, + thumbnail: data.thumbnail, + engine: data.engine, + views: data.views, + author: data.author, + description: data.description, + url: data.url + }; + } + + /** + * Method used by Discord Player to validate query with this extractor + * @param {String} query The query to validate + * @returns {Boolean} + */ + validate(query: string): boolean { + return Boolean(this._raw.validate(query)); + } + + /** + * The extractor version + * @type {String} + */ + get version(): string { + return this._raw.version ?? "0.0.0"; + } + + /** + * If player should mark this extractor as important + * @type {Boolean} + */ + get important(): boolean { + return Boolean(this._raw.important); + } +} + +export { ExtractorModel }; diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index cb0ff5c..abe7073 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -1 +1,55 @@ -export {}; +import { Guild, StageChannel, VoiceChannel } from "discord.js"; +import { Player } from "../Player"; +import { VoiceUtils } from "../VoiceInterface/VoiceUtils"; +import { VoiceSubscription } from "../VoiceInterface/VoiceSubscription"; +import Track from "./Track"; +import { PlayerOptions } from "../types/types"; + +class Queue { + public readonly guild: Guild; + public readonly player: Player; + public voiceConnection: VoiceSubscription; + public tracks: Track[] = []; + public options: PlayerOptions; + + constructor(player: Player, guild: Guild, options: PlayerOptions = {}) { + this.player = player; + this.guild = guild; + this.options = {}; + + Object.assign( + this.options, + { + leaveOnEnd: true, + leaveOnEndCooldown: 1000, + leaveOnStop: true, + leaveOnEmpty: true, + leaveOnEmptyCooldown: 1000, + autoSelfDeaf: true, + enableLive: false, + ytdlDownloadOptions: {}, + useSafeSearch: false, + disableAutoRegister: false, + fetchBeforeQueued: false + } as PlayerOptions, + options + ); + } + + async joinVoiceChannel(channel: StageChannel | VoiceChannel) { + if (!["stage", "voice"].includes(channel.type)) + throw new TypeError(`Channel type must be voice or stage, got ${channel.type}!`); + const connection = await VoiceUtils.connect(channel); + this.voiceConnection = connection; + + return this; + } + + destroy() { + this.voiceConnection.stop(); + this.voiceConnection.disconnect(); + this.player.queues.delete(this.guild.id); + } +} + +export { Queue }; diff --git a/src/Structures/Track.ts b/src/Structures/Track.ts index cb0ff5c..ee5e79e 100644 --- a/src/Structures/Track.ts +++ b/src/Structures/Track.ts @@ -1 +1,155 @@ -export {}; +import { User } from "discord.js"; +import { Player } from "../Player"; +import { RawTrackData } from "../types/types"; +import { Queue } from "./Queue"; + +class Track { + public player!: Player; + public title!: string; + public description!: string; + public author!: string; + public url!: string; + public thumbnail!: string; + public duration!: string; + public views!: number; + public requestedBy!: User; + public fromPlaylist!: boolean; + public raw!: RawTrackData; + + /** + * Track constructor + * @param {Player} player The player that instantiated this Track + * @param {RawTrackData} data Track data + */ + constructor(player: Player, data: RawTrackData) { + /** + * The player that instantiated this Track + * @name Track#player + * @type {Player} + * @readonly + */ + Object.defineProperty(this, "player", { value: player, enumerable: false }); + + /** + * Title of this track + * @name Track#title + * @type {String} + */ + + /** + * Description of this track + * @name Track#description + * @type {String} + */ + + /** + * Author of this track + * @name Track#author + * @type {String} + */ + + /** + * URL of this track + * @name Track#url + * @type {String} + */ + + /** + * Thumbnail of this track + * @name Track#thumbnail + * @type {String} + */ + + /** + * Duration of this track + * @name Track#duration + * @type {String} + */ + + /** + * Views count of this track + * @name Track#views + * @type {Number} + */ + + /** + * Person who requested this track + * @name Track#requestedBy + * @type {DiscordUser} + */ + + /** + * If this track belongs to playlist + * @name Track#fromPlaylist + * @type {Boolean} + */ + + /** + * Raw track data + * @name Track#raw + * @type {RawTrackData} + */ + + void this._patch(data); + } + + private _patch(data: RawTrackData) { + this.title = data.title ?? ""; + this.author = data.author ?? ""; + this.url = data.url ?? ""; + this.thumbnail = data.thumbnail ?? ""; + this.duration = data.duration ?? ""; + this.views = data.views ?? 0; + this.requestedBy = data.requestedBy; + this.fromPlaylist = Boolean(data.fromPlaylist); + + // raw + Object.defineProperty(this, "raw", { get: () => data, enumerable: false }); + } + + /** + * The queue in which this track is located + * @type {Queue} + */ + get queue(): Queue { + return this.player.queues.find((q) => q.tracks.includes(this)); + } + + /** + * The track duration in millisecond + * @type {Number} + */ + get durationMS(): number { + const times = (n: number, t: number) => { + let tn = 1; + for (let i = 0; i < t; i++) tn *= n; + return t <= 0 ? 1000 : tn * 1000; + }; + + return this.duration + .split(":") + .reverse() + .map((m, i) => parseInt(m) * times(60, i)) + .reduce((a, c) => a + c, 0); + } + + /** + * Returns source of this track + * @type {TrackSource} + */ + get source() { + return this.raw.source ?? "arbitrary"; + } + + /** + * String representation of this track + * @returns {String} + */ + toString(): string { + return `${this.title} by ${this.author}`; + } +} + +export default Track; + +export { Track }; diff --git a/src/types/types.ts b/src/types/types.ts index fc657f8..bb00c05 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -1,3 +1,7 @@ +import { User } from "discord.js"; +import { downloadOptions } from "ytdl-core"; +import { Readable, Duplex } from "stream"; + export type FiltersName = keyof QueueFilters; export type QueueFilters = { @@ -30,3 +34,63 @@ export type QueueFilters = { chorus3d?: boolean; fadein?: boolean; }; + +export type TrackSource = "soundcloud" | "youtube" | "spotify" | "arbitrary"; + +export interface RawTrackData { + title: string; + description: string; + author: string; + url: string; + thumbnail: string; + duration: string; + views: number; + requestedBy: User; + fromPlaylist: boolean; + source?: TrackSource; + engine?: any; + live?: boolean; +} + +export interface TimeData { + days: number; + hours: number; + minutes: number; + seconds: number; +} + +export interface PlayerProgressbarOptions { + timecodes?: boolean; + queue?: boolean; + length?: number; + line?: string; + indicator?: string; +} + +export interface PlayerOptions { + leaveOnEnd?: boolean; + leaveOnEndCooldown?: number; + leaveOnStop?: boolean; + leaveOnEmpty?: boolean; + leaveOnEmptyCooldown?: number; + autoSelfDeaf?: boolean; + enableLive?: boolean; + ytdlDownloadOptions?: downloadOptions; + useSafeSearch?: boolean; + disableAutoRegister?: boolean; + fetchBeforeQueued?: boolean; +} + +export interface ExtractorModelData { + title: string; + duration: number; + thumbnail: string; + engine: string | Readable | Duplex; + views: number; + author: string; + description: string; + url: string; + version?: string; + important?: boolean; + source?: TrackSource; +} From 5d5fd03997f777326b2a84fb2482ea53afb7a24e Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Fri, 11 Jun 2021 16:20:04 +0545 Subject: [PATCH 024/215] feat(Structures): basic setup --- src/Structures/Playlist.ts | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Structures/Playlist.ts b/src/Structures/Playlist.ts index cb0ff5c..69eafab 100644 --- a/src/Structures/Playlist.ts +++ b/src/Structures/Playlist.ts @@ -1 +1,15 @@ -export {}; +import { Player } from "../Player"; +import { Track } from "./Track"; + +class Playlist { + public readonly player: Player; + public tracks: Track[]; + + constructor(player: Player, tracks: Track[]) { + this.player = player; + this.tracks = tracks ?? []; + } + +} + +export { Playlist }; From 19039f8d9b19b438500cbcc03de61e4d4f00c5e0 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Fri, 11 Jun 2021 17:35:43 +0545 Subject: [PATCH 025/215] feat(VoiceInterface): metadata --- src/Player.ts | 2 ++ src/Structures/Playlist.ts | 1 - src/Structures/Queue.ts | 11 +++++++++-- src/VoiceInterface/VoiceSubscription.ts | 16 ++++++++++++++-- src/VoiceInterface/VoiceUtils.ts | 18 +++++++++++------- 5 files changed, 36 insertions(+), 12 deletions(-) diff --git a/src/Player.ts b/src/Player.ts index 917bcbf..f1d3f49 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -1,11 +1,13 @@ import { Client, Collection, Guild, Snowflake } from "discord.js"; import { TypedEmitter as EventEmitter } from "tiny-typed-emitter"; import { Queue } from "./Structures/Queue"; +import { VoiceUtils } from "./VoiceInterface/VoiceUtils"; import { PlayerOptions } from "./types/types"; class DiscordPlayer extends EventEmitter { public readonly client: Client; public readonly queues = new Collection(); + public readonly voiceUtils = new VoiceUtils(); constructor(client: Client) { super(); diff --git a/src/Structures/Playlist.ts b/src/Structures/Playlist.ts index 69eafab..44f1643 100644 --- a/src/Structures/Playlist.ts +++ b/src/Structures/Playlist.ts @@ -9,7 +9,6 @@ class Playlist { this.player = player; this.tracks = tracks ?? []; } - } export { Playlist }; diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index abe7073..b86b96b 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -1,6 +1,5 @@ import { Guild, StageChannel, VoiceChannel } from "discord.js"; import { Player } from "../Player"; -import { VoiceUtils } from "../VoiceInterface/VoiceUtils"; import { VoiceSubscription } from "../VoiceInterface/VoiceSubscription"; import Track from "./Track"; import { PlayerOptions } from "../types/types"; @@ -36,10 +35,14 @@ class Queue { ); } + get current() { + return this.voiceConnection.audioResource?.metadata ?? this.tracks[0]; + } + async joinVoiceChannel(channel: StageChannel | VoiceChannel) { if (!["stage", "voice"].includes(channel.type)) throw new TypeError(`Channel type must be voice or stage, got ${channel.type}!`); - const connection = await VoiceUtils.connect(channel); + const connection = await this.player.voiceUtils.connect(channel); this.voiceConnection = connection; return this; @@ -50,6 +53,10 @@ class Queue { this.voiceConnection.disconnect(); this.player.queues.delete(this.guild.id); } + + play() { + throw new Error("Not implemented"); + } } export { Queue }; diff --git a/src/VoiceInterface/VoiceSubscription.ts b/src/VoiceInterface/VoiceSubscription.ts index db782d3..fb12731 100644 --- a/src/VoiceInterface/VoiceSubscription.ts +++ b/src/VoiceInterface/VoiceSubscription.ts @@ -12,6 +12,8 @@ import { } from "@discordjs/voice"; import { Duplex, Readable } from "stream"; import { TypedEmitter as EventEmitter } from "tiny-typed-emitter"; +import Track from "../Structures/Track"; +import PlayerError from "../utils/PlayerError"; export interface VoiceEvents { error: (error: AudioPlayerError) => any; @@ -24,6 +26,7 @@ class VoiceSubscription extends EventEmitter { public readonly voiceConnection: VoiceConnection; public readonly audioPlayer: AudioPlayer; public connectPromise?: Promise; + public audioResource?: AudioResource; constructor(connection: VoiceConnection) { super(); @@ -79,11 +82,13 @@ class VoiceSubscription extends EventEmitter { * @returns {AudioResource} */ createStream(src: Readable | Duplex | string, ops?: { type?: StreamType; data?: any; inlineVolume?: boolean }) { - return createAudioResource(src, { + this.audioResource = createAudioResource(src, { inputType: ops?.type ?? StreamType.Arbitrary, metadata: ops?.data, inlineVolume: Boolean(ops?.inlineVolume) }); + + return this.audioResource; } /** @@ -119,11 +124,18 @@ class VoiceSubscription extends EventEmitter { * Play stream * @param {AudioResource} resource The audio resource to play */ - playStream(resource: AudioResource) { + playStream(resource: AudioResource = this.audioResource) { + if (!resource) throw new PlayerError("Audio resource is not available!"); + if (!this.audioResource && resource) this.audioResource = resource; this.audioPlayer.play(resource); return this; } + + get streamTime() { + if (!this.audioResource) return 0; + return this.audioResource.playbackDuration; + } } export { VoiceSubscription }; diff --git a/src/VoiceInterface/VoiceUtils.ts b/src/VoiceInterface/VoiceUtils.ts index 3d3189e..093af34 100644 --- a/src/VoiceInterface/VoiceUtils.ts +++ b/src/VoiceInterface/VoiceUtils.ts @@ -1,11 +1,9 @@ -import { VoiceChannel, StageChannel } from "discord.js"; +import { VoiceChannel, StageChannel, Collection, Snowflake } from "discord.js"; import { entersState, joinVoiceChannel, VoiceConnection, VoiceConnectionStatus } from "@discordjs/voice"; import { VoiceSubscription } from "./VoiceSubscription"; class VoiceUtils { - constructor() { - throw new Error("Cannot instantiate static class!"); - } + public cache = new Collection(); /** * Joins a voice channel @@ -13,7 +11,7 @@ class VoiceUtils { * @param {({deaf?: boolean;maxTime?: number;})} [options] Join options * @returns {Promise} */ - public static async connect( + public async connect( channel: VoiceChannel | StageChannel, options?: { deaf?: boolean; @@ -29,7 +27,9 @@ class VoiceUtils { try { conn = await entersState(conn, VoiceConnectionStatus.Ready, options?.maxTime ?? 20000); - return new VoiceSubscription(conn); + const sub = new VoiceSubscription(conn); + this.cache.set(channel.guild.id, sub); + return sub; } catch (err) { conn.destroy(); throw err; @@ -40,10 +40,14 @@ class VoiceUtils { * Disconnects voice connection * @param {VoiceConnection} connection The voice connection */ - public static disconnect(connection: VoiceConnection | VoiceSubscription) { + public disconnect(connection: VoiceConnection | VoiceSubscription) { if (connection instanceof VoiceSubscription) return connection.voiceConnection.destroy(); return connection.destroy(); } + + public getConnection(guild: Snowflake) { + return this.cache.get(guild); + } } export { VoiceUtils }; From 95a2c5d45e1147407f3ba2a799fc41a4d93366b0 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Fri, 11 Jun 2021 17:37:32 +0545 Subject: [PATCH 026/215] chore(deps): bump @discordjs/voice --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 1a5d080..4a97273 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ }, "homepage": "https://github.com/Androz2091/discord-player#readme", "dependencies": { - "@discordjs/voice": "^0.3.0", + "@discordjs/voice": "^0.3.1", "discord-ytdl-core": "^5.0.3", "soundcloud-scraper": "^5.0.0", "spotify-url-info": "^2.2.3", diff --git a/yarn.lock b/yarn.lock index c7150d8..5cf7134 100644 --- a/yarn.lock +++ b/yarn.lock @@ -956,10 +956,10 @@ "@discordjs/node-pre-gyp" "^0.3.2" node-addon-api "^3.1.0" -"@discordjs/voice@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@discordjs/voice/-/voice-0.3.0.tgz#1ec84c49e8d69ff4c64ffdf05c39e6599ada7907" - integrity sha512-jPtzfjCmHe1JmWbwsQ7YYfSHBaglVy5ewDROL4BQpyA60Dpo54ksB0Hv1T2L/B7tRM5nCMo5PDuElaZOBqaTmA== +"@discordjs/voice@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@discordjs/voice/-/voice-0.3.1.tgz#326ba416454a441161a77884fe5142323e20104a" + integrity sha512-La+tv7sGEu7qPVfweur9nEd9FO+09iGgZu+CIDUKYP2MKAZqq+KE3D0Q5Xy+qF6iIFRXEzu5T+2f9DeKTppCDQ== dependencies: "@types/ws" "^7.4.4" discord-api-types "^0.18.1" From de67a9815019b9d8e6294648667ce876a4407284 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Fri, 11 Jun 2021 20:40:30 +0545 Subject: [PATCH 027/215] query resolver --- src/types/types.ts | 16 +++++++++++++ src/utils/QueryResolver.ts | 48 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 src/utils/QueryResolver.ts diff --git a/src/types/types.ts b/src/types/types.ts index bb00c05..414ba9e 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -94,3 +94,19 @@ export interface ExtractorModelData { important?: boolean; source?: TrackSource; } + +export enum QueryType { + YOUTUBE = "youtube", + YOUTUBE_PLAYLIST = "youtube_playlist", + SOUNDCLOUD_TRACK = "soundcloud_track", + SOUNDCLOUD_PLAYLIST = "soundcloud_playlist", + SOUNDCLOUD = "soundcloud", + SPOTIFY_SONG = "spotify_song", + SPOTIFY_ALBUM = "spotify_album", + SPOTIFY_PLAYLIST = "spotify_playlist", + FACEBOOK = "facebook", + VIMEO = "vimeo", + ARBITRARY = "arbitrary", + REVERBNATION = "reverbnation", + YOUTUBE_SEARCH = "youtube_search" +} diff --git a/src/utils/QueryResolver.ts b/src/utils/QueryResolver.ts new file mode 100644 index 0000000..1e7544a --- /dev/null +++ b/src/utils/QueryResolver.ts @@ -0,0 +1,48 @@ +import { validateID, validateURL } from "ytdl-core"; +import { YouTube } from "youtube-sr"; +import { QueryType } from "../types/types"; +// @ts-ignore +import { validateURL as SoundcloudValidateURL } from "soundcloud-scraper"; + +// scary things below *sigh* +const spotifySongRegex = /https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(?:track\/|\?uri=spotify:track:)((\w|-){22})/; +const spotifyPlaylistRegex = + /https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(?:playlist\/|\?uri=spotify:playlist:)((\w|-){22})/; +const spotifyAlbumRegex = /https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(?:album\/|\?uri=spotify:album:)((\w|-){22})/; +const vimeoRegex = + /(http|https)?:\/\/(www\.|player\.)?vimeo\.com\/(?:channels\/(?:\w+\/)?|groups\/([^/]*)\/videos\/|video\/|)(\d+)(?:|\/\?)/; +const facebookRegex = /(https?:\/\/)(www\.|m\.)?(facebook|fb).com\/.*\/videos\/.*/; +const reverbnationRegex = /https:\/\/(www.)?reverbnation.com\/(.+)\/song\/(.+)/; +const attachmentRegex = + /^(?:(?:https?|ftp):\/\/)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/\S*)?$/; +// scary things above *sigh* + +class QueryResolver { + + static resolve(query: string): QueryType { + if (SoundcloudValidateURL(query, "track")) return QueryType.SOUNDCLOUD_TRACK; + if (SoundcloudValidateURL(query, "playlist") || query.includes("/sets/")) return QueryType.SOUNDCLOUD_PLAYLIST; + if (validateID(query) || validateURL(query)) return QueryType.YOUTUBE; + if (YouTube.validate(query, "PLAYLIST_ID")) return QueryType.YOUTUBE_PLAYLIST; + if (spotifySongRegex.test(query)) return QueryType.SPOTIFY_SONG; + if (spotifyPlaylistRegex.test(query)) return QueryType.SPOTIFY_PLAYLIST; + if (spotifyAlbumRegex.test(query)) return QueryType.SPOTIFY_ALBUM; + if (vimeoRegex.test(query)) return QueryType.VIMEO; + if (facebookRegex.test(query)) return QueryType.FACEBOOK; + if (reverbnationRegex.test(query)) return QueryType.REVERBNATION; + if (attachmentRegex.test(query)) return QueryType.ARBITRARY; + + return QueryType.YOUTUBE_SEARCH; + } + + static getVimeoID(query: string): string { + return QueryResolver.resolve(query) === QueryType.VIMEO + ? query + .split("/") + .filter((x) => !!x) + .pop() + : null; + } +} + +export { QueryResolver }; From 5ba21c33375837a1795913417b3f1de560eac105 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Fri, 11 Jun 2021 20:42:49 +0545 Subject: [PATCH 028/215] feat(Structures): Generator function --- src/Player.ts | 4 ++++ src/Structures/Playlist.ts | 4 ++++ src/Structures/Queue.ts | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/src/Player.ts b/src/Player.ts index f1d3f49..642cbe8 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -25,6 +25,10 @@ class DiscordPlayer extends EventEmitter { getQueue(guild: Snowflake) { return this.queues.get(guild); } + + *[Symbol.iterator]() { + yield* Array.from(this.queues.values()); + } } export { DiscordPlayer as Player }; diff --git a/src/Structures/Playlist.ts b/src/Structures/Playlist.ts index 44f1643..04a81c2 100644 --- a/src/Structures/Playlist.ts +++ b/src/Structures/Playlist.ts @@ -9,6 +9,10 @@ class Playlist { this.player = player; this.tracks = tracks ?? []; } + + *[Symbol.iterator]() { + yield* this.tracks; + } } export { Playlist }; diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index b86b96b..095c1f2 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -57,6 +57,10 @@ class Queue { play() { throw new Error("Not implemented"); } + + *[Symbol.iterator]() { + yield* this.tracks; + } } export { Queue }; From 181131f75550a299ba17ee0aef81471d49ed5e41 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sat, 12 Jun 2021 00:04:52 +0545 Subject: [PATCH 029/215] basic player --- src/Player.ts | 45 +++++++- src/Structures/Queue.ts | 107 ++++++++++++++++-- src/Structures/Track.ts | 21 +++- ...bscription.ts => BasicStreamDispatcher.ts} | 24 ++-- src/VoiceInterface/VoiceUtils.ts | 14 +-- src/index.ts | 2 +- src/types/types.ts | 23 ++++ src/utils/QueryResolver.ts | 1 - tsconfig.json | 3 +- 9 files changed, 206 insertions(+), 34 deletions(-) rename src/VoiceInterface/{VoiceSubscription.ts => BasicStreamDispatcher.ts} (87%) diff --git a/src/Player.ts b/src/Player.ts index 642cbe8..264021c 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -1,10 +1,13 @@ -import { Client, Collection, Guild, Snowflake } from "discord.js"; +import { Client, Collection, Guild, Snowflake, User } from "discord.js"; import { TypedEmitter as EventEmitter } from "tiny-typed-emitter"; import { Queue } from "./Structures/Queue"; import { VoiceUtils } from "./VoiceInterface/VoiceUtils"; -import { PlayerOptions } from "./types/types"; +import { PlayerEvents, PlayerOptions, QueryType } from "./types/types"; +import Track from "./Structures/Track"; +import { QueryResolver } from "./utils/QueryResolver"; +import YouTube from "youtube-sr"; -class DiscordPlayer extends EventEmitter { +class DiscordPlayer extends EventEmitter { public readonly client: Client; public readonly queues = new Collection(); public readonly voiceUtils = new VoiceUtils(); @@ -26,6 +29,42 @@ class DiscordPlayer extends EventEmitter { return this.queues.get(guild); } + /** + * Search tracks + * @param {string|Track} query The search query + * @param {User} requestedBy The person who requested track search + * @returns {Promise} + */ + async search(query: string | Track, requestedBy: User) { + if (query instanceof Track) return [query]; + + // @todo: add extractors + const qt = QueryResolver.resolve(query); + switch (qt) { + case QueryType.YOUTUBE: { + const videos = await YouTube.search(qt, { + type: "video" + }); + + return videos.map( + (m) => + new Track(this, { + title: m.title, + description: m.description, + author: m.channel?.name, + url: m.url, + requestedBy: requestedBy, + thumbnail: m.thumbnail?.displayThumbnailURL("maxresdefault"), + views: m.views, + fromPlaylist: false, + duration: m.durationFormatted, + raw: m + }) + ); + } + } + } + *[Symbol.iterator]() { yield* Array.from(this.queues.values()); } diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 095c1f2..d9a3f82 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -1,15 +1,18 @@ import { Guild, StageChannel, VoiceChannel } from "discord.js"; import { Player } from "../Player"; -import { VoiceSubscription } from "../VoiceInterface/VoiceSubscription"; +import { StreamDispatcher } from "../VoiceInterface/BasicStreamDispatcher"; import Track from "./Track"; import { PlayerOptions } from "../types/types"; +import ytdl from "discord-ytdl-core"; +import { AudioResource, StreamType } from "@discordjs/voice"; class Queue { public readonly guild: Guild; public readonly player: Player; - public voiceConnection: VoiceSubscription; + public connection: StreamDispatcher; public tracks: Track[] = []; public options: PlayerOptions; + public playing = false; constructor(player: Player, guild: Guild, options: PlayerOptions = {}) { this.player = player; @@ -29,38 +32,118 @@ class Queue { ytdlDownloadOptions: {}, useSafeSearch: false, disableAutoRegister: false, - fetchBeforeQueued: false + fetchBeforeQueued: false, + initialVolume: 100 } as PlayerOptions, options ); } get current() { - return this.voiceConnection.audioResource?.metadata ?? this.tracks[0]; + return this.connection.audioResource?.metadata ?? this.tracks[0]; } - async joinVoiceChannel(channel: StageChannel | VoiceChannel) { - if (!["stage", "voice"].includes(channel.type)) - throw new TypeError(`Channel type must be voice or stage, got ${channel.type}!`); + async connect(channel: StageChannel | VoiceChannel) { + if (!["stage", "voice"].includes(channel?.type)) + throw new TypeError(`Channel type must be voice or stage, got ${channel?.type}!`); const connection = await this.player.voiceUtils.connect(channel); - this.voiceConnection = connection; + this.connection = connection; return this; } destroy() { - this.voiceConnection.stop(); - this.voiceConnection.disconnect(); + this.connection.end(); + this.connection.disconnect(); this.player.queues.delete(this.guild.id); } - play() { - throw new Error("Not implemented"); + skip() { + if (!this.connection) return false; + return this.connection.end(); + } + + addTrack(track: Track) { + this.addTracks([track]); + } + + addTracks(tracks: Track[]) { + this.tracks.push(...tracks); + } + + async play(src?: Track) { + if (!this.connection || !this.connection.voiceConnection) + throw new Error("Voice connection is not available, use .connect()!"); + const track = src ?? this.tracks.shift(); + if (!track) return; + + let resource: AudioResource; + + if (["youtube", "spotify"].includes(track.raw.source)) { + const stream = ytdl(track.raw.source === "spotify" ? track.raw.engine : track.url, { + // because we don't wanna decode opus into pcm again just for volume, let discord.js handle that + opusEncoded: false, + fmt: "s16le" + }); + + resource = this.connection.createStream(stream, { + type: StreamType.Raw, + data: track + }); + } else { + const stream = ytdl.arbitraryStream( + track.raw.source === "soundcloud" + ? await track.raw.engine.downloadProgressive() + : (track.raw.engine as string), + { + // because we don't wanna decode opus into pcm again just for volume, let discord.js handle that + opusEncoded: false, + fmt: "s16le" + } + ); + + resource = this.connection.createStream(stream, { + type: StreamType.Raw, + data: track + }); + } + + const dispatcher = this.connection.playStream(resource); + dispatcher.setVolume(this.options.initialVolume); + + dispatcher.on("start", () => { + this.playing = true; + this.player.emit("trackStart", this, this.current); + }); + + dispatcher.on("finish", () => { + this.playing = false; + if (!this.tracks.length) { + this.destroy(); + this.player.emit("queueEnd", this); + } else { + const nextTrack = this.tracks.shift(); + this.play(nextTrack); + } + }); } *[Symbol.iterator]() { yield* this.tracks; } + + toJSON() { + return { + guild: this.guild.id, + options: this.options, + tracks: this.tracks.map((m) => m.toJSON()) + }; + } + + toString() { + if (!this.tracks.length) return "No songs available to display!"; + return `**Upcoming Songs:**\n${this.tracks.map((m, i) => `${i + 1}. **${m.title}**`).join("\n")}`; + } } export { Queue }; diff --git a/src/Structures/Track.ts b/src/Structures/Track.ts index ee5e79e..bb9f4fd 100644 --- a/src/Structures/Track.ts +++ b/src/Structures/Track.ts @@ -104,7 +104,7 @@ class Track { this.fromPlaylist = Boolean(data.fromPlaylist); // raw - Object.defineProperty(this, "raw", { get: () => data, enumerable: false }); + Object.defineProperty(this, "raw", { get: () => data.raw ?? data, enumerable: false }); } /** @@ -148,6 +148,25 @@ class Track { toString(): string { return `${this.title} by ${this.author}`; } + + /** + * Raw JSON representation of this track + * @returns {Object} + */ + toJSON() { + return { + title: this.title, + description: this.description, + author: this.author, + url: this.url, + thumbnail: this.thumbnail, + duration: this.duration, + durationMS: this.durationMS, + views: this.views, + requested: this.requestedBy.id, + fromPlaylist: this.fromPlaylist + }; + } } export default Track; diff --git a/src/VoiceInterface/VoiceSubscription.ts b/src/VoiceInterface/BasicStreamDispatcher.ts similarity index 87% rename from src/VoiceInterface/VoiceSubscription.ts rename to src/VoiceInterface/BasicStreamDispatcher.ts index fb12731..a64ab46 100644 --- a/src/VoiceInterface/VoiceSubscription.ts +++ b/src/VoiceInterface/BasicStreamDispatcher.ts @@ -22,7 +22,7 @@ export interface VoiceEvents { finish: () => any; } -class VoiceSubscription extends EventEmitter { +class BasicStreamDispatcher extends EventEmitter { public readonly voiceConnection: VoiceConnection; public readonly audioPlayer: AudioPlayer; public connectPromise?: Promise; @@ -46,7 +46,7 @@ class VoiceSubscription extends EventEmitter { this.voiceConnection.destroy(); } } else if (newState.status === VoiceConnectionStatus.Destroyed) { - this.stop(); + this.end(); } else if ( !this.connectPromise && (newState.status === VoiceConnectionStatus.Connecting || @@ -64,6 +64,7 @@ class VoiceSubscription extends EventEmitter { this.audioPlayer.on("stateChange", (oldState, newState) => { if (newState.status === AudioPlayerStatus.Idle && oldState.status !== AudioPlayerStatus.Idle) { + this.audioResource = null; void this.emit("finish"); } else if (newState.status === AudioPlayerStatus.Playing) { void this.emit("start"); @@ -78,14 +79,14 @@ class VoiceSubscription extends EventEmitter { /** * Creates stream * @param {Readable|Duplex|string} src The stream source - * @param {({type?:StreamType;data?:any;inlineVolume?:boolean})} [ops] Options + * @param {({type?:StreamType;data?:any;})} [ops] Options * @returns {AudioResource} */ - createStream(src: Readable | Duplex | string, ops?: { type?: StreamType; data?: any; inlineVolume?: boolean }) { + createStream(src: Readable | Duplex | string, ops?: { type?: StreamType; data?: any }) { this.audioResource = createAudioResource(src, { inputType: ops?.type ?? StreamType.Arbitrary, metadata: ops?.data, - inlineVolume: Boolean(ops?.inlineVolume) + inlineVolume: true // we definitely need volume controls, right? }); return this.audioResource; @@ -108,7 +109,7 @@ class VoiceSubscription extends EventEmitter { /** * Stops the player */ - stop() { + end() { this.audioPlayer.stop(); } @@ -126,16 +127,23 @@ class VoiceSubscription extends EventEmitter { */ playStream(resource: AudioResource = this.audioResource) { if (!resource) throw new PlayerError("Audio resource is not available!"); - if (!this.audioResource && resource) this.audioResource = resource; + if (!this.audioResource) this.audioResource = resource; this.audioPlayer.play(resource); return this; } + setVolume(value: number) { + if (!this.audioResource) return; + + // ye boi logarithmic ✌ + this.audioResource.volume.setVolumeLogarithmic(value / 200); + } + get streamTime() { if (!this.audioResource) return 0; return this.audioResource.playbackDuration; } } -export { VoiceSubscription }; +export { BasicStreamDispatcher as StreamDispatcher }; diff --git a/src/VoiceInterface/VoiceUtils.ts b/src/VoiceInterface/VoiceUtils.ts index 093af34..7db11ad 100644 --- a/src/VoiceInterface/VoiceUtils.ts +++ b/src/VoiceInterface/VoiceUtils.ts @@ -1,15 +1,15 @@ import { VoiceChannel, StageChannel, Collection, Snowflake } from "discord.js"; import { entersState, joinVoiceChannel, VoiceConnection, VoiceConnectionStatus } from "@discordjs/voice"; -import { VoiceSubscription } from "./VoiceSubscription"; +import { StreamDispatcher } from "./BasicStreamDispatcher"; class VoiceUtils { - public cache = new Collection(); + public cache = new Collection(); /** * Joins a voice channel * @param {StageChannel|VoiceChannel} channel The voice channel * @param {({deaf?: boolean;maxTime?: number;})} [options] Join options - * @returns {Promise} + * @returns {Promise} */ public async connect( channel: VoiceChannel | StageChannel, @@ -17,7 +17,7 @@ class VoiceUtils { deaf?: boolean; maxTime?: number; } - ): Promise { + ): Promise { let conn = joinVoiceChannel({ guildId: channel.guild.id, channelId: channel.id, @@ -27,7 +27,7 @@ class VoiceUtils { try { conn = await entersState(conn, VoiceConnectionStatus.Ready, options?.maxTime ?? 20000); - const sub = new VoiceSubscription(conn); + const sub = new StreamDispatcher(conn); this.cache.set(channel.guild.id, sub); return sub; } catch (err) { @@ -40,8 +40,8 @@ class VoiceUtils { * Disconnects voice connection * @param {VoiceConnection} connection The voice connection */ - public disconnect(connection: VoiceConnection | VoiceSubscription) { - if (connection instanceof VoiceSubscription) return connection.voiceConnection.destroy(); + public disconnect(connection: VoiceConnection | StreamDispatcher) { + if (connection instanceof StreamDispatcher) return connection.voiceConnection.destroy(); return connection.destroy(); } diff --git a/src/index.ts b/src/index.ts index 5061c5a..60a36d7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,4 @@ export { AudioFilters } from "./utils/AudioFilters"; export { PlayerError } from "./utils/PlayerError"; export { VoiceUtils } from "./VoiceInterface/VoiceUtils"; -export { VoiceEvents, VoiceSubscription } from "./VoiceInterface/VoiceSubscription"; +export { VoiceEvents, StreamDispatcher } from "./VoiceInterface/BasicStreamDispatcher"; diff --git a/src/types/types.ts b/src/types/types.ts index 414ba9e..ca5d9d1 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -1,6 +1,8 @@ import { User } from "discord.js"; import { downloadOptions } from "ytdl-core"; import { Readable, Duplex } from "stream"; +import { Queue } from "../Structures/Queue"; +import Track from "../Structures/Track"; export type FiltersName = keyof QueueFilters; @@ -50,6 +52,7 @@ export interface RawTrackData { source?: TrackSource; engine?: any; live?: boolean; + raw?: any; } export interface TimeData { @@ -79,6 +82,7 @@ export interface PlayerOptions { useSafeSearch?: boolean; disableAutoRegister?: boolean; fetchBeforeQueued?: boolean; + initialVolume?: number; } export interface ExtractorModelData { @@ -110,3 +114,22 @@ export enum QueryType { REVERBNATION = "reverbnation", YOUTUBE_SEARCH = "youtube_search" } + +export interface PlayerEvents { + botDisconnect: () => any; + channelEmpty: () => any; + connectionCreate: () => any; + error: () => any; + musicStop: () => any; + noResults: () => any; + playlistAdd: () => any; + playlistParseEnd: () => any; + playlistParseStart: () => any; + queueCreate: () => any; + queueEnd: (queue: Queue) => any; + searchCancel: () => any; + searchInvalidResponse: () => any; + searchResults: () => any; + trackAdd: () => any; + trackStart: (queue: Queue, track: Track) => any; +} diff --git a/src/utils/QueryResolver.ts b/src/utils/QueryResolver.ts index 1e7544a..59ba9ef 100644 --- a/src/utils/QueryResolver.ts +++ b/src/utils/QueryResolver.ts @@ -18,7 +18,6 @@ const attachmentRegex = // scary things above *sigh* class QueryResolver { - static resolve(query: string): QueryType { if (SoundcloudValidateURL(query, "track")) return QueryType.SOUNDCLOUD_TRACK; if (SoundcloudValidateURL(query, "playlist") || query.includes("/sets/")) return QueryType.SOUNDCLOUD_PLAYLIST; diff --git a/tsconfig.json b/tsconfig.json index 629bcf8..5fc7c84 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,7 +6,8 @@ "outDir": "./lib", "strict": true, "strictNullChecks": false, - "esModuleInterop": true + "esModuleInterop": true, + "removeComments": true }, "include": [ "src/**/*" From a823c6f173f4fb7ddca7a983caf791c8192bd49d Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sat, 12 Jun 2021 00:24:21 +0545 Subject: [PATCH 030/215] setup basic player and example --- .gitignore | 7 ++----- example/config.example.ts | 3 +++ example/index.ts | 36 ++++++++++++++++++++++++++++++++++++ package.json | 2 +- src/Player.ts | 14 ++++++++------ src/Structures/Track.ts | 6 +++--- src/index.ts | 5 +++++ 7 files changed, 58 insertions(+), 15 deletions(-) create mode 100644 example/config.example.ts create mode 100644 example/index.ts diff --git a/.gitignore b/.gitignore index 7033b56..2991299 100644 --- a/.gitignore +++ b/.gitignore @@ -2,14 +2,11 @@ node_modules package-lock.json -# Tests -test - # Compiled files lib # Yarn logs yarn*.log -# Demo -demo +# example +example/config.ts \ No newline at end of file diff --git a/example/config.example.ts b/example/config.example.ts new file mode 100644 index 0000000..1e2b5af --- /dev/null +++ b/example/config.example.ts @@ -0,0 +1,3 @@ +export const config = { + token: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" +}; \ No newline at end of file diff --git a/example/index.ts b/example/index.ts new file mode 100644 index 0000000..1f39dad --- /dev/null +++ b/example/index.ts @@ -0,0 +1,36 @@ +import { Client } from "discord.js"; +import { Player } from "../src/index"; +import { config } from "./config"; + +const client = new Client({ + intents: ['GUILD_VOICE_STATES', 'GUILD_MESSAGES', 'GUILDS'] +}); +const player = new Player(client); + +player.on("trackStart", (queue, track) => console.log(`Now playing: ${track.title} in ${queue.guild.name}!`)); + +client.on("ready", () => console.log("Bot is online!")); + +client.on("message", async message => { + if (!client.application.owner) await client.application.fetch(); + if (message.author.id !== client.application.owner.id) return; + + if (message.content.startsWith("!np") && message.guild.me.voice.channelID) { + const conn = player.getQueue(message.guild.id); + if (!conn) return; + return void message.channel.send(`Now Playing: **${conn.current.title}** (Played **${Math.floor(conn.connection.streamTime / 1000)} seconds**)`); + } + if (message.content.startsWith("!p") && message.member.voice.channelID) { + const queue = player.createQueue(message.guild); + const song = await player.search(message.content.slice(2).trim(), message.author).then(x => x[0]); + + if (!queue.connection) { + queue.connect(message.member.voice.channel) + .then(async q => { + await q.play(song); + }); + } + } +}); + +client.login(config.token); \ No newline at end of file diff --git a/package.json b/package.json index 4a97273..b9bb6e8 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "lib/" ], "scripts": { - "test": "cd test && ts-node index.ts", + "test": "cd example && ts-node index.ts", "build": "tsc", "format": "prettier --write \"src/**/*.ts\"", "lint": "tslint -p tsconfig.json", diff --git a/src/Player.ts b/src/Player.ts index 264021c..023db0a 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -41,14 +41,14 @@ class DiscordPlayer extends EventEmitter { // @todo: add extractors const qt = QueryResolver.resolve(query); switch (qt) { - case QueryType.YOUTUBE: { - const videos = await YouTube.search(qt, { + case QueryType.YOUTUBE_SEARCH: { + const videos = await YouTube.search(query, { type: "video" }); - return videos.map( - (m) => - new Track(this, { + return videos.map((m) => { + (m as any).source = "youtube"; + return new Track(this, { title: m.title, description: m.description, author: m.channel?.name, @@ -60,8 +60,10 @@ class DiscordPlayer extends EventEmitter { duration: m.durationFormatted, raw: m }) - ); + }); } + default: + return []; } } diff --git a/src/Structures/Track.ts b/src/Structures/Track.ts index bb9f4fd..e6c3183 100644 --- a/src/Structures/Track.ts +++ b/src/Structures/Track.ts @@ -1,4 +1,4 @@ -import { User } from "discord.js"; +import { User, Util } from "discord.js"; import { Player } from "../Player"; import { RawTrackData } from "../types/types"; import { Queue } from "./Queue"; @@ -14,7 +14,7 @@ class Track { public views!: number; public requestedBy!: User; public fromPlaylist!: boolean; - public raw!: RawTrackData; + public readonly raw!: RawTrackData; /** * Track constructor @@ -94,7 +94,7 @@ class Track { } private _patch(data: RawTrackData) { - this.title = data.title ?? ""; + this.title = Util.escapeMarkdown(data.title ?? ""); this.author = data.author ?? ""; this.url = data.url ?? ""; this.thumbnail = data.thumbnail ?? ""; diff --git a/src/index.ts b/src/index.ts index 60a36d7..cdbeb79 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,9 @@ export { AudioFilters } from "./utils/AudioFilters"; +export { ExtractorModel } from "./Structures/ExtractorModel"; +export { Playlist } from "./Structures/Playlist"; +export { Player } from "./Player"; +export { Queue } from "./Structures/Queue"; +export { Track } from "./Structures/Track"; export { PlayerError } from "./utils/PlayerError"; export { VoiceUtils } from "./VoiceInterface/VoiceUtils"; export { VoiceEvents, StreamDispatcher } from "./VoiceInterface/BasicStreamDispatcher"; From 61c30986ea37f1212ee30846daa82c917dc55aa5 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sat, 12 Jun 2021 01:03:53 +0545 Subject: [PATCH 031/215] get the basic bot working --- example/index.ts | 37 +++++++++++++++++++-- src/Player.ts | 26 +++++++-------- src/Structures/Queue.ts | 10 ++++-- src/VoiceInterface/BasicStreamDispatcher.ts | 10 ++++-- 4 files changed, 63 insertions(+), 20 deletions(-) diff --git a/example/index.ts b/example/index.ts index 1f39dad..0d08b94 100644 --- a/example/index.ts +++ b/example/index.ts @@ -7,7 +7,7 @@ const client = new Client({ }); const player = new Player(client); -player.on("trackStart", (queue, track) => console.log(`Now playing: ${track.title} in ${queue.guild.name}!`)); +// player.on("trackStart", (queue, track) => console.log(`Now playing: ${track.title} in ${queue.guild.name}!`)); client.on("ready", () => console.log("Bot is online!")); @@ -20,15 +20,48 @@ client.on("message", async message => { if (!conn) return; return void message.channel.send(`Now Playing: **${conn.current.title}** (Played **${Math.floor(conn.connection.streamTime / 1000)} seconds**)`); } + if (message.content.startsWith("!pause") && message.guild.me.voice.channelID) { + const conn = player.getQueue(message.guild.id); + if (!conn) return; + conn.setPaused(true); + return void message.channel.send("Paused!"); + } + if (message.content.startsWith("!resume") && message.guild.me.voice.channelID) { + const conn = player.getQueue(message.guild.id); + if (!conn) return; + conn.setPaused(false); + return void message.channel.send("Resumed!"); + } + if (message.content.startsWith("!skip") && message.guild.me.voice.channelID) { + const conn = player.getQueue(message.guild.id); + if (!conn) return; + conn.skip(); + return void message.channel.send("Done!"); + } + if (message.content.startsWith("!queue") && message.guild.me.voice.channelID) { + const conn = player.getQueue(message.guild.id); + if (!conn) return; + return void message.channel.send({ content: conn.toString(), split: true }); + } + if (message.content.startsWith("!vol") && message.guild.me.voice.channelID) { + const conn = player.getQueue(message.guild.id); + if (!conn) return; + conn.connection.setVolume(parseInt(message.content.slice(4).trim())); + return void message.channel.send("Volume changed!"); + } if (message.content.startsWith("!p") && message.member.voice.channelID) { const queue = player.createQueue(message.guild); const song = await player.search(message.content.slice(2).trim(), message.author).then(x => x[0]); + queue.addTrack(song); if (!queue.connection) { queue.connect(message.member.voice.channel) .then(async q => { - await q.play(song); + await q.play(); + message.channel.send(`🎶 | Playing: **${song.title}**!`); }); + } else { + message.channel.send(`🎶 | Queued: **${song.title}**!`); } } }); diff --git a/src/Player.ts b/src/Player.ts index 023db0a..bd0a006 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -47,20 +47,20 @@ class DiscordPlayer extends EventEmitter { }); return videos.map((m) => { - (m as any).source = "youtube"; - return new Track(this, { - title: m.title, - description: m.description, - author: m.channel?.name, - url: m.url, - requestedBy: requestedBy, - thumbnail: m.thumbnail?.displayThumbnailURL("maxresdefault"), - views: m.views, - fromPlaylist: false, - duration: m.durationFormatted, - raw: m - }) + (m as any).source = "youtube"; + return new Track(this, { + title: m.title, + description: m.description, + author: m.channel?.name, + url: m.url, + requestedBy: requestedBy, + thumbnail: m.thumbnail?.displayThumbnailURL("maxresdefault"), + views: m.views, + fromPlaylist: false, + duration: m.durationFormatted, + raw: m }); + }); } default: return []; diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index d9a3f82..4a2d096 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -60,7 +60,8 @@ class Queue { skip() { if (!this.connection) return false; - return this.connection.end(); + this.connection.end(); + return true; } addTrack(track: Track) { @@ -71,6 +72,11 @@ class Queue { this.tracks.push(...tracks); } + setPaused(paused?: boolean) { + if (!this.connection) return false; + return paused ? this.connection.pause() : this.connection.resume(); + } + async play(src?: Track) { if (!this.connection || !this.connection.voiceConnection) throw new Error("Voice connection is not available, use .connect()!"); @@ -108,7 +114,7 @@ class Queue { }); } - const dispatcher = this.connection.playStream(resource); + const dispatcher = await this.connection.playStream(resource); dispatcher.setVolume(this.options.initialVolume); dispatcher.on("start", () => { diff --git a/src/VoiceInterface/BasicStreamDispatcher.ts b/src/VoiceInterface/BasicStreamDispatcher.ts index a64ab46..c506bd8 100644 --- a/src/VoiceInterface/BasicStreamDispatcher.ts +++ b/src/VoiceInterface/BasicStreamDispatcher.ts @@ -103,7 +103,9 @@ class BasicStreamDispatcher extends EventEmitter { * Disconnects from voice */ disconnect() { - this.voiceConnection.destroy(); + try { + this.voiceConnection.destroy(); + } catch {} } /** @@ -125,19 +127,21 @@ class BasicStreamDispatcher extends EventEmitter { * Play stream * @param {AudioResource} resource The audio resource to play */ - playStream(resource: AudioResource = this.audioResource) { + async playStream(resource: AudioResource = this.audioResource) { if (!resource) throw new PlayerError("Audio resource is not available!"); if (!this.audioResource) this.audioResource = resource; + if (this.voiceConnection.state.status !== VoiceConnectionStatus.Ready) await entersState(this.voiceConnection, VoiceConnectionStatus.Ready, 20000); this.audioPlayer.play(resource); return this; } setVolume(value: number) { - if (!this.audioResource) return; + if (!this.audioResource || isNaN(value) || value < 0 || value > Infinity) return false; // ye boi logarithmic ✌ this.audioResource.volume.setVolumeLogarithmic(value / 200); + return true; } get streamTime() { From 502fe11392decce618acf2ab680e712b79d97fd7 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sat, 12 Jun 2021 01:04:48 +0545 Subject: [PATCH 032/215] get the basic bot working --- src/VoiceInterface/BasicStreamDispatcher.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/VoiceInterface/BasicStreamDispatcher.ts b/src/VoiceInterface/BasicStreamDispatcher.ts index c506bd8..c163539 100644 --- a/src/VoiceInterface/BasicStreamDispatcher.ts +++ b/src/VoiceInterface/BasicStreamDispatcher.ts @@ -130,7 +130,8 @@ class BasicStreamDispatcher extends EventEmitter { async playStream(resource: AudioResource = this.audioResource) { if (!resource) throw new PlayerError("Audio resource is not available!"); if (!this.audioResource) this.audioResource = resource; - if (this.voiceConnection.state.status !== VoiceConnectionStatus.Ready) await entersState(this.voiceConnection, VoiceConnectionStatus.Ready, 20000); + if (this.voiceConnection.state.status !== VoiceConnectionStatus.Ready) + await entersState(this.voiceConnection, VoiceConnectionStatus.Ready, 20000); this.audioPlayer.play(resource); return this; From 2206d68dfb4b2236a22e2948145adc4d5d1e2681 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sat, 12 Jun 2021 12:22:41 +0545 Subject: [PATCH 033/215] player utils --- example/index.ts | 20 ++++++++++---- src/Player.ts | 12 +++++---- src/Structures/Queue.ts | 29 ++++++++++++++++----- src/VoiceInterface/BasicStreamDispatcher.ts | 22 +++++++++++----- src/VoiceInterface/VoiceUtils.ts | 2 +- src/types/types.ts | 11 ++++++++ 6 files changed, 72 insertions(+), 24 deletions(-) diff --git a/example/index.ts b/example/index.ts index 0d08b94..24e9d48 100644 --- a/example/index.ts +++ b/example/index.ts @@ -1,5 +1,5 @@ -import { Client } from "discord.js"; -import { Player } from "../src/index"; +import { Client, Message } from "discord.js"; +import { Player, Queue } from "../src/index"; import { config } from "./config"; const client = new Client({ @@ -7,7 +7,10 @@ const client = new Client({ }); const player = new Player(client); -// player.on("trackStart", (queue, track) => console.log(`Now playing: ${track.title} in ${queue.guild.name}!`)); +player.on("trackStart", (queue, track) => { + const guildQueue = queue as Queue; + guildQueue.metadata.channel.send(`🎶 | Now playing: **${track.title}** in **${guildQueue.connection.channel.name}**!`); +}); client.on("ready", () => console.log("Bot is online!")); @@ -20,37 +23,45 @@ client.on("message", async message => { if (!conn) return; return void message.channel.send(`Now Playing: **${conn.current.title}** (Played **${Math.floor(conn.connection.streamTime / 1000)} seconds**)`); } + if (message.content.startsWith("!pause") && message.guild.me.voice.channelID) { const conn = player.getQueue(message.guild.id); if (!conn) return; conn.setPaused(true); return void message.channel.send("Paused!"); } + if (message.content.startsWith("!resume") && message.guild.me.voice.channelID) { const conn = player.getQueue(message.guild.id); if (!conn) return; conn.setPaused(false); return void message.channel.send("Resumed!"); } + if (message.content.startsWith("!skip") && message.guild.me.voice.channelID) { const conn = player.getQueue(message.guild.id); if (!conn) return; conn.skip(); return void message.channel.send("Done!"); } + if (message.content.startsWith("!queue") && message.guild.me.voice.channelID) { const conn = player.getQueue(message.guild.id); if (!conn) return; return void message.channel.send({ content: conn.toString(), split: true }); } + if (message.content.startsWith("!vol") && message.guild.me.voice.channelID) { const conn = player.getQueue(message.guild.id); if (!conn) return; conn.connection.setVolume(parseInt(message.content.slice(4).trim())); return void message.channel.send("Volume changed!"); } + if (message.content.startsWith("!p") && message.member.voice.channelID) { - const queue = player.createQueue(message.guild); + const queue = player.createQueue(message.guild, { + metadata: message + }); const song = await player.search(message.content.slice(2).trim(), message.author).then(x => x[0]); queue.addTrack(song); @@ -58,7 +69,6 @@ client.on("message", async message => { queue.connect(message.member.voice.channel) .then(async q => { await q.play(); - message.channel.send(`🎶 | Playing: **${song.title}**!`); }); } else { message.channel.send(`🎶 | Queued: **${song.title}**!`); diff --git a/src/Player.ts b/src/Player.ts index bd0a006..72f02e9 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -17,16 +17,18 @@ class DiscordPlayer extends EventEmitter { this.client = client; } - createQueue(guild: Guild, queueInitOptions?: PlayerOptions) { - if (this.queues.has(guild.id)) return this.queues.get(guild.id); + createQueue(guild: Guild, queueInitOptions?: PlayerOptions & { metadata?: any }) { + if (this.queues.has(guild.id)) return this.queues.get(guild.id) as Queue; + const queue = new Queue(this, guild, queueInitOptions); + queue.metadata = queueInitOptions.metadata; this.queues.set(guild.id, queue); - return queue; + return queue as Queue; } - getQueue(guild: Snowflake) { - return this.queues.get(guild); + getQueue(guild: Snowflake) { + return this.queues.get(guild) as Queue; } /** diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 4a2d096..9c6f640 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -2,17 +2,18 @@ import { Guild, StageChannel, VoiceChannel } from "discord.js"; import { Player } from "../Player"; import { StreamDispatcher } from "../VoiceInterface/BasicStreamDispatcher"; import Track from "./Track"; -import { PlayerOptions } from "../types/types"; +import { PlayerOptions, PlayOptions } from "../types/types"; import ytdl from "discord-ytdl-core"; import { AudioResource, StreamType } from "@discordjs/voice"; -class Queue { +class Queue { public readonly guild: Guild; public readonly player: Player; public connection: StreamDispatcher; public tracks: Track[] = []; public options: PlayerOptions; public playing = false; + public metadata?: T = null; constructor(player: Player, guild: Guild, options: PlayerOptions = {}) { this.player = player; @@ -49,6 +50,8 @@ class Queue { const connection = await this.player.voiceUtils.connect(channel); this.connection = connection; + if (channel.type === "stage") await channel.guild.me.voice.setRequestToSpeak(true).catch((e) => {}); + return this; } @@ -77,10 +80,16 @@ class Queue { return paused ? this.connection.pause() : this.connection.resume(); } - async play(src?: Track) { + setBitrate(bitrate: number | "auto") { + if (!this.connection?.audioResource?.encoder) return; + if (bitrate === "auto") bitrate = this.connection.channel?.bitrate ?? 64000; + this.connection.audioResource.encoder.setBitrate(bitrate); + } + + async play(src?: Track, options: PlayOptions = {}) { if (!this.connection || !this.connection.voiceConnection) throw new Error("Voice connection is not available, use .connect()!"); - const track = src ?? this.tracks.shift(); + const track = options.filtersUpdate ? this.current : src ?? this.tracks.shift(); if (!track) return; let resource: AudioResource; @@ -89,7 +98,9 @@ class Queue { const stream = ytdl(track.raw.source === "spotify" ? track.raw.engine : track.url, { // because we don't wanna decode opus into pcm again just for volume, let discord.js handle that opusEncoded: false, - fmt: "s16le" + fmt: "s16le", + encoderArgs: options.encoderArgs ?? [], + seek: options.seek }); resource = this.connection.createStream(stream, { @@ -104,7 +115,9 @@ class Queue { { // because we don't wanna decode opus into pcm again just for volume, let discord.js handle that opusEncoded: false, - fmt: "s16le" + fmt: "s16le", + encoderArgs: options.encoderArgs ?? [], + seek: options.seek } ); @@ -119,11 +132,13 @@ class Queue { dispatcher.on("start", () => { this.playing = true; - this.player.emit("trackStart", this, this.current); + if (!options.filtersUpdate) this.player.emit("trackStart", this, this.current); }); dispatcher.on("finish", () => { this.playing = false; + if (options.filtersUpdate) return; + if (!this.tracks.length) { this.destroy(); this.player.emit("queueEnd", this); diff --git a/src/VoiceInterface/BasicStreamDispatcher.ts b/src/VoiceInterface/BasicStreamDispatcher.ts index c163539..b95cbc8 100644 --- a/src/VoiceInterface/BasicStreamDispatcher.ts +++ b/src/VoiceInterface/BasicStreamDispatcher.ts @@ -10,6 +10,7 @@ import { VoiceConnection, VoiceConnectionStatus } from "@discordjs/voice"; +import { StageChannel, VoiceChannel } from "discord.js"; import { Duplex, Readable } from "stream"; import { TypedEmitter as EventEmitter } from "tiny-typed-emitter"; import Track from "../Structures/Track"; @@ -25,14 +26,17 @@ export interface VoiceEvents { class BasicStreamDispatcher extends EventEmitter { public readonly voiceConnection: VoiceConnection; public readonly audioPlayer: AudioPlayer; + public readonly channel: VoiceChannel | StageChannel; public connectPromise?: Promise; public audioResource?: AudioResource; + public paused = false; - constructor(connection: VoiceConnection) { + constructor(connection: VoiceConnection, channel: VoiceChannel | StageChannel) { super(); this.voiceConnection = connection; this.audioPlayer = createAudioPlayer(); + this.channel = channel; this.voiceConnection.on("stateChange", (_, newState) => { if (newState.status === VoiceConnectionStatus.Disconnected) { @@ -64,10 +68,12 @@ class BasicStreamDispatcher extends EventEmitter { this.audioPlayer.on("stateChange", (oldState, newState) => { if (newState.status === AudioPlayerStatus.Idle && oldState.status !== AudioPlayerStatus.Idle) { - this.audioResource = null; - void this.emit("finish"); + if (!this.paused) { + this.audioResource = null; + void this.emit("finish"); + } } else if (newState.status === AudioPlayerStatus.Playing) { - void this.emit("start"); + if (!this.paused) void this.emit("start"); } }); @@ -116,11 +122,15 @@ class BasicStreamDispatcher extends EventEmitter { } pause(interpolateSilence?: boolean) { - return this.audioPlayer.pause(interpolateSilence); + const success = this.audioPlayer.pause(interpolateSilence); + this.paused = success; + return success; } resume() { - return this.audioPlayer.unpause(); + const success = this.audioPlayer.unpause(); + this.paused = !success; + return success; } /** diff --git a/src/VoiceInterface/VoiceUtils.ts b/src/VoiceInterface/VoiceUtils.ts index 7db11ad..ceb39ef 100644 --- a/src/VoiceInterface/VoiceUtils.ts +++ b/src/VoiceInterface/VoiceUtils.ts @@ -27,7 +27,7 @@ class VoiceUtils { try { conn = await entersState(conn, VoiceConnectionStatus.Ready, options?.maxTime ?? 20000); - const sub = new StreamDispatcher(conn); + const sub = new StreamDispatcher(conn, channel); this.cache.set(channel.guild.id, sub); return sub; } catch (err) { diff --git a/src/types/types.ts b/src/types/types.ts index ca5d9d1..8c14795 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -133,3 +133,14 @@ export interface PlayerEvents { trackAdd: () => any; trackStart: (queue: Queue, track: Track) => any; } + +export interface PlayOptions { + /** If this play is triggered for filters update */ + filtersUpdate?: boolean; + + /** ffmpeg args passed to encoder */ + encoderArgs?: string[]; + + /** Time to seek to before playing */ + seek?: number; +} From 1f6e6d109868b6f92f30aa7b0f24d7a3e49b6f09 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sat, 12 Jun 2021 19:07:45 +0545 Subject: [PATCH 034/215] move things a bit --- src/Structures/Queue.ts | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 9c6f640..51823dd 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -92,23 +92,17 @@ class Queue { const track = options.filtersUpdate ? this.current : src ?? this.tracks.shift(); if (!track) return; - let resource: AudioResource; - + let stream; if (["youtube", "spotify"].includes(track.raw.source)) { - const stream = ytdl(track.raw.source === "spotify" ? track.raw.engine : track.url, { + stream = ytdl(track.raw.source === "spotify" ? track.raw.engine : track.url, { // because we don't wanna decode opus into pcm again just for volume, let discord.js handle that opusEncoded: false, fmt: "s16le", encoderArgs: options.encoderArgs ?? [], seek: options.seek }); - - resource = this.connection.createStream(stream, { - type: StreamType.Raw, - data: track - }); } else { - const stream = ytdl.arbitraryStream( + stream = ytdl.arbitraryStream( track.raw.source === "soundcloud" ? await track.raw.engine.downloadProgressive() : (track.raw.engine as string), @@ -120,13 +114,13 @@ class Queue { seek: options.seek } ); - - resource = this.connection.createStream(stream, { - type: StreamType.Raw, - data: track - }); } + const resource: AudioResource = this.connection.createStream(stream, { + type: StreamType.Raw, + data: track + }); + const dispatcher = await this.connection.playStream(resource); dispatcher.setVolume(this.options.initialVolume); From 5239e5f9ccc64ad875a8c4c33ef23fd7f4b97d8f Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 13 Jun 2021 11:40:20 +0545 Subject: [PATCH 035/215] jsdoc --- src/Structures/ExtractorModel.ts | 16 ++++++++-------- src/Structures/Queue.ts | 2 +- src/Structures/Track.ts | 22 +++++++++++----------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/Structures/ExtractorModel.ts b/src/Structures/ExtractorModel.ts index dbbdae7..183747f 100644 --- a/src/Structures/ExtractorModel.ts +++ b/src/Structures/ExtractorModel.ts @@ -6,13 +6,13 @@ class ExtractorModel { /** * Model for raw Discord Player extractors - * @param {String} extractorName Name of the extractor - * @param {Object} data Extractor object + * @param {string} extractorName Name of the extractor + * @param {object} data Extractor object */ constructor(extractorName: string, data: any) { /** * The extractor name - * @type {String} + * @type {string} */ this.name = extractorName; @@ -21,7 +21,7 @@ class ExtractorModel { /** * Method to handle requests from `Player.play()` - * @param {String} query Query to handle + * @param {string} query Query to handle * @returns {Promise} */ async handle(query: string): Promise { @@ -42,8 +42,8 @@ class ExtractorModel { /** * Method used by Discord Player to validate query with this extractor - * @param {String} query The query to validate - * @returns {Boolean} + * @param {string} query The query to validate + * @returns {boolean} */ validate(query: string): boolean { return Boolean(this._raw.validate(query)); @@ -51,7 +51,7 @@ class ExtractorModel { /** * The extractor version - * @type {String} + * @type {string} */ get version(): string { return this._raw.version ?? "0.0.0"; @@ -59,7 +59,7 @@ class ExtractorModel { /** * If player should mark this extractor as important - * @type {Boolean} + * @type {boolean} */ get important(): boolean { return Boolean(this._raw.important); diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 51823dd..2ae4f21 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -50,7 +50,7 @@ class Queue { const connection = await this.player.voiceUtils.connect(channel); this.connection = connection; - if (channel.type === "stage") await channel.guild.me.voice.setRequestToSpeak(true).catch((e) => {}); + if (channel.type === "stage") await channel.guild.me.voice.setRequestToSpeak(true).catch(() => {}); return this; } diff --git a/src/Structures/Track.ts b/src/Structures/Track.ts index e6c3183..7a5c5f6 100644 --- a/src/Structures/Track.ts +++ b/src/Structures/Track.ts @@ -33,43 +33,43 @@ class Track { /** * Title of this track * @name Track#title - * @type {String} + * @type {string} */ /** * Description of this track * @name Track#description - * @type {String} + * @type {string} */ /** * Author of this track * @name Track#author - * @type {String} + * @type {string} */ /** * URL of this track * @name Track#url - * @type {String} + * @type {string} */ /** * Thumbnail of this track * @name Track#thumbnail - * @type {String} + * @type {string} */ /** * Duration of this track * @name Track#duration - * @type {String} + * @type {string} */ /** * Views count of this track * @name Track#views - * @type {Number} + * @type {number} */ /** @@ -81,7 +81,7 @@ class Track { /** * If this track belongs to playlist * @name Track#fromPlaylist - * @type {Boolean} + * @type {boolean} */ /** @@ -117,7 +117,7 @@ class Track { /** * The track duration in millisecond - * @type {Number} + * @type {number} */ get durationMS(): number { const times = (n: number, t: number) => { @@ -143,7 +143,7 @@ class Track { /** * String representation of this track - * @returns {String} + * @returns {string} */ toString(): string { return `${this.title} by ${this.author}`; @@ -151,7 +151,7 @@ class Track { /** * Raw JSON representation of this track - * @returns {Object} + * @returns {object} */ toJSON() { return { From b97e8e61fcce743270a757b282670ba9e69d17c2 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 13 Jun 2021 13:51:19 +0545 Subject: [PATCH 036/215] basic slash commands bot --- .prettierrc | 2 +- example/config.example.ts | 2 +- example/index.ts | 233 +++++++++++++++----- package.json | 7 +- src/Player.ts | 6 + src/Structures/Queue.ts | 47 ++-- src/VoiceInterface/BasicStreamDispatcher.ts | 18 +- src/types/types.ts | 8 +- src/utils/AudioFilters.ts | 8 +- src/utils/QueryResolver.ts | 6 +- yarn.lock | 8 +- 11 files changed, 239 insertions(+), 106 deletions(-) diff --git a/.prettierrc b/.prettierrc index a8cf444..46a28f7 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,5 +1,5 @@ { - "printWidth": 120, + "printWidth": 200, "trailingComma": "none", "singleQuote": false, "tabWidth": 4, diff --git a/example/config.example.ts b/example/config.example.ts index 1e2b5af..83c37ee 100644 --- a/example/config.example.ts +++ b/example/config.example.ts @@ -1,3 +1,3 @@ export const config = { token: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" -}; \ No newline at end of file +}; diff --git a/example/index.ts b/example/index.ts index 24e9d48..5972a84 100644 --- a/example/index.ts +++ b/example/index.ts @@ -1,79 +1,200 @@ -import { Client, Message } from "discord.js"; -import { Player, Queue } from "../src/index"; +import { Client, GuildMember, Message, TextChannel } from "discord.js"; +import { Player, Queue, Track } from "../src/index"; import { config } from "./config"; +// use this in prod. +// import { Player, Queue } from "discord-player"; const client = new Client({ - intents: ['GUILD_VOICE_STATES', 'GUILD_MESSAGES', 'GUILDS'] + intents: ["GUILD_VOICE_STATES", "GUILD_MESSAGES", "GUILDS"] }); + +client.on("ready", () => { + console.log("Bot is online!"); + client.user.setActivity({ + name: "🎶 | Music Time", + type: "LISTENING" + }); +}); +client.on("error", console.error); +client.on("warn", console.warn); + +// instantiate the player const player = new Player(client); +player.on("error", console.error); + player.on("trackStart", (queue, track) => { - const guildQueue = queue as Queue; - guildQueue.metadata.channel.send(`🎶 | Now playing: **${track.title}** in **${guildQueue.connection.channel.name}**!`); + const guildQueue = queue as Queue; + guildQueue.metadata.send(`🎶 | Started playing: **${track.title}** in **${guildQueue.connection.channel.name}**!`); }); -client.on("ready", () => console.log("Bot is online!")); +player.on("trackAdd", (queue, track) => { + const guildQueue = queue as Queue; + guildQueue.metadata.send(`🎶 | Track **${track.title}** queued!`); +}); -client.on("message", async message => { - if (!client.application.owner) await client.application.fetch(); - if (message.author.id !== client.application.owner.id) return; +client.on("message", async (message) => { + if (message.author.bot || !message.guild) return; + if (!client.application?.owner) await client.application?.fetch(); - if (message.content.startsWith("!np") && message.guild.me.voice.channelID) { - const conn = player.getQueue(message.guild.id); - if (!conn) return; - return void message.channel.send(`Now Playing: **${conn.current.title}** (Played **${Math.floor(conn.connection.streamTime / 1000)} seconds**)`); + if (message.content === "!deploy" && message.author.id === client.application?.owner?.id) { + await message.guild.commands.set([ + { + name: "play", + description: "Plays a song from youtube", + options: [ + { + name: "query", + type: "STRING", + description: "The song you want to play", + required: true + } + ] + }, + { + name: "volume", + description: "Sets music volume", + options: [ + { + name: "amount", + type: "INTEGER", + description: "The volume amount to set (0-100)", + required: false + } + ] + }, + { + name: "skip", + description: "Skip to the current song" + }, + { + name: "queue", + description: "See the queue" + }, + { + name: "pause", + description: "Pause the current song" + }, + { + name: "resume", + description: "Resume the current song" + }, + { + name: "stop", + description: "Stop the player" + }, + { + name: "np", + description: "Now Playing" + } + ]); + + await message.reply("Deployed!"); + } +}); + +client.on("interaction", async (interaction) => { + if (!interaction.isCommand() || !interaction.guildID) return; + + if (!(interaction.member instanceof GuildMember) || !interaction.member.voice.channel) { + return void interaction.reply({ content: "You are not in a voice channel!", ephemeral: true }); } - if (message.content.startsWith("!pause") && message.guild.me.voice.channelID) { - const conn = player.getQueue(message.guild.id); - if (!conn) return; - conn.setPaused(true); - return void message.channel.send("Paused!"); + if (interaction.guild.me.voice.channelID && interaction.member.voice.channelID !== interaction.guild.me.voice.channelID) { + return void interaction.reply({ content: "You are not in my voice channel!", ephemeral: true }); } - if (message.content.startsWith("!resume") && message.guild.me.voice.channelID) { - const conn = player.getQueue(message.guild.id); - if (!conn) return; - conn.setPaused(false); - return void message.channel.send("Resumed!"); - } + if (interaction.commandName === "play") { + await interaction.defer(); - if (message.content.startsWith("!skip") && message.guild.me.voice.channelID) { - const conn = player.getQueue(message.guild.id); - if (!conn) return; - conn.skip(); - return void message.channel.send("Done!"); - } + const query = interaction.options.get("query")!.value! as string; + const searchResult = (await player.search(query, interaction.user).catch(() => [])) as Track[]; + if (!searchResult.length) return void interaction.followUp({ content: "No results were found!" }); - if (message.content.startsWith("!queue") && message.guild.me.voice.channelID) { - const conn = player.getQueue(message.guild.id); - if (!conn) return; - return void message.channel.send({ content: conn.toString(), split: true }); - } - - if (message.content.startsWith("!vol") && message.guild.me.voice.channelID) { - const conn = player.getQueue(message.guild.id); - if (!conn) return; - conn.connection.setVolume(parseInt(message.content.slice(4).trim())); - return void message.channel.send("Volume changed!"); - } - - if (message.content.startsWith("!p") && message.member.voice.channelID) { - const queue = player.createQueue(message.guild, { - metadata: message + const queue = await player.createQueue(interaction.guild, { + metadata: interaction.channel }); - const song = await player.search(message.content.slice(2).trim(), message.author).then(x => x[0]); - queue.addTrack(song); - if (!queue.connection) { - queue.connect(message.member.voice.channel) - .then(async q => { - await q.play(); - }); - } else { - message.channel.send(`🎶 | Queued: **${song.title}**!`); + try { + if (!queue.connection) await queue.connect(interaction.member.voice.channel); + } catch { + void player.deleteQueue(interaction.guildID); + return void interaction.followUp({ content: "Could not join your voice channel!" }); } + + await interaction.followUp({ content: "⏱ | Loading your track..." }); + await queue.play(searchResult[0]); + } else if (interaction.commandName === "volume") { + await interaction.defer(); + const queue = player.getQueue(interaction.guildID); + if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); + const vol = interaction.options.get("amount"); + if (!vol) return void interaction.followUp({ content: `🎧 | Current volume is **${queue.volume}**%!` }); + if ((vol.value as number) < 0 || (vol.value as number) > 100) return void interaction.followUp({ content: "❌ | Volume range must be 0-100" }); + const success = queue.setVolume(vol.value as number); + return void interaction.followUp({ + content: success ? `✅ | Volume set to **${vol.value}%**!` : "❌ | Something went wrong!" + }); + } else if (interaction.commandName === "skip") { + await interaction.defer(); + const queue = player.getQueue(interaction.guildID); + if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); + const currentTrack = queue.current; + const success = queue.skip(); + return void interaction.followUp({ + content: success ? `✅ | Skipped **${currentTrack}**!` : "❌ | Something went wrong!" + }); + } else if (interaction.commandName === "queue") { + await interaction.defer(); + const queue = player.getQueue(interaction.guildID); + if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); + const currentTrack = queue.current; + const tracks = queue.tracks + .slice(0, 10) + .map((m, i) => { + return `${i + 1}. **${m.title}**`; + }) + .join("\n"); + + return void interaction.followUp({ + embeds: [ + { + title: "Server Queue", + description: `${tracks}${queue.tracks.length > tracks.length ? `...${queue.tracks.length - tracks.length} more tracks` : ""}`, + color: 0xff0000, + fields: [{ name: "Now Playing", value: `🎶 | **${currentTrack.title}**` }] + } + ] + }); + } else if (interaction.commandName === "pause") { + await interaction.defer(); + const queue = player.getQueue(interaction.guildID); + if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); + const success = queue.setPaused(true); + return void interaction.followUp({ content: success ? "⏸ | Paused!" : "❌ | Something went wrong!" }); + } else if (interaction.commandName === "resume") { + await interaction.defer(); + const queue = player.getQueue(interaction.guildID); + if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); + const success = queue.setPaused(false); + return void interaction.followUp({ content: success ? "▶ | Resumed!" : "❌ | Something went wrong!" }); + } else if (interaction.commandName === "stop") { + await interaction.defer(); + const queue = player.getQueue(interaction.guildID); + if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); + queue.destroy(); + return void interaction.followUp({ content: "🛑 | Stopped the player!" }); + } else if (interaction.commandName === "np") { + await interaction.defer(); + const queue = player.getQueue(interaction.guildID); + if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); + return void interaction.followUp({ content: `🎶 | Current song: **${queue.current.title}**!` }); + } else { + interaction.reply({ + content: "Unknown command!", + ephemeral: true + }); } }); -client.login(config.token); \ No newline at end of file +client.login(config.token); diff --git a/package.json b/package.json index b9bb6e8..a5c4876 100644 --- a/package.json +++ b/package.json @@ -9,8 +9,8 @@ ], "scripts": { "test": "cd example && ts-node index.ts", - "build": "tsc", - "format": "prettier --write \"src/**/*.ts\"", + "build": "rimraf lib && tsc", + "format": "prettier --write \"src/**/*.ts\" \"example/**/*.ts\"", "lint": "tslint -p tsconfig.json", "docs": "docgen --jsdoc jsdoc.json --verbose --source src/*.ts src/**/*.ts --custom docs/index.yml --output docs/docs.json", "docs:test": "docgen --jsdoc jsdoc.json --verbose --source src/*.ts src/**/*.ts --custom docs/index.yml" @@ -68,10 +68,11 @@ "@types/node": "^14.14.41", "@types/ws": "^7.4.1", "discord-api-types": "^0.18.1", - "discord.js": "^13.0.0-dev.f5f3f772865ee98bbb44df938e0e71f9f8865c10", + "discord.js": "^13.0.0-dev.02693bc02f45980d8165820a103220f0027b96b7", "discord.js-docgen": "discordjs/docgen#ts-patch", "jsdoc-babel": "^0.5.0", "prettier": "^2.2.1", + "rimraf": "^3.0.2", "ts-node": "^10.0.0", "tslint": "^6.1.3", "tslint-config-prettier": "^1.18.0", diff --git a/src/Player.ts b/src/Player.ts index 72f02e9..f76a63c 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -31,6 +31,12 @@ class DiscordPlayer extends EventEmitter { return this.queues.get(guild) as Queue; } + deleteQueue(guild: Snowflake) { + const prev = this.getQueue(guild); + this.queues.delete(guild); + return prev; + } + /** * Search tracks * @param {string|Track} query The search query diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 2ae4f21..8cca1cd 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -45,8 +45,7 @@ class Queue { } async connect(channel: StageChannel | VoiceChannel) { - if (!["stage", "voice"].includes(channel?.type)) - throw new TypeError(`Channel type must be voice or stage, got ${channel?.type}!`); + if (!["stage", "voice"].includes(channel?.type)) throw new TypeError(`Channel type must be voice or stage, got ${channel?.type}!`); const connection = await this.player.voiceUtils.connect(channel); this.connection = connection; @@ -69,6 +68,7 @@ class Queue { addTrack(track: Track) { this.addTracks([track]); + this.player.emit("trackAdd", this, track); } addTracks(tracks: Track[]) { @@ -86,12 +86,21 @@ class Queue { this.connection.audioResource.encoder.setBitrate(bitrate); } + setVolume(amount: number) { + if (!this.connection) return false; + return this.connection.setVolume(amount); + } + + get volume() { + if (!this.connection) return 100; + return this.connection.volume; + } + async play(src?: Track, options: PlayOptions = {}) { - if (!this.connection || !this.connection.voiceConnection) - throw new Error("Voice connection is not available, use .connect()!"); + if (!this.connection || !this.connection.voiceConnection) throw new Error("Voice connection is not available, use .connect()!"); + if (src && (this.playing || this.tracks.length) && !options.immediate) return this.addTrack(src); const track = options.filtersUpdate ? this.current : src ?? this.tracks.shift(); if (!track) return; - let stream; if (["youtube", "spotify"].includes(track.raw.source)) { stream = ytdl(track.raw.source === "spotify" ? track.raw.engine : track.url, { @@ -102,18 +111,13 @@ class Queue { seek: options.seek }); } else { - stream = ytdl.arbitraryStream( - track.raw.source === "soundcloud" - ? await track.raw.engine.downloadProgressive() - : (track.raw.engine as string), - { - // because we don't wanna decode opus into pcm again just for volume, let discord.js handle that - opusEncoded: false, - fmt: "s16le", - encoderArgs: options.encoderArgs ?? [], - seek: options.seek - } - ); + stream = ytdl.arbitraryStream(track.raw.source === "soundcloud" ? await track.raw.engine.downloadProgressive() : (track.raw.engine as string), { + // because we don't wanna decode opus into pcm again just for volume, let discord.js handle that + opusEncoded: false, + fmt: "s16le", + encoderArgs: options.encoderArgs ?? [], + seek: options.seek + }); } const resource: AudioResource = this.connection.createStream(stream, { @@ -124,12 +128,12 @@ class Queue { const dispatcher = await this.connection.playStream(resource); dispatcher.setVolume(this.options.initialVolume); - dispatcher.on("start", () => { + dispatcher.once("start", () => { this.playing = true; if (!options.filtersUpdate) this.player.emit("trackStart", this, this.current); }); - dispatcher.on("finish", () => { + dispatcher.once("finish", () => { this.playing = false; if (options.filtersUpdate) return; @@ -138,9 +142,12 @@ class Queue { this.player.emit("queueEnd", this); } else { const nextTrack = this.tracks.shift(); - this.play(nextTrack); + this.play(nextTrack, { immediate: true }); } }); + + dispatcher.on("error", (e) => this.player.emit("error", this, e)); + dispatcher.on("debug", (msg) => this.player.emit("debug", this, msg)); } *[Symbol.iterator]() { diff --git a/src/VoiceInterface/BasicStreamDispatcher.ts b/src/VoiceInterface/BasicStreamDispatcher.ts index b95cbc8..7bf8544 100644 --- a/src/VoiceInterface/BasicStreamDispatcher.ts +++ b/src/VoiceInterface/BasicStreamDispatcher.ts @@ -51,16 +51,11 @@ class BasicStreamDispatcher extends EventEmitter { } } else if (newState.status === VoiceConnectionStatus.Destroyed) { this.end(); - } else if ( - !this.connectPromise && - (newState.status === VoiceConnectionStatus.Connecting || - newState.status === VoiceConnectionStatus.Signalling) - ) { + } else if (!this.connectPromise && (newState.status === VoiceConnectionStatus.Connecting || newState.status === VoiceConnectionStatus.Signalling)) { this.connectPromise = entersState(this.voiceConnection, VoiceConnectionStatus.Ready, 20000) .then(() => undefined) .catch(() => { - if (this.voiceConnection.state.status !== VoiceConnectionStatus.Destroyed) - this.voiceConnection.destroy(); + if (this.voiceConnection.state.status !== VoiceConnectionStatus.Destroyed) this.voiceConnection.destroy(); }) .finally(() => (this.connectPromise = undefined)); } @@ -140,8 +135,7 @@ class BasicStreamDispatcher extends EventEmitter { async playStream(resource: AudioResource = this.audioResource) { if (!resource) throw new PlayerError("Audio resource is not available!"); if (!this.audioResource) this.audioResource = resource; - if (this.voiceConnection.state.status !== VoiceConnectionStatus.Ready) - await entersState(this.voiceConnection, VoiceConnectionStatus.Ready, 20000); + if (this.voiceConnection.state.status !== VoiceConnectionStatus.Ready) await entersState(this.voiceConnection, VoiceConnectionStatus.Ready, 20000); this.audioPlayer.play(resource); return this; @@ -155,6 +149,12 @@ class BasicStreamDispatcher extends EventEmitter { return true; } + get volume() { + if (!this.audioResource || !this.audioResource.volume) return 100; + const currentVol = this.audioResource.volume.volume; + return Math.round(Math.pow(currentVol, 1 / 1.660964) * 200); + } + get streamTime() { if (!this.audioResource) return 0; return this.audioResource.playbackDuration; diff --git a/src/types/types.ts b/src/types/types.ts index 8c14795..815b0bd 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -119,7 +119,8 @@ export interface PlayerEvents { botDisconnect: () => any; channelEmpty: () => any; connectionCreate: () => any; - error: () => any; + debug: (queue: Queue, message: string) => any; + error: (queue: Queue, error: Error) => any; musicStop: () => any; noResults: () => any; playlistAdd: () => any; @@ -130,7 +131,7 @@ export interface PlayerEvents { searchCancel: () => any; searchInvalidResponse: () => any; searchResults: () => any; - trackAdd: () => any; + trackAdd: (queue: Queue, track: Track) => any; trackStart: (queue: Queue, track: Track) => any; } @@ -143,4 +144,7 @@ export interface PlayOptions { /** Time to seek to before playing */ seek?: number; + + /** If it should start playing provided track immediately */ + immediate?: boolean; } diff --git a/src/utils/AudioFilters.ts b/src/utils/AudioFilters.ts index 7ebf8e6..9af7bbb 100644 --- a/src/utils/AudioFilters.ts +++ b/src/utils/AudioFilters.ts @@ -70,15 +70,11 @@ const FilterList = { }, get names() { - return Object.keys(this).filter( - (p) => !["names", "length"].includes(p) && typeof this[p as FiltersName] !== "function" - ); + return Object.keys(this).filter((p) => !["names", "length"].includes(p) && typeof this[p as FiltersName] !== "function"); }, get length() { - return Object.keys(this).filter( - (p) => !["names", "length"].includes(p) && typeof this[p as FiltersName] !== "function" - ).length; + return Object.keys(this).filter((p) => !["names", "length"].includes(p) && typeof this[p as FiltersName] !== "function").length; }, toString() { diff --git a/src/utils/QueryResolver.ts b/src/utils/QueryResolver.ts index 59ba9ef..918b845 100644 --- a/src/utils/QueryResolver.ts +++ b/src/utils/QueryResolver.ts @@ -6,11 +6,9 @@ import { validateURL as SoundcloudValidateURL } from "soundcloud-scraper"; // scary things below *sigh* const spotifySongRegex = /https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(?:track\/|\?uri=spotify:track:)((\w|-){22})/; -const spotifyPlaylistRegex = - /https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(?:playlist\/|\?uri=spotify:playlist:)((\w|-){22})/; +const spotifyPlaylistRegex = /https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(?:playlist\/|\?uri=spotify:playlist:)((\w|-){22})/; const spotifyAlbumRegex = /https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(?:album\/|\?uri=spotify:album:)((\w|-){22})/; -const vimeoRegex = - /(http|https)?:\/\/(www\.|player\.)?vimeo\.com\/(?:channels\/(?:\w+\/)?|groups\/([^/]*)\/videos\/|video\/|)(\d+)(?:|\/\?)/; +const vimeoRegex = /(http|https)?:\/\/(www\.|player\.)?vimeo\.com\/(?:channels\/(?:\w+\/)?|groups\/([^/]*)\/videos\/|video\/|)(\d+)(?:|\/\?)/; const facebookRegex = /(https?:\/\/)(www\.|m\.)?(facebook|fb).com\/.*\/videos\/.*/; const reverbnationRegex = /https:\/\/(www.)?reverbnation.com\/(.+)\/song\/(.+)/; const attachmentRegex = diff --git a/yarn.lock b/yarn.lock index 5cf7134..139d780 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1860,10 +1860,10 @@ discord.js-docgen@discordjs/docgen#ts-patch: tsubaki "^1.3.2" yargs "^14.0.0" -discord.js@^13.0.0-dev.f5f3f772865ee98bbb44df938e0e71f9f8865c10: - version "13.0.0-dev.f5f3f772865ee98bbb44df938e0e71f9f8865c10" - resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0-dev.f5f3f772865ee98bbb44df938e0e71f9f8865c10.tgz#0fe3389e4befffd429ba37fc669b9153e87f33e5" - integrity sha512-VuGJMzXStqeeHmB3DDEShGHXGey215573kkbFxQinzrFYt1UNnQZ5d1ZmB7Y0oY3JSivpv3Whc5M/YtH41NMXQ== +discord.js@^13.0.0-dev.02693bc02f45980d8165820a103220f0027b96b7: + version "13.0.0-dev.02693bc02f45980d8165820a103220f0027b96b7" + resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0-dev.02693bc02f45980d8165820a103220f0027b96b7.tgz#5baa6c758b970a1e6175d06373d4ab33eb6a4164" + integrity sha512-nzbmF5MLSjpdr8DS7SpC9q291NQ8XkHlledM4lz+uFJ4YgnMmTpi6e0FgF7v2kpTJPqTsXDRY3rWBv6Dat+08A== dependencies: "@discordjs/collection" "^0.1.6" "@discordjs/form-data" "^3.0.1" From e611143f58ec549a04f8035a020dd54b73f36a5a Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 13 Jun 2021 13:56:54 +0545 Subject: [PATCH 037/215] properly delete queue --- src/Player.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Player.ts b/src/Player.ts index f76a63c..8b33207 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -33,7 +33,12 @@ class DiscordPlayer extends EventEmitter { deleteQueue(guild: Snowflake) { const prev = this.getQueue(guild); + + try { + prev.destroy(); + } catch {} this.queues.delete(guild); + return prev; } From 02d77264d74c6a2ca951f1dccd347140f798c48c Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 13 Jun 2021 14:02:50 +0545 Subject: [PATCH 038/215] feat: tracksAdd event --- src/Structures/Queue.ts | 3 ++- src/types/types.ts | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 8cca1cd..d8cfe2a 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -67,12 +67,13 @@ class Queue { } addTrack(track: Track) { - this.addTracks([track]); + this.tracks.push(track); this.player.emit("trackAdd", this, track); } addTracks(tracks: Track[]) { this.tracks.push(...tracks); + this.player.emit("tracksAdd", this, tracks); } setPaused(paused?: boolean) { diff --git a/src/types/types.ts b/src/types/types.ts index 815b0bd..3e06853 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -132,6 +132,7 @@ export interface PlayerEvents { searchInvalidResponse: () => any; searchResults: () => any; trackAdd: (queue: Queue, track: Track) => any; + tracksAdd: (queue: Queue, track: Track[]) => any; trackStart: (queue: Queue, track: Track) => any; } From 91153826cea0dd7696edcf2700dd2c152f9c1dc4 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 13 Jun 2021 14:29:49 +0545 Subject: [PATCH 039/215] example bot --- example/index.ts | 15 ++++++++------- src/utils/QueryResolver.ts | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/example/index.ts b/example/index.ts index 5972a84..e3b90e4 100644 --- a/example/index.ts +++ b/example/index.ts @@ -149,18 +149,19 @@ client.on("interaction", async (interaction) => { const queue = player.getQueue(interaction.guildID); if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); const currentTrack = queue.current; - const tracks = queue.tracks - .slice(0, 10) - .map((m, i) => { - return `${i + 1}. **${m.title}**`; - }) - .join("\n"); + const tracks = queue.tracks.slice(0, 10).map((m, i) => { + return `${i + 1}. **${m.title}**`; + }); return void interaction.followUp({ embeds: [ { title: "Server Queue", - description: `${tracks}${queue.tracks.length > tracks.length ? `...${queue.tracks.length - tracks.length} more tracks` : ""}`, + description: `${tracks.join("\n")}${ + queue.tracks.length > tracks.length + ? `\n...${queue.tracks.length - tracks.length === 1 ? `${queue.tracks.length - tracks.length} more track` : `${queue.tracks.length - tracks.length} more tracks`}` + : "" + }`, color: 0xff0000, fields: [{ name: "Now Playing", value: `🎶 | **${currentTrack.title}**` }] } diff --git a/src/utils/QueryResolver.ts b/src/utils/QueryResolver.ts index 918b845..42269b5 100644 --- a/src/utils/QueryResolver.ts +++ b/src/utils/QueryResolver.ts @@ -19,7 +19,7 @@ class QueryResolver { static resolve(query: string): QueryType { if (SoundcloudValidateURL(query, "track")) return QueryType.SOUNDCLOUD_TRACK; if (SoundcloudValidateURL(query, "playlist") || query.includes("/sets/")) return QueryType.SOUNDCLOUD_PLAYLIST; - if (validateID(query) || validateURL(query)) return QueryType.YOUTUBE; + if (validateID(query) || validateURL(query)) return QueryType.YOUTUBE_SEARCH; if (YouTube.validate(query, "PLAYLIST_ID")) return QueryType.YOUTUBE_PLAYLIST; if (spotifySongRegex.test(query)) return QueryType.SPOTIFY_SONG; if (spotifyPlaylistRegex.test(query)) return QueryType.SPOTIFY_PLAYLIST; From d36f528518545e3a5d49bd96eaae91b6118d037a Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 13 Jun 2021 14:38:13 +0545 Subject: [PATCH 040/215] check for metadata while creating queue --- src/Player.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Player.ts b/src/Player.ts index 8b33207..841cdf6 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -21,7 +21,7 @@ class DiscordPlayer extends EventEmitter { if (this.queues.has(guild.id)) return this.queues.get(guild.id) as Queue; const queue = new Queue(this, guild, queueInitOptions); - queue.metadata = queueInitOptions.metadata; + if ("metadata" in queueInitOptions) queue.metadata = queueInitOptions.metadata; this.queues.set(guild.id, queue); return queue as Queue; From 3d908e53d103df9a60870fcd06f33f8ab813431c Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 13 Jun 2021 14:51:01 +0545 Subject: [PATCH 041/215] fix volume issue --- src/Structures/Queue.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index d8cfe2a..e6612b4 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -89,6 +89,7 @@ class Queue { setVolume(amount: number) { if (!this.connection) return false; + this.options.initialVolume = amount; return this.connection.setVolume(amount); } From b87485edb5a127a0437e58dc5fb23ac94184c0ac Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 13 Jun 2021 15:05:05 +0545 Subject: [PATCH 042/215] events --- src/Structures/Queue.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index e6612b4..1d7fa07 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -49,6 +49,9 @@ class Queue { const connection = await this.player.voiceUtils.connect(channel); this.connection = connection; + // it's ok to use this here since Queue listens to the events 1 time per play + this.connection.setMaxListeners(Infinity); + if (channel.type === "stage") await channel.guild.me.voice.setRequestToSpeak(true).catch(() => {}); return this; @@ -147,9 +150,6 @@ class Queue { this.play(nextTrack, { immediate: true }); } }); - - dispatcher.on("error", (e) => this.player.emit("error", this, e)); - dispatcher.on("debug", (msg) => this.player.emit("debug", this, msg)); } *[Symbol.iterator]() { From 9e3b66ee8a75e686269c0c5bbd4997e9948474b3 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 13 Jun 2021 15:07:45 +0545 Subject: [PATCH 043/215] Queue#events --- src/Structures/Queue.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 1d7fa07..072d9fe 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -49,11 +49,14 @@ class Queue { const connection = await this.player.voiceUtils.connect(channel); this.connection = connection; - // it's ok to use this here since Queue listens to the events 1 time per play + // it's ok to use this here since Queue listens to the events 1 time per play and destroys the listener this.connection.setMaxListeners(Infinity); if (channel.type === "stage") await channel.guild.me.voice.setRequestToSpeak(true).catch(() => {}); + this.connection.on("error", err => this.player.emit("error", this, err)); + this.connection.on("debug", msg => this.player.emit("debug", this, msg)); + return this; } From 580f4aa9c6576ca0f36ff8fb3647267c628f7519 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 13 Jun 2021 16:13:02 +0545 Subject: [PATCH 044/215] better paused status --- src/VoiceInterface/BasicStreamDispatcher.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/VoiceInterface/BasicStreamDispatcher.ts b/src/VoiceInterface/BasicStreamDispatcher.ts index 7bf8544..91301be 100644 --- a/src/VoiceInterface/BasicStreamDispatcher.ts +++ b/src/VoiceInterface/BasicStreamDispatcher.ts @@ -29,7 +29,6 @@ class BasicStreamDispatcher extends EventEmitter { public readonly channel: VoiceChannel | StageChannel; public connectPromise?: Promise; public audioResource?: AudioResource; - public paused = false; constructor(connection: VoiceConnection, channel: VoiceChannel | StageChannel) { super(); @@ -118,13 +117,11 @@ class BasicStreamDispatcher extends EventEmitter { pause(interpolateSilence?: boolean) { const success = this.audioPlayer.pause(interpolateSilence); - this.paused = success; return success; } resume() { const success = this.audioPlayer.unpause(); - this.paused = !success; return success; } @@ -159,6 +156,10 @@ class BasicStreamDispatcher extends EventEmitter { if (!this.audioResource) return 0; return this.audioResource.playbackDuration; } + + get paused() { + return [AudioPlayerStatus.AutoPaused, AudioPlayerStatus.Paused].includes(this.audioPlayer.state.status) + } } export { BasicStreamDispatcher as StreamDispatcher }; From f38e5a8b113cb6cad89557117e54f8a8a22f5250 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 13 Jun 2021 16:25:41 +0545 Subject: [PATCH 045/215] basic JSDOC --- src/Player.ts | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/Player.ts b/src/Player.ts index 841cdf6..d1babe1 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -12,25 +12,52 @@ class DiscordPlayer extends EventEmitter { public readonly queues = new Collection(); public readonly voiceUtils = new VoiceUtils(); + /** + * Creates new Discord Player + * @param {Discord.Client} client The Discord Client + */ constructor(client: Client) { super(); + + /** + * The discord.js client + * @type {Discord.Client} + */ this.client = client; } + /** + * Creates a queue for a guild if not available, else returns existing queue + * @param {Discord.Guild} guild The guild + * @param {PlayerOptions} queueInitOptions Queue init options + * @returns {Queue} + */ createQueue(guild: Guild, queueInitOptions?: PlayerOptions & { metadata?: any }) { if (this.queues.has(guild.id)) return this.queues.get(guild.id) as Queue; + const _meta = queueInitOptions.metadata; + delete queueInitOptions["metadata"]; const queue = new Queue(this, guild, queueInitOptions); - if ("metadata" in queueInitOptions) queue.metadata = queueInitOptions.metadata; + queue.metadata = _meta; this.queues.set(guild.id, queue); return queue as Queue; } + /** + * Returns the queue if available + * @param {Discord.Snowflake} guild The guild id + * @returns {Queue} + */ getQueue(guild: Snowflake) { return this.queues.get(guild) as Queue; } + /** + * Deletes a queue and returns deleted queue object + * @param {Discord.Snowflake} guild The guild id to remove + * @returns {Queue} + */ deleteQueue(guild: Snowflake) { const prev = this.getQueue(guild); @@ -45,7 +72,7 @@ class DiscordPlayer extends EventEmitter { /** * Search tracks * @param {string|Track} query The search query - * @param {User} requestedBy The person who requested track search + * @param {Discord.User} requestedBy The person who requested track search * @returns {Promise} */ async search(query: string | Track, requestedBy: User) { From dac08c1d3fa06afeda486e27cf12c18a558eb410 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 13 Jun 2021 17:48:20 +0545 Subject: [PATCH 046/215] implement soundcloud search --- example/index.ts | 22 ++++++++++- src/Player.ts | 44 +++++++++++++++++++-- src/Structures/Queue.ts | 4 +- src/VoiceInterface/BasicStreamDispatcher.ts | 2 +- src/types/types.ts | 9 ++++- src/utils/Util.ts | 35 +++++++++++++++- 6 files changed, 105 insertions(+), 11 deletions(-) diff --git a/example/index.ts b/example/index.ts index e3b90e4..da746bc 100644 --- a/example/index.ts +++ b/example/index.ts @@ -1,5 +1,6 @@ import { Client, GuildMember, Message, TextChannel } from "discord.js"; import { Player, Queue, Track } from "../src/index"; +import { QueryType } from "../src/types/types"; import { config } from "./config"; // use this in prod. // import { Player, Queue } from "discord-player"; @@ -51,6 +52,18 @@ client.on("message", async (message) => { } ] }, + { + name: "soundcloud", + description: "Plays a song from soundcloud", + options: [ + { + name: "query", + type: "STRING", + description: "The song you want to play", + required: true + } + ] + }, { name: "volume", description: "Sets music volume", @@ -104,11 +117,16 @@ client.on("interaction", async (interaction) => { return void interaction.reply({ content: "You are not in my voice channel!", ephemeral: true }); } - if (interaction.commandName === "play") { + if (interaction.commandName === "play" || interaction.commandName === "soundcloud") { await interaction.defer(); const query = interaction.options.get("query")!.value! as string; - const searchResult = (await player.search(query, interaction.user).catch(() => [])) as Track[]; + const searchResult = (await player + .search(query, { + requestedBy: interaction.user, + searchEngine: interaction.commandName === "soundcloud" ? QueryType.SOUNDCLOUD_SEARCH : QueryType.AUTO + }) + .catch(() => [])) as Track[]; if (!searchResult.length) return void interaction.followUp({ content: "No results were found!" }); const queue = await player.createQueue(interaction.guild, { diff --git a/src/Player.ts b/src/Player.ts index d1babe1..df299ce 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -2,10 +2,15 @@ import { Client, Collection, Guild, Snowflake, User } from "discord.js"; import { TypedEmitter as EventEmitter } from "tiny-typed-emitter"; import { Queue } from "./Structures/Queue"; import { VoiceUtils } from "./VoiceInterface/VoiceUtils"; -import { PlayerEvents, PlayerOptions, QueryType } from "./types/types"; +import { PlayerEvents, PlayerOptions, QueryType, SearchOptions } from "./types/types"; import Track from "./Structures/Track"; import { QueryResolver } from "./utils/QueryResolver"; import YouTube from "youtube-sr"; +import { Util } from "./utils/Util"; +// @ts-ignore +import { Client as SoundCloud } from "soundcloud-scraper"; + +const soundcloud = new SoundCloud(); class DiscordPlayer extends EventEmitter { public readonly client: Client; @@ -75,11 +80,13 @@ class DiscordPlayer extends EventEmitter { * @param {Discord.User} requestedBy The person who requested track search * @returns {Promise} */ - async search(query: string | Track, requestedBy: User) { + async search(query: string | Track, options: SearchOptions) { if (query instanceof Track) return [query]; + if (!options) throw new Error("DiscordPlayer#search needs search options!"); + if (!("searchEngine" in options)) options.searchEngine = QueryType.AUTO; // @todo: add extractors - const qt = QueryResolver.resolve(query); + const qt = options.searchEngine === QueryType.AUTO ? QueryResolver.resolve(query) : options.searchEngine; switch (qt) { case QueryType.YOUTUBE_SEARCH: { const videos = await YouTube.search(query, { @@ -93,7 +100,7 @@ class DiscordPlayer extends EventEmitter { description: m.description, author: m.channel?.name, url: m.url, - requestedBy: requestedBy, + requestedBy: options.requestedBy, thumbnail: m.thumbnail?.displayThumbnailURL("maxresdefault"), views: m.views, fromPlaylist: false, @@ -102,6 +109,35 @@ class DiscordPlayer extends EventEmitter { }); }); } + case QueryType.SOUNDCLOUD_TRACK: + case QueryType.SOUNDCLOUD_SEARCH: { + const result: any[] = QueryResolver.resolve(query) === QueryType.SOUNDCLOUD_TRACK ? [{ url: query }] : await soundcloud.search(query, "track").catch(() => {}); + if (!result || !result.length) return []; + const res: Track[] = []; + + for (const r of result) { + const trackInfo = await soundcloud.getSongInfo(r.url).catch(() => {}); + if (!trackInfo) continue; + + const track = new Track(this, { + title: trackInfo.title, + url: trackInfo.url, + duration: Util.buildTimeCode(Util.parseMS(trackInfo.duration)), + description: trackInfo.description, + thumbnail: trackInfo.thumbnail, + views: trackInfo.playCount, + author: trackInfo.author.name, + requestedBy: options.requestedBy, + fromPlaylist: false, + source: "soundcloud", + engine: trackInfo + }); + + res.push(track); + } + + return res; + } default: return []; } diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 072d9fe..604f9c7 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -54,8 +54,8 @@ class Queue { if (channel.type === "stage") await channel.guild.me.voice.setRequestToSpeak(true).catch(() => {}); - this.connection.on("error", err => this.player.emit("error", this, err)); - this.connection.on("debug", msg => this.player.emit("debug", this, msg)); + this.connection.on("error", (err) => this.player.emit("error", this, err)); + this.connection.on("debug", (msg) => this.player.emit("debug", this, msg)); return this; } diff --git a/src/VoiceInterface/BasicStreamDispatcher.ts b/src/VoiceInterface/BasicStreamDispatcher.ts index 91301be..7579ada 100644 --- a/src/VoiceInterface/BasicStreamDispatcher.ts +++ b/src/VoiceInterface/BasicStreamDispatcher.ts @@ -158,7 +158,7 @@ class BasicStreamDispatcher extends EventEmitter { } get paused() { - return [AudioPlayerStatus.AutoPaused, AudioPlayerStatus.Paused].includes(this.audioPlayer.state.status) + return [AudioPlayerStatus.AutoPaused, AudioPlayerStatus.Paused].includes(this.audioPlayer.state.status); } } diff --git a/src/types/types.ts b/src/types/types.ts index 3e06853..4a118ac 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -100,6 +100,7 @@ export interface ExtractorModelData { } export enum QueryType { + AUTO = "auto", YOUTUBE = "youtube", YOUTUBE_PLAYLIST = "youtube_playlist", SOUNDCLOUD_TRACK = "soundcloud_track", @@ -112,7 +113,8 @@ export enum QueryType { VIMEO = "vimeo", ARBITRARY = "arbitrary", REVERBNATION = "reverbnation", - YOUTUBE_SEARCH = "youtube_search" + YOUTUBE_SEARCH = "youtube_search", + SOUNDCLOUD_SEARCH = "soundcloud_search" } export interface PlayerEvents { @@ -149,3 +151,8 @@ export interface PlayOptions { /** If it should start playing provided track immediately */ immediate?: boolean; } + +export interface SearchOptions { + requestedBy: User; + searchEngine?: QueryType; +} diff --git a/src/utils/Util.ts b/src/utils/Util.ts index cb0ff5c..8d54958 100644 --- a/src/utils/Util.ts +++ b/src/utils/Util.ts @@ -1 +1,34 @@ -export {}; +import { TimeData } from "../types/types"; + +class Util { + static durationString(durObj: object) { + return Object.values(durObj) + .map((m) => (isNaN(m) ? 0 : m)) + .join(":"); + } + + static parseMS(milliseconds: number) { + const round = milliseconds > 0 ? Math.floor : Math.ceil; + + return { + days: round(milliseconds / 86400000), + hours: round(milliseconds / 3600000) % 24, + minutes: round(milliseconds / 60000) % 60, + seconds: round(milliseconds / 1000) % 60 + } as TimeData; + } + + static buildTimeCode(duration: TimeData) { + const items = Object.keys(duration); + const required = ["days", "hours", "minutes", "seconds"]; + + const parsed = items.filter((x) => required.includes(x)).map((m) => (duration[m as keyof TimeData] > 0 ? duration[m as keyof TimeData] : "")); + const final = parsed + .filter((x) => !!x) + .map((x) => x.toString().padStart(2, "0")) + .join(":"); + return final.length <= 3 ? `0:${final.padStart(2, "0") || 0}` : final; + } +} + +export { Util }; From fec70a25a1e5d425d64a2484aea9de22c1d397a6 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 13 Jun 2021 18:28:36 +0545 Subject: [PATCH 047/215] implement looping system --- example/index.ts | 38 ++++++++++++++++++++++++++++++++++++-- src/Player.ts | 2 +- src/Structures/Queue.ts | 19 +++++++++++++++++-- src/Structures/Track.ts | 1 + src/types/types.ts | 6 ++++++ src/utils/Util.ts | 5 +++++ 6 files changed, 66 insertions(+), 5 deletions(-) diff --git a/example/index.ts b/example/index.ts index da746bc..6538b64 100644 --- a/example/index.ts +++ b/example/index.ts @@ -1,6 +1,6 @@ import { Client, GuildMember, Message, TextChannel } from "discord.js"; import { Player, Queue, Track } from "../src/index"; -import { QueryType } from "../src/types/types"; +import { QueryType, QueueRepeatMode } from "../src/types/types"; import { config } from "./config"; // use this in prod. // import { Player, Queue } from "discord-player"; @@ -76,6 +76,32 @@ client.on("message", async (message) => { } ] }, + { + name: "loop", + description: "Sets loop mode", + options: [ + { + name: "mode", + type: "INTEGER", + description: "Loop type", + required: true, + choices: [ + { + name: "Off", + value: 0 + }, + { + name: "Track", + value: 1 + }, + { + name: "Queue", + value: 2 + } + ] + } + ] + }, { name: "skip", description: "Skip to the current song" @@ -130,7 +156,7 @@ client.on("interaction", async (interaction) => { if (!searchResult.length) return void interaction.followUp({ content: "No results were found!" }); const queue = await player.createQueue(interaction.guild, { - metadata: interaction.channel + metadata: interaction.channel as TextChannel }); try { @@ -208,6 +234,14 @@ client.on("interaction", async (interaction) => { const queue = player.getQueue(interaction.guildID); if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); return void interaction.followUp({ content: `🎶 | Current song: **${queue.current.title}**!` }); + } else if (interaction.commandName === "loop") { + await interaction.defer(); + const queue = player.getQueue(interaction.guildID); + if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); + const loopMode = interaction.options.get("mode")!.value as QueueRepeatMode; + const success = queue.setRepeatMode(loopMode); + const mode = loopMode === QueueRepeatMode.TRACK ? "🔂" : loopMode === QueueRepeatMode.QUEUE ? "🔁" : "▶"; + return void interaction.followUp({ content: success ? `${mode} | Updated loop mode!` : "❌ | Could not update loop mode!" }); } else { interaction.reply({ content: "Unknown command!", diff --git a/src/Player.ts b/src/Player.ts index df299ce..910edb1 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -37,7 +37,7 @@ class DiscordPlayer extends EventEmitter { * @param {PlayerOptions} queueInitOptions Queue init options * @returns {Queue} */ - createQueue(guild: Guild, queueInitOptions?: PlayerOptions & { metadata?: any }) { + createQueue(guild: Guild, queueInitOptions?: PlayerOptions & { metadata?: T }): Queue { if (this.queues.has(guild.id)) return this.queues.get(guild.id) as Queue; const _meta = queueInitOptions.metadata; diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 604f9c7..4a9cdfa 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -2,18 +2,21 @@ import { Guild, StageChannel, VoiceChannel } from "discord.js"; import { Player } from "../Player"; import { StreamDispatcher } from "../VoiceInterface/BasicStreamDispatcher"; import Track from "./Track"; -import { PlayerOptions, PlayOptions } from "../types/types"; +import { PlayerOptions, PlayOptions, QueueRepeatMode } from "../types/types"; import ytdl from "discord-ytdl-core"; import { AudioResource, StreamType } from "@discordjs/voice"; +import { Util } from "../utils/Util"; class Queue { public readonly guild: Guild; public readonly player: Player; public connection: StreamDispatcher; public tracks: Track[] = []; + public previousTracks: Track[] = []; public options: PlayerOptions; public playing = false; public metadata?: T = null; + public repeatMode: QueueRepeatMode = 0; constructor(player: Player, guild: Guild, options: PlayerOptions = {}) { this.player = player; @@ -99,6 +102,14 @@ class Queue { return this.connection.setVolume(amount); } + setRepeatMode(mode: QueueRepeatMode) { + if (![QueueRepeatMode.OFF, QueueRepeatMode.QUEUE, QueueRepeatMode.TRACK].includes(mode)) throw new Error(`Unknown repeat mode "${mode}"!`); + const prev = this.repeatMode; + if (mode === prev) return false; + this.repeatMode = mode; + return true; + } + get volume() { if (!this.connection) return 100; return this.connection.volume; @@ -109,6 +120,8 @@ class Queue { if (src && (this.playing || this.tracks.length) && !options.immediate) return this.addTrack(src); const track = options.filtersUpdate ? this.current : src ?? this.tracks.shift(); if (!track) return; + this.previousTracks = this.previousTracks.filter((x) => x._trackID !== track._trackID); + this.previousTracks.push(track); let stream; if (["youtube", "spotify"].includes(track.raw.source)) { stream = ytdl(track.raw.source === "spotify" ? track.raw.engine : track.url, { @@ -145,10 +158,12 @@ class Queue { this.playing = false; if (options.filtersUpdate) return; - if (!this.tracks.length) { + if (!this.tracks.length && this.repeatMode === QueueRepeatMode.OFF) { this.destroy(); this.player.emit("queueEnd", this); } else { + if (this.repeatMode === QueueRepeatMode.TRACK) return void this.play(Util.last(this.previousTracks), { immediate: true }); + if (this.repeatMode === QueueRepeatMode.QUEUE) this.tracks.push(Util.last(this.previousTracks)); const nextTrack = this.tracks.shift(); this.play(nextTrack, { immediate: true }); } diff --git a/src/Structures/Track.ts b/src/Structures/Track.ts index 7a5c5f6..f4aca3a 100644 --- a/src/Structures/Track.ts +++ b/src/Structures/Track.ts @@ -15,6 +15,7 @@ class Track { public requestedBy!: User; public fromPlaylist!: boolean; public readonly raw!: RawTrackData; + public readonly _trackID = Date.now(); /** * Track constructor diff --git a/src/types/types.ts b/src/types/types.ts index 4a118ac..f97994e 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -156,3 +156,9 @@ export interface SearchOptions { requestedBy: User; searchEngine?: QueryType; } + +export enum QueueRepeatMode { + OFF = 0, + TRACK = 1, + QUEUE = 2 +} diff --git a/src/utils/Util.ts b/src/utils/Util.ts index 8d54958..7411df1 100644 --- a/src/utils/Util.ts +++ b/src/utils/Util.ts @@ -29,6 +29,11 @@ class Util { .join(":"); return final.length <= 3 ? `0:${final.padStart(2, "0") || 0}` : final; } + + static last(arr: T[]): T { + if (!Array.isArray(arr)) return; + return arr[arr.length - 1]; + } } export { Util }; From 2e75728d11e9497f25766817eed650183a9e93d3 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 13 Jun 2021 18:31:15 +0545 Subject: [PATCH 048/215] implement back method to play previous track --- src/Structures/Queue.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 4a9cdfa..e978785 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -115,6 +115,10 @@ class Queue { return this.connection.volume; } + async back() { + return await this.play(Util.last(this.previousTracks), { immediate: true }); + } + async play(src?: Track, options: PlayOptions = {}) { if (!this.connection || !this.connection.voiceConnection) throw new Error("Voice connection is not available, use .connect()!"); if (src && (this.playing || this.tracks.length) && !options.immediate) return this.addTrack(src); From 11de5d80384e6306a365fdece1f610f3a074e4d1 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 13 Jun 2021 18:54:25 +0545 Subject: [PATCH 049/215] spotify track support --- src/Player.ts | 22 ++++++++++++++++++++++ src/Structures/Queue.ts | 30 +++++++++++++++++++++--------- 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/src/Player.ts b/src/Player.ts index 910edb1..c5f7d28 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -7,6 +7,7 @@ import Track from "./Structures/Track"; import { QueryResolver } from "./utils/QueryResolver"; import YouTube from "youtube-sr"; import { Util } from "./utils/Util"; +import Spotify from "spotify-url-info"; // @ts-ignore import { Client as SoundCloud } from "soundcloud-scraper"; @@ -138,6 +139,27 @@ class DiscordPlayer extends EventEmitter { return res; } + case QueryType.SPOTIFY_SONG: { + const spotifyData = await Spotify.getData(query).catch(() => {}); + if (!spotifyData) return []; + const spotifyTrack = new Track(this, { + title: spotifyData.name, + description: spotifyData.description ?? "", + author: spotifyData.artists[0]?.name ?? "Unknown Artist", + url: spotifyData.external_urls?.spotify ?? query, + thumbnail: + spotifyData.album?.images[0]?.url ?? spotifyData.preview_url?.length + ? `https://i.scdn.co/image/${spotifyData.preview_url?.split("?cid=")[1]}` + : "https://www.scdn.co/i/_global/twitter_card-default.jpg", + duration: Util.buildTimeCode(Util.parseMS(spotifyData.duration_ms)), + views: 0, + requestedBy: options.requestedBy, + fromPlaylist: false, + source: "spotify" + }); + + return [spotifyTrack]; + } default: return []; } diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index e978785..d8d8be0 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -6,6 +6,7 @@ import { PlayerOptions, PlayOptions, QueueRepeatMode } from "../types/types"; import ytdl from "discord-ytdl-core"; import { AudioResource, StreamType } from "@discordjs/voice"; import { Util } from "../utils/Util"; +import YouTube from "youtube-sr"; class Queue { public readonly guild: Guild; @@ -119,7 +120,7 @@ class Queue { return await this.play(Util.last(this.previousTracks), { immediate: true }); } - async play(src?: Track, options: PlayOptions = {}) { + async play(src?: Track, options: PlayOptions = {}): Promise { if (!this.connection || !this.connection.voiceConnection) throw new Error("Voice connection is not available, use .connect()!"); if (src && (this.playing || this.tracks.length) && !options.immediate) return this.addTrack(src); const track = options.filtersUpdate ? this.current : src ?? this.tracks.shift(); @@ -128,7 +129,15 @@ class Queue { this.previousTracks.push(track); let stream; if (["youtube", "spotify"].includes(track.raw.source)) { - stream = ytdl(track.raw.source === "spotify" ? track.raw.engine : track.url, { + if (track.raw.source === "spotify" && !track.raw.engine) { + track.raw.engine = await YouTube.search(`${track.author} ${track.title}`, { type: "video" }) + .then((x) => x[0].url) + .catch(() => null); + } + const link = track.raw.source === "spotify" ? track.raw.engine : track.url; + if (!link) return void this.play(this.tracks.shift(), { immediate: true }); + + stream = ytdl(link, { // because we don't wanna decode opus into pcm again just for volume, let discord.js handle that opusEncoded: false, fmt: "s16le", @@ -136,13 +145,16 @@ class Queue { seek: options.seek }); } else { - stream = ytdl.arbitraryStream(track.raw.source === "soundcloud" ? await track.raw.engine.downloadProgressive() : (track.raw.engine as string), { - // because we don't wanna decode opus into pcm again just for volume, let discord.js handle that - opusEncoded: false, - fmt: "s16le", - encoderArgs: options.encoderArgs ?? [], - seek: options.seek - }); + stream = ytdl.arbitraryStream( + track.raw.source === "soundcloud" ? await track.raw.engine.downloadProgressive() : typeof track.raw.engine === "function" ? await track.raw.engine() : track.raw.engine, + { + // because we don't wanna decode opus into pcm again just for volume, let discord.js handle that + opusEncoded: false, + fmt: "s16le", + encoderArgs: options.encoderArgs ?? [], + seek: options.seek + } + ); } const resource: AudioResource = this.connection.createStream(stream, { From da5f4a64bab7a6788eb386f77f5a824288d17ddf Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 13 Jun 2021 20:16:27 +0545 Subject: [PATCH 050/215] partial playlist implementation --- example/index.ts | 9 ++-- src/Player.ts | 87 +++++++++++++++++++++++++++++++++----- src/Structures/Playlist.ts | 42 +++++++++++++++++- src/Structures/Track.ts | 13 +++--- src/types/types.ts | 48 ++++++++++++++++++++- 5 files changed, 174 insertions(+), 25 deletions(-) diff --git a/example/index.ts b/example/index.ts index 6538b64..721ede0 100644 --- a/example/index.ts +++ b/example/index.ts @@ -147,13 +147,13 @@ client.on("interaction", async (interaction) => { await interaction.defer(); const query = interaction.options.get("query")!.value! as string; - const searchResult = (await player + const searchResult = await player .search(query, { requestedBy: interaction.user, searchEngine: interaction.commandName === "soundcloud" ? QueryType.SOUNDCLOUD_SEARCH : QueryType.AUTO }) - .catch(() => [])) as Track[]; - if (!searchResult.length) return void interaction.followUp({ content: "No results were found!" }); + .catch(() => {}); + if (!searchResult || !searchResult.tracks.length) return void interaction.followUp({ content: "No results were found!" }); const queue = await player.createQueue(interaction.guild, { metadata: interaction.channel as TextChannel @@ -167,7 +167,8 @@ client.on("interaction", async (interaction) => { } await interaction.followUp({ content: "⏱ | Loading your track..." }); - await queue.play(searchResult[0]); + searchResult.playlist ? queue.addTracks(searchResult.tracks) : queue.addTrack(searchResult.tracks[0]); + if (!queue.playing) await queue.play(); } else if (interaction.commandName === "volume") { await interaction.defer(); const queue = player.getQueue(interaction.guildID); diff --git a/src/Player.ts b/src/Player.ts index c5f7d28..c0a3fb0 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -10,6 +10,7 @@ import { Util } from "./utils/Util"; import Spotify from "spotify-url-info"; // @ts-ignore import { Client as SoundCloud } from "soundcloud-scraper"; +import { Playlist } from "./Structures/Playlist"; const soundcloud = new SoundCloud(); @@ -82,7 +83,7 @@ class DiscordPlayer extends EventEmitter { * @returns {Promise} */ async search(query: string | Track, options: SearchOptions) { - if (query instanceof Track) return [query]; + if (query instanceof Track) return { playlist: false, tracks: [query] }; if (!options) throw new Error("DiscordPlayer#search needs search options!"); if (!("searchEngine" in options)) options.searchEngine = QueryType.AUTO; @@ -92,9 +93,10 @@ class DiscordPlayer extends EventEmitter { case QueryType.YOUTUBE_SEARCH: { const videos = await YouTube.search(query, { type: "video" - }); + }).catch(() => {}); + if (!videos) return { playlist: false, tracks: [] }; - return videos.map((m) => { + const tracks = videos.map((m) => { (m as any).source = "youtube"; return new Track(this, { title: m.title, @@ -104,16 +106,17 @@ class DiscordPlayer extends EventEmitter { requestedBy: options.requestedBy, thumbnail: m.thumbnail?.displayThumbnailURL("maxresdefault"), views: m.views, - fromPlaylist: false, duration: m.durationFormatted, raw: m }); }); + + return { playlist: false, tracks }; } case QueryType.SOUNDCLOUD_TRACK: case QueryType.SOUNDCLOUD_SEARCH: { const result: any[] = QueryResolver.resolve(query) === QueryType.SOUNDCLOUD_TRACK ? [{ url: query }] : await soundcloud.search(query, "track").catch(() => {}); - if (!result || !result.length) return []; + if (!result || !result.length) return { playlist: false, tracks: [] }; const res: Track[] = []; for (const r of result) { @@ -129,7 +132,6 @@ class DiscordPlayer extends EventEmitter { views: trackInfo.playCount, author: trackInfo.author.name, requestedBy: options.requestedBy, - fromPlaylist: false, source: "soundcloud", engine: trackInfo }); @@ -137,11 +139,11 @@ class DiscordPlayer extends EventEmitter { res.push(track); } - return res; + return { playlist: false, tracks: res }; } case QueryType.SPOTIFY_SONG: { const spotifyData = await Spotify.getData(query).catch(() => {}); - if (!spotifyData) return []; + if (!spotifyData) return { playlist: false, tracks: [] }; const spotifyTrack = new Track(this, { title: spotifyData.name, description: spotifyData.description ?? "", @@ -154,14 +156,77 @@ class DiscordPlayer extends EventEmitter { duration: Util.buildTimeCode(Util.parseMS(spotifyData.duration_ms)), views: 0, requestedBy: options.requestedBy, - fromPlaylist: false, source: "spotify" }); - return [spotifyTrack]; + return { playlist: false, tracks: [spotifyTrack] }; + } + case QueryType.SPOTIFY_PLAYLIST: + case QueryType.SPOTIFY_ALBUM: { + const spotifyPlaylist = await Spotify.getData(query).catch(() => {}); + if (!spotifyPlaylist) return { playlist: false, tracks: [] }; + + const playlist = new Playlist(this, { + title: spotifyPlaylist.name ?? spotifyPlaylist.title, + description: spotifyPlaylist.description ?? "", + thumbnail: spotifyPlaylist.images[0]?.url ?? "https://www.scdn.co/i/_global/twitter_card-default.jpg", + type: spotifyPlaylist.type, + source: "spotify", + author: + spotifyPlaylist.type !== "playlist" + ? { + name: spotifyPlaylist.artists[0]?.name ?? "Unknown Artist", + url: spotifyPlaylist.artists[0]?.external_urls?.spotify ?? null + } + : { + name: spotifyPlaylist.owner?.display_name ?? spotifyPlaylist.owner?.id ?? "Unknown Artist", + url: spotifyPlaylist.owner?.external_urls?.spotify ?? null + }, + tracks: [], + id: spotifyPlaylist.id, + url: spotifyPlaylist.external_urls?.spotify ?? query + }); + + if (spotifyPlaylist.type !== "playlist") { + playlist.tracks = spotifyPlaylist.tracks.items.map((m: any) => { + const data = new Track(this, { + title: m.name ?? "", + description: m.description ?? "", + author: m.artists[0]?.name ?? "Unknown Artist", + url: m.external_urls?.spotify ?? query, + thumbnail: spotifyPlaylist.images[0]?.url ?? "https://www.scdn.co/i/_global/twitter_card-default.jpg", + duration: Util.buildTimeCode(Util.parseMS(m.duration_ms)), + views: 0, + requestedBy: options.requestedBy, + playlist, + source: "spotify" + }); + + return data; + }) as Track[]; + } else { + playlist.tracks = spotifyPlaylist.tracks.items.map((m: any) => { + const data = new Track(this, { + title: m.track.name ?? "", + description: m.track.description ?? "", + author: m.track.artists[0]?.name ?? "Unknown Artist", + url: m.track.external_urls?.spotify ?? query, + thumbnail: m.track.album?.images[0]?.url ?? "https://www.scdn.co/i/_global/twitter_card-default.jpg", + duration: Util.buildTimeCode(Util.parseMS(m.track.duration_ms)), + views: 0, + requestedBy: options.requestedBy, + playlist, + source: "spotify" + }); + + return data; + }) as Track[]; + } + + return { playlist: true, tracks: playlist.tracks }; } default: - return []; + return { playlist: false, tracks: [] }; } } diff --git a/src/Structures/Playlist.ts b/src/Structures/Playlist.ts index 04a81c2..676f0ca 100644 --- a/src/Structures/Playlist.ts +++ b/src/Structures/Playlist.ts @@ -1,18 +1,56 @@ import { Player } from "../Player"; import { Track } from "./Track"; +import { PlaylistInitData, PlaylistJSON, TrackJSON, TrackSource } from "../types/types"; class Playlist { public readonly player: Player; public tracks: Track[]; + public title: string; + public description: string; + public thumbnail: string; + public type: "album" | "playlist"; + public source: TrackSource; + public author: { + name: string; + url: string; + }; + public id: string; + public url: string; - constructor(player: Player, tracks: Track[]) { + constructor(player: Player, data: PlaylistInitData) { this.player = player; - this.tracks = tracks ?? []; + this.tracks = data.tracks ?? []; + this.author = data.author; + this.description = data.description; + this.thumbnail = data.thumbnail; + this.type = data.type; + this.source = data.source; + this.id = data.id; + this.url = data.url; + this.title = data.title; } *[Symbol.iterator]() { yield* this.tracks; } + + toJSON(withTracks = true) { + const payload = { + id: this.id, + url: this.url, + title: this.title, + description: this.description, + thumbnail: this.thumbnail, + type: this.type, + source: this.source, + author: this.author, + tracks: [] as TrackJSON[] + }; + + if (withTracks) payload.tracks = this.tracks.map((m) => m.toJSON()); + + return payload as PlaylistJSON; + } } export { Playlist }; diff --git a/src/Structures/Track.ts b/src/Structures/Track.ts index f4aca3a..4ac2c0b 100644 --- a/src/Structures/Track.ts +++ b/src/Structures/Track.ts @@ -1,6 +1,7 @@ import { User, Util } from "discord.js"; import { Player } from "../Player"; -import { RawTrackData } from "../types/types"; +import { RawTrackData, TrackJSON } from "../types/types"; +import { Playlist } from "./Playlist"; import { Queue } from "./Queue"; class Track { @@ -13,7 +14,7 @@ class Track { public duration!: string; public views!: number; public requestedBy!: User; - public fromPlaylist!: boolean; + public playlist?: Playlist; public readonly raw!: RawTrackData; public readonly _trackID = Date.now(); @@ -102,7 +103,7 @@ class Track { this.duration = data.duration ?? ""; this.views = data.views ?? 0; this.requestedBy = data.requestedBy; - this.fromPlaylist = Boolean(data.fromPlaylist); + this.playlist = data.playlist; // raw Object.defineProperty(this, "raw", { get: () => data.raw ?? data, enumerable: false }); @@ -164,9 +165,9 @@ class Track { duration: this.duration, durationMS: this.durationMS, views: this.views, - requested: this.requestedBy.id, - fromPlaylist: this.fromPlaylist - }; + requestedBy: this.requestedBy.id, + playlist: this.playlist?.toJSON(false) ?? null + } as TrackJSON; } } diff --git a/src/types/types.ts b/src/types/types.ts index f97994e..76faee8 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -1,8 +1,9 @@ -import { User } from "discord.js"; +import { Snowflake, User } from "discord.js"; import { downloadOptions } from "ytdl-core"; import { Readable, Duplex } from "stream"; import { Queue } from "../Structures/Queue"; import Track from "../Structures/Track"; +import { Playlist } from "../Structures/Playlist"; export type FiltersName = keyof QueueFilters; @@ -48,7 +49,7 @@ export interface RawTrackData { duration: string; views: number; requestedBy: User; - fromPlaylist: boolean; + playlist?: Playlist; source?: TrackSource; engine?: any; live?: boolean; @@ -162,3 +163,46 @@ export enum QueueRepeatMode { TRACK = 1, QUEUE = 2 } + +export interface PlaylistInitData { + tracks: Track[]; + title: string; + description: string; + thumbnail: string; + type: "album" | "playlist"; + source: TrackSource; + author: { + name: string; + url: string; + }; + id: string; + url: string; +} + +export interface TrackJSON { + title: string; + description: string; + author: string; + url: string; + thumbnail: string; + duration: string; + durationMS: number; + views: number; + requestedBy: Snowflake; + playlist?: PlaylistJSON; +} + +export interface PlaylistJSON { + id: string; + url: string; + title: string; + description: string; + thumbnail: string; + type: "album" | "playlist"; + source: TrackSource; + author: { + name: string; + url: string; + }; + tracks: TrackJSON[]; +} From a43df93abe1f05e57885635ddfdaf9c83f0c5a99 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 13 Jun 2021 22:32:04 +0545 Subject: [PATCH 051/215] feat: voice states handling --- src/Player.ts | 35 ++++++++++++++++++++++++++++++++++- src/Structures/Queue.ts | 15 ++++++++++++--- src/types/types.ts | 24 ++++++++++++------------ src/utils/Util.ts | 5 +++++ 4 files changed, 63 insertions(+), 16 deletions(-) diff --git a/src/Player.ts b/src/Player.ts index c0a3fb0..c0765ac 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -1,4 +1,4 @@ -import { Client, Collection, Guild, Snowflake, User } from "discord.js"; +import { Client, Collection, Guild, Snowflake, User, VoiceState } from "discord.js"; import { TypedEmitter as EventEmitter } from "tiny-typed-emitter"; import { Queue } from "./Structures/Queue"; import { VoiceUtils } from "./VoiceInterface/VoiceUtils"; @@ -31,6 +31,39 @@ class DiscordPlayer extends EventEmitter { * @type {Discord.Client} */ this.client = client; + + this.client.on("voiceStateUpdate", this._handleVoiceState.bind(this)); + } + + private _handleVoiceState(oldState: VoiceState, newState: VoiceState): void { + const queue = this.getQueue(oldState.guild.id); + if (!queue) return; + + if (oldState.member.id === this.client.user.id && !newState.channelID) { + queue.destroy(); + return void this.emit("botDisconnect", queue); + } + + if (!queue.options.leaveOnEmpty || !queue.connection || !queue.connection.channel) return; + + if (!oldState.channelID || newState.channelID) { + const emptyTimeout = queue._cooldownsTimeout.get(`empty_${oldState.guild.id}`); + const channelEmpty = Util.isVoiceEmpty(queue.connection.channel); + + if (!channelEmpty && emptyTimeout) { + clearTimeout(emptyTimeout); + queue._cooldownsTimeout.delete(`empty_${oldState.guild.id}`); + } + } else { + if (!Util.isVoiceEmpty(queue.connection.channel)) return; + const timeout = setTimeout(() => { + if (!Util.isVoiceEmpty(queue.connection.channel)) return; + if (!this.queues.has(queue.guild.id)) return; + queue.destroy(); + this.emit("channelEmpty", queue); + }, queue.options.leaveOnEmptyCooldown || 0); + queue._cooldownsTimeout.set(`empty_${oldState.guild.id}`, timeout); + } } /** diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index d8d8be0..5b609a1 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -1,4 +1,4 @@ -import { Guild, StageChannel, VoiceChannel } from "discord.js"; +import { Collection, Guild, Snowflake, StageChannel, VoiceChannel } from "discord.js"; import { Player } from "../Player"; import { StreamDispatcher } from "../VoiceInterface/BasicStreamDispatcher"; import Track from "./Track"; @@ -18,6 +18,7 @@ class Queue { public playing = false; public metadata?: T = null; public repeatMode: QueueRepeatMode = 0; + public _cooldownsTimeout = new Collection(); constructor(player: Player, guild: Guild, options: PlayerOptions = {}) { this.player = player; @@ -48,6 +49,10 @@ class Queue { return this.connection.audioResource?.metadata ?? this.tracks[0]; } + nowPlaying() { + return this.current; + } + async connect(channel: StageChannel | VoiceChannel) { if (!["stage", "voice"].includes(channel?.type)) throw new TypeError(`Channel type must be voice or stage, got ${channel?.type}!`); const connection = await this.player.voiceUtils.connect(channel); @@ -125,8 +130,12 @@ class Queue { if (src && (this.playing || this.tracks.length) && !options.immediate) return this.addTrack(src); const track = options.filtersUpdate ? this.current : src ?? this.tracks.shift(); if (!track) return; - this.previousTracks = this.previousTracks.filter((x) => x._trackID !== track._trackID); - this.previousTracks.push(track); + + if (!options.filtersUpdate) { + this.previousTracks = this.previousTracks.filter((x) => x._trackID !== track._trackID); + this.previousTracks.push(track); + } + let stream; if (["youtube", "spotify"].includes(track.raw.source)) { if (track.raw.source === "spotify" && !track.raw.engine) { diff --git a/src/types/types.ts b/src/types/types.ts index 76faee8..5bc0821 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -119,21 +119,21 @@ export enum QueryType { } export interface PlayerEvents { - botDisconnect: () => any; - channelEmpty: () => any; - connectionCreate: () => any; + botDisconnect: (queue: Queue) => any; + channelEmpty: (queue: Queue) => any; + connectionCreate: (queue: Queue) => any; debug: (queue: Queue, message: string) => any; error: (queue: Queue, error: Error) => any; - musicStop: () => any; - noResults: () => any; - playlistAdd: () => any; - playlistParseEnd: () => any; - playlistParseStart: () => any; - queueCreate: () => any; + musicStop: (queue: Queue) => any; + noResults: (queue: Queue) => any; + playlistAdd: (queue: Queue) => any; + playlistParseEnd: (queue: Queue) => any; + playlistParseStart: (queue: Queue) => any; + queueCreate: (queue: Queue) => any; queueEnd: (queue: Queue) => any; - searchCancel: () => any; - searchInvalidResponse: () => any; - searchResults: () => any; + searchCancel: (queue: Queue) => any; + searchInvalidResponse: (queue: Queue) => any; + searchResults: (queue: Queue) => any; trackAdd: (queue: Queue, track: Track) => any; tracksAdd: (queue: Queue, track: Track[]) => any; trackStart: (queue: Queue, track: Track) => any; diff --git a/src/utils/Util.ts b/src/utils/Util.ts index 7411df1..8baff32 100644 --- a/src/utils/Util.ts +++ b/src/utils/Util.ts @@ -1,3 +1,4 @@ +import { StageChannel, VoiceChannel } from "discord.js"; import { TimeData } from "../types/types"; class Util { @@ -34,6 +35,10 @@ class Util { if (!Array.isArray(arr)) return; return arr[arr.length - 1]; } + + static isVoiceEmpty(channel: VoiceChannel | StageChannel) { + return channel.members.filter((member) => !member.user.bot).size === 0; + } } export { Util }; From 397d7c7f3021f800ed0cafef56b800aac91c7a12 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 13 Jun 2021 22:37:37 +0545 Subject: [PATCH 052/215] update example bot --- example/index.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/example/index.ts b/example/index.ts index 721ede0..80f5a42 100644 --- a/example/index.ts +++ b/example/index.ts @@ -23,6 +23,10 @@ client.on("warn", console.warn); const player = new Player(client); player.on("error", console.error); +player.on("debug", (queue, message) => { + console.log(`DEBUG :: ${queue.guild.name}`); + console.log(message); +}); player.on("trackStart", (queue, track) => { const guildQueue = queue as Queue; @@ -34,6 +38,16 @@ player.on("trackAdd", (queue, track) => { guildQueue.metadata.send(`🎶 | Track **${track.title}** queued!`); }); +player.on("botDisconnect", (queue) => { + const guildQueue = queue as Queue; + guildQueue.metadata.send("❌ | I was manually disconnected from the voice channel, clearing queue!"); +}); + +player.on("channelEmpty", (queue) => { + const guildQueue = queue as Queue; + guildQueue.metadata.send("❌ | Nobody is in the voice channel, leaving..."); +}); + client.on("message", async (message) => { if (message.author.bot || !message.guild) return; if (!client.application?.owner) await client.application?.fetch(); From cfb4aaac41d5bed992d9a0482620606d839ef7c1 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 13 Jun 2021 22:42:58 +0545 Subject: [PATCH 053/215] previous track cache --- src/Structures/Queue.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 5b609a1..e828a64 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -128,7 +128,7 @@ class Queue { async play(src?: Track, options: PlayOptions = {}): Promise { if (!this.connection || !this.connection.voiceConnection) throw new Error("Voice connection is not available, use .connect()!"); if (src && (this.playing || this.tracks.length) && !options.immediate) return this.addTrack(src); - const track = options.filtersUpdate ? this.current : src ?? this.tracks.shift(); + const track = options.filtersUpdate && !options.immediate ? this.current : src ?? this.tracks.shift(); if (!track) return; if (!options.filtersUpdate) { From 109577b56e599966fc87ef8c189b0268af166c2e Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 13 Jun 2021 23:55:43 +0545 Subject: [PATCH 054/215] chore(deps): bump dependencies --- package.json | 19 +- yarn.lock | 1218 +++++++++++++++++++++++++++----------------------- 2 files changed, 679 insertions(+), 558 deletions(-) diff --git a/package.json b/package.json index d31026c..a542a37 100644 --- a/package.json +++ b/package.json @@ -59,25 +59,24 @@ "ytdl-core": "^4.8.2" }, "devDependencies": { - "@babel/cli": "^7.13.16", - "@babel/core": "^7.13.16", - "@babel/preset-env": "^7.13.15", - "@babel/preset-typescript": "^7.13.0", + "@babel/cli": "^7.14.5", + "@babel/core": "^7.14.5", + "@babel/preset-env": "^7.14.5", + "@babel/preset-typescript": "^7.14.5", "@discord-player/extractor": "^3.0.0", - "@discordjs/opus": "^0.5.0", - "@types/node": "^14.14.41", - "@types/ws": "^7.4.1", + "@discordjs/opus": "^0.5.3", + "@types/node": "^15.12.2", + "@types/ws": "^7.4.4", "discord-api-types": "^0.18.1", "discord.js": "^13.0.0-dev.02693bc02f45980d8165820a103220f0027b96b7", "discord.js-docgen": "discordjs/docgen#ts-patch", "jsdoc-babel": "^0.5.0", - "prettier": "^2.2.1", + "prettier": "^2.3.1", "rimraf": "^3.0.2", "ts-node": "^10.0.0", "tslint": "^6.1.3", "tslint-config-prettier": "^1.18.0", - "typescipt": "^1.0.0", - "typescript": "^4.2.3" + "typescript": "^4.3.2" }, "optionalDependencies": { "sodium": "^3.0.2" diff --git a/yarn.lock b/yarn.lock index d712f46..7df2613 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@babel/cli@^7.13.16": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.14.3.tgz#9f6c8aee12e8660df879610f19a8010958b26a6f" - integrity sha512-zU4JLvwk32ay1lhhyGfqiRUSPoltVDjhYkA3aQq8+Yby9z30s/EsFw1EPOHxWG9YZo2pAGfgdRNeHZQAYU5m9A== +"@babel/cli@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.14.5.tgz#9551b194f02360729de6060785bbdcce52c69f0a" + integrity sha512-poegjhRvXHWO0EAsnYajwYZuqcz7gyfxwfaecUESxDujrqOivf3zrjFbub8IJkrqEaz3fvJWh001EzxBub54fg== dependencies: commander "^4.0.1" convert-source-map "^1.1.0" @@ -15,7 +15,7 @@ slash "^2.0.0" source-map "^0.5.0" optionalDependencies: - "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents" + "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.2" chokidar "^3.4.0" "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13": @@ -25,25 +25,37 @@ dependencies: "@babel/highlight" "^7.12.13" +"@babel/code-frame@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" + integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== + dependencies: + "@babel/highlight" "^7.14.5" + "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.4": version "7.14.4" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.4.tgz#45720fe0cecf3fd42019e1d12cc3d27fadc98d58" integrity sha512-i2wXrWQNkH6JplJQGn3Rd2I4Pij8GdHkXwHMxm+zV5YG/Jci+bCNrWZEWC4o+umiDkRrRs4dVzH3X4GP7vyjQQ== -"@babel/core@^7.13.16": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.3.tgz#5395e30405f0776067fbd9cf0884f15bfb770a38" - integrity sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg== +"@babel/compat-data@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.5.tgz#8ef4c18e58e801c5c95d3c1c0f2874a2680fadea" + integrity sha512-kixrYn4JwfAVPa0f2yfzc2AWti6WRRyO3XjWW5PJAvtE11qhSayrrcrEnee05KAtNaPC+EwehE8Qt1UedEVB8w== + +"@babel/core@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.5.tgz#d281f46a9905f07d1b3bf71ead54d9c7d89cb1e3" + integrity sha512-RN/AwP2DJmQTZSfiDaD+JQQ/J99KsIpOCfBE5pL+5jJSt7nI3nYGoAXZu+ffYSQ029NLs2DstZb+eR81uuARgg== dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.14.3" - "@babel/helper-compilation-targets" "^7.13.16" - "@babel/helper-module-transforms" "^7.14.2" - "@babel/helpers" "^7.14.0" - "@babel/parser" "^7.14.3" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.14.2" - "@babel/types" "^7.14.2" + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.14.5" + "@babel/helper-compilation-targets" "^7.14.5" + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helpers" "^7.14.5" + "@babel/parser" "^7.14.5" + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -51,7 +63,7 @@ semver "^6.3.0" source-map "^0.5.0" -"@babel/generator@^7.14.2", "@babel/generator@^7.14.3": +"@babel/generator@^7.14.2": version "7.14.3" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.3.tgz#0c2652d91f7bddab7cccc6ba8157e4f40dcedb91" integrity sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA== @@ -60,6 +72,15 @@ jsesc "^2.5.1" source-map "^0.5.0" +"@babel/generator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.5.tgz#848d7b9f031caca9d0cd0af01b063f226f52d785" + integrity sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA== + dependencies: + "@babel/types" "^7.14.5" + jsesc "^2.5.1" + source-map "^0.5.0" + "@babel/helper-annotate-as-pure@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" @@ -67,15 +88,22 @@ dependencies: "@babel/types" "^7.12.13" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz#6bc20361c88b0a74d05137a65cac8d3cbf6f61fc" - integrity sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA== +"@babel/helper-annotate-as-pure@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz#7bf478ec3b71726d56a8ca5775b046fc29879e61" + integrity sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA== dependencies: - "@babel/helper-explode-assignable-expression" "^7.12.13" - "@babel/types" "^7.12.13" + "@babel/types" "^7.14.5" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.16", "@babel/helper-compilation-targets@^7.14.4": +"@babel/helper-builder-binary-assignment-operator-visitor@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz#b939b43f8c37765443a19ae74ad8b15978e0a191" + integrity sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helper-compilation-targets@^7.13.0": version "7.14.4" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.4.tgz#33ebd0ffc34248051ee2089350a929ab02f2a516" integrity sha512-JgdzOYZ/qGaKTVkn5qEDV/SXAh8KcyUVkCoSWGN8T3bwrgd6m+/dJa2kVGi6RJYJgEYPBdZ84BZp9dUjNWkBaA== @@ -85,17 +113,27 @@ browserslist "^4.16.6" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.13.0", "@babel/helper-create-class-features-plugin@^7.14.0", "@babel/helper-create-class-features-plugin@^7.14.3", "@babel/helper-create-class-features-plugin@^7.14.4": - version "7.14.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.4.tgz#abf888d836a441abee783c75229279748705dc42" - integrity sha512-idr3pthFlDCpV+p/rMgGLGYIVtazeatrSOQk8YzO2pAepIjQhCN3myeihVg58ax2bbbGK9PUE1reFi7axOYIOw== +"@babel/helper-compilation-targets@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz#7a99c5d0967911e972fe2c3411f7d5b498498ecf" + integrity sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw== dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-function-name" "^7.14.2" - "@babel/helper-member-expression-to-functions" "^7.13.12" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/helper-replace-supers" "^7.14.4" - "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/compat-data" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + browserslist "^4.16.6" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.5.tgz#8842ec495516dd1ed8f6c572be92ba78b1e9beef" + integrity sha512-Uq9z2e7ZtcnDMirRqAGLRaLwJn+Lrh388v5ETrR3pALJnElVh2zqQmdbz4W2RUJYohAPh2mtyPUgyMHMzXMncQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-member-expression-to-functions" "^7.14.5" + "@babel/helper-optimise-call-expression" "^7.14.5" + "@babel/helper-replace-supers" "^7.14.5" + "@babel/helper-split-export-declaration" "^7.14.5" "@babel/helper-create-regexp-features-plugin@^7.12.13": version "7.14.3" @@ -105,6 +143,14 @@ "@babel/helper-annotate-as-pure" "^7.12.13" regexpu-core "^4.7.1" +"@babel/helper-create-regexp-features-plugin@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz#c7d5ac5e9cf621c26057722fb7a8a4c5889358c4" + integrity sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + regexpu-core "^4.7.1" + "@babel/helper-define-polyfill-provider@^0.2.2": version "0.2.3" resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz#0525edec5094653a282688d34d846e4c75e9c0b6" @@ -119,14 +165,14 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-explode-assignable-expression@^7.12.13": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz#17b5c59ff473d9f956f40ef570cf3a76ca12657f" - integrity sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA== +"@babel/helper-explode-assignable-expression@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz#8aa72e708205c7bb643e45c73b4386cdf2a1f645" + integrity sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ== dependencies: - "@babel/types" "^7.13.0" + "@babel/types" "^7.14.5" -"@babel/helper-function-name@^7.12.13", "@babel/helper-function-name@^7.14.2": +"@babel/helper-function-name@^7.14.2": version "7.14.2" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz#397688b590760b6ef7725b5f0860c82427ebaac2" integrity sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ== @@ -135,6 +181,15 @@ "@babel/template" "^7.12.13" "@babel/types" "^7.14.2" +"@babel/helper-function-name@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz#89e2c474972f15d8e233b52ee8c480e2cfcd50c4" + integrity sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ== + dependencies: + "@babel/helper-get-function-arity" "^7.14.5" + "@babel/template" "^7.14.5" + "@babel/types" "^7.14.5" + "@babel/helper-get-function-arity@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" @@ -142,86 +197,104 @@ dependencies: "@babel/types" "^7.12.13" -"@babel/helper-hoist-variables@^7.13.0": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.16.tgz#1b1651249e94b51f8f0d33439843e33e39775b30" - integrity sha512-1eMtTrXtrwscjcAeO4BVK+vvkxaLJSPFz1w1KLawz6HLNi9bPFGBNwwDyVfiu1Tv/vRRFYfoGaKhmAQPGPn5Wg== +"@babel/helper-get-function-arity@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz#25fbfa579b0937eee1f3b805ece4ce398c431815" + integrity sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg== dependencies: - "@babel/traverse" "^7.13.15" - "@babel/types" "^7.13.16" + "@babel/types" "^7.14.5" -"@babel/helper-member-expression-to-functions@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72" - integrity sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw== +"@babel/helper-hoist-variables@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz#e0dd27c33a78e577d7c8884916a3e7ef1f7c7f8d" + integrity sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ== dependencies: - "@babel/types" "^7.13.12" + "@babel/types" "^7.14.5" -"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.13.12": +"@babel/helper-member-expression-to-functions@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.5.tgz#d5c70e4ad13b402c95156c7a53568f504e2fb7b8" + integrity sha512-UxUeEYPrqH1Q/k0yRku1JE7dyfyehNwT6SVkMHvYvPDv4+uu627VXBckVj891BO8ruKBkiDoGnZf4qPDD8abDQ== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-module-imports@^7.12.13": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977" integrity sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA== dependencies: "@babel/types" "^7.13.12" -"@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.14.0", "@babel/helper-module-transforms@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz#ac1cc30ee47b945e3e0c4db12fa0c5389509dfe5" - integrity sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA== +"@babel/helper-module-imports@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz#6d1a44df6a38c957aa7c312da076429f11b422f3" + integrity sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ== dependencies: - "@babel/helper-module-imports" "^7.13.12" - "@babel/helper-replace-supers" "^7.13.12" - "@babel/helper-simple-access" "^7.13.12" - "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/helper-validator-identifier" "^7.14.0" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.14.2" - "@babel/types" "^7.14.2" + "@babel/types" "^7.14.5" -"@babel/helper-optimise-call-expression@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" - integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA== +"@babel/helper-module-transforms@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz#7de42f10d789b423eb902ebd24031ca77cb1e10e" + integrity sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA== dependencies: - "@babel/types" "^7.12.13" + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-replace-supers" "^7.14.5" + "@babel/helper-simple-access" "^7.14.5" + "@babel/helper-split-export-declaration" "^7.14.5" + "@babel/helper-validator-identifier" "^7.14.5" + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helper-optimise-call-expression@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz#f27395a8619e0665b3f0364cddb41c25d71b499c" + integrity sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA== + dependencies: + "@babel/types" "^7.14.5" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== -"@babel/helper-remap-async-to-generator@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz#376a760d9f7b4b2077a9dd05aa9c3927cadb2209" - integrity sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-wrap-function" "^7.13.0" - "@babel/types" "^7.13.0" +"@babel/helper-plugin-utils@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" + integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== -"@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.12", "@babel/helper-replace-supers@^7.14.4": - version "7.14.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.4.tgz#b2ab16875deecfff3ddfcd539bc315f72998d836" - integrity sha512-zZ7uHCWlxfEAAOVDYQpEf/uyi1dmeC7fX4nCf2iz9drnCwi1zvwXL3HwWWNXUQEJ1k23yVn3VbddiI9iJEXaTQ== +"@babel/helper-remap-async-to-generator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz#51439c913612958f54a987a4ffc9ee587a2045d6" + integrity sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A== dependencies: - "@babel/helper-member-expression-to-functions" "^7.13.12" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/traverse" "^7.14.2" - "@babel/types" "^7.14.4" + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-wrap-function" "^7.14.5" + "@babel/types" "^7.14.5" -"@babel/helper-simple-access@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6" - integrity sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA== +"@babel/helper-replace-supers@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz#0ecc0b03c41cd567b4024ea016134c28414abb94" + integrity sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow== dependencies: - "@babel/types" "^7.13.12" + "@babel/helper-member-expression-to-functions" "^7.14.5" + "@babel/helper-optimise-call-expression" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" -"@babel/helper-skip-transparent-expression-wrappers@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" - integrity sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA== +"@babel/helper-simple-access@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz#66ea85cf53ba0b4e588ba77fc813f53abcaa41c4" + integrity sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw== dependencies: - "@babel/types" "^7.12.1" + "@babel/types" "^7.14.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz#96f486ac050ca9f44b009fbe5b7d394cab3a0ee4" + integrity sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ== + dependencies: + "@babel/types" "^7.14.5" "@babel/helper-split-export-declaration@^7.12.13": version "7.12.13" @@ -230,34 +303,51 @@ dependencies: "@babel/types" "^7.12.13" -"@babel/helper-validator-identifier@^7.12.11", "@babel/helper-validator-identifier@^7.14.0": +"@babel/helper-split-export-declaration@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz#22b23a54ef51c2b7605d851930c1976dd0bc693a" + integrity sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA== + dependencies: + "@babel/types" "^7.14.5" + +"@babel/helper-validator-identifier@^7.14.0": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== +"@babel/helper-validator-identifier@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz#d0f0e277c512e0c938277faa85a3968c9a44c0e8" + integrity sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg== + "@babel/helper-validator-option@^7.12.17": version "7.12.17" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== -"@babel/helper-wrap-function@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz#bdb5c66fda8526ec235ab894ad53a1235c79fcc4" - integrity sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA== - dependencies: - "@babel/helper-function-name" "^7.12.13" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" +"@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== -"@babel/helpers@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.0.tgz#ea9b6be9478a13d6f961dbb5f36bf75e2f3b8f62" - integrity sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg== +"@babel/helper-wrap-function@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz#5919d115bf0fe328b8a5d63bcb610f51601f2bff" + integrity sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ== dependencies: - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.14.0" - "@babel/types" "^7.14.0" + "@babel/helper-function-name" "^7.14.5" + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/helpers@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.5.tgz#4870f8d9a6fdbbd65e5674a3558b4ff7fef0d9b2" + integrity sha512-xtcWOuN9VL6nApgVHtq3PPcQv5qFBJzoSZzJ/2c0QK/IP/gxVcoWSNQwFEGvmbQsuS9rhYqjILDGGXcTkA705Q== + dependencies: + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" "@babel/highlight@^7.12.13": version "7.14.0" @@ -268,141 +358,163 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.12.13", "@babel/parser@^7.14.2", "@babel/parser@^7.14.3", "@babel/parser@^7.9.4": +"@babel/highlight@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" + integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.12.13", "@babel/parser@^7.14.2", "@babel/parser@^7.9.4": version "7.14.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.4.tgz#a5c560d6db6cd8e6ed342368dea8039232cbab18" integrity sha512-ArliyUsWDUqEGfWcmzpGUzNfLxTdTp6WU4IuP6QFSp9gGfWS6boxFCkJSJ/L4+RG8z/FnIU3WxCk6hPL9SSWeA== -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz#a3484d84d0b549f3fc916b99ee4783f26fabad2a" - integrity sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ== - dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" - "@babel/plugin-proposal-optional-chaining" "^7.13.12" +"@babel/parser@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.5.tgz#4cd2f346261061b2518873ffecdf1612cb032829" + integrity sha512-TM8C+xtH/9n1qzX+JNHi7AN2zHMTiPUtspO0ZdHflW8KaskkALhMmuMHb4bCmNdv9VAPzJX3/bXqkVLnAvsPfg== -"@babel/plugin-proposal-async-generator-functions@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.2.tgz#3a2085abbf5d5f962d480dbc81347385ed62eb1e" - integrity sha512-b1AM4F6fwck4N8ItZ/AtC4FP/cqZqmKRQ4FaTDutwSYyjuhtvsGEMLK4N/ztV/ImP40BjIDyMgBQAeAMsQYVFQ== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz#4b467302e1548ed3b1be43beae2cc9cf45e0bb7e" + integrity sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-remap-async-to-generator" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" + "@babel/plugin-proposal-optional-chaining" "^7.14.5" + +"@babel/plugin-proposal-async-generator-functions@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.5.tgz#4024990e3dd74181f4f426ea657769ff49a2df39" + integrity sha512-tbD/CG3l43FIXxmu4a7RBe4zH7MLJ+S/lFowPFO7HetS2hyOZ/0nnnznegDuzFzfkyQYTxqdTH/hKmuBngaDAA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.14.5" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-class-properties@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz#146376000b94efd001e57a40a88a525afaab9f37" - integrity sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg== +"@babel/plugin-proposal-class-properties@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz#40d1ee140c5b1e31a350f4f5eed945096559b42e" + integrity sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-proposal-class-static-block@^7.14.3": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.3.tgz#5a527e2cae4a4753119c3a3e7f64ecae8ccf1360" - integrity sha512-HEjzp5q+lWSjAgJtSluFDrGGosmwTgKwCXdDQZvhKsRlwv3YdkUEqxNrrjesJd+B9E9zvr1PVPVBvhYZ9msjvQ== +"@babel/plugin-proposal-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz#158e9e10d449c3849ef3ecde94a03d9f1841b681" + integrity sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.3" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/plugin-syntax-class-static-block" "^7.12.13" + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-proposal-dynamic-import@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.2.tgz#01ebabd7c381cff231fa43e302939a9de5be9d9f" - integrity sha512-oxVQZIWFh91vuNEMKltqNsKLFWkOIyJc95k2Gv9lWVyDfPUQGSSlbDEgWuJUU1afGE9WwlzpucMZ3yDRHIItkA== +"@babel/plugin-proposal-dynamic-import@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz#0c6617df461c0c1f8fff3b47cd59772360101d2c" + integrity sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-proposal-export-namespace-from@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.2.tgz#62542f94aa9ce8f6dba79eec698af22112253791" - integrity sha512-sRxW3z3Zp3pFfLAgVEvzTFutTXax837oOatUIvSG9o5gRj9mKwm3br1Se5f4QalTQs9x4AzlA/HrCWbQIHASUQ== +"@babel/plugin-proposal-export-namespace-from@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz#dbad244310ce6ccd083072167d8cea83a52faf76" + integrity sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.2.tgz#830b4e2426a782e8b2878fbfe2cba85b70cbf98c" - integrity sha512-w2DtsfXBBJddJacXMBhElGEYqCZQqN99Se1qeYn8DVLB33owlrlLftIbMzn5nz1OITfDVknXF433tBrLEAOEjA== +"@babel/plugin-proposal-json-strings@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz#38de60db362e83a3d8c944ac858ddf9f0c2239eb" + integrity sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.2.tgz#222348c080a1678e0e74ea63fe76f275882d1fd7" - integrity sha512-1JAZtUrqYyGsS7IDmFeaem+/LJqujfLZ2weLR9ugB0ufUPjzf8cguyVT1g5im7f7RXxuLq1xUxEzvm68uYRtGg== +"@babel/plugin-proposal-logical-assignment-operators@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz#6e6229c2a99b02ab2915f82571e0cc646a40c738" + integrity sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.2.tgz#425b11dc62fc26939a2ab42cbba680bdf5734546" - integrity sha512-ebR0zU9OvI2N4qiAC38KIAK75KItpIPTpAtd2r4OZmMFeKbKJpUFLYP2EuDut82+BmYi8sz42B+TfTptJ9iG5Q== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz#ee38589ce00e2cc59b299ec3ea406fcd3a0fdaf6" + integrity sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.2.tgz#82b4cc06571143faf50626104b335dd71baa4f9e" - integrity sha512-DcTQY9syxu9BpU3Uo94fjCB3LN9/hgPS8oUL7KrSW3bA2ePrKZZPJcc5y0hoJAM9dft3pGfErtEUvxXQcfLxUg== +"@babel/plugin-proposal-numeric-separator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz#83631bf33d9a51df184c2102a069ac0c58c05f18" + integrity sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.14.4": - version "7.14.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.4.tgz#0e2b4de419915dc0b409378e829412e2031777c4" - integrity sha512-AYosOWBlyyXEagrPRfLJ1enStufsr7D1+ddpj8OLi9k7B6+NdZ0t/9V7Fh+wJ4g2Jol8z2JkgczYqtWrZd4vbA== +"@babel/plugin-proposal-object-rest-spread@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.5.tgz#e581d5ccdfa187ea6ed73f56c6a21c1580b90fbf" + integrity sha512-VzMyY6PWNPPT3pxc5hi9LloKNr4SSrVCg7Yr6aZpW4Ym07r7KqSU/QXYwjXLVxqwSv0t/XSXkFoKBPUkZ8vb2A== dependencies: - "@babel/compat-data" "^7.14.4" - "@babel/helper-compilation-targets" "^7.14.4" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/compat-data" "^7.14.5" + "@babel/helper-compilation-targets" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.14.2" + "@babel/plugin-transform-parameters" "^7.14.5" -"@babel/plugin-proposal-optional-catch-binding@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.2.tgz#150d4e58e525b16a9a1431bd5326c4eed870d717" - integrity sha512-XtkJsmJtBaUbOxZsNk0Fvrv8eiqgneug0A6aqLFZ4TSkar2L5dSXWcnUKHgmjJt49pyB/6ZHvkr3dPgl9MOWRQ== +"@babel/plugin-proposal-optional-catch-binding@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz#939dd6eddeff3a67fdf7b3f044b5347262598c3c" + integrity sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.13.12", "@babel/plugin-proposal-optional-chaining@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.2.tgz#df8171a8b9c43ebf4c1dabe6311b432d83e1b34e" - integrity sha512-qQByMRPwMZJainfig10BoaDldx/+VDtNcrA7qdNaEOAj6VXud+gfrkA8j4CRAU5HjnWREXqIpSpH30qZX1xivA== +"@babel/plugin-proposal-optional-chaining@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz#fa83651e60a360e3f13797eef00b8d519695b603" + integrity sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-private-methods@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz#04bd4c6d40f6e6bbfa2f57e2d8094bad900ef787" - integrity sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q== +"@babel/plugin-proposal-private-methods@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz#37446495996b2945f30f5be5b60d5e2aa4f5792d" + integrity sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g== dependencies: - "@babel/helper-create-class-features-plugin" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-proposal-private-property-in-object@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.0.tgz#b1a1f2030586b9d3489cc26179d2eb5883277636" - integrity sha512-59ANdmEwwRUkLjB7CRtwJxxwtjESw+X2IePItA+RGQh+oy5RmpCh/EvVVvh5XQc3yxsm5gtv0+i9oBZhaDNVTg== +"@babel/plugin-proposal-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz#9f65a4d0493a940b4c01f8aa9d3f1894a587f636" + integrity sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q== dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-create-class-features-plugin" "^7.14.0" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/plugin-syntax-private-property-in-object" "^7.14.0" + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": +"@babel/plugin-proposal-unicode-property-regex@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz#0f95ee0e757a5d647f378daa0eca7e93faa8bbe8" + integrity sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba" integrity sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg== @@ -424,12 +536,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-class-static-block@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.12.13.tgz#8e3d674b0613e67975ceac2776c97b60cafc5c9c" - integrity sha512-ZmKQ0ZXR0nYpHZIIuj9zE7oIqCx2hw9TKi+lIo73NNrMPAZGHfS92/VRV0ZmPj6H2ffBgyFHXvJ5NYsNeEaP2A== +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" @@ -494,85 +606,93 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-private-property-in-object@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.0.tgz#762a4babec61176fec6c88480dec40372b140c0b" - integrity sha512-bda3xF8wGl5/5btF794utNOL0Jw+9jE5C1sLZcoK7c4uonE/y3iQiyG+KbkF3WBV/paX58VCpjhxLPkdj5Fe4w== +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-top-level-await@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178" - integrity sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ== +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz#9dff111ca64154cef0f4dc52cf843d9f12ce4474" - integrity sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w== +"@babel/plugin-syntax-typescript@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz#b82c6ce471b165b5ce420cf92914d6fb46225716" + integrity sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-arrow-functions@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz#10a59bebad52d637a027afa692e8d5ceff5e3dae" - integrity sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg== +"@babel/plugin-transform-arrow-functions@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz#f7187d9588a768dd080bf4c9ffe117ea62f7862a" + integrity sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-async-to-generator@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz#8e112bf6771b82bf1e974e5e26806c5c99aa516f" - integrity sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg== +"@babel/plugin-transform-async-to-generator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz#72c789084d8f2094acb945633943ef8443d39e67" + integrity sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA== dependencies: - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-remap-async-to-generator" "^7.13.0" + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.14.5" -"@babel/plugin-transform-block-scoped-functions@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4" - integrity sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg== +"@babel/plugin-transform-block-scoped-functions@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz#e48641d999d4bc157a67ef336aeb54bc44fd3ad4" + integrity sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-block-scoping@^7.14.4": - version "7.14.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.4.tgz#caf140b0b2e2462c509553d140e6d0abefb61ed8" - integrity sha512-5KdpkGxsZlTk+fPleDtGKsA+pon28+ptYmMO8GBSa5fHERCJWAzj50uAfCKBqq42HO+Zot6JF1x37CRprwmN4g== +"@babel/plugin-transform-block-scoping@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz#8cc63e61e50f42e078e6f09be775a75f23ef9939" + integrity sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-classes@^7.14.4": - version "7.14.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.4.tgz#a83c15503fc71a0f99e876fdce7dadbc6575ec3a" - integrity sha512-p73t31SIj6y94RDVX57rafVjttNr8MvKEgs5YFatNB/xC68zM3pyosuOEcQmYsYlyQaGY9R7rAULVRcat5FKJQ== +"@babel/plugin-transform-classes@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz#0e98e82097b38550b03b483f9b51a78de0acb2cf" + integrity sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA== dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-function-name" "^7.14.2" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-replace-supers" "^7.14.4" - "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-optimise-call-expression" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.14.5" + "@babel/helper-split-export-declaration" "^7.14.5" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz#845c6e8b9bb55376b1fa0b92ef0bdc8ea06644ed" - integrity sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg== +"@babel/plugin-transform-computed-properties@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz#1b9d78987420d11223d41195461cc43b974b204f" + integrity sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-destructuring@^7.14.4": - version "7.14.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.4.tgz#acbec502e9951f30f4441eaca1d2f29efade59ed" - integrity sha512-JyywKreTCGTUsL1OKu1A3ms/R1sTP0WxbpXlALeGzF53eB3bxtNkYdMj9SDgK7g6ImPy76J5oYYKoTtQImlhQA== +"@babel/plugin-transform-destructuring@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.5.tgz#d32ad19ff1a6da1e861dc62720d80d9776e3bf35" + integrity sha512-wU9tYisEbRMxqDezKUqC9GleLycCRoUsai9ddlsq54r8QRLaeEhc+d+9DqCG+kV9W2GgQjTZESPTpn5bAFMDww== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.4.4": +"@babel/plugin-transform-dotall-regex@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz#2f6bf76e46bdf8043b4e7e16cf24532629ba0c7a" + integrity sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-dotall-regex@^7.4.4": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz#3f1601cc29905bfcb67f53910f197aeafebb25ad" integrity sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ== @@ -580,226 +700,226 @@ "@babel/helper-create-regexp-features-plugin" "^7.12.13" "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-duplicate-keys@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz#6f06b87a8b803fd928e54b81c258f0a0033904de" - integrity sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ== +"@babel/plugin-transform-duplicate-keys@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz#365a4844881bdf1501e3a9f0270e7f0f91177954" + integrity sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-exponentiation-operator@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz#4d52390b9a273e651e4aba6aee49ef40e80cd0a1" - integrity sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA== +"@babel/plugin-transform-exponentiation-operator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz#5154b8dd6a3dfe6d90923d61724bd3deeb90b493" + integrity sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-for-of@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz#c799f881a8091ac26b54867a845c3e97d2696062" - integrity sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg== +"@babel/plugin-transform-for-of@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz#dae384613de8f77c196a8869cbf602a44f7fc0eb" + integrity sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-function-name@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz#bb024452f9aaed861d374c8e7a24252ce3a50051" - integrity sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ== +"@babel/plugin-transform-function-name@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz#e81c65ecb900746d7f31802f6bed1f52d915d6f2" + integrity sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ== dependencies: - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-literals@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz#2ca45bafe4a820197cf315794a4d26560fe4bdb9" - integrity sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ== +"@babel/plugin-transform-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz#41d06c7ff5d4d09e3cf4587bd3ecf3930c730f78" + integrity sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-member-expression-literals@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz#5ffa66cd59b9e191314c9f1f803b938e8c081e40" - integrity sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg== +"@babel/plugin-transform-member-expression-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz#b39cd5212a2bf235a617d320ec2b48bcc091b8a7" + integrity sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-modules-amd@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.2.tgz#6622806fe1a7c07a1388444222ef9535f2ca17b0" - integrity sha512-hPC6XBswt8P3G2D1tSV2HzdKvkqOpmbyoy+g73JG0qlF/qx2y3KaMmXb1fLrpmWGLZYA0ojCvaHdzFWjlmV+Pw== +"@babel/plugin-transform-modules-amd@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz#4fd9ce7e3411cb8b83848480b7041d83004858f7" + integrity sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g== dependencies: - "@babel/helper-module-transforms" "^7.14.2" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.0.tgz#52bc199cb581e0992edba0f0f80356467587f161" - integrity sha512-EX4QePlsTaRZQmw9BsoPeyh5OCtRGIhwfLquhxGp5e32w+dyL8htOcDwamlitmNFK6xBZYlygjdye9dbd9rUlQ== +"@babel/plugin-transform-modules-commonjs@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz#7aaee0ea98283de94da98b28f8c35701429dad97" + integrity sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A== dependencies: - "@babel/helper-module-transforms" "^7.14.0" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-simple-access" "^7.13.12" + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-simple-access" "^7.14.5" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz#6d066ee2bff3c7b3d60bf28dec169ad993831ae3" - integrity sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A== +"@babel/plugin-transform-modules-systemjs@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz#c75342ef8b30dcde4295d3401aae24e65638ed29" + integrity sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA== dependencies: - "@babel/helper-hoist-variables" "^7.13.0" - "@babel/helper-module-transforms" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-validator-identifier" "^7.12.11" + "@babel/helper-hoist-variables" "^7.14.5" + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-identifier" "^7.14.5" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.0.tgz#2f8179d1bbc9263665ce4a65f305526b2ea8ac34" - integrity sha512-nPZdnWtXXeY7I87UZr9VlsWme3Y0cfFFE41Wbxz4bbaexAjNMInXPFUpRRUJ8NoMm0Cw+zxbqjdPmLhcjfazMw== +"@babel/plugin-transform-modules-umd@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz#fb662dfee697cce274a7cda525190a79096aa6e0" + integrity sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA== dependencies: - "@babel/helper-module-transforms" "^7.14.0" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-named-capturing-groups-regex@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz#2213725a5f5bbbe364b50c3ba5998c9599c5c9d9" - integrity sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA== +"@babel/plugin-transform-named-capturing-groups-regex@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.5.tgz#d537e8ee083ee6f6aa4f4eef9d2081d555746e4c" + integrity sha512-+Xe5+6MWFo311U8SchgeX5c1+lJM+eZDBZgD+tvXu9VVQPXwwVzeManMMjYX6xw2HczngfOSZjoFYKwdeB/Jvw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-create-regexp-features-plugin" "^7.14.5" -"@babel/plugin-transform-new-target@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz#e22d8c3af24b150dd528cbd6e685e799bf1c351c" - integrity sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ== +"@babel/plugin-transform-new-target@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz#31bdae8b925dc84076ebfcd2a9940143aed7dbf8" + integrity sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-object-super@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz#b4416a2d63b8f7be314f3d349bd55a9c1b5171f7" - integrity sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ== +"@babel/plugin-transform-object-super@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz#d0b5faeac9e98597a161a9cf78c527ed934cdc45" + integrity sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-replace-supers" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.14.5" -"@babel/plugin-transform-parameters@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.2.tgz#e4290f72e0e9e831000d066427c4667098decc31" - integrity sha512-NxoVmA3APNCC1JdMXkdYXuQS+EMdqy0vIwyDHeKHiJKRxmp1qGSdb0JLEIoPRhkx6H/8Qi3RJ3uqOCYw8giy9A== +"@babel/plugin-transform-parameters@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz#49662e86a1f3ddccac6363a7dfb1ff0a158afeb3" + integrity sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-property-literals@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz#4e6a9e37864d8f1b3bc0e2dce7bf8857db8b1a81" - integrity sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A== +"@babel/plugin-transform-property-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz#0ddbaa1f83db3606f1cdf4846fa1dfb473458b34" + integrity sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-regenerator@^7.13.15": - version "7.13.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz#e5eb28945bf8b6563e7f818945f966a8d2997f39" - integrity sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ== +"@babel/plugin-transform-regenerator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz#9676fd5707ed28f522727c5b3c0aa8544440b04f" + integrity sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg== dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-reserved-words@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz#7d9988d4f06e0fe697ea1d9803188aa18b472695" - integrity sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg== +"@babel/plugin-transform-reserved-words@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz#c44589b661cfdbef8d4300dcc7469dffa92f8304" + integrity sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-shorthand-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz#db755732b70c539d504c6390d9ce90fe64aff7ad" - integrity sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw== +"@babel/plugin-transform-shorthand-properties@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz#97f13855f1409338d8cadcbaca670ad79e091a58" + integrity sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-spread@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz#84887710e273c1815ace7ae459f6f42a5d31d5fd" - integrity sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg== +"@babel/plugin-transform-spread@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.5.tgz#bd269fb4119754d2ce7f4cc39a96b4f71baae356" + integrity sha512-/3iqoQdiWergnShZYl0xACb4ADeYCJ7X/RgmwtXshn6cIvautRPAFzhd58frQlokLO6Jb4/3JXvmm6WNTPtiTw== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" -"@babel/plugin-transform-sticky-regex@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz#760ffd936face73f860ae646fb86ee82f3d06d1f" - integrity sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg== +"@babel/plugin-transform-sticky-regex@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz#5b617542675e8b7761294381f3c28c633f40aeb9" + integrity sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-template-literals@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz#a36049127977ad94438dee7443598d1cefdf409d" - integrity sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw== +"@babel/plugin-transform-template-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz#a5f2bc233937d8453885dc736bdd8d9ffabf3d93" + integrity sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-typeof-symbol@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz#785dd67a1f2ea579d9c2be722de8c84cb85f5a7f" - integrity sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ== +"@babel/plugin-transform-typeof-symbol@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz#39af2739e989a2bd291bf6b53f16981423d457d4" + integrity sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-typescript@^7.13.0": - version "7.14.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.4.tgz#1c48829fa6d5f2de646060cd08abb6cda4b521a7" - integrity sha512-WYdcGNEO7mCCZ2XzRlxwGj3PgeAr50ifkofOUC/+IN/GzKLB+biDPVBUAQN2C/dVZTvEXCp80kfQ1FFZPrwykQ== +"@babel/plugin-transform-typescript@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.5.tgz#5b41b59072f765bd1ec1d0b694e08c7df0f6f8a0" + integrity sha512-cFD5PKp4b8/KkwQ7h71FdPXFvz1RgwTFF9akRZwFldb9G0AHf7CgoPx96c4Q/ZVjh6V81tqQwW5YiHws16OzPg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.4" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/plugin-syntax-typescript" "^7.12.13" + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-typescript" "^7.14.5" -"@babel/plugin-transform-unicode-escapes@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz#840ced3b816d3b5127dd1d12dcedc5dead1a5e74" - integrity sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw== +"@babel/plugin-transform-unicode-escapes@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz#9d4bd2a681e3c5d7acf4f57fa9e51175d91d0c6b" + integrity sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-unicode-regex@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz#b52521685804e155b1202e83fc188d34bb70f5ac" - integrity sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA== +"@babel/plugin-transform-unicode-regex@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz#4cd09b6c8425dd81255c7ceb3fb1836e7414382e" + integrity sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/preset-env@^7.13.15": - version "7.14.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.4.tgz#73fc3228c59727e5e974319156f304f0d6685a2d" - integrity sha512-GwMMsuAnDtULyOtuxHhzzuSRxFeP0aR/LNzrHRzP8y6AgDNgqnrfCCBm/1cRdTU75tRs28Eh76poHLcg9VF0LA== +"@babel/preset-env@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.5.tgz#c0c84e763661fd0e74292c3d511cb33b0c668997" + integrity sha512-ci6TsS0bjrdPpWGnQ+m4f+JSSzDKlckqKIJJt9UZ/+g7Zz9k0N8lYU8IeLg/01o2h8LyNZDMLGgRLDTxpudLsA== dependencies: - "@babel/compat-data" "^7.14.4" - "@babel/helper-compilation-targets" "^7.14.4" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-validator-option" "^7.12.17" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.13.12" - "@babel/plugin-proposal-async-generator-functions" "^7.14.2" - "@babel/plugin-proposal-class-properties" "^7.13.0" - "@babel/plugin-proposal-class-static-block" "^7.14.3" - "@babel/plugin-proposal-dynamic-import" "^7.14.2" - "@babel/plugin-proposal-export-namespace-from" "^7.14.2" - "@babel/plugin-proposal-json-strings" "^7.14.2" - "@babel/plugin-proposal-logical-assignment-operators" "^7.14.2" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.2" - "@babel/plugin-proposal-numeric-separator" "^7.14.2" - "@babel/plugin-proposal-object-rest-spread" "^7.14.4" - "@babel/plugin-proposal-optional-catch-binding" "^7.14.2" - "@babel/plugin-proposal-optional-chaining" "^7.14.2" - "@babel/plugin-proposal-private-methods" "^7.13.0" - "@babel/plugin-proposal-private-property-in-object" "^7.14.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.12.13" + "@babel/compat-data" "^7.14.5" + "@babel/helper-compilation-targets" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.14.5" + "@babel/plugin-proposal-async-generator-functions" "^7.14.5" + "@babel/plugin-proposal-class-properties" "^7.14.5" + "@babel/plugin-proposal-class-static-block" "^7.14.5" + "@babel/plugin-proposal-dynamic-import" "^7.14.5" + "@babel/plugin-proposal-export-namespace-from" "^7.14.5" + "@babel/plugin-proposal-json-strings" "^7.14.5" + "@babel/plugin-proposal-logical-assignment-operators" "^7.14.5" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5" + "@babel/plugin-proposal-numeric-separator" "^7.14.5" + "@babel/plugin-proposal-object-rest-spread" "^7.14.5" + "@babel/plugin-proposal-optional-catch-binding" "^7.14.5" + "@babel/plugin-proposal-optional-chaining" "^7.14.5" + "@babel/plugin-proposal-private-methods" "^7.14.5" + "@babel/plugin-proposal-private-property-in-object" "^7.14.5" + "@babel/plugin-proposal-unicode-property-regex" "^7.14.5" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-syntax-json-strings" "^7.8.3" @@ -809,46 +929,46 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.0" - "@babel/plugin-syntax-top-level-await" "^7.12.13" - "@babel/plugin-transform-arrow-functions" "^7.13.0" - "@babel/plugin-transform-async-to-generator" "^7.13.0" - "@babel/plugin-transform-block-scoped-functions" "^7.12.13" - "@babel/plugin-transform-block-scoping" "^7.14.4" - "@babel/plugin-transform-classes" "^7.14.4" - "@babel/plugin-transform-computed-properties" "^7.13.0" - "@babel/plugin-transform-destructuring" "^7.14.4" - "@babel/plugin-transform-dotall-regex" "^7.12.13" - "@babel/plugin-transform-duplicate-keys" "^7.12.13" - "@babel/plugin-transform-exponentiation-operator" "^7.12.13" - "@babel/plugin-transform-for-of" "^7.13.0" - "@babel/plugin-transform-function-name" "^7.12.13" - "@babel/plugin-transform-literals" "^7.12.13" - "@babel/plugin-transform-member-expression-literals" "^7.12.13" - "@babel/plugin-transform-modules-amd" "^7.14.2" - "@babel/plugin-transform-modules-commonjs" "^7.14.0" - "@babel/plugin-transform-modules-systemjs" "^7.13.8" - "@babel/plugin-transform-modules-umd" "^7.14.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13" - "@babel/plugin-transform-new-target" "^7.12.13" - "@babel/plugin-transform-object-super" "^7.12.13" - "@babel/plugin-transform-parameters" "^7.14.2" - "@babel/plugin-transform-property-literals" "^7.12.13" - "@babel/plugin-transform-regenerator" "^7.13.15" - "@babel/plugin-transform-reserved-words" "^7.12.13" - "@babel/plugin-transform-shorthand-properties" "^7.12.13" - "@babel/plugin-transform-spread" "^7.13.0" - "@babel/plugin-transform-sticky-regex" "^7.12.13" - "@babel/plugin-transform-template-literals" "^7.13.0" - "@babel/plugin-transform-typeof-symbol" "^7.12.13" - "@babel/plugin-transform-unicode-escapes" "^7.12.13" - "@babel/plugin-transform-unicode-regex" "^7.12.13" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.14.5" + "@babel/plugin-transform-async-to-generator" "^7.14.5" + "@babel/plugin-transform-block-scoped-functions" "^7.14.5" + "@babel/plugin-transform-block-scoping" "^7.14.5" + "@babel/plugin-transform-classes" "^7.14.5" + "@babel/plugin-transform-computed-properties" "^7.14.5" + "@babel/plugin-transform-destructuring" "^7.14.5" + "@babel/plugin-transform-dotall-regex" "^7.14.5" + "@babel/plugin-transform-duplicate-keys" "^7.14.5" + "@babel/plugin-transform-exponentiation-operator" "^7.14.5" + "@babel/plugin-transform-for-of" "^7.14.5" + "@babel/plugin-transform-function-name" "^7.14.5" + "@babel/plugin-transform-literals" "^7.14.5" + "@babel/plugin-transform-member-expression-literals" "^7.14.5" + "@babel/plugin-transform-modules-amd" "^7.14.5" + "@babel/plugin-transform-modules-commonjs" "^7.14.5" + "@babel/plugin-transform-modules-systemjs" "^7.14.5" + "@babel/plugin-transform-modules-umd" "^7.14.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.5" + "@babel/plugin-transform-new-target" "^7.14.5" + "@babel/plugin-transform-object-super" "^7.14.5" + "@babel/plugin-transform-parameters" "^7.14.5" + "@babel/plugin-transform-property-literals" "^7.14.5" + "@babel/plugin-transform-regenerator" "^7.14.5" + "@babel/plugin-transform-reserved-words" "^7.14.5" + "@babel/plugin-transform-shorthand-properties" "^7.14.5" + "@babel/plugin-transform-spread" "^7.14.5" + "@babel/plugin-transform-sticky-regex" "^7.14.5" + "@babel/plugin-transform-template-literals" "^7.14.5" + "@babel/plugin-transform-typeof-symbol" "^7.14.5" + "@babel/plugin-transform-unicode-escapes" "^7.14.5" + "@babel/plugin-transform-unicode-regex" "^7.14.5" "@babel/preset-modules" "^0.1.4" - "@babel/types" "^7.14.4" - babel-plugin-polyfill-corejs2 "^0.2.0" - babel-plugin-polyfill-corejs3 "^0.2.0" - babel-plugin-polyfill-regenerator "^0.2.0" - core-js-compat "^3.9.0" + "@babel/types" "^7.14.5" + babel-plugin-polyfill-corejs2 "^0.2.2" + babel-plugin-polyfill-corejs3 "^0.2.2" + babel-plugin-polyfill-regenerator "^0.2.2" + core-js-compat "^3.14.0" semver "^6.3.0" "@babel/preset-modules@^0.1.4": @@ -862,14 +982,14 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-typescript@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.13.0.tgz#ab107e5f050609d806fbb039bec553b33462c60a" - integrity sha512-LXJwxrHy0N3f6gIJlYbLta1D9BDtHpQeqwzM0LIfjDlr6UE/D5Mc7W4iDiQzaE+ks0sTjT26ArcHWnJVt0QiHw== +"@babel/preset-typescript@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.14.5.tgz#aa98de119cf9852b79511f19e7f44a2d379bcce0" + integrity sha512-u4zO6CdbRKbS9TypMqrlGH7sd2TAJppZwn3c/ZRLeO/wGsbddxgbPDUZVNrie3JWYLQ9vpineKlsrWFvO6Pwkw== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-validator-option" "^7.12.17" - "@babel/plugin-transform-typescript" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-transform-typescript" "^7.14.5" "@babel/runtime@^7.8.4": version "7.14.0" @@ -887,7 +1007,16 @@ "@babel/parser" "^7.12.13" "@babel/types" "^7.12.13" -"@babel/traverse@^7.13.0", "@babel/traverse@^7.13.15", "@babel/traverse@^7.14.0", "@babel/traverse@^7.14.2": +"@babel/template@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.14.5.tgz#a9bc9d8b33354ff6e55a9c60d1109200a68974f4" + integrity sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/parser" "^7.14.5" + "@babel/types" "^7.14.5" + +"@babel/traverse@^7.13.0": version "7.14.2" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.2.tgz#9201a8d912723a831c2679c7ebbf2fe1416d765b" integrity sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA== @@ -901,7 +1030,22 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.16", "@babel/types@^7.14.0", "@babel/types@^7.14.2", "@babel/types@^7.14.4", "@babel/types@^7.4.4": +"@babel/traverse@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.5.tgz#c111b0f58afab4fea3d3385a406f692748c59870" + integrity sha512-G3BiS15vevepdmFqmUc9X+64y0viZYygubAMO8SvBmKARuF6CPSZtH4Ng9vi/lrWlZFGe3FWdXNy835akH8Glg== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.14.5" + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-hoist-variables" "^7.14.5" + "@babel/helper-split-export-declaration" "^7.14.5" + "@babel/parser" "^7.14.5" + "@babel/types" "^7.14.5" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.12.13", "@babel/types@^7.13.12", "@babel/types@^7.14.2", "@babel/types@^7.4.4": version "7.14.4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.4.tgz#bfd6980108168593b38b3eb48a24aa026b919bc0" integrity sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw== @@ -909,13 +1053,21 @@ "@babel/helper-validator-identifier" "^7.14.0" to-fast-properties "^2.0.0" -"@discord-player/extractor@^2.0.0": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@discord-player/extractor/-/extractor-2.0.2.tgz#deb505bf66ed8749ea6eb674e8d53d2feeac0b41" - integrity sha512-Vexx0Fj+x3x5g0ZX7AnFu4SrkFHh4xyg+YGJTAcgF1L7b6CRi10/dH7ejnDTvhMLUG/u+a+TClh4as9PnACNDQ== +"@babel/types@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.5.tgz#3bb997ba829a2104cedb20689c4a5b8121d383ff" + integrity sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg== dependencies: - genius-lyrics "^4.2.7" - jsdom "^16.5.2" + "@babel/helper-validator-identifier" "^7.14.5" + to-fast-properties "^2.0.0" + +"@discord-player/extractor@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@discord-player/extractor/-/extractor-3.0.0.tgz#2baa733da054b991f83417054cad1575cf57c4ab" + integrity sha512-6A2QmrbQXTpv1oequiAYQMnWzvv1fu9Yg0GJwAMoLUXZjvb5Yoak2lnohsDI1Hc14LW//Z5xyLGtmFivTWTXDQ== + dependencies: + genius-lyrics "^4.2.9" + jsdom "^16.5.3" node-fetch "^2.6.1" reverbnation-scraper "^2.0.0" @@ -933,28 +1085,28 @@ combined-stream "^1.0.8" mime-types "^2.1.12" -"@discordjs/node-pre-gyp@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@discordjs/node-pre-gyp/-/node-pre-gyp-0.3.2.tgz#e882e803b2be444fb557c3b46d9bbe75a053bc9c" - integrity sha512-NqRvPz0X+/3h+6ClElrSfvsD5XEG9ljYzXhzyo81DslVkVKzmmxX9FLs3MUr9qI7p53DG1eYru633qosrOqMyA== +"@discordjs/node-pre-gyp@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@discordjs/node-pre-gyp/-/node-pre-gyp-0.4.0.tgz#32740b1ff362c86a280877df9637313c7bf250ee" + integrity sha512-CXLpoM2hgS94i9+EAVowR92y8o3KdKc9fmoe8/FTp5XTzvoXzJln3+Ctl0oBpE6c9+11zd9oJnZPdkkOBkDPSA== dependencies: detect-libc "^1.0.3" - http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" make-dir "^3.1.0" node-fetch "^2.6.1" nopt "^5.0.0" npmlog "^4.1.2" rimraf "^3.0.2" - semver "^7.3.4" + semver "^7.3.5" tar "^6.1.0" -"@discordjs/opus@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@discordjs/opus/-/opus-0.5.0.tgz#26ae9f30d52c03ce1671b1db8eec957206fdf92b" - integrity sha512-s3XUJ7dYV+UvYUiqkgs7sq8JKWMhQrHcwDECP2SKdxtL9h9qGa4mr0IR6XnZw+G/Sogx8c+HRS7+wEspkqk3zA== +"@discordjs/opus@^0.5.3": + version "0.5.3" + resolved "https://registry.yarnpkg.com/@discordjs/opus/-/opus-0.5.3.tgz#7294f539da0b37bf13b072e51acb47ffca748471" + integrity sha512-IQhCwCy2WKXLe+qkOkwO1Wjgk20uqeAbqM62tCbzIqbTsXX4YAge8Me9RFnI77Lx+UTkgm4rSVM3VPVdS/GsUw== dependencies: - "@discordjs/node-pre-gyp" "^0.3.2" - node-addon-api "^3.1.0" + "@discordjs/node-pre-gyp" "^0.4.0" + node-addon-api "^3.2.1" "@discordjs/voice@^0.3.1": version "0.3.1" @@ -967,15 +1119,15 @@ tiny-typed-emitter "^2.0.3" ws "^7.4.4" -"@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents": - version "2.1.8-no-fsevents" - resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.tgz#da7c3996b8e6e19ebd14d82eaced2313e7769f9b" - integrity sha512-+nb9vWloHNNMFHjGofEam3wopE3m1yuambrrd/fnPc+lFOMB9ROTqQlche9ByFWNkdNqfSgR/kkQtQ8DzEWt2w== +"@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.2": + version "2.1.8-no-fsevents.2" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.2.tgz#e324c0a247a5567192dd7180647709d7e2faf94b" + integrity sha512-Fb8WxUFOBQVl+CX4MWet5o7eCc6Pj04rXIwVKZ6h1NnqTo45eOQW6aWyhG25NIODvWFwTDMwBsYxrQ3imxpetg== dependencies: anymatch "^2.0.0" async-each "^1.0.1" braces "^2.3.2" - glob-parent "^3.1.0" + glob-parent "^5.1.2" inherits "^2.0.3" is-binary-path "^1.0.0" is-glob "^4.0.0" @@ -1014,17 +1166,12 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.1.tgz#a6ca6a9a0ff366af433f42f5f0e124794ff6b8f1" integrity sha512-FTgBI767POY/lKNDNbIzgAX6miIDBs6NTCbdlDb8TrWovHsSvaVIZDlTqym29C6UqhzwcJx4CYr+AlrMywA0cA== -"@types/node@*": +"@types/node@*", "@types/node@^15.12.2": version "15.12.2" resolved "https://registry.yarnpkg.com/@types/node/-/node-15.12.2.tgz#1f2b42c4be7156ff4a6f914b2fb03d05fa84e38d" integrity sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww== -"@types/node@^14.14.41": - version "14.17.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.3.tgz#6d327abaa4be34a74e421ed6409a0ae2f47f4c3d" - integrity sha512-e6ZowgGJmTuXa3GyaPbTGxX17tnThl2aSSizrFthQ7m9uLGZBXiGhgE55cjRZTF5kjZvYn9EOPOMljdjwbflxw== - -"@types/ws@^7.4.1", "@types/ws@^7.4.4": +"@types/ws@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.4.tgz#93e1e00824c1de2608c30e6de4303ab3b4c0c9bc" integrity sha512-d/7W23JAXPodQNbOZNXvl2K+bqAQrCMwlh/nuQsPSQk6Fq0opHoPrUw43aHsvSbIiQPr8Of2hkFbnz1XBFVyZQ== @@ -1265,7 +1412,7 @@ babel-plugin-dynamic-import-node@^2.3.3: dependencies: object.assign "^4.1.0" -babel-plugin-polyfill-corejs2@^0.2.0: +babel-plugin-polyfill-corejs2@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327" integrity sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ== @@ -1274,7 +1421,7 @@ babel-plugin-polyfill-corejs2@^0.2.0: "@babel/helper-define-polyfill-provider" "^0.2.2" semver "^6.1.1" -babel-plugin-polyfill-corejs3@^0.2.0: +babel-plugin-polyfill-corejs3@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.2.tgz#7424a1682ee44baec817327710b1b094e5f8f7f5" integrity sha512-l1Cf8PKk12eEk5QP/NQ6TH8A1pee6wWDJ96WjxrMXFLHLOBFzYM4moG80HFgduVhTqAFez4alnZKEhP/bYHg0A== @@ -1282,7 +1429,7 @@ babel-plugin-polyfill-corejs3@^0.2.0: "@babel/helper-define-polyfill-provider" "^0.2.2" core-js-compat "^3.9.1" -babel-plugin-polyfill-regenerator@^0.2.0: +babel-plugin-polyfill-regenerator@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz#b310c8d642acada348c1fa3b3e6ce0e851bee077" integrity sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg== @@ -1672,7 +1819,7 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js-compat@^3.9.0, core-js-compat@^3.9.1: +core-js-compat@^3.14.0, core-js-compat@^3.9.1: version "3.14.0" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.14.0.tgz#b574dabf29184681d5b16357bd33d104df3d29a5" integrity sha512-R4NS2eupxtiJU+VwgkF9WTpnSfZW4pogwKHd8bclWU2sp93Pr5S1uYJI84cMOubJRou7bcfL0vmwtLslWN5p3A== @@ -2317,7 +2464,7 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" -genius-lyrics@^4.2.7: +genius-lyrics@^4.2.9: version "4.2.9" resolved "https://registry.yarnpkg.com/genius-lyrics/-/genius-lyrics-4.2.9.tgz#87d12946589d3e96df4e100c51805aa5046de2c7" integrity sha512-BQm/gmaXEckLAc/Z9ZsGNWxh4CHudx0G1Key8Rnv0xFcqmrxIvssJIDBgDPJLqB6dpVas3uj6LQng1yMFtxfNA== @@ -2349,15 +2496,7 @@ get-value@^2.0.3, get-value@^2.0.6: resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-parent@^5.0.0, glob-parent@~5.1.0: +glob-parent@^5.0.0, glob-parent@^5.1.2, glob-parent@~5.1.0: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -2643,7 +2782,7 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" -is-extglob@^2.1.0, is-extglob@^2.1.1: +is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= @@ -2665,13 +2804,6 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" - is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" @@ -2823,7 +2955,7 @@ jsdoc@^3.6.3: taffydb "2.6.2" underscore "~1.13.1" -jsdom@^16.5.2: +jsdom@^16.5.3: version "16.6.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.6.0.tgz#f79b3786682065492a3da6a60a4695da983805ac" integrity sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg== @@ -3185,7 +3317,7 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -node-addon-api@*, node-addon-api@^3.1.0: +node-addon-api@*, node-addon-api@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== @@ -3373,11 +3505,6 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= - path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -3418,7 +3545,7 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= -prettier@^2.2.1: +prettier@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.1.tgz#76903c3f8c4449bc9ac597acefa24dc5ad4cbea6" integrity sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA== @@ -3707,7 +3834,7 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.4: +semver@^7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== @@ -4210,12 +4337,7 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -typescipt@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typescipt/-/typescipt-1.0.0.tgz#bbe7ca742d5e6fc2e3e44ad10d461fe59211f6a5" - integrity sha512-Rgg7DtWh0c0oJPz2p48B0hlINIkE5zxU5i+dGctkoiKjIu6twl0HXWzoy+mvp9bQfLJGx70zYuN6GK0S/x5Kxw== - -typescript@^4.2.3: +typescript@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.2.tgz#399ab18aac45802d6f2498de5054fcbbe716a805" integrity sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw== @@ -4515,4 +4637,4 @@ ytdl-core@^4.8.2: dependencies: m3u8stream "^0.8.3" miniget "^4.0.0" - sax "^1.1.3" \ No newline at end of file + sax "^1.1.3" From f3f7c9b490244c24cd225be31888a6094d50efd7 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Mon, 14 Jun 2021 00:13:37 +0545 Subject: [PATCH 055/215] chore(prettier): format files --- src/Player.ts | 2 +- src/Structures/Queue.ts | 2 +- src/Structures/Track.ts | 2 +- src/types/types.ts | 2 +- src/utils/Constants.ts | 2 +- src/utils/Util.ts | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Player.ts b/src/Player.ts index 9dc53a4..c0765ac 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -268,4 +268,4 @@ class DiscordPlayer extends EventEmitter { } } -export { DiscordPlayer as Player }; \ No newline at end of file +export { DiscordPlayer as Player }; diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index a28744c..e828a64 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -213,4 +213,4 @@ class Queue { } } -export { Queue }; \ No newline at end of file +export { Queue }; diff --git a/src/Structures/Track.ts b/src/Structures/Track.ts index 4f24093..4ac2c0b 100644 --- a/src/Structures/Track.ts +++ b/src/Structures/Track.ts @@ -173,4 +173,4 @@ class Track { export default Track; -export { Track }; \ No newline at end of file +export { Track }; diff --git a/src/types/types.ts b/src/types/types.ts index dd96fb2..5bc0821 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -205,4 +205,4 @@ export interface PlaylistJSON { url: string; }; tracks: TrackJSON[]; -} \ No newline at end of file +} diff --git a/src/utils/Constants.ts b/src/utils/Constants.ts index 8cec2e9..cb0ff5c 100644 --- a/src/utils/Constants.ts +++ b/src/utils/Constants.ts @@ -1 +1 @@ -export {}; \ No newline at end of file +export {}; diff --git a/src/utils/Util.ts b/src/utils/Util.ts index c207511..8baff32 100644 --- a/src/utils/Util.ts +++ b/src/utils/Util.ts @@ -41,4 +41,4 @@ class Util { } } -export { Util }; \ No newline at end of file +export { Util }; From 0cdcda381b5e558b7ee57143379b84905c4e9d98 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Mon, 14 Jun 2021 01:14:57 +0545 Subject: [PATCH 056/215] remove unused events --- src/types/types.ts | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/src/types/types.ts b/src/types/types.ts index 5bc0821..36a9344 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -119,23 +119,41 @@ export enum QueryType { } export interface PlayerEvents { + /** + * Emitted when bot gets disconnected from a voice channel + */ botDisconnect: (queue: Queue) => any; + /** + * Emitted when the voice channel is empty + */ channelEmpty: (queue: Queue) => any; + /** + * Emitted when bot connects to a voice channel + */ connectionCreate: (queue: Queue) => any; + /** + * Debug information + */ debug: (queue: Queue, message: string) => any; + /** + * Emitted on error + */ error: (queue: Queue, error: Error) => any; - musicStop: (queue: Queue) => any; - noResults: (queue: Queue) => any; - playlistAdd: (queue: Queue) => any; - playlistParseEnd: (queue: Queue) => any; - playlistParseStart: (queue: Queue) => any; - queueCreate: (queue: Queue) => any; + /** + * Emitted when queue ends + */ queueEnd: (queue: Queue) => any; - searchCancel: (queue: Queue) => any; - searchInvalidResponse: (queue: Queue) => any; - searchResults: (queue: Queue) => any; + /** + * Emitted when a single track is added + */ trackAdd: (queue: Queue, track: Track) => any; + /** + * Emitted when multiple tracks are added + */ tracksAdd: (queue: Queue, track: Track[]) => any; + /** + * Emitted when a track starts playing + */ trackStart: (queue: Queue, track: Track) => any; } From 58c3589295f95b3ea4c04a3b6ffae6dadeb207b7 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Mon, 14 Jun 2021 01:19:59 +0545 Subject: [PATCH 057/215] connection event --- src/Structures/Queue.ts | 2 ++ src/types/types.ts | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index e828a64..36de580 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -66,6 +66,8 @@ class Queue { this.connection.on("error", (err) => this.player.emit("error", this, err)); this.connection.on("debug", (msg) => this.player.emit("debug", this, msg)); + this.player.emit("connectionCreate", this, this.connection); + return this; } diff --git a/src/types/types.ts b/src/types/types.ts index 36a9344..3a5d01a 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -4,6 +4,7 @@ import { Readable, Duplex } from "stream"; import { Queue } from "../Structures/Queue"; import Track from "../Structures/Track"; import { Playlist } from "../Structures/Playlist"; +import { StreamDispatcher } from "../VoiceInterface/BasicStreamDispatcher"; export type FiltersName = keyof QueueFilters; @@ -130,7 +131,7 @@ export interface PlayerEvents { /** * Emitted when bot connects to a voice channel */ - connectionCreate: (queue: Queue) => any; + connectionCreate: (queue: Queue, connection: StreamDispatcher) => any; /** * Debug information */ From 0fc48b731c50aaa1078fdb186e1b05a083becb0e Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Mon, 14 Jun 2021 10:31:29 +0545 Subject: [PATCH 058/215] update volume calculator --- src/Structures/Queue.ts | 1 + src/VoiceInterface/BasicStreamDispatcher.ts | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 36de580..bb34ff4 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -176,6 +176,7 @@ class Queue { const dispatcher = await this.connection.playStream(resource); dispatcher.setVolume(this.options.initialVolume); + // need to use these events here dispatcher.once("start", () => { this.playing = true; if (!options.filtersUpdate) this.player.emit("trackStart", this, this.current); diff --git a/src/VoiceInterface/BasicStreamDispatcher.ts b/src/VoiceInterface/BasicStreamDispatcher.ts index 7579ada..0d4e3aa 100644 --- a/src/VoiceInterface/BasicStreamDispatcher.ts +++ b/src/VoiceInterface/BasicStreamDispatcher.ts @@ -142,14 +142,14 @@ class BasicStreamDispatcher extends EventEmitter { if (!this.audioResource || isNaN(value) || value < 0 || value > Infinity) return false; // ye boi logarithmic ✌ - this.audioResource.volume.setVolumeLogarithmic(value / 200); + this.audioResource.volume.setVolumeLogarithmic(value / 100); return true; } get volume() { if (!this.audioResource || !this.audioResource.volume) return 100; const currentVol = this.audioResource.volume.volume; - return Math.round(Math.pow(currentVol, 1 / 1.660964) * 200); + return Math.round(Math.pow(currentVol, 1 / 1.660964) * 100); } get streamTime() { From 8c61b889562ca599eee6553a52dc2dea66cf6a5f Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Mon, 14 Jun 2021 12:29:32 +0545 Subject: [PATCH 059/215] playlists --- src/Player.ts | 102 ++++++++++++++++++++++++++++++++----- src/Structures/Playlist.ts | 1 + src/types/types.ts | 1 + 3 files changed, 92 insertions(+), 12 deletions(-) diff --git a/src/Player.ts b/src/Player.ts index c0765ac..a9fb2b3 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -113,10 +113,10 @@ class DiscordPlayer extends EventEmitter { * Search tracks * @param {string|Track} query The search query * @param {Discord.User} requestedBy The person who requested track search - * @returns {Promise} + * @returns {Promise<{playlist?: Playlist; tracks: Track[]}>} */ async search(query: string | Track, options: SearchOptions) { - if (query instanceof Track) return { playlist: false, tracks: [query] }; + if (query instanceof Track) return { playlist: null, tracks: [query] }; if (!options) throw new Error("DiscordPlayer#search needs search options!"); if (!("searchEngine" in options)) options.searchEngine = QueryType.AUTO; @@ -127,7 +127,7 @@ class DiscordPlayer extends EventEmitter { const videos = await YouTube.search(query, { type: "video" }).catch(() => {}); - if (!videos) return { playlist: false, tracks: [] }; + if (!videos) return { playlist: null, tracks: [] }; const tracks = videos.map((m) => { (m as any).source = "youtube"; @@ -144,12 +144,12 @@ class DiscordPlayer extends EventEmitter { }); }); - return { playlist: false, tracks }; + return { playlist: null, tracks }; } case QueryType.SOUNDCLOUD_TRACK: case QueryType.SOUNDCLOUD_SEARCH: { const result: any[] = QueryResolver.resolve(query) === QueryType.SOUNDCLOUD_TRACK ? [{ url: query }] : await soundcloud.search(query, "track").catch(() => {}); - if (!result || !result.length) return { playlist: false, tracks: [] }; + if (!result || !result.length) return { playlist: null, tracks: [] }; const res: Track[] = []; for (const r of result) { @@ -172,11 +172,11 @@ class DiscordPlayer extends EventEmitter { res.push(track); } - return { playlist: false, tracks: res }; + return { playlist: null, tracks: res }; } case QueryType.SPOTIFY_SONG: { const spotifyData = await Spotify.getData(query).catch(() => {}); - if (!spotifyData) return { playlist: false, tracks: [] }; + if (!spotifyData) return { playlist: null, tracks: [] }; const spotifyTrack = new Track(this, { title: spotifyData.name, description: spotifyData.description ?? "", @@ -192,12 +192,12 @@ class DiscordPlayer extends EventEmitter { source: "spotify" }); - return { playlist: false, tracks: [spotifyTrack] }; + return { playlist: null, tracks: [spotifyTrack] }; } case QueryType.SPOTIFY_PLAYLIST: case QueryType.SPOTIFY_ALBUM: { const spotifyPlaylist = await Spotify.getData(query).catch(() => {}); - if (!spotifyPlaylist) return { playlist: false, tracks: [] }; + if (!spotifyPlaylist) return { playlist: null, tracks: [] }; const playlist = new Playlist(this, { title: spotifyPlaylist.name ?? spotifyPlaylist.title, @@ -217,7 +217,8 @@ class DiscordPlayer extends EventEmitter { }, tracks: [], id: spotifyPlaylist.id, - url: spotifyPlaylist.external_urls?.spotify ?? query + url: spotifyPlaylist.external_urls?.spotify ?? query, + rawPlaylist: spotifyPlaylist }); if (spotifyPlaylist.type !== "playlist") { @@ -256,10 +257,87 @@ class DiscordPlayer extends EventEmitter { }) as Track[]; } - return { playlist: true, tracks: playlist.tracks }; + return { playlist: playlist, tracks: playlist.tracks }; + } + case QueryType.SOUNDCLOUD_PLAYLIST: { + const data = await SoundCloud.getPlaylist(query).catch(() => { }); + if (!data) return { playlist: null, tracks: [] }; + + const res = new Playlist(this, { + title: data.title, + description: data.description ?? "", + thumbnail: data.thumbnail ?? "https://soundcloud.com/pwa-icon-192.png", + type: "playlist", + source: "soundcloud", + author: { + name: data.author?.name ?? data.author?.username ?? "Unknown Artist", + url: data.author?.profile + }, + tracks: [], + id: `${data.id}`, // stringified + url: data.url, + rawPlaylist: data + }); + + for (const song of data) { + const track = new Track(this, { + title: song.title, + description: song.description ?? "", + author: song.author?.username ?? song.author?.name ?? "Unknown Artist", + url: song.url, + thumbnail: song.thumbnail, + duration: Util.buildTimeCode(Util.parseMS(song.duration)), + views: song.playCount ?? 0, + requestedBy: options.requestedBy, + playlist: res, + source: "soundcloud", + engine: song + }); + res.tracks.push(track); + } + + return { playlist: res, tracks: res.tracks }; + } + case QueryType.YOUTUBE_PLAYLIST: { + const ytpl = await YouTube.getPlaylist(query).catch(() => {}); + if (!ytpl) return { playlist: null, tracks: [] }; + + // @todo: better way of handling large playlists + await ytpl.fetch().catch(() => {}); + + const playlist = new Playlist(this, { + title: ytpl.title, + thumbnail: ytpl.thumbnail?.displayThumbnailURL("maxresdefault"), + description: "", + type: "playlist", + source: "youtube", + author: { + name: ytpl.channel.name, + url: ytpl.channel.url + }, + tracks: [], + id: ytpl.id, + url: ytpl.url, + rawPlaylist: ytpl + }); + + for (const video of ytpl) { + playlist.tracks.push(new Track(this, { + title: video.title, + description: video.description, + author: video.channel?.name, + url: video.url, + requestedBy: options.requestedBy, + thumbnail: video.thumbnail?.displayThumbnailURL("maxresdefault"), + views: video.views, + duration: video.durationFormatted, + raw: video, + playlist: playlist + })); + } } default: - return { playlist: false, tracks: [] }; + return { playlist: null, tracks: [] }; } } diff --git a/src/Structures/Playlist.ts b/src/Structures/Playlist.ts index 676f0ca..c381090 100644 --- a/src/Structures/Playlist.ts +++ b/src/Structures/Playlist.ts @@ -16,6 +16,7 @@ class Playlist { }; public id: string; public url: string; + public rawPlaylist?: any; constructor(player: Player, data: PlaylistInitData) { this.player = player; diff --git a/src/types/types.ts b/src/types/types.ts index 3a5d01a..7a67ce9 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -196,6 +196,7 @@ export interface PlaylistInitData { }; id: string; url: string; + rawPlaylist?: any; } export interface TrackJSON { From d27b9f818060bf018bd1fe8fb944aa4b3017041d Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Mon, 14 Jun 2021 12:30:03 +0545 Subject: [PATCH 060/215] chore(prettier): format code --- src/Player.ts | 28 +++++++++++++++------------- src/Structures/Queue.ts | 2 +- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/Player.ts b/src/Player.ts index a9fb2b3..05342d7 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -260,7 +260,7 @@ class DiscordPlayer extends EventEmitter { return { playlist: playlist, tracks: playlist.tracks }; } case QueryType.SOUNDCLOUD_PLAYLIST: { - const data = await SoundCloud.getPlaylist(query).catch(() => { }); + const data = await SoundCloud.getPlaylist(query).catch(() => {}); if (!data) return { playlist: null, tracks: [] }; const res = new Playlist(this, { @@ -322,18 +322,20 @@ class DiscordPlayer extends EventEmitter { }); for (const video of ytpl) { - playlist.tracks.push(new Track(this, { - title: video.title, - description: video.description, - author: video.channel?.name, - url: video.url, - requestedBy: options.requestedBy, - thumbnail: video.thumbnail?.displayThumbnailURL("maxresdefault"), - views: video.views, - duration: video.durationFormatted, - raw: video, - playlist: playlist - })); + playlist.tracks.push( + new Track(this, { + title: video.title, + description: video.description, + author: video.channel?.name, + url: video.url, + requestedBy: options.requestedBy, + thumbnail: video.thumbnail?.displayThumbnailURL("maxresdefault"), + views: video.views, + duration: video.durationFormatted, + raw: video, + playlist: playlist + }) + ); } } default: diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index bb34ff4..149ab95 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -67,7 +67,7 @@ class Queue { this.connection.on("debug", (msg) => this.player.emit("debug", this, msg)); this.player.emit("connectionCreate", this, this.connection); - + return this; } From d5e3f6225c7de9adf90d6468a7cdf45f0b8edf6c Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Mon, 14 Jun 2021 12:33:32 +0545 Subject: [PATCH 061/215] return playlist --- src/Player.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Player.ts b/src/Player.ts index 05342d7..539fda0 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -337,6 +337,8 @@ class DiscordPlayer extends EventEmitter { }) ); } + + return { playlist: playlist, tracks: playlist.tracks }; } default: return { playlist: null, tracks: [] }; From 7f34fbd786a0fd3cc3b0c0f470e05e9c3213540e Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Mon, 14 Jun 2021 13:13:31 +0545 Subject: [PATCH 062/215] fix youtube playlist not playing --- src/Player.ts | 16 ++++++++-------- src/Structures/Track.ts | 2 +- src/utils/QueryResolver.ts | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Player.ts b/src/Player.ts index 539fda0..a9da7fb 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -305,9 +305,9 @@ class DiscordPlayer extends EventEmitter { // @todo: better way of handling large playlists await ytpl.fetch().catch(() => {}); - const playlist = new Playlist(this, { + const playlist: Playlist = new Playlist(this, { title: ytpl.title, - thumbnail: ytpl.thumbnail?.displayThumbnailURL("maxresdefault"), + thumbnail: ytpl.thumbnail as unknown as string, description: "", type: "playlist", source: "youtube", @@ -321,22 +321,22 @@ class DiscordPlayer extends EventEmitter { rawPlaylist: ytpl }); - for (const video of ytpl) { - playlist.tracks.push( + playlist.tracks = ytpl.videos.map( + (video) => new Track(this, { title: video.title, description: video.description, author: video.channel?.name, url: video.url, requestedBy: options.requestedBy, - thumbnail: video.thumbnail?.displayThumbnailURL("maxresdefault"), + thumbnail: video.thumbnail.url, views: video.views, duration: video.durationFormatted, raw: video, - playlist: playlist + playlist: playlist, + source: "youtube" }) - ); - } + ); return { playlist: playlist, tracks: playlist.tracks }; } diff --git a/src/Structures/Track.ts b/src/Structures/Track.ts index 4ac2c0b..907b169 100644 --- a/src/Structures/Track.ts +++ b/src/Structures/Track.ts @@ -106,7 +106,7 @@ class Track { this.playlist = data.playlist; // raw - Object.defineProperty(this, "raw", { get: () => data.raw ?? data, enumerable: false }); + Object.defineProperty(this, "raw", { get: () => Object.assign({}, { source: data.raw?.source ?? data.source }, data.raw ?? data), enumerable: false }); } /** diff --git a/src/utils/QueryResolver.ts b/src/utils/QueryResolver.ts index 42269b5..5713202 100644 --- a/src/utils/QueryResolver.ts +++ b/src/utils/QueryResolver.ts @@ -19,8 +19,8 @@ class QueryResolver { static resolve(query: string): QueryType { if (SoundcloudValidateURL(query, "track")) return QueryType.SOUNDCLOUD_TRACK; if (SoundcloudValidateURL(query, "playlist") || query.includes("/sets/")) return QueryType.SOUNDCLOUD_PLAYLIST; + if (YouTube.isPlaylist(query)) return QueryType.YOUTUBE_PLAYLIST; if (validateID(query) || validateURL(query)) return QueryType.YOUTUBE_SEARCH; - if (YouTube.validate(query, "PLAYLIST_ID")) return QueryType.YOUTUBE_PLAYLIST; if (spotifySongRegex.test(query)) return QueryType.SPOTIFY_SONG; if (spotifyPlaylistRegex.test(query)) return QueryType.SPOTIFY_PLAYLIST; if (spotifyAlbumRegex.test(query)) return QueryType.SPOTIFY_ALBUM; From 62bf57ac7482843d4c2694aab7794b881aa6b406 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Mon, 14 Jun 2021 19:35:36 +0545 Subject: [PATCH 063/215] feat: extractors implementation --- src/Player.ts | 76 +++++++++++++++++++-- src/Structures/ExtractorModel.ts | 28 ++++---- src/VoiceInterface/BasicStreamDispatcher.ts | 3 +- src/index.ts | 1 - src/types/types.ts | 42 +++++++++--- src/utils/PlayerError.ts | 10 --- src/utils/Util.ts | 8 +++ 7 files changed, 124 insertions(+), 44 deletions(-) delete mode 100644 src/utils/PlayerError.ts diff --git a/src/Player.ts b/src/Player.ts index a9da7fb..cfebf98 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -1,8 +1,8 @@ -import { Client, Collection, Guild, Snowflake, User, VoiceState } from "discord.js"; +import { Client, Collection, Guild, Snowflake, VoiceState } from "discord.js"; import { TypedEmitter as EventEmitter } from "tiny-typed-emitter"; import { Queue } from "./Structures/Queue"; import { VoiceUtils } from "./VoiceInterface/VoiceUtils"; -import { PlayerEvents, PlayerOptions, QueryType, SearchOptions } from "./types/types"; +import { PlayerEvents, PlayerOptions, QueryType, SearchOptions, DiscordPlayerInitOptions } from "./types/types"; import Track from "./Structures/Track"; import { QueryResolver } from "./utils/QueryResolver"; import YouTube from "youtube-sr"; @@ -11,19 +11,24 @@ import Spotify from "spotify-url-info"; // @ts-ignore import { Client as SoundCloud } from "soundcloud-scraper"; import { Playlist } from "./Structures/Playlist"; +import { ExtractorModel } from "./Structures/ExtractorModel"; const soundcloud = new SoundCloud(); class DiscordPlayer extends EventEmitter { public readonly client: Client; + public readonly options: DiscordPlayerInitOptions = { + autoRegisterExtractor: true + }; public readonly queues = new Collection(); public readonly voiceUtils = new VoiceUtils(); + public readonly extractors = new Collection(); /** * Creates new Discord Player * @param {Discord.Client} client The Discord Client */ - constructor(client: Client) { + constructor(client: Client, options: DiscordPlayerInitOptions = {}) { super(); /** @@ -32,7 +37,21 @@ class DiscordPlayer extends EventEmitter { */ this.client = client; + /** + * The extractors collection + * @type {ExtractorModel} + */ + this.options = Object.assign(this.options, options); + this.client.on("voiceStateUpdate", this._handleVoiceState.bind(this)); + + if (this.options?.autoRegisterExtractor) { + let nv: any; + + if ((nv = Util.require("@discord-player/extractor"))) { + ["Attachment", "Facebook", "Reverbnation", "Vimeo"].forEach((ext) => void this.use(ext, nv[ext])); + } + } } private _handleVoiceState(oldState: VoiceState, newState: VoiceState): void { @@ -120,7 +139,33 @@ class DiscordPlayer extends EventEmitter { if (!options) throw new Error("DiscordPlayer#search needs search options!"); if (!("searchEngine" in options)) options.searchEngine = QueryType.AUTO; - // @todo: add extractors + for (const [_, extractor] of this.extractors) { + if (!extractor.validate(query)) continue; + const data = await extractor.handle(query); + if (data && data.data.length) { + const playlist = !data.playlist + ? null + : new Playlist(this, { + ...data.playlist, + tracks: [] + }); + + const tracks = data.data.map( + (m) => + new Track(this, { + ...m, + requestedBy: options.requestedBy, + duration: Util.buildTimeCode(Util.parseMS(m.duration)), + playlist: playlist + }) + ); + + if (playlist) playlist.tracks = tracks; + + return { playlist: playlist, tracks: tracks }; + } + } + const qt = options.searchEngine === QueryType.AUTO ? QueryResolver.resolve(query) : options.searchEngine; switch (qt) { case QueryType.YOUTUBE_SEARCH: { @@ -345,6 +390,29 @@ class DiscordPlayer extends EventEmitter { } } + use(extractorName: string, extractor: ExtractorModel | any, force = false) { + if (!extractorName) throw new Error("Cannot use unknown extractor!"); + if (this.extractors.has(extractorName) && !force) return this; + if (extractor instanceof ExtractorModel) { + this.extractors.set(extractorName, extractor); + return this; + } + + for (const method of ["validate", "getInfo"]) { + if (typeof extractor[method] !== "function") throw new Error("Invalid extractor data!"); + } + + const model = new ExtractorModel(extractorName, extractor); + this.extractors.set(model.name, model); + + return this; + } + + unuse(extractorName: string) { + if (!this.extractors.has(extractorName)) throw new Error(`Cannot find extractor "${extractorName}"`); + this.extractors.delete(extractorName); + } + *[Symbol.iterator]() { yield* Array.from(this.queues.values()); } diff --git a/src/Structures/ExtractorModel.ts b/src/Structures/ExtractorModel.ts index 183747f..9b0ad5e 100644 --- a/src/Structures/ExtractorModel.ts +++ b/src/Structures/ExtractorModel.ts @@ -29,14 +29,18 @@ class ExtractorModel { if (!data) return null; return { - title: data.title, - duration: data.duration, - thumbnail: data.thumbnail, - engine: data.engine, - views: data.views, - author: data.author, - description: data.description, - url: data.url + playlist: data.playlist ?? null, + data: + data.info?.map((m: any) => ({ + title: m.title, + duration: m.duration, + thumbnail: m.thumbnail, + engine: m.engine, + views: m.views, + author: m.author, + description: m.description, + url: m.url + })) ?? [] }; } @@ -56,14 +60,6 @@ class ExtractorModel { get version(): string { return this._raw.version ?? "0.0.0"; } - - /** - * If player should mark this extractor as important - * @type {boolean} - */ - get important(): boolean { - return Boolean(this._raw.important); - } } export { ExtractorModel }; diff --git a/src/VoiceInterface/BasicStreamDispatcher.ts b/src/VoiceInterface/BasicStreamDispatcher.ts index 0d4e3aa..cabd202 100644 --- a/src/VoiceInterface/BasicStreamDispatcher.ts +++ b/src/VoiceInterface/BasicStreamDispatcher.ts @@ -14,7 +14,6 @@ import { StageChannel, VoiceChannel } from "discord.js"; import { Duplex, Readable } from "stream"; import { TypedEmitter as EventEmitter } from "tiny-typed-emitter"; import Track from "../Structures/Track"; -import PlayerError from "../utils/PlayerError"; export interface VoiceEvents { error: (error: AudioPlayerError) => any; @@ -130,7 +129,7 @@ class BasicStreamDispatcher extends EventEmitter { * @param {AudioResource} resource The audio resource to play */ async playStream(resource: AudioResource = this.audioResource) { - if (!resource) throw new PlayerError("Audio resource is not available!"); + if (!resource) throw new Error("Audio resource is not available!"); if (!this.audioResource) this.audioResource = resource; if (this.voiceConnection.state.status !== VoiceConnectionStatus.Ready) await entersState(this.voiceConnection, VoiceConnectionStatus.Ready, 20000); this.audioPlayer.play(resource); diff --git a/src/index.ts b/src/index.ts index cdbeb79..1d5c948 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,6 +4,5 @@ export { Playlist } from "./Structures/Playlist"; export { Player } from "./Player"; export { Queue } from "./Structures/Queue"; export { Track } from "./Structures/Track"; -export { PlayerError } from "./utils/PlayerError"; export { VoiceUtils } from "./VoiceInterface/VoiceUtils"; export { VoiceEvents, StreamDispatcher } from "./VoiceInterface/BasicStreamDispatcher"; diff --git a/src/types/types.ts b/src/types/types.ts index 7a67ce9..eb5248f 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -88,17 +88,33 @@ export interface PlayerOptions { } export interface ExtractorModelData { - title: string; - duration: number; - thumbnail: string; - engine: string | Readable | Duplex; - views: number; - author: string; - description: string; - url: string; - version?: string; - important?: boolean; - source?: TrackSource; + playlist?: { + title: string; + description: string; + thumbnail: string; + type: "album" | "playlist"; + source: TrackSource; + author: { + name: string; + url: string; + }; + id: string; + url: string; + rawPlaylist?: any; + }; + data: { + title: string; + duration: number; + thumbnail: string; + engine: string | Readable | Duplex; + views: number; + author: string; + description: string; + url: string; + version?: string; + important?: boolean; + source?: TrackSource; + }[]; } export enum QueryType { @@ -226,3 +242,7 @@ export interface PlaylistJSON { }; tracks: TrackJSON[]; } + +export interface DiscordPlayerInitOptions { + autoRegisterExtractor?: boolean; +} diff --git a/src/utils/PlayerError.ts b/src/utils/PlayerError.ts deleted file mode 100644 index af8110d..0000000 --- a/src/utils/PlayerError.ts +++ /dev/null @@ -1,10 +0,0 @@ -export default class PlayerError extends Error { - constructor(msg: string, name?: string) { - super(); - this.name = name ?? "PlayerError"; - this.message = msg; - Error.captureStackTrace(this); - } -} - -export { PlayerError }; diff --git a/src/utils/Util.ts b/src/utils/Util.ts index 8baff32..6489b6e 100644 --- a/src/utils/Util.ts +++ b/src/utils/Util.ts @@ -39,6 +39,14 @@ class Util { static isVoiceEmpty(channel: VoiceChannel | StageChannel) { return channel.members.filter((member) => !member.user.bot).size === 0; } + + static require(id: string) { + try { + return require(id); + } catch { + return null; + } + } } export { Util }; From 71ebe8bb7c45cad9c95e0b768d6ac51156b2c31b Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Mon, 14 Jun 2021 19:55:45 +0545 Subject: [PATCH 064/215] extractors --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index a542a37..e5fed1d 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "@babel/core": "^7.14.5", "@babel/preset-env": "^7.14.5", "@babel/preset-typescript": "^7.14.5", - "@discord-player/extractor": "^3.0.0", + "@discord-player/extractor": "^3.0.2", "@discordjs/opus": "^0.5.3", "@types/node": "^15.12.2", "@types/ws": "^7.4.4", diff --git a/yarn.lock b/yarn.lock index 7df2613..47c6da1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1061,10 +1061,10 @@ "@babel/helper-validator-identifier" "^7.14.5" to-fast-properties "^2.0.0" -"@discord-player/extractor@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@discord-player/extractor/-/extractor-3.0.0.tgz#2baa733da054b991f83417054cad1575cf57c4ab" - integrity sha512-6A2QmrbQXTpv1oequiAYQMnWzvv1fu9Yg0GJwAMoLUXZjvb5Yoak2lnohsDI1Hc14LW//Z5xyLGtmFivTWTXDQ== +"@discord-player/extractor@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@discord-player/extractor/-/extractor-3.0.2.tgz#932b37c881a371279b7b1d1eb35bcab256008a76" + integrity sha512-bVGzucZTYksvsL7TFBhe/8ZzWuDDSc7f1fZYXS5CSu3vYez8ieG8ySAaeHdEbFKhxHIYhvUhvgY1mWcX/3ZBQA== dependencies: genius-lyrics "^4.2.9" jsdom "^16.5.3" From f704f2a82f6da55880ca24eceaef294214c88c5e Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Mon, 14 Jun 2021 19:56:30 +0545 Subject: [PATCH 065/215] chore(deps): bump @discordjs/voice --- package.json | 2 +- yarn.lock | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index e5fed1d..d56539a 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ }, "homepage": "https://discord-player.js.org", "dependencies": { - "@discordjs/voice": "^0.3.1", + "@discordjs/voice": "^0.4.0", "discord-ytdl-core": "^5.0.3", "soundcloud-scraper": "^5.0.0", "spotify-url-info": "^2.2.3", diff --git a/yarn.lock b/yarn.lock index 47c6da1..2d1a3bd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1108,14 +1108,14 @@ "@discordjs/node-pre-gyp" "^0.4.0" node-addon-api "^3.2.1" -"@discordjs/voice@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@discordjs/voice/-/voice-0.3.1.tgz#326ba416454a441161a77884fe5142323e20104a" - integrity sha512-La+tv7sGEu7qPVfweur9nEd9FO+09iGgZu+CIDUKYP2MKAZqq+KE3D0Q5Xy+qF6iIFRXEzu5T+2f9DeKTppCDQ== +"@discordjs/voice@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@discordjs/voice/-/voice-0.4.0.tgz#d5e19f3ee08de2f869e7d057bfff93138fcaf69e" + integrity sha512-2GDs+QOCX525rp4yOzqu8RneTUDGdtyExnJMgXHSwCxmPQDWAMVd3dUiCNqLaCEjsQTMhDGEiThpuSDh6r49KQ== dependencies: "@types/ws" "^7.4.4" discord-api-types "^0.18.1" - prism-media "^1.2.9" + prism-media "^1.3.1" tiny-typed-emitter "^2.0.3" ws "^7.4.4" @@ -3555,6 +3555,11 @@ prism-media@^1.2.9: resolved "https://registry.yarnpkg.com/prism-media/-/prism-media-1.2.9.tgz#8d4f97b36efdfc82483eb8d3db64020767866f36" integrity sha512-UHCYuqHipbTR1ZsXr5eg4JUmHER8Ss4YEb9Azn+9zzJ7/jlTtD1h0lc4g6tNx3eMlB8Mp6bfll0LPMAV4R6r3Q== +prism-media@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/prism-media/-/prism-media-1.3.1.tgz#418acd2b122bedea2e834056d678f9a5ad2943ae" + integrity sha512-nyYAa3KB4qteJIqdguKmwxTJgy55xxUtkJ3uRnOvO5jO+frci+9zpRXw6QZVcfDeva3S654fU9+26P2OSTzjHw== + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" From 7f73e02a60fce1c60171387beded70549fde4874 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Mon, 14 Jun 2021 20:17:37 +0545 Subject: [PATCH 066/215] ytdl options --- src/Player.ts | 4 +++- src/Structures/Queue.ts | 2 +- src/types/types.ts | 5 +++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Player.ts b/src/Player.ts index cfebf98..678eb52 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -18,7 +18,8 @@ const soundcloud = new SoundCloud(); class DiscordPlayer extends EventEmitter { public readonly client: Client; public readonly options: DiscordPlayerInitOptions = { - autoRegisterExtractor: true + autoRegisterExtractor: true, + ytdlOptions: {} }; public readonly queues = new Collection(); public readonly voiceUtils = new VoiceUtils(); @@ -96,6 +97,7 @@ class DiscordPlayer extends EventEmitter { const _meta = queueInitOptions.metadata; delete queueInitOptions["metadata"]; + queueInitOptions.ytdlOptions ??= this.options.ytdlOptions const queue = new Queue(this, guild, queueInitOptions); queue.metadata = _meta; this.queues.set(guild.id, queue); diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 149ab95..93fe306 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -35,7 +35,7 @@ class Queue { leaveOnEmptyCooldown: 1000, autoSelfDeaf: true, enableLive: false, - ytdlDownloadOptions: {}, + ytdlOptions: {}, useSafeSearch: false, disableAutoRegister: false, fetchBeforeQueued: false, diff --git a/src/types/types.ts b/src/types/types.ts index eb5248f..6a2fe35 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -1,10 +1,10 @@ import { Snowflake, User } from "discord.js"; -import { downloadOptions } from "ytdl-core"; import { Readable, Duplex } from "stream"; import { Queue } from "../Structures/Queue"; import Track from "../Structures/Track"; import { Playlist } from "../Structures/Playlist"; import { StreamDispatcher } from "../VoiceInterface/BasicStreamDispatcher"; +import { downloadOptions } from "ytdl-core"; export type FiltersName = keyof QueueFilters; @@ -80,7 +80,7 @@ export interface PlayerOptions { leaveOnEmptyCooldown?: number; autoSelfDeaf?: boolean; enableLive?: boolean; - ytdlDownloadOptions?: downloadOptions; + ytdlOptions?: downloadOptions; useSafeSearch?: boolean; disableAutoRegister?: boolean; fetchBeforeQueued?: boolean; @@ -245,4 +245,5 @@ export interface PlaylistJSON { export interface DiscordPlayerInitOptions { autoRegisterExtractor?: boolean; + ytdlOptions?: downloadOptions; } From b7c2eabff5ea2019d12178539c0e1283527c44d2 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Mon, 14 Jun 2021 20:29:15 +0545 Subject: [PATCH 067/215] some updates --- src/Player.ts | 2 +- src/Structures/Queue.ts | 8 +++++--- src/VoiceInterface/VoiceUtils.ts | 19 +++++++++++++++---- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/Player.ts b/src/Player.ts index 678eb52..230bd3a 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -97,7 +97,7 @@ class DiscordPlayer extends EventEmitter { const _meta = queueInitOptions.metadata; delete queueInitOptions["metadata"]; - queueInitOptions.ytdlOptions ??= this.options.ytdlOptions + queueInitOptions.ytdlOptions ??= this.options.ytdlOptions; const queue = new Queue(this, guild, queueInitOptions); queue.metadata = _meta; this.queues.set(guild.id, queue); diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 93fe306..8f7777c 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -55,7 +55,9 @@ class Queue { async connect(channel: StageChannel | VoiceChannel) { if (!["stage", "voice"].includes(channel?.type)) throw new TypeError(`Channel type must be voice or stage, got ${channel?.type}!`); - const connection = await this.player.voiceUtils.connect(channel); + const connection = await this.player.voiceUtils.connect(channel, { + deaf: this.options.autoSelfDeaf + }); this.connection = connection; // it's ok to use this here since Queue listens to the events 1 time per play and destroys the listener @@ -149,7 +151,8 @@ class Queue { if (!link) return void this.play(this.tracks.shift(), { immediate: true }); stream = ytdl(link, { - // because we don't wanna decode opus into pcm again just for volume, let discord.js handle that + ...this.options.ytdlOptions, + // discord-ytdl-core opusEncoded: false, fmt: "s16le", encoderArgs: options.encoderArgs ?? [], @@ -159,7 +162,6 @@ class Queue { stream = ytdl.arbitraryStream( track.raw.source === "soundcloud" ? await track.raw.engine.downloadProgressive() : typeof track.raw.engine === "function" ? await track.raw.engine() : track.raw.engine, { - // because we don't wanna decode opus into pcm again just for volume, let discord.js handle that opusEncoded: false, fmt: "s16le", encoderArgs: options.encoderArgs ?? [], diff --git a/src/VoiceInterface/VoiceUtils.ts b/src/VoiceInterface/VoiceUtils.ts index ceb39ef..3fce5fa 100644 --- a/src/VoiceInterface/VoiceUtils.ts +++ b/src/VoiceInterface/VoiceUtils.ts @@ -18,18 +18,29 @@ class VoiceUtils { maxTime?: number; } ): Promise { + const conn = await this.join(channel, options); + const sub = new StreamDispatcher(conn, channel); + this.cache.set(channel.guild.id, sub); + return sub; + } + + public async join( + channel: VoiceChannel | StageChannel, + options?: { + deaf?: boolean; + maxTime?: number; + } + ) { let conn = joinVoiceChannel({ guildId: channel.guild.id, channelId: channel.id, adapterCreator: channel.guild.voiceAdapterCreator, - selfDeaf: Boolean(options?.deaf) + selfDeaf: Boolean(options.deaf) }); try { conn = await entersState(conn, VoiceConnectionStatus.Ready, options?.maxTime ?? 20000); - const sub = new StreamDispatcher(conn, channel); - this.cache.set(channel.guild.id, sub); - return sub; + return conn; } catch (err) { conn.destroy(); throw err; From 65e8c0e4f85658688ff6f05031888a4c7fc0d405 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Mon, 14 Jun 2021 23:18:32 +0545 Subject: [PATCH 068/215] remove unused imports --- src/Structures/Queue.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 8f7777c..285f3db 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -1,4 +1,4 @@ -import { Collection, Guild, Snowflake, StageChannel, VoiceChannel } from "discord.js"; +import { Collection, Guild, StageChannel, VoiceChannel } from "discord.js"; import { Player } from "../Player"; import { StreamDispatcher } from "../VoiceInterface/BasicStreamDispatcher"; import Track from "./Track"; From 192a551a30ae4bf344e8371ce7bf3ce5f95490c0 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Mon, 14 Jun 2021 23:36:54 +0545 Subject: [PATCH 069/215] some jsdoc --- src/Structures/Queue.ts | 90 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 89 insertions(+), 1 deletion(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 285f3db..8d5d8dd 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -20,9 +20,29 @@ class Queue { public repeatMode: QueueRepeatMode = 0; public _cooldownsTimeout = new Collection(); + /** + * Queue constructor + * @param {Player} player The player that instantiated this queue + * @param {Guild} guild The guild that instantiated this queue + * @param {PlayerOptions={}} options Player options for the queue + */ constructor(player: Player, guild: Guild, options: PlayerOptions = {}) { + /** + * The player that instantiated this queue + * @type {Player} + */ this.player = player; + + /** + * The guild that instantiated this queue + * @type {Guild} + */ this.guild = guild; + + /** + * The player options for this queue + * @type {PlayerOptions} + */ this.options = {}; Object.assign( @@ -45,14 +65,27 @@ class Queue { ); } + /** + * Returns current track + * @returns {Track} + */ get current() { return this.connection.audioResource?.metadata ?? this.tracks[0]; } + /** + * Returns current track + * @returns {Track} + */ nowPlaying() { return this.current; } + /** + * Connects to a voice channel + * @param {StageChannel|VoiceChannel} channel + * @returns {Promise} + */ async connect(channel: StageChannel | VoiceChannel) { if (!["stage", "voice"].includes(channel?.type)) throw new TypeError(`Channel type must be voice or stage, got ${channel?.type}!`); const connection = await this.player.voiceUtils.connect(channel, { @@ -73,45 +106,80 @@ class Queue { return this; } + /** + * Destroys this queue + */ destroy() { this.connection.end(); this.connection.disconnect(); this.player.queues.delete(this.guild.id); } + /** + * Skips current track + * @returns {boolean} + */ skip() { if (!this.connection) return false; this.connection.end(); return true; } + /** + * Adds single track to the queue + * @param {Track} track The track to add + * @returns {void} + */ addTrack(track: Track) { this.tracks.push(track); this.player.emit("trackAdd", this, track); } + + /** + * Adds multiple tracks to the queue + * @param {Track[]} tracks Array of tracks to add + */ addTracks(tracks: Track[]) { this.tracks.push(...tracks); this.player.emit("tracksAdd", this, tracks); } + /** + * Sets paused state + * @param {boolean} paused The paused state + * @returns {boolean} + */ setPaused(paused?: boolean) { if (!this.connection) return false; return paused ? this.connection.pause() : this.connection.resume(); } + /** + * Sets bitrate + * @param {number|"auto"} bitrate bitrate to set + */ setBitrate(bitrate: number | "auto") { if (!this.connection?.audioResource?.encoder) return; if (bitrate === "auto") bitrate = this.connection.channel?.bitrate ?? 64000; this.connection.audioResource.encoder.setBitrate(bitrate); } + /** + * Sets volume + * @param {number} amount The volume amount + * @returns {boolean} + */ setVolume(amount: number) { if (!this.connection) return false; this.options.initialVolume = amount; return this.connection.setVolume(amount); } - + /** + * Sets repeat mode + * @param {QueueRepeatMode} mode The repeat mode + * @returns {boolean} + */ setRepeatMode(mode: QueueRepeatMode) { if (![QueueRepeatMode.OFF, QueueRepeatMode.QUEUE, QueueRepeatMode.TRACK].includes(mode)) throw new Error(`Unknown repeat mode "${mode}"!`); const prev = this.repeatMode; @@ -120,15 +188,27 @@ class Queue { return true; } + /** + * Returns current volume amount + */ get volume() { if (!this.connection) return 100; return this.connection.volume; } + /** + * Plays previous track + * @returns {Promise} + */ async back() { return await this.play(Util.last(this.previousTracks), { immediate: true }); } + /** + * @param {Track} [src] The track to play (if empty, uses first track from the queue) + * @param {PlayOptions={}} options The options + * @returns {Promise} + */ async play(src?: Track, options: PlayOptions = {}): Promise { if (!this.connection || !this.connection.voiceConnection) throw new Error("Voice connection is not available, use .connect()!"); if (src && (this.playing || this.tracks.length) && !options.immediate) return this.addTrack(src); @@ -204,6 +284,10 @@ class Queue { yield* this.tracks; } + /** + * JSON representation of this queue + * @returns {object} + */ toJSON() { return { guild: this.guild.id, @@ -212,6 +296,10 @@ class Queue { }; } + /** + * String representation of this queue + * @returns {string} + */ toString() { if (!this.tracks.length) return "No songs available to display!"; return `**Upcoming Songs:**\n${this.tracks.map((m, i) => `${i + 1}. **${m.title}**`).join("\n")}`; From a74e95ed161f0c03f1e40dde0dd5789cb553fea8 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Tue, 15 Jun 2021 15:58:09 +0545 Subject: [PATCH 070/215] raw getter to value --- src/Structures/Track.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Structures/Track.ts b/src/Structures/Track.ts index 907b169..6bcaab0 100644 --- a/src/Structures/Track.ts +++ b/src/Structures/Track.ts @@ -15,7 +15,7 @@ class Track { public views!: number; public requestedBy!: User; public playlist?: Playlist; - public readonly raw!: RawTrackData; + public readonly raw: RawTrackData = {} as RawTrackData; public readonly _trackID = Date.now(); /** @@ -106,7 +106,7 @@ class Track { this.playlist = data.playlist; // raw - Object.defineProperty(this, "raw", { get: () => Object.assign({}, { source: data.raw?.source ?? data.source }, data.raw ?? data), enumerable: false }); + Object.defineProperty(this, "raw", { value: Object.assign({}, { source: data.raw?.source ?? data.source }, data.raw ?? data), enumerable: false }); } /** From 38db66487182cb7fd76ff9c777acef7d1d58a0e6 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Tue, 15 Jun 2021 15:58:21 +0545 Subject: [PATCH 071/215] prettier --- src/Structures/Queue.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 8d5d8dd..d050469 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -135,7 +135,6 @@ class Queue { this.player.emit("trackAdd", this, track); } - /** * Adds multiple tracks to the queue * @param {Track[]} tracks Array of tracks to add From 4ed330958c5a0dcabf36939db5c12fb46c93c4c1 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Thu, 17 Jun 2021 19:07:03 +0545 Subject: [PATCH 072/215] update lot of things --- example/index.ts | 14 ++++---- package.json | 4 +-- src/Player.ts | 24 ++++++++----- src/Structures/Playlist.ts | 2 +- src/Structures/Queue.ts | 9 ++++- src/Structures/Track.ts | 4 +-- src/VoiceInterface/BasicStreamDispatcher.ts | 39 ++++++++++++--------- src/index.ts | 1 + src/utils/Util.ts | 4 +++ yarn.lock | 16 ++++----- 10 files changed, 71 insertions(+), 46 deletions(-) diff --git a/example/index.ts b/example/index.ts index 80f5a42..a62920d 100644 --- a/example/index.ts +++ b/example/index.ts @@ -1,7 +1,6 @@ -import { Client, GuildMember, Message, TextChannel } from "discord.js"; -import { Player, Queue, Track } from "../src/index"; -import { QueryType, QueueRepeatMode } from "../src/types/types"; +import { Client, GuildMember, TextChannel } from "discord.js"; import { config } from "./config"; +import { Player, Queue, QueryType, QueueRepeatMode } from "../src/index"; // use this in prod. // import { Player, Queue } from "discord-player"; @@ -23,10 +22,6 @@ client.on("warn", console.warn); const player = new Player(client); player.on("error", console.error); -player.on("debug", (queue, message) => { - console.log(`DEBUG :: ${queue.guild.name}`); - console.log(message); -}); player.on("trackStart", (queue, track) => { const guildQueue = queue as Queue; @@ -48,6 +43,11 @@ player.on("channelEmpty", (queue) => { guildQueue.metadata.send("❌ | Nobody is in the voice channel, leaving..."); }); +player.on("queueEnd", (queue) => { + const guildQueue = queue as Queue; + guildQueue.metadata.send("✅ | Queue finished!"); +}); + client.on("message", async (message) => { if (message.author.bot || !message.guild) return; if (!client.application?.owner) await client.application?.fetch(); diff --git a/package.json b/package.json index d56539a..d2a2257 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ }, "homepage": "https://discord-player.js.org", "dependencies": { - "@discordjs/voice": "^0.4.0", + "@discordjs/voice": "^0.5.0", "discord-ytdl-core": "^5.0.3", "soundcloud-scraper": "^5.0.0", "spotify-url-info": "^2.2.3", @@ -68,7 +68,7 @@ "@types/node": "^15.12.2", "@types/ws": "^7.4.4", "discord-api-types": "^0.18.1", - "discord.js": "^13.0.0-dev.02693bc02f45980d8165820a103220f0027b96b7", + "discord.js": "^13.0.0-dev.a3cbcca13da1af416c219bd64a0a6e84bb87a057", "discord.js-docgen": "discordjs/docgen#ts-patch", "jsdoc-babel": "^0.5.0", "prettier": "^2.3.1", diff --git a/src/Player.ts b/src/Player.ts index 230bd3a..7e4b9d0 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -1,4 +1,4 @@ -import { Client, Collection, Guild, Snowflake, VoiceState } from "discord.js"; +import { Client, Collection, Guild, GuildResolvable, Snowflake, VoiceState } from "discord.js"; import { TypedEmitter as EventEmitter } from "tiny-typed-emitter"; import { Queue } from "./Structures/Queue"; import { VoiceUtils } from "./VoiceInterface/VoiceUtils"; @@ -88,11 +88,13 @@ class DiscordPlayer extends EventEmitter { /** * Creates a queue for a guild if not available, else returns existing queue - * @param {Discord.Guild} guild The guild + * @param {GuildResolvable} guild The guild * @param {PlayerOptions} queueInitOptions Queue init options * @returns {Queue} */ - createQueue(guild: Guild, queueInitOptions?: PlayerOptions & { metadata?: T }): Queue { + createQueue(guild: GuildResolvable, queueInitOptions?: PlayerOptions & { metadata?: T }): Queue { + guild = this.client.guilds.resolve(guild); + if (!guild) throw new Error("Unknown Guild"); if (this.queues.has(guild.id)) return this.queues.get(guild.id) as Queue; const _meta = queueInitOptions.metadata; @@ -107,25 +109,29 @@ class DiscordPlayer extends EventEmitter { /** * Returns the queue if available - * @param {Discord.Snowflake} guild The guild id + * @param {GuildResolvable} guild The guild id * @returns {Queue} */ - getQueue(guild: Snowflake) { - return this.queues.get(guild) as Queue; + getQueue(guild: GuildResolvable) { + guild = this.client.guilds.resolve(guild); + if (!guild) throw new Error("Unknown Guild"); + return this.queues.get(guild.id) as Queue; } /** * Deletes a queue and returns deleted queue object - * @param {Discord.Snowflake} guild The guild id to remove + * @param {GuildResolvable} guild The guild id to remove * @returns {Queue} */ - deleteQueue(guild: Snowflake) { + deleteQueue(guild: GuildResolvable) { + guild = this.client.guilds.resolve(guild); + if (!guild) throw new Error("Unknown Guild"); const prev = this.getQueue(guild); try { prev.destroy(); } catch {} - this.queues.delete(guild); + this.queues.delete(guild.id); return prev; } diff --git a/src/Structures/Playlist.ts b/src/Structures/Playlist.ts index c381090..bcdb7d0 100644 --- a/src/Structures/Playlist.ts +++ b/src/Structures/Playlist.ts @@ -48,7 +48,7 @@ class Playlist { tracks: [] as TrackJSON[] }; - if (withTracks) payload.tracks = this.tracks.map((m) => m.toJSON()); + if (withTracks) payload.tracks = this.tracks.map((m) => m.toJSON(true)); return payload as PlaylistJSON; } diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index d050469..e586324 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -59,7 +59,7 @@ class Queue { useSafeSearch: false, disableAutoRegister: false, fetchBeforeQueued: false, - initialVolume: 100 + initialVolume: 50 } as PlayerOptions, options ); @@ -195,6 +195,13 @@ class Queue { return this.connection.volume; } + /** + * Alternative volume setter + */ + set volume(amount: number) { + this.setVolume(amount); + } + /** * Plays previous track * @returns {Promise} diff --git a/src/Structures/Track.ts b/src/Structures/Track.ts index 6bcaab0..9d3a2b6 100644 --- a/src/Structures/Track.ts +++ b/src/Structures/Track.ts @@ -155,7 +155,7 @@ class Track { * Raw JSON representation of this track * @returns {object} */ - toJSON() { + toJSON(hidePlaylist?: boolean) { return { title: this.title, description: this.description, @@ -166,7 +166,7 @@ class Track { durationMS: this.durationMS, views: this.views, requestedBy: this.requestedBy.id, - playlist: this.playlist?.toJSON(false) ?? null + playlist: hidePlaylist ? null : this.playlist?.toJSON(false) ?? null } as TrackJSON; } } diff --git a/src/VoiceInterface/BasicStreamDispatcher.ts b/src/VoiceInterface/BasicStreamDispatcher.ts index cabd202..57fc0b9 100644 --- a/src/VoiceInterface/BasicStreamDispatcher.ts +++ b/src/VoiceInterface/BasicStreamDispatcher.ts @@ -8,12 +8,14 @@ import { entersState, StreamType, VoiceConnection, - VoiceConnectionStatus + VoiceConnectionStatus, + VoiceConnectionDisconnectReason } from "@discordjs/voice"; import { StageChannel, VoiceChannel } from "discord.js"; import { Duplex, Readable } from "stream"; import { TypedEmitter as EventEmitter } from "tiny-typed-emitter"; import Track from "../Structures/Track"; +import { Util } from "../utils/Util"; export interface VoiceEvents { error: (error: AudioPlayerError) => any; @@ -26,8 +28,8 @@ class BasicStreamDispatcher extends EventEmitter { public readonly voiceConnection: VoiceConnection; public readonly audioPlayer: AudioPlayer; public readonly channel: VoiceChannel | StageChannel; - public connectPromise?: Promise; public audioResource?: AudioResource; + private readyLock: boolean = false; constructor(connection: VoiceConnection, channel: VoiceChannel | StageChannel) { super(); @@ -36,26 +38,31 @@ class BasicStreamDispatcher extends EventEmitter { this.audioPlayer = createAudioPlayer(); this.channel = channel; - this.voiceConnection.on("stateChange", (_, newState) => { + this.voiceConnection.on("stateChange", async (_, newState) => { if (newState.status === VoiceConnectionStatus.Disconnected) { - if (this.voiceConnection.reconnectAttempts < 5) { - setTimeout(() => { - if (this.voiceConnection.state.status === VoiceConnectionStatus.Disconnected) { - this.voiceConnection.reconnect(); - } - }, (this.voiceConnection.reconnectAttempts + 1) * 5000).unref(); + if (newState.reason === VoiceConnectionDisconnectReason.WebSocketClose && newState.closeCode === 4014) { + try { + await entersState(this.voiceConnection, VoiceConnectionStatus.Connecting, 5000); + } catch { + this.voiceConnection.destroy(); + } + } else if (this.voiceConnection.rejoinAttempts < 5) { + await Util.wait((this.voiceConnection.rejoinAttempts + 1) * 5000); + this.voiceConnection.rejoin(); } else { this.voiceConnection.destroy(); } } else if (newState.status === VoiceConnectionStatus.Destroyed) { this.end(); - } else if (!this.connectPromise && (newState.status === VoiceConnectionStatus.Connecting || newState.status === VoiceConnectionStatus.Signalling)) { - this.connectPromise = entersState(this.voiceConnection, VoiceConnectionStatus.Ready, 20000) - .then(() => undefined) - .catch(() => { - if (this.voiceConnection.state.status !== VoiceConnectionStatus.Destroyed) this.voiceConnection.destroy(); - }) - .finally(() => (this.connectPromise = undefined)); + } else if (!this.readyLock && (newState.status === VoiceConnectionStatus.Connecting || newState.status === VoiceConnectionStatus.Signalling)) { + this.readyLock = true; + try { + await entersState(this.voiceConnection, VoiceConnectionStatus.Ready, 20000); + } catch { + if (this.voiceConnection.state.status !== VoiceConnectionStatus.Destroyed) this.voiceConnection.destroy(); + } finally { + this.readyLock = false; + } } }); diff --git a/src/index.ts b/src/index.ts index 1d5c948..2cae5d4 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,3 +6,4 @@ export { Queue } from "./Structures/Queue"; export { Track } from "./Structures/Track"; export { VoiceUtils } from "./VoiceInterface/VoiceUtils"; export { VoiceEvents, StreamDispatcher } from "./VoiceInterface/BasicStreamDispatcher"; +export * from "./types/types"; diff --git a/src/utils/Util.ts b/src/utils/Util.ts index 6489b6e..7d7488a 100644 --- a/src/utils/Util.ts +++ b/src/utils/Util.ts @@ -47,6 +47,10 @@ class Util { return null; } } + + static wait(time: number) { + return new Promise((r) => setTimeout(r, time).unref()); + } } export { Util }; diff --git a/yarn.lock b/yarn.lock index 2d1a3bd..97a7d61 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1108,10 +1108,10 @@ "@discordjs/node-pre-gyp" "^0.4.0" node-addon-api "^3.2.1" -"@discordjs/voice@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@discordjs/voice/-/voice-0.4.0.tgz#d5e19f3ee08de2f869e7d057bfff93138fcaf69e" - integrity sha512-2GDs+QOCX525rp4yOzqu8RneTUDGdtyExnJMgXHSwCxmPQDWAMVd3dUiCNqLaCEjsQTMhDGEiThpuSDh6r49KQ== +"@discordjs/voice@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@discordjs/voice/-/voice-0.5.0.tgz#238d6f8c1dc7e30ff781edb08fb0540bca5aa23d" + integrity sha512-YPfY8ium1lExmRETz+vC4d3gGvHhGvWQMWLTOkNBoUkN6VyEpO/RVrL5EI+0qUefKAWwv2Gus/c7QM1xhAUwow== dependencies: "@types/ws" "^7.4.4" discord-api-types "^0.18.1" @@ -2007,10 +2007,10 @@ discord.js-docgen@discordjs/docgen#ts-patch: tsubaki "^1.3.2" yargs "^14.0.0" -discord.js@^13.0.0-dev.02693bc02f45980d8165820a103220f0027b96b7: - version "13.0.0-dev.02693bc02f45980d8165820a103220f0027b96b7" - resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0-dev.02693bc02f45980d8165820a103220f0027b96b7.tgz#5baa6c758b970a1e6175d06373d4ab33eb6a4164" - integrity sha512-nzbmF5MLSjpdr8DS7SpC9q291NQ8XkHlledM4lz+uFJ4YgnMmTpi6e0FgF7v2kpTJPqTsXDRY3rWBv6Dat+08A== +discord.js@^13.0.0-dev.a3cbcca13da1af416c219bd64a0a6e84bb87a057: + version "13.0.0-dev.a3cbcca13da1af416c219bd64a0a6e84bb87a057" + resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0-dev.a3cbcca13da1af416c219bd64a0a6e84bb87a057.tgz#7358b44985b2423f1fdb1a9c259d26de74d662f7" + integrity sha512-9EFBA08VUt9hIZzgQ1IcNv3/EwLvo4N9RikEzv/qNYjRvonnKi70tp0dpChduM8GFxgqrcTEa2mZJGfuumBBHA== dependencies: "@discordjs/collection" "^0.1.6" "@discordjs/form-data" "^3.0.1" From b2197d4f486745fedd71ddcf71480acb997a2964 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Thu, 17 Jun 2021 19:11:30 +0545 Subject: [PATCH 073/215] jsdoc correction --- src/Player.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Player.ts b/src/Player.ts index 7e4b9d0..f0f5791 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -27,14 +27,14 @@ class DiscordPlayer extends EventEmitter { /** * Creates new Discord Player - * @param {Discord.Client} client The Discord Client + * @param {Client} client The Discord Client */ constructor(client: Client, options: DiscordPlayerInitOptions = {}) { super(); /** * The discord.js client - * @type {Discord.Client} + * @type {Client} */ this.client = client; @@ -139,7 +139,7 @@ class DiscordPlayer extends EventEmitter { /** * Search tracks * @param {string|Track} query The search query - * @param {Discord.User} requestedBy The person who requested track search + * @param {User} requestedBy The person who requested track search * @returns {Promise<{playlist?: Playlist; tracks: Track[]}>} */ async search(query: string | Track, options: SearchOptions) { From 687b00142684708de816133e71c97c88ef0f159e Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Thu, 17 Jun 2021 19:26:11 +0545 Subject: [PATCH 074/215] remove unnecessary file --- src/utils/Constants.ts | 1 - 1 file changed, 1 deletion(-) delete mode 100644 src/utils/Constants.ts diff --git a/src/utils/Constants.ts b/src/utils/Constants.ts deleted file mode 100644 index cb0ff5c..0000000 --- a/src/utils/Constants.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; From 233a24dd34b6bce0df496e3f967d922ae5996e5f Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Thu, 17 Jun 2021 19:46:07 +0545 Subject: [PATCH 075/215] feat(Player#search): change User to UserResolvable --- src/Player.ts | 15 ++++++++------- src/types/types.ts | 4 ++-- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/Player.ts b/src/Player.ts index f0f5791..e07386a 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -1,4 +1,4 @@ -import { Client, Collection, Guild, GuildResolvable, Snowflake, VoiceState } from "discord.js"; +import { Client, Collection, Guild, GuildResolvable, Snowflake, User, UserResolvable, VoiceState } from "discord.js"; import { TypedEmitter as EventEmitter } from "tiny-typed-emitter"; import { Queue } from "./Structures/Queue"; import { VoiceUtils } from "./VoiceInterface/VoiceUtils"; @@ -139,12 +139,13 @@ class DiscordPlayer extends EventEmitter { /** * Search tracks * @param {string|Track} query The search query - * @param {User} requestedBy The person who requested track search + * @param {UserResolvable} requestedBy The person who requested track search * @returns {Promise<{playlist?: Playlist; tracks: Track[]}>} */ async search(query: string | Track, options: SearchOptions) { if (query instanceof Track) return { playlist: null, tracks: [query] }; if (!options) throw new Error("DiscordPlayer#search needs search options!"); + options.requestedBy = this.client.users.resolve(options.requestedBy); if (!("searchEngine" in options)) options.searchEngine = QueryType.AUTO; for (const [_, extractor] of this.extractors) { @@ -162,7 +163,7 @@ class DiscordPlayer extends EventEmitter { (m) => new Track(this, { ...m, - requestedBy: options.requestedBy, + requestedBy: options.requestedBy as User, duration: Util.buildTimeCode(Util.parseMS(m.duration)), playlist: playlist }) @@ -189,7 +190,7 @@ class DiscordPlayer extends EventEmitter { description: m.description, author: m.channel?.name, url: m.url, - requestedBy: options.requestedBy, + requestedBy: options.requestedBy as User, thumbnail: m.thumbnail?.displayThumbnailURL("maxresdefault"), views: m.views, duration: m.durationFormatted, @@ -284,7 +285,7 @@ class DiscordPlayer extends EventEmitter { thumbnail: spotifyPlaylist.images[0]?.url ?? "https://www.scdn.co/i/_global/twitter_card-default.jpg", duration: Util.buildTimeCode(Util.parseMS(m.duration_ms)), views: 0, - requestedBy: options.requestedBy, + requestedBy: options.requestedBy as User, playlist, source: "spotify" }); @@ -301,7 +302,7 @@ class DiscordPlayer extends EventEmitter { thumbnail: m.track.album?.images[0]?.url ?? "https://www.scdn.co/i/_global/twitter_card-default.jpg", duration: Util.buildTimeCode(Util.parseMS(m.track.duration_ms)), views: 0, - requestedBy: options.requestedBy, + requestedBy: options.requestedBy as User, playlist, source: "spotify" }); @@ -381,7 +382,7 @@ class DiscordPlayer extends EventEmitter { description: video.description, author: video.channel?.name, url: video.url, - requestedBy: options.requestedBy, + requestedBy: options.requestedBy as User, thumbnail: video.thumbnail.url, views: video.views, duration: video.durationFormatted, diff --git a/src/types/types.ts b/src/types/types.ts index 6a2fe35..fbe7c71 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -1,4 +1,4 @@ -import { Snowflake, User } from "discord.js"; +import { Snowflake, User, UserResolvable } from "discord.js"; import { Readable, Duplex } from "stream"; import { Queue } from "../Structures/Queue"; import Track from "../Structures/Track"; @@ -189,7 +189,7 @@ export interface PlayOptions { } export interface SearchOptions { - requestedBy: User; + requestedBy: UserResolvable; searchEngine?: QueryType; } From 0619462f2cf3b97dcaffac855f53992e893e4223 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Fri, 18 Jun 2021 00:02:55 +0545 Subject: [PATCH 076/215] Player#use & Player#unuse should return the extractor --- src/Player.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Player.ts b/src/Player.ts index e07386a..c535f39 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -399,12 +399,12 @@ class DiscordPlayer extends EventEmitter { } } - use(extractorName: string, extractor: ExtractorModel | any, force = false) { + use(extractorName: string, extractor: ExtractorModel | any, force = false): ExtractorModel { if (!extractorName) throw new Error("Cannot use unknown extractor!"); - if (this.extractors.has(extractorName) && !force) return this; + if (this.extractors.has(extractorName) && !force) return this.extractors.get(extractorName); if (extractor instanceof ExtractorModel) { this.extractors.set(extractorName, extractor); - return this; + return extractor; } for (const method of ["validate", "getInfo"]) { @@ -414,12 +414,14 @@ class DiscordPlayer extends EventEmitter { const model = new ExtractorModel(extractorName, extractor); this.extractors.set(model.name, model); - return this; + return model; } unuse(extractorName: string) { if (!this.extractors.has(extractorName)) throw new Error(`Cannot find extractor "${extractorName}"`); + const prev = this.extractors.get(extractorName); this.extractors.delete(extractorName); + return prev; } *[Symbol.iterator]() { From 315d94acfea6fd81814e8438ad0659a6d0156566 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Fri, 18 Jun 2021 00:29:37 +0545 Subject: [PATCH 077/215] catch stream errors --- src/Structures/Queue.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index e586324..d27a00d 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -243,7 +243,7 @@ class Queue { fmt: "s16le", encoderArgs: options.encoderArgs ?? [], seek: options.seek - }); + }).on("error", (err) => this.player.emit("error", this, err)); } else { stream = ytdl.arbitraryStream( track.raw.source === "soundcloud" ? await track.raw.engine.downloadProgressive() : typeof track.raw.engine === "function" ? await track.raw.engine() : track.raw.engine, @@ -253,7 +253,7 @@ class Queue { encoderArgs: options.encoderArgs ?? [], seek: options.seek } - ); + ).on("error", (err) => this.player.emit("error", this, err)); } const resource: AudioResource = this.connection.createStream(stream, { From bfd88e8d421d0a00ac18d2398d47572717774a3f Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Fri, 18 Jun 2021 00:54:02 +0545 Subject: [PATCH 078/215] updates --- README.md | 31 +++++++++++++++++++++++++------ src/Structures/Queue.ts | 27 ++++++++++++++------------- src/types/types.ts | 1 - 3 files changed, 39 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 7929f14..46fac3f 100644 --- a/README.md +++ b/README.md @@ -46,13 +46,13 @@ Here is the code you will need to get started with discord-player. Then, you wil ```js const Discord = require("discord.js"), -client = new Discord.Client, +client = new Discord.Client({ intents: ["GUILD_VOICE_STATES", "GUILD_MESSAGES", "GUILDS"] }), settings = { prefix: "!", token: "Your Discord Token" }; -const { Player } = require("discord-player"); +const { Player, QueryType } = require("discord-player"); // Create a new Player (you don't need any API Key) const player = new Player(client); @@ -61,7 +61,7 @@ const player = new Player(client); client.player = player; // add the trackStart event so when a song will be played this message will be sent -client.player.on("trackStart", (message, track) => message.channel.send(`Now playing ${track.title}...`)) +client.player.on("trackStart", (queue, track) => queue.metadata.channel.send(`Now playing ${track.title}...`)) client.once("ready", () => { console.log("I'm ready !"); @@ -74,9 +74,28 @@ client.on("message", async (message) => { // !play Despacito // will play "Despacito" in the voice channel - if(command === "play"){ - client.player.play(message, args[0]); - // as we registered the event above, no need to send a success message here + if (command === "play") { + if (!message.member.voice.channel) return void message.reply("You are not in a voice channel!"); + if (message.guild.me.voice.channel && message.member.voice.channelID !== message.guild.me.voice.channelID) return void message.reply("You are not in my voice channel!"); + + const queue = client.player.createQueue(message.guild, { + metadata: message + }); + + // verify vc connection + try { + if (!queue.connection) await queue.connect(message.member.voice.channel); + } catch { + queue.destroy(); + return void message.reply("Could not join your voice channel!"); + } + + const track = await client.player.search(args[0], { + searchEngine: QueryType.YOUTUBE_SEARCH + }).then(x => x.tracks[1]); + if (!track) return void message.reply("Track not found!"); + + queue.play(track); } }); diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index d27a00d..c690b59 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -49,7 +49,6 @@ class Queue { this.options, { leaveOnEnd: true, - leaveOnEndCooldown: 1000, leaveOnStop: true, leaveOnEmpty: true, leaveOnEmptyCooldown: 1000, @@ -109,9 +108,9 @@ class Queue { /** * Destroys this queue */ - destroy() { + destroy(disconnect = this.options.leaveOnStop) { this.connection.end(); - this.connection.disconnect(); + if (disconnect) this.connection.disconnect(); this.player.queues.delete(this.guild.id); } @@ -245,15 +244,17 @@ class Queue { seek: options.seek }).on("error", (err) => this.player.emit("error", this, err)); } else { - stream = ytdl.arbitraryStream( - track.raw.source === "soundcloud" ? await track.raw.engine.downloadProgressive() : typeof track.raw.engine === "function" ? await track.raw.engine() : track.raw.engine, - { - opusEncoded: false, - fmt: "s16le", - encoderArgs: options.encoderArgs ?? [], - seek: options.seek - } - ).on("error", (err) => this.player.emit("error", this, err)); + stream = ytdl + .arbitraryStream( + track.raw.source === "soundcloud" ? await track.raw.engine.downloadProgressive() : typeof track.raw.engine === "function" ? await track.raw.engine() : track.raw.engine, + { + opusEncoded: false, + fmt: "s16le", + encoderArgs: options.encoderArgs ?? [], + seek: options.seek + } + ) + .on("error", (err) => this.player.emit("error", this, err)); } const resource: AudioResource = this.connection.createStream(stream, { @@ -275,7 +276,7 @@ class Queue { if (options.filtersUpdate) return; if (!this.tracks.length && this.repeatMode === QueueRepeatMode.OFF) { - this.destroy(); + if (this.options.leaveOnEnd) this.destroy(); this.player.emit("queueEnd", this); } else { if (this.repeatMode === QueueRepeatMode.TRACK) return void this.play(Util.last(this.previousTracks), { immediate: true }); diff --git a/src/types/types.ts b/src/types/types.ts index fbe7c71..2b4bd47 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -74,7 +74,6 @@ export interface PlayerProgressbarOptions { export interface PlayerOptions { leaveOnEnd?: boolean; - leaveOnEndCooldown?: number; leaveOnStop?: boolean; leaveOnEmpty?: boolean; leaveOnEmptyCooldown?: number; From 7ae60f0bbfbaf45072ba7d4ea85b13197049fbb2 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sat, 19 Jun 2021 17:58:39 +0545 Subject: [PATCH 079/215] dev --- .gitignore | 4 +- README.md | 4 +- example/config.example.ts | 3 - example/index.ts | 268 -------------------------------------- package.json | 4 +- yarn.lock | 21 +-- 6 files changed, 20 insertions(+), 284 deletions(-) delete mode 100644 example/config.example.ts delete mode 100644 example/index.ts diff --git a/.gitignore b/.gitignore index 2991299..e0c9b06 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,6 @@ lib yarn*.log # example -example/config.ts \ No newline at end of file +example/test + +test/ \ No newline at end of file diff --git a/README.md b/README.md index 46fac3f..87767cc 100644 --- a/README.md +++ b/README.md @@ -134,7 +134,7 @@ These bots are made by the community, they can help you build your own! ```js const player = new Player(client, { - ytdlDownloadOptions: { + ytdlOptions: { requestOptions: { headers: { cookie: "YOUR_YOUTUBE_COOKIE" @@ -154,7 +154,7 @@ const proxy = "http://user:pass@111.111.111.111:8080"; const agent = HttpsProxyAgent(proxy); const player = new Player(client, { - ytdlDownloadOptions: { + ytdlOptions: { requestOptions: { agent } } }); diff --git a/example/config.example.ts b/example/config.example.ts deleted file mode 100644 index 83c37ee..0000000 --- a/example/config.example.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const config = { - token: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" -}; diff --git a/example/index.ts b/example/index.ts deleted file mode 100644 index a62920d..0000000 --- a/example/index.ts +++ /dev/null @@ -1,268 +0,0 @@ -import { Client, GuildMember, TextChannel } from "discord.js"; -import { config } from "./config"; -import { Player, Queue, QueryType, QueueRepeatMode } from "../src/index"; -// use this in prod. -// import { Player, Queue } from "discord-player"; - -const client = new Client({ - intents: ["GUILD_VOICE_STATES", "GUILD_MESSAGES", "GUILDS"] -}); - -client.on("ready", () => { - console.log("Bot is online!"); - client.user.setActivity({ - name: "🎶 | Music Time", - type: "LISTENING" - }); -}); -client.on("error", console.error); -client.on("warn", console.warn); - -// instantiate the player -const player = new Player(client); - -player.on("error", console.error); - -player.on("trackStart", (queue, track) => { - const guildQueue = queue as Queue; - guildQueue.metadata.send(`🎶 | Started playing: **${track.title}** in **${guildQueue.connection.channel.name}**!`); -}); - -player.on("trackAdd", (queue, track) => { - const guildQueue = queue as Queue; - guildQueue.metadata.send(`🎶 | Track **${track.title}** queued!`); -}); - -player.on("botDisconnect", (queue) => { - const guildQueue = queue as Queue; - guildQueue.metadata.send("❌ | I was manually disconnected from the voice channel, clearing queue!"); -}); - -player.on("channelEmpty", (queue) => { - const guildQueue = queue as Queue; - guildQueue.metadata.send("❌ | Nobody is in the voice channel, leaving..."); -}); - -player.on("queueEnd", (queue) => { - const guildQueue = queue as Queue; - guildQueue.metadata.send("✅ | Queue finished!"); -}); - -client.on("message", async (message) => { - if (message.author.bot || !message.guild) return; - if (!client.application?.owner) await client.application?.fetch(); - - if (message.content === "!deploy" && message.author.id === client.application?.owner?.id) { - await message.guild.commands.set([ - { - name: "play", - description: "Plays a song from youtube", - options: [ - { - name: "query", - type: "STRING", - description: "The song you want to play", - required: true - } - ] - }, - { - name: "soundcloud", - description: "Plays a song from soundcloud", - options: [ - { - name: "query", - type: "STRING", - description: "The song you want to play", - required: true - } - ] - }, - { - name: "volume", - description: "Sets music volume", - options: [ - { - name: "amount", - type: "INTEGER", - description: "The volume amount to set (0-100)", - required: false - } - ] - }, - { - name: "loop", - description: "Sets loop mode", - options: [ - { - name: "mode", - type: "INTEGER", - description: "Loop type", - required: true, - choices: [ - { - name: "Off", - value: 0 - }, - { - name: "Track", - value: 1 - }, - { - name: "Queue", - value: 2 - } - ] - } - ] - }, - { - name: "skip", - description: "Skip to the current song" - }, - { - name: "queue", - description: "See the queue" - }, - { - name: "pause", - description: "Pause the current song" - }, - { - name: "resume", - description: "Resume the current song" - }, - { - name: "stop", - description: "Stop the player" - }, - { - name: "np", - description: "Now Playing" - } - ]); - - await message.reply("Deployed!"); - } -}); - -client.on("interaction", async (interaction) => { - if (!interaction.isCommand() || !interaction.guildID) return; - - if (!(interaction.member instanceof GuildMember) || !interaction.member.voice.channel) { - return void interaction.reply({ content: "You are not in a voice channel!", ephemeral: true }); - } - - if (interaction.guild.me.voice.channelID && interaction.member.voice.channelID !== interaction.guild.me.voice.channelID) { - return void interaction.reply({ content: "You are not in my voice channel!", ephemeral: true }); - } - - if (interaction.commandName === "play" || interaction.commandName === "soundcloud") { - await interaction.defer(); - - const query = interaction.options.get("query")!.value! as string; - const searchResult = await player - .search(query, { - requestedBy: interaction.user, - searchEngine: interaction.commandName === "soundcloud" ? QueryType.SOUNDCLOUD_SEARCH : QueryType.AUTO - }) - .catch(() => {}); - if (!searchResult || !searchResult.tracks.length) return void interaction.followUp({ content: "No results were found!" }); - - const queue = await player.createQueue(interaction.guild, { - metadata: interaction.channel as TextChannel - }); - - try { - if (!queue.connection) await queue.connect(interaction.member.voice.channel); - } catch { - void player.deleteQueue(interaction.guildID); - return void interaction.followUp({ content: "Could not join your voice channel!" }); - } - - await interaction.followUp({ content: "⏱ | Loading your track..." }); - searchResult.playlist ? queue.addTracks(searchResult.tracks) : queue.addTrack(searchResult.tracks[0]); - if (!queue.playing) await queue.play(); - } else if (interaction.commandName === "volume") { - await interaction.defer(); - const queue = player.getQueue(interaction.guildID); - if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); - const vol = interaction.options.get("amount"); - if (!vol) return void interaction.followUp({ content: `🎧 | Current volume is **${queue.volume}**%!` }); - if ((vol.value as number) < 0 || (vol.value as number) > 100) return void interaction.followUp({ content: "❌ | Volume range must be 0-100" }); - const success = queue.setVolume(vol.value as number); - return void interaction.followUp({ - content: success ? `✅ | Volume set to **${vol.value}%**!` : "❌ | Something went wrong!" - }); - } else if (interaction.commandName === "skip") { - await interaction.defer(); - const queue = player.getQueue(interaction.guildID); - if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); - const currentTrack = queue.current; - const success = queue.skip(); - return void interaction.followUp({ - content: success ? `✅ | Skipped **${currentTrack}**!` : "❌ | Something went wrong!" - }); - } else if (interaction.commandName === "queue") { - await interaction.defer(); - const queue = player.getQueue(interaction.guildID); - if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); - const currentTrack = queue.current; - const tracks = queue.tracks.slice(0, 10).map((m, i) => { - return `${i + 1}. **${m.title}**`; - }); - - return void interaction.followUp({ - embeds: [ - { - title: "Server Queue", - description: `${tracks.join("\n")}${ - queue.tracks.length > tracks.length - ? `\n...${queue.tracks.length - tracks.length === 1 ? `${queue.tracks.length - tracks.length} more track` : `${queue.tracks.length - tracks.length} more tracks`}` - : "" - }`, - color: 0xff0000, - fields: [{ name: "Now Playing", value: `🎶 | **${currentTrack.title}**` }] - } - ] - }); - } else if (interaction.commandName === "pause") { - await interaction.defer(); - const queue = player.getQueue(interaction.guildID); - if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); - const success = queue.setPaused(true); - return void interaction.followUp({ content: success ? "⏸ | Paused!" : "❌ | Something went wrong!" }); - } else if (interaction.commandName === "resume") { - await interaction.defer(); - const queue = player.getQueue(interaction.guildID); - if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); - const success = queue.setPaused(false); - return void interaction.followUp({ content: success ? "▶ | Resumed!" : "❌ | Something went wrong!" }); - } else if (interaction.commandName === "stop") { - await interaction.defer(); - const queue = player.getQueue(interaction.guildID); - if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); - queue.destroy(); - return void interaction.followUp({ content: "🛑 | Stopped the player!" }); - } else if (interaction.commandName === "np") { - await interaction.defer(); - const queue = player.getQueue(interaction.guildID); - if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); - return void interaction.followUp({ content: `🎶 | Current song: **${queue.current.title}**!` }); - } else if (interaction.commandName === "loop") { - await interaction.defer(); - const queue = player.getQueue(interaction.guildID); - if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); - const loopMode = interaction.options.get("mode")!.value as QueueRepeatMode; - const success = queue.setRepeatMode(loopMode); - const mode = loopMode === QueueRepeatMode.TRACK ? "🔂" : loopMode === QueueRepeatMode.QUEUE ? "🔁" : "▶"; - return void interaction.followUp({ content: success ? `${mode} | Updated loop mode!` : "❌ | Could not update loop mode!" }); - } else { - interaction.reply({ - content: "Unknown command!", - ephemeral: true - }); - } -}); - -client.login(config.token); diff --git a/package.json b/package.json index d2a2257..a256fe1 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "lib/" ], "scripts": { - "test": "cd example && ts-node index.ts", + "dev": "cd example/test && ts-node index.ts", "build": "rimraf lib && tsc", "format": "prettier --write \"src/**/*.ts\" \"example/**/*.ts\"", "lint": "tslint -p tsconfig.json", @@ -79,6 +79,6 @@ "typescript": "^4.3.2" }, "optionalDependencies": { - "sodium": "^3.0.2" + "libsodium-wrappers": "^0.7.9" } } diff --git a/yarn.lock b/yarn.lock index 97a7d61..c27df99 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3054,6 +3054,18 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +libsodium-wrappers@^0.7.9: + version "0.7.9" + resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.9.tgz#4ffc2b69b8f7c7c7c5594a93a4803f80f6d0f346" + integrity sha512-9HaAeBGk1nKTRFRHkt7nzxqCvnkWTjn1pdjKgcUnZxj0FyOP4CnhgFhMdrFfgNsukijBGyBLpP2m2uKT1vuWhQ== + dependencies: + libsodium "^0.7.0" + +libsodium@^0.7.0: + version "0.7.9" + resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.9.tgz#4bb7bcbf662ddd920d8795c227ae25bbbfa3821b" + integrity sha512-gfeADtR4D/CM0oRUviKBViMGXZDgnFdMKMzHsvBdqLBHd9ySi6EtYnmuhHVDDYgYpAO8eU8hEY+F8vIUAPh08A== + linkify-it@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf" @@ -3317,7 +3329,7 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -node-addon-api@*, node-addon-api@^3.2.1: +node-addon-api@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== @@ -3922,13 +3934,6 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -sodium@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/sodium/-/sodium-3.0.2.tgz#4dbd7eb4a21c92ca7e7f684756cd733fee78112e" - integrity sha512-IsTwTJeoNBU97km3XkrbCGC/n/9aUQejgD3QPr2YY2gtbSPru3TI6nhCqgoez9Mv88frF9oVZS/jrXFbd6WXyA== - dependencies: - node-addon-api "*" - sort-array@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/sort-array/-/sort-array-2.0.0.tgz#38a9c6da27fd7d147b42e60554f281187b4df472" From 3613087f1701f7ca95a669ef6cb8ea5e8f05dad7 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sat, 19 Jun 2021 18:01:01 +0545 Subject: [PATCH 080/215] dev --- .gitignore | 5 +- example/music-bot/config.js | 3 + example/music-bot/index.js | 261 ++ example/music-bot/package.json | 16 + yarn.lock | 4650 -------------------------------- 5 files changed, 283 insertions(+), 4652 deletions(-) create mode 100644 example/music-bot/config.js create mode 100644 example/music-bot/index.js create mode 100644 example/music-bot/package.json delete mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore index e0c9b06..7a394be 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # Node node_modules package-lock.json +yarn.lock # Compiled files lib @@ -10,5 +11,5 @@ yarn*.log # example example/test - -test/ \ No newline at end of file +example/music-bot/node_modules +example/music-bot/package-lock.json \ No newline at end of file diff --git a/example/music-bot/config.js b/example/music-bot/config.js new file mode 100644 index 0000000..e9ad43e --- /dev/null +++ b/example/music-bot/config.js @@ -0,0 +1,3 @@ +module.exports = { + token: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" +}; diff --git a/example/music-bot/index.js b/example/music-bot/index.js new file mode 100644 index 0000000..2ac0670 --- /dev/null +++ b/example/music-bot/index.js @@ -0,0 +1,261 @@ +const { Client, GuildMember } = require("discord.js"); +const config = require("./config"); +const { Player, QueryType, QueueRepeatMode } = require("discord-player"); + +const client = new Client({ + intents: ["GUILD_VOICE_STATES", "GUILD_MESSAGES", "GUILDS"] +}); + +client.on("ready", () => { + console.log("Bot is online!"); + client.user.setActivity({ + name: "🎶 | Music Time", + type: "LISTENING" + }); +}); +client.on("error", console.error); +client.on("warn", console.warn); + +// instantiate the player +const player = new Player(client); + +player.on("error", console.error); + +player.on("trackStart", (queue, track) => { + queue.metadata.send(`🎶 | Started playing: **${track.title}** in **${queue.connection.channel.name}**!`); +}); + +player.on("trackAdd", (queue, track) => { + queue.metadata.send(`🎶 | Track **${track.title}** queued!`); +}); + +player.on("botDisconnect", (queue) => { + queue.metadata.send("❌ | I was manually disconnected from the voice channel, clearing queue!"); +}); + +player.on("channelEmpty", (queue) => { + queue.metadata.send("❌ | Nobody is in the voice channel, leaving..."); +}); + +player.on("queueEnd", (queue) => { + queue.metadata.send("✅ | Queue finished!"); +}); + +client.on("message", async (message) => { + if (message.author.bot || !message.guild) return; + if (!client.application?.owner) await client.application?.fetch(); + + if (message.content === "!deploy" && message.author.id === client.application?.owner?.id) { + await message.guild.commands.set([ + { + name: "play", + description: "Plays a song from youtube", + options: [ + { + name: "query", + type: "STRING", + description: "The song you want to play", + required: true + } + ] + }, + { + name: "soundcloud", + description: "Plays a song from soundcloud", + options: [ + { + name: "query", + type: "STRING", + description: "The song you want to play", + required: true + } + ] + }, + { + name: "volume", + description: "Sets music volume", + options: [ + { + name: "amount", + type: "INTEGER", + description: "The volume amount to set (0-100)", + required: false + } + ] + }, + { + name: "loop", + description: "Sets loop mode", + options: [ + { + name: "mode", + type: "INTEGER", + description: "Loop type", + required: true, + choices: [ + { + name: "Off", + value: 0 + }, + { + name: "Track", + value: 1 + }, + { + name: "Queue", + value: 2 + } + ] + } + ] + }, + { + name: "skip", + description: "Skip to the current song" + }, + { + name: "queue", + description: "See the queue" + }, + { + name: "pause", + description: "Pause the current song" + }, + { + name: "resume", + description: "Resume the current song" + }, + { + name: "stop", + description: "Stop the player" + }, + { + name: "np", + description: "Now Playing" + } + ]); + + await message.reply("Deployed!"); + } +}); + +client.on("interaction", async (interaction) => { + if (!interaction.isCommand() || !interaction.guildID) return; + + if (!(interaction.member instanceof GuildMember) || !interaction.member.voice.channel) { + return void interaction.reply({ content: "You are not in a voice channel!", ephemeral: true }); + } + + if (interaction.guild.me.voice.channelID && interaction.member.voice.channelID !== interaction.guild.me.voice.channelID) { + return void interaction.reply({ content: "You are not in my voice channel!", ephemeral: true }); + } + + if (interaction.commandName === "play" || interaction.commandName === "soundcloud") { + await interaction.defer(); + + const query = interaction.options.get("query").value; + const searchResult = await player + .search(query, { + requestedBy: interaction.user, + searchEngine: interaction.commandName === "soundcloud" ? QueryType.SOUNDCLOUD_SEARCH : QueryType.AUTO + }) + .catch(() => {}); + if (!searchResult || !searchResult.tracks.length) return void interaction.followUp({ content: "No results were found!" }); + + const queue = await player.createQueue(interaction.guild, { + metadata: interaction.channel + }); + + try { + if (!queue.connection) await queue.connect(interaction.member.voice.channel); + } catch { + void player.deleteQueue(interaction.guildID); + return void interaction.followUp({ content: "Could not join your voice channel!" }); + } + + await interaction.followUp({ content: "⏱ | Loading your track..." }); + searchResult.playlist ? queue.addTracks(searchResult.tracks) : queue.addTrack(searchResult.tracks[0]); + if (!queue.playing) await queue.play(); + } else if (interaction.commandName === "volume") { + await interaction.defer(); + const queue = player.getQueue(interaction.guildID); + if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); + const vol = interaction.options.get("amount"); + if (!vol) return void interaction.followUp({ content: `🎧 | Current volume is **${queue.volume}**%!` }); + if ((vol.value) < 0 || (vol.value) > 100) return void interaction.followUp({ content: "❌ | Volume range must be 0-100" }); + const success = queue.setVolume(vol.value); + return void interaction.followUp({ + content: success ? `✅ | Volume set to **${vol.value}%**!` : "❌ | Something went wrong!" + }); + } else if (interaction.commandName === "skip") { + await interaction.defer(); + const queue = player.getQueue(interaction.guildID); + if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); + const currentTrack = queue.current; + const success = queue.skip(); + return void interaction.followUp({ + content: success ? `✅ | Skipped **${currentTrack}**!` : "❌ | Something went wrong!" + }); + } else if (interaction.commandName === "queue") { + await interaction.defer(); + const queue = player.getQueue(interaction.guildID); + if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); + const currentTrack = queue.current; + const tracks = queue.tracks.slice(0, 10).map((m, i) => { + return `${i + 1}. **${m.title}**`; + }); + + return void interaction.followUp({ + embeds: [ + { + title: "Server Queue", + description: `${tracks.join("\n")}${ + queue.tracks.length > tracks.length + ? `\n...${queue.tracks.length - tracks.length === 1 ? `${queue.tracks.length - tracks.length} more track` : `${queue.tracks.length - tracks.length} more tracks`}` + : "" + }`, + color: 0xff0000, + fields: [{ name: "Now Playing", value: `🎶 | **${currentTrack.title}**` }] + } + ] + }); + } else if (interaction.commandName === "pause") { + await interaction.defer(); + const queue = player.getQueue(interaction.guildID); + if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); + const success = queue.setPaused(true); + return void interaction.followUp({ content: success ? "⏸ | Paused!" : "❌ | Something went wrong!" }); + } else if (interaction.commandName === "resume") { + await interaction.defer(); + const queue = player.getQueue(interaction.guildID); + if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); + const success = queue.setPaused(false); + return void interaction.followUp({ content: success ? "▶ | Resumed!" : "❌ | Something went wrong!" }); + } else if (interaction.commandName === "stop") { + await interaction.defer(); + const queue = player.getQueue(interaction.guildID); + if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); + queue.destroy(); + return void interaction.followUp({ content: "🛑 | Stopped the player!" }); + } else if (interaction.commandName === "np") { + await interaction.defer(); + const queue = player.getQueue(interaction.guildID); + if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); + return void interaction.followUp({ content: `🎶 | Current song: **${queue.current.title}**!` }); + } else if (interaction.commandName === "loop") { + await interaction.defer(); + const queue = player.getQueue(interaction.guildID); + if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); + const loopMode = interaction.options.get("mode").value; + const success = queue.setRepeatMode(loopMode); + const mode = loopMode === QueueRepeatMode.TRACK ? "🔂" : loopMode === QueueRepeatMode.QUEUE ? "🔁" : "▶"; + return void interaction.followUp({ content: success ? `${mode} | Updated loop mode!` : "❌ | Could not update loop mode!" }); + } else { + interaction.reply({ + content: "Unknown command!", + ephemeral: true + }); + } +}); + +client.login(config.token); diff --git a/example/music-bot/package.json b/example/music-bot/package.json new file mode 100644 index 0000000..1fd2bd5 --- /dev/null +++ b/example/music-bot/package.json @@ -0,0 +1,16 @@ +{ + "name": "music-bot", + "version": "1.0.0", + "description": "Simple music bot created with discord-player", + "main": "index.js", + "scripts": { + "start": "node index.js" + }, + "author": "Snowflake107", + "license": "MIT", + "dependencies": { + "@discordjs/opus": "^0.5.3", + "discord.js": "^13.0.0-dev.807ea2d3c197c7c6556bd1c894114932f6657d49", + "libsodium-wrappers": "^0.7.9" + } +} diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index c27df99..0000000 --- a/yarn.lock +++ /dev/null @@ -1,4650 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/cli@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.14.5.tgz#9551b194f02360729de6060785bbdcce52c69f0a" - integrity sha512-poegjhRvXHWO0EAsnYajwYZuqcz7gyfxwfaecUESxDujrqOivf3zrjFbub8IJkrqEaz3fvJWh001EzxBub54fg== - dependencies: - commander "^4.0.1" - convert-source-map "^1.1.0" - fs-readdir-recursive "^1.1.0" - glob "^7.0.0" - make-dir "^2.1.0" - slash "^2.0.0" - source-map "^0.5.0" - optionalDependencies: - "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.2" - chokidar "^3.4.0" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" - integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== - dependencies: - "@babel/highlight" "^7.12.13" - -"@babel/code-frame@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" - integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== - dependencies: - "@babel/highlight" "^7.14.5" - -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.4": - version "7.14.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.4.tgz#45720fe0cecf3fd42019e1d12cc3d27fadc98d58" - integrity sha512-i2wXrWQNkH6JplJQGn3Rd2I4Pij8GdHkXwHMxm+zV5YG/Jci+bCNrWZEWC4o+umiDkRrRs4dVzH3X4GP7vyjQQ== - -"@babel/compat-data@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.5.tgz#8ef4c18e58e801c5c95d3c1c0f2874a2680fadea" - integrity sha512-kixrYn4JwfAVPa0f2yfzc2AWti6WRRyO3XjWW5PJAvtE11qhSayrrcrEnee05KAtNaPC+EwehE8Qt1UedEVB8w== - -"@babel/core@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.5.tgz#d281f46a9905f07d1b3bf71ead54d9c7d89cb1e3" - integrity sha512-RN/AwP2DJmQTZSfiDaD+JQQ/J99KsIpOCfBE5pL+5jJSt7nI3nYGoAXZu+ffYSQ029NLs2DstZb+eR81uuARgg== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.14.5" - "@babel/helper-compilation-targets" "^7.14.5" - "@babel/helper-module-transforms" "^7.14.5" - "@babel/helpers" "^7.14.5" - "@babel/parser" "^7.14.5" - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - source-map "^0.5.0" - -"@babel/generator@^7.14.2": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.3.tgz#0c2652d91f7bddab7cccc6ba8157e4f40dcedb91" - integrity sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA== - dependencies: - "@babel/types" "^7.14.2" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.5.tgz#848d7b9f031caca9d0cd0af01b063f226f52d785" - integrity sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA== - dependencies: - "@babel/types" "^7.14.5" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/helper-annotate-as-pure@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" - integrity sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-annotate-as-pure@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz#7bf478ec3b71726d56a8ca5775b046fc29879e61" - integrity sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz#b939b43f8c37765443a19ae74ad8b15978e0a191" - integrity sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/helper-compilation-targets@^7.13.0": - version "7.14.4" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.4.tgz#33ebd0ffc34248051ee2089350a929ab02f2a516" - integrity sha512-JgdzOYZ/qGaKTVkn5qEDV/SXAh8KcyUVkCoSWGN8T3bwrgd6m+/dJa2kVGi6RJYJgEYPBdZ84BZp9dUjNWkBaA== - dependencies: - "@babel/compat-data" "^7.14.4" - "@babel/helper-validator-option" "^7.12.17" - browserslist "^4.16.6" - semver "^6.3.0" - -"@babel/helper-compilation-targets@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz#7a99c5d0967911e972fe2c3411f7d5b498498ecf" - integrity sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw== - dependencies: - "@babel/compat-data" "^7.14.5" - "@babel/helper-validator-option" "^7.14.5" - browserslist "^4.16.6" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.5.tgz#8842ec495516dd1ed8f6c572be92ba78b1e9beef" - integrity sha512-Uq9z2e7ZtcnDMirRqAGLRaLwJn+Lrh388v5ETrR3pALJnElVh2zqQmdbz4W2RUJYohAPh2mtyPUgyMHMzXMncQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-member-expression-to-functions" "^7.14.5" - "@babel/helper-optimise-call-expression" "^7.14.5" - "@babel/helper-replace-supers" "^7.14.5" - "@babel/helper-split-export-declaration" "^7.14.5" - -"@babel/helper-create-regexp-features-plugin@^7.12.13": - version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.3.tgz#149aa6d78c016e318c43e2409a0ae9c136a86688" - integrity sha512-JIB2+XJrb7v3zceV2XzDhGIB902CmKGSpSl4q2C6agU9SNLG/2V1RtFRGPG1Ajh9STj3+q6zJMOC+N/pp2P9DA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - regexpu-core "^4.7.1" - -"@babel/helper-create-regexp-features-plugin@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz#c7d5ac5e9cf621c26057722fb7a8a4c5889358c4" - integrity sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A== - dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - regexpu-core "^4.7.1" - -"@babel/helper-define-polyfill-provider@^0.2.2": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz#0525edec5094653a282688d34d846e4c75e9c0b6" - integrity sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew== - dependencies: - "@babel/helper-compilation-targets" "^7.13.0" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/traverse" "^7.13.0" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-explode-assignable-expression@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz#8aa72e708205c7bb643e45c73b4386cdf2a1f645" - integrity sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-function-name@^7.14.2": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz#397688b590760b6ef7725b5f0860c82427ebaac2" - integrity sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ== - dependencies: - "@babel/helper-get-function-arity" "^7.12.13" - "@babel/template" "^7.12.13" - "@babel/types" "^7.14.2" - -"@babel/helper-function-name@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz#89e2c474972f15d8e233b52ee8c480e2cfcd50c4" - integrity sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ== - dependencies: - "@babel/helper-get-function-arity" "^7.14.5" - "@babel/template" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/helper-get-function-arity@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" - integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-get-function-arity@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz#25fbfa579b0937eee1f3b805ece4ce398c431815" - integrity sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-hoist-variables@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz#e0dd27c33a78e577d7c8884916a3e7ef1f7c7f8d" - integrity sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-member-expression-to-functions@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.5.tgz#d5c70e4ad13b402c95156c7a53568f504e2fb7b8" - integrity sha512-UxUeEYPrqH1Q/k0yRku1JE7dyfyehNwT6SVkMHvYvPDv4+uu627VXBckVj891BO8ruKBkiDoGnZf4qPDD8abDQ== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-module-imports@^7.12.13": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977" - integrity sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA== - dependencies: - "@babel/types" "^7.13.12" - -"@babel/helper-module-imports@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz#6d1a44df6a38c957aa7c312da076429f11b422f3" - integrity sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-module-transforms@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz#7de42f10d789b423eb902ebd24031ca77cb1e10e" - integrity sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA== - dependencies: - "@babel/helper-module-imports" "^7.14.5" - "@babel/helper-replace-supers" "^7.14.5" - "@babel/helper-simple-access" "^7.14.5" - "@babel/helper-split-export-declaration" "^7.14.5" - "@babel/helper-validator-identifier" "^7.14.5" - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/helper-optimise-call-expression@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz#f27395a8619e0665b3f0364cddb41c25d71b499c" - integrity sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" - integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== - -"@babel/helper-plugin-utils@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" - integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== - -"@babel/helper-remap-async-to-generator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz#51439c913612958f54a987a4ffc9ee587a2045d6" - integrity sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A== - dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - "@babel/helper-wrap-function" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/helper-replace-supers@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz#0ecc0b03c41cd567b4024ea016134c28414abb94" - integrity sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.14.5" - "@babel/helper-optimise-call-expression" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/helper-simple-access@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz#66ea85cf53ba0b4e588ba77fc813f53abcaa41c4" - integrity sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-skip-transparent-expression-wrappers@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz#96f486ac050ca9f44b009fbe5b7d394cab3a0ee4" - integrity sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-split-export-declaration@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" - integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-split-export-declaration@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz#22b23a54ef51c2b7605d851930c1976dd0bc693a" - integrity sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-validator-identifier@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" - integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== - -"@babel/helper-validator-identifier@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz#d0f0e277c512e0c938277faa85a3968c9a44c0e8" - integrity sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg== - -"@babel/helper-validator-option@^7.12.17": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" - integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== - -"@babel/helper-validator-option@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" - integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== - -"@babel/helper-wrap-function@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz#5919d115bf0fe328b8a5d63bcb610f51601f2bff" - integrity sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ== - dependencies: - "@babel/helper-function-name" "^7.14.5" - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/helpers@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.5.tgz#4870f8d9a6fdbbd65e5674a3558b4ff7fef0d9b2" - integrity sha512-xtcWOuN9VL6nApgVHtq3PPcQv5qFBJzoSZzJ/2c0QK/IP/gxVcoWSNQwFEGvmbQsuS9rhYqjILDGGXcTkA705Q== - dependencies: - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/highlight@^7.12.13": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" - integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg== - dependencies: - "@babel/helper-validator-identifier" "^7.14.0" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/highlight@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" - integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== - dependencies: - "@babel/helper-validator-identifier" "^7.14.5" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.12.13", "@babel/parser@^7.14.2", "@babel/parser@^7.9.4": - version "7.14.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.4.tgz#a5c560d6db6cd8e6ed342368dea8039232cbab18" - integrity sha512-ArliyUsWDUqEGfWcmzpGUzNfLxTdTp6WU4IuP6QFSp9gGfWS6boxFCkJSJ/L4+RG8z/FnIU3WxCk6hPL9SSWeA== - -"@babel/parser@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.5.tgz#4cd2f346261061b2518873ffecdf1612cb032829" - integrity sha512-TM8C+xtH/9n1qzX+JNHi7AN2zHMTiPUtspO0ZdHflW8KaskkALhMmuMHb4bCmNdv9VAPzJX3/bXqkVLnAvsPfg== - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz#4b467302e1548ed3b1be43beae2cc9cf45e0bb7e" - integrity sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" - "@babel/plugin-proposal-optional-chaining" "^7.14.5" - -"@babel/plugin-proposal-async-generator-functions@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.5.tgz#4024990e3dd74181f4f426ea657769ff49a2df39" - integrity sha512-tbD/CG3l43FIXxmu4a7RBe4zH7MLJ+S/lFowPFO7HetS2hyOZ/0nnnznegDuzFzfkyQYTxqdTH/hKmuBngaDAA== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-remap-async-to-generator" "^7.14.5" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-class-properties@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz#40d1ee140c5b1e31a350f4f5eed945096559b42e" - integrity sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-proposal-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz#158e9e10d449c3849ef3ecde94a03d9f1841b681" - integrity sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-proposal-dynamic-import@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz#0c6617df461c0c1f8fff3b47cd59772360101d2c" - integrity sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-proposal-export-namespace-from@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz#dbad244310ce6ccd083072167d8cea83a52faf76" - integrity sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz#38de60db362e83a3d8c944ac858ddf9f0c2239eb" - integrity sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-logical-assignment-operators@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz#6e6229c2a99b02ab2915f82571e0cc646a40c738" - integrity sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz#ee38589ce00e2cc59b299ec3ea406fcd3a0fdaf6" - integrity sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-numeric-separator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz#83631bf33d9a51df184c2102a069ac0c58c05f18" - integrity sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.5.tgz#e581d5ccdfa187ea6ed73f56c6a21c1580b90fbf" - integrity sha512-VzMyY6PWNPPT3pxc5hi9LloKNr4SSrVCg7Yr6aZpW4Ym07r7KqSU/QXYwjXLVxqwSv0t/XSXkFoKBPUkZ8vb2A== - dependencies: - "@babel/compat-data" "^7.14.5" - "@babel/helper-compilation-targets" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.14.5" - -"@babel/plugin-proposal-optional-catch-binding@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz#939dd6eddeff3a67fdf7b3f044b5347262598c3c" - integrity sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-proposal-optional-chaining@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz#fa83651e60a360e3f13797eef00b8d519695b603" - integrity sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-private-methods@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz#37446495996b2945f30f5be5b60d5e2aa4f5792d" - integrity sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-proposal-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz#9f65a4d0493a940b4c01f8aa9d3f1894a587f636" - integrity sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q== - dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - "@babel/helper-create-class-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-proposal-unicode-property-regex@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz#0f95ee0e757a5d647f378daa0eca7e93faa8bbe8" - integrity sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba" - integrity sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" - integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz#b82c6ce471b165b5ce420cf92914d6fb46225716" - integrity sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-arrow-functions@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz#f7187d9588a768dd080bf4c9ffe117ea62f7862a" - integrity sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-async-to-generator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz#72c789084d8f2094acb945633943ef8443d39e67" - integrity sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA== - dependencies: - "@babel/helper-module-imports" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-remap-async-to-generator" "^7.14.5" - -"@babel/plugin-transform-block-scoped-functions@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz#e48641d999d4bc157a67ef336aeb54bc44fd3ad4" - integrity sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-block-scoping@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz#8cc63e61e50f42e078e6f09be775a75f23ef9939" - integrity sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-classes@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz#0e98e82097b38550b03b483f9b51a78de0acb2cf" - integrity sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-optimise-call-expression" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-replace-supers" "^7.14.5" - "@babel/helper-split-export-declaration" "^7.14.5" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz#1b9d78987420d11223d41195461cc43b974b204f" - integrity sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-destructuring@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.5.tgz#d32ad19ff1a6da1e861dc62720d80d9776e3bf35" - integrity sha512-wU9tYisEbRMxqDezKUqC9GleLycCRoUsai9ddlsq54r8QRLaeEhc+d+9DqCG+kV9W2GgQjTZESPTpn5bAFMDww== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-dotall-regex@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz#2f6bf76e46bdf8043b4e7e16cf24532629ba0c7a" - integrity sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz#3f1601cc29905bfcb67f53910f197aeafebb25ad" - integrity sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-duplicate-keys@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz#365a4844881bdf1501e3a9f0270e7f0f91177954" - integrity sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-exponentiation-operator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz#5154b8dd6a3dfe6d90923d61724bd3deeb90b493" - integrity sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-for-of@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz#dae384613de8f77c196a8869cbf602a44f7fc0eb" - integrity sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-function-name@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz#e81c65ecb900746d7f31802f6bed1f52d915d6f2" - integrity sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ== - dependencies: - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz#41d06c7ff5d4d09e3cf4587bd3ecf3930c730f78" - integrity sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-member-expression-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz#b39cd5212a2bf235a617d320ec2b48bcc091b8a7" - integrity sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-modules-amd@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz#4fd9ce7e3411cb8b83848480b7041d83004858f7" - integrity sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g== - dependencies: - "@babel/helper-module-transforms" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-commonjs@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz#7aaee0ea98283de94da98b28f8c35701429dad97" - integrity sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A== - dependencies: - "@babel/helper-module-transforms" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-simple-access" "^7.14.5" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-systemjs@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz#c75342ef8b30dcde4295d3401aae24e65638ed29" - integrity sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA== - dependencies: - "@babel/helper-hoist-variables" "^7.14.5" - "@babel/helper-module-transforms" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-identifier" "^7.14.5" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-umd@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz#fb662dfee697cce274a7cda525190a79096aa6e0" - integrity sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA== - dependencies: - "@babel/helper-module-transforms" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.5.tgz#d537e8ee083ee6f6aa4f4eef9d2081d555746e4c" - integrity sha512-+Xe5+6MWFo311U8SchgeX5c1+lJM+eZDBZgD+tvXu9VVQPXwwVzeManMMjYX6xw2HczngfOSZjoFYKwdeB/Jvw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" - -"@babel/plugin-transform-new-target@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz#31bdae8b925dc84076ebfcd2a9940143aed7dbf8" - integrity sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-object-super@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz#d0b5faeac9e98597a161a9cf78c527ed934cdc45" - integrity sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-replace-supers" "^7.14.5" - -"@babel/plugin-transform-parameters@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz#49662e86a1f3ddccac6363a7dfb1ff0a158afeb3" - integrity sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-property-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz#0ddbaa1f83db3606f1cdf4846fa1dfb473458b34" - integrity sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-regenerator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz#9676fd5707ed28f522727c5b3c0aa8544440b04f" - integrity sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg== - dependencies: - regenerator-transform "^0.14.2" - -"@babel/plugin-transform-reserved-words@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz#c44589b661cfdbef8d4300dcc7469dffa92f8304" - integrity sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-shorthand-properties@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz#97f13855f1409338d8cadcbaca670ad79e091a58" - integrity sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-spread@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.5.tgz#bd269fb4119754d2ce7f4cc39a96b4f71baae356" - integrity sha512-/3iqoQdiWergnShZYl0xACb4ADeYCJ7X/RgmwtXshn6cIvautRPAFzhd58frQlokLO6Jb4/3JXvmm6WNTPtiTw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" - -"@babel/plugin-transform-sticky-regex@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz#5b617542675e8b7761294381f3c28c633f40aeb9" - integrity sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-template-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz#a5f2bc233937d8453885dc736bdd8d9ffabf3d93" - integrity sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-typeof-symbol@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz#39af2739e989a2bd291bf6b53f16981423d457d4" - integrity sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-typescript@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.5.tgz#5b41b59072f765bd1ec1d0b694e08c7df0f6f8a0" - integrity sha512-cFD5PKp4b8/KkwQ7h71FdPXFvz1RgwTFF9akRZwFldb9G0AHf7CgoPx96c4Q/ZVjh6V81tqQwW5YiHws16OzPg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-typescript" "^7.14.5" - -"@babel/plugin-transform-unicode-escapes@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz#9d4bd2a681e3c5d7acf4f57fa9e51175d91d0c6b" - integrity sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-unicode-regex@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz#4cd09b6c8425dd81255c7ceb3fb1836e7414382e" - integrity sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/preset-env@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.5.tgz#c0c84e763661fd0e74292c3d511cb33b0c668997" - integrity sha512-ci6TsS0bjrdPpWGnQ+m4f+JSSzDKlckqKIJJt9UZ/+g7Zz9k0N8lYU8IeLg/01o2h8LyNZDMLGgRLDTxpudLsA== - dependencies: - "@babel/compat-data" "^7.14.5" - "@babel/helper-compilation-targets" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-option" "^7.14.5" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.14.5" - "@babel/plugin-proposal-async-generator-functions" "^7.14.5" - "@babel/plugin-proposal-class-properties" "^7.14.5" - "@babel/plugin-proposal-class-static-block" "^7.14.5" - "@babel/plugin-proposal-dynamic-import" "^7.14.5" - "@babel/plugin-proposal-export-namespace-from" "^7.14.5" - "@babel/plugin-proposal-json-strings" "^7.14.5" - "@babel/plugin-proposal-logical-assignment-operators" "^7.14.5" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5" - "@babel/plugin-proposal-numeric-separator" "^7.14.5" - "@babel/plugin-proposal-object-rest-spread" "^7.14.5" - "@babel/plugin-proposal-optional-catch-binding" "^7.14.5" - "@babel/plugin-proposal-optional-chaining" "^7.14.5" - "@babel/plugin-proposal-private-methods" "^7.14.5" - "@babel/plugin-proposal-private-property-in-object" "^7.14.5" - "@babel/plugin-proposal-unicode-property-regex" "^7.14.5" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.14.5" - "@babel/plugin-transform-async-to-generator" "^7.14.5" - "@babel/plugin-transform-block-scoped-functions" "^7.14.5" - "@babel/plugin-transform-block-scoping" "^7.14.5" - "@babel/plugin-transform-classes" "^7.14.5" - "@babel/plugin-transform-computed-properties" "^7.14.5" - "@babel/plugin-transform-destructuring" "^7.14.5" - "@babel/plugin-transform-dotall-regex" "^7.14.5" - "@babel/plugin-transform-duplicate-keys" "^7.14.5" - "@babel/plugin-transform-exponentiation-operator" "^7.14.5" - "@babel/plugin-transform-for-of" "^7.14.5" - "@babel/plugin-transform-function-name" "^7.14.5" - "@babel/plugin-transform-literals" "^7.14.5" - "@babel/plugin-transform-member-expression-literals" "^7.14.5" - "@babel/plugin-transform-modules-amd" "^7.14.5" - "@babel/plugin-transform-modules-commonjs" "^7.14.5" - "@babel/plugin-transform-modules-systemjs" "^7.14.5" - "@babel/plugin-transform-modules-umd" "^7.14.5" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.5" - "@babel/plugin-transform-new-target" "^7.14.5" - "@babel/plugin-transform-object-super" "^7.14.5" - "@babel/plugin-transform-parameters" "^7.14.5" - "@babel/plugin-transform-property-literals" "^7.14.5" - "@babel/plugin-transform-regenerator" "^7.14.5" - "@babel/plugin-transform-reserved-words" "^7.14.5" - "@babel/plugin-transform-shorthand-properties" "^7.14.5" - "@babel/plugin-transform-spread" "^7.14.5" - "@babel/plugin-transform-sticky-regex" "^7.14.5" - "@babel/plugin-transform-template-literals" "^7.14.5" - "@babel/plugin-transform-typeof-symbol" "^7.14.5" - "@babel/plugin-transform-unicode-escapes" "^7.14.5" - "@babel/plugin-transform-unicode-regex" "^7.14.5" - "@babel/preset-modules" "^0.1.4" - "@babel/types" "^7.14.5" - babel-plugin-polyfill-corejs2 "^0.2.2" - babel-plugin-polyfill-corejs3 "^0.2.2" - babel-plugin-polyfill-regenerator "^0.2.2" - core-js-compat "^3.14.0" - semver "^6.3.0" - -"@babel/preset-modules@^0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" - integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - -"@babel/preset-typescript@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.14.5.tgz#aa98de119cf9852b79511f19e7f44a2d379bcce0" - integrity sha512-u4zO6CdbRKbS9TypMqrlGH7sd2TAJppZwn3c/ZRLeO/wGsbddxgbPDUZVNrie3JWYLQ9vpineKlsrWFvO6Pwkw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-option" "^7.14.5" - "@babel/plugin-transform-typescript" "^7.14.5" - -"@babel/runtime@^7.8.4": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.0.tgz#46794bc20b612c5f75e62dd071e24dfd95f1cbe6" - integrity sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/template@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" - integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/parser" "^7.12.13" - "@babel/types" "^7.12.13" - -"@babel/template@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.14.5.tgz#a9bc9d8b33354ff6e55a9c60d1109200a68974f4" - integrity sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/parser" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/traverse@^7.13.0": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.2.tgz#9201a8d912723a831c2679c7ebbf2fe1416d765b" - integrity sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.14.2" - "@babel/helper-function-name" "^7.14.2" - "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/parser" "^7.14.2" - "@babel/types" "^7.14.2" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.5.tgz#c111b0f58afab4fea3d3385a406f692748c59870" - integrity sha512-G3BiS15vevepdmFqmUc9X+64y0viZYygubAMO8SvBmKARuF6CPSZtH4Ng9vi/lrWlZFGe3FWdXNy835akH8Glg== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.14.5" - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-hoist-variables" "^7.14.5" - "@babel/helper-split-export-declaration" "^7.14.5" - "@babel/parser" "^7.14.5" - "@babel/types" "^7.14.5" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.12.13", "@babel/types@^7.13.12", "@babel/types@^7.14.2", "@babel/types@^7.4.4": - version "7.14.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.4.tgz#bfd6980108168593b38b3eb48a24aa026b919bc0" - integrity sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw== - dependencies: - "@babel/helper-validator-identifier" "^7.14.0" - to-fast-properties "^2.0.0" - -"@babel/types@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.5.tgz#3bb997ba829a2104cedb20689c4a5b8121d383ff" - integrity sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg== - dependencies: - "@babel/helper-validator-identifier" "^7.14.5" - to-fast-properties "^2.0.0" - -"@discord-player/extractor@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@discord-player/extractor/-/extractor-3.0.2.tgz#932b37c881a371279b7b1d1eb35bcab256008a76" - integrity sha512-bVGzucZTYksvsL7TFBhe/8ZzWuDDSc7f1fZYXS5CSu3vYez8ieG8ySAaeHdEbFKhxHIYhvUhvgY1mWcX/3ZBQA== - dependencies: - genius-lyrics "^4.2.9" - jsdom "^16.5.3" - node-fetch "^2.6.1" - reverbnation-scraper "^2.0.0" - -"@discordjs/collection@^0.1.6": - version "0.1.6" - resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-0.1.6.tgz#9e9a7637f4e4e0688fd8b2b5c63133c91607682c" - integrity sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ== - -"@discordjs/form-data@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@discordjs/form-data/-/form-data-3.0.1.tgz#5c9e6be992e2e57d0dfa0e39979a850225fb4697" - integrity sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -"@discordjs/node-pre-gyp@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@discordjs/node-pre-gyp/-/node-pre-gyp-0.4.0.tgz#32740b1ff362c86a280877df9637313c7bf250ee" - integrity sha512-CXLpoM2hgS94i9+EAVowR92y8o3KdKc9fmoe8/FTp5XTzvoXzJln3+Ctl0oBpE6c9+11zd9oJnZPdkkOBkDPSA== - dependencies: - detect-libc "^1.0.3" - https-proxy-agent "^5.0.0" - make-dir "^3.1.0" - node-fetch "^2.6.1" - nopt "^5.0.0" - npmlog "^4.1.2" - rimraf "^3.0.2" - semver "^7.3.5" - tar "^6.1.0" - -"@discordjs/opus@^0.5.3": - version "0.5.3" - resolved "https://registry.yarnpkg.com/@discordjs/opus/-/opus-0.5.3.tgz#7294f539da0b37bf13b072e51acb47ffca748471" - integrity sha512-IQhCwCy2WKXLe+qkOkwO1Wjgk20uqeAbqM62tCbzIqbTsXX4YAge8Me9RFnI77Lx+UTkgm4rSVM3VPVdS/GsUw== - dependencies: - "@discordjs/node-pre-gyp" "^0.4.0" - node-addon-api "^3.2.1" - -"@discordjs/voice@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@discordjs/voice/-/voice-0.5.0.tgz#238d6f8c1dc7e30ff781edb08fb0540bca5aa23d" - integrity sha512-YPfY8ium1lExmRETz+vC4d3gGvHhGvWQMWLTOkNBoUkN6VyEpO/RVrL5EI+0qUefKAWwv2Gus/c7QM1xhAUwow== - dependencies: - "@types/ws" "^7.4.4" - discord-api-types "^0.18.1" - prism-media "^1.3.1" - tiny-typed-emitter "^2.0.3" - ws "^7.4.4" - -"@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.2": - version "2.1.8-no-fsevents.2" - resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.2.tgz#e324c0a247a5567192dd7180647709d7e2faf94b" - integrity sha512-Fb8WxUFOBQVl+CX4MWet5o7eCc6Pj04rXIwVKZ6h1NnqTo45eOQW6aWyhG25NIODvWFwTDMwBsYxrQ3imxpetg== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^5.1.2" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - -"@sapphire/async-queue@^1.1.2": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.1.3.tgz#fbc70f2687a2473bd824a4723e962dfce933eba7" - integrity sha512-pyV+0njfBq6rHKEOpux5xy2cEM5u9KFjVzpmKsgk/8mdslLCuNXX4QvxWsSerLq/EtLhkvvl998cdFbGtpHa9Q== - -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== - -"@tsconfig/node10@^1.0.7": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" - integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== - -"@tsconfig/node12@^1.0.7": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.8.tgz#a883d62f049a64fea1e56a6bbe66828d11c6241b" - integrity sha512-LM6XwBhjZRls1qJGpiM/It09SntEwe9M0riXRfQ9s6XlJQG0JPGl92ET18LtGeYh/GuOtafIXqwZeqLOd0FNFQ== - -"@tsconfig/node14@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" - integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== - -"@tsconfig/node16@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.1.tgz#a6ca6a9a0ff366af433f42f5f0e124794ff6b8f1" - integrity sha512-FTgBI767POY/lKNDNbIzgAX6miIDBs6NTCbdlDb8TrWovHsSvaVIZDlTqym29C6UqhzwcJx4CYr+AlrMywA0cA== - -"@types/node@*", "@types/node@^15.12.2": - version "15.12.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-15.12.2.tgz#1f2b42c4be7156ff4a6f914b2fb03d05fa84e38d" - integrity sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww== - -"@types/ws@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.4.tgz#93e1e00824c1de2608c30e6de4303ab3b4c0c9bc" - integrity sha512-d/7W23JAXPodQNbOZNXvl2K+bqAQrCMwlh/nuQsPSQk6Fq0opHoPrUw43aHsvSbIiQPr8Of2hkFbnz1XBFVyZQ== - dependencies: - "@types/node" "*" - -abab@^2.0.3, abab@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" - integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== - dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - -acorn-jsx@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" - integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== - -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - -acorn@^7.1.1: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.2.4: - version "8.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.3.0.tgz#1193f9b96c4e8232f00b11a9edff81b2c8b98b88" - integrity sha512-tqPKHZ5CaBJw0Xmy0ZZvLs1qTV+BNFSyvn77ASXkpBNfIRk8ev26fKrD9iLGwGA9zedPao52GSHzq8lyZG0NUw== - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -ajv@^6.10.0, ajv@^6.10.2: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-escape-sequences@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-escape-sequences/-/ansi-escape-sequences-4.1.0.tgz#2483c8773f50dd9174dd9557e92b1718f1816097" - integrity sha512-dzW9kHxH011uBsidTXd14JXgzye/YLb2LzeKZ4bsgl/Knwx8AtbSFkkGxagdNOoh0DlqHCmfiEjWKBaqjOanVw== - dependencies: - array-back "^3.0.1" - -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -anymatch@~3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-back@^1.0.2, array-back@^1.0.3, array-back@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-1.0.4.tgz#644ba7f095f7ffcf7c43b5f0dc39d3c1f03c063b" - integrity sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs= - dependencies: - typical "^2.6.0" - -array-back@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-2.0.0.tgz#6877471d51ecc9c9bfa6136fb6c7d5fe69748022" - integrity sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw== - dependencies: - typical "^2.6.1" - -array-back@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" - integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== - -array-back@^4.0.0, array-back@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" - integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== - -async-each@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -axios@^0.21.1: - version "0.21.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" - integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== - dependencies: - follow-redirects "^1.10.0" - -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== - dependencies: - object.assign "^4.1.0" - -babel-plugin-polyfill-corejs2@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327" - integrity sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ== - dependencies: - "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.2.2" - semver "^6.1.1" - -babel-plugin-polyfill-corejs3@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.2.tgz#7424a1682ee44baec817327710b1b094e5f8f7f5" - integrity sha512-l1Cf8PKk12eEk5QP/NQ6TH8A1pee6wWDJ96WjxrMXFLHLOBFzYM4moG80HFgduVhTqAFez4alnZKEhP/bYHg0A== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.2" - core-js-compat "^3.9.1" - -babel-plugin-polyfill-regenerator@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz#b310c8d642acada348c1fa3b3e6ce0e851bee077" - integrity sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.2" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -bluebird@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^2.3.1, braces@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - -browserslist@^4.16.6: - version "4.16.6" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" - integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== - dependencies: - caniuse-lite "^1.0.30001219" - colorette "^1.2.2" - electron-to-chromium "^1.3.723" - escalade "^3.1.1" - node-releases "^1.1.71" - -buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - -builtin-modules@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -cache-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cache-point/-/cache-point-1.0.0.tgz#3d9769fc04d7a5b3005fc6258e6ebcaccb5f15f3" - integrity sha512-ZqrZp9Hi5Uq7vfSGmNP2bUT/9DzZC2Y/GXjHB8rUJN1a+KLmbV05+vxHipNsg8+CSVgjcVVzLV8VZms6w8ZeRw== - dependencies: - array-back "^4.0.0" - fs-then-native "^2.0.0" - mkdirp2 "^1.0.4" - -call-bind@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -caniuse-lite@^1.0.30001219: - version "1.0.30001236" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001236.tgz#0a80de4cdf62e1770bb46a30d884fc8d633e3958" - integrity sha512-o0PRQSrSCGJKCPZcgMzl5fUaj5xHe8qA2m4QRvnyY4e1lITqoNkr7q/Oh1NcpGSy0Th97UZ35yoKcINPoq7YOQ== - -catharsis@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.9.0.tgz#40382a168be0e6da308c277d3a2b3eb40c7d2121" - integrity sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A== - dependencies: - lodash "^4.17.15" - -chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" - integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -cheerio-select@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-1.5.0.tgz#faf3daeb31b17c5e1a9dabcee288aaf8aafa5823" - integrity sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg== - dependencies: - css-select "^4.1.3" - css-what "^5.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - domutils "^2.7.0" - -cheerio@^1.0.0-rc.9: - version "1.0.0-rc.10" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.10.tgz#2ba3dcdfcc26e7956fc1f440e61d51c643379f3e" - integrity sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw== - dependencies: - cheerio-select "^1.5.0" - dom-serializer "^1.3.2" - domhandler "^4.2.0" - htmlparser2 "^6.1.0" - parse5 "^6.0.1" - parse5-htmlparser2-tree-adapter "^6.0.1" - tslib "^2.2.0" - -chokidar@^3.4.0: - version "3.5.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" - integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.5.0" - optionalDependencies: - fsevents "~2.3.1" - -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - -collect-all@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/collect-all/-/collect-all-1.0.4.tgz#50cd7119ac24b8e12a661f0f8c3aa0ea7222ddfc" - integrity sha512-RKZhRwJtJEP5FWul+gkSMEnaK6H3AGPTTWOiRimCcs+rc/OmQE3Yhy1Q7A7KsdkG3ZXVdZq68Y6ONSdvkeEcKA== - dependencies: - stream-connect "^1.0.2" - stream-via "^1.0.4" - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colorette@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" - integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -command-line-args@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.1.1.tgz#88e793e5bb3ceb30754a86863f0401ac92fd369a" - integrity sha512-hL/eG8lrll1Qy1ezvkant+trihbGnaKaeEjj6Scyr3DN+RC7iQ5Rz84IeLERfAWDGo0HBSNAakczwgCilDXnWg== - dependencies: - array-back "^3.0.1" - find-replace "^3.0.0" - lodash.camelcase "^4.3.0" - typical "^4.0.0" - -command-line-tool@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/command-line-tool/-/command-line-tool-0.8.0.tgz#b00290ef1dfc11cc731dd1f43a92cfa5f21e715b" - integrity sha512-Xw18HVx/QzQV3Sc5k1vy3kgtOeGmsKIqwtFFoyjI4bbcpSgnw2CWVULvtakyw4s6fhyAdI6soQQhXc2OzJy62g== - dependencies: - ansi-escape-sequences "^4.0.0" - array-back "^2.0.0" - command-line-args "^5.0.0" - command-line-usage "^4.1.0" - typical "^2.6.1" - -command-line-usage@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-4.1.0.tgz#a6b3b2e2703b4dcf8bd46ae19e118a9a52972882" - integrity sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g== - dependencies: - ansi-escape-sequences "^4.0.0" - array-back "^2.0.0" - table-layout "^0.4.2" - typical "^2.6.1" - -commander@^2.12.1: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - -common-sequence@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/common-sequence/-/common-sequence-2.0.2.tgz#accc76bdc5876a1fcd92b73484d4285fff99d838" - integrity sha512-jAg09gkdkrDO9EWTdXfv80WWH3yeZl5oT69fGfedBNS9pXUKYInVJ1bJ+/ht2+Moeei48TmSbQDYMc8EOx9G0g== - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -config-master@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/config-master/-/config-master-3.1.0.tgz#667663590505a283bf26a484d68489d74c5485da" - integrity sha1-ZnZjWQUFooO/JqSE1oSJ10xUhdo= - dependencies: - walk-back "^2.0.1" - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - -convert-source-map@^1.1.0, convert-source-map@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== - dependencies: - safe-buffer "~5.1.1" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - -core-js-compat@^3.14.0, core-js-compat@^3.9.1: - version "3.14.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.14.0.tgz#b574dabf29184681d5b16357bd33d104df3d29a5" - integrity sha512-R4NS2eupxtiJU+VwgkF9WTpnSfZW4pogwKHd8bclWU2sp93Pr5S1uYJI84cMOubJRou7bcfL0vmwtLslWN5p3A== - dependencies: - browserslist "^4.16.6" - semver "7.0.0" - -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-fetch@~3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.4.tgz#9723f3a3a247bf8b89039f3a380a9244e8fa2f39" - integrity sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ== - dependencies: - node-fetch "2.6.1" - -cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -css-select@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.1.3.tgz#a70440f70317f2669118ad74ff105e65849c7067" - integrity sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA== - dependencies: - boolbase "^1.0.0" - css-what "^5.0.0" - domhandler "^4.2.0" - domutils "^2.6.0" - nth-check "^2.0.0" - -css-what@^5.0.0, css-what@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.0.1.tgz#3efa820131f4669a8ac2408f9c32e7c7de9f4cad" - integrity sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg== - -cssom@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - -data-urls@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" - integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== - dependencies: - abab "^2.0.3" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" - -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== - dependencies: - ms "2.1.2" - -debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decimal.js@^10.2.1: - version "10.2.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" - integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw== - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -deep-extend@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= - -define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - -detect-libc@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -discord-api-types@^0.18.1: - version "0.18.1" - resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.18.1.tgz#5d08ed1263236be9c21a22065d0e6b51f790f492" - integrity sha512-hNC38R9ZF4uaujaZQtQfm5CdQO58uhdkoHQAVvMfIL0LgOSZeW575W8H6upngQOuoxWd8tiRII3LLJm9zuQKYg== - -discord-ytdl-core@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/discord-ytdl-core/-/discord-ytdl-core-5.0.3.tgz#a31560f0bede41d6fc969377083ae958deac2b72" - integrity sha512-q4GOEFiV19l0OcPezXnkDWualf+n96LcbTEWReceiDHdx4xxn5CXZX9PR4iDTXQR3Kv2VUkwB8RO8dI50d88vQ== - dependencies: - prism-media "^1.2.9" - -discord.js-docgen@discordjs/docgen#ts-patch: - version "0.9.0" - resolved "https://codeload.github.com/discordjs/docgen/tar.gz/9c58620ea4fcdeda432a1370d4333e8537b37491" - dependencies: - eslint "^6.3.0" - js-yaml "^3.13.1" - jsdoc-to-markdown "^5.0.1" - tsubaki "^1.3.2" - yargs "^14.0.0" - -discord.js@^13.0.0-dev.a3cbcca13da1af416c219bd64a0a6e84bb87a057: - version "13.0.0-dev.a3cbcca13da1af416c219bd64a0a6e84bb87a057" - resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0-dev.a3cbcca13da1af416c219bd64a0a6e84bb87a057.tgz#7358b44985b2423f1fdb1a9c259d26de74d662f7" - integrity sha512-9EFBA08VUt9hIZzgQ1IcNv3/EwLvo4N9RikEzv/qNYjRvonnKi70tp0dpChduM8GFxgqrcTEa2mZJGfuumBBHA== - dependencies: - "@discordjs/collection" "^0.1.6" - "@discordjs/form-data" "^3.0.1" - "@sapphire/async-queue" "^1.1.2" - "@types/ws" "^7.4.4" - abort-controller "^3.0.0" - discord-api-types "^0.18.1" - node-fetch "^2.6.1" - ws "^7.4.6" - -dmd@^4.0.5: - version "4.0.6" - resolved "https://registry.yarnpkg.com/dmd/-/dmd-4.0.6.tgz#c533cae847307984527263a4b41a1c6e3ef344a2" - integrity sha512-7ZYAnFQ6jGm4SICArwqNPylJ83PaOdPTAkds3Z/s1ueFqSc5ilJ2F0b7uP+35W1PUbemH++gn5/VlC3KwEgiHQ== - dependencies: - array-back "^4.0.1" - cache-point "^1.0.0" - common-sequence "^2.0.0" - file-set "^3.0.0" - handlebars "^4.5.3" - marked "^0.7.0" - object-get "^2.1.0" - reduce-flatten "^3.0.0" - reduce-unique "^2.0.1" - reduce-without "^1.0.1" - test-value "^3.0.0" - walk-back "^4.0.0" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-serializer@^1.0.1, dom-serializer@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" - integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - -domelementtype@^2.0.1, domelementtype@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" - integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== - -domexception@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" - integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== - dependencies: - webidl-conversions "^5.0.0" - -domhandler@^4.0.0, domhandler@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.0.tgz#f9768a5f034be60a89a27c2e4d0f74eba0d8b059" - integrity sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA== - dependencies: - domelementtype "^2.2.0" - -domutils@^2.5.2, domutils@^2.6.0, domutils@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.7.0.tgz#8ebaf0c41ebafcf55b0b72ec31c56323712c5442" - integrity sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -electron-to-chromium@^1.3.723: - version "1.3.750" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.750.tgz#7e5ef6f478316b0bd656af5942fe502610e97eaf" - integrity sha512-Eqy9eHNepZxJXT+Pc5++zvEi5nQ6AGikwFYDCYwXUFBr+ynJ6pDG7MzZmwGYCIuXShLJM0n4bq+aoKDmvSGJ8A== - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== - -entities@~2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" - integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -eslint-scope@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-utils@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-visitor-keys@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint@^6.3.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" - integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.10.0" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^3.0.0" - eslint-scope "^5.0.0" - eslint-utils "^1.4.3" - eslint-visitor-keys "^1.1.0" - espree "^6.1.2" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - inquirer "^7.0.0" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.14" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.3" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^6.1.2" - strip-ansi "^5.2.0" - strip-json-comments "^3.0.1" - table "^5.2.3" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -espree@^6.1.2: - version "6.2.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" - integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== - dependencies: - acorn "^7.1.1" - acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.1.0" - -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.0.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== - dependencies: - flat-cache "^2.0.1" - -file-set@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/file-set/-/file-set-2.0.1.tgz#db9bc4b70a7e5ba81c9d279c20a37f13369c7850" - integrity sha512-XgOUUpgR6FbbfYcniLw0qm1Am7PnNYIAkd+eXxRt42LiYhjaso0WiuQ+VmrNdtwotyM+cLCfZ56AZrySP3QnKA== - dependencies: - array-back "^2.0.0" - glob "^7.1.3" - -file-set@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/file-set/-/file-set-3.0.0.tgz#85e689c7fe7b95bdd7e11bab0dd50488cd8e01be" - integrity sha512-B/SdeSIeRv7VlOgIjtH3dkxMI+tEy5m+OeCXfAUsirBoVoY+bGtsmvmmTFPm/G23TBY4RiTtjpcgePCfwXRjqA== - dependencies: - array-back "^4.0.0" - glob "^7.1.5" - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-replace@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" - integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== - dependencies: - array-back "^3.0.1" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== - dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" - -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== - -follow-redirects@^1.10.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43" - integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg== - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - -fs-readdir-recursive@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" - integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== - -fs-then-native@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fs-then-native/-/fs-then-native-2.0.0.tgz#19a124d94d90c22c8e045f2e8dd6ebea36d48c67" - integrity sha1-GaEk2U2QwiyOBF8ujdbr6jbUjGc= - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -genius-lyrics@^4.2.9: - version "4.2.9" - resolved "https://registry.yarnpkg.com/genius-lyrics/-/genius-lyrics-4.2.9.tgz#87d12946589d3e96df4e100c51805aa5046de2c7" - integrity sha512-BQm/gmaXEckLAc/Z9ZsGNWxh4CHudx0G1Key8Rnv0xFcqmrxIvssJIDBgDPJLqB6dpVas3uj6LQng1yMFtxfNA== - dependencies: - axios "^0.21.1" - cheerio "^1.0.0-rc.9" - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -glob-parent@^5.0.0, glob-parent@^5.1.2, glob-parent@~5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob@^7.0.0, glob@^7.1.1, glob@^7.1.3, glob@^7.1.5: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== - dependencies: - type-fest "^0.8.1" - -graceful-fs@^4.1.11, graceful-fs@^4.1.9: - version "4.2.6" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" - integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== - -handlebars@^4.5.3: - version "4.7.7" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" - integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== - dependencies: - minimist "^1.2.5" - neo-async "^2.6.0" - source-map "^0.6.1" - wordwrap "^1.0.0" - optionalDependencies: - uglify-js "^3.1.4" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-symbols@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" - integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -himalaya@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/himalaya/-/himalaya-1.1.0.tgz#31724ae9d35714cd7c6f4be94888953f3604606a" - integrity sha512-LLase1dHCRMel68/HZTFft0N0wti0epHr3nNY7ynpLbyZpmrKMQ8YIpiOV77TM97cNpC8Wb2n6f66IRggwdWPw== - -html-encoding-sniffer@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" - integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== - dependencies: - whatwg-encoding "^1.0.5" - -htmlparser2@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" - integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.0.0" - domutils "^2.5.2" - entities "^2.0.0" - -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - -https-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== - dependencies: - agent-base "6" - debug "4" - -iconv-lite@0.4.24, iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -import-fresh@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.3, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inquirer@^7.0.0: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.19" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.6.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= - dependencies: - binary-extensions "^1.0.0" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-core-module@^2.2.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" - integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== - dependencies: - has "^1.0.3" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -isarray@1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js2xmlparser@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-4.0.1.tgz#670ef71bc5661f089cc90481b99a05a1227ae3bd" - integrity sha512-KrPTolcw6RocpYjdC7pL7v62e55q7qOMHvLX1UCLc5AAS8qeJ6nukarEJAF2KL2PZxlbGueEbINqZR2bDe/gUw== - dependencies: - xmlcreate "^2.0.3" - -jsdoc-api@^5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/jsdoc-api/-/jsdoc-api-5.0.4.tgz#6b60cddaa4e7ff9a2e139acfc19ecaa9c48f8575" - integrity sha512-1KMwLnfo0FyhF06TQKzqIm8BiY1yoMIGICxRdJHUjzskaHMzHMmpLlmNFgzoa4pAC8t1CDPK5jWuQTvv1pBsEQ== - dependencies: - array-back "^4.0.0" - cache-point "^1.0.0" - collect-all "^1.0.3" - file-set "^2.0.1" - fs-then-native "^2.0.0" - jsdoc "^3.6.3" - object-to-spawn-args "^1.1.1" - temp-path "^1.0.0" - walk-back "^3.0.1" - -jsdoc-babel@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsdoc-babel/-/jsdoc-babel-0.5.0.tgz#7217b8820469fe600dccfdee895648c6a0dd4a2e" - integrity sha512-PYfTbc3LNTeR8TpZs2M94NLDWqARq0r9gx3SvuziJfmJS7/AeMKvtj0xjzOX0R/4MOVA7/FqQQK7d6U0iEoztQ== - dependencies: - jsdoc-regex "^1.0.1" - lodash "^4.17.10" - -jsdoc-parse@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/jsdoc-parse/-/jsdoc-parse-4.0.1.tgz#07949b13b1659c2bbc5217560d77b46a060cb86d" - integrity sha512-qIObw8yqYZjrP2qxWROB5eLQFLTUX2jRGLhW9hjo2CC2fQVlskidCIzjCoctwsDvauBp2a/lR31jkSleczSo8Q== - dependencies: - array-back "^4.0.0" - lodash.omit "^4.5.0" - lodash.pick "^4.4.0" - reduce-extract "^1.0.0" - sort-array "^2.0.0" - test-value "^3.0.0" - -jsdoc-regex@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/jsdoc-regex/-/jsdoc-regex-1.0.1.tgz#8424428d5b563ad8c5c7fbec079b9a8b09c8dcfa" - integrity sha1-hCRCjVtWOtjFx/vsB5uaiwnI3Po= - -jsdoc-to-markdown@^5.0.1: - version "5.0.3" - resolved "https://registry.yarnpkg.com/jsdoc-to-markdown/-/jsdoc-to-markdown-5.0.3.tgz#32cdd8683609141199b42a5b7045d91647a5758b" - integrity sha512-tQv5tBV0fTYidRQtE60lJKxE98mmuLcYuITFDKQiDPE9hGccpeEGUNFcVkInq1vigyuPnZmt79bQ8wv2GKjY0Q== - dependencies: - array-back "^4.0.1" - command-line-tool "^0.8.0" - config-master "^3.1.0" - dmd "^4.0.5" - jsdoc-api "^5.0.4" - jsdoc-parse "^4.0.1" - walk-back "^4.0.0" - -jsdoc@^3.6.3: - version "3.6.7" - resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-3.6.7.tgz#00431e376bed7f9de4716c6f15caa80e64492b89" - integrity sha512-sxKt7h0vzCd+3Y81Ey2qinupL6DpRSZJclS04ugHDNmRUXGzqicMJ6iwayhSA0S0DwwX30c5ozyUthr1QKF6uw== - dependencies: - "@babel/parser" "^7.9.4" - bluebird "^3.7.2" - catharsis "^0.9.0" - escape-string-regexp "^2.0.0" - js2xmlparser "^4.0.1" - klaw "^3.0.0" - markdown-it "^10.0.0" - markdown-it-anchor "^5.2.7" - marked "^2.0.3" - mkdirp "^1.0.4" - requizzle "^0.2.3" - strip-json-comments "^3.1.0" - taffydb "2.6.2" - underscore "~1.13.1" - -jsdom@^16.5.3: - version "16.6.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.6.0.tgz#f79b3786682065492a3da6a60a4695da983805ac" - integrity sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg== - dependencies: - abab "^2.0.5" - acorn "^8.2.4" - acorn-globals "^6.0.0" - cssom "^0.4.4" - cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" - escodegen "^2.0.0" - form-data "^3.0.0" - html-encoding-sniffer "^2.0.1" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.1.0" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.5.0" - ws "^7.4.5" - xml-name-validator "^3.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= - -json5@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" - integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== - dependencies: - minimist "^1.2.5" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -klaw@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-3.0.0.tgz#b11bec9cf2492f06756d6e809ab73a2910259146" - integrity sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g== - dependencies: - graceful-fs "^4.1.9" - -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -libsodium-wrappers@^0.7.9: - version "0.7.9" - resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.9.tgz#4ffc2b69b8f7c7c7c5594a93a4803f80f6d0f346" - integrity sha512-9HaAeBGk1nKTRFRHkt7nzxqCvnkWTjn1pdjKgcUnZxj0FyOP4CnhgFhMdrFfgNsukijBGyBLpP2m2uKT1vuWhQ== - dependencies: - libsodium "^0.7.0" - -libsodium@^0.7.0: - version "0.7.9" - resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.9.tgz#4bb7bcbf662ddd920d8795c227ae25bbbfa3821b" - integrity sha512-gfeADtR4D/CM0oRUviKBViMGXZDgnFdMKMzHsvBdqLBHd9ySi6EtYnmuhHVDDYgYpAO8eU8hEY+F8vIUAPh08A== - -linkify-it@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf" - integrity sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw== - dependencies: - uc.micro "^1.0.1" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= - -lodash.omit@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" - integrity sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA= - -lodash.padend@^4.6.1: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.padend/-/lodash.padend-4.6.1.tgz#53ccba047d06e158d311f45da625f4e49e6f166e" - integrity sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4= - -lodash.pick@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" - integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= - -lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.7.0: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -m3u8stream@^0.8.3: - version "0.8.4" - resolved "https://registry.yarnpkg.com/m3u8stream/-/m3u8stream-0.8.4.tgz#15b49d0c2b510755ea43c1e53f85d7aaa4dc65c2" - integrity sha512-sco80Db+30RvcaIOndenX6E6oQNgTiBKeJbFPc+yDXwPQIkryfboEbCvXPlBRq3mQTCVPQO93TDVlfRwqpD35w== - dependencies: - miniget "^4.0.0" - sax "^1.2.4" - -make-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - -make-dir@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - -markdown-it-anchor@^5.2.7: - version "5.3.0" - resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz#d549acd64856a8ecd1bea58365ef385effbac744" - integrity sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA== - -markdown-it@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-10.0.0.tgz#abfc64f141b1722d663402044e43927f1f50a8dc" - integrity sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg== - dependencies: - argparse "^1.0.7" - entities "~2.0.0" - linkify-it "^2.0.0" - mdurl "^1.0.1" - uc.micro "^1.0.5" - -marked@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e" - integrity sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg== - -marked@^2.0.3: - version "2.0.7" - resolved "https://registry.yarnpkg.com/marked/-/marked-2.0.7.tgz#bc5b857a09071b48ce82a1f7304913a993d4b7d1" - integrity sha512-BJXxkuIfJchcXOJWTT2DOL+yFWifFv2yGYOUzvXg8Qz610QKw+sHCvTMYwA+qWGhlA2uivBezChZ/pBy1tWdkQ== - -mdurl@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" - integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= - -micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -mime-db@1.48.0: - version "1.48.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d" - integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== - -mime-types@^2.1.12: - version "2.1.31" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b" - integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg== - dependencies: - mime-db "1.48.0" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -miniget@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/miniget/-/miniget-4.2.1.tgz#11a1c24817a059e292378eb9cff4328d9240c665" - integrity sha512-O/DduzDR6f+oDtVype9S/Qu5hhnx73EDYGyZKwU/qN82lehFZdfhoa4DT51SpsO+8epYrB3gcRmws56ROfTIoQ== - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -minipass@^3.0.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" - integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== - dependencies: - yallist "^4.0.0" - -minizlib@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp2@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp2/-/mkdirp2-1.0.4.tgz#56de1f8f5c93cf2199906362eba0f9f262ee4437" - integrity sha512-Q2PKB4ZR4UPtjLl76JfzlgSCUZhSV1AXQgAZa1qt5RiaALFjP/CDrGvFBrOz7Ck6McPcwMAxTsJvWOUjOU8XMw== - -mkdirp@^0.5.1, mkdirp@^0.5.3: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -mkdirp@^1.0.3, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - -neo-async@^2.6.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -node-addon-api@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" - integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== - -node-fetch@2.6.1, node-fetch@^2.6.0, node-fetch@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" - integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== - -node-releases@^1.1.71: - version "1.1.73" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.73.tgz#dd4e81ddd5277ff846b80b52bb40c49edf7a7b20" - integrity sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg== - -nopt@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" - integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== - dependencies: - abbrev "1" - -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npmlog@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -nth-check@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.0.tgz#1bb4f6dac70072fc313e8c9cd1417b5074c0a125" - integrity sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q== - dependencies: - boolbase "^1.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -nwsapi@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" - integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== - -object-assign@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-get@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/object-get/-/object-get-2.1.1.tgz#1dad63baf6d94df184d1c58756cc9be55b174dac" - integrity sha512-7n4IpLMzGGcLEMiQKsNR7vCe+N5E9LORFrtNUVy4sO3dj9a3HedZCxEL2T7QuLhcHN1NBuBsMOKaOsAYI9IIvg== - -object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object-to-spawn-args@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-to-spawn-args/-/object-to-spawn-args-1.1.1.tgz#77da8827f073d011c9e1b173f895781470246785" - integrity sha1-d9qIJ/Bz0BHJ4bFz+JV4FHAkZ4U= - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.assign@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -onetime@^5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -optionator@^0.8.1, optionator@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -p-limit@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse5-htmlparser2-tree-adapter@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" - integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== - dependencies: - parse5 "^6.0.1" - -parse5@6.0.1, parse5@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -path-parse@^1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -picomatch@^2.0.4, picomatch@^2.2.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" - integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - -prettier@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.1.tgz#76903c3f8c4449bc9ac597acefa24dc5ad4cbea6" - integrity sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA== - -prism-media@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/prism-media/-/prism-media-1.2.9.tgz#8d4f97b36efdfc82483eb8d3db64020767866f36" - integrity sha512-UHCYuqHipbTR1ZsXr5eg4JUmHER8Ss4YEb9Azn+9zzJ7/jlTtD1h0lc4g6tNx3eMlB8Mp6bfll0LPMAV4R6r3Q== - -prism-media@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/prism-media/-/prism-media-1.3.1.tgz#418acd2b122bedea2e834056d678f9a5ad2943ae" - integrity sha512-nyYAa3KB4qteJIqdguKmwxTJgy55xxUtkJ3uRnOvO5jO+frci+9zpRXw6QZVcfDeva3S654fU9+26P2OSTzjHw== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -psl@^1.1.33: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -readable-stream@^2.0.2, readable-stream@^2.0.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - -readdirp@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" - integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== - dependencies: - picomatch "^2.2.1" - -reduce-extract@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/reduce-extract/-/reduce-extract-1.0.0.tgz#67f2385beda65061b5f5f4312662e8b080ca1525" - integrity sha1-Z/I4W+2mUGG19fQxJmLosIDKFSU= - dependencies: - test-value "^1.0.1" - -reduce-flatten@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-1.0.1.tgz#258c78efd153ddf93cb561237f61184f3696e327" - integrity sha1-JYx479FT3fk8tWEjf2EYTzaW4yc= - -reduce-flatten@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-3.0.1.tgz#3db6b48ced1f4dbe4f4f5e31e422aa9ff0cd21ba" - integrity sha512-bYo+97BmUUOzg09XwfkwALt4PQH1M5L0wzKerBt6WLm3Fhdd43mMS89HiT1B9pJIqko/6lWx3OnV4J9f2Kqp5Q== - -reduce-unique@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/reduce-unique/-/reduce-unique-2.0.1.tgz#fb34b90e89297c1e08d75dcf17e9a6443ea71081" - integrity sha512-x4jH/8L1eyZGR785WY+ePtyMNhycl1N2XOLxhCbzZFaqF4AXjLzqSxa2UHgJ2ZVR/HHyPOvl1L7xRnW8ye5MdA== - -reduce-without@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/reduce-without/-/reduce-without-1.0.1.tgz#68ad0ead11855c9a37d4e8256c15bbf87972fc8c" - integrity sha1-aK0OrRGFXJo31OglbBW7+Hly/Iw= - dependencies: - test-value "^2.0.0" - -regenerate-unicode-properties@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" - integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== - dependencies: - regenerate "^1.4.0" - -regenerate@^1.4.0: - version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" - integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== - -regenerator-runtime@^0.13.4: - version "0.13.7" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" - integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== - -regenerator-transform@^0.14.2: - version "0.14.5" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" - integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== - dependencies: - "@babel/runtime" "^7.8.4" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== - -regexpu-core@^4.7.1: - version "4.7.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" - integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ== - dependencies: - regenerate "^1.4.0" - regenerate-unicode-properties "^8.2.0" - regjsgen "^0.5.1" - regjsparser "^0.6.4" - unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.2.0" - -regjsgen@^0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" - integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== - -regjsparser@^0.6.4: - version "0.6.9" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.9.tgz#b489eef7c9a2ce43727627011429cf833a7183e6" - integrity sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ== - dependencies: - jsesc "~0.5.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -requizzle@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/requizzle/-/requizzle-0.2.3.tgz#4675c90aacafb2c036bd39ba2daa4a1cb777fded" - integrity sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ== - dependencies: - lodash "^4.17.14" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -resolve@^1.14.2, resolve@^1.3.2: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -reverbnation-scraper@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/reverbnation-scraper/-/reverbnation-scraper-2.0.0.tgz#c17539aba218cc29033a63e732ba3e4953cb5bd5" - integrity sha512-t1Mew5QC9QEVEry5DXyagvci2O+TgXTGoMHbNoW5NRz6LTOzK/DLHUpnrQwloX8CVX5z1a802vwHM3YgUVOvKg== - dependencies: - node-fetch "^2.6.0" - -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - -rxjs@^6.6.0: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sax@^1.1.3, sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== - dependencies: - xmlchars "^2.2.0" - -semver@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== - -semver@^5.3.0, semver@^5.5.0, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.3.5: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" - -set-blocking@^2.0.0, set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== - -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -sort-array@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/sort-array/-/sort-array-2.0.0.tgz#38a9c6da27fd7d147b42e60554f281187b4df472" - integrity sha1-OKnG2if9fRR7QuYFVPKBGHtN9HI= - dependencies: - array-back "^1.0.4" - object-get "^2.1.0" - typical "^2.6.0" - -soundcloud-scraper@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/soundcloud-scraper/-/soundcloud-scraper-5.0.0.tgz#3f4e9d9fc9ee79cbaf6cdd64f462ad6803e25ac1" - integrity sha512-8Rt7WbW85AqiFoKkemF5BKsGAThLGnhOi13ztctAI0Y/wso/iuR97yiVXK1eYRc2YqaD8gkpKUAjEY7bOxLxnw== - dependencies: - cheerio "^1.0.0-rc.9" - m3u8stream "^0.8.3" - node-fetch "^2.6.1" - -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@^0.5.17: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - -source-map@^0.5.0, source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -spotify-uri@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/spotify-uri/-/spotify-uri-2.2.0.tgz#8db641615cf6e122284874287fe39e89595922df" - integrity sha512-uUybj02bfyfCoZ0MJ80MkqbKxtIVRJfbRGk05KJFq1li3zb7yNfN1f+TAw4wcXgp7jLWExeiw2wyPQXZ8PHtfg== - -spotify-url-info@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/spotify-url-info/-/spotify-url-info-2.2.3.tgz#2f08400479f00472fb488eff4bd3c485db99361a" - integrity sha512-cZTE5nOnaAjIiaHG9psVYqKXWOlNUIgSU2e+bNInRaYZNgmVgOcKH0D7V1nSER3gv3h5BXvOo0EJTtrMQQo1bA== - dependencies: - cross-fetch "~3.1.4" - himalaya "~1.1.0" - spotify-uri "~2.2.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -stream-connect@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/stream-connect/-/stream-connect-1.0.2.tgz#18bc81f2edb35b8b5d9a8009200a985314428a97" - integrity sha1-GLyB8u2zW4tdmoAJIAqYUxRCipc= - dependencies: - array-back "^1.0.2" - -stream-via@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/stream-via/-/stream-via-1.0.4.tgz#8dccbb0ac909328eb8bc8e2a4bd3934afdaf606c" - integrity sha512-DBp0lSvX5G9KGRDTkR/R+a29H+Wk2xItOF+MpZLLNDWbEV9tGPnqLPxHEYjmiz8xGtJHRIqmI+hCjmNzqoA4nQ== - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2": - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string-width@^4.1.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" - integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - -strip-json-comments@^3.0.1, strip-json-comments@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -table-layout@^0.4.2: - version "0.4.5" - resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-0.4.5.tgz#d906de6a25fa09c0c90d1d08ecd833ecedcb7378" - integrity sha512-zTvf0mcggrGeTe/2jJ6ECkJHAQPIYEwDoqsiqBjI24mvRmQbInK5jq33fyypaCBxX08hMkfmdOqj6haT33EqWw== - dependencies: - array-back "^2.0.0" - deep-extend "~0.6.0" - lodash.padend "^4.6.1" - typical "^2.6.1" - wordwrapjs "^3.0.0" - -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== - dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" - -taffydb@2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.6.2.tgz#7cbcb64b5a141b6a2efc2c5d2c67b4e150b2a268" - integrity sha1-fLy2S1oUG2ou/CxdLGe04VCyomg= - -tar@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.0.tgz#d1724e9bcc04b977b18d5c573b333a2207229a83" - integrity sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^3.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - -temp-path@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/temp-path/-/temp-path-1.0.0.tgz#24b1543973ab442896d9ad367dd9cbdbfafe918b" - integrity sha1-JLFUOXOrRCiW2a02fdnL2/r+kYs= - -test-value@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/test-value/-/test-value-1.1.0.tgz#a09136f72ec043d27c893707c2b159bfad7de93f" - integrity sha1-oJE29y7AQ9J8iTcHwrFZv6196T8= - dependencies: - array-back "^1.0.2" - typical "^2.4.2" - -test-value@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/test-value/-/test-value-2.1.0.tgz#11da6ff670f3471a73b625ca4f3fdcf7bb748291" - integrity sha1-Edpv9nDzRxpztiXKTz/c97t0gpE= - dependencies: - array-back "^1.0.3" - typical "^2.6.0" - -test-value@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/test-value/-/test-value-3.0.0.tgz#9168c062fab11a86b8d444dd968bb4b73851ce92" - integrity sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ== - dependencies: - array-back "^2.0.0" - typical "^2.6.1" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -tiny-typed-emitter@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/tiny-typed-emitter/-/tiny-typed-emitter-2.0.3.tgz#4335e3a75127ae7faba91b02e91615d97dc8db7d" - integrity sha512-MaCqhHlp6EAWN25yqBlajgd4scxxI2eJr7+EgoUAOV9UkMU3us/yp2bEnc2yOvyeDF8TUWuaz3zZCPGTKFJIpA== - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.1.2" - -tr46@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" - integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== - dependencies: - punycode "^2.1.1" - -ts-node@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.0.0.tgz#05f10b9a716b0b624129ad44f0ea05dac84ba3be" - integrity sha512-ROWeOIUvfFbPZkoDis0L/55Fk+6gFQNZwwKPLinacRl6tsxstTF1DbAcLKkovwnpKMVvOMHP1TIbnwXwtLg1gg== - dependencies: - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - source-map-support "^0.5.17" - yn "3.1.1" - -tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" - integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== - -tslint-config-prettier@^1.18.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz#75f140bde947d35d8f0d238e0ebf809d64592c37" - integrity sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg== - -tslint@^6.1.3: - version "6.1.3" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904" - integrity sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg== - dependencies: - "@babel/code-frame" "^7.0.0" - builtin-modules "^1.1.1" - chalk "^2.3.0" - commander "^2.12.1" - diff "^4.0.1" - glob "^7.1.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" - mkdirp "^0.5.3" - resolve "^1.3.2" - semver "^5.3.0" - tslib "^1.13.0" - tsutils "^2.29.0" - -tsubaki@^1.3.2: - version "1.3.9" - resolved "https://registry.yarnpkg.com/tsubaki/-/tsubaki-1.3.9.tgz#3e7e3eeb1e85ab010329ebd84266b9b4ef5ccb6c" - integrity sha512-neUK2wk0vu12jbuyTDYx9UcYZFXsyjkbQmZAWOKQ6d+dBnJG6E7VTS+3jUjEpwapLyp7bfojbl/pHVZj7oqbPw== - -tsutils@^2.29.0: - version "2.29.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" - integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== - dependencies: - tslib "^1.8.1" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - dependencies: - prelude-ls "~1.1.2" - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -typescript@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.2.tgz#399ab18aac45802d6f2498de5054fcbbe716a805" - integrity sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw== - -typical@^2.4.2, typical@^2.6.0, typical@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/typical/-/typical-2.6.1.tgz#5c080e5d661cbbe38259d2e70a3c7253e873881d" - integrity sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0= - -typical@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" - integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== - -uc.micro@^1.0.1, uc.micro@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" - integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== - -uglify-js@^3.1.4: - version "3.13.9" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.9.tgz#4d8d21dcd497f29cfd8e9378b9df123ad025999b" - integrity sha512-wZbyTQ1w6Y7fHdt8sJnHfSIuWeDgk6B5rCb4E/AM6QNNPbOMIZph21PW5dRB3h7Df0GszN+t7RuUH6sWK5bF0g== - -underscore@~1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.1.tgz#0c1c6bd2df54b6b69f2314066d65b6cde6fcf9d1" - integrity sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g== - -unicode-canonical-property-names-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" - integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== - -unicode-match-property-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" - integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== - dependencies: - unicode-canonical-property-names-ecmascript "^1.0.4" - unicode-property-aliases-ecmascript "^1.0.4" - -unicode-match-property-value-ecmascript@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" - integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== - -unicode-property-aliases-ecmascript@^1.0.4: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" - integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -universalify@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -upath@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" - integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -v8-compile-cache@^2.0.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" - integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== - dependencies: - xml-name-validator "^3.0.0" - -walk-back@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/walk-back/-/walk-back-2.0.1.tgz#554e2a9d874fac47a8cb006bf44c2f0c4998a0a4" - integrity sha1-VU4qnYdPrEeoywBr9EwvDEmYoKQ= - -walk-back@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/walk-back/-/walk-back-3.0.1.tgz#0c0012694725604960d6c2f75aaf1a1e7d455d35" - integrity sha512-umiNB2qLO731Sxbp6cfZ9pwURJzTnftxE4Gc7hq8n/ehkuXC//s9F65IEIJA2ZytQZ1ZOsm/Fju4IWx0bivkUQ== - -walk-back@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/walk-back/-/walk-back-4.0.0.tgz#9e4ad2bd72038f3beed2d83180f9fd40b233bfab" - integrity sha512-kudCA8PXVQfrqv2mFTG72vDBRi8BKWxGgFLwPpzHcpZnSwZk93WMwUDVcLHWNsnm+Y0AC4Vb6MUNRgaHfyV2DQ== - -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== - -webidl-conversions@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" - integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== - -whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - -whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - -whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.6.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.6.0.tgz#27c0205a4902084b872aecb97cf0f2a7a3011f4c" - integrity sha512-os0KkeeqUOl7ccdDT1qqUcS4KH4tcBTSKK5Nl5WKb2lyxInIZ/CpjkqKa1Ss12mjfdcRX9mHmPPs7/SxG1Hbdw== - dependencies: - lodash "^4.7.0" - tr46 "^2.1.0" - webidl-conversions "^6.1.0" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -wordwrap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= - -wordwrapjs@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-3.0.0.tgz#c94c372894cadc6feb1a66bff64e1d9af92c5d1e" - integrity sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw== - dependencies: - reduce-flatten "^1.0.1" - typical "^2.6.1" - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - -ws@^7.4.4, ws@^7.4.5, ws@^7.4.6: - version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" - integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== - -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - -xmlcreate@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/xmlcreate/-/xmlcreate-2.0.3.tgz#df9ecd518fd3890ab3548e1b811d040614993497" - integrity sha512-HgS+X6zAztGa9zIK3Y3LXuJes33Lz9x+YyTxgrkIdabu2vqcGOWwdfCpf1hWLRrd553wd4QCDf6BBO6FfdsRiQ== - -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yargs-parser@^15.0.1: - version "15.0.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.1.tgz#54786af40b820dcb2fb8025b11b4d659d76323b3" - integrity sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs@^14.0.0: - version "14.2.3" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414" - integrity sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg== - dependencies: - cliui "^5.0.0" - decamelize "^1.2.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^15.0.1" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -youtube-sr@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/youtube-sr/-/youtube-sr-4.1.4.tgz#5ea646812264a951df7b1f6094f9f7406001dde6" - integrity sha512-0KSPNTmrxDOKCMsZlLB4NYKwuDXZFGR/wu7BD4mVA0huiw22jRQYc8oj2BQADmS8uGadzkFy3Z4DKRtDWuNN+A== - dependencies: - node-fetch "^2.6.1" - -ytdl-core@^4.8.2: - version "4.8.2" - resolved "https://registry.yarnpkg.com/ytdl-core/-/ytdl-core-4.8.2.tgz#f034ad942c5d958f5987fc8ff0b0639664ae2fb7" - integrity sha512-O3n++YcgZawaXJwbPmnRDgfN6b4kU0DpNdkI9Na5yM3JAdfJmoq5UHc8v9Xjgjr1RilQUUh7mhDnRRPDtKr0Kg== - dependencies: - m3u8stream "^0.8.3" - miniget "^4.0.0" - sax "^1.1.3" From 349cb4be2a606bf2adb8b231756e3770841faa7b Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sat, 19 Jun 2021 18:04:08 +0545 Subject: [PATCH 081/215] remove unused imports --- src/Player.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Player.ts b/src/Player.ts index c535f39..bab0540 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -1,4 +1,4 @@ -import { Client, Collection, Guild, GuildResolvable, Snowflake, User, UserResolvable, VoiceState } from "discord.js"; +import { Client, Collection, GuildResolvable, Snowflake, User, VoiceState } from "discord.js"; import { TypedEmitter as EventEmitter } from "tiny-typed-emitter"; import { Queue } from "./Structures/Queue"; import { VoiceUtils } from "./VoiceInterface/VoiceUtils"; From b7060b26e73a1340e11310fa7899749265095097 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sat, 19 Jun 2021 18:57:58 +0545 Subject: [PATCH 082/215] encryption lib --- package.json | 6 ++---- src/Player.ts | 5 +++++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index a256fe1..29e7d6c 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "dependencies": { "@discordjs/voice": "^0.5.0", "discord-ytdl-core": "^5.0.3", + "libsodium-wrappers": "^0.7.9", "soundcloud-scraper": "^5.0.0", "spotify-url-info": "^2.2.3", "tiny-typed-emitter": "^2.0.3", @@ -68,7 +69,7 @@ "@types/node": "^15.12.2", "@types/ws": "^7.4.4", "discord-api-types": "^0.18.1", - "discord.js": "^13.0.0-dev.a3cbcca13da1af416c219bd64a0a6e84bb87a057", + "discord.js": "^13.0.0-dev.807ea2d3c197c7c6556bd1c894114932f6657d49", "discord.js-docgen": "discordjs/docgen#ts-patch", "jsdoc-babel": "^0.5.0", "prettier": "^2.3.1", @@ -77,8 +78,5 @@ "tslint": "^6.1.3", "tslint-config-prettier": "^1.18.0", "typescript": "^4.3.2" - }, - "optionalDependencies": { - "libsodium-wrappers": "^0.7.9" } } diff --git a/src/Player.ts b/src/Player.ts index bab0540..44e0510 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -12,6 +12,7 @@ import Spotify from "spotify-url-info"; import { Client as SoundCloud } from "soundcloud-scraper"; import { Playlist } from "./Structures/Playlist"; import { ExtractorModel } from "./Structures/ExtractorModel"; +import { generateDependencyReport } from "@discordjs/voice"; const soundcloud = new SoundCloud(); @@ -424,6 +425,10 @@ class DiscordPlayer extends EventEmitter { return prev; } + scanDeps() { + return generateDependencyReport(); + } + *[Symbol.iterator]() { yield* Array.from(this.queues.values()); } From bab7cb8907bacc738900c8bba13ca015455cbbc4 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sat, 19 Jun 2021 18:59:30 +0545 Subject: [PATCH 083/215] example --- example/music-bot/package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/example/music-bot/package.json b/example/music-bot/package.json index 1fd2bd5..c096953 100644 --- a/example/music-bot/package.json +++ b/example/music-bot/package.json @@ -10,7 +10,6 @@ "license": "MIT", "dependencies": { "@discordjs/opus": "^0.5.3", - "discord.js": "^13.0.0-dev.807ea2d3c197c7c6556bd1c894114932f6657d49", - "libsodium-wrappers": "^0.7.9" + "discord.js": "^13.0.0-dev.807ea2d3c197c7c6556bd1c894114932f6657d49" } } From e50066ee0deb24846306ff9360c77cfdcd4f4181 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sat, 19 Jun 2021 19:00:15 +0545 Subject: [PATCH 084/215] README --- example/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 example/README.md diff --git a/example/README.md b/example/README.md new file mode 100644 index 0000000..602c11c --- /dev/null +++ b/example/README.md @@ -0,0 +1,2 @@ +# Discord Player Examples +This section contains example bot(s) made with Discord Player. \ No newline at end of file From 8902d06057a3f4d73e998b0e948c4ae5e988d186 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sat, 19 Jun 2021 19:57:13 +0545 Subject: [PATCH 085/215] update queue --- src/Structures/Queue.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index c690b59..f746b60 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -150,7 +150,7 @@ class Queue { */ setPaused(paused?: boolean) { if (!this.connection) return false; - return paused ? this.connection.pause() : this.connection.resume(); + return paused ? this.connection.pause(true) : this.connection.resume(); } /** @@ -180,8 +180,7 @@ class Queue { */ setRepeatMode(mode: QueueRepeatMode) { if (![QueueRepeatMode.OFF, QueueRepeatMode.QUEUE, QueueRepeatMode.TRACK].includes(mode)) throw new Error(`Unknown repeat mode "${mode}"!`); - const prev = this.repeatMode; - if (mode === prev) return false; + if (mode === this.repeatMode) return false; this.repeatMode = mode; return true; } From d38aded085755bddc087255df343e3db226c0341 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sat, 19 Jun 2021 23:55:38 +0545 Subject: [PATCH 086/215] feat: audio filters support --- src/Structures/Queue.ts | 37 +++++++++++++++++++-- src/VoiceInterface/BasicStreamDispatcher.ts | 2 +- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index f746b60..91fdf5c 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -2,11 +2,12 @@ import { Collection, Guild, StageChannel, VoiceChannel } from "discord.js"; import { Player } from "../Player"; import { StreamDispatcher } from "../VoiceInterface/BasicStreamDispatcher"; import Track from "./Track"; -import { PlayerOptions, PlayOptions, QueueRepeatMode } from "../types/types"; +import { PlayerOptions, PlayOptions, QueueFilters, QueueRepeatMode } from "../types/types"; import ytdl from "discord-ytdl-core"; import { AudioResource, StreamType } from "@discordjs/voice"; import { Util } from "../utils/Util"; import YouTube from "youtube-sr"; +import AudioFilters from "../utils/AudioFilters"; class Queue { public readonly guild: Guild; @@ -18,7 +19,9 @@ class Queue { public playing = false; public metadata?: T = null; public repeatMode: QueueRepeatMode = 0; + public _streamTime: number = 0; public _cooldownsTimeout = new Collection(); + private _activeFilters: any = {}; /** * Queue constructor @@ -200,6 +203,30 @@ class Queue { this.setVolume(amount); } + get streamTime() { + if (!this.connection) return 0; + return this._streamTime + this.connection.streamTime; + } + + async setFilters(filters: QueueFilters) { + if (!Object.keys(filters).length) return; + + const _filters: any[] = []; + + for (const filter in filters) { + if (filters[filter as keyof QueueFilters] === true) _filters.push(filter); + } + + const newFilters = AudioFilters.create(_filters); + + return await this.play(this.current, { + immediate: true, + filtersUpdate: true, + seek: this.streamTime, + encoderArgs: ["-af", newFilters] + }); + } + /** * Plays previous track * @returns {Promise} @@ -216,7 +243,7 @@ class Queue { async play(src?: Track, options: PlayOptions = {}): Promise { if (!this.connection || !this.connection.voiceConnection) throw new Error("Voice connection is not available, use .connect()!"); if (src && (this.playing || this.tracks.length) && !options.immediate) return this.addTrack(src); - const track = options.filtersUpdate && !options.immediate ? this.current : src ?? this.tracks.shift(); + const track = options.filtersUpdate && !options.immediate ? src || this.current : src ?? this.tracks.shift(); if (!track) return; if (!options.filtersUpdate) { @@ -261,8 +288,10 @@ class Queue { data: track }); + if (options.seek) this._streamTime = options.seek; + const dispatcher = await this.connection.playStream(resource); - dispatcher.setVolume(this.options.initialVolume); + dispatcher.setVolume(options.encoderArgs && options.encoderArgs[1]?.includes("bass=g") ? this.options.initialVolume + 35 : this.options.initialVolume); // need to use these events here dispatcher.once("start", () => { @@ -274,6 +303,8 @@ class Queue { this.playing = false; if (options.filtersUpdate) return; + this._streamTime = 0; + if (!this.tracks.length && this.repeatMode === QueueRepeatMode.OFF) { if (this.options.leaveOnEnd) this.destroy(); this.player.emit("queueEnd", this); diff --git a/src/VoiceInterface/BasicStreamDispatcher.ts b/src/VoiceInterface/BasicStreamDispatcher.ts index 57fc0b9..1b33657 100644 --- a/src/VoiceInterface/BasicStreamDispatcher.ts +++ b/src/VoiceInterface/BasicStreamDispatcher.ts @@ -160,7 +160,7 @@ class BasicStreamDispatcher extends EventEmitter { get streamTime() { if (!this.audioResource) return 0; - return this.audioResource.playbackDuration; + return Math.floor(this.audioResource.playbackDuration / 1000); } get paused() { From bcf410aef21eda81c8ddd7a5766eae4bc5257b29 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sat, 19 Jun 2021 23:59:50 +0545 Subject: [PATCH 087/215] remove immediate play --- src/Structures/Queue.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 91fdf5c..db07fc9 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -220,7 +220,6 @@ class Queue { const newFilters = AudioFilters.create(_filters); return await this.play(this.current, { - immediate: true, filtersUpdate: true, seek: this.streamTime, encoderArgs: ["-af", newFilters] From 644adb9202e4ac6b5f32f3818658159db53161cc Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 20 Jun 2021 00:30:17 +0545 Subject: [PATCH 088/215] fix: create all filters --- src/utils/AudioFilters.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/AudioFilters.ts b/src/utils/AudioFilters.ts index 9af7bbb..2da0700 100644 --- a/src/utils/AudioFilters.ts +++ b/src/utils/AudioFilters.ts @@ -78,7 +78,7 @@ const FilterList = { }, toString() { - return `${Object.values(this).join(",")}`; + return this.names.map(m => (this as any)[m]).join(","); }, create(filter?: FiltersName[]): string { From 9fc0d9dde6c8a3b16f1582397a6a2e95a5853855 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 20 Jun 2021 01:00:47 +0545 Subject: [PATCH 089/215] fix example --- example/music-bot/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/example/music-bot/package.json b/example/music-bot/package.json index c096953..02573c6 100644 --- a/example/music-bot/package.json +++ b/example/music-bot/package.json @@ -10,6 +10,7 @@ "license": "MIT", "dependencies": { "@discordjs/opus": "^0.5.3", + "discord-player": "^5.0.0-dev.0", "discord.js": "^13.0.0-dev.807ea2d3c197c7c6556bd1c894114932f6657d49" } } From 2bb209baf5e4cbeb6cf95604317f5474c4f8ac1b Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 20 Jun 2021 01:33:48 +0545 Subject: [PATCH 090/215] fix: premature close --- package.json | 2 +- src/Structures/Queue.ts | 5 +++-- src/utils/AudioFilters.ts | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 29e7d6c..96503e7 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "homepage": "https://discord-player.js.org", "dependencies": { "@discordjs/voice": "^0.5.0", - "discord-ytdl-core": "^5.0.3", + "discord-ytdl-core": "^5.0.4", "libsodium-wrappers": "^0.7.9", "soundcloud-scraper": "^5.0.0", "spotify-url-info": "^2.2.3", diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index db07fc9..494db44 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -220,6 +220,7 @@ class Queue { const newFilters = AudioFilters.create(_filters); return await this.play(this.current, { + immediate: true, filtersUpdate: true, seek: this.streamTime, encoderArgs: ["-af", newFilters] @@ -267,7 +268,7 @@ class Queue { fmt: "s16le", encoderArgs: options.encoderArgs ?? [], seek: options.seek - }).on("error", (err) => this.player.emit("error", this, err)); + }).on("error", (err) => (err.message.toLowerCase().includes("premature close") ? null : this.player.emit("error", this, err))); } else { stream = ytdl .arbitraryStream( @@ -279,7 +280,7 @@ class Queue { seek: options.seek } ) - .on("error", (err) => this.player.emit("error", this, err)); + .on("error", (err) => (err.message.toLowerCase().includes("premature close") ? null : this.player.emit("error", this, err))); } const resource: AudioResource = this.connection.createStream(stream, { diff --git a/src/utils/AudioFilters.ts b/src/utils/AudioFilters.ts index 2da0700..ccb12b3 100644 --- a/src/utils/AudioFilters.ts +++ b/src/utils/AudioFilters.ts @@ -78,7 +78,7 @@ const FilterList = { }, toString() { - return this.names.map(m => (this as any)[m]).join(","); + return this.names.map((m) => (this as any)[m]).join(","); }, create(filter?: FiltersName[]): string { From df731445fdab99b9a3b69945fd8f6177988d6adf Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 20 Jun 2021 11:22:59 +0545 Subject: [PATCH 091/215] audio filters --- src/Structures/Queue.ts | 51 ++++++++++++++++----- src/VoiceInterface/BasicStreamDispatcher.ts | 2 +- src/types/types.ts | 1 + src/utils/AudioFilters.ts | 3 +- 4 files changed, 43 insertions(+), 14 deletions(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 494db44..588976b 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -19,9 +19,9 @@ class Queue { public playing = false; public metadata?: T = null; public repeatMode: QueueRepeatMode = 0; - public _streamTime: number = 0; + private _streamTime: number = 0; public _cooldownsTimeout = new Collection(); - private _activeFilters: any = {}; + private _activeFilters: any[] = []; /** * Queue constructor @@ -61,7 +61,7 @@ class Queue { useSafeSearch: false, disableAutoRegister: false, fetchBeforeQueued: false, - initialVolume: 50 + initialVolume: 100 } as PlayerOptions, options ); @@ -205,11 +205,34 @@ class Queue { get streamTime() { if (!this.connection) return 0; - return this._streamTime + this.connection.streamTime; + const playbackTime = this._streamTime + this.connection.streamTime; + const NC = this._activeFilters.includes("nightcore") ? 1.25 : null; + const VW = this._activeFilters.includes("vaporwave") ? 0.8 : null; + + if (NC && VW) return playbackTime * (NC + VW); + return NC ? playbackTime * NC : VW ? playbackTime * VW : playbackTime; } - async setFilters(filters: QueueFilters) { - if (!Object.keys(filters).length) return; + getFiltersEnabled() { + return AudioFilters.names.filter((x) => this._activeFilters.includes(x)); + } + + getFiltersDisabled() { + return AudioFilters.names.filter((x) => !this._activeFilters.includes(x)); + } + + async setFilters(filters?: QueueFilters) { + if (!filters || !Object.keys(filters).length) { + // reset filters + const streamTime = this.streamTime; + this._activeFilters = []; + return await this.play(this.current, { + immediate: true, + filtersUpdate: true, + seek: streamTime, + encoderArgs: [] + }); + } const _filters: any[] = []; @@ -217,12 +240,16 @@ class Queue { if (filters[filter as keyof QueueFilters] === true) _filters.push(filter); } + if (this._activeFilters.join("") === _filters.join("")) return; + const newFilters = AudioFilters.create(_filters); + const streamTime = this.streamTime; + this._activeFilters = _filters; return await this.play(this.current, { immediate: true, filtersUpdate: true, - seek: this.streamTime, + seek: streamTime, encoderArgs: ["-af", newFilters] }); } @@ -266,8 +293,8 @@ class Queue { // discord-ytdl-core opusEncoded: false, fmt: "s16le", - encoderArgs: options.encoderArgs ?? [], - seek: options.seek + encoderArgs: options.encoderArgs ?? this._activeFilters.length ? ["-af", AudioFilters.create(this._activeFilters)] : [], + seek: options.seek ? options.seek / 1000 : 0 }).on("error", (err) => (err.message.toLowerCase().includes("premature close") ? null : this.player.emit("error", this, err))); } else { stream = ytdl @@ -276,8 +303,8 @@ class Queue { { opusEncoded: false, fmt: "s16le", - encoderArgs: options.encoderArgs ?? [], - seek: options.seek + encoderArgs: options.encoderArgs ?? this._activeFilters.length ? ["-af", AudioFilters.create(this._activeFilters)] : [], + seek: options.seek ? options.seek / 1000 : 0 } ) .on("error", (err) => (err.message.toLowerCase().includes("premature close") ? null : this.player.emit("error", this, err))); @@ -291,7 +318,7 @@ class Queue { if (options.seek) this._streamTime = options.seek; const dispatcher = await this.connection.playStream(resource); - dispatcher.setVolume(options.encoderArgs && options.encoderArgs[1]?.includes("bass=g") ? this.options.initialVolume + 35 : this.options.initialVolume); + dispatcher.setVolume(this.options.initialVolume); // need to use these events here dispatcher.once("start", () => { diff --git a/src/VoiceInterface/BasicStreamDispatcher.ts b/src/VoiceInterface/BasicStreamDispatcher.ts index 1b33657..57fc0b9 100644 --- a/src/VoiceInterface/BasicStreamDispatcher.ts +++ b/src/VoiceInterface/BasicStreamDispatcher.ts @@ -160,7 +160,7 @@ class BasicStreamDispatcher extends EventEmitter { get streamTime() { if (!this.audioResource) return 0; - return Math.floor(this.audioResource.playbackDuration / 1000); + return this.audioResource.playbackDuration; } get paused() { diff --git a/src/types/types.ts b/src/types/types.ts index 2b4bd47..75861fa 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -19,6 +19,7 @@ export type QueueFilters = { reverse?: boolean; treble?: boolean; normalizer?: boolean; + normalizer2?: boolean; surrounding?: boolean; pulsator?: boolean; subboost?: boolean; diff --git a/src/utils/AudioFilters.ts b/src/utils/AudioFilters.ts index ccb12b3..55f8a3b 100644 --- a/src/utils/AudioFilters.ts +++ b/src/utils/AudioFilters.ts @@ -34,7 +34,7 @@ import { FiltersName } from "../types/types"; */ const FilterList = { - bassboost: "bass=g=20", + bassboost: "bass=g=20:f=110:w=0.3", "8D": "apulsator=hz=0.09", vaporwave: "aresample=48000,asetrate=48000*0.8", nightcore: "aresample=48000,asetrate=48000*1.25", @@ -44,6 +44,7 @@ const FilterList = { reverse: "areverse", treble: "treble=g=5", normalizer: "dynaudnorm=g=101", + normalizer2: "acompressor", surrounding: "surround", pulsator: "apulsator=hz=1", subboost: "asubboost", From def049ab4bdec3a7a05b5da24b7ed6cc3d07f7c8 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 20 Jun 2021 11:34:50 +0545 Subject: [PATCH 092/215] filters --- src/utils/AudioFilters.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/utils/AudioFilters.ts b/src/utils/AudioFilters.ts index 55f8a3b..9ea4d75 100644 --- a/src/utils/AudioFilters.ts +++ b/src/utils/AudioFilters.ts @@ -12,7 +12,8 @@ import { FiltersName } from "../types/types"; * @property {String} vibrato The vibrato filter * @property {String} reverse The reverse filter * @property {String} treble The treble filter - * @property {String} normalizer The normalizer filter + * @property {String} normalizer The normalizer filter (dynamic audio normalizer based) + * @property {String} normalizer2 The normalizer filter (audio compressor based) * @property {String} surrounding The surrounding filter * @property {String} pulsator The pulsator filter * @property {String} subboost The subboost filter From 31be4aa76dab22bcc1409302ae9387239364410b Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 20 Jun 2021 11:35:59 +0545 Subject: [PATCH 093/215] filters --- src/utils/AudioFilters.ts | 60 +++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/src/utils/AudioFilters.ts b/src/utils/AudioFilters.ts index 9ea4d75..f5e6686 100644 --- a/src/utils/AudioFilters.ts +++ b/src/utils/AudioFilters.ts @@ -2,36 +2,36 @@ import { FiltersName } from "../types/types"; /** * The available audio filters - * @typedef {Object} AudioFilters - * @property {String} bassboost The bassboost filter - * @property {String} 8D The 8D filter - * @property {String} vaporwave The vaporwave filter - * @property {String} nightcore The nightcore filter - * @property {String} phaser The phaser filter - * @property {String} tremolo The tremolo filter - * @property {String} vibrato The vibrato filter - * @property {String} reverse The reverse filter - * @property {String} treble The treble filter - * @property {String} normalizer The normalizer filter (dynamic audio normalizer based) - * @property {String} normalizer2 The normalizer filter (audio compressor based) - * @property {String} surrounding The surrounding filter - * @property {String} pulsator The pulsator filter - * @property {String} subboost The subboost filter - * @property {String} kakaoke The kakaoke filter - * @property {String} flanger The flanger filter - * @property {String} gate The gate filter - * @property {String} haas The haas filter - * @property {String} mcompand The mcompand filter - * @property {String} mono The mono filter - * @property {String} mstlr The mstlr filter - * @property {String} mstrr The mstrr filter - * @property {String} compressor The compressor filter - * @property {String} expander The expander filter - * @property {String} softlimiter The softlimiter filter - * @property {String} chorus The chorus filter - * @property {String} chorus2d The chorus2d filter - * @property {String} chorus3d The chorus3d filter - * @property {String} fadein The fadein filter + * @typedef {object} AudioFilters + * @property {string} bassboost The bassboost filter + * @property {string} 8D The 8D filter + * @property {string} vaporwave The vaporwave filter + * @property {string} nightcore The nightcore filter + * @property {string} phaser The phaser filter + * @property {string} tremolo The tremolo filter + * @property {string} vibrato The vibrato filter + * @property {string} reverse The reverse filter + * @property {string} treble The treble filter + * @property {string} normalizer The normalizer filter (dynamic audio normalizer based) + * @property {string} normalizer2 The normalizer filter (audio compressor based) + * @property {string} surrounding The surrounding filter + * @property {string} pulsator The pulsator filter + * @property {string} subboost The subboost filter + * @property {string} kakaoke The kakaoke filter + * @property {string} flanger The flanger filter + * @property {string} gate The gate filter + * @property {string} haas The haas filter + * @property {string} mcompand The mcompand filter + * @property {string} mono The mono filter + * @property {string} mstlr The mstlr filter + * @property {string} mstrr The mstrr filter + * @property {string} compressor The compressor filter + * @property {string} expander The expander filter + * @property {string} softlimiter The softlimiter filter + * @property {string} chorus The chorus filter + * @property {string} chorus2d The chorus2d filter + * @property {string} chorus3d The chorus3d filter + * @property {string} fadein The fadein filter */ const FilterList = { From da0b85077ba88443aea51a50d782073b6fe8c6e5 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 20 Jun 2021 12:42:17 +0545 Subject: [PATCH 094/215] feat: seek --- src/Structures/Queue.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 588976b..c5c2e6d 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -254,6 +254,20 @@ class Queue { }); } + async seek(position: number) { + if (!this.playing || !this.current) return false; + if (position < 1) position = 0; + if (position >= this.current.durationMS) return this.skip(); + + await this.play(this.current, { + immediate: true, + filtersUpdate: true, // to stop events + seek: position + }); + + return true; + } + /** * Plays previous track * @returns {Promise} From 0e96714baacaa588dcc9a8d9d1bdb537c5d18585 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 20 Jun 2021 12:58:27 +0545 Subject: [PATCH 095/215] base autoplay --- src/Structures/Queue.ts | 24 +++++++++++++++++++----- src/types/types.ts | 3 ++- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index c5c2e6d..9595bb9 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -340,7 +340,7 @@ class Queue { if (!options.filtersUpdate) this.player.emit("trackStart", this, this.current); }); - dispatcher.once("finish", () => { + dispatcher.once("finish", async () => { this.playing = false; if (options.filtersUpdate) return; @@ -350,10 +350,24 @@ class Queue { if (this.options.leaveOnEnd) this.destroy(); this.player.emit("queueEnd", this); } else { - if (this.repeatMode === QueueRepeatMode.TRACK) return void this.play(Util.last(this.previousTracks), { immediate: true }); - if (this.repeatMode === QueueRepeatMode.QUEUE) this.tracks.push(Util.last(this.previousTracks)); - const nextTrack = this.tracks.shift(); - this.play(nextTrack, { immediate: true }); + if (this.repeatMode !== QueueRepeatMode.AUTOPLAY) { + if (this.repeatMode === QueueRepeatMode.TRACK) return void this.play(Util.last(this.previousTracks), { immediate: true }); + if (this.repeatMode === QueueRepeatMode.QUEUE) this.tracks.push(Util.last(this.previousTracks)); + const nextTrack = this.tracks.shift(); + this.play(nextTrack, { immediate: true }); + } else { + if (track.source !== "youtube" || track.raw?.source !== "youtube") { + if (this.options.leaveOnEnd) this.destroy(); + return void this.player.emit("queueEnd", this); + } + const info = await ytdl.getInfo(track.source).catch(() => {}); + if (!info) { + if (this.options.leaveOnEnd) this.destroy(); + return void this.player.emit("queueEnd", this); + }; + + // @todo: add track parser and player + } } }); } diff --git a/src/types/types.ts b/src/types/types.ts index 75861fa..ae71766 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -196,7 +196,8 @@ export interface SearchOptions { export enum QueueRepeatMode { OFF = 0, TRACK = 1, - QUEUE = 2 + QUEUE = 2, + AUTOPLAY = 3 } export interface PlaylistInitData { From 9b5747216e95e87f2bcd5d418e53138ee2316dd6 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 20 Jun 2021 13:21:05 +0545 Subject: [PATCH 096/215] feat: autoplay --- src/Structures/Queue.ts | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 9595bb9..6404d21 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -182,7 +182,7 @@ class Queue { * @returns {boolean} */ setRepeatMode(mode: QueueRepeatMode) { - if (![QueueRepeatMode.OFF, QueueRepeatMode.QUEUE, QueueRepeatMode.TRACK].includes(mode)) throw new Error(`Unknown repeat mode "${mode}"!`); + if (![QueueRepeatMode.OFF, QueueRepeatMode.QUEUE, QueueRepeatMode.TRACK, QueueRepeatMode.AUTOPLAY].includes(mode)) throw new Error(`Unknown repeat mode "${mode}"!`); if (mode === this.repeatMode) return false; this.repeatMode = mode; return true; @@ -355,18 +355,31 @@ class Queue { if (this.repeatMode === QueueRepeatMode.QUEUE) this.tracks.push(Util.last(this.previousTracks)); const nextTrack = this.tracks.shift(); this.play(nextTrack, { immediate: true }); + return; } else { - if (track.source !== "youtube" || track.raw?.source !== "youtube") { + if (![track.source, track.raw?.source].includes("youtube")) { if (this.options.leaveOnEnd) this.destroy(); return void this.player.emit("queueEnd", this); } - const info = await ytdl.getInfo(track.source).catch(() => {}); + const info = await ytdl.getInfo(track.url).then(x => x.related_videos[0]).catch(() => {}); if (!info) { if (this.options.leaveOnEnd) this.destroy(); return void this.player.emit("queueEnd", this); }; - // @todo: add track parser and player + const nextTrack = new Track(this.player, { + title: info.title, + url: `https://www.youtube.com/watch?v=${info.id}`, + duration: info.length_seconds ? Util.buildTimeCode(Util.parseMS(info.length_seconds * 1000)) : "0:00", + description: "", + thumbnail: Util.last(info.thumbnails).url, + views: parseInt(info.view_count.replace(/[^0-9]/g, "")), + author: typeof info.author === "string" ? info.author : info.author.name, + requestedBy: track.requestedBy, + source: "youtube" + }); + + this.play(nextTrack, { immediate: true }); } } }); @@ -383,6 +396,7 @@ class Queue { toJSON() { return { guild: this.guild.id, + voiceChannel: this.connection?.channel?.id, options: this.options, tracks: this.tracks.map((m) => m.toJSON()) }; From 9fcf9a86d84a80b919a8e4369a12d720ca26ecb5 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 20 Jun 2021 13:21:16 +0545 Subject: [PATCH 097/215] prettier --- src/Structures/Queue.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 6404d21..f744941 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -258,7 +258,7 @@ class Queue { if (!this.playing || !this.current) return false; if (position < 1) position = 0; if (position >= this.current.durationMS) return this.skip(); - + await this.play(this.current, { immediate: true, filtersUpdate: true, // to stop events @@ -361,11 +361,14 @@ class Queue { if (this.options.leaveOnEnd) this.destroy(); return void this.player.emit("queueEnd", this); } - const info = await ytdl.getInfo(track.url).then(x => x.related_videos[0]).catch(() => {}); + const info = await ytdl + .getInfo(track.url) + .then((x) => x.related_videos[0]) + .catch(() => {}); if (!info) { if (this.options.leaveOnEnd) this.destroy(); return void this.player.emit("queueEnd", this); - }; + } const nextTrack = new Track(this.player, { title: info.title, From 02dfa63d52fe8fcb037a68511f345a5ffe499310 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 20 Jun 2021 13:24:11 +0545 Subject: [PATCH 098/215] autoplay example --- example/music-bot/index.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/example/music-bot/index.js b/example/music-bot/index.js index 2ac0670..7ccc752 100644 --- a/example/music-bot/index.js +++ b/example/music-bot/index.js @@ -95,15 +95,19 @@ client.on("message", async (message) => { choices: [ { name: "Off", - value: 0 + value: QueueRepeatMode.OFF }, { name: "Track", - value: 1 + value: QueueRepeatMode.TRACK }, { name: "Queue", - value: 2 + value: QueueRepeatMode.QUEUE + }, + { + name: "Autoplay", + value: QueueRepeatMode.AUTOPLAY } ] } From 8defefb76d0d57890c53cd7891b44fffe026cc69 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 20 Jun 2021 14:12:57 +0545 Subject: [PATCH 099/215] audio filters --- src/types/types.ts | 2 ++ src/utils/AudioFilters.ts | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/types/types.ts b/src/types/types.ts index ae71766..0798bc1 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -38,6 +38,8 @@ export type QueueFilters = { chorus2d?: boolean; chorus3d?: boolean; fadein?: boolean; + dim?: string; + earrape?: string; }; export type TrackSource = "soundcloud" | "youtube" | "spotify" | "arbitrary"; diff --git a/src/utils/AudioFilters.ts b/src/utils/AudioFilters.ts index f5e6686..357c2b2 100644 --- a/src/utils/AudioFilters.ts +++ b/src/utils/AudioFilters.ts @@ -32,6 +32,7 @@ import { FiltersName } from "../types/types"; * @property {string} chorus2d The chorus2d filter * @property {string} chorus3d The chorus3d filter * @property {string} fadein The fadein filter + * @property {string} dim The dim filter */ const FilterList = { @@ -64,6 +65,8 @@ const FilterList = { chorus2d: "chorus=0.6:0.9:50|60:0.4|0.32:0.25|0.4:2|1.3", chorus3d: "chorus=0.5:0.9:50|60|40:0.4|0.32|0.3:0.25|0.4|0.3:2|2.3|1.3", fadein: "afade=t=in:ss=0:d=10", + dim: `afftfilt="'real=re * (1-clip((b/nb)*b,0,1))':imag='im * (1-clip((b/nb)*b,0,1))'"`, + earrape: "channelsplit,sidechaingate=level_in=64", *[Symbol.iterator](): IterableIterator<{ name: FiltersName; value: string }> { for (const [k, v] of Object.entries(this)) { From 6fa3c7265e1149a33d8dc6dd591c77f873560a99 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 20 Jun 2021 14:13:46 +0545 Subject: [PATCH 100/215] audio filters --- src/utils/AudioFilters.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/utils/AudioFilters.ts b/src/utils/AudioFilters.ts index 357c2b2..45fe9d4 100644 --- a/src/utils/AudioFilters.ts +++ b/src/utils/AudioFilters.ts @@ -33,6 +33,7 @@ import { FiltersName } from "../types/types"; * @property {string} chorus3d The chorus3d filter * @property {string} fadein The fadein filter * @property {string} dim The dim filter + * @property {string} earrape The earrape filter */ const FilterList = { From a64e9ad400af3c84d2e484a33130ea9624891b42 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 20 Jun 2021 14:32:10 +0545 Subject: [PATCH 101/215] example --- example/music-bot/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/music-bot/package.json b/example/music-bot/package.json index 02573c6..c9f1928 100644 --- a/example/music-bot/package.json +++ b/example/music-bot/package.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@discordjs/opus": "^0.5.3", - "discord-player": "^5.0.0-dev.0", + "discord-player": "^5.0.0-dev.1", "discord.js": "^13.0.0-dev.807ea2d3c197c7c6556bd1c894114932f6657d49" } } From 19fc02055af46f1fe5f729af1a6c57451038825b Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 20 Jun 2021 14:49:34 +0545 Subject: [PATCH 102/215] wakatime stats --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 87767cc..5e3c205 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ Complete framework to facilitate music commands using **[discord.js](https://dis [![downloadsBadge](https://img.shields.io/npm/dt/discord-player?style=for-the-badge)](https://npmjs.com/discord-player) [![versionBadge](https://img.shields.io/npm/v/discord-player?style=for-the-badge)](https://npmjs.com/discord-player) [![discordBadge](https://img.shields.io/discord/558328638911545423?style=for-the-badge&color=7289da)](https://androz2091.fr/discord) +[![wakatime](https://wakatime.com/badge/github/Androz2091/discord-player.svg)](https://wakatime.com/badge/github/Androz2091/discord-player) > V5 WIP From 621bd1c274d004676fb5b3cc152466a2bb4725c6 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 20 Jun 2021 14:59:47 +0545 Subject: [PATCH 103/215] fix types --- src/types/types.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/types/types.ts b/src/types/types.ts index 0798bc1..d6a3d14 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -38,8 +38,8 @@ export type QueueFilters = { chorus2d?: boolean; chorus3d?: boolean; fadein?: boolean; - dim?: string; - earrape?: string; + dim?: boolean; + earrape?: boolean; }; export type TrackSource = "soundcloud" | "youtube" | "spotify" | "arbitrary"; From 99f0c585a319d48cc5064f93d49d1928e717acae Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 20 Jun 2021 15:15:39 +0545 Subject: [PATCH 104/215] fix EPIPE on empty encoderArgs --- src/Structures/Queue.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index f744941..c8b3382 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -242,7 +242,7 @@ class Queue { if (this._activeFilters.join("") === _filters.join("")) return; - const newFilters = AudioFilters.create(_filters); + const newFilters = AudioFilters.create(_filters).trim(); const streamTime = this.streamTime; this._activeFilters = _filters; @@ -250,7 +250,7 @@ class Queue { immediate: true, filtersUpdate: true, seek: streamTime, - encoderArgs: ["-af", newFilters] + encoderArgs: !_filters.length ? undefined : ["-af", newFilters] }); } From 33f0f675067de3e943754377fbd814ed8c7b0855 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 20 Jun 2021 15:26:29 +0545 Subject: [PATCH 105/215] example --- example/music-bot/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/music-bot/index.js b/example/music-bot/index.js index 7ccc752..0d51d97 100644 --- a/example/music-bot/index.js +++ b/example/music-bot/index.js @@ -177,7 +177,7 @@ client.on("interaction", async (interaction) => { return void interaction.followUp({ content: "Could not join your voice channel!" }); } - await interaction.followUp({ content: "⏱ | Loading your track..." }); + await interaction.followUp({ content: `⏱ | Loading your ${searchResult.playlist ? "playlist" : "track"}...` }); searchResult.playlist ? queue.addTracks(searchResult.tracks) : queue.addTrack(searchResult.tracks[0]); if (!queue.playing) await queue.play(); } else if (interaction.commandName === "volume") { From a2f273d001acb5eece46b870e0312a24f45bd586 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 20 Jun 2021 15:51:52 +0545 Subject: [PATCH 106/215] disable autoplay when there are multiple tracks --- src/Structures/Queue.ts | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index c8b3382..6b08bf6 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -292,7 +292,8 @@ class Queue { this.previousTracks.push(track); } - let stream; + let stream, + pauseEvent = false; if (["youtube", "spotify"].includes(track.raw.source)) { if (track.raw.source === "spotify" && !track.raw.engine) { track.raw.engine = await YouTube.search(`${track.author} ${track.title}`, { type: "video" }) @@ -309,7 +310,10 @@ class Queue { fmt: "s16le", encoderArgs: options.encoderArgs ?? this._activeFilters.length ? ["-af", AudioFilters.create(this._activeFilters)] : [], seek: options.seek ? options.seek / 1000 : 0 - }).on("error", (err) => (err.message.toLowerCase().includes("premature close") ? null : this.player.emit("error", this, err))); + }).on("error", (err) => { + pauseEvent = true; + return err.message.toLowerCase().includes("premature close") ? null : this.player.emit("error", this, err); + }); } else { stream = ytdl .arbitraryStream( @@ -321,7 +325,10 @@ class Queue { seek: options.seek ? options.seek / 1000 : 0 } ) - .on("error", (err) => (err.message.toLowerCase().includes("premature close") ? null : this.player.emit("error", this, err))); + .on("error", (err) => { + pauseEvent = true; + return err.message.toLowerCase().includes("premature close") ? null : this.player.emit("error", this, err); + }); } const resource: AudioResource = this.connection.createStream(stream, { @@ -337,12 +344,13 @@ class Queue { // need to use these events here dispatcher.once("start", () => { this.playing = true; - if (!options.filtersUpdate) this.player.emit("trackStart", this, this.current); + if (options.filtersUpdate || pauseEvent) return; + this.player.emit("trackStart", this, this.current); }); dispatcher.once("finish", async () => { this.playing = false; - if (options.filtersUpdate) return; + if (options.filtersUpdate || pauseEvent) return; this._streamTime = 0; @@ -350,7 +358,7 @@ class Queue { if (this.options.leaveOnEnd) this.destroy(); this.player.emit("queueEnd", this); } else { - if (this.repeatMode !== QueueRepeatMode.AUTOPLAY) { + if (this.tracks.length > 1 || this.repeatMode !== QueueRepeatMode.AUTOPLAY) { if (this.repeatMode === QueueRepeatMode.TRACK) return void this.play(Util.last(this.previousTracks), { immediate: true }); if (this.repeatMode === QueueRepeatMode.QUEUE) this.tracks.push(Util.last(this.previousTracks)); const nextTrack = this.tracks.shift(); From 62287227c174e75043f6e39f23830fee7f7803f6 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 20 Jun 2021 16:07:18 +0545 Subject: [PATCH 107/215] revert last change --- src/Structures/Queue.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 6b08bf6..870e158 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -358,7 +358,7 @@ class Queue { if (this.options.leaveOnEnd) this.destroy(); this.player.emit("queueEnd", this); } else { - if (this.tracks.length > 1 || this.repeatMode !== QueueRepeatMode.AUTOPLAY) { + if (this.repeatMode !== QueueRepeatMode.AUTOPLAY) { if (this.repeatMode === QueueRepeatMode.TRACK) return void this.play(Util.last(this.previousTracks), { immediate: true }); if (this.repeatMode === QueueRepeatMode.QUEUE) this.tracks.push(Util.last(this.previousTracks)); const nextTrack = this.tracks.shift(); From b43a793e4c3986225182ece74581cf7b255f625e Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 20 Jun 2021 18:03:19 +0545 Subject: [PATCH 108/215] bump djs --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 96503e7..65710c6 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "@types/node": "^15.12.2", "@types/ws": "^7.4.4", "discord-api-types": "^0.18.1", - "discord.js": "^13.0.0-dev.807ea2d3c197c7c6556bd1c894114932f6657d49", + "discord.js": "^13.0.0-dev.1f8f3ab0f8dbd346154bbfa14a98726b8df25d57", "discord.js-docgen": "discordjs/docgen#ts-patch", "jsdoc-babel": "^0.5.0", "prettier": "^2.3.1", From 32ed41cbcb4dd4522656534808b60a00c2b40f94 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 20 Jun 2021 18:13:41 +0545 Subject: [PATCH 109/215] thanks ci --- src/VoiceInterface/VoiceUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/VoiceInterface/VoiceUtils.ts b/src/VoiceInterface/VoiceUtils.ts index 3fce5fa..00ced00 100644 --- a/src/VoiceInterface/VoiceUtils.ts +++ b/src/VoiceInterface/VoiceUtils.ts @@ -34,7 +34,7 @@ class VoiceUtils { let conn = joinVoiceChannel({ guildId: channel.guild.id, channelId: channel.id, - adapterCreator: channel.guild.voiceAdapterCreator, + adapterCreator: (channel.guild as any).voiceAdapterCreator, selfDeaf: Boolean(options.deaf) }); From fcd8a8e186f46eb62f76ac9944195fa66f85cafc Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 20 Jun 2021 20:07:09 +0545 Subject: [PATCH 110/215] feat: documentation --- docs/extractors/extractor.md | 3 - docs/faq/custom_filters.md | 2 +- docs/faq/live_video.md | 11 --- docs/faq/pause_resume.md | 15 ---- docs/general/welcome.md | 47 +++++++++--- docs/index.yml | 4 - docs/youtube/cookies.md | 2 +- docs/youtube/proxy.md | 2 +- src/Player.ts | 24 +++++- src/Structures/ExtractorModel.ts | 6 ++ src/Structures/Playlist.ts | 83 ++++++++++++++++++++- src/Structures/Queue.ts | 43 ++++++++--- src/Structures/Track.ts | 9 ++- src/VoiceInterface/BasicStreamDispatcher.ts | 57 +++++++++++++- src/VoiceInterface/VoiceUtils.ts | 31 +++++++- src/types/types.ts | 33 ++++++++ src/utils/QueryResolver.ts | 17 +++++ src/utils/Util.ts | 42 +++++++++++ tsconfig.json | 3 +- 19 files changed, 364 insertions(+), 70 deletions(-) delete mode 100644 docs/faq/live_video.md delete mode 100644 docs/faq/pause_resume.md diff --git a/docs/extractors/extractor.md b/docs/extractors/extractor.md index 9510969..dff289b 100644 --- a/docs/extractors/extractor.md +++ b/docs/extractors/extractor.md @@ -32,9 +32,6 @@ Your extractor should have 2 methods (required): url: "Some Link" } ``` - - `important: boolean` - - You can mark your Extractor as `important` by adding `important: true` to your extractor object. Doing this will disable rest of the extractors that comes after your extractor and use your extractor to get data. By default, it is set to `false`. - `version: string` diff --git a/docs/faq/custom_filters.md b/docs/faq/custom_filters.md index fd3cfa9..30e1f1c 100644 --- a/docs/faq/custom_filters.md +++ b/docs/faq/custom_filters.md @@ -8,5 +8,5 @@ const { AudioFilters } = require("discord-player"); AudioFilters.define("3D", "apulsator=hz=0.128"); // later, it can be used like this -player.setFilters(message, { "3D": true }); +queue.setFilters(message, { "3D": true }); ``` \ No newline at end of file diff --git a/docs/faq/live_video.md b/docs/faq/live_video.md deleted file mode 100644 index 40eb4be..0000000 --- a/docs/faq/live_video.md +++ /dev/null @@ -1,11 +0,0 @@ -# How to play live videos? - -You cannot play live videos by default. If you need to play the live video, just add this option: - -```js -const player = new Player(client, { - enableLive: true // enables livestream -}); -``` - -However, you cannot use audio filters with livestreams using this library! \ No newline at end of file diff --git a/docs/faq/pause_resume.md b/docs/faq/pause_resume.md deleted file mode 100644 index d0cbc54..0000000 --- a/docs/faq/pause_resume.md +++ /dev/null @@ -1,15 +0,0 @@ -# Pause and Resume is not working properly - -This is a bug in **[discord.js#5300](https://github.com/discordjs/discord.js/issues/5300)**. - -# Fix - -You have to update your command something like this: - -```diff -- client.player.resume(message); - -+ client.player.resume(message); -+ client.player.pause(message); -+ client.player.resume(message); -``` \ No newline at end of file diff --git a/docs/general/welcome.md b/docs/general/welcome.md index 2075526..5e3c205 100644 --- a/docs/general/welcome.md +++ b/docs/general/welcome.md @@ -3,6 +3,10 @@ Complete framework to facilitate music commands using **[discord.js](https://dis [![downloadsBadge](https://img.shields.io/npm/dt/discord-player?style=for-the-badge)](https://npmjs.com/discord-player) [![versionBadge](https://img.shields.io/npm/v/discord-player?style=for-the-badge)](https://npmjs.com/discord-player) +[![discordBadge](https://img.shields.io/discord/558328638911545423?style=for-the-badge&color=7289da)](https://androz2091.fr/discord) +[![wakatime](https://wakatime.com/badge/github/Androz2091/discord-player.svg)](https://wakatime.com/badge/github/Androz2091/discord-player) + +> V5 WIP ## Installation @@ -43,13 +47,13 @@ Here is the code you will need to get started with discord-player. Then, you wil ```js const Discord = require("discord.js"), -client = new Discord.Client, +client = new Discord.Client({ intents: ["GUILD_VOICE_STATES", "GUILD_MESSAGES", "GUILDS"] }), settings = { prefix: "!", token: "Your Discord Token" }; -const { Player } = require("discord-player"); +const { Player, QueryType } = require("discord-player"); // Create a new Player (you don't need any API Key) const player = new Player(client); @@ -58,7 +62,7 @@ const player = new Player(client); client.player = player; // add the trackStart event so when a song will be played this message will be sent -client.player.on("trackStart", (message, track) => message.channel.send(`Now playing ${track.title}...`)) +client.player.on("trackStart", (queue, track) => queue.metadata.channel.send(`Now playing ${track.title}...`)) client.once("ready", () => { console.log("I'm ready !"); @@ -70,10 +74,29 @@ client.on("message", async (message) => { const command = args.shift().toLowerCase(); // !play Despacito - // will play the song "Despacito" in the voice channel - if(command === "play"){ - client.player.play(message, args[0]); - // as we registered the event above, no need to send a success message here + // will play "Despacito" in the voice channel + if (command === "play") { + if (!message.member.voice.channel) return void message.reply("You are not in a voice channel!"); + if (message.guild.me.voice.channel && message.member.voice.channelID !== message.guild.me.voice.channelID) return void message.reply("You are not in my voice channel!"); + + const queue = client.player.createQueue(message.guild, { + metadata: message + }); + + // verify vc connection + try { + if (!queue.connection) await queue.connect(message.member.voice.channel); + } catch { + queue.destroy(); + return void message.reply("Could not join your voice channel!"); + } + + const track = await client.player.search(args[0], { + searchEngine: QueryType.YOUTUBE_SEARCH + }).then(x => x.tracks[1]); + if (!track) return void message.reply("Track not found!"); + + queue.play(track); } }); @@ -106,13 +129,13 @@ These bots are made by the community, they can help you build your own! * [Discord-Music](https://github.com/inhydrox/discord-music) by [inhydrox](https://github.com/inhydrox) * [Music-bot](https://github.com/ZerioDev/Music-bot) by [ZerioDev](https://github.com/ZerioDev) -## FAQ +## Advanced -### How to use cookies +### Use cookies ```js const player = new Player(client, { - ytdlDownloadOptions: { + ytdlOptions: { requestOptions: { headers: { cookie: "YOUR_YOUTUBE_COOKIE" @@ -122,7 +145,7 @@ const player = new Player(client, { }); ``` -### How to use custom proxies +### Use custom proxies ```js const HttpsProxyAgent = require("https-proxy-agent"); @@ -132,7 +155,7 @@ const proxy = "http://user:pass@111.111.111.111:8080"; const agent = HttpsProxyAgent(proxy); const player = new Player(client, { - ytdlDownloadOptions: { + ytdlOptions: { requestOptions: { agent } } }); diff --git a/docs/index.yml b/docs/index.yml index 3ab6cd4..d2ebc01 100644 --- a/docs/index.yml +++ b/docs/index.yml @@ -10,10 +10,6 @@ files: - name: Custom Filters path: custom_filters.md - - name: Livestreams - path: live_video.md - - name: Pause & Resume - path: pause_resume.md - name: YouTube files: - name: Using Cookies diff --git a/docs/youtube/cookies.md b/docs/youtube/cookies.md index 2405dcf..e448857 100644 --- a/docs/youtube/cookies.md +++ b/docs/youtube/cookies.md @@ -4,7 +4,7 @@ const { Player } = require("discord-player"); const player = new Player(client, { - ytdlDownloadOptions: { + ytdlOptions: { requestOptions: { headers: { cookie: "YOUR_YOUTUBE_COOKIE" diff --git a/docs/youtube/proxy.md b/docs/youtube/proxy.md index 3dc8ba5..35fe5a8 100644 --- a/docs/youtube/proxy.md +++ b/docs/youtube/proxy.md @@ -9,7 +9,7 @@ const proxy = "http://user:pass@111.111.111.111:8080"; const agent = HttpsProxyAgent(proxy); const player = new Player(client, { - ytdlDownloadOptions: { + ytdlOptions: { requestOptions: { agent } } }); diff --git a/src/Player.ts b/src/Player.ts index 44e0510..0e4dbcc 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -56,6 +56,13 @@ class DiscordPlayer extends EventEmitter { } } + /** + * Handles voice state update + * @param {VoiceState} oldState The old voice state + * @param {VoiceState} newState The new voice state + * @returns {void} + * @private + */ private _handleVoiceState(oldState: VoiceState, newState: VoiceState): void { const queue = this.getQueue(oldState.guild.id); if (!queue) return; @@ -141,7 +148,7 @@ class DiscordPlayer extends EventEmitter { * Search tracks * @param {string|Track} query The search query * @param {UserResolvable} requestedBy The person who requested track search - * @returns {Promise<{playlist?: Playlist; tracks: Track[]}>} + * @returns {Promise} */ async search(query: string | Track, options: SearchOptions) { if (query instanceof Track) return { playlist: null, tracks: [query] }; @@ -400,6 +407,12 @@ class DiscordPlayer extends EventEmitter { } } + /** + * @param {string} extractorName The extractor name + * @param {ExtractorModel|any} extractor The extractor object + * @param {boolean} [force=false] + * @returns {ExtractorModel} + */ use(extractorName: string, extractor: ExtractorModel | any, force = false): ExtractorModel { if (!extractorName) throw new Error("Cannot use unknown extractor!"); if (this.extractors.has(extractorName) && !force) return this.extractors.get(extractorName); @@ -418,6 +431,11 @@ class DiscordPlayer extends EventEmitter { return model; } + /** + * Removes registered extractor + * @param {string} extractorName The extractor name + * @returns {ExtractorModel} + */ unuse(extractorName: string) { if (!this.extractors.has(extractorName)) throw new Error(`Cannot find extractor "${extractorName}"`); const prev = this.extractors.get(extractorName); @@ -425,6 +443,10 @@ class DiscordPlayer extends EventEmitter { return prev; } + /** + * Generates a report of the dependencies used by the `@discordjs/voice` module. Useful for debugging. + * @returns {string} + */ scanDeps() { return generateDependencyReport(); } diff --git a/src/Structures/ExtractorModel.ts b/src/Structures/ExtractorModel.ts index 9b0ad5e..7fec971 100644 --- a/src/Structures/ExtractorModel.ts +++ b/src/Structures/ExtractorModel.ts @@ -16,6 +16,12 @@ class ExtractorModel { */ this.name = extractorName; + /** + * The raw model + * @name ExtractorModel#_raw + * @type {any} + * @private + */ Object.defineProperty(this, "_raw", { value: data, configurable: false, writable: false, enumerable: false }); } diff --git a/src/Structures/Playlist.ts b/src/Structures/Playlist.ts index bcdb7d0..5cbfa98 100644 --- a/src/Structures/Playlist.ts +++ b/src/Structures/Playlist.ts @@ -16,25 +16,106 @@ class Playlist { }; public id: string; public url: string; - public rawPlaylist?: any; + public readonly rawPlaylist?: any; + /** + * Playlist constructor + * @param {Player} player The player + * @param {PlaylistInitData} data The data + */ constructor(player: Player, data: PlaylistInitData) { + /** + * The player + * @name Playlist#player + * @type {Player} + * @readonly + */ this.player = player; + + /** + * The tracks in this playlist + * @name Playlist#tracks + * @type {Track[]} + */ this.tracks = data.tracks ?? []; + + /** + * The author of this playlist + * @name Playlist#author + * @type {object} + */ this.author = data.author; + + /** + * The description + * @name Playlist#description + * @type {string} + */ this.description = data.description; + + /** + * The thumbnail of this playlist + * @name Playlist#thumbnail + * @type {string} + */ this.thumbnail = data.thumbnail; + + /** + * The playlist type: + * - `album` + * - `playlist` + * @name Playlist#type + * @type {string} + */ this.type = data.type; + + /** + * The source of this playlist: + * - `youtube` + * - `soundcloud` + * - `spotify` + * - `arbitrary` + * @name Playlist#source + * @type {string} + */ this.source = data.source; + + /** + * The playlist id + * @name Playlist#id + * @type {string} + */ this.id = data.id; + + /** + * The playlist url + * @name Playlist#url + * @type {string} + */ this.url = data.url; + + /** + * The playlist title + * @type {string} + */ this.title = data.title; + + /** + * @name Playlist#rawPlaylist + * @type {any} + * @readonly + */ } *[Symbol.iterator]() { yield* this.tracks; } + /** + * JSON representation of this playlist + * @param {boolean} [withTracks=true] If it should build json with tracks + * @returns {PlaylistJSON} + */ toJSON(withTracks = true) { const payload = { id: this.id, diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 870e158..a40cbdd 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -27,18 +27,20 @@ class Queue { * Queue constructor * @param {Player} player The player that instantiated this queue * @param {Guild} guild The guild that instantiated this queue - * @param {PlayerOptions={}} options Player options for the queue + * @param {PlayerOptions} [options={}] Player options for the queue */ constructor(player: Player, guild: Guild, options: PlayerOptions = {}) { /** * The player that instantiated this queue * @type {Player} + * @readonly */ this.player = player; /** * The guild that instantiated this queue * @type {Guild} + * @readonly */ this.guild = guild; @@ -69,7 +71,7 @@ class Queue { /** * Returns current track - * @returns {Track} + * @type {Track} */ get current() { return this.connection.audioResource?.metadata ?? this.tracks[0]; @@ -85,7 +87,7 @@ class Queue { /** * Connects to a voice channel - * @param {StageChannel|VoiceChannel} channel + * @param {StageChannel|VoiceChannel} channel The voice/stage channel * @returns {Promise} */ async connect(channel: StageChannel | VoiceChannel) { @@ -110,6 +112,8 @@ class Queue { /** * Destroys this queue + * @param {boolean} [disconnect=this.options.leaveOnStop] If it should leave on destroy + * @returns {void} */ destroy(disconnect = this.options.leaveOnStop) { this.connection.end(); @@ -159,6 +163,7 @@ class Queue { /** * Sets bitrate * @param {number|"auto"} bitrate bitrate to set + * @returns {void} */ setBitrate(bitrate: number | "auto") { if (!this.connection?.audioResource?.encoder) return; @@ -189,20 +194,22 @@ class Queue { } /** - * Returns current volume amount + * The current volume amount + * @type {number} */ get volume() { if (!this.connection) return 100; return this.connection.volume; } - /** - * Alternative volume setter - */ set volume(amount: number) { this.setVolume(amount); } + /** + * The stream time of this queue + * @type {number} + */ get streamTime() { if (!this.connection) return 0; const playbackTime = this._streamTime + this.connection.streamTime; @@ -213,14 +220,27 @@ class Queue { return NC ? playbackTime * NC : VW ? playbackTime * VW : playbackTime; } + /** + * Returns enabled filters + * @returns {AudioFilters} + */ getFiltersEnabled() { return AudioFilters.names.filter((x) => this._activeFilters.includes(x)); } + /** + * Returns disabled filters + * @returns {AudioFilters} + */ getFiltersDisabled() { return AudioFilters.names.filter((x) => !this._activeFilters.includes(x)); } + /** + * Sets filters + * @param {QueueFilters} filters Queue filters + * @returns {Promise} + */ async setFilters(filters?: QueueFilters) { if (!filters || !Object.keys(filters).length) { // reset filters @@ -254,6 +274,11 @@ class Queue { }); } + /** + * Seeks to the given time + * @param {number} position The position + * @returns {boolean} + */ async seek(position: number) { if (!this.playing || !this.current) return false; if (position < 1) position = 0; @@ -277,8 +302,8 @@ class Queue { } /** - * @param {Track} [src] The track to play (if empty, uses first track from the queue) - * @param {PlayOptions={}} options The options + * @param {Track} [src] The track to play (if empty, uses first track from the queue) + * @param {PlayOptions} [options={}] The options * @returns {Promise} */ async play(src?: Track, options: PlayOptions = {}): Promise { diff --git a/src/Structures/Track.ts b/src/Structures/Track.ts index 9d3a2b6..f03a6a6 100644 --- a/src/Structures/Track.ts +++ b/src/Structures/Track.ts @@ -92,6 +92,13 @@ class Track { * @type {RawTrackData} */ + /** + * The track id + * @name Track#_trackID + * @type {number} + * @readonly + */ + void this._patch(data); } @@ -153,7 +160,7 @@ class Track { /** * Raw JSON representation of this track - * @returns {object} + * @returns {TrackJSON} */ toJSON(hidePlaylist?: boolean) { return { diff --git a/src/VoiceInterface/BasicStreamDispatcher.ts b/src/VoiceInterface/BasicStreamDispatcher.ts index 57fc0b9..3201cc2 100644 --- a/src/VoiceInterface/BasicStreamDispatcher.ts +++ b/src/VoiceInterface/BasicStreamDispatcher.ts @@ -24,18 +24,37 @@ export interface VoiceEvents { finish: () => any; } -class BasicStreamDispatcher extends EventEmitter { +class StreamDispatcher extends EventEmitter { public readonly voiceConnection: VoiceConnection; public readonly audioPlayer: AudioPlayer; public readonly channel: VoiceChannel | StageChannel; public audioResource?: AudioResource; private readyLock: boolean = false; + /** + * Creates new connection object + * @param {VoiceConnection} connection The connection + * @param {VoiceChannel|StageChannel} channel The connected channel + */ constructor(connection: VoiceConnection, channel: VoiceChannel | StageChannel) { super(); + /** + * The voice connection + * @type {VoiceConnection} + */ this.voiceConnection = connection; + + /** + * The audio player + * @type {AudioPlayer} + */ this.audioPlayer = createAudioPlayer(); + + /** + * The voice channel + * @type {VoiceChannel|StageChannel} + */ this.channel = channel; this.voiceConnection.on("stateChange", async (_, newState) => { @@ -85,7 +104,7 @@ class BasicStreamDispatcher extends EventEmitter { /** * Creates stream * @param {Readable|Duplex|string} src The stream source - * @param {({type?:StreamType;data?:any;})} [ops] Options + * @param {object} [ops={}] Options * @returns {AudioResource} */ createStream(src: Readable | Duplex | string, ops?: { type?: StreamType; data?: any }) { @@ -100,6 +119,7 @@ class BasicStreamDispatcher extends EventEmitter { /** * The player status + * @type {AudioPlayerStatus} */ get status() { return this.audioPlayer.state.status; @@ -107,6 +127,7 @@ class BasicStreamDispatcher extends EventEmitter { /** * Disconnects from voice + * @returns {void} */ disconnect() { try { @@ -116,16 +137,26 @@ class BasicStreamDispatcher extends EventEmitter { /** * Stops the player + * @returns {void} */ end() { this.audioPlayer.stop(); } + /** + * Pauses the stream playback + * @param {boolean} [interpolateSilence=false] If true, the player will play 5 packets of silence after pausing to prevent audio glitches. + * @returns {boolean} + */ pause(interpolateSilence?: boolean) { const success = this.audioPlayer.pause(interpolateSilence); return success; } + /** + * Resumes the stream playback + * @returns {boolean} + */ resume() { const success = this.audioPlayer.unpause(); return success; @@ -133,7 +164,8 @@ class BasicStreamDispatcher extends EventEmitter { /** * Play stream - * @param {AudioResource} resource The audio resource to play + * @param {AudioResource} [resource=this.audioResource] The audio resource to play + * @returns {Promise} */ async playStream(resource: AudioResource = this.audioResource) { if (!resource) throw new Error("Audio resource is not available!"); @@ -144,6 +176,11 @@ class BasicStreamDispatcher extends EventEmitter { return this; } + /** + * Sets playback volume + * @param {number} value The volume amount + * @returns {boolean} + */ setVolume(value: number) { if (!this.audioResource || isNaN(value) || value < 0 || value > Infinity) return false; @@ -152,20 +189,32 @@ class BasicStreamDispatcher extends EventEmitter { return true; } + /** + * The current volume + * @type {number} + */ get volume() { if (!this.audioResource || !this.audioResource.volume) return 100; const currentVol = this.audioResource.volume.volume; return Math.round(Math.pow(currentVol, 1 / 1.660964) * 100); } + /** + * The playback time + * @type {number} + */ get streamTime() { if (!this.audioResource) return 0; return this.audioResource.playbackDuration; } + /** + * The paused state + * @type {boolean} + */ get paused() { return [AudioPlayerStatus.AutoPaused, AudioPlayerStatus.Paused].includes(this.audioPlayer.state.status); } } -export { BasicStreamDispatcher as StreamDispatcher }; +export { StreamDispatcher as StreamDispatcher }; diff --git a/src/VoiceInterface/VoiceUtils.ts b/src/VoiceInterface/VoiceUtils.ts index 00ced00..d2632af 100644 --- a/src/VoiceInterface/VoiceUtils.ts +++ b/src/VoiceInterface/VoiceUtils.ts @@ -3,13 +3,24 @@ import { entersState, joinVoiceChannel, VoiceConnection, VoiceConnectionStatus } import { StreamDispatcher } from "./BasicStreamDispatcher"; class VoiceUtils { - public cache = new Collection(); + public cache: Collection; /** - * Joins a voice channel + * The voice utils + */ + constructor() { + /** + * The cache where voice utils stores stream managers + * @type {Collection} + */ + this.cache = new Collection(); + } + + /** + * Joins a voice channel, creating basic stream dispatch manager * @param {StageChannel|VoiceChannel} channel The voice channel - * @param {({deaf?: boolean;maxTime?: number;})} [options] Join options - * @returns {Promise} + * @param {object} [options={}] Join options + * @returns {Promise} */ public async connect( channel: VoiceChannel | StageChannel, @@ -24,6 +35,12 @@ class VoiceUtils { return sub; } + /** + * Joins a voice channel + * @param {StageChannel|VoiceChannel} [channel] The voice/stage channel to join + * @param {object} [options={}] Join options + * @returns {VoiceConnection} + */ public async join( channel: VoiceChannel | StageChannel, options?: { @@ -50,12 +67,18 @@ class VoiceUtils { /** * Disconnects voice connection * @param {VoiceConnection} connection The voice connection + * @returns {void} */ public disconnect(connection: VoiceConnection | StreamDispatcher) { if (connection instanceof StreamDispatcher) return connection.voiceConnection.destroy(); return connection.destroy(); } + /** + * Returns Discord Player voice connection + * @param {Snowflake} guild The guild id + * @returns {StreamDispatcher} + */ public getConnection(guild: Snowflake) { return this.cache.get(guild); } diff --git a/src/types/types.ts b/src/types/types.ts index d6a3d14..4f23802 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -140,38 +140,71 @@ export enum QueryType { export interface PlayerEvents { /** * Emitted when bot gets disconnected from a voice channel + * @event Player#botDisconnect + * @param {Queue} queue The queue */ botDisconnect: (queue: Queue) => any; + /** * Emitted when the voice channel is empty + * @event Player#channelEmpty + * @param {Queue} queue The queue */ channelEmpty: (queue: Queue) => any; + /** * Emitted when bot connects to a voice channel + * @event Player#connectionCreate + * @param {Queue} queue The queue + * @param {StreamDispatcher} connection The discord player connection object */ connectionCreate: (queue: Queue, connection: StreamDispatcher) => any; + /** * Debug information + * @event Player#debug + * @param {Queue} queue The queue + * @param {string} message The message */ debug: (queue: Queue, message: string) => any; + /** * Emitted on error + * This event should handled properly otherwise it may crash your process! + * @event Player#error + * @param {Queue} queue The queue + * @param {Error} error The error */ error: (queue: Queue, error: Error) => any; + /** * Emitted when queue ends + * @event Player#queueEnd + * @param {Queue} queue The queue */ queueEnd: (queue: Queue) => any; + /** * Emitted when a single track is added + * @event Player#trackAdd + * @param {Queue} queue The queue + * @param {Track} track The track */ trackAdd: (queue: Queue, track: Track) => any; + /** * Emitted when multiple tracks are added + * @event Player#tracksAdd + * @param {Queue} queue The queue + * @param {Track[]} tracks The tracks */ tracksAdd: (queue: Queue, track: Track[]) => any; + /** * Emitted when a track starts playing + * @event Player#trackStart + * @param {Queue} queue The queue + * @param {Track} track The track */ trackStart: (queue: Queue, track: Track) => any; } diff --git a/src/utils/QueryResolver.ts b/src/utils/QueryResolver.ts index 5713202..19554a8 100644 --- a/src/utils/QueryResolver.ts +++ b/src/utils/QueryResolver.ts @@ -16,6 +16,18 @@ const attachmentRegex = // scary things above *sigh* class QueryResolver { + /** + * Query resolver + */ + constructor() { + throw new Error("Cannot instantiate static class!"); + } + + /** + * Resolves the given search query + * @param {string} query The query + * @returns {QueryType} + */ static resolve(query: string): QueryType { if (SoundcloudValidateURL(query, "track")) return QueryType.SOUNDCLOUD_TRACK; if (SoundcloudValidateURL(query, "playlist") || query.includes("/sets/")) return QueryType.SOUNDCLOUD_PLAYLIST; @@ -32,6 +44,11 @@ class QueryResolver { return QueryType.YOUTUBE_SEARCH; } + /** + * Parses vimeo id from url + * @param {string} query The query + * @returns {string} + */ static getVimeoID(query: string): string { return QueryResolver.resolve(query) === QueryType.VIMEO ? query diff --git a/src/utils/Util.ts b/src/utils/Util.ts index 7d7488a..187813b 100644 --- a/src/utils/Util.ts +++ b/src/utils/Util.ts @@ -2,12 +2,29 @@ import { StageChannel, VoiceChannel } from "discord.js"; import { TimeData } from "../types/types"; class Util { + /** + * Utils + */ + constructor() { + throw new Error("Cannot instantiate static class"); + } + + /** + * Creates duration string + * @param {object} durObj The duration object + * @returns {string} + */ static durationString(durObj: object) { return Object.values(durObj) .map((m) => (isNaN(m) ? 0 : m)) .join(":"); } + /** + * Parses milliseconds to consumable time object + * @param {number} milliseconds The time in ms + * @returns {TimeData} + */ static parseMS(milliseconds: number) { const round = milliseconds > 0 ? Math.floor : Math.ceil; @@ -19,6 +36,11 @@ class Util { } as TimeData; } + /** + * Builds time code + * @param {TimeData} duration The duration object + * @returns {string} + */ static buildTimeCode(duration: TimeData) { const items = Object.keys(duration); const required = ["days", "hours", "minutes", "seconds"]; @@ -31,15 +53,30 @@ class Util { return final.length <= 3 ? `0:${final.padStart(2, "0") || 0}` : final; } + /** + * Picks last item of the given array + * @param {any[]} arr The array + * @returns {any} + */ static last(arr: T[]): T { if (!Array.isArray(arr)) return; return arr[arr.length - 1]; } + /** + * Checks if the voice channel is empty + * @param {VoiceChannel|StageChannel} channel The voice channel + * @returns {boolean} + */ static isVoiceEmpty(channel: VoiceChannel | StageChannel) { return channel.members.filter((member) => !member.user.bot).size === 0; } + /** + * Safer require + * @param {string} id Node require id + * @returns {any} + */ static require(id: string) { try { return require(id); @@ -48,6 +85,11 @@ class Util { } } + /** + * Asynchronous timeout + * @param {number} time The time in ms to wait + * @returns {Promise} + */ static wait(time: number) { return new Promise((r) => setTimeout(r, time).unref()); } diff --git a/tsconfig.json b/tsconfig.json index 5fc7c84..629bcf8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,8 +6,7 @@ "outDir": "./lib", "strict": true, "strictNullChecks": false, - "esModuleInterop": true, - "removeComments": true + "esModuleInterop": true }, "include": [ "src/**/*" From 141cb5f8805ddfb8807b5eecc161be62fa54fdc2 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 20 Jun 2021 20:11:16 +0545 Subject: [PATCH 111/215] rename player --- src/Player.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Player.ts b/src/Player.ts index 0e4dbcc..170cb6d 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -16,7 +16,7 @@ import { generateDependencyReport } from "@discordjs/voice"; const soundcloud = new SoundCloud(); -class DiscordPlayer extends EventEmitter { +class Player extends EventEmitter { public readonly client: Client; public readonly options: DiscordPlayerInitOptions = { autoRegisterExtractor: true, @@ -456,4 +456,4 @@ class DiscordPlayer extends EventEmitter { } } -export { DiscordPlayer as Player }; +export { Player }; From e978cf466515bf9060aa8b40eb932b81c6a9db7f Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 20 Jun 2021 20:31:57 +0545 Subject: [PATCH 112/215] documentation --- package.json | 4 +-- src/Player.ts | 61 ++++++++++++++++++++++++++++++++++++++++++++++ src/types/types.ts | 53 ---------------------------------------- 3 files changed, 63 insertions(+), 55 deletions(-) diff --git a/package.json b/package.json index 65710c6..83b3476 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,8 @@ "build": "rimraf lib && tsc", "format": "prettier --write \"src/**/*.ts\" \"example/**/*.ts\"", "lint": "tslint -p tsconfig.json", - "docs": "docgen --jsdoc jsdoc.json --verbose --source src/*.ts src/**/*.ts --custom docs/index.yml --output docs/docs.json", - "docs:test": "docgen --jsdoc jsdoc.json --verbose --source src/*.ts src/**/*.ts --custom docs/index.yml" + "docs": "docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/index.yml --output docs/docs.json", + "docs:test": "docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/index.yml" }, "funding": "https://github.com/Androz2091/discord-player?sponsor=1", "contributors": [ diff --git a/src/Player.ts b/src/Player.ts index 170cb6d..73a3e01 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -456,4 +456,65 @@ class Player extends EventEmitter { } } +/** + * Emitted when bot gets disconnected from a voice channel + * @event Player#botDisconnect + * @param {Queue} queue The queue + */ + +/** + * Emitted when the voice channel is empty + * @event Player#channelEmpty + * @param {Queue} queue The queue + */ + +/** + * Emitted when bot connects to a voice channel + * @event Player#connectionCreate + * @param {Queue} queue The queue + * @param {StreamDispatcher} connection The discord player connection object + */ + +/** + * Debug information + * @event Player#debug + * @param {Queue} queue The queue + * @param {string} message The message + */ + +/** + * Emitted on error + * This event should handled properly otherwise it may crash your process! + * @event Player#error + * @param {Queue} queue The queue + * @param {Error} error The error + */ + +/** + * Emitted when queue ends + * @event Player#queueEnd + * @param {Queue} queue The queue + */ + +/** + * Emitted when a single track is added + * @event Player#trackAdd + * @param {Queue} queue The queue + * @param {Track} track The track + */ + +/** + * Emitted when multiple tracks are added + * @event Player#tracksAdd + * @param {Queue} queue The queue + * @param {Track[]} tracks The tracks + */ + +/** + * Emitted when a track starts playing + * @event Player#trackStart + * @param {Queue} queue The queue + * @param {Track} track The track + */ + export { Player }; diff --git a/src/types/types.ts b/src/types/types.ts index 4f23802..54c02d2 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -138,74 +138,21 @@ export enum QueryType { } export interface PlayerEvents { - /** - * Emitted when bot gets disconnected from a voice channel - * @event Player#botDisconnect - * @param {Queue} queue The queue - */ botDisconnect: (queue: Queue) => any; - - /** - * Emitted when the voice channel is empty - * @event Player#channelEmpty - * @param {Queue} queue The queue - */ channelEmpty: (queue: Queue) => any; - /** - * Emitted when bot connects to a voice channel - * @event Player#connectionCreate - * @param {Queue} queue The queue - * @param {StreamDispatcher} connection The discord player connection object - */ connectionCreate: (queue: Queue, connection: StreamDispatcher) => any; - /** - * Debug information - * @event Player#debug - * @param {Queue} queue The queue - * @param {string} message The message - */ debug: (queue: Queue, message: string) => any; - /** - * Emitted on error - * This event should handled properly otherwise it may crash your process! - * @event Player#error - * @param {Queue} queue The queue - * @param {Error} error The error - */ error: (queue: Queue, error: Error) => any; - /** - * Emitted when queue ends - * @event Player#queueEnd - * @param {Queue} queue The queue - */ queueEnd: (queue: Queue) => any; - /** - * Emitted when a single track is added - * @event Player#trackAdd - * @param {Queue} queue The queue - * @param {Track} track The track - */ trackAdd: (queue: Queue, track: Track) => any; - /** - * Emitted when multiple tracks are added - * @event Player#tracksAdd - * @param {Queue} queue The queue - * @param {Track[]} tracks The tracks - */ tracksAdd: (queue: Queue, track: Track[]) => any; - /** - * Emitted when a track starts playing - * @event Player#trackStart - * @param {Queue} queue The queue - * @param {Track} track The track - */ trackStart: (queue: Queue, track: Track) => any; } From 839ce6d88e69180be5b4fcb9fe738ed7a50b266b Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 20 Jun 2021 20:36:47 +0545 Subject: [PATCH 113/215] documentation --- src/Structures/Track.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Structures/Track.ts b/src/Structures/Track.ts index f03a6a6..e42947f 100644 --- a/src/Structures/Track.ts +++ b/src/Structures/Track.ts @@ -77,7 +77,7 @@ class Track { /** * Person who requested this track * @name Track#requestedBy - * @type {DiscordUser} + * @type {User} */ /** From 08da3834ec15a59e2ab0d4c55f30506246c362b9 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 20 Jun 2021 20:39:02 +0545 Subject: [PATCH 114/215] documentation --- src/Player.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Player.ts b/src/Player.ts index 73a3e01..5589393 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -410,7 +410,7 @@ class Player extends EventEmitter { /** * @param {string} extractorName The extractor name * @param {ExtractorModel|any} extractor The extractor object - * @param {boolean} [force=false] + * @param {boolean} [force=false] Overwrite existing extractor with this name (if available) * @returns {ExtractorModel} */ use(extractorName: string, extractor: ExtractorModel | any, force = false): ExtractorModel { From 9f69ddab6022811f796f9e4b2b3889cc59d1cffe Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 20 Jun 2021 20:45:19 +0545 Subject: [PATCH 115/215] documentation --- docs/faq/custom_filters.md | 2 +- docs/faq/slash_commands.md | 3 +++ example/music-bot/README.md | 2 ++ src/Structures/Queue.ts | 1 + 4 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 docs/faq/slash_commands.md create mode 100644 example/music-bot/README.md diff --git a/docs/faq/custom_filters.md b/docs/faq/custom_filters.md index 30e1f1c..98a2ef5 100644 --- a/docs/faq/custom_filters.md +++ b/docs/faq/custom_filters.md @@ -8,5 +8,5 @@ const { AudioFilters } = require("discord-player"); AudioFilters.define("3D", "apulsator=hz=0.128"); // later, it can be used like this -queue.setFilters(message, { "3D": true }); +queue.setFilters({ "3D": true }); ``` \ No newline at end of file diff --git a/docs/faq/slash_commands.md b/docs/faq/slash_commands.md new file mode 100644 index 0000000..0321af5 --- /dev/null +++ b/docs/faq/slash_commands.md @@ -0,0 +1,3 @@ +# Slash Commands Example + +You can use Discord Player with slash commands. **[Here](https://github.com/Androz2091/discord-player/tree/v5/example/music-bot)** is an example on how to use this framework with slash commands. \ No newline at end of file diff --git a/example/music-bot/README.md b/example/music-bot/README.md new file mode 100644 index 0000000..520b8e5 --- /dev/null +++ b/example/music-bot/README.md @@ -0,0 +1,2 @@ +# Music Bot +Slash commands music bot backed by **[Discord Player](https://discord-player.js.org)**. \ No newline at end of file diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index a40cbdd..0d7e898 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -302,6 +302,7 @@ class Queue { } /** + * Play stream in a voice/stage channel * @param {Track} [src] The track to play (if empty, uses first track from the queue) * @param {PlayOptions} [options={}] The options * @returns {Promise} From 8e2f50cfb5cf1b077f98cb2c7d6d6a5dfddd2609 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sun, 20 Jun 2021 21:01:07 +0545 Subject: [PATCH 116/215] docs --- docs/index.yml | 6 +++++ docs/migrating/migrating.md | 52 +++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 docs/migrating/migrating.md diff --git a/docs/index.yml b/docs/index.yml index d2ebc01..b2cc511 100644 --- a/docs/index.yml +++ b/docs/index.yml @@ -2,6 +2,10 @@ files: - name: Welcome path: welcome.md +- name: Migrating + files: + - name: Migrating to v5 + path: migrating.md - name: Extractors files: - name: Extractors API @@ -10,6 +14,8 @@ files: - name: Custom Filters path: custom_filters.md + - name: Slash Commands + path: slash_commands.md - name: YouTube files: - name: Using Cookies diff --git a/docs/migrating/migrating.md b/docs/migrating/migrating.md new file mode 100644 index 0000000..6fbe25d --- /dev/null +++ b/docs/migrating/migrating.md @@ -0,0 +1,52 @@ +# Migrating to Discord Player v5 + +We have introduced some breaking changes in Discord Player v5. Which means, your old code will no longer work with v5. +The new update brings new features as well as better management of different things. This also uses the new **[@discordjs/voice](https://github.com/discordjs/voice)** library! + +## Basic Example + +```diff +- player.play(message, query); ++ const queue = player.createQueue(message.guild); ++ const song = await player.search(query); ++ ++ try { ++ await queue.connect(message.member.voice.channel); ++ } catch { ++ message.reply("Could not join your voice channel"); ++ } ++ ++ queue.addTrack(song.tracks[0]); ++ queue.play(); +``` + +> Everything related to music player is moved to `Queue`. + +## How do I reply to the event like v4? + +Since we got rid of `message` parameter in every method of the Discord Player, you no longer have access to the `message` object in events. +Instead, we have added `.metadata` prop as an alternative. This `metadata` can be anything, declared while creating queue: + +```js +const queue = player.createQueue(message.guild, { + metadata: message +}); +``` + +The metadata `message` will always be available in every events emitted for that specific `Queue`. You can access it via `queue.metadata`: + +```js +player.on("trackStart", (queue, track) => { + const channel = queue.metadata.channel; // queue.metadata is your "message" object + channel.send(`🎶 | Started playing **${track.title}**`); +}); +``` + +## How do I stop the player + +You have to use `.destroy()` to destroy the queue. It will also stop the player. + +```js +const queue = player.getQueue(message.guild.id); +if (queue) queue.destroy(); +``` \ No newline at end of file From 405f08b4e8fe105e63bd512a9ec7eab2fdd31c9d Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Mon, 21 Jun 2021 11:04:29 +0545 Subject: [PATCH 117/215] documentation --- src/Player.ts | 61 ---------- src/Structures/Queue.ts | 4 - src/types/types.ts | 253 +++++++++++++++++++++++++++++++++++++--- 3 files changed, 234 insertions(+), 84 deletions(-) diff --git a/src/Player.ts b/src/Player.ts index 5589393..44d1d18 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -456,65 +456,4 @@ class Player extends EventEmitter { } } -/** - * Emitted when bot gets disconnected from a voice channel - * @event Player#botDisconnect - * @param {Queue} queue The queue - */ - -/** - * Emitted when the voice channel is empty - * @event Player#channelEmpty - * @param {Queue} queue The queue - */ - -/** - * Emitted when bot connects to a voice channel - * @event Player#connectionCreate - * @param {Queue} queue The queue - * @param {StreamDispatcher} connection The discord player connection object - */ - -/** - * Debug information - * @event Player#debug - * @param {Queue} queue The queue - * @param {string} message The message - */ - -/** - * Emitted on error - * This event should handled properly otherwise it may crash your process! - * @event Player#error - * @param {Queue} queue The queue - * @param {Error} error The error - */ - -/** - * Emitted when queue ends - * @event Player#queueEnd - * @param {Queue} queue The queue - */ - -/** - * Emitted when a single track is added - * @event Player#trackAdd - * @param {Queue} queue The queue - * @param {Track} track The track - */ - -/** - * Emitted when multiple tracks are added - * @event Player#tracksAdd - * @param {Queue} queue The queue - * @param {Track[]} tracks The tracks - */ - -/** - * Emitted when a track starts playing - * @event Player#trackStart - * @param {Queue} queue The queue - * @param {Track} track The track - */ - export { Player }; diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 0d7e898..557b5f5 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -58,11 +58,7 @@ class Queue { leaveOnEmpty: true, leaveOnEmptyCooldown: 1000, autoSelfDeaf: true, - enableLive: false, ytdlOptions: {}, - useSafeSearch: false, - disableAutoRegister: false, - fetchBeforeQueued: false, initialVolume: 100 } as PlayerOptions, options diff --git a/src/types/types.ts b/src/types/types.ts index 54c02d2..ad3eb1a 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -42,8 +42,32 @@ export type QueueFilters = { earrape?: boolean; }; +/** + * The track source: + * - soundcloud + * - youtube + * - spotify + * - arbitrary + * @typedef {string} TrackSource + */ export type TrackSource = "soundcloud" | "youtube" | "spotify" | "arbitrary"; +/** + * @typedef {object} RawTrackData + * @property {string} title The title + * @property {string} description The description + * @property {string} author The author + * @property {string} url The url + * @property {string} thumbnail The thumbnail + * @property {string} duration The duration + * @property {number} views The views + * @property {User} requestedBy The user who requested this track + * @property {Playlist} [playlist] The playlist + * @property {TrackSource} [source="arbitrary"] The source + * @property {any} [engine] The engine + * @property {boolean} [live] If this track is live + * @property {any} [raw] The raw data + */ export interface RawTrackData { title: string; description: string; @@ -60,6 +84,13 @@ export interface RawTrackData { raw?: any; } +/** + * @typedef {object} TimeData + * @property {number} days Time in days + * @property {number} hours Time in hours + * @property {number} minutes Time in minutes + * @property {number} seconds Time in seconds + */ export interface TimeData { days: number; hours: number; @@ -67,6 +98,14 @@ export interface TimeData { seconds: number; } +/** + * @typedef {object} PlayerProgressbarOptions + * @property {boolean} [timecodes] If it should render time codes + * @property {boolean} [queue] If it should create progress bar for the whole queue + * @property {number} [length] The bar length + * @property {string} [line] The bar track + * @property {string} [indicator] The indicator + */ export interface PlayerProgressbarOptions { timecodes?: boolean; queue?: boolean; @@ -75,20 +114,57 @@ export interface PlayerProgressbarOptions { indicator?: string; } +/** + * @typedef {object} PlayerOptions + * @property {boolean} [leaveOnEnd=true] If it should leave on end + * @property {boolean} [leaveOnStop=true] If it should leave on stop + * @property {boolean} [leaveOnEmpty=true] If it should leave on empty + * @property {number} [leaveOnEmptyCooldown=1000] The cooldown in ms + * @property {boolean} [autoSelfDeaf=true] If it should set the bot in deaf mode + * @property {object} [ytdlOptions={}] The youtube download options + * @property {number} [initialVolume=100] The initial player volume + */ export interface PlayerOptions { leaveOnEnd?: boolean; leaveOnStop?: boolean; leaveOnEmpty?: boolean; leaveOnEmptyCooldown?: number; autoSelfDeaf?: boolean; - enableLive?: boolean; ytdlOptions?: downloadOptions; - useSafeSearch?: boolean; - disableAutoRegister?: boolean; - fetchBeforeQueued?: boolean; initialVolume?: number; } +/** + * The extractor model data + * @typedef {object} ExtractorModelData + * @property {object} [playlist] The playlist info (if any) + * @property {string} [playlist.title] The playlist title + * @property {string} [playlist.description] The playlist description + * @property {string} [playlist.thumbnail] The playlist thumbnail + * @property {("album"|"playlist")} [playlist.type] The playlist type: `album` | `playlist` + * @property {TrackSource} [playlist.source] The playlist source + * @property {object} [playlist.author] The playlist author + * @property {string} [playlist.author.name] The author name + * @property {string} [playlist.author.url] The author url + * @property {string} [playlist.id] The playlist id + * @property {string} [playlist.url] The playlist url + * @property {any} [playlist.rawPlaylist] The raw data + * @property {ExtractorData[]} data The data + */ + +/** + * @typedef {object} ExtractorData + * @property {string} title The title + * @property {number} duration The duration + * @property {string} thumbnail The thumbnail + * @property {string|Readable|Duplex} engine The stream engine + * @property {number} views The views count + * @property {string} author The author + * @property {string} description The description + * @property {string} url The url + * @property {string} [version] The extractor version + * @property {TrackSource} [source="arbitrary"] The source + */ export interface ExtractorModelData { playlist?: { title: string; @@ -114,11 +190,30 @@ export interface ExtractorModelData { description: string; url: string; version?: string; - important?: boolean; source?: TrackSource; }[]; } +/** + * The search query type + * This can be one of: + * - AUTO + * - YOUTUBE + * - YOUTUBE_PLAYLIST + * - SOUNDCLOUD_TRACK + * - SOUNDCLOUD_PLAYLIST + * - SOUNDCLOUD + * - SPOTIFY_SONG + * - SPOTIFY_ALBUM + * - SPOTIFY_PLAYLIST + * - FACEBOOK + * - VIMEO + * - ARBITRARY + * - REVERBNATION + * - YOUTUBE_SEARCH + * - SOUNDCLOUD_SEARCH + * @typedef {string} QueryType + */ export enum QueryType { AUTO = "auto", YOUTUBE = "youtube", @@ -137,44 +232,114 @@ export enum QueryType { SOUNDCLOUD_SEARCH = "soundcloud_search" } +/** + * Emitted when bot gets disconnected from a voice channel + * @event Player#botDisconnect + * @param {Queue} queue The queue + */ + +/** + * Emitted when the voice channel is empty + * @event Player#channelEmpty + * @param {Queue} queue The queue + */ + +/** + * Emitted when bot connects to a voice channel + * @event Player#connectionCreate + * @param {Queue} queue The queue + * @param {StreamDispatcher} connection The discord player connection object + */ + +/** + * Debug information + * @event Player#debug + * @param {Queue} queue The queue + * @param {string} message The message + */ + +/** + * Emitted on error + * This event should handled properly otherwise it may crash your process! + * @event Player#error + * @param {Queue} queue The queue + * @param {Error} error The error + */ + +/** + * Emitted when queue ends + * @event Player#queueEnd + * @param {Queue} queue The queue + */ + +/** + * Emitted when a single track is added + * @event Player#trackAdd + * @param {Queue} queue The queue + * @param {Track} track The track + */ + +/** + * Emitted when multiple tracks are added + * @event Player#tracksAdd + * @param {Queue} queue The queue + * @param {Track[]} tracks The tracks + */ + +/** + * Emitted when a track starts playing + * @event Player#trackStart + * @param {Queue} queue The queue + * @param {Track} track The track + */ + export interface PlayerEvents { botDisconnect: (queue: Queue) => any; channelEmpty: (queue: Queue) => any; - connectionCreate: (queue: Queue, connection: StreamDispatcher) => any; - debug: (queue: Queue, message: string) => any; - error: (queue: Queue, error: Error) => any; - queueEnd: (queue: Queue) => any; - trackAdd: (queue: Queue, track: Track) => any; - tracksAdd: (queue: Queue, track: Track[]) => any; - trackStart: (queue: Queue, track: Track) => any; } +/** + * Options passed to `.play()` + * @typedef {object} PlayOptions + * @property {boolean} [filtersUpdate=false] If this play was triggered for filters update + * @property {string[]} [encoderArgs=[]] FFmpeg args passed to encoder + * @property {number} [seek] Time to seek to before playing + * @property {boolean} [immediate=false] If it should start playing the provided track immediately + */ + export interface PlayOptions { - /** If this play is triggered for filters update */ filtersUpdate?: boolean; - - /** ffmpeg args passed to encoder */ encoderArgs?: string[]; - - /** Time to seek to before playing */ seek?: number; - - /** If it should start playing provided track immediately */ immediate?: boolean; } +/** + * Options passed to `.search()` + * @typedef {object} SearchOptions + * @property {UserResolvable} requestedBy The user who requested this search + * @property {QueryType} searchEngine The query search engine + */ export interface SearchOptions { requestedBy: UserResolvable; searchEngine?: QueryType; } +/** + * The queue repeat mode. This can be one of: + * - OFF + * - TRACK + * - QUEUE + * - AUTOPLAY + * @typedef {number} QueueRepeatMode + */ export enum QueueRepeatMode { OFF = 0, TRACK = 1, @@ -182,6 +347,22 @@ export enum QueueRepeatMode { AUTOPLAY = 3 } +/** + * Playlist init data + * @typedef {object} PlaylistInitData + * @property {Track[]} tracks The tracks of this playlist + * @property {string} title The playlist title + * @property {string} description The description + * @property {string} thumbnail The thumbnail + * @property {("album"|"playlist")} type The playlist type: `album` | `playlist` + * @property {TrackSource} source The playlist source + * @property {object} author The playlist author + * @property {string} [author.name] The author name + * @property {string} [author.url] The author url + * @property {string} id The playlist id + * @property {string} url The playlist url + * @property {any} [rawPlaylist] The raw playlist data + */ export interface PlaylistInitData { tracks: Track[]; title: string; @@ -198,6 +379,20 @@ export interface PlaylistInitData { rawPlaylist?: any; } +/** + * The JSON representation of a track + * @typedef {object} TrackJSON + * @property {string} title The track title + * @property {string} description The track description + * @property {string} author The author + * @property {string} url The url + * @property {string} thumbnail The thumbnail + * @property {string} duration The duration + * @property {number} durationMS The duration in ms + * @property {number} views The views count + * @property {Snowflake} requestedBy The id of the user who requested this track + * @property {PlaylistJSON} [playlist] The playlist info (if any) + */ export interface TrackJSON { title: string; description: string; @@ -211,6 +406,21 @@ export interface TrackJSON { playlist?: PlaylistJSON; } +/** + * The JSON representation of the playlist + * @typedef {object} PlaylistJSON + * @property {string} id The playlist id + * @property {string} url The playlist url + * @property {string} title The playlist title + * @property {string} description The playlist description + * @property {string} thumbnail The thumbnail + * @property {("album"|"playlist")} type The playlist type: `album` | `playlist` + * @property {TrackSource} source The track source + * @property {object} author The playlist author + * @property {string} [author.name] The author name + * @property {string} [author.url] The author url + * @property {TrackJSON[]} tracks The tracks data (if any) + */ export interface PlaylistJSON { id: string; url: string; @@ -226,6 +436,11 @@ export interface PlaylistJSON { tracks: TrackJSON[]; } +/** + * @typedef {object} DiscordPlayerInitOptions + * @property {boolean} [autoRegisterExtractor=true] If it should automatically register `@discord-player/extractor` + * @property {object} [ytdlOptions={}] The options passed to `ytdl-core` + */ export interface DiscordPlayerInitOptions { autoRegisterExtractor?: boolean; ytdlOptions?: downloadOptions; From 4ab102c81d0943de8955b80baef34e8c0efb3062 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Mon, 21 Jun 2021 11:07:17 +0545 Subject: [PATCH 118/215] documentation --- src/types/types.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/types/types.ts b/src/types/types.ts index ad3eb1a..bc8faab 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -141,7 +141,7 @@ export interface PlayerOptions { * @property {string} [playlist.title] The playlist title * @property {string} [playlist.description] The playlist description * @property {string} [playlist.thumbnail] The playlist thumbnail - * @property {("album"|"playlist")} [playlist.type] The playlist type: `album` | `playlist` + * @property {album|playlist} [playlist.type] The playlist type: `album` | `playlist` * @property {TrackSource} [playlist.source] The playlist source * @property {object} [playlist.author] The playlist author * @property {string} [playlist.author.name] The author name @@ -354,7 +354,7 @@ export enum QueueRepeatMode { * @property {string} title The playlist title * @property {string} description The description * @property {string} thumbnail The thumbnail - * @property {("album"|"playlist")} type The playlist type: `album` | `playlist` + * @property {album|playlist} type The playlist type: `album` | `playlist` * @property {TrackSource} source The playlist source * @property {object} author The playlist author * @property {string} [author.name] The author name @@ -414,7 +414,7 @@ export interface TrackJSON { * @property {string} title The playlist title * @property {string} description The playlist description * @property {string} thumbnail The thumbnail - * @property {("album"|"playlist")} type The playlist type: `album` | `playlist` + * @property {album|playlist} type The playlist type: `album` | `playlist` * @property {TrackSource} source The track source * @property {object} author The playlist author * @property {string} [author.name] The author name From 86bd8ad7336bae4f143c6b6c823f5bb6f35fce81 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Mon, 21 Jun 2021 11:10:08 +0545 Subject: [PATCH 119/215] documentation --- src/Player.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Player.ts b/src/Player.ts index 44d1d18..bd492fa 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -29,6 +29,7 @@ class Player extends EventEmitter { /** * Creates new Discord Player * @param {Client} client The Discord Client + * @param {DiscordPlayerInitOptions} [options={}] The player init options */ constructor(client: Client, options: DiscordPlayerInitOptions = {}) { super(); From 3bcc7adce6e931feb4e6fc5aa62e10d4b3f76c97 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Mon, 21 Jun 2021 11:10:46 +0545 Subject: [PATCH 120/215] fix template title --- .github/ISSUE_TEMPLATE/bug_report.md | 7 +++---- .github/ISSUE_TEMPLATE/feature_request.md | 1 - .github/ISSUE_TEMPLATE/question.md | 1 - 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index fb7e111..d211114 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,7 +1,6 @@ --- name: Bug report about: Create a bug report to help us improve -title: "[BUG] " labels: bug assignees: '' @@ -13,9 +12,9 @@ assignees: '' **To Reproduce** Steps to reproduce the behavior: +1. Click on '....' +2. Scroll down to '....' +3. See error --> **Expected behavior** diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 16ba85a..4be6790 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,7 +1,6 @@ --- name: Feature request about: Suggest an idea for this project -title: "[Feature Request] " labels: enhancement assignees: '' diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md index 2953cde..d7f46be 100644 --- a/.github/ISSUE_TEMPLATE/question.md +++ b/.github/ISSUE_TEMPLATE/question.md @@ -1,7 +1,6 @@ --- name: Question about: Some questions related to this lib -title: "[QUESTION] " labels: question assignees: '' From 63eb26dc7b2824d1ba95bb4cd31cf1b679fd9a4a Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Mon, 21 Jun 2021 11:16:28 +0545 Subject: [PATCH 121/215] documentation --- src/Player.ts | 10 ++++++++-- src/types/types.ts | 6 ------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Player.ts b/src/Player.ts index bd492fa..509c421 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -145,11 +145,16 @@ class Player extends EventEmitter { return prev; } + /** + * @typedef {object} SearchResult + * @property {Playlist} [playlist] The playlist (if any) + * @property {Track[]} tracks The tracks + */ /** * Search tracks * @param {string|Track} query The search query - * @param {UserResolvable} requestedBy The person who requested track search - * @returns {Promise} + * @param {SearchOptions} options The search options + * @returns {Promise} */ async search(query: string | Track, options: SearchOptions) { if (query instanceof Track) return { playlist: null, tracks: [query] }; @@ -409,6 +414,7 @@ class Player extends EventEmitter { } /** + * Registers extractor * @param {string} extractorName The extractor name * @param {ExtractorModel|any} extractor The extractor object * @param {boolean} [force=false] Overwrite existing extractor with this name (if available) diff --git a/src/types/types.ts b/src/types/types.ts index bc8faab..1a2c0bb 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -135,7 +135,6 @@ export interface PlayerOptions { } /** - * The extractor model data * @typedef {object} ExtractorModelData * @property {object} [playlist] The playlist info (if any) * @property {string} [playlist.title] The playlist title @@ -306,7 +305,6 @@ export interface PlayerEvents { } /** - * Options passed to `.play()` * @typedef {object} PlayOptions * @property {boolean} [filtersUpdate=false] If this play was triggered for filters update * @property {string[]} [encoderArgs=[]] FFmpeg args passed to encoder @@ -322,7 +320,6 @@ export interface PlayOptions { } /** - * Options passed to `.search()` * @typedef {object} SearchOptions * @property {UserResolvable} requestedBy The user who requested this search * @property {QueryType} searchEngine The query search engine @@ -348,7 +345,6 @@ export enum QueueRepeatMode { } /** - * Playlist init data * @typedef {object} PlaylistInitData * @property {Track[]} tracks The tracks of this playlist * @property {string} title The playlist title @@ -380,7 +376,6 @@ export interface PlaylistInitData { } /** - * The JSON representation of a track * @typedef {object} TrackJSON * @property {string} title The track title * @property {string} description The track description @@ -407,7 +402,6 @@ export interface TrackJSON { } /** - * The JSON representation of the playlist * @typedef {object} PlaylistJSON * @property {string} id The playlist id * @property {string} url The playlist url From 3c93695fc009d26f92008d77682cd59add2403f7 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Mon, 21 Jun 2021 11:18:55 +0545 Subject: [PATCH 122/215] documentation --- src/Structures/Queue.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 557b5f5..d2bda36 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -158,7 +158,7 @@ class Queue { /** * Sets bitrate - * @param {number|"auto"} bitrate bitrate to set + * @param {number|auto} bitrate bitrate to set * @returns {void} */ setBitrate(bitrate: number | "auto") { From 733ab098d8aa9f08be82c6c6995e2d5382eb2b2b Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Mon, 21 Jun 2021 11:19:49 +0545 Subject: [PATCH 123/215] documentation --- src/VoiceInterface/BasicStreamDispatcher.ts | 1 + src/VoiceInterface/VoiceUtils.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/src/VoiceInterface/BasicStreamDispatcher.ts b/src/VoiceInterface/BasicStreamDispatcher.ts index 3201cc2..5e24ea5 100644 --- a/src/VoiceInterface/BasicStreamDispatcher.ts +++ b/src/VoiceInterface/BasicStreamDispatcher.ts @@ -35,6 +35,7 @@ class StreamDispatcher extends EventEmitter { * Creates new connection object * @param {VoiceConnection} connection The connection * @param {VoiceChannel|StageChannel} channel The connected channel + * @private */ constructor(connection: VoiceConnection, channel: VoiceChannel | StageChannel) { super(); diff --git a/src/VoiceInterface/VoiceUtils.ts b/src/VoiceInterface/VoiceUtils.ts index d2632af..f8eb601 100644 --- a/src/VoiceInterface/VoiceUtils.ts +++ b/src/VoiceInterface/VoiceUtils.ts @@ -7,6 +7,7 @@ class VoiceUtils { /** * The voice utils + * @private */ constructor() { /** From 0b7ba2988a36c2ca7c0fe40e52a9144c99688f0a Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Mon, 21 Jun 2021 11:30:54 +0545 Subject: [PATCH 124/215] bump deps --- example/music-bot/package.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/example/music-bot/package.json b/example/music-bot/package.json index c9f1928..339a0c5 100644 --- a/example/music-bot/package.json +++ b/example/music-bot/package.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@discordjs/opus": "^0.5.3", - "discord-player": "^5.0.0-dev.1", - "discord.js": "^13.0.0-dev.807ea2d3c197c7c6556bd1c894114932f6657d49" + "discord-player": "^5.0.0-dev.8e2f50cfb5cf1b077f98cb2c7d6d6a5dfddd2609", + "discord.js": "^13.0.0-dev.c850ae10270076c4b2e10b130dd8f88eed4ed201" } } diff --git a/package.json b/package.json index 83b3476..b3cebe7 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "@types/node": "^15.12.2", "@types/ws": "^7.4.4", "discord-api-types": "^0.18.1", - "discord.js": "^13.0.0-dev.1f8f3ab0f8dbd346154bbfa14a98726b8df25d57", + "discord.js": "^13.0.0-dev.c850ae10270076c4b2e10b130dd8f88eed4ed201", "discord.js-docgen": "discordjs/docgen#ts-patch", "jsdoc-babel": "^0.5.0", "prettier": "^2.3.1", From 8d80d82caaaa7432b96b10242e960d0f6080b5a9 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Mon, 21 Jun 2021 11:50:19 +0545 Subject: [PATCH 125/215] types --- src/types/types.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/types/types.ts b/src/types/types.ts index 1a2c0bb..56444dd 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -121,7 +121,7 @@ export interface PlayerProgressbarOptions { * @property {boolean} [leaveOnEmpty=true] If it should leave on empty * @property {number} [leaveOnEmptyCooldown=1000] The cooldown in ms * @property {boolean} [autoSelfDeaf=true] If it should set the bot in deaf mode - * @property {object} [ytdlOptions={}] The youtube download options + * @property {YTDLDownloadOptions} [ytdlOptions={}] The youtube download options * @property {number} [initialVolume=100] The initial player volume */ export interface PlayerOptions { @@ -433,7 +433,7 @@ export interface PlaylistJSON { /** * @typedef {object} DiscordPlayerInitOptions * @property {boolean} [autoRegisterExtractor=true] If it should automatically register `@discord-player/extractor` - * @property {object} [ytdlOptions={}] The options passed to `ytdl-core` + * @property {YTDLDownloadOptions} [ytdlOptions={}] The options passed to `ytdl-core` */ export interface DiscordPlayerInitOptions { autoRegisterExtractor?: boolean; From 4acd25a6abba96359a6559b3f5acc56e10051ed4 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Tue, 22 Jun 2021 11:18:20 +0545 Subject: [PATCH 126/215] re-implement voice --- src/Structures/Queue.ts | 202 +++++++++++++------- src/VoiceInterface/BasicStreamDispatcher.ts | 1 + src/types/types.ts | 8 + 3 files changed, 147 insertions(+), 64 deletions(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index d2bda36..243cc0b 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -22,6 +22,8 @@ class Queue { private _streamTime: number = 0; public _cooldownsTimeout = new Collection(); private _activeFilters: any[] = []; + private _filtersUpdate = false; + public destroyed = false; /** * Queue constructor @@ -50,6 +52,42 @@ class Queue { */ this.options = {}; + /** + * If this queue is destroyed + * @type {boolean} + * @name Queue#destroyed + */ + + /** + * Queue repeat mode + * @type {QueueRepeatMode} + * @name Queue#repeatMode + */ + + /** + * Queue metadata + * @type {any} + * @name Queue#metadata + */ + + /** + * Previous tracks + * @type {Track[]} + * @name Queue#previousTracks + */ + + /** + * Regular tracks + * @type {Track[]} + * @name Queue#tracks + */ + + /** + * The connection + * @type {StreamDispatcher} + * @name Queue#connection + */ + Object.assign( this.options, { @@ -70,6 +108,7 @@ class Queue { * @type {Track} */ get current() { + this.#watchDestroyed(); return this.connection.audioResource?.metadata ?? this.tracks[0]; } @@ -78,6 +117,7 @@ class Queue { * @returns {Track} */ nowPlaying() { + this.#watchDestroyed(); return this.current; } @@ -87,22 +127,47 @@ class Queue { * @returns {Promise} */ async connect(channel: StageChannel | VoiceChannel) { + this.#watchDestroyed(); if (!["stage", "voice"].includes(channel?.type)) throw new TypeError(`Channel type must be voice or stage, got ${channel?.type}!`); const connection = await this.player.voiceUtils.connect(channel, { deaf: this.options.autoSelfDeaf }); this.connection = connection; - // it's ok to use this here since Queue listens to the events 1 time per play and destroys the listener - this.connection.setMaxListeners(Infinity); - if (channel.type === "stage") await channel.guild.me.voice.setRequestToSpeak(true).catch(() => {}); - this.connection.on("error", (err) => this.player.emit("error", this, err)); + this.connection.on("error", (err) => this.player.emit("connectionError", this, err)); this.connection.on("debug", (msg) => this.player.emit("debug", this, msg)); this.player.emit("connectionCreate", this, this.connection); + this.connection.on("start", () => { + this.playing = true; + if (!this._filtersUpdate) this.player.emit("trackStart", this, this.current); + this._filtersUpdate = false; + }); + + this.connection.on("finish", async () => { + this.playing = false; + if (this._filtersUpdate) return; + this._streamTime = 0; + + if (!this.tracks.length && this.repeatMode === QueueRepeatMode.OFF) { + if (this.options.leaveOnEnd) this.destroy(); + this.player.emit("queueEnd", this); + } else { + if (this.repeatMode !== QueueRepeatMode.AUTOPLAY) { + if (this.repeatMode === QueueRepeatMode.TRACK) return void this.play(Util.last(this.previousTracks), { immediate: true }); + if (this.repeatMode === QueueRepeatMode.QUEUE) this.tracks.push(Util.last(this.previousTracks)); + const nextTrack = this.tracks.shift(); + this.play(nextTrack, { immediate: true }); + return; + } else { + this._handleAutoplay(Util.last(this.previousTracks)); + } + } + }); + return this; } @@ -115,6 +180,8 @@ class Queue { this.connection.end(); if (disconnect) this.connection.disconnect(); this.player.queues.delete(this.guild.id); + this.player.voiceUtils.cache.delete(this.guild.id); + this.destroyed = true; } /** @@ -122,7 +189,9 @@ class Queue { * @returns {boolean} */ skip() { + this.#watchDestroyed(); if (!this.connection) return false; + this._filtersUpdate = false; this.connection.end(); return true; } @@ -133,6 +202,7 @@ class Queue { * @returns {void} */ addTrack(track: Track) { + this.#watchDestroyed(); this.tracks.push(track); this.player.emit("trackAdd", this, track); } @@ -142,6 +212,7 @@ class Queue { * @param {Track[]} tracks Array of tracks to add */ addTracks(tracks: Track[]) { + this.#watchDestroyed(); this.tracks.push(...tracks); this.player.emit("tracksAdd", this, tracks); } @@ -152,6 +223,7 @@ class Queue { * @returns {boolean} */ setPaused(paused?: boolean) { + this.#watchDestroyed(); if (!this.connection) return false; return paused ? this.connection.pause(true) : this.connection.resume(); } @@ -162,6 +234,7 @@ class Queue { * @returns {void} */ setBitrate(bitrate: number | "auto") { + this.#watchDestroyed(); if (!this.connection?.audioResource?.encoder) return; if (bitrate === "auto") bitrate = this.connection.channel?.bitrate ?? 64000; this.connection.audioResource.encoder.setBitrate(bitrate); @@ -173,6 +246,7 @@ class Queue { * @returns {boolean} */ setVolume(amount: number) { + this.#watchDestroyed(); if (!this.connection) return false; this.options.initialVolume = amount; return this.connection.setVolume(amount); @@ -183,6 +257,7 @@ class Queue { * @returns {boolean} */ setRepeatMode(mode: QueueRepeatMode) { + this.#watchDestroyed(); if (![QueueRepeatMode.OFF, QueueRepeatMode.QUEUE, QueueRepeatMode.TRACK, QueueRepeatMode.AUTOPLAY].includes(mode)) throw new Error(`Unknown repeat mode "${mode}"!`); if (mode === this.repeatMode) return false; this.repeatMode = mode; @@ -194,6 +269,7 @@ class Queue { * @type {number} */ get volume() { + this.#watchDestroyed(); if (!this.connection) return 100; return this.connection.volume; } @@ -207,6 +283,7 @@ class Queue { * @type {number} */ get streamTime() { + this.#watchDestroyed(); if (!this.connection) return 0; const playbackTime = this._streamTime + this.connection.streamTime; const NC = this._activeFilters.includes("nightcore") ? 1.25 : null; @@ -221,6 +298,7 @@ class Queue { * @returns {AudioFilters} */ getFiltersEnabled() { + this.#watchDestroyed(); return AudioFilters.names.filter((x) => this._activeFilters.includes(x)); } @@ -229,6 +307,7 @@ class Queue { * @returns {AudioFilters} */ getFiltersDisabled() { + this.#watchDestroyed(); return AudioFilters.names.filter((x) => !this._activeFilters.includes(x)); } @@ -238,6 +317,7 @@ class Queue { * @returns {Promise} */ async setFilters(filters?: QueueFilters) { + this.#watchDestroyed(); if (!filters || !Object.keys(filters).length) { // reset filters const streamTime = this.streamTime; @@ -276,6 +356,7 @@ class Queue { * @returns {boolean} */ async seek(position: number) { + this.#watchDestroyed(); if (!this.playing || !this.current) return false; if (position < 1) position = 0; if (position >= this.current.durationMS) return this.skip(); @@ -294,7 +375,17 @@ class Queue { * @returns {Promise} */ async back() { - return await this.play(Util.last(this.previousTracks), { immediate: true }); + this.#watchDestroyed(); + const prev = this.previousTracks[this.previousTracks.length - 2]; // because last item is the current track + if (!prev) throw new Error("Could not find previous track"); + + return await this.play(prev, { immediate: true }); + } + + clear() { + this.#watchDestroyed(); + this.tracks = []; + this.previousTracks = []; } /** @@ -304,6 +395,7 @@ class Queue { * @returns {Promise} */ async play(src?: Track, options: PlayOptions = {}): Promise { + this.#watchDestroyed(); if (!this.connection || !this.connection.voiceConnection) throw new Error("Voice connection is not available, use .connect()!"); if (src && (this.playing || this.tracks.length) && !options.immediate) return this.addTrack(src); const track = options.filtersUpdate && !options.immediate ? src || this.current : src ?? this.tracks.shift(); @@ -314,8 +406,7 @@ class Queue { this.previousTracks.push(track); } - let stream, - pauseEvent = false; + let stream; if (["youtube", "spotify"].includes(track.raw.source)) { if (track.raw.source === "spotify" && !track.raw.engine) { track.raw.engine = await YouTube.search(`${track.author} ${track.title}`, { type: "video" }) @@ -333,7 +424,6 @@ class Queue { encoderArgs: options.encoderArgs ?? this._activeFilters.length ? ["-af", AudioFilters.create(this._activeFilters)] : [], seek: options.seek ? options.seek / 1000 : 0 }).on("error", (err) => { - pauseEvent = true; return err.message.toLowerCase().includes("premature close") ? null : this.player.emit("error", this, err); }); } else { @@ -348,7 +438,6 @@ class Queue { } ) .on("error", (err) => { - pauseEvent = true; return err.message.toLowerCase().includes("premature close") ? null : this.player.emit("error", this, err); }); } @@ -359,66 +448,45 @@ class Queue { }); if (options.seek) this._streamTime = options.seek; + this._filtersUpdate = options.filtersUpdate; - const dispatcher = await this.connection.playStream(resource); - dispatcher.setVolume(this.options.initialVolume); - - // need to use these events here - dispatcher.once("start", () => { - this.playing = true; - if (options.filtersUpdate || pauseEvent) return; - this.player.emit("trackStart", this, this.current); - }); - - dispatcher.once("finish", async () => { - this.playing = false; - if (options.filtersUpdate || pauseEvent) return; - - this._streamTime = 0; - - if (!this.tracks.length && this.repeatMode === QueueRepeatMode.OFF) { - if (this.options.leaveOnEnd) this.destroy(); - this.player.emit("queueEnd", this); - } else { - if (this.repeatMode !== QueueRepeatMode.AUTOPLAY) { - if (this.repeatMode === QueueRepeatMode.TRACK) return void this.play(Util.last(this.previousTracks), { immediate: true }); - if (this.repeatMode === QueueRepeatMode.QUEUE) this.tracks.push(Util.last(this.previousTracks)); - const nextTrack = this.tracks.shift(); - this.play(nextTrack, { immediate: true }); - return; - } else { - if (![track.source, track.raw?.source].includes("youtube")) { - if (this.options.leaveOnEnd) this.destroy(); - return void this.player.emit("queueEnd", this); - } - const info = await ytdl - .getInfo(track.url) - .then((x) => x.related_videos[0]) - .catch(() => {}); - if (!info) { - if (this.options.leaveOnEnd) this.destroy(); - return void this.player.emit("queueEnd", this); - } - - const nextTrack = new Track(this.player, { - title: info.title, - url: `https://www.youtube.com/watch?v=${info.id}`, - duration: info.length_seconds ? Util.buildTimeCode(Util.parseMS(info.length_seconds * 1000)) : "0:00", - description: "", - thumbnail: Util.last(info.thumbnails).url, - views: parseInt(info.view_count.replace(/[^0-9]/g, "")), - author: typeof info.author === "string" ? info.author : info.author.name, - requestedBy: track.requestedBy, - source: "youtube" - }); - - this.play(nextTrack, { immediate: true }); - } - } + this.connection.playStream(resource).then(() => { + this.connection.setVolume(this.options.initialVolume); }); } + private async _handleAutoplay(track: Track): Promise { + this.#watchDestroyed(); + if (!track || ![track.source, track.raw?.source].includes("youtube")) { + if (this.options.leaveOnEnd) this.destroy(); + return void this.player.emit("queueEnd", this); + } + const info = await ytdl + .getInfo(track.url) + .then((x) => x.related_videos[0]) + .catch(() => {}); + if (!info) { + if (this.options.leaveOnEnd) this.destroy(); + return void this.player.emit("queueEnd", this); + } + + const nextTrack = new Track(this.player, { + title: info.title, + url: `https://www.youtube.com/watch?v=${info.id}`, + duration: info.length_seconds ? Util.buildTimeCode(Util.parseMS(info.length_seconds * 1000)) : "0:00", + description: "", + thumbnail: Util.last(info.thumbnails).url, + views: parseInt(info.view_count.replace(/[^0-9]/g, "")), + author: typeof info.author === "string" ? info.author : info.author.name, + requestedBy: track.requestedBy, + source: "youtube" + }); + + this.play(nextTrack, { immediate: true }); + } + *[Symbol.iterator]() { + this.#watchDestroyed(); yield* this.tracks; } @@ -427,6 +495,7 @@ class Queue { * @returns {object} */ toJSON() { + this.#watchDestroyed(); return { guild: this.guild.id, voiceChannel: this.connection?.channel?.id, @@ -440,9 +509,14 @@ class Queue { * @returns {string} */ toString() { + this.#watchDestroyed(); if (!this.tracks.length) return "No songs available to display!"; return `**Upcoming Songs:**\n${this.tracks.map((m, i) => `${i + 1}. **${m.title}**`).join("\n")}`; } + + #watchDestroyed() { + if (this.destroyed) throw new Error("Cannot use destroyed queue"); + } } export { Queue }; diff --git a/src/VoiceInterface/BasicStreamDispatcher.ts b/src/VoiceInterface/BasicStreamDispatcher.ts index 5e24ea5..f7a0294 100644 --- a/src/VoiceInterface/BasicStreamDispatcher.ts +++ b/src/VoiceInterface/BasicStreamDispatcher.ts @@ -132,6 +132,7 @@ class StreamDispatcher extends EventEmitter { */ disconnect() { try { + this.audioPlayer.stop(true); this.voiceConnection.destroy(); } catch {} } diff --git a/src/types/types.ts b/src/types/types.ts index 56444dd..3430041 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -265,6 +265,13 @@ export enum QueryType { * @param {Error} error The error */ +/** + * Emitted on connection error. Sometimes stream errors are emitted here as well. + * @event Player#connectionError + * @param {Queue} queue The queue + * @param {Error} error The error + */ + /** * Emitted when queue ends * @event Player#queueEnd @@ -298,6 +305,7 @@ export interface PlayerEvents { connectionCreate: (queue: Queue, connection: StreamDispatcher) => any; debug: (queue: Queue, message: string) => any; error: (queue: Queue, error: Error) => any; + connectionError: (queue: Queue, error: Error) => any; queueEnd: (queue: Queue) => any; trackAdd: (queue: Queue, track: Track) => any; tracksAdd: (queue: Queue, track: Track[]) => any; From 5db4405e035eec98a1c05662d638adc1417dc8d2 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Tue, 22 Jun 2021 11:23:21 +0545 Subject: [PATCH 127/215] docs --- src/types/types.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/types/types.ts b/src/types/types.ts index 3430041..9def92f 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -8,6 +8,9 @@ import { downloadOptions } from "ytdl-core"; export type FiltersName = keyof QueueFilters; +/** + * @typedef {AudioFilters} QueueFilters + */ export type QueueFilters = { bassboost?: boolean; "8D"?: boolean; From 3fd002187de27ed6dc3398fd8f4f5dfe309ba350 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Tue, 22 Jun 2021 11:31:20 +0545 Subject: [PATCH 128/215] deps --- example/music-bot/package.json | 2 +- src/types/types.ts | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/example/music-bot/package.json b/example/music-bot/package.json index 339a0c5..5142ba9 100644 --- a/example/music-bot/package.json +++ b/example/music-bot/package.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@discordjs/opus": "^0.5.3", - "discord-player": "^5.0.0-dev.8e2f50cfb5cf1b077f98cb2c7d6d6a5dfddd2609", + "discord-player": "^5.0.0-dev.8d80d82caaaa7432b96b10242e960d0f6080b5a9", "discord.js": "^13.0.0-dev.c850ae10270076c4b2e10b130dd8f88eed4ed201" } } diff --git a/src/types/types.ts b/src/types/types.ts index 9def92f..ac6f64c 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -322,7 +322,6 @@ export interface PlayerEvents { * @property {number} [seek] Time to seek to before playing * @property {boolean} [immediate=false] If it should start playing the provided track immediately */ - export interface PlayOptions { filtersUpdate?: boolean; encoderArgs?: string[]; From 9dc01b68bbe7cd1414da1018abd0ecad20305dd1 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Tue, 22 Jun 2021 12:01:24 +0545 Subject: [PATCH 129/215] audio filters --- example/music-bot/index.js | 21 ++++++++++++++++++++- example/music-bot/package.json | 2 +- src/Structures/Queue.ts | 2 +- src/types/types.ts | 2 ++ src/utils/AudioFilters.ts | 12 +++++++++--- 5 files changed, 33 insertions(+), 6 deletions(-) diff --git a/example/music-bot/index.js b/example/music-bot/index.js index 0d51d97..f46a2f2 100644 --- a/example/music-bot/index.js +++ b/example/music-bot/index.js @@ -19,7 +19,12 @@ client.on("warn", console.warn); // instantiate the player const player = new Player(client); -player.on("error", console.error); +player.on("error", (queue, error) => { + console.log(`[${queue.guild.name}] Error emitted from the queue: ${error.message}`); +}); +player.on("connectionError", (queue, error) => { + console.log(`[${queue.guild.name}] Error emitted from the connection: ${error.message}`); +}); player.on("trackStart", (queue, track) => { queue.metadata.send(`🎶 | Started playing: **${track.title}** in **${queue.connection.channel.name}**!`); @@ -136,6 +141,10 @@ client.on("message", async (message) => { { name: "np", description: "Now Playing" + }, + { + name: "bassboost", + description: "Toggles bassboost filter" } ]); @@ -254,6 +263,16 @@ client.on("interaction", async (interaction) => { const success = queue.setRepeatMode(loopMode); const mode = loopMode === QueueRepeatMode.TRACK ? "🔂" : loopMode === QueueRepeatMode.QUEUE ? "🔁" : "▶"; return void interaction.followUp({ content: success ? `${mode} | Updated loop mode!` : "❌ | Could not update loop mode!" }); + } else if (interaction.commandName === "bassboost") { + await interaction.defer(); + const queue = player.getQueue(interaction.guildID); + if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); + await queue.setFilters({ + bassboost: !queue.getFiltersEnabled().includes("bassboost"), + normalizer2: !queue.getFiltersEnabled().includes("bassboost") // because we need to toggle it with bass + }); + + return void interaction.followUp({ content: `🎵 | Bassboost ${queue.getFiltersEnabled().includes("bassboost") ? "Enabled" : "Disabled"}!` }); } else { interaction.reply({ content: "Unknown command!", diff --git a/example/music-bot/package.json b/example/music-bot/package.json index 5142ba9..8470907 100644 --- a/example/music-bot/package.json +++ b/example/music-bot/package.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@discordjs/opus": "^0.5.3", - "discord-player": "^5.0.0-dev.8d80d82caaaa7432b96b10242e960d0f6080b5a9", + "discord-player": "^5.0.0-dev.3fd002187de27ed6dc3398fd8f4f5dfe309ba350", "discord.js": "^13.0.0-dev.c850ae10270076c4b2e10b130dd8f88eed4ed201" } } diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 243cc0b..9f948c3 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -2,7 +2,7 @@ import { Collection, Guild, StageChannel, VoiceChannel } from "discord.js"; import { Player } from "../Player"; import { StreamDispatcher } from "../VoiceInterface/BasicStreamDispatcher"; import Track from "./Track"; -import { PlayerOptions, PlayOptions, QueueFilters, QueueRepeatMode } from "../types/types"; +import { FiltersName, PlayerOptions, PlayOptions, QueueFilters, QueueRepeatMode } from "../types/types"; import ytdl from "discord-ytdl-core"; import { AudioResource, StreamType } from "@discordjs/voice"; import { Util } from "../utils/Util"; diff --git a/src/types/types.ts b/src/types/types.ts index ac6f64c..96f7ad2 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -12,7 +12,9 @@ export type FiltersName = keyof QueueFilters; * @typedef {AudioFilters} QueueFilters */ export type QueueFilters = { + bassboost_low?: boolean; bassboost?: boolean; + bassboost_high?: boolean; "8D"?: boolean; vaporwave?: boolean; nightcore?: boolean; diff --git a/src/utils/AudioFilters.ts b/src/utils/AudioFilters.ts index 45fe9d4..cc9ac90 100644 --- a/src/utils/AudioFilters.ts +++ b/src/utils/AudioFilters.ts @@ -1,9 +1,13 @@ import { FiltersName } from "../types/types"; +const bass = (g: number) => `bass=g=${g}:f=110:w=0.3`; + /** * The available audio filters * @typedef {object} AudioFilters - * @property {string} bassboost The bassboost filter + * @property {string} bassboost_low The bassboost filter (+15dB) + * @property {string} bassboost The bassboost filter (+20dB) + * @property {string} bassboost_high The bassboost filter (+30dB) * @property {string} 8D The 8D filter * @property {string} vaporwave The vaporwave filter * @property {string} nightcore The nightcore filter @@ -37,7 +41,9 @@ import { FiltersName } from "../types/types"; */ const FilterList = { - bassboost: "bass=g=20:f=110:w=0.3", + bassboost_low: bass(15), + bassboost: bass(20), + bassboost_high: bass(30), "8D": "apulsator=hz=0.09", vaporwave: "aresample=48000,asetrate=48000*0.8", nightcore: "aresample=48000,asetrate=48000*1.25", @@ -76,7 +82,7 @@ const FilterList = { }, get names() { - return Object.keys(this).filter((p) => !["names", "length"].includes(p) && typeof this[p as FiltersName] !== "function"); + return Object.keys(this).filter((p) => !["names", "length"].includes(p) && typeof this[p as FiltersName] !== "function") as FiltersName[]; }, get length() { From 821e3d1053703fe3e8599e6ed5cd958d8539197b Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Tue, 22 Jun 2021 12:53:52 +0545 Subject: [PATCH 130/215] check track before adding --- src/Structures/Queue.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 9f948c3..e9a8d84 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -203,6 +203,7 @@ class Queue { */ addTrack(track: Track) { this.#watchDestroyed(); + if (!(track instanceof Track)) throw new Error("invalid track"); this.tracks.push(track); this.player.emit("trackAdd", this, track); } @@ -213,6 +214,7 @@ class Queue { */ addTracks(tracks: Track[]) { this.#watchDestroyed(); + if (!tracks.every((y) => y instanceof Track)) throw new Error("invalid track"); this.tracks.push(...tracks); this.player.emit("tracksAdd", this, tracks); } From b485ed8a9fdfbf1fda41eddf3406de93229fc698 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Tue, 22 Jun 2021 16:09:05 +0545 Subject: [PATCH 131/215] setup linter --- .eslintignore | 7 ++++++ .eslintrc.json | 20 +++++++++++++++ example/music-bot/index.js | 2 +- package.json | 13 ++++++---- src/Player.ts | 28 +++++++++++++-------- src/Structures/ExtractorModel.ts | 4 ++- src/Structures/Playlist.ts | 2 +- src/Structures/Queue.ts | 12 ++++----- src/VoiceInterface/BasicStreamDispatcher.ts | 13 +++++----- src/VoiceInterface/VoiceUtils.ts | 2 +- src/types/types.ts | 11 +++++--- src/utils/AudioFilters.ts | 2 +- src/utils/QueryResolver.ts | 1 + src/utils/Util.ts | 7 +++++- tsconfig.eslint.json | 8 ++++++ tslint.json | 15 ----------- 16 files changed, 94 insertions(+), 53 deletions(-) create mode 100644 .eslintignore create mode 100644 .eslintrc.json create mode 100644 tsconfig.eslint.json delete mode 100644 tslint.json diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..f675f34 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,7 @@ +example/ +node_modules/ +lib/ +.github/ +docs/ + +*.d.ts \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..13921e1 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,20 @@ +{ + "root": true, + "parser": "@typescript-eslint/parser", + "env": { + "node": true + }, + "plugins": [ + "@typescript-eslint" + ], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/no-unused-vars": "error", + "@typescript-eslint/no-explicit-any": "error", + "@typescript-eslint/ban-ts-comment": "error" + } +} \ No newline at end of file diff --git a/example/music-bot/index.js b/example/music-bot/index.js index f46a2f2..fcd9f57 100644 --- a/example/music-bot/index.js +++ b/example/music-bot/index.js @@ -172,7 +172,7 @@ client.on("interaction", async (interaction) => { requestedBy: interaction.user, searchEngine: interaction.commandName === "soundcloud" ? QueryType.SOUNDCLOUD_SEARCH : QueryType.AUTO }) - .catch(() => {}); + .catch(Util.noop); if (!searchResult || !searchResult.tracks.length) return void interaction.followUp({ content: "No results were found!" }); const queue = await player.createQueue(interaction.guild, { diff --git a/package.json b/package.json index b3cebe7..e16bc81 100644 --- a/package.json +++ b/package.json @@ -10,10 +10,12 @@ "scripts": { "dev": "cd example/test && ts-node index.ts", "build": "rimraf lib && tsc", + "build:check": "tsc --noEmit --incremental false", "format": "prettier --write \"src/**/*.ts\" \"example/**/*.ts\"", - "lint": "tslint -p tsconfig.json", "docs": "docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/index.yml --output docs/docs.json", - "docs:test": "docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/index.yml" + "docs:test": "docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/index.yml", + "lint": "eslint src --ext .ts", + "lint:fix": "eslint src --ext .ts --fix" }, "funding": "https://github.com/Androz2091/discord-player?sponsor=1", "contributors": [ @@ -68,15 +70,16 @@ "@discordjs/opus": "^0.5.3", "@types/node": "^15.12.2", "@types/ws": "^7.4.4", + "@typescript-eslint/eslint-plugin": "^4.28.0", + "@typescript-eslint/parser": "^4.28.0", "discord-api-types": "^0.18.1", "discord.js": "^13.0.0-dev.c850ae10270076c4b2e10b130dd8f88eed4ed201", "discord.js-docgen": "discordjs/docgen#ts-patch", + "eslint": "^7.29.0", "jsdoc-babel": "^0.5.0", "prettier": "^2.3.1", "rimraf": "^3.0.2", "ts-node": "^10.0.0", - "tslint": "^6.1.3", - "tslint-config-prettier": "^1.18.0", - "typescript": "^4.3.2" + "typescript": "^4.3.4" } } diff --git a/src/Player.ts b/src/Player.ts index 509c421..b78a590 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -8,6 +8,7 @@ import { QueryResolver } from "./utils/QueryResolver"; import YouTube from "youtube-sr"; import { Util } from "./utils/Util"; import Spotify from "spotify-url-info"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import { Client as SoundCloud } from "soundcloud-scraper"; import { Playlist } from "./Structures/Playlist"; @@ -49,7 +50,7 @@ class Player extends EventEmitter { this.client.on("voiceStateUpdate", this._handleVoiceState.bind(this)); if (this.options?.autoRegisterExtractor) { - let nv: any; + let nv: any; // eslint-disable-line @typescript-eslint/no-explicit-any if ((nv = Util.require("@discord-player/extractor"))) { ["Attachment", "Facebook", "Reverbnation", "Vimeo"].forEach((ext) => void this.use(ext, nv[ext])); @@ -139,7 +140,7 @@ class Player extends EventEmitter { try { prev.destroy(); - } catch {} + } catch {} // eslint-disable-line no-empty this.queues.delete(guild.id); return prev; @@ -162,6 +163,7 @@ class Player extends EventEmitter { options.requestedBy = this.client.users.resolve(options.requestedBy); if (!("searchEngine" in options)) options.searchEngine = QueryType.AUTO; + // eslint-disable-next-line @typescript-eslint/no-unused-vars for (const [_, extractor] of this.extractors) { if (!extractor.validate(query)) continue; const data = await extractor.handle(query); @@ -194,11 +196,11 @@ class Player extends EventEmitter { case QueryType.YOUTUBE_SEARCH: { const videos = await YouTube.search(query, { type: "video" - }).catch(() => {}); + }).catch(Util.noop); // eslint-disable-line @typescript-eslint/no-empty-function if (!videos) return { playlist: null, tracks: [] }; const tracks = videos.map((m) => { - (m as any).source = "youtube"; + (m as any).source = "youtube"; // eslint-disable-line @typescript-eslint/no-explicit-any return new Track(this, { title: m.title, description: m.description, @@ -216,12 +218,13 @@ class Player extends EventEmitter { } case QueryType.SOUNDCLOUD_TRACK: case QueryType.SOUNDCLOUD_SEARCH: { - const result: any[] = QueryResolver.resolve(query) === QueryType.SOUNDCLOUD_TRACK ? [{ url: query }] : await soundcloud.search(query, "track").catch(() => {}); + // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-empty-function + const result: any[] = QueryResolver.resolve(query) === QueryType.SOUNDCLOUD_TRACK ? [{ url: query }] : await soundcloud.search(query, "track").catch(Util.noop); if (!result || !result.length) return { playlist: null, tracks: [] }; const res: Track[] = []; for (const r of result) { - const trackInfo = await soundcloud.getSongInfo(r.url).catch(() => {}); + const trackInfo = await soundcloud.getSongInfo(r.url).catch(Util.noop); // eslint-disable-line @typescript-eslint/no-empty-function if (!trackInfo) continue; const track = new Track(this, { @@ -243,7 +246,7 @@ class Player extends EventEmitter { return { playlist: null, tracks: res }; } case QueryType.SPOTIFY_SONG: { - const spotifyData = await Spotify.getData(query).catch(() => {}); + const spotifyData = await Spotify.getData(query).catch(Util.noop); // eslint-disable-line @typescript-eslint/no-empty-function if (!spotifyData) return { playlist: null, tracks: [] }; const spotifyTrack = new Track(this, { title: spotifyData.name, @@ -264,7 +267,7 @@ class Player extends EventEmitter { } case QueryType.SPOTIFY_PLAYLIST: case QueryType.SPOTIFY_ALBUM: { - const spotifyPlaylist = await Spotify.getData(query).catch(() => {}); + const spotifyPlaylist = await Spotify.getData(query).catch(Util.noop); // eslint-disable-line @typescript-eslint/no-empty-function if (!spotifyPlaylist) return { playlist: null, tracks: [] }; const playlist = new Playlist(this, { @@ -290,6 +293,7 @@ class Player extends EventEmitter { }); if (spotifyPlaylist.type !== "playlist") { + // eslint-disable-next-line @typescript-eslint/no-explicit-any playlist.tracks = spotifyPlaylist.tracks.items.map((m: any) => { const data = new Track(this, { title: m.name ?? "", @@ -307,6 +311,7 @@ class Player extends EventEmitter { return data; }) as Track[]; } else { + // eslint-disable-next-line @typescript-eslint/no-explicit-any playlist.tracks = spotifyPlaylist.tracks.items.map((m: any) => { const data = new Track(this, { title: m.track.name ?? "", @@ -328,7 +333,7 @@ class Player extends EventEmitter { return { playlist: playlist, tracks: playlist.tracks }; } case QueryType.SOUNDCLOUD_PLAYLIST: { - const data = await SoundCloud.getPlaylist(query).catch(() => {}); + const data = await SoundCloud.getPlaylist(query).catch(Util.noop); // eslint-disable-line @typescript-eslint/no-empty-function if (!data) return { playlist: null, tracks: [] }; const res = new Playlist(this, { @@ -367,11 +372,11 @@ class Player extends EventEmitter { return { playlist: res, tracks: res.tracks }; } case QueryType.YOUTUBE_PLAYLIST: { - const ytpl = await YouTube.getPlaylist(query).catch(() => {}); + const ytpl = await YouTube.getPlaylist(query).catch(Util.noop); // eslint-disable-line @typescript-eslint/no-empty-function if (!ytpl) return { playlist: null, tracks: [] }; // @todo: better way of handling large playlists - await ytpl.fetch().catch(() => {}); + await ytpl.fetch().catch(Util.noop); // eslint-disable-line @typescript-eslint/no-empty-function const playlist: Playlist = new Playlist(this, { title: ytpl.title, @@ -420,6 +425,7 @@ class Player extends EventEmitter { * @param {boolean} [force=false] Overwrite existing extractor with this name (if available) * @returns {ExtractorModel} */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any use(extractorName: string, extractor: ExtractorModel | any, force = false): ExtractorModel { if (!extractorName) throw new Error("Cannot use unknown extractor!"); if (this.extractors.has(extractorName) && !force) return this.extractors.get(extractorName); diff --git a/src/Structures/ExtractorModel.ts b/src/Structures/ExtractorModel.ts index 7fec971..f85d438 100644 --- a/src/Structures/ExtractorModel.ts +++ b/src/Structures/ExtractorModel.ts @@ -2,13 +2,14 @@ import { ExtractorModelData } from "../types/types"; class ExtractorModel { name: string; - private _raw: any; + private _raw: any; // eslint-disable-line @typescript-eslint/no-explicit-any /** * Model for raw Discord Player extractors * @param {string} extractorName Name of the extractor * @param {object} data Extractor object */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any constructor(extractorName: string, data: any) { /** * The extractor name @@ -37,6 +38,7 @@ class ExtractorModel { return { playlist: data.playlist ?? null, data: + // eslint-disable-next-line @typescript-eslint/no-explicit-any data.info?.map((m: any) => ({ title: m.title, duration: m.duration, diff --git a/src/Structures/Playlist.ts b/src/Structures/Playlist.ts index 5cbfa98..d76dd66 100644 --- a/src/Structures/Playlist.ts +++ b/src/Structures/Playlist.ts @@ -16,7 +16,7 @@ class Playlist { }; public id: string; public url: string; - public readonly rawPlaylist?: any; + public readonly rawPlaylist?: any; // eslint-disable-line @typescript-eslint/no-explicit-any /** * Playlist constructor diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index e9a8d84..f2c5d67 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -2,7 +2,7 @@ import { Collection, Guild, StageChannel, VoiceChannel } from "discord.js"; import { Player } from "../Player"; import { StreamDispatcher } from "../VoiceInterface/BasicStreamDispatcher"; import Track from "./Track"; -import { FiltersName, PlayerOptions, PlayOptions, QueueFilters, QueueRepeatMode } from "../types/types"; +import { PlayerOptions, PlayOptions, QueueFilters, QueueRepeatMode } from "../types/types"; import ytdl from "discord-ytdl-core"; import { AudioResource, StreamType } from "@discordjs/voice"; import { Util } from "../utils/Util"; @@ -19,9 +19,9 @@ class Queue { public playing = false; public metadata?: T = null; public repeatMode: QueueRepeatMode = 0; - private _streamTime: number = 0; + private _streamTime = 0; public _cooldownsTimeout = new Collection(); - private _activeFilters: any[] = []; + private _activeFilters: any[] = []; // eslint-disable-line @typescript-eslint/no-explicit-any private _filtersUpdate = false; public destroyed = false; @@ -134,7 +134,7 @@ class Queue { }); this.connection = connection; - if (channel.type === "stage") await channel.guild.me.voice.setRequestToSpeak(true).catch(() => {}); + if (channel.type === "stage") await channel.guild.me.voice.setRequestToSpeak(true).catch(Util.noop); // eslint-disable-line @typescript-eslint/no-empty-function this.connection.on("error", (err) => this.player.emit("connectionError", this, err)); this.connection.on("debug", (msg) => this.player.emit("debug", this, msg)); @@ -332,7 +332,7 @@ class Queue { }); } - const _filters: any[] = []; + const _filters: any[] = []; // eslint-disable-line @typescript-eslint/no-explicit-any for (const filter in filters) { if (filters[filter as keyof QueueFilters] === true) _filters.push(filter); @@ -466,7 +466,7 @@ class Queue { const info = await ytdl .getInfo(track.url) .then((x) => x.related_videos[0]) - .catch(() => {}); + .catch(Util.noop); // eslint-disable-line @typescript-eslint/no-empty-function if (!info) { if (this.options.leaveOnEnd) this.destroy(); return void this.player.emit("queueEnd", this); diff --git a/src/VoiceInterface/BasicStreamDispatcher.ts b/src/VoiceInterface/BasicStreamDispatcher.ts index f7a0294..d1a27a9 100644 --- a/src/VoiceInterface/BasicStreamDispatcher.ts +++ b/src/VoiceInterface/BasicStreamDispatcher.ts @@ -18,10 +18,10 @@ import Track from "../Structures/Track"; import { Util } from "../utils/Util"; export interface VoiceEvents { - error: (error: AudioPlayerError) => any; - debug: (message: string) => any; - start: () => any; - finish: () => any; + error: (error: AudioPlayerError) => any; // eslint-disable-line @typescript-eslint/no-explicit-any + debug: (message: string) => any; // eslint-disable-line @typescript-eslint/no-explicit-any + start: () => any; // eslint-disable-line @typescript-eslint/no-explicit-any + finish: () => any; // eslint-disable-line @typescript-eslint/no-explicit-any } class StreamDispatcher extends EventEmitter { @@ -29,7 +29,7 @@ class StreamDispatcher extends EventEmitter { public readonly audioPlayer: AudioPlayer; public readonly channel: VoiceChannel | StageChannel; public audioResource?: AudioResource; - private readyLock: boolean = false; + private readyLock = false; /** * Creates new connection object @@ -108,6 +108,7 @@ class StreamDispatcher extends EventEmitter { * @param {object} [ops={}] Options * @returns {AudioResource} */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any createStream(src: Readable | Duplex | string, ops?: { type?: StreamType; data?: any }) { this.audioResource = createAudioResource(src, { inputType: ops?.type ?? StreamType.Arbitrary, @@ -134,7 +135,7 @@ class StreamDispatcher extends EventEmitter { try { this.audioPlayer.stop(true); this.voiceConnection.destroy(); - } catch {} + } catch {} // eslint-disable-line no-empty } /** diff --git a/src/VoiceInterface/VoiceUtils.ts b/src/VoiceInterface/VoiceUtils.ts index f8eb601..085e0ad 100644 --- a/src/VoiceInterface/VoiceUtils.ts +++ b/src/VoiceInterface/VoiceUtils.ts @@ -52,7 +52,7 @@ class VoiceUtils { let conn = joinVoiceChannel({ guildId: channel.guild.id, channelId: channel.id, - adapterCreator: (channel.guild as any).voiceAdapterCreator, + adapterCreator: (channel.guild as any).voiceAdapterCreator, // eslint-disable-line @typescript-eslint/no-explicit-any selfDeaf: Boolean(options.deaf) }); diff --git a/src/types/types.ts b/src/types/types.ts index 96f7ad2..2bd2dd7 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -84,9 +84,9 @@ export interface RawTrackData { requestedBy: User; playlist?: Playlist; source?: TrackSource; - engine?: any; + engine?: any; // eslint-disable-line @typescript-eslint/no-explicit-any live?: boolean; - raw?: any; + raw?: any; // eslint-disable-line @typescript-eslint/no-explicit-any } /** @@ -182,7 +182,7 @@ export interface ExtractorModelData { }; id: string; url: string; - rawPlaylist?: any; + rawPlaylist?: any; // eslint-disable-line @typescript-eslint/no-explicit-any }; data: { title: string; @@ -304,6 +304,7 @@ export enum QueryType { * @param {Track} track The track */ +/* eslint-disable @typescript-eslint/no-explicit-any */ export interface PlayerEvents { botDisconnect: (queue: Queue) => any; channelEmpty: (queue: Queue) => any; @@ -317,6 +318,8 @@ export interface PlayerEvents { trackStart: (queue: Queue, track: Track) => any; } +/* eslint-enable @typescript-eslint/no-explicit-any */ + /** * @typedef {object} PlayOptions * @property {boolean} [filtersUpdate=false] If this play was triggered for filters update @@ -384,7 +387,7 @@ export interface PlaylistInitData { }; id: string; url: string; - rawPlaylist?: any; + rawPlaylist?: any; // eslint-disable-line @typescript-eslint/no-explicit-any } /** diff --git a/src/utils/AudioFilters.ts b/src/utils/AudioFilters.ts index cc9ac90..8afefbf 100644 --- a/src/utils/AudioFilters.ts +++ b/src/utils/AudioFilters.ts @@ -90,7 +90,7 @@ const FilterList = { }, toString() { - return this.names.map((m) => (this as any)[m]).join(","); + return this.names.map((m) => (this as any)[m]).join(","); // eslint-disable-line @typescript-eslint/no-explicit-any }, create(filter?: FiltersName[]): string { diff --git a/src/utils/QueryResolver.ts b/src/utils/QueryResolver.ts index 19554a8..2193e08 100644 --- a/src/utils/QueryResolver.ts +++ b/src/utils/QueryResolver.ts @@ -1,6 +1,7 @@ import { validateID, validateURL } from "ytdl-core"; import { YouTube } from "youtube-sr"; import { QueryType } from "../types/types"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import { validateURL as SoundcloudValidateURL } from "soundcloud-scraper"; diff --git a/src/utils/Util.ts b/src/utils/Util.ts index 187813b..27d07b7 100644 --- a/src/utils/Util.ts +++ b/src/utils/Util.ts @@ -14,7 +14,7 @@ class Util { * @param {object} durObj The duration object * @returns {string} */ - static durationString(durObj: object) { + static durationString(durObj: Record) { return Object.values(durObj) .map((m) => (isNaN(m) ? 0 : m)) .join(":"); @@ -58,6 +58,7 @@ class Util { * @param {any[]} arr The array * @returns {any} */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any static last(arr: T[]): T { if (!Array.isArray(arr)) return; return arr[arr.length - 1]; @@ -93,6 +94,10 @@ class Util { static wait(time: number) { return new Promise((r) => setTimeout(r, time).unref()); } + + static get noop() { + return () => {}; // eslint-disable-line @typescript-eslint/no-empty-function + } } export { Util }; diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json new file mode 100644 index 0000000..6a357fa --- /dev/null +++ b/tsconfig.eslint.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "include": [ + "**/*.ts", + "**/*.js" + ], + "exclude": [] +} \ No newline at end of file diff --git a/tslint.json b/tslint.json deleted file mode 100644 index 4e5571c..0000000 --- a/tslint.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "defaultSeverity": "error", - "extends": ["tslint:recommended", "tslint-config-prettier"], - "jsRules": { - "no-unused-expression": true - }, - "rules": { - "object-literal-sort-keys": false, - "interface-name": false, - "no-empty": false, - "no-console": false, - "radix": false - }, - "rulesDirectory": [] -} \ No newline at end of file From 85fd255051777dd13b4b758ee87f9eea918a14dd Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Tue, 22 Jun 2021 16:10:20 +0545 Subject: [PATCH 132/215] padding --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e16bc81..41c236e 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "docs": "docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/index.yml --output docs/docs.json", "docs:test": "docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/index.yml", "lint": "eslint src --ext .ts", - "lint:fix": "eslint src --ext .ts --fix" + "lint:fix": "eslint src --ext .ts --fix" }, "funding": "https://github.com/Androz2091/discord-player?sponsor=1", "contributors": [ From f0259b39ce43dd051629738e9c6b3c2918114ab5 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Tue, 22 Jun 2021 16:35:31 +0545 Subject: [PATCH 133/215] emit audio resource --- src/Structures/Queue.ts | 8 ++++---- src/VoiceInterface/BasicStreamDispatcher.ts | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index f2c5d67..a533878 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -141,16 +141,17 @@ class Queue { this.player.emit("connectionCreate", this, this.connection); - this.connection.on("start", () => { + this.connection.on("start", (resource) => { this.playing = true; - if (!this._filtersUpdate) this.player.emit("trackStart", this, this.current); + if (!this._filtersUpdate) this.player.emit("trackStart", this, resource.metadata); this._filtersUpdate = false; }); - this.connection.on("finish", async () => { + this.connection.on("finish", async (resource) => { this.playing = false; if (this._filtersUpdate) return; this._streamTime = 0; + this.previousTracks.push(resource.metadata); if (!this.tracks.length && this.repeatMode === QueueRepeatMode.OFF) { if (this.options.leaveOnEnd) this.destroy(); @@ -405,7 +406,6 @@ class Queue { if (!options.filtersUpdate) { this.previousTracks = this.previousTracks.filter((x) => x._trackID !== track._trackID); - this.previousTracks.push(track); } let stream; diff --git a/src/VoiceInterface/BasicStreamDispatcher.ts b/src/VoiceInterface/BasicStreamDispatcher.ts index d1a27a9..edacff7 100644 --- a/src/VoiceInterface/BasicStreamDispatcher.ts +++ b/src/VoiceInterface/BasicStreamDispatcher.ts @@ -20,8 +20,8 @@ import { Util } from "../utils/Util"; export interface VoiceEvents { error: (error: AudioPlayerError) => any; // eslint-disable-line @typescript-eslint/no-explicit-any debug: (message: string) => any; // eslint-disable-line @typescript-eslint/no-explicit-any - start: () => any; // eslint-disable-line @typescript-eslint/no-explicit-any - finish: () => any; // eslint-disable-line @typescript-eslint/no-explicit-any + start: (resource: AudioResource) => any; // eslint-disable-line @typescript-eslint/no-explicit-any + finish: (resource: AudioResource) => any; // eslint-disable-line @typescript-eslint/no-explicit-any } class StreamDispatcher extends EventEmitter { @@ -89,11 +89,11 @@ class StreamDispatcher extends EventEmitter { this.audioPlayer.on("stateChange", (oldState, newState) => { if (newState.status === AudioPlayerStatus.Idle && oldState.status !== AudioPlayerStatus.Idle) { if (!this.paused) { + void this.emit("finish", this.audioResource); this.audioResource = null; - void this.emit("finish"); } } else if (newState.status === AudioPlayerStatus.Playing) { - if (!this.paused) void this.emit("start"); + if (!this.paused) void this.emit("start", this.audioResource); } }); From 6e70970cc49a357830dc1dc9326771b395aab165 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Tue, 22 Jun 2021 20:23:00 +0545 Subject: [PATCH 134/215] handle null resource --- src/Structures/Queue.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index a533878..3208a24 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -143,7 +143,7 @@ class Queue { this.connection.on("start", (resource) => { this.playing = true; - if (!this._filtersUpdate) this.player.emit("trackStart", this, resource.metadata); + if (!this._filtersUpdate) this.player.emit("trackStart", this, resource?.metadata ?? this.current); this._filtersUpdate = false; }); @@ -151,7 +151,7 @@ class Queue { this.playing = false; if (this._filtersUpdate) return; this._streamTime = 0; - this.previousTracks.push(resource.metadata); + if (resource) this.previousTracks.push(resource.metadata); if (!this.tracks.length && this.repeatMode === QueueRepeatMode.OFF) { if (this.options.leaveOnEnd) this.destroy(); @@ -385,6 +385,9 @@ class Queue { return await this.play(prev, { immediate: true }); } + /** + * Clear this queue + */ clear() { this.#watchDestroyed(); this.tracks = []; @@ -457,6 +460,11 @@ class Queue { }); } + /** + * Private method to handle autoplay + * @param {Track} track The source track to find its similar track for autoplay + * @returns {Promise} + */ private async _handleAutoplay(track: Track): Promise { this.#watchDestroyed(); if (!track || ![track.source, track.raw?.source].includes("youtube")) { From 18aa70531e522d4b24dd812b466fa90823db32d2 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Tue, 22 Jun 2021 22:22:13 +0545 Subject: [PATCH 135/215] merge master --- .github/ISSUE_TEMPLATE/bug_report.md | 4 ---- .github/ISSUE_TEMPLATE/feature_request.md | 4 ---- .github/ISSUE_TEMPLATE/question.md | 4 ---- 3 files changed, 12 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 3b592c2..d211114 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,10 +1,6 @@ --- name: Bug report about: Create a bug report to help us improve -<<<<<<< HEAD -======= -title: "" ->>>>>>> 082780cce26bbec4d1069359763b96ac619fd7ce labels: bug assignees: '' diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 9006ae3..4be6790 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,10 +1,6 @@ --- name: Feature request about: Suggest an idea for this project -<<<<<<< HEAD -======= -title: "" ->>>>>>> 082780cce26bbec4d1069359763b96ac619fd7ce labels: enhancement assignees: '' diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md index 74f1dfe..d7f46be 100644 --- a/.github/ISSUE_TEMPLATE/question.md +++ b/.github/ISSUE_TEMPLATE/question.md @@ -1,10 +1,6 @@ --- name: Question about: Some questions related to this lib -<<<<<<< HEAD -======= -title: "" ->>>>>>> 082780cce26bbec4d1069359763b96ac619fd7ce labels: question assignees: '' From 2b82fe2b70a044dfb5bbe17afe9990ca0209f0c4 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Wed, 23 Jun 2021 00:56:50 +0545 Subject: [PATCH 136/215] adapter creator for djs v12 --- src/Player.ts | 22 +++++----- src/VoiceInterface/AdapterCreator.ts | 62 ++++++++++++++++++++++++++++ src/VoiceInterface/VoiceUtils.ts | 5 ++- src/index.ts | 1 + src/types/types.ts | 2 +- src/utils/AudioFilters.ts | 2 +- src/utils/Util.ts | 4 +- 7 files changed, 81 insertions(+), 17 deletions(-) create mode 100644 src/VoiceInterface/AdapterCreator.ts diff --git a/src/Player.ts b/src/Player.ts index b8df62b..b78a590 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -140,7 +140,7 @@ class Player extends EventEmitter { try { prev.destroy(); - } catch { } // eslint-disable-line no-empty + } catch {} // eslint-disable-line no-empty this.queues.delete(guild.id); return prev; @@ -171,9 +171,9 @@ class Player extends EventEmitter { const playlist = !data.playlist ? null : new Playlist(this, { - ...data.playlist, - tracks: [] - }); + ...data.playlist, + tracks: [] + }); const tracks = data.data.map( (m) => @@ -279,13 +279,13 @@ class Player extends EventEmitter { author: spotifyPlaylist.type !== "playlist" ? { - name: spotifyPlaylist.artists[0]?.name ?? "Unknown Artist", - url: spotifyPlaylist.artists[0]?.external_urls?.spotify ?? null - } + name: spotifyPlaylist.artists[0]?.name ?? "Unknown Artist", + url: spotifyPlaylist.artists[0]?.external_urls?.spotify ?? null + } : { - name: spotifyPlaylist.owner?.display_name ?? spotifyPlaylist.owner?.id ?? "Unknown Artist", - url: spotifyPlaylist.owner?.external_urls?.spotify ?? null - }, + name: spotifyPlaylist.owner?.display_name ?? spotifyPlaylist.owner?.id ?? "Unknown Artist", + url: spotifyPlaylist.owner?.external_urls?.spotify ?? null + }, tracks: [], id: spotifyPlaylist.id, url: spotifyPlaylist.external_urls?.spotify ?? query, @@ -469,4 +469,4 @@ class Player extends EventEmitter { } } -export { Player }; \ No newline at end of file +export { Player }; diff --git a/src/VoiceInterface/AdapterCreator.ts b/src/VoiceInterface/AdapterCreator.ts new file mode 100644 index 0000000..cc7d4c7 --- /dev/null +++ b/src/VoiceInterface/AdapterCreator.ts @@ -0,0 +1,62 @@ +import { DiscordGatewayAdapterCreator, DiscordGatewayAdapterLibraryMethods } from "@discordjs/voice"; +import { VoiceChannel, Snowflake, Client, Constants, WebSocketShard, Guild, StageChannel } from "discord.js"; +import { GatewayVoiceServerUpdateDispatchData, GatewayVoiceStateUpdateDispatchData } from "discord-api-types/v8"; + +const adapters = new Map(); +const trackedClients = new Set(); + +function trackClient(client: Client) { + if (trackedClients.has(client)) return; + trackedClients.add(client); + client.ws.on(Constants.WSEvents.VOICE_SERVER_UPDATE, (payload: GatewayVoiceServerUpdateDispatchData) => { + adapters.get(payload.guild_id)?.onVoiceServerUpdate(payload); + }); + client.ws.on(Constants.WSEvents.VOICE_STATE_UPDATE, (payload: GatewayVoiceStateUpdateDispatchData) => { + if (payload.guild_id && payload.session_id && payload.user_id === client.user?.id) { + adapters.get(payload.guild_id)?.onVoiceStateUpdate(payload); + } + }); +} + +const trackedGuilds = new Map>(); + +function cleanupGuilds(shard: WebSocketShard) { + const guilds = trackedGuilds.get(shard); + if (guilds) { + for (const guildID of guilds.values()) { + adapters.get(guildID)?.destroy(); + } + } +} + +function trackGuild(guild: Guild) { + let guilds = trackedGuilds.get(guild.shard); + if (!guilds) { + const cleanup = () => cleanupGuilds(guild.shard); + guild.shard.on("close", cleanup); + guild.shard.on("destroyed", cleanup); + guilds = new Set(); + trackedGuilds.set(guild.shard, guilds); + } + guilds.add(guild.id); +} + +export function VoiceAdapterCreator(channel: VoiceChannel | StageChannel): DiscordGatewayAdapterCreator { + return (methods) => { + adapters.set(channel.guild.id, methods); + trackClient(channel.client); + trackGuild(channel.guild); + return { + sendPayload(data) { + if (channel.guild.shard.status === Constants.Status.READY) { + channel.guild.shard.send(data); + return true; + } + return false; + }, + destroy() { + return adapters.delete(channel.guild.id); + } + }; + }; +} diff --git a/src/VoiceInterface/VoiceUtils.ts b/src/VoiceInterface/VoiceUtils.ts index 085e0ad..5de378c 100644 --- a/src/VoiceInterface/VoiceUtils.ts +++ b/src/VoiceInterface/VoiceUtils.ts @@ -1,5 +1,5 @@ import { VoiceChannel, StageChannel, Collection, Snowflake } from "discord.js"; -import { entersState, joinVoiceChannel, VoiceConnection, VoiceConnectionStatus } from "@discordjs/voice"; +import { DiscordGatewayAdapterCreator, entersState, joinVoiceChannel, VoiceConnection, VoiceConnectionStatus } from "@discordjs/voice"; import { StreamDispatcher } from "./BasicStreamDispatcher"; class VoiceUtils { @@ -47,12 +47,13 @@ class VoiceUtils { options?: { deaf?: boolean; maxTime?: number; + adapter?: DiscordGatewayAdapterCreator; } ) { let conn = joinVoiceChannel({ guildId: channel.guild.id, channelId: channel.id, - adapterCreator: (channel.guild as any).voiceAdapterCreator, // eslint-disable-line @typescript-eslint/no-explicit-any + adapterCreator: options.adapter ?? (channel.guild as any).voiceAdapterCreator, // eslint-disable-line @typescript-eslint/no-explicit-any selfDeaf: Boolean(options.deaf) }); diff --git a/src/index.ts b/src/index.ts index 2cae5d4..8acfe26 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,4 +6,5 @@ export { Queue } from "./Structures/Queue"; export { Track } from "./Structures/Track"; export { VoiceUtils } from "./VoiceInterface/VoiceUtils"; export { VoiceEvents, StreamDispatcher } from "./VoiceInterface/BasicStreamDispatcher"; +export { VoiceAdapterCreator } from "./VoiceInterface/AdapterCreator"; export * from "./types/types"; diff --git a/src/types/types.ts b/src/types/types.ts index a3c043e..2bd2dd7 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -453,4 +453,4 @@ export interface PlaylistJSON { export interface DiscordPlayerInitOptions { autoRegisterExtractor?: boolean; ytdlOptions?: downloadOptions; -} \ No newline at end of file +} diff --git a/src/utils/AudioFilters.ts b/src/utils/AudioFilters.ts index f0860f4..8afefbf 100644 --- a/src/utils/AudioFilters.ts +++ b/src/utils/AudioFilters.ts @@ -113,4 +113,4 @@ const FilterList = { }; export default FilterList; -export { FilterList as AudioFilters }; \ No newline at end of file +export { FilterList as AudioFilters }; diff --git a/src/utils/Util.ts b/src/utils/Util.ts index 120e7d0..27d07b7 100644 --- a/src/utils/Util.ts +++ b/src/utils/Util.ts @@ -96,8 +96,8 @@ class Util { } static get noop() { - return () => { }; // eslint-disable-line @typescript-eslint/no-empty-function + return () => {}; // eslint-disable-line @typescript-eslint/no-empty-function } } -export { Util }; \ No newline at end of file +export { Util }; From ed92e332ab51ad3850018edcddeaa6c6d5cbd420 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Wed, 23 Jun 2021 15:10:39 +0545 Subject: [PATCH 137/215] add StreamUtils --- src/index.ts | 3 +++ src/utils/StreamUtils.ts | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 src/utils/StreamUtils.ts diff --git a/src/index.ts b/src/index.ts index 8acfe26..5739670 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,8 +2,11 @@ export { AudioFilters } from "./utils/AudioFilters"; export { ExtractorModel } from "./Structures/ExtractorModel"; export { Playlist } from "./Structures/Playlist"; export { Player } from "./Player"; +export { QueryResolver } from "./utils/QueryResolver"; export { Queue } from "./Structures/Queue"; +export { StreamUtils } from "./utils/StreamUtils"; export { Track } from "./Structures/Track"; +export { Util } from "./utils/Util"; export { VoiceUtils } from "./VoiceInterface/VoiceUtils"; export { VoiceEvents, StreamDispatcher } from "./VoiceInterface/BasicStreamDispatcher"; export { VoiceAdapterCreator } from "./VoiceInterface/AdapterCreator"; diff --git a/src/utils/StreamUtils.ts b/src/utils/StreamUtils.ts new file mode 100644 index 0000000..88b6bd2 --- /dev/null +++ b/src/utils/StreamUtils.ts @@ -0,0 +1,37 @@ +import { Duplex, Readable, PassThrough } from "stream"; + +class StreamUtils { + /** + * Stream utils + */ + constructor() { + throw new Error("Cannot instantiate static class"); + } + + /** + * Can be used to re-create used streams + * @param {Readable|Duplex} stream The used stream + * @returns {Readable} + */ + static clone(stream: Readable | Duplex): Readable { + const passed = stream.pipe(new PassThrough()); + return passed; + } + + /** + * Converts stream to buffer + * @param {Readable|Duplex} stream The stream + * @returns {Promise} + */ + static toBuffer(stream: Readable | Duplex): Promise { + return new Promise((resolve, reject) => { + const chunks: Buffer[] = []; + + stream.on("data", (chunk) => chunks.push(chunk)); + stream.on("end", () => resolve(Buffer.concat(chunks))); + stream.on("error", reject); + }); + } +} + +export { StreamUtils }; From a0b04d7a625b52ced9a8e48c94c1da1fb74794c1 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Wed, 23 Jun 2021 15:30:11 +0545 Subject: [PATCH 138/215] fix: autoplay --- .eslintrc.json | 3 ++- src/Player.ts | 14 +++++++------- src/Structures/Queue.ts | 21 ++++++++++++--------- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 13921e1..05b5e82 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -15,6 +15,7 @@ "@typescript-eslint/explicit-module-boundary-types": "off", "@typescript-eslint/no-unused-vars": "error", "@typescript-eslint/no-explicit-any": "error", - "@typescript-eslint/ban-ts-comment": "error" + "@typescript-eslint/ban-ts-comment": "error", + "semi": "error" } } \ No newline at end of file diff --git a/src/Player.ts b/src/Player.ts index b78a590..eeeca68 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -196,7 +196,7 @@ class Player extends EventEmitter { case QueryType.YOUTUBE_SEARCH: { const videos = await YouTube.search(query, { type: "video" - }).catch(Util.noop); // eslint-disable-line @typescript-eslint/no-empty-function + }).catch(Util.noop); if (!videos) return { playlist: null, tracks: [] }; const tracks = videos.map((m) => { @@ -224,7 +224,7 @@ class Player extends EventEmitter { const res: Track[] = []; for (const r of result) { - const trackInfo = await soundcloud.getSongInfo(r.url).catch(Util.noop); // eslint-disable-line @typescript-eslint/no-empty-function + const trackInfo = await soundcloud.getSongInfo(r.url).catch(Util.noop); if (!trackInfo) continue; const track = new Track(this, { @@ -246,7 +246,7 @@ class Player extends EventEmitter { return { playlist: null, tracks: res }; } case QueryType.SPOTIFY_SONG: { - const spotifyData = await Spotify.getData(query).catch(Util.noop); // eslint-disable-line @typescript-eslint/no-empty-function + const spotifyData = await Spotify.getData(query).catch(Util.noop); if (!spotifyData) return { playlist: null, tracks: [] }; const spotifyTrack = new Track(this, { title: spotifyData.name, @@ -267,7 +267,7 @@ class Player extends EventEmitter { } case QueryType.SPOTIFY_PLAYLIST: case QueryType.SPOTIFY_ALBUM: { - const spotifyPlaylist = await Spotify.getData(query).catch(Util.noop); // eslint-disable-line @typescript-eslint/no-empty-function + const spotifyPlaylist = await Spotify.getData(query).catch(Util.noop); if (!spotifyPlaylist) return { playlist: null, tracks: [] }; const playlist = new Playlist(this, { @@ -333,7 +333,7 @@ class Player extends EventEmitter { return { playlist: playlist, tracks: playlist.tracks }; } case QueryType.SOUNDCLOUD_PLAYLIST: { - const data = await SoundCloud.getPlaylist(query).catch(Util.noop); // eslint-disable-line @typescript-eslint/no-empty-function + const data = await SoundCloud.getPlaylist(query).catch(Util.noop); if (!data) return { playlist: null, tracks: [] }; const res = new Playlist(this, { @@ -372,11 +372,11 @@ class Player extends EventEmitter { return { playlist: res, tracks: res.tracks }; } case QueryType.YOUTUBE_PLAYLIST: { - const ytpl = await YouTube.getPlaylist(query).catch(Util.noop); // eslint-disable-line @typescript-eslint/no-empty-function + const ytpl = await YouTube.getPlaylist(query).catch(Util.noop); if (!ytpl) return { playlist: null, tracks: [] }; // @todo: better way of handling large playlists - await ytpl.fetch().catch(Util.noop); // eslint-disable-line @typescript-eslint/no-empty-function + await ytpl.fetch().catch(Util.noop); const playlist: Playlist = new Playlist(this, { title: ytpl.title, diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 3208a24..b3652bd 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -134,7 +134,10 @@ class Queue { }); this.connection = connection; - if (channel.type === "stage") await channel.guild.me.voice.setRequestToSpeak(true).catch(Util.noop); // eslint-disable-line @typescript-eslint/no-empty-function + if (channel.type === "stage") { + await channel.guild.me.voice.setRequestToSpeak(true).catch(Util.noop); + await channel.guild.me.voice.setSuppressed(false).catch(Util.noop); + } this.connection.on("error", (err) => this.player.emit("connectionError", this, err)); this.connection.on("debug", (msg) => this.player.emit("debug", this, msg)); @@ -409,6 +412,7 @@ class Queue { if (!options.filtersUpdate) { this.previousTracks = this.previousTracks.filter((x) => x._trackID !== track._trackID); + this.previousTracks.push(track); } let stream; @@ -471,10 +475,9 @@ class Queue { if (this.options.leaveOnEnd) this.destroy(); return void this.player.emit("queueEnd", this); } - const info = await ytdl - .getInfo(track.url) - .then((x) => x.related_videos[0]) - .catch(Util.noop); // eslint-disable-line @typescript-eslint/no-empty-function + const info = await YouTube.getVideo(track.url) + .then((x) => x.videos[0]) + .catch(Util.noop); if (!info) { if (this.options.leaveOnEnd) this.destroy(); return void this.player.emit("queueEnd", this); @@ -483,11 +486,11 @@ class Queue { const nextTrack = new Track(this.player, { title: info.title, url: `https://www.youtube.com/watch?v=${info.id}`, - duration: info.length_seconds ? Util.buildTimeCode(Util.parseMS(info.length_seconds * 1000)) : "0:00", + duration: info.durationFormatted ? Util.buildTimeCode(Util.parseMS(info.duration * 1000)) : "0:00", description: "", - thumbnail: Util.last(info.thumbnails).url, - views: parseInt(info.view_count.replace(/[^0-9]/g, "")), - author: typeof info.author === "string" ? info.author : info.author.name, + thumbnail: typeof info.thumbnail === "string" ? info.thumbnail : info.thumbnail.url, + views: info.views, + author: info.channel.name, requestedBy: track.requestedBy, source: "youtube" }); From fb864c08ac08c5cf9f0e40a44485f411f0450ff4 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Wed, 23 Jun 2021 16:19:53 +0545 Subject: [PATCH 139/215] handle voice states --- src/Player.ts | 23 +++++++++++++++++++++ src/Structures/Queue.ts | 9 ++++---- src/VoiceInterface/BasicStreamDispatcher.ts | 19 +++++++++-------- 3 files changed, 38 insertions(+), 13 deletions(-) diff --git a/src/Player.ts b/src/Player.ts index eeeca68..5d737c2 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -69,6 +69,29 @@ class Player extends EventEmitter { const queue = this.getQueue(oldState.guild.id); if (!queue) return; + // update channel + if (oldState.channelID && newState.channelID && oldState.channelID !== newState.channelID) { + queue.connection.channel = newState.channel; + } + + if (!oldState.channelID && newState.channelID && newState.member.id === newState.guild.me.id) { + if (newState.serverMute || !newState.serverMute) { + queue.setPaused(newState.serverMute); + } else if (newState.suppress || !newState.suppress) { + if (newState.suppress) newState.guild.me.voice.setRequestToSpeak(true).catch(Util.noop); + queue.setPaused(newState.suppress); + } + } + + if (oldState.channelID === newState.channelID && oldState.member.id === newState.guild.me.id) { + if (oldState.serverMute !== newState.serverMute) { + queue.setPaused(newState.serverMute); + } else if (oldState.suppress !== newState.suppress) { + if (newState.suppress) newState.guild.me.voice.setRequestToSpeak(true).catch(Util.noop); + queue.setPaused(newState.suppress); + } + } + if (oldState.member.id === this.client.user.id && !newState.channelID) { queue.destroy(); return void this.emit("botDisconnect", queue); diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index b3652bd..bcb44dc 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -135,8 +135,9 @@ class Queue { this.connection = connection; if (channel.type === "stage") { - await channel.guild.me.voice.setRequestToSpeak(true).catch(Util.noop); - await channel.guild.me.voice.setSuppressed(false).catch(Util.noop); + await channel.guild.me.voice.setSuppressed(false).catch(async () => { + return await channel.guild.me.voice.setRequestToSpeak(true).catch(Util.noop); + }); } this.connection.on("error", (err) => this.player.emit("connectionError", this, err)); @@ -146,7 +147,7 @@ class Queue { this.connection.on("start", (resource) => { this.playing = true; - if (!this._filtersUpdate) this.player.emit("trackStart", this, resource?.metadata ?? this.current); + if (!this._filtersUpdate && resource?.metadata) this.player.emit("trackStart", this, resource?.metadata ?? this.current); this._filtersUpdate = false; }); @@ -154,7 +155,7 @@ class Queue { this.playing = false; if (this._filtersUpdate) return; this._streamTime = 0; - if (resource) this.previousTracks.push(resource.metadata); + if (resource && resource.metadata) this.previousTracks.push(resource.metadata); if (!this.tracks.length && this.repeatMode === QueueRepeatMode.OFF) { if (this.options.leaveOnEnd) this.destroy(); diff --git a/src/VoiceInterface/BasicStreamDispatcher.ts b/src/VoiceInterface/BasicStreamDispatcher.ts index edacff7..ddcb1d7 100644 --- a/src/VoiceInterface/BasicStreamDispatcher.ts +++ b/src/VoiceInterface/BasicStreamDispatcher.ts @@ -27,9 +27,10 @@ export interface VoiceEvents { class StreamDispatcher extends EventEmitter { public readonly voiceConnection: VoiceConnection; public readonly audioPlayer: AudioPlayer; - public readonly channel: VoiceChannel | StageChannel; + public channel: VoiceChannel | StageChannel; public audioResource?: AudioResource; private readyLock = false; + public paused: boolean; /** * Creates new connection object @@ -58,6 +59,12 @@ class StreamDispatcher extends EventEmitter { */ this.channel = channel; + /** + * The paused state + * @type {boolean} + */ + this.paused = false; + this.voiceConnection.on("stateChange", async (_, newState) => { if (newState.status === VoiceConnectionStatus.Disconnected) { if (newState.reason === VoiceConnectionDisconnectReason.WebSocketClose && newState.closeCode === 4014) { @@ -153,6 +160,7 @@ class StreamDispatcher extends EventEmitter { */ pause(interpolateSilence?: boolean) { const success = this.audioPlayer.pause(interpolateSilence); + this.paused = success; return success; } @@ -162,6 +170,7 @@ class StreamDispatcher extends EventEmitter { */ resume() { const success = this.audioPlayer.unpause(); + this.paused = !success; return success; } @@ -210,14 +219,6 @@ class StreamDispatcher extends EventEmitter { if (!this.audioResource) return 0; return this.audioResource.playbackDuration; } - - /** - * The paused state - * @type {boolean} - */ - get paused() { - return [AudioPlayerStatus.AutoPaused, AudioPlayerStatus.Paused].includes(this.audioPlayer.state.status); - } } export { StreamDispatcher as StreamDispatcher }; From c925ca442e9f8374e6db7b7baa1c6efd0f165028 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Wed, 23 Jun 2021 17:54:23 +0545 Subject: [PATCH 140/215] make QueueFilters interface --- src/types/types.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/types/types.ts b/src/types/types.ts index 2bd2dd7..2b68592 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -11,7 +11,7 @@ export type FiltersName = keyof QueueFilters; /** * @typedef {AudioFilters} QueueFilters */ -export type QueueFilters = { +export interface QueueFilters { bassboost_low?: boolean; bassboost?: boolean; bassboost_high?: boolean; @@ -45,7 +45,7 @@ export type QueueFilters = { fadein?: boolean; dim?: boolean; earrape?: boolean; -}; +} /** * The track source: From 1d88db17117d79a26967895675c17f117e52878d Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Thu, 24 Jun 2021 10:02:53 +0545 Subject: [PATCH 141/215] fix queueInitOptions being undefined --- src/Player.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Player.ts b/src/Player.ts index 5d737c2..72fdce8 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -125,7 +125,7 @@ class Player extends EventEmitter { * @param {PlayerOptions} queueInitOptions Queue init options * @returns {Queue} */ - createQueue(guild: GuildResolvable, queueInitOptions?: PlayerOptions & { metadata?: T }): Queue { + createQueue(guild: GuildResolvable, queueInitOptions: PlayerOptions & { metadata?: T } = {}): Queue { guild = this.client.guilds.resolve(guild); if (!guild) throw new Error("Unknown Guild"); if (this.queues.has(guild.id)) return this.queues.get(guild.id) as Queue; From 2a6d9a74f4eda15a8e71994b3600d66c11bafcc7 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Thu, 24 Jun 2021 11:05:12 +0545 Subject: [PATCH 142/215] queue utils --- README.md | 2 +- docs/general/welcome.md | 2 +- docs/migrating/migrating.md | 4 +- example/music-bot/index.js | 19 ++++- example/music-bot/package.json | 2 +- package.json | 2 +- src/Player.ts | 1 + src/Structures/Queue.ts | 139 ++++++++++++++++++++++++++++++++- src/types/types.ts | 4 +- yarn.lock | 8 +- 10 files changed, 171 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 5e3c205..1bc1bdb 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,7 @@ client.on("message", async (message) => { } const track = await client.player.search(args[0], { - searchEngine: QueryType.YOUTUBE_SEARCH + requestedBy: message.author }).then(x => x.tracks[1]); if (!track) return void message.reply("Track not found!"); diff --git a/docs/general/welcome.md b/docs/general/welcome.md index 5e3c205..1bc1bdb 100644 --- a/docs/general/welcome.md +++ b/docs/general/welcome.md @@ -92,7 +92,7 @@ client.on("message", async (message) => { } const track = await client.player.search(args[0], { - searchEngine: QueryType.YOUTUBE_SEARCH + requestedBy: message.author }).then(x => x.tracks[1]); if (!track) return void message.reply("Track not found!"); diff --git a/docs/migrating/migrating.md b/docs/migrating/migrating.md index 6fbe25d..77b9c4d 100644 --- a/docs/migrating/migrating.md +++ b/docs/migrating/migrating.md @@ -8,7 +8,9 @@ The new update brings new features as well as better management of different thi ```diff - player.play(message, query); + const queue = player.createQueue(message.guild); -+ const song = await player.search(query); ++ const song = await player.search(query, { ++ requestedBy: message.author +}); + + try { + await queue.connect(message.member.voice.channel); diff --git a/example/music-bot/index.js b/example/music-bot/index.js index fcd9f57..41a6286 100644 --- a/example/music-bot/index.js +++ b/example/music-bot/index.js @@ -254,7 +254,24 @@ client.on("interaction", async (interaction) => { await interaction.defer(); const queue = player.getQueue(interaction.guildID); if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); - return void interaction.followUp({ content: `🎶 | Current song: **${queue.current.title}**!` }); + const progress = queue.createProgressBar(); + const perc = queue.getPlayerTimestamp(); + + return void interaction.followUp({ + embeds: [ + { + title: "Now Playing", + description: `🎶 | **${queue.current.title}**! (\`${perc.progress}%\`)`, + fields: [ + { + name: "\u200b", + value: progress + } + ], + color: 0xffffff + } + ] + }); } else if (interaction.commandName === "loop") { await interaction.defer(); const queue = player.getQueue(interaction.guildID); diff --git a/example/music-bot/package.json b/example/music-bot/package.json index 8470907..b494ecf 100644 --- a/example/music-bot/package.json +++ b/example/music-bot/package.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@discordjs/opus": "^0.5.3", - "discord-player": "^5.0.0-dev.3fd002187de27ed6dc3398fd8f4f5dfe309ba350", + "discord-player": "^5.0.0-dev.1d88db17117d79a26967895675c17f117e52878d", "discord.js": "^13.0.0-dev.c850ae10270076c4b2e10b130dd8f88eed4ed201" } } diff --git a/package.json b/package.json index 41c236e..099f711 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "@typescript-eslint/eslint-plugin": "^4.28.0", "@typescript-eslint/parser": "^4.28.0", "discord-api-types": "^0.18.1", - "discord.js": "^13.0.0-dev.c850ae10270076c4b2e10b130dd8f88eed4ed201", + "discord.js": "^13.0.0-dev.6d3d00b44577a70e840f0187d6894043677c5329", "discord.js-docgen": "discordjs/docgen#ts-patch", "eslint": "^7.29.0", "jsdoc-babel": "^0.5.0", diff --git a/src/Player.ts b/src/Player.ts index 72fdce8..1f1b10e 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -188,6 +188,7 @@ class Player extends EventEmitter { // eslint-disable-next-line @typescript-eslint/no-unused-vars for (const [_, extractor] of this.extractors) { + if (options.blockExtractor) break; if (!extractor.validate(query)) continue; const data = await extractor.handle(query); if (data && data.data.length) { diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index bcb44dc..8b6ee5d 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -2,7 +2,7 @@ import { Collection, Guild, StageChannel, VoiceChannel } from "discord.js"; import { Player } from "../Player"; import { StreamDispatcher } from "../VoiceInterface/BasicStreamDispatcher"; import Track from "./Track"; -import { PlayerOptions, PlayOptions, QueueFilters, QueueRepeatMode } from "../types/types"; +import { PlayerOptions, PlayerProgressbarOptions, PlayOptions, QueueFilters, QueueRepeatMode } from "../types/types"; import ytdl from "discord-ytdl-core"; import { AudioResource, StreamType } from "@discordjs/voice"; import { Util } from "../utils/Util"; @@ -300,6 +300,11 @@ class Queue { return NC ? playbackTime * NC : VW ? playbackTime * VW : playbackTime; } + set streamTime(time: number) { + this.#watchDestroyed(); + this.seek(time); + } + /** * Returns enabled filters * @returns {AudioFilters} @@ -398,6 +403,138 @@ class Queue { this.previousTracks = []; } + /** + * Stops the player + * @returns {void} + */ + stop() { + return this.destroy(); + } + + /** + * Shuffles this queue + * @returns {boolean} + */ + shuffle() { + if (!this.tracks.length || this.tracks.length < 3) return false; + const currentTrack = this.tracks.shift(); + + for (let i = this.tracks.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [this.tracks[i], this.tracks[j]] = [this.tracks[j], this.tracks[i]]; + } + + this.tracks.unshift(currentTrack); + + return true; + } + + /** + * Removes a track from the queue + * @param {Track|number} track The track to remove + * @returns {Track} + */ + remove(track: Track | number) { + let trackFound: Track = null; + if (typeof track === "number") { + trackFound = this.tracks[track]; + if (trackFound) { + this.tracks = this.tracks.filter((t) => t._trackID !== trackFound._trackID); + } + } else { + trackFound = this.tracks.find((s) => s._trackID === track._trackID); + if (trackFound) { + this.tracks = this.tracks.filter((s) => s._trackID !== trackFound._trackID); + } + } + + return trackFound; + } + + /** + * Jumps to particular track + * @param {Track|number} track The track + * @returns {void} + */ + jump(track: Track | number): void { + const foundTrack = this.remove(track); + if (!foundTrack) throw new Error("Track not found"); + this.tracks.splice(1, 0, foundTrack); + + return void this.skip(); + } + + /** + * @typedef {object} PlayerTimestamp + * @param {string} current The current progress + * @param {string} end The total time + * @param {number} progress Progress in % + */ + + /** + * Returns player stream timestamp + * @param {boolean} [queue=false] If it should generate timestamp for the queue + * @returns {PlayerTimestamp} + */ + getPlayerTimestamp(queue = false) { + const previousTracksTime = this.previousTracks.length > 0 ? this.previousTracks.reduce((p, c) => p + c.durationMS, 0) : 0; + const currentStreamTime = queue ? previousTracksTime + this.streamTime : this.streamTime; + const totalTracksTime = this.totalTime; + const totalTime = queue ? previousTracksTime + totalTracksTime : this.current.durationMS; + + const currentTimecode = Util.buildTimeCode(Util.parseMS(currentStreamTime)); + const endTimecode = Util.buildTimeCode(Util.parseMS(totalTime)); + + return { + current: currentTimecode, + end: endTimecode, + progress: Math.round((currentStreamTime / totalTime) * 100) + }; + } + + /** + * Creates progress bar string + * @param {PlayerProgressbarOptions} options The progress bar options + * @returns {string} + */ + createProgressBar(options: PlayerProgressbarOptions = { timecodes: true, queue: false }) { + const previousTracksTime = this.previousTracks.length > 0 ? this.previousTracks.reduce((p, c) => p + c.durationMS, 0) : 0; + const currentStreamTime = options.queue ? previousTracksTime + this.streamTime : this.streamTime; + const totalTracksTime = this.totalTime; + const totalTime = options.queue ? previousTracksTime + totalTracksTime : this.current.durationMS; + const length = typeof options.length === "number" ? (options.length <= 0 || options.length === Infinity ? 15 : options.length) : 15; + + const index = Math.round((currentStreamTime / totalTime) * length); + const indicator = typeof options.indicator === "string" && options.indicator.length > 0 ? options.indicator : "🔘"; + const line = typeof options.line === "string" && options.line.length > 0 ? options.line : "▬"; + + if (index >= 1 && index <= length) { + const bar = line.repeat(length - 1).split(""); + bar.splice(index, 0, indicator); + if (options.timecodes) { + const timestamp = this.getPlayerTimestamp(options.queue); + return `${timestamp.current} ┃ ${bar.join("")} ┃ ${timestamp.end}`; + } else { + return `${bar.join("")}`; + } + } else { + if (options.timecodes) { + const timestamp = this.getPlayerTimestamp(options.queue); + return `${timestamp.current} ┃ ${indicator}${line.repeat(length - 1)} ┃ ${timestamp.end}`; + } else { + return `${indicator}${line.repeat(length - 1)}`; + } + } + } + + /** + * Total duration + * @type {Number} + */ + get totalTime(): number { + return this.tracks.length > 0 ? this.tracks.map((t) => t.durationMS).reduce((p, c) => p + c) : 0; + } + /** * Play stream in a voice/stage channel * @param {Track} [src] The track to play (if empty, uses first track from the queue) diff --git a/src/types/types.ts b/src/types/types.ts index 2b68592..f999fb2 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -337,11 +337,13 @@ export interface PlayOptions { /** * @typedef {object} SearchOptions * @property {UserResolvable} requestedBy The user who requested this search - * @property {QueryType} searchEngine The query search engine + * @property {QueryType} [searchEngine=QueryType.AUTO] The query search engine + * @property {boolean} [blockExtractor=false] If it should block custom extractors */ export interface SearchOptions { requestedBy: UserResolvable; searchEngine?: QueryType; + blockExtractor?: boolean; } /** diff --git a/yarn.lock b/yarn.lock index 75438dd..25a2712 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2003,10 +2003,10 @@ discord.js-docgen@discordjs/docgen#ts-patch: tsubaki "^1.3.2" yargs "^14.0.0" -discord.js@^13.0.0-dev.c850ae10270076c4b2e10b130dd8f88eed4ed201: - version "13.0.0-dev.c850ae10270076c4b2e10b130dd8f88eed4ed201" - resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0-dev.c850ae10270076c4b2e10b130dd8f88eed4ed201.tgz#8790b4f48ed36106ea08d2dc3148ee51ef321497" - integrity sha512-yp/s0AxcTNtvt9zcZv3kb0szLTFN2rqCoz4hclRE7C3umD7kgvcbF4O+k3RJ1ef6CAlrsZxvept/zYGqIn/dTA== +discord.js@^13.0.0-dev.6d3d00b44577a70e840f0187d6894043677c5329: + version "13.0.0-dev.6d3d00b44577a70e840f0187d6894043677c5329" + resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0-dev.6d3d00b44577a70e840f0187d6894043677c5329.tgz#7593fc7d86651f65c4e1f6a67802b7b72c532695" + integrity sha512-K2jlMXX4cB8+/6CYh/QywULgUcMSJcR6CycEGnONeCskrejtArCUmiV8dKu20ABv3CeHWgTVN261BQWRTTelRg== dependencies: "@discordjs/collection" "^0.1.6" "@discordjs/form-data" "^3.0.1" From 6db3cdb7b2bc9b69a807e7ca37b90e6c259bae3f Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Thu, 24 Jun 2021 11:09:34 +0545 Subject: [PATCH 143/215] handle destroyed --- src/Structures/Queue.ts | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 8b6ee5d..f513b17 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -23,7 +23,7 @@ class Queue { public _cooldownsTimeout = new Collection(); private _activeFilters: any[] = []; // eslint-disable-line @typescript-eslint/no-explicit-any private _filtersUpdate = false; - public destroyed = false; + #destroyed = false; /** * Queue constructor @@ -52,12 +52,6 @@ class Queue { */ this.options = {}; - /** - * If this queue is destroyed - * @type {boolean} - * @name Queue#destroyed - */ - /** * Queue repeat mode * @type {QueueRepeatMode} @@ -112,6 +106,14 @@ class Queue { return this.connection.audioResource?.metadata ?? this.tracks[0]; } + /** + * If this queue is destroyed + * @type {boolean} + */ + get destroyed() { + return this.#destroyed; + } + /** * Returns current track * @returns {Track} @@ -182,11 +184,12 @@ class Queue { * @returns {void} */ destroy(disconnect = this.options.leaveOnStop) { + this.#watchDestroyed(); this.connection.end(); if (disconnect) this.connection.disconnect(); this.player.queues.delete(this.guild.id); this.player.voiceUtils.cache.delete(this.guild.id); - this.destroyed = true; + this.#destroyed = true; } /** @@ -408,6 +411,7 @@ class Queue { * @returns {void} */ stop() { + this.#watchDestroyed(); return this.destroy(); } @@ -416,6 +420,7 @@ class Queue { * @returns {boolean} */ shuffle() { + this.#watchDestroyed(); if (!this.tracks.length || this.tracks.length < 3) return false; const currentTrack = this.tracks.shift(); @@ -435,6 +440,7 @@ class Queue { * @returns {Track} */ remove(track: Track | number) { + this.#watchDestroyed(); let trackFound: Track = null; if (typeof track === "number") { trackFound = this.tracks[track]; @@ -457,6 +463,7 @@ class Queue { * @returns {void} */ jump(track: Track | number): void { + this.#watchDestroyed(); const foundTrack = this.remove(track); if (!foundTrack) throw new Error("Track not found"); this.tracks.splice(1, 0, foundTrack); @@ -466,9 +473,9 @@ class Queue { /** * @typedef {object} PlayerTimestamp - * @param {string} current The current progress - * @param {string} end The total time - * @param {number} progress Progress in % + * @property {string} current The current progress + * @property {string} end The total time + * @property {number} progress Progress in % */ /** @@ -477,6 +484,7 @@ class Queue { * @returns {PlayerTimestamp} */ getPlayerTimestamp(queue = false) { + this.#watchDestroyed(); const previousTracksTime = this.previousTracks.length > 0 ? this.previousTracks.reduce((p, c) => p + c.durationMS, 0) : 0; const currentStreamTime = queue ? previousTracksTime + this.streamTime : this.streamTime; const totalTracksTime = this.totalTime; @@ -498,6 +506,7 @@ class Queue { * @returns {string} */ createProgressBar(options: PlayerProgressbarOptions = { timecodes: true, queue: false }) { + this.#watchDestroyed(); const previousTracksTime = this.previousTracks.length > 0 ? this.previousTracks.reduce((p, c) => p + c.durationMS, 0) : 0; const currentStreamTime = options.queue ? previousTracksTime + this.streamTime : this.streamTime; const totalTracksTime = this.totalTime; @@ -532,6 +541,7 @@ class Queue { * @type {Number} */ get totalTime(): number { + this.#watchDestroyed(); return this.tracks.length > 0 ? this.tracks.map((t) => t.durationMS).reduce((p, c) => p + c) : 0; } @@ -666,7 +676,7 @@ class Queue { } #watchDestroyed() { - if (this.destroyed) throw new Error("Cannot use destroyed queue"); + if (this.#destroyed) throw new Error("Cannot use destroyed queue"); } } From f1f124195cb3c65abe25b6228d2cc2b4defc2fea Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Thu, 24 Jun 2021 11:11:50 +0545 Subject: [PATCH 144/215] example --- example/music-bot/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/music-bot/package.json b/example/music-bot/package.json index b494ecf..95580a1 100644 --- a/example/music-bot/package.json +++ b/example/music-bot/package.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@discordjs/opus": "^0.5.3", - "discord-player": "^5.0.0-dev.1d88db17117d79a26967895675c17f117e52878d", + "discord-player": "^5.0.0-dev.6db3cdb7b2bc9b69a807e7ca37b90e6c259bae3f", "discord.js": "^13.0.0-dev.c850ae10270076c4b2e10b130dd8f88eed4ed201" } } From 395f928e2e3b407f8dc7589499424646d039a275 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Thu, 24 Jun 2021 11:28:30 +0545 Subject: [PATCH 145/215] attach backup adapter creator --- src/VoiceInterface/VoiceUtils.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/VoiceInterface/VoiceUtils.ts b/src/VoiceInterface/VoiceUtils.ts index 5de378c..306acfb 100644 --- a/src/VoiceInterface/VoiceUtils.ts +++ b/src/VoiceInterface/VoiceUtils.ts @@ -1,6 +1,7 @@ import { VoiceChannel, StageChannel, Collection, Snowflake } from "discord.js"; import { DiscordGatewayAdapterCreator, entersState, joinVoiceChannel, VoiceConnection, VoiceConnectionStatus } from "@discordjs/voice"; import { StreamDispatcher } from "./BasicStreamDispatcher"; +import { VoiceAdapterCreator } from "./AdapterCreator"; class VoiceUtils { public cache: Collection; @@ -53,7 +54,7 @@ class VoiceUtils { let conn = joinVoiceChannel({ guildId: channel.guild.id, channelId: channel.id, - adapterCreator: options.adapter ?? (channel.guild as any).voiceAdapterCreator, // eslint-disable-line @typescript-eslint/no-explicit-any + adapterCreator: options.adapter ?? (channel.guild as any).voiceAdapterCreator ?? VoiceAdapterCreator(channel), // eslint-disable-line @typescript-eslint/no-explicit-any selfDeaf: Boolean(options.deaf) }); From a3dfd671e28eba7b3ce8a850ad132734de4d82dc Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Thu, 24 Jun 2021 14:33:27 +0545 Subject: [PATCH 146/215] fix example --- example/music-bot/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/music-bot/index.js b/example/music-bot/index.js index 41a6286..f8302fa 100644 --- a/example/music-bot/index.js +++ b/example/music-bot/index.js @@ -172,7 +172,7 @@ client.on("interaction", async (interaction) => { requestedBy: interaction.user, searchEngine: interaction.commandName === "soundcloud" ? QueryType.SOUNDCLOUD_SEARCH : QueryType.AUTO }) - .catch(Util.noop); + .catch(() => {}); if (!searchResult || !searchResult.tracks.length) return void interaction.followUp({ content: "No results were found!" }); const queue = await player.createQueue(interaction.guild, { From 62c16d86dd1723cf212cc9742c3228dd6baf5ac1 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Thu, 24 Jun 2021 15:02:45 +0545 Subject: [PATCH 147/215] codefactor badge --- README.md | 3 +-- docs/general/welcome.md | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 1bc1bdb..6217648 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,7 @@ Complete framework to facilitate music commands using **[discord.js](https://dis [![versionBadge](https://img.shields.io/npm/v/discord-player?style=for-the-badge)](https://npmjs.com/discord-player) [![discordBadge](https://img.shields.io/discord/558328638911545423?style=for-the-badge&color=7289da)](https://androz2091.fr/discord) [![wakatime](https://wakatime.com/badge/github/Androz2091/discord-player.svg)](https://wakatime.com/badge/github/Androz2091/discord-player) - -> V5 WIP +[![CodeFactor](https://www.codefactor.io/repository/github/androz2091/discord-player/badge/v5)](https://www.codefactor.io/repository/github/androz2091/discord-player/overview/v5) ## Installation diff --git a/docs/general/welcome.md b/docs/general/welcome.md index 1bc1bdb..6217648 100644 --- a/docs/general/welcome.md +++ b/docs/general/welcome.md @@ -5,8 +5,7 @@ Complete framework to facilitate music commands using **[discord.js](https://dis [![versionBadge](https://img.shields.io/npm/v/discord-player?style=for-the-badge)](https://npmjs.com/discord-player) [![discordBadge](https://img.shields.io/discord/558328638911545423?style=for-the-badge&color=7289da)](https://androz2091.fr/discord) [![wakatime](https://wakatime.com/badge/github/Androz2091/discord-player.svg)](https://wakatime.com/badge/github/Androz2091/discord-player) - -> V5 WIP +[![CodeFactor](https://www.codefactor.io/repository/github/androz2091/discord-player/badge/v5)](https://www.codefactor.io/repository/github/androz2091/discord-player/overview/v5) ## Installation From 1d55792f1fc1b79fbc06c8ceeb89f22fd7acb08c Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Fri, 25 Jun 2021 13:09:53 +0545 Subject: [PATCH 148/215] rename BasicStreamDispatcher --- src/Structures/Queue.ts | 3 ++- .../{BasicStreamDispatcher.ts => StreamDispatcher.ts} | 10 ++++++---- src/VoiceInterface/VoiceUtils.ts | 2 +- src/index.ts | 2 +- src/types/types.ts | 2 +- 5 files changed, 11 insertions(+), 8 deletions(-) rename src/VoiceInterface/{BasicStreamDispatcher.ts => StreamDispatcher.ts} (94%) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index f513b17..1bae87d 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -1,6 +1,6 @@ import { Collection, Guild, StageChannel, VoiceChannel } from "discord.js"; import { Player } from "../Player"; -import { StreamDispatcher } from "../VoiceInterface/BasicStreamDispatcher"; +import { StreamDispatcher } from "../VoiceInterface/StreamDispatcher"; import Track from "./Track"; import { PlayerOptions, PlayerProgressbarOptions, PlayOptions, QueueFilters, QueueRepeatMode } from "../types/types"; import ytdl from "discord-ytdl-core"; @@ -616,6 +616,7 @@ class Queue { * Private method to handle autoplay * @param {Track} track The source track to find its similar track for autoplay * @returns {Promise} + * @private */ private async _handleAutoplay(track: Track): Promise { this.#watchDestroyed(); diff --git a/src/VoiceInterface/BasicStreamDispatcher.ts b/src/VoiceInterface/StreamDispatcher.ts similarity index 94% rename from src/VoiceInterface/BasicStreamDispatcher.ts rename to src/VoiceInterface/StreamDispatcher.ts index ddcb1d7..e89619f 100644 --- a/src/VoiceInterface/BasicStreamDispatcher.ts +++ b/src/VoiceInterface/StreamDispatcher.ts @@ -18,10 +18,12 @@ import Track from "../Structures/Track"; import { Util } from "../utils/Util"; export interface VoiceEvents { - error: (error: AudioPlayerError) => any; // eslint-disable-line @typescript-eslint/no-explicit-any - debug: (message: string) => any; // eslint-disable-line @typescript-eslint/no-explicit-any - start: (resource: AudioResource) => any; // eslint-disable-line @typescript-eslint/no-explicit-any - finish: (resource: AudioResource) => any; // eslint-disable-line @typescript-eslint/no-explicit-any + /* eslint-disable @typescript-eslint/no-explicit-any */ + error: (error: AudioPlayerError) => any; + debug: (message: string) => any; + start: (resource: AudioResource) => any; + finish: (resource: AudioResource) => any; + /* eslint-enable @typescript-eslint/no-explicit-any */ } class StreamDispatcher extends EventEmitter { diff --git a/src/VoiceInterface/VoiceUtils.ts b/src/VoiceInterface/VoiceUtils.ts index 306acfb..5d34a7f 100644 --- a/src/VoiceInterface/VoiceUtils.ts +++ b/src/VoiceInterface/VoiceUtils.ts @@ -1,6 +1,6 @@ import { VoiceChannel, StageChannel, Collection, Snowflake } from "discord.js"; import { DiscordGatewayAdapterCreator, entersState, joinVoiceChannel, VoiceConnection, VoiceConnectionStatus } from "@discordjs/voice"; -import { StreamDispatcher } from "./BasicStreamDispatcher"; +import { StreamDispatcher } from "./StreamDispatcher"; import { VoiceAdapterCreator } from "./AdapterCreator"; class VoiceUtils { diff --git a/src/index.ts b/src/index.ts index 5739670..2e0de02 100644 --- a/src/index.ts +++ b/src/index.ts @@ -8,6 +8,6 @@ export { StreamUtils } from "./utils/StreamUtils"; export { Track } from "./Structures/Track"; export { Util } from "./utils/Util"; export { VoiceUtils } from "./VoiceInterface/VoiceUtils"; -export { VoiceEvents, StreamDispatcher } from "./VoiceInterface/BasicStreamDispatcher"; +export { VoiceEvents, StreamDispatcher } from "./VoiceInterface/StreamDispatcher"; export { VoiceAdapterCreator } from "./VoiceInterface/AdapterCreator"; export * from "./types/types"; diff --git a/src/types/types.ts b/src/types/types.ts index f999fb2..a041e70 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -3,7 +3,7 @@ import { Readable, Duplex } from "stream"; import { Queue } from "../Structures/Queue"; import Track from "../Structures/Track"; import { Playlist } from "../Structures/Playlist"; -import { StreamDispatcher } from "../VoiceInterface/BasicStreamDispatcher"; +import { StreamDispatcher } from "../VoiceInterface/StreamDispatcher"; import { downloadOptions } from "ytdl-core"; export type FiltersName = keyof QueueFilters; From bd4bcb93d0afc4a3ab679159dd4666208cc2851f Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Fri, 25 Jun 2021 14:30:23 +0545 Subject: [PATCH 149/215] remove StreamUtils --- .eslintrc.json | 3 ++- .vscode/settings.json | 3 +++ src/index.ts | 1 - src/utils/StreamUtils.ts | 37 ------------------------------------- 4 files changed, 5 insertions(+), 39 deletions(-) create mode 100644 .vscode/settings.json delete mode 100644 src/utils/StreamUtils.ts diff --git a/.eslintrc.json b/.eslintrc.json index 05b5e82..d752175 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -16,6 +16,7 @@ "@typescript-eslint/no-unused-vars": "error", "@typescript-eslint/no-explicit-any": "error", "@typescript-eslint/ban-ts-comment": "error", - "semi": "error" + "semi": "error", + "no-console": "error" } } \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..d995880 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "restructuredtext.languageServer.disabled": true +} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 2e0de02..2b68008 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,7 +4,6 @@ export { Playlist } from "./Structures/Playlist"; export { Player } from "./Player"; export { QueryResolver } from "./utils/QueryResolver"; export { Queue } from "./Structures/Queue"; -export { StreamUtils } from "./utils/StreamUtils"; export { Track } from "./Structures/Track"; export { Util } from "./utils/Util"; export { VoiceUtils } from "./VoiceInterface/VoiceUtils"; diff --git a/src/utils/StreamUtils.ts b/src/utils/StreamUtils.ts deleted file mode 100644 index 88b6bd2..0000000 --- a/src/utils/StreamUtils.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Duplex, Readable, PassThrough } from "stream"; - -class StreamUtils { - /** - * Stream utils - */ - constructor() { - throw new Error("Cannot instantiate static class"); - } - - /** - * Can be used to re-create used streams - * @param {Readable|Duplex} stream The used stream - * @returns {Readable} - */ - static clone(stream: Readable | Duplex): Readable { - const passed = stream.pipe(new PassThrough()); - return passed; - } - - /** - * Converts stream to buffer - * @param {Readable|Duplex} stream The stream - * @returns {Promise} - */ - static toBuffer(stream: Readable | Duplex): Promise { - return new Promise((resolve, reject) => { - const chunks: Buffer[] = []; - - stream.on("data", (chunk) => chunks.push(chunk)); - stream.on("end", () => resolve(Buffer.concat(chunks))); - stream.on("error", reject); - }); - } -} - -export { StreamUtils }; From 49902527015bc0c2ed25fe3dcf519fefe2e5cd6b Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Fri, 25 Jun 2021 14:30:49 +0545 Subject: [PATCH 150/215] remove .vscode --- .vscode/settings.json | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index d995880..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "restructuredtext.languageServer.disabled": true -} \ No newline at end of file From 574c163f5b4a5710f775fbcfbfa02b8e636809d4 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Fri, 25 Jun 2021 15:55:03 +0545 Subject: [PATCH 151/215] events --- src/Player.ts | 39 +++++++++++++------------- src/Structures/Queue.ts | 8 ++++++ src/VoiceInterface/StreamDispatcher.ts | 6 ++-- 3 files changed, 31 insertions(+), 22 deletions(-) diff --git a/src/Player.ts b/src/Player.ts index 1f1b10e..1a718eb 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -69,28 +69,29 @@ class Player extends EventEmitter { const queue = this.getQueue(oldState.guild.id); if (!queue) return; + // @todo // update channel - if (oldState.channelID && newState.channelID && oldState.channelID !== newState.channelID) { - queue.connection.channel = newState.channel; - } + // if (oldState.channelID && newState.channelID && oldState.channelID !== newState.channelID) { + // queue.connection.channel = newState.channel; + // } - if (!oldState.channelID && newState.channelID && newState.member.id === newState.guild.me.id) { - if (newState.serverMute || !newState.serverMute) { - queue.setPaused(newState.serverMute); - } else if (newState.suppress || !newState.suppress) { - if (newState.suppress) newState.guild.me.voice.setRequestToSpeak(true).catch(Util.noop); - queue.setPaused(newState.suppress); - } - } + // if (!oldState.channelID && newState.channelID && newState.member.id === newState.guild.me.id) { + // if (newState.serverMute || !newState.serverMute) { + // queue.setPaused(newState.serverMute); + // } else if (newState.suppress || !newState.suppress) { + // if (newState.suppress) newState.guild.me.voice.setRequestToSpeak(true).catch(Util.noop); + // queue.setPaused(newState.suppress); + // } + // } - if (oldState.channelID === newState.channelID && oldState.member.id === newState.guild.me.id) { - if (oldState.serverMute !== newState.serverMute) { - queue.setPaused(newState.serverMute); - } else if (oldState.suppress !== newState.suppress) { - if (newState.suppress) newState.guild.me.voice.setRequestToSpeak(true).catch(Util.noop); - queue.setPaused(newState.suppress); - } - } + // if (oldState.channelID === newState.channelID && oldState.member.id === newState.guild.me.id) { + // if (oldState.serverMute !== newState.serverMute) { + // queue.setPaused(newState.serverMute); + // } else if (oldState.suppress !== newState.suppress) { + // if (newState.suppress) newState.guild.me.voice.setRequestToSpeak(true).catch(Util.noop); + // queue.setPaused(newState.suppress); + // } + // } if (oldState.member.id === this.client.user.id && !newState.channelID) { queue.destroy(); diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 1bae87d..7e356d4 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -288,6 +288,14 @@ class Queue { this.setVolume(amount); } + /** + * Mutes the playback + * @returns {void} + */ + mute() { + this.volume = 0; + } + /** * The stream time of this queue * @type {number} diff --git a/src/VoiceInterface/StreamDispatcher.ts b/src/VoiceInterface/StreamDispatcher.ts index e89619f..311d40a 100644 --- a/src/VoiceInterface/StreamDispatcher.ts +++ b/src/VoiceInterface/StreamDispatcher.ts @@ -96,13 +96,13 @@ class StreamDispatcher extends EventEmitter { }); this.audioPlayer.on("stateChange", (oldState, newState) => { - if (newState.status === AudioPlayerStatus.Idle && oldState.status !== AudioPlayerStatus.Idle) { + if (newState.status === AudioPlayerStatus.Playing) { + if (!this.paused) return void this.emit("start", this.audioResource); + } else if (newState.status === AudioPlayerStatus.Idle && oldState.status !== AudioPlayerStatus.Idle) { if (!this.paused) { void this.emit("finish", this.audioResource); this.audioResource = null; } - } else if (newState.status === AudioPlayerStatus.Playing) { - if (!this.paused) void this.emit("start", this.audioResource); } }); From 2423ba72e1aaa7334147134dfeb3a311b03cfa90 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sat, 26 Jun 2021 00:53:34 +0545 Subject: [PATCH 152/215] Voice state handling --- src/Player.ts | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/src/Player.ts b/src/Player.ts index 1a718eb..de7b484 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -69,29 +69,27 @@ class Player extends EventEmitter { const queue = this.getQueue(oldState.guild.id); if (!queue) return; - // @todo - // update channel - // if (oldState.channelID && newState.channelID && oldState.channelID !== newState.channelID) { - // queue.connection.channel = newState.channel; - // } + if (oldState.channelID && newState.channelID && oldState.channelID !== newState.channelID) { + queue.connection.channel = newState.channel; + } - // if (!oldState.channelID && newState.channelID && newState.member.id === newState.guild.me.id) { - // if (newState.serverMute || !newState.serverMute) { - // queue.setPaused(newState.serverMute); - // } else if (newState.suppress || !newState.suppress) { - // if (newState.suppress) newState.guild.me.voice.setRequestToSpeak(true).catch(Util.noop); - // queue.setPaused(newState.suppress); - // } - // } + if (!oldState.channelID && newState.channelID && newState.member.id === newState.guild.me.id) { + if (newState.serverMute || !newState.serverMute) { + queue.setPaused(newState.serverMute); + } else if (newState.suppress || !newState.suppress) { + if (newState.suppress) newState.guild.me.voice.setRequestToSpeak(true).catch(Util.noop); + queue.setPaused(newState.suppress); + } + } - // if (oldState.channelID === newState.channelID && oldState.member.id === newState.guild.me.id) { - // if (oldState.serverMute !== newState.serverMute) { - // queue.setPaused(newState.serverMute); - // } else if (oldState.suppress !== newState.suppress) { - // if (newState.suppress) newState.guild.me.voice.setRequestToSpeak(true).catch(Util.noop); - // queue.setPaused(newState.suppress); - // } - // } + if (oldState.channelID === newState.channelID && oldState.member.id === newState.guild.me.id) { + if (oldState.serverMute !== newState.serverMute) { + queue.setPaused(newState.serverMute); + } else if (oldState.suppress !== newState.suppress) { + if (newState.suppress) newState.guild.me.voice.setRequestToSpeak(true).catch(Util.noop); + queue.setPaused(newState.suppress); + } + } if (oldState.member.id === this.client.user.id && !newState.channelID) { queue.destroy(); From 7afee914f3116a3271a0949ec255f96a93fad636 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sat, 26 Jun 2021 00:59:07 +0545 Subject: [PATCH 153/215] track id --- src/Structures/Queue.ts | 22 +++++++++++++++------- src/Structures/Track.ts | 5 +++-- src/types/types.ts | 1 + 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 7e356d4..64ae509 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -1,4 +1,4 @@ -import { Collection, Guild, StageChannel, VoiceChannel } from "discord.js"; +import { Collection, Guild, StageChannel, VoiceChannel, Snowflake, SnowflakeUtil } from "discord.js"; import { Player } from "../Player"; import { StreamDispatcher } from "../VoiceInterface/StreamDispatcher"; import Track from "./Track"; @@ -19,6 +19,7 @@ class Queue { public playing = false; public metadata?: T = null; public repeatMode: QueueRepeatMode = 0; + public readonly id: Snowflake = SnowflakeUtil.generate(); private _streamTime = 0; public _cooldownsTimeout = new Collection(); private _activeFilters: any[] = []; // eslint-disable-line @typescript-eslint/no-explicit-any @@ -82,6 +83,12 @@ class Queue { * @name Queue#connection */ + /** + * The ID of this queue + * @type {Snowflake} + * @name Queue#id + */ + Object.assign( this.options, { @@ -444,21 +451,21 @@ class Queue { /** * Removes a track from the queue - * @param {Track|number} track The track to remove + * @param {Track|Snowflake|number} track The track to remove * @returns {Track} */ - remove(track: Track | number) { + remove(track: Track | Snowflake | number) { this.#watchDestroyed(); let trackFound: Track = null; if (typeof track === "number") { trackFound = this.tracks[track]; if (trackFound) { - this.tracks = this.tracks.filter((t) => t._trackID !== trackFound._trackID); + this.tracks = this.tracks.filter((t) => t.id !== trackFound.id); } } else { - trackFound = this.tracks.find((s) => s._trackID === track._trackID); + trackFound = this.tracks.find((s) => s.id === (track instanceof Track ? track.id : track)); if (trackFound) { - this.tracks = this.tracks.filter((s) => s._trackID !== trackFound._trackID); + this.tracks = this.tracks.filter((s) => s.id !== trackFound.id); } } @@ -567,7 +574,7 @@ class Queue { if (!track) return; if (!options.filtersUpdate) { - this.previousTracks = this.previousTracks.filter((x) => x._trackID !== track._trackID); + this.previousTracks = this.previousTracks.filter((x) => x.id !== track.id); this.previousTracks.push(track); } @@ -667,6 +674,7 @@ class Queue { toJSON() { this.#watchDestroyed(); return { + id: this.id, guild: this.guild.id, voiceChannel: this.connection?.channel?.id, options: this.options, diff --git a/src/Structures/Track.ts b/src/Structures/Track.ts index e42947f..a026ce3 100644 --- a/src/Structures/Track.ts +++ b/src/Structures/Track.ts @@ -1,4 +1,4 @@ -import { User, Util } from "discord.js"; +import { User, Util, SnowflakeUtil, Snowflake } from "discord.js"; import { Player } from "../Player"; import { RawTrackData, TrackJSON } from "../types/types"; import { Playlist } from "./Playlist"; @@ -16,7 +16,7 @@ class Track { public requestedBy!: User; public playlist?: Playlist; public readonly raw: RawTrackData = {} as RawTrackData; - public readonly _trackID = Date.now(); + public readonly id: Snowflake = SnowflakeUtil.generate(); /** * Track constructor @@ -164,6 +164,7 @@ class Track { */ toJSON(hidePlaylist?: boolean) { return { + id: this.id, title: this.title, description: this.description, author: this.author, diff --git a/src/types/types.ts b/src/types/types.ts index a041e70..f37a494 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -406,6 +406,7 @@ export interface PlaylistInitData { * @property {PlaylistJSON} [playlist] The playlist info (if any) */ export interface TrackJSON { + id: Snowflake; title: string; description: string; author: string; From efe3a051f15f248019505d47befe5df3913b743f Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sat, 26 Jun 2021 01:05:29 +0545 Subject: [PATCH 154/215] fix Track#id JSDOC --- src/Structures/Track.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Structures/Track.ts b/src/Structures/Track.ts index a026ce3..456de2b 100644 --- a/src/Structures/Track.ts +++ b/src/Structures/Track.ts @@ -94,8 +94,8 @@ class Track { /** * The track id - * @name Track#_trackID - * @type {number} + * @name Track#id + * @type {Snowflake} * @readonly */ From 4ec0d7e3b88bbfca3de802f1c9fe6c33a73f46c1 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sat, 26 Jun 2021 12:14:49 +0545 Subject: [PATCH 155/215] chore(deps): bump dependencies --- package.json | 4 ++-- yarn.lock | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 099f711..f92e8e6 100644 --- a/package.json +++ b/package.json @@ -58,8 +58,8 @@ "soundcloud-scraper": "^5.0.0", "spotify-url-info": "^2.2.3", "tiny-typed-emitter": "^2.0.3", - "youtube-sr": "^4.1.4", - "ytdl-core": "^4.8.2" + "youtube-sr": "^4.1.5", + "ytdl-core": "^4.8.3" }, "devDependencies": { "@babel/cli": "^7.14.5", diff --git a/yarn.lock b/yarn.lock index 25a2712..2f7397b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4900,17 +4900,17 @@ yn@3.1.1: resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== -youtube-sr@^4.1.4: +youtube-sr@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/youtube-sr/-/youtube-sr-4.1.5.tgz#f35627574a47b6d5b39dec792e8bb00f93e04809" integrity sha512-yLTtjy8ougH6ReCEsCRN9mxgS+rcm44421pYxown3QR9bUivNjxkYwB1+OfW+Z9V9hBE/chp9y7SBpK63vrk7g== dependencies: node-fetch "^2.6.1" -ytdl-core@^4.8.2: - version "4.8.2" - resolved "https://registry.yarnpkg.com/ytdl-core/-/ytdl-core-4.8.2.tgz#f034ad942c5d958f5987fc8ff0b0639664ae2fb7" - integrity sha512-O3n++YcgZawaXJwbPmnRDgfN6b4kU0DpNdkI9Na5yM3JAdfJmoq5UHc8v9Xjgjr1RilQUUh7mhDnRRPDtKr0Kg== +ytdl-core@^4.8.3: + version "4.8.3" + resolved "https://registry.yarnpkg.com/ytdl-core/-/ytdl-core-4.8.3.tgz#21570d1834db13dec7828cf87bbf4c83c0fe68d7" + integrity sha512-cWCBeX4FCgjcKmuVK384MT582RIAakpUSeMF/NPVmhO8cWiG+LeQLnBordvLolb0iXYzfUvalgmycYAE5Sy6Xw== dependencies: m3u8stream "^0.8.3" miniget "^4.0.0" From ae53248299e03df0e678d7946010bc7e49a0bf47 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Sat, 26 Jun 2021 12:25:24 +0545 Subject: [PATCH 156/215] feat(Queue): mute/unmute --- src/Structures/Queue.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 64ae509..ffe2987 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -24,6 +24,7 @@ class Queue { public _cooldownsTimeout = new Collection(); private _activeFilters: any[] = []; // eslint-disable-line @typescript-eslint/no-explicit-any private _filtersUpdate = false; + #lastVolume = 0; #destroyed = false; /** @@ -265,6 +266,7 @@ class Queue { setVolume(amount: number) { this.#watchDestroyed(); if (!this.connection) return false; + this.#lastVolume = amount; this.options.initialVolume = amount; return this.connection.setVolume(amount); } @@ -300,7 +302,17 @@ class Queue { * @returns {void} */ mute() { + const lv = this.#lastVolume; this.volume = 0; + this.#lastVolume = lv; + } + + /** + * Unmutes the playback. If the last volume was set to 0, unmute will produce no effect. + * @returns {void} + */ + unmute() { + this.volume = this.#lastVolume; } /** @@ -623,7 +635,7 @@ class Queue { this._filtersUpdate = options.filtersUpdate; this.connection.playStream(resource).then(() => { - this.connection.setVolume(this.options.initialVolume); + this.setVolume(this.options.initialVolume); }); } From 67648af97b3664fc44774bb930c83eb9c49ed93d Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Wed, 30 Jun 2021 01:14:44 +0545 Subject: [PATCH 157/215] feat(Queue): queue#insert method --- src/Player.ts | 2 +- src/Structures/Queue.ts | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Player.ts b/src/Player.ts index cb5b610..de7b484 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -492,4 +492,4 @@ class Player extends EventEmitter { } } -export { Player }; \ No newline at end of file +export { Player }; diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index ffe2987..835b3ce 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -498,6 +498,20 @@ class Queue { return void this.skip(); } + /** + * Inserts the given track to specified index + * @param {Track} track The track to insert + * @param {number} [index=0] The index where this track should be + */ + insert(track: Track, index = 0) { + if (!track || !(track instanceof Track)) throw new TypeError("track must be the instance of Track"); + if (typeof index !== "number" || index < 0 || !Number.isFinite(index)) throw new Error(`Invalid index "${index}"`); + + this.tracks.splice(index, 0, track); + + this.player.emit("trackAdd", this, track); + } + /** * @typedef {object} PlayerTimestamp * @property {string} current The current progress From e48f1ab30b0b707f78da618502b2201927802c0a Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Wed, 30 Jun 2021 10:12:01 +0545 Subject: [PATCH 158/215] chore(deps): Bump dependencies --- example/music-bot/index.js | 8 +++--- example/music-bot/package.json | 4 +-- package.json | 6 ++--- yarn.lock | 46 +++++++++++++++++++++------------- 4 files changed, 37 insertions(+), 27 deletions(-) diff --git a/example/music-bot/index.js b/example/music-bot/index.js index f8302fa..885a806 100644 --- a/example/music-bot/index.js +++ b/example/music-bot/index.js @@ -58,7 +58,7 @@ client.on("message", async (message) => { options: [ { name: "query", - type: "STRING", + type: "String", description: "The song you want to play", required: true } @@ -70,7 +70,7 @@ client.on("message", async (message) => { options: [ { name: "query", - type: "STRING", + type: "String", description: "The song you want to play", required: true } @@ -82,7 +82,7 @@ client.on("message", async (message) => { options: [ { name: "amount", - type: "INTEGER", + type: "Integer", description: "The volume amount to set (0-100)", required: false } @@ -94,7 +94,7 @@ client.on("message", async (message) => { options: [ { name: "mode", - type: "INTEGER", + type: "Integer", description: "Loop type", required: true, choices: [ diff --git a/example/music-bot/package.json b/example/music-bot/package.json index 95580a1..c84b424 100644 --- a/example/music-bot/package.json +++ b/example/music-bot/package.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@discordjs/opus": "^0.5.3", - "discord-player": "^5.0.0-dev.6db3cdb7b2bc9b69a807e7ca37b90e6c259bae3f", - "discord.js": "^13.0.0-dev.c850ae10270076c4b2e10b130dd8f88eed4ed201" + "discord-player": "^5.0.0-dev.29489940b64b555e2e791dcf0662bd2d93a22ef6", + "discord.js": "^13.0.0-dev.5842e35.1625011425" } } diff --git a/package.json b/package.json index 961c580..1e176ea 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ }, "homepage": "https://discord-player.js.org", "dependencies": { - "@discordjs/voice": "^0.5.0", + "@discordjs/voice": "^0.5.1", "discord-ytdl-core": "^5.0.4", "libsodium-wrappers": "^0.7.9", "soundcloud-scraper": "^5.0.0", @@ -73,7 +73,7 @@ "@typescript-eslint/eslint-plugin": "^4.28.0", "@typescript-eslint/parser": "^4.28.0", "discord-api-types": "^0.18.1", - "discord.js": "^13.0.0-dev.6d3d00b44577a70e840f0187d6894043677c5329", + "discord.js": "^13.0.0-dev.5842e35.1625011425", "discord.js-docgen": "discordjs/docgen#ts-patch", "eslint": "^7.29.0", "jsdoc-babel": "^0.5.0", @@ -82,4 +82,4 @@ "ts-node": "^10.0.0", "typescript": "^4.3.4" } -} \ No newline at end of file +} diff --git a/yarn.lock b/yarn.lock index 2f7397b..9d4e2c7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -963,10 +963,10 @@ "@discordjs/node-pre-gyp" "^0.4.0" node-addon-api "^3.2.1" -"@discordjs/voice@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@discordjs/voice/-/voice-0.5.0.tgz#238d6f8c1dc7e30ff781edb08fb0540bca5aa23d" - integrity sha512-YPfY8ium1lExmRETz+vC4d3gGvHhGvWQMWLTOkNBoUkN6VyEpO/RVrL5EI+0qUefKAWwv2Gus/c7QM1xhAUwow== +"@discordjs/voice@^0.5.1": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@discordjs/voice/-/voice-0.5.1.tgz#265b05712196bbbb5b082b073807ef4582f067c7" + integrity sha512-51NrtmfkGe6xJVMULjxXdQ9apPsqNyV1vZ/Qa57x6qM3TzWWQNyMfrLkjD+YvQtesZZpKZcQZI8NIknWUYiBNQ== dependencies: "@types/ws" "^7.4.4" discord-api-types "^0.18.1" @@ -1027,10 +1027,10 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@sapphire/async-queue@^1.1.2": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.1.3.tgz#fbc70f2687a2473bd824a4723e962dfce933eba7" - integrity sha512-pyV+0njfBq6rHKEOpux5xy2cEM5u9KFjVzpmKsgk/8mdslLCuNXX4QvxWsSerLq/EtLhkvvl998cdFbGtpHa9Q== +"@sapphire/async-queue@^1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.1.4.tgz#ae431310917a8880961cebe8e59df6ffa40f2957" + integrity sha512-fFrlF/uWpGOX5djw5Mu2Hnnrunao75WGey0sP0J3jnhmrJ5TAPzHYOmytD5iN/+pMxS+f+u/gezqHa9tPhRHEA== "@tootallnate/once@1": version "1.1.2" @@ -1067,7 +1067,7 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-15.12.4.tgz#e1cf817d70a1e118e81922c4ff6683ce9d422e26" integrity sha512-zrNj1+yqYF4WskCMOHwN+w9iuD12+dGm0rQ35HLl9/Ouuq52cEtd0CH9qMgrdNmi5ejC1/V7vKEXYubB+65DkA== -"@types/ws@^7.4.4": +"@types/ws@^7.4.4", "@types/ws@^7.4.5": version "7.4.5" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.5.tgz#8ff0f7efcd8fea19f51f9dd66cb8b498d172a752" integrity sha512-8mbDgtc8xpxDDem5Gwj76stBDJX35KQ3YBoayxlqUQcL5BZUthiqP/VQ4PQnLHqM4PmlbyO74t98eJpURO+gPA== @@ -1986,6 +1986,11 @@ discord-api-types@^0.18.1: resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.18.1.tgz#5d08ed1263236be9c21a22065d0e6b51f790f492" integrity sha512-hNC38R9ZF4uaujaZQtQfm5CdQO58uhdkoHQAVvMfIL0LgOSZeW575W8H6upngQOuoxWd8tiRII3LLJm9zuQKYg== +discord-api-types@^0.19.0-next.f393ba520d7d6d2aacaca7b3ca5d355fab614f6e: + version "0.19.0-next.f393ba520d7d6d2aacaca7b3ca5d355fab614f6e" + resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.19.0-next.f393ba520d7d6d2aacaca7b3ca5d355fab614f6e.tgz#d5f36f5712ec8fe2fe928b5c37618c94a3969d6a" + integrity sha512-ttRA/8e/WKHDbGFfED5WlS7gID+kalmNr6iMiWBCvkphQ7kFHiTOVbnj/zX9ksaRaYXp/I38SCQ+qZvLu8DJZg== + discord-ytdl-core@^5.0.4: version "5.0.4" resolved "https://registry.yarnpkg.com/discord-ytdl-core/-/discord-ytdl-core-5.0.4.tgz#84a2af1a8e8c235b4fc109b23350d12782ab66cd" @@ -2003,19 +2008,19 @@ discord.js-docgen@discordjs/docgen#ts-patch: tsubaki "^1.3.2" yargs "^14.0.0" -discord.js@^13.0.0-dev.6d3d00b44577a70e840f0187d6894043677c5329: - version "13.0.0-dev.6d3d00b44577a70e840f0187d6894043677c5329" - resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0-dev.6d3d00b44577a70e840f0187d6894043677c5329.tgz#7593fc7d86651f65c4e1f6a67802b7b72c532695" - integrity sha512-K2jlMXX4cB8+/6CYh/QywULgUcMSJcR6CycEGnONeCskrejtArCUmiV8dKu20ABv3CeHWgTVN261BQWRTTelRg== +discord.js@^13.0.0-dev.5842e35.1625011425: + version "13.0.0-dev.5842e35.1625011425" + resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0-dev.5842e35.1625011425.tgz#aa9dff8bac393dafbcd4a29132b53931c2297a84" + integrity sha512-68yUruYVN3mYKVMNfAfQp6RDl+zcgNSHS82S83HExWwdzTRSd4lnO3MJrk1Oc+Eoy4UNVE1LoCXkOUN64MitSA== dependencies: "@discordjs/collection" "^0.1.6" "@discordjs/form-data" "^3.0.1" - "@sapphire/async-queue" "^1.1.2" - "@types/ws" "^7.4.4" + "@sapphire/async-queue" "^1.1.4" + "@types/ws" "^7.4.5" abort-controller "^3.0.0" - discord-api-types "^0.18.1" + discord-api-types "^0.19.0-next.f393ba520d7d6d2aacaca7b3ca5d355fab614f6e" node-fetch "^2.6.1" - ws "^7.4.6" + ws "^7.5.0" dmd@^4.0.5: version "4.0.6" @@ -4840,11 +4845,16 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -ws@^7.4.4, ws@^7.4.5, ws@^7.4.6: +ws@^7.4.4, ws@^7.4.5: version "7.5.0" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.0.tgz#0033bafea031fb9df041b2026fc72a571ca44691" integrity sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw== +ws@^7.5.0: + version "7.5.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.1.tgz#44fc000d87edb1d9c53e51fbc69a0ac1f6871d66" + integrity sha512-2c6faOUH/nhoQN6abwMloF7Iyl0ZS2E9HGtsiLrWn0zOOMWlhtDmdf/uihDt6jnuCxgtwGBNy6Onsoy2s2O2Ow== + xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" From 211b3a63dd54dd71a13c1d722d35248f8f1244b2 Mon Sep 17 00:00:00 2001 From: Snowflake107 Date: Wed, 30 Jun 2021 11:37:16 +0545 Subject: [PATCH 159/215] deps --- example/music-bot/index.js | 8 ++++---- package.json | 2 +- tsconfig.json | 3 ++- yarn.lock | 20 ++++++++++---------- 4 files changed, 17 insertions(+), 16 deletions(-) diff --git a/example/music-bot/index.js b/example/music-bot/index.js index 885a806..f8302fa 100644 --- a/example/music-bot/index.js +++ b/example/music-bot/index.js @@ -58,7 +58,7 @@ client.on("message", async (message) => { options: [ { name: "query", - type: "String", + type: "STRING", description: "The song you want to play", required: true } @@ -70,7 +70,7 @@ client.on("message", async (message) => { options: [ { name: "query", - type: "String", + type: "STRING", description: "The song you want to play", required: true } @@ -82,7 +82,7 @@ client.on("message", async (message) => { options: [ { name: "amount", - type: "Integer", + type: "INTEGER", description: "The volume amount to set (0-100)", required: false } @@ -94,7 +94,7 @@ client.on("message", async (message) => { options: [ { name: "mode", - type: "Integer", + type: "INTEGER", description: "Loop type", required: true, choices: [ diff --git a/package.json b/package.json index 1e176ea..7b2daa8 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "soundcloud-scraper": "^5.0.0", "spotify-url-info": "^2.2.3", "tiny-typed-emitter": "^2.0.3", - "youtube-sr": "^4.1.5", + "youtube-sr": "^4.1.6", "ytdl-core": "^4.8.3" }, "devDependencies": { diff --git a/tsconfig.json b/tsconfig.json index 629bcf8..cab97f8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,7 +6,8 @@ "outDir": "./lib", "strict": true, "strictNullChecks": false, - "esModuleInterop": true + "esModuleInterop": true, + "pretty": true }, "include": [ "src/**/*" diff --git a/yarn.lock b/yarn.lock index 9d4e2c7..dc20d35 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4845,16 +4845,16 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -ws@^7.4.4, ws@^7.4.5: - version "7.5.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.0.tgz#0033bafea031fb9df041b2026fc72a571ca44691" - integrity sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw== - -ws@^7.5.0: +ws@^7.4.4, ws@^7.5.0: version "7.5.1" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.1.tgz#44fc000d87edb1d9c53e51fbc69a0ac1f6871d66" integrity sha512-2c6faOUH/nhoQN6abwMloF7Iyl0ZS2E9HGtsiLrWn0zOOMWlhtDmdf/uihDt6jnuCxgtwGBNy6Onsoy2s2O2Ow== +ws@^7.4.5: + version "7.5.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.0.tgz#0033bafea031fb9df041b2026fc72a571ca44691" + integrity sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw== + xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" @@ -4910,10 +4910,10 @@ yn@3.1.1: resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== -youtube-sr@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/youtube-sr/-/youtube-sr-4.1.5.tgz#f35627574a47b6d5b39dec792e8bb00f93e04809" - integrity sha512-yLTtjy8ougH6ReCEsCRN9mxgS+rcm44421pYxown3QR9bUivNjxkYwB1+OfW+Z9V9hBE/chp9y7SBpK63vrk7g== +youtube-sr@^4.1.6: + version "4.1.6" + resolved "https://registry.yarnpkg.com/youtube-sr/-/youtube-sr-4.1.6.tgz#0cbc3e5c4d6d5931330914aa84558b2c09980734" + integrity sha512-W/Qh7niooX7aMUaM9jp7NDNHuX764mAaoOH34V9q5E7v1RrHig+vd2rfAplfQILPPIs/blO3gG82D4/l/lbegg== dependencies: node-fetch "^2.6.1" From 4d838fa60cccfb0f539b9f3abc1364fee7a817be Mon Sep 17 00:00:00 2001 From: Snowflake107 <46562212+Snowflake107@users.noreply.github.com> Date: Sat, 3 Jul 2021 14:28:38 +0545 Subject: [PATCH 160/215] bump dependencies --- package.json | 22 ++-- yarn.lock | 352 +++++++++++++++++++++++++++------------------------ 2 files changed, 196 insertions(+), 178 deletions(-) diff --git a/package.json b/package.json index 7b2daa8..b69ab0b 100644 --- a/package.json +++ b/package.json @@ -63,23 +63,23 @@ }, "devDependencies": { "@babel/cli": "^7.14.5", - "@babel/core": "^7.14.5", - "@babel/preset-env": "^7.14.5", + "@babel/core": "^7.14.6", + "@babel/preset-env": "^7.14.7", "@babel/preset-typescript": "^7.14.5", + "@devsnowflake/docgen": "devsnowflake/docgen#ts-patch", "@discord-player/extractor": "^3.0.2", "@discordjs/opus": "^0.5.3", - "@types/node": "^15.12.2", - "@types/ws": "^7.4.4", - "@typescript-eslint/eslint-plugin": "^4.28.0", - "@typescript-eslint/parser": "^4.28.0", + "@types/node": "^16.0.0", + "@types/ws": "^7.4.6", + "@typescript-eslint/eslint-plugin": "^4.28.1", + "@typescript-eslint/parser": "^4.28.1", "discord-api-types": "^0.18.1", - "discord.js": "^13.0.0-dev.5842e35.1625011425", - "discord.js-docgen": "discordjs/docgen#ts-patch", - "eslint": "^7.29.0", + "discord.js": "^13.0.0-dev.3a718d8.1625270632", + "eslint": "^7.30.0", "jsdoc-babel": "^0.5.0", - "prettier": "^2.3.1", + "prettier": "^2.3.2", "rimraf": "^3.0.2", "ts-node": "^10.0.0", - "typescript": "^4.3.4" + "typescript": "^4.3.5" } } diff --git a/yarn.lock b/yarn.lock index dc20d35..09be7df 100644 --- a/yarn.lock +++ b/yarn.lock @@ -32,12 +32,12 @@ dependencies: "@babel/highlight" "^7.14.5" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.5.tgz#8ef4c18e58e801c5c95d3c1c0f2874a2680fadea" - integrity sha512-kixrYn4JwfAVPa0f2yfzc2AWti6WRRyO3XjWW5PJAvtE11qhSayrrcrEnee05KAtNaPC+EwehE8Qt1UedEVB8w== +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.5", "@babel/compat-data@^7.14.7": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.7.tgz#7b047d7a3a89a67d2258dc61f604f098f1bc7e08" + integrity sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw== -"@babel/core@^7.14.5": +"@babel/core@^7.14.6": version "7.14.6" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.6.tgz#e0814ec1a950032ff16c13a2721de39a8416fcab" integrity sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA== @@ -157,9 +157,9 @@ "@babel/types" "^7.14.5" "@babel/helper-member-expression-to-functions@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.5.tgz#d5c70e4ad13b402c95156c7a53568f504e2fb7b8" - integrity sha512-UxUeEYPrqH1Q/k0yRku1JE7dyfyehNwT6SVkMHvYvPDv4+uu627VXBckVj891BO8ruKBkiDoGnZf4qPDD8abDQ== + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz#97e56244beb94211fe277bd818e3a329c66f7970" + integrity sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA== dependencies: "@babel/types" "^7.14.5" @@ -274,10 +274,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.14.5", "@babel/parser@^7.14.6", "@babel/parser@^7.9.4": - version "7.14.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.6.tgz#d85cc68ca3cac84eae384c06f032921f5227f4b2" - integrity sha512-oG0ej7efjEXxb4UgE+klVx+3j4MVo+A2vCzm7OUN4CLo6WhQ+vSOD2yJ8m7B+DghObxtLxt3EfgMWpq+AsWehQ== +"@babel/parser@^7.14.5", "@babel/parser@^7.14.6", "@babel/parser@^7.14.7", "@babel/parser@^7.9.4": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.7.tgz#6099720c8839ca865a2637e6c85852ead0bdb595" + integrity sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA== "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.14.5": version "7.14.5" @@ -288,10 +288,10 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" "@babel/plugin-proposal-optional-chaining" "^7.14.5" -"@babel/plugin-proposal-async-generator-functions@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.5.tgz#4024990e3dd74181f4f426ea657769ff49a2df39" - integrity sha512-tbD/CG3l43FIXxmu4a7RBe4zH7MLJ+S/lFowPFO7HetS2hyOZ/0nnnznegDuzFzfkyQYTxqdTH/hKmuBngaDAA== +"@babel/plugin-proposal-async-generator-functions@^7.14.7": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz#784a48c3d8ed073f65adcf30b57bcbf6c8119ace" + integrity sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-remap-async-to-generator" "^7.14.5" @@ -362,12 +362,12 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.5.tgz#e581d5ccdfa187ea6ed73f56c6a21c1580b90fbf" - integrity sha512-VzMyY6PWNPPT3pxc5hi9LloKNr4SSrVCg7Yr6aZpW4Ym07r7KqSU/QXYwjXLVxqwSv0t/XSXkFoKBPUkZ8vb2A== +"@babel/plugin-proposal-object-rest-spread@^7.14.7": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz#5920a2b3df7f7901df0205974c0641b13fd9d363" + integrity sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g== dependencies: - "@babel/compat-data" "^7.14.5" + "@babel/compat-data" "^7.14.7" "@babel/helper-compilation-targets" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" @@ -571,10 +571,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-destructuring@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.5.tgz#d32ad19ff1a6da1e861dc62720d80d9776e3bf35" - integrity sha512-wU9tYisEbRMxqDezKUqC9GleLycCRoUsai9ddlsq54r8QRLaeEhc+d+9DqCG+kV9W2GgQjTZESPTpn5bAFMDww== +"@babel/plugin-transform-destructuring@^7.14.7": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz#0ad58ed37e23e22084d109f185260835e5557576" + integrity sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" @@ -668,10 +668,10 @@ "@babel/helper-module-transforms" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-named-capturing-groups-regex@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.5.tgz#d537e8ee083ee6f6aa4f4eef9d2081d555746e4c" - integrity sha512-+Xe5+6MWFo311U8SchgeX5c1+lJM+eZDBZgD+tvXu9VVQPXwwVzeManMMjYX6xw2HczngfOSZjoFYKwdeB/Jvw== +"@babel/plugin-transform-named-capturing-groups-regex@^7.14.7": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.7.tgz#60c06892acf9df231e256c24464bfecb0908fd4e" + integrity sha512-DTNOTaS7TkW97xsDMrp7nycUVh6sn/eq22VaxWfEdzuEbRsiaOU0pqU7DlyUGHVsbQbSghvjKRpEl+nUCKGQSg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.14.5" @@ -725,7 +725,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-spread@^7.14.5": +"@babel/plugin-transform-spread@^7.14.6": version "7.14.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz#6bd40e57fe7de94aa904851963b5616652f73144" integrity sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag== @@ -778,17 +778,17 @@ "@babel/helper-create-regexp-features-plugin" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/preset-env@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.5.tgz#c0c84e763661fd0e74292c3d511cb33b0c668997" - integrity sha512-ci6TsS0bjrdPpWGnQ+m4f+JSSzDKlckqKIJJt9UZ/+g7Zz9k0N8lYU8IeLg/01o2h8LyNZDMLGgRLDTxpudLsA== +"@babel/preset-env@^7.14.7": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.7.tgz#5c70b22d4c2d893b03d8c886a5c17422502b932a" + integrity sha512-itOGqCKLsSUl0Y+1nSfhbuuOlTs0MJk2Iv7iSH+XT/mR8U1zRLO7NjWlYXB47yhK4J/7j+HYty/EhFZDYKa/VA== dependencies: - "@babel/compat-data" "^7.14.5" + "@babel/compat-data" "^7.14.7" "@babel/helper-compilation-targets" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-validator-option" "^7.14.5" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.14.5" - "@babel/plugin-proposal-async-generator-functions" "^7.14.5" + "@babel/plugin-proposal-async-generator-functions" "^7.14.7" "@babel/plugin-proposal-class-properties" "^7.14.5" "@babel/plugin-proposal-class-static-block" "^7.14.5" "@babel/plugin-proposal-dynamic-import" "^7.14.5" @@ -797,7 +797,7 @@ "@babel/plugin-proposal-logical-assignment-operators" "^7.14.5" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5" "@babel/plugin-proposal-numeric-separator" "^7.14.5" - "@babel/plugin-proposal-object-rest-spread" "^7.14.5" + "@babel/plugin-proposal-object-rest-spread" "^7.14.7" "@babel/plugin-proposal-optional-catch-binding" "^7.14.5" "@babel/plugin-proposal-optional-chaining" "^7.14.5" "@babel/plugin-proposal-private-methods" "^7.14.5" @@ -823,7 +823,7 @@ "@babel/plugin-transform-block-scoping" "^7.14.5" "@babel/plugin-transform-classes" "^7.14.5" "@babel/plugin-transform-computed-properties" "^7.14.5" - "@babel/plugin-transform-destructuring" "^7.14.5" + "@babel/plugin-transform-destructuring" "^7.14.7" "@babel/plugin-transform-dotall-regex" "^7.14.5" "@babel/plugin-transform-duplicate-keys" "^7.14.5" "@babel/plugin-transform-exponentiation-operator" "^7.14.5" @@ -835,7 +835,7 @@ "@babel/plugin-transform-modules-commonjs" "^7.14.5" "@babel/plugin-transform-modules-systemjs" "^7.14.5" "@babel/plugin-transform-modules-umd" "^7.14.5" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.7" "@babel/plugin-transform-new-target" "^7.14.5" "@babel/plugin-transform-object-super" "^7.14.5" "@babel/plugin-transform-parameters" "^7.14.5" @@ -843,7 +843,7 @@ "@babel/plugin-transform-regenerator" "^7.14.5" "@babel/plugin-transform-reserved-words" "^7.14.5" "@babel/plugin-transform-shorthand-properties" "^7.14.5" - "@babel/plugin-transform-spread" "^7.14.5" + "@babel/plugin-transform-spread" "^7.14.6" "@babel/plugin-transform-sticky-regex" "^7.14.5" "@babel/plugin-transform-template-literals" "^7.14.5" "@babel/plugin-transform-typeof-symbol" "^7.14.5" @@ -854,7 +854,7 @@ babel-plugin-polyfill-corejs2 "^0.2.2" babel-plugin-polyfill-corejs3 "^0.2.2" babel-plugin-polyfill-regenerator "^0.2.2" - core-js-compat "^3.14.0" + core-js-compat "^3.15.0" semver "^6.3.0" "@babel/preset-modules@^0.1.4": @@ -894,16 +894,16 @@ "@babel/types" "^7.14.5" "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.5.tgz#c111b0f58afab4fea3d3385a406f692748c59870" - integrity sha512-G3BiS15vevepdmFqmUc9X+64y0viZYygubAMO8SvBmKARuF6CPSZtH4Ng9vi/lrWlZFGe3FWdXNy835akH8Glg== + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.7.tgz#64007c9774cfdc3abd23b0780bc18a3ce3631753" + integrity sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ== dependencies: "@babel/code-frame" "^7.14.5" "@babel/generator" "^7.14.5" "@babel/helper-function-name" "^7.14.5" "@babel/helper-hoist-variables" "^7.14.5" "@babel/helper-split-export-declaration" "^7.14.5" - "@babel/parser" "^7.14.5" + "@babel/parser" "^7.14.7" "@babel/types" "^7.14.5" debug "^4.1.0" globals "^11.1.0" @@ -916,6 +916,16 @@ "@babel/helper-validator-identifier" "^7.14.5" to-fast-properties "^2.0.0" +"@devsnowflake/docgen@devsnowflake/docgen#ts-patch": + version "0.9.0" + resolved "https://codeload.github.com/devsnowflake/docgen/tar.gz/cc87c4dfa7136fa1046946eff708bb995ca5e1f7" + dependencies: + eslint "^6.3.0" + js-yaml "^3.13.1" + jsdoc-to-markdown "^5.0.1" + tsubaki "^1.3.2" + yargs "^14.0.0" + "@discord-player/extractor@^3.0.2": version "3.0.2" resolved "https://registry.yarnpkg.com/@discord-player/extractor/-/extractor-3.0.2.tgz#932b37c881a371279b7b1d1eb35bcab256008a76" @@ -926,6 +936,14 @@ node-fetch "^2.6.1" reverbnation-scraper "^2.0.0" +"@discordjs/builders@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-0.1.1.tgz#d1e888ee8ef273cce639c79cb24abac7169cfb88" + integrity sha512-9eBC22bX2HBsob5ixMwZ6quy/vewU5GHuSJhpmSZ3cDGg8XPnrYdzbwI54U+V9kQBTa7M+aMu1lYVqMEPojj8A== + dependencies: + discord-api-types "^0.18.1" + tslib "^2.3.0" + "@discordjs/collection@^0.1.6": version "0.1.6" resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-0.1.6.tgz#9e9a7637f4e4e0688fd8b2b5c63133c91607682c" @@ -989,6 +1007,20 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" +"@humanwhocodes/config-array@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== + dependencies: + "@humanwhocodes/object-schema" "^1.2.0" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf" + integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w== + "@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.2": version "2.1.8-no-fsevents.2" resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.2.tgz#e324c0a247a5567192dd7180647709d7e2faf94b" @@ -1062,85 +1094,85 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== -"@types/node@*", "@types/node@^15.12.2": - version "15.12.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-15.12.4.tgz#e1cf817d70a1e118e81922c4ff6683ce9d422e26" - integrity sha512-zrNj1+yqYF4WskCMOHwN+w9iuD12+dGm0rQ35HLl9/Ouuq52cEtd0CH9qMgrdNmi5ejC1/V7vKEXYubB+65DkA== +"@types/node@*", "@types/node@^16.0.0": + version "16.0.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.0.0.tgz#067a6c49dc7a5c2412a505628e26902ae967bf6f" + integrity sha512-TmCW5HoZ2o2/z2EYi109jLqIaPIi9y/lc2LmDCWzuCi35bcaQ+OtUh6nwBiFK7SOu25FAU5+YKdqFZUwtqGSdg== -"@types/ws@^7.4.4", "@types/ws@^7.4.5": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.5.tgz#8ff0f7efcd8fea19f51f9dd66cb8b498d172a752" - integrity sha512-8mbDgtc8xpxDDem5Gwj76stBDJX35KQ3YBoayxlqUQcL5BZUthiqP/VQ4PQnLHqM4PmlbyO74t98eJpURO+gPA== +"@types/ws@^7.4.4", "@types/ws@^7.4.5", "@types/ws@^7.4.6": + version "7.4.6" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.6.tgz#c4320845e43d45a7129bb32905e28781c71c1fff" + integrity sha512-ijZ1vzRawI7QoWnTNL8KpHixd2b2XVb9I9HAqI3triPsh1EC0xH0Eg6w2O3TKbDCgiNNlJqfrof6j4T2I+l9vw== dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@^4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.28.0.tgz#1a66f03b264844387beb7dc85e1f1d403bd1803f" - integrity sha512-KcF6p3zWhf1f8xO84tuBailV5cN92vhS+VT7UJsPzGBm9VnQqfI9AsiMUFUCYHTYPg1uCCo+HyiDnpDuvkAMfQ== +"@typescript-eslint/eslint-plugin@^4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.28.1.tgz#c045e440196ae45464e08e20c38aff5c3a825947" + integrity sha512-9yfcNpDaNGQ6/LQOX/KhUFTR1sCKH+PBr234k6hI9XJ0VP5UqGxap0AnNwBnWFk1MNyWBylJH9ZkzBXC+5akZQ== dependencies: - "@typescript-eslint/experimental-utils" "4.28.0" - "@typescript-eslint/scope-manager" "4.28.0" + "@typescript-eslint/experimental-utils" "4.28.1" + "@typescript-eslint/scope-manager" "4.28.1" debug "^4.3.1" functional-red-black-tree "^1.0.1" regexpp "^3.1.0" semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/experimental-utils@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.0.tgz#13167ed991320684bdc23588135ae62115b30ee0" - integrity sha512-9XD9s7mt3QWMk82GoyUpc/Ji03vz4T5AYlHF9DcoFNfJ/y3UAclRsfGiE2gLfXtyC+JRA3trR7cR296TEb1oiQ== +"@typescript-eslint/experimental-utils@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.1.tgz#3869489dcca3c18523c46018b8996e15948dbadc" + integrity sha512-n8/ggadrZ+uyrfrSEchx3jgODdmcx7MzVM2sI3cTpI/YlfSm0+9HEUaWw3aQn2urL2KYlWYMDgn45iLfjDYB+Q== dependencies: "@types/json-schema" "^7.0.7" - "@typescript-eslint/scope-manager" "4.28.0" - "@typescript-eslint/types" "4.28.0" - "@typescript-eslint/typescript-estree" "4.28.0" + "@typescript-eslint/scope-manager" "4.28.1" + "@typescript-eslint/types" "4.28.1" + "@typescript-eslint/typescript-estree" "4.28.1" eslint-scope "^5.1.1" eslint-utils "^3.0.0" -"@typescript-eslint/parser@^4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.28.0.tgz#2404c16751a28616ef3abab77c8e51d680a12caa" - integrity sha512-7x4D22oPY8fDaOCvkuXtYYTQ6mTMmkivwEzS+7iml9F9VkHGbbZ3x4fHRwxAb5KeuSkLqfnYjs46tGx2Nour4A== +"@typescript-eslint/parser@^4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.28.1.tgz#5181b81658414f47291452c15bf6cd44a32f85bd" + integrity sha512-UjrMsgnhQIIK82hXGaD+MCN8IfORS1CbMdu7VlZbYa8LCZtbZjJA26De4IPQB7XYZbL8gJ99KWNj0l6WD0guJg== dependencies: - "@typescript-eslint/scope-manager" "4.28.0" - "@typescript-eslint/types" "4.28.0" - "@typescript-eslint/typescript-estree" "4.28.0" + "@typescript-eslint/scope-manager" "4.28.1" + "@typescript-eslint/types" "4.28.1" + "@typescript-eslint/typescript-estree" "4.28.1" debug "^4.3.1" -"@typescript-eslint/scope-manager@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.28.0.tgz#6a3009d2ab64a30fc8a1e257a1a320067f36a0ce" - integrity sha512-eCALCeScs5P/EYjwo6se9bdjtrh8ByWjtHzOkC4Tia6QQWtQr3PHovxh3TdYTuFcurkYI4rmFsRFpucADIkseg== +"@typescript-eslint/scope-manager@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.28.1.tgz#fd3c20627cdc12933f6d98b386940d8d0ce8a991" + integrity sha512-o95bvGKfss6705x7jFGDyS7trAORTy57lwJ+VsYwil/lOUxKQ9tA7Suuq+ciMhJc/1qPwB3XE2DKh9wubW8YYA== dependencies: - "@typescript-eslint/types" "4.28.0" - "@typescript-eslint/visitor-keys" "4.28.0" + "@typescript-eslint/types" "4.28.1" + "@typescript-eslint/visitor-keys" "4.28.1" -"@typescript-eslint/types@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.28.0.tgz#a33504e1ce7ac51fc39035f5fe6f15079d4dafb0" - integrity sha512-p16xMNKKoiJCVZY5PW/AfILw2xe1LfruTcfAKBj3a+wgNYP5I9ZEKNDOItoRt53p4EiPV6iRSICy8EPanG9ZVA== +"@typescript-eslint/types@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.28.1.tgz#d0f2ecbef3684634db357b9bbfc97b94b828f83f" + integrity sha512-4z+knEihcyX7blAGi7O3Fm3O6YRCP+r56NJFMNGsmtdw+NCdpG5SgNz427LS9nQkRVTswZLhz484hakQwB8RRg== -"@typescript-eslint/typescript-estree@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.0.tgz#e66d4e5aa2ede66fec8af434898fe61af10c71cf" - integrity sha512-m19UQTRtxMzKAm8QxfKpvh6OwQSXaW1CdZPoCaQuLwAq7VZMNuhJmZR4g5281s2ECt658sldnJfdpSZZaxUGMQ== +"@typescript-eslint/typescript-estree@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.1.tgz#af882ae41740d1f268e38b4d0fad21e7e8d86a81" + integrity sha512-GhKxmC4sHXxHGJv8e8egAZeTZ6HI4mLU6S7FUzvFOtsk7ZIDN1ksA9r9DyOgNqowA9yAtZXV0Uiap61bIO81FQ== dependencies: - "@typescript-eslint/types" "4.28.0" - "@typescript-eslint/visitor-keys" "4.28.0" + "@typescript-eslint/types" "4.28.1" + "@typescript-eslint/visitor-keys" "4.28.1" debug "^4.3.1" globby "^11.0.3" is-glob "^4.0.1" semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/visitor-keys@4.28.0": - version "4.28.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.0.tgz#255c67c966ec294104169a6939d96f91c8a89434" - integrity sha512-PjJyTWwrlrvM5jazxYF5ZPs/nl0kHDZMVbuIcbpawVXaDPelp3+S9zpOz5RmVUfS/fD5l5+ZXNKnWhNYjPzCvw== +"@typescript-eslint/visitor-keys@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.1.tgz#162a515ee255f18a6068edc26df793cdc1ec9157" + integrity sha512-K4HMrdFqr9PFquPu178SaSb92CaWe2yErXyPumc8cYWxFmhgJsNY9eSePmO05j0JhBvf2Cdhptd6E6Yv9HVHcg== dependencies: - "@typescript-eslint/types" "4.28.0" + "@typescript-eslint/types" "4.28.1" eslint-visitor-keys "^2.0.0" abab@^2.0.3, abab@^2.0.5: @@ -1184,9 +1216,9 @@ acorn@^7.1.1, acorn@^7.4.0: integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.2.4: - version "8.4.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.0.tgz#af53266e698d7cffa416714b503066a82221be60" - integrity sha512-ULr0LDaEqQrMFGyQ3bhJkLsbtrQ8QibAseGZeaSUiT/6zb9IvIkomWHJIvgvwad+hinRAgsI51JcWk2yvwyL+w== + version "8.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.1.tgz#56c36251fc7cabc7096adc18f05afe814321a28c" + integrity sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA== agent-base@6: version "6.0.2" @@ -1559,9 +1591,9 @@ camelcase@^5.0.0: integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== caniuse-lite@^1.0.30001219: - version "1.0.30001238" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001238.tgz#e6a8b45455c5de601718736d0242feef0ecdda15" - integrity sha512-bZGam2MxEt7YNsa2VwshqWQMwrYs5tR5WZQRYSuFxsBQunWjBuXhN4cS9nV5FFb1Z9y+DoQcQ0COyQbv6A+CKw== + version "1.0.30001241" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001241.tgz#cd3fae47eb3d7691692b406568d7a3e5b23c7598" + integrity sha512-1uoSZ1Pq1VpH0WerIMqwptXHNNGfdl7d1cJUFs80CwQ/lVzdhTvsFZCeNFslze7AjsQnb4C85tzclPa1VShbeQ== catharsis@^0.9.0: version "0.9.0" @@ -1799,10 +1831,10 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js-compat@^3.14.0: - version "3.14.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.14.0.tgz#b574dabf29184681d5b16357bd33d104df3d29a5" - integrity sha512-R4NS2eupxtiJU+VwgkF9WTpnSfZW4pogwKHd8bclWU2sp93Pr5S1uYJI84cMOubJRou7bcfL0vmwtLslWN5p3A== +core-js-compat@^3.14.0, core-js-compat@^3.15.0: + version "3.15.2" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.15.2.tgz#47272fbb479880de14b4e6081f71f3492f5bd3cb" + integrity sha512-Wp+BJVvwopjI+A1EFqm2dwUmWYXrvucmtIB2LgXn/Rb+gWPKYxtmb4GKHGKG/KGF1eK9jfjzT38DITbTOCX/SQ== dependencies: browserslist "^4.16.6" semver "7.0.0" @@ -1906,9 +1938,9 @@ decamelize@^1.2.0: integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= decimal.js@^10.2.1: - version "10.2.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" - integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw== + version "10.3.1" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" + integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== decode-uri-component@^0.2.0: version "0.2.0" @@ -1998,21 +2030,12 @@ discord-ytdl-core@^5.0.4: dependencies: prism-media "^1.2.9" -discord.js-docgen@discordjs/docgen#ts-patch: - version "0.9.0" - resolved "https://codeload.github.com/discordjs/docgen/tar.gz/9c58620ea4fcdeda432a1370d4333e8537b37491" - dependencies: - eslint "^6.3.0" - js-yaml "^3.13.1" - jsdoc-to-markdown "^5.0.1" - tsubaki "^1.3.2" - yargs "^14.0.0" - -discord.js@^13.0.0-dev.5842e35.1625011425: - version "13.0.0-dev.5842e35.1625011425" - resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0-dev.5842e35.1625011425.tgz#aa9dff8bac393dafbcd4a29132b53931c2297a84" - integrity sha512-68yUruYVN3mYKVMNfAfQp6RDl+zcgNSHS82S83HExWwdzTRSd4lnO3MJrk1Oc+Eoy4UNVE1LoCXkOUN64MitSA== +discord.js@^13.0.0-dev.3a718d8.1625270632: + version "13.0.0-dev.fe6cc0c.1625227356" + resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0-dev.fe6cc0c.1625227356.tgz#1fafefe671758898afd3c092cef6447286d2ca27" + integrity sha512-m9oY7nlAX6RhZYxTzg9s5JHGdkm6Fk+XKCHj2qeD7pG+GOmFV9mrqVBt5xZq4NZME81BmPASLhn0q6us4uDfJA== dependencies: + "@discordjs/builders" "^0.1.1" "@discordjs/collection" "^0.1.6" "@discordjs/form-data" "^3.0.1" "@sapphire/async-queue" "^1.1.4" @@ -2020,7 +2043,7 @@ discord.js@^13.0.0-dev.5842e35.1625011425: abort-controller "^3.0.0" discord-api-types "^0.19.0-next.f393ba520d7d6d2aacaca7b3ca5d355fab614f6e" node-fetch "^2.6.1" - ws "^7.5.0" + ws "^7.5.1" dmd@^4.0.5: version "4.0.6" @@ -2085,9 +2108,9 @@ domutils@^2.5.2, domutils@^2.6.0, domutils@^2.7.0: domhandler "^4.2.0" electron-to-chromium@^1.3.723: - version "1.3.752" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.752.tgz#0728587f1b9b970ec9ffad932496429aef750d09" - integrity sha512-2Tg+7jSl3oPxgsBsWKh5H83QazTkmWG/cnNwJplmyZc7KcN61+I10oUgaXSVk/NwfvN3BdkKDR4FYuRBQQ2v0A== + version "1.3.766" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.766.tgz#2fd14a4e54f77665872f4e23fcf4968e83638220" + integrity sha512-u2quJ862q9reRKh/je3GXis3w38+RoXH1J9N3XjtsS6NzmUAosNsyZgUVFZPN/ZlJ3v6T0rTyZR3q/J5c6Sy5w== emoji-regex@^7.0.1: version "7.0.3" @@ -2230,13 +2253,14 @@ eslint@^6.3.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" -eslint@^7.29.0: - version "7.29.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.29.0.tgz#ee2a7648f2e729485e4d0bd6383ec1deabc8b3c0" - integrity sha512-82G/JToB9qIy/ArBzIWG9xvvwL3R86AlCjtGw+A29OMZDqhTybz/MByORSukGxeI+YPCR4coYyITKk8BFH9nDA== +eslint@^7.30.0: + version "7.30.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.30.0.tgz#6d34ab51aaa56112fd97166226c9a97f505474f8" + integrity sha512-VLqz80i3as3NdloY44BQSJpFw534L9Oh+6zJOUaViV4JPd+DaHwutqP7tcpkW3YiXbK6s05RZl7yl7cQn+lijg== dependencies: "@babel/code-frame" "7.12.11" "@eslint/eslintrc" "^0.4.2" + "@humanwhocodes/config-array" "^0.5.0" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -2389,16 +2413,15 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.1.1: - version "3.2.5" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" - integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== + version "3.2.6" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.6.tgz#434dd9529845176ea049acc9343e8282765c6e1a" + integrity sha512-GnLuqj/pvQ7pX8/L4J84nijv6sAnlwvSDpMkJi9i7nPmPxGtRPkBSStfvDW5l6nMdX9VWe+pkKWFTgD+vF2QSQ== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.0" + glob-parent "^5.1.2" merge2 "^1.3.0" - micromatch "^4.0.2" - picomatch "^2.2.1" + micromatch "^4.0.4" fast-json-stable-stringify@^2.0.0: version "2.1.0" @@ -2508,9 +2531,9 @@ flatted@^2.0.0: integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== flatted@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" - integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== + version "3.2.0" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.0.tgz#da07fb8808050aba6fdeac2294542e5043583f05" + integrity sha512-XprP7lDrVT+kE2c2YlfiV+IfS9zxukiIOvNamPNsImNhXadSsQEbosItdL9bUQlCZXR13SvPk20BjWSWLA7m4A== follow-redirects@^1.10.0: version "1.14.1" @@ -2621,7 +2644,7 @@ get-value@^2.0.3, get-value@^2.0.6: resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= -glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@^5.0.0, glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -3357,9 +3380,9 @@ marked@^0.7.0: integrity sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg== marked@^2.0.3: - version "2.1.1" - resolved "https://registry.yarnpkg.com/marked/-/marked-2.1.1.tgz#b7c27f520fc4de0ddd049d9b4be3b04e06314923" - integrity sha512-5XFS69o9CzDpQDSpUYC+AN2xvq8yl1EGa5SG/GI1hP78/uTeo3PDfiDNmsUyiahpyhToDDJhQk7fNtJsga+KVw== + version "2.1.3" + resolved "https://registry.yarnpkg.com/marked/-/marked-2.1.3.tgz#bd017cef6431724fd4b27e0657f5ceb14bff3753" + integrity sha512-/Q+7MGzaETqifOMWYEA7HVMaZb4XbcRfaOzcSsHZEith83KGlvaSG33u0SKu89Mj5h+T8V2hM+8O45Qc5XTgwA== mdurl@^1.0.1: version "1.0.1" @@ -3390,7 +3413,7 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" -micromatch@^4.0.2: +micromatch@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== @@ -3774,10 +3797,10 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= -prettier@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.1.tgz#76903c3f8c4449bc9ac597acefa24dc5ad4cbea6" - integrity sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA== +prettier@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.2.tgz#ef280a05ec253712e486233db5c6f23441e7342d" + integrity sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ== prism-media@^1.2.9, prism-media@^1.3.1: version "1.3.1" @@ -4566,7 +4589,7 @@ tslib@^1.8.1, tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.2.0: +tslib@^2.2.0, tslib@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== @@ -4612,10 +4635,10 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -typescript@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.4.tgz#3f85b986945bcf31071decdd96cf8bfa65f9dcbc" - integrity sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew== +typescript@^4.3.5: + version "4.3.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" + integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== typical@^2.4.2, typical@^2.6.0, typical@^2.6.1: version "2.6.1" @@ -4633,9 +4656,9 @@ uc.micro@^1.0.1, uc.micro@^1.0.5: integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== uglify-js@^3.1.4: - version "3.13.9" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.9.tgz#4d8d21dcd497f29cfd8e9378b9df123ad025999b" - integrity sha512-wZbyTQ1w6Y7fHdt8sJnHfSIuWeDgk6B5rCb4E/AM6QNNPbOMIZph21PW5dRB3h7Df0GszN+t7RuUH6sWK5bF0g== + version "3.13.10" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.10.tgz#a6bd0d28d38f592c3adb6b180ea6e07e1e540a8d" + integrity sha512-57H3ACYFXeo1IaZ1w02sfA71wI60MGco/IQFjOqK+WtKoprh7Go2/yvd2HPtoJILO2Or84ncLccI4xoHMTSbGg== underscore@~1.13.1: version "1.13.1" @@ -4772,9 +4795,9 @@ whatwg-mimetype@^2.3.0: integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.6.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.6.0.tgz#27c0205a4902084b872aecb97cf0f2a7a3011f4c" - integrity sha512-os0KkeeqUOl7ccdDT1qqUcS4KH4tcBTSKK5Nl5WKb2lyxInIZ/CpjkqKa1Ss12mjfdcRX9mHmPPs7/SxG1Hbdw== + version "8.7.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== dependencies: lodash "^4.7.0" tr46 "^2.1.0" @@ -4845,16 +4868,11 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -ws@^7.4.4, ws@^7.5.0: +ws@^7.4.4, ws@^7.4.5, ws@^7.5.1: version "7.5.1" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.1.tgz#44fc000d87edb1d9c53e51fbc69a0ac1f6871d66" integrity sha512-2c6faOUH/nhoQN6abwMloF7Iyl0ZS2E9HGtsiLrWn0zOOMWlhtDmdf/uihDt6jnuCxgtwGBNy6Onsoy2s2O2Ow== -ws@^7.4.5: - version "7.5.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.0.tgz#0033bafea031fb9df041b2026fc72a571ca44691" - integrity sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw== - xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" @@ -4881,9 +4899,9 @@ yallist@^4.0.0: integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yargs-parser@^15.0.1: - version "15.0.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.1.tgz#54786af40b820dcb2fb8025b11b4d659d76323b3" - integrity sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw== + version "15.0.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.3.tgz#316e263d5febe8b38eef61ac092b33dfcc9b1115" + integrity sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" From 173c0d534004460ba32021d41139a3f597240e46 Mon Sep 17 00:00:00 2001 From: Snowflake107 <46562212+Snowflake107@users.noreply.github.com> Date: Sat, 3 Jul 2021 18:31:18 +0545 Subject: [PATCH 161/215] bump discord.js --- package.json | 2 +- src/utils/Util.ts | 2 +- yarn.lock | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index b69ab0b..1a61767 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "@typescript-eslint/eslint-plugin": "^4.28.1", "@typescript-eslint/parser": "^4.28.1", "discord-api-types": "^0.18.1", - "discord.js": "^13.0.0-dev.3a718d8.1625270632", + "discord.js": "^13.0.0-dev.56b5b7e.1625313788", "eslint": "^7.30.0", "jsdoc-babel": "^0.5.0", "prettier": "^2.3.2", diff --git a/src/utils/Util.ts b/src/utils/Util.ts index 27d07b7..471039c 100644 --- a/src/utils/Util.ts +++ b/src/utils/Util.ts @@ -92,7 +92,7 @@ class Util { * @returns {Promise} */ static wait(time: number) { - return new Promise((r) => setTimeout(r, time).unref()); + return new Promise((r) => setTimeout(r, time)); } static get noop() { diff --git a/yarn.lock b/yarn.lock index 09be7df..0c76002 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2030,10 +2030,10 @@ discord-ytdl-core@^5.0.4: dependencies: prism-media "^1.2.9" -discord.js@^13.0.0-dev.3a718d8.1625270632: - version "13.0.0-dev.fe6cc0c.1625227356" - resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0-dev.fe6cc0c.1625227356.tgz#1fafefe671758898afd3c092cef6447286d2ca27" - integrity sha512-m9oY7nlAX6RhZYxTzg9s5JHGdkm6Fk+XKCHj2qeD7pG+GOmFV9mrqVBt5xZq4NZME81BmPASLhn0q6us4uDfJA== +discord.js@^13.0.0-dev.56b5b7e.1625313788: + version "13.0.0-dev.56b5b7e.1625313788" + resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0-dev.56b5b7e.1625313788.tgz#32931b0dd7fe25b32aec13e230497fdd1b3bee0d" + integrity sha512-D1d0fqjwa6ktn4yyZOE83Q/1sTl8ZNgJ95+cMUlK+FZBIe9G3nLHpHcCg+ph+SJIvQKUJubpzk2Yhbm/oJ1EvA== dependencies: "@discordjs/builders" "^0.1.1" "@discordjs/collection" "^0.1.6" From f61953d42a782c7a0f1518304ee349c651feb908 Mon Sep 17 00:00:00 2001 From: Snowflake107 <46562212+Snowflake107@users.noreply.github.com> Date: Sat, 3 Jul 2021 18:39:05 +0545 Subject: [PATCH 162/215] example bot: bump deps --- example/music-bot/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/example/music-bot/package.json b/example/music-bot/package.json index c84b424..78450a9 100644 --- a/example/music-bot/package.json +++ b/example/music-bot/package.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@discordjs/opus": "^0.5.3", - "discord-player": "^5.0.0-dev.29489940b64b555e2e791dcf0662bd2d93a22ef6", - "discord.js": "^13.0.0-dev.5842e35.1625011425" + "discord-player": "^5.0.0-dev.m2", + "discord.js": "^13.0.0-dev.56b5b7e.1625313788" } } From f395fcff9e502bd01ed47ee728c8b561c05384c9 Mon Sep 17 00:00:00 2001 From: Snowflake107 <46562212+Snowflake107@users.noreply.github.com> Date: Sat, 3 Jul 2021 19:31:39 +0545 Subject: [PATCH 163/215] watch destroyed if queue is not destroyed --- src/Structures/Queue.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 835b3ce..a072182 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -534,6 +534,7 @@ class Queue { const currentTimecode = Util.buildTimeCode(Util.parseMS(currentStreamTime)); const endTimecode = Util.buildTimeCode(Util.parseMS(totalTime)); + // why return { current: currentTimecode, end: endTimecode, @@ -593,12 +594,14 @@ class Queue { * @returns {Promise} */ async play(src?: Track, options: PlayOptions = {}): Promise { - this.#watchDestroyed(); + if (!this.destroyed) this.#watchDestroyed(); if (!this.connection || !this.connection.voiceConnection) throw new Error("Voice connection is not available, use .connect()!"); if (src && (this.playing || this.tracks.length) && !options.immediate) return this.addTrack(src); const track = options.filtersUpdate && !options.immediate ? src || this.current : src ?? this.tracks.shift(); if (!track) return; + this.player.emit("debug", this, "Received play request"); + if (!options.filtersUpdate) { this.previousTracks = this.previousTracks.filter((x) => x.id !== track.id); this.previousTracks.push(track); From 0f308111574a265d840dc0a878be67bd85ca9844 Mon Sep 17 00:00:00 2001 From: Snowflake107 <46562212+Snowflake107@users.noreply.github.com> Date: Sat, 3 Jul 2021 19:33:27 +0545 Subject: [PATCH 164/215] example: bump discord-player --- example/music-bot/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/music-bot/package.json b/example/music-bot/package.json index 78450a9..e550aa7 100644 --- a/example/music-bot/package.json +++ b/example/music-bot/package.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@discordjs/opus": "^0.5.3", - "discord-player": "^5.0.0-dev.m2", + "discord-player": "^5.0.0-dev.m3", "discord.js": "^13.0.0-dev.56b5b7e.1625313788" } } From 91c56751a7c4a9d5474c2fd67cf7dcaf4d3b93bb Mon Sep 17 00:00:00 2001 From: Snowflake107 <46562212+Snowflake107@users.noreply.github.com> Date: Sun, 4 Jul 2021 13:51:26 +0545 Subject: [PATCH 165/215] example: Use messageCreate event instead of message event --- example/music-bot/index.js | 2 +- example/music-bot/package.json | 2 +- package.json | 2 +- yarn.lock | 27 ++++++++++++++++----------- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/example/music-bot/index.js b/example/music-bot/index.js index f8302fa..a6c34df 100644 --- a/example/music-bot/index.js +++ b/example/music-bot/index.js @@ -46,7 +46,7 @@ player.on("queueEnd", (queue) => { queue.metadata.send("✅ | Queue finished!"); }); -client.on("message", async (message) => { +client.on("messageCreate", async (message) => { if (message.author.bot || !message.guild) return; if (!client.application?.owner) await client.application?.fetch(); diff --git a/example/music-bot/package.json b/example/music-bot/package.json index e550aa7..d61df96 100644 --- a/example/music-bot/package.json +++ b/example/music-bot/package.json @@ -11,6 +11,6 @@ "dependencies": { "@discordjs/opus": "^0.5.3", "discord-player": "^5.0.0-dev.m3", - "discord.js": "^13.0.0-dev.56b5b7e.1625313788" + "discord.js": "^13.0.0-dev.610b0b4.1625357028" } } diff --git a/package.json b/package.json index 1a61767..cf46d21 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "@typescript-eslint/eslint-plugin": "^4.28.1", "@typescript-eslint/parser": "^4.28.1", "discord-api-types": "^0.18.1", - "discord.js": "^13.0.0-dev.56b5b7e.1625313788", + "discord.js": "^13.0.0-dev.610b0b4.1625357028", "eslint": "^7.30.0", "jsdoc-babel": "^0.5.0", "prettier": "^2.3.2", diff --git a/yarn.lock b/yarn.lock index 0c76002..cce9891 100644 --- a/yarn.lock +++ b/yarn.lock @@ -936,10 +936,10 @@ node-fetch "^2.6.1" reverbnation-scraper "^2.0.0" -"@discordjs/builders@^0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-0.1.1.tgz#d1e888ee8ef273cce639c79cb24abac7169cfb88" - integrity sha512-9eBC22bX2HBsob5ixMwZ6quy/vewU5GHuSJhpmSZ3cDGg8XPnrYdzbwI54U+V9kQBTa7M+aMu1lYVqMEPojj8A== +"@discordjs/builders@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-0.2.0.tgz#832c8d894aad13362db7a99f11a7826b21e4cd94" + integrity sha512-TVq7NZBCJrrTRc3CfxOr3IdgY5nrtqVxZ7qDUF1mN6LgxIiOldmFxsSwMrQBzLFVmOwqFyNLKCeblley8UpEuw== dependencies: discord-api-types "^0.18.1" tslib "^2.3.0" @@ -981,7 +981,7 @@ "@discordjs/node-pre-gyp" "^0.4.0" node-addon-api "^3.2.1" -"@discordjs/voice@^0.5.1": +"@discordjs/voice@0.5.1": version "0.5.1" resolved "https://registry.yarnpkg.com/@discordjs/voice/-/voice-0.5.1.tgz#265b05712196bbbb5b082b073807ef4582f067c7" integrity sha512-51NrtmfkGe6xJVMULjxXdQ9apPsqNyV1vZ/Qa57x6qM3TzWWQNyMfrLkjD+YvQtesZZpKZcQZI8NIknWUYiBNQ== @@ -2030,12 +2030,12 @@ discord-ytdl-core@^5.0.4: dependencies: prism-media "^1.2.9" -discord.js@^13.0.0-dev.56b5b7e.1625313788: - version "13.0.0-dev.56b5b7e.1625313788" - resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0-dev.56b5b7e.1625313788.tgz#32931b0dd7fe25b32aec13e230497fdd1b3bee0d" - integrity sha512-D1d0fqjwa6ktn4yyZOE83Q/1sTl8ZNgJ95+cMUlK+FZBIe9G3nLHpHcCg+ph+SJIvQKUJubpzk2Yhbm/oJ1EvA== +discord.js@^13.0.0-dev.610b0b4.1625357028: + version "13.0.0-dev.610b0b4.1625357028" + resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0-dev.610b0b4.1625357028.tgz#7e5f40b15980d05f42568a78290e166aab7597a3" + integrity sha512-uNHDkPSeVZ1HeXwagtEvDGqbUS8Hvtz2s39pwlkn6p9iQuDF+093mhvQSDiooGVSsWoU9sR2CHTwMSlZoRNIhg== dependencies: - "@discordjs/builders" "^0.1.1" + "@discordjs/builders" "^0.2.0" "@discordjs/collection" "^0.1.6" "@discordjs/form-data" "^3.0.1" "@sapphire/async-queue" "^1.1.4" @@ -4868,11 +4868,16 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -ws@^7.4.4, ws@^7.4.5, ws@^7.5.1: +ws@^7.4.4, ws@^7.4.5: version "7.5.1" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.1.tgz#44fc000d87edb1d9c53e51fbc69a0ac1f6871d66" integrity sha512-2c6faOUH/nhoQN6abwMloF7Iyl0ZS2E9HGtsiLrWn0zOOMWlhtDmdf/uihDt6jnuCxgtwGBNy6Onsoy2s2O2Ow== +ws@^7.5.1: + version "7.5.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.2.tgz#09cc8fea3bec1bc5ed44ef51b42f945be36900f6" + integrity sha512-lkF7AWRicoB9mAgjeKbGqVUekLnSNO4VjKVnuPHpQeOxZOErX6BPXwJk70nFslRCEEA8EVW7ZjKwXaP9N+1sKQ== + xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" From 5b761308a0e3db789b538de819945d7e1f12b4c9 Mon Sep 17 00:00:00 2001 From: Snowflake107 <46562212+Snowflake107@users.noreply.github.com> Date: Sun, 4 Jul 2021 13:54:32 +0545 Subject: [PATCH 166/215] queue: check connection before ending --- src/Structures/Queue.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index a072182..a94aad8 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -193,7 +193,7 @@ class Queue { */ destroy(disconnect = this.options.leaveOnStop) { this.#watchDestroyed(); - this.connection.end(); + if (this.connection) this.connection.end(); if (disconnect) this.connection.disconnect(); this.player.queues.delete(this.guild.id); this.player.voiceUtils.cache.delete(this.guild.id); From b0fa95473878f59791f5ac373b747d9cf0592f08 Mon Sep 17 00:00:00 2001 From: Snowflake107 <46562212+Snowflake107@users.noreply.github.com> Date: Sun, 4 Jul 2021 18:57:27 +0545 Subject: [PATCH 167/215] temporarily fix typings issue --- package.json | 4 ++-- src/Structures/Queue.ts | 17 ++++++++------- yarn.lock | 46 ++++++++++++++--------------------------- 3 files changed, 27 insertions(+), 40 deletions(-) diff --git a/package.json b/package.json index cf46d21..4347a49 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ }, "homepage": "https://discord-player.js.org", "dependencies": { - "@discordjs/voice": "^0.5.1", + "@discordjs/voice": "0.5.0", "discord-ytdl-core": "^5.0.4", "libsodium-wrappers": "^0.7.9", "soundcloud-scraper": "^5.0.0", @@ -74,7 +74,7 @@ "@typescript-eslint/eslint-plugin": "^4.28.1", "@typescript-eslint/parser": "^4.28.1", "discord-api-types": "^0.18.1", - "discord.js": "^13.0.0-dev.610b0b4.1625357028", + "discord.js": "13.0.0-dev.6d3d00b44577a70e840f0187d6894043677c5329", "eslint": "^7.30.0", "jsdoc-babel": "^0.5.0", "prettier": "^2.3.2", diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index a94aad8..3d90a77 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -1,4 +1,4 @@ -import { Collection, Guild, StageChannel, VoiceChannel, Snowflake, SnowflakeUtil } from "discord.js"; +import { Collection, Guild, StageChannel, VoiceChannel, Snowflake, SnowflakeUtil, GuildChannelResolvable } from "discord.js"; import { Player } from "../Player"; import { StreamDispatcher } from "../VoiceInterface/StreamDispatcher"; import Track from "./Track"; @@ -133,20 +133,21 @@ class Queue { /** * Connects to a voice channel - * @param {StageChannel|VoiceChannel} channel The voice/stage channel + * @param {GuildChannelResolvable} channel The voice/stage channel * @returns {Promise} */ - async connect(channel: StageChannel | VoiceChannel) { + async connect(channel: GuildChannelResolvable) { this.#watchDestroyed(); - if (!["stage", "voice"].includes(channel?.type)) throw new TypeError(`Channel type must be voice or stage, got ${channel?.type}!`); - const connection = await this.player.voiceUtils.connect(channel, { + const _channel = this.guild.channels.resolve(channel) as StageChannel | VoiceChannel; + if (!["stage", "voice"].includes(_channel?.type)) throw new TypeError(`Channel type must be voice or stage, got ${_channel?.type}!`); + const connection = await this.player.voiceUtils.connect(_channel, { deaf: this.options.autoSelfDeaf }); this.connection = connection; - if (channel.type === "stage") { - await channel.guild.me.voice.setSuppressed(false).catch(async () => { - return await channel.guild.me.voice.setRequestToSpeak(true).catch(Util.noop); + if (_channel.type === "stage") { + await _channel.guild.me.voice.setSuppressed(false).catch(async () => { + return await _channel.guild.me.voice.setRequestToSpeak(true).catch(Util.noop); }); } diff --git a/yarn.lock b/yarn.lock index cce9891..4193f43 100644 --- a/yarn.lock +++ b/yarn.lock @@ -936,14 +936,6 @@ node-fetch "^2.6.1" reverbnation-scraper "^2.0.0" -"@discordjs/builders@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-0.2.0.tgz#832c8d894aad13362db7a99f11a7826b21e4cd94" - integrity sha512-TVq7NZBCJrrTRc3CfxOr3IdgY5nrtqVxZ7qDUF1mN6LgxIiOldmFxsSwMrQBzLFVmOwqFyNLKCeblley8UpEuw== - dependencies: - discord-api-types "^0.18.1" - tslib "^2.3.0" - "@discordjs/collection@^0.1.6": version "0.1.6" resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-0.1.6.tgz#9e9a7637f4e4e0688fd8b2b5c63133c91607682c" @@ -981,10 +973,10 @@ "@discordjs/node-pre-gyp" "^0.4.0" node-addon-api "^3.2.1" -"@discordjs/voice@0.5.1": - version "0.5.1" - resolved "https://registry.yarnpkg.com/@discordjs/voice/-/voice-0.5.1.tgz#265b05712196bbbb5b082b073807ef4582f067c7" - integrity sha512-51NrtmfkGe6xJVMULjxXdQ9apPsqNyV1vZ/Qa57x6qM3TzWWQNyMfrLkjD+YvQtesZZpKZcQZI8NIknWUYiBNQ== +"@discordjs/voice@0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@discordjs/voice/-/voice-0.5.0.tgz#238d6f8c1dc7e30ff781edb08fb0540bca5aa23d" + integrity sha512-YPfY8ium1lExmRETz+vC4d3gGvHhGvWQMWLTOkNBoUkN6VyEpO/RVrL5EI+0qUefKAWwv2Gus/c7QM1xhAUwow== dependencies: "@types/ws" "^7.4.4" discord-api-types "^0.18.1" @@ -1059,7 +1051,7 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@sapphire/async-queue@^1.1.4": +"@sapphire/async-queue@^1.1.2": version "1.1.4" resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.1.4.tgz#ae431310917a8880961cebe8e59df6ffa40f2957" integrity sha512-fFrlF/uWpGOX5djw5Mu2Hnnrunao75WGey0sP0J3jnhmrJ5TAPzHYOmytD5iN/+pMxS+f+u/gezqHa9tPhRHEA== @@ -1099,7 +1091,7 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.0.0.tgz#067a6c49dc7a5c2412a505628e26902ae967bf6f" integrity sha512-TmCW5HoZ2o2/z2EYi109jLqIaPIi9y/lc2LmDCWzuCi35bcaQ+OtUh6nwBiFK7SOu25FAU5+YKdqFZUwtqGSdg== -"@types/ws@^7.4.4", "@types/ws@^7.4.5", "@types/ws@^7.4.6": +"@types/ws@^7.4.4", "@types/ws@^7.4.6": version "7.4.6" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.6.tgz#c4320845e43d45a7129bb32905e28781c71c1fff" integrity sha512-ijZ1vzRawI7QoWnTNL8KpHixd2b2XVb9I9HAqI3triPsh1EC0xH0Eg6w2O3TKbDCgiNNlJqfrof6j4T2I+l9vw== @@ -2018,11 +2010,6 @@ discord-api-types@^0.18.1: resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.18.1.tgz#5d08ed1263236be9c21a22065d0e6b51f790f492" integrity sha512-hNC38R9ZF4uaujaZQtQfm5CdQO58uhdkoHQAVvMfIL0LgOSZeW575W8H6upngQOuoxWd8tiRII3LLJm9zuQKYg== -discord-api-types@^0.19.0-next.f393ba520d7d6d2aacaca7b3ca5d355fab614f6e: - version "0.19.0-next.f393ba520d7d6d2aacaca7b3ca5d355fab614f6e" - resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.19.0-next.f393ba520d7d6d2aacaca7b3ca5d355fab614f6e.tgz#d5f36f5712ec8fe2fe928b5c37618c94a3969d6a" - integrity sha512-ttRA/8e/WKHDbGFfED5WlS7gID+kalmNr6iMiWBCvkphQ7kFHiTOVbnj/zX9ksaRaYXp/I38SCQ+qZvLu8DJZg== - discord-ytdl-core@^5.0.4: version "5.0.4" resolved "https://registry.yarnpkg.com/discord-ytdl-core/-/discord-ytdl-core-5.0.4.tgz#84a2af1a8e8c235b4fc109b23350d12782ab66cd" @@ -2030,20 +2017,19 @@ discord-ytdl-core@^5.0.4: dependencies: prism-media "^1.2.9" -discord.js@^13.0.0-dev.610b0b4.1625357028: - version "13.0.0-dev.610b0b4.1625357028" - resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0-dev.610b0b4.1625357028.tgz#7e5f40b15980d05f42568a78290e166aab7597a3" - integrity sha512-uNHDkPSeVZ1HeXwagtEvDGqbUS8Hvtz2s39pwlkn6p9iQuDF+093mhvQSDiooGVSsWoU9sR2CHTwMSlZoRNIhg== +discord.js@13.0.0-dev.6d3d00b44577a70e840f0187d6894043677c5329: + version "13.0.0-dev.6d3d00b44577a70e840f0187d6894043677c5329" + resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0-dev.6d3d00b44577a70e840f0187d6894043677c5329.tgz#7593fc7d86651f65c4e1f6a67802b7b72c532695" + integrity sha512-K2jlMXX4cB8+/6CYh/QywULgUcMSJcR6CycEGnONeCskrejtArCUmiV8dKu20ABv3CeHWgTVN261BQWRTTelRg== dependencies: - "@discordjs/builders" "^0.2.0" "@discordjs/collection" "^0.1.6" "@discordjs/form-data" "^3.0.1" - "@sapphire/async-queue" "^1.1.4" - "@types/ws" "^7.4.5" + "@sapphire/async-queue" "^1.1.2" + "@types/ws" "^7.4.4" abort-controller "^3.0.0" - discord-api-types "^0.19.0-next.f393ba520d7d6d2aacaca7b3ca5d355fab614f6e" + discord-api-types "^0.18.1" node-fetch "^2.6.1" - ws "^7.5.1" + ws "^7.4.6" dmd@^4.0.5: version "4.0.6" @@ -4589,7 +4575,7 @@ tslib@^1.8.1, tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.2.0, tslib@^2.3.0: +tslib@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== @@ -4873,7 +4859,7 @@ ws@^7.4.4, ws@^7.4.5: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.1.tgz#44fc000d87edb1d9c53e51fbc69a0ac1f6871d66" integrity sha512-2c6faOUH/nhoQN6abwMloF7Iyl0ZS2E9HGtsiLrWn0zOOMWlhtDmdf/uihDt6jnuCxgtwGBNy6Onsoy2s2O2Ow== -ws@^7.5.1: +ws@^7.4.6: version "7.5.2" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.2.tgz#09cc8fea3bec1bc5ed44ef51b42f945be36900f6" integrity sha512-lkF7AWRicoB9mAgjeKbGqVUekLnSNO4VjKVnuPHpQeOxZOErX6BPXwJk70nFslRCEEA8EVW7ZjKwXaP9N+1sKQ== From c37bfa3582e761894516f6be0042b6361aeec6a9 Mon Sep 17 00:00:00 2001 From: Snowflake107 <46562212+Snowflake107@users.noreply.github.com> Date: Sun, 4 Jul 2021 19:01:37 +0545 Subject: [PATCH 168/215] example: update deps --- example/music-bot/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/example/music-bot/package.json b/example/music-bot/package.json index d61df96..b45b2a4 100644 --- a/example/music-bot/package.json +++ b/example/music-bot/package.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@discordjs/opus": "^0.5.3", - "discord-player": "^5.0.0-dev.m3", - "discord.js": "^13.0.0-dev.610b0b4.1625357028" + "discord-player": "^5.0.0-dev.b0fa95473878f59791f5ac373b747d9cf0592f08", + "discord.js": "^13.0.0-dev.6d3d00b44577a70e840f0187d6894043677c5329" } } From 4c93c39ec72050d4bc6d5d5fa2bfd3718f2c066d Mon Sep 17 00:00:00 2001 From: Snowflake107 <46562212+Snowflake107@users.noreply.github.com> Date: Sun, 4 Jul 2021 19:11:34 +0545 Subject: [PATCH 169/215] bump youtube-sr --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 4347a49..04cb4d7 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "soundcloud-scraper": "^5.0.0", "spotify-url-info": "^2.2.3", "tiny-typed-emitter": "^2.0.3", - "youtube-sr": "^4.1.6", + "youtube-sr": "^4.1.7", "ytdl-core": "^4.8.3" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 4193f43..97152c3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4919,10 +4919,10 @@ yn@3.1.1: resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== -youtube-sr@^4.1.6: - version "4.1.6" - resolved "https://registry.yarnpkg.com/youtube-sr/-/youtube-sr-4.1.6.tgz#0cbc3e5c4d6d5931330914aa84558b2c09980734" - integrity sha512-W/Qh7niooX7aMUaM9jp7NDNHuX764mAaoOH34V9q5E7v1RrHig+vd2rfAplfQILPPIs/blO3gG82D4/l/lbegg== +youtube-sr@^4.1.7: + version "4.1.7" + resolved "https://registry.yarnpkg.com/youtube-sr/-/youtube-sr-4.1.7.tgz#a7cdff3e2ce3027170c96e0ca936bfba05955538" + integrity sha512-OKbm+561Fq5RlnUtJBmPhnyfS6Zon44zdPhY1v/Y9vpAHzqdfxomD43yc0ZQv6zNsVzSlAkGeWhoweNd6DUUjQ== dependencies: node-fetch "^2.6.1" From 1a5e4cf2b8ecf8753647f3d2d0aa9f8525bf9814 Mon Sep 17 00:00:00 2001 From: Snowflake107 <46562212+Snowflake107@users.noreply.github.com> Date: Sun, 4 Jul 2021 19:20:40 +0545 Subject: [PATCH 170/215] add resolveQueue method --- src/Player.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/Player.ts b/src/Player.ts index de7b484..106aa0b 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -487,6 +487,15 @@ class Player extends EventEmitter { return generateDependencyReport(); } + /** + * Resolves qeuue + * @param {GuildResolvable|Queue} queueLike Queue like object + * @returns {Queue} + */ + resolveQueue(queueLike: GuildResolvable | Queue): Queue { + return this.getQueue(queueLike instanceof Queue ? queueLike.guild : queueLike); + } + *[Symbol.iterator]() { yield* Array.from(this.queues.values()); } From a9cbc9df016065a32dc4bc0926010b12e53683d6 Mon Sep 17 00:00:00 2001 From: Snowflake107 <46562212+Snowflake107@users.noreply.github.com> Date: Sun, 4 Jul 2021 20:12:56 +0545 Subject: [PATCH 171/215] fix disconnect issue --- src/Structures/Queue.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 3d90a77..45fb3c2 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -195,7 +195,7 @@ class Queue { destroy(disconnect = this.options.leaveOnStop) { this.#watchDestroyed(); if (this.connection) this.connection.end(); - if (disconnect) this.connection.disconnect(); + if (disconnect) this.connection?.disconnect(); this.player.queues.delete(this.guild.id); this.player.voiceUtils.cache.delete(this.guild.id); this.#destroyed = true; From 6e6bd432c059e8e52721cf549db05d5254f728b3 Mon Sep 17 00:00:00 2001 From: Snowflake107 <46562212+Snowflake107@users.noreply.github.com> Date: Mon, 5 Jul 2021 12:13:06 +0545 Subject: [PATCH 172/215] refactor(Queue): Remove queue from createProgressBar --- src/Player.ts | 8 ++++---- src/Structures/Queue.ts | 22 +++++++--------------- src/types/types.ts | 5 ++--- 3 files changed, 13 insertions(+), 22 deletions(-) diff --git a/src/Player.ts b/src/Player.ts index 106aa0b..133c3bb 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -2,7 +2,7 @@ import { Client, Collection, GuildResolvable, Snowflake, User, VoiceState } from import { TypedEmitter as EventEmitter } from "tiny-typed-emitter"; import { Queue } from "./Structures/Queue"; import { VoiceUtils } from "./VoiceInterface/VoiceUtils"; -import { PlayerEvents, PlayerOptions, QueryType, SearchOptions, DiscordPlayerInitOptions } from "./types/types"; +import { PlayerEvents, PlayerOptions, QueryType, SearchOptions, PlayerInitOptions } from "./types/types"; import Track from "./Structures/Track"; import { QueryResolver } from "./utils/QueryResolver"; import YouTube from "youtube-sr"; @@ -19,7 +19,7 @@ const soundcloud = new SoundCloud(); class Player extends EventEmitter { public readonly client: Client; - public readonly options: DiscordPlayerInitOptions = { + public readonly options: PlayerInitOptions = { autoRegisterExtractor: true, ytdlOptions: {} }; @@ -30,9 +30,9 @@ class Player extends EventEmitter { /** * Creates new Discord Player * @param {Client} client The Discord Client - * @param {DiscordPlayerInitOptions} [options={}] The player init options + * @param {PlayerInitOptions} [options={}] The player init options */ - constructor(client: Client, options: DiscordPlayerInitOptions = {}) { + constructor(client: Client, options: PlayerInitOptions = {}) { super(); /** diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 45fb3c2..aa32660 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -522,20 +522,16 @@ class Queue { /** * Returns player stream timestamp - * @param {boolean} [queue=false] If it should generate timestamp for the queue * @returns {PlayerTimestamp} */ - getPlayerTimestamp(queue = false) { + getPlayerTimestamp() { this.#watchDestroyed(); - const previousTracksTime = this.previousTracks.length > 0 ? this.previousTracks.reduce((p, c) => p + c.durationMS, 0) : 0; - const currentStreamTime = queue ? previousTracksTime + this.streamTime : this.streamTime; - const totalTracksTime = this.totalTime; - const totalTime = queue ? previousTracksTime + totalTracksTime : this.current.durationMS; + const currentStreamTime = this.streamTime; + const totalTime = this.current.durationMS; const currentTimecode = Util.buildTimeCode(Util.parseMS(currentStreamTime)); const endTimecode = Util.buildTimeCode(Util.parseMS(totalTime)); - // why return { current: currentTimecode, end: endTimecode, @@ -548,15 +544,11 @@ class Queue { * @param {PlayerProgressbarOptions} options The progress bar options * @returns {string} */ - createProgressBar(options: PlayerProgressbarOptions = { timecodes: true, queue: false }) { + createProgressBar(options: PlayerProgressbarOptions = { timecodes: true }) { this.#watchDestroyed(); - const previousTracksTime = this.previousTracks.length > 0 ? this.previousTracks.reduce((p, c) => p + c.durationMS, 0) : 0; - const currentStreamTime = options.queue ? previousTracksTime + this.streamTime : this.streamTime; - const totalTracksTime = this.totalTime; - const totalTime = options.queue ? previousTracksTime + totalTracksTime : this.current.durationMS; const length = typeof options.length === "number" ? (options.length <= 0 || options.length === Infinity ? 15 : options.length) : 15; - const index = Math.round((currentStreamTime / totalTime) * length); + const index = Math.round((this.streamTime / this.current.durationMS) * length); const indicator = typeof options.indicator === "string" && options.indicator.length > 0 ? options.indicator : "🔘"; const line = typeof options.line === "string" && options.line.length > 0 ? options.line : "▬"; @@ -564,14 +556,14 @@ class Queue { const bar = line.repeat(length - 1).split(""); bar.splice(index, 0, indicator); if (options.timecodes) { - const timestamp = this.getPlayerTimestamp(options.queue); + const timestamp = this.getPlayerTimestamp(); return `${timestamp.current} ┃ ${bar.join("")} ┃ ${timestamp.end}`; } else { return `${bar.join("")}`; } } else { if (options.timecodes) { - const timestamp = this.getPlayerTimestamp(options.queue); + const timestamp = this.getPlayerTimestamp(); return `${timestamp.current} ┃ ${indicator}${line.repeat(length - 1)} ┃ ${timestamp.end}`; } else { return `${indicator}${line.repeat(length - 1)}`; diff --git a/src/types/types.ts b/src/types/types.ts index f37a494..7a40ce2 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -113,7 +113,6 @@ export interface TimeData { */ export interface PlayerProgressbarOptions { timecodes?: boolean; - queue?: boolean; length?: number; line?: string; indicator?: string; @@ -449,11 +448,11 @@ export interface PlaylistJSON { } /** - * @typedef {object} DiscordPlayerInitOptions + * @typedef {object} PlayerInitOptions * @property {boolean} [autoRegisterExtractor=true] If it should automatically register `@discord-player/extractor` * @property {YTDLDownloadOptions} [ytdlOptions={}] The options passed to `ytdl-core` */ -export interface DiscordPlayerInitOptions { +export interface PlayerInitOptions { autoRegisterExtractor?: boolean; ytdlOptions?: downloadOptions; } From eebc4b2c92c518cf0469d5a5e293ddbe9394d4e6 Mon Sep 17 00:00:00 2001 From: Snowflake107 <46562212+Snowflake107@users.noreply.github.com> Date: Mon, 5 Jul 2021 12:18:03 +0545 Subject: [PATCH 173/215] chore: remove unnecessary comment --- src/Player.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Player.ts b/src/Player.ts index 133c3bb..74cd482 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -398,7 +398,6 @@ class Player extends EventEmitter { const ytpl = await YouTube.getPlaylist(query).catch(Util.noop); if (!ytpl) return { playlist: null, tracks: [] }; - // @todo: better way of handling large playlists await ytpl.fetch().catch(Util.noop); const playlist: Playlist = new Playlist(this, { From aad30e3a9a4b456d246befef41935e4295e52b74 Mon Sep 17 00:00:00 2001 From: Snowflake107 <46562212+Snowflake107@users.noreply.github.com> Date: Mon, 5 Jul 2021 12:20:39 +0545 Subject: [PATCH 174/215] chore: bump @discordjs/voice --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 04cb4d7..fadd53a 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ }, "homepage": "https://discord-player.js.org", "dependencies": { - "@discordjs/voice": "0.5.0", + "@discordjs/voice": "^0.5.3", "discord-ytdl-core": "^5.0.4", "libsodium-wrappers": "^0.7.9", "soundcloud-scraper": "^5.0.0", diff --git a/yarn.lock b/yarn.lock index 97152c3..2170f76 100644 --- a/yarn.lock +++ b/yarn.lock @@ -973,10 +973,10 @@ "@discordjs/node-pre-gyp" "^0.4.0" node-addon-api "^3.2.1" -"@discordjs/voice@0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@discordjs/voice/-/voice-0.5.0.tgz#238d6f8c1dc7e30ff781edb08fb0540bca5aa23d" - integrity sha512-YPfY8ium1lExmRETz+vC4d3gGvHhGvWQMWLTOkNBoUkN6VyEpO/RVrL5EI+0qUefKAWwv2Gus/c7QM1xhAUwow== +"@discordjs/voice@^0.5.3": + version "0.5.3" + resolved "https://registry.yarnpkg.com/@discordjs/voice/-/voice-0.5.3.tgz#fbb1821b64d3dff1d379ec3821d632f1e11b95bb" + integrity sha512-We7rumaR6prv/nHavWQzo/4Qk8enROWJ0Y8Zpe5GwI8vRXxas0Tn+oiD7PE+VTmIAx3QyMuB3l26mHv7zydTdQ== dependencies: "@types/ws" "^7.4.4" discord-api-types "^0.18.1" From d9973cf316d7b3dc6efd16d897781ab2d8e5cb71 Mon Sep 17 00:00:00 2001 From: Snowflake107 <46562212+Snowflake107@users.noreply.github.com> Date: Mon, 5 Jul 2021 12:26:10 +0545 Subject: [PATCH 175/215] ci: deprecate old release --- .github/workflows/publish-dev.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish-dev.yml b/.github/workflows/publish-dev.yml index 1145c01..892b500 100644 --- a/.github/workflows/publish-dev.yml +++ b/.github/workflows/publish-dev.yml @@ -22,10 +22,15 @@ jobs: - name: Install dependencies run: npm install + - name: Deprecate old releases + run: npm deprecate discord-player@"~5.0.0-dev" "outdated version" || true + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_PUBLISH_TOKEN }} + - name: Publish run: | npx tsc --skipLibCheck - npm version --git-tag-version=false $(jq --raw-output '.version' package.json).$(git rev-parse --verify HEAD) + npm version --git-tag-version=false $(jq --raw-output '.version' package.json).$(git rev-parse --short HEAD).$(date +%s) npm publish --tag dev || true env: NODE_AUTH_TOKEN: ${{ secrets.npm_token }} From 5bad0fc3d4aef576a4220fd1961b96a918cd8290 Mon Sep 17 00:00:00 2001 From: Snowflake107 <46562212+Snowflake107@users.noreply.github.com> Date: Mon, 5 Jul 2021 12:31:39 +0545 Subject: [PATCH 176/215] ci: revert previous commit --- .github/workflows/publish-dev.yml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/.github/workflows/publish-dev.yml b/.github/workflows/publish-dev.yml index 892b500..1145c01 100644 --- a/.github/workflows/publish-dev.yml +++ b/.github/workflows/publish-dev.yml @@ -22,15 +22,10 @@ jobs: - name: Install dependencies run: npm install - - name: Deprecate old releases - run: npm deprecate discord-player@"~5.0.0-dev" "outdated version" || true - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_PUBLISH_TOKEN }} - - name: Publish run: | npx tsc --skipLibCheck - npm version --git-tag-version=false $(jq --raw-output '.version' package.json).$(git rev-parse --short HEAD).$(date +%s) + npm version --git-tag-version=false $(jq --raw-output '.version' package.json).$(git rev-parse --verify HEAD) npm publish --tag dev || true env: NODE_AUTH_TOKEN: ${{ secrets.npm_token }} From 245745b22c1d18d246efa70664a7991b89454eb3 Mon Sep 17 00:00:00 2001 From: Snowflake107 <46562212+Snowflake107@users.noreply.github.com> Date: Mon, 5 Jul 2021 13:08:56 +0545 Subject: [PATCH 177/215] refactor: xID to xId --- package.json | 2 +- src/Player.ts | 10 +++++----- yarn.lock | 38 ++++++++++++++++++++++++++------------ 3 files changed, 32 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index fadd53a..687bfec 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "@typescript-eslint/eslint-plugin": "^4.28.1", "@typescript-eslint/parser": "^4.28.1", "discord-api-types": "^0.18.1", - "discord.js": "13.0.0-dev.6d3d00b44577a70e840f0187d6894043677c5329", + "discord.js": "^13.0.0-dev.fe5d56c.1625443439", "eslint": "^7.30.0", "jsdoc-babel": "^0.5.0", "prettier": "^2.3.2", diff --git a/src/Player.ts b/src/Player.ts index 74cd482..7db8d73 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -69,11 +69,11 @@ class Player extends EventEmitter { const queue = this.getQueue(oldState.guild.id); if (!queue) return; - if (oldState.channelID && newState.channelID && oldState.channelID !== newState.channelID) { + if (oldState.channelId && newState.channelId && oldState.channelId !== newState.channelId) { queue.connection.channel = newState.channel; } - if (!oldState.channelID && newState.channelID && newState.member.id === newState.guild.me.id) { + if (!oldState.channelId && newState.channelId && newState.member.id === newState.guild.me.id) { if (newState.serverMute || !newState.serverMute) { queue.setPaused(newState.serverMute); } else if (newState.suppress || !newState.suppress) { @@ -82,7 +82,7 @@ class Player extends EventEmitter { } } - if (oldState.channelID === newState.channelID && oldState.member.id === newState.guild.me.id) { + if (oldState.channelId === newState.channelId && oldState.member.id === newState.guild.me.id) { if (oldState.serverMute !== newState.serverMute) { queue.setPaused(newState.serverMute); } else if (oldState.suppress !== newState.suppress) { @@ -91,14 +91,14 @@ class Player extends EventEmitter { } } - if (oldState.member.id === this.client.user.id && !newState.channelID) { + if (oldState.member.id === this.client.user.id && !newState.channelId) { queue.destroy(); return void this.emit("botDisconnect", queue); } if (!queue.options.leaveOnEmpty || !queue.connection || !queue.connection.channel) return; - if (!oldState.channelID || newState.channelID) { + if (!oldState.channelId || newState.channelId) { const emptyTimeout = queue._cooldownsTimeout.get(`empty_${oldState.guild.id}`); const channelEmpty = Util.isVoiceEmpty(queue.connection.channel); diff --git a/yarn.lock b/yarn.lock index 2170f76..ee79ce9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -936,6 +936,14 @@ node-fetch "^2.6.1" reverbnation-scraper "^2.0.0" +"@discordjs/builders@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-0.2.0.tgz#832c8d894aad13362db7a99f11a7826b21e4cd94" + integrity sha512-TVq7NZBCJrrTRc3CfxOr3IdgY5nrtqVxZ7qDUF1mN6LgxIiOldmFxsSwMrQBzLFVmOwqFyNLKCeblley8UpEuw== + dependencies: + discord-api-types "^0.18.1" + tslib "^2.3.0" + "@discordjs/collection@^0.1.6": version "0.1.6" resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-0.1.6.tgz#9e9a7637f4e4e0688fd8b2b5c63133c91607682c" @@ -1051,7 +1059,7 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@sapphire/async-queue@^1.1.2": +"@sapphire/async-queue@^1.1.4": version "1.1.4" resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.1.4.tgz#ae431310917a8880961cebe8e59df6ffa40f2957" integrity sha512-fFrlF/uWpGOX5djw5Mu2Hnnrunao75WGey0sP0J3jnhmrJ5TAPzHYOmytD5iN/+pMxS+f+u/gezqHa9tPhRHEA== @@ -1091,7 +1099,7 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.0.0.tgz#067a6c49dc7a5c2412a505628e26902ae967bf6f" integrity sha512-TmCW5HoZ2o2/z2EYi109jLqIaPIi9y/lc2LmDCWzuCi35bcaQ+OtUh6nwBiFK7SOu25FAU5+YKdqFZUwtqGSdg== -"@types/ws@^7.4.4", "@types/ws@^7.4.6": +"@types/ws@^7.4.4", "@types/ws@^7.4.5", "@types/ws@^7.4.6": version "7.4.6" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.6.tgz#c4320845e43d45a7129bb32905e28781c71c1fff" integrity sha512-ijZ1vzRawI7QoWnTNL8KpHixd2b2XVb9I9HAqI3triPsh1EC0xH0Eg6w2O3TKbDCgiNNlJqfrof6j4T2I+l9vw== @@ -2010,6 +2018,11 @@ discord-api-types@^0.18.1: resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.18.1.tgz#5d08ed1263236be9c21a22065d0e6b51f790f492" integrity sha512-hNC38R9ZF4uaujaZQtQfm5CdQO58uhdkoHQAVvMfIL0LgOSZeW575W8H6upngQOuoxWd8tiRII3LLJm9zuQKYg== +discord-api-types@^0.19.0-next.f393ba520d7d6d2aacaca7b3ca5d355fab614f6e: + version "0.19.0-next.f393ba520d7d6d2aacaca7b3ca5d355fab614f6e" + resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.19.0-next.f393ba520d7d6d2aacaca7b3ca5d355fab614f6e.tgz#d5f36f5712ec8fe2fe928b5c37618c94a3969d6a" + integrity sha512-ttRA/8e/WKHDbGFfED5WlS7gID+kalmNr6iMiWBCvkphQ7kFHiTOVbnj/zX9ksaRaYXp/I38SCQ+qZvLu8DJZg== + discord-ytdl-core@^5.0.4: version "5.0.4" resolved "https://registry.yarnpkg.com/discord-ytdl-core/-/discord-ytdl-core-5.0.4.tgz#84a2af1a8e8c235b4fc109b23350d12782ab66cd" @@ -2017,19 +2030,20 @@ discord-ytdl-core@^5.0.4: dependencies: prism-media "^1.2.9" -discord.js@13.0.0-dev.6d3d00b44577a70e840f0187d6894043677c5329: - version "13.0.0-dev.6d3d00b44577a70e840f0187d6894043677c5329" - resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0-dev.6d3d00b44577a70e840f0187d6894043677c5329.tgz#7593fc7d86651f65c4e1f6a67802b7b72c532695" - integrity sha512-K2jlMXX4cB8+/6CYh/QywULgUcMSJcR6CycEGnONeCskrejtArCUmiV8dKu20ABv3CeHWgTVN261BQWRTTelRg== +discord.js@^13.0.0-dev.fe5d56c.1625443439: + version "13.0.0-dev.fe5d56c.1625443439" + resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0-dev.fe5d56c.1625443439.tgz#702940225753d6f0a788e301ec63ede3ab35b7c4" + integrity sha512-vBpH/yJNhzG+iVMaJCJUSRC3xYXpvw3xNAmmYWyZoRguj5cylF/ELbF4O4V1xabFOTczoKV0vich6cwK/asgRw== dependencies: + "@discordjs/builders" "^0.2.0" "@discordjs/collection" "^0.1.6" "@discordjs/form-data" "^3.0.1" - "@sapphire/async-queue" "^1.1.2" - "@types/ws" "^7.4.4" + "@sapphire/async-queue" "^1.1.4" + "@types/ws" "^7.4.5" abort-controller "^3.0.0" - discord-api-types "^0.18.1" + discord-api-types "^0.19.0-next.f393ba520d7d6d2aacaca7b3ca5d355fab614f6e" node-fetch "^2.6.1" - ws "^7.4.6" + ws "^7.5.1" dmd@^4.0.5: version "4.0.6" @@ -4575,7 +4589,7 @@ tslib@^1.8.1, tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.2.0: +tslib@^2.2.0, tslib@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== @@ -4859,7 +4873,7 @@ ws@^7.4.4, ws@^7.4.5: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.1.tgz#44fc000d87edb1d9c53e51fbc69a0ac1f6871d66" integrity sha512-2c6faOUH/nhoQN6abwMloF7Iyl0ZS2E9HGtsiLrWn0zOOMWlhtDmdf/uihDt6jnuCxgtwGBNy6Onsoy2s2O2Ow== -ws@^7.4.6: +ws@^7.5.1: version "7.5.2" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.2.tgz#09cc8fea3bec1bc5ed44ef51b42f945be36900f6" integrity sha512-lkF7AWRicoB9mAgjeKbGqVUekLnSNO4VjKVnuPHpQeOxZOErX6BPXwJk70nFslRCEEA8EVW7ZjKwXaP9N+1sKQ== From 39f503a7e4af91d6b6a4e6da5fd816072b4fb94b Mon Sep 17 00:00:00 2001 From: Snowflake107 <46562212+Snowflake107@users.noreply.github.com> Date: Mon, 5 Jul 2021 13:11:06 +0545 Subject: [PATCH 178/215] refactor(example): xID to xId --- example/music-bot/index.js | 24 ++++++++++++------------ example/music-bot/package.json | 4 ++-- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/example/music-bot/index.js b/example/music-bot/index.js index a6c34df..c423924 100644 --- a/example/music-bot/index.js +++ b/example/music-bot/index.js @@ -153,13 +153,13 @@ client.on("messageCreate", async (message) => { }); client.on("interaction", async (interaction) => { - if (!interaction.isCommand() || !interaction.guildID) return; + if (!interaction.isCommand() || !interaction.guildId) return; if (!(interaction.member instanceof GuildMember) || !interaction.member.voice.channel) { return void interaction.reply({ content: "You are not in a voice channel!", ephemeral: true }); } - if (interaction.guild.me.voice.channelID && interaction.member.voice.channelID !== interaction.guild.me.voice.channelID) { + if (interaction.guild.me.voice.channelId && interaction.member.voice.channelId !== interaction.guild.me.voice.channelId) { return void interaction.reply({ content: "You are not in my voice channel!", ephemeral: true }); } @@ -182,7 +182,7 @@ client.on("interaction", async (interaction) => { try { if (!queue.connection) await queue.connect(interaction.member.voice.channel); } catch { - void player.deleteQueue(interaction.guildID); + void player.deleteQueue(interaction.guildId); return void interaction.followUp({ content: "Could not join your voice channel!" }); } @@ -191,7 +191,7 @@ client.on("interaction", async (interaction) => { if (!queue.playing) await queue.play(); } else if (interaction.commandName === "volume") { await interaction.defer(); - const queue = player.getQueue(interaction.guildID); + const queue = player.getQueue(interaction.guildId); if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); const vol = interaction.options.get("amount"); if (!vol) return void interaction.followUp({ content: `🎧 | Current volume is **${queue.volume}**%!` }); @@ -202,7 +202,7 @@ client.on("interaction", async (interaction) => { }); } else if (interaction.commandName === "skip") { await interaction.defer(); - const queue = player.getQueue(interaction.guildID); + const queue = player.getQueue(interaction.guildId); if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); const currentTrack = queue.current; const success = queue.skip(); @@ -211,7 +211,7 @@ client.on("interaction", async (interaction) => { }); } else if (interaction.commandName === "queue") { await interaction.defer(); - const queue = player.getQueue(interaction.guildID); + const queue = player.getQueue(interaction.guildId); if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); const currentTrack = queue.current; const tracks = queue.tracks.slice(0, 10).map((m, i) => { @@ -234,25 +234,25 @@ client.on("interaction", async (interaction) => { }); } else if (interaction.commandName === "pause") { await interaction.defer(); - const queue = player.getQueue(interaction.guildID); + const queue = player.getQueue(interaction.guildId); if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); const success = queue.setPaused(true); return void interaction.followUp({ content: success ? "⏸ | Paused!" : "❌ | Something went wrong!" }); } else if (interaction.commandName === "resume") { await interaction.defer(); - const queue = player.getQueue(interaction.guildID); + const queue = player.getQueue(interaction.guildId); if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); const success = queue.setPaused(false); return void interaction.followUp({ content: success ? "▶ | Resumed!" : "❌ | Something went wrong!" }); } else if (interaction.commandName === "stop") { await interaction.defer(); - const queue = player.getQueue(interaction.guildID); + const queue = player.getQueue(interaction.guildId); if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); queue.destroy(); return void interaction.followUp({ content: "🛑 | Stopped the player!" }); } else if (interaction.commandName === "np") { await interaction.defer(); - const queue = player.getQueue(interaction.guildID); + const queue = player.getQueue(interaction.guildId); if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); const progress = queue.createProgressBar(); const perc = queue.getPlayerTimestamp(); @@ -274,7 +274,7 @@ client.on("interaction", async (interaction) => { }); } else if (interaction.commandName === "loop") { await interaction.defer(); - const queue = player.getQueue(interaction.guildID); + const queue = player.getQueue(interaction.guildId); if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); const loopMode = interaction.options.get("mode").value; const success = queue.setRepeatMode(loopMode); @@ -282,7 +282,7 @@ client.on("interaction", async (interaction) => { return void interaction.followUp({ content: success ? `${mode} | Updated loop mode!` : "❌ | Could not update loop mode!" }); } else if (interaction.commandName === "bassboost") { await interaction.defer(); - const queue = player.getQueue(interaction.guildID); + const queue = player.getQueue(interaction.guildId); if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); await queue.setFilters({ bassboost: !queue.getFiltersEnabled().includes("bassboost"), diff --git a/example/music-bot/package.json b/example/music-bot/package.json index b45b2a4..48fc9a7 100644 --- a/example/music-bot/package.json +++ b/example/music-bot/package.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@discordjs/opus": "^0.5.3", - "discord-player": "^5.0.0-dev.b0fa95473878f59791f5ac373b747d9cf0592f08", - "discord.js": "^13.0.0-dev.6d3d00b44577a70e840f0187d6894043677c5329" + "discord-player": "^5.0.0-dev.5bad0fc.1625467720", + "discord.js": "^13.0.0-dev.fe5d56c.1625443439" } } From b4e2726438f072c44ea02390966b68618c677500 Mon Sep 17 00:00:00 2001 From: Snowflake107 <46562212+Snowflake107@users.noreply.github.com> Date: Mon, 5 Jul 2021 13:16:02 +0545 Subject: [PATCH 179/215] chore(example): bump discord-player --- example/music-bot/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/music-bot/package.json b/example/music-bot/package.json index 48fc9a7..b1c4af5 100644 --- a/example/music-bot/package.json +++ b/example/music-bot/package.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@discordjs/opus": "^0.5.3", - "discord-player": "^5.0.0-dev.5bad0fc.1625467720", + "discord-player": "^5.0.0-dev.39f503a.1625470163", "discord.js": "^13.0.0-dev.fe5d56c.1625443439" } } From 8ce04b387d0e6253fae97a80f4bf5485cdf2aba0 Mon Sep 17 00:00:00 2001 From: Snowflake107 <46562212+Snowflake107@users.noreply.github.com> Date: Mon, 5 Jul 2021 13:18:16 +0545 Subject: [PATCH 180/215] refactor(example): remove deprecated event listener --- example/music-bot/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/music-bot/index.js b/example/music-bot/index.js index c423924..21579bb 100644 --- a/example/music-bot/index.js +++ b/example/music-bot/index.js @@ -152,7 +152,7 @@ client.on("messageCreate", async (message) => { } }); -client.on("interaction", async (interaction) => { +client.on("interactionCreate", async (interaction) => { if (!interaction.isCommand() || !interaction.guildId) return; if (!(interaction.member instanceof GuildMember) || !interaction.member.voice.channel) { From 34d4abf4270d0c19bfd42d870954db60c2cdd67d Mon Sep 17 00:00:00 2001 From: Snowflake107 <46562212+Snowflake107@users.noreply.github.com> Date: Mon, 5 Jul 2021 22:59:51 +0545 Subject: [PATCH 181/215] refactor(static classes): extend null --- src/utils/QueryResolver.ts | 6 ++---- src/utils/Util.ts | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/utils/QueryResolver.ts b/src/utils/QueryResolver.ts index 2193e08..619d622 100644 --- a/src/utils/QueryResolver.ts +++ b/src/utils/QueryResolver.ts @@ -16,13 +16,11 @@ const attachmentRegex = /^(?:(?:https?|ftp):\/\/)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/\S*)?$/; // scary things above *sigh* -class QueryResolver { +class QueryResolver extends null { /** * Query resolver */ - constructor() { - throw new Error("Cannot instantiate static class!"); - } + private constructor() {} // eslint-disable-line @typescript-eslint/no-empty-function /** * Resolves the given search query diff --git a/src/utils/Util.ts b/src/utils/Util.ts index 471039c..e95894b 100644 --- a/src/utils/Util.ts +++ b/src/utils/Util.ts @@ -1,13 +1,11 @@ import { StageChannel, VoiceChannel } from "discord.js"; import { TimeData } from "../types/types"; -class Util { +class Util extends null { /** * Utils */ - constructor() { - throw new Error("Cannot instantiate static class"); - } + private constructor() { } // eslint-disable-line @typescript-eslint/no-empty-function /** * Creates duration string From cffa46a512d20b733569b536e05d3cbdbfe022c6 Mon Sep 17 00:00:00 2001 From: Snowflake107 <46562212+Snowflake107@users.noreply.github.com> Date: Mon, 5 Jul 2021 23:02:40 +0545 Subject: [PATCH 182/215] chore: format code --- src/utils/Util.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/Util.ts b/src/utils/Util.ts index e95894b..28b8faa 100644 --- a/src/utils/Util.ts +++ b/src/utils/Util.ts @@ -5,7 +5,7 @@ class Util extends null { /** * Utils */ - private constructor() { } // eslint-disable-line @typescript-eslint/no-empty-function + private constructor() {} // eslint-disable-line @typescript-eslint/no-empty-function /** * Creates duration string From 92a3409e4fdd87967013b1286b101f55e64ed64b Mon Sep 17 00:00:00 2001 From: Snowflake107 <46562212+Snowflake107@users.noreply.github.com> Date: Sat, 10 Jul 2021 15:46:45 +0545 Subject: [PATCH 183/215] bump deps --- package.json | 2 +- src/Structures/Queue.ts | 4 +- yarn.lock | 183 +++++++++++++++++++--------------------- 3 files changed, 92 insertions(+), 97 deletions(-) diff --git a/package.json b/package.json index 687bfec..94d251c 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "@typescript-eslint/eslint-plugin": "^4.28.1", "@typescript-eslint/parser": "^4.28.1", "discord-api-types": "^0.18.1", - "discord.js": "^13.0.0-dev.fe5d56c.1625443439", + "discord.js": "^13.0.0-dev.d6c43a5.1625875428", "eslint": "^7.30.0", "jsdoc-babel": "^0.5.0", "prettier": "^2.3.2", diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index aa32660..323113e 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -139,13 +139,13 @@ class Queue { async connect(channel: GuildChannelResolvable) { this.#watchDestroyed(); const _channel = this.guild.channels.resolve(channel) as StageChannel | VoiceChannel; - if (!["stage", "voice"].includes(_channel?.type)) throw new TypeError(`Channel type must be voice or stage, got ${_channel?.type}!`); + if (!["GUILD_STAGE_VOICE", "GUILD_VOICE"].includes(_channel?.type)) throw new TypeError(`Channel type must be GUILD_VOICE or GUILD_STAGE_VOICE, got ${_channel?.type}!`); const connection = await this.player.voiceUtils.connect(_channel, { deaf: this.options.autoSelfDeaf }); this.connection = connection; - if (_channel.type === "stage") { + if (_channel.type === "GUILD_STAGE_VOICE") { await _channel.guild.me.voice.setSuppressed(false).catch(async () => { return await _channel.guild.me.voice.setRequestToSpeak(true).catch(Util.noop); }); diff --git a/yarn.lock b/yarn.lock index ee79ce9..d515e7f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1052,9 +1052,9 @@ integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": - version "1.2.7" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.7.tgz#94c23db18ee4653e129abd26fb06f870ac9e1ee2" - integrity sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA== + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" @@ -1090,14 +1090,14 @@ integrity sha512-FTgBI767POY/lKNDNbIzgAX6miIDBs6NTCbdlDb8TrWovHsSvaVIZDlTqym29C6UqhzwcJx4CYr+AlrMywA0cA== "@types/json-schema@^7.0.7": - version "7.0.7" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" - integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== + version "7.0.8" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.8.tgz#edf1bf1dbf4e04413ca8e5b17b3b7d7d54b59818" + integrity sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg== "@types/node@*", "@types/node@^16.0.0": - version "16.0.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.0.0.tgz#067a6c49dc7a5c2412a505628e26902ae967bf6f" - integrity sha512-TmCW5HoZ2o2/z2EYi109jLqIaPIi9y/lc2LmDCWzuCi35bcaQ+OtUh6nwBiFK7SOu25FAU5+YKdqFZUwtqGSdg== + version "16.3.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.3.1.tgz#24691fa2b0c3ec8c0d34bfcfd495edac5593ebb4" + integrity sha512-N87VuQi7HEeRJkhzovao/JviiqKjDKMVKxKMfUvSKw+MbkbW8R0nA3fi/MQhhlxV2fQ+2ReM+/Nt4efdrJx3zA== "@types/ws@^7.4.4", "@types/ws@^7.4.5", "@types/ws@^7.4.6": version "7.4.6" @@ -1107,72 +1107,72 @@ "@types/node" "*" "@typescript-eslint/eslint-plugin@^4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.28.1.tgz#c045e440196ae45464e08e20c38aff5c3a825947" - integrity sha512-9yfcNpDaNGQ6/LQOX/KhUFTR1sCKH+PBr234k6hI9XJ0VP5UqGxap0AnNwBnWFk1MNyWBylJH9ZkzBXC+5akZQ== + version "4.28.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.28.2.tgz#7a8320f00141666813d0ae43b49ee8244f7cf92a" + integrity sha512-PGqpLLzHSxq956rzNGasO3GsAPf2lY9lDUBXhS++SKonglUmJypaUtcKzRtUte8CV7nruwnDxtLUKpVxs0wQBw== dependencies: - "@typescript-eslint/experimental-utils" "4.28.1" - "@typescript-eslint/scope-manager" "4.28.1" + "@typescript-eslint/experimental-utils" "4.28.2" + "@typescript-eslint/scope-manager" "4.28.2" debug "^4.3.1" functional-red-black-tree "^1.0.1" regexpp "^3.1.0" semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/experimental-utils@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.1.tgz#3869489dcca3c18523c46018b8996e15948dbadc" - integrity sha512-n8/ggadrZ+uyrfrSEchx3jgODdmcx7MzVM2sI3cTpI/YlfSm0+9HEUaWw3aQn2urL2KYlWYMDgn45iLfjDYB+Q== +"@typescript-eslint/experimental-utils@4.28.2": + version "4.28.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.2.tgz#4ebdec06a10888e9326e1d51d81ad52a361bd0b0" + integrity sha512-MwHPsL6qo98RC55IoWWP8/opTykjTp4JzfPu1VfO2Z0MshNP0UZ1GEV5rYSSnZSUI8VD7iHvtIPVGW5Nfh7klQ== dependencies: "@types/json-schema" "^7.0.7" - "@typescript-eslint/scope-manager" "4.28.1" - "@typescript-eslint/types" "4.28.1" - "@typescript-eslint/typescript-estree" "4.28.1" + "@typescript-eslint/scope-manager" "4.28.2" + "@typescript-eslint/types" "4.28.2" + "@typescript-eslint/typescript-estree" "4.28.2" eslint-scope "^5.1.1" eslint-utils "^3.0.0" "@typescript-eslint/parser@^4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.28.1.tgz#5181b81658414f47291452c15bf6cd44a32f85bd" - integrity sha512-UjrMsgnhQIIK82hXGaD+MCN8IfORS1CbMdu7VlZbYa8LCZtbZjJA26De4IPQB7XYZbL8gJ99KWNj0l6WD0guJg== + version "4.28.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.28.2.tgz#6aff11bf4b91eb67ca7517962eede951e9e2a15d" + integrity sha512-Q0gSCN51eikAgFGY+gnd5p9bhhCUAl0ERMiDKrTzpSoMYRubdB8MJrTTR/BBii8z+iFwz8oihxd0RAdP4l8w8w== dependencies: - "@typescript-eslint/scope-manager" "4.28.1" - "@typescript-eslint/types" "4.28.1" - "@typescript-eslint/typescript-estree" "4.28.1" + "@typescript-eslint/scope-manager" "4.28.2" + "@typescript-eslint/types" "4.28.2" + "@typescript-eslint/typescript-estree" "4.28.2" debug "^4.3.1" -"@typescript-eslint/scope-manager@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.28.1.tgz#fd3c20627cdc12933f6d98b386940d8d0ce8a991" - integrity sha512-o95bvGKfss6705x7jFGDyS7trAORTy57lwJ+VsYwil/lOUxKQ9tA7Suuq+ciMhJc/1qPwB3XE2DKh9wubW8YYA== +"@typescript-eslint/scope-manager@4.28.2": + version "4.28.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.28.2.tgz#451dce90303a3ce283750111495d34c9c204e510" + integrity sha512-MqbypNjIkJFEFuOwPWNDjq0nqXAKZvDNNs9yNseoGBB1wYfz1G0WHC2AVOy4XD7di3KCcW3+nhZyN6zruqmp2A== dependencies: - "@typescript-eslint/types" "4.28.1" - "@typescript-eslint/visitor-keys" "4.28.1" + "@typescript-eslint/types" "4.28.2" + "@typescript-eslint/visitor-keys" "4.28.2" -"@typescript-eslint/types@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.28.1.tgz#d0f2ecbef3684634db357b9bbfc97b94b828f83f" - integrity sha512-4z+knEihcyX7blAGi7O3Fm3O6YRCP+r56NJFMNGsmtdw+NCdpG5SgNz427LS9nQkRVTswZLhz484hakQwB8RRg== +"@typescript-eslint/types@4.28.2": + version "4.28.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.28.2.tgz#e6b9e234e0e9a66c4d25bab881661e91478223b5" + integrity sha512-Gr15fuQVd93uD9zzxbApz3wf7ua3yk4ZujABZlZhaxxKY8ojo448u7XTm/+ETpy0V0dlMtj6t4VdDvdc0JmUhA== -"@typescript-eslint/typescript-estree@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.1.tgz#af882ae41740d1f268e38b4d0fad21e7e8d86a81" - integrity sha512-GhKxmC4sHXxHGJv8e8egAZeTZ6HI4mLU6S7FUzvFOtsk7ZIDN1ksA9r9DyOgNqowA9yAtZXV0Uiap61bIO81FQ== +"@typescript-eslint/typescript-estree@4.28.2": + version "4.28.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.2.tgz#680129b2a285289a15e7c6108c84739adf3a798c" + integrity sha512-86lLstLvK6QjNZjMoYUBMMsULFw0hPHJlk1fzhAVoNjDBuPVxiwvGuPQq3fsBMCxuDJwmX87tM/AXoadhHRljg== dependencies: - "@typescript-eslint/types" "4.28.1" - "@typescript-eslint/visitor-keys" "4.28.1" + "@typescript-eslint/types" "4.28.2" + "@typescript-eslint/visitor-keys" "4.28.2" debug "^4.3.1" globby "^11.0.3" is-glob "^4.0.1" semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/visitor-keys@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.1.tgz#162a515ee255f18a6068edc26df793cdc1ec9157" - integrity sha512-K4HMrdFqr9PFquPu178SaSb92CaWe2yErXyPumc8cYWxFmhgJsNY9eSePmO05j0JhBvf2Cdhptd6E6Yv9HVHcg== +"@typescript-eslint/visitor-keys@4.28.2": + version "4.28.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.2.tgz#bf56a400857bb68b59b311e6d0a5fbef5c3b5130" + integrity sha512-aT2B4PLyyRDUVUafXzpZFoc0C9t0za4BJAKP5sgWIhG+jHECQZUEjuQSCIwZdiJJ4w4cgu5r3Kh20SOdtEBl0w== dependencies: - "@typescript-eslint/types" "4.28.1" + "@typescript-eslint/types" "4.28.2" eslint-visitor-keys "^2.0.0" abab@^2.0.3, abab@^2.0.5: @@ -1201,9 +1201,9 @@ acorn-globals@^6.0.0: acorn-walk "^7.1.1" acorn-jsx@^5.2.0, acorn-jsx@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" - integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^7.1.1: version "7.2.0" @@ -1238,9 +1238,9 @@ ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4: uri-js "^4.2.2" ajv@^8.0.1: - version "8.6.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.0.tgz#60cc45d9c46a477d80d92c48076d972c342e5720" - integrity sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ== + version "8.6.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.1.tgz#ae65764bf1edde8cd861281cda5057852364a295" + integrity sha512-42VLtQUOLefAvKFAQIxIZDaThq6om/PrfP0CYk3/vn+y4BMNkKnbli8ON2QCiHov4KkzOSJ/xSoBJdayiiYvVQ== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -1591,9 +1591,9 @@ camelcase@^5.0.0: integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== caniuse-lite@^1.0.30001219: - version "1.0.30001241" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001241.tgz#cd3fae47eb3d7691692b406568d7a3e5b23c7598" - integrity sha512-1uoSZ1Pq1VpH0WerIMqwptXHNNGfdl7d1cJUFs80CwQ/lVzdhTvsFZCeNFslze7AjsQnb4C85tzclPa1VShbeQ== + version "1.0.30001243" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001243.tgz#d9250155c91e872186671c523f3ae50cfc94a3aa" + integrity sha512-vNxw9mkTBtkmLFnJRv/2rhs1yufpDfCkBZexG3Y0xdOH2Z/eE/85E4Dl5j1YUN34nZVsSp6vVRFQRrez9wJMRA== catharsis@^0.9.0: version "0.9.0" @@ -1919,9 +1919,9 @@ data-urls@^2.0.0: whatwg-url "^8.0.0" debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== dependencies: ms "2.1.2" @@ -2030,10 +2030,10 @@ discord-ytdl-core@^5.0.4: dependencies: prism-media "^1.2.9" -discord.js@^13.0.0-dev.fe5d56c.1625443439: - version "13.0.0-dev.fe5d56c.1625443439" - resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0-dev.fe5d56c.1625443439.tgz#702940225753d6f0a788e301ec63ede3ab35b7c4" - integrity sha512-vBpH/yJNhzG+iVMaJCJUSRC3xYXpvw3xNAmmYWyZoRguj5cylF/ELbF4O4V1xabFOTczoKV0vich6cwK/asgRw== +discord.js@^13.0.0-dev.d6c43a5.1625875428: + version "13.0.0-dev.d6c43a5.1625875428" + resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0-dev.d6c43a5.1625875428.tgz#e8d963b33d18c7af77098e5fc6ef719972e73242" + integrity sha512-mTW3MpURf2QMjZe1O/H8owreUZttTfDyGY48Ka79l3GIJIHXOKx+hxv+yI5ve5GWF2ie6z8MPQ4hHqlTHk8OKg== dependencies: "@discordjs/builders" "^0.2.0" "@discordjs/collection" "^0.1.6" @@ -2108,9 +2108,9 @@ domutils@^2.5.2, domutils@^2.6.0, domutils@^2.7.0: domhandler "^4.2.0" electron-to-chromium@^1.3.723: - version "1.3.766" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.766.tgz#2fd14a4e54f77665872f4e23fcf4968e83638220" - integrity sha512-u2quJ862q9reRKh/je3GXis3w38+RoXH1J9N3XjtsS6NzmUAosNsyZgUVFZPN/ZlJ3v6T0rTyZR3q/J5c6Sy5w== + version "1.3.772" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.772.tgz#fd1ed39f9f3149f62f581734e4f026e600369479" + integrity sha512-X/6VRCXWALzdX+RjCtBU6cyg8WZgoxm9YA02COmDOiNJEZ59WkQggDbWZ4t/giHi/3GS+cvdrP6gbLISANAGYA== emoji-regex@^7.0.1: version "7.0.3" @@ -2413,9 +2413,9 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.1.1: - version "3.2.6" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.6.tgz#434dd9529845176ea049acc9343e8282765c6e1a" - integrity sha512-GnLuqj/pvQ7pX8/L4J84nijv6sAnlwvSDpMkJi9i7nPmPxGtRPkBSStfvDW5l6nMdX9VWe+pkKWFTgD+vF2QSQ== + version "3.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -2434,9 +2434,9 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fastq@^1.6.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858" - integrity sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g== + version "1.11.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.1.tgz#5d8175aae17db61947f8b162cfc7f63264d22807" + integrity sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw== dependencies: reusify "^1.0.4" @@ -2531,9 +2531,9 @@ flatted@^2.0.0: integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== flatted@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.0.tgz#da07fb8808050aba6fdeac2294542e5043583f05" - integrity sha512-XprP7lDrVT+kE2c2YlfiV+IfS9zxukiIOvNamPNsImNhXadSsQEbosItdL9bUQlCZXR13SvPk20BjWSWLA7m4A== + version "3.2.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.1.tgz#bbef080d95fca6709362c73044a1634f7c6e7d05" + integrity sha512-OMQjaErSFHmHqZe+PSidH5n8j3O0F2DdnVh8JB4j4eUQ2k6KvB0qGfrKIhapvez5JerBbmWkaLYUYWISaESoXg== follow-redirects@^1.10.0: version "1.14.1" @@ -2676,9 +2676,9 @@ globals@^12.1.0: type-fest "^0.8.1" globals@^13.6.0, globals@^13.9.0: - version "13.9.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.9.0.tgz#4bf2bf635b334a173fb1daf7c5e6b218ecdc06cb" - integrity sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA== + version "13.10.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.10.0.tgz#60ba56c3ac2ca845cfbf4faeca727ad9dd204676" + integrity sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g== dependencies: type-fest "^0.20.2" @@ -3479,9 +3479,9 @@ mixin-deep@^1.2.0: is-extendable "^1.0.1" mkdirp2@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp2/-/mkdirp2-1.0.4.tgz#56de1f8f5c93cf2199906362eba0f9f262ee4437" - integrity sha512-Q2PKB4ZR4UPtjLl76JfzlgSCUZhSV1AXQgAZa1qt5RiaALFjP/CDrGvFBrOz7Ck6McPcwMAxTsJvWOUjOU8XMw== + version "1.0.5" + resolved "https://registry.yarnpkg.com/mkdirp2/-/mkdirp2-1.0.5.tgz#68bbe61defefafce4b48948608ec0bac942512c2" + integrity sha512-xOE9xbICroUDmG1ye2h4bZ8WBie9EGmACaco8K8cx6RlkJJrxGIqjGqztAI+NMhexXBcdGbSEzI6N3EJPevxZw== mkdirp@^0.5.1: version "0.5.5" @@ -4569,9 +4569,9 @@ tr46@^2.1.0: punycode "^2.1.1" ts-node@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.0.0.tgz#05f10b9a716b0b624129ad44f0ea05dac84ba3be" - integrity sha512-ROWeOIUvfFbPZkoDis0L/55Fk+6gFQNZwwKPLinacRl6tsxstTF1DbAcLKkovwnpKMVvOMHP1TIbnwXwtLg1gg== + version "10.1.0" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.1.0.tgz#e656d8ad3b61106938a867f69c39a8ba6efc966e" + integrity sha512-6szn3+J9WyG2hE+5W8e0ruZrzyk1uFLYye6IGMBadnOzDh8aP7t8CbFpsfCiEx2+wMixAhjFt7lOZC4+l+WbEA== dependencies: "@tsconfig/node10" "^1.0.7" "@tsconfig/node12" "^1.0.7" @@ -4868,15 +4868,10 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -ws@^7.4.4, ws@^7.4.5: - version "7.5.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.1.tgz#44fc000d87edb1d9c53e51fbc69a0ac1f6871d66" - integrity sha512-2c6faOUH/nhoQN6abwMloF7Iyl0ZS2E9HGtsiLrWn0zOOMWlhtDmdf/uihDt6jnuCxgtwGBNy6Onsoy2s2O2Ow== - -ws@^7.5.1: - version "7.5.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.2.tgz#09cc8fea3bec1bc5ed44ef51b42f945be36900f6" - integrity sha512-lkF7AWRicoB9mAgjeKbGqVUekLnSNO4VjKVnuPHpQeOxZOErX6BPXwJk70nFslRCEEA8EVW7ZjKwXaP9N+1sKQ== +ws@^7.4.4, ws@^7.4.5, ws@^7.5.1: + version "7.5.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" + integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== xml-name-validator@^3.0.0: version "3.0.0" From 399105eec98c58cdf34a006e495f98742ba98d50 Mon Sep 17 00:00:00 2001 From: DevAndromeda <46562212+DevAndromeda@users.noreply.github.com> Date: Wed, 21 Jul 2021 11:12:40 +0545 Subject: [PATCH 184/215] feat(Queue): add bufferingTimeout --- package.json | 6 +++--- src/Structures/Queue.ts | 18 +++++++++++++---- src/types/types.ts | 2 ++ yarn.lock | 43 ++++++++++++++++++++++++----------------- 4 files changed, 44 insertions(+), 25 deletions(-) diff --git a/package.json b/package.json index 94d251c..48ccacf 100644 --- a/package.json +++ b/package.json @@ -52,14 +52,14 @@ }, "homepage": "https://discord-player.js.org", "dependencies": { - "@discordjs/voice": "^0.5.3", + "@discordjs/voice": "^0.5.4", "discord-ytdl-core": "^5.0.4", "libsodium-wrappers": "^0.7.9", "soundcloud-scraper": "^5.0.0", "spotify-url-info": "^2.2.3", "tiny-typed-emitter": "^2.0.3", "youtube-sr": "^4.1.7", - "ytdl-core": "^4.8.3" + "ytdl-core": "^4.9.0" }, "devDependencies": { "@babel/cli": "^7.14.5", @@ -74,7 +74,7 @@ "@typescript-eslint/eslint-plugin": "^4.28.1", "@typescript-eslint/parser": "^4.28.1", "discord-api-types": "^0.18.1", - "discord.js": "^13.0.0-dev.d6c43a5.1625875428", + "discord.js": "^13.0.0-dev.1e90be8.1626825831", "eslint": "^7.30.0", "jsdoc-babel": "^0.5.0", "prettier": "^2.3.2", diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 323113e..aa18865 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -99,7 +99,8 @@ class Queue { leaveOnEmptyCooldown: 1000, autoSelfDeaf: true, ytdlOptions: {}, - initialVolume: 100 + initialVolume: 100, + bufferingTimeout: 1000 } as PlayerOptions, options ); @@ -644,9 +645,11 @@ class Queue { if (options.seek) this._streamTime = options.seek; this._filtersUpdate = options.filtersUpdate; - this.connection.playStream(resource).then(() => { - this.setVolume(this.options.initialVolume); - }); + setTimeout(() => { + this.connection.playStream(resource).then(() => { + this.setVolume(this.options.initialVolume); + }); + }, this.#getBufferingTimeout()); } /** @@ -717,6 +720,13 @@ class Queue { #watchDestroyed() { if (this.#destroyed) throw new Error("Cannot use destroyed queue"); } + + #getBufferingTimeout() { + const timeout = this.options.bufferingTimeout; + + if (isNaN(timeout) || timeout < 0 || !Number.isFinite(timeout)) return 1000; + return timeout; + } } export { Queue }; diff --git a/src/types/types.ts b/src/types/types.ts index 7a40ce2..8b1d470 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -127,6 +127,7 @@ export interface PlayerProgressbarOptions { * @property {boolean} [autoSelfDeaf=true] If it should set the bot in deaf mode * @property {YTDLDownloadOptions} [ytdlOptions={}] The youtube download options * @property {number} [initialVolume=100] The initial player volume + * @property {number} [bufferingTimeout=1000] Buffering timeout for the stream */ export interface PlayerOptions { leaveOnEnd?: boolean; @@ -136,6 +137,7 @@ export interface PlayerOptions { autoSelfDeaf?: boolean; ytdlOptions?: downloadOptions; initialVolume?: number; + bufferingTimeout?: number; } /** diff --git a/yarn.lock b/yarn.lock index d515e7f..7e85724 100644 --- a/yarn.lock +++ b/yarn.lock @@ -981,10 +981,10 @@ "@discordjs/node-pre-gyp" "^0.4.0" node-addon-api "^3.2.1" -"@discordjs/voice@^0.5.3": - version "0.5.3" - resolved "https://registry.yarnpkg.com/@discordjs/voice/-/voice-0.5.3.tgz#fbb1821b64d3dff1d379ec3821d632f1e11b95bb" - integrity sha512-We7rumaR6prv/nHavWQzo/4Qk8enROWJ0Y8Zpe5GwI8vRXxas0Tn+oiD7PE+VTmIAx3QyMuB3l26mHv7zydTdQ== +"@discordjs/voice@^0.5.4": + version "0.5.4" + resolved "https://registry.yarnpkg.com/@discordjs/voice/-/voice-0.5.4.tgz#02af74778177be8f42772118ba2193af481f442e" + integrity sha512-CLkJH1YXHhLyocvwAgIJBeyCe3iBVvg6pDPcJUEAwg09TykjJRH6qSpg2ly858WffzR7jOsLcliODAOMDwKtnA== dependencies: "@types/ws" "^7.4.4" discord-api-types "^0.18.1" @@ -1099,13 +1099,20 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.3.1.tgz#24691fa2b0c3ec8c0d34bfcfd495edac5593ebb4" integrity sha512-N87VuQi7HEeRJkhzovao/JviiqKjDKMVKxKMfUvSKw+MbkbW8R0nA3fi/MQhhlxV2fQ+2ReM+/Nt4efdrJx3zA== -"@types/ws@^7.4.4", "@types/ws@^7.4.5", "@types/ws@^7.4.6": +"@types/ws@^7.4.4", "@types/ws@^7.4.6": version "7.4.6" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.6.tgz#c4320845e43d45a7129bb32905e28781c71c1fff" integrity sha512-ijZ1vzRawI7QoWnTNL8KpHixd2b2XVb9I9HAqI3triPsh1EC0xH0Eg6w2O3TKbDCgiNNlJqfrof6j4T2I+l9vw== dependencies: "@types/node" "*" +"@types/ws@^7.4.5": + version "7.4.7" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" + integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== + dependencies: + "@types/node" "*" + "@typescript-eslint/eslint-plugin@^4.28.1": version "4.28.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.28.2.tgz#7a8320f00141666813d0ae43b49ee8244f7cf92a" @@ -2018,10 +2025,10 @@ discord-api-types@^0.18.1: resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.18.1.tgz#5d08ed1263236be9c21a22065d0e6b51f790f492" integrity sha512-hNC38R9ZF4uaujaZQtQfm5CdQO58uhdkoHQAVvMfIL0LgOSZeW575W8H6upngQOuoxWd8tiRII3LLJm9zuQKYg== -discord-api-types@^0.19.0-next.f393ba520d7d6d2aacaca7b3ca5d355fab614f6e: - version "0.19.0-next.f393ba520d7d6d2aacaca7b3ca5d355fab614f6e" - resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.19.0-next.f393ba520d7d6d2aacaca7b3ca5d355fab614f6e.tgz#d5f36f5712ec8fe2fe928b5c37618c94a3969d6a" - integrity sha512-ttRA/8e/WKHDbGFfED5WlS7gID+kalmNr6iMiWBCvkphQ7kFHiTOVbnj/zX9ksaRaYXp/I38SCQ+qZvLu8DJZg== +discord-api-types@^0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.19.0.tgz#86ba8021b29190cf860e90a2bc3e29b1d7aab3ba" + integrity sha512-t2HKLd43Lbe+rf+ffYfKVv9Kk5f6p7sFqvO6CMV55ZB0PgZv8WigCkt9FoJciYo5S3Q6CGYK+WnE/ZG+6vkBDQ== discord-ytdl-core@^5.0.4: version "5.0.4" @@ -2030,10 +2037,10 @@ discord-ytdl-core@^5.0.4: dependencies: prism-media "^1.2.9" -discord.js@^13.0.0-dev.d6c43a5.1625875428: - version "13.0.0-dev.d6c43a5.1625875428" - resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0-dev.d6c43a5.1625875428.tgz#e8d963b33d18c7af77098e5fc6ef719972e73242" - integrity sha512-mTW3MpURf2QMjZe1O/H8owreUZttTfDyGY48Ka79l3GIJIHXOKx+hxv+yI5ve5GWF2ie6z8MPQ4hHqlTHk8OKg== +discord.js@^13.0.0-dev.1e90be8.1626825831: + version "13.0.0-dev.1e90be8.1626825831" + resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0-dev.1e90be8.1626825831.tgz#2acfc7a95482863f4bafbe54464392f8d4a8ed3d" + integrity sha512-Kv32vfxiqHzSB4HY1MfHdvf868toZde86sPOCBhvmLbKZo5XaiZKMuZgfAUv7pBriNNTA0FtKoIid/2BqjuZqg== dependencies: "@discordjs/builders" "^0.2.0" "@discordjs/collection" "^0.1.6" @@ -2041,7 +2048,7 @@ discord.js@^13.0.0-dev.d6c43a5.1625875428: "@sapphire/async-queue" "^1.1.4" "@types/ws" "^7.4.5" abort-controller "^3.0.0" - discord-api-types "^0.19.0-next.f393ba520d7d6d2aacaca7b3ca5d355fab614f6e" + discord-api-types "^0.19.0" node-fetch "^2.6.1" ws "^7.5.1" @@ -4935,10 +4942,10 @@ youtube-sr@^4.1.7: dependencies: node-fetch "^2.6.1" -ytdl-core@^4.8.3: - version "4.8.3" - resolved "https://registry.yarnpkg.com/ytdl-core/-/ytdl-core-4.8.3.tgz#21570d1834db13dec7828cf87bbf4c83c0fe68d7" - integrity sha512-cWCBeX4FCgjcKmuVK384MT582RIAakpUSeMF/NPVmhO8cWiG+LeQLnBordvLolb0iXYzfUvalgmycYAE5Sy6Xw== +ytdl-core@^4.9.0: + version "4.9.0" + resolved "https://registry.yarnpkg.com/ytdl-core/-/ytdl-core-4.9.0.tgz#d166f6e7ab7c2ac344ada9568f507af1255c6406" + integrity sha512-pfuWqEIrP3iYqz5jOMmaz9m+DAzfQpt8X1jmzoOsPdYWrLMV4ml7+p/zhDi0F8IF90i4Jmd0Pq0W1awnKDatKg== dependencies: m3u8stream "^0.8.3" miniget "^4.0.0" From 30ccaeaa126274fd72dfc200e95a738afae24cde Mon Sep 17 00:00:00 2001 From: L0SER <65214509+L0SER8228@users.noreply.github.com> Date: Mon, 26 Jul 2021 09:14:21 +0530 Subject: [PATCH 185/215] Update Queue.ts --- src/Structures/Queue.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index aa18865..fabe0b3 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -169,6 +169,8 @@ class Queue { this._streamTime = 0; if (resource && resource.metadata) this.previousTracks.push(resource.metadata); + this.player.emit("trackEnd", this, resource.metadata); + if (!this.tracks.length && this.repeatMode === QueueRepeatMode.OFF) { if (this.options.leaveOnEnd) this.destroy(); this.player.emit("queueEnd", this); From ebf8e8cb04651b607a6b4e5edc0fe086526ee892 Mon Sep 17 00:00:00 2001 From: DevAndromeda <46562212+DevAndromeda@users.noreply.github.com> Date: Thu, 5 Aug 2021 14:27:49 +0545 Subject: [PATCH 186/215] refactor(VoiceInterface): remove unnecessary adapter creator --- package.json | 32 +- src/VoiceInterface/AdapterCreator.ts | 62 ---- src/VoiceInterface/VoiceUtils.ts | 4 +- src/index.ts | 1 - tsconfig.json | 3 +- yarn.lock | 533 +++++++++++++++++++-------- 6 files changed, 395 insertions(+), 240 deletions(-) delete mode 100644 src/VoiceInterface/AdapterCreator.ts diff --git a/package.json b/package.json index 48ccacf..a11cc41 100644 --- a/package.json +++ b/package.json @@ -52,34 +52,34 @@ }, "homepage": "https://discord-player.js.org", "dependencies": { - "@discordjs/voice": "^0.5.4", + "@discordjs/voice": "^0.5.5", "discord-ytdl-core": "^5.0.4", "libsodium-wrappers": "^0.7.9", - "soundcloud-scraper": "^5.0.0", + "soundcloud-scraper": "^5.0.1", "spotify-url-info": "^2.2.3", - "tiny-typed-emitter": "^2.0.3", + "tiny-typed-emitter": "^2.1.0", "youtube-sr": "^4.1.7", - "ytdl-core": "^4.9.0" + "ytdl-core": "^4.9.1" }, "devDependencies": { - "@babel/cli": "^7.14.5", - "@babel/core": "^7.14.6", - "@babel/preset-env": "^7.14.7", - "@babel/preset-typescript": "^7.14.5", + "@babel/cli": "^7.14.8", + "@babel/core": "^7.15.0", + "@babel/preset-env": "^7.15.0", + "@babel/preset-typescript": "^7.15.0", "@devsnowflake/docgen": "devsnowflake/docgen#ts-patch", "@discord-player/extractor": "^3.0.2", "@discordjs/opus": "^0.5.3", - "@types/node": "^16.0.0", - "@types/ws": "^7.4.6", - "@typescript-eslint/eslint-plugin": "^4.28.1", - "@typescript-eslint/parser": "^4.28.1", - "discord-api-types": "^0.18.1", - "discord.js": "^13.0.0-dev.1e90be8.1626825831", - "eslint": "^7.30.0", + "@types/node": "^16.4.12", + "@types/ws": "^7.4.7", + "@typescript-eslint/eslint-plugin": "^4.29.0", + "@typescript-eslint/parser": "^4.29.0", + "discord-api-types": "^0.22.0", + "discord.js": "^13.0.0-dev.t1628124537.3eb4140", + "eslint": "^7.32.0", "jsdoc-babel": "^0.5.0", "prettier": "^2.3.2", "rimraf": "^3.0.2", - "ts-node": "^10.0.0", + "ts-node": "^10.1.0", "typescript": "^4.3.5" } } diff --git a/src/VoiceInterface/AdapterCreator.ts b/src/VoiceInterface/AdapterCreator.ts deleted file mode 100644 index cc7d4c7..0000000 --- a/src/VoiceInterface/AdapterCreator.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { DiscordGatewayAdapterCreator, DiscordGatewayAdapterLibraryMethods } from "@discordjs/voice"; -import { VoiceChannel, Snowflake, Client, Constants, WebSocketShard, Guild, StageChannel } from "discord.js"; -import { GatewayVoiceServerUpdateDispatchData, GatewayVoiceStateUpdateDispatchData } from "discord-api-types/v8"; - -const adapters = new Map(); -const trackedClients = new Set(); - -function trackClient(client: Client) { - if (trackedClients.has(client)) return; - trackedClients.add(client); - client.ws.on(Constants.WSEvents.VOICE_SERVER_UPDATE, (payload: GatewayVoiceServerUpdateDispatchData) => { - adapters.get(payload.guild_id)?.onVoiceServerUpdate(payload); - }); - client.ws.on(Constants.WSEvents.VOICE_STATE_UPDATE, (payload: GatewayVoiceStateUpdateDispatchData) => { - if (payload.guild_id && payload.session_id && payload.user_id === client.user?.id) { - adapters.get(payload.guild_id)?.onVoiceStateUpdate(payload); - } - }); -} - -const trackedGuilds = new Map>(); - -function cleanupGuilds(shard: WebSocketShard) { - const guilds = trackedGuilds.get(shard); - if (guilds) { - for (const guildID of guilds.values()) { - adapters.get(guildID)?.destroy(); - } - } -} - -function trackGuild(guild: Guild) { - let guilds = trackedGuilds.get(guild.shard); - if (!guilds) { - const cleanup = () => cleanupGuilds(guild.shard); - guild.shard.on("close", cleanup); - guild.shard.on("destroyed", cleanup); - guilds = new Set(); - trackedGuilds.set(guild.shard, guilds); - } - guilds.add(guild.id); -} - -export function VoiceAdapterCreator(channel: VoiceChannel | StageChannel): DiscordGatewayAdapterCreator { - return (methods) => { - adapters.set(channel.guild.id, methods); - trackClient(channel.client); - trackGuild(channel.guild); - return { - sendPayload(data) { - if (channel.guild.shard.status === Constants.Status.READY) { - channel.guild.shard.send(data); - return true; - } - return false; - }, - destroy() { - return adapters.delete(channel.guild.id); - } - }; - }; -} diff --git a/src/VoiceInterface/VoiceUtils.ts b/src/VoiceInterface/VoiceUtils.ts index 5d34a7f..df02948 100644 --- a/src/VoiceInterface/VoiceUtils.ts +++ b/src/VoiceInterface/VoiceUtils.ts @@ -1,7 +1,6 @@ import { VoiceChannel, StageChannel, Collection, Snowflake } from "discord.js"; import { DiscordGatewayAdapterCreator, entersState, joinVoiceChannel, VoiceConnection, VoiceConnectionStatus } from "@discordjs/voice"; import { StreamDispatcher } from "./StreamDispatcher"; -import { VoiceAdapterCreator } from "./AdapterCreator"; class VoiceUtils { public cache: Collection; @@ -48,13 +47,12 @@ class VoiceUtils { options?: { deaf?: boolean; maxTime?: number; - adapter?: DiscordGatewayAdapterCreator; } ) { let conn = joinVoiceChannel({ guildId: channel.guild.id, channelId: channel.id, - adapterCreator: options.adapter ?? (channel.guild as any).voiceAdapterCreator ?? VoiceAdapterCreator(channel), // eslint-disable-line @typescript-eslint/no-explicit-any + adapterCreator: channel.guild.voiceAdapterCreator as unknown as DiscordGatewayAdapterCreator, selfDeaf: Boolean(options.deaf) }); diff --git a/src/index.ts b/src/index.ts index 2b68008..15e1309 100644 --- a/src/index.ts +++ b/src/index.ts @@ -8,5 +8,4 @@ export { Track } from "./Structures/Track"; export { Util } from "./utils/Util"; export { VoiceUtils } from "./VoiceInterface/VoiceUtils"; export { VoiceEvents, StreamDispatcher } from "./VoiceInterface/StreamDispatcher"; -export { VoiceAdapterCreator } from "./VoiceInterface/AdapterCreator"; export * from "./types/types"; diff --git a/tsconfig.json b/tsconfig.json index cab97f8..ec220f2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,7 +7,8 @@ "strict": true, "strictNullChecks": false, "esModuleInterop": true, - "pretty": true + "pretty": true, + "skipLibCheck": true }, "include": [ "src/**/*" diff --git a/yarn.lock b/yarn.lock index 7e85724..d4cadab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@babel/cli@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.14.5.tgz#9551b194f02360729de6060785bbdcce52c69f0a" - integrity sha512-poegjhRvXHWO0EAsnYajwYZuqcz7gyfxwfaecUESxDujrqOivf3zrjFbub8IJkrqEaz3fvJWh001EzxBub54fg== +"@babel/cli@^7.14.8": + version "7.14.8" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.14.8.tgz#fac73c0e2328a8af9fd3560c06b096bfa3730933" + integrity sha512-lcy6Lymft9Rpfqmrqdd4oTDdUx9ZwaAhAfywVrHG4771Pa6PPT0danJ1kDHBXYqh4HHSmIdA+nlmfxfxSDPtBg== dependencies: commander "^4.0.1" convert-source-map "^1.1.0" @@ -37,20 +37,25 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.7.tgz#7b047d7a3a89a67d2258dc61f604f098f1bc7e08" integrity sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw== -"@babel/core@^7.14.6": - version "7.14.6" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.6.tgz#e0814ec1a950032ff16c13a2721de39a8416fcab" - integrity sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA== +"@babel/compat-data@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" + integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== + +"@babel/core@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.0.tgz#749e57c68778b73ad8082775561f67f5196aafa8" + integrity sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw== dependencies: "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.14.5" - "@babel/helper-compilation-targets" "^7.14.5" - "@babel/helper-module-transforms" "^7.14.5" - "@babel/helpers" "^7.14.6" - "@babel/parser" "^7.14.6" + "@babel/generator" "^7.15.0" + "@babel/helper-compilation-targets" "^7.15.0" + "@babel/helper-module-transforms" "^7.15.0" + "@babel/helpers" "^7.14.8" + "@babel/parser" "^7.15.0" "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" + "@babel/traverse" "^7.15.0" + "@babel/types" "^7.15.0" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -67,6 +72,24 @@ jsesc "^2.5.1" source-map "^0.5.0" +"@babel/generator@^7.14.8": + version "7.14.8" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.8.tgz#bf86fd6af96cf3b74395a8ca409515f89423e070" + integrity sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg== + dependencies: + "@babel/types" "^7.14.8" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/generator@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.0.tgz#a7d0c172e0d814974bad5aa77ace543b97917f15" + integrity sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ== + dependencies: + "@babel/types" "^7.15.0" + jsesc "^2.5.1" + source-map "^0.5.0" + "@babel/helper-annotate-as-pure@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz#7bf478ec3b71726d56a8ca5775b046fc29879e61" @@ -92,7 +115,17 @@ browserslist "^4.16.6" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.14.6": +"@babel/helper-compilation-targets@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz#973df8cbd025515f3ff25db0c05efc704fa79818" + integrity sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A== + dependencies: + "@babel/compat-data" "^7.15.0" + "@babel/helper-validator-option" "^7.14.5" + browserslist "^4.16.6" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.14.5": version "7.14.6" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz#f114469b6c06f8b5c59c6c4e74621f5085362542" integrity sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg== @@ -104,6 +137,18 @@ "@babel/helper-replace-supers" "^7.14.5" "@babel/helper-split-export-declaration" "^7.14.5" +"@babel/helper-create-class-features-plugin@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.0.tgz#c9a137a4d137b2d0e2c649acf536d7ba1a76c0f7" + integrity sha512-MdmDXgvTIi4heDVX/e9EFfeGpugqm9fobBVg/iioE8kueXrOHdRDe36FAY7SnE9xXLVeYCoJR/gdrBEIHRC83Q== + dependencies: + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-member-expression-to-functions" "^7.15.0" + "@babel/helper-optimise-call-expression" "^7.14.5" + "@babel/helper-replace-supers" "^7.15.0" + "@babel/helper-split-export-declaration" "^7.14.5" + "@babel/helper-create-regexp-features-plugin@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz#c7d5ac5e9cf621c26057722fb7a8a4c5889358c4" @@ -163,6 +208,13 @@ dependencies: "@babel/types" "^7.14.5" +"@babel/helper-member-expression-to-functions@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz#0ddaf5299c8179f27f37327936553e9bba60990b" + integrity sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg== + dependencies: + "@babel/types" "^7.15.0" + "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz#6d1a44df6a38c957aa7c312da076429f11b422f3" @@ -184,6 +236,20 @@ "@babel/traverse" "^7.14.5" "@babel/types" "^7.14.5" +"@babel/helper-module-transforms@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz#679275581ea056373eddbe360e1419ef23783b08" + integrity sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg== + dependencies: + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-replace-supers" "^7.15.0" + "@babel/helper-simple-access" "^7.14.8" + "@babel/helper-split-export-declaration" "^7.14.5" + "@babel/helper-validator-identifier" "^7.14.9" + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.15.0" + "@babel/types" "^7.15.0" + "@babel/helper-optimise-call-expression@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz#f27395a8619e0665b3f0364cddb41c25d71b499c" @@ -215,6 +281,16 @@ "@babel/traverse" "^7.14.5" "@babel/types" "^7.14.5" +"@babel/helper-replace-supers@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz#ace07708f5bf746bf2e6ba99572cce79b5d4e7f4" + integrity sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.15.0" + "@babel/helper-optimise-call-expression" "^7.14.5" + "@babel/traverse" "^7.15.0" + "@babel/types" "^7.15.0" + "@babel/helper-simple-access@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz#66ea85cf53ba0b4e588ba77fc813f53abcaa41c4" @@ -222,6 +298,13 @@ dependencies: "@babel/types" "^7.14.5" +"@babel/helper-simple-access@^7.14.8": + version "7.14.8" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz#82e1fec0644a7e775c74d305f212c39f8fe73924" + integrity sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg== + dependencies: + "@babel/types" "^7.14.8" + "@babel/helper-skip-transparent-expression-wrappers@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz#96f486ac050ca9f44b009fbe5b7d394cab3a0ee4" @@ -241,6 +324,16 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz#d0f0e277c512e0c938277faa85a3968c9a44c0e8" integrity sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg== +"@babel/helper-validator-identifier@^7.14.8": + version "7.14.8" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz#32be33a756f29e278a0d644fa08a2c9e0f88a34c" + integrity sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow== + +"@babel/helper-validator-identifier@^7.14.9": + version "7.14.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48" + integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g== + "@babel/helper-validator-option@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" @@ -256,14 +349,14 @@ "@babel/traverse" "^7.14.5" "@babel/types" "^7.14.5" -"@babel/helpers@^7.14.6": - version "7.14.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.6.tgz#5b58306b95f1b47e2a0199434fa8658fa6c21635" - integrity sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA== +"@babel/helpers@^7.14.8": + version "7.14.8" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.8.tgz#839f88f463025886cff7f85a35297007e2da1b77" + integrity sha512-ZRDmI56pnV+p1dH6d+UN6GINGz7Krps3+270qqI9UJ4wxYThfAIcI5i7j5vXC4FJ3Wap+S9qcebxeYiqn87DZw== dependencies: "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" + "@babel/traverse" "^7.14.8" + "@babel/types" "^7.14.8" "@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5": version "7.14.5" @@ -274,11 +367,21 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.14.5", "@babel/parser@^7.14.6", "@babel/parser@^7.14.7", "@babel/parser@^7.9.4": +"@babel/parser@^7.14.5", "@babel/parser@^7.14.7", "@babel/parser@^7.9.4": version "7.14.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.7.tgz#6099720c8839ca865a2637e6c85852ead0bdb595" integrity sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA== +"@babel/parser@^7.14.8": + version "7.14.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.8.tgz#66fd41666b2d7b840bd5ace7f7416d5ac60208d4" + integrity sha512-syoCQFOoo/fzkWDeM0dLEZi5xqurb5vuyzwIMNZRNun+N/9A4cUZeQaE7dTrB8jGaKuJRBtEOajtnmw0I5hvvA== + +"@babel/parser@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.0.tgz#b6d6e29058ca369127b0eeca2a1c4b5794f1b6b9" + integrity sha512-0v7oNOjr6YT9Z2RAOTv4T9aP+ubfx4Q/OhVtAet7PFDt0t9Oy6Jn+/rfC6b8HJ5zEqrQCiMxJfgtHpmIminmJQ== + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz#4b467302e1548ed3b1be43beae2cc9cf45e0bb7e" @@ -288,10 +391,10 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" "@babel/plugin-proposal-optional-chaining" "^7.14.5" -"@babel/plugin-proposal-async-generator-functions@^7.14.7": - version "7.14.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz#784a48c3d8ed073f65adcf30b57bcbf6c8119ace" - integrity sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q== +"@babel/plugin-proposal-async-generator-functions@^7.14.9": + version "7.14.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.9.tgz#7028dc4fa21dc199bbacf98b39bab1267d0eaf9a" + integrity sha512-d1lnh+ZnKrFKwtTYdw320+sQWCTwgkB9fmUhNXRADA4akR6wLjaruSGnIEUjpt9HCOwTr4ynFTKu19b7rFRpmw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-remap-async-to-generator" "^7.14.5" @@ -551,10 +654,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-classes@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz#0e98e82097b38550b03b483f9b51a78de0acb2cf" - integrity sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA== +"@babel/plugin-transform-classes@^7.14.9": + version "7.14.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.9.tgz#2a391ffb1e5292710b00f2e2c210e1435e7d449f" + integrity sha512-NfZpTcxU3foGWbl4wxmZ35mTsYJy8oQocbeIMoDAGGFarAmSQlL+LWMkDx/tj6pNotpbX3rltIA4dprgAPOq5A== dependencies: "@babel/helper-annotate-as-pure" "^7.14.5" "@babel/helper-function-name" "^7.14.5" @@ -639,14 +742,14 @@ "@babel/helper-plugin-utils" "^7.14.5" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz#7aaee0ea98283de94da98b28f8c35701429dad97" - integrity sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A== +"@babel/plugin-transform-modules-commonjs@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.0.tgz#3305896e5835f953b5cdb363acd9e8c2219a5281" + integrity sha512-3H/R9s8cXcOGE8kgMlmjYYC9nqr5ELiPkJn4q0mypBrjhYQoc+5/Maq69vV4xRPWnkzZuwJPf5rArxpB/35Cig== dependencies: - "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-module-transforms" "^7.15.0" "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-simple-access" "^7.14.5" + "@babel/helper-simple-access" "^7.14.8" babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-systemjs@^7.14.5": @@ -668,10 +771,10 @@ "@babel/helper-module-transforms" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-named-capturing-groups-regex@^7.14.7": - version "7.14.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.7.tgz#60c06892acf9df231e256c24464bfecb0908fd4e" - integrity sha512-DTNOTaS7TkW97xsDMrp7nycUVh6sn/eq22VaxWfEdzuEbRsiaOU0pqU7DlyUGHVsbQbSghvjKRpEl+nUCKGQSg== +"@babel/plugin-transform-named-capturing-groups-regex@^7.14.9": + version "7.14.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz#c68f5c5d12d2ebaba3762e57c2c4f6347a46e7b2" + integrity sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.14.5" @@ -754,12 +857,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-typescript@^7.14.5": - version "7.14.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.6.tgz#6e9c2d98da2507ebe0a883b100cde3c7279df36c" - integrity sha512-XlTdBq7Awr4FYIzqhmYY80WN0V0azF74DMPyFqVHBvf81ZUgc4X7ZOpx6O8eLDK6iM5cCQzeyJw0ynTaefixRA== +"@babel/plugin-transform-typescript@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.0.tgz#553f230b9d5385018716586fc48db10dd228eb7e" + integrity sha512-WIIEazmngMEEHDaPTx0IZY48SaAmjVWe3TRSX7cmJXn0bEv9midFzAjxiruOWYIVf5iQ10vFx7ASDpgEO08L5w== dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.6" + "@babel/helper-create-class-features-plugin" "^7.15.0" "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript" "^7.14.5" @@ -778,17 +881,17 @@ "@babel/helper-create-regexp-features-plugin" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/preset-env@^7.14.7": - version "7.14.7" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.7.tgz#5c70b22d4c2d893b03d8c886a5c17422502b932a" - integrity sha512-itOGqCKLsSUl0Y+1nSfhbuuOlTs0MJk2Iv7iSH+XT/mR8U1zRLO7NjWlYXB47yhK4J/7j+HYty/EhFZDYKa/VA== +"@babel/preset-env@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.15.0.tgz#e2165bf16594c9c05e52517a194bf6187d6fe464" + integrity sha512-FhEpCNFCcWW3iZLg0L2NPE9UerdtsCR6ZcsGHUX6Om6kbCQeL5QZDqFDmeNHC6/fy6UH3jEge7K4qG5uC9In0Q== dependencies: - "@babel/compat-data" "^7.14.7" - "@babel/helper-compilation-targets" "^7.14.5" + "@babel/compat-data" "^7.15.0" + "@babel/helper-compilation-targets" "^7.15.0" "@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-validator-option" "^7.14.5" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.14.5" - "@babel/plugin-proposal-async-generator-functions" "^7.14.7" + "@babel/plugin-proposal-async-generator-functions" "^7.14.9" "@babel/plugin-proposal-class-properties" "^7.14.5" "@babel/plugin-proposal-class-static-block" "^7.14.5" "@babel/plugin-proposal-dynamic-import" "^7.14.5" @@ -821,7 +924,7 @@ "@babel/plugin-transform-async-to-generator" "^7.14.5" "@babel/plugin-transform-block-scoped-functions" "^7.14.5" "@babel/plugin-transform-block-scoping" "^7.14.5" - "@babel/plugin-transform-classes" "^7.14.5" + "@babel/plugin-transform-classes" "^7.14.9" "@babel/plugin-transform-computed-properties" "^7.14.5" "@babel/plugin-transform-destructuring" "^7.14.7" "@babel/plugin-transform-dotall-regex" "^7.14.5" @@ -832,10 +935,10 @@ "@babel/plugin-transform-literals" "^7.14.5" "@babel/plugin-transform-member-expression-literals" "^7.14.5" "@babel/plugin-transform-modules-amd" "^7.14.5" - "@babel/plugin-transform-modules-commonjs" "^7.14.5" + "@babel/plugin-transform-modules-commonjs" "^7.15.0" "@babel/plugin-transform-modules-systemjs" "^7.14.5" "@babel/plugin-transform-modules-umd" "^7.14.5" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.7" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.9" "@babel/plugin-transform-new-target" "^7.14.5" "@babel/plugin-transform-object-super" "^7.14.5" "@babel/plugin-transform-parameters" "^7.14.5" @@ -850,11 +953,11 @@ "@babel/plugin-transform-unicode-escapes" "^7.14.5" "@babel/plugin-transform-unicode-regex" "^7.14.5" "@babel/preset-modules" "^0.1.4" - "@babel/types" "^7.14.5" + "@babel/types" "^7.15.0" babel-plugin-polyfill-corejs2 "^0.2.2" babel-plugin-polyfill-corejs3 "^0.2.2" babel-plugin-polyfill-regenerator "^0.2.2" - core-js-compat "^3.15.0" + core-js-compat "^3.16.0" semver "^6.3.0" "@babel/preset-modules@^0.1.4": @@ -868,14 +971,14 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-typescript@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.14.5.tgz#aa98de119cf9852b79511f19e7f44a2d379bcce0" - integrity sha512-u4zO6CdbRKbS9TypMqrlGH7sd2TAJppZwn3c/ZRLeO/wGsbddxgbPDUZVNrie3JWYLQ9vpineKlsrWFvO6Pwkw== +"@babel/preset-typescript@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.15.0.tgz#e8fca638a1a0f64f14e1119f7fe4500277840945" + integrity sha512-lt0Y/8V3y06Wq/8H/u0WakrqciZ7Fz7mwPDHWUJAXlABL5hiUG42BNlRXiELNjeWjO5rWmnNKlx+yzJvxezHow== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-validator-option" "^7.14.5" - "@babel/plugin-transform-typescript" "^7.14.5" + "@babel/plugin-transform-typescript" "^7.15.0" "@babel/runtime@^7.8.4": version "7.14.6" @@ -908,6 +1011,36 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.14.8": + version "7.14.8" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.8.tgz#c0253f02677c5de1a8ff9df6b0aacbec7da1a8ce" + integrity sha512-kexHhzCljJcFNn1KYAQ6A5wxMRzq9ebYpEDV4+WdNyr3i7O44tanbDOR/xjiG2F3sllan+LgwK+7OMk0EmydHg== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.14.8" + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-hoist-variables" "^7.14.5" + "@babel/helper-split-export-declaration" "^7.14.5" + "@babel/parser" "^7.14.8" + "@babel/types" "^7.14.8" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/traverse@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.0.tgz#4cca838fd1b2a03283c1f38e141f639d60b3fc98" + integrity sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.15.0" + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-hoist-variables" "^7.14.5" + "@babel/helper-split-export-declaration" "^7.14.5" + "@babel/parser" "^7.15.0" + "@babel/types" "^7.15.0" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@^7.14.5", "@babel/types@^7.4.4": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.5.tgz#3bb997ba829a2104cedb20689c4a5b8121d383ff" @@ -916,6 +1049,22 @@ "@babel/helper-validator-identifier" "^7.14.5" to-fast-properties "^2.0.0" +"@babel/types@^7.14.8": + version "7.14.8" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.8.tgz#38109de8fcadc06415fbd9b74df0065d4d41c728" + integrity sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q== + dependencies: + "@babel/helper-validator-identifier" "^7.14.8" + to-fast-properties "^2.0.0" + +"@babel/types@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.0.tgz#61af11f2286c4e9c69ca8deb5f4375a73c72dcbd" + integrity sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ== + dependencies: + "@babel/helper-validator-identifier" "^7.14.9" + to-fast-properties "^2.0.0" + "@devsnowflake/docgen@devsnowflake/docgen#ts-patch": version "0.9.0" resolved "https://codeload.github.com/devsnowflake/docgen/tar.gz/cc87c4dfa7136fa1046946eff708bb995ca5e1f7" @@ -936,18 +1085,21 @@ node-fetch "^2.6.1" reverbnation-scraper "^2.0.0" -"@discordjs/builders@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-0.2.0.tgz#832c8d894aad13362db7a99f11a7826b21e4cd94" - integrity sha512-TVq7NZBCJrrTRc3CfxOr3IdgY5nrtqVxZ7qDUF1mN6LgxIiOldmFxsSwMrQBzLFVmOwqFyNLKCeblley8UpEuw== +"@discordjs/builders@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-0.3.0.tgz#af507c1c5a39039ebdba7233c7eb404c873b6f7a" + integrity sha512-yFBPqohVAtCWoDTQCYk5ubgmkiRbGpbiR4RfYGHCmV5S2YZc7j8WzfKVksjuy2o5IWRfXFsW6G2Lr+KpW41pEA== dependencies: - discord-api-types "^0.18.1" + "@sindresorhus/is" "^4.0.1" + discord-api-types "^0.22.0" + ow "^0.26.0" + ts-mixer "^5.4.1" tslib "^2.3.0" -"@discordjs/collection@^0.1.6": - version "0.1.6" - resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-0.1.6.tgz#9e9a7637f4e4e0688fd8b2b5c63133c91607682c" - integrity sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ== +"@discordjs/collection@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-0.2.1.tgz#ea4bc7b41b7b7b6daa82e439141222ec95c469b2" + integrity sha512-vhxqzzM8gkomw0TYRF3tgx7SwElzUlXT/Aa41O7mOcyN6wIJfj5JmDWaO5XGKsGSsNx7F3i5oIlrucCCWV1Nog== "@discordjs/form-data@^3.0.1": version "3.0.1" @@ -981,21 +1133,21 @@ "@discordjs/node-pre-gyp" "^0.4.0" node-addon-api "^3.2.1" -"@discordjs/voice@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@discordjs/voice/-/voice-0.5.4.tgz#02af74778177be8f42772118ba2193af481f442e" - integrity sha512-CLkJH1YXHhLyocvwAgIJBeyCe3iBVvg6pDPcJUEAwg09TykjJRH6qSpg2ly858WffzR7jOsLcliODAOMDwKtnA== +"@discordjs/voice@^0.5.5": + version "0.5.5" + resolved "https://registry.yarnpkg.com/@discordjs/voice/-/voice-0.5.5.tgz#25dfe4709e5da103875f212f40cf63068abd8850" + integrity sha512-i7QSRlPq34UAoTUfxLjlyWJONdrxJ4kZH7F6ZfoDK1rt3AHZv5vFzijBu8bsy040zaYpU3LZQ2MPw/kz1uCr5w== dependencies: "@types/ws" "^7.4.4" - discord-api-types "^0.18.1" + discord-api-types "^0.19.0" prism-media "^1.3.1" tiny-typed-emitter "^2.0.3" ws "^7.4.4" -"@eslint/eslintrc@^0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.2.tgz#f63d0ef06f5c0c57d76c4ab5f63d3835c51b0179" - integrity sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg== +"@eslint/eslintrc@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== dependencies: ajv "^6.12.4" debug "^4.1.1" @@ -1064,6 +1216,11 @@ resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.1.4.tgz#ae431310917a8880961cebe8e59df6ffa40f2957" integrity sha512-fFrlF/uWpGOX5djw5Mu2Hnnrunao75WGey0sP0J3jnhmrJ5TAPzHYOmytD5iN/+pMxS+f+u/gezqHa9tPhRHEA== +"@sindresorhus/is@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.0.1.tgz#d26729db850fa327b7cacc5522252194404226f5" + integrity sha512-Qm9hBEBu18wt1PO2flE7LPb30BHMQt1eQgbV76YntdNk73XZGpn3izvGTYxbGgzXKgbCjiia0uxTd3aTNQrY/g== + "@tootallnate/once@1": version "1.1.2" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" @@ -1094,92 +1251,97 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.8.tgz#edf1bf1dbf4e04413ca8e5b17b3b7d7d54b59818" integrity sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg== -"@types/node@*", "@types/node@^16.0.0": +"@types/node@*": version "16.3.1" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.3.1.tgz#24691fa2b0c3ec8c0d34bfcfd495edac5593ebb4" integrity sha512-N87VuQi7HEeRJkhzovao/JviiqKjDKMVKxKMfUvSKw+MbkbW8R0nA3fi/MQhhlxV2fQ+2ReM+/Nt4efdrJx3zA== -"@types/ws@^7.4.4", "@types/ws@^7.4.6": +"@types/node@^16.4.12": + version "16.4.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.4.12.tgz#961e3091f263e6345d2d84afab4e047a60b4b11b" + integrity sha512-zxrTNFl9Z8boMJXs6ieqZP0wAhvkdzmHSxTlJabM16cf5G9xBc1uPRH5Bbv2omEDDiM8MzTfqTJXBf0Ba4xFWA== + +"@types/ws@^7.4.4": version "7.4.6" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.6.tgz#c4320845e43d45a7129bb32905e28781c71c1fff" integrity sha512-ijZ1vzRawI7QoWnTNL8KpHixd2b2XVb9I9HAqI3triPsh1EC0xH0Eg6w2O3TKbDCgiNNlJqfrof6j4T2I+l9vw== dependencies: "@types/node" "*" -"@types/ws@^7.4.5": +"@types/ws@^7.4.5", "@types/ws@^7.4.7": version "7.4.7" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@^4.28.1": - version "4.28.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.28.2.tgz#7a8320f00141666813d0ae43b49ee8244f7cf92a" - integrity sha512-PGqpLLzHSxq956rzNGasO3GsAPf2lY9lDUBXhS++SKonglUmJypaUtcKzRtUte8CV7nruwnDxtLUKpVxs0wQBw== +"@typescript-eslint/eslint-plugin@^4.29.0": + version "4.29.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.29.0.tgz#b866c9cd193bfaba5e89bade0015629ebeb27996" + integrity sha512-eiREtqWRZ8aVJcNru7cT/AMVnYd9a2UHsfZT8MR1dW3UUEg6jDv9EQ9Cq4CUPZesyQ58YUpoAADGv71jY8RwgA== dependencies: - "@typescript-eslint/experimental-utils" "4.28.2" - "@typescript-eslint/scope-manager" "4.28.2" + "@typescript-eslint/experimental-utils" "4.29.0" + "@typescript-eslint/scope-manager" "4.29.0" debug "^4.3.1" functional-red-black-tree "^1.0.1" regexpp "^3.1.0" semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/experimental-utils@4.28.2": - version "4.28.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.2.tgz#4ebdec06a10888e9326e1d51d81ad52a361bd0b0" - integrity sha512-MwHPsL6qo98RC55IoWWP8/opTykjTp4JzfPu1VfO2Z0MshNP0UZ1GEV5rYSSnZSUI8VD7iHvtIPVGW5Nfh7klQ== +"@typescript-eslint/experimental-utils@4.29.0": + version "4.29.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.29.0.tgz#19b1417602d0e1ef325b3312ee95f61220542df5" + integrity sha512-FpNVKykfeaIxlArLUP/yQfv/5/3rhl1ov6RWgud4OgbqWLkEq7lqgQU9iiavZRzpzCRQV4XddyFz3wFXdkiX9w== dependencies: "@types/json-schema" "^7.0.7" - "@typescript-eslint/scope-manager" "4.28.2" - "@typescript-eslint/types" "4.28.2" - "@typescript-eslint/typescript-estree" "4.28.2" + "@typescript-eslint/scope-manager" "4.29.0" + "@typescript-eslint/types" "4.29.0" + "@typescript-eslint/typescript-estree" "4.29.0" eslint-scope "^5.1.1" eslint-utils "^3.0.0" -"@typescript-eslint/parser@^4.28.1": - version "4.28.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.28.2.tgz#6aff11bf4b91eb67ca7517962eede951e9e2a15d" - integrity sha512-Q0gSCN51eikAgFGY+gnd5p9bhhCUAl0ERMiDKrTzpSoMYRubdB8MJrTTR/BBii8z+iFwz8oihxd0RAdP4l8w8w== +"@typescript-eslint/parser@^4.29.0": + version "4.29.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.29.0.tgz#e5367ca3c63636bb5d8e0748fcbab7a4f4a04289" + integrity sha512-+92YRNHFdXgq+GhWQPT2bmjX09X7EH36JfgN2/4wmhtwV/HPxozpCNst8jrWcngLtEVd/4zAwA6BKojAlf+YqA== dependencies: - "@typescript-eslint/scope-manager" "4.28.2" - "@typescript-eslint/types" "4.28.2" - "@typescript-eslint/typescript-estree" "4.28.2" + "@typescript-eslint/scope-manager" "4.29.0" + "@typescript-eslint/types" "4.29.0" + "@typescript-eslint/typescript-estree" "4.29.0" debug "^4.3.1" -"@typescript-eslint/scope-manager@4.28.2": - version "4.28.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.28.2.tgz#451dce90303a3ce283750111495d34c9c204e510" - integrity sha512-MqbypNjIkJFEFuOwPWNDjq0nqXAKZvDNNs9yNseoGBB1wYfz1G0WHC2AVOy4XD7di3KCcW3+nhZyN6zruqmp2A== +"@typescript-eslint/scope-manager@4.29.0": + version "4.29.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.29.0.tgz#cf5474f87321bedf416ef65839b693bddd838599" + integrity sha512-HPq7XAaDMM3DpmuijxLV9Io8/6pQnliiXMQUcAdjpJJSR+fdmbD/zHCd7hMkjJn04UQtCQBtshgxClzg6NIS2w== dependencies: - "@typescript-eslint/types" "4.28.2" - "@typescript-eslint/visitor-keys" "4.28.2" + "@typescript-eslint/types" "4.29.0" + "@typescript-eslint/visitor-keys" "4.29.0" -"@typescript-eslint/types@4.28.2": - version "4.28.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.28.2.tgz#e6b9e234e0e9a66c4d25bab881661e91478223b5" - integrity sha512-Gr15fuQVd93uD9zzxbApz3wf7ua3yk4ZujABZlZhaxxKY8ojo448u7XTm/+ETpy0V0dlMtj6t4VdDvdc0JmUhA== +"@typescript-eslint/types@4.29.0": + version "4.29.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.29.0.tgz#c8f1a1e4441ea4aca9b3109241adbc145f7f8a4e" + integrity sha512-2YJM6XfWfi8pgU2HRhTp7WgRw78TCRO3dOmSpAvIQ8MOv4B46JD2chnhpNT7Jq8j0APlIbzO1Bach734xxUl4A== -"@typescript-eslint/typescript-estree@4.28.2": - version "4.28.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.2.tgz#680129b2a285289a15e7c6108c84739adf3a798c" - integrity sha512-86lLstLvK6QjNZjMoYUBMMsULFw0hPHJlk1fzhAVoNjDBuPVxiwvGuPQq3fsBMCxuDJwmX87tM/AXoadhHRljg== +"@typescript-eslint/typescript-estree@4.29.0": + version "4.29.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.0.tgz#af7ab547757b86c91bfdbc54ff86845410856256" + integrity sha512-8ZpNHDIOyqzzgZrQW9+xQ4k5hM62Xy2R4RPO3DQxMc5Rq5QkCdSpk/drka+DL9w6sXNzV5nrdlBmf8+x495QXQ== dependencies: - "@typescript-eslint/types" "4.28.2" - "@typescript-eslint/visitor-keys" "4.28.2" + "@typescript-eslint/types" "4.29.0" + "@typescript-eslint/visitor-keys" "4.29.0" debug "^4.3.1" globby "^11.0.3" is-glob "^4.0.1" semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/visitor-keys@4.28.2": - version "4.28.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.2.tgz#bf56a400857bb68b59b311e6d0a5fbef5c3b5130" - integrity sha512-aT2B4PLyyRDUVUafXzpZFoc0C9t0za4BJAKP5sgWIhG+jHECQZUEjuQSCIwZdiJJ4w4cgu5r3Kh20SOdtEBl0w== +"@typescript-eslint/visitor-keys@4.29.0": + version "4.29.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.0.tgz#1ff60f240def4d85ea68d4fd2e4e9759b7850c04" + integrity sha512-LoaofO1C/jAJYs0uEpYMXfHboGXzOJeV118X4OsZu9f7rG7Pr9B3+4HTU8+err81rADa4xfQmAxnRnPAI2jp+Q== dependencies: - "@typescript-eslint/types" "4.28.2" + "@typescript-eslint/types" "4.29.0" eslint-visitor-keys "^2.0.0" abab@^2.0.3, abab@^2.0.5: @@ -1587,7 +1749,7 @@ call-bind@^1.0.0: function-bind "^1.1.1" get-intrinsic "^1.0.2" -callsites@^3.0.0: +callsites@^3.0.0, callsites@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== @@ -1642,7 +1804,7 @@ cheerio-select@^1.5.0: domhandler "^4.2.0" domutils "^2.7.0" -cheerio@^1.0.0-rc.9: +cheerio@^1.0.0-rc.10, cheerio@^1.0.0-rc.9: version "1.0.0-rc.10" resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.10.tgz#2ba3dcdfcc26e7956fc1f440e61d51c643379f3e" integrity sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw== @@ -1838,7 +2000,7 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js-compat@^3.14.0, core-js-compat@^3.15.0: +core-js-compat@^3.14.0: version "3.15.2" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.15.2.tgz#47272fbb479880de14b4e6081f71f3492f5bd3cb" integrity sha512-Wp+BJVvwopjI+A1EFqm2dwUmWYXrvucmtIB2LgXn/Rb+gWPKYxtmb4GKHGKG/KGF1eK9jfjzT38DITbTOCX/SQ== @@ -1846,6 +2008,14 @@ core-js-compat@^3.14.0, core-js-compat@^3.15.0: browserslist "^4.16.6" semver "7.0.0" +core-js-compat@^3.16.0: + version "3.16.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.16.0.tgz#fced4a0a534e7e02f7e084bff66c701f8281805f" + integrity sha512-5D9sPHCdewoUK7pSUPfTF7ZhLh8k9/CoJXWUEo+F1dZT5Z1DVgcuRqUKhjeKW+YLb8f21rTFgWwQJiNw1hoZ5Q== + dependencies: + browserslist "^4.16.6" + semver "7.0.0" + core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -2020,16 +2190,16 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -discord-api-types@^0.18.1: - version "0.18.1" - resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.18.1.tgz#5d08ed1263236be9c21a22065d0e6b51f790f492" - integrity sha512-hNC38R9ZF4uaujaZQtQfm5CdQO58uhdkoHQAVvMfIL0LgOSZeW575W8H6upngQOuoxWd8tiRII3LLJm9zuQKYg== - discord-api-types@^0.19.0: version "0.19.0" resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.19.0.tgz#86ba8021b29190cf860e90a2bc3e29b1d7aab3ba" integrity sha512-t2HKLd43Lbe+rf+ffYfKVv9Kk5f6p7sFqvO6CMV55ZB0PgZv8WigCkt9FoJciYo5S3Q6CGYK+WnE/ZG+6vkBDQ== +discord-api-types@^0.22.0: + version "0.22.0" + resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.22.0.tgz#34dc57fe8e016e5eaac5e393646cd42a7e1ccc2a" + integrity sha512-l8yD/2zRbZItUQpy7ZxBJwaLX/Bs2TGaCthRppk8Sw24LOIWg12t9JEreezPoYD0SQcC2htNNo27kYEpYW/Srg== + discord-ytdl-core@^5.0.4: version "5.0.4" resolved "https://registry.yarnpkg.com/discord-ytdl-core/-/discord-ytdl-core-5.0.4.tgz#84a2af1a8e8c235b4fc109b23350d12782ab66cd" @@ -2037,18 +2207,18 @@ discord-ytdl-core@^5.0.4: dependencies: prism-media "^1.2.9" -discord.js@^13.0.0-dev.1e90be8.1626825831: - version "13.0.0-dev.1e90be8.1626825831" - resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0-dev.1e90be8.1626825831.tgz#2acfc7a95482863f4bafbe54464392f8d4a8ed3d" - integrity sha512-Kv32vfxiqHzSB4HY1MfHdvf868toZde86sPOCBhvmLbKZo5XaiZKMuZgfAUv7pBriNNTA0FtKoIid/2BqjuZqg== +discord.js@^13.0.0-dev.t1628124537.3eb4140: + version "13.0.0-dev.t1628124537.3eb4140" + resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0-dev.t1628124537.3eb4140.tgz#a22bd919d895cc02dfdae7f148e2b27fc6d53f24" + integrity sha512-f14hhyXoqxU/LE+6qeLTj+LYgsIKmRF2M6JaMyyUfTjhCvpz0Y3Z0ZKjYRXtQa0jw4WiFlHIYUn5SiVUGoZl+Q== dependencies: - "@discordjs/builders" "^0.2.0" - "@discordjs/collection" "^0.1.6" + "@discordjs/builders" "^0.3.0" + "@discordjs/collection" "^0.2.1" "@discordjs/form-data" "^3.0.1" "@sapphire/async-queue" "^1.1.4" "@types/ws" "^7.4.5" abort-controller "^3.0.0" - discord-api-types "^0.19.0" + discord-api-types "^0.22.0" node-fetch "^2.6.1" ws "^7.5.1" @@ -2114,6 +2284,13 @@ domutils@^2.5.2, domutils@^2.6.0, domutils@^2.7.0: domelementtype "^2.2.0" domhandler "^4.2.0" +dot-prop@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" + integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== + dependencies: + is-obj "^2.0.0" + electron-to-chromium@^1.3.723: version "1.3.772" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.772.tgz#fd1ed39f9f3149f62f581734e4f026e600369479" @@ -2260,13 +2437,13 @@ eslint@^6.3.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" -eslint@^7.30.0: - version "7.30.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.30.0.tgz#6d34ab51aaa56112fd97166226c9a97f505474f8" - integrity sha512-VLqz80i3as3NdloY44BQSJpFw534L9Oh+6zJOUaViV4JPd+DaHwutqP7tcpkW3YiXbK6s05RZl7yl7cQn+lijg== +eslint@^7.32.0: + version "7.32.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== dependencies: "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.2" + "@eslint/eslintrc" "^0.4.3" "@humanwhocodes/config-array" "^0.5.0" ajv "^6.10.0" chalk "^4.0.0" @@ -3002,6 +3179,11 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -3288,6 +3470,11 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= + lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" @@ -3325,7 +3512,7 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -m3u8stream@^0.8.3: +m3u8stream@^0.8.3, m3u8stream@^0.8.4: version "0.8.4" resolved "https://registry.yarnpkg.com/m3u8stream/-/m3u8stream-0.8.4.tgz#15b49d0c2b510755ea43c1e53f85d7aaa4dc65c2" integrity sha512-sco80Db+30RvcaIOndenX6E6oQNgTiBKeJbFPc+yDXwPQIkryfboEbCvXPlBRq3mQTCVPQO93TDVlfRwqpD35w== @@ -3706,6 +3893,18 @@ os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= +ow@^0.26.0: + version "0.26.0" + resolved "https://registry.yarnpkg.com/ow/-/ow-0.26.0.tgz#5b8f61221ab31431f964caa6eaa0ed574e21a56e" + integrity sha512-22YUQW9d6oUSCpIQuBV25djtC1uMtpWqmtUYnuh2UHWeNMpppCFCvq3eSBIWWMDbe2UVq26kWYvBHDzOIu5NYg== + dependencies: + "@sindresorhus/is" "^4.0.1" + callsites "^3.1.0" + dot-prop "^6.0.1" + lodash.isequal "^4.5.0" + type-fest "^1.2.1" + vali-date "^1.0.0" + p-limit@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -4238,13 +4437,13 @@ sort-array@^2.0.0: object-get "^2.1.0" typical "^2.6.0" -soundcloud-scraper@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/soundcloud-scraper/-/soundcloud-scraper-5.0.0.tgz#3f4e9d9fc9ee79cbaf6cdd64f462ad6803e25ac1" - integrity sha512-8Rt7WbW85AqiFoKkemF5BKsGAThLGnhOi13ztctAI0Y/wso/iuR97yiVXK1eYRc2YqaD8gkpKUAjEY7bOxLxnw== +soundcloud-scraper@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/soundcloud-scraper/-/soundcloud-scraper-5.0.1.tgz#4872d3c09d7cac40a81c99b3c509095ab17bcbcc" + integrity sha512-f3JxM/afLRumaT06YsLs8u/WtXDZYvMBis7kB3+rFcx0cyJeu825D3b8D3oTSflNWeFgbGt2+QRrvsXnUi/n1Q== dependencies: - cheerio "^1.0.0-rc.9" - m3u8stream "^0.8.3" + cheerio "^1.0.0-rc.10" + m3u8stream "^0.8.4" node-fetch "^2.6.1" source-map-resolve@^0.5.0: @@ -4515,6 +4714,11 @@ tiny-typed-emitter@^2.0.3: resolved "https://registry.yarnpkg.com/tiny-typed-emitter/-/tiny-typed-emitter-2.0.3.tgz#4335e3a75127ae7faba91b02e91615d97dc8db7d" integrity sha512-MaCqhHlp6EAWN25yqBlajgd4scxxI2eJr7+EgoUAOV9UkMU3us/yp2bEnc2yOvyeDF8TUWuaz3zZCPGTKFJIpA== +tiny-typed-emitter@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz#b3b027fdd389ff81a152c8e847ee2f5be9fad7b5" + integrity sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA== + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -4575,7 +4779,12 @@ tr46@^2.1.0: dependencies: punycode "^2.1.1" -ts-node@^10.0.0: +ts-mixer@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ts-mixer/-/ts-mixer-5.4.1.tgz#b90db9ced48531aa17ce9184a2890d1e3c99b1e5" + integrity sha512-Zo9HgPCtNouDgJ+LGtrzVOjSg8+7WGQktIKLwAfaNrlOK1mWGlz1ejsAF/YqUEqAGjUTeB5fEg8gH9Aui6w9xA== + +ts-node@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.1.0.tgz#e656d8ad3b61106938a867f69c39a8ba6efc966e" integrity sha512-6szn3+J9WyG2hE+5W8e0ruZrzyk1uFLYye6IGMBadnOzDh8aP7t8CbFpsfCiEx2+wMixAhjFt7lOZC4+l+WbEA== @@ -4642,6 +4851,11 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type-fest@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.3.0.tgz#6be848243853df1173fa95530112e1358ab0810b" + integrity sha512-mYUYkAy6fPatVWtUeCV/qGeGL3IVucmdJOzeAEfwgCJDx8gP0JaW8jn6KQ5xDfPec31e0KXWn5EUOZMhquR1zA== + typescript@^4.3.5: version "4.3.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" @@ -4750,6 +4964,11 @@ v8-compile-cache@^2.0.3: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== +vali-date@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6" + integrity sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY= + w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" @@ -4942,10 +5161,10 @@ youtube-sr@^4.1.7: dependencies: node-fetch "^2.6.1" -ytdl-core@^4.9.0: - version "4.9.0" - resolved "https://registry.yarnpkg.com/ytdl-core/-/ytdl-core-4.9.0.tgz#d166f6e7ab7c2ac344ada9568f507af1255c6406" - integrity sha512-pfuWqEIrP3iYqz5jOMmaz9m+DAzfQpt8X1jmzoOsPdYWrLMV4ml7+p/zhDi0F8IF90i4Jmd0Pq0W1awnKDatKg== +ytdl-core@^4.9.1: + version "4.9.1" + resolved "https://registry.yarnpkg.com/ytdl-core/-/ytdl-core-4.9.1.tgz#f587e2bd8329b5133c0bac4ce5ee1f3c7a1175a9" + integrity sha512-6Jbp5RDhUEozlaJQAR+l8oV8AHsx3WUXxSyPxzE6wOIAaLql7Hjiy0ZM58wZoyj1YEenlEPjEqcJIjKYKxvHtQ== dependencies: m3u8stream "^0.8.3" miniget "^4.0.0" From 454395f85cdf3a9bf0d527275f79990692b284c6 Mon Sep 17 00:00:00 2001 From: DevAndromeda <46562212+DevAndromeda@users.noreply.github.com> Date: Thu, 5 Aug 2021 14:30:02 +0545 Subject: [PATCH 187/215] chore: setup husky --- .husky/pre-commit | 4 ++++ package.json | 1 + yarn.lock | 5 +++++ 3 files changed, 10 insertions(+) create mode 100644 .husky/pre-commit diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..517826d --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npm run format && npm run lint:fix \ No newline at end of file diff --git a/package.json b/package.json index a11cc41..4cb9a13 100644 --- a/package.json +++ b/package.json @@ -76,6 +76,7 @@ "discord-api-types": "^0.22.0", "discord.js": "^13.0.0-dev.t1628124537.3eb4140", "eslint": "^7.32.0", + "husky": "^7.0.1", "jsdoc-babel": "^0.5.0", "prettier": "^2.3.2", "rimraf": "^3.0.2", diff --git a/yarn.lock b/yarn.lock index d4cadab..2b47ed5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2992,6 +2992,11 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" +husky@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.1.tgz#579f4180b5da4520263e8713cc832942b48e1f1c" + integrity sha512-gceRaITVZ+cJH9sNHqx5tFwbzlLCVxtVZcusME8JYQ8Edy5mpGDOqD8QBCdMhpyo9a+JXddnujQ4rpY2Ff9SJA== + iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" From 7071737b3e8f5c7b59d177270641508357c40036 Mon Sep 17 00:00:00 2001 From: DevAndromeda <46562212+DevAndromeda@users.noreply.github.com> Date: Thu, 5 Aug 2021 14:31:49 +0545 Subject: [PATCH 188/215] ci: publish dev --- .github/workflows/publish-dev.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish-dev.yml b/.github/workflows/publish-dev.yml index 892b500..20fc969 100644 --- a/.github/workflows/publish-dev.yml +++ b/.github/workflows/publish-dev.yml @@ -30,7 +30,7 @@ jobs: - name: Publish run: | npx tsc --skipLibCheck - npm version --git-tag-version=false $(jq --raw-output '.version' package.json).$(git rev-parse --short HEAD).$(date +%s) + npm version --git-tag-version=false $(jq --raw-output '.version' package.json).$(date +%s).$(git rev-parse --short HEAD) npm publish --tag dev || true env: NODE_AUTH_TOKEN: ${{ secrets.npm_token }} From a617e5f7501dd7f5add852bc0b63360cab817c70 Mon Sep 17 00:00:00 2001 From: DevAndromeda <46562212+DevAndromeda@users.noreply.github.com> Date: Thu, 5 Aug 2021 14:37:28 +0545 Subject: [PATCH 189/215] fix(Player): add missing event --- src/types/types.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/types/types.ts b/src/types/types.ts index 8b1d470..bba4d8b 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -317,6 +317,7 @@ export interface PlayerEvents { trackAdd: (queue: Queue, track: Track) => any; tracksAdd: (queue: Queue, track: Track[]) => any; trackStart: (queue: Queue, track: Track) => any; + trackEnd: (queue: Queue, track: Track) => any; } /* eslint-enable @typescript-eslint/no-explicit-any */ From 74faa9bad217cc976d16dd8f312d5ab82827076a Mon Sep 17 00:00:00 2001 From: DevAndromeda <46562212+DevAndromeda@users.noreply.github.com> Date: Thu, 5 Aug 2021 14:50:42 +0545 Subject: [PATCH 190/215] chore: add bundlers --- .eslintignore | 2 +- .github/workflows/npm-publish.yml | 2 +- .github/workflows/publish-dev.yml | 4 +- .gitignore | 2 +- package.json | 17 ++++-- src/Player.ts | 2 +- src/utils/QueryResolver.ts | 2 +- src/utils/Util.ts | 2 +- tsconfig.json | 2 +- yarn.lock | 94 ++++++++++++++++++++++++++++++- 10 files changed, 114 insertions(+), 15 deletions(-) diff --git a/.eslintignore b/.eslintignore index f675f34..525c1ac 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,6 +1,6 @@ example/ node_modules/ -lib/ +dist/ .github/ docs/ diff --git a/.github/workflows/npm-publish.yml b/.github/workflows/npm-publish.yml index 2147d77..7a0da76 100644 --- a/.github/workflows/npm-publish.yml +++ b/.github/workflows/npm-publish.yml @@ -12,7 +12,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v1 with: - node-version: 12 + node-version: 16 registry-url: https://registry.npmjs.org/ - run: npm install - run: npm run build diff --git a/.github/workflows/publish-dev.yml b/.github/workflows/publish-dev.yml index da8118d..ff20bce 100644 --- a/.github/workflows/publish-dev.yml +++ b/.github/workflows/publish-dev.yml @@ -13,10 +13,10 @@ jobs: with: ref: v5 - - name: Install Node v14 + - name: Install Node v16 uses: actions/setup-node@v2 with: - node-version: 14 + node-version: 16 registry-url: https://registry.npmjs.org/ - name: Install dependencies diff --git a/.gitignore b/.gitignore index 7a394be..e8e1662 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,7 @@ package-lock.json yarn.lock # Compiled files -lib +dist # Yarn logs yarn*.log diff --git a/package.json b/package.json index 4cb9a13..0706b5a 100644 --- a/package.json +++ b/package.json @@ -2,15 +2,22 @@ "name": "discord-player", "version": "5.0.0-dev", "description": "Complete framework to facilitate music commands using discord.js", - "main": "lib/index.js", - "types": "lib/index.d.ts", + "main": "dist/index.js", + "types": "dist/index.d.ts", "files": [ - "lib/" + "dist/" ], + "module": "dist/index.mjs", + "exports": { + "require": "./dist/index.js", + "import": "./dist/index.mjs" + }, "scripts": { "dev": "cd example/test && ts-node index.ts", - "build": "rimraf lib && tsc", + "build": "rimraf dist && tsc && npm run build:esm", "build:check": "tsc --noEmit --incremental false", + "prepublishOnly": "rollup-type-bundler -e stream", + "build:esm": "gen-esm-wrapper ./dist/index.js ./dist/index.mjs", "format": "prettier --write \"src/**/*.ts\" \"example/**/*.ts\"", "docs": "docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/index.yml --output docs/docs.json", "docs:test": "docgen --jsdoc jsdoc.json --source src/*.ts src/**/*.ts --custom docs/index.yml", @@ -69,6 +76,7 @@ "@devsnowflake/docgen": "devsnowflake/docgen#ts-patch", "@discord-player/extractor": "^3.0.2", "@discordjs/opus": "^0.5.3", + "@favware/rollup-type-bundler": "^1.0.3", "@types/node": "^16.4.12", "@types/ws": "^7.4.7", "@typescript-eslint/eslint-plugin": "^4.29.0", @@ -76,6 +84,7 @@ "discord-api-types": "^0.22.0", "discord.js": "^13.0.0-dev.t1628124537.3eb4140", "eslint": "^7.32.0", + "gen-esm-wrapper": "^1.1.2", "husky": "^7.0.1", "jsdoc-babel": "^0.5.0", "prettier": "^2.3.2", diff --git a/src/Player.ts b/src/Player.ts index b50886c..7db8d73 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -500,4 +500,4 @@ class Player extends EventEmitter { } } -export { Player }; \ No newline at end of file +export { Player }; diff --git a/src/utils/QueryResolver.ts b/src/utils/QueryResolver.ts index 619d622..d39e808 100644 --- a/src/utils/QueryResolver.ts +++ b/src/utils/QueryResolver.ts @@ -16,7 +16,7 @@ const attachmentRegex = /^(?:(?:https?|ftp):\/\/)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/\S*)?$/; // scary things above *sigh* -class QueryResolver extends null { +class QueryResolver { /** * Query resolver */ diff --git a/src/utils/Util.ts b/src/utils/Util.ts index 28b8faa..17b44c6 100644 --- a/src/utils/Util.ts +++ b/src/utils/Util.ts @@ -1,7 +1,7 @@ import { StageChannel, VoiceChannel } from "discord.js"; import { TimeData } from "../types/types"; -class Util extends null { +class Util { /** * Utils */ diff --git a/tsconfig.json b/tsconfig.json index ec220f2..d7ef062 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,7 +3,7 @@ "target": "ES6", "module": "commonjs", "declaration": true, - "outDir": "./lib", + "outDir": "./dist", "strict": true, "strictNullChecks": false, "esModuleInterop": true, diff --git a/yarn.lock b/yarn.lock index 2b47ed5..aa6cc9e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25,7 +25,7 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.14.5": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== @@ -1159,6 +1159,17 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" +"@favware/rollup-type-bundler@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@favware/rollup-type-bundler/-/rollup-type-bundler-1.0.3.tgz#cf42805ed3d1a37d3eeaf79efff9ef2b1d36c142" + integrity sha512-fbwfdBx7xm3b6dsnuJ2MvB/S4y0SrknPnuQLPvnzmrZpf8pEi/gkUifn8P2WmCPLclN71IMhP8YKL1ZmPifGbw== + dependencies: + colorette "^1.2.2" + commander "^8.0.0" + js-yaml "^4.1.0" + rollup "^2.52.6" + rollup-plugin-dts "^3.0.2" + "@humanwhocodes/config-array@^0.5.0": version "0.5.0" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" @@ -1510,6 +1521,11 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" @@ -1559,6 +1575,14 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +assert@^1.4.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" @@ -1961,6 +1985,11 @@ commander@^4.0.1: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +commander@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.1.0.tgz#db36e3e66edf24ff591d639862c6ab2c52664362" + integrity sha512-mf45ldcuHSYShkplHHGKWb4TrmwQadxOn7v4WuhDJy0ZVoY5JFajaRDKD0PNe5qXzBX0rhovjTnP6Kz9LETcuA== + common-sequence@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/common-sequence/-/common-sequence-2.0.2.tgz#accc76bdc5876a1fcd92b73484d4285fff99d838" @@ -2796,6 +2825,13 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" +gen-esm-wrapper@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/gen-esm-wrapper/-/gen-esm-wrapper-1.1.2.tgz#ea91a4f0dae497060bd9462d8a9bc5bc2dacc3d0" + integrity sha512-ZzqvusFKGZEWunpoz5Yg4+tdODUa7Swv1pvd83VF9nVJNCIu5i1KJ6pFjTFFkvk8deeSWLdMgc8FNRaTe5MTTA== + dependencies: + is-valid-identifier "^2.0.2" + genius-lyrics@^4.2.9: version "4.2.9" resolved "https://registry.yarnpkg.com/genius-lyrics/-/genius-lyrics-4.2.9.tgz#87d12946589d3e96df4e100c51805aa5046de2c7" @@ -3040,6 +3076,11 @@ inherits@2, inherits@^2.0.3, inherits@~2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + inquirer@^7.0.0: version "7.3.3" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" @@ -3201,6 +3242,13 @@ is-potential-custom-element-name@^1.0.1: resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== +is-valid-identifier@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-valid-identifier/-/is-valid-identifier-2.0.2.tgz#146d9dbf29821b8118580b039d2203aa4bd1da4b" + integrity sha512-mpS5EGqXOwzXtKAg6I44jIAqeBfntFLxpAth1rrKbxtKyI6LPktyDYpHBI+tHlduhhX/SF26mFXmxQu995QVqg== + dependencies: + assert "^1.4.1" + is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -3241,6 +3289,13 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + js2xmlparser@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-4.0.1.tgz#670ef71bc5661f089cc90481b99a05a1227ae3bd" @@ -3525,6 +3580,13 @@ m3u8stream@^0.8.3, m3u8stream@^0.8.4: miniget "^4.0.0" sax "^1.2.4" +magic-string@^0.25.7: + version "0.25.7" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" + integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== + dependencies: + sourcemap-codec "^1.4.4" + make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -3802,7 +3864,7 @@ nwsapi@^2.2.0: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== -object-assign@^4.1.0: +object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -4261,6 +4323,22 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" +rollup-plugin-dts@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rollup-plugin-dts/-/rollup-plugin-dts-3.0.2.tgz#2b628d88f864d271d6eaec2e4c2a60ae4e944c5c" + integrity sha512-hswlsdWu/x7k5pXzaLP6OvKRKcx8Bzprksz9i9mUe72zvt8LvqAb/AZpzs6FkLgmyRaN8B6rUQOVtzA3yEt9Yw== + dependencies: + magic-string "^0.25.7" + optionalDependencies: + "@babel/code-frame" "^7.12.13" + +rollup@^2.52.6: + version "2.56.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.56.0.tgz#daa832955d2b58f1ed52a3c4c85b7d1adaf076d0" + integrity sha512-weEafgbjbHCnrtJPNyCrhYnjP62AkF04P0BcV/1mofy1+gytWln4VVB1OK462cq2EAyWzRDpTMheSP/o+quoiA== + optionalDependencies: + fsevents "~2.3.2" + run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" @@ -4485,6 +4563,11 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +sourcemap-codec@^1.4.4: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" @@ -4964,6 +5047,13 @@ util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + v8-compile-cache@^2.0.3: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" From 21b5d1d0c557a73604af55d1a646cb6a08b1ec31 Mon Sep 17 00:00:00 2001 From: DevAndromeda <46562212+DevAndromeda@users.noreply.github.com> Date: Thu, 5 Aug 2021 15:09:58 +0545 Subject: [PATCH 191/215] fix(Player): add default highWaterMark to try avoiding aborts --- src/Player.ts | 4 +++- src/Structures/Queue.ts | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Player.ts b/src/Player.ts index 7db8d73..7e1869b 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -21,7 +21,9 @@ class Player extends EventEmitter { public readonly client: Client; public readonly options: PlayerInitOptions = { autoRegisterExtractor: true, - ytdlOptions: {} + ytdlOptions: { + highWaterMark: 1 << 25 + } }; public readonly queues = new Collection(); public readonly voiceUtils = new VoiceUtils(); diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index fabe0b3..365a46a 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -98,7 +98,9 @@ class Queue { leaveOnEmpty: true, leaveOnEmptyCooldown: 1000, autoSelfDeaf: true, - ytdlOptions: {}, + ytdlOptions: { + highWaterMark: 1 << 25 + }, initialVolume: 100, bufferingTimeout: 1000 } as PlayerOptions, From fffd1f145b7761c412b3e6ae04d3d425b5cbbefd Mon Sep 17 00:00:00 2001 From: Androz Date: Fri, 6 Aug 2021 10:35:19 +0200 Subject: [PATCH 192/215] :pencil: Remove useless import in readme v5 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6217648..2df028e 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ settings = { token: "Your Discord Token" }; -const { Player, QueryType } = require("discord-player"); +const { Player } = require("discord-player"); // Create a new Player (you don't need any API Key) const player = new Player(client); From ac5caa4b5c2b7aa3bb4f2df4299afeb9c3d93c6c Mon Sep 17 00:00:00 2001 From: DevAndromeda <46562212+DevAndromeda@users.noreply.github.com> Date: Sat, 7 Aug 2021 12:11:20 +0545 Subject: [PATCH 193/215] refactor(Util): make noop function instead of getter --- package.json | 2 +- src/utils/Util.ts | 4 +- yarn.lock | 409 +++++++++++++--------------------------------- 3 files changed, 113 insertions(+), 302 deletions(-) diff --git a/package.json b/package.json index 0706b5a..4232368 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "@typescript-eslint/eslint-plugin": "^4.29.0", "@typescript-eslint/parser": "^4.29.0", "discord-api-types": "^0.22.0", - "discord.js": "^13.0.0-dev.t1628124537.3eb4140", + "discord.js": "^13.0.0", "eslint": "^7.32.0", "gen-esm-wrapper": "^1.1.2", "husky": "^7.0.1", diff --git a/src/utils/Util.ts b/src/utils/Util.ts index 17b44c6..70bf999 100644 --- a/src/utils/Util.ts +++ b/src/utils/Util.ts @@ -93,9 +93,7 @@ class Util { return new Promise((r) => setTimeout(r, time)); } - static get noop() { - return () => {}; // eslint-disable-line @typescript-eslint/no-empty-function - } + static noop() { } // eslint-disable-line @typescript-eslint/no-empty-function } export { Util }; diff --git a/yarn.lock b/yarn.lock index aa6cc9e..d7c135c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -32,12 +32,7 @@ dependencies: "@babel/highlight" "^7.14.5" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.5", "@babel/compat-data@^7.14.7": - version "7.14.7" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.7.tgz#7b047d7a3a89a67d2258dc61f604f098f1bc7e08" - integrity sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw== - -"@babel/compat-data@^7.15.0": +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.7", "@babel/compat-data@^7.15.0": version "7.15.0" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== @@ -63,24 +58,6 @@ semver "^6.3.0" source-map "^0.5.0" -"@babel/generator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.5.tgz#848d7b9f031caca9d0cd0af01b063f226f52d785" - integrity sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA== - dependencies: - "@babel/types" "^7.14.5" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@^7.14.8": - version "7.14.8" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.8.tgz#bf86fd6af96cf3b74395a8ca409515f89423e070" - integrity sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg== - dependencies: - "@babel/types" "^7.14.8" - jsesc "^2.5.1" - source-map "^0.5.0" - "@babel/generator@^7.15.0": version "7.15.0" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.0.tgz#a7d0c172e0d814974bad5aa77ace543b97917f15" @@ -105,17 +82,7 @@ "@babel/helper-explode-assignable-expression" "^7.14.5" "@babel/types" "^7.14.5" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz#7a99c5d0967911e972fe2c3411f7d5b498498ecf" - integrity sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw== - dependencies: - "@babel/compat-data" "^7.14.5" - "@babel/helper-validator-option" "^7.14.5" - browserslist "^4.16.6" - semver "^6.3.0" - -"@babel/helper-compilation-targets@^7.15.0": +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.14.5", "@babel/helper-compilation-targets@^7.15.0": version "7.15.0" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz#973df8cbd025515f3ff25db0c05efc704fa79818" integrity sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A== @@ -125,19 +92,7 @@ browserslist "^4.16.6" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.14.5": - version "7.14.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz#f114469b6c06f8b5c59c6c4e74621f5085362542" - integrity sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-member-expression-to-functions" "^7.14.5" - "@babel/helper-optimise-call-expression" "^7.14.5" - "@babel/helper-replace-supers" "^7.14.5" - "@babel/helper-split-export-declaration" "^7.14.5" - -"@babel/helper-create-class-features-plugin@^7.15.0": +"@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.15.0": version "7.15.0" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.0.tgz#c9a137a4d137b2d0e2c649acf536d7ba1a76c0f7" integrity sha512-MdmDXgvTIi4heDVX/e9EFfeGpugqm9fobBVg/iioE8kueXrOHdRDe36FAY7SnE9xXLVeYCoJR/gdrBEIHRC83Q== @@ -201,13 +156,6 @@ dependencies: "@babel/types" "^7.14.5" -"@babel/helper-member-expression-to-functions@^7.14.5": - version "7.14.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz#97e56244beb94211fe277bd818e3a329c66f7970" - integrity sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA== - dependencies: - "@babel/types" "^7.14.5" - "@babel/helper-member-expression-to-functions@^7.15.0": version "7.15.0" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz#0ddaf5299c8179f27f37327936553e9bba60990b" @@ -222,21 +170,7 @@ dependencies: "@babel/types" "^7.14.5" -"@babel/helper-module-transforms@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz#7de42f10d789b423eb902ebd24031ca77cb1e10e" - integrity sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA== - dependencies: - "@babel/helper-module-imports" "^7.14.5" - "@babel/helper-replace-supers" "^7.14.5" - "@babel/helper-simple-access" "^7.14.5" - "@babel/helper-split-export-declaration" "^7.14.5" - "@babel/helper-validator-identifier" "^7.14.5" - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/helper-module-transforms@^7.15.0": +"@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.15.0": version "7.15.0" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz#679275581ea056373eddbe360e1419ef23783b08" integrity sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg== @@ -271,17 +205,7 @@ "@babel/helper-wrap-function" "^7.14.5" "@babel/types" "^7.14.5" -"@babel/helper-replace-supers@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz#0ecc0b03c41cd567b4024ea016134c28414abb94" - integrity sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.14.5" - "@babel/helper-optimise-call-expression" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/helper-replace-supers@^7.15.0": +"@babel/helper-replace-supers@^7.14.5", "@babel/helper-replace-supers@^7.15.0": version "7.15.0" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz#ace07708f5bf746bf2e6ba99572cce79b5d4e7f4" integrity sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA== @@ -291,13 +215,6 @@ "@babel/traverse" "^7.15.0" "@babel/types" "^7.15.0" -"@babel/helper-simple-access@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz#66ea85cf53ba0b4e588ba77fc813f53abcaa41c4" - integrity sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw== - dependencies: - "@babel/types" "^7.14.5" - "@babel/helper-simple-access@^7.14.8": version "7.14.8" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz#82e1fec0644a7e775c74d305f212c39f8fe73924" @@ -319,17 +236,7 @@ dependencies: "@babel/types" "^7.14.5" -"@babel/helper-validator-identifier@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz#d0f0e277c512e0c938277faa85a3968c9a44c0e8" - integrity sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg== - -"@babel/helper-validator-identifier@^7.14.8": - version "7.14.8" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz#32be33a756f29e278a0d644fa08a2c9e0f88a34c" - integrity sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow== - -"@babel/helper-validator-identifier@^7.14.9": +"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9": version "7.14.9" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48" integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g== @@ -367,17 +274,7 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.14.5", "@babel/parser@^7.14.7", "@babel/parser@^7.9.4": - version "7.14.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.7.tgz#6099720c8839ca865a2637e6c85852ead0bdb595" - integrity sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA== - -"@babel/parser@^7.14.8": - version "7.14.8" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.8.tgz#66fd41666b2d7b840bd5ace7f7416d5ac60208d4" - integrity sha512-syoCQFOoo/fzkWDeM0dLEZi5xqurb5vuyzwIMNZRNun+N/9A4cUZeQaE7dTrB8jGaKuJRBtEOajtnmw0I5hvvA== - -"@babel/parser@^7.15.0": +"@babel/parser@^7.14.5", "@babel/parser@^7.15.0", "@babel/parser@^7.9.4": version "7.15.0" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.0.tgz#b6d6e29058ca369127b0eeca2a1c4b5794f1b6b9" integrity sha512-0v7oNOjr6YT9Z2RAOTv4T9aP+ubfx4Q/OhVtAet7PFDt0t9Oy6Jn+/rfC6b8HJ5zEqrQCiMxJfgtHpmIminmJQ== @@ -981,9 +878,9 @@ "@babel/plugin-transform-typescript" "^7.15.0" "@babel/runtime@^7.8.4": - version "7.14.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.6.tgz#535203bc0892efc7dec60bdc27b2ecf6e409062d" - integrity sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg== + version "7.14.8" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.8.tgz#7119a56f421018852694290b9f9148097391b446" + integrity sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg== dependencies: regenerator-runtime "^0.13.4" @@ -996,37 +893,7 @@ "@babel/parser" "^7.14.5" "@babel/types" "^7.14.5" -"@babel/traverse@^7.13.0", "@babel/traverse@^7.14.5": - version "7.14.7" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.7.tgz#64007c9774cfdc3abd23b0780bc18a3ce3631753" - integrity sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.14.5" - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-hoist-variables" "^7.14.5" - "@babel/helper-split-export-declaration" "^7.14.5" - "@babel/parser" "^7.14.7" - "@babel/types" "^7.14.5" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.14.8": - version "7.14.8" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.8.tgz#c0253f02677c5de1a8ff9df6b0aacbec7da1a8ce" - integrity sha512-kexHhzCljJcFNn1KYAQ6A5wxMRzq9ebYpEDV4+WdNyr3i7O44tanbDOR/xjiG2F3sllan+LgwK+7OMk0EmydHg== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.14.8" - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-hoist-variables" "^7.14.5" - "@babel/helper-split-export-declaration" "^7.14.5" - "@babel/parser" "^7.14.8" - "@babel/types" "^7.14.8" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.15.0": +"@babel/traverse@^7.13.0", "@babel/traverse@^7.14.5", "@babel/traverse@^7.14.8", "@babel/traverse@^7.15.0": version "7.15.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.0.tgz#4cca838fd1b2a03283c1f38e141f639d60b3fc98" integrity sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw== @@ -1041,23 +908,7 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.14.5", "@babel/types@^7.4.4": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.5.tgz#3bb997ba829a2104cedb20689c4a5b8121d383ff" - integrity sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg== - dependencies: - "@babel/helper-validator-identifier" "^7.14.5" - to-fast-properties "^2.0.0" - -"@babel/types@^7.14.8": - version "7.14.8" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.8.tgz#38109de8fcadc06415fbd9b74df0065d4d41c728" - integrity sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q== - dependencies: - "@babel/helper-validator-identifier" "^7.14.8" - to-fast-properties "^2.0.0" - -"@babel/types@^7.15.0": +"@babel/types@^7.14.5", "@babel/types@^7.14.8", "@babel/types@^7.15.0", "@babel/types@^7.4.4": version "7.15.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.0.tgz#61af11f2286c4e9c69ca8deb5f4375a73c72dcbd" integrity sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ== @@ -1085,15 +936,15 @@ node-fetch "^2.6.1" reverbnation-scraper "^2.0.0" -"@discordjs/builders@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-0.3.0.tgz#af507c1c5a39039ebdba7233c7eb404c873b6f7a" - integrity sha512-yFBPqohVAtCWoDTQCYk5ubgmkiRbGpbiR4RfYGHCmV5S2YZc7j8WzfKVksjuy2o5IWRfXFsW6G2Lr+KpW41pEA== +"@discordjs/builders@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-0.4.0.tgz#bb41573ce4824aa9194a53b52c29c5219b610010" + integrity sha512-EiwLltKph6TSaPJIzJYdzNc1PnA2ZNaaE0t0ODg3ghnpVHqfgd0YX9/srsleYHW2cw1sfIq+kbM+h0etf7GWLA== dependencies: "@sindresorhus/is" "^4.0.1" discord-api-types "^0.22.0" - ow "^0.26.0" - ts-mixer "^5.4.1" + ow "^0.27.0" + ts-mixer "^6.0.0" tslib "^2.3.0" "@discordjs/collection@^0.2.1": @@ -1253,33 +1104,21 @@ integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== "@tsconfig/node16@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.1.tgz#a6ca6a9a0ff366af433f42f5f0e124794ff6b8f1" - integrity sha512-FTgBI767POY/lKNDNbIzgAX6miIDBs6NTCbdlDb8TrWovHsSvaVIZDlTqym29C6UqhzwcJx4CYr+AlrMywA0cA== + version "1.0.2" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" + integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== "@types/json-schema@^7.0.7": - version "7.0.8" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.8.tgz#edf1bf1dbf4e04413ca8e5b17b3b7d7d54b59818" - integrity sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg== + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== -"@types/node@*": - version "16.3.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.3.1.tgz#24691fa2b0c3ec8c0d34bfcfd495edac5593ebb4" - integrity sha512-N87VuQi7HEeRJkhzovao/JviiqKjDKMVKxKMfUvSKw+MbkbW8R0nA3fi/MQhhlxV2fQ+2ReM+/Nt4efdrJx3zA== +"@types/node@*", "@types/node@^16.4.12": + version "16.4.13" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.4.13.tgz#7dfd9c14661edc65cccd43a29eb454174642370d" + integrity sha512-bLL69sKtd25w7p1nvg9pigE4gtKVpGTPojBFLMkGHXuUgap2sLqQt2qUnqmVCDfzGUL0DRNZP+1prIZJbMeAXg== -"@types/node@^16.4.12": - version "16.4.12" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.4.12.tgz#961e3091f263e6345d2d84afab4e047a60b4b11b" - integrity sha512-zxrTNFl9Z8boMJXs6ieqZP0wAhvkdzmHSxTlJabM16cf5G9xBc1uPRH5Bbv2omEDDiM8MzTfqTJXBf0Ba4xFWA== - -"@types/ws@^7.4.4": - version "7.4.6" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.6.tgz#c4320845e43d45a7129bb32905e28781c71c1fff" - integrity sha512-ijZ1vzRawI7QoWnTNL8KpHixd2b2XVb9I9HAqI3triPsh1EC0xH0Eg6w2O3TKbDCgiNNlJqfrof6j4T2I+l9vw== - dependencies: - "@types/node" "*" - -"@types/ws@^7.4.5", "@types/ws@^7.4.7": +"@types/ws@^7.4.4", "@types/ws@^7.4.7": version "7.4.7" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== @@ -1365,13 +1204,6 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - acorn-globals@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" @@ -1418,9 +1250,9 @@ ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4: uri-js "^4.2.2" ajv@^8.0.1: - version "8.6.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.1.tgz#ae65764bf1edde8cd861281cda5057852364a295" - integrity sha512-42VLtQUOLefAvKFAQIxIZDaThq6om/PrfP0CYk3/vn+y4BMNkKnbli8ON2QCiHov4KkzOSJ/xSoBJdayiiYvVQ== + version "8.6.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.2.tgz#2fb45e0e5fcbc0813326c1c3da535d1881bb0571" + integrity sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -1555,7 +1387,7 @@ array-back@^2.0.0: dependencies: typical "^2.6.1" -array-back@^3.0.1: +array-back@^3.0.1, array-back@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== @@ -1637,9 +1469,9 @@ babel-plugin-polyfill-corejs2@^0.2.2: semver "^6.1.1" babel-plugin-polyfill-corejs3@^0.2.2: - version "0.2.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz#72add68cf08a8bf139ba6e6dfc0b1d504098e57b" - integrity sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g== + version "0.2.4" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.4.tgz#68cb81316b0e8d9d721a92e0009ec6ecd4cd2ca9" + integrity sha512-z3HnJE5TY/j4EFEa/qpQMSbcUJZ5JQi+3UFjXzn6pQCmIKc5Ug5j98SuYyH+m4xQnvKlMDIW4plLfgyVnd0IcQ== dependencies: "@babel/helper-define-polyfill-provider" "^0.2.2" core-js-compat "^3.14.0" @@ -1726,20 +1558,20 @@ browser-process-hrtime@^1.0.0: integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== browserslist@^4.16.6: - version "4.16.6" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" - integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== + version "4.16.7" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.7.tgz#108b0d1ef33c4af1b587c54f390e7041178e4335" + integrity sha512-7I4qVwqZltJ7j37wObBe3SoTz+nS8APaNcrBOlgoirb6/HbEU2XxW/LpUDTCngM6iauwFqmRTuOMfyKnFGY5JA== dependencies: - caniuse-lite "^1.0.30001219" + caniuse-lite "^1.0.30001248" colorette "^1.2.2" - electron-to-chromium "^1.3.723" + electron-to-chromium "^1.3.793" escalade "^3.1.1" - node-releases "^1.1.71" + node-releases "^1.1.73" buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== cache-base@^1.0.1: version "1.0.1" @@ -1783,10 +1615,10 @@ camelcase@^5.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@^1.0.30001219: - version "1.0.30001243" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001243.tgz#d9250155c91e872186671c523f3ae50cfc94a3aa" - integrity sha512-vNxw9mkTBtkmLFnJRv/2rhs1yufpDfCkBZexG3Y0xdOH2Z/eE/85E4Dl5j1YUN34nZVsSp6vVRFQRrez9wJMRA== +caniuse-lite@^1.0.30001248: + version "1.0.30001249" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001249.tgz#90a330057f8ff75bfe97a94d047d5e14fabb2ee8" + integrity sha512-vcX4U8lwVXPdqzPWi6cAJ3FnQaqXbBqy/GZseKNQzRj37J7qZdGcBtxq/QLFNLLlfsoXLUdHw8Iwenri86Tagw== catharsis@^0.9.0: version "0.9.0" @@ -1805,9 +1637,9 @@ chalk@^2.0.0, chalk@^2.1.0: supports-color "^5.3.0" chalk@^4.0.0, chalk@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" - integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" @@ -1950,11 +1782,11 @@ combined-stream@^1.0.8: delayed-stream "~1.0.0" command-line-args@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.1.1.tgz#88e793e5bb3ceb30754a86863f0401ac92fd369a" - integrity sha512-hL/eG8lrll1Qy1ezvkant+trihbGnaKaeEjj6Scyr3DN+RC7iQ5Rz84IeLERfAWDGo0HBSNAakczwgCilDXnWg== + version "5.2.0" + resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.0.tgz#087b02748272169741f1fd7c785b295df079b9be" + integrity sha512-4zqtU1hYsSJzcJBOcNZIbW5Fbk9BkjCp1pZVhQKoRaWL5J7N4XphDLwo8aWwdQpTugxwu+jf9u2ZhkXiqp5Z6A== dependencies: - array-back "^3.0.1" + array-back "^3.1.0" find-replace "^3.0.0" lodash.camelcase "^4.3.0" typical "^4.0.0" @@ -2029,15 +1861,7 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js-compat@^3.14.0: - version "3.15.2" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.15.2.tgz#47272fbb479880de14b4e6081f71f3492f5bd3cb" - integrity sha512-Wp+BJVvwopjI+A1EFqm2dwUmWYXrvucmtIB2LgXn/Rb+gWPKYxtmb4GKHGKG/KGF1eK9jfjzT38DITbTOCX/SQ== - dependencies: - browserslist "^4.16.6" - semver "7.0.0" - -core-js-compat@^3.16.0: +core-js-compat@^3.14.0, core-js-compat@^3.16.0: version "3.16.0" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.16.0.tgz#fced4a0a534e7e02f7e084bff66c701f8281805f" integrity sha512-5D9sPHCdewoUK7pSUPfTF7ZhLh8k9/CoJXWUEo+F1dZT5Z1DVgcuRqUKhjeKW+YLb8f21rTFgWwQJiNw1hoZ5Q== @@ -2236,17 +2060,16 @@ discord-ytdl-core@^5.0.4: dependencies: prism-media "^1.2.9" -discord.js@^13.0.0-dev.t1628124537.3eb4140: - version "13.0.0-dev.t1628124537.3eb4140" - resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0-dev.t1628124537.3eb4140.tgz#a22bd919d895cc02dfdae7f148e2b27fc6d53f24" - integrity sha512-f14hhyXoqxU/LE+6qeLTj+LYgsIKmRF2M6JaMyyUfTjhCvpz0Y3Z0ZKjYRXtQa0jw4WiFlHIYUn5SiVUGoZl+Q== +discord.js@^13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0.tgz#fd1dde0e73f5dbcd0bf8edad68d3ef83fb2e36b7" + integrity sha512-QbGcxBFUuB6tIJ/xn6R86QeSolS0KGa9nsWcKegtaNWAggajVILA+eneZIZba38jqYes+FB4RHhg/kX3dm4v+Q== dependencies: - "@discordjs/builders" "^0.3.0" + "@discordjs/builders" "^0.4.0" "@discordjs/collection" "^0.2.1" "@discordjs/form-data" "^3.0.1" "@sapphire/async-queue" "^1.1.4" - "@types/ws" "^7.4.5" - abort-controller "^3.0.0" + "@types/ws" "^7.4.7" discord-api-types "^0.22.0" node-fetch "^2.6.1" ws "^7.5.1" @@ -2320,10 +2143,10 @@ dot-prop@^6.0.1: dependencies: is-obj "^2.0.0" -electron-to-chromium@^1.3.723: - version "1.3.772" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.772.tgz#fd1ed39f9f3149f62f581734e4f026e600369479" - integrity sha512-X/6VRCXWALzdX+RjCtBU6cyg8WZgoxm9YA02COmDOiNJEZ59WkQggDbWZ4t/giHi/3GS+cvdrP6gbLISANAGYA== +electron-to-chromium@^1.3.793: + version "1.3.798" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.798.tgz#12b0bb826ddf35486f2ca41c01be4bd6ad1b9b1e" + integrity sha512-fwsr6oXAORoV9a6Ak2vMCdXfmHIpAGgpOGesulS1cbGgJmrMl3H+GicUyRG3t+z9uHTMrIuMTleFDW+EUFYT3g== emoji-regex@^7.0.1: version "7.0.3" @@ -2564,11 +2387,6 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -2744,9 +2562,9 @@ flatted@^2.0.0: integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== flatted@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.1.tgz#bbef080d95fca6709362c73044a1634f7c6e7d05" - integrity sha512-OMQjaErSFHmHqZe+PSidH5n8j3O0F2DdnVh8JB4j4eUQ2k6KvB0qGfrKIhapvez5JerBbmWkaLYUYWISaESoXg== + version "3.2.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561" + integrity sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA== follow-redirects@^1.10.0: version "1.14.1" @@ -2915,9 +2733,9 @@ globby@^11.0.3: slash "^3.0.0" graceful-fs@^4.1.11, graceful-fs@^4.1.9: - version "4.2.6" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" - integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + version "4.2.8" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== handlebars@^4.5.3: version "4.7.7" @@ -3134,9 +2952,9 @@ is-buffer@^1.1.5: integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-core-module@^2.2.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" - integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== + version "2.5.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.5.0.tgz#f754843617c70bfd29b7bd87327400cda5c18491" + integrity sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg== dependencies: has "^1.0.3" @@ -3377,9 +3195,9 @@ jsdoc@^3.6.3: underscore "~1.13.1" jsdom@^16.5.3: - version "16.6.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.6.0.tgz#f79b3786682065492a3da6a60a4695da983805ac" - integrity sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg== + version "16.7.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" + integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== dependencies: abab "^2.0.5" acorn "^8.2.4" @@ -3406,7 +3224,7 @@ jsdom@^16.5.3: whatwg-encoding "^1.0.5" whatwg-mimetype "^2.3.0" whatwg-url "^8.5.0" - ws "^7.4.5" + ws "^7.4.6" xml-name-validator "^3.0.0" jsesc@^2.5.1: @@ -3682,17 +3500,17 @@ micromatch@^4.0.4: braces "^3.0.1" picomatch "^2.2.3" -mime-db@1.48.0: - version "1.48.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d" - integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== +mime-db@1.49.0: + version "1.49.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed" + integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA== mime-types@^2.1.12: - version "2.1.31" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b" - integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg== + version "2.1.32" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5" + integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A== dependencies: - mime-db "1.48.0" + mime-db "1.49.0" mimic-fn@^2.1.0: version "2.1.0" @@ -3813,7 +3631,7 @@ node-fetch@2.6.1, node-fetch@^2.6.0, node-fetch@^2.6.1: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== -node-releases@^1.1.71: +node-releases@^1.1.73: version "1.1.73" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.73.tgz#dd4e81ddd5277ff846b80b52bb40c49edf7a7b20" integrity sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg== @@ -3960,10 +3778,10 @@ os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -ow@^0.26.0: - version "0.26.0" - resolved "https://registry.yarnpkg.com/ow/-/ow-0.26.0.tgz#5b8f61221ab31431f964caa6eaa0ed574e21a56e" - integrity sha512-22YUQW9d6oUSCpIQuBV25djtC1uMtpWqmtUYnuh2UHWeNMpppCFCvq3eSBIWWMDbe2UVq26kWYvBHDzOIu5NYg== +ow@^0.27.0: + version "0.27.0" + resolved "https://registry.yarnpkg.com/ow/-/ow-0.27.0.tgz#d44da088e8184fa11de64b5813206f9f86ab68d0" + integrity sha512-SGnrGUbhn4VaUGdU0EJLMwZWSupPmF46hnTRII7aCLCrqixTAC5eKo8kI4/XXf1eaaI8YEVT+3FeGNJI9himAQ== dependencies: "@sindresorhus/is" "^4.0.1" callsites "^3.1.0" @@ -4176,9 +3994,9 @@ regenerate@^1.4.0: integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== regenerator-runtime@^0.13.4: - version "0.13.7" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" - integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== regenerator-transform@^0.14.2: version "0.14.5" @@ -4747,9 +4565,9 @@ taffydb@2.6.2: integrity sha1-fLy2S1oUG2ou/CxdLGe04VCyomg= tar@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.0.tgz#d1724e9bcc04b977b18d5c573b333a2207229a83" - integrity sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA== + version "6.1.6" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.6.tgz#c23d797b0a1efe5d479b1490805c5443f3560c5d" + integrity sha512-oaWyu5dQbHaYcyZCTfyPpC+VmI62/OM2RTUYavTk1MDr1cwW5Boi3baeYQKiZbY2uSQJGr+iMOzb/JFxLrft+g== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" @@ -4797,12 +4615,7 @@ through@^2.3.6: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -tiny-typed-emitter@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/tiny-typed-emitter/-/tiny-typed-emitter-2.0.3.tgz#4335e3a75127ae7faba91b02e91615d97dc8db7d" - integrity sha512-MaCqhHlp6EAWN25yqBlajgd4scxxI2eJr7+EgoUAOV9UkMU3us/yp2bEnc2yOvyeDF8TUWuaz3zZCPGTKFJIpA== - -tiny-typed-emitter@^2.1.0: +tiny-typed-emitter@^2.0.3, tiny-typed-emitter@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz#b3b027fdd389ff81a152c8e847ee2f5be9fad7b5" integrity sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA== @@ -4867,10 +4680,10 @@ tr46@^2.1.0: dependencies: punycode "^2.1.1" -ts-mixer@^5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/ts-mixer/-/ts-mixer-5.4.1.tgz#b90db9ced48531aa17ce9184a2890d1e3c99b1e5" - integrity sha512-Zo9HgPCtNouDgJ+LGtrzVOjSg8+7WGQktIKLwAfaNrlOK1mWGlz1ejsAF/YqUEqAGjUTeB5fEg8gH9Aui6w9xA== +ts-mixer@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/ts-mixer/-/ts-mixer-6.0.0.tgz#4e631d3a36e3fa9521b973b132e8353bc7267f9f" + integrity sha512-nXIb1fvdY5CBSrDIblLn73NW0qRDk5yJ0Sk1qPBF560OdJfQp9jhl+0tzcY09OZ9U+6GpeoI9RjwoIKFIoB9MQ== ts-node@^10.1.0: version "10.1.0" @@ -4940,9 +4753,9 @@ type-fest@^0.8.1: integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== type-fest@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.3.0.tgz#6be848243853df1173fa95530112e1358ab0810b" - integrity sha512-mYUYkAy6fPatVWtUeCV/qGeGL3IVucmdJOzeAEfwgCJDx8gP0JaW8jn6KQ5xDfPec31e0KXWn5EUOZMhquR1zA== + version "1.4.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" + integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== typescript@^4.3.5: version "4.3.5" @@ -4965,9 +4778,9 @@ uc.micro@^1.0.1, uc.micro@^1.0.5: integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== uglify-js@^3.1.4: - version "3.13.10" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.10.tgz#a6bd0d28d38f592c3adb6b180ea6e07e1e540a8d" - integrity sha512-57H3ACYFXeo1IaZ1w02sfA71wI60MGco/IQFjOqK+WtKoprh7Go2/yvd2HPtoJILO2Or84ncLccI4xoHMTSbGg== + version "3.14.1" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.14.1.tgz#e2cb9fe34db9cb4cf7e35d1d26dfea28e09a7d06" + integrity sha512-JhS3hmcVaXlp/xSo3PKY5R0JqKs5M3IV+exdLHW99qKvKivPO4Z8qbej6mte17SOPqAOVMjt/XGgWacnFSzM3g== underscore@~1.13.1: version "1.13.1" @@ -5189,7 +5002,7 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -ws@^7.4.4, ws@^7.4.5, ws@^7.5.1: +ws@^7.4.4, ws@^7.4.6, ws@^7.5.1: version "7.5.3" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== From 02ba9b8677097d6e21f0a37a1fc0ea0ac6916695 Mon Sep 17 00:00:00 2001 From: DevAndromeda <46562212+DevAndromeda@users.noreply.github.com> Date: Sat, 7 Aug 2021 12:11:49 +0545 Subject: [PATCH 194/215] chore: prettier --- src/utils/Util.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/Util.ts b/src/utils/Util.ts index 70bf999..8b2c6d8 100644 --- a/src/utils/Util.ts +++ b/src/utils/Util.ts @@ -93,7 +93,7 @@ class Util { return new Promise((r) => setTimeout(r, time)); } - static noop() { } // eslint-disable-line @typescript-eslint/no-empty-function + static noop() {} // eslint-disable-line @typescript-eslint/no-empty-function } export { Util }; From 00ebe2cdfd6fa2b9195802d013d276aa7c5ca1a4 Mon Sep 17 00:00:00 2001 From: DevAndromeda <46562212+DevAndromeda@users.noreply.github.com> Date: Sat, 7 Aug 2021 12:15:54 +0545 Subject: [PATCH 195/215] chore: bump deps --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4232368..fbbb2a7 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "@discord-player/extractor": "^3.0.2", "@discordjs/opus": "^0.5.3", "@favware/rollup-type-bundler": "^1.0.3", - "@types/node": "^16.4.12", + "@types/node": "^16.4.13", "@types/ws": "^7.4.7", "@typescript-eslint/eslint-plugin": "^4.29.0", "@typescript-eslint/parser": "^4.29.0", From 5dc650770ccd2c17cc398e231a37d6e115137bed Mon Sep 17 00:00:00 2001 From: DevAndromeda <46562212+DevAndromeda@users.noreply.github.com> Date: Sat, 7 Aug 2021 12:47:46 +0545 Subject: [PATCH 196/215] docs: update example --- README.md | 85 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 57 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 2df028e..4daec0e 100644 --- a/README.md +++ b/README.md @@ -42,65 +42,94 @@ $ npm install --save @discordjs/opus ## Getting Started -Here is the code you will need to get started with discord-player. Then, you will be able to use `client.player` everywhere in your code! +First of all, you will need to register slash commands: ```js -const Discord = require("discord.js"), -client = new Discord.Client({ intents: ["GUILD_VOICE_STATES", "GUILD_MESSAGES", "GUILDS"] }), -settings = { - prefix: "!", - token: "Your Discord Token" -}; +const { REST } = require("@discordjs/rest"); +const { Routes } = require("discord-api-types/v9"); +const commands = [{ + name: "play", + description: "Plays a song!", + options: [ + { + name: "query", + type: "STRING", + description: "The song you want to play", + required: true + } + ] +}]; + +const rest = new REST({ version: "9" }).setToken(process.env.DISCORD_TOKEN); + +(async () => { + try { + console.log("Started refreshing application [/] commands."); + + await rest.put( + Routes.applicationGuildCommands(CLIENT_ID, GUILD_ID), + { body: commands }, + ); + + console.log("Successfully reloaded application [/] commands."); + } catch (error) { + console.error(error); + } +})(); +``` + +Now you can implement your bot's logic: + +```js +const { Client, Intents } = require("discord.js"); +const client = new Discord.Client({ intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES] }); const { Player } = require("discord-player"); // Create a new Player (you don't need any API Key) const player = new Player(client); -// To easily access the player -client.player = player; - // add the trackStart event so when a song will be played this message will be sent -client.player.on("trackStart", (queue, track) => queue.metadata.channel.send(`Now playing ${track.title}...`)) +player.on("trackStart", (queue, track) => queue.metadata.send(`🎶 | Now playing **${track.title}**!`)) client.once("ready", () => { console.log("I'm ready !"); }); -client.on("message", async (message) => { +client.on("interactionCreate", async (interaction) => { + if (!interaction.isCommand()) return; - const args = message.content.slice(settings.prefix.length).trim().split(/ +/g); - const command = args.shift().toLowerCase(); - - // !play Despacito + // /play Despacito // will play "Despacito" in the voice channel - if (command === "play") { - if (!message.member.voice.channel) return void message.reply("You are not in a voice channel!"); - if (message.guild.me.voice.channel && message.member.voice.channelID !== message.guild.me.voice.channelID) return void message.reply("You are not in my voice channel!"); - - const queue = client.player.createQueue(message.guild, { - metadata: message + if (interaction.commandName === "play") { + if (!interaction.member.voice.channelId) return await interaction.reply({ content: "You are not in a voice channel!", empheral: true }); + if (interaction.guild.me.voice.channelId && interaction.member.voice.channelId !== interaction.guild.me.voice.channelId) return await interaction.reply({ content: "You are not in my voice channel!", empheral: true }); + const query = interaction.options.get("query").value; + const queue = player.createQueue(message.guild, { + metadata: interaction.channel }); // verify vc connection try { - if (!queue.connection) await queue.connect(message.member.voice.channel); + if (!queue.connection) await queue.connect(interaction.member.voice.channel); } catch { queue.destroy(); - return void message.reply("Could not join your voice channel!"); + return await interaction.reply({ content: "Could not join your voice channel!", empheral: true }); } - const track = await client.player.search(args[0], { + await interaction.defer(); + const track = await player.search(query, { requestedBy: message.author }).then(x => x.tracks[1]); - if (!track) return void message.reply("Track not found!"); + if (!track) return await interaction.followUp({ content: `❌ | Track **${query}** not found!` }); queue.play(track); - } + return await interaction.followUp({ content: `⏱️ | Loading track **${track.title}**!` }); + } }); -client.login(settings.token); +client.login(process.env.DISCORD_TOKEN); ``` ## Supported websites From ec47d79663c1faf6f83c4f03404e9f91cb682eb6 Mon Sep 17 00:00:00 2001 From: Andromeda <46562212+DevAndromeda@users.noreply.github.com> Date: Sat, 7 Aug 2021 19:34:14 +0545 Subject: [PATCH 197/215] docs: use main README --- docs/index.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/index.yml b/docs/index.yml index b2cc511..551affa 100644 --- a/docs/index.yml +++ b/docs/index.yml @@ -1,7 +1,8 @@ - name: General files: - name: Welcome - path: welcome.md + id: welcome + path: ../../README.md - name: Migrating files: - name: Migrating to v5 @@ -21,4 +22,4 @@ - name: Using Cookies path: cookies.md - name: Using Proxy - path: proxy.md \ No newline at end of file + path: proxy.md From 8e00bca2dfb41d8beee718f37d08a3fd935018da Mon Sep 17 00:00:00 2001 From: Andromeda <46562212+DevAndromeda@users.noreply.github.com> Date: Sat, 7 Aug 2021 19:34:38 +0545 Subject: [PATCH 198/215] docs: remove unnecessary README --- docs/general/welcome.md | 161 ---------------------------------------- 1 file changed, 161 deletions(-) delete mode 100644 docs/general/welcome.md diff --git a/docs/general/welcome.md b/docs/general/welcome.md deleted file mode 100644 index 6217648..0000000 --- a/docs/general/welcome.md +++ /dev/null @@ -1,161 +0,0 @@ -# Discord Player -Complete framework to facilitate music commands using **[discord.js](https://discord.js.org)**. - -[![downloadsBadge](https://img.shields.io/npm/dt/discord-player?style=for-the-badge)](https://npmjs.com/discord-player) -[![versionBadge](https://img.shields.io/npm/v/discord-player?style=for-the-badge)](https://npmjs.com/discord-player) -[![discordBadge](https://img.shields.io/discord/558328638911545423?style=for-the-badge&color=7289da)](https://androz2091.fr/discord) -[![wakatime](https://wakatime.com/badge/github/Androz2091/discord-player.svg)](https://wakatime.com/badge/github/Androz2091/discord-player) -[![CodeFactor](https://www.codefactor.io/repository/github/androz2091/discord-player/badge/v5)](https://www.codefactor.io/repository/github/androz2091/discord-player/overview/v5) - -## Installation - -### Install **[discord-player](https://npmjs.com/package/discord-player)** - -```sh -$ npm install --save discord-player -``` - -### Install **[@discordjs/opus](https://npmjs.com/package/@discordjs/opus)** - -```sh -$ npm install --save @discordjs/opus -``` - -### Install FFmpeg or Avconv -- Official FFMPEG Website: **[https://www.ffmpeg.org/download.html](https://www.ffmpeg.org/download.html)** - -- Node Module (FFMPEG): **[https://npmjs.com/package/ffmpeg-static](https://npmjs.com/package/ffmpeg-static)** - -- Avconv: **[https://libav.org/download](https://libav.org/download)** - -# Features -- Simple & easy to use 🤘 -- Beginner friendly 😱 -- Audio filters 🎸 -- Lightweight 🛬 -- Custom extractors support 🌌 -- Lyrics 📃 -- Multiple sources support ✌ -- Play in multiple servers at the same time 🚗 - -## [Documentation](https://discord-player.js.org) - -## Getting Started - -Here is the code you will need to get started with discord-player. Then, you will be able to use `client.player` everywhere in your code! - -```js -const Discord = require("discord.js"), -client = new Discord.Client({ intents: ["GUILD_VOICE_STATES", "GUILD_MESSAGES", "GUILDS"] }), -settings = { - prefix: "!", - token: "Your Discord Token" -}; - -const { Player, QueryType } = require("discord-player"); - -// Create a new Player (you don't need any API Key) -const player = new Player(client); - -// To easily access the player -client.player = player; - -// add the trackStart event so when a song will be played this message will be sent -client.player.on("trackStart", (queue, track) => queue.metadata.channel.send(`Now playing ${track.title}...`)) - -client.once("ready", () => { - console.log("I'm ready !"); -}); - -client.on("message", async (message) => { - - const args = message.content.slice(settings.prefix.length).trim().split(/ +/g); - const command = args.shift().toLowerCase(); - - // !play Despacito - // will play "Despacito" in the voice channel - if (command === "play") { - if (!message.member.voice.channel) return void message.reply("You are not in a voice channel!"); - if (message.guild.me.voice.channel && message.member.voice.channelID !== message.guild.me.voice.channelID) return void message.reply("You are not in my voice channel!"); - - const queue = client.player.createQueue(message.guild, { - metadata: message - }); - - // verify vc connection - try { - if (!queue.connection) await queue.connect(message.member.voice.channel); - } catch { - queue.destroy(); - return void message.reply("Could not join your voice channel!"); - } - - const track = await client.player.search(args[0], { - requestedBy: message.author - }).then(x => x.tracks[1]); - if (!track) return void message.reply("Track not found!"); - - queue.play(track); - } - -}); - -client.login(settings.token); -``` - -## Supported websites - -By default, discord-player supports **YouTube**, **Spotify** and **SoundCloud** streams only. - -### Optional dependencies - -Discord Player provides an **Extractor API** that enables you to use your custom stream extractor with it. Some packages have been made by the community to add new features using this API. - -#### [@discord-player/extractor](https://github.com/Snowflake107/discord-player-extractors) (optional) - -Optional package that adds support for `vimeo`, `reverbnation`, `facebook`, `attachment links` and `lyrics`. -You just need to install it using `npm i --save @discord-player/extractor` (discord-player will automatically detect and use it). - -#### [@discord-player/downloader](https://github.com/DevSnowflake/discord-player-downloader) (optional) - -`@discord-player/downloader` is an optional package that brings support for +700 websites. The documentation is available [here](https://github.com/DevSnowflake/discord-player-downloader). - -## Examples of bots made with Discord Player - -These bots are made by the community, they can help you build your own! - -* [AtlantaBot](https://github.com/Androz2091/AtlantaBot) by [Androz2091](https://github.com/Androz2091) -* [Discord-Music](https://github.com/inhydrox/discord-music) by [inhydrox](https://github.com/inhydrox) -* [Music-bot](https://github.com/ZerioDev/Music-bot) by [ZerioDev](https://github.com/ZerioDev) - -## Advanced - -### Use cookies - -```js -const player = new Player(client, { - ytdlOptions: { - requestOptions: { - headers: { - cookie: "YOUR_YOUTUBE_COOKIE" - } - } - } -}); -``` - -### Use custom proxies - -```js -const HttpsProxyAgent = require("https-proxy-agent"); - -// Remove "user:pass@" if you don't need to authenticate to your proxy. -const proxy = "http://user:pass@111.111.111.111:8080"; -const agent = HttpsProxyAgent(proxy); - -const player = new Player(client, { - ytdlOptions: { - requestOptions: { agent } - } -}); -``` From 59b1c60440418bd2ccdf2f306bb753d1dcc13a7e Mon Sep 17 00:00:00 2001 From: DevAndromeda <46562212+DevAndromeda@users.noreply.github.com> Date: Sat, 7 Aug 2021 20:10:21 +0545 Subject: [PATCH 199/215] feat: create PlayerError --- src/Player.ts | 15 +++-- src/Structures/PlayerError.ts | 48 ++++++++++++++ src/Structures/Queue.ts | 88 ++++++++++++++------------ src/VoiceInterface/StreamDispatcher.ts | 3 +- src/index.ts | 1 + 5 files changed, 106 insertions(+), 49 deletions(-) create mode 100644 src/Structures/PlayerError.ts diff --git a/src/Player.ts b/src/Player.ts index 7e1869b..392fb80 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -8,6 +8,7 @@ import { QueryResolver } from "./utils/QueryResolver"; import YouTube from "youtube-sr"; import { Util } from "./utils/Util"; import Spotify from "spotify-url-info"; +import { PlayerError, ErrorStatusCode } from "./Structures/PlayerError"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import { Client as SoundCloud } from "soundcloud-scraper"; @@ -128,7 +129,7 @@ class Player extends EventEmitter { */ createQueue(guild: GuildResolvable, queueInitOptions: PlayerOptions & { metadata?: T } = {}): Queue { guild = this.client.guilds.resolve(guild); - if (!guild) throw new Error("Unknown Guild"); + if (!guild) throw new PlayerError("Unknown Guild", ErrorStatusCode.UNKNOWN_GUILD); if (this.queues.has(guild.id)) return this.queues.get(guild.id) as Queue; const _meta = queueInitOptions.metadata; @@ -148,7 +149,7 @@ class Player extends EventEmitter { */ getQueue(guild: GuildResolvable) { guild = this.client.guilds.resolve(guild); - if (!guild) throw new Error("Unknown Guild"); + if (!guild) throw new PlayerError("Unknown Guild", ErrorStatusCode.UNKNOWN_GUILD); return this.queues.get(guild.id) as Queue; } @@ -159,7 +160,7 @@ class Player extends EventEmitter { */ deleteQueue(guild: GuildResolvable) { guild = this.client.guilds.resolve(guild); - if (!guild) throw new Error("Unknown Guild"); + if (!guild) throw new PlayerError("Unknown Guild", ErrorStatusCode.UNKNOWN_GUILD); const prev = this.getQueue(guild); try { @@ -183,7 +184,7 @@ class Player extends EventEmitter { */ async search(query: string | Track, options: SearchOptions) { if (query instanceof Track) return { playlist: null, tracks: [query] }; - if (!options) throw new Error("DiscordPlayer#search needs search options!"); + if (!options) throw new PlayerError("DiscordPlayer#search needs search options!", ErrorStatusCode.INVALID_ARG_TYPE); options.requestedBy = this.client.users.resolve(options.requestedBy); if (!("searchEngine" in options)) options.searchEngine = QueryType.AUTO; @@ -451,7 +452,7 @@ class Player extends EventEmitter { */ // eslint-disable-next-line @typescript-eslint/no-explicit-any use(extractorName: string, extractor: ExtractorModel | any, force = false): ExtractorModel { - if (!extractorName) throw new Error("Cannot use unknown extractor!"); + if (!extractorName) throw new PlayerError("Cannot use unknown extractor!", ErrorStatusCode.UNKNOWN_EXTRACTOR); if (this.extractors.has(extractorName) && !force) return this.extractors.get(extractorName); if (extractor instanceof ExtractorModel) { this.extractors.set(extractorName, extractor); @@ -459,7 +460,7 @@ class Player extends EventEmitter { } for (const method of ["validate", "getInfo"]) { - if (typeof extractor[method] !== "function") throw new Error("Invalid extractor data!"); + if (typeof extractor[method] !== "function") throw new PlayerError("Invalid extractor data!", ErrorStatusCode.INVALID_EXTRACTOR); } const model = new ExtractorModel(extractorName, extractor); @@ -474,7 +475,7 @@ class Player extends EventEmitter { * @returns {ExtractorModel} */ unuse(extractorName: string) { - if (!this.extractors.has(extractorName)) throw new Error(`Cannot find extractor "${extractorName}"`); + if (!this.extractors.has(extractorName)) throw new PlayerError(`Cannot find extractor "${extractorName}"`, ErrorStatusCode.UNKNOWN_EXTRACTOR); const prev = this.extractors.get(extractorName); this.extractors.delete(extractorName); return prev; diff --git a/src/Structures/PlayerError.ts b/src/Structures/PlayerError.ts new file mode 100644 index 0000000..bce0fbc --- /dev/null +++ b/src/Structures/PlayerError.ts @@ -0,0 +1,48 @@ +export enum ErrorStatusCode { + STREAM_ERROR = "StreamError", + AUDIO_PLAYER_ERROR = "AudioPlayerError", + PLAYER_ERROR = "PlayerError", + NO_AUDIO_RESOURCE = "NoAudioResource", + UNKNOWN_GUILD = "UnknownGuild", + INVALID_ARG_TYPE = "InvalidArgType", + UNKNOWN_EXTRACTOR = "UnknownExtractor", + INVALID_EXTRACTOR = "InvalidExtractor", + INVALID_CHANNEL_TYPE = "InvalidChannelType", + INVALID_TRACK = "InvalidTrack", + UNKNOWN_REPEAT_MODE = "UnknownRepeatMode", + TRACK_NOT_FOUND = "TrackNotFound", + NO_CONNECTION = "NoConnection", + DESTROYED_QUEUE = "DestroyedQueue" +} + +export class PlayerError extends Error { + message: string; + statusCode: ErrorStatusCode; + createdAt = new Date(); + + constructor(message: string, code: ErrorStatusCode = ErrorStatusCode.PLAYER_ERROR) { + super(); + + this.message = `[${code}] ${message}`; + this.statusCode = code; + this.name = code; + + Error.captureStackTrace(this); + } + + get createdTimestamp() { + return this.createdAt.getTime(); + } + + valueOf() { + return this.statusCode; + } + + toJSON() { + return { stack: this.stack, code: this.statusCode, created: this.createdTimestamp }; + } + + toString() { + return this.stack; + } +} diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 365a46a..620ba34 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -8,6 +8,7 @@ import { AudioResource, StreamType } from "@discordjs/voice"; import { Util } from "../utils/Util"; import YouTube from "youtube-sr"; import AudioFilters from "../utils/AudioFilters"; +import { PlayerError, ErrorStatusCode } from "./PlayerError"; class Queue { public readonly guild: Guild; @@ -113,7 +114,7 @@ class Queue { * @type {Track} */ get current() { - this.#watchDestroyed(); + if (this.#watchDestroyed()) return; return this.connection.audioResource?.metadata ?? this.tracks[0]; } @@ -130,7 +131,7 @@ class Queue { * @returns {Track} */ nowPlaying() { - this.#watchDestroyed(); + if (this.#watchDestroyed()) return; return this.current; } @@ -140,9 +141,10 @@ class Queue { * @returns {Promise} */ async connect(channel: GuildChannelResolvable) { - this.#watchDestroyed(); + if (this.#watchDestroyed()) return; const _channel = this.guild.channels.resolve(channel) as StageChannel | VoiceChannel; - if (!["GUILD_STAGE_VOICE", "GUILD_VOICE"].includes(_channel?.type)) throw new TypeError(`Channel type must be GUILD_VOICE or GUILD_STAGE_VOICE, got ${_channel?.type}!`); + if (!["GUILD_STAGE_VOICE", "GUILD_VOICE"].includes(_channel?.type)) + throw new PlayerError(`Channel type must be GUILD_VOICE or GUILD_STAGE_VOICE, got ${_channel?.type}!`, ErrorStatusCode.INVALID_ARG_TYPE); const connection = await this.player.voiceUtils.connect(_channel, { deaf: this.options.autoSelfDeaf }); @@ -198,7 +200,7 @@ class Queue { * @returns {void} */ destroy(disconnect = this.options.leaveOnStop) { - this.#watchDestroyed(); + if (this.#watchDestroyed()) return; if (this.connection) this.connection.end(); if (disconnect) this.connection?.disconnect(); this.player.queues.delete(this.guild.id); @@ -211,7 +213,7 @@ class Queue { * @returns {boolean} */ skip() { - this.#watchDestroyed(); + if (this.#watchDestroyed()) return; if (!this.connection) return false; this._filtersUpdate = false; this.connection.end(); @@ -224,8 +226,8 @@ class Queue { * @returns {void} */ addTrack(track: Track) { - this.#watchDestroyed(); - if (!(track instanceof Track)) throw new Error("invalid track"); + if (this.#watchDestroyed()) return; + if (!(track instanceof Track)) throw new PlayerError("invalid track", ErrorStatusCode.INVALID_TRACK); this.tracks.push(track); this.player.emit("trackAdd", this, track); } @@ -235,8 +237,8 @@ class Queue { * @param {Track[]} tracks Array of tracks to add */ addTracks(tracks: Track[]) { - this.#watchDestroyed(); - if (!tracks.every((y) => y instanceof Track)) throw new Error("invalid track"); + if (this.#watchDestroyed()) return; + if (!tracks.every((y) => y instanceof Track)) throw new PlayerError("invalid track", ErrorStatusCode.INVALID_TRACK); this.tracks.push(...tracks); this.player.emit("tracksAdd", this, tracks); } @@ -247,7 +249,7 @@ class Queue { * @returns {boolean} */ setPaused(paused?: boolean) { - this.#watchDestroyed(); + if (this.#watchDestroyed()) return; if (!this.connection) return false; return paused ? this.connection.pause(true) : this.connection.resume(); } @@ -258,7 +260,7 @@ class Queue { * @returns {void} */ setBitrate(bitrate: number | "auto") { - this.#watchDestroyed(); + if (this.#watchDestroyed()) return; if (!this.connection?.audioResource?.encoder) return; if (bitrate === "auto") bitrate = this.connection.channel?.bitrate ?? 64000; this.connection.audioResource.encoder.setBitrate(bitrate); @@ -270,7 +272,7 @@ class Queue { * @returns {boolean} */ setVolume(amount: number) { - this.#watchDestroyed(); + if (this.#watchDestroyed()) return; if (!this.connection) return false; this.#lastVolume = amount; this.options.initialVolume = amount; @@ -282,8 +284,9 @@ class Queue { * @returns {boolean} */ setRepeatMode(mode: QueueRepeatMode) { - this.#watchDestroyed(); - if (![QueueRepeatMode.OFF, QueueRepeatMode.QUEUE, QueueRepeatMode.TRACK, QueueRepeatMode.AUTOPLAY].includes(mode)) throw new Error(`Unknown repeat mode "${mode}"!`); + if (this.#watchDestroyed()) return; + if (![QueueRepeatMode.OFF, QueueRepeatMode.QUEUE, QueueRepeatMode.TRACK, QueueRepeatMode.AUTOPLAY].includes(mode)) + throw new PlayerError(`Unknown repeat mode "${mode}"!`, ErrorStatusCode.UNKNOWN_REPEAT_MODE); if (mode === this.repeatMode) return false; this.repeatMode = mode; return true; @@ -294,7 +297,7 @@ class Queue { * @type {number} */ get volume() { - this.#watchDestroyed(); + if (this.#watchDestroyed()) return; if (!this.connection) return 100; return this.connection.volume; } @@ -326,7 +329,7 @@ class Queue { * @type {number} */ get streamTime() { - this.#watchDestroyed(); + if (this.#watchDestroyed()) return; if (!this.connection) return 0; const playbackTime = this._streamTime + this.connection.streamTime; const NC = this._activeFilters.includes("nightcore") ? 1.25 : null; @@ -337,7 +340,7 @@ class Queue { } set streamTime(time: number) { - this.#watchDestroyed(); + if (this.#watchDestroyed()) return; this.seek(time); } @@ -346,7 +349,7 @@ class Queue { * @returns {AudioFilters} */ getFiltersEnabled() { - this.#watchDestroyed(); + if (this.#watchDestroyed()) return; return AudioFilters.names.filter((x) => this._activeFilters.includes(x)); } @@ -355,7 +358,7 @@ class Queue { * @returns {AudioFilters} */ getFiltersDisabled() { - this.#watchDestroyed(); + if (this.#watchDestroyed()) return; return AudioFilters.names.filter((x) => !this._activeFilters.includes(x)); } @@ -365,7 +368,7 @@ class Queue { * @returns {Promise} */ async setFilters(filters?: QueueFilters) { - this.#watchDestroyed(); + if (this.#watchDestroyed()) return; if (!filters || !Object.keys(filters).length) { // reset filters const streamTime = this.streamTime; @@ -404,7 +407,7 @@ class Queue { * @returns {boolean} */ async seek(position: number) { - this.#watchDestroyed(); + if (this.#watchDestroyed()) return; if (!this.playing || !this.current) return false; if (position < 1) position = 0; if (position >= this.current.durationMS) return this.skip(); @@ -423,9 +426,9 @@ class Queue { * @returns {Promise} */ async back() { - this.#watchDestroyed(); + if (this.#watchDestroyed()) return; const prev = this.previousTracks[this.previousTracks.length - 2]; // because last item is the current track - if (!prev) throw new Error("Could not find previous track"); + if (!prev) throw new PlayerError("Could not find previous track", ErrorStatusCode.TRACK_NOT_FOUND); return await this.play(prev, { immediate: true }); } @@ -434,7 +437,7 @@ class Queue { * Clear this queue */ clear() { - this.#watchDestroyed(); + if (this.#watchDestroyed()) return; this.tracks = []; this.previousTracks = []; } @@ -444,7 +447,7 @@ class Queue { * @returns {void} */ stop() { - this.#watchDestroyed(); + if (this.#watchDestroyed()) return; return this.destroy(); } @@ -453,7 +456,7 @@ class Queue { * @returns {boolean} */ shuffle() { - this.#watchDestroyed(); + if (this.#watchDestroyed()) return; if (!this.tracks.length || this.tracks.length < 3) return false; const currentTrack = this.tracks.shift(); @@ -473,7 +476,7 @@ class Queue { * @returns {Track} */ remove(track: Track | Snowflake | number) { - this.#watchDestroyed(); + if (this.#watchDestroyed()) return; let trackFound: Track = null; if (typeof track === "number") { trackFound = this.tracks[track]; @@ -496,9 +499,9 @@ class Queue { * @returns {void} */ jump(track: Track | number): void { - this.#watchDestroyed(); + if (this.#watchDestroyed()) return; const foundTrack = this.remove(track); - if (!foundTrack) throw new Error("Track not found"); + if (!foundTrack) throw new PlayerError("Track not found", ErrorStatusCode.TRACK_NOT_FOUND); this.tracks.splice(1, 0, foundTrack); return void this.skip(); @@ -510,8 +513,8 @@ class Queue { * @param {number} [index=0] The index where this track should be */ insert(track: Track, index = 0) { - if (!track || !(track instanceof Track)) throw new TypeError("track must be the instance of Track"); - if (typeof index !== "number" || index < 0 || !Number.isFinite(index)) throw new Error(`Invalid index "${index}"`); + if (!track || !(track instanceof Track)) throw new PlayerError("track must be the instance of Track", ErrorStatusCode.INVALID_TRACK); + if (typeof index !== "number" || index < 0 || !Number.isFinite(index)) throw new PlayerError(`Invalid index "${index}"`, ErrorStatusCode.INVALID_ARG_TYPE); this.tracks.splice(index, 0, track); @@ -530,7 +533,7 @@ class Queue { * @returns {PlayerTimestamp} */ getPlayerTimestamp() { - this.#watchDestroyed(); + if (this.#watchDestroyed()) return; const currentStreamTime = this.streamTime; const totalTime = this.current.durationMS; @@ -550,7 +553,7 @@ class Queue { * @returns {string} */ createProgressBar(options: PlayerProgressbarOptions = { timecodes: true }) { - this.#watchDestroyed(); + if (this.#watchDestroyed()) return; const length = typeof options.length === "number" ? (options.length <= 0 || options.length === Infinity ? 15 : options.length) : 15; const index = Math.round((this.streamTime / this.current.durationMS) * length); @@ -581,7 +584,7 @@ class Queue { * @type {Number} */ get totalTime(): number { - this.#watchDestroyed(); + if (this.#watchDestroyed()) return; return this.tracks.length > 0 ? this.tracks.map((t) => t.durationMS).reduce((p, c) => p + c) : 0; } @@ -593,7 +596,7 @@ class Queue { */ async play(src?: Track, options: PlayOptions = {}): Promise { if (!this.destroyed) this.#watchDestroyed(); - if (!this.connection || !this.connection.voiceConnection) throw new Error("Voice connection is not available, use .connect()!"); + if (!this.connection || !this.connection.voiceConnection) throw new PlayerError("Voice connection is not available, use .connect()!", ErrorStatusCode.NO_CONNECTION); if (src && (this.playing || this.tracks.length) && !options.immediate) return this.addTrack(src); const track = options.filtersUpdate && !options.immediate ? src || this.current : src ?? this.tracks.shift(); if (!track) return; @@ -663,7 +666,7 @@ class Queue { * @private */ private async _handleAutoplay(track: Track): Promise { - this.#watchDestroyed(); + if (this.#watchDestroyed()) return; if (!track || ![track.source, track.raw?.source].includes("youtube")) { if (this.options.leaveOnEnd) this.destroy(); return void this.player.emit("queueEnd", this); @@ -692,7 +695,7 @@ class Queue { } *[Symbol.iterator]() { - this.#watchDestroyed(); + if (this.#watchDestroyed()) return; yield* this.tracks; } @@ -701,7 +704,7 @@ class Queue { * @returns {object} */ toJSON() { - this.#watchDestroyed(); + if (this.#watchDestroyed()) return; return { id: this.id, guild: this.guild.id, @@ -716,13 +719,16 @@ class Queue { * @returns {string} */ toString() { - this.#watchDestroyed(); + if (this.#watchDestroyed()) return; if (!this.tracks.length) return "No songs available to display!"; return `**Upcoming Songs:**\n${this.tracks.map((m, i) => `${i + 1}. **${m.title}**`).join("\n")}`; } #watchDestroyed() { - if (this.#destroyed) throw new Error("Cannot use destroyed queue"); + if (this.#destroyed) { + this.player.emit("error", this, new PlayerError("Cannot use destroyed queue", ErrorStatusCode.DESTROYED_QUEUE)); + return true; + } } #getBufferingTimeout() { diff --git a/src/VoiceInterface/StreamDispatcher.ts b/src/VoiceInterface/StreamDispatcher.ts index 311d40a..ecf431c 100644 --- a/src/VoiceInterface/StreamDispatcher.ts +++ b/src/VoiceInterface/StreamDispatcher.ts @@ -16,6 +16,7 @@ import { Duplex, Readable } from "stream"; import { TypedEmitter as EventEmitter } from "tiny-typed-emitter"; import Track from "../Structures/Track"; import { Util } from "../utils/Util"; +import { PlayerError, ErrorStatusCode } from "../Structures/PlayerError"; export interface VoiceEvents { /* eslint-disable @typescript-eslint/no-explicit-any */ @@ -182,7 +183,7 @@ class StreamDispatcher extends EventEmitter { * @returns {Promise} */ async playStream(resource: AudioResource = this.audioResource) { - if (!resource) throw new Error("Audio resource is not available!"); + if (!resource) throw new PlayerError("Audio resource is not available!", ErrorStatusCode.NO_AUDIO_RESOURCE); if (!this.audioResource) this.audioResource = resource; if (this.voiceConnection.state.status !== VoiceConnectionStatus.Ready) await entersState(this.voiceConnection, VoiceConnectionStatus.Ready, 20000); this.audioPlayer.play(resource); diff --git a/src/index.ts b/src/index.ts index 15e1309..49e9ed9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,6 +2,7 @@ export { AudioFilters } from "./utils/AudioFilters"; export { ExtractorModel } from "./Structures/ExtractorModel"; export { Playlist } from "./Structures/Playlist"; export { Player } from "./Player"; +export { PlayerError, ErrorStatusCode } from "./Structures/PlayerError"; export { QueryResolver } from "./utils/QueryResolver"; export { Queue } from "./Structures/Queue"; export { Track } from "./Structures/Track"; From 949f06c9daa04a6758b06190c88698d6951c48db Mon Sep 17 00:00:00 2001 From: DevAndromeda <46562212+DevAndromeda@users.noreply.github.com> Date: Sat, 7 Aug 2021 20:48:34 +0545 Subject: [PATCH 200/215] docs: make example clear --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4daec0e..511d425 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ const { Player } = require("discord-player"); const player = new Player(client); // add the trackStart event so when a song will be played this message will be sent -player.on("trackStart", (queue, track) => queue.metadata.send(`🎶 | Now playing **${track.title}**!`)) +player.on("trackStart", (queue, track) => queue.metadata.channel.send(`🎶 | Now playing **${track.title}**!`)) client.once("ready", () => { console.log("I'm ready !"); @@ -106,7 +106,9 @@ client.on("interactionCreate", async (interaction) => { if (interaction.guild.me.voice.channelId && interaction.member.voice.channelId !== interaction.guild.me.voice.channelId) return await interaction.reply({ content: "You are not in my voice channel!", empheral: true }); const query = interaction.options.get("query").value; const queue = player.createQueue(message.guild, { - metadata: interaction.channel + metadata: { + channel: interaction.channel + } }); // verify vc connection From 5ce8e99d010834cf1f869862b0289c1381bc878e Mon Sep 17 00:00:00 2001 From: Androz2091 Date: Sat, 7 Aug 2021 17:12:15 +0200 Subject: [PATCH 201/215] :pushpin: Install discordjs opus from github --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fbbb2a7..56a7d31 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "@babel/preset-typescript": "^7.15.0", "@devsnowflake/docgen": "devsnowflake/docgen#ts-patch", "@discord-player/extractor": "^3.0.2", - "@discordjs/opus": "^0.5.3", + "@discordjs/opus": "github:discordjs/opus", "@favware/rollup-type-bundler": "^1.0.3", "@types/node": "^16.4.13", "@types/ws": "^7.4.7", From 5a5e3081052cf269e341863d83754812366c04d4 Mon Sep 17 00:00:00 2001 From: DevAndromeda <46562212+DevAndromeda@users.noreply.github.com> Date: Sat, 7 Aug 2021 21:19:31 +0545 Subject: [PATCH 202/215] feat(Player): add connectionTimeout option --- src/Player.ts | 3 ++- src/Structures/Queue.ts | 3 ++- src/VoiceInterface/StreamDispatcher.ts | 6 +++--- src/types/types.ts | 2 ++ 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/Player.ts b/src/Player.ts index 392fb80..f67826e 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -24,7 +24,8 @@ class Player extends EventEmitter { autoRegisterExtractor: true, ytdlOptions: { highWaterMark: 1 << 25 - } + }, + connectionTimeout: 20000 }; public readonly queues = new Collection(); public readonly voiceUtils = new VoiceUtils(); diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 620ba34..03c672c 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -146,7 +146,8 @@ class Queue { if (!["GUILD_STAGE_VOICE", "GUILD_VOICE"].includes(_channel?.type)) throw new PlayerError(`Channel type must be GUILD_VOICE or GUILD_STAGE_VOICE, got ${_channel?.type}!`, ErrorStatusCode.INVALID_ARG_TYPE); const connection = await this.player.voiceUtils.connect(_channel, { - deaf: this.options.autoSelfDeaf + deaf: this.options.autoSelfDeaf, + maxTime: this.player.options.connectionTimeout || 20000 }); this.connection = connection; diff --git a/src/VoiceInterface/StreamDispatcher.ts b/src/VoiceInterface/StreamDispatcher.ts index ecf431c..6f2f702 100644 --- a/src/VoiceInterface/StreamDispatcher.ts +++ b/src/VoiceInterface/StreamDispatcher.ts @@ -41,7 +41,7 @@ class StreamDispatcher extends EventEmitter { * @param {VoiceChannel|StageChannel} channel The connected channel * @private */ - constructor(connection: VoiceConnection, channel: VoiceChannel | StageChannel) { + constructor(connection: VoiceConnection, channel: VoiceChannel | StageChannel, public readonly connectionTimeout: number = 20000) { super(); /** @@ -72,7 +72,7 @@ class StreamDispatcher extends EventEmitter { if (newState.status === VoiceConnectionStatus.Disconnected) { if (newState.reason === VoiceConnectionDisconnectReason.WebSocketClose && newState.closeCode === 4014) { try { - await entersState(this.voiceConnection, VoiceConnectionStatus.Connecting, 5000); + await entersState(this.voiceConnection, VoiceConnectionStatus.Connecting, this.connectionTimeout); } catch { this.voiceConnection.destroy(); } @@ -87,7 +87,7 @@ class StreamDispatcher extends EventEmitter { } else if (!this.readyLock && (newState.status === VoiceConnectionStatus.Connecting || newState.status === VoiceConnectionStatus.Signalling)) { this.readyLock = true; try { - await entersState(this.voiceConnection, VoiceConnectionStatus.Ready, 20000); + await entersState(this.voiceConnection, VoiceConnectionStatus.Ready, this.connectionTimeout); } catch { if (this.voiceConnection.state.status !== VoiceConnectionStatus.Destroyed) this.voiceConnection.destroy(); } finally { diff --git a/src/types/types.ts b/src/types/types.ts index bba4d8b..b40c101 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -454,8 +454,10 @@ export interface PlaylistJSON { * @typedef {object} PlayerInitOptions * @property {boolean} [autoRegisterExtractor=true] If it should automatically register `@discord-player/extractor` * @property {YTDLDownloadOptions} [ytdlOptions={}] The options passed to `ytdl-core` + * @property {number} [connectionTimeout=20000] The voice connection timeout */ export interface PlayerInitOptions { autoRegisterExtractor?: boolean; ytdlOptions?: downloadOptions; + connectionTimeout?: number; } From db806fcce3afa8dfeb3d3b0cb72b0d40e275a074 Mon Sep 17 00:00:00 2001 From: DevAndromeda <46562212+DevAndromeda@users.noreply.github.com> Date: Sat, 7 Aug 2021 21:21:22 +0545 Subject: [PATCH 203/215] feat(Player): add connectionTimeout option --- src/VoiceInterface/VoiceUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/VoiceInterface/VoiceUtils.ts b/src/VoiceInterface/VoiceUtils.ts index df02948..7de4433 100644 --- a/src/VoiceInterface/VoiceUtils.ts +++ b/src/VoiceInterface/VoiceUtils.ts @@ -31,7 +31,7 @@ class VoiceUtils { } ): Promise { const conn = await this.join(channel, options); - const sub = new StreamDispatcher(conn, channel); + const sub = new StreamDispatcher(conn, channel, options.maxTime); this.cache.set(channel.guild.id, sub); return sub; } From bce34c9fc83315dac9ff5849beb961b88b9aa67d Mon Sep 17 00:00:00 2001 From: DevAndromeda <46562212+DevAndromeda@users.noreply.github.com> Date: Sat, 7 Aug 2021 21:21:58 +0545 Subject: [PATCH 204/215] feat(Player): add connectionTimeout option --- src/VoiceInterface/StreamDispatcher.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/VoiceInterface/StreamDispatcher.ts b/src/VoiceInterface/StreamDispatcher.ts index 6f2f702..513178b 100644 --- a/src/VoiceInterface/StreamDispatcher.ts +++ b/src/VoiceInterface/StreamDispatcher.ts @@ -185,7 +185,7 @@ class StreamDispatcher extends EventEmitter { async playStream(resource: AudioResource = this.audioResource) { if (!resource) throw new PlayerError("Audio resource is not available!", ErrorStatusCode.NO_AUDIO_RESOURCE); if (!this.audioResource) this.audioResource = resource; - if (this.voiceConnection.state.status !== VoiceConnectionStatus.Ready) await entersState(this.voiceConnection, VoiceConnectionStatus.Ready, 20000); + if (this.voiceConnection.state.status !== VoiceConnectionStatus.Ready) await entersState(this.voiceConnection, VoiceConnectionStatus.Ready, this.connectionTimeout); this.audioPlayer.play(resource); return this; From 2575e2ab724771817ab003356878439a01373d80 Mon Sep 17 00:00:00 2001 From: DevAndromeda <46562212+DevAndromeda@users.noreply.github.com> Date: Sat, 7 Aug 2021 22:56:00 +0545 Subject: [PATCH 205/215] fix(Util): fix time code builder --- src/utils/Util.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/utils/Util.ts b/src/utils/Util.ts index 8b2c6d8..18f8e80 100644 --- a/src/utils/Util.ts +++ b/src/utils/Util.ts @@ -43,11 +43,12 @@ class Util { const items = Object.keys(duration); const required = ["days", "hours", "minutes", "seconds"]; - const parsed = items.filter((x) => required.includes(x)).map((m) => (duration[m as keyof TimeData] > 0 ? duration[m as keyof TimeData] : "")); + const parsed = items.filter((x) => required.includes(x)).map((m) => duration[m as keyof TimeData]); const final = parsed - .filter((x) => !!x) + .slice(parsed.findIndex((x) => x !== 0)) .map((x) => x.toString().padStart(2, "0")) .join(":"); + return final.length <= 3 ? `0:${final.padStart(2, "0") || 0}` : final; } From a0e0306b219283b20bf08563a0cfecac9261003b Mon Sep 17 00:00:00 2001 From: DevAndromeda <46562212+DevAndromeda@users.noreply.github.com> Date: Sat, 7 Aug 2021 22:59:50 +0545 Subject: [PATCH 206/215] chore: bump discord.js --- package.json | 2 +- yarn.lock | 15 +++++++-------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 56a7d31..d58bf95 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "@typescript-eslint/eslint-plugin": "^4.29.0", "@typescript-eslint/parser": "^4.29.0", "discord-api-types": "^0.22.0", - "discord.js": "^13.0.0", + "discord.js": "^13.0.1", "eslint": "^7.32.0", "gen-esm-wrapper": "^1.1.2", "husky": "^7.0.1", diff --git a/yarn.lock b/yarn.lock index d7c135c..2419a4f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -976,10 +976,9 @@ semver "^7.3.5" tar "^6.1.0" -"@discordjs/opus@^0.5.3": +"@discordjs/opus@github:discordjs/opus": version "0.5.3" - resolved "https://registry.yarnpkg.com/@discordjs/opus/-/opus-0.5.3.tgz#7294f539da0b37bf13b072e51acb47ffca748471" - integrity sha512-IQhCwCy2WKXLe+qkOkwO1Wjgk20uqeAbqM62tCbzIqbTsXX4YAge8Me9RFnI77Lx+UTkgm4rSVM3VPVdS/GsUw== + resolved "https://codeload.github.com/discordjs/opus/tar.gz/d929bdb7574fbf3ad1cea9c96277ab3fc4b96132" dependencies: "@discordjs/node-pre-gyp" "^0.4.0" node-addon-api "^3.2.1" @@ -1113,7 +1112,7 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== -"@types/node@*", "@types/node@^16.4.12": +"@types/node@*", "@types/node@^16.4.13": version "16.4.13" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.4.13.tgz#7dfd9c14661edc65cccd43a29eb454174642370d" integrity sha512-bLL69sKtd25w7p1nvg9pigE4gtKVpGTPojBFLMkGHXuUgap2sLqQt2qUnqmVCDfzGUL0DRNZP+1prIZJbMeAXg== @@ -2060,10 +2059,10 @@ discord-ytdl-core@^5.0.4: dependencies: prism-media "^1.2.9" -discord.js@^13.0.0: - version "13.0.0" - resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0.tgz#fd1dde0e73f5dbcd0bf8edad68d3ef83fb2e36b7" - integrity sha512-QbGcxBFUuB6tIJ/xn6R86QeSolS0KGa9nsWcKegtaNWAggajVILA+eneZIZba38jqYes+FB4RHhg/kX3dm4v+Q== +discord.js@^13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.1.tgz#58f009706d1d7587fe9ff6c6c781e4540ae085f9" + integrity sha512-pEODCFfxypBnGEYpSgjkn1jt70raCS1um7Zp0AXEfW1DcR29wISzQ/WeWdnjP5KTXGi0LTtkRiUjOsMgSoukxA== dependencies: "@discordjs/builders" "^0.4.0" "@discordjs/collection" "^0.2.1" From bc86fb808239eee171c6a40c6d6ebea8c6448008 Mon Sep 17 00:00:00 2001 From: Androz2091 Date: Sat, 7 Aug 2021 19:15:39 +0200 Subject: [PATCH 207/215] :bug: Fix example bot --- example/music-bot/index.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/example/music-bot/index.js b/example/music-bot/index.js index 21579bb..c6abed3 100644 --- a/example/music-bot/index.js +++ b/example/music-bot/index.js @@ -1,6 +1,6 @@ const { Client, GuildMember } = require("discord.js"); const config = require("./config"); -const { Player, QueryType, QueueRepeatMode } = require("discord-player"); +const { Player, QueryType, QueueRepeatMode } = require("../../"); const client = new Client({ intents: ["GUILD_VOICE_STATES", "GUILD_MESSAGES", "GUILDS"] @@ -164,7 +164,7 @@ client.on("interactionCreate", async (interaction) => { } if (interaction.commandName === "play" || interaction.commandName === "soundcloud") { - await interaction.defer(); + await interaction.deferReply(); const query = interaction.options.get("query").value; const searchResult = await player @@ -190,7 +190,7 @@ client.on("interactionCreate", async (interaction) => { searchResult.playlist ? queue.addTracks(searchResult.tracks) : queue.addTrack(searchResult.tracks[0]); if (!queue.playing) await queue.play(); } else if (interaction.commandName === "volume") { - await interaction.defer(); + await interaction.deferReply(); const queue = player.getQueue(interaction.guildId); if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); const vol = interaction.options.get("amount"); @@ -201,7 +201,7 @@ client.on("interactionCreate", async (interaction) => { content: success ? `✅ | Volume set to **${vol.value}%**!` : "❌ | Something went wrong!" }); } else if (interaction.commandName === "skip") { - await interaction.defer(); + await interaction.deferReply(); const queue = player.getQueue(interaction.guildId); if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); const currentTrack = queue.current; @@ -210,7 +210,7 @@ client.on("interactionCreate", async (interaction) => { content: success ? `✅ | Skipped **${currentTrack}**!` : "❌ | Something went wrong!" }); } else if (interaction.commandName === "queue") { - await interaction.defer(); + await interaction.deferReply(); const queue = player.getQueue(interaction.guildId); if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); const currentTrack = queue.current; @@ -233,25 +233,25 @@ client.on("interactionCreate", async (interaction) => { ] }); } else if (interaction.commandName === "pause") { - await interaction.defer(); + await interaction.deferReply(); const queue = player.getQueue(interaction.guildId); if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); const success = queue.setPaused(true); return void interaction.followUp({ content: success ? "⏸ | Paused!" : "❌ | Something went wrong!" }); } else if (interaction.commandName === "resume") { - await interaction.defer(); + await interaction.deferReply(); const queue = player.getQueue(interaction.guildId); if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); const success = queue.setPaused(false); return void interaction.followUp({ content: success ? "▶ | Resumed!" : "❌ | Something went wrong!" }); } else if (interaction.commandName === "stop") { - await interaction.defer(); + await interaction.deferReply(); const queue = player.getQueue(interaction.guildId); if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); queue.destroy(); return void interaction.followUp({ content: "🛑 | Stopped the player!" }); } else if (interaction.commandName === "np") { - await interaction.defer(); + await interaction.deferReply(); const queue = player.getQueue(interaction.guildId); if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); const progress = queue.createProgressBar(); @@ -273,7 +273,7 @@ client.on("interactionCreate", async (interaction) => { ] }); } else if (interaction.commandName === "loop") { - await interaction.defer(); + await interaction.deferReply(); const queue = player.getQueue(interaction.guildId); if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); const loopMode = interaction.options.get("mode").value; @@ -281,7 +281,7 @@ client.on("interactionCreate", async (interaction) => { const mode = loopMode === QueueRepeatMode.TRACK ? "🔂" : loopMode === QueueRepeatMode.QUEUE ? "🔁" : "▶"; return void interaction.followUp({ content: success ? `${mode} | Updated loop mode!` : "❌ | Could not update loop mode!" }); } else if (interaction.commandName === "bassboost") { - await interaction.defer(); + await interaction.deferReply(); const queue = player.getQueue(interaction.guildId); if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); await queue.setFilters({ From d96a432f5d885318059b6eec251b15eb8a283b58 Mon Sep 17 00:00:00 2001 From: Androz2091 Date: Sat, 7 Aug 2021 19:16:11 +0200 Subject: [PATCH 208/215] :bug: Fix discord-player import path for example bot --- example/music-bot/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/music-bot/index.js b/example/music-bot/index.js index c6abed3..dea4277 100644 --- a/example/music-bot/index.js +++ b/example/music-bot/index.js @@ -1,6 +1,6 @@ const { Client, GuildMember } = require("discord.js"); const config = require("./config"); -const { Player, QueryType, QueueRepeatMode } = require("../../"); +const { Player, QueryType, QueueRepeatMode } = require("discord-player"); const client = new Client({ intents: ["GUILD_VOICE_STATES", "GUILD_MESSAGES", "GUILDS"] From a174c6b4aa621ad1fe79be14d184e26a6e762d3c Mon Sep 17 00:00:00 2001 From: DevAndromeda <46562212+DevAndromeda@users.noreply.github.com> Date: Sat, 7 Aug 2021 23:01:44 +0545 Subject: [PATCH 209/215] refactor(Queue): make bufferingTimeout 3 seconds --- src/Structures/Queue.ts | 2 +- src/types/types.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 03c672c..9aad94f 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -103,7 +103,7 @@ class Queue { highWaterMark: 1 << 25 }, initialVolume: 100, - bufferingTimeout: 1000 + bufferingTimeout: 3000 } as PlayerOptions, options ); diff --git a/src/types/types.ts b/src/types/types.ts index b40c101..8a21666 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -127,7 +127,7 @@ export interface PlayerProgressbarOptions { * @property {boolean} [autoSelfDeaf=true] If it should set the bot in deaf mode * @property {YTDLDownloadOptions} [ytdlOptions={}] The youtube download options * @property {number} [initialVolume=100] The initial player volume - * @property {number} [bufferingTimeout=1000] Buffering timeout for the stream + * @property {number} [bufferingTimeout=3000] Buffering timeout for the stream */ export interface PlayerOptions { leaveOnEnd?: boolean; From 3580a4a4d3b8f607213e5a5cde0d40dc61ee732a Mon Sep 17 00:00:00 2001 From: DevAndromeda <46562212+DevAndromeda@users.noreply.github.com> Date: Sat, 7 Aug 2021 23:08:22 +0545 Subject: [PATCH 210/215] ci(PublishDev): remove dev publish --- .github/workflows/publish-dev.yml | 36 ------------------------------- 1 file changed, 36 deletions(-) delete mode 100644 .github/workflows/publish-dev.yml diff --git a/.github/workflows/publish-dev.yml b/.github/workflows/publish-dev.yml deleted file mode 100644 index ff20bce..0000000 --- a/.github/workflows/publish-dev.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Publish dev -on: - workflow_dispatch: - schedule: - - cron: '0 */12 * * *' -jobs: - npm: - name: npm - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v2 - with: - ref: v5 - - - name: Install Node v16 - uses: actions/setup-node@v2 - with: - node-version: 16 - registry-url: https://registry.npmjs.org/ - - - name: Install dependencies - run: npm install - - - name: Deprecate old releases - run: npm deprecate discord-player@"~5.0.0-dev" "outdated version" || true - env: - NODE_AUTH_TOKEN: ${{ secrets.npm_token }} - - - name: Publish - run: | - npx tsc --skipLibCheck - npm version --git-tag-version=false $(jq --raw-output '.version' package.json).$(date +%s).$(git rev-parse --short HEAD) - npm publish --tag dev || true - env: - NODE_AUTH_TOKEN: ${{ secrets.npm_token }} From 665a9ba1b82c42e8691b4e25173721a423475f0f Mon Sep 17 00:00:00 2001 From: DevAndromeda <46562212+DevAndromeda@users.noreply.github.com> Date: Sat, 7 Aug 2021 23:13:20 +0545 Subject: [PATCH 211/215] Revert "ci(PublishDev): remove dev publish" This reverts commit 3580a4a4d3b8f607213e5a5cde0d40dc61ee732a. --- .github/workflows/publish-dev.yml | 36 +++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 .github/workflows/publish-dev.yml diff --git a/.github/workflows/publish-dev.yml b/.github/workflows/publish-dev.yml new file mode 100644 index 0000000..ff20bce --- /dev/null +++ b/.github/workflows/publish-dev.yml @@ -0,0 +1,36 @@ +name: Publish dev +on: + workflow_dispatch: + schedule: + - cron: '0 */12 * * *' +jobs: + npm: + name: npm + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + with: + ref: v5 + + - name: Install Node v16 + uses: actions/setup-node@v2 + with: + node-version: 16 + registry-url: https://registry.npmjs.org/ + + - name: Install dependencies + run: npm install + + - name: Deprecate old releases + run: npm deprecate discord-player@"~5.0.0-dev" "outdated version" || true + env: + NODE_AUTH_TOKEN: ${{ secrets.npm_token }} + + - name: Publish + run: | + npx tsc --skipLibCheck + npm version --git-tag-version=false $(jq --raw-output '.version' package.json).$(date +%s).$(git rev-parse --short HEAD) + npm publish --tag dev || true + env: + NODE_AUTH_TOKEN: ${{ secrets.npm_token }} From 8a20dafae52f43fe01ebd394b8c971b6778e11ef Mon Sep 17 00:00:00 2001 From: DevAndromeda <46562212+DevAndromeda@users.noreply.github.com> Date: Sat, 7 Aug 2021 23:19:51 +0545 Subject: [PATCH 212/215] docs: update migrating guide --- docs/migrating/migrating.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/migrating/migrating.md b/docs/migrating/migrating.md index 77b9c4d..9860d13 100644 --- a/docs/migrating/migrating.md +++ b/docs/migrating/migrating.md @@ -51,4 +51,9 @@ You have to use `.destroy()` to destroy the queue. It will also stop the ```js const queue = player.getQueue(message.guild.id); if (queue) queue.destroy(); -``` \ No newline at end of file +``` + +## Updating filters + +Discord Player v5.x has new option `bufferingTimeout` in queue init options which allows you to set stream buffering timeout before playing. +This might be useful if you want to have smooth filters update. By default, it is set to 3 seconds. From 3be0526b69afbaf388acec002da7fd90176020b3 Mon Sep 17 00:00:00 2001 From: Androz2091 Date: Sat, 7 Aug 2021 19:45:32 +0200 Subject: [PATCH 213/215] :sparkles: Add link to example bot --- example/music-bot/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/example/music-bot/index.js b/example/music-bot/index.js index dea4277..5a85701 100644 --- a/example/music-bot/index.js +++ b/example/music-bot/index.js @@ -215,7 +215,7 @@ client.on("interactionCreate", async (interaction) => { if (!queue || !queue.playing) return void interaction.followUp({ content: "❌ | No music is being played!" }); const currentTrack = queue.current; const tracks = queue.tracks.slice(0, 10).map((m, i) => { - return `${i + 1}. **${m.title}**`; + return `${i + 1}. **${m.title}** ([link](${m.url}))`; }); return void interaction.followUp({ @@ -228,7 +228,7 @@ client.on("interactionCreate", async (interaction) => { : "" }`, color: 0xff0000, - fields: [{ name: "Now Playing", value: `🎶 | **${currentTrack.title}**` }] + fields: [{ name: "Now Playing", value: `🎶 | **${currentTrack.title}** ([link](${currentTrack.url}))` }] } ] }); From 9671d60ac6e09a9d45243ef1b2e99552ba0a25da Mon Sep 17 00:00:00 2001 From: DevAndromeda <46562212+DevAndromeda@users.noreply.github.com> Date: Sat, 7 Aug 2021 23:35:44 +0545 Subject: [PATCH 214/215] chore(Example): bump discord.js --- example/music-bot/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/music-bot/package.json b/example/music-bot/package.json index b1c4af5..8eab638 100644 --- a/example/music-bot/package.json +++ b/example/music-bot/package.json @@ -11,6 +11,6 @@ "dependencies": { "@discordjs/opus": "^0.5.3", "discord-player": "^5.0.0-dev.39f503a.1625470163", - "discord.js": "^13.0.0-dev.fe5d56c.1625443439" + "discord.js": "^13.0.1" } } From e66ef442e25f1a45a029ed754f9cc3afe5d5e6b3 Mon Sep 17 00:00:00 2001 From: DevAndromeda <46562212+DevAndromeda@users.noreply.github.com> Date: Sun, 8 Aug 2021 00:20:51 +0545 Subject: [PATCH 215/215] refactor(*): us timer.unref() --- src/Player.ts | 2 +- src/Structures/Queue.ts | 2 +- src/utils/Util.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Player.ts b/src/Player.ts index f67826e..a635613 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -117,7 +117,7 @@ class Player extends EventEmitter { if (!this.queues.has(queue.guild.id)) return; queue.destroy(); this.emit("channelEmpty", queue); - }, queue.options.leaveOnEmptyCooldown || 0); + }, queue.options.leaveOnEmptyCooldown || 0).unref(); queue._cooldownsTimeout.set(`empty_${oldState.guild.id}`, timeout); } } diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 9aad94f..ef3681c 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -657,7 +657,7 @@ class Queue { this.connection.playStream(resource).then(() => { this.setVolume(this.options.initialVolume); }); - }, this.#getBufferingTimeout()); + }, this.#getBufferingTimeout()).unref(); } /** diff --git a/src/utils/Util.ts b/src/utils/Util.ts index 18f8e80..ff9d0e2 100644 --- a/src/utils/Util.ts +++ b/src/utils/Util.ts @@ -91,7 +91,7 @@ class Util { * @returns {Promise} */ static wait(time: number) { - return new Promise((r) => setTimeout(r, time)); + return new Promise((r) => setTimeout(r, time).unref()); } static noop() {} // eslint-disable-line @typescript-eslint/no-empty-function