Permisos
Los permisos son una manera de limitar y otorgar ciertas capacidades a los usuarios en Discord. Se puede configurar un conjunto base de permisos a nivel de gremio para distintos roles. Al asignar estos roles a los usuarios, se otorgan o revocan privilegios específicos dentro del gremio. Además de los permisos a nivel de gremio, Discord soporta reescrituras de permisos que pueden asignarse a roles o usuarios individuales por canal.
Los permisos se almacenan como enteros de longitud variable serializados a cadena y se calculan usando operaciones a nivel de bits. Por ejemplo, el valor de permisos 123 se serializa como “123”. Para garantizar estabilidad a largo plazo, se recomienda deserializarlos utilizando librerías de enteros grandes (Big Integer) en tu lenguaje preferido. El valor total de permisos se calcula utilizando el operador OR (|
) sobre cada valor individual, y los flags se pueden comprobar usando AND (&
).
En API v8 y superiores, todos los permisos se serializan como cadenas, incluidos los campos allow
y deny
en las reescrituras. Todos los permisos nuevos también se agregan al campo base.
# Permissions value that can Send Messages (0x800) and Add Reactions (0x40):
permissions = 0x40 | 0x800 # 2112
# Checking for flags that are set:
(permissions & 0x40) == 0x40 # True
(permissions & 0x800) == 0x800 # True
# Kick Members (0x2) was not set:
(permissions & 0x2) == 0x2 # False
Se requiere lógica adicional cuando hay reescrituras de permisos, esto se explica más abajo. Para más información sobre operaciones a nivel de bits y flags, consulta esta página.
A continuación se muestra una tabla con todos los permisos actuales, sus valores hexadecimales, una breve descripción de los privilegios que otorgan y el tipo de canal al que aplican, si corresponde:
Banderas de permisos a nivel de bits
0x0001 (1 << 0)
CREATE_INSTANT_INVITE
Permite crear invitaciones instantáneas.
T, V, S
0x0002 (1 << 1)
KICK_MEMBERS 1
Permite expulsar miembros.
0x0004 (1 << 2)
BAN_MEMBERS 1
Permite banear miembros.
0x0008 (1 << 3)
ADMINISTRATOR 1
Otorga todos los permisos y omite las reescrituras de permisos de canal.
0x00010 (1 << 4)
MANAGE_CHANNELS 1
Permite gestionar y editar canales.
T, V, S
0x00020 (1 << 5)
MANAGE_GUILD 1
Permite administrar y editar el gremio.
0x00040 (1 << 6)
ADD_REACTIONS
Permite añadir reacciones a mensajes.
T, V, S
0x00080 (1 << 7)
VIEW_AUDIT_LOG
Permite ver los registros de auditoría.
0x000100 (1 << 8)
PRIORITY_SPEAKER
Permite usar el altavoz prioritario en canales de voz.
V
0x000200 (1 << 9)
STREAM
Permite usar video y transmitir (go live) en un canal de voz.
V, S
0x000400 (1 << 10)
VIEW_CHANNEL
Permite a los miembros del gremio ver un canal, lo que incluye leer mensajes en texto y unirse a canales de voz.
T, V, S
0x000800 (1 << 11)
SEND_MESSAGES
Permite enviar mensajes en un canal y crear hilos en un foro (no permite enviar mensajes en hilos).
T, V, S
0x0001000 (1 << 12)
SEND_TTS_MESSAGES
Permite enviar mensajes /tts
.
T, V, S
0x0002000 (1 << 13)
MANAGE_MESSAGES 1
Permite eliminar mensajes de otros usuarios.
T, V, S
0x0004000 (1 << 14)
EMBED_LINKS
Los enlaces enviados por usuarios con este permiso se auto-incrustarán.
T, V, S
0x0008000 (1 << 15)
ATTACH_FILES
Permite subir imágenes y archivos.
T, V, S
0x0001000 (1 << 16)
READ_MESSAGE_HISTORY
Permite leer el historial de mensajes.
T, V, S
0x0002000 (1 << 17)
MENTION_EVERYONE
Permite utilizar la etiqueta @everyone para notificar a todos en un canal, y la @here para notificar a los conectados en un canal.
T, V, S
0x0004000 (1 << 18)
USE_EXTERNAL_EMOJIS
Permite el uso de emojis personalizados de otros servidores.
T, V, S
0x0008000 (1 << 19)
VIEW_GUILD_INSIGHTS
Permite ver estadísticas del gremio.
0x0001000 (1 << 20)
CONNECT
Permite unirse a un canal de voz.
V, S
0x0002000 (1 << 21)
SPEAK
Permite hablar en un canal de voz.
V
0x0004000 (1 << 22)
MUTE_MEMBERS
Permite silenciar miembros en un canal de voz.
V, S
0x0008000 (1 << 23)
DEAFEN_MEMBERS
Permite ensordecer a miembros en un canal de voz.
V
0x0001000 (1 << 24)
MOVE_MEMBERS
Permite mover miembros entre canales de voz.
V, S
0x0002000 (1 << 25)
USE_VAD
Permite el uso de detección de voz en un canal de voz.
V
0x0004000 (1 << 26)
CHANGE_NICKNAME
Permite modificar tu propio apodo.
0x0008000 (1 << 27)
MANAGE_NICKNAMES
Permite modificar los apodos de otros usuarios.
0x0001000 (1 << 28)
MANAGE_ROLES 1
Permite administrar y editar roles.
T, V, S
0x0002000 (1 << 29)
MANAGE_WEBHOOKS 1
Permite administrar y editar webhooks.
T, V, S
0x0004000 (1 << 30)
MANAGE_EXPRESSIONS 1 3
Permite editar y eliminar emojis, stickers y sonidos del soundboard.
0x0008000 (1 << 31)
USE_APPLICATION_COMMANDS
Permite usar comandos de aplicación, incluidas barras y menú contextual.
T, V, S
0x0001000 (1 << 32)
REQUEST_TO_SPEAK
Permite solicitar hablar en canales de escenario.
S
0x0002000 (1 << 33)
MANAGE_EVENTS 3
Permite editar y eliminar eventos programados.
V, S
0x0004000 (1 << 34)
MANAGE_THREADS 1
Permite eliminar y archivar hilos y ver todos los hilos privados.
T
0x0008000 (1 << 35)
CREATE_PUBLIC_THREADS
Permite crear hilos públicos y de anuncios.
T
0x0001000 (1 << 36)
CREATE_PRIVATE_THREADS
Permite crear hilos privados.
T
0x0002000 (1 << 37)
USE_EXTERNAL_STICKERS
Permite el uso de stickers personalizados de otros servidores.
T, V, S
0x0004000 (1 << 38)
SEND_MESSAGES_IN_THREADS
Permite enviar mensajes en hilos.
T
0x0008000 (1 << 39)
USE_EMBEDDED_ACTIVITIES
Permite usar actividades integradas en un canal de voz.
T, V
0x0001000 (1 << 40)
MODERATE_MEMBERS 2
Permite silenciar usuarios para impedirles enviar o reaccionar a mensajes en chat, hilos o hablar en voz y escenario.
0x0002000 (1 << 41)
VIEW_CREATOR_MONETIZATION_ANALYTICS 1
Permite ver estadísticas de membresías de rol del gremio.
0x0004000 (1 << 42)
USE_SOUNDBOARD
Permite el uso del soundboard en un canal de voz.
V
0x0008000 (1 << 43)
CREATE_EXPRESSIONS 3
Permite crear emojis, stickers y sonidos del soundboard, y editar/borrar los propios.
0x0001000 (1 << 44)
CREATE_EVENTS 3
Permite crear eventos programados y editar/borrar los propios.
0x0004000 (1 << 45)
USE_EXTERNAL_SOUNDS
Permite usar sonidos del soundboard de otros servidores.
V
0x0004000 (1 << 46)
SEND_VOICE_MESSAGES
Permite enviar mensajes de voz en un canal.
T, V, S
0x0008000 (1 << 47)
USE_CLYDE_AI
Permite usar la integración con Clyde AI.
T, V, S
0x0001000 (1 << 48)
SET_VOICE_CHANNEL_STATUS
Permite establecer estado de canal de voz.
V
0x0002000 (1 << 49)
SEND_POLLS
Permite enviar encuestas.
T, V, S
0x0004000 (1 << 50)
USE_EXTERNAL_APPS
Permite el uso de aplicaciones instaladas por el usuario sin respuestas efímeras forzadas.
T, V, S
1 Estos permisos requieren que el usuario o el propietario del bot utilicen autenticación multifactor cuando se usen en una guild que tenga habilitada la MFA a nivel de servidor.
2 Consulta Permisos para Miembros en Tiempo de Espera / en Cuarentena para entender cómo se modifican temporalmente los permisos para los usuarios en tiempo de espera o en cuarentena.
3 Los eventos separados para la creación de recursos solo están disponibles para los clientes que especifiquen un número de compilación reciente del cliente. De lo contrario, se ignoran y se aplican los permisos de gestión.
Nota que los nombres de los permisos pueden referirse de manera diferente en el cliente de Discord. Por ejemplo, "Administrar permisos" se refiere a MANAGE_ROLES
, "Usar actividad de voz" se refiere a USE_VAD
, y "Silenciar temporalmente a miembros" se refiere a MODERATE_MEMBERS
.
Las abreviaturas de tipo de canal indican lo siguiente:
T
GUILD_TEXT, GUILD_ANNOUNCEMENT, GUILD_FORUM, GUILD_MEDIA
V
GUILD_VOICE
S
GUILD_STAGE_VOICE
Jerarquía de permisos
La forma en la que se aplican los permisos puede parecer intuitiva a primera vista, pero existen restricciones ocultas que evitan que los usuarios realicen ciertas acciones inapropiadas en función del rol más alto de un usuario en comparación al objetivo. El rol más alto de un usuario es aquel con mayor prioridad de orden en el gremio, empezando por @everyone con prioridad 0. Los permisos siguen reglas jerárquicas según:
Un usuario puede conceder roles a otros usuarios que estén en una posición inferior a la de su propio rol más alto.
Un usuario puede editar roles de posición inferior a su rol más alto, pero solo puede concederles permisos que él mismo posea.
Un usuario sólo puede ordenar roles inferiores a su rol más alto.
Un usuario sólo puede expulsar, banear y editar apodos de usuarios cuyo rol más alto sea inferior al suyo.
En otros casos, los permisos no respetan la jerarquía de roles. Por ejemplo, si un usuario tiene dos roles: A y B. A niega el permiso VIEW_CHANNEL
en un canal #coolstuff. B concede el permiso VIEW_CHANNEL
en el mismo canal. El usuario podrá ver el canal #coolstuff sin importar la posición de los roles.
Reescritura de permisos
Las reescrituras permiten aplicar ciertos permisos a roles o usuarios en canales individuales. Los permisos aplicables se indican por T (texto), V (voz), o S (escenario) en la tabla anterior.
Cuando se utilizan reescrituras, puede darse el caso de colisiones: el usuario puede tener reescrituras contradictorias respecto a sus permisos a nivel de gremio. Considerando esto, los permisos se aplican con la siguiente jerarquía:
Los permisos base dados a @everyone se aplican a nivel de gremio.
Los permisos otorgados a un usuario por sus roles se aplican a nivel de gremio.
Las reescrituras que niegan permisos para @everyone se aplican a nivel de canal.
Las reescrituras que conceden permisos para @everyone se aplican a nivel de canal.
Las reescrituras negativas específicas para roles se aplican a nivel de canal.
Las reescrituras positivas específicas para roles se aplican a nivel de canal.
Las reescrituras negativas para el miembro se aplican a nivel de canal.
Las reescrituras positivas para el miembro se aplican a nivel de canal.
El siguiente pseudocódigo ilustra el proceso programáticamente:
def compute_base_permissions(member, guild):
if guild.is_owner(member):
return ALL
role_everyone = guild.get_role(guild.id) # get @everyone role
permissions = role_everyone.permissions
for role in member.roles:
permissions |= role.permissions
if permissions & ADMINISTRATOR == ADMINISTRATOR:
return ALL
return permissions
def compute_overwrites(base_permissions, member, channel):
# ADMINISTRATOR overrides any potential permission overwrites, so there is nothing to do here.
if base_permissions & ADMINISTRATOR == ADMINISTRATOR:
return ALL
permissions = base_permissions
overwrite_everyone = overwrites.get(channel.guild_id) # Find (@everyone) role overwrite and apply it.
if overwrite_everyone:
permissions &= ~overwrite_everyone.deny
permissions |= overwrite_everyone.allow
# Apply role specific overwrites.
overwrites = channel.permission_overwrites
allow = NONE
deny = NONE
for role_id in member.roles:
overwrite_role = overwrites.get(role_id)
if overwrite_role:
allow |= overwrite_role.allow
deny |= overwrite_role.deny
permissions &= ~deny
permissions |= allow
# Apply member specific overwrite if it exist.
overwrite_member = overwrites.get(member.user_id)
if overwrite_member:
permissions &= ~overwrite_member.deny
permissions |= overwrite_member.allow
return permissions
def compute_permissions(member, channel):
base_permissions = compute_base_permissions(member, channel.guild)
return compute_overwrites(base_permissions, member, channel)
Permisos implícitos
Algunos permisos en Discord se niegan o conceden de forma implícita según el uso lógico. Los dos casos principales son VIEW_CHANNEL
y SEND_MESSAGES
en canales de texto. Negar VIEW_CHANNEL
a un usuario o rol en un canal, implícitamente niega otros permisos sobre ese canal. Aunque permisos como SEND_MESSAGES
no estén negados explícitamente, se ignoran porque el usuario no puede leer el canal.
Negar SEND_MESSAGES
niega implícitamente MENTION_EVERYONE
, SEND_TTS_MESSAGES
, ATTACH_FILES
y EMBED_LINKS
. De nuevo, no están negados explícitamente en los cálculos, pero se ignoran porque el usuario no puede realizar la acción base.
En canales de voz y escenario, negar el permiso CONNECT
también niega implícitamente permisos como MANAGE_CHANNELS
.
Puede haber otros casos donde un permiso niegue o conceda otros de forma implícita, siempre basados en la lógica de cómo debe o no debe interactuar un usuario con Discord según sus permisos.
Permisos heredados (hilos)
Los hilos heredan los permisos del canal padre donde se crearon, con una excepción: el permiso SEND_MESSAGES
no se hereda; los usuarios deben tener SEND_MESSAGES_IN_THREADS
para enviar mensajes en un hilo, lo que les permite participar en hilos como en canales de anuncios.
Los usuarios deben tener el permiso VIEW_CHANNEL
para ver cualquier hilo en el canal, aunque hayan sido mencionados o añadidos directamente al hilo.
Permisos para miembros silenciados o en cuarentena
Los miembros silenciados temporalmente perderán todos los permisos excepto VIEW_CHANNEL
y READ_MESSAGE_HISTORY
. Esto también aplica a los miembros en cuarentena, con la adición de CHANGE_NICKNAME
. Los dueños y usuarios con ADMINISTRATOR
están exentos.
Permisos en gremios descubribles
Los gremios definidos como descubribles tienen una configuración de permisos especial para permitir que no-miembros "ronden" por el gremio sin unirse. Los no-miembros heredan los permisos VIEW_CHANNEL
y READ_MESSAGE_HISTORY
del rol @everyone, lo que les permite ver canales públicos y leer mensajes. Sin embargo, no pueden interactuar con el gremio de ninguna manera, como enviar mensajes, reaccionar o unirse a canales de voz.
Si un no-miembro está rondando un gremio descubrible con una instancia de escenario pública activa, heredará además los permisos CONNECT
, REQUEST_TO_SPEAK
, SPEAK
y USE_VAD
en ese canal de escenario.
Sincronización de permisos
Los permisos respecto a categorías y canales dentro de categorías funcionan mediante sincronización, no herencia directa. Si un canal hijo tiene los mismos permisos y reescrituras (o ninguna) que su categoría padre, se considera "sincronizado" con la categoría. Cualquier cambio futuro en la categoría padre se reflejará en sus canales sincronizados. Cualquier cambio en el canal hijo hará que deje de estar sincronizado, y sus permisos ya no cambiarán junto con los de la categoría padre.