mirror of
https://github.com/BluemediaGER/muse.git
synced 2024-11-23 01:05:30 +01:00
Add forward seek
This commit is contained in:
parent
bf0843dd1d
commit
3c169d113c
33
src/commands/fseek.ts
Normal file
33
src/commands/fseek.ts
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
import {Message, TextChannel} from 'discord.js';
|
||||||
|
import {TYPES} from '../types';
|
||||||
|
import {inject, injectable} from 'inversify';
|
||||||
|
import PlayerManager from '../managers/player';
|
||||||
|
import LoadingMessage from '../utils/loading-message';
|
||||||
|
import Command from '.';
|
||||||
|
|
||||||
|
@injectable()
|
||||||
|
export default class implements Command {
|
||||||
|
public name = 'fseek';
|
||||||
|
public description = 'forward seek position in currently playing song';
|
||||||
|
private readonly playerManager: PlayerManager;
|
||||||
|
|
||||||
|
constructor(@inject(TYPES.Managers.Player) playerManager: PlayerManager) {
|
||||||
|
this.playerManager = playerManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async execute(msg: Message, args: string []): Promise<void> {
|
||||||
|
const seekTime = parseInt(args[0], 10);
|
||||||
|
|
||||||
|
const loading = new LoadingMessage(msg.channel as TextChannel, 'hold on a sec');
|
||||||
|
|
||||||
|
await loading.start();
|
||||||
|
|
||||||
|
try {
|
||||||
|
await this.playerManager.get(msg.guild!.id).forwardSeek(seekTime);
|
||||||
|
|
||||||
|
await loading.stop('seeked');
|
||||||
|
} catch (_) {
|
||||||
|
await loading.stop('error somewhere');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -23,6 +23,7 @@ import QueueManager from './managers/queue';
|
||||||
import Command from './commands';
|
import Command from './commands';
|
||||||
import Clear from './commands/clear';
|
import Clear from './commands/clear';
|
||||||
import Config from './commands/config';
|
import Config from './commands/config';
|
||||||
|
import ForwardSeek from './commands/fseek';
|
||||||
import Play from './commands/play';
|
import Play from './commands/play';
|
||||||
import QueueCommad from './commands/queue';
|
import QueueCommad from './commands/queue';
|
||||||
import Seek from './commands/seek';
|
import Seek from './commands/seek';
|
||||||
|
@ -41,6 +42,7 @@ container.bind<QueueManager>(TYPES.Managers.Queue).to(QueueManager).inSingletonS
|
||||||
// Commands
|
// Commands
|
||||||
container.bind<Command>(TYPES.Command).to(Clear).inSingletonScope();
|
container.bind<Command>(TYPES.Command).to(Clear).inSingletonScope();
|
||||||
container.bind<Command>(TYPES.Command).to(Config).inSingletonScope();
|
container.bind<Command>(TYPES.Command).to(Config).inSingletonScope();
|
||||||
|
container.bind<Command>(TYPES.Command).to(ForwardSeek).inSingletonScope();
|
||||||
container.bind<Command>(TYPES.Command).to(Play).inSingletonScope();
|
container.bind<Command>(TYPES.Command).to(Play).inSingletonScope();
|
||||||
container.bind<Command>(TYPES.Command).to(QueueCommad).inSingletonScope();
|
container.bind<Command>(TYPES.Command).to(QueueCommad).inSingletonScope();
|
||||||
container.bind<Command>(TYPES.Command).to(Seek).inSingletonScope();
|
container.bind<Command>(TYPES.Command).to(Seek).inSingletonScope();
|
||||||
|
|
|
@ -21,6 +21,9 @@ export default class {
|
||||||
private voiceConnection: VoiceConnection | null = null;
|
private voiceConnection: VoiceConnection | null = null;
|
||||||
private dispatcher: StreamDispatcher | null = null;
|
private dispatcher: StreamDispatcher | null = null;
|
||||||
|
|
||||||
|
private lastStreamTime = 0;
|
||||||
|
private positionInSeconds = 0;
|
||||||
|
|
||||||
constructor(queue: Queue, cacheDir: string) {
|
constructor(queue: Queue, cacheDir: string) {
|
||||||
this.queue = queue;
|
this.queue = queue;
|
||||||
this.cacheDir = cacheDir;
|
this.cacheDir = cacheDir;
|
||||||
|
@ -52,6 +55,16 @@ export default class {
|
||||||
await this.waitForCache(currentSong.url);
|
await this.waitForCache(currentSong.url);
|
||||||
|
|
||||||
this.attachListeners(this.voiceConnection.play(this.getCachedPath(currentSong.url), {seek: positionSeconds}));
|
this.attachListeners(this.voiceConnection.play(this.getCachedPath(currentSong.url), {seek: positionSeconds}));
|
||||||
|
|
||||||
|
this.positionInSeconds = positionSeconds;
|
||||||
|
}
|
||||||
|
|
||||||
|
async forwardSeek(positionSeconds: number): Promise<void> {
|
||||||
|
return this.seek(this.positionInSeconds + positionSeconds);
|
||||||
|
}
|
||||||
|
|
||||||
|
getPosition(): number {
|
||||||
|
return this.positionInSeconds;
|
||||||
}
|
}
|
||||||
|
|
||||||
async play(): Promise<void> {
|
async play(): Promise<void> {
|
||||||
|
@ -224,6 +237,10 @@ export default class {
|
||||||
|
|
||||||
private attachListeners(stream: StreamDispatcher): void {
|
private attachListeners(stream: StreamDispatcher): void {
|
||||||
stream.on('speaking', async isSpeaking => {
|
stream.on('speaking', async isSpeaking => {
|
||||||
|
// Update position
|
||||||
|
this.positionInSeconds += (stream.streamTime - this.lastStreamTime) / 1000;
|
||||||
|
this.lastStreamTime = stream.streamTime;
|
||||||
|
|
||||||
// Automatically advance queued song at end
|
// Automatically advance queued song at end
|
||||||
if (!isSpeaking && this.status === STATUS.PLAYING) {
|
if (!isSpeaking && this.status === STATUS.PLAYING) {
|
||||||
if (this.queue.get().length > 0) {
|
if (this.queue.get().length > 0) {
|
||||||
|
|
Loading…
Reference in a new issue