diff --git a/commands/antiraid/rolelimit.js b/commands/antiraid/rolelimit.js new file mode 100644 index 0000000..9401a94 --- /dev/null +++ b/commands/antiraid/rolelimit.js @@ -0,0 +1,96 @@ +const { ActionRowBuilder, EmbedBuilder, ButtonBuilder, ButtonStyle} = require('discord.js'); +const db = require('quick.db'); +const GestionDb = new db.table('gestion'); + +module.exports = { + name: 'rolelimit', + description: 'Affiche et g猫re les r么les limit茅s', + emote: '馃敀', + utilisation: '+rolelimit', + category: 'antiraid', + + async execute(interaction) { + const botId = interaction.client.user.id; + const guildId = interaction.guild.id; + + // R茅cup猫re les r么les limit茅s + let limitedRoles = GestionDb.get(`${botId}.${guildId}.rolelimits`) || []; + + // Cr茅e un embed avec les r么les limit茅s + const embed = new EmbedBuilder() + .setTitle('R么les limit茅s') + .setDescription(limitedRoles.map(role => `<@&${role.id}>: ${role.limit}`).join('\n') || 'Aucun r么le limit茅.') + .setColor('#0099ff'); + + // Cr茅e les boutons + const addButton = new ButtonBuilder() + .setCustomId('rolelimit_add') + .setLabel('Add') + .setStyle(ButtonStyle.Success); + const removeButton = new ButtonBuilder() + .setCustomId('rolelimit_remove') + .setLabel('Remove') + .setStyle(ButtonStyle.Danger); + const row = new ActionRowBuilder() + .addComponents(addButton, removeButton); + const sentMessage = await interaction.reply({ embeds: [embed], components: [row], fetchReply: true }); + +const filter = i => i.isButton() && i.customId.startsWith('rolelimit_') && i.user; +const collector = sentMessage.createMessageComponentCollector({ filter: filter, time: 2 * 60 * 1000 + 30 * 1000 }); + +collector.on('collect', async (i) => { + if (i.customId === 'rolelimit_add') { + const questionMessage = await i.reply('Mentionnez un r么le ou fournissez un ID de r么le 脿 limiter.'); + const filter = m => m.author && m.author.id === i.user.id; + const collected = await i.channel.awaitMessages({ filter, max: 1, time: 60000000 }); + const role = collected.first().mentions.roles.first() || interaction.guild.roles.cache.get(collected.first().content); + if (!role) { + return i.followUp('R么le invalide.'); + } + await i.followUp('Quelle est la limite pour ce r么le ?'); + const limitCollected = await i.channel.awaitMessages({ filter, max: 1, time: 60000000 }); + const limit = parseInt(limitCollected.first().content); + if (isNaN(limit)) { + return i.followUp('Limite invalide.'); + } + const existingRole = limitedRoles.find(r => r.id === role.id); + if (existingRole) { + existingRole.limit = limit; + } else { + limitedRoles.push({ id: role.id, limit }); + } + GestionDb.set(`${botId}.${guildId}.rolelimits`, limitedRoles); + await questionMessage.delete(); + await collected.first().delete(); + const updatedEmbed = new EmbedBuilder() + .setTitle('R么les limit茅s') + .setDescription(limitedRoles.map(role => `<@&${role.id}>: ${role.limit}`).join('\n') || 'Aucun r么le limit茅.') + .setColor('#0099ff'); + + sentMessage.edit({ embeds: [updatedEmbed] }); + } else if (i.customId === 'rolelimit_remove') { + const questionMessage = await i.reply('Mentionnez un r么le ou fournissez un ID de r么le 脿 supprimer.'); + const filter = m => m.author && m.author.id === i.user.id; + const collected = await i.channel.awaitMessages({ filter, max: 1, time: 60000000 }); + const roleToRemove = collected.first().mentions.roles.first() || interaction.guild.roles.cache.get(collected.first().content); + if (!roleToRemove) { + return i.followUp('R么le invalide.'); + } + limitedRoles = limitedRoles.filter(role => role.id !== roleToRemove.id); + GestionDb.set(`${botId}.${guildId}.rolelimits`, limitedRoles); + const updatedEmbed = new EmbedBuilder() + .setTitle('R么les limit茅s') + .setDescription(limitedRoles.map(role => `<@&${role.id}>: ${role.limit}`).join('\n') || 'Aucun r么le limit茅.') + .setColor('#0099ff'); + await questionMessage.delete(); + await collected.first().delete(); + sentMessage.edit({ embeds: [updatedEmbed] }); + } +}); + + collector.on('end', collected => { + sentMessage.delete(); + collected.forEach(i => i.message.delete()); + }); + }, +}; \ No newline at end of file diff --git a/commands/gestion/blrank.js b/commands/gestion/blrank.js new file mode 100644 index 0000000..4febe82 --- /dev/null +++ b/commands/gestion/blrank.js @@ -0,0 +1,39 @@ +const { EmbedBuilder} = require('discord.js'); +const db = require('quick.db'); +const GestionDb = new db.table("gestion"); + +module.exports = { + name: 'blrank', + description: 'Affich茅 ou g茅r茅s la blrankn', + emote: '馃憫', + utilisation: 'blrank [@user]', + category: 'gestion', + + async execute(message, args, client) { + const botId = message.client.user.id; + const guildId = message.guild.id; + + if (args.length > 0) { + const userId = args[0].replace(/<@!?(\d+)>/, '$1'); + let blrank = await GestionDb.get(`${botId}.${guildId}.blrank`) || {}; + + if (blrank[userId]) { + delete blrank[userId]; + await GestionDb.set(`${botId}.${guildId}.blrank`, blrank); + message.reply('Utilisateur retir茅 de la blrank.'); + } else { + blrank[userId] = true; + await GestionDb.set(`${botId}.${guildId}.blrank`, blrank); + message.reply('Utilisateur ajout茅 脿 la blrank.'); + } + } else { + let blrank = await GestionDb.get(`${botId}.${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] }); + } + }, +}; \ No newline at end of file diff --git a/commands/gestion/rvocal.js b/commands/gestion/rvocal.js index d278944..106e45f 100644 --- a/commands/gestion/rvocal.js +++ b/commands/gestion/rvocal.js @@ -39,40 +39,24 @@ module.exports = { return message.channel.send({ embeds: [embed] }); } - -// Si l'utilisateur fournit un salon vocal et des r么les -if (mentionedChannel && args.length > 1) { - const roles = []; - // Utilisez une boucle pour traiter tous les r么les mentionn茅s - for (let i = 1; i < args.length; i++) { - // V茅rifiez si message.mentions.roles est d茅fini - if (message.mentions.roles && message.mentions.roles.cache) { - const role = message.mentions.roles.cache.get(args[i]); - if (role) { - roles.push(role.id); - } else { - // V茅rifiez si l'argument est un ID de r么le valide - const roleById = message.guild.roles.cache.get(args[i]); - if (roleById) { - roles.push(roleById.id); + if (mentionedChannel && args.length > 1) { + const roles = []; + for (let i = 1; i < args.length; i++) { + const roleId = args[i].match(/^<@&(\d+)>$/) || args[i].match(/^(\d+)$/); + if (roleId) { + const role = message.guild.roles.cache.get(roleId[1]); + if (role) { + roles.push(role.id); + } else { + return message.channel.send("Un ou plusieurs r么les mentionn茅s sont invalides."); + } } else { return message.channel.send("Un ou plusieurs r么les mentionn茅s sont invalides."); } } - } else { - // V茅rifiez si l'argument est un ID de r么le valide - const roleById = message.guild.roles.cache.get(args[i]); - if (roleById) { - roles.push(roleById.id); - } else { - return message.channel.send("Un ou plusieurs r么les mentionn茅s sont invalides."); - } - } - } - // Enregistre les r么les dans la base de donn茅es - GestionDb.set(`${botId}.${guildId}.rolevocal.${mentionedChannel.id}`, roles); - message.channel.send(`Les r么les ont 茅t茅 enregistr茅s pour le salon vocal <#${mentionedChannel.id}>.`); -} + GestionDb.set(`${botId}.${guildId}.rolevocal.${mentionedChannel.id}`, roles); + message.channel.send(`Les r么les ont 茅t茅 enregistr茅s pour le salon vocal <#${mentionedChannel.id}>.`); + } }, }; \ No newline at end of file diff --git a/events/gestion/guildMemberAdd.js b/events/gestion/guildMemberAdd.js new file mode 100644 index 0000000..73abca8 --- /dev/null +++ b/events/gestion/guildMemberAdd.js @@ -0,0 +1,46 @@ +const db = require('quick.db'); +const GestionDb = new db.table('gestion'); +module.exports = { + name: 'guildMemberUpdate', + execute(oldMember, newMember) { + const botId = newMember.client.user.id; + const guildId = newMember.guild.id; + + const limitedRoles = GestionDb.get(`${botId}.${guildId}.rolelimits`) || []; + const blrank = GestionDb.get(`${botId}.${guildId}.blrank`) || {}; + + if (blrank[newMember.id]) { + const addedRoles = newMember.roles.cache.filter(role => !oldMember.roles.cache.has(role.id)); + addedRoles.forEach(async role => { + try { + await newMember.roles.remove(role); + } catch (error) { + console.error(`Erreur lors de la suppression du r么le <@&${role.id}> pour le membre ${newMember.user.tag}:`, error); + } + }); + return; + } + const addedRoles = newMember.roles.cache.filter(role => !oldMember.roles.cache.has(role.id)); + + addedRoles.forEach(async role => { + const limitedRole = limitedRoles.find(r => r.id === role.id); + if (limitedRole) { + const memberCount = newMember.guild.members.cache.filter(m => m.roles.cache.has(role.id)).size; + if (limitedRole.limit === 0) { + try { + await newMember.roles.remove(role); + } catch (error) { + console.error(`Erreur lors de la suppression du r么le <@&${role.id}> pour le membre ${newMember.user.tag}:`, error); + } + } + if (memberCount > limitedRole.limit) { + try { + await newMember.roles.remove(role); + } catch (error) { + console.error(`Erreur lors de la suppression du r么le <@&${role.id}> pour le membre ${newMember.user.tag}:`, error); + } + } + } + }); + }, +}; \ No newline at end of file