aboutsummaryrefslogtreecommitdiff
path: root/src/commands/queue.ts
blob: a4bdc1e31e87e3c9448f0503dde688b62f9796ad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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(embed);
    } else {
      await msg.channel.send('queue empty');
    }
  }
}