PermisosRolesIntents4 min de lectura

Gestionar permisos y roles del bot

Calculadora de permisos, jerarquía de roles, verificación de permisos en comandos e intents.


Jerarquía de permisos en Discord

Discord usa un sistema jerárquico de permisos. El bot solo puede gestionar roles que estén por debajo de su rol más alto en la lista del servidor.

Paso 1: Entender la calculadora de permisos

Cada permiso es un bit en un integer. Podés combinarlos:

javascript
const { PermissionFlagsBits } = require('discord.js');

// Permisos comunes para bots
const botPermissions = [
  PermissionFlagsBits.SendMessages,
  PermissionFlagsBits.EmbedLinks,
  PermissionFlagsBits.ManageMessages,
  PermissionFlagsBits.ManageRoles,
  PermissionFlagsBits.KickMembers,
  PermissionFlagsBits.BanMembers
];

// Calcular el integer de permisos
const permissionInteger = botPermissions.reduce((acc, perm) => acc | perm, 0n);
console.log(`Permission integer: ${permissionInteger}`);

Paso 2: Verificar permisos en comandos

Siempre verificá permisos antes de ejecutar acciones:

javascript
client.on('interactionCreate', async interaction => {
  if (commandName === 'ban') {
    // Verificar que el usuario tiene permiso
    if (!interaction.member.permissions.has(PermissionFlagsBits.BanMembers)) {
      return interaction.reply({
        content: 'No tenés permiso para banear.',
        ephemeral: true
      });
    }

    // Verificar que el bot tiene permiso
    if (!interaction.guild.members.me.permissions.has(PermissionFlagsBits.BanMembers)) {
      return interaction.reply({
        content: 'No tengo permiso para banear. Revisá mis roles.',
        ephemeral: true
      });
    }

    // Verificar jerarquía de roles
    const target = interaction.options.getMember('usuario');
    if (target.roles.highest.position >= interaction.guild.members.me.roles.highest.position) {
      return interaction.reply({
        content: 'No puedo banear a alguien con un rol igual o superior al mío.',
        ephemeral: true
      });
    }
  }
});

Paso 3: Configurar intents correctamente

Los intents controlan qué eventos recibe tu bot:

javascript
const { Client, GatewayIntentBits } = require('discord.js');

const client = new Client({
  intents: [
    GatewayIntentBits.Guilds,           // Siempre necesario
    GatewayIntentBits.GuildMessages,     // Para leer mensajes
    GatewayIntentBits.MessageContent,    // Para leer contenido (privilegiado)
    GatewayIntentBits.GuildMembers,      // Para eventos de miembros (privilegiado)
    GatewayIntentBits.GuildModeration,   // Para eventos de moderación
  ]
});

Intents privilegiados requieren activación manual en el Developer Portal.

Paso 4: Permisos por comando con defaultMemberPermissions

javascript
new SlashCommandBuilder()
  .setName('ban')
  .setDescription('Banear un usuario')
  .setDefaultMemberPermissions(PermissionFlagsBits.BanMembers)
  .setDMPermission(false) // Solo funciona en servidores

Esto oculta el comando a usuarios sin el permiso requerido.

Recomendaciones

  • Pedí solo los permisos que tu bot realmente necesita
  • Verificá permisos tanto del usuario como del bot antes de actuar
  • Usá defaultMemberPermissions para restringir comandos sensibles
  • Documentá qué permisos necesita tu bot y por qué

¿Te resultó útil esta guía?