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
**/.vscode
**/docker-compose*
**/compose*
**/Dockerfile*
**/node_modules
**/npm-debug.log
**/obj
**/cracks
LICENSE
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'))
for (const file of eventFiles) {
let event = require(`./events/${file}`)
if (event.once) client.once(event.name, (...args) => {
//console.log(`\u001b[1;35m Event '${event.name}' executed.`)
event.execute(...args)
})
else client.on(event.name, (...args) => {
//console.log(`\u001b[1;35m Event '${event.name}' executed.`)
event.execute(...args)
})
if (event.once) client.once(event.name, (...args) => { event.execute(...args) })
else client.on(event.name, (...args) => { event.execute(...args) })
}
// COMMANDS HANDLING
@@ -39,11 +33,7 @@ for (folder of commandFolders) {
// COMMANDS REGISTERING
const rest = new REST({ version: '10' }).setToken(process.env.DISCORD_TOKEN);
(async () => {
//console.log(`\u001b[1;35m Started refreshing ${commands.length} application (/) commands.`)
try {
let data = await rest.put(Routes.applicationCommands('1065047326860783636'), { body: commands })
//console.log(`\u001b[1;35m Successfully reloaded ${data.length} application (/) commands.`)
}
try { await rest.put(Routes.applicationCommands(process.env.DISCORD_APP_ID), { body: commands }) }
catch (error) { console.error(error) }
})()
@@ -68,7 +58,6 @@ for (const file of eventPlayerFiles) {
if (['debug'].includes(event.name)) continue
player.events.on(event.name, (...args) => event.execute(...args))
}
//player.on('debug', async (message) => { console.log(`General player debug event: ${message}`) })
// LAUNCH
client.login()

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,12 +1,17 @@
const { useQueue } = require("discord-player")
const { useQueue } = require('discord-player')
module.exports = {
id: 'volume_down',
async execute(interaction) {
let queue = useQueue(interaction.guild.id)
let volume = queue.node.volume - 10
queue.node.setVolume(volume)
await interaction.reply({ content: `🔉 | Volume modifié à ${volume}% !`, ephemeral: true })
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)
}
}

View File

@@ -1,14 +1,16 @@
const { useQueue } = require("discord-player")
const { useQueue } = require('discord-player')
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 })
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 })
//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

@@ -1,12 +1,12 @@
const { SlashCommandBuilder } = require('discord.js')
const { useQueue } = require("discord-player")
const { useQueue } = require('discord-player')
module.exports = {
data: new SlashCommandBuilder()
.setName('loop')
.setDescription('Boucler la musique en cours de lecture.')
.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)
.setMinValue(0)
.setMaxValue(3)),
@@ -14,6 +14,6 @@ module.exports = {
let loop = interaction.options.getInteger('loop')
let queue = useQueue(interaction.guild.id)
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 { useQueue } = require("discord-player")
const { useQueue } = require('discord-player')
module.exports = {
data: new SlashCommandBuilder()

View File

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

View File

@@ -1,49 +1,13 @@
const { SlashCommandBuilder, EmbedBuilder } = require('discord.js')
const { useQueue } = require("discord-player")
const { SlashCommandBuilder } = require('discord.js')
const generatePlayer = require('../../utils/generatePlayer.js')
module.exports = {
data: new SlashCommandBuilder()
.setName('player')
.setDescription('Afficher une interface de contrôle de la musique.'),
async execute(interaction) {
let queue = useQueue(interaction.guild.id)
if (!queue) return await interaction.reply('Aucune session d\'écoute en cours !')
let track = queue.currentTrack
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] })
let { embed, components } = await generatePlayer(interaction.guild)
if (!components) return await interaction.reply({ embeds: [embed] })
else return await interaction.reply({ embeds: [embed], components })
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,34 +1,42 @@
const { Events } = require('discord.js')
const editPlayer = require('../utils/editPlayer.js')
const playerButtons = require('../utils/playerButtons.js')
module.exports = {
name: Events.InteractionCreate,
async execute(interaction) {
if (interaction.isButton()) {
let button = interaction.client.buttons.get(interaction.customId)
if (!button) return console.error(`No button id matching ${interaction.customId} was found.`)
if (!interaction.isAutocomplete() && !interaction.isChatInputCommand() && !interaction.isButton()) return console.error(`Interaction ${interaction.commandName} is not a command.`)
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}`)
try { await command.autocompleteRun(interaction) }
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.`)
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 { useQueue } = require("discord-player")
const { Events } = require('discord.js')
//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) {
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)) {
await channel.bulkDelete(messages)
return await channel.send({ embeds: [embed] })
} else {
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`
} else await botMessage.edit({ embeds: [embed], components })
}
module.exports = {
@@ -25,75 +19,42 @@ module.exports = {
once: true,
execute(client) {
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()
.setColor('#ffc370')
.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: `Uptime: ${getUptime(client.uptime)} / 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)
)
]
await dance(client.user.id, channel, embed, components)
//try {
// sequelize.authenticate()
// console.log('Connection has been established successfully.')
//} 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\` !`)
}
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)
}
}

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"
},
"devDependencies": {
"eslint": "^8.39.0",
"eslint": "^8.40.0",
"nodemon": "^2.0.22",
"prettier": "^2.8.7"
"prettier": "^2.8.8"
},
"eslintConfig": {},
"dependencies": {
@@ -22,17 +22,19 @@
"@discord-player/extractor": "^4.2.1",
"@discordjs/opus": "^0.9.0",
"@discordjs/voice": "^0.16.0",
"axios": "^1.3.6",
"axios": "^1.4.0",
"bufferutil": "^4.0.7",
"discord-player": "^6.2.1",
"discord.js": "^14.9.0",
"discord-player": "^6.3.0",
"discord.js": "^14.11.0",
"dotenv": "^16.0.3",
"iconv-lite": "^0.6.3",
"libsodium-wrappers": "^0.7.11",
"npm": "^9.6.5",
"mariadb": "^3.1.2",
"opusscript": "^0.0.8",
"play-dl": "^1.9.6",
"utf-8-validate": "^6.0.3",
"zlib-sync": "^0.1.8"
"prism-media": "^1.3.5",
"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']