From 74b465c4a6d4ee51e96e4f24003916edd1c3c6bb Mon Sep 17 00:00:00 2001 From: Androz2091 Date: Sun, 1 Nov 2020 16:19:41 +0100 Subject: [PATCH] :label: Add typings --- package.json | 3 +- src/Player.js | 33 ++++-------- src/Queue.js | 2 +- tsconfig.json | 21 ++++++++ typings/index.d.ts | 122 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 156 insertions(+), 25 deletions(-) create mode 100644 tsconfig.json create mode 100644 typings/index.d.ts diff --git a/package.json b/package.json index 5da709c..02bf4c8 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,9 @@ { "name": "discord-player", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "description": "Complete framework to facilitate music commands using discord.js v12", "main": "index.js", + "types": "typings/index.d.ts", "scripts": { "test": "node index.js", "generate-docs": "node_modules/.bin/jsdoc --configure .jsdoc.json --verbose" diff --git a/src/Player.js b/src/Player.js index 8c2c6de..69ed5f7 100644 --- a/src/Player.js +++ b/src/Player.js @@ -214,7 +214,9 @@ class Player extends EventEmitter { Object.keys(newFilters).forEach((filterName) => { queue.filters[filterName] = newFilters[filterName] }) - this._playYTDLStream(queue, true) + this._playYTDLStream(queue, true).then(() => { + resolve() + }) }) } @@ -357,22 +359,17 @@ class Player extends EventEmitter { * client.player.pause(message); */ pause (message) { - return new Promise((resolve, reject) => { - // Get guild queue - const queue = this.queues.find((g) => g.guildID === message.guild.id) - if (!queue) return reject(new Error('Not playing')) - // Pause the dispatcher - queue.voiceConnection.dispatcher.pause() - queue.paused = true - // Resolve the guild queue - resolve(queue.playing) - }) + // Get guild queue + const queue = this.queues.find((g) => g.guildID === message.guild.id) + if (!queue) return this.emit('error', 'NotPlaying', message) + // Pause the dispatcher + queue.voiceConnection.dispatcher.pause() + queue.paused = true } /** * Resume the music in the server. * @param {Discord.Message} message - * @returns {Queue} * @example * client.player.resume(message); */ @@ -383,8 +380,6 @@ class Player extends EventEmitter { // Pause the dispatcher queue.voiceConnection.dispatcher.resume() queue.paused = false - // Resolve the guild queue - return queue } /** @@ -410,7 +405,6 @@ class Player extends EventEmitter { * Change the server volume. * @param {Discord.Message} message * @param {number} percent - * @returns {Queue} * @example * client.player.setVolume(message, 90); */ @@ -421,8 +415,6 @@ class Player extends EventEmitter { // Update volume queue.volume = percent queue.voiceConnection.dispatcher.setVolumeLogarithmic(queue.calculatedVolume / 200) - // Return the queue - return queue } /** @@ -439,7 +431,6 @@ class Player extends EventEmitter { /** * Clears the server queue. * @param {Discord.Message} message - * @returns {Queue} */ clearQueue (message) { // Get guild queue @@ -447,8 +438,6 @@ class Player extends EventEmitter { if (!queue) return this.emit('error', 'NotPlaying', message) // Clear queue queue.tracks = [] - // Return the queue - return queue } /** @@ -501,7 +490,7 @@ class Player extends EventEmitter { /** * Shuffle the queue of the server. * @param {Discord.Message} message - * @returns {} + * @returns {Queue} */ shuffle (message) { // Get guild queue @@ -715,8 +704,6 @@ module.exports = Player * @event Player#queueCreate * @param {Discord.Message} message * @param {Queue} queue - * @param {Object} playlist - * @param {Track} track */ /** diff --git a/src/Queue.js b/src/Queue.js index 349954c..bc38a24 100644 --- a/src/Queue.js +++ b/src/Queue.js @@ -54,7 +54,7 @@ class Queue extends EventEmitter { * Whether the stream is currently paused. * @type {boolean} */ - this.paused = this.voiceConnection && this.voiceConnection.dispatcher && this.voiceConnection.dispatcher.paused; + this.paused = this.voiceConnection && this.voiceConnection.dispatcher && this.voiceConnection.dispatcher.paused /** * Whether the repeat mode is enabled. * @type {boolean} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..573ba90 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "strict": true, + "moduleResolution": "node", + "declaration": false, + "removeComments": false, + "alwaysStrict": true, + "pretty": false, + "module": "commonjs", + "target": "es2019", + "lib": [ + "esnext", + "esnext.array", + "esnext.asynciterable", + "esnext.intl", + "esnext.symbol" + ], + "sourceMap": false, + "skipDefaultLibCheck": true + } +} diff --git a/typings/index.d.ts b/typings/index.d.ts new file mode 100644 index 0000000..62a84fe --- /dev/null +++ b/typings/index.d.ts @@ -0,0 +1,122 @@ +declare module 'discord-player' { + import { EventEmitter } from 'events'; + import { Client, Collection, Message, MessageCollector, Snowflake, User, VoiceChannel, VoiceConnection } from 'discord.js'; + import { result as YtplPlaylist } from 'ytpl'; + import { Stream } from 'stream'; + + export const version: string; + + class Util { + static isVoiceEmpty(channel: VoiceChannel): boolean; + static isSoundcloudLink(query: string): boolean; + static isSpotifyLink(query: string): boolean; + static isYTPlaylistLink(query: string): boolean; + static isYTVideoLink(query: string): boolean; + } + + export class Player extends EventEmitter { + constructor(client: Client, options?: PlayerOptions) + + public client: Client; + public util: Util; + public options: PlayerOptions; + public queues: Collection; + public filters: PlayerFilters; + + public isPlaying(message: Message): boolean; + public setFilters(message: Message, newFilters: Partial): Promise; + public play(message: Message, query: string): Promise; + public pause(message: Message): void; + public resume(message: Message): void; + public stop(message: Message): void; + public setVolume(message: Message, percent: number): void; + public getQueue(message: Message): Queue; + public clearQueue(message: Message): void; + public skip(message: Message): void; + public nowPlaying(message: Message): Track; + public setRepeatMode(message: Message): boolean; + public shuffle(message: Message): Queue; + public remove(message: Message, trackOrPosition: Track|number): Track; + public createProgressBar(message: Message, progressBarOptions: ProgressBarOptions): string; + + public on(event: K, listener: (...args: PlayerEvents[K]) => void): this; + public once(event: K, listener: (...args: PlayerEvents[K]) => void): this; + public emit(event: K, ...args: PlayerEvents[K]): boolean; + } + interface PlayerOptions { + leaveOnEnd: boolean; + leaveOnStop: boolean; + leaveOnEmpty: boolean; + leaveOnEmptyCooldown: number; + } + type Filters = 'bassboost' | '8D' | 'vaporwave' | 'nightcore'| 'phaser' | 'tremolo' | 'vibrato' | 'reverse' | 'treble' | 'normalizer' | 'surrounding' | 'pulsator' | 'subboost' | 'karaoke' | 'flanger' | 'gate' | 'haas' | 'mcompand'; + type FiltersStatuses = { + [key in Filters]: boolean; + } + type PlayerFilters = { + [key in Filters]: string + } + interface ProgressBarOptions { + timecodes: boolean; + } + interface CustomPlaylist { + tracks: Track[]; + duration: number; + thumbnail: string; + requestedBy: User; + } + type Playlist = YtplPlaylist & CustomPlaylist; + interface PlayerEvents { + searchResults: [Message, string, Track[]]; + searchInvalidResponse: [Message, string, Track[], string, MessageCollector]; + searchCancel: [Message, string, Track[]]; + noResults: [Message, string]; + playlistAdd: [Message, Queue, Playlist]; + trackAdd: [Message, Queue, Track]; + trackStart: [Message, Track]; + botDisconnect: [Message]; + channelEmpty: [Message, Queue]; + musicStop: []; + queueCreate: [Message, Queue]; + queueEnd: [Message, Queue]; + error: [string, Message]; + } + class Queue { + constructor(guildID: string, message: Message, filters: PlayerFilters); + + public guildID: string; + public voiceConnection?: VoiceConnection; + public stream: Stream; + public tracks: Track[]; + public stopped: boolean; + public lastSkipped: boolean; + public volume: number; + public paused: boolean; + public repeatMode: boolean; + public filters: FiltersStatuses; + public firstMessage: Message; + private additionalStreamTime: number; + + // these are getters + public playing: Track; + public calculatedVolume: number; + } + class Track { + constructor(videoData: object, user: User, player: Player); + + 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; + + // these are getters + public durationMS: number; + public queue: Queue; + } +}