Permisos
Los bots reciben los permisos como un campo de bits entero de 53 bits con la forma de Discord. Los bits y sus significados coinciden con Discord; los valores salen de las tablas nativas de permisos de grupo y de canal de GameVox. Los bits sin equivalente en GameVox devuelven 0.
Correspondencia nativo → Discord
| Bit de Discord | Hex | Origen en GameVox |
|---|---|---|
| ADMINISTRATOR | 0x8 | groups.group_type IN ('owner', 'admin') |
| VIEW_CHANNEL | 0x400 | channel_permissions.view_channel / group_permissions.view_channels |
| READ_MESSAGE_HISTORY | 0x10000 | Igual que VIEW_CHANNEL (no hay interruptor de historial aparte) |
| SEND_MESSAGES | 0x800 | send_messages |
| MANAGE_MESSAGES | 0x2000 | manage_messages |
| EMBED_LINKS | 0x4000 | can_post_links |
| ATTACH_FILES | 0x8000 | send_files |
| ADD_REACTIONS | 0x40 | add_reactions |
| MENTION_EVERYONE | 0x20000 | Solo para admins en v1 |
| CONNECT (voice) | 0x100000 | join_voice |
| SPEAK | 0x200000 | speak_in_voice |
| STREAM (screen share) | 0x200 | screen_share |
| USE_VAD | 0x2000000 | use_vad (true por defecto; ponerlo en false obliga a pulsar para hablar) |
| KICK_MEMBERS | 0x2 | kick_users != 'deny' |
| BAN_MEMBERS | 0x4 | ban_users != 'deny' |
| MUTE_MEMBERS | 0x400000 | mute_users != 'deny' |
| MOVE_MEMBERS | 0x1000000 | move_users != 'deny' |
| MANAGE_CHANNELS | 0x10 | create_channels / edit_channels / delete_channels todos distintos de 'deny' |
| MANAGE_GUILD | 0x20 | edit_server != 'deny' |
| MANAGE_ROLES | 0x10000000 | manage_members |
| MANAGE_NICKNAMES | 0x8000000 | manage_members (agrupado con MANAGE_ROLES) |
| CHANGE_NICKNAME | 0x4000000 | Siempre concedido (coincide con el valor por defecto de Discord) |
| MANAGE_WEBHOOKS | 0x20000000 | Propietario / admin en v1 |
| VIEW_AUDIT_LOG | 0x80 | Propietario / admin en v1 |
| PRIORITY_SPEAKER | 0x100 | priority_speaker |
| MANAGE_EVENTS | 0x200000000 | manage_events != 'deny' |
| CREATE_EVENTS | 0x100000000000 | manage_events != 'deny' (agrupado con MANAGE_EVENTS) |
| MANAGE_GUILD_EXPRESSIONS | 0x40000000 | manage_emojis != 'deny' |
| CREATE_GUILD_EXPRESSIONS | 0x80000000000 | manage_emojis != 'deny' (agrupado) |
| DEAFEN_MEMBERS | 0x800000 | deafen_users != 'deny' |
| SEND_MESSAGES_IN_THREADS | 0x4000000000 | send_messages (agrupado con SEND_MESSAGES) |
Bits activos por defecto
Están puestos para cualquier persona miembro no denegada, igual que el rol por defecto de Discord. Si la lógica de tu bot los comprueba, siempre aparecerán concedidos (salvo que la persona esté baneada):
CREATE_INSTANT_INVITE(0x1)USE_APPLICATION_COMMANDS(0x80000000)USE_EXTERNAL_EMOJIS(0x40000)USE_EXTERNAL_STICKERS(0x2000000000)
Bits que siempre devuelven cero
Todavía no tienen equivalente en GameVox y se informan como no activos. Los bots que dependan de ellos deberían degradar con elegancia (la mayoría de bibliotecas ya tratan un bit denegado como «función no disponible aquí»).
MANAGE_THREADS,USE_PUBLIC_THREADS,USE_PRIVATE_THREADS: los hilos son un esbozo en v1.MODERATE_MEMBERS(timeout): sin equivalente nativo.USE_EMBEDDED_ACTIVITIES: no hay función de Actividades.USE_SOUNDBOARD,SEND_VOICE_MESSAGES: no implementados.- Bits de monetización: no hay Premium Apps.
Cálculo de permisos
Idéntico al algoritmo de 7 pasos de Discord:
- Empieza con los permisos de
@everyoneen la guild. - Aplica un OR con cada rol que tenga la persona.
- Si el resultado incluye ADMINISTRATOR, se corta: lo tiene todo.
- Aplica las excepciones de canal de
@everyone(primero allow, después deny). - Aplica las excepciones de canal de cada rol (primero allow, después deny).
- Aplica las excepciones de canal de la persona (primero allow, después deny).
- Si el canal está en una categoría, sus excepciones se aplican también en el paso de rol y de persona.
En el paso 2 es donde aparece la diferencia de abajo: una persona en GameVox está en un solo grupo, así que solo hay un rol al que aplicar el OR. Consulta Un grupo por persona.
Un grupo por persona
La mayor diferencia de comportamiento respecto a Discord. Una persona en GameVox pertenece a exactamente un grupo por servidor, mientras que en Discord puede tener muchos roles a la vez. Asignar un grupo sustituye al grupo anterior.
Los endpoints de rol siguen funcionando, y las bibliotecas que ya usas los siguen llamando: simplemente se resuelven a ese único grupo.
| Llamada | Qué ocurre |
|---|---|
PUT .../members/{id}/roles/{rid} | La persona acaba en ese grupo. Su grupo anterior se sustituye, no se conserva junto al nuevo. |
DELETE .../members/{id}/roles/{rid} | Lo quita. Si era su único grupo, pasa al grupo por defecto del servidor en lugar de quedarse sin ninguno. |
PATCH .../members/{id} con roles: [...] | Se acepta y después se reduce al grupo de mayor rango de la lista. Una lista vacía significa el grupo por defecto. |
Una lista se reduce en lugar de rechazarse para que un member.roles.set([...]) corriente siga funcionando. Gana el mayor rango porque el rango es lo que define la posición: entre un grupo de moderación y un grupo de color, la persona es moderadora.
Los grupos llevan límites de subida, voz, cámara y pantalla compartida, y cada persona obtiene el límite más generoso de los grupos en los que está. Con un solo grupo eso es simplemente el límite de su grupo, lo cual es la otra razón por la que una app no puede tener a alguien en dos: sería una forma de superar un tope fijado por la administración.
El grupo propio de una aplicación —el que creó su instalación— no se ve afectado por nada de esto. Su membresía pertenece a la instalación, y ninguna app puede añadirse a sí misma ni quitar a otra de él.
Jerarquía de roles
El groups.rank nativo se corresponde con role.position de Discord. Un bot puede gestionar estrictamente los roles por debajo de la posición de su rol más alto, igual que en Discord. Las llamadas a PATCH .../members/{id}/roles/{rid} con un rol igual o superior al rol más alto del bot devuelven 403.
Timeouts
El campo communication_disabled_until de Discord no tiene equivalente en GameVox en v1. Un PATCH a una persona con ese campo devuelve 400 con un error claro. Usa expulsar / silenciar / banear en su lugar.