mirror of
https://github.com/BluemediaGER/muse.git
synced 2024-11-10 03:55:29 +01:00
Create /resume
command; make query
required for the /play
command (#546)
This commit is contained in:
parent
4eefb7b30d
commit
d438d46c09
|
@ -5,6 +5,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
### Added
|
||||||
|
- `/resume` command to resume playback
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- `query` is now a required parameter from `/play`
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
- `/play` cannot resume the playback anymore since `query` is now required
|
||||||
|
|
||||||
## [1.2.0] - 2022-02-24
|
## [1.2.0] - 2022-02-24
|
||||||
### Added
|
### Added
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import {AutocompleteInteraction, CommandInteraction, GuildMember} from 'discord.js';
|
import {AutocompleteInteraction, CommandInteraction} from 'discord.js';
|
||||||
import {URL} from 'url';
|
import {URL} from 'url';
|
||||||
import {SlashCommandBuilder} from '@discordjs/builders';
|
import {SlashCommandBuilder} from '@discordjs/builders';
|
||||||
import {inject, injectable} from 'inversify';
|
import {inject, injectable} from 'inversify';
|
||||||
|
@ -10,20 +10,17 @@ import getYouTubeAndSpotifySuggestionsFor from '../utils/get-youtube-and-spotify
|
||||||
import KeyValueCacheProvider from '../services/key-value-cache.js';
|
import KeyValueCacheProvider from '../services/key-value-cache.js';
|
||||||
import {ONE_HOUR_IN_SECONDS} from '../utils/constants.js';
|
import {ONE_HOUR_IN_SECONDS} from '../utils/constants.js';
|
||||||
import AddQueryToQueue from '../services/add-query-to-queue.js';
|
import AddQueryToQueue from '../services/add-query-to-queue.js';
|
||||||
import PlayerManager from '../managers/player.js';
|
|
||||||
import {STATUS} from '../services/player.js';
|
|
||||||
import {buildPlayingMessageEmbed} from '../utils/build-embed.js';
|
|
||||||
import {getMemberVoiceChannel, getMostPopularVoiceChannel} from '../utils/channels.js';
|
|
||||||
|
|
||||||
@injectable()
|
@injectable()
|
||||||
export default class implements Command {
|
export default class implements Command {
|
||||||
public readonly slashCommand = new SlashCommandBuilder()
|
public readonly slashCommand = new SlashCommandBuilder()
|
||||||
.setName('play')
|
.setName('play')
|
||||||
.setDescription('play a song or resume playback')
|
.setDescription('play a song')
|
||||||
.addStringOption(option => option
|
.addStringOption(option => option
|
||||||
.setName('query')
|
.setName('query')
|
||||||
.setDescription('YouTube URL, Spotify URL, or search query')
|
.setDescription('YouTube URL, Spotify URL, or search query')
|
||||||
.setAutocomplete(true))
|
.setAutocomplete(true)
|
||||||
|
.setRequired(true))
|
||||||
.addBooleanOption(option => option
|
.addBooleanOption(option => option
|
||||||
.setName('immediate')
|
.setName('immediate')
|
||||||
.setDescription('add track to the front of the queue'))
|
.setDescription('add track to the front of the queue'))
|
||||||
|
@ -36,42 +33,16 @@ export default class implements Command {
|
||||||
private readonly spotify: Spotify;
|
private readonly spotify: Spotify;
|
||||||
private readonly cache: KeyValueCacheProvider;
|
private readonly cache: KeyValueCacheProvider;
|
||||||
private readonly addQueryToQueue: AddQueryToQueue;
|
private readonly addQueryToQueue: AddQueryToQueue;
|
||||||
private readonly playerManager: PlayerManager;
|
|
||||||
|
|
||||||
constructor(@inject(TYPES.ThirdParty) thirdParty: ThirdParty, @inject(TYPES.KeyValueCache) cache: KeyValueCacheProvider, @inject(TYPES.Services.AddQueryToQueue) addQueryToQueue: AddQueryToQueue, @inject(TYPES.Managers.Player) playerManager: PlayerManager) {
|
constructor(@inject(TYPES.ThirdParty) thirdParty: ThirdParty, @inject(TYPES.KeyValueCache) cache: KeyValueCacheProvider, @inject(TYPES.Services.AddQueryToQueue) addQueryToQueue: AddQueryToQueue) {
|
||||||
this.spotify = thirdParty.spotify;
|
this.spotify = thirdParty.spotify;
|
||||||
this.cache = cache;
|
this.cache = cache;
|
||||||
this.addQueryToQueue = addQueryToQueue;
|
this.addQueryToQueue = addQueryToQueue;
|
||||||
this.playerManager = playerManager;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// eslint-disable-next-line complexity
|
// eslint-disable-next-line complexity
|
||||||
public async execute(interaction: CommandInteraction): Promise<void> {
|
public async execute(interaction: CommandInteraction): Promise<void> {
|
||||||
const query = interaction.options.getString('query');
|
const query = interaction.options.getString('query')!;
|
||||||
|
|
||||||
const player = this.playerManager.get(interaction.guild!.id);
|
|
||||||
const [targetVoiceChannel] = getMemberVoiceChannel(interaction.member as GuildMember) ?? getMostPopularVoiceChannel(interaction.guild!);
|
|
||||||
|
|
||||||
if (!query) {
|
|
||||||
if (player.status === STATUS.PLAYING) {
|
|
||||||
throw new Error('already playing, give me a song name');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Must be resuming play
|
|
||||||
if (!player.getCurrent()) {
|
|
||||||
throw new Error('nothing to play');
|
|
||||||
}
|
|
||||||
|
|
||||||
await player.connect(targetVoiceChannel);
|
|
||||||
await player.play();
|
|
||||||
|
|
||||||
await interaction.reply({
|
|
||||||
content: 'the stop-and-go light is now green',
|
|
||||||
embeds: [buildPlayingMessageEmbed(player)],
|
|
||||||
});
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
await this.addQueryToQueue.addToQueue({
|
await this.addQueryToQueue.addToQueue({
|
||||||
interaction,
|
interaction,
|
||||||
|
|
46
src/commands/resume.ts
Normal file
46
src/commands/resume.ts
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
import {SlashCommandBuilder} from '@discordjs/builders';
|
||||||
|
import {inject, injectable} from 'inversify';
|
||||||
|
import Command from '.';
|
||||||
|
import {TYPES} from '../types.js';
|
||||||
|
import PlayerManager from '../managers/player.js';
|
||||||
|
import {STATUS} from '../services/player.js';
|
||||||
|
import {buildPlayingMessageEmbed} from '../utils/build-embed.js';
|
||||||
|
import {getMemberVoiceChannel, getMostPopularVoiceChannel} from '../utils/channels.js';
|
||||||
|
import {CommandInteraction, GuildMember} from 'discord.js';
|
||||||
|
|
||||||
|
@injectable()
|
||||||
|
export default class implements Command {
|
||||||
|
public readonly slashCommand = new SlashCommandBuilder()
|
||||||
|
.setName('resume')
|
||||||
|
.setDescription('resume playback');
|
||||||
|
|
||||||
|
public requiresVC = true;
|
||||||
|
|
||||||
|
private readonly playerManager: PlayerManager;
|
||||||
|
|
||||||
|
constructor(@inject(TYPES.Managers.Player) playerManager: PlayerManager) {
|
||||||
|
this.playerManager = playerManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line complexity
|
||||||
|
public async execute(interaction: CommandInteraction): Promise<void> {
|
||||||
|
const player = this.playerManager.get(interaction.guild!.id);
|
||||||
|
const [targetVoiceChannel] = getMemberVoiceChannel(interaction.member as GuildMember) ?? getMostPopularVoiceChannel(interaction.guild!);
|
||||||
|
if (player.status === STATUS.PLAYING) {
|
||||||
|
throw new Error('already playing, give me a song name');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Must be resuming play
|
||||||
|
if (!player.getCurrent()) {
|
||||||
|
throw new Error('nothing to play');
|
||||||
|
}
|
||||||
|
|
||||||
|
await player.connect(targetVoiceChannel);
|
||||||
|
await player.play();
|
||||||
|
|
||||||
|
await interaction.reply({
|
||||||
|
content: 'the stop-and-go light is now green',
|
||||||
|
embeds: [buildPlayingMessageEmbed(player)],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -23,6 +23,7 @@ import Pause from './commands/pause.js';
|
||||||
import Play from './commands/play.js';
|
import Play from './commands/play.js';
|
||||||
import QueueCommand from './commands/queue.js';
|
import QueueCommand from './commands/queue.js';
|
||||||
import Remove from './commands/remove.js';
|
import Remove from './commands/remove.js';
|
||||||
|
import Resume from './commands/resume.js';
|
||||||
import Seek from './commands/seek.js';
|
import Seek from './commands/seek.js';
|
||||||
import Shuffle from './commands/shuffle.js';
|
import Shuffle from './commands/shuffle.js';
|
||||||
import Skip from './commands/skip.js';
|
import Skip from './commands/skip.js';
|
||||||
|
@ -64,6 +65,7 @@ container.bind<AddQueryToQueue>(TYPES.Services.AddQueryToQueue).to(AddQueryToQue
|
||||||
Play,
|
Play,
|
||||||
QueueCommand,
|
QueueCommand,
|
||||||
Remove,
|
Remove,
|
||||||
|
Resume,
|
||||||
Seek,
|
Seek,
|
||||||
Shuffle,
|
Shuffle,
|
||||||
Skip,
|
Skip,
|
||||||
|
|
Loading…
Reference in a new issue