mirror of
https://github.com/ZHANGTIANYAO1/teamspeak-music-bot.git
synced 2026-10-02 04:52:50 +08:00
fix(player): play-next must use insertedAt, not size-1, when idle
Final review of caeef65 caught a stale-currentIndex bug in
/play-next-song and cmdPlayNext: when the player is idle but
queue.currentIndex >= 0 (natural end-of-track, or playNext gave
up after retries without queue.clear), addNext splices mid-queue
and playAt(size-1) jumps PAST the inserted song to whatever
was last. Capture the insertion slot before calling addNext and
promote that exact index instead.
Add a regression test covering the [a,b,c,d] queue with
currentIndex=1 case -- splice at 2 yields x at index 2, but
size-1 would point at d (index 4).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
caeef65cdb
commit
fab8c194e3
3 files changed
+43
-5
No files matched your search
+10
-2
@@ -442,11 +442,19 @@ export class BotInstance extends EventEmitter {
|
||||
|
||||
const song = result.songs[0];
|
||||
const wasIdle = this.player.getState() === "idle";
|
||||
// Capture the slot addNext WILL insert at, before mutating the queue.
|
||||
// addNext pushes when currentIndex<0 (slot = size); otherwise splices
|
||||
// at currentIndex+1. Using size-1 after addNext was wrong when the
|
||||
// queue had stale currentIndex>=0 while the player was idle (e.g.,
|
||||
// after natural track end without queue.clear()).
|
||||
const insertedAt =
|
||||
this.queue.getCurrentIndex() < 0
|
||||
? this.queue.size()
|
||||
: this.queue.getCurrentIndex() + 1;
|
||||
this.queue.addNext({ ...song, platform: provider.platform });
|
||||
|
||||
if (wasIdle) {
|
||||
// Nothing playing — addNext fell through to push, promote and start.
|
||||
this.queue.playAt(this.queue.size() - 1);
|
||||
this.queue.playAt(insertedAt);
|
||||
this.player.resetFailures();
|
||||
const ok = await this.resolveAndPlay(this.queue.current()!);
|
||||
this.emit("stateChange");
|
||||
|
||||
Reference in new issue
Block a user