diff --git a/commands/botcontrol/alias.js b/commands/botcontrol/alias.js index 11e9662..3bee84b 100644 --- a/commands/botcontrol/alias.js +++ b/commands/botcontrol/alias.js @@ -28,6 +28,11 @@ module.exports = { if (!command) { return message.reply(`La commande ${commandName} n'existe pas.`); } + const aliasCheck = isAliasUnique(client, newAlias); + if (!aliasCheck.isUnique) { + return message.reply(`Cet alias est déjà utilisé par la commande \`${aliasCheck.conflictCommand}\`.`); + } + let data = await new Promise((resolve, reject) => { db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { @@ -45,7 +50,7 @@ module.exports = { for (const cmd in data.alias) { if (data.alias[cmd][newAlias]) { - return message.reply('Cet alias est déjà utilisé pour une autre commande.'); + return message.reply(`Cet alias est déjà utilisé par la commande \`${cmd}\`.`); } } @@ -118,4 +123,15 @@ module.exports = { return message.reply('Sous-commande invalide. Veuillez utiliser add, remove, ou list.'); } }, -}; \ No newline at end of file +}; +function isAliasUnique(client, newAlias) { + for (const command of client.commands.values()) { + if (command.name === newAlias) { + return { isUnique: false, conflictCommand: command.name }; + } + if (command.aliases && command.aliases.includes(newAlias)) { + return { isUnique: false, conflictCommand: command.name }; + } + } + return { isUnique: true }; +} \ No newline at end of file diff --git a/commands/gestion/blrank.js b/commands/gestion/blrank.js index de2ec30..86275f0 100644 --- a/commands/gestion/blrank.js +++ b/commands/gestion/blrank.js @@ -1,6 +1,6 @@ const { EmbedBuilder } = require('discord.js'); const sqlite3 = require('sqlite3').verbose(); - +const db = new sqlite3.Database('myDatabase.db'); module.exports = { name: 'blrank', description: 'Affiché ou gérés la blrankn', @@ -9,11 +9,10 @@ module.exports = { category: 'gestion', async execute(message, args, client) { - const db = new sqlite3.Database('myDatabase.db'); const botId = message.client.user.id; const guildId = message.guild.id; - if (args.length > 0) { + if (args.length > 0) { const userId = args[0].replace(/<@!?(\d+)>/, '$1'); let data = await new Promise((resolve, reject) => { db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { @@ -25,12 +24,13 @@ module.exports = { }); }); - if (!data.blrank) { - data.blrank = {}; + // Initialiser la structure de données si elle n'existe pas + if (!data[guildId]) { + data[guildId] = { blrank: {} }; } - if (data.blrank[userId]) { - delete data.blrank[userId]; + if (data[guildId].blrank[userId]) { + delete data[guildId].blrank[userId]; db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [botId, JSON.stringify(data)], (err) => { if (err) { console.error(err.message); @@ -38,7 +38,7 @@ module.exports = { }); message.reply('Utilisateur retiré de la blrank.'); } else { - data.blrank[userId] = true; + data[guildId].blrank[userId] = true; db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [botId, JSON.stringify(data)], (err) => { if (err) { console.error(err.message); @@ -57,13 +57,13 @@ module.exports = { }); }); - const blrank = data.blrank || {}; + // Récupérer la liste spécifique au serveur + const blrank = data[guildId] && data[guildId].blrank ? data[guildId].blrank : {}; const embed = new EmbedBuilder() .setTitle('Blrank') .setDescription(Object.keys(blrank).map(id => `<@${id}>`).join('\n') || 'Aucun utilisateur sur la liste blanche') .setFooter({ text: message.client.user.username, iconURL: client.user.displayAvatarURL({dynamic: true})}); - message.channel.send({ embeds: [embed] }); } }, diff --git a/commands/gestion/clear.js b/commands/gestion/clear.js index 108b783..32076c5 100644 --- a/commands/gestion/clear.js +++ b/commands/gestion/clear.js @@ -2,7 +2,7 @@ const { PermissionsBitField } = require("discord.js"); module.exports = { name: 'clear', - aliases: ['purge', 'delete', 'suppr', 'efface', 'nettoie', 'vide', 'clean', 'effacer'], + aliases: ['purge'], description: 'Clear des messages', emote: '🗑️', utilisation: 'clear ', diff --git a/commands/gestion/embed.js b/commands/gestion/embed.js index 753b432..d6fd8c0 100644 --- a/commands/gestion/embed.js +++ b/commands/gestion/embed.js @@ -2,7 +2,7 @@ const { EmbedBuilder, ActionRowBuilder, StringSelectMenuBuilder, ButtonBuilder, module.exports = { name: 'embed', - aliases: ['embedcreate', 'createembed'], + aliases: ['embedcreate'], description: 'Crée un embed customisable', emote: '📝', utilisation: 'embed', @@ -52,6 +52,8 @@ module.exports = { let msgg = collected.first() embed.setTitle(msgg.content) msg.edit({ embeds: [embed]}) + question.delete().catch(() => false); + msgg.delete().catch(() => false); }) } if(i.values[0] == "embeddescription") { @@ -60,25 +62,61 @@ module.exports = { let msgg = collected.first() embed.setDescription(msgg.content) msg.edit({ embeds: [embed]}) + question.delete().catch(() => false); + msgg.delete().catch(() => false); }) } - if(i.values[0] == "embedauthor") { - let question = await message.channel.send({ content: "Veuillez saisir l'auteur de l'embed" }) - let collected = await question.channel.awaitMessages({ filter: m => m.author.id === message.author.id, max: 1 }).then(collected => { - let msgg = collected.first() - embed.setAuthor({name: msgg.content}) - msg.edit({ embeds: [embed]}) - }) - } - if(i.values[0] == "embedfooter") { - let question = await message.channel.send({ content: "Veuillez saisir le footer de l'embed" }) - let collected = await question.channel.awaitMessages({ filter: m => m.author.id === message.author.id, max: 1 }).then(collected => { - let msgg = collected.first() - embed.setFooter({text: msgg.content}) - msg.edit({ embeds: [embed]}) - }) - } +if(i.values[0] == "embedauthor") { + let question = await message.channel.send({ content: "Veuillez saisir l'auteur de l'embed" }); + let collected = await question.channel.awaitMessages({ filter: m => m.author.id === message.author.id, max: 1 }); + let msgg = collected.first(); + let authorName = msgg.content; + + let question2 = await message.channel.send({ content: "Veuillez fournir une URL d'image ou télécharger une image pour l'auteur." }); + collected = await question.channel.awaitMessages({ filter: m => m.author.id === message.author.id, max: 1, time: 60000, errors: ["time"] }); + let msgg2 = collected.first(); + let content = msgg2.content; + let imageUrl = msgg2.attachments.first() ? msgg2.attachments.first().url : content; + + const imageUrlRegex = /^https?:\/\/.*\/.*\.(png|gif|webp|jpeg|jpg|svg)\??.*$/gmi; + if (imageUrlRegex.test(imageUrl)) { + embed.setAuthor({name: authorName, iconURL: imageUrl}); + } else { + embed.setAuthor({name: authorName}); + } + msg.edit({ embeds: [embed]}); + question.delete().catch(() => false); + msgg.delete().catch(() => false); + question2.delete().catch(() => false); + msgg2.delete().catch(() => false); +} +if(i.values[0] == "embedfooter") { + let question = await message.channel.send({ content: "Veuillez saisir le texte du footer de l'embed" }); + let collected = await question.channel.awaitMessages({ filter: m => m.author.id === message.author.id, max: 1 }); + let msgg = collected.first(); + let footerText = msgg.content; + + let question2 = await message.channel.send({ content: "Veuillez fournir une URL d'image ou télécharger une image pour le footer." }); + collected = await question2.channel.awaitMessages({ filter: m => m.author.id === message.author.id, max: 1, time: 60000, errors: ["time"] }); + let msgg2 = collected.first(); + let content = msgg2.content; + let imageUrl = msgg2.attachments.first() ? msgg2.attachments.first().url : content; + + + const imageUrlRegex = /^https?:\/\/.*\/.*\.(png|gif|webp|jpeg|jpg|svg)\??.*$/gmi; + if (imageUrlRegex.test(imageUrl)) { + embed.setFooter({text: footerText, iconURL: imageUrl}); + msg.edit({ embeds: [embed]}); + } else { + embed.setFooter({text: footerText}); + } + msg.edit({ embeds: [embed]}); + question.delete().catch(() => false); + msgg.delete().catch(() => false); + question2.delete().catch(() => false); + msgg2.delete().catch(() => false); +} if(i.values[0] == "embedthumbnail") { var yx = await message.channel.send({ content: "Quel sera le **Thumnail** de l'embed ?" }) let collected = await message.channel.awaitMessages({ filter: m => m.author.id === message.author.id, max: 1, time: 60000, errors: ["time"] }) @@ -140,21 +178,25 @@ module.exports = { }) } - if(i.customId == "embedurl") { + if(i.values[0] === "embedurl") { let question = await message.channel.send({ content: "Veuillez saisir l'URL de l'embed" }) let collected = await question.channel.awaitMessages({ filter: m => m.author.id === message.author.id, max: 1 }).then(collected => { let msgg = collected.first() embed.setURL(msgg.content) msg.edit({ embeds: [embed]}) + question.delete().catch(() => false); + msgg.delete().catch(() => false); }) } - if(i.customId == "embedcolor") { + if(i.values[0] === "embedcolor") { let question = await message.channel.send({ content: "Veuillez saisir la couleur de l'embed" }) let collected = await question.channel.awaitMessages({ filter: m => m.author.id === message.author.id, max: 1 }).then(collected => { let msgg = collected.first() embed.setColor(msgg.content) msg.edit({ embeds: [embed]}) + question.delete().catch(() => false); + msgg.delete().catch(() => false); }) } diff --git a/commands/moderation/badword.js b/commands/moderation/badword.js new file mode 100644 index 0000000..969b6cb --- /dev/null +++ b/commands/moderation/badword.js @@ -0,0 +1,74 @@ +const { EmbedBuilder } = require('discord.js'); +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database('myDatabase.db'); + +module.exports = { + name: 'blword', + aliases: ['badword'], + description: 'Affiché ou gérés les blword', + emote: '🔧', + utilisation: 'blword [mot]', + category: 'moderation', + async execute(message, args, client) { + const botId = message.client.user.id; + const guildId = message.guild.id; + const add = args[0] === "add"; + const del = args[0] === "del"; + const list = args[0] === "list"; + + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + + data[guildId] = data[guildId] || {}; + data[guildId].badwords = data[guildId].badwords || []; + + if (add) { + const word = args[1]; + if (!data[guildId].badwords.includes(word)) { + data[guildId].badwords.push(word); + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [botId, JSON.stringify(data)], (err) => { + if (err) { + console.error(err.message); + message.reply('Une erreur est survenue lors de la mise à jour de la base de données.'); + return; + } + }); + message.reply(`Le mot "${word}" a été ajouté à la liste des mots interdits.`); + } else { + message.reply(`Le mot "${word}" est déjà dans la liste des mots interdits.`); + } + } else if (del) { + const word = args[1]; + const index = data[guildId].badwords.indexOf(word); + if (index !== -1) { + data[guildId].badwords.splice(index, 1); + db.run('INSERT OR REPLACE INTO gestion (id, value) VALUES (?, ?)', [botId, JSON.stringify(data)], (err) => { + if (err) { + console.error(err.message); + message.reply('Une erreur est survenue lors de la mise à jour de la base de données.'); + return; + } + }); + message.reply(`Le mot "${word}" a été retiré de la liste des mots interdits.`); + } else { + message.reply(`Le mot "${word}" n'est pas dans la liste des mots interdits.`); + } + } else if (list) { + const embed = new EmbedBuilder() + .setTitle('Liste des mots interdits') + .setDescription(data[guildId].badwords.join('\n') || 'Aucun mot interdit n\'est défini.') + .setFooter({text: `Mots interdits | ${client.user.username}`}) + .setColor('#0099ff'); + message.channel.send({ embeds: [embed] }); + } else { + message.reply('Commande invalide. Utilisez `badword add [mot]`, `badword del [mot]` ou `badword list`.'); + } + }, +}; \ No newline at end of file diff --git a/events/gestion/badwordEvent.js b/events/gestion/badwordEvent.js new file mode 100644 index 0000000..3a3b249 --- /dev/null +++ b/events/gestion/badwordEvent.js @@ -0,0 +1,36 @@ +const { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder, ChannelType } = require('discord.js'); +const sqlite3 = require('sqlite3').verbose(); +const { Events } = require("discord.js"); +const db = new sqlite3.Database('myDatabase.db'); +const { getPermissionLevel } = require('../../fonction/getPermissionLevel'); +module.exports = { + name: Events.MessageCreate, + async execute(message, client) { + const botId = message.client.user.id; + const guildId = message.guild.id; + const user = message.member; + if (message.channel.type === ChannelType.DM) return; + let data = await new Promise((resolve, reject) => { + db.get('SELECT value FROM gestion WHERE id = ?', [botId], (err, row) => { + if (err) { + console.error(err.message); + reject(err); + } + resolve(row ? JSON.parse(row.value) : {}); + }); + }); + if (!data[guildId]) { + data[guildId] = { badwords: [] }; + } + const badwords = data[guildId].badwords || []; + const containsBadword = badwords.some(word => message.content.toLowerCase().includes(word.toLowerCase())); + + if (containsBadword) { + if (message.author.id === client.user.id || await getPermissionLevel(user, client) >= 10) return; + try { + await message.delete({ reason: 'Contient un mot interdit' }); + } catch (error) { + } + } + }, +}; \ No newline at end of file diff --git a/events/gestion/guildMemberAdd.js b/events/gestion/guildMemberAdd.js index d055a54..cd03b82 100644 --- a/events/gestion/guildMemberAdd.js +++ b/events/gestion/guildMemberAdd.js @@ -19,9 +19,9 @@ module.exports = { }); }); - let blrank = data.blrank || {}; + let blrank = data[guildId] && data[guildId].blrank ? data[guildId].blrank : {}; - if (blrank[guildId] && blrank[guildId][newMember.id]) { + if (blrank[newMember.id]) { const addedRoles = newMember.roles.cache.filter(role => !oldMember.roles.cache.has(role.id)); addedRoles.forEach(async role => { try {