diff --git a/CHANGELOG.md b/CHANGELOG.md index 8709464..648cca4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Added +- Added a `/move` command to change position of tracks - Added a `/now-playing` command to show the current track without the full queue embed ## [1.6.2] - 2022-03-17 diff --git a/src/commands/move.ts b/src/commands/move.ts new file mode 100644 index 0000000..91a3957 --- /dev/null +++ b/src/commands/move.ts @@ -0,0 +1,47 @@ +import {CommandInteraction} from 'discord.js'; +import {inject, injectable} from 'inversify'; +import {TYPES} from '../types.js'; +import PlayerManager from '../managers/player.js'; +import Command from '.'; +import {SlashCommandBuilder} from '@discordjs/builders'; + +@injectable() +export default class implements Command { + public readonly slashCommand = new SlashCommandBuilder() + .setName('move') + .setDescription('move songs within the queue') + .addIntegerOption(option => + option.setName('from') + .setDescription('position of the song to move') + .setRequired(true), + ) + .addIntegerOption(option => + option.setName('to') + .setDescription('position to move the song to') + .setRequired(true)); + + private readonly playerManager: PlayerManager; + + constructor(@inject(TYPES.Managers.Player) playerManager: PlayerManager) { + this.playerManager = playerManager; + } + + public async execute(interaction: CommandInteraction): Promise { + const player = this.playerManager.get(interaction.guild!.id); + + const from = interaction.options.getInteger('from') ?? 1; + const to = interaction.options.getInteger('to') ?? 1; + + if (from < 1) { + throw new Error('position must be at least 1'); + } + + if (to < 1) { + throw new Error('position must be at least 1') + } + + player.move(from, to); + + await interaction.reply('moved'); + } +} diff --git a/src/inversify.config.ts b/src/inversify.config.ts index 78267f8..5574bb0 100644 --- a/src/inversify.config.ts +++ b/src/inversify.config.ts @@ -21,6 +21,7 @@ import Config from './commands/config.js'; import Disconnect from './commands/disconnect.js'; import Favorites from './commands/favorites.js'; import ForwardSeek from './commands/fseek.js'; +import Move from './commands/move.js' import NowPlaying from './commands/now-playing.js'; import Pause from './commands/pause.js'; import Play from './commands/play.js'; @@ -66,6 +67,7 @@ container.bind(TYPES.Services.SpotifyAPI).to(SpotifyAPI).inSingleton Disconnect, Favorites, ForwardSeek, + Move, NowPlaying, Pause, Play, diff --git a/src/services/player.ts b/src/services/player.ts index 020c501..5c38cdd 100644 --- a/src/services/player.ts +++ b/src/services/player.ts @@ -554,4 +554,14 @@ export default class { resolve(returnedStream); }); } + + move(from: number, to: number): void { + + if (from > this.queueSize() || to > this.queueSize()){ + throw new Error('Move index is outside the range of the queue.' ) + } + + this.queue.splice( this.queuePosition + to ,0, this.queue.splice(this.queuePosition + from, 1)[0]); + } + }