Maj pkgs + fix dep des buttons / commands + Ajout fichiers utils

This commit is contained in:
Zachary Guénot
2023-05-08 15:16:50 +02:00
parent 9d8de23a06
commit b1b638f429
32 changed files with 3824 additions and 5719 deletions

View File

@@ -4,11 +4,7 @@
**/.gitignore **/.gitignore
**/.vscode **/.vscode
**/docker-compose* **/docker-compose*
**/compose*
**/Dockerfile* **/Dockerfile*
**/node_modules **/node_modules
**/npm-debug.log
**/obj
**/cracks **/cracks
LICENSE
README.md README.md

17
app.js
View File

@@ -12,14 +12,8 @@ const client = new Client({ intents })
const eventFiles = fs.readdirSync('./events').filter(file => file.endsWith('.js')) const eventFiles = fs.readdirSync('./events').filter(file => file.endsWith('.js'))
for (const file of eventFiles) { for (const file of eventFiles) {
let event = require(`./events/${file}`) let event = require(`./events/${file}`)
if (event.once) client.once(event.name, (...args) => { if (event.once) client.once(event.name, (...args) => { event.execute(...args) })
//console.log(`\u001b[1;35m Event '${event.name}' executed.`) else client.on(event.name, (...args) => { event.execute(...args) })
event.execute(...args)
})
else client.on(event.name, (...args) => {
//console.log(`\u001b[1;35m Event '${event.name}' executed.`)
event.execute(...args)
})
} }
// COMMANDS HANDLING // COMMANDS HANDLING
@@ -39,11 +33,7 @@ for (folder of commandFolders) {
// COMMANDS REGISTERING // COMMANDS REGISTERING
const rest = new REST({ version: '10' }).setToken(process.env.DISCORD_TOKEN); const rest = new REST({ version: '10' }).setToken(process.env.DISCORD_TOKEN);
(async () => { (async () => {
//console.log(`\u001b[1;35m Started refreshing ${commands.length} application (/) commands.`) try { await rest.put(Routes.applicationCommands(process.env.DISCORD_APP_ID), { body: commands }) }
try {
let data = await rest.put(Routes.applicationCommands('1065047326860783636'), { body: commands })
//console.log(`\u001b[1;35m Successfully reloaded ${data.length} application (/) commands.`)
}
catch (error) { console.error(error) } catch (error) { console.error(error) }
})() })()
@@ -68,7 +58,6 @@ for (const file of eventPlayerFiles) {
if (['debug'].includes(event.name)) continue if (['debug'].includes(event.name)) continue
player.events.on(event.name, (...args) => event.execute(...args)) player.events.on(event.name, (...args) => event.execute(...args))
} }
//player.on('debug', async (message) => { console.log(`General player debug event: ${message}`) })
// LAUNCH // LAUNCH
client.login() client.login()

View File

@@ -1,4 +1,4 @@
const { useQueue } = require("discord-player") const { useQueue } = require('discord-player')
module.exports = { module.exports = {
id: 'loop', id: 'loop',
@@ -6,7 +6,7 @@ module.exports = {
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) 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.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) setTimeout(async () => { await interaction.deleteReply() }, 20000)
} }
} }

View File

@@ -1,4 +1,4 @@
const { useQueue } = require("discord-player") const { useQueue } = require('discord-player')
module.exports = { module.exports = {
id: 'pause', id: 'pause',

View File

@@ -1,4 +1,4 @@
const { useHistory } = require("discord-player") const { useHistory } = require('discord-player')
module.exports = { module.exports = {
id: 'previous', id: 'previous',

View File

@@ -1,4 +1,4 @@
const { useQueue } = require("discord-player") const { useQueue } = require('discord-player')
module.exports = { module.exports = {
id: 'resume', id: 'resume',

View File

@@ -1,4 +1,4 @@
const { useQueue } = require("discord-player") const { useQueue } = require('discord-player')
module.exports = { module.exports = {
id: 'shuffle', id: 'shuffle',

View File

@@ -1,4 +1,4 @@
const { useQueue } = require("discord-player") const { useQueue } = require('discord-player')
module.exports = { module.exports = {
id: 'skip', id: 'skip',

View File

@@ -1,4 +1,4 @@
const { useQueue } = require("discord-player") const { useQueue } = require('discord-player')
module.exports = { module.exports = {
id: 'stop', id: 'stop',

View File

@@ -1,12 +1,17 @@
const { useQueue } = require("discord-player") const { useQueue } = require('discord-player')
module.exports = { 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)
let volume = queue.node.volume - 10 if (!queue) await interaction.reply({ content: 'Aucune musique en cours de lecture.', ephemeral: true })
queue.node.setVolume(volume) else {
await interaction.reply({ content: `🔉 | Volume modifié à ${volume}% !`, ephemeral: true }) 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) setTimeout(async () => { await interaction.deleteReply() }, 20000)
} }
} }

View File

@@ -1,14 +1,16 @@
const { useQueue } = require("discord-player") const { useQueue } = require('discord-player')
module.exports = { 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 }) if (!queue) await interaction.reply({ content: 'Aucune musique en cours de lecture.', ephemeral: true })
else { else {
let volume = queue.node.volume + 10 let volume = queue.node.volume + 10
queue.node.setVolume(volume) queue.node.setVolume(volume)
await interaction.reply({ content: `🔉 | Volume modifié à ${volume}% !`, ephemeral: true }) //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) setTimeout(async () => { await interaction.deleteReply() }, 20000)
} }

View File

@@ -1,12 +1,12 @@
const { SlashCommandBuilder } = require('discord.js') const { SlashCommandBuilder } = require('discord.js')
const { useQueue } = require("discord-player") const { useQueue } = require('discord-player')
module.exports = { module.exports = {
data: new SlashCommandBuilder() data: new SlashCommandBuilder()
.setName('loop') .setName('loop')
.setDescription('Boucler la musique en cours de lecture.') .setDescription('Boucler la musique en cours de lecture.')
.addIntegerOption(option => option.setName('loop') .addIntegerOption(option => option.setName('loop')
.setDescription("Mode de boucle (0 = Off, 1 = Titre, 2 = File d'Attente; 3 = Autoplay)") .setDescription('Mode de boucle (0 = Off, 1 = Titre, 2 = File d\'Attente; 3 = Autoplay)')
.setRequired(true) .setRequired(true)
.setMinValue(0) .setMinValue(0)
.setMaxValue(3)), .setMaxValue(3)),
@@ -14,6 +14,6 @@ module.exports = {
let loop = interaction.options.getInteger('loop') let loop = interaction.options.getInteger('loop')
let queue = useQueue(interaction.guild.id) let queue = useQueue(interaction.guild.id)
queue.setRepeatMode(loop) queue.setRepeatMode(loop)
return await interaction.reply(`Boucle ${loop === 0 ? "désactivée" : loop === 1 ? "en mode Titre" : loop === 2 ? "en mode File d'Attente" : "en autoplay"}.`) return await interaction.reply(`Boucle ${loop === 0 ? 'désactivée' : loop === 1 ? 'en mode Titre' : loop === 2 ? 'en mode File d\'Attente' : 'en autoplay'}.`)
} }
} }

View File

@@ -1,5 +1,5 @@
const { SlashCommandBuilder } = require('discord.js') const { SlashCommandBuilder } = require('discord.js')
const { useQueue } = require("discord-player") const { useQueue } = require('discord-player')
module.exports = { module.exports = {
data: new SlashCommandBuilder() data: new SlashCommandBuilder()

View File

@@ -1,6 +1,5 @@
const { SlashCommandBuilder } = require('discord.js') const { SlashCommandBuilder } = require('discord.js')
const { useMasterPlayer, useQueue, QueryType } = require('discord-player') const { useMasterPlayer, useQueue, QueryType } = require('discord-player')
const reduceString = (str, length) => str.length > length ? str.substring(0, length - 3) + "..." : str
module.exports = { module.exports = {
data: new SlashCommandBuilder() data: new SlashCommandBuilder()

View File

@@ -1,49 +1,13 @@
const { SlashCommandBuilder, EmbedBuilder } = require('discord.js') const { SlashCommandBuilder } = require('discord.js')
const { useQueue } = require("discord-player") const generatePlayer = require('../../utils/generatePlayer.js')
module.exports = { module.exports = {
data: new SlashCommandBuilder() data: new SlashCommandBuilder()
.setName('player') .setName('player')
.setDescription('Afficher une interface de contrôle de la musique.'), .setDescription('Afficher une interface de contrôle de la musique.'),
async execute(interaction) { async execute(interaction) {
let queue = useQueue(interaction.guild.id) let { embed, components } = await generatePlayer(interaction.guild)
if (!queue) return await interaction.reply('Aucune session d\'écoute en cours !') if (!components) return await interaction.reply({ embeds: [embed] })
let track = queue.currentTrack else return await interaction.reply({ embeds: [embed], components })
if (!track) return await interaction.reply('Aucune musique en cours de lecture !')
/*let embed = {
color: 0xffc370,
title: track.title,
url: track.url,
}
if (track.thumbnail) embed.thumbnail = { url: track.thumbnail }
embed.description = `
**Durée :** ${track.duration}
**Source :** ${track.source ? track.source === 'youtube' ? 'Youtube' : track.source === 'spotify' ? 'Spotify' : 'Inconnu' : 'Inconnu'}
**Volume :** ${queue.node.volume}%
**Progression :** ${queue.node.createProgressBar()}
**Loop :** ${queue.repeatMode ? queue.repeatMode === 2 ? "File d'Attente" : "Titre" : "Off"}
**Autoplay :** ${queue.autoplay ? "On" : "Off"}
`
if (track.requestedBy) embed.footer = { text: `Demandé par ${track.requestedBy.tag}` }
return await interaction.reply({ embeds: [embed] })*/
// Create an embed using EmbedBuilder instead of an object
const embed = new EmbedBuilder()
.setColor('#ffc370')
.setTitle(track.title)
.setAuthor({ name: track.author })
.setURL(track.url)
.setThumbnail(track.thumbnail)
.setDescription(`
**Durée :** ${track.duration}
**Source :** ${track.source ? track.source === 'youtube' ? 'Youtube' : track.source === 'spotify' ? 'Spotify' : 'Inconnu' : 'Inconnu'}
**Volume :** ${queue.node.volume}%
**Progression :** ${queue.node.createProgressBar()}
**Loop :** ${queue.repeatMode ? queue.repeatMode === 2 ? "File d'Attente" : "Titre" : "Off"}
**Autoplay :** ${queue.autoplay ? "On" : "Off"}
`)
.setFooter({ text: `Demandé par ${track.requestedBy.tag}` })
return await interaction.reply({ embeds: [embed] })
} }
} }

View File

@@ -1,5 +1,5 @@
const { SlashCommandBuilder } = require('discord.js') const { SlashCommandBuilder } = require('discord.js')
const { useHistory } = require("discord-player") const { useHistory } = require('discord-player')
module.exports = { module.exports = {
data: new SlashCommandBuilder() data: new SlashCommandBuilder()

View File

@@ -1,5 +1,5 @@
const { SlashCommandBuilder } = require('discord.js') const { SlashCommandBuilder } = require('discord.js')
const { useQueue } = require("discord-player") const { useQueue } = require('discord-player')
module.exports = { module.exports = {
data: new SlashCommandBuilder() data: new SlashCommandBuilder()

View File

@@ -1,5 +1,5 @@
const { SlashCommandBuilder } = require('discord.js') const { SlashCommandBuilder } = require('discord.js')
const { useQueue } = require("discord-player") const { useQueue } = require('discord-player')
module.exports = { module.exports = {
data: new SlashCommandBuilder() data: new SlashCommandBuilder()

View File

@@ -1,5 +1,5 @@
const { SlashCommandBuilder } = require('discord.js') const { SlashCommandBuilder } = require('discord.js')
const { useQueue } = require("discord-player") const { useQueue } = require('discord-player')
module.exports = { module.exports = {
data: new SlashCommandBuilder() data: new SlashCommandBuilder()

View File

@@ -1,5 +1,5 @@
const { SlashCommandBuilder } = require('discord.js') const { SlashCommandBuilder } = require('discord.js')
const { useQueue } = require("discord-player") const { useQueue } = require('discord-player')
module.exports = { module.exports = {
data: new SlashCommandBuilder() data: new SlashCommandBuilder()

View File

@@ -1,5 +1,5 @@
const { SlashCommandBuilder } = require('discord.js') const { SlashCommandBuilder } = require('discord.js')
const { useQueue } = require("discord-player") const { useQueue } = require('discord-player')
module.exports = { module.exports = {
data: new SlashCommandBuilder() data: new SlashCommandBuilder()

View File

@@ -3,6 +3,7 @@ const { Events } = require('discord.js')
module.exports = { module.exports = {
name: Events.GuildMemberAdd, name: Events.GuildMemberAdd,
async execute(member) { async execute(member) {
if (member.guild.id !== '1086577543651524699') return
member.guild.members.fetch().then(() => { member.guild.members.fetch().then(() => {
var i = 0 var i = 0
member.guild.members.cache.forEach(async member => { if (!member.user.bot) i++ }) member.guild.members.cache.forEach(async member => { if (!member.user.bot) i++ })

View File

@@ -3,6 +3,7 @@ const { Events } = require('discord.js')
module.exports = { module.exports = {
name: Events.GuildMemberRemove, name: Events.GuildMemberRemove,
async execute(member) { async execute(member) {
if (member.guild.id !== '1086577543651524699') return
member.guild.members.fetch().then(() => { member.guild.members.fetch().then(() => {
var i = 0 var i = 0
member.guild.members.cache.forEach(async member => { if (!member.user.bot) i++ }) member.guild.members.cache.forEach(async member => { if (!member.user.bot) i++ })

View File

@@ -1,34 +1,42 @@
const { Events } = require('discord.js') const { Events } = require('discord.js')
const editPlayer = require('../utils/editPlayer.js')
const playerButtons = require('../utils/playerButtons.js')
module.exports = { module.exports = {
name: Events.InteractionCreate, name: Events.InteractionCreate,
async execute(interaction) { async execute(interaction) {
if (interaction.isButton()) { if (!interaction.isAutocomplete() && !interaction.isChatInputCommand() && !interaction.isButton()) return console.error(`Interaction ${interaction.commandName} is not a command.`)
let button = interaction.client.buttons.get(interaction.customId)
if (!button) return console.error(`No button id matching ${interaction.customId} was found.`)
console.log(`\u001b[1;33m Button '${interaction.customId}' clicked by ${interaction.user.tag}`) else if (interaction.isAutocomplete()) {
let autoCompleteRun = interaction.client.commands.get(interaction.commandName)
if (!autoCompleteRun) return console.error(`No autoCompleteRun matching ${interaction.commandName} was found.`)
try { await button.execute(interaction) }
catch (error) { console.error(`Error executing ${interaction.customId}:`, error) }
}
if (!interaction.isAutocomplete() && !interaction.isChatInputCommand()) return //console.error(`Interaction ${interaction.commandName} is not a command.`)
let command = interaction.client.commands.get(interaction.commandName)
if (!command) return console.error(`No command matching ${interaction.commandName} was found.`)
if (interaction.isAutocomplete()) {
console.log(`\u001b[1;33m AutoCompleteRun '${interaction.commandName}' launched by ${interaction.user.tag}`) console.log(`\u001b[1;33m AutoCompleteRun '${interaction.commandName}' launched by ${interaction.user.tag}`)
try { await command.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()) { 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}`) console.log(`\u001b[1;33m Command '${interaction.commandName}' launched by ${interaction.user.tag}`)
try { await command.execute(interaction) } try { await command.execute(interaction) }
catch (error) { console.error(`Error executing ${interaction.commandName}:`, error) } 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.`)
console.log(`\u001b[1;33m Button '${interaction.customId}' clicked by ${interaction.user.tag}`)
if (playerButtons.includes(interaction.customId)) { await editPlayer(interaction) }
try { await button.execute(interaction) }
catch (error) { console.error(`Error clicking ${interaction.customId}:`, error) }
}
} }
} }

View File

@@ -1,5 +1,9 @@
const { Events, EmbedBuilder, ButtonBuilder, ActionRowBuilder } = require('discord.js') const { Events } = require('discord.js')
const { useQueue } = require("discord-player") //const { DataTypes } = require("sequelize")
//const sequelize = require('../utils/initSequelize.js')
const generatePlayer = require('../utils/generatePlayer.js')
const getUptime = require('../utils/getUptime.js')
require('dotenv').config()
const dance = async function (bot_id, channel, embed, components) { const dance = async function (bot_id, channel, embed, components) {
let messages = await channel.messages.fetch() let messages = await channel.messages.fetch()
@@ -7,17 +11,7 @@ const dance = async function (bot_id, channel, embed, components) {
if (!botMessage || (!components && botMessage.components.length > 0)) { if (!botMessage || (!components && botMessage.components.length > 0)) {
await channel.bulkDelete(messages) await channel.bulkDelete(messages)
return await channel.send({ embeds: [embed] }) return await channel.send({ embeds: [embed] })
} else { } else await botMessage.edit({ embeds: [embed], components })
await botMessage.edit({ embeds: [embed], components })
}
}
const getUptime = function (uptime) {
let days = Math.floor(uptime / 86400000)
let hours = Math.floor(uptime / 3600000) % 24
let minutes = Math.floor(uptime / 60000) % 60
let seconds = Math.floor(uptime / 1000) % 60
return `${days}J, ${hours}H, ${minutes}M et ${seconds}S`
} }
module.exports = { module.exports = {
@@ -25,75 +19,42 @@ module.exports = {
once: true, once: true,
execute(client) { execute(client) {
console.log(`\u001b[1;35m Ready! Logged in as ${client.user.tag}`) console.log(`\u001b[1;35m Ready! Logged in as ${client.user.tag}`)
setInterval(async () => {
let guild = client.guilds.cache.get('1086577543651524699')
let channel = guild.channels.cache.get('1099542278764245096')
let queue = useQueue(guild.id)
if (!queue) return await dance(client.user.id, channel, new EmbedBuilder().setColor('#ffc370').setTitle('Aucune session d\'écoute en cours !').setFooter({ text: `Uptime: ${getUptime(client.uptime)}` }))
let track = queue.currentTrack
if (!track) return await dance(client.user.id, channel, new EmbedBuilder().setColor('#ffc370').setTitle('Aucune musique en cours de lecture !').setFooter({ text: `Uptime: ${getUptime(client.uptime)}` }))
let embed = new EmbedBuilder() //try {
.setColor('#ffc370') // sequelize.authenticate()
.setTitle(track.title) // console.log('Connection has been established successfully.')
.setAuthor({ name: track.author }) //} catch (error) { console.error('Unable to connect to the database:', error) }
.setURL(track.url)
.setImage(track.thumbnail) var interval = setInterval(async () => {
.addFields( //client.guilds.cache.each(async guild => {
{ name: 'Durée', value: track.duration, inline: true }, //const Data = sequelize.define(guild.id, {
{ name: 'Source', value: track.source === 'youtube' ? 'Youtube' : track.source === 'spotify' ? 'Spotify' : 'Inconnu', inline: true }, // playerChannelId: DataTypes.STRING
{ name: 'Volume', value: `${queue.node.volume}%`, inline: true }, //})
{ name: queue.node.isPaused() ? 'Progression (en pause)' : 'Progression', value: queue.node.createProgressBar() }, //await sequelize.sync({ force: 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 } //if (!Data.playerChannelId) {
) // clearInterval(interval)
.setDescription(`**Musique suivante :** ${queue.tracks[0] ? queue.tracks[0].title : 'Aucune'}`) // return console.log(`\u001b[1;31m Aucun channel inscrit dans la base, veuillez utiliser la commande \`/setchannel\` !`)
.setFooter({ text: `Uptime: ${getUptime(client.uptime)} / Demandé par ${track.requestedBy.tag}` }) //}
//let channel = client.channels.cache.get(Data.playerChannelId)
let components = [
new ActionRowBuilder().addComponents( let guild = client.guilds.cache.get(process.env.DISCORD_GUILD_ID)
new ButtonBuilder() let channel = client.channels.cache.get(process.env.DISCORD_PLAYERCHANNEL_ID)
.setLabel(queue.node.isPaused() ? '▶️' : '⏸️') if (!channel) {
.setStyle(2) clearInterval(interval)
.setCustomId(queue.node.isPaused() ? 'resume' : 'pause'), return console.log(`\u001b[1;31m Error: Aucun channel trouvé avec l'id \`${process.env.DISCORD_PLAYERCHANNEL_ID}\`, veuillez utiliser la commande \`/setchannel\` !`)
new ButtonBuilder() }
.setLabel('⏹️')
.setStyle(2) let { embed, components } = await generatePlayer(guild)
.setCustomId('stop'),
new ButtonBuilder() if (components) {
.setLabel('⏭️') embed.setFooter({ text: `Uptime: ${getUptime(client.uptime)} / ${embed.data.footer.text}` })
.setStyle(2) await dance(client.user.id, channel, embed, components)
.setCustomId('skip') } else {
.setDisabled(queue.tracks.length !== 0), embed.setFooter({ text: `Uptime: ${getUptime(client.uptime)}` })
new ButtonBuilder() await dance(client.user.id, channel, embed)
.setLabel('🔉') }
.setStyle(2) //})
.setCustomId('volume_down')
.setDisabled(queue.node.volume === 0),
new ButtonBuilder()
.setLabel('🔊')
.setStyle(2)
.setCustomId('volume_up')
.setDisabled(queue.node.volume === 100)
),
new ActionRowBuilder().addComponents(
new ButtonBuilder()
.setLabel('🔀')
.setStyle(2)
.setCustomId('shuffle'),
new ButtonBuilder()
.setLabel('🔁')
.setStyle(2)
.setCustomId('loop'),
new ButtonBuilder()
.setLabel('⏮️')
.setStyle(2)
.setCustomId('previous')
.setDisabled(queue.previousTracks ? !queue.previousTracks[0] : true)
)
]
await dance(client.user.id, channel, embed, components)
}, 4000) }, 4000)
} }
} }

9082
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -12,9 +12,9 @@
"name": "Zachary Guénot" "name": "Zachary Guénot"
}, },
"devDependencies": { "devDependencies": {
"eslint": "^8.39.0", "eslint": "^8.40.0",
"nodemon": "^2.0.22", "nodemon": "^2.0.22",
"prettier": "^2.8.7" "prettier": "^2.8.8"
}, },
"eslintConfig": {}, "eslintConfig": {},
"dependencies": { "dependencies": {
@@ -22,17 +22,19 @@
"@discord-player/extractor": "^4.2.1", "@discord-player/extractor": "^4.2.1",
"@discordjs/opus": "^0.9.0", "@discordjs/opus": "^0.9.0",
"@discordjs/voice": "^0.16.0", "@discordjs/voice": "^0.16.0",
"axios": "^1.3.6", "axios": "^1.4.0",
"bufferutil": "^4.0.7", "bufferutil": "^4.0.7",
"discord-player": "^6.2.1", "discord-player": "^6.3.0",
"discord.js": "^14.9.0", "discord.js": "^14.11.0",
"dotenv": "^16.0.3", "dotenv": "^16.0.3",
"iconv-lite": "^0.6.3", "iconv-lite": "^0.6.3",
"libsodium-wrappers": "^0.7.11", "libsodium-wrappers": "^0.7.11",
"npm": "^9.6.5", "mariadb": "^3.1.2",
"opusscript": "^0.0.8", "opusscript": "^0.0.8",
"play-dl": "^1.9.6", "play-dl": "^1.9.6",
"utf-8-validate": "^6.0.3", "prism-media": "^1.3.5",
"zlib-sync": "^0.1.8" "sequelize": "^6.31.1",
"sqlite3": "^5.1.6",
"utf-8-validate": "^6.0.3"
} }
} }

63
utils/editPlayer.js Normal file
View File

@@ -0,0 +1,63 @@
const { ActionRowBuilder, ButtonBuilder } = require('discord.js')
module.exports = async (interaction) => {
/*let components = [
new ActionRowBuilder().addComponents(
interaction.message.components[0].components.forEach(button => {
return new ButtonBuilder().setCustomId(button.customId).setLabel(button.label).setStyle(button.style).setDisabled(true)
})
),
new ActionRowBuilder().addComponents(
interaction.message.components[1].components.forEach(button => {
return new ButtonBuilder().setCustomId(button.customId).setLabel(button.label).setStyle(button.style).setDisabled(true)
})
)
]*/
let components = [
new ActionRowBuilder().addComponents(
new ButtonBuilder()
.setLabel(interaction.message.components[0].components[0].label)
.setStyle(2)
.setCustomId(interaction.message.components[0].components[0].customId)
.setDisabled(true),
new ButtonBuilder()
.setLabel('⏹️')
.setStyle(2)
.setCustomId('stop')
.setDisabled(true),
new ButtonBuilder()
.setLabel('⏭️')
.setStyle(2)
.setCustomId('skip')
.setDisabled(true),
new ButtonBuilder()
.setLabel('🔉')
.setStyle(2)
.setCustomId('volume_down')
.setDisabled(true),
new ButtonBuilder()
.setLabel('🔊')
.setStyle(2)
.setCustomId('volume_up')
.setDisabled(true)
),
new ActionRowBuilder().addComponents(
new ButtonBuilder()
.setLabel('🔀')
.setStyle(2)
.setCustomId('shuffle')
.setDisabled(true),
new ButtonBuilder()
.setLabel('🔁')
.setStyle(2)
.setCustomId('loop')
.setDisabled(true),
new ButtonBuilder()
.setLabel('⏮️')
.setStyle(2)
.setCustomId('previous')
.setDisabled(true)
)
]
interaction.update({ components, content: 'Chargement...' })
}

74
utils/generatePlayer.js Normal file
View File

@@ -0,0 +1,74 @@
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')
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)
.setImage(track.thumbnail)
.addFields(
{ name: 'Durée', value: track.duration, inline: true },
{ name: 'Source', value: track.source === 'youtube' ? 'Youtube' : track.source === 'spotify' ? 'Spotify' : 'Inconnu', inline: true },
{ name: 'Volume', value: `${queue.node.volume}%`, inline: true },
{ name: queue.node.isPaused() ? 'Progression (en pause)' : 'Progression', value: queue.node.createProgressBar() },
{ 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'}`)
.setFooter({ text: `Demandé par ${track.requestedBy.tag}` })
let components = [
new ActionRowBuilder().addComponents(
new ButtonBuilder()
.setLabel(queue.node.isPaused() ? '▶️' : '⏸️')
.setStyle(2)
.setCustomId(queue.node.isPaused() ? 'resume' : 'pause'),
new ButtonBuilder()
.setLabel('⏹️')
.setStyle(2)
.setCustomId('stop'),
new ButtonBuilder()
.setLabel('⏭️')
.setStyle(2)
.setCustomId('skip')
.setDisabled(queue.tracks.length !== 0),
new ButtonBuilder()
.setLabel('🔉')
.setStyle(2)
.setCustomId('volume_down')
.setDisabled(queue.node.volume === 0),
new ButtonBuilder()
.setLabel('🔊')
.setStyle(2)
.setCustomId('volume_up')
.setDisabled(queue.node.volume === 100)
),
new ActionRowBuilder().addComponents(
new ButtonBuilder()
.setLabel('🔀')
.setStyle(2)
.setCustomId('shuffle'),
new ButtonBuilder()
.setLabel('🔁')
.setStyle(2)
.setCustomId('loop'),
new ButtonBuilder()
.setLabel('⏮️')
.setStyle(2)
.setCustomId('previous')
.setDisabled(queue.previousTracks ? !queue.previousTracks[0] : true)
)
]
return ({ embed, components })
}

7
utils/getUptime.js Normal file
View File

@@ -0,0 +1,7 @@
module.exports = function (uptime) {
let days = Math.floor(uptime / 86400000)
let hours = Math.floor(uptime / 3600000) % 24
let minutes = Math.floor(uptime / 60000) % 60
let seconds = Math.floor(uptime / 1000) % 60
return `${days}J, ${hours}H, ${minutes}M et ${seconds}S`
}

10
utils/initSequelize.js Normal file
View File

@@ -0,0 +1,10 @@
const Sequelize = require('sequelize')
require('dotenv').config()
module.exports = new Sequelize(process.env.SEQUELIZE_DATABASE, process.env.SEQUELIZE_USER, process.env.SEQUELIZE_PASSWORD, {
host: process.env.SEQUELIZE_HOST,
dialect: process.env.SEQUELIZE_DIALECT,
dialectOptions: process.env.SEQUELIZE_DIALECTOPTIONS,
logging: process.env.SEQUELIZE_LOGGING === 'true',
storage: process.env.SEQUELIZE_STORAGE
})

1
utils/playerButtons.js Normal file
View File

@@ -0,0 +1 @@
module.exports = ['loop', 'pause', 'previous', 'resume', 'shuffle', 'skip', 'stop', 'volume_down', 'volume_up']