From cb653712cd9b3beb0ce3d557ccfbdf296953fb56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o-21?= Date: Mon, 13 Dec 2021 21:10:00 +0100 Subject: [PATCH] add eslint and prettier --- .eslintignore | 4 + .eslintrc | 10 - .eslintrc.json | 23 + .prettierignore | 4 + .prettierrc | 10 + package.json | 15 +- src/commands/ban.js | 139 ++-- src/commands/initcount.js | 37 +- src/commands/kick.js | 117 ++- src/commands/music.js | 1014 +++++++++++++++++------- src/commands/ping.js | 21 +- src/commands/prune.js | 60 +- src/commands/reset-warns.js | 64 +- src/commands/server.js | 42 +- src/commands/suggest.js | 25 +- src/commands/user-info.js | 60 +- src/commands/warn.js | 189 +++-- src/commands/warnings.js | 61 +- src/deploy-commands.js | 30 +- src/events/guildBanAdd.js | 32 +- src/events/guildBanRemove.js | 30 +- src/events/guildMemberAdd.js | 33 +- src/events/guildMemberRemove.js | 73 +- src/events/interactionCreate.js | 530 ++++++++----- src/events/messageCreate.js | 52 +- src/events/messageDelete.js | 43 +- src/events/messageUpdate.js | 51 +- src/events/ready.js | 114 ++- src/functions/createTicket.js | 115 +-- src/functions/generateCaptcha.js | 120 +-- src/functions/getChannelTranscript.js | 57 +- src/functions/handleSuggestionVotes.js | 97 +-- src/functions/isModOrAdmin.js | 27 +- src/functions/sendSuggestion.js | 73 +- src/functions/sendWelcomeImage.js | 97 ++- src/functions/translate.js | 14 +- src/functions/updateSubCount.js | 52 +- src/index.js | 242 +++--- src/music/config.js | 22 +- src/setup.js | 144 ++-- 40 files changed, 2428 insertions(+), 1515 deletions(-) create mode 100644 .eslintignore delete mode 100644 .eslintrc create mode 100644 .eslintrc.json create mode 100644 .prettierignore create mode 100644 .prettierrc diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..80b51b3 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,4 @@ +node_modules +.git +.vs_code +.idea \ No newline at end of file diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index fe855ee..0000000 --- a/.eslintrc +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "google", - "parserOptions": { - "ecmaVersion": 2017 - }, - - "env": { - "es6": true - } -} diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..c514c77 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,23 @@ +{ + "env": { + "node": true, + "es2021": true + }, + "extends": [ + "prettier", + "eslint:recommended", + "plugin:prettier/recommended" + ], + "parserOptions": { + "ecmaVersion": 2021, + "sourceType": "module" + }, + "plugins": ["prettier"], + "rules": { + "no-console": "warn", + "prefer-const": "error", + "no-var": "error", + "prettier/prettier": "error", + "eqeqeq": "error" + } +} diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..80b51b3 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,4 @@ +node_modules +.git +.vs_code +.idea \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..b171129 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,10 @@ +{ + "printWidth": 80, + "tabWidth": 2, + "useTabs": false, + "semi": true, + "singleQuote": false, + "bracketSpacing": true, + "arrowParens": "avoid", + "endOfLine": "lf" +} \ No newline at end of file diff --git a/package.json b/package.json index c891242..92780a7 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "scripts": { "start": "node src/index.js", "deploy-commands": "node src/deploy-commands.js", - "test": "eslint --ext .js .", + "lint": "eslint .", + "lint:fix": "eslint --fix .", "setup": "node src/setup.js" }, "repository": { @@ -29,17 +30,21 @@ "discord-player": "^5.1.0", "discord.js": "^13.3.1", "dotenv": "^10.0.0", - "eslint": "^8.2.0", - "eslint-config-google": "^0.14.0", + "ffmpeg-static": "^4.4.0", "googleapis": "^92.0.0", "jimp": "^0.3.11", "mongodb": "^4.1.4", - "node-cron": "^3.0.0", - "ffmpeg-static": "^4.4.0", "ms": "^2.1.3", + "node-cron": "^3.0.0", "opusscript": "^0.0.8", "quick.eco": "^6.0.0", "quickmongo": "^4.0.0", "winston": "^3.3.3" + }, + "devDependencies": { + "eslint": "^8.4.1", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0", + "prettier": "^2.5.1" } } diff --git a/src/commands/ban.js b/src/commands/ban.js index 5bcd25b..7ecc980 100644 --- a/src/commands/ban.js +++ b/src/commands/ban.js @@ -1,58 +1,99 @@ -const { SlashCommandBuilder } = require('@discordjs/builders'); -const { MessageButton, MessageActionRow, MessageEmbed} = require('discord.js'); -const {isMod, isAdmin} = require("../functions/isModOrAdmin"); +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageButton, MessageActionRow, MessageEmbed } = require("discord.js"); +const { isMod, isAdmin } = require("../functions/isModOrAdmin"); module.exports = { - data: new SlashCommandBuilder() - .setName('ban') - .setDescription('Bannir un membre (ADMIN).') - .addUserOption(option => option.setName('utilisateur').setDescription('Le membre à bannir').setRequired(true)) - .addStringOption(option => option.setName('raison').setDescription('La raison pour laquelle bannir le membre').setRequired(true)), - async execute(client, interaction) { - const author = interaction.member; - const user = interaction.options.getMember('utilisateur'); - const row = new MessageActionRow() - .addComponents( - new MessageButton() - .setCustomId('oui') - .setLabel('Oui') - .setStyle('SUCCESS'), - new MessageButton() - .setCustomId('non') - .setLabel('Non') - .setStyle('DANGER'), - ); - if (!isMod(client, interaction.member) && !isAdmin(client, interaction.member) && !interaction.member.permissions.has("BAN_MEMBERS")) { - return interaction.reply({ content: `Vous n'avez pas le droit d'exécuter cette commande !`, ephemeral: true }) - } - interaction.reply({ content: 'Voulez-vous bannir ' + user.user.username + "#" + user.user.discriminator + ' ?', components: [row], ephemeral: true }) - const filter = i => i.user.id === author.id; + data: new SlashCommandBuilder() + .setName("ban") + .setDescription("Bannir un membre (ADMIN).") + .addUserOption(option => + option + .setName("utilisateur") + .setDescription("Le membre à bannir") + .setRequired(true) + ) + .addStringOption(option => + option + .setName("raison") + .setDescription("La raison pour laquelle bannir le membre") + .setRequired(true) + ), + async execute(client, interaction) { + const author = interaction.member; + const user = interaction.options.getMember("utilisateur"); + const row = new MessageActionRow().addComponents( + new MessageButton() + .setCustomId("oui") + .setLabel("Oui") + .setStyle("SUCCESS"), + new MessageButton().setCustomId("non").setLabel("Non").setStyle("DANGER") + ); + if ( + !isMod(client, interaction.member) && + !isAdmin(client, interaction.member) && + !interaction.member.permissions.has("BAN_MEMBERS") + ) { + return interaction.reply({ + content: "Vous n'avez pas le droit d'exécuter cette commande !", + ephemeral: true, + }); + } + interaction.reply({ + content: + "Voulez-vous bannir " + + user.user.username + + "#" + + user.user.discriminator + + " ?", + components: [row], + ephemeral: true, + }); + const filter = i => i.user.id === author.id; - const collector = interaction.channel.createMessageComponentCollector({ filter, time: 15000 }); + const collector = interaction.channel.createMessageComponentCollector({ + filter, + time: 15000, + }); - const reason = interaction.options.getString('raison'); + const reason = interaction.options.getString("raison"); - collector.on('collect', async i => { - if (i.customId === 'oui') { - await user.send('Vous avez été banni de ' + interaction.guild.name + ' pour :\n`' + reason + "`"); - await user.ban({reason: reason}) + collector.on("collect", async i => { + if (i.customId === "oui") { + await user.send( + "Vous avez été banni de " + + interaction.guild.name + + " pour :\n`" + + reason + + "`" + ); + await user.ban({ reason: reason }); - const embed = new MessageEmbed() - .setAuthor("Membre banni") - .setColor("#ff1500") - .setTimestamp(Date.now()) - .setThumbnail(user.avatarURL({ dynamic: true })) - .addField("Utilisateur :", `${user.id}`, true) - .addField("Modérateur :", `<@${author.id}>`, true) - .addField("Raison :", reason, true) + const embed = new MessageEmbed() + .setAuthor("Membre banni") + .setColor("#ff1500") + .setTimestamp(Date.now()) + .setThumbnail(user.avatarURL({ dynamic: true })) + .addField("Utilisateur :", `${user.id}`, true) + .addField("Modérateur :", `<@${author.id}>`, true) + .addField("Raison :", reason, true); - const channel = await interaction.guild.channels.fetch(client.config.logs.modChannelId) - await channel.send({ embeds: [embed] }) + const channel = await interaction.guild.channels.fetch( + client.config.logs.modChannelId + ); + await channel.send({ embeds: [embed] }); - await i.update({ content: 'Vous avez banni ' + user.user.username + "#" + user.user.discriminator + ' avec succès !', components: [] }); - }else{ - await i.update({ content: 'Opération annulée !', components: [] }); - } - }); - }, + await i.update({ + content: + "Vous avez banni " + + user.user.username + + "#" + + user.user.discriminator + + " avec succès !", + components: [], + }); + } else { + await i.update({ content: "Opération annulée !", components: [] }); + } + }); + }, }; diff --git a/src/commands/initcount.js b/src/commands/initcount.js index 442e433..a418266 100644 --- a/src/commands/initcount.js +++ b/src/commands/initcount.js @@ -1,16 +1,25 @@ -const { SlashCommandBuilder } = require('@discordjs/builders'); -const { Permissions } = require('discord.js') +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { Permissions } = require("discord.js"); module.exports = { - data: new SlashCommandBuilder() - .setName('initcount') - .setDescription('Initialiser le système de comptage (ADMIN).'), - async execute(client, interaction) { - const author = interaction.member; - if (!author.permissions.has(Permissions.FLAGS.ADMINISTRATOR)) { - return interaction.reply({ content: `Vous n'avez pas le droit d'exécuter cette commande !`, ephemeral: true }) - } - await client.countdb.set(`${interaction.guild.id}`, ({author: "null", currentNumber: 0})); - interaction.reply({ content: `Système de comptage initialisé !`, ephemeral: true }) - }, -}; \ No newline at end of file + data: new SlashCommandBuilder() + .setName("initcount") + .setDescription("Initialiser le système de comptage (ADMIN)."), + async execute(client, interaction) { + const author = interaction.member; + if (!author.permissions.has(Permissions.FLAGS.ADMINISTRATOR)) { + return interaction.reply({ + content: "Vous n'avez pas le droit d'exécuter cette commande !", + ephemeral: true, + }); + } + await client.countdb.set(`${interaction.guild.id}`, { + author: "null", + currentNumber: 0, + }); + interaction.reply({ + content: "Système de comptage initialisé !", + ephemeral: true, + }); + }, +}; diff --git a/src/commands/kick.js b/src/commands/kick.js index ba77015..876b14f 100644 --- a/src/commands/kick.js +++ b/src/commands/kick.js @@ -1,45 +1,84 @@ -const { SlashCommandBuilder } = require('@discordjs/builders'); -const { MessageButton, MessageActionRow } = require('discord.js'); -const {isMod, isAdmin} = require("../functions/isModOrAdmin"); +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageButton, MessageActionRow } = require("discord.js"); +const { isMod, isAdmin } = require("../functions/isModOrAdmin"); module.exports = { - data: new SlashCommandBuilder() - .setName('kick') - .setDescription('Expulser un membre (ADMIN).') - .addUserOption(option => option.setName('utilisateur').setDescription('Le membre à expulser').setRequired(true)) - .addStringOption(option => option.setName('raison').setDescription('La raison pour laquelle bannir le membre').setRequired(true)), - async execute(client, interaction) { - const author = interaction.member; - const user = interaction.options.getMember('utilisateur'); - const row = new MessageActionRow() - .addComponents( - new MessageButton() - .setCustomId('oui') - .setLabel('Oui') - .setStyle('SUCCESS'), - new MessageButton() - .setCustomId('non') - .setLabel('Non') - .setStyle('DANGER'), - ); - if (!isMod(client, interaction.member) && !isAdmin(client, interaction.member) && !interaction.member.permissions.has("KICK_MEMBERS")) { - return interaction.reply({ content: `Vous n'avez pas le droit d'exécuter cette commande !`, ephemeral: true }) - } - interaction.reply({ content: 'Voulez-vous expulser ' + user.user.username + "#" + user.user.discriminator + ' ?', components: [row], ephemeral: true }) - const filter = i => i.user.id === author.id; + data: new SlashCommandBuilder() + .setName("kick") + .setDescription("Expulser un membre (ADMIN).") + .addUserOption(option => + option + .setName("utilisateur") + .setDescription("Le membre à expulser") + .setRequired(true) + ) + .addStringOption(option => + option + .setName("raison") + .setDescription("La raison pour laquelle bannir le membre") + .setRequired(true) + ), + async execute(client, interaction) { + const author = interaction.member; + const user = interaction.options.getMember("utilisateur"); + const row = new MessageActionRow().addComponents( + new MessageButton() + .setCustomId("oui") + .setLabel("Oui") + .setStyle("SUCCESS"), + new MessageButton().setCustomId("non").setLabel("Non").setStyle("DANGER") + ); + if ( + !isMod(client, interaction.member) && + !isAdmin(client, interaction.member) && + !interaction.member.permissions.has("KICK_MEMBERS") + ) { + return interaction.reply({ + content: "Vous n'avez pas le droit d'exécuter cette commande !", + ephemeral: true, + }); + } + interaction.reply({ + content: + "Voulez-vous expulser " + + user.user.username + + "#" + + user.user.discriminator + + " ?", + components: [row], + ephemeral: true, + }); + const filter = i => i.user.id === author.id; - const collector = interaction.channel.createMessageComponentCollector({ filter, time: 15000 }); + const collector = interaction.channel.createMessageComponentCollector({ + filter, + time: 15000, + }); - const reason = interaction.options.getString('raison'); + const reason = interaction.options.getString("raison"); - collector.on('collect', async i => { - if (i.customId === 'oui') { - await user.send('Vous avez été kick de ' + interaction.guild.name + ' pour :\n`' + reason + '`'); - await user.kick({reason: reason}) - await i.update({ content: 'Vous avez expulsé ' + user.user.username + "#" + user.user.discriminator + ' avec succès !', components: [] }); - }else{ - await i.update({ content: 'Opération annulée !', components: [] }); - } - }); - }, + collector.on("collect", async i => { + if (i.customId === "oui") { + await user.send( + "Vous avez été kick de " + + interaction.guild.name + + " pour :\n`" + + reason + + "`" + ); + await user.kick({ reason: reason }); + await i.update({ + content: + "Vous avez expulsé " + + user.user.username + + "#" + + user.user.discriminator + + " avec succès !", + components: [], + }); + } else { + await i.update({ content: "Opération annulée !", components: [] }); + } + }); + }, }; diff --git a/src/commands/music.js b/src/commands/music.js index be484d1..ffb19a9 100644 --- a/src/commands/music.js +++ b/src/commands/music.js @@ -1,314 +1,716 @@ -const { SlashCommandBuilder } = require('@discordjs/builders'); -const { MessageEmbed, MessageActionRow, MessageButton } = require('discord.js'); -const { QueryType, QueueRepeatMode } = require('discord-player'); -const ms = require('ms'); +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed, MessageActionRow, MessageButton } = require("discord.js"); +const { QueryType, QueueRepeatMode } = require("discord-player"); +const ms = require("ms"); const { Lyrics } = require("@discord-player/extractor"); module.exports = { - data: new SlashCommandBuilder() - .setName('music') - .setDescription('Commandes pour le système de musique.') - .addSubcommand(subcommand => subcommand.setName('play') - .setDescription('Jouer une musique.') - .addStringOption(option => option.setName('musique').setDescription('Le nom ou l\'URL de la musique à chercher').setRequired(true))).addSubcommand(subcommand => subcommand.setName('stop') - .setDescription('Arêter la musique.')).addSubcommand(subcommand => subcommand.setName('pause') - .setDescription('Mettre en pause la musique.')).addSubcommand(subcommand => subcommand.setName('resume') - .setDescription('Reprendre la musique.')).addSubcommand(subcommand => subcommand.setName('search') - .setDescription('Chercher une musique.') - .addStringOption(option => option.setName('musique').setDescription('Le nom de la musique à chercher').setRequired(true))).addSubcommand(subcommand => subcommand.setName('skip') - .setDescription('Passer cette musique.')).addSubcommand(subcommand => subcommand.setName('volume') - .setDescription('Changer le volume de la musique.') - .addIntegerOption(option => option.setName('volume').setDescription('Nouveau volume.'))).addSubcommandGroup(subcommandgroup => subcommandgroup.setName('filter').setDescription('Activer/Désactiver un filtre').addSubcommand(subcommand => subcommand.setName('bassboost') - .setDescription('Activer/Désactiver le bassboost sur la musique actuelle.') - .addBooleanOption(option => option.setName('toggle').setDescription('Toggle le mode bassboost ou pas').setRequired(true))).addSubcommand(subcommand => subcommand.setName('nightcore') - .setDescription('Activer/Désactiver le mode nightcore sur la musique actuelle.') - .addBooleanOption(option => option.setName('toggle').setDescription('Toggle le mode nightcore ou pas').setRequired(true))).addSubcommand(subcommand => subcommand.setName('earrape') - .setDescription('Activer/Désactiver le mode earrape sur la musique actuelle.') - .addBooleanOption(option => option.setName('toggle').setDescription('Toggle le mode earrape ou pas').setRequired(true))).addSubcommand(subcommand => subcommand.setName('8d') - .setDescription('Activer/Désactiver le mode 8D sur la musique actuelle.') - .addBooleanOption(option => option.setName('toggle').setDescription('Toggle le mode 8D ou pas').setRequired(true))).addSubcommand(subcommand => subcommand.setName('karaoke') - .setDescription('Activer/Désactiver le mode karaoke sur la musique actuelle.') - .addBooleanOption(option => option.setName('toggle').setDescription('Toggle le mode karaoke ou pas').setRequired(true)))).addSubcommand(subcommand => subcommand.setName('nowplaying') - .setDescription('Avoir les informations de la musique actuelle.')).addSubcommand(subcommand => subcommand.setName('seek') - .setDescription('Avancer/Reculer à une partie de la musique actuelle. (example : 3m 23s)') - .addStringOption(option => option.setName('moment').setDescription('Le moment à avancer/reculer dans la musique').setRequired(true))).addSubcommand(subcommand => subcommand.setName('clear') - .setDescription('Clear la liste des musiques.')).addSubcommand(subcommand => subcommand.setName('queue') - .setDescription('Voir les musiques après la musique actuelle.')).addSubcommand(subcommand => subcommand.setName('lyrics') - .setDescription('Voir les paroles de la musique actuelle.')).addSubcommand(subcommand => subcommand.setName('loop') - .setDescription('Activer/Désactiver le mode loop sur la musique actuelle.') - .addBooleanOption(option => option.setName('toggle').setDescription('Toggle le mode loop ou pas').setRequired(true))), - async execute(client, interaction) { - const lyricsClient = Lyrics.init(client.config.geniusApiKey); - if (interaction.options.getSubcommand() === "play") { - const res = await client.player.search(interaction.options.getString('musique'), { - requestedBy: interaction.member, - searchEngine: QueryType.AUTO - }); - - if (!res || !res.tracks.length) return interaction.reply({content: `Aucun résultat trouvé pour "${interaction.options.getString('musique')}" ❌`, ephemeral: true}); - - const queue = await client.player.createQueue(interaction.guild, { - metadata: interaction.channel - }); - - try { - if (!queue.connection) await queue.connect(interaction.member.voice.channel); - } catch { - await client.player.deleteQueue(interaction.guild.id); - return interaction.reply({content: "Je n'ai pas pu rejoindre le salon vocal ! ❌", ephemeral: true}); + data: new SlashCommandBuilder() + .setName("music") + .setDescription("Commandes pour le système de musique.") + .addSubcommand(subcommand => + subcommand + .setName("play") + .setDescription("Jouer une musique.") + .addStringOption(option => + option + .setName("musique") + .setDescription("Le nom ou l'URL de la musique à chercher") + .setRequired(true) + ) + ) + .addSubcommand(subcommand => + subcommand.setName("stop").setDescription("Arêter la musique.") + ) + .addSubcommand(subcommand => + subcommand.setName("pause").setDescription("Mettre en pause la musique.") + ) + .addSubcommand(subcommand => + subcommand.setName("resume").setDescription("Reprendre la musique.") + ) + .addSubcommand(subcommand => + subcommand + .setName("search") + .setDescription("Chercher une musique.") + .addStringOption(option => + option + .setName("musique") + .setDescription("Le nom de la musique à chercher") + .setRequired(true) + ) + ) + .addSubcommand(subcommand => + subcommand.setName("skip").setDescription("Passer cette musique.") + ) + .addSubcommand(subcommand => + subcommand + .setName("volume") + .setDescription("Changer le volume de la musique.") + .addIntegerOption(option => + option.setName("volume").setDescription("Nouveau volume.") + ) + ) + .addSubcommandGroup(subcommandgroup => + subcommandgroup + .setName("filter") + .setDescription("Activer/Désactiver un filtre") + .addSubcommand(subcommand => + subcommand + .setName("bassboost") + .setDescription( + "Activer/Désactiver le bassboost sur la musique actuelle." + ) + .addBooleanOption(option => + option + .setName("toggle") + .setDescription("Toggle le mode bassboost ou pas") + .setRequired(true) + ) + ) + .addSubcommand(subcommand => + subcommand + .setName("nightcore") + .setDescription( + "Activer/Désactiver le mode nightcore sur la musique actuelle." + ) + .addBooleanOption(option => + option + .setName("toggle") + .setDescription("Toggle le mode nightcore ou pas") + .setRequired(true) + ) + ) + .addSubcommand(subcommand => + subcommand + .setName("earrape") + .setDescription( + "Activer/Désactiver le mode earrape sur la musique actuelle." + ) + .addBooleanOption(option => + option + .setName("toggle") + .setDescription("Toggle le mode earrape ou pas") + .setRequired(true) + ) + ) + .addSubcommand(subcommand => + subcommand + .setName("8d") + .setDescription( + "Activer/Désactiver le mode 8D sur la musique actuelle." + ) + .addBooleanOption(option => + option + .setName("toggle") + .setDescription("Toggle le mode 8D ou pas") + .setRequired(true) + ) + ) + .addSubcommand(subcommand => + subcommand + .setName("karaoke") + .setDescription( + "Activer/Désactiver le mode karaoke sur la musique actuelle." + ) + .addBooleanOption(option => + option + .setName("toggle") + .setDescription("Toggle le mode karaoke ou pas") + .setRequired(true) + ) + ) + ) + .addSubcommand(subcommand => + subcommand + .setName("nowplaying") + .setDescription("Avoir les informations de la musique actuelle.") + ) + .addSubcommand(subcommand => + subcommand + .setName("seek") + .setDescription( + "Avancer/Reculer à une partie de la musique actuelle. (example : 3m 23s)" + ) + .addStringOption(option => + option + .setName("moment") + .setDescription("Le moment à avancer/reculer dans la musique") + .setRequired(true) + ) + ) + .addSubcommand(subcommand => + subcommand.setName("clear").setDescription("Clear la liste des musiques.") + ) + .addSubcommand(subcommand => + subcommand + .setName("queue") + .setDescription("Voir les musiques après la musique actuelle.") + ) + .addSubcommand(subcommand => + subcommand + .setName("lyrics") + .setDescription("Voir les paroles de la musique actuelle.") + ) + .addSubcommand(subcommand => + subcommand + .setName("loop") + .setDescription( + "Activer/Désactiver le mode loop sur la musique actuelle." + ) + .addBooleanOption(option => + option + .setName("toggle") + .setDescription("Toggle le mode loop ou pas") + .setRequired(true) + ) + ), + async execute(client, interaction) { + const lyricsClient = Lyrics.init(client.config.geniusApiKey); + if (interaction.options.getSubcommand() === "play") { + const res = await client.player.search( + interaction.options.getString("musique"), + { + requestedBy: interaction.member, + searchEngine: QueryType.AUTO, + } + ); + + if (!res || !res.tracks.length) + return interaction.reply({ + content: `Aucun résultat trouvé pour "${interaction.options.getString( + "musique" + )}" ❌`, + ephemeral: true, + }); + + const queue = await client.player.createQueue(interaction.guild, { + metadata: interaction.channel, + }); + + try { + if (!queue.connection) + await queue.connect(interaction.member.voice.channel); + } catch { + await client.player.deleteQueue(interaction.guild.id); + return interaction.reply({ + content: "Je n'ai pas pu rejoindre le salon vocal ! ❌", + ephemeral: true, + }); + } + + await interaction.reply({ + content: `Chargement de votre ${ + res.playlist ? "playlist" : "musique" + }... 🎧`, + }); + + res.playlist + ? queue.addTracks(res.tracks) + : queue.addTrack(res.tracks[0]); + + if (!queue.playing) await queue.play(); + } else if (interaction.options.getSubcommand() === "stop") { + const queue = client.player.getQueue(interaction.guild.id); + + if (!queue || !queue.playing) + return interaction.reply({ + content: "Aucune musique n'est jouée. ❌", + ephemeral: true, + }); + + queue.destroy(); + + interaction.reply({ content: "Musique arrêtée, à la prochaine ! ✅" }); + } else if (interaction.options.getSubcommand() === "pause") { + const queue = client.player.getQueue(interaction.guild.id); + + if (!queue) + return interaction.reply({ + content: "Aucune musique n'est jouée. ❌", + ephemeral: true, + }); + + const success = queue.setPaused(true); + + return interaction.reply( + success + ? { + content: `La musique ${queue.current.title} a été mise en pause ✅`, + } + : { + content: "Quelque chose ne s'est pas passé comme prévu... ❌", + ephemeral: true, + } + ); + } else if (interaction.options.getSubcommand() === "resume") { + const queue = client.player.getQueue(interaction.guild.id); + + if (!queue) + return interaction.reply({ + content: "Aucune musique n'est jouée. ❌", + ephemeral: true, + }); + + const success = queue.setPaused(false); + + return interaction.reply( + success + ? { + content: `La musique ${queue.current.title} a été reprise ✅`, + ephemeral: true, } - - await interaction.reply({content: `Chargement de votre ${res.playlist ? 'playlist' : 'musique'}... 🎧`}); - - res.playlist ? queue.addTracks(res.tracks) : queue.addTrack(res.tracks[0]); - - if (!queue.playing) await queue.play(); - }else if (interaction.options.getSubcommand() === "stop") { - const queue = client.player.getQueue(interaction.guild.id); - - if (!queue || !queue.playing) return interaction.reply({content: "Aucune musique n'est jouée. ❌", ephemeral: true}); - - queue.destroy(); - - interaction.reply({content: "Musique arrêtée, à la prochaine ! ✅"}); - }else if (interaction.options.getSubcommand() === "pause") { - const queue = client.player.getQueue(interaction.guild.id); - - if (!queue) return interaction.reply({content: "Aucune musique n'est jouée. ❌", ephemeral: true}); - - const success = queue.setPaused(true); - - return interaction.reply(success ? {content: `La musique ${queue.current.title} a été mise en pause ✅`} : {content: `Quelque chose ne s'est pas passé comme prévu... ❌`, ephemeral: true}); - }else if (interaction.options.getSubcommand() === "resume") { - const queue = client.player.getQueue(interaction.guild.id); - - if (!queue) return interaction.reply({content: "Aucune musique n'est jouée. ❌", ephemeral: true}); - - const success = queue.setPaused(false); - - return interaction.reply(success ? {content: `La musique ${queue.current.title} a été reprise ✅`, ephemeral: true} : {content: `Quelque chose ne s'est pas passé comme prévu... ❌`, ephemeral: true}); - }else if (interaction.options.getSubcommand() === "search") { - const res = await client.player.search(interaction.options.getString('musique'), { - requestedBy: interaction.member, - searchEngine: QueryType.AUTO - }); - - if (!res || !res.tracks.length) return interaction.reply({content: `Aucun résultat trouvé pour "${interaction.options.getString('musique')}" ❌`, ephemeral: true}); - - const queue = await client.player.createQueue(interaction.guild, { - metadata: interaction.channel - }); - - const embed = new MessageEmbed(); - - embed.setColor('RED'); - embed.setAuthor(`Résultats pour "${interaction.options.getString('musique')}"`, client.user.displayAvatarURL({ size: 1024, dynamic: true })); - - const maxTracks = res.tracks.slice(0, 10); - - embed.setDescription(`${maxTracks.map((track, i) => `**${i + 1}**. ${track.title} | ${track.author}`).join('\n')}\n\nSélectionnez entre **1** and **${maxTracks.length}** ou **annuler** ⬇️`); - - embed.setTimestamp(); - embed.setFooter('AstralMusic', interaction.user.avatarURL({ dynamic: true })); - - interaction.reply({ embeds: [embed] }); - - const collector = interaction.channel.createMessageCollector({ - time: 15000, - errors: ['time'], - filter: m => m.author.id === interaction.user.id - }); - - collector.on('collect', async (query) => { - query.delete(); - if (query.content.toLowerCase() === 'annuler') return interaction.followUp({content: "Recherche annulée ✅", ephemeral: true}) && collector.stop(); - - const value = parseInt(query.content); - - if (!value || value <= 0 || value > maxTracks.length) return interaction.followUp({content: `Réponse invalide, essayez avec un nombre entre **1** et **${maxTracks.length}** ou **annuler**. ❌`, ephemeral: true}); - - collector.stop(); - - try { - if (!queue.connection) await queue.connect(interaction.member.voice.channel); - } catch { - await client.player.deleteQueue(interaction.guild.id); - return interaction.followUp({content: `Je n'ai pas pu rejoindre ce salon vocal. ❌`, ephemeral: true}); - } - - await interaction.followUp({content: `Chargement de votre recherche... 🎧`, ephemeral: true}); - - queue.addTrack(res.tracks[query.content - 1]); - - if (!queue.playing) await queue.play(); - }); - - collector.on('end', (msg, reason) => { - if (reason === 'time') return interaction.followUp({content: `Recherche écoulée ! ❌`, ephemeral: true}); - }); - }else if (interaction.options.getSubcommand() === "skip") { - const queue = client.player.getQueue(interaction.guild.id); - - if (!queue) return interaction.reply({content: "Aucune musique n'est jouée. ❌", ephemeral: true}); - - const success = queue.skip(); - - return interaction.reply(success ? {content: `La musique ${queue.current.title} a été skippée ! ✅`, ephemeral: true} : {content: `Quelque chose ne s'est pas passé comme prévu... ❌`, ephemeral: true}); - }else if(interaction.options.getSubcommand() === "volume") { - const queue = client.player.getQueue(interaction.guild.id); - - if (!queue || !queue.playing) return interaction.reply({content: "Aucune musique n'est jouée. ❌", ephemeral: true}); - - const vol = interaction.options.getInteger('volume') - - if (!vol) return interaction.reply({content: `Le volume actuel est ${queue.volume} 🔊\n*Pour changer le volume ajoutez un nombre entre **1** et **${client.musicconfig.opt.maxVol}** dans la commande.*`, ephemeral: true}); - - if (queue.volume === vol) return interaction.reply({content: `Votre nouveau volume est l'ancien sont les mêmes. ❌`, ephemeral: true}); - - if (vol < 0 || vol > client.musicconfig.opt.maxVol) return interaction.reply({content: `Le nombre spécifié est invalide. Entrez un nombre entre **1** et **${client.musicconfig.opt.maxVol}**. ❌`, ephemeral: true}); - - const success = queue.setVolume(vol); - - return interaction.reply(success ? {content: `Le volume a été modifié à **${vol}**/**${client.musicconfig.opt.maxVol}**% 🔊`} : {content: `Quelque chose ne s'est pas passé comme prévu... ❌`, ephemeral: true}); - }else if (interaction.options.getSubcommand() === "bassboost") { - const queue = client.player.getQueue(interaction.guild.id); - if (!queue || !queue.playing) return interaction.reply({content: "Aucune musique n'est jouée. ❌", ephemeral: true}); - await queue.setFilters({ - bassboost: interaction.options.getBoolean('toggle') - }); - return interaction.reply({ content: `🎵 | Bassboost ${interaction.options.getBoolean('toggle') ? 'activé' : 'désactivé'}! Veuillez patienter le temps que je modifie la musique...` }); - }else if (interaction.options.getSubcommand() === "nightcore") { - const queue = client.player.getQueue(interaction.guild.id); - if (!queue || !queue.playing) return interaction.reply({content: "Aucune musique n'est jouée. ❌", ephemeral: true}); - await queue.setFilters({ - nightcore: interaction.options.getBoolean('toggle') - }); - return interaction.reply({ content: `🎵 | Nightcore ${interaction.options.getBoolean('toggle') ? 'activée' : 'désactivée'}! Veuillez patienter le temps que je modifie la musique...` }); - }else if (interaction.options.getSubcommand() === "earrape") { - const queue = client.player.getQueue(interaction.guild.id); - if (!queue || !queue.playing) return interaction.reply({content: "Aucune musique n'est jouée. ❌", ephemeral: true}); - await queue.setFilters({ - earrape: interaction.options.getBoolean('toggle') - }); - return interaction.reply({ content: `🎵 | Earrape ${interaction.options.getBoolean('toggle') ? 'activé' : 'désactivé'} (attention les oreilles)! Veuillez patienter le temps que je modifie la musique...` }); - }else if (interaction.options.getSubcommand() === "8d") { - const queue = client.player.getQueue(interaction.guild.id); - if (!queue || !queue.playing) return interaction.reply({content: "Aucune musique n'est jouée. ❌", ephemeral: true}); - await queue.setFilters({ - "8D": interaction.options.getBoolean('toggle') - }); - return interaction.reply({ content: `🎵 | 8D ${interaction.options.getBoolean('toggle') ? 'activé' : 'désactivé'}! Veuillez patienter le temps que je modifie la musique...` }); - }else if (interaction.options.getSubcommand() === "karaoke") { - const queue = client.player.getQueue(interaction.guild.id); - if (!queue || !queue.playing) return interaction.reply({content: "Aucune musique n'est jouée. ❌", ephemeral: true}); - await queue.setFilters({ - karaoke: interaction.options.getBoolean('toggle') - }); - return interaction.reply({ content: `🎵 | Karaoke ${interaction.options.getBoolean('toggle') ? 'activé' : 'désactivé'}! Veuillez patienter le temps que je modifie la musique...` }); - }else if (interaction.options.getSubcommand() === "queue") { - const queue = client.player.getQueue(interaction.guild.id); - - if (!queue) return interaction.reply({content: "Aucune musique n'est jouée. ❌", ephemeral: true}); - - if (!queue.tracks[0]) return interaction.reply({content: "Il n'y a pas de musique après celle-ci dans la queue.", ephemeral: true}); - - const embed = new MessageEmbed(); - - embed.setColor('RED'); - embed.setThumbnail(interaction.guild.iconURL({ size: 2048, dynamic: true })); - embed.setAuthor(`Queue - ${interaction.guild.name}`, client.user.displayAvatarURL({ size: 1024, dynamic: true })); - - const tracks = queue.tracks.map((track, i) => `**${i + 1}** - ${track.title} | ${track.author} (demandé par : ${track.requestedBy.username})`); - - const songs = queue.tracks.length; - const nextSongs = songs > 5 ? `Et **${songs - 5}** autre musique(s)...` : `Dans la playlist, **${songs}** musiques(s)...`; - - embed.setDescription(`Musique actuelle - ${queue.current.title}\n\n${tracks.slice(0, 5).join('\n')}\n\n${nextSongs}`); - - embed.setTimestamp(); - embed.setFooter('AstralMusic', interaction.user.avatarURL({ dynamic: true })); - - interaction.channel.send({ embeds: [embed] }); - }else if(interaction.options.getSubcommand() === "nowplaying") { - const queue = client.player.getQueue(interaction.guild.id); - - if (!queue || !queue.playing) return interaction.reply({content: "Aucune musique n'est jouée. ❌", ephemeral: true}); - - const track = queue.current; - - const embed = new MessageEmbed(); - - embed.setColor('RED'); - embed.setThumbnail(track.thumbnail); - embed.setAuthor(track.title, client.user.displayAvatarURL({ size: 1024, dynamic: true })); - - const timestamp = queue.getPlayerTimestamp(); - const trackDuration = timestamp.progress == 'Infinity' ? 'infini (live)' : track.duration; - - embed.setDescription(`Volume : **${queue.volume}**%\nDurée **${trackDuration}**\nDemandé par ${track.requestedBy}`); - - embed.setTimestamp(); - embed.setFooter('AstralMusic', interaction.user.avatarURL({ dynamic: true })); - - const saveButton = new MessageButton(); - - saveButton.setLabel('Sauvegarder cette musique'); - saveButton.setCustomId('saveTrack'); - saveButton.setStyle('SUCCESS'); - - const row = new MessageActionRow().addComponents(saveButton); - interaction.reply({ embeds: [embed], components: [row]}); - }else if (interaction.options.getSubcommand() === "clear") { - const queue = client.player.getQueue(interaction.guild.id); - - if (!queue || !queue.playing) return interaction.reply({content: "Aucune musique n'est jouée. ❌", ephemeral: true}); - - if (!queue.tracks[0]) return interaction.reply({content: "Il n'y a pas de musique après celle-ci dans la queue.", ephemeral: true}); - - queue.clear(); - - interaction.reply({content: "La queue a été clear ! ✅", ephemeral: true}); - }else if (interaction.options.getSubcommand() === "seek") { - const queue = client.player.getQueue(interaction.guild.id); - - if (!queue || !queue.playing) return interaction.reply({content: "Aucune musique n'est jouée. ❌", ephemeral: true}); - - const timeToMS = ms(interaction.options.getString('moment')); - - if (timeToMS >= queue.current.durationMS) return interaction.reply({content: "Temps invalide ou plus grand que la musique ! Veuillez essayer un temps comme 5s, 10s ou 1m. ❌", ephemeral: true});; - - await queue.seek(timeToMS); - - await interaction.reply(`Le moment de la musique a été mis à **${ms(timeToMS, { long: true })}** ✅`); - }else if (interaction.options.getSubcommand() === "lyrics") { - const queue = client.player.getQueue(interaction.guild.id); - - if (!queue) return interaction.reply({content: "Aucune musique n'est jouée. ❌", ephemeral: true}); - - if (queue.current.url.includes("youtube") || queue.current.url.includes("youtu.be") || queue.current.url.includes("soundcloud.com")) { - return interaction.reply({content: "Désolé, seules les musiques Spotify sont supportées pour le moment. ❌", ephemeral: true}); + : { + content: "Quelque chose ne s'est pas passé comme prévu... ❌", + ephemeral: true, } + ); + } else if (interaction.options.getSubcommand() === "search") { + const res = await client.player.search( + interaction.options.getString("musique"), + { + requestedBy: interaction.member, + searchEngine: QueryType.AUTO, + } + ); + + if (!res || !res.tracks.length) + return interaction.reply({ + content: `Aucun résultat trouvé pour "${interaction.options.getString( + "musique" + )}" ❌`, + ephemeral: true, + }); + + const queue = await client.player.createQueue(interaction.guild, { + metadata: interaction.channel, + }); - const track = queue.current; - - lyricsClient.search(track.author + " " + track.title) - .then(lyrics => { - const embed = new MessageEmbed() - embed.setColor('RED'); - embed.setThumbnail(track.thumbnail); - embed.setAuthor(track.title, client.user.displayAvatarURL({ size: 1024, dynamic: true })); - embed.setTitle("Paroles :") - embed.setTimestamp(); - embed.setFooter('AstralMusic', interaction.user.avatarURL({ dynamic: true })); - embed.setDescription(lyrics.lyrics) - return interaction.reply({embeds: [embed]})}) - .catch(console.error); - }else if (interaction.options.getSubcommand() === "loop") { - const queue = client.player.getQueue(interaction.guild.id); - if (!queue || !queue.playing) return interaction.reply({content: "Aucune musique n'est jouée. ❌", ephemeral: true}); - const success = await queue.setRepeatMode(interaction.options.getBoolean('toggle') ? QueueRepeatMode.TRACK : QueueRepeatMode.OFF); - - return interaction.reply(success ? `Mode loop **${queue.repeatMode === 0 ? 'désactivé** !' : 'activé** ! Cette musique va se jouer jusqu\'à la désactivation du mode loop.'} 🔂` : {content: `Quelque chose ne s'est pas passé comme prévu... ❌`, ephemeral: true}); + const embed = new MessageEmbed(); + + embed.setColor("RED"); + embed.setAuthor( + `Résultats pour "${interaction.options.getString("musique")}"`, + client.user.displayAvatarURL({ size: 1024, dynamic: true }) + ); + + const maxTracks = res.tracks.slice(0, 10); + + embed.setDescription( + `${maxTracks + .map((track, i) => `**${i + 1}**. ${track.title} | ${track.author}`) + .join("\n")}\n\nSélectionnez entre **1** and **${ + maxTracks.length + }** ou **annuler** ⬇️` + ); + + embed.setTimestamp(); + embed.setFooter( + "AstralMusic", + interaction.user.avatarURL({ dynamic: true }) + ); + + interaction.reply({ embeds: [embed] }); + + const collector = interaction.channel.createMessageCollector({ + time: 15000, + errors: ["time"], + filter: m => m.author.id === interaction.user.id, + }); + + collector.on("collect", async query => { + query.delete(); + if (query.content.toLowerCase() === "annuler") + return ( + interaction.followUp({ + content: "Recherche annulée ✅", + ephemeral: true, + }) && collector.stop() + ); + + const value = parseInt(query.content); + + if (!value || value <= 0 || value > maxTracks.length) + return interaction.followUp({ + content: `Réponse invalide, essayez avec un nombre entre **1** et **${maxTracks.length}** ou **annuler**. ❌`, + ephemeral: true, + }); + + collector.stop(); + + try { + if (!queue.connection) + await queue.connect(interaction.member.voice.channel); + } catch { + await client.player.deleteQueue(interaction.guild.id); + return interaction.followUp({ + content: "Je n'ai pas pu rejoindre ce salon vocal. ❌", + ephemeral: true, + }); } - }, + + await interaction.followUp({ + content: "Chargement de votre recherche... 🎧", + ephemeral: true, + }); + + queue.addTrack(res.tracks[query.content - 1]); + + if (!queue.playing) await queue.play(); + }); + + collector.on("end", (msg, reason) => { + if (reason === "time") + return interaction.followUp({ + content: "Recherche écoulée ! ❌", + ephemeral: true, + }); + }); + } else if (interaction.options.getSubcommand() === "skip") { + const queue = client.player.getQueue(interaction.guild.id); + + if (!queue) + return interaction.reply({ + content: "Aucune musique n'est jouée. ❌", + ephemeral: true, + }); + + const success = queue.skip(); + + return interaction.reply( + success + ? { + content: `La musique ${queue.current.title} a été skippée ! ✅`, + ephemeral: true, + } + : { + content: "Quelque chose ne s'est pas passé comme prévu... ❌", + ephemeral: true, + } + ); + } else if (interaction.options.getSubcommand() === "volume") { + const queue = client.player.getQueue(interaction.guild.id); + + if (!queue || !queue.playing) + return interaction.reply({ + content: "Aucune musique n'est jouée. ❌", + ephemeral: true, + }); + + const vol = interaction.options.getInteger("volume"); + + if (!vol) + return interaction.reply({ + content: `Le volume actuel est ${queue.volume} 🔊\n*Pour changer le volume ajoutez un nombre entre **1** et **${client.musicconfig.opt.maxVol}** dans la commande.*`, + ephemeral: true, + }); + + if (queue.volume === vol) + return interaction.reply({ + content: "Votre nouveau volume est l'ancien sont les mêmes. ❌", + ephemeral: true, + }); + + if (vol < 0 || vol > client.musicconfig.opt.maxVol) + return interaction.reply({ + content: `Le nombre spécifié est invalide. Entrez un nombre entre **1** et **${client.musicconfig.opt.maxVol}**. ❌`, + ephemeral: true, + }); + + const success = queue.setVolume(vol); + + return interaction.reply( + success + ? { + content: `Le volume a été modifié à **${vol}**/**${client.musicconfig.opt.maxVol}**% 🔊`, + } + : { + content: "Quelque chose ne s'est pas passé comme prévu... ❌", + ephemeral: true, + } + ); + } else if (interaction.options.getSubcommand() === "bassboost") { + const queue = client.player.getQueue(interaction.guild.id); + if (!queue || !queue.playing) + return interaction.reply({ + content: "Aucune musique n'est jouée. ❌", + ephemeral: true, + }); + await queue.setFilters({ + bassboost: interaction.options.getBoolean("toggle"), + }); + return interaction.reply({ + content: `🎵 | Bassboost ${ + interaction.options.getBoolean("toggle") ? "activé" : "désactivé" + }! Veuillez patienter le temps que je modifie la musique...`, + }); + } else if (interaction.options.getSubcommand() === "nightcore") { + const queue = client.player.getQueue(interaction.guild.id); + if (!queue || !queue.playing) + return interaction.reply({ + content: "Aucune musique n'est jouée. ❌", + ephemeral: true, + }); + await queue.setFilters({ + nightcore: interaction.options.getBoolean("toggle"), + }); + return interaction.reply({ + content: `🎵 | Nightcore ${ + interaction.options.getBoolean("toggle") ? "activée" : "désactivée" + }! Veuillez patienter le temps que je modifie la musique...`, + }); + } else if (interaction.options.getSubcommand() === "earrape") { + const queue = client.player.getQueue(interaction.guild.id); + if (!queue || !queue.playing) + return interaction.reply({ + content: "Aucune musique n'est jouée. ❌", + ephemeral: true, + }); + await queue.setFilters({ + earrape: interaction.options.getBoolean("toggle"), + }); + return interaction.reply({ + content: `🎵 | Earrape ${ + interaction.options.getBoolean("toggle") ? "activé" : "désactivé" + } (attention les oreilles)! Veuillez patienter le temps que je modifie la musique...`, + }); + } else if (interaction.options.getSubcommand() === "8d") { + const queue = client.player.getQueue(interaction.guild.id); + if (!queue || !queue.playing) + return interaction.reply({ + content: "Aucune musique n'est jouée. ❌", + ephemeral: true, + }); + await queue.setFilters({ + "8D": interaction.options.getBoolean("toggle"), + }); + return interaction.reply({ + content: `🎵 | 8D ${ + interaction.options.getBoolean("toggle") ? "activé" : "désactivé" + }! Veuillez patienter le temps que je modifie la musique...`, + }); + } else if (interaction.options.getSubcommand() === "karaoke") { + const queue = client.player.getQueue(interaction.guild.id); + if (!queue || !queue.playing) + return interaction.reply({ + content: "Aucune musique n'est jouée. ❌", + ephemeral: true, + }); + await queue.setFilters({ + karaoke: interaction.options.getBoolean("toggle"), + }); + return interaction.reply({ + content: `🎵 | Karaoke ${ + interaction.options.getBoolean("toggle") ? "activé" : "désactivé" + }! Veuillez patienter le temps que je modifie la musique...`, + }); + } else if (interaction.options.getSubcommand() === "queue") { + const queue = client.player.getQueue(interaction.guild.id); + + if (!queue) + return interaction.reply({ + content: "Aucune musique n'est jouée. ❌", + ephemeral: true, + }); + + if (!queue.tracks[0]) + return interaction.reply({ + content: "Il n'y a pas de musique après celle-ci dans la queue.", + ephemeral: true, + }); + + const embed = new MessageEmbed(); + + embed.setColor("RED"); + embed.setThumbnail( + interaction.guild.iconURL({ size: 2048, dynamic: true }) + ); + embed.setAuthor( + `Queue - ${interaction.guild.name}`, + client.user.displayAvatarURL({ size: 1024, dynamic: true }) + ); + + const tracks = queue.tracks.map( + (track, i) => + `**${i + 1}** - ${track.title} | ${track.author} (demandé par : ${ + track.requestedBy.username + })` + ); + + const songs = queue.tracks.length; + const nextSongs = + songs > 5 + ? `Et **${songs - 5}** autre musique(s)...` + : `Dans la playlist, **${songs}** musiques(s)...`; + + embed.setDescription( + `Musique actuelle - ${queue.current.title}\n\n${tracks + .slice(0, 5) + .join("\n")}\n\n${nextSongs}` + ); + + embed.setTimestamp(); + embed.setFooter( + "AstralMusic", + interaction.user.avatarURL({ dynamic: true }) + ); + + interaction.channel.send({ embeds: [embed] }); + } else if (interaction.options.getSubcommand() === "nowplaying") { + const queue = client.player.getQueue(interaction.guild.id); + + if (!queue || !queue.playing) + return interaction.reply({ + content: "Aucune musique n'est jouée. ❌", + ephemeral: true, + }); + + const track = queue.current; + + const embed = new MessageEmbed(); + + embed.setColor("RED"); + embed.setThumbnail(track.thumbnail); + embed.setAuthor( + track.title, + client.user.displayAvatarURL({ size: 1024, dynamic: true }) + ); + + const timestamp = queue.getPlayerTimestamp(); + const trackDuration = + timestamp.progress === "Infinity" ? "infini (live)" : track.duration; + + embed.setDescription( + `Volume : **${queue.volume}**%\nDurée **${trackDuration}**\nDemandé par ${track.requestedBy}` + ); + + embed.setTimestamp(); + embed.setFooter( + "AstralMusic", + interaction.user.avatarURL({ dynamic: true }) + ); + + const saveButton = new MessageButton(); + + saveButton.setLabel("Sauvegarder cette musique"); + saveButton.setCustomId("saveTrack"); + saveButton.setStyle("SUCCESS"); + + const row = new MessageActionRow().addComponents(saveButton); + interaction.reply({ embeds: [embed], components: [row] }); + } else if (interaction.options.getSubcommand() === "clear") { + const queue = client.player.getQueue(interaction.guild.id); + + if (!queue || !queue.playing) + return interaction.reply({ + content: "Aucune musique n'est jouée. ❌", + ephemeral: true, + }); + + if (!queue.tracks[0]) + return interaction.reply({ + content: "Il n'y a pas de musique après celle-ci dans la queue.", + ephemeral: true, + }); + + queue.clear(); + + interaction.reply({ + content: "La queue a été clear ! ✅", + ephemeral: true, + }); + } else if (interaction.options.getSubcommand() === "seek") { + const queue = client.player.getQueue(interaction.guild.id); + + if (!queue || !queue.playing) + return interaction.reply({ + content: "Aucune musique n'est jouée. ❌", + ephemeral: true, + }); + + const timeToMS = ms(interaction.options.getString("moment")); + + if (timeToMS >= queue.current.durationMS) + return interaction.reply({ + content: + "Temps invalide ou plus grand que la musique ! Veuillez essayer un temps comme 5s, 10s ou 1m. ❌", + ephemeral: true, + }); + + await queue.seek(timeToMS); + + await interaction.reply( + `Le moment de la musique a été mis à **${ms(timeToMS, { + long: true, + })}** ✅` + ); + } else if (interaction.options.getSubcommand() === "lyrics") { + const queue = client.player.getQueue(interaction.guild.id); + + if (!queue) + return interaction.reply({ + content: "Aucune musique n'est jouée. ❌", + ephemeral: true, + }); + + if ( + queue.current.url.includes("youtube") || + queue.current.url.includes("youtu.be") || + queue.current.url.includes("soundcloud.com") + ) { + return interaction.reply({ + content: + "Désolé, seules les musiques Spotify sont supportées pour le moment. ❌", + ephemeral: true, + }); + } + + const track = queue.current; + + lyricsClient + .search(track.author + " " + track.title) + .then(lyrics => { + const embed = new MessageEmbed(); + embed.setColor("RED"); + embed.setThumbnail(track.thumbnail); + embed.setAuthor( + track.title, + client.user.displayAvatarURL({ size: 1024, dynamic: true }) + ); + embed.setTitle("Paroles :"); + embed.setTimestamp(); + embed.setFooter( + "AstralMusic", + interaction.user.avatarURL({ dynamic: true }) + ); + embed.setDescription(lyrics.lyrics); + return interaction.reply({ embeds: [embed] }); + }) + .catch(err => client.logger.error(err)); + } else if (interaction.options.getSubcommand() === "loop") { + const queue = client.player.getQueue(interaction.guild.id); + if (!queue || !queue.playing) + return interaction.reply({ + content: "Aucune musique n'est jouée. ❌", + ephemeral: true, + }); + const success = await queue.setRepeatMode( + interaction.options.getBoolean("toggle") + ? QueueRepeatMode.TRACK + : QueueRepeatMode.OFF + ); + + return interaction.reply( + success + ? `Mode loop **${ + queue.repeatMode === 0 + ? "désactivé** !" + : "activé** ! Cette musique va se jouer jusqu'à la désactivation du mode loop." + } 🔂` + : { + content: "Quelque chose ne s'est pas passé comme prévu... ❌", + ephemeral: true, + } + ); + } + }, }; diff --git a/src/commands/ping.js b/src/commands/ping.js index 5e75ec8..d8bb43f 100644 --- a/src/commands/ping.js +++ b/src/commands/ping.js @@ -1,11 +1,16 @@ -const { SlashCommandBuilder } = require('@discordjs/builders'); +const { SlashCommandBuilder } = require("@discordjs/builders"); module.exports = { - data: new SlashCommandBuilder() - .setName('ping') - .setDescription('Avoir le ping du bot.'), - async execute(client, interaction) { - const sent = await interaction.reply({ content: 'Ping en cours...', fetchReply: true }); - interaction.editReply(`Pong ! 🏓 ${sent.createdTimestamp - interaction.createdTimestamp}ms`); - }, + data: new SlashCommandBuilder() + .setName("ping") + .setDescription("Avoir le ping du bot."), + async execute(client, interaction) { + const sent = await interaction.reply({ + content: "Ping en cours...", + fetchReply: true, + }); + interaction.editReply( + `Pong ! 🏓 ${sent.createdTimestamp - interaction.createdTimestamp}ms` + ); + }, }; diff --git a/src/commands/prune.js b/src/commands/prune.js index b40dcf3..619099c 100644 --- a/src/commands/prune.js +++ b/src/commands/prune.js @@ -1,26 +1,46 @@ -const { SlashCommandBuilder } = require('@discordjs/builders'); -const {isMod, isAdmin} = require("../functions/isModOrAdmin"); +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { isMod, isAdmin } = require("../functions/isModOrAdmin"); module.exports = { - data: new SlashCommandBuilder() - .setName('delete') - .setDescription('Supprimer jusqu\'à 99 messages (ADMIN).') - .addIntegerOption(option => option.setName('nombre').setDescription('Nombre de messages à supprimer.').setRequired(true)), - async execute(client, interaction) { - if (!isMod(client, interaction.member) && !isAdmin(client, interaction.member) && !interaction.member.permissions.has("MANAGE_MESSAGES")) { - return interaction.reply({ content: `Vous n'avez pas le droit d'exécuter cette commande !`, ephemeral: true }) - } + data: new SlashCommandBuilder() + .setName("delete") + .setDescription("Supprimer jusqu'à 99 messages (ADMIN).") + .addIntegerOption(option => + option + .setName("nombre") + .setDescription("Nombre de messages à supprimer.") + .setRequired(true) + ), + async execute(client, interaction) { + if ( + !isMod(client, interaction.member) && + !isAdmin(client, interaction.member) && + !interaction.member.permissions.has("MANAGE_MESSAGES") + ) { + return interaction.reply({ + content: "Vous n'avez pas le droit d'exécuter cette commande !", + ephemeral: true, + }); + } - const amount = interaction.options.getInteger('nombre'); + const amount = interaction.options.getInteger("nombre"); - if (amount <= 1 || amount > 100) { - return interaction.reply({ content: 'Vous devez entrer un nombre entre 1 et 99.', ephemeral: true }); - } - await interaction.channel.bulkDelete(amount, true).catch(error => { - console.error(error); - interaction.reply({ content: 'Je n\'ai pas pu supprimer les messages dans ce salon !', ephemeral: true }); - }); + if (amount <= 1 || amount > 100) { + return interaction.reply({ + content: "Vous devez entrer un nombre entre 1 et 99.", + ephemeral: true, + }); + } + await interaction.channel.bulkDelete(amount, true).catch(error => { + client.logger.error(error); + interaction.reply({ + content: "Je n'ai pas pu supprimer les messages dans ce salon !", + ephemeral: true, + }); + }); - return interaction.reply({ content: `\`${amount}\` messages ont été supprimés.`}); - }, + return interaction.reply({ + content: `\`${amount}\` messages ont été supprimés.`, + }); + }, }; diff --git a/src/commands/reset-warns.js b/src/commands/reset-warns.js index afa0632..0819d6e 100644 --- a/src/commands/reset-warns.js +++ b/src/commands/reset-warns.js @@ -1,27 +1,47 @@ -const { SlashCommandBuilder } = require('@discordjs/builders'); +const { SlashCommandBuilder } = require("@discordjs/builders"); const { isMod, isAdmin } = require("../functions/isModOrAdmin"); module.exports = { - data: new SlashCommandBuilder() - .setName('resetwarns') - .setDescription('Remettre à zéro les warns de quelqu\'un (ADMIN).') - .addUserOption(option => option.setName("utilisateur").setDescription("L'utilisateur à qui enlever les warns").setRequired(true)), - async execute(client, interaction) { - if (!isMod(client, interaction.member) && !isAdmin(client, interaction.member)) { - return interaction.reply({ content: `Vous n'avez pas le droit d'exécuter cette commande !`, ephemeral: true }) - } - - const user = interaction.options.getMember("utilisateur") - - if(user.bot) { - return interaction.reply({ content: `Les bots n'ont pas de warns.`, ephemeral: true }) - } + data: new SlashCommandBuilder() + .setName("resetwarns") + .setDescription("Remettre à zéro les warns de quelqu'un (ADMIN).") + .addUserOption(option => + option + .setName("utilisateur") + .setDescription("L'utilisateur à qui enlever les warns") + .setRequired(true) + ), + async execute(client, interaction) { + if ( + !isMod(client, interaction.member) && + !isAdmin(client, interaction.member) + ) { + return interaction.reply({ + content: "Vous n'avez pas le droit d'exécuter cette commande !", + ephemeral: true, + }); + } - if(!await client.warnsdb.has(`${user.id}`, "warns")) { - return interaction.reply({ content: `${user.tag} n'a pas de warns.`, ephemeral: true }) - } + const user = interaction.options.getMember("utilisateur"); - await client.warnsdb.delete(`${user.id}`) - await interaction.reply({content: `Les warns de ${user.user.tag} ont été supprimés !`, ephemeral: true}) -} -} \ No newline at end of file + if (user.bot) { + return interaction.reply({ + content: "Les bots n'ont pas de warns.", + ephemeral: true, + }); + } + + if (!(await client.warnsdb.has(`${user.id}`, "warns"))) { + return interaction.reply({ + content: `${user.tag} n'a pas de warns.`, + ephemeral: true, + }); + } + + await client.warnsdb.delete(`${user.id}`); + await interaction.reply({ + content: `Les warns de ${user.user.tag} ont été supprimés !`, + ephemeral: true, + }); + }, +}; diff --git a/src/commands/server.js b/src/commands/server.js index b383ad2..3cf6b26 100644 --- a/src/commands/server.js +++ b/src/commands/server.js @@ -1,21 +1,27 @@ -const { SlashCommandBuilder } = require('@discordjs/builders'); -const { MessageEmbed } = require('discord.js'); +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); module.exports = { - data: new SlashCommandBuilder() - .setName('server') - .setDescription('Afficher des informations à propos du serveur.'), - async execute(client, interaction) { - const reply = new MessageEmbed() - .setColor('#0099ff') - .setTitle('Informations du serveur') - .setAuthor('AstralBot') - .addFields( - { name: 'Nom du serveur', value: `${interaction.guild.name}`}, - { name: 'Nombre de membres', value: `${interaction.guild.memberCount}`}, - ) - .setTimestamp() - .setFooter('Demandé par ' + interaction.user.username + "#" + interaction.user.discriminator, interaction.user.displayAvatarURL); - return interaction.reply({ embeds: [reply] }); - }, + data: new SlashCommandBuilder() + .setName("server") + .setDescription("Afficher des informations à propos du serveur."), + async execute(client, interaction) { + const reply = new MessageEmbed() + .setColor("#0099ff") + .setTitle("Informations du serveur") + .setAuthor("AstralBot") + .addFields( + { name: "Nom du serveur", value: `${interaction.guild.name}` }, + { name: "Nombre de membres", value: `${interaction.guild.memberCount}` } + ) + .setTimestamp() + .setFooter( + "Demandé par " + + interaction.user.username + + "#" + + interaction.user.discriminator, + interaction.user.displayAvatarURL + ); + return interaction.reply({ embeds: [reply] }); + }, }; diff --git a/src/commands/suggest.js b/src/commands/suggest.js index b9f5161..6be4af7 100644 --- a/src/commands/suggest.js +++ b/src/commands/suggest.js @@ -1,13 +1,18 @@ -const { SlashCommandBuilder } = require('@discordjs/builders'); -const sendSuggestion = require("../functions/sendSuggestion") +const { SlashCommandBuilder } = require("@discordjs/builders"); +const sendSuggestion = require("../functions/sendSuggestion"); module.exports = { - data: new SlashCommandBuilder() - .setName('suggest') - .setDescription('Suggérer quelque chose.') - .addStringOption(option => option.setName('suggestion').setDescription('Votre suggestion').setRequired(true)), - async execute(client, interaction) { - await sendSuggestion(interaction) - interaction.reply({content: "Suggestion envoyée !", ephemeral: true}) - }, + data: new SlashCommandBuilder() + .setName("suggest") + .setDescription("Suggérer quelque chose.") + .addStringOption(option => + option + .setName("suggestion") + .setDescription("Votre suggestion") + .setRequired(true) + ), + async execute(client, interaction) { + await sendSuggestion(interaction); + interaction.reply({ content: "Suggestion envoyée !", ephemeral: true }); + }, }; diff --git a/src/commands/user-info.js b/src/commands/user-info.js index 45831e2..6ceaa0b 100644 --- a/src/commands/user-info.js +++ b/src/commands/user-info.js @@ -1,24 +1,42 @@ -const { SlashCommandBuilder } = require('@discordjs/builders'); -const { MessageEmbed } = require('discord.js'); +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); module.exports = { - data: new SlashCommandBuilder() - .setName('userinfo') - .setDescription('Avoir des informations à propos de quelqu\'un.') - .addUserOption(option => option.setName('utilisateur').setDescription('Utilisateur dont les informations doivent être montrées').setRequired(true)), - async execute(client, interaction) { - const user = interaction.options.getUser('utilisateur'); - const reply = new MessageEmbed() - .setColor('#0099ff') - .setTitle('Informations d\'utilisateur') - .setAuthor('AstralBot') - .setThumbnail(interaction.options.getUser('utilisateur').displayAvatarURL()) - .addFields( - { name: 'Utilisateur', value: user.username + "#" + user.discriminator}, - { name: 'ID', value: user.id}, - ) - .setTimestamp() - .setFooter('Demandé par ' + interaction.user.username + "#" + interaction.user.discriminator, interaction.user.displayAvatarURL); - return interaction.reply({ embeds: [reply] }); - }, + data: new SlashCommandBuilder() + .setName("userinfo") + .setDescription("Avoir des informations à propos de quelqu'un.") + .addUserOption(option => + option + .setName("utilisateur") + .setDescription( + "Utilisateur dont les informations doivent être montrées" + ) + .setRequired(true) + ), + async execute(client, interaction) { + const user = interaction.options.getUser("utilisateur"); + const reply = new MessageEmbed() + .setColor("#0099ff") + .setTitle("Informations d'utilisateur") + .setAuthor("AstralBot") + .setThumbnail( + interaction.options.getUser("utilisateur").displayAvatarURL() + ) + .addFields( + { + name: "Utilisateur", + value: user.username + "#" + user.discriminator, + }, + { name: "ID", value: user.id } + ) + .setTimestamp() + .setFooter( + "Demandé par " + + interaction.user.username + + "#" + + interaction.user.discriminator, + interaction.user.displayAvatarURL + ); + return interaction.reply({ embeds: [reply] }); + }, }; diff --git a/src/commands/warn.js b/src/commands/warn.js index 9bcb7f8..616f728 100644 --- a/src/commands/warn.js +++ b/src/commands/warn.js @@ -1,74 +1,143 @@ -const { SlashCommandBuilder } = require('@discordjs/builders'); -const { MessageButton, MessageActionRow } = require("discord.js") +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageButton, MessageActionRow } = require("discord.js"); -const { isMod, isAdmin } = require("../functions/isModOrAdmin") +const { isMod, isAdmin } = require("../functions/isModOrAdmin"); module.exports = { - data: new SlashCommandBuilder() - .setName('warn') - .setDescription('Warn quelqu\'un (ADMIN).') - .addUserOption(option => option.setName("utilisateur").setDescription("L'utilisateur à warn").setRequired(true)) - .addStringOption(option => option.setName("raison").setDescription("La raison pour warn cet utilisateur").setRequired(true)), - async execute(client, interaction) { - - const author = interaction.member; - if (!isMod(client, author) && !isAdmin(client, author)) { - return interaction.reply({ content: `Vous n'avez pas le droit d'exécuter cette commande !`, ephemeral: true }) - } - - const user = interaction.options.getMember("utilisateur"); + data: new SlashCommandBuilder() + .setName("warn") + .setDescription("Warn quelqu'un (ADMIN).") + .addUserOption(option => + option + .setName("utilisateur") + .setDescription("L'utilisateur à warn") + .setRequired(true) + ) + .addStringOption(option => + option + .setName("raison") + .setDescription("La raison pour warn cet utilisateur") + .setRequired(true) + ), + async execute(client, interaction) { + const author = interaction.member; + if (!isMod(client, author) && !isAdmin(client, author)) { + return interaction.reply({ + content: "Vous n'avez pas le droit d'exécuter cette commande !", + ephemeral: true, + }); + } - if(user.bot) { - return interaction.reply({ content: `Vous ne pouvez pas warn des bots.`, ephemeral: true }) - } + const user = interaction.options.getMember("utilisateur"); - if(author.id === user.id) { - return interaction.reply({ content: `Vous ne pouvez pas vous warn vous-même.`, ephemeral: true }) - } + if (user.bot) { + return interaction.reply({ + content: "Vous ne pouvez pas warn des bots.", + ephemeral: true, + }); + } - const reason = interaction.options.getString("raison") + if (author.id === user.id) { + return interaction.reply({ + content: "Vous ne pouvez pas vous warn vous-même.", + ephemeral: true, + }); + } - if(!await client.warnsdb.has(`${user.id}`, "warns")) { - await client.warnsdb.set(`${user.id}`, { warns: [{ reason: reason }] }) - await user.send(`Vous avez été warn dans **${interaction.guild.name}** par ${author.user.username + "#" + author.user.discriminator} pour ${reason}`) - return interaction.reply({ content: `Vous avez warn **${user.user.username + "#" + user.user.discriminator}** pour \`${reason}\``, ephemeral: true }) - } else { - const warnings = await client.warnsdb.get(`${user.id}`, "warns") - warnings.push({ reason: reason }) - await client.warnsdb.set(`${user.id}`, warnings, "warns") - await user.send(`Vous avez été warn dans **${interaction.guild.name}** par ${author.user.username + "#" + author.user.discriminator} pour ${reason}`) - await interaction.reply({ content: `Vous avez warn **${user.user.username + "#" + user.user.discriminator}** pour \`${reason}\``, ephemeral: true }) - if (await client.warnsdb.get(`${interaction.guild.id}_${user.id}`, "warns") === 3) { - const row = new MessageActionRow() - .addComponents( - new MessageButton() - .setCustomId('oui') - .setLabel('Oui') - .setStyle('SUCCESS'), - new MessageButton() - .setCustomId('non') - .setLabel('Non') - .setStyle('DANGER'), - ); - await interaction.followUp({ content: `Cet utilisateur a maintenant 3 warns ! Voulez vous le bannir ?`, ephemeral: true, components: [row] }); - const filter = i => i.user.id === author.id; + const reason = interaction.options.getString("raison"); - const collector = interaction.channel.createMessageComponentCollector({ filter, time: 15000 }); + if (!(await client.warnsdb.has(`${user.id}`, "warns"))) { + await client.warnsdb.set(`${user.id}`, { warns: [{ reason: reason }] }); + await user.send( + `Vous avez été warn dans **${interaction.guild.name}** par ${ + author.user.username + "#" + author.user.discriminator + } pour ${reason}` + ); + return interaction.reply({ + content: `Vous avez warn **${ + user.user.username + "#" + user.user.discriminator + }** pour \`${reason}\``, + ephemeral: true, + }); + } else { + const warnings = await client.warnsdb.get(`${user.id}`, "warns"); + warnings.push({ reason: reason }); + await client.warnsdb.set(`${user.id}`, warnings, "warns"); + await user.send( + `Vous avez été warn dans **${interaction.guild.name}** par ${ + author.user.username + "#" + author.user.discriminator + } pour ${reason}` + ); + await interaction.reply({ + content: `Vous avez warn **${ + user.user.username + "#" + user.user.discriminator + }** pour \`${reason}\``, + ephemeral: true, + }); + if ( + (await client.warnsdb.get( + `${interaction.guild.id}_${user.id}`, + "warns" + )) === 3 + ) { + const row = new MessageActionRow().addComponents( + new MessageButton() + .setCustomId("oui") + .setLabel("Oui") + .setStyle("SUCCESS"), + new MessageButton() + .setCustomId("non") + .setLabel("Non") + .setStyle("DANGER") + ); + await interaction.followUp({ + content: + "Cet utilisateur a maintenant 3 warns ! Voulez vous le bannir ?", + ephemeral: true, + components: [row], + }); + const filter = i => i.user.id === author.id; - const reason = interaction.options.getString('raison'); + const collector = interaction.channel.createMessageComponentCollector({ + filter, + time: 15000, + }); - collector.on('collect', async i => { - if (i.customId === 'oui') { + const reason = interaction.options.getString("raison"); - await interaction.followUp({ content: `En train de bannir cet utilisateur...`, ephemeral: true }) - await user.send('Vous avez été banni de ' + interaction.guild.name + ' pour ' + reason + "."); - await user.ban({ reason: "3 warnings" }) - await interaction.followUp({ content: 'Vous avez banni ' + user.user.username + "#" + user.user.discriminator + ' avec succès !', components: [], ephemeral: true }); - }else{ - await interaction.followUp({ content: 'Opération annulée !', components: [], ephemeral: true }); - } + collector.on("collect", async i => { + if (i.customId === "oui") { + await interaction.followUp({ + content: "En train de bannir cet utilisateur...", + ephemeral: true, + }); + await user.send( + "Vous avez été banni de " + + interaction.guild.name + + " pour " + + reason + + "." + ); + await user.ban({ reason: "3 warnings" }); + await interaction.followUp({ + content: + "Vous avez banni " + + user.user.username + + "#" + + user.user.discriminator + + " avec succès !", + components: [], + ephemeral: true, + }); + } else { + await interaction.followUp({ + content: "Opération annulée !", + components: [], + ephemeral: true, }); } - } + }); + } } -} \ No newline at end of file + }, +}; diff --git a/src/commands/warnings.js b/src/commands/warnings.js index 23d5213..76104f6 100644 --- a/src/commands/warnings.js +++ b/src/commands/warnings.js @@ -1,32 +1,41 @@ -const { SlashCommandBuilder } = require('@discordjs/builders'); -const {MessageEmbed} = require("discord.js"); +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); -const { isMod, isAdmin} = require("../functions/isModOrAdmin") +const { isMod, isAdmin } = require("../functions/isModOrAdmin"); module.exports = { - data: new SlashCommandBuilder() - .setName('warnings') - .setDescription('Voir les warnings de quelqu\'un.') - .addUserOption(option => option.setName("utilisateur") - .setRequired(true) - .setDescription("L'utilsateur dont vous voulez voir les warns")), - async execute(client, interaction) { - if (!isMod(client, interaction.member) && !isAdmin(client, interaction.member)) { - return interaction.reply({ content: `Vous n'avez pas le droit d'exécuter cette commande !`, ephemeral: true }) - } - - const user = interaction.options.getMember("utilisateur") + data: new SlashCommandBuilder() + .setName("warnings") + .setDescription("Voir les warnings de quelqu'un.") + .addUserOption(option => + option + .setName("utilisateur") + .setRequired(true) + .setDescription("L'utilsateur dont vous voulez voir les warns") + ), + async execute(client, interaction) { + if ( + !isMod(client, interaction.member) && + !isAdmin(client, interaction.member) + ) { + return interaction.reply({ + content: "Vous n'avez pas le droit d'exécuter cette commande !", + ephemeral: true, + }); + } - const embed = new MessageEmbed() - .setAuthor(`Liste des warns de ${user.user.tag}`) - .setColor("#0099ff") - if(!await client.warnsdb.has(`${user.id}`, "warns")) - embed.description = "Cet utilisateur n'a aucun warns."; - else { - const warns = await client.warnsdb.get(`${user.id}`, "warns") - embed.description = warns.map(warn => "- " + warn.reason).join("\n") - } + const user = interaction.options.getMember("utilisateur"); - await interaction.reply({ embeds: [embed] }) + const embed = new MessageEmbed() + .setAuthor(`Liste des warns de ${user.user.tag}`) + .setColor("#0099ff"); + if (!(await client.warnsdb.has(`${user.id}`, "warns"))) + embed.description = "Cet utilisateur n'a aucun warns."; + else { + const warns = await client.warnsdb.get(`${user.id}`, "warns"); + embed.description = warns.map(warn => "- " + warn.reason).join("\n"); } -} \ No newline at end of file + + await interaction.reply({ embeds: [embed] }); + }, +}; diff --git a/src/deploy-commands.js b/src/deploy-commands.js index e9de702..a32a08b 100644 --- a/src/deploy-commands.js +++ b/src/deploy-commands.js @@ -1,18 +1,26 @@ -const fs = require('fs'); -const { REST } = require('@discordjs/rest'); -const { Routes } = require('discord-api-types/v9'); -require('dotenv').config(); +const fs = require("fs"); +const { REST } = require("@discordjs/rest"); +const { Routes } = require("discord-api-types/v9"); +require("dotenv").config(); const commands = []; -const commandFiles = fs.readdirSync('./src/commands').filter(file => file.endsWith('.js')); +const commandFiles = fs + .readdirSync("./src/commands") + .filter(file => file.endsWith(".js")); for (const file of commandFiles) { - const command = require(`./commands/${file}`); - commands.push(command.data.toJSON()); + const command = require(`./commands/${file}`); + commands.push(command.data.toJSON()); } -const rest = new REST({ version: '9' }).setToken(process.env.TOKEN); +const rest = new REST({ version: "9" }).setToken(process.env.TOKEN); -rest.put(Routes.applicationGuildCommands(process.env.CLIENTID, process.env.GUILDID), { body: commands }) - .then(() => console.log('Commandes établies avec succès !')) - .catch(console.error); +rest + .put( + Routes.applicationGuildCommands(process.env.CLIENTID, process.env.GUILDID), + { body: commands } + ) + // eslint-disable-next-line no-console + .then(() => console.log("Commands établies avec succès !")) + // eslint-disable-next-line no-console + .catch(console.error); diff --git a/src/events/guildBanAdd.js b/src/events/guildBanAdd.js index 78ddb5c..cc44788 100644 --- a/src/events/guildBanAdd.js +++ b/src/events/guildBanAdd.js @@ -1,18 +1,20 @@ -const {MessageEmbed} = require("discord.js"); +const { MessageEmbed } = require("discord.js"); module.exports = { - name: "guildBanAdd", - async execute(client, ban) { - if (ban.partial) ban = await ban.fetch() + name: "guildBanAdd", + async execute(client, ban) { + if (ban.partial) ban = await ban.fetch(); - const embed = new MessageEmbed() - .setAuthor(`Membre banni`) - .setColor("#ff1500") - .setTimestamp(Date.now()) - .setThumbnail(ban.user.avatarURL({ dynamic: true })) - .addField("Utilisateur :", `${ban.user.id}`, true) - .addField("Raison :", ban.reason, true) + const embed = new MessageEmbed() + .setAuthor("Membre banni") + .setColor("#ff1500") + .setTimestamp(Date.now()) + .setThumbnail(ban.user.avatarURL({ dynamic: true })) + .addField("Utilisateur :", `${ban.user.id}`, true) + .addField("Raison :", ban.reason, true); - const channel = await ban.guild.channels.fetch(client.config.logs.modChannelId) - await channel.send({ embeds: [embed] }) - } -} \ No newline at end of file + const channel = await ban.guild.channels.fetch( + client.config.logs.modChannelId + ); + await channel.send({ embeds: [embed] }); + }, +}; diff --git a/src/events/guildBanRemove.js b/src/events/guildBanRemove.js index e264a0c..fd061a8 100644 --- a/src/events/guildBanRemove.js +++ b/src/events/guildBanRemove.js @@ -1,16 +1,18 @@ -const {MessageEmbed} = require("discord.js"); +const { MessageEmbed } = require("discord.js"); module.exports = { - name: "guildBanRemove", - async execute(client, ban) { - const embed = new MessageEmbed() - .setAuthor(`Membre dé-banni`) - .setColor("#84ff00") - .setTimestamp(Date.now()) - .setThumbnail(ban.user.avatarURL({ dynamic: true })) - .addField("Utilisateur :", `${ban.user.id}`, true) - .addField("Raison du ban :", ban.reason, true) + name: "guildBanRemove", + async execute(client, ban) { + const embed = new MessageEmbed() + .setAuthor("Membre dé-banni") + .setColor("#84ff00") + .setTimestamp(Date.now()) + .setThumbnail(ban.user.avatarURL({ dynamic: true })) + .addField("Utilisateur :", `${ban.user.id}`, true) + .addField("Raison du ban :", ban.reason, true); - const channel = await ban.guild.channels.fetch(client.config.logs.modChannelId) - await channel.send({ embeds: [embed] }) - } -} \ No newline at end of file + const channel = await ban.guild.channels.fetch( + client.config.logs.modChannelId + ); + await channel.send({ embeds: [embed] }); + }, +}; diff --git a/src/events/guildMemberAdd.js b/src/events/guildMemberAdd.js index 01e52a0..9f1031b 100644 --- a/src/events/guildMemberAdd.js +++ b/src/events/guildMemberAdd.js @@ -1,18 +1,19 @@ -const sendWelcomeImage = require('../functions/sendWelcomeImage'); -const {MessageEmbed} = require("discord.js"); +const sendWelcomeImage = require("../functions/sendWelcomeImage"); +const { MessageEmbed } = require("discord.js"); module.exports = { - name: "guildMemberAdd", - async execute(client, member) { + name: "guildMemberAdd", + async execute(client, member) { + const embed = new MessageEmbed() + .setAuthor("Un membre a rejoint le serveur") + .setColor("#0099ff") + .setTimestamp(Date.now()) + .setThumbnail(member.avatarURL({ dynamic: true })) + .addField("Utilisateur :", `${member.id}`, true); + const channel = await member.guild.channels.fetch( + client.config.logs.joinsChannelId + ); + await channel.send({ embeds: [embed] }); - const embed = new MessageEmbed() - .setAuthor("Un membre a rejoint le serveur") - .setColor("#0099ff") - .setTimestamp(Date.now()) - .setThumbnail(member.avatarURL({ dynamic: true })) - .addField("Utilisateur :", `${member.id}`, true) - const channel = await member.guild.channels.fetch(client.config.logs.joinsChannelId) - await channel.send({embeds: [embed]}) - - await sendWelcomeImage(client, member) - } -} \ No newline at end of file + await sendWelcomeImage(client, member); + }, +}; diff --git a/src/events/guildMemberRemove.js b/src/events/guildMemberRemove.js index b0ad748..c77920f 100644 --- a/src/events/guildMemberRemove.js +++ b/src/events/guildMemberRemove.js @@ -1,39 +1,44 @@ -const {MessageEmbed} = require("discord.js"); +const { MessageEmbed } = require("discord.js"); module.exports = { - name: "guildMemberRemove", - async execute(client, member) { - const fetchedLogs = await member.guild.fetchAuditLogs({ - limit: 1, - type: 'MEMBER_KICK', - }); - const kickLog = fetchedLogs.entries.first(); + name: "guildMemberRemove", + async execute(client, member) { + const fetchedLogs = await member.guild.fetchAuditLogs({ + limit: 1, + type: "MEMBER_KICK", + }); + const kickLog = fetchedLogs.entries.first(); - if (kickLog) { - let {executor, target, reason} = kickLog; - if (target.id === member.id) { - if (!reason) reason = "Aucune raison spécifiée" + if (kickLog) { + const { executor, target } = kickLog; + let reason = kickLog; + if (target.id === member.id) { + if (!reason) reason = "Aucune raison spécifiée"; - const embed = new MessageEmbed() - .setAuthor("Membre expulsé") - .setColor("#ff1500") - .setTimestamp(Date.now()) - .setThumbnail(target.avatarURL({dynamic: true})) - .addField("Utilisateur :", `${target.id}`, true) - .addField("Modérateur :", `<@${executor.id}>`, true) - .addField("Raison :", reason, true) - - const channel = await member.guild.channels.fetch(client.config.logs.modChannelId) - await channel.send({embeds: [embed]}) - return - } - } const embed = new MessageEmbed() - .setAuthor("Un membre a quitté le serveur") - .setColor("#0099ff") - .setTimestamp(Date.now()) - .setThumbnail(member.avatarURL({ dynamic: true })) - .addField("Utilisateur :", `${member.id}`, true) - const channel = await member.guild.channels.fetch(client.config.logs.joinsChannelId) - await channel.send({embeds: [embed]}) + .setAuthor("Membre expulsé") + .setColor("#ff1500") + .setTimestamp(Date.now()) + .setThumbnail(target.avatarURL({ dynamic: true })) + .addField("Utilisateur :", `${target.id}`, true) + .addField("Modérateur :", `<@${executor.id}>`, true) + .addField("Raison :", reason, true); + + const channel = await member.guild.channels.fetch( + client.config.logs.modChannelId + ); + await channel.send({ embeds: [embed] }); + return; + } } -} \ No newline at end of file + const embed = new MessageEmbed() + .setAuthor("Un membre a quitté le serveur") + .setColor("#0099ff") + .setTimestamp(Date.now()) + .setThumbnail(member.avatarURL({ dynamic: true })) + .addField("Utilisateur :", `${member.id}`, true); + const channel = await member.guild.channels.fetch( + client.config.logs.joinsChannelId + ); + await channel.send({ embeds: [embed] }); + }, +}; diff --git a/src/events/interactionCreate.js b/src/events/interactionCreate.js index dd6eec4..312a274 100644 --- a/src/events/interactionCreate.js +++ b/src/events/interactionCreate.js @@ -1,235 +1,329 @@ -const {Permissions, MessageEmbed, MessageAttachment, MessageActionRow, MessageButton, MessageSelectMenu } = require("discord.js"); -const getCaptcha = require("../functions/generateCaptcha") -const handleSuggestionVotes = require("../functions/handleSuggestionVotes") -const createTicket = require("../functions/createTicket") -const getChannelTranscript = require("../functions/getChannelTranscript") +const { + Permissions, + MessageEmbed, + MessageAttachment, + MessageActionRow, + MessageButton, + MessageSelectMenu, +} = require("discord.js"); +const getCaptcha = require("../functions/generateCaptcha"); +const handleSuggestionVotes = require("../functions/handleSuggestionVotes"); +const createTicket = require("../functions/createTicket"); +const getChannelTranscript = require("../functions/getChannelTranscript"); module.exports = { - name: "interactionCreate", - async execute(client, interaction) { - if (interaction.isCommand()) { - const command = interaction.client.commands.get(interaction.commandName); + name: "interactionCreate", + async execute(client, interaction) { + if (interaction.isCommand()) { + const command = interaction.client.commands.get(interaction.commandName); - if (!command) return; + if (!command) return; - if (command.voiceChannel) { - if (!interaction.member.voice.channel) return interaction.reply({content: `${interaction.user}, vous n'êtes pas dans un salon vocal. ❌`, ephemeral: true}); + if (command.voiceChannel) { + if (!interaction.member.voice.channel) + return interaction.reply({ + content: `${interaction.user}, vous n'êtes pas dans un salon vocal. ❌`, + ephemeral: true, + }); - if (interaction.guild.me.voice.channel && interaction.member.voice.channel.id !== interaction.guild.me.voice.channel.id) return interaction.reply({content: `${interaction.user}, vous n'êtes pas dans le même salon vocal que moi. ❌`, ephemeral: true}); - } + if ( + interaction.guild.me.voice.channel && + interaction.member.voice.channel.id !== + interaction.guild.me.voice.channel.id + ) + return interaction.reply({ + content: `${interaction.user}, vous n'êtes pas dans le même salon vocal que moi. ❌`, + ephemeral: true, + }); + } - try { - await command.execute(client, interaction); - } catch (error) { - console.error(error); - return interaction.reply( - {content: 'Une erreur s\'est produite pendant l\'exécution de cette commande !', ephemeral: true}); - } - } else if (interaction.isButton()) { - if (interaction.customId === "commencer") { - let invalid = 0; - const captcha = getCaptcha(); - const { buffer } = captcha; - const toggle = true; - const attachment = new MessageAttachment(buffer, "captcha.png") - const embed = new MessageEmbed() - .setTitle("(1/2) · Vérification anti-robot") - .setDescription("Vous n'êtes pas un robot ? Alors prouvez-le ! Pour cela, écrivez les lettres que " + - "vous voyez sur l'image ci-dessous, rien de plus simple !") - .setImage("attachment://captcha.png") - .setColor("#0099ff") - .setTimestamp(Date.now()) - await interaction.channel.permissionOverwrites.create(interaction.member, { SEND_MESSAGES: true }) - await interaction.reply({ - embeds: [embed], - ephemeral: true, - files: [attachment] - }); + try { + await command.execute(client, interaction); + } catch (error) { + client.logger.error(error); + return interaction.reply({ + content: + "Une erreur s'est produite pendant l'exécution de cette commande !", + ephemeral: true, + }); + } + } else if (interaction.isButton()) { + if (interaction.customId === "commencer") { + let invalid = 0; + const captcha = getCaptcha(); + const { buffer } = captcha; + const toggle = true; + const attachment = new MessageAttachment(buffer, "captcha.png"); + const embed = new MessageEmbed() + .setTitle("(1/2) · Vérification anti-robot") + .setDescription( + "Vous n'êtes pas un robot ? Alors prouvez-le ! Pour cela, écrivez les lettres que " + + "vous voyez sur l'image ci-dessous, rien de plus simple !" + ) + .setImage("attachment://captcha.png") + .setColor("#0099ff") + .setTimestamp(Date.now()); + await interaction.channel.permissionOverwrites.create( + interaction.member, + { SEND_MESSAGES: true } + ); + await interaction.reply({ + embeds: [embed], + ephemeral: true, + files: [attachment], + }); - let filter = m => m.author.id === interaction.user.id; + const filter = m => m.author.id === interaction.user.id; - let collector = interaction.channel.createMessageCollector({ filter, time: 60000 }); - let fuckterval = setInterval(() => { - if (!interaction.guild.members.cache.get(interaction.user.id)) { - collector.stop(); - } - }, 3000); - - collector.on('collect', async message => { - if (!message.content) return; - await message.delete(); - if (message.content.toUpperCase() !== captcha.text) { - invalid++; - if (invalid > 2 && toggle === true) { - if (interaction.member.kickable) { - await interaction.followUp({ - content: ':x: | **Trop d\'essais de captcha, kick de l\'utilisateur.**', - ephemeral: true - }); - interaction.member.send('Vous avez été kick pour trop d\'essais de captcha invalides'); - await interaction.member.kick('Trop d\'essais de captcha invalides'); - return; - } - collector.stop(); - return; - } - await interaction.followUp({ - content: `:x: | **Code invalide, veuillez réessayer. Il vous reste ${3 - invalid} essais**`, - ephemeral: true - }); - } else { - try { - await interaction.channel.permissionOverwrites.create(interaction.member, { SEND_MESSAGES: false }) - collector.stop(); - const rearow = new MessageActionRow() - .addComponents( - new MessageSelectMenu() - .setCustomId('selectsetup') - .setPlaceholder('Rien de selectioné') - .setMinValues(0) - .setMaxValues(2) - .addOptions([ - { - label: 'Annonces', - description: 'Annonces', - value: 'Annonces', - }, - { - label: 'Vidéos & Lives', - description: 'Vidéos & Lives', - value: 'Vidéos', - }, - ]), - ); - const rearow2 = new MessageActionRow() - .addComponents( - new MessageButton() - .setCustomId("selectsetup_validation") - .setLabel("Valider") - .setStyle("SUCCESS") - ) - const reaembed = new MessageEmbed() - .setTitle(`(2/2) · A présent, choisissez vos rôles de notification !`) - .setColor("#0099ff") - .setDescription("Maintenant que je suis sûr que vous n'êtes pas un robot, veuillez " + - "choisir ci-dessous les notifications que vous voulez recevoir (Vous pourrez toujours " + - "les changer plus tard).") - await interaction.followUp({embeds: [reaembed], components: [rearow, rearow2], ephemeral: true}) - } catch (e) { - collector.stop(); - await interaction.followUp({ - content: ':x: | **Une erreur est survenue**', - ephemeral: true - }); - console.error(e) - } - } - }); - collector.on('end', async (collected, reason) => { - clearInterval(fuckterval); - if (reason === 'time' && toggle === true) { - if (interaction.member.kickable) { - await interaction.followUp({ - content: '**L\'utilisateur à été kick pour ne pas avoir répondu à temps.**', - ephemeral: true - }); - await interaction.member.kick('N\'a pas répondu au captcha à temps'); - } - } - }); - } else if (interaction.customId === "delete_suggestion") { - if (interaction.member.id === interaction.message.member.id || - interaction.memberPermissions.has(Permissions.FLAGS.MANAGE_MESSAGES)) { - await interaction.deferUpdate() - await interaction.message.delete() - } else { - await interaction.reply({ content: "Vous n'êtes pas autorisé(e) à supprimer ce message", ephemeral: true }) - } - } else if (interaction.customId === "selectsetup_validation") { - await interaction.member.roles.add("906149050510876674"); - await interaction.deferUpdate() - } else if (interaction.customId === "upvote" || interaction.customId === "downvote") { - await handleSuggestionVotes(interaction) - } else if (interaction.customId === "create-ticket") { - await createTicket(interaction) - } else if (interaction.customId === "close-ticket") { - await interaction.reply({ - content: "Voulez-vous vraiment supprimer le ticket ? Cette action est irréversible", - components: [ - new MessageActionRow() - .addComponents([ - new MessageButton({ - label: "Supprimer le ticket", - style: "SUCCESS", - custom_id: "close-ticket-validation" - }), - new MessageButton({ - label: "Annuler", - style: "DANGER", - custom_id: "close-ticket-cancel" - }) - ]) - ], - ephemeral: true - }) - const filter = i => i.user.id === interaction.user.id; - const collector = interaction.channel.createMessageComponentCollector({ filter: filter, time: 15000 }); + const collector = interaction.channel.createMessageCollector({ + filter, + time: 60000, + }); + const fuckterval = setInterval(() => { + if (!interaction.guild.members.cache.get(interaction.user.id)) { + collector.stop(); + } + }, 3000); - collector.on("collect", async i => { - if (i.customId === "close-ticket-validation") { - const channelName = i.channel.name - const transcript = await getChannelTranscript(interaction.channel) - const attachment = new MessageAttachment(transcript, "transcription.txt") - if (interaction.channel && interaction.channel.deletable) await interaction.channel.delete() - await i.user.send({ - embeds: [{ - author: { name: "Ticket supprimé" }, - description: `Vous avez supprimé le ticket \`${channelName}\`, voici la transcription ` + - "des messages de celui-ci", - color: "#0099ff" - }] - }) - await i.user.send({ files: [attachment] }) - } else if (i.customId === "close-ticket-cancel") { - await i.update({ content: "Opération annulée", components: [], ephemeral: true }) - } - }) - }else if (interaction.customId === "saveTrack") { - const queue = client.player.getQueue(interaction.guildId); - if (!queue || !queue.playing) return interaction.reply({ content: `Aucune musique est jouée. ❌`, ephemeral: true, components: [] }); - - interaction.member.send(`Vous avez sauvegardé la musique ${queue.current.title} | ${queue.current.author} dans le serveur ${interaction.member.guild.name} ✅`).then(() => { - return interaction.reply({ content: `Je vous ai envoyé le nom de la musique en DM ✅`, ephemeral: true, components: [] }); - }).catch(error => { - return interaction.reply({ content: `Je n'ai pas réussi à vous envoyer un DM ❌`, ephemeral: true, components: [] }); + collector.on("collect", async message => { + if (!message.content) return; + await message.delete(); + if (message.content.toUpperCase() !== captcha.text) { + invalid++; + if (invalid > 2 && toggle === true) { + if (interaction.member.kickable) { + await interaction.followUp({ + content: + ":x: | **Trop d'essais de captcha, kick de l'utilisateur.**", + ephemeral: true, }); + interaction.member.send( + "Vous avez été kick pour trop d'essais de captcha invalides" + ); + await interaction.member.kick( + "Trop d'essais de captcha invalides" + ); + return; + } + collector.stop(); + return; + } + await interaction.followUp({ + content: `:x: | **Code invalide, veuillez réessayer. Il vous reste ${ + 3 - invalid + } essais**`, + ephemeral: true, + }); + } else { + try { + await interaction.channel.permissionOverwrites.create( + interaction.member, + { SEND_MESSAGES: false } + ); + collector.stop(); + const rearow = new MessageActionRow().addComponents( + new MessageSelectMenu() + .setCustomId("selectsetup") + .setPlaceholder("Rien de selectioné") + .setMinValues(0) + .setMaxValues(2) + .addOptions([ + { + label: "Annonces", + description: "Annonces", + value: "Annonces", + }, + { + label: "Vidéos & Lives", + description: "Vidéos & Lives", + value: "Vidéos", + }, + ]) + ); + const rearow2 = new MessageActionRow().addComponents( + new MessageButton() + .setCustomId("selectsetup_validation") + .setLabel("Valider") + .setStyle("SUCCESS") + ); + const reaembed = new MessageEmbed() + .setTitle( + "(2/2) · A présent, choisissez vos rôles de notification !" + ) + .setColor("#0099ff") + .setDescription( + "Maintenant que je suis sûr que vous n'êtes pas un robot, veuillez " + + "choisir ci-dessous les notifications que vous voulez recevoir (Vous pourrez toujours " + + "les changer plus tard)." + ); + await interaction.followUp({ + embeds: [reaembed], + components: [rearow, rearow2], + ephemeral: true, + }); + } catch (e) { + collector.stop(); + await interaction.followUp({ + content: ":x: | **Une erreur est survenue**", + ephemeral: true, + }); + client.logger.error(e); } - } else if (interaction.isSelectMenu()) { - const { customId, values, member } = interaction; + } + }); + collector.on("end", async (collected, reason) => { + clearInterval(fuckterval); + if (reason === "time" && toggle === true) { + if (interaction.member.kickable) { + await interaction.followUp({ + content: + "**L'utilisateur à été kick pour ne pas avoir répondu à temps.**", + ephemeral: true, + }); + await interaction.member.kick( + "N'a pas répondu au captcha à temps" + ); + } + } + }); + } else if (interaction.customId === "delete_suggestion") { + if ( + interaction.member.id === interaction.message.member.id || + interaction.memberPermissions.has(Permissions.FLAGS.MANAGE_MESSAGES) + ) { + await interaction.deferUpdate(); + await interaction.message.delete(); + } else { + await interaction.reply({ + content: "Vous n'êtes pas autorisé(e) à supprimer ce message", + ephemeral: true, + }); + } + } else if (interaction.customId === "selectsetup_validation") { + await interaction.member.roles.add("906149050510876674"); + await interaction.deferUpdate(); + } else if ( + interaction.customId === "upvote" || + interaction.customId === "downvote" + ) { + await handleSuggestionVotes(interaction); + } else if (interaction.customId === "create-ticket") { + await createTicket(interaction); + } else if (interaction.customId === "close-ticket") { + await interaction.reply({ + content: + "Voulez-vous vraiment supprimer le ticket ? Cette action est irréversible", + components: [ + new MessageActionRow().addComponents([ + new MessageButton({ + label: "Supprimer le ticket", + style: "SUCCESS", + custom_id: "close-ticket-validation", + }), + new MessageButton({ + label: "Annuler", + style: "DANGER", + custom_id: "close-ticket-cancel", + }), + ]), + ], + ephemeral: true, + }); + const filter = i => i.user.id === interaction.user.id; + const collector = interaction.channel.createMessageComponentCollector({ + filter: filter, + time: 15000, + }); - if (customId === 'select' || customId === "selectsetup") { - const component = interaction.component - const removed = component.options.filter((option) => { - return !values.includes(option.value) - }) + collector.on("collect", async i => { + if (i.customId === "close-ticket-validation") { + const channelName = i.channel.name; + const transcript = await getChannelTranscript(interaction.channel); + const attachment = new MessageAttachment( + transcript, + "transcription.txt" + ); + if (interaction.channel && interaction.channel.deletable) + await interaction.channel.delete(); + await i.user.send({ + embeds: [ + { + author: { name: "Ticket supprimé" }, + description: + `Vous avez supprimé le ticket \`${channelName}\`, voici la transcription ` + + "des messages de celui-ci", + color: "#0099ff", + }, + ], + }); + await i.user.send({ files: [attachment] }); + } else if (i.customId === "close-ticket-cancel") { + await i.update({ + content: "Opération annulée", + components: [], + ephemeral: true, + }); + } + }); + } else if (interaction.customId === "saveTrack") { + const queue = client.player.getQueue(interaction.guildId); + if (!queue || !queue.playing) + return interaction.reply({ + content: "Aucune musique est jouée. ❌", + ephemeral: true, + components: [], + }); - for (const id of removed) { - await member.roles.remove(interaction.guild.roles.cache.find(role => role.name === id.value).id) - } + interaction.member + .send( + `Vous avez sauvegardé la musique ${queue.current.title} | ${queue.current.author} dans le serveur ${interaction.member.guild.name} ✅` + ) + .then(() => { + return interaction.reply({ + content: "Je vous ai envoyé le nom de la musique en DM ✅", + ephemeral: true, + components: [], + }); + }) + .catch(() => { + return interaction.reply({ + content: "Je n'ai pas réussi à vous envoyer un DM ❌", + ephemeral: true, + components: [], + }); + }); + } + } else if (interaction.isSelectMenu()) { + const { customId, values, member } = interaction; - for (const id of values) { - await member.roles.add(interaction.guild.roles.cache.find(role => role.name === id).id) - } + if (customId === "select" || customId === "selectsetup") { + const component = interaction.component; + const removed = component.options.filter(option => { + return !values.includes(option.value); + }); - if (customId === 'select') { - await interaction.reply({ - content: "Rôles mis à jour !", - ephemeral: true - }) - return - } - await interaction.deferUpdate() - } + for (const id of removed) { + await member.roles.remove( + interaction.guild.roles.cache.find(role => role.name === id.value) + .id + ); + } + + for (const id of values) { + await member.roles.add( + interaction.guild.roles.cache.find(role => role.name === id).id + ); + } + + if (customId === "select") { + await interaction.reply({ + content: "Rôles mis à jour !", + ephemeral: true, + }); + return; } + await interaction.deferUpdate(); + } } -} \ No newline at end of file + }, +}; diff --git a/src/events/messageCreate.js b/src/events/messageCreate.js index 84a22aa..1bc3b88 100644 --- a/src/events/messageCreate.js +++ b/src/events/messageCreate.js @@ -1,26 +1,38 @@ const sendSuggestion = require("../functions/sendSuggestion"); -const translate = require("../functions/translate"); -const { MessageEmbed } = require("discord.js") module.exports = { - name: "messageCreate", - async execute(client, message) { - if (message.author.bot) return + name: "messageCreate", + async execute(client, message) { + if (message.author.bot) return; - if (message.channelId === client.config.suggestionChannelId){ - await sendSuggestion(message) - await message.delete() - } + if (message.channelId === client.config.suggestionChannelId) { + await sendSuggestion(message); + await message.delete(); + } - if (message.channel.id === client.config.countingChannelId) { - const currentNumber = await client.countdb.get(`${message.guild.id}`, "currentNumber") - if (isNaN(message.content)) return message.delete() - const authorid = await client.countdb.get(`${message.guild.id}`, "author") - const proposedNumber = parseInt(message.content); - if (message.author.id === authorid) return message.delete(); - if (proposedNumber - 1 !== currentNumber) return message.delete(); - await client.countdb.set(`${message.guild.id}`, proposedNumber, "currentNumber"); - await client.countdb.set(`${message.guild.id}`, message.author.id, "author"); - } + if (message.channel.id === client.config.countingChannelId) { + const currentNumber = await client.countdb.get( + `${message.guild.id}`, + "currentNumber" + ); + if (isNaN(message.content)) return message.delete(); + const authorid = await client.countdb.get( + `${message.guild.id}`, + "author" + ); + const proposedNumber = parseInt(message.content); + if (message.author.id === authorid) return message.delete(); + if (proposedNumber - 1 !== currentNumber) return message.delete(); + await client.countdb.set( + `${message.guild.id}`, + proposedNumber, + "currentNumber" + ); + await client.countdb.set( + `${message.guild.id}`, + message.author.id, + "author" + ); } -} \ No newline at end of file + }, +}; diff --git a/src/events/messageDelete.js b/src/events/messageDelete.js index e53d8a1..6cbd943 100644 --- a/src/events/messageDelete.js +++ b/src/events/messageDelete.js @@ -1,23 +1,28 @@ -const {MessageEmbed} = require("discord.js"); +const { MessageEmbed } = require("discord.js"); module.exports = { - name: "messageDelete", - async execute(client, message) { - if ((!message.author && !message.content) || message.author.bot) return - if (message.channelId === client.config.verifChannelId || - message.channelId === client.config.logs.messagesChannelId) return + name: "messageDelete", + async execute(client, message) { + if ((!message.author && !message.content) || message.author.bot) return; + if ( + message.channelId === client.config.verifChannelId || + message.channelId === client.config.logs.messagesChannelId + ) + return; - const embed = new MessageEmbed() - .setAuthor(`Un message de ${message.author.tag} a été supprimé`) - .setColor("#ff1500") - .setTimestamp(Date.now()) - .setTitle("Contenu du message :") - .setThumbnail(message.author.avatarURL({ dynamic: true })) - .addField("ID de l'auteur du message :", `${message.author.id}`, true) - .addField("Salon :", `<#${message.channel.id}>`, true) - .setDescription(message.content) + const embed = new MessageEmbed() + .setAuthor(`Un message de ${message.author.tag} a été supprimé`) + .setColor("#ff1500") + .setTimestamp(Date.now()) + .setTitle("Contenu du message :") + .setThumbnail(message.author.avatarURL({ dynamic: true })) + .addField("ID de l'auteur du message :", `${message.author.id}`, true) + .addField("Salon :", `<#${message.channel.id}>`, true) + .setDescription(message.content); - const channel = await message.guild.channels.fetch(client.config.logs.messagesChannelId) - await channel.send({ embeds: [embed] }) - } -} \ No newline at end of file + const channel = await message.guild.channels.fetch( + client.config.logs.messagesChannelId + ); + await channel.send({ embeds: [embed] }); + }, +}; diff --git a/src/events/messageUpdate.js b/src/events/messageUpdate.js index 95862a5..c053218 100644 --- a/src/events/messageUpdate.js +++ b/src/events/messageUpdate.js @@ -1,28 +1,33 @@ -const {MessageEmbed} = require("discord.js"); +const { MessageEmbed } = require("discord.js"); module.exports = { - name: "messageUpdate", - async execute(client, old, new_) { - if (new_.channelId === client.config.verifChannelId || - new_.channelId === client.config.logs.messagesChannelId || - new_.author.bot) return + name: "messageUpdate", + async execute(client, old, new_) { + if ( + new_.channelId === client.config.verifChannelId || + new_.channelId === client.config.logs.messagesChannelId || + new_.author.bot + ) + return; - const embed = new MessageEmbed() - .setAuthor(`Message modifié par ${new_.author.tag}`) - .setColor("#0099ff") - .setTimestamp(Date.now()) - .setTitle("Contenu de l'ancien message :") - .setThumbnail(new_.author.avatarURL({ dynamic: true })) - .addField("ID de l'auteur du message :", `${new_.author.id}`, true) - .addField("Lien du message :", old.url, true) + const embed = new MessageEmbed() + .setAuthor(`Message modifié par ${new_.author.tag}`) + .setColor("#0099ff") + .setTimestamp(Date.now()) + .setTitle("Contenu de l'ancien message :") + .setThumbnail(new_.author.avatarURL({ dynamic: true })) + .addField("ID de l'auteur du message :", `${new_.author.id}`, true) + .addField("Lien du message :", old.url, true); - if (old.content) { - embed.setDescription(old.content) - } else { - embed.setDescription("Ancien contenu du message indisponible") - } - - const channel = await new_.guild.channels.fetch(client.config.logs.messagesChannelId) - await channel.send({ embeds: [embed] }) + if (old.content) { + embed.setDescription(old.content); + } else { + embed.setDescription("Ancien contenu du message indisponible"); } -} \ No newline at end of file + + const channel = await new_.guild.channels.fetch( + client.config.logs.messagesChannelId + ); + await channel.send({ embeds: [embed] }); + }, +}; diff --git a/src/events/ready.js b/src/events/ready.js index 1d460d7..f199f96 100644 --- a/src/events/ready.js +++ b/src/events/ready.js @@ -1,61 +1,59 @@ -const {MessageEmbed} = require("discord.js"); -const cron = require("node-cron") -const updateSubCount = require('../functions/updateSubCount'); +const { MessageEmbed } = require("discord.js"); +const cron = require("node-cron"); +const updateSubCount = require("../functions/updateSubCount"); module.exports = { - name: "ready", - once: true, - async execute(client) { - client.logger.info(`Connecté à discord en tant que ${client.user.tag} (Id : ${client.user.id})`); - - const embed = new MessageEmbed() - .setAuthor("Bot en ligne !") - const channel = await ( - await client.guilds.fetch(client.config.mainGuildId)).channels.fetch(client.config.logs.botChannelId) - await channel.send({ embeds: [embed] }) - - const activities = [ - "s'abonner à Astral", - `${(await client.guilds.fetch(client.config.mainGuildId)).memberCount} membres ! 🎉`, - `RASTIQ & Léo-21` - ] - - const activprefix = [ - "PLAYING", - "WATCHING", - "WATCHING" - ] - - - - // Repeat every 20 minutes - cron.schedule("*/20 * * * *", async () => { - updateSubCount(client) - }) - - const setPresence = function(number) { - client.user.setPresence({ - status: "dnd", - activities: [{ name: activities[number], type: activprefix[number] }], - }) - } - - setPresence(0) - setTimeout(function(){ - setPresence(1) - setTimeout(function(){ - setPresence(2) - }, 10000); + name: "ready", + once: true, + async execute(client) { + client.logger.info( + `Connecté à discord en tant que ${client.user.tag} (Id : ${client.user.id})` + ); + + const embed = new MessageEmbed().setAuthor("Bot en ligne !"); + const channel = await ( + await client.guilds.fetch(client.config.mainGuildId) + ).channels.fetch(client.config.logs.botChannelId); + await channel.send({ embeds: [embed] }); + + const activities = [ + "s'abonner à Astral", + `${ + (await client.guilds.fetch(client.config.mainGuildId)).memberCount + } membres ! 🎉`, + "RASTIQ & Léo-21", + ]; + + const activprefix = ["PLAYING", "WATCHING", "WATCHING"]; + + // Repeat every 20 minutes + cron.schedule("*/20 * * * *", async () => { + updateSubCount(client); + }); + + const setPresence = function (number) { + client.user.setPresence({ + status: "dnd", + activities: [{ name: activities[number], type: activprefix[number] }], + }); + }; + + setPresence(0); + setTimeout(function () { + setPresence(1); + setTimeout(function () { + setPresence(2); + }, 10000); + }, 10000); + + setInterval(async () => { + setPresence(0); + setTimeout(function () { + setPresence(1); + setTimeout(function () { + setPresence(2); }, 10000); - - setInterval(async () => { - setPresence(0) - setTimeout(function(){ - setPresence(1) - setTimeout(function(){ - setPresence(2) - }, 10000); - }, 10000); - }, 30000) - } -} \ No newline at end of file + }, 10000); + }, 30000); + }, +}; diff --git a/src/functions/createTicket.js b/src/functions/createTicket.js index 005fcd8..4c28211 100644 --- a/src/functions/createTicket.js +++ b/src/functions/createTicket.js @@ -1,58 +1,69 @@ -const {MessageEmbed, MessageActionRow, MessageButton, Permissions} = require("discord.js"); +const { + MessageEmbed, + MessageActionRow, + MessageButton, + Permissions, +} = require("discord.js"); -module.exports = createTicket = async function(interaction) { - const client = interaction.client +module.exports = async function (interaction) { + const client = interaction.client; - const category = await interaction.guild.channels.fetch(client.config.ticketCategoryId) - const ticketChannel = await interaction.guild.channels.create( - "ticket-" + interaction.user.username, + const category = await interaction.guild.channels.fetch( + client.config.ticketCategoryId + ); + const ticketChannel = await interaction.guild.channels.create( + "ticket-" + interaction.user.username, + { + parent: category.id, + permissionOverwrites: [ { - parent: category.id, - permissionOverwrites: [{ - id: interaction.user.id, - allow: [ - Permissions.FLAGS.SEND_MESSAGES, - Permissions.FLAGS.VIEW_CHANNEL, - Permissions.FLAGS.READ_MESSAGE_HISTORY - ] - }] - } - ) + id: interaction.user.id, + allow: [ + Permissions.FLAGS.SEND_MESSAGES, + Permissions.FLAGS.VIEW_CHANNEL, + Permissions.FLAGS.READ_MESSAGE_HISTORY, + ], + }, + ], + } + ); - await interaction.reply({ - content: `<@${interaction.user.id}>Ticket créé avec succès, le voici : <#${ticketChannel.id}>`, - ephemeral: true - }) + await interaction.reply({ + content: `<@${interaction.user.id}>Ticket créé avec succès, le voici : <#${ticketChannel.id}>`, + ephemeral: true, + }); - const messageData = { - embeds: [ - new MessageEmbed({ - author: { - name: `Ticket de ${interaction.user.tag}` - }, - description: `Bonjour <@${interaction.user.id}>, voici votre ticket.\n\nVeuillez exprimer **clairement** votre ` + - "problème/demande et un membre du staff viendra s'en occuper au plus vite.\n\nPour fermer ce ticket, " + - "appuyez sur le bouton 'Fermer le ticket'", - color: "#0099ff", - footer: { - text: "Soyez patient, ne mentionnez pas le staff !" - } - }) - ], - components: [ - new MessageActionRow() - .addComponents([ - new MessageButton({ - label: "Fermer le ticket", - custom_id: "close-ticket", - style: "DANGER" - }) - ]) - ] - } + const messageData = { + embeds: [ + new MessageEmbed({ + author: { + name: `Ticket de ${interaction.user.tag}`, + }, + description: + `Bonjour <@${interaction.user.id}>, voici votre ticket.\n\nVeuillez exprimer **clairement** votre ` + + "problème/demande et un membre du staff viendra s'en occuper au plus vite.\n\nPour fermer ce ticket, " + + "appuyez sur le bouton 'Fermer le ticket'", + color: "#0099ff", + footer: { + text: "Soyez patient, ne mentionnez pas le staff !", + }, + }), + ], + components: [ + new MessageActionRow().addComponents([ + new MessageButton({ + label: "Fermer le ticket", + custom_id: "close-ticket", + style: "DANGER", + }), + ]), + ], + }; - const message = await ticketChannel.send(messageData) - await message.pin() - const msg = await ticketChannel.send({ content: `<@${interaction.user.id}>`}) - await msg.delete() -} \ No newline at end of file + const message = await ticketChannel.send(messageData); + await message.pin(); + const msg = await ticketChannel.send({ + content: `<@${interaction.user.id}>`, + }); + await msg.delete(); +}; diff --git a/src/functions/generateCaptcha.js b/src/functions/generateCaptcha.js index db184dd..1c14636 100644 --- a/src/functions/generateCaptcha.js +++ b/src/functions/generateCaptcha.js @@ -1,61 +1,65 @@ const Canvas = require("canvas"); -module.exports = getCaptcha = function() { - Canvas.registerFont(__dirname + "../../../res/fonts/Roboto.ttf", { family: 'Roboto' }); - Canvas.registerFont(__dirname + '../../../res/fonts/sans.ttf', { family: 'Sans' }); +module.exports = function () { + Canvas.registerFont(__dirname + "../../../res/fonts/Roboto.ttf", { + family: "Roboto", + }); + Canvas.registerFont(__dirname + "../../../res/fonts/sans.ttf", { + family: "Sans", + }); - let i; - const canvas = Canvas.createCanvas(400, 180); - const ctx = canvas.getContext('2d'); - const num = 5; - const cords = []; - const colors = ['blue', 'red', 'green', 'yellow', 'black', 'white']; - let string = ''; - const particles = Math.floor(Math.random() * 101); - const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; - const charactersLength = characters.length; - // Random code generation - for (i = 0; i < 5; i++) { - string += characters.charAt(Math.floor(Math.random() * charactersLength)); - } - ctx.font = 'bold 100px Roboto'; - ctx.lineWidth = 7.5; - let textPos = 45; - // Captcha text - for (i = 0; i < string.length; i++) { - const char = string.charAt(i); - ctx.fillStyle = colors[Math.floor(Math.random() * colors.length)]; - ctx.fillText(char, textPos, 120); - textPos += 65; - } - // Particles - for (i = 0; i < particles; i++) { - const pos = { - width: Math.floor(Math.random() * canvas.width), - height: Math.floor(Math.random() * canvas.height) - }; - ctx.fillStyle = colors[Math.floor(Math.random() * colors.length)]; - ctx.beginPath(); - ctx.arc(pos.width, pos.height, 3.5, 0, Math.PI * 2); - ctx.closePath(); - ctx.fill(); - } - // Get the cords - let x = 0; - for (i = 0; i < num + 1; i++) { - const l = Math.floor(Math.random() * canvas.height); - if (i !== 0) x += canvas.width / num; - cords.push([x, l]); - } - // Strokes - for (i = 0; i < cords.length; i++) { - const cord = cords[i]; - const nextCord = cords[i + 1]; - ctx.strokeStyle = colors[Math.floor(Math.random() * colors.length)]; - ctx.beginPath(); - ctx.moveTo(cord[0], cord[1]); - if (nextCord) ctx.lineTo(nextCord[0], nextCord[1]); - ctx.stroke(); - } - return { buffer: canvas.toBuffer(), text: string }; -}; \ No newline at end of file + let i; + const canvas = Canvas.createCanvas(400, 180); + const ctx = canvas.getContext("2d"); + const num = 5; + const cords = []; + const colors = ["blue", "red", "green", "yellow", "black", "white"]; + let string = ""; + const particles = Math.floor(Math.random() * 101); + const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + const charactersLength = characters.length; + // Random code generation + for (i = 0; i < 5; i++) { + string += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + ctx.font = "bold 100px Roboto"; + ctx.lineWidth = 7.5; + let textPos = 45; + // Captcha text + for (i = 0; i < string.length; i++) { + const char = string.charAt(i); + ctx.fillStyle = colors[Math.floor(Math.random() * colors.length)]; + ctx.fillText(char, textPos, 120); + textPos += 65; + } + // Particles + for (i = 0; i < particles; i++) { + const pos = { + width: Math.floor(Math.random() * canvas.width), + height: Math.floor(Math.random() * canvas.height), + }; + ctx.fillStyle = colors[Math.floor(Math.random() * colors.length)]; + ctx.beginPath(); + ctx.arc(pos.width, pos.height, 3.5, 0, Math.PI * 2); + ctx.closePath(); + ctx.fill(); + } + // Get the cords + let x = 0; + for (i = 0; i < num + 1; i++) { + const l = Math.floor(Math.random() * canvas.height); + if (i !== 0) x += canvas.width / num; + cords.push([x, l]); + } + // Strokes + for (i = 0; i < cords.length; i++) { + const cord = cords[i]; + const nextCord = cords[i + 1]; + ctx.strokeStyle = colors[Math.floor(Math.random() * colors.length)]; + ctx.beginPath(); + ctx.moveTo(cord[0], cord[1]); + if (nextCord) ctx.lineTo(nextCord[0], nextCord[1]); + ctx.stroke(); + } + return { buffer: canvas.toBuffer(), text: string }; +}; diff --git a/src/functions/getChannelTranscript.js b/src/functions/getChannelTranscript.js index f923d10..c234bc4 100644 --- a/src/functions/getChannelTranscript.js +++ b/src/functions/getChannelTranscript.js @@ -1,22 +1,41 @@ -module.exports = async function(channel) { - const messages = await fetchAllMessages(channel) - const content = `${messages.filter(msg => msg.content).length} messages\n\n\n` + messages.filter(msg => msg.content) - .map(msg => { - const date = new Date(msg.createdTimestamp) - return `(${date.getDate()}-${date.getMonth() + 1}-${date.getFullYear()} ${date.getHours()}:${date.getMinutes()})[${msg.author.tag}] ${msg.content}` - }).join("\n") - return Buffer.from(content, "utf-8") -} +module.exports = async function (channel) { + const messages = await fetchAllMessages(channel); + const content = + `${messages.filter(msg => msg.content).length} messages\n\n\n` + + messages + .filter(msg => msg.content) + .map(msg => { + const date = new Date(msg.createdTimestamp); + return `(${date.getDate()}-${ + date.getMonth() + 1 + }-${date.getFullYear()} ${date.getHours()}:${date.getMinutes()})[${ + msg.author.tag + }] ${msg.content}`; + }) + .join("\n"); + return Buffer.from(content, "utf-8"); +}; async function fetchAllMessages(channel, messages) { - if (!messages) { - messages = Array.from((await channel.messages.fetch({ limit: 100 })).values()) - if (messages.length < 100) return messages.reverse() - return await fetchAllMessages(channel, messages.reverse()) - } - const size = messages.length - messages = messages.concat(Array.from( - (await channel.messages.fetch({ limit: 100, before: messages[messages.length - 1].id })).values())) - if (messages.length === size || messages.length < size + 100) return messages.reverse() - return await fetchAllMessages(channel, messages.reverse()) + if (!messages) { + messages = Array.from( + (await channel.messages.fetch({ limit: 100 })).values() + ); + if (messages.length < 100) return messages.reverse(); + return await fetchAllMessages(channel, messages.reverse()); + } + const size = messages.length; + messages = messages.concat( + Array.from( + ( + await channel.messages.fetch({ + limit: 100, + before: messages[messages.length - 1].id, + }) + ).values() + ) + ); + if (messages.length === size || messages.length < size + 100) + return messages.reverse(); + return await fetchAllMessages(channel, messages.reverse()); } diff --git a/src/functions/handleSuggestionVotes.js b/src/functions/handleSuggestionVotes.js index 86e6f72..fbe2b13 100644 --- a/src/functions/handleSuggestionVotes.js +++ b/src/functions/handleSuggestionVotes.js @@ -1,51 +1,56 @@ -const {MessageActionRow, MessageButton} = require("discord.js"); +const { MessageActionRow, MessageButton } = require("discord.js"); -module.exports = handleSuggestionVotes = async function(interaction) { - const user = interaction.member.id; - let author = await interaction.client.votesdb.get(interaction.message.id, "author") - if (author === interaction.member.id) { - return interaction.reply({ - content: "Vous ne pouvez pas voter à votre propre suggestion !", - ephemeral: true - }) - } - let votes = await interaction.client.votesdb.get(interaction.message.id, "votes"); - votes = new Map(Object.entries(votes)) - let voteVal - if (interaction.customId === "upvote") voteVal = 1 - else voteVal = -1 +module.exports = async function (interaction) { + const user = interaction.member.id; + const author = await interaction.client.votesdb.get( + interaction.message.id, + "author" + ); + if (author === interaction.member.id) { + return interaction.reply({ + content: "Vous ne pouvez pas voter à votre propre suggestion !", + ephemeral: true, + }); + } + let votes = await interaction.client.votesdb.get( + interaction.message.id, + "votes" + ); + votes = new Map(Object.entries(votes)); + let voteVal; + if (interaction.customId === "upvote") voteVal = 1; + else voteVal = -1; - if (votes.has(user)) { - if (votes.get(user) !== voteVal) { - votes.set(user, voteVal) - } else { - votes.delete(user) - } + if (votes.has(user)) { + if (votes.get(user) !== voteVal) { + votes.set(user, voteVal); } else { - votes.set(user, voteVal) + votes.delete(user); } - await interaction.client.votesdb.set(interaction.message.id, votes, "votes") - const voteTotal = (Array.from(votes.values())).reduce((a, b) => a + b, 0) + } else { + votes.set(user, voteVal); + } + await interaction.client.votesdb.set(interaction.message.id, votes, "votes"); + const voteTotal = Array.from(votes.values()).reduce((a, b) => a + b, 0); - const embed = interaction.message.embeds[0] - const row = new MessageActionRow() - .addComponents( - new MessageButton() - .setStyle("PRIMARY") - .setLabel(`Upvote`) - .setEmoji(":upvote:906184895611682826") - .setCustomId("upvote"), - new MessageButton() - .setStyle("SECONDARY") - .setLabel(voteTotal.toString()) - .setDisabled(true) - .setCustomId("votenumbers"), - new MessageButton() - .setStyle("DANGER") - .setLabel(`Downvote`) - .setEmoji(":downvote:906184926146216006") - .setCustomId("downvote") - ) - await interaction.message.edit({ embeds: [embed], components: [row] }) - await interaction.deferUpdate() -} \ No newline at end of file + const embed = interaction.message.embeds[0]; + const row = new MessageActionRow().addComponents( + new MessageButton() + .setStyle("PRIMARY") + .setLabel("Upvote") + .setEmoji(":upvote:906184895611682826") + .setCustomId("upvote"), + new MessageButton() + .setStyle("SECONDARY") + .setLabel(voteTotal.toString()) + .setDisabled(true) + .setCustomId("votenumbers"), + new MessageButton() + .setStyle("DANGER") + .setLabel("Downvote") + .setEmoji(":downvote:906184926146216006") + .setCustomId("downvote") + ); + await interaction.message.edit({ embeds: [embed], components: [row] }); + await interaction.deferUpdate(); +}; diff --git a/src/functions/isModOrAdmin.js b/src/functions/isModOrAdmin.js index edfe911..4b5a3ae 100644 --- a/src/functions/isModOrAdmin.js +++ b/src/functions/isModOrAdmin.js @@ -1,11 +1,18 @@ module.exports = { - isMod(client, member) { - return member.roles.cache.some(role => client.config.mods.roles.includes(role.id)) || - client.config.mods.user.includes(member.id) - }, - isAdmin(client, member) { - return member.roles.cache.some(role => client.config.admins.roles.includes(role.id)) || - client.config.admins.user.includes(member.id) || - member.permissions.has("ADMINISTRATOR") - } -} \ No newline at end of file + isMod(client, member) { + return ( + member.roles.cache.some(role => + client.config.mods.roles.includes(role.id) + ) || client.config.mods.user.includes(member.id) + ); + }, + isAdmin(client, member) { + return ( + member.roles.cache.some(role => + client.config.admins.roles.includes(role.id) + ) || + client.config.admins.user.includes(member.id) || + member.permissions.has("ADMINISTRATOR") + ); + }, +}; diff --git a/src/functions/sendSuggestion.js b/src/functions/sendSuggestion.js index 13e3cf9..353f064 100644 --- a/src/functions/sendSuggestion.js +++ b/src/functions/sendSuggestion.js @@ -1,34 +1,41 @@ -const {MessageEmbed, MessageActionRow, MessageButton} = require("discord.js"); +const { MessageEmbed, MessageActionRow, MessageButton } = require("discord.js"); -module.exports = sendSuggestion = async function(interaction) { - let suggestion - if (interaction.options) suggestion = interaction.options.getString('suggestion'); - else suggestion = interaction.content - const embed = new MessageEmbed() - .setTitle(`Suggestion de ${interaction.member.user.tag}`) - .setColor("#0099ff") - .setDescription(suggestion) - .setThumbnail(interaction.member.user.avatarURL({ dynamic: true })) - .setTimestamp(Date.now()) - .setFooter("Créez un thread pour débattre des suggestions !") - const row = new MessageActionRow() - .addComponents( - new MessageButton() - .setStyle("PRIMARY") - .setLabel(`Upvote`) - .setEmoji(":upvote:906184895611682826") - .setCustomId("upvote"), - new MessageButton() - .setStyle("SECONDARY") - .setLabel("0") - .setDisabled(true) - .setCustomId("votenumbers"), - new MessageButton() - .setStyle("DANGER") - .setLabel(`Downvote`) - .setEmoji(":downvote:906184926146216006") - .setCustomId("downvote") - ) - const msg = await (await interaction.client.channels.fetch(interaction.client.config.suggestionChannelId)).send({embeds: [embed], components: [row]}) - await interaction.client.votesdb.set(`${msg.id}`, {author: interaction.member.id, votes: {}}) -} +module.exports = async function (interaction) { + let suggestion; + if (interaction.options) + suggestion = interaction.options.getString("suggestion"); + else suggestion = interaction.content; + const embed = new MessageEmbed() + .setTitle(`Suggestion de ${interaction.member.user.tag}`) + .setColor("#0099ff") + .setDescription(suggestion) + .setThumbnail(interaction.member.user.avatarURL({ dynamic: true })) + .setTimestamp(Date.now()) + .setFooter("Créez un thread pour débattre des suggestions !"); + const row = new MessageActionRow().addComponents( + new MessageButton() + .setStyle("PRIMARY") + .setLabel("Upvote") + .setEmoji(":upvote:906184895611682826") + .setCustomId("upvote"), + new MessageButton() + .setStyle("SECONDARY") + .setLabel("0") + .setDisabled(true) + .setCustomId("votenumbers"), + new MessageButton() + .setStyle("DANGER") + .setLabel("Downvote") + .setEmoji(":downvote:906184926146216006") + .setCustomId("downvote") + ); + const msg = await ( + await interaction.client.channels.fetch( + interaction.client.config.suggestionChannelId + ) + ).send({ embeds: [embed], components: [row] }); + await interaction.client.votesdb.set(`${msg.id}`, { + author: interaction.member.id, + votes: {}, + }); +}; diff --git a/src/functions/sendWelcomeImage.js b/src/functions/sendWelcomeImage.js index 8135685..065a66c 100644 --- a/src/functions/sendWelcomeImage.js +++ b/src/functions/sendWelcomeImage.js @@ -1,43 +1,54 @@ -const Jimp = require('jimp'); -const path = require('path'); -const {MessageAttachment, MessageEmbed} = require("discord.js"); - - -module.exports = sendWelcomeImage = async function(client, member) { - - try { - const canvas = new Jimp(500, 150); - const avatar = await Jimp.read(member.user.displayAvatarURL({format: 'png'})); - - const Quantify_55_white = await Jimp.loadFont(path.join(__dirname, '../../res/fonts/Quantify_55_white.fnt')); - const Quantify_25_white = await Jimp.loadFont(path.join(__dirname, '../../res/fonts/Quantify_25_white.fnt')); - const OpenSans_22_white = await Jimp.loadFont(path.join(__dirname, '../../res/fonts/OpenSans_22_white.fnt')); - const mask = await Jimp.read('https://raw.githubusercontent.com/CoderDixs/DraftBot/master/images/avatarMask.png'); - - avatar.resize(136, Jimp.AUTO); - mask.resize(136, Jimp.AUTO); - avatar.mask(mask, 0, 0); - - canvas.blit(avatar, 5, 5); - - canvas.print(Quantify_55_white, 158, 20, 'Bienvenue'); - canvas.print(OpenSans_22_white, 158, 70, 'sur le serveur Discord'); - canvas.print(Quantify_25_white, 158, 105, 'Le Nid d\'Astral'); - - const buffer = await canvas.getBufferAsync(Jimp.MIME_PNG); - const attachment = new MessageAttachment(buffer, 'joinimg.png'); - - const embed = new MessageEmbed() - .setTitle(`${member.user.tag} a rejoint le serveur !`) - .setDescription("🎉 Bienvenue à toi ! 🎉") - .setImage("attachment://joinimg.png") - .setColor("#0099ff") - .setFooter("On est maintenant " + member.guild.memberCount + " membres !") - - const channel = await member.guild.channels.fetch(client.config.welcomeChannelId) - await channel.send({ embeds: [embed], files: [attachment]}) - } catch (error) { - return console.log('WelcomeImage => ',error); - } - -} \ No newline at end of file +const Jimp = require("jimp"); +const path = require("path"); +const { MessageAttachment, MessageEmbed } = require("discord.js"); + +module.exports = async function (client, member) { + try { + const canvas = new Jimp(500, 150); + const avatar = await Jimp.read( + member.user.displayAvatarURL({ format: "png" }) + ); + + const Quantify_55_white = await Jimp.loadFont( + path.join(__dirname, "../../res/fonts/Quantify_55_white.fnt") + ); + const Quantify_25_white = await Jimp.loadFont( + path.join(__dirname, "../../res/fonts/Quantify_25_white.fnt") + ); + const OpenSans_22_white = await Jimp.loadFont( + path.join(__dirname, "../../res/fonts/OpenSans_22_white.fnt") + ); + const mask = await Jimp.read( + "https://raw.githubusercontent.com/CoderDixs/DraftBot/master/images/avatarMask.png" + ); + + avatar.resize(136, Jimp.AUTO); + mask.resize(136, Jimp.AUTO); + avatar.mask(mask, 0, 0); + + canvas.blit(avatar, 5, 5); + + canvas.print(Quantify_55_white, 158, 20, "Bienvenue"); + canvas.print(OpenSans_22_white, 158, 70, "sur le serveur Discord"); + canvas.print(Quantify_25_white, 158, 105, "Le Nid d'Astral"); + + const buffer = await canvas.getBufferAsync(Jimp.MIME_PNG); + const attachment = new MessageAttachment(buffer, "joinimg.png"); + + const embed = new MessageEmbed() + .setTitle(`${member.user.tag} a rejoint le serveur !`) + .setDescription("🎉 Bienvenue à toi ! 🎉") + .setImage("attachment://joinimg.png") + .setColor("#0099ff") + .setFooter( + "On est maintenant " + member.guild.memberCount + " membres !" + ); + + const channel = await member.guild.channels.fetch( + client.config.welcomeChannelId + ); + await channel.send({ embeds: [embed], files: [attachment] }); + } catch (error) { + client.logger.error(`welcome image : ${error}`); + } +}; diff --git a/src/functions/translate.js b/src/functions/translate.js index 7148f3b..458018e 100644 --- a/src/functions/translate.js +++ b/src/functions/translate.js @@ -1,12 +1,12 @@ -const french = require("../../res/languages/french.json") +require("../../res/languages/french.json"); -module.exports = (location, options={}) => { - let string = eval(`french.${location}`) - string = string[Math.floor(Math.random()*string.length)] +module.exports = (location, options = {}) => { + let string = eval(`french.${location}`); + string = string[Math.floor(Math.random() * string.length)]; - for(let key of Object.keys(options)) { - string = string.replace(new RegExp(`{{${key}}}`, "g"), options[key]) + for (const key of Object.keys(options)) { + string = string.replace(new RegExp(`{{${key}}}`, "g"), options[key]); } return string; -} \ No newline at end of file +}; diff --git a/src/functions/updateSubCount.js b/src/functions/updateSubCount.js index bdf41c6..188aa57 100644 --- a/src/functions/updateSubCount.js +++ b/src/functions/updateSubCount.js @@ -1,26 +1,36 @@ -const { google } = require("googleapis") +const { google } = require("googleapis"); -module.exports = updateSubCount = async function(client) { - const youtube = google.youtube("v3") - const subChannel = await ( - await client.guilds.fetch(client.config.mainGuildId)).channels.fetch(client.config.subCounterChannelId) - const viewsChannel = await ( - await client.guilds.fetch(client.config.mainGuildId)).channels.fetch(client.config.viewsCounterChannelId) +module.exports = async function (client) { + const youtube = google.youtube("v3"); + const subChannel = await ( + await client.guilds.fetch(client.config.mainGuildId) + ).channels.fetch(client.config.subCounterChannelId); + const viewsChannel = await ( + await client.guilds.fetch(client.config.mainGuildId) + ).channels.fetch(client.config.viewsCounterChannelId); - const res = await youtube.channels.list({ - auth: process.env.YOUTUBE_API_KEY, - id: client.config.astralYoutubeChannelId, - part: ["statistics"] - }) + const res = await youtube.channels.list({ + auth: process.env.YOUTUBE_API_KEY, + id: client.config.astralYoutubeChannelId, + part: ["statistics"], + }); - const statistics = res.data.items[0].statistics + const statistics = res.data.items[0].statistics; - await subChannel.setName(`Abonnés : ${statistics.subscriberCount} ${statistics.subscriberCount.includes("69") ? "(nice)" : ""}`) - await viewsChannel.setName(`Total de vues : ${statistics.viewCount} ${statistics.videoCount.includes("69") ? "(nice)" : ""}`) - // await subChannel.setTopic(`${statistics.subscriberCount} abonnés ` + - // `${statistics.subscriberCount.includes("69") ? "(nice)" : ""}, ${statistics.videoCount} vidéos ` + - // `${statistics.videoCount.includes("69") ? "(nice)" : ""} et un total de ${statistics.viewCount} ` + - // `${statistics.viewCount.includes("69") ? "(nice)" : ""} vues !`) + await subChannel.setName( + `Abonnés : ${statistics.subscriberCount} ${ + statistics.subscriberCount.includes("69") ? "(nice)" : "" + }` + ); + await viewsChannel.setName( + `Total de vues : ${statistics.viewCount} ${ + statistics.videoCount.includes("69") ? "(nice)" : "" + }` + ); + // await subChannel.setTopic(`${statistics.subscriberCount} abonnés ` + + // `${statistics.subscriberCount.includes("69") ? "(nice)" : ""}, ${statistics.videoCount} vidéos ` + + // `${statistics.videoCount.includes("69") ? "(nice)" : ""} et un total de ${statistics.viewCount} ` + + // `${statistics.viewCount.includes("69") ? "(nice)" : ""} vues !`) - client.logger.debug("Updated the subscribers counter !") -} \ No newline at end of file + client.logger.debug("Updated the subscribers counter !"); +}; diff --git a/src/index.js b/src/index.js index 04f25a5..2d5905c 100644 --- a/src/index.js +++ b/src/index.js @@ -1,68 +1,76 @@ -const fs = require('fs'); -const { Client, Collection, Intents } = require('discord.js'); -const { EconomyManager } = require("quick.eco") +const fs = require("fs"); +const { Client, Collection, Intents } = require("discord.js"); +const { EconomyManager } = require("quick.eco"); const { MongoClient } = require("mongodb"); -const { Player } = require('discord-player'); +const { Player } = require("discord-player"); const quickmongo = require("quickmongo"); -const config = require('../res/config.json') -const musicconfig = require('./music/config'); -const winston = require("winston") +const config = require("../res/config.json"); +const musicconfig = require("./music/config"); +const winston = require("winston"); -require('dotenv').config(); +require("dotenv").config(); // Discord client const client = new Client({ - intents: [ - Intents.FLAGS.GUILDS, - Intents.FLAGS.GUILD_MESSAGES, - Intents.FLAGS.GUILD_MEMBERS, - Intents.FLAGS.GUILD_MESSAGES, - Intents.FLAGS.GUILD_BANS, - Intents.FLAGS.DIRECT_MESSAGES, - Intents.FLAGS.GUILD_VOICE_STATES - ], - partials: ["CHANNEL", "MESSAGE"] + intents: [ + Intents.FLAGS.GUILDS, + Intents.FLAGS.GUILD_MESSAGES, + Intents.FLAGS.GUILD_MEMBERS, + Intents.FLAGS.GUILD_MESSAGES, + Intents.FLAGS.GUILD_BANS, + Intents.FLAGS.DIRECT_MESSAGES, + Intents.FLAGS.GUILD_VOICE_STATES, + ], + partials: ["CHANNEL", "MESSAGE"], }); client.config = config; -client.musicconfig = musicconfig +client.musicconfig = musicconfig; client.player = new Player(client, client.musicconfig.opt.discordPlayer); -let debug = false -if (process.env.debug === "true") debug = true +let debug = false; +if (process.env.debug === "true") debug = true; client.logger = winston.createLogger({ - transports: [ - new winston.transports.Console({ - format: winston.format.combine( - winston.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }), - winston.format.padLevels(), - winston.format.printf( - info => winston.format.colorize() - .colorize(info.level,`[${info.timestamp}] [${info.level}] ${info.message}`) - ) + transports: [ + new winston.transports.Console({ + format: winston.format.combine( + winston.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }), + winston.format.padLevels(), + winston.format.printf(info => + winston.format + .colorize() + .colorize( + info.level, + `[${info.timestamp}] [${info.level}] ${info.message}` ) - }), - ], - level: debug ? "debug" : "info" -}) + ) + ), + }), + ], + level: debug ? "debug" : "info", +}); -console.log(`AstralBot, version ${client.config.version}\n`) +// eslint-disable-next-line no-console +console.log(`AstralBot, version ${client.config.version}\n`); if (!process.env.TOKEN) { - client.logger.error("La variable d'environnement 'TOKEN' n'existe pas.") - process.exit(1) + client.logger.error("La variable d'environnement 'TOKEN' n'existe pas."); + process.exit(1); } -if (client.logger.isDebugEnabled()) client.logger.debug("Le mode de débuggage est activé") +if (client.logger.isDebugEnabled()) + client.logger.debug("Le mode de débuggage est activé"); if (!process.env.MONGOURL) { - client.logger.error("La variable d'environnement 'MONGOURL' n'existe pas.") - process.exit(1) + client.logger.error("La variable d'environnement 'MONGOURL' n'existe pas."); + process.exit(1); } if (!process.env.YOUTUBE_API_KEY) { - client.logger.error("La variable d'environnement 'YOUTUBE_API_KEY' n'existe pas.") - process.exit(1) + client.logger.error( + "La variable d'environnement 'YOUTUBE_API_KEY' n'existe pas." + ); + process.exit(1); } // Mongo client @@ -70,129 +78,135 @@ const mongo = new MongoClient(process.env.MONGOURL); // Suggestion schema const suggestionSchema = new quickmongo.Fields.ObjectField({ - author: new quickmongo.Fields.StringField(), - votes: new quickmongo.Fields.AnyField() + author: new quickmongo.Fields.StringField(), + votes: new quickmongo.Fields.AnyField(), }); // Counting schema const countingSchema = new quickmongo.Fields.ObjectField({ - author: new quickmongo.Fields.StringField(), - currentNumber: new quickmongo.Fields.NumberField() + author: new quickmongo.Fields.StringField(), + currentNumber: new quickmongo.Fields.NumberField(), }); // Warn schema const warnSchema = new quickmongo.Fields.ObjectField({ - warns: new quickmongo.Fields.AnyField() + warns: new quickmongo.Fields.AnyField(), }); -mongo.connect() - .then(() => { - client.logger.info("Connecté à la base de données") - }); - const mongoCollection = mongo.db().collection("suggestions"); +mongo.connect().then(() => { + client.logger.info("Connecté à la base de données"); +}); +const mongoCollection = mongo.db().collection("suggestions"); - client.votesdb = new quickmongo.Collection(mongoCollection, suggestionSchema); +client.votesdb = new quickmongo.Collection(mongoCollection, suggestionSchema); - const countingCollection = mongo.db().collection("counting"); +const countingCollection = mongo.db().collection("counting"); - client.countdb = new quickmongo.Collection(countingCollection, countingSchema); +client.countdb = new quickmongo.Collection(countingCollection, countingSchema); - const warnCollection = mongo.db().collection("warns"); +const warnCollection = mongo.db().collection("warns"); - client.warnsdb = new quickmongo.Collection(warnCollection, warnSchema); +client.warnsdb = new quickmongo.Collection(warnCollection, warnSchema); - // db.set("userInfo", { difficulty: "Easy", items: [], balance: 0 }).then(console.log); - // -> { difficulty: 'Easy', items: [], balance: 0 } +// db.set("userInfo", { difficulty: "Easy", items: [], balance: 0 }).then(console.log); +// -> { difficulty: 'Easy', items: [], balance: 0 } - // db.push("userInfo", "Sword", "items").then(console.log); - // -> { difficulty: 'Easy', items: ['Sword'], balance: 0 } +// db.push("userInfo", "Sword", "items").then(console.log); +// -> { difficulty: 'Easy', items: ['Sword'], balance: 0 } - // db.set("userInfo", 500, "balance").then(console.log); - // -> { difficulty: 'Easy', items: ['Sword'], balance: 500 } +// db.set("userInfo", 500, "balance").then(console.log); +// -> { difficulty: 'Easy', items: ['Sword'], balance: 500 } - // Repeating previous examples: - // db.push("userInfo", "Watch", "items").then(console.log); - // -> { difficulty: 'Easy', items: ['Sword', 'Watch'], balance: 500 } +// Repeating previous examples: +// db.push("userInfo", "Watch", "items").then(console.log); +// -> { difficulty: 'Easy', items: ['Sword', 'Watch'], balance: 500 } - // const previousBalance = await db.get("userInfo", "balance"); - // db.set("userInfo", previousBalance + 500, "balance").then(console.log); - // -> { difficulty: 'Easy', items: ['Sword', 'Watch'], balance: 1000 } +// const previousBalance = await db.get("userInfo", "balance"); +// db.set("userInfo", previousBalance + 500, "balance").then(console.log); +// -> { difficulty: 'Easy', items: ['Sword', 'Watch'], balance: 1000 } - // Fetching individual properties - // db.get("userInfo", "balance").then(console.log); - // -> 1000 - // db.get("userInfo", "items").then(console.log); - // -> ['Sword', 'Watch'] +// Fetching individual properties +// db.get("userInfo", "balance").then(console.log); +// -> 1000 +// db.get("userInfo", "items").then(console.log); +// -> ['Sword', 'Watch'] - // remove item - // db.pull("userInfo", "Sword", "items").then(console.log); - // -> { difficulty: 'Easy', items: ['Watch'], balance: 1000 } +// remove item +// db.pull("userInfo", "Sword", "items").then(console.log); +// -> { difficulty: 'Easy', items: ['Watch'], balance: 1000 } // ECONOMY client.eco = new EconomyManager({ - adapter: 'mongo', - adapterOptions: { - collection: 'money', // => Collection Name - uri: process.env.MONGOURL // => Mongodb uri - } + adapter: "mongo", + adapterOptions: { + collection: "money", // => Collection Name + uri: process.env.MONGOURL, // => Mongodb uri + }, }); // COMMANDS client.commands = new Collection(); -const commandFiles = fs.readdirSync('./src/commands').filter(file => file.endsWith('.js')); +const commandFiles = fs + .readdirSync("./src/commands") + .filter(file => file.endsWith(".js")); for (const file of commandFiles) { - const command = require(`./commands/${file}`); - client.commands.set(command.data.name, command); - client.logger.debug(`Commande '${command.data.name}' ajoutée`) + const command = require(`./commands/${file}`); + client.commands.set(command.data.name, command); + client.logger.debug(`Commande '${command.data.name}' ajoutée`); } // EVENTS -const eventFiles = fs.readdirSync('./src/events').filter(file => file.endsWith('.js')); +const eventFiles = fs + .readdirSync("./src/events") + .filter(file => file.endsWith(".js")); for (const file of eventFiles) { - const event = require(`./events/${file}`); - if (event.once) { - client.once(event.name, (...args) => { - client.logger.debug(`Évent '${event.name}' reçu`) - event.execute(client, ...args) - }); - } else { - client.on(event.name, (...args) => { - client.logger.debug(`Évent '${event.name}' reçu`) - event.execute(client, ...args) - }); - } - client.logger.debug(`Évent '${event.name}' ajouté`) + const event = require(`./events/${file}`); + if (event.once) { + client.once(event.name, (...args) => { + client.logger.debug(`Évent '${event.name}' reçu`); + event.execute(client, ...args); + }); + } else { + client.on(event.name, (...args) => { + client.logger.debug(`Évent '${event.name}' reçu`); + event.execute(client, ...args); + }); + } + client.logger.debug(`Évent '${event.name}' ajouté`); } -client.player.on('error', (queue, error) => { - console.log(`Error emitted from the queue ${error.message}`); +client.player.on("error", (queue, error) => { + client.logger.error(`Error emitted from the queue ${error.message}`); }); -client.player.on('connectionError', (queue, error) => { - console.log(`Error emitted from the connection ${error.message}`); +client.player.on("connectionError", (queue, error) => { + client.logger.error(`Error emitted from the connection ${error.message}`); }); -client.player.on('trackStart', (queue, track) => { - queue.metadata.send(`Musique ${track.title} jouée dans **${queue.connection.channel.name}** 🎧`); +client.player.on("trackStart", (queue, track) => { + queue.metadata.send( + `Musique ${track.title} jouée dans **${queue.connection.channel.name}** 🎧` + ); }); -client.player.on('trackAdd', (queue, track) => { - queue.metadata.send(`Musique ${track.title} ajouté dans la queue ✅`); +client.player.on("trackAdd", (queue, track) => { + queue.metadata.send(`Musique ${track.title} ajouté dans la queue ✅`); }); -client.player.on('botDisconnect', (queue) => { - queue.metadata.send('J\'été déconnecté manuellement du salon, je clear la queue... ❌'); +client.player.on("botDisconnect", queue => { + queue.metadata.send( + "J'été déconnecté manuellement du salon, je clear la queue... ❌" + ); }); -client.player.on('channelEmpty', (queue) => { - queue.metadata.send('Personne n\'est dans le salon vocal, je le quitte... ❌'); +client.player.on("channelEmpty", queue => { + queue.metadata.send("Personne n'est dans le salon vocal, je le quitte... ❌"); }); -client.player.on('queueEnd', (queue) => { -}); +client.player.on("queueEnd", () => {}); client.login(process.env.TOKEN); diff --git a/src/music/config.js b/src/music/config.js index fcb860c..e2ca8cd 100644 --- a/src/music/config.js +++ b/src/music/config.js @@ -1,12 +1,12 @@ module.exports = { - opt: { - maxVol: 100, - loopMessage: false, - discordPlayer: { - ytdlOptions: { - quality: 'highestaudio', - highWaterMark: 1 << 25 - } - } - } -}; \ No newline at end of file + opt: { + maxVol: 100, + loopMessage: false, + discordPlayer: { + ytdlOptions: { + quality: "highestaudio", + highWaterMark: 1 << 25, + }, + }, + }, +}; diff --git a/src/setup.js b/src/setup.js index 671b375..66d2aac 100644 --- a/src/setup.js +++ b/src/setup.js @@ -1,73 +1,87 @@ -const {Client, Intents, MessageActionRow, MessageSelectMenu, MessageEmbed, MessageButton} = require("discord.js"); -const config = require("../res/config.json") +const { + Client, + Intents, + MessageActionRow, + MessageSelectMenu, + MessageEmbed, + MessageButton, +} = require("discord.js"); +const config = require("../res/config.json"); -require("dotenv").config() +require("dotenv").config(); -const client = new Client({ intents: [Intents.FLAGS.GUILDS] }) +const client = new Client({ intents: [Intents.FLAGS.GUILDS] }); client.once("ready", async () => { - const guild = await client.guilds.fetch(config.mainGuildId) - // ROLES - let row = new MessageActionRow() - .addComponents( - new MessageSelectMenu() - .setCustomId('select') - .setPlaceholder('Rien de selectioné') - .setMinValues(0) - .setMaxValues(2) - .addOptions([ - { - label: 'Annonces', - description: 'Annonces', - value: 'Annonces', - }, - { - label: 'Vidéos & Lives', - description: 'Vidéos & Lives', - value: 'Vidéos', - }, - ]), - ); - let embed = new MessageEmbed() - .setTitle(`Choisissez vos rôles ici !`) - .setColor("#0099ff") - .setDescription(`Vous pouvez les sélectionner avec le select menu.`) - await (await guild.channels.fetch(config.rolePannelChannelId)).send({embeds: [embed], components: [row]}) + const guild = await client.guilds.fetch(config.mainGuildId); + // ROLES + let row = new MessageActionRow().addComponents( + new MessageSelectMenu() + .setCustomId("select") + .setPlaceholder("Rien de selectioné") + .setMinValues(0) + .setMaxValues(2) + .addOptions([ + { + label: "Annonces", + description: "Annonces", + value: "Annonces", + }, + { + label: "Vidéos & Lives", + description: "Vidéos & Lives", + value: "Vidéos", + }, + ]) + ); + let embed = new MessageEmbed() + .setTitle("Choisissez vos rôles ici !") + .setColor("#0099ff") + .setDescription("Vous pouvez les sélectionner avec le select menu."); + await ( + await guild.channels.fetch(config.rolePannelChannelId) + ).send({ embeds: [embed], components: [row] }); - // VERIFICATION - embed = new MessageEmbed() - .setTitle(`Vérification`) - .setColor("#0099ff") - .setDescription(`Veuillez cliquer sur le bouton ci-dessous pour avoir accès au serveur !`) - row = new MessageActionRow() - .addComponents( - new MessageButton() - .setStyle("SUCCESS") - .setLabel("Vérification") - .setCustomId("commencer") - ) - await (await guild.channels.fetch(config.verifChannelId)).send({embeds: [embed], components: [row]}) + // VERIFICATION + embed = new MessageEmbed() + .setTitle("Vérification") + .setColor("#0099ff") + .setDescription( + "Veuillez cliquer sur le bouton ci-dessous pour avoir accès au serveur !" + ); + row = new MessageActionRow().addComponents( + new MessageButton() + .setStyle("SUCCESS") + .setLabel("Vérification") + .setCustomId("commencer") + ); + await ( + await guild.channels.fetch(config.verifChannelId) + ).send({ embeds: [embed], components: [row] }); - // TICKETS - embed = new MessageEmbed() - .setTitle(`Tickets`) - .setColor("#0099ff") - .setDescription("Vous avez un problème ? Vous avez besoin de contacter le staff pour je ne sais quoi en privé "+ - "?\nAlors créez un ticket !\n\nPour cela, rien de plus simple, vous devez simplement cliquer sur le bouton " + - "ci-dessous.") - row = new MessageActionRow() - .addComponents( - new MessageButton() - .setStyle("SUCCESS") - .setLabel("Créer un ticket") - .setCustomId("create-ticket") - ) - await (await guild.channels.fetch(config.ticketChannelId)).send({embeds: [embed], components: [row]}) + // TICKETS + embed = new MessageEmbed() + .setTitle("Tickets") + .setColor("#0099ff") + .setDescription( + "Vous avez un problème ? Vous avez besoin de contacter le staff pour je ne sais quoi en privé " + + "?\nAlors créez un ticket !\n\nPour cela, rien de plus simple, vous devez simplement cliquer sur le bouton " + + "ci-dessous." + ); + row = new MessageActionRow().addComponents( + new MessageButton() + .setStyle("SUCCESS") + .setLabel("Créer un ticket") + .setCustomId("create-ticket") + ); + await ( + await guild.channels.fetch(config.ticketChannelId) + ).send({ embeds: [embed], components: [row] }); - console.log("Pannels envoyés avec succès.") - client.destroy() - process.exit() -}) - -client.login(process.env.TOKEN) + // eslint-disable-next-line no-console + console.log("Pannels envoyés avec succès."); + client.destroy(); + process.exit(); +}); +client.login(process.env.TOKEN);