From c058ec95feacd57eebdb07d4f44469c5c6c4bc01 Mon Sep 17 00:00:00 2001 From: Max Isom Date: Tue, 17 Mar 2020 19:42:28 -0500 Subject: [PATCH] Various bug fixes --- src/commands/config.ts | 10 ++++++++-- src/commands/fseek.ts | 4 ++-- src/commands/play.ts | 3 +++ src/commands/seek.ts | 4 ++-- src/commands/skip.ts | 2 +- src/services/player.ts | 34 +++++++++------------------------- src/services/queue.ts | 14 +++++++++++--- 7 files changed, 36 insertions(+), 35 deletions(-) diff --git a/src/commands/config.ts b/src/commands/config.ts index 273bbb8..17a401a 100644 --- a/src/commands/config.ts +++ b/src/commands/config.ts @@ -1,4 +1,4 @@ -import {TextChannel, Message} from 'discord.js'; +import {TextChannel, Message, GuildChannel} from 'discord.js'; import {injectable} from 'inversify'; import {Settings} from '../models'; import errorMsg from '../utils/error-msg'; @@ -50,7 +50,13 @@ export default class implements Command { } case 'channel': { - const channel = msg.guild!.channels.cache.find(c => c.name === args[1]); + let channel: GuildChannel | undefined; + + if (args[1].includes('<#') && args[1].includes('>')) { + channel = msg.guild!.channels.cache.find(c => c.id === args[1].slice(2, args[1].indexOf('>'))); + } else { + channel = msg.guild!.channels.cache.find(c => c.name === args[1]); + } if (channel && channel.type === 'text') { await Settings.update({channel: channel.id}, {where: {guildId: msg.guild!.id}}); diff --git a/src/commands/fseek.ts b/src/commands/fseek.ts index e20d025..bd3c858 100644 --- a/src/commands/fseek.ts +++ b/src/commands/fseek.ts @@ -25,12 +25,12 @@ export default class implements Command { public async execute(msg: Message, args: string []): Promise { const queue = this.queueManager.get(msg.guild!.id); - if (queue.get().length === 0) { + if (!queue.getCurrent()) { await msg.channel.send(errorMsg('nothing is playing')); return; } - if (queue.get()[0].isLive) { + if (queue.getCurrent()?.isLive) { await msg.channel.send(errorMsg('can\'t seek in a livestream')); return; } diff --git a/src/commands/play.ts b/src/commands/play.ts index 9702b48..3eb8f0b 100644 --- a/src/commands/play.ts +++ b/src/commands/play.ts @@ -268,7 +268,10 @@ export default class implements Command { if (this.playerManager.get(msg.guild!.id).voiceConnection === null) { await this.playerManager.get(msg.guild!.id).connect(targetVoiceChannel); + } + if (this.queueManager.get(msg.guild!.id).size() === 0) { + // Only auto-play on first song added await this.playerManager.get(msg.guild!.id).play(); } } diff --git a/src/commands/seek.ts b/src/commands/seek.ts index 7022168..b6e7d9e 100644 --- a/src/commands/seek.ts +++ b/src/commands/seek.ts @@ -26,12 +26,12 @@ export default class implements Command { public async execute(msg: Message, args: string []): Promise { const queue = this.queueManager.get(msg.guild!.id); - if (queue.get().length === 0) { + if (!queue.getCurrent()) { await msg.channel.send(errorMsg('nothing is playing')); return; } - if (queue.get()[0].isLive) { + if (queue.getCurrent()?.isLive) { await msg.channel.send(errorMsg('can\'t seek in a livestream')); return; } diff --git a/src/commands/skip.ts b/src/commands/skip.ts index 481ea44..9e5ec4b 100644 --- a/src/commands/skip.ts +++ b/src/commands/skip.ts @@ -26,7 +26,7 @@ export default class implements Command { try { queue.forward(); - if (queue.isEmpty()) { + if (queue.isEmpty() && !queue.getCurrent()) { this.playerManager.get(msg.guild!.id).disconnect(); } else { await this.playerManager.get(msg.guild!.id).play(); diff --git a/src/services/player.ts b/src/services/player.ts index 74803f8..ff14e23 100644 --- a/src/services/player.ts +++ b/src/services/player.ts @@ -19,6 +19,7 @@ export default class { private readonly queue: Queue; private readonly cacheDir: string; private dispatcher: StreamDispatcher | null = null; + private nowPlaying: QueuedSong | null = null; private playPositionInterval: NodeJS.Timeout | undefined; private positionInSeconds = 0; @@ -44,6 +45,7 @@ export default class { this.voiceConnection.disconnect(); } + this.positionInSeconds = 0; this.voiceConnection = null; this.dispatcher = null; } @@ -56,7 +58,7 @@ export default class { throw new Error('Not connected to a voice channel.'); } - const currentSong = this.getCurrentSong(); + const currentSong = this.queue.getCurrent(); if (!currentSong) { throw new Error('No song currently playing'); @@ -85,26 +87,17 @@ export default class { throw new Error('Not connected to a voice channel.'); } - const currentSong = this.getCurrentSong(); + const currentSong = this.queue.getCurrent(); if (!currentSong) { throw new Error('Queue empty.'); } // Resume from paused state - if (this.status === STATUS.PAUSED && this.getPosition() !== 0) { - if (this.dispatcher) { - this.dispatcher.resume(); - this.status = STATUS.PLAYING; - return; - } - - if (!currentSong.isLive) { - await this.seek(this.getPosition()); - return; - } - - // Must be livestream, continue + if (this.status === STATUS.PAUSED && this.getPosition() !== 0 && this.dispatcher && currentSong.url === this.nowPlaying?.url) { + this.dispatcher.resume(); + this.status = STATUS.PLAYING; + return; } if (await this.isCached(currentSong.url)) { @@ -117,6 +110,7 @@ export default class { this.attachListeners(); this.status = STATUS.PLAYING; + this.nowPlaying = currentSong; this.startTrackingPosition(); } @@ -135,16 +129,6 @@ export default class { this.stopTrackingPosition(); } - private getCurrentSong(): QueuedSong|null { - const songs = this.queue.get(); - - if (songs.length === 0) { - return null; - } - - return songs[0]; - } - private getCachedPath(url: string): string { return path.join(this.cacheDir, hasha(url)); } diff --git a/src/services/queue.ts b/src/services/queue.ts index c929eea..1c766f1 100644 --- a/src/services/queue.ts +++ b/src/services/queue.ts @@ -34,8 +34,16 @@ export default class { } } + getCurrent(): QueuedSong | null { + if (this.queue[this.position]) { + return this.queue[this.position]; + } + + return null; + } + get(): QueuedSong[] { - return this.queue.slice(this.position); + return this.queue.slice(this.position + 1); } add(song: QueuedSong): void { @@ -61,7 +69,7 @@ export default class { } shuffle(): void { - this.queue = [this.queue[0], ...shuffle(this.queue.slice(1))]; + this.queue = [...this.queue.slice(0, this.position), this.queue[this.position], this.queue[0], ...shuffle(this.queue.slice(this.position + 1))]; } clear(): void { @@ -76,7 +84,7 @@ export default class { } size(): number { - return this.queue.length; + return this.get().length; } isEmpty(): boolean {