Musique/index.js

261 lines
11 KiB
JavaScript

const Discord = require("discord.js");
const { REST } = require("@discordjs/rest");
const { Routes } = require("discord-api-types/v9");
const ytdl = require("ytdl-core");
const yts = require("yt-search");
const fs = require("fs");
const token = JSON.parse(fs.readFileSync("token.txt").toString());
const { AudioPlayerStatus, StreamType, createAudioPlayer, createAudioResource, joinVoiceChannel, AudioPlayer } = require("@discordjs/voice");
const client = new Discord.Client({ intents: ["GUILDS", "GUILD_VOICE_STATES", "GUILD_MESSAGES", "GUILD_MESSAGE_REACTIONS"] });
var clientId;
const rest = new REST({ version: "9" }).setToken(token);
const queue = new Map();
async function registerCommands(guildId, commands) {
try {
await rest.put(
Routes.applicationGuildCommands(clientId, guildId),
{ body: commands },
);
console.log("Successfully registered commands.");
} catch (error) {
console.error(error);
}
}
client.on("guildCreate", guild => {
registerCommands(guild.id, require("./commands.js"));
});
client.on("ready", () => {
clientId = client.user.id;
client.guilds.cache.forEach(guild => {
registerCommands(guild.id, require("./commands.js"));
});
});
client.on("interactionCreate", async interaction => {
if (interaction.isCommand()) {
if (interaction.commandName == "play") {
if (!interaction.member.voice.channel) {
await interaction.reply({ content: "You're not in a voice channel, are you even using your head?." });
return;
}
let songName = interaction.options.getString("song", true);
let result = await yts(songName);
if (result.videos.length < 1) return interaction.reply({ content: "I found absolutely no results, try to use your brain maybe?" });
let video = result.videos[0];
let serverQueue = queue.get(interaction.guildId);
if (!serverQueue) {
let obj = {
textChannel: interaction.channel,
voiceChannel: interaction.member.voice.channel,
songs: [],
connection: null,
audioPlayer: null,
id: interaction.guildId,
index: 0
}
obj.songs.push({ title: video.title, url: video.url, requestedBy: interaction.member });
let connection = joinVoiceChannel({
channelId: interaction.member.voice.channel.id,
guildId: interaction.guildId,
adapterCreator: interaction.guild.voiceAdapterCreator
});
let audioPlayer = createAudioPlayer();
obj.connection = connection;
obj.audioPlayer = audioPlayer;
obj.loop = false;
queue.set(interaction.guildId, obj);
connection.subscribe(audioPlayer);
try{
playMusic(obj);
} catch(e){
interaction.followUp("An error has occured, name: " + e.name + ", details in console.");
console.log(e);
}
await interaction.reply({ content: `**[${video.title}](${video.url})** playing now. (because you couldn't go to spotify)` });
return;
} else {
serverQueue.songs.push({ title: video.title, url: video.url, requestedBy: interaction.member });
if (serverQueue.songs.length <= 1) {
try{
playMusic(serverQueue);
} catch(e){
interaction.followUp("An error has occured, name: " + e.name + ", details in console.");
console.log(e);
}
}
await interaction.reply({ content: `**[${video.title}](${video.url})** has been added to the queue. it will play when **${serverQueue.songs[serverQueue.index].title}** is done. (Because someone clown came before you)` });
}
}
if (interaction.commandName == "stop") {
if (!interaction.member.voice.channel) {
await interaction.reply({ content: "You're not in a voice channel, are you even using your head?." });
return;
}
let sQueue = queue.get(interaction.guildId);
if (sQueue) {
sQueue.audioPlayer.stop();
sQueue.connection.destroy();
queue.delete(interaction.guildId);
await interaction.reply({ content: "Alright, but know this: I'm not your fucking slave, bastard!" });
} else await interaction.reply({ content: "Nothing is playing, are you an idiot or smth?" });
}
if (interaction.commandName == "skip") {
if (!interaction.member.voice.channel) {
await interaction.reply({ content: "Ok so here's the thing, you're not in a voice channel, you're probably thinking with the air you're wasting." });
return;
}
let sQueue = queue.get(interaction.guildId);
if (sQueue) {
if (sQueue.index+1 >= sQueue.songs.length) {
await interaction.reply({content: "There is nothing to skip to. Use /stop. (Even a toddler knows better than that)"});
return;
}
sQueue.audioPlayer.stop();
await interaction.reply({ content: `Skipped to **${sQueue.songs[sQueue.index+1].title}**. (Please free me from this idiot)` });
}
}
if (interaction.commandName == "queue") {
let sQueue = queue.get(interaction.guildId);
let embed = new Discord.MessageEmbed();
if (!sQueue || sQueue.songs.length < 0) {
embed
.setTitle("Queue")
.setDescription("The queue is empty!")
.setColor("RED");
} else {
embed
.setTitle("Queue")
.setDescription("All the songs that are to play is listed here.")
.setColor("GREEN");
sQueue.songs.forEach((song, index) => {
embed.addField(`#${index+1}${index == sQueue.index ? " (currently playing!)" : ""}`, `${song.title}`);
});
}
await interaction.reply({embeds: [embed.toJSON()]});
}
if(interaction.commandName == "loop"){
if (!interaction.member.voice.channel) {
await interaction.reply({ content: "You're not in a voice channel, are you even using your head?." });
return;
}
let sQueue = queue.get(interaction.guildId);
if (sQueue) {
sQueue.loop = !sQueue.loop;
queue.set(interaction.guildId, sQueue);
if(sQueue.loop){
await interaction.reply("Endless suffering, yaaay");
} else{
await interaction.reply("YES FINALLY YOU RELIEVE ME FROM THIS ENDLESS PLAYING");
}
} else await interaction.reply({ content: "Nothing is playing, are you an idiot or smth?" });
} else if(interaction.commandName == "invite"){
interaction.reply("To invite me to your server, click [here](https://discord.com/api/oauth2/authorize?client_id=914122883473739807&permissions=36716800&scope=bot%20applications.commands).");
}
}
});
async function playMusic(serverQueue) {
let index = serverQueue.index;
let song = serverQueue.songs[index];
let player = new AudioPlayer;
player = serverQueue.audioPlayer;
let connection = serverQueue.connection;
if (index >= serverQueue.songs.length) {
if(serverQueue.loop){
serverQueue.index = 0;
serverQueue.textChannel.send({ content: `**${(serverQueue.songs[0]).title}** is now playing. (send help)` });
try{
playMusic(serverQueue);
} catch(e){
console.log(e);
}
return;
}
serverQueue.textChannel.send({ content: `Finished playing all the songs. (finally you jerks)` });
serverQueue.audioPlayer.stop();
serverQueue.connection.destroy();
for(const [key, value] of queue){
if(value == serverQueue){
queue.delete(key);
}
}
return;
}
try {
let stream = await ytdl(song.url, { filter: "audioonly", highWaterMark: 983554432 });
let resource = createAudioResource(stream, { inputType: StreamType.Arbitrary });
try{
player.play(resource);
} catch(e){
console.log(e);
}
stream.on("error", err => {
serverQueue.textChannel.send({ content: "An error has occured: ```js\n" + err.stack + "```" });
console.log(err);
// player.stop();
});
player.on("error", console.log);
player.once(AudioPlayerStatus.Idle, () => {
if (index >= serverQueue.songs.length) {
if(serverQueue.loop){
serverQueue.index = 0;
serverQueue.textChannel.send({ content: `**${(serverQueue.songs[0]).title}** is now playing. (send help)` });
try{
playMusic(serverQueue);
} catch(e){
console.log(e);
}
return;
}
serverQueue.textChannel.send({ content: `Finished playing all the songs. (finally you jerks)` });
serverQueue.index = 0;
player.stop();
connection.destroy();
queue.delete(serverQueue.id);
} else {
//serverQueue.songs.shift();
serverQueue.index++;
if(serverQueue.songs[index+1]) serverQueue.textChannel.send({ content: `**${(serverQueue.songs[index+1]).title}** is now playing. (send help)` });
try{
playMusic(serverQueue);
} catch(e){
interaction.followUp("An error has occured, name: " + e.name + ", details in console.");
console.log(e);
}
}
});
} catch (e) {
serverQueue.textChannel.send({ content: "An error has occured, check console for details. (" + e.name + ")" });
console.log(e);
}
}
/*
client.on("voiceStateUpdate", (oldState, newState) => {
if(newState.member.id !== client.user.id) return;
newState.setDeaf(true);
newState.setMute(false);
});
*/
client.login(token);