You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Luno/commands/music/play.js

116 lines
6.2 KiB

3 years ago
const Discord = require('discord.js');
const axios = require('axios');
const moment = require('moment');
require('moment-precise-range-plugin');
const sw = require('swwrap');
const activateControls = require('../../util/actmusiccont');
const updateController = require('../../util/updatecontroller');
module.exports = {
name: "play",
aliases: ['p'],
meta: {
category: 'Music',
description: "Play a song!",
syntax: '`play <songName|songURL>`',
extra: null
},
help: new Discord.MessageEmbed()
.setTitle("Help -> Music Playing")
.setDescription("Plays a song by searching for it or using a URL you provide.")
.addField("Notice", "You must be in a voice channel in order to use this command!")
.addField("Syntax", "`play <songName|songURL>`"),
async execute(message, msg, args, cmd, prefix, mention, client) {
if (!message.guild) {return message.channel.send("You must be in a server in order to use this command.");}
if (!args.length) {return message.channel.send(`Syntax: \`${prefix}play <songName|songURL>\``);}
if (!message.member.voice.channel) {return message.channel.send("You have to be in a voice channel to play music, silly!");}
if (client.misc.queue[message.guild.id] && (client.misc.queue[message.guild.id].channel !== message.member.voice.channel.id)) {return message.channel.send("You're in a voice channel, but it's not the music voice channel. Since there's already music playing from me in this server, I can't join your channel.");}
if (client.misc.attemptedQueue.includes(message.guild.id)) {return message.channel.send("A wee too fast there!");}
client.misc.attemptedQueue.push(message.guild.id);
const swc = new sw.Client();
const node = client.lavacordManager.idealNodes[0];
const params = new URLSearchParams();
let search = args.join(' ');
let gotSpotify = false;
const checkSpotify = () => {return new Promise(resolve => {
if (search.match(/^https:\/\/open\.spotify\.com\/track\/\w+/gm)) {
swc.getTrack(search.replace(/^https:\/\/open\.spotify\.com\/track\//gm, '').replace(/\?si=.+/gm, ''))
.then(r => {gotSpotify = true; search = `${r.artist} - ${r.name}`; return resolve(undefined);})
.catch(() => {return resolve(undefined);});
} else {resolve(undefined);}
});}
await checkSpotify();
params.append('identifier', search.match(/^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,4}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)$/g) ? search : `ytsearch:${search}`);
const data = await axios(`http://${node.host}:${node.port}/loadtracks?${params}`, {
headers: {
Authorization: node.password
}
});
let [song] = data.data.tracks;
client.misc.attemptedQueue.splice(client.misc.attemptedQueue.indexOf(message.guild.id), 1);
if (!song) {return message.channel.send("I couldn't find that song! Try again?");}
if (!client.misc.queue[message.guild.id]) {
let player = await client.lavacordManager.join({
guild: message.guild.id,
channel: message.member.voice.channel.id,
node: client.lavacordManager.idealNodes[0].id
}, {selfdeaf: true});
client.misc.queue[message.guild.id] = {
player: player,
queue: [{song: song, player: message.author.id}],
votes: [],
updates: message.channel.id,
channel: message.member.voice.channel.id,
volume: 50
};
player.on('end', async data => {
if (data.reason === "REPLACED" || data.reason === "STOPPED") return;
client.misc.queue[message.guild.id].queue.shift();
if (!client.misc.queue[message.guild.id].queue.length) {
await client.lavacordManager.leave(message.guild.id);
message.guild.channels.cache.get(client.misc.queue[message.guild.id].updates).send('Finished playing.');
return delete client.misc.queue[message.guild.id];
}
await player.play(client.misc.queue[message.guild.id].queue[0].song.track);
updateController(message, client);
});
await player.play(song.track);
await player.volume(50);
let tc = await message.channel.send(new Discord.MessageEmbed()
.setAuthor("Now Playing", message.author.avatarURL())
.setTitle(song.info.title)
.setThumbnail(`https://i.ytimg.com/vi/${song.info.identifier}/maxresdefault.jpg`)
.setDescription(`Channel: ${song.info.author}\n[Original video](${song.info.uri})`)
.addField("Queued By", `<@${message.author.id}>`, true)
.addField("Length", moment.preciseDiff(Date.now(), Date.now() + song.info.length), true)
.addField("Songs in Queue", `**1** Song\n${moment.preciseDiff(Date.now(), Date.now() + song.info.length)}`)
.addField("Settings", `Volume: **${client.misc.queue[message.guild.id].volume}**/**150**`)
3 years ago
.setColor('328ba8')
3 years ago
.setFooter("Luno")
);
let reactions = ['⏯', '⏭', '⏹', '🔁', '🔉', '🔊'];
for (let i = 0; i < reactions.length; i++) {await tc.react(reactions[i]);}
client.misc.queue[message.guild.id].controller = tc;
activateControls(client.misc.queue[message.guild.id].controller, client);
} else {
if (client.misc.queue[message.guild.id].queue.length >= 100) {return message.channel.send("Your queue is too big! Add the song after this one has played.");}
client.misc.queue[message.guild.id].queue.push({song: song, player: message.author.id});
message.channel.send(`Queued **${song.info.title}** | **${client.misc.queue[message.guild.id].queue.length - 1} song${client.misc.queue[message.guild.id].queue.length - 1 > 1 ? 's' : ''}** remaining until it's played.`);
updateController(message, client);
}
}
};