Maj pkgs + fix dep des buttons / commands + Ajout fichiers utils
This commit is contained in:
		| @@ -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
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								app.js
									
									
									
									
									
								
							| @@ -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() | ||||||
| @@ -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) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -1,4 +1,4 @@ | |||||||
| const { useQueue } = require("discord-player") | const { useQueue } = require('discord-player') | ||||||
|  |  | ||||||
| module.exports = { | module.exports = { | ||||||
| 	id: 'pause', | 	id: 'pause', | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| const { useHistory } = require("discord-player") | const { useHistory } = require('discord-player') | ||||||
|  |  | ||||||
| module.exports = { | module.exports = { | ||||||
| 	id: 'previous', | 	id: 'previous', | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| const { useQueue } = require("discord-player") | const { useQueue } = require('discord-player') | ||||||
|  |  | ||||||
| module.exports = { | module.exports = { | ||||||
| 	id: 'resume', | 	id: 'resume', | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| const { useQueue } = require("discord-player") | const { useQueue } = require('discord-player') | ||||||
|  |  | ||||||
| module.exports = { | module.exports = { | ||||||
| 	id: 'shuffle', | 	id: 'shuffle', | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| const { useQueue } = require("discord-player") | const { useQueue } = require('discord-player') | ||||||
|  |  | ||||||
| module.exports = { | module.exports = { | ||||||
| 	id: 'skip', | 	id: 'skip', | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| const { useQueue } = require("discord-player") | const { useQueue } = require('discord-player') | ||||||
|  |  | ||||||
| module.exports = { | module.exports = { | ||||||
| 	id: 'stop', | 	id: 'stop', | ||||||
|   | |||||||
| @@ -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) | ||||||
|  | 		if (!queue) await interaction.reply({ content: 'Aucune musique en cours de lecture.', ephemeral: true }) | ||||||
|  | 		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) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -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) | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -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'}.`) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| @@ -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() | ||||||
|   | |||||||
| @@ -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() | ||||||
|   | |||||||
| @@ -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] }) |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| @@ -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() | ||||||
|   | |||||||
| @@ -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() | ||||||
|   | |||||||
| @@ -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() | ||||||
|   | |||||||
| @@ -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() | ||||||
|   | |||||||
| @@ -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() | ||||||
|   | |||||||
| @@ -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() | ||||||
|   | |||||||
| @@ -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++ }) | ||||||
|   | |||||||
| @@ -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++ }) | ||||||
|   | |||||||
| @@ -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) } | 			console.log(`\u001b[1;33m AutoCompleteRun '${interaction.commandName}' launched by ${interaction.user.tag}`) | ||||||
| 			catch (error) { console.error(`Error executing ${interaction.customId}:`, error) } |  | ||||||
|  | 			try { await autoCompleteRun.autocompleteRun(interaction) } | ||||||
|  | 			catch (error) { console.error(`Error autocompleting ${interaction.commandName}:`, error) } | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if (!interaction.isAutocomplete() && !interaction.isChatInputCommand()) return //console.error(`Interaction ${interaction.commandName} is not a command.`) | 		else if (interaction.isChatInputCommand()) { | ||||||
|  |  | ||||||
| 			let command = interaction.client.commands.get(interaction.commandName) | 			let command = interaction.client.commands.get(interaction.commandName) | ||||||
| 			if (!command) return console.error(`No command matching ${interaction.commandName} was found.`) | 			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) } |  | ||||||
| 			catch (error) { console.error(`Error autocompleting ${interaction.commandName}:`, error) } |  | ||||||
| 		} |  | ||||||
| 		else if (interaction.isChatInputCommand()) { |  | ||||||
| 			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) } | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
							
								
								
									
										117
									
								
								events/ready.js
									
									
									
									
									
								
							
							
						
						
									
										117
									
								
								events/ready.js
									
									
									
									
									
								
							| @@ -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) | 		//try { | ||||||
| 			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)}` })) | 		//	sequelize.authenticate() | ||||||
| 			let track = queue.currentTrack | 		//	console.log('Connection has been established successfully.') | ||||||
| 			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)}` })) | 		//} catch (error) { console.error('Unable to connect to the database:', error) } | ||||||
|  |  | ||||||
| 			let embed = new EmbedBuilder() | 		var interval = setInterval(async () => { | ||||||
| 				.setColor('#ffc370') | 			//client.guilds.cache.each(async guild => { | ||||||
| 				.setTitle(track.title) | 				//const Data = sequelize.define(guild.id, { | ||||||
| 				.setAuthor({ name: track.author }) | 				//	playerChannelId: DataTypes.STRING | ||||||
| 				.setURL(track.url) | 				//}) | ||||||
| 				.setImage(track.thumbnail) | 				//await sequelize.sync({ force: true }) | ||||||
| 				.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 = [ | 				//if (!Data.playerChannelId) { | ||||||
| 				new ActionRowBuilder().addComponents( | 				//	clearInterval(interval) | ||||||
| 					new ButtonBuilder() | 				//	return console.log(`\u001b[1;31m Aucun channel inscrit dans la base, veuillez utiliser la commande \`/setchannel\` !`) | ||||||
| 						.setLabel(queue.node.isPaused() ? '▶️' : '⏸️') | 				//} | ||||||
| 						.setStyle(2) | 				//let channel = client.channels.cache.get(Data.playerChannelId) | ||||||
| 						.setCustomId(queue.node.isPaused() ? 'resume' : 'pause'), |  | ||||||
| 					new ButtonBuilder() | 				let guild = client.guilds.cache.get(process.env.DISCORD_GUILD_ID) | ||||||
| 						.setLabel('⏹️') | 				let channel = client.channels.cache.get(process.env.DISCORD_PLAYERCHANNEL_ID) | ||||||
| 						.setStyle(2) | 				if (!channel) { | ||||||
| 						.setCustomId('stop'), | 					clearInterval(interval) | ||||||
| 					new ButtonBuilder() | 					return console.log(`\u001b[1;31m Error: Aucun channel trouvé avec l'id \`${process.env.DISCORD_PLAYERCHANNEL_ID}\`, veuillez utiliser la commande \`/setchannel\` !`) | ||||||
| 						.setLabel('⏭️') | 				} | ||||||
| 						.setStyle(2) |  | ||||||
| 						.setCustomId('skip') | 				let { embed, components } = await generatePlayer(guild) | ||||||
| 						.setDisabled(queue.tracks.length !== 0), |  | ||||||
| 					new ButtonBuilder()	 | 				if (components) { | ||||||
| 						.setLabel('🔉') | 					embed.setFooter({ text: `Uptime: ${getUptime(client.uptime)} / ${embed.data.footer.text}` }) | ||||||
| 						.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) | 					await dance(client.user.id, channel, embed, components) | ||||||
|  | 				} else { | ||||||
|  | 					embed.setFooter({ text: `Uptime: ${getUptime(client.uptime)}` }) | ||||||
|  | 					await dance(client.user.id, channel, embed) | ||||||
|  | 				} | ||||||
|  | 			//})			 | ||||||
| 		}, 4000) | 		}, 4000) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
							
								
								
									
										3786
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										3786
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										18
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								package.json
									
									
									
									
									
								
							| @@ -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
									
								
							
							
						
						
									
										63
									
								
								utils/editPlayer.js
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										74
									
								
								utils/generatePlayer.js
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										7
									
								
								utils/getUptime.js
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										10
									
								
								utils/initSequelize.js
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										1
									
								
								utils/playerButtons.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | module.exports = ['loop', 'pause', 'previous', 'resume', 'shuffle', 'skip', 'stop', 'volume_down', 'volume_up'] | ||||||
		Reference in New Issue
	
	Block a user