fix(Queue): fix autoplay error on stop call
This commit is contained in:
parent
92565b5f5b
commit
0617829d23
2 changed files with 23 additions and 6 deletions
|
@ -157,18 +157,26 @@ class Queue<T = unknown> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
this.connection.on("error", (err) => this.player.emit("connectionError", this, err));
|
this.connection.on("error", (err) => {
|
||||||
this.connection.on("debug", (msg) => this.player.emit("debug", this, msg));
|
if (this.#watchDestroyed(false)) return;
|
||||||
|
this.player.emit("connectionError", this, err);
|
||||||
|
});
|
||||||
|
this.connection.on("debug", (msg) => {
|
||||||
|
if (this.#watchDestroyed(false)) return;
|
||||||
|
this.player.emit("debug", this, msg);
|
||||||
|
});
|
||||||
|
|
||||||
this.player.emit("connectionCreate", this, this.connection);
|
this.player.emit("connectionCreate", this, this.connection);
|
||||||
|
|
||||||
this.connection.on("start", (resource) => {
|
this.connection.on("start", (resource) => {
|
||||||
|
if (this.#watchDestroyed(false)) return;
|
||||||
this.playing = true;
|
this.playing = true;
|
||||||
if (!this._filtersUpdate && resource?.metadata) 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;
|
this._filtersUpdate = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
this.connection.on("finish", async (resource) => {
|
this.connection.on("finish", async (resource) => {
|
||||||
|
if (this.#watchDestroyed(false)) return;
|
||||||
this.playing = false;
|
this.playing = false;
|
||||||
if (this._filtersUpdate) return;
|
if (this._filtersUpdate) return;
|
||||||
this._streamTime = 0;
|
this._streamTime = 0;
|
||||||
|
@ -596,7 +604,7 @@ class Queue<T = unknown> {
|
||||||
* @returns {Promise<void>}
|
* @returns {Promise<void>}
|
||||||
*/
|
*/
|
||||||
async play(src?: Track, options: PlayOptions = {}): Promise<void> {
|
async play(src?: Track, options: PlayOptions = {}): Promise<void> {
|
||||||
if (!this.destroyed) this.#watchDestroyed();
|
if (this.#watchDestroyed(false)) return;
|
||||||
if (!this.connection || !this.connection.voiceConnection) throw new PlayerError("Voice connection is not available, use <Queue>.connect()!", ErrorStatusCode.NO_CONNECTION);
|
if (!this.connection || !this.connection.voiceConnection) throw new PlayerError("Voice connection is not available, use <Queue>.connect()!", ErrorStatusCode.NO_CONNECTION);
|
||||||
if (src && (this.playing || this.tracks.length) && !options.immediate) return this.addTrack(src);
|
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();
|
const track = options.filtersUpdate && !options.immediate ? src || this.current : src ?? this.tracks.shift();
|
||||||
|
@ -725,11 +733,13 @@ class Queue<T = unknown> {
|
||||||
return `**Upcoming Songs:**\n${this.tracks.map((m, i) => `${i + 1}. **${m.title}**`).join("\n")}`;
|
return `**Upcoming Songs:**\n${this.tracks.map((m, i) => `${i + 1}. **${m.title}**`).join("\n")}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
#watchDestroyed() {
|
#watchDestroyed(emit = true) {
|
||||||
if (this.#destroyed) {
|
if (this.#destroyed) {
|
||||||
this.player.emit("error", this, new PlayerError("Cannot use destroyed queue", ErrorStatusCode.DESTROYED_QUEUE));
|
if (emit) this.player.emit("error", this, new PlayerError("Cannot use destroyed queue", ErrorStatusCode.DESTROYED_QUEUE));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#getBufferingTimeout() {
|
#getBufferingTimeout() {
|
||||||
|
|
|
@ -185,7 +185,14 @@ class StreamDispatcher extends EventEmitter<VoiceEvents> {
|
||||||
async playStream(resource: AudioResource<Track> = this.audioResource) {
|
async playStream(resource: AudioResource<Track> = this.audioResource) {
|
||||||
if (!resource) throw new PlayerError("Audio resource is not available!", ErrorStatusCode.NO_AUDIO_RESOURCE);
|
if (!resource) throw new PlayerError("Audio resource is not available!", ErrorStatusCode.NO_AUDIO_RESOURCE);
|
||||||
if (!this.audioResource) this.audioResource = resource;
|
if (!this.audioResource) this.audioResource = resource;
|
||||||
if (this.voiceConnection.state.status !== VoiceConnectionStatus.Ready) await entersState(this.voiceConnection, VoiceConnectionStatus.Ready, this.connectionTimeout);
|
if (this.voiceConnection.state.status !== VoiceConnectionStatus.Ready) {
|
||||||
|
try {
|
||||||
|
await entersState(this.voiceConnection, VoiceConnectionStatus.Ready, this.connectionTimeout);
|
||||||
|
} catch (err) {
|
||||||
|
return void this.emit("error", err as AudioPlayerError);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this.audioPlayer.play(resource);
|
this.audioPlayer.play(resource);
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
|
|
Loading…
Reference in a new issue