Así que quería hacer un comando de silencio para mi bot de Discord. Se supone que debe silenciar a un usuario mencionado hasta que se active mediante otro comando (WIP), además, debe haber una opción para dar una razón. Si no se proporciona ningún motivo, simplemente dice Motivo: ninguno. Me las arreglé para restringir el acceso del comando a un rol de mod (aunque en el siguiente código verifica el indicador MODERATE_MEMBERS, porque esa es una mejor manera de hacerlo) e hice que devolviera todos los mensajes de error requeridos como "I can' t silenciar a ese usuario" y tal. Aquí está mi código:
const { Permissions } = require('discord.js'); module.exports = { name: 'mute', description: "Mutes a user for an unlimited amount of time.", execute(message, args) { const target = message.mentions.members.first(); let muteReason = args.join(" ").slice(22); if(message.member.permissions.has(Permissions.FLAGS.MODERATE_MEMBERS)) { if(target) { if(target.id == '943093289031176203') { message.reply("I can't mute myself.") } else if(message.member == target) { message.reply("You can't mute yourself!") } else if(target.permissions.has(Permissions.FLAGS.MODERATE_MEMBERS)) { if(!muteReason) { muteReason = "None" } let muteRole = message.guild.roles.cache.find(role => role.name === "muted"); let memberTarget = message.guild.members.cache.get(target.id); memberTarget.roles.add(muteRole.id); message.reply(`<@${memberTarget.user.id}> has been muted. Rason: ` + muteReason); } else { message.reply("I can't mute that user.") } } else { message.reply("You have to mention a valid member of this server.") } } else { message.reply("You can't use that.") } } }El problema que tengo es que los moderadores pueden silenciar a otros moderadores, lo que no debería suceder. Básicamente, necesito una solución que haga que el comando no funcione con otras personas que tienen un rol de moderador o un comando que no funcione con personas con ciertos permisos (preferiblemente el segundo, ya que será más útil).
Puede verificar los permisos de moderador en el usuario especificado, luego solo silenciar si el usuario no tiene el permiso. De esta manera, no permitirá que las modificaciones se silencien.
//... let memberTarget = message.guild.members.cache.get(target.id); if (memberTarget.permissions.has(Permissions.FLAGS.MODERATE_MEMBERS)) { message.reply(`<@${memberTarget.user.id}> is a Moderator. You cant' mute them.`); } else { memberTarget.roles.add(muteRole.id); message.reply(`<@${memberTarget.user.id}> has been muted. Reason: ` + muteReason); } //...