Fix playerButtons + generatePlayer

This commit is contained in:
Zachary Guénot
2023-06-15 21:27:02 +02:00
parent 30bb35c4e7
commit 3e5a4cdff2
17 changed files with 145 additions and 164 deletions

View File

@@ -5,8 +5,7 @@ module.exports = {
async execute(interaction) { async execute(interaction) {
let queue = useQueue(interaction.guild.id) let queue = useQueue(interaction.guild.id)
let loop = queue.repeatMode === 0 ? 1 : queue.repeatMode === 1 ? 2 : queue.repeatMode === 2 ? 3 : 0 let loop = queue.repeatMode === 0 ? 1 : queue.repeatMode === 1 ? 2 : queue.repeatMode === 2 ? 3 : 0
queue.setRepeatMode(loop) await 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 }) 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 })
setTimeout(async () => { await interaction.deleteReply() }, 20000) }
}
} }

View File

@@ -3,12 +3,8 @@ const { useQueue } = require('discord-player')
module.exports = { module.exports = {
id: 'pause', id: 'pause',
async execute(interaction) { async execute(interaction) {
console.log(interaction)
console.log(interaction.reply)
console.log(interaction.reply())
let queue = useQueue(interaction.guild.id) let queue = useQueue(interaction.guild.id)
queue.node.setPaused(!queue.node.isPaused()) await queue.node.setPaused(!queue.node.isPaused())
await interaction.reply({ content: 'Musique mise en pause !', ephemeral: true }) return interaction.followUp({ content: 'Musique mise en pause !', ephemeral: true })
setTimeout(async () => { await interaction.deleteReply() }, 20000) }
}
} }

View File

@@ -5,7 +5,6 @@ module.exports = {
async execute(interaction) { async execute(interaction) {
let history = useHistory(interaction.guild.id) let history = useHistory(interaction.guild.id)
await history.previous() await history.previous()
await interaction.reply({ content: 'Musique précédente jouée !', ephemeral: true }) return interaction.followUp({ content: 'Musique précédente jouée !', ephemeral: true })
setTimeout(async () => { await interaction.deleteReply() }, 20000) }
}
} }

View File

@@ -4,8 +4,7 @@ module.exports = {
id: 'resume', id: 'resume',
async execute(interaction) { async execute(interaction) {
let queue = useQueue(interaction.guild.id) let queue = useQueue(interaction.guild.id)
queue.node.setPaused(!queue.node.isPaused()) await queue.node.setPaused(!queue.node.isPaused())
await interaction.reply({ content: 'Musique reprise !', ephemeral: true }) return interaction.followUp({ content: 'Musique reprise !', ephemeral: true })
setTimeout(async () => { await interaction.deleteReply() }, 20000) }
}
} }

View File

@@ -4,8 +4,7 @@ module.exports = {
id: 'shuffle', id: 'shuffle',
async execute(interaction) { async execute(interaction) {
let queue = useQueue(interaction.guild.id) let queue = useQueue(interaction.guild.id)
queue.tracks.shuffle() await queue.tracks.shuffle()
await interaction.reply({ content: 'File d\'attente mélangée !', ephemeral: true }) return interaction.followUp({ content: 'File d\'attente mélangée !', ephemeral: true })
setTimeout(async () => { await interaction.deleteReply() }, 20000) }
}
} }

View File

@@ -4,8 +4,7 @@ module.exports = {
id: 'skip', id: 'skip',
async execute(interaction) { async execute(interaction) {
let queue = useQueue(interaction.guild.id) let queue = useQueue(interaction.guild.id)
queue.node.skip() await queue.node.skip()
await interaction.reply({ content: 'Musique passée !', ephemeral: true }) return interaction.followUp({ content: 'Musique passée !', ephemeral: true })
setTimeout(async () => { await interaction.deleteReply() }, 20000) }
}
} }

View File

@@ -4,8 +4,7 @@ module.exports = {
id: 'stop', id: 'stop',
async execute(interaction) { async execute(interaction) {
let queue = useQueue(interaction.guild.id) let queue = useQueue(interaction.guild.id)
queue.delete() await queue.delete()
await interaction.reply({ content: 'Musique arrêtée !', ephemeral: true }) return interaction.followUp({ content: 'Musique arrêtée !', ephemeral: true })
setTimeout(async () => { await interaction.deleteReply() }, 20000) }
}
} }

View File

@@ -4,14 +4,8 @@ module.exports = {
id: 'volume_down', id: 'volume_down',
async execute(interaction) { async execute(interaction) {
let queue = useQueue(interaction.guild.id) let queue = useQueue(interaction.guild.id)
if (!queue) await interaction.reply({ content: 'Aucune musique en cours de lecture.', ephemeral: true }) let volume = queue.node.volume - 10
else { await queue.node.setVolume(volume)
let volume = queue.node.volume - 10 return interaction.followUp({ content: `🔉 | Volume modifié à ${volume}% !`, ephemeral: true })
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)
}
} }

View File

@@ -4,14 +4,8 @@ module.exports = {
id: 'volume_up', id: 'volume_up',
async execute(interaction) { async execute(interaction) {
let queue = useQueue(interaction.guild.id) let queue = useQueue(interaction.guild.id)
if (!queue) await interaction.reply({ content: 'Aucune musique en cours de lecture.', ephemeral: true }) let volume = queue.node.volume + 10
else { await queue.node.setVolume(volume)
let volume = queue.node.volume + 10 return interaction.followUp({ content: `🔊 | Volume modifié à ${volume}% !`, ephemeral: true })
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)
}
} }

View File

@@ -7,8 +7,17 @@ const playerButtons = require(appDir + '/utilsPlayer/buttons.js')
module.exports = { module.exports = {
name: Events.InteractionCreate, name: Events.InteractionCreate,
async execute(interaction) { 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()) { else if (interaction.isAutocomplete()) {
let autoCompleteRun = interaction.client.commands.get(interaction.commandName) let autoCompleteRun = interaction.client.commands.get(interaction.commandName)
if (!autoCompleteRun) return console.error(`No autoCompleteRun matching ${interaction.commandName} was found.`) if (!autoCompleteRun) return console.error(`No autoCompleteRun matching ${interaction.commandName} was found.`)
@@ -18,17 +27,6 @@ module.exports = {
try { await autoCompleteRun.autocompleteRun(interaction) } try { await autoCompleteRun.autocompleteRun(interaction) }
catch (error) { console.error(`Error autocompleting ${interaction.commandName}:`, error) } 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()) { else if (interaction.isButton()) {
let button = interaction.client.buttons.get(interaction.customId) let button = interaction.client.buttons.get(interaction.customId)
if (!button) return console.error(`No button id matching ${interaction.customId} was found.`) if (!button) return console.error(`No button id matching ${interaction.customId} was found.`)

View File

@@ -1,23 +1,13 @@
const { Events } = require('discord.js') const { Events } = require('discord.js')
const { useMasterPlayer, useQueue } = require('discord-player')
require('dotenv').config() 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 { DataTypes } = require("sequelize")
//const sequelize = require('../utils/initSequelize.js') //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 = { module.exports = {
name: Events.ClientReady, name: Events.ClientReady,
once: true, once: true,
@@ -25,46 +15,7 @@ module.exports = {
console.log(`\u001b[1;35m Ready! Logged in as ${client.user.tag}`) console.log(`\u001b[1;35m Ready! Logged in as ${client.user.tag}`)
// Check if a music session was active before the bot was restarted // Check if a music session was active before the bot was restarted
if (process.env.DISCORD_MUSIC_CURRENT_TRACK) { if (process.env.DISCORD_MUSIC_CURRENT_TRACK) await replay(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() }
}
//try { //try {
// sequelize.authenticate() // sequelize.authenticate()
@@ -72,38 +23,8 @@ module.exports = {
//} catch (error) { console.error('Unable to connect to the database:', error) } //} catch (error) { console.error('Unable to connect to the database:', error) }
var interval = setInterval(async () => { var interval = setInterval(async () => {
//client.guilds.cache.each(async guild => { let state = await disco(client)
//const Data = sequelize.define(guild.id, { if (state === 'clear') clearInterval(interval)
// playerChannelId: DataTypes.STRING }, 2000)
//})
//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)
} }
} }

10
package-lock.json generated
View File

@@ -24,7 +24,6 @@
"parse-torrent": "^11.0.12", "parse-torrent": "^11.0.12",
"play-dl": "^1.9.6", "play-dl": "^1.9.6",
"prism-media": "^1.3.5", "prism-media": "^1.3.5",
"querystring": "^0.2.1",
"require-all": "^3.0.0", "require-all": "^3.0.0",
"sequelize": "^6.32.0", "sequelize": "^6.32.0",
"sqlite3": "^5.1.6", "sqlite3": "^5.1.6",
@@ -2931,15 +2930,6 @@
"node": ">=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": { "node_modules/queue-microtask": {
"version": "1.2.3", "version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",

View File

@@ -34,7 +34,6 @@
"parse-torrent": "^11.0.12", "parse-torrent": "^11.0.12",
"play-dl": "^1.9.6", "play-dl": "^1.9.6",
"prism-media": "^1.3.5", "prism-media": "^1.3.5",
"querystring": "^0.2.1",
"require-all": "^3.0.0", "require-all": "^3.0.0",
"sequelize": "^6.32.0", "sequelize": "^6.32.0",
"sqlite3": "^5.1.6", "sqlite3": "^5.1.6",

50
utilsPlayer/disco.js Normal file
View File

@@ -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 })
}

View File

@@ -59,5 +59,5 @@ module.exports = async (interaction) => {
.setDisabled(true) .setDisabled(true)
) )
] ]
interaction.update({ components, content: 'Chargement...' }) await interaction.update({ components })
} }

View File

@@ -2,17 +2,20 @@ const { EmbedBuilder, ButtonBuilder, ActionRowBuilder } = require('discord.js')
const { useQueue } = require('discord-player') const { useQueue } = require('discord-player')
module.exports = async (guild) => { module.exports = async (guild) => {
let queue = useQueue(guild.id)
let embed = new EmbedBuilder().setColor('#ffc370') let embed = new EmbedBuilder().setColor('#ffc370')
let queue = useQueue(guild.id)
if (!queue) { if (!queue) {
embed.setTitle('Aucune session d\'écoute en cours !') embed.setTitle('Aucune session d\'écoute en cours !')
return ({ embed, components: null }) return ({ embed, components: null })
} }
let track = queue.currentTrack let track = queue.currentTrack
if (!track) { if (!track) {
embed.setTitle('Aucune musique en cours de lecture !') embed.setTitle('Aucune musique en cours de lecture !')
return ({ embed, components: null }) return ({ embed, components: null })
} }
embed.setTitle(track.title) embed.setTitle(track.title)
.setAuthor({ name: track.author }) .setAuthor({ name: track.author })
.setURL(track.url) .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: 'Loop', value: queue.repeatMode ? queue.repeatMode === 2 ? "File d'Attente" : "Titre" : "Off", inline: true },
{ name: 'Autoplay', value: queue.autoplay ? "On" : "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}` }) .setFooter({ text: `Demandé par ${track.requestedBy.tag}` })
let components = [ let components = [
@@ -42,7 +45,7 @@ module.exports = async (guild) => {
.setLabel('⏭️') .setLabel('⏭️')
.setStyle(2) .setStyle(2)
.setCustomId('skip') .setCustomId('skip')
.setDisabled(queue.tracks.length !== 0), .setDisabled(queue.tracks.data.length !== 0),
new ButtonBuilder() new ButtonBuilder()
.setLabel('🔉') .setLabel('🔉')
.setStyle(2) .setStyle(2)

42
utilsPlayer/replay.js Normal file
View File

@@ -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() }
}