mirror of
https://github.com/BluemediaDev/muse.git
synced 2025-04-19 12:53:56 +02:00
82 lines
2.8 KiB
TypeScript
82 lines
2.8 KiB
TypeScript
import {Message, MessageEmbed} from 'discord.js';
|
|
import getYouTubeID from 'get-youtube-id';
|
|
import {inject, injectable} from 'inversify';
|
|
import {TYPES} from '../types.js';
|
|
import PlayerManager from '../managers/player.js';
|
|
import {STATUS} from '../services/player.js';
|
|
import Command from '.';
|
|
import getProgressBar from '../utils/get-progress-bar.js';
|
|
import errorMsg from '../utils/error-msg.js';
|
|
import {prettyTime} from '../utils/time.js';
|
|
|
|
const PAGE_SIZE = 10;
|
|
|
|
@injectable()
|
|
export default class implements Command {
|
|
public name = 'queue';
|
|
public aliases = ['q'];
|
|
public examples = [
|
|
['queue', 'shows current queue'],
|
|
['queue 2', 'shows second page of queue'],
|
|
];
|
|
|
|
private readonly playerManager: PlayerManager;
|
|
|
|
constructor(@inject(TYPES.Managers.Player) playerManager: PlayerManager) {
|
|
this.playerManager = playerManager;
|
|
}
|
|
|
|
public async execute(msg: Message, args: string []): Promise<void> {
|
|
const player = this.playerManager.get(msg.guild!.id);
|
|
|
|
const currentlyPlaying = player.getCurrent();
|
|
|
|
if (currentlyPlaying) {
|
|
const queueSize = player.queueSize();
|
|
const queuePage = args[0] ? parseInt(args[0], 10) : 1;
|
|
|
|
const maxQueuePage = Math.ceil((queueSize + 1) / PAGE_SIZE);
|
|
|
|
if (queuePage > maxQueuePage) {
|
|
await msg.channel.send(errorMsg('the queue isn\'t that big'));
|
|
return;
|
|
}
|
|
|
|
const embed = new MessageEmbed();
|
|
|
|
embed.setTitle(currentlyPlaying.title);
|
|
embed.setURL(`https://www.youtube.com/watch?v=${currentlyPlaying.url.length === 11 ? currentlyPlaying.url : getYouTubeID(currentlyPlaying.url) ?? ''}`);
|
|
|
|
let description = player.status === STATUS.PLAYING ? '⏹️' : '▶️';
|
|
description += ' ';
|
|
description += getProgressBar(20, player.getPosition() / currentlyPlaying.length);
|
|
description += ' ';
|
|
description += `\`[${prettyTime(player.getPosition())}/${currentlyPlaying.isLive ? 'live' : prettyTime(currentlyPlaying.length)}]\``;
|
|
description += ' 🔉';
|
|
description += player.isQueueEmpty() ? '' : '\n\n**Next up:**';
|
|
|
|
embed.setDescription(description);
|
|
|
|
let footer = `Source: ${currentlyPlaying.artist}`;
|
|
|
|
if (currentlyPlaying.playlist) {
|
|
footer += ` (${currentlyPlaying.playlist.title})`;
|
|
}
|
|
|
|
embed.setFooter(footer);
|
|
|
|
const queuePageBegin = (queuePage - 1) * PAGE_SIZE;
|
|
const queuePageEnd = queuePageBegin + PAGE_SIZE;
|
|
|
|
player.getQueue().slice(queuePageBegin, queuePageEnd).forEach((song, i) => {
|
|
embed.addField(`${(i + 1 + queuePageBegin).toString()}/${queueSize.toString()}`, song.title, false);
|
|
});
|
|
|
|
embed.addField('Page', `${queuePage} out of ${maxQueuePage}`, false);
|
|
|
|
await msg.channel.send({embeds: [embed]});
|
|
} else {
|
|
await msg.channel.send('queue empty');
|
|
}
|
|
}
|
|
}
|