├── src ├── Events │ ├── ready.js │ └── CommandHandler │ │ └── messageCreate.js ├── Commands │ ├── ⚙️ Outils │ │ ├── ping.js │ │ └── help.js │ └── 🔊 Musique │ │ ├── clear.js │ │ ├── pause.js │ │ ├── resume.js │ │ ├── shuffle.js │ │ ├── skip.js │ │ ├── stop.js │ │ ├── jump.js │ │ ├── back.js │ │ ├── play.js │ │ ├── nowplaying.js │ │ └── volume.js └── Structure │ ├── Handler │ ├── Event.js │ └── Command.js │ └── Music │ └── Events.js ├── index.js ├── package.json ├── config.js └── README.md /src/Events/ready.js: -------------------------------------------------------------------------------- 1 | const { ActivityType, Events } = require('discord.js'); 2 | 3 | module.exports = { 4 | name: Events.ClientReady, 5 | execute(bot) { 6 | console.log('\x1b[33m' + `Connectés à ${bot.user.username} !\n` + '\x1b[33m' + `-> Le bot est utilisé sur ${bot.guilds.cache.size} serveurs !`); 7 | 8 | bot.user.setPresence({ 9 | activities: [{ name: bot.config.clients.activity, type: ActivityType.Watching }], 10 | status: 'dnd', 11 | }); 12 | } 13 | } -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const { Player } = require('discord-player'); 2 | const { Client, IntentsBitField, Collection } = require('discord.js'); 3 | const bot = new Client({ intents: new IntentsBitField(3276799) }); 4 | 5 | bot.commands = new Collection(); 6 | bot.config = require('./config'); 7 | 8 | bot.player = new Player(bot, bot.config.opt.discordPlayer); 9 | 10 | require('./src/Structure/Music/Events')(bot); 11 | require('./src/Structure/Handler/Command')(bot); 12 | require('./src/Structure/Handler/Event')(bot); 13 | 14 | bot.login(bot.config.clients.token); -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "music-bot", 3 | "main": "index.js", 4 | "author": "Mrezor (remade & fix by ! Ruwin.zkr#2007", 5 | "version": "1.0.0", 6 | "repository": "", 7 | "description": "Un bot musique complet discord.gg//novaworld", 8 | "scripts": { 9 | "start": "node main.js" 10 | }, 11 | "dependencies": { 12 | "discord-player": "6.1", 13 | "discord.js": "^14.8.0", 14 | "ffmpeg-static": "^5.0.1", 15 | "opusscript": "^0.0.8", 16 | "prism-media": "^1.3.5", 17 | "ytdl-core": "^4.11.4" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/Events/CommandHandler/messageCreate.js: -------------------------------------------------------------------------------- 1 | const { Events, ChannelType } = require("discord.js") 2 | 3 | module.exports = { 4 | name: Events.MessageCreate, 5 | execute(message, bot) { 6 | const prefix = bot.config.clients.prefix; 7 | 8 | if(message.author.bot) return; 9 | if(message.channel.type === ChannelType.DM) return; 10 | 11 | let messageArray = message.content.split(" "); 12 | let cmd = messageArray[0]; 13 | let args = messageArray.slice(1); 14 | 15 | if(!cmd.startsWith(prefix)) return; 16 | 17 | let commandFile = bot.commands.get(cmd.slice(prefix.length)); 18 | if(commandFile) commandFile.run(bot, message, args); 19 | } 20 | } -------------------------------------------------------------------------------- /src/Commands/⚙️ Outils/ping.js: -------------------------------------------------------------------------------- 1 | const { EmbedBuilder } = require("discord.js") 2 | 3 | exports.help = { 4 | name: 'ping' 5 | } 6 | 7 | exports.run = async (bot, message) => { 8 | const Embed = new EmbedBuilder() 9 | .setColor(bot.config.clients.embedColor) 10 | .setTimestamp() 11 | .setFooter({ text: bot.config.clients.name, iconURL: bot.config.clients.logo }) 12 | 13 | message.delete().then(() => { 14 | message.channel.send({ 15 | embeds: [ 16 | Embed 17 | .setTitle('**Ping**') 18 | .setDescription("🏓 Pong") 19 | .addFields( 20 | { name: 'Latence:', value: `${bot.ws.ping}ms.` } 21 | ) 22 | ] 23 | }) 24 | }) 25 | } -------------------------------------------------------------------------------- /config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | clients: { 3 | token: 'Put-Token-Here', 4 | prefix: 'Prefix', 5 | activity: 'discord.gg/novaworld', 6 | name: 'Nova World', 7 | logo: 'https://cdn.discordapp.com/attachments/1065584990533996584/1086659928099409961/pixiz-18-03-2023-14-41-24.jpg', 8 | embedColor: 'Random' 9 | }, 10 | 11 | opt: { 12 | DJ: { 13 | enabled: false, 14 | roleName: 'Role-Name', 15 | commands: ['back', 'clear', 'filter', 'loop', 'pause', 'resume', 'seek', 'shuffle', 'skip', 'stop', 'volume'] 16 | }, 17 | maxVol: 100, 18 | loopMessage: false, 19 | discordPlayer: { 20 | ytdlOptions: { 21 | quality: 'highestaudio', 22 | highWaterMark: 1 << 25 23 | } 24 | } 25 | } 26 | }; -------------------------------------------------------------------------------- /src/Commands/⚙️ Outils/help.js: -------------------------------------------------------------------------------- 1 | const { EmbedBuilder } = require("discord.js") 2 | 3 | exports.help = { 4 | name: 'help' 5 | } 6 | 7 | exports.run = async (bot, message) => { 8 | const Embed = new EmbedBuilder() 9 | .setColor(bot.config.clients.embedColor) 10 | .setTimestamp() 11 | .setFooter({ text: bot.config.clients.name, iconURL: bot.config.clients.logo }) 12 | 13 | message.delete().then(() => { 14 | message.channel.send({ 15 | embeds: [ 16 | Embed 17 | .setTitle('**Mes commandes**') 18 | .setDescription("ping: Pour voir le ping du bot\nback: Pour retourner en arrière\nclear: Pour clear la queue\njump: Pour passer une musique\nnowplaying: Pour voir la musique en cours de lecture\npause: Pour faire une pause dans la musique\nplay: Pour jouer une musique\nresume: Pour relancer la musique\nshuffle: Pour mélanger les musique\nskip: Pour passer la musique\nstop: Pour arrêter la musique\nvolume: Pour changer le volume de la musique") 19 | ] 20 | }) 21 | })} -------------------------------------------------------------------------------- /src/Structure/Handler/Event.js: -------------------------------------------------------------------------------- 1 | const { readdirSync } = require("fs") 2 | 3 | module.exports = (bot) => { 4 | const eventFiles = readdirSync('./src/Events/').filter(f => f.endsWith('.js')); 5 | for(const file of eventFiles) { 6 | const event = require(`../../../src/Events/${file}`) 7 | 8 | console.log('\x1b[32m' + 'L\'event ' + '\x1b[35m' + `${file.split('.')[0]}` + '\x1b[32m' + ' est chargée avec succès !') 9 | bot.on(event.name, (...args) => event.execute(...args, bot)) 10 | }; 11 | 12 | const eventSubFolders = readdirSync('./src/Events/').filter(f => !f.endsWith('.js')); 13 | eventSubFolders.forEach(folder => { 14 | const eventFiles = readdirSync(`./src/Events/${folder}/`).filter(f => f.endsWith('.js')); 15 | for(const file of eventFiles) { 16 | const event = require(`../../../src/Events/${folder}/${file}`); 17 | 18 | console.log('\x1b[32m' + 'L\'event ' + '\x1b[35m' + `${file.split('.')[0]}` + '\x1b[32m' + ' est chargée avec succès depuis ' + '\x1b[35m' + `${folder}`) 19 | bot.on(event.name, (...args) => event.execute(...args, bot)) 20 | } 21 | }); 22 | } -------------------------------------------------------------------------------- /src/Structure/Handler/Command.js: -------------------------------------------------------------------------------- 1 | const { readdirSync } = require("fs") 2 | 3 | module.exports = (bot) => { 4 | const commandFiles = readdirSync('./src/Commands/').filter(f => f.endsWith('.js')); 5 | for(const file of commandFiles) { 6 | const command = require(`../../../src/Commands/${file}`); 7 | 8 | console.log('\x1b[31m' + ' La commande ' + '\x1b[35m' + `${file.split('.')[0]}` + '\x1b[31m' + ' est chargée avec succès !'); 9 | bot.commands.set(command.help.name, command); 10 | }; 11 | 12 | const commandSubFolders = readdirSync('./src/Commands/').filter(f => !f.endsWith('.js')); 13 | commandSubFolders.forEach(folder => { 14 | const commandFiles = readdirSync(`./src/Commands/${folder}/`).filter(f => f.endsWith('.js')); 15 | 16 | for(const file of commandFiles) { 17 | const command = require(`../../../src/Commands/${folder}/${file}`); 18 | 19 | console.log('\x1b[31m' + ' La commande ' + '\x1b[35m' + `${file.split('.')[0]}` + '\x1b[31m' + ' est chargée avec succès depuis ' + '\x1b[35m' + `${folder}`); 20 | bot.commands.set(command.help.name, command); 21 | } 22 | }); 23 | } -------------------------------------------------------------------------------- /src/Commands/🔊 Musique/clear.js: -------------------------------------------------------------------------------- 1 | const { EmbedBuilder } = require("discord.js"); 2 | 3 | exports.help = { 4 | name: 'clear' 5 | } 6 | 7 | exports.run = async (bot, message) => { 8 | const queue = bot.player.nodes.get(message.guild) 9 | 10 | const Embed = new EmbedBuilder() 11 | .setColor(bot.config.clients.embedColor) 12 | .setTimestamp() 13 | .setFooter({ text: bot.config.clients.name, iconURL: bot.config.clients.logo}); 14 | 15 | try { 16 | if(!queue || !queue.isPlaying()) return message.delete() + message.channel.send({ 17 | embeds: [ 18 | Embed 19 | .setDescription(`❌ | Aucune musique en cours de lecture 🔊`) 20 | ] 21 | }) 22 | 23 | return message.delete().then(() => { 24 | queue.tracks.clear() 25 | 26 | message.channel.send({ 27 | embeds: [ 28 | Embed 29 | .setDescription(`✅ | La file d'attente as été effacée avec succès 🔊`) 30 | ] 31 | }) 32 | }) 33 | } catch (e) { 34 | return message.delete() + message.channel.send({ 35 | embeds: [ 36 | Embed 37 | .setDescription(`Une erreur est survenue : ${e}`) 38 | ] 39 | }) 40 | } 41 | } -------------------------------------------------------------------------------- /src/Commands/🔊 Musique/pause.js: -------------------------------------------------------------------------------- 1 | const { EmbedBuilder } = require("discord.js"); 2 | 3 | exports.help = { 4 | name: 'pause' 5 | } 6 | 7 | exports.run = async (bot, message) => { 8 | const queue = bot.player.nodes.get(message.guild) 9 | 10 | const Embed = new EmbedBuilder() 11 | .setColor(bot.config.clients.embedColor) 12 | .setTimestamp() 13 | .setFooter({ text: bot.config.clients.name, iconURL: bot.config.clients.logo}); 14 | 15 | try { 16 | if(!queue || !queue.isPlaying()) return message.delete() + message.channel.send({ 17 | embeds: [ 18 | Embed 19 | .setDescription(`❌ | Aucune musique en cours de lecture 🔊`) 20 | ] 21 | }) 22 | 23 | return message.delete().then(() => { 24 | queue.node.setPaused(true) 25 | 26 | message.channel.send({ 27 | embeds: [ 28 | Embed 29 | .setDescription(`✅ | La musique as bien été mis en pause 🔊`) 30 | ] 31 | }) 32 | }) 33 | } catch (e) { 34 | return message.delete() + message.channel.send({ 35 | embeds: [ 36 | Embed 37 | .setDescription(`Une erreur est survenue : ${e}`) 38 | ] 39 | }) 40 | } 41 | } -------------------------------------------------------------------------------- /src/Commands/🔊 Musique/resume.js: -------------------------------------------------------------------------------- 1 | const { EmbedBuilder } = require("discord.js"); 2 | 3 | exports.help = { 4 | name: 'resume' 5 | } 6 | 7 | exports.run = async (bot, message) => { 8 | const queue = bot.player.nodes.get(message.guild) 9 | 10 | const Embed = new EmbedBuilder() 11 | .setColor(bot.config.clients.embedColor) 12 | .setTimestamp() 13 | .setFooter({ text: bot.config.clients.name, iconURL: bot.config.clients.logo}); 14 | 15 | try { 16 | if(!queue || !queue.isPlaying()) return message.delete() + message.channel.send({ 17 | embeds: [ 18 | Embed 19 | .setDescription(`❌ | Aucune musique en cours de lecture 🔊`) 20 | ] 21 | }) 22 | 23 | return message.delete().then(() => { 24 | queue.node.setPaused(false) 25 | 26 | message.channel.send({ 27 | embeds: [ 28 | Embed 29 | .setDescription(`✅ | La musique as bien été retiré de pause 🔊`) 30 | ] 31 | }) 32 | }) 33 | } catch (e) { 34 | return message.delete() + message.channel.send({ 35 | embeds: [ 36 | Embed 37 | .setDescription(`Une erreur est survenue : ${e}`) 38 | ] 39 | }) 40 | } 41 | } -------------------------------------------------------------------------------- /src/Commands/🔊 Musique/shuffle.js: -------------------------------------------------------------------------------- 1 | const { EmbedBuilder } = require("discord.js"); 2 | 3 | exports.help = { 4 | name: 'shuffle' 5 | } 6 | 7 | exports.run = async (bot, message) => { 8 | const queue = bot.player.nodes.get(message.guild) 9 | 10 | const Embed = new EmbedBuilder() 11 | .setColor(bot.config.clients.embedColor) 12 | .setTimestamp() 13 | .setFooter({ text: bot.config.clients.name, iconURL: bot.config.clients.logo}); 14 | 15 | try { 16 | if(!queue || !queue.isPlaying()) return message.delete() + message.channel.send({ 17 | embeds: [ 18 | Embed 19 | .setDescription(`❌ | Aucune musique en cours de lecture 🔊`) 20 | ] 21 | }) 22 | 23 | return message.delete().then(async () => { 24 | await queue.tracks.shuffle(); 25 | 26 | message.channel.send({ 27 | embeds: [ 28 | Embed 29 | .setDescription(`✅ | La file d'attente à bien été mélanger 🔊`) 30 | ] 31 | }) 32 | }) 33 | } catch (e) { 34 | return message.delete() + message.channel.send({ 35 | embeds: [ 36 | Embed 37 | .setDescription(`Une erreur est survenue : ${e}`) 38 | ] 39 | }) 40 | } 41 | } -------------------------------------------------------------------------------- /src/Commands/🔊 Musique/skip.js: -------------------------------------------------------------------------------- 1 | const { EmbedBuilder } = require("discord.js"); 2 | 3 | exports.help = { 4 | name: 'skip' 5 | } 6 | 7 | exports.run = async (bot, message) => { 8 | const queue = bot.player.nodes.get(message.guild) 9 | 10 | const Embed = new EmbedBuilder() 11 | .setColor(bot.config.clients.embedColor) 12 | .setTimestamp() 13 | .setFooter({ text: bot.config.clients.name, iconURL: bot.config.clients.logo}); 14 | 15 | try { 16 | if(!queue || !queue.isPlaying()) return message.delete() + message.channel.send({ 17 | embeds: [ 18 | Embed 19 | .setDescription(`❌ | Aucune musique en cours de lecture 🔊`) 20 | ] 21 | }) 22 | 23 | return message.delete().then(async () => { 24 | await queue.node.skip(); 25 | 26 | message.channel.send({ 27 | embeds: [ 28 | Embed 29 | .setDescription(`✅ | La musique **${queue.currentTrack}** à bien été passer 🔊`) 30 | ] 31 | }) 32 | }) 33 | } catch (e) { 34 | return message.delete() + message.channel.send({ 35 | embeds: [ 36 | Embed 37 | .setDescription(`Une erreur est survenue : ${e}`) 38 | ] 39 | }) 40 | } 41 | } -------------------------------------------------------------------------------- /src/Commands/🔊 Musique/stop.js: -------------------------------------------------------------------------------- 1 | const { EmbedBuilder } = require("discord.js"); 2 | 3 | exports.help = { 4 | name: 'stop' 5 | } 6 | 7 | exports.run = async (bot, message) => { 8 | const queue = bot.player.nodes.get(message.guild) 9 | 10 | const Embed = new EmbedBuilder() 11 | .setColor(bot.config.clients.embedColor) 12 | .setTimestamp() 13 | .setFooter({ text: bot.config.clients.name, iconURL: bot.config.clients.logo}); 14 | 15 | try { 16 | if(!queue || !queue.isPlaying()) return message.delete() + message.channel.send({ 17 | embeds: [ 18 | Embed 19 | .setDescription(`❌ | Aucune musique en cours de lecture 🔊`) 20 | ] 21 | }) 22 | 23 | return message.delete().then(async () => { 24 | message.client.player.nodes.delete(message.guild?.id); 25 | 26 | await message.channel.send({ 27 | embeds: [ 28 | Embed 29 | .setDescription(`✅ | La musique à bien été stopper 🔊`) 30 | ] 31 | }) 32 | }) 33 | } catch (e) { 34 | return message.delete() + message.channel.send({ 35 | embeds: [ 36 | Embed 37 | .setDescription(`Une erreur est survenue : ${e}`) 38 | ] 39 | }) 40 | } 41 | } -------------------------------------------------------------------------------- /src/Commands/🔊 Musique/jump.js: -------------------------------------------------------------------------------- 1 | const { EmbedBuilder } = require("discord.js"); 2 | 3 | exports.help = { 4 | name: 'jump' 5 | } 6 | 7 | exports.run = async (bot, message, args) => { 8 | const queue = bot.player.nodes.get(message.guild) 9 | const nombre = parseInt(args[0]) 10 | 11 | const Embed = new EmbedBuilder() 12 | .setColor(bot.config.clients.embedColor) 13 | .setTimestamp() 14 | .setFooter({ text: bot.config.clients.name, iconURL: bot.config.clients.logo}); 15 | 16 | try { 17 | if(!queue || !queue.isPlaying()) return message.delete() + message.channel.send({ 18 | embeds: [ 19 | Embed 20 | .setDescription(`❌ | Aucune musique en cours de lecture 🔊`) 21 | ] 22 | }) 23 | 24 | return message.delete().then(() => { 25 | queue.node.jump(nombre - 1) 26 | 27 | message.channel.send({ 28 | embeds: [ 29 | Embed 30 | .setDescription(`✅ | ${nombre} musique passé avec succès 🔊`) 31 | ] 32 | }) 33 | }) 34 | } catch (e) { 35 | return message.delete() + message.channel.send({ 36 | embeds: [ 37 | Embed 38 | .setDescription(`Une erreur est survenue : ${e}`) 39 | ] 40 | }) 41 | } 42 | } -------------------------------------------------------------------------------- /src/Commands/🔊 Musique/back.js: -------------------------------------------------------------------------------- 1 | const { EmbedBuilder } = require("discord.js"); 2 | 3 | exports.help = { 4 | name: 'back' 5 | } 6 | 7 | exports.run = async (bot, message) => { 8 | const queue = bot.player.nodes.get(message.guild) 9 | 10 | const Embed = new EmbedBuilder() 11 | .setColor(bot.config.clients.embedColor) 12 | .setTimestamp() 13 | .setFooter({ text: bot.config.clients.name, iconURL: bot.config.clients.logo}); 14 | 15 | try { 16 | if(!queue || !queue.isPlaying()) return message.delete() + message.channel.send({ 17 | embeds: [ 18 | Embed 19 | .setDescription(`❌ | Aucune musique en cours de lecture 🔊`) 20 | ] 21 | }) 22 | 23 | return message.delete().then(async () => { 24 | const lastSong = queue.history.previousTrack 25 | await queue.history.previous() 26 | 27 | message.channel.send({ 28 | embeds: [ 29 | Embed 30 | .setDescription(`✅ | Je rejoue l'ancienne musique [**${lastSong.title}**](${lastSong.url}) 🔊`) 31 | ] 32 | }) 33 | }) 34 | } catch (e) { 35 | return message.delete() + message.channel.send({ 36 | embeds: [ 37 | Embed 38 | .setDescription(`Une erreur est survenue : ${e}`) 39 | ] 40 | }) 41 | } 42 | } -------------------------------------------------------------------------------- /src/Commands/🔊 Musique/play.js: -------------------------------------------------------------------------------- 1 | const { EmbedBuilder } = require("discord.js"); 2 | 3 | exports.help = { 4 | name: 'play' 5 | } 6 | 7 | exports.run = async (bot, message, args) => { 8 | const channel = message.member.voice.channel; 9 | const music = args.join(" "); 10 | 11 | const Embed = new EmbedBuilder() 12 | .setColor(bot.config.clients.embedColor) 13 | .setTimestamp() 14 | .setFooter({ text: bot.config.clients.name, iconURL: bot.config.clients.logo}); 15 | 16 | try { 17 | if(!message.member.voice.channel) return message.delete() + message.channel.send({ 18 | embeds: [ 19 | Embed 20 | .setDescription(`❌ | Tu ne te trouve pas dans un channel vocale 🔊`) 21 | ] 22 | }) 23 | 24 | const { track } = await bot.player.play(channel, music, { 25 | nodeOptions: { 26 | metadata: message 27 | } 28 | }); 29 | 30 | message.delete().then(() => { 31 | message.channel.send({ 32 | embeds: [ 33 | Embed 34 | .setDescription(`✅ | La musique **${track.title}** as bien été trouvé 🔊`) 35 | ] 36 | }) 37 | }) 38 | } catch (e) { 39 | return message.delete() + message.channel.send({ 40 | embeds: [ 41 | Embed 42 | .setDescription(`Une erreur est survenue : ${e}`) 43 | ] 44 | }) 45 | } 46 | } -------------------------------------------------------------------------------- /src/Commands/🔊 Musique/nowplaying.js: -------------------------------------------------------------------------------- 1 | const { EmbedBuilder } = require("discord.js"); 2 | 3 | exports.help = { 4 | name: 'nowplaying' 5 | } 6 | 7 | exports.run = async (bot, message) => { 8 | const queue = bot.player.nodes.get(message.guild) 9 | 10 | const Embed = new EmbedBuilder() 11 | .setColor(bot.config.clients.embedColor) 12 | .setTimestamp() 13 | .setFooter({ text: bot.config.clients.name, iconURL: bot.config.clients.logo}); 14 | 15 | try { 16 | if(!queue || !queue.isPlaying()) return message.delete() + message.channel.send({ 17 | embeds: [ 18 | Embed 19 | .setDescription(`❌ | Aucune musique en cours de lecture 🔊`) 20 | ] 21 | }) 22 | 23 | return message.delete().then(() => { 24 | const progress = queue.node.createProgressBar() 25 | 26 | const methods = ['Désactivé', 'Musique', 'Fil d\'attente', 'Lecture automatique']; 27 | 28 | message.channel.send({ 29 | embeds: [ 30 | Embed 31 | .setDescription(`Nom : [${queue.currentTrack.title}](${queue.currentTrack.url})\nVolume : **${queue.node.volume}%**\nDurée : **${progress.replace(/ 0:00/g, 'LIVE')}**\nMode répétition : **${methods[queue.repeatMode]}**`) 32 | .setThumbnail(`${queue.currentTrack.thumbnail}`) 33 | ] 34 | }) 35 | }) 36 | } catch (e) { 37 | return message.delete() + message.channel.send({ 38 | embeds: [ 39 | Embed 40 | .setDescription(`Une erreur est survenue : ${e}`) 41 | ] 42 | }) 43 | } 44 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |