From ffeef2df909099970db60e4ddb4ee34dc36a9b6a Mon Sep 17 00:00:00 2001 From: Raphix Date: Mon, 10 Apr 2023 17:41:59 +0200 Subject: [PATCH] Version 2 --- package.json | 2 +- src/commands/help.js | 32 +++++++++ src/commands/leave.js | 6 +- src/commands/pause.js | 8 +-- src/commands/play.js | 74 ++++++++++++++----- src/commands/queue.js | 160 +++++++++++++++++++++++++++++++++++++++++ src/commands/resume.js | 9 +-- src/main.js | 21 +++++- 8 files changed, 281 insertions(+), 31 deletions(-) create mode 100644 src/commands/help.js create mode 100644 src/commands/queue.js diff --git a/package.json b/package.json index 9d07d1b..63a616b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "subsonics-discord", "author": "Raphix", - "version": "1.0.0", + "version": "2.0.0", "dependencies": { "discord.js": "^14.9.0", "erela.js": "^2.4.0", diff --git a/src/commands/help.js b/src/commands/help.js new file mode 100644 index 0000000..2664e24 --- /dev/null +++ b/src/commands/help.js @@ -0,0 +1,32 @@ +const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); + +module.exports = { + + data:new SlashCommandBuilder() + .setName("help") + .setDescription("Faire partir le meilleur groupe du monde !"), + + async execute(client, interaction) { + + + + const embed = new EmbedBuilder() + .setColor(0x03ff2d) + .setTitle('Comment assister au concert ?') + .setDescription("**Eh ! Tu as eu ton ticket ? Tant mieux ! Voici la liste des commandes à utiliser dans le salon <#664355637685256203>**") + .addFields({name: "/play ", value: "Cette commande te permet de lire depuis Youtube, n'importe quel musique !"}, + {name: "/leave", value: "Si tu ne veux plus du meilleur groupe du monde (faire partir le bot), cette commande les fera partir aussi vite qu'ils sont arrivés !"}, + {name: "/pause", value: "Besoin d'un entracte ? Cette commande te permettera de mettre le morceau en cours, en pause !"}, + {name: "/resume", value: "Fin de l'entracte ? Cette commande te permettera de mettre le morceau qui était en pause, en cours !"}, + {name: "/queue ", value: "Permet d'afficher ou de supprimer les titres de la liste de lecture."}) + .setTimestamp() + .setThumbnail("https://static.wikia.nocookie.net/codelyoko/images/9/95/Subdigitals.jpg/revision/latest/scale-to-width-down/180?cb=20120105180510&path-prefix=fr"); + + + + interaction.reply({embeds: [embed]}) + + } + + +} \ No newline at end of file diff --git a/src/commands/leave.js b/src/commands/leave.js index 3a58820..63cd5bf 100644 --- a/src/commands/leave.js +++ b/src/commands/leave.js @@ -1,4 +1,5 @@ const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); +const { Player } = require("erela.js"); module.exports = { @@ -11,10 +12,11 @@ module.exports = { if(!interaction.member.voice.channel) return interaction.reply({content:"Vous devez rejoindre un salon vocal !", ephemeral: true}) let player = client.manager.players.get(interaction.guild.id) + if(player) { - player.disconnect() + player.destroy() const embed = new EmbedBuilder() .setColor(0xff0000) @@ -28,7 +30,7 @@ module.exports = { } else { - interaction.reply("**Aucune musique n'est actuellement joué !**") + interaction.reply("**Aucune musique n'est actuellement jouée !**") } } diff --git a/src/commands/pause.js b/src/commands/pause.js index fe3e2a3..7f2ba9b 100644 --- a/src/commands/pause.js +++ b/src/commands/pause.js @@ -4,7 +4,7 @@ module.exports = { data: new SlashCommandBuilder() .setName("pause") - .setDescription("Met en pause la musique joué !"), + .setDescription("Met en pause la musique jouée !"), async execute(client, interaction) { @@ -19,7 +19,7 @@ module.exports = { const embed = new EmbedBuilder() .setColor(0x03ff2d) .setTitle('Pause !') - .setDescription("**Ok, une entracte est demandé par " + interaction.member.user.username + "**") + .setDescription("**Ok, une entracte est demandée par " + interaction.member.user.username + "**") .setTimestamp(); @@ -27,13 +27,13 @@ module.exports = { player.pause(true) } else { - interaction.reply("**Aucune musique n'est actuellement joué !**") + interaction.reply("**Aucune musique n'est actuellement jouée !**") } } else { - interaction.reply("**Aucune musique n'est actuellement joué !**") + interaction.reply("**Aucune musique n'est actuellement jouée !**") } } diff --git a/src/commands/play.js b/src/commands/play.js index 210236e..2602e1d 100644 --- a/src/commands/play.js +++ b/src/commands/play.js @@ -6,42 +6,82 @@ module.exports = { data:new SlashCommandBuilder() .setName("play") .setDescription("Lire une musique depuis youtube") - .addStringOption(option => option.setName("nom").setDescription("Le nom de la musique recherché !").setRequired(true)), + .addStringOption(option => option.setName("nom_ou_lien").setDescription("Le nom de la musique recherchée !").setRequired(true)), async execute(client, interaction) { - const song_name = interaction.options.getString("nom") + const song_name = interaction.options.getString("nom_ou_lien") if(!interaction.member.voice.channel) return interaction.reply({content:"Vous devez rejoindre un salon vocal !", ephemeral: true}) let player = client.manager.players.get(interaction.guild.id) - if(!player) player = client.manager.create({ + if(!player) { + + player = client.manager.create({ guild: interaction.guild.id, voiceChannel: interaction.member.voice.channel.id, textChannel: interaction.channel.id, - }); + }); + + player.connect(); + } const songs = await client.manager.search(song_name) - player.connect(); + if(!player.playing) { + + client.manager.players.get(interaction.guild.id).queue.add(songs.tracks[0]) + player.play() - player.queue.add(songs.tracks[0]) + const embed = await new EmbedBuilder() + .setColor(0x15e6ed) + .setTitle('**Lecture de **' + songs.tracks[0].title) + .setDescription('**Demandé par **' + interaction.member.user.username) + .addFields({name: "Auteur", value: songs.tracks[0].author}, + {name: "URL", value:songs.tracks[0].uri}) + .setThumbnail(songs.tracks[0].thumbnail) + .setTimestamp(); + + try { - if(!player.playing) player.play() + interaction.reply({embeds: [embed]}) + } catch(error) { - console.log(songs.tracks[0]) + interaction.reply({embeds: [embed]}) + } + - const embed = new EmbedBuilder() - .setColor(0x15e6ed) - .setTitle('**Lecture de **' + songs.tracks[0].title) - .setDescription('**Demandé par **' + interaction.member.user.username) - .addFields({name: "Auteur", value: songs.tracks[0].author}, - {name: "URL", value:songs.tracks[0].uri}) - .setThumbnail(songs.tracks[0].thumbnail) - .setTimestamp(); + + + + + } else { + + const embed = await new EmbedBuilder() + .setColor(0x15e6ed) + .setTitle('**Ajout dans la liste de lecture **' + songs.tracks[0].title) + .setDescription('**Demandé par **' + interaction.member.user.username) + .addFields({name: "Auteur", value: songs.tracks[0].author}, + {name: "URL", value:songs.tracks[0].uri}) + .setThumbnail(songs.tracks[0].thumbnail) + .setTimestamp(); + + client.manager.players.get(interaction.guild.id).queue.add(songs.tracks[0]) + console.log("------------------------PLAY.JS---------------------") + console.log(player.queue) + console.log("--------------------------------------------") + try { + + interaction.reply({embeds: [embed]}) + } catch(error) { + + interaction.reply({embeds: [embed]}) + } + + + } - interaction.reply({embeds: [embed]}) } } \ No newline at end of file diff --git a/src/commands/queue.js b/src/commands/queue.js new file mode 100644 index 0000000..62b0170 --- /dev/null +++ b/src/commands/queue.js @@ -0,0 +1,160 @@ +const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); + +module.exports = { + + data: new SlashCommandBuilder() + .setName("queue") + .setDescription("Affiche le ping du bot !") + .addStringOption(option => option.setName("action").setDescription("Que veux tu faire avec la queue ?").setRequired(true).addChoices( + {name: "Afficher", value: "show"}, + {name: "Supprimer", value: "delete"} + )).addIntegerOption(option => option.setName("number").setDescription("Numéro de la place dans la liste de lecture")), + + + async execute(client, interaction) { + + if(!interaction.member.voice.channel) return interaction.reply({content:"Vous devez rejoindre un salon vocal !", ephemeral: true}) + + + + + const choice = interaction.options.getString("action") + + if(choice == "show") { + const embed = new EmbedBuilder() + .setColor(0xe033ff) + .setTitle('Liste de lecture') + .setDescription("Les musiques vont défiler dans cet ordre !") + .setTimestamp(); + + let player = client.manager.players.get(interaction.guild.id) + + + if(!player) { + + const song_show = {name: "Aucune chanson n'est dans la queue", value: "Tu peux en ajouter avec /play"} + + embed.addFields(song_show) + interaction.reply({embeds: [embed]}) + } else { + + console.log("------------------------QUEUE.JS---------------------") + console.log(client.manager.players.get(interaction.guild.id).queue) + let queue = client.manager.players.get(interaction.guild.id).queue; + + + if(queue.length == 0){ + + const song_show = {name: "Aucune chanson n'est dans la queue", value: "Tu peux en ajouter avec /play"} + + embed.addFields(song_show) + interaction.reply({embeds: [embed]}) + } else { + + + for(song of queue) { + + const song_show = {name: queue.indexOf(song) + " - " + song.title, value: song.author} + + embed.addFields(song_show) + } + + await interaction.reply({embeds: [embed]}) + } + } + + + } else if(choice == "delete") { + + let embed = new EmbedBuilder() + .setColor(0xe033ff) + .setTitle('Liste de lecture') + .setDescription("Les musiques vont défiler dans cet ordre !") + .setTimestamp(); + + let player = client.manager.players.get(interaction.guild.id) + + if(!player) { + + embed = new EmbedBuilder() + .setColor(0xff0303) + .setTitle('Erreur : Liste de lecture') + .setTimestamp(); + const song_show = {name: "Aucune chanson n'est dans la queue", value: "Supression impossible"} + + embed.addFields(song_show) + interaction.reply({embeds: [embed]}) + } else { + + console.log("------------------------QUEUE.JS---------------------") + console.log(client.manager.players.get(interaction.guild.id).queue) + let queue = client.manager.players.get(interaction.guild.id).queue; + + + if(queue.length == 0){ + + embed = new EmbedBuilder() + .setColor(0xff0303) + .setTitle('Erreur : Liste de lecture') + .setTimestamp(); + const song_show = {name: "Aucune chanson n'est dans la queue", value: "Supression impossible"} + + embed.addFields(song_show) + interaction.reply({embeds: [embed]}) + } else { + + const number = interaction.options.getInteger("number") + + console.log(number) + + if(number != null) { + try { + queue.splice(number, 1) + + embed = new EmbedBuilder() + .setColor(0xe033ff) + .setTitle('Supressipn : Liste de lecture') + .setDescription("La musique a été retiré de la liste de lecture !") + .setTimestamp(); + + interaction.reply({embeds: [embed]}) + + } catch(error) { + + embed = new EmbedBuilder() + .setColor(0xff0303) + .setTitle('Erreur : Liste de lecture') + .setTimestamp(); + const song_show = {name: "Le numéro correspondant n'est pas disponible", value: "Supression impossible"} + + embed.addFields(song_show) + interaction.reply({embeds: [embed]}) + } + + } else { + + + + embed = new EmbedBuilder() + .setColor(0xff0303) + .setTitle('Erreur : Liste de lecture') + .setTimestamp(); + const song_show = {name: "Un numéro est nécéssaire", value: "Supression impossible"} + + embed.addFields(song_show) + interaction.reply({embeds: [embed]}) + } + + + + + } + } + + } else { + + await interaction.reply("**La commande a été mal éxécutée !**") + } + + } +} \ No newline at end of file diff --git a/src/commands/resume.js b/src/commands/resume.js index f95b33d..7f25f20 100644 --- a/src/commands/resume.js +++ b/src/commands/resume.js @@ -4,7 +4,7 @@ module.exports = { data: new SlashCommandBuilder() .setName("resume") - .setDescription("Met en pause la musique joué !"), + .setDescription("Remet la musique qui était en pause !"), async execute(client, interaction) { @@ -19,21 +19,22 @@ module.exports = { const embed = new EmbedBuilder() .setColor(0x03ff2d) .setTitle('C\'est reparti !') - .setDescription("**Ok, Fin de l'entracte, c'est reparti et c'est demandé par " + interaction.member.user.username + "**") + .setDescription("**Ok, Fin de l'entracte, c'est reparti et c'est demandée par " + interaction.member.user.username + "**") .setTimestamp(); interaction.reply({embeds: [embed]}) player.pause(false) + } else { - interaction.reply("**Aucune musique n'est actuellement joué !**") + interaction.reply("**Aucune musique n'est actuellement jouée !**") } } else { - interaction.reply("**Aucune musique n'est actuellement joué !**") + interaction.reply("**Aucune musique n'est actuellement jouée !**") } } diff --git a/src/main.js b/src/main.js index 8a792e4..02ef580 100644 --- a/src/main.js +++ b/src/main.js @@ -1,4 +1,6 @@ -const { Client, GatewayIntentBits, Collection } = require("discord.js") +function startApp() { + + const { Client, GatewayIntentBits, Collection } = require("discord.js") const { REST, Routes } = require("discord.js") const fs = require("node:fs") const config = require("./config.json") @@ -10,6 +12,7 @@ const client = new Client({ }) client.commands = new Collection() +client.queue = [] const commands = []; // Grab all the command files from the commands directory you created earlier @@ -90,8 +93,8 @@ client.on("interactionCreate", (interaction) => { const nodes = [ { - host: "lavalink.lexnet.cc", - password: "lexn3tl@val!nk", + host: "lavalink.devamop.in", + password: "DevamOP", port: 443, secure: true } @@ -126,3 +129,15 @@ client.on("raw", d => client.manager.updateVoiceState(d)); // Client Manager client.login(config.token) + +} + + function handleFatalError(error) { + console.error('Erreur fatale :', error); + console.log('Redémarrage en cours...'); + startApp(); + } + + process.on('uncaughtException', handleFatalError); + + startApp();