diff --git a/buttons/loop.js b/buttons/loop.js index 8f65001..e82b837 100644 --- a/buttons/loop.js +++ b/buttons/loop.js @@ -5,8 +5,7 @@ module.exports = { async execute(interaction) { let queue = useQueue(interaction.guild.id) let loop = queue.repeatMode === 0 ? 1 : queue.repeatMode === 1 ? 2 : queue.repeatMode === 2 ? 3 : 0 - queue.setRepeatMode(loop) - await interaction.reply({ content:`Boucle ${loop === 0 ? 'désactivée' : loop === 1 ? 'en mode Titre' : loop === 2 ? 'en mode File d\'Attente' : 'en autoplay'}.`, ephemeral: true }) - setTimeout(async () => { await interaction.deleteReply() }, 20000) - } + await queue.setRepeatMode(loop) + await interaction.followUp({ content:`Boucle ${loop === 0 ? 'désactivée' : loop === 1 ? 'en mode Titre' : loop === 2 ? 'en mode File d\'Attente' : 'en autoplay'}.`, ephemeral: true }) + } } \ No newline at end of file diff --git a/buttons/pause.js b/buttons/pause.js index f6e6afb..fe6a513 100644 --- a/buttons/pause.js +++ b/buttons/pause.js @@ -3,12 +3,8 @@ const { useQueue } = require('discord-player') module.exports = { id: 'pause', async execute(interaction) { - console.log(interaction) - console.log(interaction.reply) - console.log(interaction.reply()) let queue = useQueue(interaction.guild.id) - queue.node.setPaused(!queue.node.isPaused()) - await interaction.reply({ content: 'Musique mise en pause !', ephemeral: true }) - setTimeout(async () => { await interaction.deleteReply() }, 20000) - } + await queue.node.setPaused(!queue.node.isPaused()) + return interaction.followUp({ content: 'Musique mise en pause !', ephemeral: true }) + } } \ No newline at end of file diff --git a/buttons/previous.js b/buttons/previous.js index 6d6a190..0ba5296 100644 --- a/buttons/previous.js +++ b/buttons/previous.js @@ -5,7 +5,6 @@ module.exports = { async execute(interaction) { let history = useHistory(interaction.guild.id) await history.previous() - await interaction.reply({ content: 'Musique précédente jouée !', ephemeral: true }) - setTimeout(async () => { await interaction.deleteReply() }, 20000) - } + return interaction.followUp({ content: 'Musique précédente jouée !', ephemeral: true }) + } } \ No newline at end of file diff --git a/buttons/resume.js b/buttons/resume.js index 2d3bb28..7215973 100644 --- a/buttons/resume.js +++ b/buttons/resume.js @@ -4,8 +4,7 @@ module.exports = { id: 'resume', async execute(interaction) { let queue = useQueue(interaction.guild.id) - queue.node.setPaused(!queue.node.isPaused()) - await interaction.reply({ content: 'Musique reprise !', ephemeral: true }) - setTimeout(async () => { await interaction.deleteReply() }, 20000) - } + await queue.node.setPaused(!queue.node.isPaused()) + return interaction.followUp({ content: 'Musique reprise !', ephemeral: true }) + } } \ No newline at end of file diff --git a/buttons/shuffle.js b/buttons/shuffle.js index 104c46b..3bfc7e6 100644 --- a/buttons/shuffle.js +++ b/buttons/shuffle.js @@ -4,8 +4,7 @@ module.exports = { id: 'shuffle', async execute(interaction) { let queue = useQueue(interaction.guild.id) - queue.tracks.shuffle() - await interaction.reply({ content: 'File d\'attente mélangée !', ephemeral: true }) - setTimeout(async () => { await interaction.deleteReply() }, 20000) - } + await queue.tracks.shuffle() + return interaction.followUp({ content: 'File d\'attente mélangée !', ephemeral: true }) + } } \ No newline at end of file diff --git a/buttons/skip.js b/buttons/skip.js index 9632c56..00bbc22 100644 --- a/buttons/skip.js +++ b/buttons/skip.js @@ -4,8 +4,7 @@ module.exports = { id: 'skip', async execute(interaction) { let queue = useQueue(interaction.guild.id) - queue.node.skip() - await interaction.reply({ content: 'Musique passée !', ephemeral: true }) - setTimeout(async () => { await interaction.deleteReply() }, 20000) - } + await queue.node.skip() + return interaction.followUp({ content: 'Musique passée !', ephemeral: true }) + } } \ No newline at end of file diff --git a/buttons/stop.js b/buttons/stop.js index cd216f0..6cf7f63 100644 --- a/buttons/stop.js +++ b/buttons/stop.js @@ -4,8 +4,7 @@ module.exports = { id: 'stop', async execute(interaction) { let queue = useQueue(interaction.guild.id) - queue.delete() - await interaction.reply({ content: 'Musique arrêtée !', ephemeral: true }) - setTimeout(async () => { await interaction.deleteReply() }, 20000) - } + await queue.delete() + return interaction.followUp({ content: 'Musique arrêtée !', ephemeral: true }) + } } \ No newline at end of file diff --git a/buttons/volume_down.js b/buttons/volume_down.js index 8cf47f0..d74cebb 100644 --- a/buttons/volume_down.js +++ b/buttons/volume_down.js @@ -4,14 +4,8 @@ module.exports = { id: 'volume_down', async execute(interaction) { let queue = useQueue(interaction.guild.id) - if (!queue) await interaction.reply({ content: 'Aucune musique en cours de lecture.', ephemeral: true }) - else { - let volume = queue.node.volume - 10 - queue.node.setVolume(volume) - //await interaction.reply({ content: `🔉 | Volume modifié à ${volume}% !`, ephemeral: true }) - let message = await interaction.fetchReply() - await message.edit({ content: `🔉 | Volume modifié à ${volume}% !`, ephemeral: true }) - } - setTimeout(async () => { await interaction.deleteReply() }, 20000) - } + let volume = queue.node.volume - 10 + await queue.node.setVolume(volume) + return interaction.followUp({ content: `🔉 | Volume modifié à ${volume}% !`, ephemeral: true }) + } } \ No newline at end of file diff --git a/buttons/volume_up.js b/buttons/volume_up.js index a4a526c..756b1c4 100644 --- a/buttons/volume_up.js +++ b/buttons/volume_up.js @@ -4,14 +4,8 @@ module.exports = { id: 'volume_up', async execute(interaction) { let queue = useQueue(interaction.guild.id) - if (!queue) await interaction.reply({ content: 'Aucune musique en cours de lecture.', ephemeral: true }) - else { - let volume = queue.node.volume + 10 - queue.node.setVolume(volume) - //await interaction.reply({ content: `🔉 | Volume modifié à ${volume}% !`, ephemeral: true }) - let message = await interaction.fetchReply() - await message.edit({ content: `🔉 | Volume modifié à ${volume}% !`, ephemeral: true }) - } - setTimeout(async () => { await interaction.deleteReply() }, 20000) - } + let volume = queue.node.volume + 10 + await queue.node.setVolume(volume) + return interaction.followUp({ content: `🔊 | Volume modifié à ${volume}% !`, ephemeral: true }) + } } \ No newline at end of file diff --git a/events/interactionCreate.js b/events/interactionCreate.js index f82a6ec..88bef92 100755 --- a/events/interactionCreate.js +++ b/events/interactionCreate.js @@ -7,8 +7,17 @@ const playerButtons = require(appDir + '/utilsPlayer/buttons.js') module.exports = { name: Events.InteractionCreate, async execute(interaction) { - if (!interaction.isAutocomplete() && !interaction.isChatInputCommand() && !interaction.isButton()) return console.error(`Interaction ${interaction.commandName} is not a command.`) + //if (!interaction.isAutocomplete() && !interaction.isChatInputCommand() && !interaction.isButton()) return console.error(`Interaction ${interaction.commandName} is not a command.`) + if (interaction.isChatInputCommand()) { + let command = interaction.client.commands.get(interaction.commandName) + if (!command) return console.error(`No command matching ${interaction.commandName} was found.`) + + console.log(`\u001b[1;33m Command '${interaction.commandName}' launched by ${interaction.user.tag}`) + + try { await command.execute(interaction) } + catch (error) { console.error(`Error executing ${interaction.commandName}:`, error) } + } else if (interaction.isAutocomplete()) { let autoCompleteRun = interaction.client.commands.get(interaction.commandName) if (!autoCompleteRun) return console.error(`No autoCompleteRun matching ${interaction.commandName} was found.`) @@ -18,17 +27,6 @@ module.exports = { try { await autoCompleteRun.autocompleteRun(interaction) } catch (error) { console.error(`Error autocompleting ${interaction.commandName}:`, error) } } - - else if (interaction.isChatInputCommand()) { - let command = interaction.client.commands.get(interaction.commandName) - if (!command) return console.error(`No command matching ${interaction.commandName} was found.`) - - console.log(`\u001b[1;33m Command '${interaction.commandName}' launched by ${interaction.user.tag}`) - - try { await command.execute(interaction) } - catch (error) { console.error(`Error executing ${interaction.commandName}:`, error) } - } - else if (interaction.isButton()) { let button = interaction.client.buttons.get(interaction.customId) if (!button) return console.error(`No button id matching ${interaction.customId} was found.`) diff --git a/events/ready.js b/events/ready.js index 1635d39..46fc6cb 100755 --- a/events/ready.js +++ b/events/ready.js @@ -1,23 +1,13 @@ const { Events } = require('discord.js') -const { useMasterPlayer, useQueue } = require('discord-player') require('dotenv').config() +const appDir = require('path').dirname(require.main.filename) +const replay = require(appDir + '/utilsPlayer/replay.js') +const disco = require(appDir + '/utilsPlayer/disco.js') + //const { DataTypes } = require("sequelize") //const sequelize = require('../utils/initSequelize.js') -const appDir = require('path').dirname(require.main.filename) -const generatePlayer = require(appDir + '/utilsPlayer/generate.js') -const getUptime = require(appDir + '/utils/getUptime.js') - -const dance = async function (bot_id, channel, embed, components) { - let messages = await channel.messages.fetch() - let botMessage = messages.find(msg => msg.author.id === bot_id) - if (!botMessage || (!components && botMessage.components.length > 0)) { - await channel.bulkDelete(messages) - return await channel.send({ embeds: [embed] }) - } else await botMessage.edit({ embeds: [embed], components }) -} - module.exports = { name: Events.ClientReady, once: true, @@ -25,46 +15,7 @@ module.exports = { console.log(`\u001b[1;35m Ready! Logged in as ${client.user.tag}`) // Check if a music session was active before the bot was restarted - if (process.env.DISCORD_MUSIC_CURRENT_TRACK) { - let textChannel = client.channels.cache.get(process.env.DISCORD_MUSIC_TEXTCHANNEL_ID) - let voiceChannel = client.channels.cache.get(process.env.DISCORD_MUSIC_VOICECHANNEL_ID) - - let player = useMasterPlayer() - let queue = player.nodes.create(textChannel.guild, { - metadata: { - channel: textChannel, - client: textChannel.guild.members.me, - requestedBy: client.user - }, - selfDeaf: true, - volume: 20, - leaveOnEmpty: true, - leaveOnEmptyCooldown: 300000, - leaveOnEnd: true, - leaveOnEndCooldown: 300000, - skipOnNoStream: true - }) - - try { if (!queue.connection) await queue.connect(voiceChannel) } - catch (error) { console.error(error); await textChannel.send(`Y'a eu un problème, <@223831938346123275> ! (${error.message})`) } - - let result = await player.search(process.env.DISCORD_MUSIC_CURRENT_TRACK, { requestedBy: client.user }) - if (!result.hasTracks()) await textChannel.send(`Aucune musique trouvée pour **${query}** !`) - let track = result.tracks[0] - - let entry = queue.tasksQueue.acquire() - await entry.getTask() - queue.addTrack(track) - - let progress = process.env.DISCORD_MUSIC_CURRENT_PROGRESS - - try { - await queue.node.play() - queue.node.seek(progress) - await textChannel.send(`Relancement de la musique suite à mon redémarrage...`) - } catch (error) { console.error(error); await textChannel.send(`Y'a eu un problème, <@223831938346123275> ! (${error.message})`) } - finally { queue.tasksQueue.release() } - } + if (process.env.DISCORD_MUSIC_CURRENT_TRACK) await replay(client) //try { // sequelize.authenticate() @@ -72,38 +23,8 @@ module.exports = { //} catch (error) { console.error('Unable to connect to the database:', error) } var interval = setInterval(async () => { - //client.guilds.cache.each(async guild => { - //const Data = sequelize.define(guild.id, { - // playerChannelId: DataTypes.STRING - //}) - //await sequelize.sync({ force: true }) - - //if (!Data.playerChannelId) { - // clearInterval(interval) - // return console.log(`\u001b[1;31m Aucun channel inscrit dans la base, veuillez utiliser la commande \`/setchannel\` !`) - //} - //let channel = client.channels.cache.get(Data.playerChannelId) - - let guild = client.guilds.cache.get(process.env.DISCORD_GUILD_ID) - let channel = client.channels.cache.get(process.env.DISCORD_PLAYERCHANNEL_ID) - if (!channel) { - clearInterval(interval) - return console.log(`\u001b[1;31m Error: Aucun channel trouvé avec l'id \`${process.env.DISCORD_PLAYERCHANNEL_ID}\`, veuillez utiliser la commande \`/setchannel\` !`) - } - - // Keep track of the music progress if the bot reboots - let queue = useQueue(guild.id) - if (queue) if (queue.isPlaying()) writeEnv('DISCORD_MUSIC_CURRENT_PROGRESS', queue.node.playbackTime) - - let { embed, components } = await generatePlayer(guild) - if (components) { - embed.setFooter({ text: `Uptime: ${getUptime(client.uptime)} / ${embed.data.footer.text}` }) - await dance(client.user.id, channel, embed, components) - } else { - embed.setFooter({ text: `Uptime: ${getUptime(client.uptime)}` }) - await dance(client.user.id, channel, embed) - } - //}) - }, 4000) + let state = await disco(client) + if (state === 'clear') clearInterval(interval) + }, 2000) } } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 07cac09..2aa0f4f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,6 @@ "parse-torrent": "^11.0.12", "play-dl": "^1.9.6", "prism-media": "^1.3.5", - "querystring": "^0.2.1", "require-all": "^3.0.0", "sequelize": "^6.32.0", "sqlite3": "^5.1.6", @@ -2931,15 +2930,6 @@ "node": ">=6" } }, - "node_modules/querystring": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", - "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "engines": { - "node": ">=0.4.x" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", diff --git a/package.json b/package.json index 76cbab2..1e0d168 100755 --- a/package.json +++ b/package.json @@ -34,7 +34,6 @@ "parse-torrent": "^11.0.12", "play-dl": "^1.9.6", "prism-media": "^1.3.5", - "querystring": "^0.2.1", "require-all": "^3.0.0", "sequelize": "^6.32.0", "sqlite3": "^5.1.6", diff --git a/utilsPlayer/disco.js b/utilsPlayer/disco.js new file mode 100644 index 0000000..168df11 --- /dev/null +++ b/utilsPlayer/disco.js @@ -0,0 +1,50 @@ +const { useQueue } = require('discord-player') + +const appDir = require('path').dirname(require.main.filename) +const generate = require(appDir + '/utilsPlayer/generate.js') +const getUptime = require(appDir + '/utils/getUptime.js') + +module.exports = replay = async (client) => { + //client.guilds.cache.each(async guild => { + //const Data = sequelize.define(guild.id, { + // playerChannelId: DataTypes.STRING + //}) + //await sequelize.sync({ force: true }) + + //if (!Data.playerChannelId) { + // clearInterval(interval) + // console.log(`\u001b[1;31m Aucun channel inscrit dans la base, veuillez utiliser la commande \`/setchannel\` !`) + // return 'clear' + //} + //let channel = client.channels.cache.get(Data.playerChannelId) + + let guild = client.guilds.cache.get(process.env.DISCORD_GUILD_ID) + if (!guild) { + clearInterval(interval) + console.log(`\u001b[1;31m Error: Aucun serveur trouvé avec l'id \`${process.env.DISCORD_GUILD_ID}\`, veuillez utiliser la commande \`/setchannel\` !`) + return 'clear' + } + + // Keep track of the music progress if the bot reboots + let queue = useQueue(guild.id) + if (queue) if (queue.isPlaying()) writeEnv('DISCORD_MUSIC_CURRENT_PROGRESS', queue.node.playbackTime) + + let channel = client.channels.cache.get(process.env.DISCORD_PLAYERCHANNEL_ID) + if (!channel) { + clearInterval(interval) + console.log(`\u001b[1;31m Error: Aucun channel trouvé avec l'id \`${process.env.DISCORD_PLAYERCHANNEL_ID}\`, veuillez utiliser la commande \`/setchannel\` !`) + return 'clear' + } + + let { embed, components } = await generate(guild) + if (components) embed.setFooter({ text: `Uptime: ${getUptime(client.uptime)} \n ${embed.data.footer.text}` }) + else embed.setFooter({ text: `Uptime: ${getUptime(client.uptime)}` }) + + let messages = await channel.messages.fetch() + let botMessage = messages.find(msg => msg.author.id === client.user.id) + + if (!botMessage || (!components && botMessage.components.length > 0)) { + await channel.bulkDelete(messages) + return channel.send({ embeds: [embed] }) + } else return botMessage.edit({ embeds: [embed], components }) +} \ No newline at end of file diff --git a/utilsPlayer/edit.js b/utilsPlayer/edit.js index b441586..d9422e4 100644 --- a/utilsPlayer/edit.js +++ b/utilsPlayer/edit.js @@ -59,5 +59,5 @@ module.exports = async (interaction) => { .setDisabled(true) ) ] - interaction.update({ components, content: 'Chargement...' }) + await interaction.update({ components }) } \ No newline at end of file diff --git a/utilsPlayer/generate.js b/utilsPlayer/generate.js index db67cd4..74c2d65 100644 --- a/utilsPlayer/generate.js +++ b/utilsPlayer/generate.js @@ -2,17 +2,20 @@ const { EmbedBuilder, ButtonBuilder, ActionRowBuilder } = require('discord.js') const { useQueue } = require('discord-player') module.exports = async (guild) => { - let queue = useQueue(guild.id) let embed = new EmbedBuilder().setColor('#ffc370') + + let queue = useQueue(guild.id) if (!queue) { embed.setTitle('Aucune session d\'écoute en cours !') return ({ embed, components: null }) } + let track = queue.currentTrack if (!track) { embed.setTitle('Aucune musique en cours de lecture !') return ({ embed, components: null }) } + embed.setTitle(track.title) .setAuthor({ name: track.author }) .setURL(track.url) @@ -25,7 +28,7 @@ module.exports = async (guild) => { { name: 'Loop', value: queue.repeatMode ? queue.repeatMode === 2 ? "File d'Attente" : "Titre" : "Off", inline: true }, { name: 'Autoplay', value: queue.autoplay ? "On" : "Off", inline: true } ) - .setDescription(`**Musique suivante :** ${queue.tracks[0] ? queue.tracks[0].title : 'Aucune'}`) + .setDescription(`**Musique suivante :** ${queue.tracks.data[0] ? queue.tracks.data[0].title : 'Aucune'}`) .setFooter({ text: `Demandé par ${track.requestedBy.tag}` }) let components = [ @@ -42,7 +45,7 @@ module.exports = async (guild) => { .setLabel('⏭️') .setStyle(2) .setCustomId('skip') - .setDisabled(queue.tracks.length !== 0), + .setDisabled(queue.tracks.data.length !== 0), new ButtonBuilder() .setLabel('🔉') .setStyle(2) diff --git a/utilsPlayer/replay.js b/utilsPlayer/replay.js new file mode 100644 index 0000000..2e0243e --- /dev/null +++ b/utilsPlayer/replay.js @@ -0,0 +1,42 @@ +const { useMasterPlayer } = require('discord-player') + +module.exports = replay = async (client) => { + let textChannel = client.channels.cache.get(process.env.DISCORD_MUSIC_TEXTCHANNEL_ID) + let voiceChannel = client.channels.cache.get(process.env.DISCORD_MUSIC_VOICECHANNEL_ID) + + let player = useMasterPlayer() + let queue = player.nodes.create(textChannel.guild, { + metadata: { + channel: textChannel, + client: textChannel.guild.members.me, + requestedBy: client.user + }, + selfDeaf: true, + volume: 20, + leaveOnEmpty: true, + leaveOnEmptyCooldown: 300000, + leaveOnEnd: true, + leaveOnEndCooldown: 300000, + skipOnNoStream: true + }) + + try { if (!queue.connection) await queue.connect(voiceChannel) } + catch (error) { console.error(error); await textChannel.send(`Y'a eu un problème, <@223831938346123275> ! (${error.message})`) } + + let result = await player.search(process.env.DISCORD_MUSIC_CURRENT_TRACK, { requestedBy: client.user }) + if (!result.hasTracks()) await textChannel.send(`Aucune musique trouvée pour **${query}** !`) + let track = result.tracks[0] + + let entry = queue.tasksQueue.acquire() + await entry.getTask() + queue.addTrack(track) + + let progress = process.env.DISCORD_MUSIC_CURRENT_PROGRESS + + try { + await queue.node.play() + queue.node.seek(progress) + await textChannel.send(`Relancement de la musique suite à mon redémarrage...`) + } catch (error) { console.error(error); await textChannel.send(`Y'a eu un problème, <@223831938346123275> ! (${error.message})`) } + finally { queue.tasksQueue.release() } +} \ No newline at end of file