174 lines
7.3 KiB
JavaScript
174 lines
7.3 KiB
JavaScript
|
const { SlashCommandBuilder } = require('discord.js');
|
||
|
const { QueryType } = require('discord-player');
|
||
|
|
||
|
module.exports = {
|
||
|
data: new SlashCommandBuilder()
|
||
|
.setName('music')
|
||
|
.setDescription('Play and configure music')
|
||
|
.addSubcommand(subcommand => subcommand
|
||
|
.setName('play')
|
||
|
.setDescription('Play music')
|
||
|
.addStringOption(option => option
|
||
|
.setName('link-or-query')
|
||
|
.setDescription('The song or link you want to play')
|
||
|
.setRequired(true)))
|
||
|
.addSubcommand(subcommand => subcommand
|
||
|
.setName('skip')
|
||
|
.setDescription('Skip current song'))
|
||
|
.addSubcommand(subcommand => subcommand
|
||
|
.setName('stop')
|
||
|
.setDescription('Stop current queue'))
|
||
|
.addSubcommand(subcommand => subcommand
|
||
|
.setName('pause')
|
||
|
.setDescription('Pause the current song'))
|
||
|
.addSubcommand(subcommand => subcommand
|
||
|
.setName('shuffle')
|
||
|
.setDescription('Shuffle the queue'))
|
||
|
.addSubcommand(subcommand => subcommand
|
||
|
.setName('resume')
|
||
|
.setDescription('Resume the current song'))
|
||
|
.addSubcommand(subcommand => subcommand
|
||
|
.setName('filter')
|
||
|
.setDescription('Apply a filter')
|
||
|
.addStringOption(option => option
|
||
|
.setName('type')
|
||
|
.setDescription('Type of filter')
|
||
|
.setRequired(true)
|
||
|
.addChoices(
|
||
|
{ name: 'Bassboost', value: 'bassboost_low' },
|
||
|
{ name: 'Nightcore', value: 'nightcore' },
|
||
|
)))
|
||
|
.addSubcommand(subcommand => subcommand
|
||
|
.setName('volume')
|
||
|
.setDescription('Set volume')
|
||
|
.addNumberOption(option => option
|
||
|
.setName('percentage')
|
||
|
.setDescription('The percentage of the volume between 1 and 100')
|
||
|
.setRequired(true))),
|
||
|
|
||
|
async execute({ interaction, createEmbed, client }) {
|
||
|
if (!interaction.member.voice.channelId) return await interaction.reply({ embeds: [createEmbed.basic('You are not in a voice channel!')], ephemeral: true });
|
||
|
if (interaction.guild.members.me.voice.channelId && interaction.member.voice.channelId !== interaction.guild.members.me.voice.channelId) {
|
||
|
return await interaction.reply({ embeds: [createEmbed.basic('You are not in my voice channel!')], ephemeral: true });
|
||
|
}
|
||
|
|
||
|
|
||
|
if (interaction.options.getSubcommand() === 'play') {
|
||
|
const query = interaction.options.getString('link-or-query');
|
||
|
|
||
|
const queue = client.player.createQueue(interaction.guild, {
|
||
|
ytdlOptions: {
|
||
|
filter: 'audioonly',
|
||
|
highWaterMark: 1 << 30,
|
||
|
dlChunkSize: 0,
|
||
|
},
|
||
|
metadata: {
|
||
|
channel: interaction.channel,
|
||
|
},
|
||
|
});
|
||
|
|
||
|
// verify vc connection
|
||
|
try {
|
||
|
if (!queue.connection) await queue.connect(interaction.member.voice.channel);
|
||
|
} catch {
|
||
|
queue.destroy();
|
||
|
return await interaction.reply({ embeds: [createEmbed.basic('Could not join your voice channel!')], ephemeral: true });
|
||
|
}
|
||
|
|
||
|
await interaction.reply({ embeds: [createEmbed.basic('Searching...')], ephemeral: true });
|
||
|
|
||
|
const searchResult = await client.player.search(query, {
|
||
|
requestedBy: interaction.user,
|
||
|
searchEngine: QueryType.AUTO,
|
||
|
});
|
||
|
if (!searchResult || !searchResult.tracks[0]) return await interaction.editReply({ embeds: [createEmbed.basic(`Track or playlist **${query}** not found!`)], ephemeral: true });
|
||
|
|
||
|
searchResult.playlist ? queue.addTracks(searchResult.tracks) : queue.addTrack(searchResult.tracks[0]);
|
||
|
if (!queue.playing) await queue.play();
|
||
|
|
||
|
if (!searchResult.playlist) await interaction.editReply({ embeds: [createEmbed.basic(`Adding track **${searchResult.tracks[0].title}**`)], ephemeral: false });
|
||
|
else await interaction.editReply({ embeds: [createEmbed.basic(`Adding **${searchResult.playlist.tracks.length}** tracks from playlist **${searchResult.playlist.title}**`)], ephemeral: false });
|
||
|
|
||
|
} else if (interaction.options.getSubcommand() === 'skip') {
|
||
|
|
||
|
const queue = client.player.getQueue(interaction.guild);
|
||
|
|
||
|
if (!queue || !queue.playing) return await interaction.reply({ embeds: [createEmbed.basic('No music is being played')] });
|
||
|
|
||
|
const currentTrack = queue.nowPlaying();
|
||
|
const success = queue.skip();
|
||
|
|
||
|
await interaction.reply({ embeds: [createEmbed.basic(success ? `Skipped **${currentTrack.title}**` : 'Something went wrong')] });
|
||
|
} else if (interaction.options.getSubcommand() === 'volume') {
|
||
|
const vol = interaction.options.getNumber('percentage');
|
||
|
|
||
|
const queue = client.player.getQueue(interaction.guild);
|
||
|
|
||
|
if (!queue || !queue.playing) return await interaction.reply({ embeds: [createEmbed.basic('No music is being played')] });
|
||
|
|
||
|
if (vol < 1 || vol > 100) return interaction.reply({ embeds: [createEmbed.basic('Volume must be between 1 and 100')] });
|
||
|
|
||
|
const success = queue.setVolume(vol);
|
||
|
|
||
|
await interaction.reply({ embeds: [createEmbed.basic(success ? `Volume set to **${vol}%**` : 'Something went wrong')] });
|
||
|
} else if (interaction.options.getSubcommand() === 'stop') {
|
||
|
|
||
|
const queue = client.player.getQueue(interaction.guild);
|
||
|
|
||
|
if (!queue || !queue.playing) return await interaction.reply({ embeds: [createEmbed.basic('No music is being played')] });
|
||
|
|
||
|
queue.destroy();
|
||
|
|
||
|
await interaction.reply({ embeds: [createEmbed.basic('Stopped the player')] });
|
||
|
} else if (interaction.options.getSubcommand() === 'pause') {
|
||
|
|
||
|
const queue = client.player.getQueue(interaction.guild);
|
||
|
|
||
|
if (!queue || !queue.playing) return await interaction.reply({ embeds: [createEmbed.basic('No music is being played')] });
|
||
|
|
||
|
queue.setPaused(true);
|
||
|
|
||
|
await interaction.reply({ embeds: [createEmbed.basic('Paused the player')] });
|
||
|
} else if (interaction.options.getSubcommand() === 'resume') {
|
||
|
|
||
|
const queue = client.player.getQueue(interaction.guild);
|
||
|
|
||
|
if (!queue || !queue.playing) return await interaction.reply({ embeds: [createEmbed.basic('No music is being played')] });
|
||
|
|
||
|
queue.setPaused(false);
|
||
|
|
||
|
await interaction.reply({ embeds: [createEmbed.basic('Resumed the player')] });
|
||
|
} else if (interaction.options.getSubcommand() === 'filter') {
|
||
|
const filter = interaction.options.getString('type');
|
||
|
|
||
|
const queue = client.player.getQueue(interaction.guild);
|
||
|
|
||
|
if (!queue || !queue.playing) return await interaction.reply({ embeds: [createEmbed.basic('No music is being played')] });
|
||
|
|
||
|
if (filter === 'bassboost_low') {
|
||
|
await queue.setFilters({
|
||
|
bassboost_low: !queue.getFiltersEnabled().includes('bassboost_low'),
|
||
|
normalizer2: !queue.getFiltersEnabled().includes('bassboost_low'),
|
||
|
});
|
||
|
}
|
||
|
|
||
|
if (filter === 'nightcore') {
|
||
|
await queue.setFilters({
|
||
|
nightcore: !queue.getFiltersEnabled().includes('nightcore'),
|
||
|
});
|
||
|
}
|
||
|
|
||
|
await interaction.reply({ embeds: [createEmbed.basic(queue.getFiltersEnabled().includes(filter) ? `Applied **${filter}** filter` : `Removed **${filter}** filter`)] });
|
||
|
} else if (interaction.options.getSubcommand() === 'shuffle') {
|
||
|
|
||
|
const queue = client.player.getQueue(interaction.guild);
|
||
|
|
||
|
if (!queue || !queue.playing) return await interaction.reply({ embeds: [createEmbed.basic('No music is being played')] });
|
||
|
|
||
|
const success = queue.shuffle();
|
||
|
|
||
|
await interaction.reply({ embeds: [createEmbed.basic(success ? 'The queue has been shuffled' : 'Something went wrong')] });
|
||
|
}
|
||
|
},
|
||
|
};
|