1
0
mirror of https://github.com/toast-ts/Daggerbot-TS.git synced 2024-11-18 00:31:00 -05:00
Daggerbot-TS/src/commands/music.ts

119 lines
5.6 KiB
TypeScript
Raw Normal View History

2023-06-24 13:47:42 -04:00
import Discord from 'discord.js';
import TClient from '../client.js';
import {Player,useTimeline,useQueue} from 'discord-player';
import {SpotifyExtractor} from '@discord-player/extractor';
export default {
async run(client: TClient, interaction: Discord.ChatInputCommandInteraction<'cached'>){
2023-06-26 00:13:31 -04:00
if (!client.config.botSwitches.music && !client.config.whitelist.includes(interaction.user.id)) return interaction.reply({content:'Music module is currently disabled.',ephemeral:true});
2023-06-24 13:47:42 -04:00
if (!client.isStaff(interaction.member) && !client.config.whitelist.includes(interaction.member.id)) return interaction.reply('This command is in early stages of development, some parts may be missing or broken.\nIt has been restricted to staff for time-being.');
const player = Player.singleton(client);
await player.extractors.register(SpotifyExtractor, {
clientId: client.tokens.dontlookatme.client,
clientSecret: client.tokens.dontlookatme.secret
});
if (!interaction.member.voice.channel) return interaction.reply('Please join a voice channel first to use the command.');
2023-06-24 13:47:42 -04:00
player.nodes.create(interaction.guildId, {
metadata: {
channel: interaction.channel,
client: interaction.guild.members.me,
requestedBy: interaction.member
},
selfDeaf: true,
volume: 75,
skipOnNoStream: true,
leaveOnEnd: false,
leaveOnEmpty: false,
bufferingTimeout: 30000,
connectionTimeout: 25000,
strategy: 'FIFO'
});
({
play: async()=>{
const url = interaction.options.getString('url');
if (!url.includes('https://open.spotify.com/')) return interaction.reply('Sorry, I can\'t play that. I can only accept Spotify links that contains `https://open.spotify.com/`');
if (!url.includes('?si=')) return interaction.reply('To be able to play this song/playlist, you need to remove the `?si=<random string of letters>` from the URL or it will basically do nothing.')
2023-06-24 13:47:42 -04:00
player.play(interaction.member.voice.channel, url);
2023-06-26 00:13:31 -04:00
await interaction.reply(`Added the ${url.includes('playlist/') ? 'playlist' : 'song'} to the queue.`);
2023-06-24 13:47:42 -04:00
},
stop: async()=>{
player.destroy();
await interaction.reply('Player destroyed.')
},
2023-06-26 00:13:31 -04:00
pause: ()=>{
const queue = useQueue(interaction.guildId);
queue.node.setPaused(!queue.node.isPaused());
if (!queue.node.isPaused) interaction.reply('Music has been paused.');
else if (queue.node.isPaused) interaction.reply('Music has been unpaused.')
},
2023-06-24 13:47:42 -04:00
now_playing: ()=>{
const {volume,timestamp,track} = useTimeline(interaction.guildId);
interaction.reply({embeds:[
new client.embed().setColor(client.config.embedColor).setTitle(`${track.title} - ${track.author}`).setThumbnail(track.thumbnail).addFields(
{name: 'Timestamp', value: `**${timestamp.current.label}**/**${timestamp.total.label}**`, inline: true},
{name: 'Volume', value: `${volume}%`, inline: true}
)
]})
},
2023-06-26 00:13:31 -04:00
queue: async()=>{
const queue = useQueue(interaction.guildId);
await interaction.reply({embeds:[new client.embed().setColor(client.config.embedColor).setTitle(`Songs currently in the queue: ${queue.tracks.size}`).setDescription(queue.tracks.size > 0 ? `${queue.tracks.map(i=>`**${i.title}** - **${i.author}**`).join('\n')}` : '*No songs currently queued.*')]}).catch(()=>interaction.channel.send('I cannot send an embed that hits beyond the character limit.'))
},
2023-06-24 13:47:42 -04:00
volume: ()=>{
const vol = interaction.options.getNumber('percentage');
2023-06-26 00:13:31 -04:00
useQueue(interaction.guildId).node.setVolume(vol);
2023-06-24 13:47:42 -04:00
interaction.reply(`Successfully adjusted the player's volume to ${vol}%`)
2023-06-26 00:13:31 -04:00
},
shuffle: ()=>{
useQueue(interaction.guildId).tracks.shuffle();
interaction.reply('Songs in the queue has been shuffled.')
},
remove: ()=>{
useQueue(interaction.guildId).removeTrack(interaction.options.getNumber('id',true));
interaction.reply('Song has been removed from the queue.')
2023-06-24 13:47:42 -04:00
}
} as any)[interaction.options.getSubcommand()]();
},
data: new Discord.SlashCommandBuilder()
.setName('music')
.setDescription('Music module')
.addSubcommand(x=>x
.setName('play')
.setDescription('Play a Spotify song')
.addStringOption(x=>x
.setName('url')
.setDescription('Spotify URL')
.setRequired(true)))
.addSubcommand(x=>x
.setName('stop')
.setDescription('Stop playing music and disconnect the bot from voice channel'))
2023-06-26 00:13:31 -04:00
.addSubcommand(x=>x
.setName('pause')
.setDescription('Pause/unpause the music'))
2023-06-24 13:47:42 -04:00
.addSubcommand(x=>x
.setName('now_playing')
.setDescription('Check what song is currently playing'))
2023-06-26 00:13:31 -04:00
.addSubcommand(x=>x
.setName('queue')
.setDescription('View the list of songs currently in queue'))
2023-06-24 13:47:42 -04:00
.addSubcommand(x=>x
.setName('volume')
.setDescription('Adjust the player\'s volume')
.addNumberOption(x=>x
.setName('percentage')
2023-06-26 00:13:31 -04:00
.setDescription('Adjust the volume level, ranges from 5 to 100, default is 75')
2023-06-24 13:47:42 -04:00
.setMaxValue(100)
.setMinValue(5)
.setRequired(true)))
2023-06-26 00:13:31 -04:00
.addSubcommand(x=>x
.setName('shuffle')
.setDescription('Shuffle the songs in a queue'))
.addSubcommand(x=>x
.setName('remove')
.setDescription('Remove a specific song from the queue')
.addNumberOption(x=>x
.setName('id')
.setDescription('Song # in the queue to be removed')
.setMinValue(0)
.setMaxValue(9999)
.setRequired(true)))
2023-06-24 13:47:42 -04:00
}